diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 88deb0a..553a227 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -25,6 +25,18 @@ const preview: Preview = { date: /Date$/i, }, }, + // Sidebar tells the DDD seam: reusable design system, then domain contexts. + // See src/docs/layers.mdx. + options: { + storySort: { + order: [ + 'Foundations', + 'Design System', + ['Atoms', 'Molecules', 'Organisms', 'Templates', 'Devtools'], + 'Domein', + ], + }, + }, }, }; diff --git a/CLAUDE.md b/CLAUDE.md index 3498e13..5a30646 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -120,8 +120,12 @@ but the FE doesn't call them. Vitest. Co-locate `*.spec.ts` next to the unit. **Domain and pure logic must have a spec** (reducers, combinators, `visibleSteps`, parsers, boundary `parse*` adapters). Test the pure function directly — no Angular TestBed for domain. UI is exercised via -Storybook stories (`*.stories.ts` co-located, titled `Layer/Name`, a11y addon on), -not heavy component tests. +Storybook stories (`*.stories.ts` co-located, a11y addon on), not heavy component tests. +**Story titles mirror the sidebar's Design System/Domein split** (see +`src/docs/layers.mdx`): a `shared/ui`/`shared/layout` component is titled +`Design System//`; a component in a +context's `ui/` is titled `Domein//` — full stop, regardless of which +atomic layer it is (a context organism doesn't get its own `Organisms/` bucket). ## Conventions diff --git a/docs/backlog/README.md b/docs/backlog/README.md index 9cee490..43a8953 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -53,7 +53,7 @@ for its existing violations, so every WP ends green. | [WP-11](WP-11-markup-fidelity.md) | CIBG markup fidelity: application-link + absent-class triage | 2 · CIBG | done | | [WP-12](WP-12-datablock.md) | CIBG Datablock for application data | 2 · CIBG | done | | [WP-13](WP-13-cibg-gap-register.md) | CIBG-gap register + hygiene + MDX | 2 · CIBG | done | -| [WP-14](WP-14-storybook-taxonomy.md) | Storybook taxonomy reorg + Layers MDX | 3 · Storybook | todo | +| [WP-14](WP-14-storybook-taxonomy.md) | Storybook taxonomy reorg + Layers MDX | 3 · Storybook | done | | [WP-15](WP-15-missing-stories.md) | Missing stories: shell + brief components | 3 · Storybook | todo | | [WP-16](WP-16-component-a11y.md) | Component a11y: description wiring + alert role | 4 · a11y | todo | | [WP-17](WP-17-app-a11y.md) | App-level a11y: route focus, template lint, WCAG checklist | 4 · a11y | todo | diff --git a/docs/backlog/WP-14-storybook-taxonomy.md b/docs/backlog/WP-14-storybook-taxonomy.md index 6a62d84..f963f5e 100644 --- a/docs/backlog/WP-14-storybook-taxonomy.md +++ b/docs/backlog/WP-14-storybook-taxonomy.md @@ -1,8 +1,17 @@ # WP-14 — Storybook taxonomy reorg + Layers MDX -Status: todo +Status: done () Phase: 3 — Storybook as curriculum +> **Deviation:** the "Layout/" bucket (breadcrumb, site-footer, site-header) wasn't in the +> Decisions block's explicit scheme, so each got folded into Atoms/Molecules/Organisms by +> its own doc-comment classification (breadcrumb → Molecules, site-footer/site-header → +> Organisms, both already documented as such in their component header comments) rather +> than kept as a separate bucket. Fixing `atomic-design.mdx`'s "status banner" reference +> (stale since WP-13 deleted `upload-status-banner`) was caught as a side effect of +> reviewing every MDX page for broken references — not itself a retitle issue, but the +> same "unbroken MDX" acceptance criterion covers it. + ## Why 49 stories sit in a flat `Atoms/Molecules/Organisms/Templates/Layout` scheme with domain @@ -58,11 +67,11 @@ Domein/ ## Acceptance criteria -- [ ] Sidebar shows exactly Foundations → Design System → Domein with the sub-order +- [x] Sidebar shows exactly Foundations → Design System → Domein with the sub-order pinned. -- [ ] Zero story titles outside the scheme (grep `title:` and eyeball). -- [ ] `layers.mdx` renders; existing MDX pages unbroken. -- [ ] Convention in CLAUDE.md. +- [x] Zero story titles outside the scheme (grep `title:` and eyeball). +- [x] `layers.mdx` renders; existing MDX pages unbroken. +- [x] Convention in CLAUDE.md. ## Verification diff --git a/documentation.json b/documentation.json index 47dbfc6..824bd4a 100644 --- a/documentation.json +++ b/documentation.json @@ -2082,54 +2082,7 @@ }, { "name": "Draft", - "id": "interface-Draft-3f75a0ff51d12ccab50bfa13789cace778d5acff9f4feaa1607cdf1acb4a5ab4fcc687512424cb2252ec07568f6aea07a0b4f04469cbeed733c28654443ffd9e", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\nimport {\n UploadState,\n UploadMsg,\n initialUpload,\n reduceUpload,\n requiredCategoriesSatisfied,\n deliveryRefs,\n} from '@shared/upload/upload.machine';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n uren: string;\n jaren: string;\n punten: string;\n}\n\nexport type StepErrors = Partial>;\n\n/** What we have AFTER parsing — branded/typed, guaranteed valid. */\nexport interface Valid {\n uren: Uren;\n jaren: number;\n punten: number;\n documents: Array<{ categoryId: string; channel: 'digital' | 'post'; documentId?: string }>;\n}\n\n/**\n * The whole wizard as one tagged union. `step` and `errors` exist ONLY while\n * Editing; Submitting/Submitted/Failed carry a `Valid` payload and nothing else.\n * So \"submitting while a field is invalid\" or \"showing the success screen with\n * errors set\" are unrepresentable — the bug class is gone by construction.\n */\nexport type WizardState =\n | { tag: 'Editing'; step: 1 | 2 | 3; draft: Draft; errors: StepErrors; upload: UploadState }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: WizardState = {\n tag: 'Editing',\n step: 1,\n draft: { uren: '', jaren: '', punten: '' },\n errors: {},\n upload: initialUpload,\n};\n\n/** Has the user meaningfully started, so it's worth persisting as a Concept? */\nexport function hasProgress(s: Extract): boolean {\n return (\n s.step > 1 ||\n !!s.draft.uren ||\n !!s.draft.jaren ||\n !!s.draft.punten ||\n deliveryRefs(s.upload).some((r) => r.channel === 'digital' && !!r.documentId)\n );\n}\n\n/** Parse every field; on success hand back a Valid, else the per-field errors. */\nfunction validate(draft: Draft, upload: UploadState): Result {\n const uren = parseUren(draft.uren);\n const jaren = parseUren(draft.jaren);\n const punten = parseUren(draft.punten);\n const errors: StepErrors = {};\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n if (!punten.ok) errors.punten = punten.error;\n if (!requiredCategoriesSatisfied(upload)) {\n errors.documenten = $localize`:@@validation.documenten:Lever de verplichte documenten aan (upload of kies \"per post nasturen\").`;\n }\n if (uren.ok && jaren.ok && punten.ok && !errors.documenten) {\n return {\n ok: true,\n value: {\n uren: uren.value,\n jaren: jaren.value,\n punten: punten.value,\n documents: deliveryRefs(upload),\n },\n };\n }\n return { ok: false, error: errors };\n}\n\n/** Advance one step, gating on that step's fields. Illegal elsewhere = no-op. */\nexport function next(s: WizardState): WizardState {\n if (s.tag !== 'Editing') return s;\n const errors: StepErrors = {};\n if (s.step === 1) {\n const uren = parseUren(s.draft.uren);\n const jaren = parseUren(s.draft.jaren);\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n return Object.keys(errors).length === 0 ? { ...s, step: 2, errors: {} } : { ...s, errors };\n }\n if (s.step === 2) {\n const punten = parseUren(s.draft.punten);\n if (!punten.ok) errors.punten = punten.error;\n return punten.ok ? { ...s, step: 3, errors: {} } : { ...s, errors };\n }\n return s;\n}\n\nexport function back(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step === 1) return s;\n return { ...s, step: (s.step - 1) as 1 | 2, errors: {} };\n}\n\n/** Jump back to an earlier step to correct data (controle → step N). Forward\n jumps are not allowed (would skip validation). */\nexport function gaNaarStap(s: WizardState, step: 1 | 2 | 3): WizardState {\n if (s.tag !== 'Editing' || step >= s.step) return s;\n return { ...s, step, errors: {} };\n}\n\n/** Step 3 submit: parse everything + require documents; Submitting only with Valid. */\nexport function submit(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 3) return s;\n const result = validate(s.draft, s.upload);\n return result.ok ? { tag: 'Submitting', data: result.value } : { ...s, errors: result.error };\n}\n\n/** Route an upload sub-message through the pure upload reducer (Editing only). */\nexport function upload(s: WizardState, msg: UploadMsg): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, upload: reduceUpload(s.upload, msg) };\n}\n\n/** Resolve the async submit. Only meaningful while Submitting. */\nexport function resolve(s: WizardState, r: Result): WizardState {\n if (s.tag !== 'Submitting') return s;\n return r.ok\n ? { tag: 'Submitted', data: s.data }\n : { tag: 'Failed', data: s.data, error: r.error };\n}\n\n/** Update one draft field while editing; ignored in any other state. */\nexport function setField(s: WizardState, key: keyof Draft, value: string): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, draft: { ...s.draft, [key]: value } };\n}\n\n/**\n * Every event that can happen to the wizard, as one message type. The component\n * sends a WizardMsg; `reduce` decides the next state. This is the Elm\n * Model+Msg+update pattern: ONE pure function describes all state changes.\n */\nexport type WizardMsg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'GaNaarStap'; step: 1 | 2 | 3 }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Upload'; msg: UploadMsg }\n | { tag: 'Seed'; state: WizardState }; // mount a specific state (stories/showcase)\n\nexport function reduce(s: WizardState, m: WizardMsg): WizardState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'GaNaarStap':\n return gaNaarStap(s, m.step);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Upload':\n return upload(s, m.msg);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", - "properties": [ - { - "name": "jaren", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 15 - }, - { - "name": "punten", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 16 - }, - { - "name": "uren", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 14 - } - ], - "indexSignatures": [], - "kind": 172, - "description": "

