···55## Features
6677### Form building
88+89- Master-detail form builder with block reordering
910- Supported block types:
1011 - text
···2829- Custom completion title, message, and optional follow-up link
29303031### Branching and flow logic
3232+3133- Forward-only branching between later blocks
3234- Default next target when no branch rule matches
3335- Operator-based conditions by block type:
···4143- Submission validation only for blocks actually visited in the chosen route
42444345### Responses
4646+4447- Anonymous public submissions
4548- Response list and response detail views
4649- Branched response review with visited and skipped route context
4750- CSV and XLSX response export
48514952### Workspaces and collaboration
5353+5054- Personal workspace
5155- Organization workspaces
5256- Organization owner administration
···5458- Shared form management inside organizations
55595660### Creator experience
6161+5762- Google sign-in for creators
5863- Dashboard grid and table views with sorting
5964- Profile settings for name, avatar, and locale
···5757Use these values during local development:
58585959**Authorized JavaScript origins**
6060+6061- `http://localhost:3000`
61626263**Authorized redirect URIs**
6464+6365- `http://localhost:3000/api/auth/callback/google`
64666567If these values are missing or incorrect, Google sign-in will fail.
···7173Example:
72747375**Authorized JavaScript origins**
7676+7477- `https://your-domain.example`
75787679**Authorized redirect URIs**
8080+7781- `https://your-domain.example/api/auth/callback/google`
78827983Set `NEXTAUTH_URL` to the same public base URL.
+1
docs/development.md
···9090```
91919292Notes:
9393+9394- `bun run build` also validates translation resources before the Next.js build.
9495- There is currently no separate test suite command in `package.json`.
9596
···167167 branchOtherwise: Otherwise continue to
168168 branchDefaultLinear: The next block in saved order
169169 branchNoValueNeeded: No value needed for this operator.
170170- branchingHelp: "Leave a rule unmatched to use the default path. Example value: \"{value}\"."
170170+ branchingHelp: 'Leave a rule unmatched to use the default path. Example value: "{value}".'
171171 branchingNoTargets: Add a later block before creating branch rules from this question.
172172 dragBranchRuleAria: "Drag branch rule {number}"
173173 removeBranchRuleAria: "Remove branch rule {number}"
···240240 DATE: Date
241241branching:
242242 issueMessages:
243243- invalid-target: "A rule on \"{blockLabel}\" points to a missing block."
244244- backward-target: "A rule on \"{blockLabel}\" must point to a later block."
245245- invalid-default-target: "The default next step on \"{blockLabel}\" points to a missing block."
246246- backward-default-target: "The default next step on \"{blockLabel}\" must point to a later block."
247247- invalid-condition: "A rule on \"{blockLabel}\" has an invalid condition value."
248248- duplicate-condition: "A rule on \"{blockLabel}\" duplicates an earlier condition."
249249- unsupported-operator: "A rule on \"{blockLabel}\" uses an operator that does not fit this block type."
250250- unreachable-block: "\"{blockLabel}\" is unreachable from the start of the form."
251251- fragile-text-match: "Exact text matching on \"{blockLabel}\" may be fragile if respondents vary punctuation or casing."
252252- overlapping-rule: "A later rule on \"{blockLabel}\" may never run because an earlier broader rule matches first."
253253- partial-choice-coverage: "Some answers on \"{blockLabel}\" fall through to the default route. Double-check that this is intentional."
243243+ invalid-target: 'A rule on "{blockLabel}" points to a missing block.'
244244+ backward-target: 'A rule on "{blockLabel}" must point to a later block.'
245245+ invalid-default-target: 'The default next step on "{blockLabel}" points to a missing block.'
246246+ backward-default-target: 'The default next step on "{blockLabel}" must point to a later block.'
247247+ invalid-condition: 'A rule on "{blockLabel}" has an invalid condition value.'
248248+ duplicate-condition: 'A rule on "{blockLabel}" duplicates an earlier condition.'
249249+ unsupported-operator: 'A rule on "{blockLabel}" uses an operator that does not fit this block type.'
250250+ unreachable-block: '"{blockLabel}" is unreachable from the start of the form.'
251251+ fragile-text-match: 'Exact text matching on "{blockLabel}" may be fragile if respondents vary punctuation or casing.'
252252+ overlapping-rule: 'A later rule on "{blockLabel}" may never run because an earlier broader rule matches first.'
253253+ partial-choice-coverage: 'Some answers on "{blockLabel}" fall through to the default route. Double-check that this is intentional.'
254254publicRunner:
255255 responseReceived: Response received
256256 defaultCompletionTitle: Thanks for taking the time.
+12-12
locales/ru.yml
···167167 branchOtherwise: Иначе продолжить к
168168 branchDefaultLinear: Следующему блоку в сохранённом порядке
169169 branchNoValueNeeded: Для этого оператора значение не требуется.
170170- branchingHelp: "Если ни одно правило не совпало, форма использует маршрут по умолчанию. Пример значения: \"{value}\"."
170170+ branchingHelp: 'Если ни одно правило не совпало, форма использует маршрут по умолчанию. Пример значения: "{value}".'
171171 branchingNoTargets: Добавьте более поздний блок, прежде чем создавать правила ветвления для этого вопроса.
172172 dragBranchRuleAria: "Перетащить правило ветвления {number}"
173173 removeBranchRuleAria: "Удалить правило ветвления {number}"
···240240 DATE: Дата
241241branching:
242242 issueMessages:
243243- invalid-target: "Правило в \"{blockLabel}\" ссылается на отсутствующий блок."
244244- backward-target: "Правило в \"{blockLabel}\" должно вести только к более позднему блоку."
245245- invalid-default-target: "Маршрут по умолчанию в \"{blockLabel}\" ссылается на отсутствующий блок."
246246- backward-default-target: "Маршрут по умолчанию в \"{blockLabel}\" должен вести только к более позднему блоку."
247247- invalid-condition: "В \"{blockLabel}\" задано некорректное значение условия."
248248- duplicate-condition: "В \"{blockLabel}\" условие дублирует более раннее правило."
249249- unsupported-operator: "В \"{blockLabel}\" используется оператор, который не подходит этому типу блока."
250250- unreachable-block: "Блок \"{blockLabel}\" недостижим от начала формы."
251251- fragile-text-match: "Точное текстовое совпадение в \"{blockLabel}\" может быть хрупким, если респонденты вводят разную пунктуацию или регистр."
252252- overlapping-rule: "Более позднее правило в \"{blockLabel}\" может никогда не сработать, потому что раньше срабатывает более широкое условие."
253253- partial-choice-coverage: "Часть ответов в \"{blockLabel}\" уходит по маршруту по умолчанию. Проверьте, что это сделано намеренно."
243243+ invalid-target: 'Правило в "{blockLabel}" ссылается на отсутствующий блок.'
244244+ backward-target: 'Правило в "{blockLabel}" должно вести только к более позднему блоку.'
245245+ invalid-default-target: 'Маршрут по умолчанию в "{blockLabel}" ссылается на отсутствующий блок.'
246246+ backward-default-target: 'Маршрут по умолчанию в "{blockLabel}" должен вести только к более позднему блоку.'
247247+ invalid-condition: 'В "{blockLabel}" задано некорректное значение условия.'
248248+ duplicate-condition: 'В "{blockLabel}" условие дублирует более раннее правило.'
249249+ unsupported-operator: 'В "{blockLabel}" используется оператор, который не подходит этому типу блока.'
250250+ unreachable-block: 'Блок "{blockLabel}" недостижим от начала формы.'
251251+ fragile-text-match: 'Точное текстовое совпадение в "{blockLabel}" может быть хрупким, если респонденты вводят разную пунктуацию или регистр.'
252252+ overlapping-rule: 'Более позднее правило в "{blockLabel}" может никогда не сработать, потому что раньше срабатывает более широкое условие.'
253253+ partial-choice-coverage: 'Часть ответов в "{blockLabel}" уходит по маршруту по умолчанию. Проверьте, что это сделано намеренно.'
254254publicRunner:
255255 responseReceived: Ответ получен
256256 defaultCompletionTitle: Спасибо, что уделили время.