@toa.io/extensions.configuration 1.0.0-alpha.274 → 1.0.0-alpha.276
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/components/configuration.values/operations/create.d.ts +16 -0
- package/components/configuration.values/operations/create.js +58 -0
- package/components/configuration.values/operations/create.js.map +1 -0
- package/components/configuration.values/operations/fetch.d.ts +11 -0
- package/components/configuration.values/operations/fetch.js +17 -0
- package/components/configuration.values/operations/fetch.js.map +1 -0
- package/components/configuration.values/operations/get.d.ts +17 -0
- package/components/configuration.values/operations/get.js +23 -0
- package/components/configuration.values/operations/get.js.map +1 -0
- package/components/configuration.values/operations/lib/map.d.ts +11 -0
- package/components/configuration.values/operations/lib/map.js +26 -0
- package/components/configuration.values/operations/lib/map.js.map +1 -0
- package/components/configuration.values/operations/lib/map.test.d.ts +1 -0
- package/components/configuration.values/operations/lib/map.test.js +26 -0
- package/components/configuration.values/operations/lib/map.test.js.map +1 -0
- package/components/configuration.values/operations/lib/resolve.d.ts +27 -0
- package/components/configuration.values/operations/lib/resolve.js +28 -0
- package/components/configuration.values/operations/lib/resolve.js.map +1 -0
- package/components/configuration.values/operations/list.d.ts +10 -0
- package/components/configuration.values/operations/list.js +15 -0
- package/components/configuration.values/operations/list.js.map +1 -0
- package/components/configuration.values/operations/tsconfig.tsbuildinfo +1 -0
- package/features/site/favicon.ico +0 -0
- package/features/ui.feature +8 -0
- package/package.json +2 -2
- package/source/Aspect.ts +7 -2
- package/source/UI.ts +16 -1
- package/source/deployment.ts +1 -1
- package/transpiled/Aspect.js +3 -2
- package/transpiled/Aspect.js.map +1 -1
- package/transpiled/UI.js +14 -1
- package/transpiled/UI.js.map +1 -1
- package/transpiled/deployment.d.ts +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/ui/dist/_app/env.js +1 -0
- package/ui/dist/_app/immutable/assets/0.CNS8Cqhc.css +2 -0
- package/ui/dist/_app/immutable/assets/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2 +0 -0
- package/ui/dist/_app/immutable/assets/inter-cyrillic-wght-normal.DqGufNeO.woff2 +0 -0
- package/ui/dist/_app/immutable/assets/inter-greek-ext-wght-normal.DlzME5K_.woff2 +0 -0
- package/ui/dist/_app/immutable/assets/inter-greek-wght-normal.CkhJZR-_.woff2 +0 -0
- package/ui/dist/_app/immutable/assets/inter-latin-ext-wght-normal.DO1Apj_S.woff2 +0 -0
- package/ui/dist/_app/immutable/assets/inter-latin-wght-normal.Dx4kXJAl.woff2 +0 -0
- package/ui/dist/_app/immutable/assets/inter-vietnamese-wght-normal.CBcvBZtf.woff2 +0 -0
- package/ui/dist/_app/immutable/assets/ui.BghF56l_.css +1 -0
- package/ui/dist/_app/immutable/chunks/Bjy-W4x2.js +81 -0
- package/ui/dist/_app/immutable/chunks/CDKtbN4n.js +6 -0
- package/ui/dist/_app/immutable/chunks/CcD_ISxM.js +3 -0
- package/ui/dist/_app/immutable/chunks/Chb3af1a.js +1 -0
- package/ui/dist/_app/immutable/chunks/Cov6-56A.js +50 -0
- package/ui/dist/_app/immutable/chunks/E7oj41Za.js +1 -0
- package/ui/dist/_app/immutable/chunks/MOpxGoVO.js +8 -0
- package/ui/dist/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/ui/dist/_app/immutable/entry/app.B9v2AwU_.js +2 -0
- package/ui/dist/_app/immutable/entry/start.B97KALv1.js +1 -0
- package/ui/dist/_app/immutable/nodes/0.DKSa6mGa.js +1 -0
- package/ui/dist/_app/immutable/nodes/1.Cnu_jAWf.js +1 -0
- package/ui/dist/_app/immutable/nodes/2.Dg1zeC2b.js +1 -0
- package/ui/dist/_app/immutable/nodes/3.QCbZIibO.js +1 -0
- package/ui/dist/_app/immutable/nodes/4.1bG6DC_9.js +1 -0
- package/ui/dist/_app/version.json +1 -0
- package/ui/dist/apple-touch-icon.png +0 -0
- package/ui/dist/favicon-96x96.png +0 -0
- package/ui/dist/favicon.ico +0 -0
- package/ui/dist/index.html +52 -0
- package/ui/.agents/skills/antcn/SKILL.md +0 -91
- package/ui/.agents/skills/antcn/references/analytics.md +0 -78
- package/ui/.agents/skills/antcn/references/bridge.md +0 -41
- package/ui/.agents/skills/antcn/references/clipboard.md +0 -23
- package/ui/.agents/skills/antcn/references/dismissable.md +0 -75
- package/ui/.agents/skills/antcn/references/dropdown.md +0 -153
- package/ui/.agents/skills/antcn/references/fragments.md +0 -29
- package/ui/.agents/skills/antcn/references/fullscreen.md +0 -157
- package/ui/.agents/skills/antcn/references/geo.md +0 -27
- package/ui/.agents/skills/antcn/references/globals.md +0 -31
- package/ui/.agents/skills/antcn/references/grammatical-form.md +0 -69
- package/ui/.agents/skills/antcn/references/hints.md +0 -44
- package/ui/.agents/skills/antcn/references/hold.md +0 -34
- package/ui/.agents/skills/antcn/references/iam.md +0 -117
- package/ui/.agents/skills/antcn/references/input-form.md +0 -34
- package/ui/.agents/skills/antcn/references/locale.md +0 -66
- package/ui/.agents/skills/antcn/references/net.md +0 -33
- package/ui/.agents/skills/antcn/references/panel.md +0 -44
- package/ui/.agents/skills/antcn/references/passkeys.md +0 -27
- package/ui/.agents/skills/antcn/references/payments.md +0 -99
- package/ui/.agents/skills/antcn/references/realtime.md +0 -69
- package/ui/.agents/skills/antcn/references/scrollable.md +0 -39
- package/ui/.agents/skills/antcn/references/selector.md +0 -71
- package/ui/.agents/skills/antcn/references/shake.md +0 -36
- package/ui/.agents/skills/antcn/references/share.md +0 -28
- package/ui/.agents/skills/antcn/references/shell.md +0 -139
- package/ui/.agents/skills/antcn/references/stack.md +0 -53
- package/ui/.agents/skills/antcn/references/system.md +0 -149
- package/ui/.agents/skills/antcn/references/taptap.md +0 -28
- package/ui/.agents/skills/antcn/references/tools.md +0 -68
- package/ui/.agents/skills/antcn/references/transmission.md +0 -96
- package/ui/.agents/skills/shadcn-svelte/SKILL.md +0 -227
- package/ui/.agents/skills/shadcn-svelte/agents/openai.yml +0 -5
- package/ui/.agents/skills/shadcn-svelte/assets/shadcn-svelte-small.png +0 -0
- package/ui/.agents/skills/shadcn-svelte/assets/shadcn-svelte.png +0 -0
- package/ui/.agents/skills/shadcn-svelte/cli.md +0 -166
- package/ui/.agents/skills/shadcn-svelte/customization.md +0 -213
- package/ui/.agents/skills/shadcn-svelte/evals/evals.json +0 -47
- package/ui/.agents/skills/shadcn-svelte/rules/composition.md +0 -244
- package/ui/.agents/skills/shadcn-svelte/rules/forms.md +0 -234
- package/ui/.agents/skills/shadcn-svelte/rules/icons.md +0 -107
- package/ui/.agents/skills/shadcn-svelte/rules/styling.md +0 -195
- package/ui/.agents/skills/svas/SKILL.md +0 -169
- package/ui/.agents/skills/svas/references/patterns.md +0 -95
- package/ui/.agents/skills/svintl/SKILL.md +0 -176
- package/ui/.claude/settings.json +0 -15
- package/ui/.codex/hooks.json +0 -15
- package/ui/.cursor/hooks.json +0 -11
- package/ui/.env.example +0 -1
- package/ui/.prettierrc +0 -9
- package/ui/.vscode/extensions.json +0 -7
- package/ui/.vscode/settings.json +0 -27
- package/ui/AGENTS.md +0 -51
- package/ui/architecture.md +0 -390
- package/ui/components.json +0 -20
- package/ui/eslint.config.js +0 -152
- package/ui/features/base.ts +0 -2
- package/ui/features/boot.feature +0 -5
- package/ui/features/steps/authentication.ts +0 -34
- package/ui/features/steps/navigaton.ts +0 -37
- package/ui/features/steps/typing.ts +0 -24
- package/ui/package-lock.json +0 -8173
- package/ui/package.json +0 -76
- package/ui/playwright.config.ts +0 -13
- package/ui/skills-lock.json +0 -30
- package/ui/src/@/configuration/index.ts +0 -1
- package/ui/src/@/configuration/svc/create.ts +0 -29
- package/ui/src/@/configuration/svc/index.ts +0 -3
- package/ui/src/@/configuration/svc/net/Configuration.ts +0 -18
- package/ui/src/@/configuration/svc/net/index.ts +0 -2
- package/ui/src/@/configuration/svc/net/interface.ts +0 -35
- package/ui/src/@/configuration/svc/store.ts +0 -14
- package/ui/src/@/configuration/ui/Configurations.svelte +0 -85
- package/ui/src/@/configuration/ui/Configurations.ts +0 -5
- package/ui/src/@/configuration/ui/Create.svelte +0 -64
- package/ui/src/@/configuration/ui/Create.ts +0 -7
- package/ui/src/@/configuration/ui/Form.svelte +0 -75
- package/ui/src/@/configuration/ui/Form.ts +0 -79
- package/ui/src/@/configuration/ui/Row.svelte +0 -44
- package/ui/src/@/configuration/ui/Row.ts +0 -9
- package/ui/src/@/configuration/ui/Value.svelte +0 -33
- package/ui/src/@/configuration/ui/Value.ts +0 -6
- package/ui/src/@/configuration/ui/index.ts +0 -9
- package/ui/src/@/configuration/ui/intl/built.js +0 -38
- package/ui/src/@/configuration/ui/intl/context.yaml +0 -51
- package/ui/src/@/configuration/ui/intl/en-US.yaml +0 -21
- package/ui/src/@/configuration/ui/intl/index.ts +0 -9
- package/ui/src/@/configuration/ui/intl/types.ts +0 -31
- package/ui/src/@/configuration/ui/read.test.ts +0 -75
- package/ui/src/@/configuration/ui/read.ts +0 -102
- package/ui/src/@/configuration/ui/ui.test.ts +0 -69
- package/ui/src/@/configuration/ui/ui.ts +0 -115
- package/ui/src/@/iam/index.ts +0 -1
- package/ui/src/@/iam/rc.ts +0 -22
- package/ui/src/@/iam/svc/authenticated.ts +0 -17
- package/ui/src/@/iam/svc/basic.ts +0 -23
- package/ui/src/@/iam/svc/index.ts +0 -10
- package/ui/src/@/iam/svc/logout.ts +0 -5
- package/ui/src/@/iam/svc/named.ts +0 -16
- package/ui/src/@/iam/svc/net/Echo.ts +0 -9
- package/ui/src/@/iam/svc/net/basic/index.ts +0 -1
- package/ui/src/@/iam/svc/net/basic/interface.ts +0 -15
- package/ui/src/@/iam/svc/net/federation/index.ts +0 -1
- package/ui/src/@/iam/svc/net/federation/interface.ts +0 -12
- package/ui/src/@/iam/svc/net/index.ts +0 -6
- package/ui/src/@/iam/svc/net/interface.ts +0 -17
- package/ui/src/@/iam/svc/net/otp/index.ts +0 -1
- package/ui/src/@/iam/svc/net/otp/interface.ts +0 -14
- package/ui/src/@/iam/svc/net/passkeys/index.ts +0 -1
- package/ui/src/@/iam/svc/net/passkeys/interface.ts +0 -12
- package/ui/src/@/iam/svc/oidc/apple.ts +0 -47
- package/ui/src/@/iam/svc/oidc/authenticate.ts +0 -62
- package/ui/src/@/iam/svc/oidc/google.ts +0 -45
- package/ui/src/@/iam/svc/oidc/hello.ts +0 -82
- package/ui/src/@/iam/svc/oidc/index.ts +0 -3
- package/ui/src/@/iam/svc/oidc/nonce.ts +0 -5
- package/ui/src/@/iam/svc/oidc/providers.ts +0 -28
- package/ui/src/@/iam/svc/oidc/standard.ts +0 -28
- package/ui/src/@/iam/svc/otp.ts +0 -18
- package/ui/src/@/iam/svc/passkeys/create.ts +0 -20
- package/ui/src/@/iam/svc/passkeys/index.ts +0 -2
- package/ui/src/@/iam/svc/passkeys/login.ts +0 -21
- package/ui/src/@/iam/svc/store.ts +0 -36
- package/ui/src/@/iam/svc/sync.ts +0 -18
- package/ui/src/@/iam/svc/transfer.ts +0 -11
- package/ui/src/@/iam/svc/update.ts +0 -8
- package/ui/src/@/iam/ui/AccountLike.ts +0 -4
- package/ui/src/@/iam/ui/Authenticated.svelte +0 -37
- package/ui/src/@/iam/ui/Authenticated.ts +0 -10
- package/ui/src/@/iam/ui/Authentication.svelte +0 -50
- package/ui/src/@/iam/ui/Authentication.ts +0 -9
- package/ui/src/@/iam/ui/Authorized.svelte +0 -32
- package/ui/src/@/iam/ui/Authorized.ts +0 -65
- package/ui/src/@/iam/ui/Card.svelte +0 -14
- package/ui/src/@/iam/ui/Card.ts +0 -7
- package/ui/src/@/iam/ui/Refresh.svelte +0 -39
- package/ui/src/@/iam/ui/credentials/Credentials.svelte +0 -26
- package/ui/src/@/iam/ui/credentials/Credentials.ts +0 -5
- package/ui/src/@/iam/ui/credentials/Provider.svelte +0 -24
- package/ui/src/@/iam/ui/credentials/Provider.ts +0 -5
- package/ui/src/@/iam/ui/credentials/index.ts +0 -1
- package/ui/src/@/iam/ui/credentials/passkeys/Key.svelte +0 -42
- package/ui/src/@/iam/ui/credentials/passkeys/Key.ts +0 -29
- package/ui/src/@/iam/ui/credentials/passkeys/Manager.svelte +0 -83
- package/ui/src/@/iam/ui/credentials/passkeys/Manager.ts +0 -5
- package/ui/src/@/iam/ui/credentials/passkeys/Passkeys.svelte +0 -39
- package/ui/src/@/iam/ui/credentials/passkeys/Summary.svelte +0 -27
- package/ui/src/@/iam/ui/credentials/passkeys/Summary.ts +0 -5
- package/ui/src/@/iam/ui/credentials/passkeys/index.ts +0 -1
- package/ui/src/@/iam/ui/credentials/providers.ts +0 -15
- package/ui/src/@/iam/ui/credentials/transfer/Qr.svelte +0 -24
- package/ui/src/@/iam/ui/credentials/transfer/Qr.ts +0 -3
- package/ui/src/@/iam/ui/credentials/transfer/Transfer.svelte +0 -48
- package/ui/src/@/iam/ui/credentials/transfer/Transfer.ts +0 -5
- package/ui/src/@/iam/ui/credentials/transfer/index.ts +0 -1
- package/ui/src/@/iam/ui/index.ts +0 -3
- package/ui/src/@/iam/ui/intl/built.js +0 -79
- package/ui/src/@/iam/ui/intl/context.yaml +0 -91
- package/ui/src/@/iam/ui/intl/en-US.yaml +0 -64
- package/ui/src/@/iam/ui/intl/index.ts +0 -10
- package/ui/src/@/iam/ui/intl/types.ts +0 -70
- package/ui/src/@/iam/ui/oidc/Authentication.svelte +0 -16
- package/ui/src/@/iam/ui/oidc/Authentication.ts +0 -5
- package/ui/src/@/iam/ui/oidc/Button.svelte +0 -36
- package/ui/src/@/iam/ui/oidc/Button.ts +0 -11
- package/ui/src/@/iam/ui/oidc/Refresh.svelte +0 -16
- package/ui/src/@/iam/ui/oidc/icons/Apple.svelte +0 -19
- package/ui/src/@/iam/ui/oidc/icons/Google.svelte +0 -31
- package/ui/src/@/iam/ui/oidc/icons/index.ts +0 -11
- package/ui/src/@/iam/ui/oidc/index.ts +0 -2
- package/ui/src/@/iam/ui/passkey/Authentication.svelte +0 -64
- package/ui/src/@/iam/ui/passkey/Authentication.ts +0 -8
- package/ui/src/@/iam/ui/passkey/Create.svelte +0 -53
- package/ui/src/@/iam/ui/passkey/Create.ts +0 -7
- package/ui/src/@/iam/ui/passkey/Login.svelte +0 -29
- package/ui/src/@/iam/ui/passkey/Refresh.svelte +0 -29
- package/ui/src/@/iam/ui/passkey/index.ts +0 -2
- package/ui/src/@/iam/ui/password/Authentication.svelte +0 -19
- package/ui/src/@/iam/ui/password/Authentication.ts +0 -8
- package/ui/src/@/iam/ui/password/Form.svelte +0 -151
- package/ui/src/@/iam/ui/password/Form.ts +0 -6
- package/ui/src/@/iam/ui/password/Password.svelte +0 -39
- package/ui/src/@/iam/ui/password/Password.ts +0 -6
- package/ui/src/@/iam/ui/password/Refresh.svelte +0 -5
- package/ui/src/@/iam/ui/password/index.ts +0 -2
- package/ui/src/@/net/index.ts +0 -1
- package/ui/src/@/net/svc/index.ts +0 -3
- package/ui/src/@/net/svc/origin.ts +0 -8
- package/ui/src/@/net/svc/query.test.ts +0 -45
- package/ui/src/@/net/svc/query.ts +0 -25
- package/ui/src/@/passkeys/index.ts +0 -1
- package/ui/src/@/passkeys/svc/add.ts +0 -15
- package/ui/src/@/passkeys/svc/create.ts +0 -58
- package/ui/src/@/passkeys/svc/credentials/convert.ts +0 -32
- package/ui/src/@/passkeys/svc/credentials/create.ts +0 -34
- package/ui/src/@/passkeys/svc/credentials/get.ts +0 -14
- package/ui/src/@/passkeys/svc/credentials/index.ts +0 -3
- package/ui/src/@/passkeys/svc/credentials/key.ts +0 -10
- package/ui/src/@/passkeys/svc/get.ts +0 -10
- package/ui/src/@/passkeys/svc/index.ts +0 -6
- package/ui/src/@/passkeys/svc/net/CreationResponse.ts +0 -15
- package/ui/src/@/passkeys/svc/net/Passkey.ts +0 -8
- package/ui/src/@/passkeys/svc/net/RequestResponse.ts +0 -12
- package/ui/src/@/passkeys/svc/net/challenges/Options.ts +0 -21
- package/ui/src/@/passkeys/svc/net/challenges/index.ts +0 -2
- package/ui/src/@/passkeys/svc/net/challenges/interface.ts +0 -16
- package/ui/src/@/passkeys/svc/net/index.ts +0 -4
- package/ui/src/@/passkeys/svc/net/interface.ts +0 -29
- package/ui/src/@/passkeys/svc/remove.ts +0 -13
- package/ui/src/@/passkeys/svc/request.ts +0 -50
- package/ui/src/@/passkeys/svc/store.ts +0 -13
- package/ui/src/@/passkeys/svc/supported.ts +0 -1
- package/ui/src/@/passkeys/ui/aaguid.json +0 -150
- package/ui/src/@/realtime/events.ts +0 -1
- package/ui/src/@/realtime/index.ts +0 -1
- package/ui/src/@/realtime/rc.ts +0 -13
- package/ui/src/@/realtime/svc/connect.ts +0 -67
- package/ui/src/@/realtime/svc/events.ts +0 -17
- package/ui/src/@/realtime/svc/index.ts +0 -5
- package/ui/src/@/realtime/svc/net/Message.ts +0 -6
- package/ui/src/@/realtime/svc/net/index.ts +0 -2
- package/ui/src/@/realtime/svc/net/interface.ts +0 -13
- package/ui/src/@/realtime/svc/reset.ts +0 -5
- package/ui/src/@/realtime/svc/status.ts +0 -12
- package/ui/src/@/realtime/svc/store.ts +0 -30
- package/ui/src/@/realtime/svc/time.ts +0 -15
- package/ui/src/app.d.ts +0 -20
- package/ui/src/app.html +0 -13
- package/ui/src/config/index.ts +0 -70
- package/ui/src/lib/assets/favicon.svg +0 -1
- package/ui/src/lib/components/clipboard/Clipboard.svelte +0 -63
- package/ui/src/lib/components/clipboard/Clipboard.ts +0 -12
- package/ui/src/lib/components/clipboard/index.ts +0 -1
- package/ui/src/lib/components/dismissable/Dismissable.svelte +0 -81
- package/ui/src/lib/components/dismissable/Dismissable.ts +0 -7
- package/ui/src/lib/components/dismissable/index.ts +0 -1
- package/ui/src/lib/components/dropdown/Back.svelte +0 -14
- package/ui/src/lib/components/dropdown/Back.ts +0 -3
- package/ui/src/lib/components/dropdown/Content.svelte +0 -76
- package/ui/src/lib/components/dropdown/Content.ts +0 -13
- package/ui/src/lib/components/dropdown/Context.ts +0 -18
- package/ui/src/lib/components/dropdown/Group.svelte +0 -24
- package/ui/src/lib/components/dropdown/Group.ts +0 -8
- package/ui/src/lib/components/dropdown/GroupContext.ts +0 -15
- package/ui/src/lib/components/dropdown/Item.svelte +0 -31
- package/ui/src/lib/components/dropdown/Item.ts +0 -5
- package/ui/src/lib/components/dropdown/Layer.svelte +0 -11
- package/ui/src/lib/components/dropdown/Layer.ts +0 -7
- package/ui/src/lib/components/dropdown/Root.svelte +0 -88
- package/ui/src/lib/components/dropdown/Root.ts +0 -6
- package/ui/src/lib/components/dropdown/Separator.svelte +0 -13
- package/ui/src/lib/components/dropdown/Separator.ts +0 -5
- package/ui/src/lib/components/dropdown/Trigger.svelte +0 -33
- package/ui/src/lib/components/dropdown/Trigger.ts +0 -5
- package/ui/src/lib/components/dropdown/index.ts +0 -8
- package/ui/src/lib/components/fullscreen/Fullscreen.svelte +0 -97
- package/ui/src/lib/components/fullscreen/Fullscreen.ts +0 -18
- package/ui/src/lib/components/fullscreen/Overlay.svelte +0 -15
- package/ui/src/lib/components/fullscreen/Overlay.ts +0 -7
- package/ui/src/lib/components/fullscreen/index.ts +0 -2
- package/ui/src/lib/components/hold/Hold.svelte +0 -133
- package/ui/src/lib/components/hold/Hold.ts +0 -23
- package/ui/src/lib/components/hold/index.ts +0 -1
- package/ui/src/lib/components/scrollable/Scrollable.svelte +0 -49
- package/ui/src/lib/components/scrollable/Scrollable.ts +0 -117
- package/ui/src/lib/components/scrollable/index.ts +0 -2
- package/ui/src/lib/components/shake/Shake.svelte +0 -62
- package/ui/src/lib/components/shake/Shake.ts +0 -7
- package/ui/src/lib/components/shake/index.ts +0 -1
- package/ui/src/lib/components/share/Share.svelte +0 -58
- package/ui/src/lib/components/share/Share.ts +0 -9
- package/ui/src/lib/components/share/index.ts +0 -1
- package/ui/src/lib/components/shell/Attention.svelte +0 -11
- package/ui/src/lib/components/shell/Attention.ts +0 -6
- package/ui/src/lib/components/shell/Header.svelte +0 -18
- package/ui/src/lib/components/shell/Header.ts +0 -7
- package/ui/src/lib/components/shell/Screen.svelte +0 -28
- package/ui/src/lib/components/shell/Screen.ts +0 -11
- package/ui/src/lib/components/shell/Sticky.svelte +0 -23
- package/ui/src/lib/components/shell/Sticky.ts +0 -8
- package/ui/src/lib/components/shell/Underlay.svelte +0 -21
- package/ui/src/lib/components/shell/Underlay.ts +0 -6
- package/ui/src/lib/components/shell/index.ts +0 -6
- package/ui/src/lib/components/shell/nav/Actions.svelte +0 -31
- package/ui/src/lib/components/shell/nav/Actions.ts +0 -16
- package/ui/src/lib/components/shell/nav/Back.svelte +0 -20
- package/ui/src/lib/components/shell/nav/Back.ts +0 -9
- package/ui/src/lib/components/shell/nav/Bar.svelte +0 -24
- package/ui/src/lib/components/shell/nav/Bar.ts +0 -3
- package/ui/src/lib/components/shell/nav/Button.svelte +0 -64
- package/ui/src/lib/components/shell/nav/Button.ts +0 -7
- package/ui/src/lib/components/shell/nav/Nav.svelte +0 -62
- package/ui/src/lib/components/shell/nav/Nav.ts +0 -35
- package/ui/src/lib/components/shell/nav/Return.svelte +0 -29
- package/ui/src/lib/components/shell/nav/Return.ts +0 -15
- package/ui/src/lib/components/shell/nav/Sections.svelte +0 -58
- package/ui/src/lib/components/shell/nav/Sections.ts +0 -6
- package/ui/src/lib/components/shell/nav/Toolbar.svelte +0 -73
- package/ui/src/lib/components/shell/nav/Toolbar.ts +0 -3
- package/ui/src/lib/components/shell/nav/history.ts +0 -36
- package/ui/src/lib/components/shell/nav/index.ts +0 -5
- package/ui/src/lib/components/shell/nav/store.ts +0 -24
- package/ui/src/lib/components/ui/alert/alert-action.svelte +0 -20
- package/ui/src/lib/components/ui/alert/alert-description.svelte +0 -23
- package/ui/src/lib/components/ui/alert/alert-title.svelte +0 -23
- package/ui/src/lib/components/ui/alert/alert.svelte +0 -43
- package/ui/src/lib/components/ui/alert/index.ts +0 -17
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte +0 -27
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte +0 -27
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte +0 -32
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte +0 -17
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte +0 -23
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte +0 -20
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-media.svelte +0 -20
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte +0 -17
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte +0 -7
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte +0 -17
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog-trigger.svelte +0 -7
- package/ui/src/lib/components/ui/alert-dialog/alert-dialog.svelte +0 -7
- package/ui/src/lib/components/ui/alert-dialog/index.ts +0 -40
- package/ui/src/lib/components/ui/badge/badge.svelte +0 -49
- package/ui/src/lib/components/ui/badge/index.ts +0 -2
- package/ui/src/lib/components/ui/button/button.svelte +0 -82
- package/ui/src/lib/components/ui/button/index.ts +0 -17
- package/ui/src/lib/components/ui/button-group/button-group-separator.svelte +0 -23
- package/ui/src/lib/components/ui/button-group/button-group-text.svelte +0 -28
- package/ui/src/lib/components/ui/button-group/button-group.svelte +0 -46
- package/ui/src/lib/components/ui/button-group/index.ts +0 -15
- package/ui/src/lib/components/ui/card/card-action.svelte +0 -23
- package/ui/src/lib/components/ui/card/card-content.svelte +0 -20
- package/ui/src/lib/components/ui/card/card-description.svelte +0 -20
- package/ui/src/lib/components/ui/card/card-footer.svelte +0 -20
- package/ui/src/lib/components/ui/card/card-header.svelte +0 -23
- package/ui/src/lib/components/ui/card/card-title.svelte +0 -20
- package/ui/src/lib/components/ui/card/card.svelte +0 -22
- package/ui/src/lib/components/ui/card/index.ts +0 -25
- package/ui/src/lib/components/ui/checkbox/checkbox.svelte +0 -39
- package/ui/src/lib/components/ui/checkbox/index.ts +0 -6
- package/ui/src/lib/components/ui/collapsible/collapsible-content.svelte +0 -7
- package/ui/src/lib/components/ui/collapsible/collapsible-trigger.svelte +0 -7
- package/ui/src/lib/components/ui/collapsible/collapsible.svelte +0 -20
- package/ui/src/lib/components/ui/collapsible/index.ts +0 -13
- package/ui/src/lib/components/ui/input/index.ts +0 -7
- package/ui/src/lib/components/ui/input/input.svelte +0 -48
- package/ui/src/lib/components/ui/input-otp/index.ts +0 -15
- package/ui/src/lib/components/ui/input-otp/input-otp-group.svelte +0 -20
- package/ui/src/lib/components/ui/input-otp/input-otp-separator.svelte +0 -27
- package/ui/src/lib/components/ui/input-otp/input-otp-slot.svelte +0 -31
- package/ui/src/lib/components/ui/input-otp/input-otp.svelte +0 -23
- package/ui/src/lib/components/ui/item/index.ts +0 -34
- package/ui/src/lib/components/ui/item/item-actions.svelte +0 -20
- package/ui/src/lib/components/ui/item/item-content.svelte +0 -23
- package/ui/src/lib/components/ui/item/item-description.svelte +0 -23
- package/ui/src/lib/components/ui/item/item-footer.svelte +0 -20
- package/ui/src/lib/components/ui/item/item-group.svelte +0 -21
- package/ui/src/lib/components/ui/item/item-header.svelte +0 -20
- package/ui/src/lib/components/ui/item/item-media.svelte +0 -42
- package/ui/src/lib/components/ui/item/item-separator.svelte +0 -19
- package/ui/src/lib/components/ui/item/item-title.svelte +0 -20
- package/ui/src/lib/components/ui/item/item.svelte +0 -61
- package/ui/src/lib/components/ui/kbd/index.ts +0 -10
- package/ui/src/lib/components/ui/kbd/kbd-group.svelte +0 -20
- package/ui/src/lib/components/ui/kbd/kbd.svelte +0 -23
- package/ui/src/lib/components/ui/label/index.ts +0 -7
- package/ui/src/lib/components/ui/label/label.svelte +0 -20
- package/ui/src/lib/components/ui/progress/index.ts +0 -7
- package/ui/src/lib/components/ui/progress/progress.svelte +0 -27
- package/ui/src/lib/components/ui/select/index.ts +0 -37
- package/ui/src/lib/components/ui/select/select-content.svelte +0 -45
- package/ui/src/lib/components/ui/select/select-group-heading.svelte +0 -21
- package/ui/src/lib/components/ui/select/select-group.svelte +0 -17
- package/ui/src/lib/components/ui/select/select-item.svelte +0 -40
- package/ui/src/lib/components/ui/select/select-label.svelte +0 -20
- package/ui/src/lib/components/ui/select/select-portal.svelte +0 -7
- package/ui/src/lib/components/ui/select/select-scroll-down-button.svelte +0 -20
- package/ui/src/lib/components/ui/select/select-scroll-up-button.svelte +0 -20
- package/ui/src/lib/components/ui/select/select-separator.svelte +0 -18
- package/ui/src/lib/components/ui/select/select-trigger.svelte +0 -29
- package/ui/src/lib/components/ui/select/select.svelte +0 -11
- package/ui/src/lib/components/ui/separator/index.ts +0 -7
- package/ui/src/lib/components/ui/separator/separator.svelte +0 -23
- package/ui/src/lib/components/ui/spinner/index.ts +0 -1
- package/ui/src/lib/components/ui/spinner/spinner.svelte +0 -18
- package/ui/src/lib/components/ui/tabs/index.ts +0 -18
- package/ui/src/lib/components/ui/tabs/tabs-content.svelte +0 -17
- package/ui/src/lib/components/ui/tabs/tabs-list.svelte +0 -40
- package/ui/src/lib/components/ui/tabs/tabs-trigger.svelte +0 -23
- package/ui/src/lib/components/ui/tabs/tabs.svelte +0 -19
- package/ui/src/lib/components/ui/textarea/index.ts +0 -7
- package/ui/src/lib/components/ui/textarea/textarea.svelte +0 -22
- package/ui/src/lib/intl/bcp.ts +0 -25
- package/ui/src/lib/intl/built.js +0 -18
- package/ui/src/lib/intl/context.yaml +0 -18
- package/ui/src/lib/intl/en-US.yaml +0 -6
- package/ui/src/lib/intl/index.ts +0 -65
- package/ui/src/lib/intl/types.ts +0 -19
- package/ui/src/lib/tools/ago.ts +0 -10
- package/ui/src/lib/tools/assert.ts +0 -3
- package/ui/src/lib/tools/cap.ts +0 -5
- package/ui/src/lib/tools/clicks.ts +0 -25
- package/ui/src/lib/tools/contextmenu.ts +0 -19
- package/ui/src/lib/tools/convert.ts +0 -32
- package/ui/src/lib/tools/currency.test.ts +0 -10
- package/ui/src/lib/tools/currency.ts +0 -55
- package/ui/src/lib/tools/date.test.ts +0 -21
- package/ui/src/lib/tools/date.ts +0 -35
- package/ui/src/lib/tools/delay.ts +0 -7
- package/ui/src/lib/tools/image.ts +0 -39
- package/ui/src/lib/tools/index.ts +0 -20
- package/ui/src/lib/tools/location.ts +0 -41
- package/ui/src/lib/tools/metronome.ts +0 -11
- package/ui/src/lib/tools/mq.ts +0 -84
- package/ui/src/lib/tools/onsubmit.ts +0 -21
- package/ui/src/lib/tools/random.ts +0 -15
- package/ui/src/lib/tools/search.ts +0 -25
- package/ui/src/lib/tools/timeout.ts +0 -26
- package/ui/src/lib/tools/transition.ts +0 -207
- package/ui/src/lib/tools/types.ts +0 -3
- package/ui/src/lib/tools/uuid.test.ts +0 -28
- package/ui/src/lib/tools/uuid.ts +0 -9
- package/ui/src/lib/typeset.css +0 -502
- package/ui/src/lib/utils.ts +0 -12
- package/ui/src/routes/(private)/+layout.svelte +0 -112
- package/ui/src/routes/(private)/+page.svelte +0 -7
- package/ui/src/routes/(private)/[component]/+page.svelte +0 -77
- package/ui/src/routes/+layout.svelte +0 -25
- package/ui/src/routes/+layout.ts +0 -14
- package/ui/src/routes/layout.css +0 -232
- package/ui/svelte.config.js +0 -36
- package/ui/tools/feat.js +0 -43
- package/ui/tools/hooks/README.md +0 -13
- package/ui/tools/hooks/guard-intl.sh +0 -40
- package/ui/tools/shad.js +0 -7
- package/ui/tsconfig.json +0 -20
- package/ui/vite.config.ts +0 -8
- /package/ui/{static → dist}/robots.txt +0 -0
package/ui/.vscode/settings.json
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"files.associations": {
|
|
3
|
-
"*.css": "tailwindcss"
|
|
4
|
-
},
|
|
5
|
-
"eslint.validate": [
|
|
6
|
-
"javascript",
|
|
7
|
-
"typescript",
|
|
8
|
-
"svelte"
|
|
9
|
-
],
|
|
10
|
-
"editor.formatOnSave": true,
|
|
11
|
-
"editor.codeActionsOnSave": {
|
|
12
|
-
"source.fixAll.eslint": "explicit"
|
|
13
|
-
},
|
|
14
|
-
"[svelte]": {
|
|
15
|
-
"editor.defaultFormatter": "svelte.svelte-vscode"
|
|
16
|
-
},
|
|
17
|
-
"html.autoClosingTags": false,
|
|
18
|
-
"cucumberautocomplete.strictGherkinCompletion": false,
|
|
19
|
-
"cucumberautocomplete.strictGherkinValidation": false,
|
|
20
|
-
"cucumberautocomplete.smartSnippets": true,
|
|
21
|
-
"cucumberautocomplete.onTypeFormat": true,
|
|
22
|
-
"editor.quickSuggestions": {
|
|
23
|
-
"comments": false,
|
|
24
|
-
"strings": true,
|
|
25
|
-
"other": true
|
|
26
|
-
}
|
|
27
|
-
}
|
package/ui/AGENTS.md
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
## Project Configuration
|
|
2
|
-
|
|
3
|
-
- **Language**: TypeScript
|
|
4
|
-
- **Package Manager**: npm
|
|
5
|
-
- **Add-ons**: none
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Architecture
|
|
10
|
-
|
|
11
|
-
Before making any changes to the codebase, **always refer to `architecture.md`** for:
|
|
12
|
-
|
|
13
|
-
- Domain organization, layer responsibilities, and conventions
|
|
14
|
-
- Component organization (domain vs shared)
|
|
15
|
-
- Forms pattern and service connectors
|
|
16
|
-
- Linked entities pattern
|
|
17
|
-
- Svelte conventions (reactivity, navigation, persistent state, class merging)
|
|
18
|
-
- Internationalization (i18n)
|
|
19
|
-
- Testing (Playwright BDD structure, conventions, running tests)
|
|
20
|
-
|
|
21
|
-
Understanding the architecture is essential for maintaining code quality and consistency.
|
|
22
|
-
|
|
23
|
-
## Backend API
|
|
24
|
-
|
|
25
|
-
This app is the configuration UI of the Toa runtime, and lives inside it: the backend is the
|
|
26
|
-
repository around it.
|
|
27
|
-
|
|
28
|
-
- The values are one ordinary component, `extensions/configuration/components/configuration.values`;
|
|
29
|
-
its `manifest.toa.yaml` declares the entity, the operations and the endpoints they are exposed
|
|
30
|
-
at. `GET /configuration/values/` lists every configured component, `GET /configuration/values/:component/`
|
|
31
|
-
answers `{ configuration, schema, epoch }`, and `POST` to the same address creates a new one.
|
|
32
|
-
- Reading needs the `system:configuration:get` role and creating needs `system:configuration:create`.
|
|
33
|
-
- A configuration is immutable: creating one replaces the whole of it. A secret is held as a
|
|
34
|
-
`$NAME` reference and is never shown — see `src/@/configuration/ui/read.ts`.
|
|
35
|
-
- The HTTP protocol those endpoints speak — queries, errors, caching, authentication — is
|
|
36
|
-
documented in `extensions/exposition/documentation`.
|
|
37
|
-
- The page is served by `extensions/configuration/source/UI.ts` out of `dist`, under the mount
|
|
38
|
-
path `/.configuration` on port `8003`. The API is on the app's own origin, except locally,
|
|
39
|
-
where it is `:8000` — see `src/config/index.ts`.
|
|
40
|
-
|
|
41
|
-
## Verification
|
|
42
|
-
|
|
43
|
-
Before calling a change done, verify it:
|
|
44
|
-
|
|
45
|
-
- **`npm run check`** - Type and Svelte checks pass.
|
|
46
|
-
- **`npm run format`** - Lint and format (eslint `--fix`).
|
|
47
|
-
- **Check it in a browser** - Load the change in a headless browser and confirm it renders and behaves as intended. Use any available tool: `/agent-browser`, Chrome DevTools MCP, Playwright MCP.
|
|
48
|
-
|
|
49
|
-
### Measure or Eyeball
|
|
50
|
-
|
|
51
|
-
A running UI is inspected two ways: **measure** it or **eyeball** it. Measuring reads exact values from the live DOM — `evaluate` JS returning numbers (`getBoundingClientRect`, `getComputedStyle`, `elementFromPoint`) — and is the default for anything with a number: size, position, gap, color, font, real visibility. Eyeball only what the eye alone settles: broken layout at a glance, occlusion, whether the composition reads. A screenshot is a **witness, not a verdict** — it flags a suspicion; the measurement decides. Never read a number off a screenshot.
|
package/ui/architecture.md
DELETED
|
@@ -1,390 +0,0 @@
|
|
|
1
|
-
# Architecture
|
|
2
|
-
|
|
3
|
-
## Domain Organization
|
|
4
|
-
|
|
5
|
-
The codebase follows a domain-driven design pattern with each domain organized under `src/@/`. Each domain contains standardized layers:
|
|
6
|
-
|
|
7
|
-
### Domain Structure Pattern
|
|
8
|
-
|
|
9
|
-
```plaintext
|
|
10
|
-
src/@/{domain}/
|
|
11
|
-
├── index.ts # Main domain entry point
|
|
12
|
-
├── svc/ # Services layer (business logic)
|
|
13
|
-
│ ├── index.ts # Services entry point
|
|
14
|
-
│ ├── store.ts # Data persistence & state management
|
|
15
|
-
│ ├── create.ts # Service methods
|
|
16
|
-
│ ├── net/ # Network layer
|
|
17
|
-
│ │ ├── index.ts # Network exports
|
|
18
|
-
│ │ ├── interface.ts # API resource
|
|
19
|
-
│ │ ├── Events.ts # Realtime event payload types
|
|
20
|
-
│ │ └── {Model}.ts # Network (wire-format) types
|
|
21
|
-
│ └── {Model}.ts # Linked entity
|
|
22
|
-
└── ui/ # UI layer
|
|
23
|
-
├── index.ts # UI exports
|
|
24
|
-
├── ui.ts # Transient UI state
|
|
25
|
-
├── {Component}.svelte # Svelte component
|
|
26
|
-
└── {Component}.ts # Component Props
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### Layer Responsibilities
|
|
30
|
-
|
|
31
|
-
**Service Layer (`svc/`)**:
|
|
32
|
-
|
|
33
|
-
- **`store.ts`**: Manages domain state using `svas` collections, handles persistence and data binding
|
|
34
|
-
- **`create.ts`**: Service methods
|
|
35
|
-
- **`index.ts`**: Exports public service APIs
|
|
36
|
-
|
|
37
|
-
Service methods that rely on the current identity must use `await having()` from the `svas` library for safe operations (reads), and `ensure()` for unsafe ones—because reads can happen during app startup, while the current identity is initialized asynchronously, and unsafe operations are a side effect of a user action.
|
|
38
|
-
|
|
39
|
-
**Network Layer (`svc/net/`)**:
|
|
40
|
-
|
|
41
|
-
- **`net/interface.ts`**: Defines API interfaces using Resource pattern for HTTP communication
|
|
42
|
-
- **`net/{Model}.ts`**: Contains TypeScript interfaces, types, and constants for domain models
|
|
43
|
-
- **`index.ts`**: Exports public service APIs
|
|
44
|
-
- Service layer MUST NOT export network layer
|
|
45
|
-
- Entity type must be exported from `store.ts` even if is unchanged compared to the network layer
|
|
46
|
-
|
|
47
|
-
**UI Layer (`ui/`)**:
|
|
48
|
-
|
|
49
|
-
- Contains Svelte components that consume services
|
|
50
|
-
- Components import domain services via `@/{domain}` alias
|
|
51
|
-
- **`index.ts`**: Exports reusable UI components
|
|
52
|
-
- Transient UI state is managed in `ui.ts` file
|
|
53
|
-
- Active elements must have an `id` attribute that follows the pattern `{domain-or-route}-{element}-{kind}` (e.g. `iam-email-tab`, `accounts-name-input`, `me-logout-button`)
|
|
54
|
-
|
|
55
|
-
### App Domain
|
|
56
|
-
|
|
57
|
-
Some UI components are intended to be reused across multiple screens within this application, but their implementation is still application-bound (e.g., depends on app routing, app stores, domain models, product rules, or app-specific copy/branding). These components should live in the dedicated `app` domain.
|
|
58
|
-
|
|
59
|
-
### Aggregation Pattern
|
|
60
|
-
|
|
61
|
-
When entities require calculated properties that depend on data from multiple domains, use a derived store pattern to connect domains and compute enriched entities:
|
|
62
|
-
|
|
63
|
-
1. **Base Collection Store** (`internal`): Raw domain data persisted via `svas` collection
|
|
64
|
-
2. **Derived Aggregation Store**: Combines multiple stores using Svelte's `derived()` to compute enriched entities
|
|
65
|
-
3. **Pure Computation Functions**: Extract computation logic into pure functions that take all dependencies as parameters
|
|
66
|
-
|
|
67
|
-
#### Example Implementation
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
// Base collection store
|
|
71
|
-
export const internal = collection<Group>({
|
|
72
|
-
get,
|
|
73
|
-
persist: 'groups',
|
|
74
|
-
bind: account,
|
|
75
|
-
stale: true,
|
|
76
|
-
values: values<Group>(),
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
// Derived store aggregating multiple domains
|
|
80
|
-
const groups = derived([internal, contacts, account], ([$internal, $contacts, $account]) => {
|
|
81
|
-
return $internal.map((group) => {
|
|
82
|
-
return {
|
|
83
|
-
...group,
|
|
84
|
-
balance: balance($group, $contacts, $account),
|
|
85
|
-
}
|
|
86
|
-
})
|
|
87
|
-
})
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Shared Components
|
|
91
|
-
|
|
92
|
-
Shared components are app-agnostic UI building blocks. Everything in `src/lib/components/` must be reusable across different apps without modification.
|
|
93
|
-
|
|
94
|
-
A component belongs here only if its implementation is not bound to the current application, meaning it:
|
|
95
|
-
• does not depend on app-specific routes, screens, or domain concepts
|
|
96
|
-
• does not import from domains
|
|
97
|
-
• does not embed product copy, branding, or business rules
|
|
98
|
-
• exposes configuration via props / slots / events, rather than hardcoding behavior
|
|
99
|
-
|
|
100
|
-
```plaintext
|
|
101
|
-
src/lib/components/
|
|
102
|
-
├── section/
|
|
103
|
-
│ ├── index.ts
|
|
104
|
-
│ ├── Section.svelte
|
|
105
|
-
│ └── Section.ts
|
|
106
|
-
└── shell/
|
|
107
|
-
├── index.ts
|
|
108
|
-
├── Nav.svelte
|
|
109
|
-
├── Nav.ts
|
|
110
|
-
├── Screen.svelte
|
|
111
|
-
└── Screen.ts
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## Components
|
|
115
|
-
|
|
116
|
-
### Component File
|
|
117
|
-
|
|
118
|
-
- **`{Component}.ts` is the component's TypeScript sidecar**, next to the `.svelte` file. It holds the component's types, constants, and logic — anything the markup doesn't need to state itself. A component with nothing to put there skips the file.
|
|
119
|
-
- **`Props` lives in `{Component}.ts`** — never declared inside `<script>`. A component with no own props still has the file whenever it owns constants or logic worth lifting out of the markup.
|
|
120
|
-
- **Props extend the root** — `interface Props extends RootProps`, where root is the HTML element or component rendered at the top level. Forward `class` and `{...props}` onto it. Nested-element props take distinct, non-conflicting names.
|
|
121
|
-
- **`class` prop is always `ClassValue`** (from `svelte/elements`), never `string`. Optional props document their default with a JSDoc `@default`.
|
|
122
|
-
- **EntityLike props** — components accepting entities declare an `EntityLike` interface (`Pick<Entity, …>`) with only the properties they use, to reduce coupling across domains.
|
|
123
|
-
|
|
124
|
-
```typescript
|
|
125
|
-
import type { ClassValue } from 'svelte/elements'
|
|
126
|
-
|
|
127
|
-
type AccountLike = Pick<Account, 'name' | 'picture'>
|
|
128
|
-
|
|
129
|
-
export interface Props {
|
|
130
|
-
account: AccountLike
|
|
131
|
-
/** @default 'active' */
|
|
132
|
-
variant?: 'active' | 'inactive'
|
|
133
|
-
class?: ClassValue
|
|
134
|
-
onsubmit?: (value: Value) => Promise<void | Error>
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Decomposition
|
|
139
|
-
|
|
140
|
-
- **Split at >50 lines** (or 2+ snippet props) into smaller components.
|
|
141
|
-
- **Composite** (default): one public root exported as default, its parts internal.
|
|
142
|
-
- **Compound**: only when the composition itself is public API.
|
|
143
|
-
- **Props down, callbacks up** — parent owns business logic, child owns UI. Form components never call services.
|
|
144
|
-
- **Reuse before create** — check `src/lib/components` and `src/@/app/ui` index files before adding anything new.
|
|
145
|
-
|
|
146
|
-
### Organization
|
|
147
|
-
|
|
148
|
-
- **Order within `<script>`**: imports → state → functions → lifecycle. Define before use; pass functions directly (no arrow wrappers).
|
|
149
|
-
- **Naming**: one-word, meaningful. Full words over abbreviations; synonyms and analogies allowed.
|
|
150
|
-
|
|
151
|
-
## Route Areas
|
|
152
|
-
|
|
153
|
-
Routes are grouped under `src/routes/` by access:
|
|
154
|
-
|
|
155
|
-
- **`(public)`** — Everything publicly accessible, typically long-term cacheable. The group layout sets `Cache-Control` to 1 hour.
|
|
156
|
-
- **`(private)`** — Requires authentication.
|
|
157
|
-
- **`(local)`** — For local development.
|
|
158
|
-
|
|
159
|
-
## Screens
|
|
160
|
-
|
|
161
|
-
Shell `Header` (`$com/shell`) is owned by the **page** (`src/routes/**/+page.svelte`), never by domain or shared UI components. The page owns the title and explorer badges as `Header` children. Header utility buttons register via `<Utilities>` (stack; last wins), the same pattern as `<Actions>` for the bottom nav. Presentational components receive props and render body content only.
|
|
162
|
-
|
|
163
|
-
Card / Dialog `*.Header` parts are unrelated — they stay inside those compound components.
|
|
164
|
-
|
|
165
|
-
## Forms Pattern
|
|
166
|
-
|
|
167
|
-
Forms should follow a clear separation of concerns between data collection, validation, and business logic execution.
|
|
168
|
-
|
|
169
|
-
### Form Components
|
|
170
|
-
|
|
171
|
-
**Form Declaration**:
|
|
172
|
-
|
|
173
|
-
- Forms should declare a `Value` interface representing the form data structure
|
|
174
|
-
- Forms should accept an `onsubmit` callback prop for handling form submission
|
|
175
|
-
- Forms should not directly interact with domain services or perform business operations
|
|
176
|
-
|
|
177
|
-
```typescript
|
|
178
|
-
export interface Value {
|
|
179
|
-
title: string
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export interface Props {
|
|
183
|
-
value?: Value
|
|
184
|
-
onsubmit?: (value: Value) => Promise<void | Error>
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### Service Connector
|
|
189
|
-
|
|
190
|
-
Bridge forms with domain services by implementing specific business operations (Create, Edit, Update, etc.)
|
|
191
|
-
|
|
192
|
-
```typescript
|
|
193
|
-
// Create.svelte - connects Form to something.add service
|
|
194
|
-
<script lang="ts">
|
|
195
|
-
import { add } from '@/something'
|
|
196
|
-
import { Form, type Value } from './form'
|
|
197
|
-
|
|
198
|
-
let value: Value = $state({ title: '' })
|
|
199
|
-
|
|
200
|
-
async function onsubmit(value: Value) {
|
|
201
|
-
return await add(value)
|
|
202
|
-
}
|
|
203
|
-
</script>
|
|
204
|
-
|
|
205
|
-
<Form {value} {onsubmit} />
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
## Svelte
|
|
209
|
-
|
|
210
|
-
### Reactivity
|
|
211
|
-
|
|
212
|
-
- **`$derived` over `$effect`** - `$effect` is almost always a symptom of bad architecture. Prefer reactive declarations. If you reach for `$effect`, reconsider the design and find a declarative solution.
|
|
213
|
-
- **Busy state** - Guard async operations against double-clicks with a `busy` flag; disable controls while it's set.
|
|
214
|
-
|
|
215
|
-
```svelte
|
|
216
|
-
<script lang="ts">
|
|
217
|
-
let busy = $state(false)
|
|
218
|
-
|
|
219
|
-
async function save() {
|
|
220
|
-
busy = true
|
|
221
|
-
const result = await add(value)
|
|
222
|
-
busy = false
|
|
223
|
-
if (result instanceof Error) return
|
|
224
|
-
goto('/success')
|
|
225
|
-
}
|
|
226
|
-
</script>
|
|
227
|
-
<Button disabled={busy} onclick={save}>Save</Button>
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
### Persistent State
|
|
231
|
-
|
|
232
|
-
- **Prefer `svas` for app and component state** - For state that outlives a session, `svas` stores (see `/svas`) are our architectural default: `bind:` and reactivity come out of the box. Raw `localStorage` isn't forbidden, but for application and component state `svas` is preferred.
|
|
233
|
-
|
|
234
|
-
### Navigation
|
|
235
|
-
|
|
236
|
-
- **Never** use `resolve` from `$app/navigation`.
|
|
237
|
-
|
|
238
|
-
## Styling
|
|
239
|
-
|
|
240
|
-
### Array Class Syntax
|
|
241
|
-
|
|
242
|
-
Use Svelte array syntax for conditional classes (NOT cn utility):
|
|
243
|
-
|
|
244
|
-
```svelte
|
|
245
|
-
<!-- ✅ Preferred: Array syntax -->
|
|
246
|
-
<Button class={['w-full', isActive && 'bg-primary']}>
|
|
247
|
-
Click me
|
|
248
|
-
</Button>
|
|
249
|
-
|
|
250
|
-
<div class={['flex items-center', expanded && 'bg-muted', className]}>
|
|
251
|
-
Content
|
|
252
|
-
</div>
|
|
253
|
-
|
|
254
|
-
<!-- ❌ Avoid: cn utility (older pattern) -->
|
|
255
|
-
<Button class={cn('w-full', isActive && 'bg-primary')}>
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
### Discipline
|
|
259
|
-
|
|
260
|
-
- **Component styles live with the component** - put a component's own CSS in its `<style>` block, not in global `layout.css`.
|
|
261
|
-
- **Prefer semantic colors** - reach for `bg-card`, `text-muted-foreground`, `border-input` before raw palette values like `bg-gray-100`.
|
|
262
|
-
- **RTL-safe spacing** - use `ms-*`/`me-*`/`start-*`/`end-*`, never `ml-*`/`mr-*`/`left-*`/`right-*` for logical spacing.
|
|
263
|
-
- **No layout shift** - give elements explicit dimensions or aspect-ratio. Intrinsic image size must never determine geometry.
|
|
264
|
-
|
|
265
|
-
## Internationalization (i18n)
|
|
266
|
-
|
|
267
|
-
This project uses `svintl` (`/svintl`, `npx intl`) for all user-facing text.
|
|
268
|
-
|
|
269
|
-
**Every string a user reads goes through intl (`$dict`), never hardcoded** — regardless of how many locales exist or how much text there is to route.
|
|
270
|
-
|
|
271
|
-
**svintl translates automatically** — author the source text once; every other locale is generated. Never supply per-locale translations or code a default-language fallback.
|
|
272
|
-
|
|
273
|
-
Each domain carries its own `ui/intl/` mount whose dictionary derives from the host `$lib/intl` locale and uses **only its own** dictionary.
|
|
274
|
-
|
|
275
|
-
## Linked Entities Pattern
|
|
276
|
-
|
|
277
|
-
The Linked Entities Pattern is used to create rich domain models by composing data from multiple domains. This pattern enhances network-defined entities with related domain data, creating a more complete representation for application use.
|
|
278
|
-
|
|
279
|
-
### Pattern Overview
|
|
280
|
-
|
|
281
|
-
A linked entity extends a network model (from `net/`) with references to related entities from other domains:
|
|
282
|
-
|
|
283
|
-
```typescript
|
|
284
|
-
// Network model (raw API data) - defined in svc/net/Contact.ts
|
|
285
|
-
export interface Contact {
|
|
286
|
-
id: string
|
|
287
|
-
identity: string
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// Linked entity (enriched domain model) - defined in svc/Contact.ts
|
|
291
|
-
export interface Contact extends net.Contact {
|
|
292
|
-
account: Account // Linked entity from @/account domain
|
|
293
|
-
}
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
### Implementation Pattern
|
|
297
|
-
|
|
298
|
-
**Mapping Function (`map.ts`)**:
|
|
299
|
-
|
|
300
|
-
The mapping function transforms network entities into linked entities by:
|
|
301
|
-
|
|
302
|
-
1. Extracting relevant data from the network model
|
|
303
|
-
2. Fetching related entities from other domains
|
|
304
|
-
3. Combining them into a rich domain model
|
|
305
|
-
|
|
306
|
-
```typescript
|
|
307
|
-
import { awaited } from 'svas'
|
|
308
|
-
import { accounts } from '@/accounts'
|
|
309
|
-
|
|
310
|
-
export async function map(entry: net.Contact): Promise<Contact | Error> {
|
|
311
|
-
const account = await awaited(accounts.get(entry.identity)) // Fetch linked Account entity
|
|
312
|
-
|
|
313
|
-
if (account instanceof Error) return account
|
|
314
|
-
|
|
315
|
-
return {
|
|
316
|
-
...entry,
|
|
317
|
-
account, // Linked Account entity from @/account domain
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
**Store Integration (`store.ts`)**:
|
|
323
|
-
|
|
324
|
-
The domain store uses the mapping function to transform network data into linked entities:
|
|
325
|
-
|
|
326
|
-
```typescript
|
|
327
|
-
export const internal = collection<Contact>({ get })
|
|
328
|
-
|
|
329
|
-
events.on('default.contacts.sync', async (entry: net.Contact) => {
|
|
330
|
-
const contact = await map(entry)
|
|
331
|
-
|
|
332
|
-
if (contact instanceof Error) return
|
|
333
|
-
|
|
334
|
-
sync(internal, contact)
|
|
335
|
-
})
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
### Benefits
|
|
339
|
-
|
|
340
|
-
- **Separation of Concerns**: Network models (`net/`) remain clean API representations
|
|
341
|
-
- **Rich Domain Models**: Application logic works with complete, meaningful entities
|
|
342
|
-
- **Reusability**: Linked entities can reference shared domain models (e.g., `Account`)
|
|
343
|
-
- **Maintainability**: Changes to related domains are automatically reflected through references
|
|
344
|
-
|
|
345
|
-
## Static assets
|
|
346
|
-
|
|
347
|
-
Static assets must be stored in the `static/` directory or inside the component directory.
|
|
348
|
-
|
|
349
|
-
> Assets in the `routes/` directory may create multiple URLs for the same asset, which breaks caching.
|
|
350
|
-
|
|
351
|
-
Optimize images using `npx sharp --optimize`.
|
|
352
|
-
|
|
353
|
-
## Testing
|
|
354
|
-
|
|
355
|
-
Playwright BDD with Gherkin feature files for end-to-end testing.
|
|
356
|
-
|
|
357
|
-
- **Structure** - Feature files (`features/*.feature`), step definitions (`features/steps/*.ts`).
|
|
358
|
-
- **Generic vs domain steps** - Generic, domain-agnostic steps live in `navigaton.ts` (navigation, tapping, visibility, filling) and `typing.ts` (keyboard, random data). Domain-specific logic goes in `{domain}.ts` files. Reach for a generic step first; add a domain one only when there is no generic way to say it.
|
|
359
|
-
- **ID-based selectors** - Test-id pattern `{domain}-{element}-{kind}`. Add IDs when a test needs them, not preemptively.
|
|
360
|
-
- **Comprehensive scenarios** - Prefer fewer, complete scenarios over many small ones. Clean up unused step definitions.
|
|
361
|
-
- **Timeouts aren't solutions** - Fix the flow rather than masking a broken one with `{ timeout }`. Assert on URL and content instead.
|
|
362
|
-
|
|
363
|
-
```gherkin
|
|
364
|
-
Scenario: Create and favorite contact
|
|
365
|
-
Given new account
|
|
366
|
-
When I tap 'nav-contacts-button'
|
|
367
|
-
And I tap 'contacts-new-button'
|
|
368
|
-
And I type random name
|
|
369
|
-
And I tap 'contacts-save-button'
|
|
370
|
-
Then 'contact-name' contains that name
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
When('I tap {string}', async ({ page }, id) => {
|
|
375
|
-
await page.locator(`#${id}`).click()
|
|
376
|
-
})
|
|
377
|
-
|
|
378
|
-
Then('{string} contains that name', async ({ page, ctx }, id) => {
|
|
379
|
-
await expect(page.locator(`#${id}`)).toContainText(ctx.name)
|
|
380
|
-
})
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
### Running Tests
|
|
384
|
-
|
|
385
|
-
```bash
|
|
386
|
-
npx feat # all tests
|
|
387
|
-
npx feat features/authentication.feature # specific feature
|
|
388
|
-
npx feat features/authentication.feature --name "scenario name"
|
|
389
|
-
APP_URL=https://evnapp.com npx feat # against production
|
|
390
|
-
```
|
package/ui/components.json
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://shadcn-svelte.com/schema.json",
|
|
3
|
-
"tailwind": {
|
|
4
|
-
"css": "src/routes/layout.css",
|
|
5
|
-
"baseColor": "neutral"
|
|
6
|
-
},
|
|
7
|
-
"aliases": {
|
|
8
|
-
"components": "$com",
|
|
9
|
-
"utils": "$lib/utils",
|
|
10
|
-
"ui": "$ui",
|
|
11
|
-
"hooks": "$lib/hooks",
|
|
12
|
-
"lib": "$lib"
|
|
13
|
-
},
|
|
14
|
-
"typescript": true,
|
|
15
|
-
"registry": "https://shadcn-svelte.com/registry",
|
|
16
|
-
"style": "nova",
|
|
17
|
-
"iconLibrary": "lucide",
|
|
18
|
-
"menuColor": "default",
|
|
19
|
-
"menuAccent": "subtle"
|
|
20
|
-
}
|
package/ui/eslint.config.js
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import ts from 'typescript-eslint'
|
|
2
|
-
import neostandard from 'neostandard'
|
|
3
|
-
import globals from 'globals'
|
|
4
|
-
import unusedImports from 'eslint-plugin-unused-imports'
|
|
5
|
-
import svelte from 'eslint-plugin-svelte'
|
|
6
|
-
import importPlugin from 'eslint-plugin-import'
|
|
7
|
-
import tsPlugin from '@typescript-eslint/eslint-plugin'
|
|
8
|
-
|
|
9
|
-
export default [
|
|
10
|
-
...neostandard({
|
|
11
|
-
ignores: [
|
|
12
|
-
'.svelte-kit',
|
|
13
|
-
'dist', // the build; ignored here rather than in .gitignore — see that file
|
|
14
|
-
'src/lib/components/ui',
|
|
15
|
-
'**/*.min.js',
|
|
16
|
-
'src/**/intl/**/*',
|
|
17
|
-
...neostandard.resolveIgnoresFromGitignore(),
|
|
18
|
-
],
|
|
19
|
-
ts: true,
|
|
20
|
-
}),
|
|
21
|
-
{
|
|
22
|
-
plugins: {
|
|
23
|
-
import: importPlugin,
|
|
24
|
-
'@typescript-eslint': tsPlugin,
|
|
25
|
-
'unused-imports': unusedImports,
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
...svelte.configs['flat/recommended'],
|
|
29
|
-
{
|
|
30
|
-
languageOptions: {
|
|
31
|
-
globals: {
|
|
32
|
-
...globals.browser,
|
|
33
|
-
...globals.node,
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
files: ['**/*.svelte'],
|
|
39
|
-
|
|
40
|
-
languageOptions: {
|
|
41
|
-
parserOptions: {
|
|
42
|
-
parser: ts.parser,
|
|
43
|
-
svelteFeatures: {
|
|
44
|
-
experimentalGenerics: true,
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
rules: {
|
|
51
|
-
'no-void': 'off',
|
|
52
|
-
curly: ['error', 'multi'],
|
|
53
|
-
'no-console': ['error', { allow: ['info', 'debug', 'warn', 'error'] }],
|
|
54
|
-
'no-implicit-coercion': 'error',
|
|
55
|
-
'@stylistic/comma-dangle': ['error', 'always-multiline'],
|
|
56
|
-
'@stylistic/space-before-function-paren': ['error', {
|
|
57
|
-
asyncArrow: 'always',
|
|
58
|
-
named: 'never',
|
|
59
|
-
anonymous: 'never',
|
|
60
|
-
}],
|
|
61
|
-
'arrow-parens': ['error', 'always'],
|
|
62
|
-
'no-unused-vars': 'off',
|
|
63
|
-
'unused-imports/no-unused-imports': 'error',
|
|
64
|
-
'unused-imports/no-unused-vars': [
|
|
65
|
-
'warn',
|
|
66
|
-
{
|
|
67
|
-
vars: 'all',
|
|
68
|
-
varsIgnorePattern: '^_',
|
|
69
|
-
args: 'after-used',
|
|
70
|
-
argsIgnorePattern: '^_',
|
|
71
|
-
}],
|
|
72
|
-
'@stylistic/padding-line-between-statements': [
|
|
73
|
-
'error',
|
|
74
|
-
{
|
|
75
|
-
blankLine: 'always',
|
|
76
|
-
prev: ['block-like', 'if', 'multiline-expression'],
|
|
77
|
-
next: '*',
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
blankLine: 'always',
|
|
81
|
-
prev: '*',
|
|
82
|
-
next: ['block-like', 'if', 'multiline-expression'],
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
blankLine: 'always',
|
|
86
|
-
prev: ['const', 'let'],
|
|
87
|
-
next: ['expression', 'for'],
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
blankLine: 'always',
|
|
91
|
-
prev: 'expression',
|
|
92
|
-
next: ['const', 'let'],
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
blankLine: 'always',
|
|
96
|
-
prev: ['multiline-const', 'multiline-let'],
|
|
97
|
-
next: '*',
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
blankLine: 'always',
|
|
101
|
-
prev: '*',
|
|
102
|
-
next: ['multiline-const', 'multiline-let'],
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
blankLine: 'always',
|
|
106
|
-
prev: '*',
|
|
107
|
-
next: 'return',
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
blankLine: 'always',
|
|
111
|
-
prev: '*',
|
|
112
|
-
next: 'break',
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
blankLine: 'always',
|
|
116
|
-
prev: '*',
|
|
117
|
-
next: 'continue',
|
|
118
|
-
},
|
|
119
|
-
],
|
|
120
|
-
'import/order': ['error', {
|
|
121
|
-
groups: ['builtin', 'external', 'internal', 'unknown', 'parent', 'sibling', 'index', 'type'],
|
|
122
|
-
alphabetize: {
|
|
123
|
-
order: 'desc',
|
|
124
|
-
},
|
|
125
|
-
}],
|
|
126
|
-
'import-x/no-duplicates': 'off', // stupid shit doesn't work
|
|
127
|
-
'no-warning-comments': ['error', {
|
|
128
|
-
terms: ['todo', 'fixme'],
|
|
129
|
-
location: 'anywhere',
|
|
130
|
-
}],
|
|
131
|
-
'import/newline-after-import': ['error', { count: 1 }],
|
|
132
|
-
'svelte/no-navigation-without-resolve': 'off',
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
files: ['src/**/*.ts', 'features/**/*.ts'],
|
|
137
|
-
ignores: ['src/service-worker.ts'],
|
|
138
|
-
languageOptions: {
|
|
139
|
-
parserOptions: {
|
|
140
|
-
project: './tsconfig.json',
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
rules: {
|
|
144
|
-
'@typescript-eslint/consistent-type-imports': 'error',
|
|
145
|
-
'@typescript-eslint/strict-boolean-expressions': ['error', {
|
|
146
|
-
allowNullableObject: false,
|
|
147
|
-
allowNumber: false,
|
|
148
|
-
allowString: false,
|
|
149
|
-
}],
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
]
|
package/ui/features/base.ts
DELETED