What the user is typing (raw, possibly invalid).

\n", - "rawdescription": "\nWhat the user is typing (raw, possibly invalid).", - "methods": [], - "extends": [] - }, - { - "name": "Draft", - "id": "interface-Draft-51c29a3fca3c5bd3eba53c9bc57714c79817ae8c86b1ed9c1cd76652d31b45ee7c635d35f7eb0a3a7e5bf9ea7c5da5c066cee3908c8fe4b9fe053586f834b133-1", + "id": "interface-Draft-51c29a3fca3c5bd3eba53c9bc57714c79817ae8c86b1ed9c1cd76652d31b45ee7c635d35f7eb0a3a7e5bf9ea7c5da5c066cee3908c8fe4b9fe053586f834b133", "file": "src/app/registratie/domain/change-request.machine.ts", "deprecated": false, "deprecationMessage": "", @@ -2172,14 +2125,11 @@ "description": "

What the user is typing (raw, possibly invalid).

\n", "rawdescription": "\nWhat the user is typing (raw, possibly invalid).", "methods": [], - "extends": [], - "isDuplicate": true, - "duplicateId": 1, - "duplicateName": "Draft-1" + "extends": [] }, { "name": "Draft", - "id": "interface-Draft-9669bb22f8d4cc591a3bd64d9fc83275b70ad9e7275d59b4d1d394db7252e8820908b20c593f0b3a16c415c40ad1232ed7d04ba684d0dee9d72bc1ae820d06b6-2", + "id": "interface-Draft-9669bb22f8d4cc591a3bd64d9fc83275b70ad9e7275d59b4d1d394db7252e8820908b20c593f0b3a16c415c40ad1232ed7d04ba684d0dee9d72bc1ae820d06b6-1", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "deprecated": false, "deprecationMessage": "", @@ -2304,6 +2254,56 @@ "methods": [], "extends": [], "isDuplicate": true, + "duplicateId": 1, + "duplicateName": "Draft-1" + }, + { + "name": "Draft", + "id": "interface-Draft-3f75a0ff51d12ccab50bfa13789cace778d5acff9f4feaa1607cdf1acb4a5ab4fcc687512424cb2252ec07568f6aea07a0b4f04469cbeed733c28654443ffd9e-2", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\nimport {\n UploadState,\n UploadMsg,\n initialUpload,\n reduceUpload,\n requiredCategoriesSatisfied,\n deliveryRefs,\n} from '@shared/upload/upload.machine';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n uren: string;\n jaren: string;\n punten: string;\n}\n\nexport type StepErrors = Partial>;\n\n/** What we have AFTER parsing — branded/typed, guaranteed valid. */\nexport interface Valid {\n uren: Uren;\n jaren: number;\n punten: number;\n documents: Array<{ categoryId: string; channel: 'digital' | 'post'; documentId?: string }>;\n}\n\n/**\n * The whole wizard as one tagged union. `step` and `errors` exist ONLY while\n * Editing; Submitting/Submitted/Failed carry a `Valid` payload and nothing else.\n * So \"submitting while a field is invalid\" or \"showing the success screen with\n * errors set\" are unrepresentable — the bug class is gone by construction.\n */\nexport type WizardState =\n | { tag: 'Editing'; step: 1 | 2 | 3; draft: Draft; errors: StepErrors; upload: UploadState }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: WizardState = {\n tag: 'Editing',\n step: 1,\n draft: { uren: '', jaren: '', punten: '' },\n errors: {},\n upload: initialUpload,\n};\n\n/** Has the user meaningfully started, so it's worth persisting as a Concept? */\nexport function hasProgress(s: Extract): boolean {\n return (\n s.step > 1 ||\n !!s.draft.uren ||\n !!s.draft.jaren ||\n !!s.draft.punten ||\n deliveryRefs(s.upload).some((r) => r.channel === 'digital' && !!r.documentId)\n );\n}\n\n/** Parse every field; on success hand back a Valid, else the per-field errors. */\nfunction validate(draft: Draft, upload: UploadState): Result {\n const uren = parseUren(draft.uren);\n const jaren = parseUren(draft.jaren);\n const punten = parseUren(draft.punten);\n const errors: StepErrors = {};\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n if (!punten.ok) errors.punten = punten.error;\n if (!requiredCategoriesSatisfied(upload)) {\n errors.documenten = $localize`:@@validation.documenten:Lever de verplichte documenten aan (upload of kies \"per post nasturen\").`;\n }\n if (uren.ok && jaren.ok && punten.ok && !errors.documenten) {\n return {\n ok: true,\n value: {\n uren: uren.value,\n jaren: jaren.value,\n punten: punten.value,\n documents: deliveryRefs(upload),\n },\n };\n }\n return { ok: false, error: errors };\n}\n\n/** Advance one step, gating on that step's fields. Illegal elsewhere = no-op. */\nexport function next(s: WizardState): WizardState {\n if (s.tag !== 'Editing') return s;\n const errors: StepErrors = {};\n if (s.step === 1) {\n const uren = parseUren(s.draft.uren);\n const jaren = parseUren(s.draft.jaren);\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n return Object.keys(errors).length === 0 ? { ...s, step: 2, errors: {} } : { ...s, errors };\n }\n if (s.step === 2) {\n const punten = parseUren(s.draft.punten);\n if (!punten.ok) errors.punten = punten.error;\n return punten.ok ? { ...s, step: 3, errors: {} } : { ...s, errors };\n }\n return s;\n}\n\nexport function back(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step === 1) return s;\n return { ...s, step: (s.step - 1) as 1 | 2, errors: {} };\n}\n\n/** Jump back to an earlier step to correct data (controle → step N). Forward\n jumps are not allowed (would skip validation). */\nexport function gaNaarStap(s: WizardState, step: 1 | 2 | 3): WizardState {\n if (s.tag !== 'Editing' || step >= s.step) return s;\n return { ...s, step, errors: {} };\n}\n\n/** Step 3 submit: parse everything + require documents; Submitting only with Valid. */\nexport function submit(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 3) return s;\n const result = validate(s.draft, s.upload);\n return result.ok ? { tag: 'Submitting', data: result.value } : { ...s, errors: result.error };\n}\n\n/** Route an upload sub-message through the pure upload reducer (Editing only). */\nexport function upload(s: WizardState, msg: UploadMsg): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, upload: reduceUpload(s.upload, msg) };\n}\n\n/** Resolve the async submit. Only meaningful while Submitting. */\nexport function resolve(s: WizardState, r: Result): WizardState {\n if (s.tag !== 'Submitting') return s;\n return r.ok\n ? { tag: 'Submitted', data: s.data }\n : { tag: 'Failed', data: s.data, error: r.error };\n}\n\n/** Update one draft field while editing; ignored in any other state. */\nexport function setField(s: WizardState, key: keyof Draft, value: string): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, draft: { ...s.draft, [key]: value } };\n}\n\n/**\n * Every event that can happen to the wizard, as one message type. The component\n * sends a WizardMsg; `reduce` decides the next state. This is the Elm\n * Model+Msg+update pattern: ONE pure function describes all state changes.\n */\nexport type WizardMsg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'GaNaarStap'; step: 1 | 2 | 3 }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Upload'; msg: UploadMsg }\n | { tag: 'Seed'; state: WizardState }; // mount a specific state (stories/showcase)\n\nexport function reduce(s: WizardState, m: WizardMsg): WizardState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'GaNaarStap':\n return gaNaarStap(s, m.step);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Upload':\n return upload(s, m.msg);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "properties": [ + { + "name": "jaren", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 15 + }, + { + "name": "punten", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 16 + }, + { + "name": "uren", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 14 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

What the user is typing (raw, possibly invalid).

