@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
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# Hold
|
|
2
|
-
|
|
3
|
-
`Alt`+click fires `onclick` immediately (power users / tests). Right-click is swallowed.
|
|
4
|
-
|
|
5
|
-
Use a unique `name` per instance when several holds share a page (CSS anchor). Set `portal={false}` inside transformed ancestors — Safari CSS anchor positioning quirk.
|
|
6
|
-
|
|
7
|
-
## Usage
|
|
8
|
-
|
|
9
|
-
```svelte
|
|
10
|
-
<script lang="ts">
|
|
11
|
-
import { Hold } from '$com/hold'
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<Hold label="hold to log out" onclick={() => signOut()}>
|
|
15
|
-
Log out
|
|
16
|
-
</Hold>
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Props
|
|
20
|
-
|
|
21
|
-
| Prop | Type | Default | Notes |
|
|
22
|
-
| ---------- | ------------------------------------------------- | --------- | ---------------------------------------------------------------------------- |
|
|
23
|
-
| `name` | `string` | `'hold'` | CSS anchor name. Use a unique value per instance if multiple on one page. |
|
|
24
|
-
| `duration` | `number` (ms) | `800` | How long the user must hold before `onclick` fires. |
|
|
25
|
-
| `label` | `string` | — | Hint text shown in the tooltip while held. Use `message` snippet for richer markup. |
|
|
26
|
-
| `message` | `Snippet` | — | Overrides `label` for non-string content. |
|
|
27
|
-
| `position` | `'center' \| 'left' \| 'right' \| 'top' \| 'bottom'` | `'left'` | Tooltip side (CSS anchor `position-area` first axis). |
|
|
28
|
-
| `align` | `'center' \| 'left' \| 'right' \| 'top' \| 'bottom'` | `'center'` | Tooltip alignment along the chosen side. |
|
|
29
|
-
| `portal` | `boolean` | `true` | Teleport tooltip to `body`. Set `false` inside transformed ancestors (Safari anchor quirk). |
|
|
30
|
-
| `onpress` | `() => void` | — | Fires when the hold starts. |
|
|
31
|
-
| `onclick` | `() => void` | — | Fires after the full duration is held, or immediately on `Alt`+click. |
|
|
32
|
-
| `variant` | `ButtonVariant` | `'ghost'` | Forwarded to shadcn `Button`. |
|
|
33
|
-
|
|
34
|
-
All other props pass through to the underlying `Button`.
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
# iam
|
|
2
|
-
|
|
3
|
-
Identity & access — a complete authentication surface plus the services behind it. UI covers passkey, password, one-time-passcode, and OIDC (Google/Apple) sign-in/sign-up, an `Authenticated` gate, an `Authorized` conditional-render guard, and session refresh on expiry. Services expose the `account` store, `logout`, `update`, `named`, and the `basic` / `otp` / `passkeys` / `oidc` flows.
|
|
4
|
-
|
|
5
|
-
## `$config`
|
|
6
|
-
|
|
7
|
-
| Field | Type | Notes |
|
|
8
|
-
| ------------------ | ------------------- | ---------------------------------------------------- |
|
|
9
|
-
| `navigation.entry` | `{ entry: string }` | Route to land on after a successful OIDC redirect. |
|
|
10
|
-
|
|
11
|
-
Network access (`origin`, `sleep`) flows through `@/net`.
|
|
12
|
-
|
|
13
|
-
## Environment
|
|
14
|
-
|
|
15
|
-
OIDC client IDs come from `$env/dynamic/public`. Omit or leave empty to hide the provider button:
|
|
16
|
-
|
|
17
|
-
| Var | Notes |
|
|
18
|
-
| ------------------------- | -------------------------------------------------- |
|
|
19
|
-
| `PUBLIC_GOOGLE_CLIENT_ID` | Google OIDC client ID. Empty hides the Google button. |
|
|
20
|
-
| `PUBLIC_APPLE_CLIENT_ID` | Apple OIDC client ID. Empty hides the Apple button. |
|
|
21
|
-
|
|
22
|
-
## Notes
|
|
23
|
-
|
|
24
|
-
- **OIDC is opt-in.** Missing/empty `PUBLIC_*_CLIENT_ID` disables the provider buttons — no wiring crashes if you only want password/passkey/OTP.
|
|
25
|
-
- **Account shape.** Components accept an `AccountLike` (`Pick` of the account fields they render); the `account` store holds the authenticated `Echo`. Extend `Echo` (`svc/net/Echo.ts`) if your API returns extra profile fields.
|
|
26
|
-
- **`Credentials` manager.** Renders the signed-in account's security surface: a passkey manager (register / list / hold-to-delete — a thin layer over `@/passkeys`), inert provider rows (email/Google/Apple; the `Connect` CTA carries no behaviour yet), and a "sign in on another device" action whose QR encodes the current session `challenge`. It gates itself on the `account` store, so just mount it anywhere inside your authenticated area.
|
|
27
|
-
- **Session transfer is two-sided.** The QR is the *sending* device; the *receiving* device adopts the session by reading the fragment `challenge` on load. `rc()` already does this on init (shared `consume()`), so transfer completes as long as `rc()` runs once at app start.
|
|
28
|
-
|
|
29
|
-
## Usage
|
|
30
|
-
|
|
31
|
-
Gate an app behind authentication (`Authenticated` shows the auth surface until signed in, then renders its children):
|
|
32
|
-
|
|
33
|
-
```svelte
|
|
34
|
-
<script lang="ts">
|
|
35
|
-
import { Authenticated } from '@/iam/ui'
|
|
36
|
-
</script>
|
|
37
|
-
|
|
38
|
-
<Authenticated>
|
|
39
|
-
<Dashboard />
|
|
40
|
-
</Authenticated>
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Conditionally render UI with `Authorized`. It renders its children only when **at least one** passed check passes: `dev` (matches `$app/environment` `dev`), `beta` (host starts with `beta.`), `debug` (`dev` or `beta`), or `role` (scoped match against the account's `roles` — `app` matches `app`, `app:codes`, and deeper; `app:codes` matches only `app:codes` and deeper). No matching check → nothing renders.
|
|
44
|
-
|
|
45
|
-
```svelte
|
|
46
|
-
<script lang="ts">
|
|
47
|
-
import { Authorized } from '@/iam/ui'
|
|
48
|
-
</script>
|
|
49
|
-
|
|
50
|
-
<Authorized role="admin">
|
|
51
|
-
<AdminPanel />
|
|
52
|
-
</Authorized>
|
|
53
|
-
|
|
54
|
-
<Authorized dev>
|
|
55
|
-
<DebugToolbar />
|
|
56
|
-
</Authorized>
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Read the session reactively and sign out. `account` is a `svas` store of the authenticated `Echo` (`null` when signed out):
|
|
60
|
-
|
|
61
|
-
```svelte
|
|
62
|
-
<script lang="ts">
|
|
63
|
-
import { account, logout } from '@/iam'
|
|
64
|
-
import { goto } from '$app/navigation'
|
|
65
|
-
|
|
66
|
-
async function getout() {
|
|
67
|
-
logout()
|
|
68
|
-
void goto('/')
|
|
69
|
-
}
|
|
70
|
-
</script>
|
|
71
|
-
|
|
72
|
-
{#if $account}
|
|
73
|
-
<p>Signed in as {$account.name}</p>
|
|
74
|
-
<button onclick={getout}>Log out</button>
|
|
75
|
-
{/if}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
Block an action until the account has a display name — `named()` resolves once `account.name` is set (prompting through the auth surface if missing), so guarded flows can `await` it:
|
|
79
|
-
|
|
80
|
-
```ts
|
|
81
|
-
import { having } from 'svas'
|
|
82
|
-
import { account, named } from '@/iam'
|
|
83
|
-
|
|
84
|
-
async function onaccept() {
|
|
85
|
-
await having(account) // wait for a session
|
|
86
|
-
await named() // …and a chosen name
|
|
87
|
-
await invitations.accept(id)
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Patch the local session optimistically (e.g. after a profile edit) — `update` merges a partial into the `account` store without a round-trip:
|
|
92
|
-
|
|
93
|
-
```ts
|
|
94
|
-
import { update } from '@/iam'
|
|
95
|
-
|
|
96
|
-
update({ name: 'Ada Lovelace' })
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
Gate non-UI logic on the `authenticated` derived boolean (true only when a challenge + account exist and nothing is processing):
|
|
100
|
-
|
|
101
|
-
```ts
|
|
102
|
-
import { authenticated } from '@/iam'
|
|
103
|
-
|
|
104
|
-
authenticated.subscribe((ok) => ok && sync())
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Render the account's credentials manager inside an authenticated area (passkeys, connected providers, device transfer). It only renders once a session exists, so no extra gating is needed:
|
|
108
|
-
|
|
109
|
-
```svelte
|
|
110
|
-
<script lang="ts">
|
|
111
|
-
import { Credentials } from '@/iam/ui'
|
|
112
|
-
</script>
|
|
113
|
-
|
|
114
|
-
<Credentials />
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
`Credentials` takes a single optional `class` (`ClassValue`) — everything else is driven by the `account` and `@/passkeys` stores.
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# InputForm
|
|
2
|
-
|
|
3
|
-
Centered text field in a form that submits on blur when the value changed, or on Enter. Empty blur resets to the initial value. `onsubmit` may return a new string to sync the field after save.
|
|
4
|
-
|
|
5
|
-
## Notes
|
|
6
|
-
|
|
7
|
-
Exposes an imperative `focus()` method — bind the instance (`bind:this`) and call it to move focus to the field (e.g. when revealing the form).
|
|
8
|
-
|
|
9
|
-
## Usage
|
|
10
|
-
|
|
11
|
-
```svelte
|
|
12
|
-
<script lang="ts">
|
|
13
|
-
import { InputForm } from '$com/input-form'
|
|
14
|
-
|
|
15
|
-
let name = $state('Alex')
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
<InputForm
|
|
19
|
-
value={name}
|
|
20
|
-
onsubmit={async (value) => {
|
|
21
|
-
name = value
|
|
22
|
-
return value
|
|
23
|
-
}}
|
|
24
|
-
/>
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Props
|
|
28
|
-
|
|
29
|
-
| Prop | Type | Default | Notes |
|
|
30
|
-
| ---------- | ----------------------------------------------------------------- | ------- | -------------------------------------------------- |
|
|
31
|
-
| `value` | `string` | — | Initial/current value; resets to this when cleared. |
|
|
32
|
-
| `class` | `ClassValue` | — | Extra classes on the shadcn `Input`. |
|
|
33
|
-
| `placeholder` | `string` | `'Enter name'`| Placeholder text when the field is empty. |
|
|
34
|
-
| `onsubmit` | `(value: string) => Promise<string \| undefined> \| string \| undefined` | — | Called on blur (if changed) or form submit. Return a string to update the field. |
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# locale
|
|
2
|
-
|
|
3
|
-
Locale switching over the host svintl store. Two interchangeable switchers — `Languages` (snap-scroller) and `Language` (`Select` dropdown) — both set the active locale and fire `onselect` for persistence.
|
|
4
|
-
|
|
5
|
-
## Languages
|
|
6
|
-
|
|
7
|
-
Horizontal snap-scroller of native language names.
|
|
8
|
-
|
|
9
|
-
### Usage
|
|
10
|
-
|
|
11
|
-
```svelte
|
|
12
|
-
<script lang="ts">
|
|
13
|
-
import { Languages } from '@/locale/ui'
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<Languages />
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
`onselect` fires after the store updates — use it for side effects like persistence:
|
|
20
|
-
|
|
21
|
-
```svelte
|
|
22
|
-
<script lang="ts">
|
|
23
|
-
import { Languages } from '@/locale/ui'
|
|
24
|
-
import { me } from '@/accounts'
|
|
25
|
-
import type { Locale } from '$lib/intl'
|
|
26
|
-
|
|
27
|
-
function persist(locale: Locale) {
|
|
28
|
-
void me.update({ locale })
|
|
29
|
-
}
|
|
30
|
-
</script>
|
|
31
|
-
|
|
32
|
-
<Languages onselect={persist} />
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Props
|
|
36
|
-
|
|
37
|
-
| Prop | Type | Default | Notes |
|
|
38
|
-
| ---------- | -------------------------- | ------- | ------------------------------------------------------------------------------------------- |
|
|
39
|
-
| `onselect` | `(locale: Locale) => void` | — | Fires after the host store is set. Use it to persist or track the choice. |
|
|
40
|
-
| `infinite` | `boolean` | _auto_ | Forces the loop/clone scroller on or off. Defaults to on when `locales.length >= 10`. |
|
|
41
|
-
|
|
42
|
-
### Notes
|
|
43
|
-
|
|
44
|
-
The active locale stays centered in the track. A long set (`>= 10`) loops endlessly; a short one renders once and centers via 50% gutters — dead-center whether it underfills or overflows. Centering is relative to the track's own width, so wrap it in a narrower box to constrain the window. `infinite` overrides the auto choice.
|
|
45
|
-
|
|
46
|
-
## Language
|
|
47
|
-
|
|
48
|
-
Compact `Select` for a settings row.
|
|
49
|
-
|
|
50
|
-
### Usage
|
|
51
|
-
|
|
52
|
-
```svelte
|
|
53
|
-
<script lang="ts">
|
|
54
|
-
import { Language } from '@/locale/ui'
|
|
55
|
-
import { me } from '@/accounts'
|
|
56
|
-
import type { Locale } from '$lib/intl'
|
|
57
|
-
</script>
|
|
58
|
-
|
|
59
|
-
<Language onselect={(l: Locale) => me.update({ locale: l })} />
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Props
|
|
63
|
-
|
|
64
|
-
| Prop | Type | Default | Notes |
|
|
65
|
-
| ---------- | -------------------------- | ------- | ------------------------------------------------------------------------- |
|
|
66
|
-
| `onselect` | `(locale: Locale) => void` | — | Fires after the host store is set. Use it to persist or track the choice. |
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# net
|
|
2
|
-
|
|
3
|
-
The networking foundation every other Solution builds on. Connects a single `@toa.io/origin` client to your API and re-exports it as `origin`, plus the `query` helper for building criteria query strings. Sibling Solutions import `origin` from `@/net` to declare their resources.
|
|
4
|
-
|
|
5
|
-
## `$config`
|
|
6
|
-
|
|
7
|
-
`net` reads two fields from your `$config` module (`import * as config from '$config'`):
|
|
8
|
-
|
|
9
|
-
| Field | Type | Notes |
|
|
10
|
-
| -------- | ------------------------------- | --------------------------------------------------------------------------- |
|
|
11
|
-
| `origin` | `string` | Absolute API origin; `''` is invalid (resolved via `new URL(path, origin)`). |
|
|
12
|
-
| `sleep` | `[number, number] \| undefined` | Dev-only artificial latency range; `undefined` disables it. |
|
|
13
|
-
|
|
14
|
-
## Usage
|
|
15
|
-
|
|
16
|
-
Declare a resource against the shared client and call it:
|
|
17
|
-
|
|
18
|
-
```ts
|
|
19
|
-
import { origin, query, type RequestOptions } from '@/net'
|
|
20
|
-
|
|
21
|
-
const echo = origin.resource<{ message: string }>('/accounts/echo/')
|
|
22
|
-
|
|
23
|
-
async function ping(): Promise<{ message: string } | Error> {
|
|
24
|
-
return echo.json({ method: 'GET' } satisfies RequestOptions)
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
`query` turns a `URLSearchParams` into a criteria string; `omit`/`limit`/`search` stay as plain pairs, everything else becomes `criteria=key==value;…`:
|
|
29
|
-
|
|
30
|
-
```ts
|
|
31
|
-
const params = new URLSearchParams({ status: 'active', limit: '20' })
|
|
32
|
-
query(params) // '?criteria=status==active&limit=20'
|
|
33
|
-
```
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Panel
|
|
2
|
-
|
|
3
|
-
List row built on shadcn `Button`: main content in `left`/`right`/`icon` snippets, optional swipe-reveal `actions` on the trailing edge. Set `h` (e.g. `h-14`) when using `collapsed` — height animates to zero. Pass `selected` for accent ring styling (from `globals`).
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
|
|
7
|
-
```svelte
|
|
8
|
-
<script lang="ts">
|
|
9
|
-
import { Panel, type Action } from '$com/panel'
|
|
10
|
-
|
|
11
|
-
const actions: Action[] = [{ id: 'delete', onclick: () => remove() }]
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<Panel h="h-14" class="bg-card border border-border" href="/items/1">
|
|
15
|
-
{#snippet left()}
|
|
16
|
-
<span class="font-medium">Item title</span>
|
|
17
|
-
{/snippet}
|
|
18
|
-
{#snippet right()}
|
|
19
|
-
<span class="text-muted-foreground">$12</span>
|
|
20
|
-
{/snippet}
|
|
21
|
-
{#snippet action(id)}
|
|
22
|
-
{#if id === 'delete'}Delete{/if}
|
|
23
|
-
{/snippet}
|
|
24
|
-
{actions}
|
|
25
|
-
</Panel>
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Props
|
|
29
|
-
|
|
30
|
-
| Prop | Type | Default | Notes |
|
|
31
|
-
| ----------- | ---------------------------- | ----------- | --------------------------------------------------------------------- |
|
|
32
|
-
| `left` | `Snippet` | — | Main label/content (required). |
|
|
33
|
-
| `right` | `Snippet` | — | Trailing slot (balance, badge, etc.). |
|
|
34
|
-
| `icon` | `Snippet` | — | Leading icon/avatar before `left`. |
|
|
35
|
-
| `collapsed` | `boolean` | `false` | Animate height to zero. Requires `h`. |
|
|
36
|
-
| `selected` | `boolean` | `false` | Applies `.selected` ring styling. |
|
|
37
|
-
| `h` | `string` | — | Tailwind height class on the row and collapse wrapper. |
|
|
38
|
-
| `actions` | `Action[]` | — | Swipe-reveal toolbar items. Pair with `action` snippet. |
|
|
39
|
-
| `action` | `Snippet<[string]>` | — | Renders one action by `id`. Required when `actions` is set. |
|
|
40
|
-
| `variant` | `ButtonVariant` | `'outline'` | Forwarded to shadcn `Button`. |
|
|
41
|
-
|
|
42
|
-
`Action`: `{ id, class?: ClassValue, href?, onclick? }` — tapping an action scrolls the row back; `href` navigates via SvelteKit `goto`.
|
|
43
|
-
|
|
44
|
-
All other props pass through to the underlying `Button` (`href`, `onclick`, `class`, etc.).
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# passkeys
|
|
2
|
-
|
|
3
|
-
WebAuthn credential management — registers, lists, and removes passkeys for the signed-in account against your `/identity/passkeys` API. Wraps the browser `navigator.credentials` ceremony (challenge → `create`/`get` → attestation) so callers work with plain async operations that return values or `Error`.
|
|
4
|
-
|
|
5
|
-
## Notes
|
|
6
|
-
|
|
7
|
-
- **Requires `@/iam`.** The `passkeys` store keys credentials by the current `@/iam` `account`; `get`/`remove`/`store` all read it. No signed-in account → empty store. `iam` is **not** pulled automatically (that would form an install cycle — `iam` already depends on `passkeys`), so install it yourself: `npx shadcn-svelte add http://cn.ants.dev/r/iam.json`. Installing `iam` brings `passkeys` along, so most consumers never add `passkeys` directly.
|
|
8
|
-
- **Feature detection.** `supported` is a boolean (`window.PublicKeyCredential !== undefined`, `true` on the server). Gate registration UI on it — the ceremony rejects on unsupported browsers.
|
|
9
|
-
- **`ui/aaguid.json`** ships the FIDO AAGUID → authenticator-metadata map (name + light/dark icon, base64 SVG). Look up `aaguid[credential.aaguid]` to label a passkey by its authenticator (e.g. "Google Password Manager", "iCloud Keychain"). Optional — nothing imports it for you.
|
|
10
|
-
|
|
11
|
-
## Usage
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
import { supported, add, request, remove, passkeys } from '@/passkeys'
|
|
15
|
-
|
|
16
|
-
if (supported) {
|
|
17
|
-
const out = await add(identity, name) // full register: ceremony → POST → store
|
|
18
|
-
if (out instanceof Error) handle(out)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// reactive list for the current account
|
|
22
|
-
passkeys.subscribe((list) => render(list))
|
|
23
|
-
|
|
24
|
-
await remove(id) // revoke one
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
`request(id?)` runs the authentication (login) ceremony and returns the assertion (`RequestResponse`) for your auth flow to exchange. `create(name, identity?)` is the lower-level ceremony `add` builds on.
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# payments
|
|
2
|
-
|
|
3
|
-
Subscription paywall stack: a tier selector, animated benefits table, pay button, platform-mandated legal disclaimers, and a processing overlay, backed by four payment processors (App Store, Google Play, Stripe, a dev mock) behind one `Processor` interface. Ships a neutral SaaS example (Storage / Seats / Priority / API) you adapt to your product.
|
|
4
|
-
|
|
5
|
-
## `$config`
|
|
6
|
-
|
|
7
|
-
| Field | Used by |
|
|
8
|
-
| -------- | ----------------------------------------------------------------------------------------- |
|
|
9
|
-
| `origin` | All three live processors resolve their backend endpoints through `@/net`'s `origin`, which reads `$config.origin`. |
|
|
10
|
-
|
|
11
|
-
The App Store / Google Play processors transact through the native shell (`@/bridge`); the dev processor stands in whenever `$app/environment`'s `dev` is true and there is no native host. No other `$config` field is read.
|
|
12
|
-
|
|
13
|
-
## Entitlements
|
|
14
|
-
|
|
15
|
-
`tier` is the only entitlement the shipped UI reads. Everything else in `Entitlements` is a neutral example you replace with your product's metered (`number`) and flag (`boolean`) entitlements — edit the interface in `svc/entitlements.ts`:
|
|
16
|
-
|
|
17
|
-
```ts
|
|
18
|
-
export interface Entitlements {
|
|
19
|
-
tier: Tier
|
|
20
|
-
seats: number // metered → gated by usage(account, 'seats') >= seats
|
|
21
|
-
storage: number // metered
|
|
22
|
-
priority: boolean // flag → gated by the boolean itself
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
`cant(account, key?)` gates generically off the value type — no per-key `switch`:
|
|
27
|
-
|
|
28
|
-
- no `key` → `true` unless the account has unexpired premium.
|
|
29
|
-
- `boolean` entitlement → `true` when the flag is off.
|
|
30
|
-
- `number` entitlement → `true` when summed usage (`account.usage`) has reached the limit.
|
|
31
|
-
- anything else (e.g. the `tier` string) → never gated.
|
|
32
|
-
|
|
33
|
-
`usages()` (the `Entitlements` UI) derives one usage bar per **numeric** entitlement automatically, so adding/removing a metered key needs no UI change. When you rename a key, add a matching `used.<key>` and `benefits.<key>` entry to the intl mount.
|
|
34
|
-
|
|
35
|
-
The account shape is `AccountLike` (`id`, optional `premium`, `processor`, `interval`, `entitlements`, `usage`) — a structural subset of your identity account; pass your `@/iam` account (or any object satisfying it) to `cant`/`usages`/the UI. `interval` is the account's current billing period as an ISO-8601 duration (`P1M`/`P1Y`); the paywall reads it to preselect the matching interval tab.
|
|
36
|
-
|
|
37
|
-
## Tiers
|
|
38
|
-
|
|
39
|
-
The upgrade ladder is `tiers = ['basic', 'premium', 'expert']` in `svc/tier.ts` (`rank()` orders upgrades off it). Override it by editing that array in place — there is no config hook. Keep the `tier` values, the `Entitlements.tier` type, the `groups`/`plans` intl keys, and your store product groups in sync with it.
|
|
40
|
-
|
|
41
|
-
## Notes
|
|
42
|
-
|
|
43
|
-
- **Products come from the store, not this Solution.** Each processor fetches its own catalog: App Store / Google Play via the native bridge over a fixed set of product IDs (`<tier>_<month|year>`, edit the `IDS` array per processor), Stripe via `GET /stripe/checkout/products`. The dev processor serves the static `svc/processors/dev/products.ts` list so the paywall renders with no backend. Align your store product IDs / Stripe price `metadata.tier` with your `tiers`.
|
|
44
|
-
- **Backend endpoints.** Live processors call, under `$config.origin`: `POST/PATCH /appstore/transactions/{id}`, `POST /googleplay/transactions/{id}`, `GET /stripe/checkout/products`, `POST /stripe/checkout/{id}` (+ `/{id}/portal`), `POST /stripe/transactions/{id}`. You implement these.
|
|
45
|
-
- **Stripe return.** Stripe checkout redirects back to `#stripe={CHECKOUT_SESSION_ID}`; `rc()` reads that one-shot hash through `@/fragments` and commits the transaction behind the processing overlay. Call `rc()` once on app start.
|
|
46
|
-
- **Google Play package id.** `svc/processors/googleplay/processor.ts` builds the manage-subscription URL from a placeholder `com.example.twa` — replace it with your Trusted Web Activity package id (the same one you set in `@/bridge`).
|
|
47
|
-
- **Analytics.** The processors emit `checkout` / `purchase` events through `@/analytics`; `Payguard` emits `paywall`. `analytics.d.ts` augments the analytics `Events` interface with the `paywall` / `checkout` shapes.
|
|
48
|
-
- **Legal copy & links.** The disclaimers are neutral, store-compliant defaults; `Legal.svelte` links to `/terms/` and `/privacy/` — point them at your pages. Ships its own svintl mount in the registry's four locales; after install reconcile it: `npx intl import payments src/@/payments/ui/intl`.
|
|
49
|
-
|
|
50
|
-
## Usage
|
|
51
|
-
|
|
52
|
-
Commit a pending Stripe return once on app start, then drop the paywall behind anything that needs premium:
|
|
53
|
-
|
|
54
|
-
```svelte
|
|
55
|
-
<script lang="ts">
|
|
56
|
-
import { onMount } from 'svelte'
|
|
57
|
-
import { rc } from '@/payments/rc'
|
|
58
|
-
import { Payguard, Entitlements } from '@/payments/ui'
|
|
59
|
-
import { Button } from '$ui/button'
|
|
60
|
-
import { account } from '@/iam'
|
|
61
|
-
|
|
62
|
-
onMount(rc)
|
|
63
|
-
</script>
|
|
64
|
-
|
|
65
|
-
<!-- gates the action: opens the paywall when the account can't use `seats` -->
|
|
66
|
-
<Payguard entitlement="seats">
|
|
67
|
-
<Button>Invite a teammate</Button>
|
|
68
|
-
</Payguard>
|
|
69
|
-
|
|
70
|
-
{#if $account}
|
|
71
|
-
<Entitlements account={$account} />
|
|
72
|
-
{/if}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
`<Paywall>` is the full-screen plan picker `<Payguard>` opens; mount it directly when you want a standalone pricing page.
|
|
76
|
-
|
|
77
|
-
## Props
|
|
78
|
-
|
|
79
|
-
### `Payguard`
|
|
80
|
-
|
|
81
|
-
| Prop | Type | Default | Notes |
|
|
82
|
-
| ------------- | ---------------------- | ------- | --------------------------------------------------------------------------- |
|
|
83
|
-
| `children` | `Snippet` | — | The gated trigger; rendered as-is when the account already has entitlement. |
|
|
84
|
-
| `entitlement` | `keyof Entitlements` | — | When set, gates on that specific entitlement; omit to gate on premium only. |
|
|
85
|
-
| `crown` | `boolean` | `true` | Show the crown badge on the gated trigger. |
|
|
86
|
-
| `class` | `ClassValue` | — | Forwarded to the trigger button. |
|
|
87
|
-
|
|
88
|
-
### `Paywall`
|
|
89
|
-
|
|
90
|
-
| Prop | Type | Default | Notes |
|
|
91
|
-
| ------------ | ------------ | ------- | -------------------------------------- |
|
|
92
|
-
| `oncomplete` | `() => void` | — | Fired after a successful checkout or dismissal. |
|
|
93
|
-
|
|
94
|
-
### `Entitlements`
|
|
95
|
-
|
|
96
|
-
| Prop | Type | Default | Notes |
|
|
97
|
-
| --------- | ------------- | ------- | ------------------------------------------------------ |
|
|
98
|
-
| `account` | `AccountLike` | — | Renders the current plan, usage bars, and manage/upgrade action. |
|
|
99
|
-
| `class` | `ClassValue` | — | Root class. |
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
# realtime
|
|
2
|
-
|
|
3
|
-
Server-pushed event stream layered on `@toa.io/origin` multipart. `connect(id)` opens a long-running multipart POST to `/presence/{id}/`, parses each chunk into a typed event, and re-emits it on a `mitt` bus. `rc()` ties the connection lifecycle to `@/iam`'s `authenticated` derived: connects with the current account id on sign-in, disconnects on sign-out, reconnects automatically on errors. Exposes a `dashboard` store (`status` + last 128 events), a `time` store (server clock — updated from `origin` response `Date` headers), and the `events` emitter for domain modules to subscribe to.
|
|
4
|
-
|
|
5
|
-
## Wiring
|
|
6
|
-
|
|
7
|
-
Both `@/iam` and `@/realtime` install `rc()` bootstraps that must run once in the browser. Call them from the root `+layout.ts`:
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
import { rc as iam } from '@/iam/rc'
|
|
11
|
-
import { rc as realtime } from '@/realtime/rc'
|
|
12
|
-
import { browser } from '$app/environment'
|
|
13
|
-
|
|
14
|
-
if (browser) {
|
|
15
|
-
iam()
|
|
16
|
-
realtime()
|
|
17
|
-
}
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Domain events
|
|
21
|
-
|
|
22
|
-
`svc/events.ts` declares `Events = Record<string, unknown> // add domain events here`. Extend it per domain so the emitter is typed end-to-end. Convention: every domain that publishes server events exposes an `Events` type from `@/<domain>/svc/net` and the host intersects them:
|
|
23
|
-
|
|
24
|
-
```ts
|
|
25
|
-
// src/@/realtime/svc/events.ts (edit after install)
|
|
26
|
-
import type { Events as Contacts } from '@/contacts/svc/net'
|
|
27
|
-
import type { Events as Notifications } from '@/notifications/svc/net'
|
|
28
|
-
|
|
29
|
-
export type Events = Contacts & Notifications
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Subscribe in any domain's store:
|
|
33
|
-
|
|
34
|
-
```ts
|
|
35
|
-
import { events } from '@/realtime'
|
|
36
|
-
|
|
37
|
-
events.on('contact.added', (data) => { /* … */ })
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Notes
|
|
41
|
-
|
|
42
|
-
- **Backend contract.** `/presence/{id}/` must return `multipart/mixed` per `@toa.io/origin` multipart: first part `"ACK"`, then JSON parts of shape `{ event, data }` or the literal string `"heartbeat"`, terminated by `"FIN"`. The Solution forces `credentials: 'include'` and sends `{ timezone }` in the body.
|
|
43
|
-
- **Auto-reconnect.** Errors other than `AbortError` retry after 3 s. `disconnect()` (or sign-out via `rc()`) aborts the in-flight request.
|
|
44
|
-
- **`time` store.** Seeded with `Date.now()` and updated on every `origin` response — handy for clock skew correction in UI relative timestamps.
|
|
45
|
-
|
|
46
|
-
## Usage
|
|
47
|
-
|
|
48
|
-
Read connection status and the last events for a debug panel:
|
|
49
|
-
|
|
50
|
-
```svelte
|
|
51
|
-
<script lang="ts">
|
|
52
|
-
import { dashboard } from '@/realtime'
|
|
53
|
-
</script>
|
|
54
|
-
|
|
55
|
-
<p>Status: {$dashboard.status}</p>
|
|
56
|
-
<ul>
|
|
57
|
-
{#each $dashboard.events as e (e)}
|
|
58
|
-
<li>{e.label}: {JSON.stringify(e.payload)}</li>
|
|
59
|
-
{/each}
|
|
60
|
-
</ul>
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
Subscribe to a typed event:
|
|
64
|
-
|
|
65
|
-
```ts
|
|
66
|
-
import { events } from '@/realtime'
|
|
67
|
-
|
|
68
|
-
events.on('heartbeat', () => console.debug('alive'))
|
|
69
|
-
```
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# Scrollable
|
|
2
|
-
|
|
3
|
-
Horizontal snap scroller with optional infinite loop and programmatic scroll-to-index. Give each child `snap-center` or `snap-start` (and fixed width) for predictable snapping.
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
|
|
7
|
-
```svelte
|
|
8
|
-
<script lang="ts">
|
|
9
|
-
import { Scrollable } from '$com/scrollable'
|
|
10
|
-
|
|
11
|
-
let index = $state(0)
|
|
12
|
-
const items = ['One', 'Two', 'Three']
|
|
13
|
-
</script>
|
|
14
|
-
|
|
15
|
-
<Scrollable scroll={index} class="gap-2">
|
|
16
|
-
{#each items as item, i (item)}
|
|
17
|
-
<button class="snap-center shrink-0 rounded-lg border px-4 py-2" onclick={() => (index = i)}>
|
|
18
|
-
{item}
|
|
19
|
-
</button>
|
|
20
|
-
{/each}
|
|
21
|
-
</Scrollable>
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Props
|
|
25
|
-
|
|
26
|
-
| Prop | Type | Default | Notes |
|
|
27
|
-
| ------------ | ------------------------ | --------- | --------------------------------------------------------------------- |
|
|
28
|
-
| `children` | `Snippet` | — | Scroll items. Duplicated internally when `infinite` is true. |
|
|
29
|
-
| `infinite` | `boolean` | `false` | Loop by cloning children; recenters on `scrollend`. |
|
|
30
|
-
| `align` | `'start' \| 'center'` | `'start'` | How `scroll` index is positioned. |
|
|
31
|
-
| `scroll` | `number` | `0` | Child index to scroll to. Use `-1` to skip initial scroll. |
|
|
32
|
-
| `bleed` | `boolean` | `false` | Break out to full viewport width (edge-to-edge carousel). |
|
|
33
|
-
| `gutter` | `boolean` | `false` | Half-track end gutters so the first/last item can sit dead-center. Pairs with `align="center"`; ignored when `infinite`. |
|
|
34
|
-
| `controlled` | `boolean` | `false` | Hide native overflow; drive scroll externally. |
|
|
35
|
-
| `dir` | `'ltr' \| 'rtl'` | — | Direction on the outer container. |
|
|
36
|
-
| `class` | `ClassValue` | — | Classes on the scroll track (gap, padding, etc.). |
|
|
37
|
-
| `style` | `string` | — | Inline style on the outer container. |
|
|
38
|
-
| `id` | `string` | — | Id on the scroll track. |
|
|
39
|
-
| `onscroll` | `(e: Event) => void` | — | Scroll handler on the track. |
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# Selector
|
|
2
|
-
|
|
3
|
-
Card-style option list for single- or multi-choice selection. Import as a namespace (`import * as Selector from '$com/selector'`).
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
|
|
7
|
-
```svelte
|
|
8
|
-
<script lang="ts">
|
|
9
|
-
import * as Selector from '$com/selector'
|
|
10
|
-
|
|
11
|
-
let value = $state('')
|
|
12
|
-
let values = $state<string[]>([])
|
|
13
|
-
</script>
|
|
14
|
-
|
|
15
|
-
<Selector.Root bind:value>
|
|
16
|
-
<Selector.Option value="yearly">
|
|
17
|
-
<Selector.Title>
|
|
18
|
-
<strong>Yearly</strong>
|
|
19
|
-
129,99€ per year
|
|
20
|
-
</Selector.Title>
|
|
21
|
-
<Selector.Description>32€ monthly</Selector.Description>
|
|
22
|
-
</Selector.Option>
|
|
23
|
-
<Selector.Option value="monthly">
|
|
24
|
-
<Selector.Title>
|
|
25
|
-
<strong>Monthly</strong>
|
|
26
|
-
29,99€ per month
|
|
27
|
-
</Selector.Title>
|
|
28
|
-
<Selector.Description>Flexible, slightly pricier</Selector.Description>
|
|
29
|
-
</Selector.Option>
|
|
30
|
-
</Selector.Root>
|
|
31
|
-
|
|
32
|
-
<Selector.Root bind:values type="multi" position="end">
|
|
33
|
-
<Selector.Option value="notifications">
|
|
34
|
-
<Selector.Title>Notifications</Selector.Title>
|
|
35
|
-
<Selector.Description>Email and push alerts</Selector.Description>
|
|
36
|
-
</Selector.Option>
|
|
37
|
-
</Selector.Root>
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Notes
|
|
41
|
-
|
|
42
|
-
More than one `Selector.Root` on the same page with overlapping option `value`s needs a unique `id` on each root (e.g. `id="billing"` / `id="addons"`).
|
|
43
|
-
|
|
44
|
-
## Props
|
|
45
|
-
|
|
46
|
-
### Root
|
|
47
|
-
|
|
48
|
-
| Prop | Type | Default | Notes |
|
|
49
|
-
| ---------- | --------------------- | --------- | -------------------------------------------------- |
|
|
50
|
-
| `id` | `string` | `'radio'` | Prefix for each option’s control/label id. |
|
|
51
|
-
| `type` | `'single' \| 'multi'` | `'single'`| Single uses radio group; multi uses checkboxes. |
|
|
52
|
-
| `value` | `string` | `''` | Bindable selection for `type="single"`. |
|
|
53
|
-
| `values` | `string[]` | `[]` | Bindable selection for `type="multi"`. |
|
|
54
|
-
| `position` | `'start' \| 'end'` | `'start'` | Indicator column: leading media or trailing actions. |
|
|
55
|
-
| `variant` | `ItemVariant` | `'outline'` | Forwarded to each `Option` row. |
|
|
56
|
-
| `size` | `ItemSize` | — | Forwarded to each `Option` row. |
|
|
57
|
-
| `class` | `ClassValue` | — | Wrapper classes (`single` mode radio group only). |
|
|
58
|
-
| `children` | `Snippet` | — | `Option` slots. |
|
|
59
|
-
|
|
60
|
-
### Option
|
|
61
|
-
|
|
62
|
-
| Prop | Type | Default | Notes |
|
|
63
|
-
| ---------- | --------- | ------- | ------------------------------------------ |
|
|
64
|
-
| `value` | `string` | — | Option id stored in `value` / `values`. |
|
|
65
|
-
| `id` | `string` | `{rootId}-{value}` | Override control/label id for this row. |
|
|
66
|
-
| `class` | `ClassValue` | — | Row classes. |
|
|
67
|
-
| `children` | `Snippet` | — | `Title` and `Description` slots. |
|
|
68
|
-
|
|
69
|
-
### Title / Description
|
|
70
|
-
|
|
71
|
-
Pass through shadcn `Item` title and description props (`class`, etc.).
|