\n", + "rawdescription": "\nWhat the user is typing (raw, possibly invalid).", + "methods": [], + "extends": [], + "isDuplicate": true, "duplicateId": 2, "duplicateName": "Draft-2" }, @@ -5533,7 +5533,54 @@ }, { "name": "Valid", - "id": "interface-Valid-3f75a0ff51d12ccab50bfa13789cace778d5acff9f4feaa1607cdf1acb4a5ab4fcc687512424cb2252ec07568f6aea07a0b4f04469cbeed733c28654443ffd9e", + "id": "interface-Valid-51c29a3fca3c5bd3eba53c9bc57714c79817ae8c86b1ed9c1cd76652d31b45ee7c635d35f7eb0a3a7e5bf9ea7c5da5c066cee3908c8fe4b9fe053586f834b133", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\n/** After parsing — postcode is the branded type, so downstream can't get a raw one. */\nexport interface Valid {\n straat: string;\n postcode: Postcode;\n woonplaats: string;\n}\n\nexport type Errors = Partial>;\n\n/**\n * The change-request (adreswijziging) form as one tagged union — the SAME idiom\n * as the wizards, just single-step. `draft`/`errors` exist only while Editing;\n * Submitting/Submitted/Failed carry the parsed `Valid`. Illegal states (submitting\n * an invalid draft, a success screen with errors) are unrepresentable.\n */\nexport type ChangeRequestState =\n | { tag: 'Editing'; draft: Draft; errors: Errors }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid; referentie: string }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: ChangeRequestState = {\n tag: 'Editing',\n draft: { straat: '', postcode: '', woonplaats: '' },\n errors: {},\n};\n\n/** Parse via the value objects; on success hand back a Valid, else per-field errors. */\nfunction validate(draft: Draft): Result {\n const straat = draft.straat.trim();\n const postcode = parsePostcode(draft.postcode);\n const errors: Errors = {};\n if (!straat) errors.straat = $localize`:@@validation.straat:Vul straat en huisnummer in.`;\n if (!postcode.ok) errors.postcode = postcode.error;\n if (straat && postcode.ok) {\n return {\n ok: true,\n value: { straat, postcode: postcode.value, woonplaats: draft.woonplaats.trim() },\n };\n }\n return { ok: false, error: errors };\n}\n\nexport type ChangeRequestMsg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Reset' }\n | { tag: 'Seed'; state: ChangeRequestState }; // mount a specific state (stories/tests)\n\nexport function reduce(s: ChangeRequestState, m: ChangeRequestMsg): ChangeRequestState {\n switch (m.tag) {\n case 'SetField':\n return s.tag === 'Editing' ? { ...s, draft: { ...s.draft, [m.key]: m.value } } : s;\n case 'Submit': {\n if (s.tag !== 'Editing') return s;\n const r = validate(s.draft);\n return r.ok ? { tag: 'Submitting', data: r.value } : { ...s, errors: r.error };\n }\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting'\n ? { tag: 'Submitted', data: s.data, referentie: m.referentie }\n : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Reset':\n return initial;\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "properties": [ + { + "name": "postcode", + "deprecated": false, + "deprecationMessage": "", + "type": "Postcode", + "indexKey": "", + "optional": false, + "description": "", + "line": 14 + }, + { + "name": "straat", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 13 + }, + { + "name": "woonplaats", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 15 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

After parsing — postcode is the branded type, so downstream can't get a raw one.

\n", + "rawdescription": "\nAfter parsing — postcode is the branded type, so downstream can't get a raw one.", + "methods": [], + "extends": [] + }, + { + "name": "Valid", + "id": "interface-Valid-3f75a0ff51d12ccab50bfa13789cace778d5acff9f4feaa1607cdf1acb4a5ab4fcc687512424cb2252ec07568f6aea07a0b4f04469cbeed733c28654443ffd9e-1", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", "deprecated": false, "deprecationMessage": "", @@ -5586,53 +5633,6 @@ "description": "

What we have AFTER parsing — branded/typed, guaranteed valid.

\n", "rawdescription": "\nWhat we have AFTER parsing — branded/typed, guaranteed valid.", "methods": [], - "extends": [] - }, - { - "name": "Valid", - "id": "interface-Valid-51c29a3fca3c5bd3eba53c9bc57714c79817ae8c86b1ed9c1cd76652d31b45ee7c635d35f7eb0a3a7e5bf9ea7c5da5c066cee3908c8fe4b9fe053586f834b133-1", - "file": "src/app/registratie/domain/change-request.machine.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\n/** After parsing — postcode is the branded type, so downstream can't get a raw one. */\nexport interface Valid {\n straat: string;\n postcode: Postcode;\n woonplaats: string;\n}\n\nexport type Errors = Partial>;\n\n/**\n * The change-request (adreswijziging) form as one tagged union — the SAME idiom\n * as the wizards, just single-step. `draft`/`errors` exist only while Editing;\n * Submitting/Submitted/Failed carry the parsed `Valid`. Illegal states (submitting\n * an invalid draft, a success screen with errors) are unrepresentable.\n */\nexport type ChangeRequestState =\n | { tag: 'Editing'; draft: Draft; errors: Errors }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid; referentie: string }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: ChangeRequestState = {\n tag: 'Editing',\n draft: { straat: '', postcode: '', woonplaats: '' },\n errors: {},\n};\n\n/** Parse via the value objects; on success hand back a Valid, else per-field errors. */\nfunction validate(draft: Draft): Result {\n const straat = draft.straat.trim();\n const postcode = parsePostcode(draft.postcode);\n const errors: Errors = {};\n if (!straat) errors.straat = $localize`:@@validation.straat:Vul straat en huisnummer in.`;\n if (!postcode.ok) errors.postcode = postcode.error;\n if (straat && postcode.ok) {\n return {\n ok: true,\n value: { straat, postcode: postcode.value, woonplaats: draft.woonplaats.trim() },\n };\n }\n return { ok: false, error: errors };\n}\n\nexport type ChangeRequestMsg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Reset' }\n | { tag: 'Seed'; state: ChangeRequestState }; // mount a specific state (stories/tests)\n\nexport function reduce(s: ChangeRequestState, m: ChangeRequestMsg): ChangeRequestState {\n switch (m.tag) {\n case 'SetField':\n return s.tag === 'Editing' ? { ...s, draft: { ...s.draft, [m.key]: m.value } } : s;\n case 'Submit': {\n if (s.tag !== 'Editing') return s;\n const r = validate(s.draft);\n return r.ok ? { tag: 'Submitting', data: r.value } : { ...s, errors: r.error };\n }\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting'\n ? { tag: 'Submitted', data: s.data, referentie: m.referentie }\n : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Reset':\n return initial;\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", - "properties": [ - { - "name": "postcode", - "deprecated": false, - "deprecationMessage": "", - "type": "Postcode", - "indexKey": "", - "optional": false, - "description": "", - "line": 14 - }, - { - "name": "straat", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 13 - }, - { - "name": "woonplaats", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 15 - } - ], - "indexSignatures": [], - "kind": 172, - "description": "

After parsing — postcode is the branded type, so downstream can't get a raw one.

\n", - "rawdescription": "\nAfter parsing — postcode is the branded type, so downstream can't get a raw one.", - "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -22958,26 +22958,6 @@ "type": "BriefState", "defaultValue": "{ tag: 'loading' }" }, - { - "name": "initial", - "ctype": "miscellaneous", - "subtype": "variable", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "WizardState", - "defaultValue": "{\n tag: 'Editing',\n step: 1,\n draft: { uren: '', jaren: '', punten: '' },\n errors: {},\n upload: initialUpload,\n}" - }, - { - "name": "initial", - "ctype": "miscellaneous", - "subtype": "variable", - "file": "src/app/herregistratie/domain/intake.machine.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "IntakeState", - "defaultValue": "{\n tag: 'Answering',\n answers: {},\n cursor: 0,\n errors: {},\n scholingThreshold: SCHOLING_THRESHOLD_DEFAULT,\n}" - }, { "name": "initial", "ctype": "miscellaneous", @@ -22998,6 +22978,26 @@ "type": "RegistratieState", "defaultValue": "{\n tag: 'Invullen',\n draft: emptyDraft,\n cursor: 0,\n errors: {},\n upload: initialUpload,\n}" }, + { + "name": "initial", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "WizardState", + "defaultValue": "{\n tag: 'Editing',\n step: 1,\n draft: { uren: '', jaren: '', punten: '' },\n errors: {},\n upload: initialUpload,\n}" + }, + { + "name": "initial", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "IntakeState", + "defaultValue": "{\n tag: 'Answering',\n answers: {},\n cursor: 0,\n errors: {},\n scholingThreshold: SCHOLING_THRESHOLD_DEFAULT,\n}" + }, { "name": "initialUpload", "ctype": "miscellaneous", @@ -23278,11 +23278,11 @@ "name": "STEPS", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "deprecated": false, "deprecationMessage": "", "type": "StepId[]", - "defaultValue": "['buitenland', 'werk', 'review']", + "defaultValue": "['adres', 'beroep', 'controle']", "rawdescription": "The fixed step list. Number of steps never changes; questions reveal inline.", "description": "

The fixed step list. Number of steps never changes; questions reveal inline.

\n" }, @@ -23290,11 +23290,11 @@ "name": "STEPS", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "file": "src/app/herregistratie/domain/intake.machine.ts", "deprecated": false, "deprecationMessage": "", "type": "StepId[]", - "defaultValue": "['adres', 'beroep', 'controle']", + "defaultValue": "['buitenland', 'werk', 'review']", "rawdescription": "The fixed step list. Number of steps never changes; questions reveal inline.", "description": "

The fixed step list. Number of steps never changes; questions reveal inline.

\n" }, @@ -23606,6 +23606,35 @@ } ] }, + { + "name": "back", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "back", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -23664,35 +23693,6 @@ } ] }, - { - "name": "back", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "blockActions", "file": "src/app/registratie/domain/block-actions.ts", @@ -24172,7 +24172,7 @@ }, { "name": "currentStep", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, @@ -24201,7 +24201,7 @@ }, { "name": "currentStep", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "file": "src/app/herregistratie/domain/intake.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, @@ -24753,6 +24753,50 @@ } ] }, + { + "name": "gaNaarStap", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Jump back to an earlier step to correct data (controle → step N). Forward\njumps are not allowed (would skip validation). Preserves the draft.

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "cursor", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "cursor", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "gaNaarStap", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -24839,50 +24883,6 @@ } ] }, - { - "name": "gaNaarStap", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Jump back to an earlier step to correct data (controle → step N). Forward\njumps are not allowed (would skip validation). Preserves the draft.

\n", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "cursor", - "type": "number", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "cursor", - "type": "number", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "groupParagraphs", "file": "src/app/brief/ui/letter-preview/letter-preview.component.ts", @@ -24937,6 +24937,35 @@ } ] }, + { + "name": "hasProgress", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Has the user meaningfully started, so it's worth persisting as a Concept? Excludes\nthe automatic BRP address prefill on step 0 — a bare page visit creates nothing.\nponytail: an address typed at step 0 without any of these signals is not yet\npersisted (created once they advance/choose); accepted regression vs. sessionStorage.

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "hasProgress", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -24995,35 +25024,6 @@ } ] }, - { - "name": "hasProgress", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Has the user meaningfully started, so it's worth persisting as a Concept? Excludes\nthe automatic BRP address prefill on step 0 — a bare page visit creates nothing.\nponytail: an address typed at step 0 without any of these signals is not yet\npersisted (created once they advance/choose); accepted regression vs. sessionStorage.

\n", - "args": [ - { - "name": "s", - "type": "Extract", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "boolean", - "jsdoctags": [ - { - "name": "s", - "type": "Extract", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "herregistratieDeadline", "file": "src/app/registratie/domain/registration.policy.ts", @@ -26086,6 +26086,35 @@ } ] }, + { + "name": "next", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "next", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -26144,35 +26173,6 @@ } ] }, - { - "name": "next", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "nextLocalIndex", "file": "src/app/brief/domain/brief.machine.ts", @@ -27302,94 +27302,6 @@ } ] }, - { - "name": "reduce", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "m", - "type": "WizardMsg", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "WizardState", - "jsdoctags": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "m", - "type": "WizardMsg", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "reduce", - "file": "src/app/herregistratie/domain/intake.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "m", - "type": "IntakeMsg", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "IntakeState", - "jsdoctags": [ - { - "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "m", - "type": "IntakeMsg", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "reduce", "file": "src/app/registratie/domain/change-request.machine.ts", @@ -27478,6 +27390,94 @@ } ] }, + { + "name": "reduce", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "WizardMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "WizardMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reduce", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "IntakeMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "IntakeState", + "jsdoctags": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "IntakeMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "reduceUpload", "file": "src/app/shared/upload/upload.machine.ts", @@ -27766,6 +27766,50 @@ } ] }, + { + "name": "resolve", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "resolve", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -27854,50 +27898,6 @@ } ] }, - { - "name": "resolve", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "r", - "type": "Result", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "r", - "type": "Result", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "restore", "file": "src/app/auth/application/session.store.ts", @@ -28184,63 +28184,6 @@ } ] }, - { - "name": "setField", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Update one draft field while editing; ignored in any other state.

\n", - "args": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "key", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "WizardState", - "jsdoctags": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "key", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "setField", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", @@ -28300,6 +28243,63 @@ } ] }, + { + "name": "setField", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Update one draft field while editing; ignored in any other state.

\n", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "key", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "key", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "setPolicy", "file": "src/app/herregistratie/domain/intake.machine.ts", @@ -28500,6 +28500,35 @@ } ] }, + { + "name": "submit", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "submit", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -28558,35 +28587,6 @@ } ] }, - { - "name": "submit", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "submittedRow", "file": "src/app/registratie/domain/aanvraag-view.ts", @@ -28950,6 +28950,50 @@ } ] }, + { + "name": "upload", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Route an upload sub-message through the pure upload reducer (Invullen only).

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "upload", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -28995,41 +29039,26 @@ ] }, { - "name": "upload", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "name": "validate", + "file": "src/app/registratie/domain/change-request.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Route an upload sub-message through the pure upload reducer (Invullen only).

\n", + "description": "

Parse via the value objects; on success hand back a Valid, else per-field errors.

\n", "args": [ { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "msg", - "type": "UploadMsg", + "name": "draft", + "type": "Draft", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "RegistratieState", + "returnType": "Result", "jsdoctags": [ { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "msg", - "type": "UploadMsg", + "name": "draft", + "type": "Draft", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -29083,31 +29112,46 @@ ] }, { - "name": "validate", - "file": "src/app/registratie/domain/change-request.machine.ts", + "name": "validateAll", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Parse via the value objects; on success hand back a Valid, else per-field errors.

\n", + "description": "

Parse the whole wizard into a ValidRegistratie (called on submit).

\n", "args": [ { - "name": "draft", + "name": "d", "type": "Draft", "deprecated": false, "deprecationMessage": "" + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" } ], - "returnType": "Result", + "returnType": "Result", "jsdoctags": [ { - "name": "draft", + "name": "d", "type": "Draft", "deprecated": false, "deprecationMessage": "", "tagName": { "text": "param" } + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } } ] }, @@ -29156,14 +29200,20 @@ ] }, { - "name": "validateAll", + "name": "validateStep", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Parse the whole wizard into a ValidRegistratie (called on submit).

\n", + "description": "

Validate every question currently visible in ONE step. Errors keyed per field.

\n", "args": [ + { + "name": "step", + "type": "StepId", + "deprecated": false, + "deprecationMessage": "" + }, { "name": "d", "type": "Draft", @@ -29177,8 +29227,17 @@ "deprecationMessage": "" } ], - "returnType": "Result", + "returnType": "Result", "jsdoctags": [ + { + "name": "step", + "type": "StepId", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, { "name": "d", "type": "Draft", @@ -29258,65 +29317,6 @@ } ] }, - { - "name": "validateStep", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Validate every question currently visible in ONE step. Errors keyed per field.

\n", - "args": [ - { - "name": "step", - "type": "StepId", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "d", - "type": "Draft", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "upload", - "type": "UploadState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "Result", - "jsdoctags": [ - { - "name": "step", - "type": "StepId", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "d", - "type": "Draft", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "upload", - "type": "UploadState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "whenTag", "file": "src/app/shared/kernel/fp.ts", @@ -29717,22 +29717,22 @@ "name": "Errors", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "Partial>", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "rawtype": "Partial>", + "file": "src/app/registratie/domain/change-request.machine.ts", "deprecated": false, "deprecationMessage": "", - "description": "

Per-field error map: one message per question, since a step holds several.

\n", + "description": "", "kind": 184 }, { "name": "Errors", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "Partial>", - "file": "src/app/registratie/domain/change-request.machine.ts", + "rawtype": "Partial>", + "file": "src/app/herregistratie/domain/intake.machine.ts", "deprecated": false, "deprecationMessage": "", - "description": "", + "description": "

Per-field error map: one message per question, since a step holds several.

\n", "kind": 184 }, { @@ -29970,22 +29970,22 @@ "name": "StepId", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "\"buitenland\" | \"werk\" | \"review\"", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "rawtype": "\"adres\" | \"beroep\" | \"controle\"", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "deprecated": false, "deprecationMessage": "", - "description": "

The three fixed steps. Each step groups one or more questions.

\n", + "description": "

A FIXED 3-step registration wizard. The steps never change in number (always\nSTEPS): (1) adres + correspondentievoorkeur, (2) beroep o.b.v. diploma,\n(3) controle & indienen. Follow-up questions appear inline within a step\n(e.g. choosing 'email' reveals the e-mail field). "Is this field required\nright now" is a pure function (validateStep), so it is trivial to test and\nimpossible to get out of sync with the data. Invariants live here, not in the\nUI: the wizard reaches Indienen only when a complete ValidRegistratie parses.

\n", "kind": 193 }, { "name": "StepId", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "\"adres\" | \"beroep\" | \"controle\"", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "rawtype": "\"buitenland\" | \"werk\" | \"review\"", + "file": "src/app/herregistratie/domain/intake.machine.ts", "deprecated": false, "deprecationMessage": "", - "description": "

A FIXED 3-step registration wizard. The steps never change in number (always\nSTEPS): (1) adres + correspondentievoorkeur, (2) beroep o.b.v. diploma,\n(3) controle & indienen. Follow-up questions appear inline within a step\n(e.g. choosing 'email' reveals the e-mail field). "Is this field required\nright now" is a pure function (validateStep), so it is trivial to test and\nimpossible to get out of sync with the data. Invariants live here, not in the\nUI: the wizard reaches Indienen only when a complete ValidRegistratie parses.

\n", + "description": "

The three fixed steps. Each step groups one or more questions.

\n", "kind": 193 }, { @@ -30426,6 +30426,18 @@ "defaultValue": "{ tag: 'loading' }" } ], + "src/app/registratie/domain/change-request.machine.ts": [ + { + "name": "initial", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "ChangeRequestState", + "defaultValue": "{\n tag: 'Editing',\n draft: { straat: '', postcode: '', woonplaats: '' },\n errors: {},\n}" + } + ], "src/app/herregistratie/domain/herregistratie.machine.ts": [ { "name": "initial", @@ -30474,18 +30486,6 @@ "description": "

The fixed step list. Number of steps never changes; questions reveal inline.

\n" } ], - "src/app/registratie/domain/change-request.machine.ts": [ - { - "name": "initial", - "ctype": "miscellaneous", - "subtype": "variable", - "file": "src/app/registratie/domain/change-request.machine.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "ChangeRequestState", - "defaultValue": "{\n tag: 'Editing',\n draft: { straat: '', postcode: '', woonplaats: '' },\n errors: {},\n}" - } - ], "src/app/shared/ui/radio-group/radio-group.component.ts": [ { "name": "JA_NEE", @@ -32420,6 +32420,826 @@ ] } ], + "src/app/registratie/domain/registratie-wizard.machine.ts": [ + { + "name": "back", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "currentStep", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Which step the cursor currently points at (clamped to the fixed list).

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "StepId", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "declareerBeroep", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Declare the beroep for a manually-entered diploma (chosen from a fixed list).

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "beroep", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "beroep", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "gaNaarStap", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Jump back to an earlier step to correct data (controle → step N). Forward\njumps are not allowed (would skip validation). Preserves the draft.

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "cursor", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "cursor", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "hasProgress", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Has the user meaningfully started, so it's worth persisting as a Concept? Excludes\nthe automatic BRP address prefill on step 0 — a bare page visit creates nothing.\nponytail: an address typed at step 0 without any of these signals is not yet\npersisted (created once they advance/choose); accepted regression vs. sessionStorage.

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "kiesDiploma", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Pick a DUO diploma; the beroep is derived from it and the applicable policy\nquestions (vraagIds) come with it (both server-computed, passed in).

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "diplomaId", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "beroep", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "vraagIds", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "diplomaId", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "beroep", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "vraagIds", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "kiesHandmatig", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Switch to manual diploma entry: the diploma isn't in DUO, so the MAXIMAL\npolicy-question set applies and the entry is flagged handmatig/unverified. The\nberoep is declared separately (declareerBeroep).

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "vraagIds", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "vraagIds", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "next", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "prefillAdres", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Prefill the address from a BRP lookup and flag its origin (PRD §7).

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "straat", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "postcode", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "woonplaats", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "straat", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "postcode", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "woonplaats", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reduce", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "RegistratieMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "RegistratieMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "resolve", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "setAntwoord", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "vraagId", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "vraagId", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "setCorrespondentie", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "value", + "type": "Correspondentie", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "value", + "type": "Correspondentie", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "setField", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "key", + "type": "DraftField", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "key", + "type": "DraftField", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "submit", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "upload", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Route an upload sub-message through the pure upload reducer (Invullen only).

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "validateAll", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Parse the whole wizard into a ValidRegistratie (called on submit).

\n", + "args": [ + { + "name": "d", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "d", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "validateStep", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Validate every question currently visible in ONE step. Errors keyed per field.

\n", + "args": [ + { + "name": "step", + "type": "StepId", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "d", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "step", + "type": "StepId", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "d", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], "src/app/herregistratie/domain/herregistratie.machine.ts": [ { "name": "back", @@ -33342,826 +34162,6 @@ ] } ], - "src/app/registratie/domain/registratie-wizard.machine.ts": [ - { - "name": "back", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "currentStep", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Which step the cursor currently points at (clamped to the fixed list).

\n", - "args": [ - { - "name": "s", - "type": "Extract", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "StepId", - "jsdoctags": [ - { - "name": "s", - "type": "Extract", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "declareerBeroep", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Declare the beroep for a manually-entered diploma (chosen from a fixed list).

\n", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "beroep", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "beroep", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "gaNaarStap", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Jump back to an earlier step to correct data (controle → step N). Forward\njumps are not allowed (would skip validation). Preserves the draft.

\n", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "cursor", - "type": "number", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "cursor", - "type": "number", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "hasProgress", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Has the user meaningfully started, so it's worth persisting as a Concept? Excludes\nthe automatic BRP address prefill on step 0 — a bare page visit creates nothing.\nponytail: an address typed at step 0 without any of these signals is not yet\npersisted (created once they advance/choose); accepted regression vs. sessionStorage.

\n", - "args": [ - { - "name": "s", - "type": "Extract", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "boolean", - "jsdoctags": [ - { - "name": "s", - "type": "Extract", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "kiesDiploma", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Pick a DUO diploma; the beroep is derived from it and the applicable policy\nquestions (vraagIds) come with it (both server-computed, passed in).

\n", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "diplomaId", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "beroep", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "vraagIds", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "diplomaId", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "beroep", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "vraagIds", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "kiesHandmatig", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Switch to manual diploma entry: the diploma isn't in DUO, so the MAXIMAL\npolicy-question set applies and the entry is flagged handmatig/unverified. The\nberoep is declared separately (declareerBeroep).

\n", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "vraagIds", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "vraagIds", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "next", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "prefillAdres", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Prefill the address from a BRP lookup and flag its origin (PRD §7).

\n", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "straat", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "postcode", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "woonplaats", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "straat", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "postcode", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "woonplaats", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "reduce", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "m", - "type": "RegistratieMsg", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "m", - "type": "RegistratieMsg", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "resolve", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "r", - "type": "Result", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "r", - "type": "Result", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "setAntwoord", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "vraagId", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "vraagId", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "setCorrespondentie", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "value", - "type": "Correspondentie", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "value", - "type": "Correspondentie", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "setField", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "key", - "type": "DraftField", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "key", - "type": "DraftField", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "submit", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "upload", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Route an upload sub-message through the pure upload reducer (Invullen only).

\n", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "msg", - "type": "UploadMsg", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "msg", - "type": "UploadMsg", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "validateAll", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Parse the whole wizard into a ValidRegistratie (called on submit).

\n", - "args": [ - { - "name": "d", - "type": "Draft", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "upload", - "type": "UploadState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "Result", - "jsdoctags": [ - { - "name": "d", - "type": "Draft", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "upload", - "type": "UploadState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "validateStep", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Validate every question currently visible in ONE step. Errors keyed per field.

\n", - "args": [ - { - "name": "step", - "type": "StepId", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "d", - "type": "Draft", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "upload", - "type": "UploadState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "Result", - "jsdoctags": [ - { - "name": "step", - "type": "StepId", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "d", - "type": "Draft", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "upload", - "type": "UploadState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - } - ], "src/app/registratie/domain/block-actions.ts": [ { "name": "blockActions", diff --git a/src/app/auth/ui/login-form/login-form.stories.ts b/src/app/auth/ui/login-form/login-form.stories.ts index 3ee27e6..61f0663 100644 --- a/src/app/auth/ui/login-form/login-form.stories.ts +++ b/src/app/auth/ui/login-form/login-form.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { LoginFormComponent } from './login-form.component'; const meta: Meta = { - title: 'Organisms/Login Form', + title: 'Domein/Auth/Login Form', component: LoginFormComponent, }; export default meta; diff --git a/src/app/brief/ui/letter-composer/letter-composer.stories.ts b/src/app/brief/ui/letter-composer/letter-composer.stories.ts index 013445f..bcdf3ef 100644 --- a/src/app/brief/ui/letter-composer/letter-composer.stories.ts +++ b/src/app/brief/ui/letter-composer/letter-composer.stories.ts @@ -118,7 +118,7 @@ const render = (b: Brief, decisions: BriefDecisions) => ({ }); const meta: Meta = { - title: 'Organisms/Letter Composer', + title: 'Domein/Brief/Letter Composer', component: LetterComposerComponent, }; export default meta; diff --git a/src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.stories.ts b/src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.stories.ts index 549ed2a..f876c5e 100644 --- a/src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.stories.ts +++ b/src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.stories.ts @@ -10,7 +10,7 @@ import { Uren } from '@registratie/domain/value-objects/uren'; const validData = { uren: 4160 as Uren, jaren: 5, punten: 200, documents: [] }; const meta: Meta = { - title: 'Herregistratie/Wizard', + title: 'Domein/Herregistratie/Wizard', component: HerregistratieWizardComponent, // The wizard injects BigProfileStore (for the optimistic cross-page flag), // which creates httpResources — so the story needs an HttpClient. diff --git a/src/app/herregistratie/ui/intake-wizard/intake-wizard.stories.ts b/src/app/herregistratie/ui/intake-wizard/intake-wizard.stories.ts index d779edb..b550fcd 100644 --- a/src/app/herregistratie/ui/intake-wizard/intake-wizard.stories.ts +++ b/src/app/herregistratie/ui/intake-wizard/intake-wizard.stories.ts @@ -9,7 +9,7 @@ import { Uren } from '@registratie/domain/value-objects/uren'; const validData = { werktBuitenland: false, uren: 4160 as Uren, punten: 200 as Uren }; const meta: Meta = { - title: 'Herregistratie/IntakeWizard', + title: 'Domein/Herregistratie/IntakeWizard', component: IntakeWizardComponent, // Injects BigProfileStore (optimistic flag) which creates httpResources. decorators: [applicationConfig({ providers: [provideHttpClient(), provideApiClient()] })], diff --git a/src/app/registratie/ui/aanvraag-block/aanvraag-block.stories.ts b/src/app/registratie/ui/aanvraag-block/aanvraag-block.stories.ts index 55bf95c..6fd3e37 100644 --- a/src/app/registratie/ui/aanvraag-block/aanvraag-block.stories.ts +++ b/src/app/registratie/ui/aanvraag-block/aanvraag-block.stories.ts @@ -14,7 +14,7 @@ const base = { } satisfies Omit; const meta: Meta = { - title: 'Organisms/Aanvraag Block', + title: 'Domein/Registratie/Aanvraag Block', component: AanvraagBlockComponent, decorators: [applicationConfig({ providers: [provideRouter([])] })], render: (args) => ({ diff --git a/src/app/registratie/ui/address-fields/address-fields.stories.ts b/src/app/registratie/ui/address-fields/address-fields.stories.ts index a17966f..05c784c 100644 --- a/src/app/registratie/ui/address-fields/address-fields.stories.ts +++ b/src/app/registratie/ui/address-fields/address-fields.stories.ts @@ -3,7 +3,7 @@ import { moduleMetadata } from '@storybook/angular'; import { AddressFieldsComponent } from './address-fields.component'; const meta: Meta = { - title: 'Organisms/Address Fields', + title: 'Domein/Registratie/Address Fields', component: AddressFieldsComponent, decorators: [moduleMetadata({ imports: [AddressFieldsComponent] })], render: (args) => ({ diff --git a/src/app/registratie/ui/change-request-form/change-request-form.stories.ts b/src/app/registratie/ui/change-request-form/change-request-form.stories.ts index 2aba86a..e982ffb 100644 --- a/src/app/registratie/ui/change-request-form/change-request-form.stories.ts +++ b/src/app/registratie/ui/change-request-form/change-request-form.stories.ts @@ -12,7 +12,7 @@ const validData = { }; const meta: Meta = { - title: 'Organisms/Change Request Form', + title: 'Domein/Registratie/Change Request Form', component: ChangeRequestFormComponent, // The form injects ApiClient (over HttpClient) for the submit command. decorators: [applicationConfig({ providers: [provideHttpClient(), provideApiClient()] })], diff --git a/src/app/registratie/ui/registratie-wizard/registratie-wizard.stories.ts b/src/app/registratie/ui/registratie-wizard/registratie-wizard.stories.ts index 94361f7..5fd9ef4 100644 --- a/src/app/registratie/ui/registratie-wizard/registratie-wizard.stories.ts +++ b/src/app/registratie/ui/registratie-wizard/registratie-wizard.stories.ts @@ -46,7 +46,7 @@ const validData: ValidRegistratie = { }; const meta: Meta = { - title: 'Registratie/RegistratieWizard', + title: 'Domein/Registratie/RegistratieWizard', component: RegistratieWizardComponent, decorators: [applicationConfig({ providers: [provideHttpClient(), provideApiClient()] })], }; diff --git a/src/app/registratie/ui/registration-summary/registration-summary.stories.ts b/src/app/registratie/ui/registration-summary/registration-summary.stories.ts index ab099b1..5d6e276 100644 --- a/src/app/registratie/ui/registration-summary/registration-summary.stories.ts +++ b/src/app/registratie/ui/registration-summary/registration-summary.stories.ts @@ -11,7 +11,7 @@ const base = { } satisfies Omit; const meta: Meta = { - title: 'Organisms/Registration Summary', + title: 'Domein/Registratie/Registration Summary', component: RegistrationSummaryComponent, }; export default meta; diff --git a/src/app/registratie/ui/registration-table/registration-table.stories.ts b/src/app/registratie/ui/registration-table/registration-table.stories.ts index 36bc08c..932cb0c 100644 --- a/src/app/registratie/ui/registration-table/registration-table.stories.ts +++ b/src/app/registratie/ui/registration-table/registration-table.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { RegistrationTableComponent } from './registration-table.component'; const meta: Meta = { - title: 'Organisms/Registration Table', + title: 'Domein/Registratie/Registration Table', component: RegistrationTableComponent, }; export default meta; diff --git a/src/app/shared/layout/breadcrumb/breadcrumb.stories.ts b/src/app/shared/layout/breadcrumb/breadcrumb.stories.ts index 61c208c..c2e6108 100644 --- a/src/app/shared/layout/breadcrumb/breadcrumb.stories.ts +++ b/src/app/shared/layout/breadcrumb/breadcrumb.stories.ts @@ -4,7 +4,7 @@ import { provideRouter } from '@angular/router'; import { BreadcrumbComponent } from './breadcrumb.component'; const meta: Meta = { - title: 'Layout/Breadcrumb', + title: 'Design System/Molecules/Breadcrumb', component: BreadcrumbComponent, decorators: [applicationConfig({ providers: [provideRouter([])] })], render: (args) => ({ diff --git a/src/app/shared/layout/page-shell/page-shell.stories.ts b/src/app/shared/layout/page-shell/page-shell.stories.ts index a67a4cf..881eb9e 100644 --- a/src/app/shared/layout/page-shell/page-shell.stories.ts +++ b/src/app/shared/layout/page-shell/page-shell.stories.ts @@ -5,7 +5,7 @@ import { PageShellComponent } from './page-shell.component'; import { ButtonComponent } from '@shared/ui/button/button.component'; const meta: Meta = { - title: 'Templates/PageShell', + title: 'Design System/Templates/PageShell', component: PageShellComponent, decorators: [ applicationConfig({ providers: [provideRouter([])] }), diff --git a/src/app/shared/layout/site-footer/site-footer.stories.ts b/src/app/shared/layout/site-footer/site-footer.stories.ts index e99a2d7..6b410db 100644 --- a/src/app/shared/layout/site-footer/site-footer.stories.ts +++ b/src/app/shared/layout/site-footer/site-footer.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { SiteFooterComponent } from './site-footer.component'; const meta: Meta = { - title: 'Layout/Site Footer', + title: 'Design System/Organisms/Site Footer', component: SiteFooterComponent, render: () => ({ template: `` }), }; diff --git a/src/app/shared/layout/site-header/site-header.stories.ts b/src/app/shared/layout/site-header/site-header.stories.ts index 4fdce4b..7a9dcd6 100644 --- a/src/app/shared/layout/site-header/site-header.stories.ts +++ b/src/app/shared/layout/site-header/site-header.stories.ts @@ -4,7 +4,7 @@ import { provideRouter } from '@angular/router'; import { SiteHeaderComponent } from './site-header.component'; const meta: Meta = { - title: 'Layout/Site Header', + title: 'Design System/Organisms/Site Header', component: SiteHeaderComponent, decorators: [applicationConfig({ providers: [provideRouter([])] })], render: (args) => ({ diff --git a/src/app/shared/layout/wizard-shell/wizard-shell.stories.ts b/src/app/shared/layout/wizard-shell/wizard-shell.stories.ts index 2c33390..7066957 100644 --- a/src/app/shared/layout/wizard-shell/wizard-shell.stories.ts +++ b/src/app/shared/layout/wizard-shell/wizard-shell.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { WizardShellComponent } from './wizard-shell.component'; const meta: Meta = { - title: 'Templates/WizardShell', + title: 'Design System/Templates/WizardShell', component: WizardShellComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/alert/alert.stories.ts b/src/app/shared/ui/alert/alert.stories.ts index 6fad4c5..6e7e439 100644 --- a/src/app/shared/ui/alert/alert.stories.ts +++ b/src/app/shared/ui/alert/alert.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { AlertComponent } from './alert.component'; const meta: Meta = { - title: 'Atoms/Alert', + title: 'Design System/Atoms/Alert', component: AlertComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/application-link/application-link.stories.ts b/src/app/shared/ui/application-link/application-link.stories.ts index e8dba9f..28164c0 100644 --- a/src/app/shared/ui/application-link/application-link.stories.ts +++ b/src/app/shared/ui/application-link/application-link.stories.ts @@ -4,7 +4,7 @@ import { provideRouter } from '@angular/router'; import { ApplicationLinkComponent } from './application-link.component'; const meta: Meta = { - title: 'Molecules/Application Link', + title: 'Design System/Molecules/Application Link', component: ApplicationLinkComponent, decorators: [applicationConfig({ providers: [provideRouter([])] })], render: (args) => ({ diff --git a/src/app/shared/ui/application-list/application-list.stories.ts b/src/app/shared/ui/application-list/application-list.stories.ts index 4bb14e3..07fb06b 100644 --- a/src/app/shared/ui/application-list/application-list.stories.ts +++ b/src/app/shared/ui/application-list/application-list.stories.ts @@ -5,7 +5,7 @@ import { ApplicationListComponent } from './application-list.component'; import { ApplicationLinkComponent } from '@shared/ui/application-link/application-link.component'; const meta: Meta = { - title: 'Molecules/Application List', + title: 'Design System/Molecules/Application List', component: ApplicationListComponent, decorators: [ applicationConfig({ providers: [provideRouter([])] }), diff --git a/src/app/shared/ui/async/async.stories.ts b/src/app/shared/ui/async/async.stories.ts index 90bf2b6..81c5ba0 100644 --- a/src/app/shared/ui/async/async.stories.ts +++ b/src/app/shared/ui/async/async.stories.ts @@ -17,7 +17,7 @@ function fakeResource(status: string, value?: T, error?: Error): Resource } const meta: Meta = { - title: 'Molecules/Async States', + title: 'Design System/Molecules/Async States', decorators: [moduleMetadata({ imports: [...ASYNC, SkeletonComponent] })], render: (args) => ({ // isEmpty is a function — Storybook strips function args, so set it here. diff --git a/src/app/shared/ui/button/button.stories.ts b/src/app/shared/ui/button/button.stories.ts index 1dd7390..e5165c5 100644 --- a/src/app/shared/ui/button/button.stories.ts +++ b/src/app/shared/ui/button/button.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { ButtonComponent } from './button.component'; const meta: Meta = { - title: 'Atoms/Button', + title: 'Design System/Atoms/Button', component: ButtonComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/card/card.stories.ts b/src/app/shared/ui/card/card.stories.ts index f137ce6..ef26bdc 100644 --- a/src/app/shared/ui/card/card.stories.ts +++ b/src/app/shared/ui/card/card.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { CardComponent } from './card.component'; const meta: Meta = { - title: 'Molecules/Card', + title: 'Design System/Molecules/Card', component: CardComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/checkbox/checkbox.stories.ts b/src/app/shared/ui/checkbox/checkbox.stories.ts index e127202..8e27946 100644 --- a/src/app/shared/ui/checkbox/checkbox.stories.ts +++ b/src/app/shared/ui/checkbox/checkbox.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { CheckboxComponent } from './checkbox.component'; const meta: Meta = { - title: 'Atoms/Checkbox', + title: 'Design System/Atoms/Checkbox', component: CheckboxComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/choice-link/choice-link.stories.ts b/src/app/shared/ui/choice-link/choice-link.stories.ts index 92243a5..6d90edb 100644 --- a/src/app/shared/ui/choice-link/choice-link.stories.ts +++ b/src/app/shared/ui/choice-link/choice-link.stories.ts @@ -4,7 +4,7 @@ import { provideRouter } from '@angular/router'; import { ChoiceLinkComponent } from './choice-link.component'; const meta: Meta = { - title: 'Molecules/Choice Link', + title: 'Design System/Molecules/Choice Link', component: ChoiceLinkComponent, decorators: [applicationConfig({ providers: [provideRouter([])] })], render: (args) => ({ diff --git a/src/app/shared/ui/choice-list/choice-list.stories.ts b/src/app/shared/ui/choice-list/choice-list.stories.ts index b000ff2..b4cc391 100644 --- a/src/app/shared/ui/choice-list/choice-list.stories.ts +++ b/src/app/shared/ui/choice-list/choice-list.stories.ts @@ -5,7 +5,7 @@ import { ChoiceListComponent } from './choice-list.component'; import { ChoiceLinkComponent } from '@shared/ui/choice-link/choice-link.component'; const meta: Meta = { - title: 'Molecules/Choice List', + title: 'Design System/Molecules/Choice List', component: ChoiceListComponent, decorators: [ applicationConfig({ providers: [provideRouter([])] }), diff --git a/src/app/shared/ui/confirmation/confirmation.stories.ts b/src/app/shared/ui/confirmation/confirmation.stories.ts index 891e604..71ca53b 100644 --- a/src/app/shared/ui/confirmation/confirmation.stories.ts +++ b/src/app/shared/ui/confirmation/confirmation.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { ConfirmationComponent } from './confirmation.component'; const meta: Meta = { - title: 'Molecules/Confirmation', + title: 'Design System/Molecules/Confirmation', component: ConfirmationComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/data-block/data-block.stories.ts b/src/app/shared/ui/data-block/data-block.stories.ts index 88586aa..cfa61f3 100644 --- a/src/app/shared/ui/data-block/data-block.stories.ts +++ b/src/app/shared/ui/data-block/data-block.stories.ts @@ -4,7 +4,7 @@ import { DataBlockComponent } from './data-block.component'; import { DataRowComponent } from '@shared/ui/data-row/data-row.component'; const meta: Meta = { - title: 'Molecules/Data Block', + title: 'Design System/Molecules/Data Block', component: DataBlockComponent, decorators: [moduleMetadata({ imports: [DataRowComponent] })], render: (args) => ({ diff --git a/src/app/shared/ui/data-row/data-row.stories.ts b/src/app/shared/ui/data-row/data-row.stories.ts index 42a4dd3..b2788d1 100644 --- a/src/app/shared/ui/data-row/data-row.stories.ts +++ b/src/app/shared/ui/data-row/data-row.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { DataRowComponent } from './data-row.component'; const meta: Meta = { - title: 'Molecules/Data Row', + title: 'Design System/Molecules/Data Row', component: DataRowComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/debug-state/debug-state.stories.ts b/src/app/shared/ui/debug-state/debug-state.stories.ts index 141d28d..30768cc 100644 --- a/src/app/shared/ui/debug-state/debug-state.stories.ts +++ b/src/app/shared/ui/debug-state/debug-state.stories.ts @@ -3,7 +3,7 @@ import { DebugStateComponent } from './debug-state.component'; // Devtools, not a design-system atom — titled accordingly. const meta: Meta = { - title: 'Devtools/State debug', + title: 'Design System/Devtools/State debug', component: DebugStateComponent, parameters: { cibgGap: true, diff --git a/src/app/shared/ui/form-field/form-field.stories.ts b/src/app/shared/ui/form-field/form-field.stories.ts index c536308..ec5ad58 100644 --- a/src/app/shared/ui/form-field/form-field.stories.ts +++ b/src/app/shared/ui/form-field/form-field.stories.ts @@ -4,7 +4,7 @@ import { FormFieldComponent } from './form-field.component'; import { TextInputComponent } from '@shared/ui/text-input/text-input.component'; const meta: Meta = { - title: 'Molecules/Form Field', + title: 'Design System/Molecules/Form Field', component: FormFieldComponent, decorators: [moduleMetadata({ imports: [TextInputComponent] })], render: (args) => ({ diff --git a/src/app/shared/ui/heading/heading.stories.ts b/src/app/shared/ui/heading/heading.stories.ts index d1f3454..4e5e0cf 100644 --- a/src/app/shared/ui/heading/heading.stories.ts +++ b/src/app/shared/ui/heading/heading.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { HeadingComponent } from './heading.component'; const meta: Meta = { - title: 'Atoms/Heading', + title: 'Design System/Atoms/Heading', component: HeadingComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/link/link.stories.ts b/src/app/shared/ui/link/link.stories.ts index d92cf02..8ec175c 100644 --- a/src/app/shared/ui/link/link.stories.ts +++ b/src/app/shared/ui/link/link.stories.ts @@ -4,7 +4,7 @@ import { provideRouter } from '@angular/router'; import { LinkComponent } from './link.component'; const meta: Meta = { - title: 'Atoms/Link', + title: 'Design System/Atoms/Link', component: LinkComponent, decorators: [applicationConfig({ providers: [provideRouter([])] })], render: (args) => ({ diff --git a/src/app/shared/ui/placeholder-chip/placeholder-chip.stories.ts b/src/app/shared/ui/placeholder-chip/placeholder-chip.stories.ts index 99f010b..fbd65f3 100644 --- a/src/app/shared/ui/placeholder-chip/placeholder-chip.stories.ts +++ b/src/app/shared/ui/placeholder-chip/placeholder-chip.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { PlaceholderChipComponent } from './placeholder-chip.component'; const meta: Meta = { - title: 'Atoms/Placeholder Chip', + title: 'Design System/Atoms/Placeholder Chip', component: PlaceholderChipComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/radio-group/radio-group.stories.ts b/src/app/shared/ui/radio-group/radio-group.stories.ts index 07957eb..de079de 100644 --- a/src/app/shared/ui/radio-group/radio-group.stories.ts +++ b/src/app/shared/ui/radio-group/radio-group.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { RadioGroupComponent } from './radio-group.component'; const meta: Meta = { - title: 'Atoms/RadioGroup', + title: 'Design System/Atoms/RadioGroup', component: RadioGroupComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/review-section/review-section.stories.ts b/src/app/shared/ui/review-section/review-section.stories.ts index 3362c47..b10ae42 100644 --- a/src/app/shared/ui/review-section/review-section.stories.ts +++ b/src/app/shared/ui/review-section/review-section.stories.ts @@ -4,7 +4,7 @@ import { ReviewSectionComponent } from './review-section.component'; import { DataRowComponent } from '@shared/ui/data-row/data-row.component'; const meta: Meta = { - title: 'Molecules/Review Section', + title: 'Design System/Molecules/Review Section', component: ReviewSectionComponent, decorators: [moduleMetadata({ imports: [DataRowComponent] })], render: (args) => ({ diff --git a/src/app/shared/ui/rich-text-editor/rich-text-editor.stories.ts b/src/app/shared/ui/rich-text-editor/rich-text-editor.stories.ts index 022dc28..0f017e5 100644 --- a/src/app/shared/ui/rich-text-editor/rich-text-editor.stories.ts +++ b/src/app/shared/ui/rich-text-editor/rich-text-editor.stories.ts @@ -28,7 +28,7 @@ const placeholders = [ ]; const meta: Meta = { - title: 'Molecules/Rich Text Editor', + title: 'Design System/Molecules/Rich Text Editor', component: RichTextEditorComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/skeleton/skeleton.stories.ts b/src/app/shared/ui/skeleton/skeleton.stories.ts index 6758c32..b41f26a 100644 --- a/src/app/shared/ui/skeleton/skeleton.stories.ts +++ b/src/app/shared/ui/skeleton/skeleton.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { SkeletonComponent } from './skeleton.component'; const meta: Meta = { - title: 'Atoms/Skeleton', + title: 'Design System/Atoms/Skeleton', component: SkeletonComponent, args: { delay: 0 }, parameters: { diff --git a/src/app/shared/ui/spinner/spinner.stories.ts b/src/app/shared/ui/spinner/spinner.stories.ts index 641f063..1e6fe2f 100644 --- a/src/app/shared/ui/spinner/spinner.stories.ts +++ b/src/app/shared/ui/spinner/spinner.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { SpinnerComponent } from './spinner.component'; const meta: Meta = { - title: 'Atoms/Spinner', + title: 'Design System/Atoms/Spinner', component: SpinnerComponent, parameters: { cibgGap: true, diff --git a/src/app/shared/ui/status-badge/status-badge.stories.ts b/src/app/shared/ui/status-badge/status-badge.stories.ts index 5a6c2ea..029bb0c 100644 --- a/src/app/shared/ui/status-badge/status-badge.stories.ts +++ b/src/app/shared/ui/status-badge/status-badge.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { StatusBadgeComponent } from './status-badge.component'; const meta: Meta = { - title: 'Shared UI/Status Badge', + title: 'Design System/Atoms/Status Badge', component: StatusBadgeComponent, parameters: { cibgGap: true, diff --git a/src/app/shared/ui/stepper/stepper.stories.ts b/src/app/shared/ui/stepper/stepper.stories.ts index c9f9a55..1af242f 100644 --- a/src/app/shared/ui/stepper/stepper.stories.ts +++ b/src/app/shared/ui/stepper/stepper.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { StepperComponent } from './stepper.component'; const meta: Meta = { - title: 'Molecules/Stepper', + title: 'Design System/Molecules/Stepper', component: StepperComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/task-list/task-list.stories.ts b/src/app/shared/ui/task-list/task-list.stories.ts index 74cafd6..144548f 100644 --- a/src/app/shared/ui/task-list/task-list.stories.ts +++ b/src/app/shared/ui/task-list/task-list.stories.ts @@ -4,7 +4,7 @@ import { provideRouter } from '@angular/router'; import { TaskListComponent } from './task-list.component'; const meta: Meta = { - title: 'Molecules/Task List', + title: 'Design System/Molecules/Task List', component: TaskListComponent, decorators: [applicationConfig({ providers: [provideRouter([])] })], render: (args) => ({ diff --git a/src/app/shared/ui/text-input/text-input.stories.ts b/src/app/shared/ui/text-input/text-input.stories.ts index c2790ae..4d70c60 100644 --- a/src/app/shared/ui/text-input/text-input.stories.ts +++ b/src/app/shared/ui/text-input/text-input.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { TextInputComponent } from './text-input.component'; const meta: Meta = { - title: 'Atoms/Text Input', + title: 'Design System/Atoms/Text Input', component: TextInputComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/upload/delivery-channel-toggle/delivery-channel-toggle.stories.ts b/src/app/shared/ui/upload/delivery-channel-toggle/delivery-channel-toggle.stories.ts index 84e9832..8e7347a 100644 --- a/src/app/shared/ui/upload/delivery-channel-toggle/delivery-channel-toggle.stories.ts +++ b/src/app/shared/ui/upload/delivery-channel-toggle/delivery-channel-toggle.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { DeliveryChannelToggleComponent } from './delivery-channel-toggle.component'; const meta: Meta = { - title: 'Atoms/DeliveryChannelToggle', + title: 'Design System/Atoms/DeliveryChannelToggle', component: DeliveryChannelToggleComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/upload/document-category/document-category.stories.ts b/src/app/shared/ui/upload/document-category/document-category.stories.ts index 6ae19a3..a82275f 100644 --- a/src/app/shared/ui/upload/document-category/document-category.stories.ts +++ b/src/app/shared/ui/upload/document-category/document-category.stories.ts @@ -3,7 +3,7 @@ import type { DocumentCategory, Upload } from '@shared/upload/upload.machine'; import { DocumentCategoryComponent } from './document-category.component'; const meta: Meta = { - title: 'Organisms/DocumentCategory', + title: 'Design System/Organisms/DocumentCategory', component: DocumentCategoryComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/upload/document-chip/document-chip.stories.ts b/src/app/shared/ui/upload/document-chip/document-chip.stories.ts index 4ec68b5..ac1ff05 100644 --- a/src/app/shared/ui/upload/document-chip/document-chip.stories.ts +++ b/src/app/shared/ui/upload/document-chip/document-chip.stories.ts @@ -3,7 +3,7 @@ import type { UploadStatus } from '@shared/upload/upload.machine'; import { DocumentChipComponent } from './document-chip.component'; const meta: Meta = { - title: 'Atoms/DocumentChip', + title: 'Design System/Atoms/DocumentChip', component: DocumentChipComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/upload/document-upload/document-upload.stories.ts b/src/app/shared/ui/upload/document-upload/document-upload.stories.ts index e955b8c..578ca75 100644 --- a/src/app/shared/ui/upload/document-upload/document-upload.stories.ts +++ b/src/app/shared/ui/upload/document-upload/document-upload.stories.ts @@ -3,7 +3,7 @@ import type { UploadState } from '@shared/upload/upload.machine'; import { DocumentUploadComponent } from './document-upload.component'; const meta: Meta = { - title: 'Organisms/DocumentUpload', + title: 'Design System/Organisms/DocumentUpload', component: DocumentUploadComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/upload/file-input/file-input.stories.ts b/src/app/shared/ui/upload/file-input/file-input.stories.ts index 0796d6a..0d1da11 100644 --- a/src/app/shared/ui/upload/file-input/file-input.stories.ts +++ b/src/app/shared/ui/upload/file-input/file-input.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { FileInputComponent } from './file-input.component'; const meta: Meta = { - title: 'Atoms/FileInput', + title: 'Design System/Atoms/FileInput', component: FileInputComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/upload/single-upload/single-upload.stories.ts b/src/app/shared/ui/upload/single-upload/single-upload.stories.ts index a0f1f26..5d4ee64 100644 --- a/src/app/shared/ui/upload/single-upload/single-upload.stories.ts +++ b/src/app/shared/ui/upload/single-upload/single-upload.stories.ts @@ -3,7 +3,7 @@ import type { Upload } from '@shared/upload/upload.machine'; import { SingleUploadComponent } from './single-upload.component'; const meta: Meta = { - title: 'Molecules/SingleUpload', + title: 'Design System/Molecules/SingleUpload', component: SingleUploadComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/upload/upload-progress-bar/upload-progress-bar.stories.ts b/src/app/shared/ui/upload/upload-progress-bar/upload-progress-bar.stories.ts index 5b83706..ed650a9 100644 --- a/src/app/shared/ui/upload/upload-progress-bar/upload-progress-bar.stories.ts +++ b/src/app/shared/ui/upload/upload-progress-bar/upload-progress-bar.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { UploadProgressBarComponent } from './upload-progress-bar.component'; const meta: Meta = { - title: 'Atoms/UploadProgressBar', + title: 'Design System/Atoms/UploadProgressBar', component: UploadProgressBarComponent, render: (args) => ({ props: args, diff --git a/src/app/shared/ui/upload/upload-status-icon/upload-status-icon.stories.ts b/src/app/shared/ui/upload/upload-status-icon/upload-status-icon.stories.ts index 67eb2a1..2426735 100644 --- a/src/app/shared/ui/upload/upload-status-icon/upload-status-icon.stories.ts +++ b/src/app/shared/ui/upload/upload-status-icon/upload-status-icon.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { UploadStatusIconComponent } from './upload-status-icon.component'; const meta: Meta = { - title: 'Atoms/UploadStatusIcon', + title: 'Design System/Atoms/UploadStatusIcon', component: UploadStatusIconComponent, render: (args) => ({ props: args, diff --git a/src/docs/atomic-design.mdx b/src/docs/atomic-design.mdx index ac601bb..fe4f5f9 100644 --- a/src/docs/atomic-design.mdx +++ b/src/docs/atomic-design.mdx @@ -81,8 +81,8 @@ composes atoms; it adds no new visual primitives of its own. ### Organism — `document-upload` -`shared/ui/upload/document-upload` composes molecules (a file input, status banner, -progress bar, chips) into a section that owns real upload behaviour. +`shared/ui/upload/document-upload` composes molecules (a file input, alert, progress bar, +chips) into a section that owns real upload behaviour. diff --git a/src/docs/layers.mdx b/src/docs/layers.mdx new file mode 100644 index 0000000..28c10f0 --- /dev/null +++ b/src/docs/layers.mdx @@ -0,0 +1,83 @@ +import { Meta } from '@storybook/addon-docs/blocks'; + + + +# Layers & contexts + +This sidebar is laid out to **be** the architecture, not just document it: **Foundations** +(this curriculum) → **Design System** (reusable, domain-free) → **Domein** (the six DDD +contexts). If a component lives under a context's `ui/`, it's in Domein; everything else +in `shared/ui`/`shared/layout` is Design System. See [Atomic design](?path=/docs/foundations-atomic-design--docs) +for the Atoms → Molecules → Organisms → Templates ladder inside Design System. + +## Six contexts, one direction + +``` +src/app/// +``` + +Contexts: `shared` (the base layer — depends on nothing), `auth`, `registratie`, +`herregistratie`, `brief` (letter-composition teaching slice), `showcase` (teaching page, +sanctioned to read every context — nothing imports it). + +**Dependencies only point inward and in one declared direction between contexts:** + +``` +herregistratie → registratie → shared +auth → shared +brief → shared +``` + +Never the other way — `registratie` may not import `herregistratie`, and no context but +`shared` is imported by everyone. + +## Five layers, one direction + +| Layer | Job | Angular allowed? | +| --- | --- | --- | +| `domain/` | business rules + data types | **No — pure TS.** | +| `application/` | coordinate state/tasks (stores, commands) | yes (signals) | +| `infrastructure/` | where data comes from (HTTP adapters) | yes (HTTP) | +| `contracts/` | wire DTOs (the FE⇄BE seam) | no | +| `ui/` | how it looks (components, pages) | yes | + +`ui → application → domain`; `ui`/`layout` never import `infrastructure/` directly — they +reach data through an application store or command. + +## This is enforced, not just written down + +`eslint.config.mjs` fails the build on every rule above: + +- `domain/` importing `@angular/*` at all (any context). +- `shared/` importing a feature context (`@auth/*`, `@registratie/*`, `@herregistratie/*`, + `@brief/*`) — the base layer depends on nothing. +- `registratie/` importing `@herregistratie/*`/`@brief/*`, `auth/`/`brief/` importing a + sibling context — the cross-context direction above. +- `contracts/**` importing **anything** — not Angular, not an alias, not even a relative + path (ADR-0001's wire seam has to stay a pure DTO shape). +- `ui/**`/`layout/**` importing `*/infrastructure/*` — the anti-corruption boundary + (ADR-0001) stays behind a store/command, so a page can never bypass it and hand-recompute + a business rule the backend already decided. +- The generated `ApiClient` imported as a value outside an `infrastructure/` adapter + (type-only DTO imports are exempt — they grant no network access). + +Two components get a documented exemption from the "nothing reaches across" rule: +`shared/ui/debug-state` (reads every root store, for the dev-only state panel) and +`showcase/` (reads every context, for side-by-side teaching pages). Both exemptions live +next to the rule they break, in `eslint.config.mjs`, so they can't rot silently. + +## The English/Dutch seam + +Shared/reusable UI is named in **English** (language-agnostic: `button`, `wizard-shell`); +domain contexts are named in **Dutch** (`registratie`, `herregistratie`, `*.machine.ts`). +Pick the language by which side of the seam the code is on — it's the same seam this +sidebar's Design System/Domein split makes visible. + +## See it in the sidebar + +Compare a Design System primitive with the same shape reused across contexts: + +- [Design System → Molecules → Application Link](?path=/story/design-system-molecules-application-link--navigatie) — + domain-free, the caller supplies heading/subtitle/cta. +- [Domein → Registratie → Aanvraag Block](?path=/story/domein-registratie-aanvraag-block--concept) — + a context-specific organism composed from Design System atoms/molecules.