@ternent/core 0.0.1
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/.changeset/README.md +8 -0
- package/.changeset/config.json +17 -0
- package/.github/workflows/deploy-armour.yml +42 -0
- package/.github/workflows/deploy-identity.yml +42 -0
- package/.github/workflows/deploy-seal.yml +42 -0
- package/.github/workflows/deploy-ui.yml +42 -0
- package/.github/workflows/deploy-utils.yml +42 -0
- package/.github/workflows/release-create.yml +59 -0
- package/.github/workflows/release-publish.yml +54 -0
- package/.nvmrc +1 -0
- package/.ops/publish.mjs +31 -0
- package/package.json +16 -0
- package/packages/README.md +0 -0
- package/packages/armour/CHANGELOG.md +66 -0
- package/packages/armour/CLAUDE.md +8 -0
- package/packages/armour/README.md +103 -0
- package/packages/armour/SPEC.md +92 -0
- package/packages/armour/package.json +45 -0
- package/packages/armour/src/constants.ts +5 -0
- package/packages/armour/src/deps.d.ts +56 -0
- package/packages/armour/src/errors.ts +172 -0
- package/packages/armour/src/files.ts +73 -0
- package/packages/armour/src/identity.ts +72 -0
- package/packages/armour/src/index.ts +56 -0
- package/packages/armour/src/init.ts +10 -0
- package/packages/armour/src/passphrase.ts +33 -0
- package/packages/armour/src/recipients.ts +73 -0
- package/packages/armour/src/text.ts +68 -0
- package/packages/armour/src/types.ts +93 -0
- package/packages/armour/test/armour.test.ts +270 -0
- package/packages/armour/tsconfig.build.json +12 -0
- package/packages/armour/tsconfig.json +12 -0
- package/packages/armour/vite.config.ts +29 -0
- package/packages/concord/CHANGELOG.md +83 -0
- package/packages/concord/CLAUDE.md +9 -0
- package/packages/concord/README.md +146 -0
- package/packages/concord/SPEC.md +287 -0
- package/packages/concord/package.json +51 -0
- package/packages/concord/src/app.ts +717 -0
- package/packages/concord/src/errors.ts +9 -0
- package/packages/concord/src/index.ts +20 -0
- package/packages/concord/src/types.ts +127 -0
- package/packages/concord/test/concord.test.ts +978 -0
- package/packages/concord/tsconfig.json +12 -0
- package/packages/concord/vite.browser.config.ts +27 -0
- package/packages/concord/vite.config.ts +35 -0
- package/packages/concord/vite.config.ts.timestamp-1774262297922-ffd76e35ea668.mjs +83 -0
- package/packages/identity/CHANGELOG.md +47 -0
- package/packages/identity/README.md +236 -0
- package/packages/identity/package.json +41 -0
- package/packages/identity/src/index.ts +538 -0
- package/packages/identity/test/identity.test.ts +172 -0
- package/packages/identity/tsconfig.build.json +12 -0
- package/packages/identity/vite.config.ts +17 -0
- package/packages/ledger/CHANGELOG.md +69 -0
- package/packages/ledger/CLAUDE.md +9 -0
- package/packages/ledger/SPEC.md +304 -0
- package/packages/ledger/package.json +48 -0
- package/packages/ledger/src/index.ts +2 -0
- package/packages/ledger/src/ledger.ts +1286 -0
- package/packages/ledger/src/seal-cli.d.ts +25 -0
- package/packages/ledger/src/types.ts +294 -0
- package/packages/ledger/test/ledger.test.ts +838 -0
- package/packages/ledger/tsconfig.json +12 -0
- package/packages/ledger/vite.browser.config.ts +27 -0
- package/packages/ledger/vite.config.ts +39 -0
- package/packages/seal/CHANGELOG.md +137 -0
- package/packages/seal/CLAUDE.md +8 -0
- package/packages/seal/README.md +258 -0
- package/packages/seal/bin/seal +6 -0
- package/packages/seal/package.json +59 -0
- package/packages/seal/src/artifact.ts +380 -0
- package/packages/seal/src/cli.ts +372 -0
- package/packages/seal/src/commands/identity.ts +52 -0
- package/packages/seal/src/commands/manifest.ts +71 -0
- package/packages/seal/src/commands/publicKey.ts +7 -0
- package/packages/seal/src/commands/sign.ts +56 -0
- package/packages/seal/src/commands/verify.ts +54 -0
- package/packages/seal/src/crypto.ts +85 -0
- package/packages/seal/src/errors.ts +88 -0
- package/packages/seal/src/index.ts +5 -0
- package/packages/seal/src/manifest.ts +114 -0
- package/packages/seal/src/node.ts +18 -0
- package/packages/seal/src/proof.ts +344 -0
- package/packages/seal/test/artifact.test.ts +86 -0
- package/packages/seal/test/cli.test.ts +208 -0
- package/packages/seal/test/crypto.test.ts +21 -0
- package/packages/seal/test/manifest.test.ts +32 -0
- package/packages/seal/test/proof.test.ts +60 -0
- package/packages/seal/tsconfig.json +12 -0
- package/packages/seal/vite.config.ts +54 -0
- package/packages/ui/CHANGELOG.md +393 -0
- package/packages/ui/README.md +57 -0
- package/packages/ui/jsconfig.json +19 -0
- package/packages/ui/package.json +64 -0
- package/packages/ui/scripts/check-tokens.js +56 -0
- package/packages/ui/scripts/generate-theme-css.mjs +85 -0
- package/packages/ui/src/design-system/base.css +8 -0
- package/packages/ui/src/design-system/docs/ACCESSIBILITY_RULES.md +186 -0
- package/packages/ui/src/design-system/docs/AI_SYSTEM.md +281 -0
- package/packages/ui/src/design-system/docs/PATTERN_RULES.md +83 -0
- package/packages/ui/src/design-system/docs/PRIMITIVE_RULES.md +258 -0
- package/packages/ui/src/design-system/docs/TOKEN_RULES.md +235 -0
- package/packages/ui/src/design-system/docs/VISUAL_DIRECTION.md +68 -0
- package/packages/ui/src/design-system/foundation.js +420 -0
- package/packages/ui/src/design-system/tokens.css +140 -0
- package/packages/ui/src/design-system/tokens.js +327 -0
- package/packages/ui/src/design-system/utils.js +246 -0
- package/packages/ui/src/main.js +4 -0
- package/packages/ui/src/patterns/FeatureCard/FeatureCard.spec.md +24 -0
- package/packages/ui/src/patterns/FeatureCard/FeatureCard.types.ts +8 -0
- package/packages/ui/src/patterns/FeatureCard/FeatureCard.vue +175 -0
- package/packages/ui/src/patterns/FormField/FormField.spec.md +65 -0
- package/packages/ui/src/patterns/FormField/FormField.types.ts +11 -0
- package/packages/ui/src/patterns/FormField/FormField.vue +87 -0
- package/packages/ui/src/patterns/IdentityGlyph/IdentityGlyph.vue +61 -0
- package/packages/ui/src/patterns/IdentityGlyph/IdentityHandle.vue +58 -0
- package/packages/ui/src/patterns/IdentityGlyph/identityGlyph.types.ts +36 -0
- package/packages/ui/src/patterns/IdentityGlyph/identityGlyph.utils.ts +585 -0
- package/packages/ui/src/patterns/IdentityGlyph/index.ts +5 -0
- package/packages/ui/src/patterns/KeyValueList/KeyValueList.spec.md +28 -0
- package/packages/ui/src/patterns/KeyValueList/KeyValueList.types.ts +16 -0
- package/packages/ui/src/patterns/KeyValueList/KeyValueList.vue +50 -0
- package/packages/ui/src/patterns/LandingPage/LandingIcon.vue +90 -0
- package/packages/ui/src/patterns/LandingPage/LandingPage.spec.md +24 -0
- package/packages/ui/src/patterns/LandingPage/LandingPage.types.ts +212 -0
- package/packages/ui/src/patterns/LandingPage/LandingPage.vue +599 -0
- package/packages/ui/src/patterns/ListWorkspaceLayout/ListWorkspaceLayout.test.ts +33 -0
- package/packages/ui/src/patterns/ListWorkspaceLayout/ListWorkspaceLayout.vue +44 -0
- package/packages/ui/src/patterns/Logo/Logo.spec.md +22 -0
- package/packages/ui/src/patterns/Logo/Logo.vue +160 -0
- package/packages/ui/src/patterns/PageSurface/PageSurface.spec.md +15 -0
- package/packages/ui/src/patterns/PageSurface/PageSurface.vue +85 -0
- package/packages/ui/src/patterns/PanelChrome/PanelChrome.spec.md +39 -0
- package/packages/ui/src/patterns/PanelChrome/PanelChrome.types.ts +1 -0
- package/packages/ui/src/patterns/PanelChrome/PanelChrome.vue +187 -0
- package/packages/ui/src/patterns/PreviewPanel/PreviewPanel.spec.md +31 -0
- package/packages/ui/src/patterns/PreviewPanel/PreviewPanel.types.ts +23 -0
- package/packages/ui/src/patterns/PreviewPanel/PreviewPanel.vue +354 -0
- package/packages/ui/src/patterns/RecordList/RecordList.spec.md +35 -0
- package/packages/ui/src/patterns/RecordList/RecordList.test.ts +42 -0
- package/packages/ui/src/patterns/RecordList/RecordList.types.ts +9 -0
- package/packages/ui/src/patterns/RecordList/RecordList.utils.ts +5 -0
- package/packages/ui/src/patterns/RecordList/RecordList.vue +134 -0
- package/packages/ui/src/patterns/SectionClarifier/SectionClarifier.vue +85 -0
- package/packages/ui/src/patterns/SectionIntro/SectionIntro.spec.md +25 -0
- package/packages/ui/src/patterns/SectionIntro/SectionIntro.types.ts +7 -0
- package/packages/ui/src/patterns/SectionIntro/SectionIntro.vue +141 -0
- package/packages/ui/src/patterns/SidebarNav/SidebarNav.spec.md +34 -0
- package/packages/ui/src/patterns/SidebarNav/SidebarNav.types.ts +17 -0
- package/packages/ui/src/patterns/SidebarNav/SidebarNav.vue +110 -0
- package/packages/ui/src/patterns/SplitView/SplitView.spec.md +28 -0
- package/packages/ui/src/patterns/SplitView/SplitView.test.ts +22 -0
- package/packages/ui/src/patterns/SplitView/SplitView.types.ts +3 -0
- package/packages/ui/src/patterns/SplitView/SplitView.utils.ts +13 -0
- package/packages/ui/src/patterns/SplitView/SplitView.vue +39 -0
- package/packages/ui/src/patterns/StepList/StepList.spec.md +15 -0
- package/packages/ui/src/patterns/StepList/StepList.types.ts +4 -0
- package/packages/ui/src/patterns/StepList/StepList.vue +91 -0
- package/packages/ui/src/patterns/Verification/VerificationBadge.vue +97 -0
- package/packages/ui/src/patterns/Verification/VerificationComponents.test.ts +153 -0
- package/packages/ui/src/patterns/Verification/VerificationDetailsPanel.vue +270 -0
- package/packages/ui/src/patterns/Verification/VerificationSummary.vue +171 -0
- package/packages/ui/src/patterns/Verification/index.ts +6 -0
- package/packages/ui/src/patterns/Verification/verification.types.ts +8 -0
- package/packages/ui/src/patterns/Verification/verification.utils.test.ts +37 -0
- package/packages/ui/src/patterns/Verification/verification.utils.ts +75 -0
- package/packages/ui/src/patterns/index.ts +25 -0
- package/packages/ui/src/primitives/Accordian/Accordian.vue +11 -0
- package/packages/ui/src/primitives/Accordian/AccordianItem.vue +14 -0
- package/packages/ui/src/primitives/Accordion/Accordion.props.ts +21 -0
- package/packages/ui/src/primitives/Accordion/Accordion.spec.md +50 -0
- package/packages/ui/src/primitives/Accordion/Accordion.types.ts +4 -0
- package/packages/ui/src/primitives/Accordion/Accordion.variants.ts +12 -0
- package/packages/ui/src/primitives/Accordion/Accordion.vue +71 -0
- package/packages/ui/src/primitives/Accordion/AccordionItem.props.ts +14 -0
- package/packages/ui/src/primitives/Accordion/AccordionItem.vue +40 -0
- package/packages/ui/src/primitives/Badge/Badge.props.ts +17 -0
- package/packages/ui/src/primitives/Badge/Badge.spec.md +17 -0
- package/packages/ui/src/primitives/Badge/Badge.types.ts +15 -0
- package/packages/ui/src/primitives/Badge/Badge.variants.ts +48 -0
- package/packages/ui/src/primitives/Badge/Badge.vue +31 -0
- package/packages/ui/src/primitives/Button/Button.props.ts +29 -0
- package/packages/ui/src/primitives/Button/Button.spec.md +139 -0
- package/packages/ui/src/primitives/Button/Button.types.ts +19 -0
- package/packages/ui/src/primitives/Button/Button.variants.ts +72 -0
- package/packages/ui/src/primitives/Button/Button.vue +90 -0
- package/packages/ui/src/primitives/Card/Card.props.ts +17 -0
- package/packages/ui/src/primitives/Card/Card.spec.md +29 -0
- package/packages/ui/src/primitives/Card/Card.types.ts +12 -0
- package/packages/ui/src/primitives/Card/Card.variants.ts +27 -0
- package/packages/ui/src/primitives/Card/Card.vue +37 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.props.ts +21 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.spec.md +51 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.types.ts +4 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.variants.ts +34 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.vue +92 -0
- package/packages/ui/src/primitives/Dialog/Dialog.props.ts +29 -0
- package/packages/ui/src/primitives/Dialog/Dialog.spec.md +52 -0
- package/packages/ui/src/primitives/Dialog/Dialog.types.ts +3 -0
- package/packages/ui/src/primitives/Dialog/Dialog.variants.ts +27 -0
- package/packages/ui/src/primitives/Dialog/Dialog.vue +78 -0
- package/packages/ui/src/primitives/Drawer/Drawer.props.ts +33 -0
- package/packages/ui/src/primitives/Drawer/Drawer.spec.md +50 -0
- package/packages/ui/src/primitives/Drawer/Drawer.types.ts +5 -0
- package/packages/ui/src/primitives/Drawer/Drawer.variants.ts +35 -0
- package/packages/ui/src/primitives/Drawer/Drawer.vue +88 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.props.ts +17 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.spec.md +35 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.types.ts +5 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.variants.ts +14 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.vue +40 -0
- package/packages/ui/src/primitives/FileInput/FileInput.props.ts +41 -0
- package/packages/ui/src/primitives/FileInput/FileInput.types.ts +6 -0
- package/packages/ui/src/primitives/FileInput/FileInput.variants.ts +46 -0
- package/packages/ui/src/primitives/FileInput/FileInput.vue +163 -0
- package/packages/ui/src/primitives/Input/Input.props.ts +29 -0
- package/packages/ui/src/primitives/Input/Input.spec.md +79 -0
- package/packages/ui/src/primitives/Input/Input.types.ts +13 -0
- package/packages/ui/src/primitives/Input/Input.variants.ts +54 -0
- package/packages/ui/src/primitives/Input/Input.vue +99 -0
- package/packages/ui/src/primitives/Label/Label.props.ts +25 -0
- package/packages/ui/src/primitives/Label/Label.spec.md +31 -0
- package/packages/ui/src/primitives/Label/Label.types.ts +3 -0
- package/packages/ui/src/primitives/Label/Label.variants.ts +17 -0
- package/packages/ui/src/primitives/Label/Label.vue +38 -0
- package/packages/ui/src/primitives/Menu/Menu.props.ts +17 -0
- package/packages/ui/src/primitives/Menu/Menu.spec.md +38 -0
- package/packages/ui/src/primitives/Menu/Menu.types.ts +10 -0
- package/packages/ui/src/primitives/Menu/Menu.variants.ts +10 -0
- package/packages/ui/src/primitives/Menu/Menu.vue +57 -0
- package/packages/ui/src/primitives/Popover/Popover.props.ts +25 -0
- package/packages/ui/src/primitives/Popover/Popover.spec.md +49 -0
- package/packages/ui/src/primitives/Popover/Popover.types.ts +3 -0
- package/packages/ui/src/primitives/Popover/Popover.variants.ts +18 -0
- package/packages/ui/src/primitives/Popover/Popover.vue +74 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.props.ts +29 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.spec.md +50 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.types.ts +12 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.variants.ts +48 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.vue +87 -0
- package/packages/ui/src/primitives/Separator/Separator.props.ts +9 -0
- package/packages/ui/src/primitives/Separator/Separator.spec.md +15 -0
- package/packages/ui/src/primitives/Separator/Separator.types.ts +3 -0
- package/packages/ui/src/primitives/Separator/Separator.variants.ts +8 -0
- package/packages/ui/src/primitives/Separator/Separator.vue +23 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.props.ts +21 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.spec.md +18 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.types.ts +5 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.variants.ts +18 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.vue +37 -0
- package/packages/ui/src/primitives/Spinner/Spinner.props.ts +13 -0
- package/packages/ui/src/primitives/Spinner/Spinner.spec.md +16 -0
- package/packages/ui/src/primitives/Spinner/Spinner.types.ts +5 -0
- package/packages/ui/src/primitives/Spinner/Spinner.variants.ts +15 -0
- package/packages/ui/src/primitives/Spinner/Spinner.vue +33 -0
- package/packages/ui/src/primitives/SplitButton/SplitButton.vue +108 -0
- package/packages/ui/src/primitives/Switch/Switch.props.ts +21 -0
- package/packages/ui/src/primitives/Switch/Switch.spec.md +49 -0
- package/packages/ui/src/primitives/Switch/Switch.types.ts +3 -0
- package/packages/ui/src/primitives/Switch/Switch.variants.ts +34 -0
- package/packages/ui/src/primitives/Switch/Switch.vue +71 -0
- package/packages/ui/src/primitives/Tabs/Tabs.props.ts +25 -0
- package/packages/ui/src/primitives/Tabs/Tabs.spec.md +48 -0
- package/packages/ui/src/primitives/Tabs/Tabs.types.ts +11 -0
- package/packages/ui/src/primitives/Tabs/Tabs.variants.ts +28 -0
- package/packages/ui/src/primitives/Tabs/Tabs.vue +59 -0
- package/packages/ui/src/primitives/Textarea/Textarea.props.ts +33 -0
- package/packages/ui/src/primitives/Textarea/Textarea.spec.md +59 -0
- package/packages/ui/src/primitives/Textarea/Textarea.types.ts +5 -0
- package/packages/ui/src/primitives/Textarea/Textarea.variants.ts +27 -0
- package/packages/ui/src/primitives/Textarea/Textarea.vue +74 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.props.ts +21 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.spec.md +45 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.types.ts +3 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.variants.ts +4 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.vue +31 -0
- package/packages/ui/src/primitives/TreeView/TreeView.types.ts +10 -0
- package/packages/ui/src/primitives/TreeView/TreeView.vue +113 -0
- package/packages/ui/src/primitives/TreeView/TreeViewNode.vue +190 -0
- package/packages/ui/src/primitives/index.ts +29 -0
- package/packages/ui/src/style.css +7 -0
- package/packages/ui/src/style.js +1 -0
- package/packages/ui/src/themes/armour.css +147 -0
- package/packages/ui/src/themes/aurora.css +147 -0
- package/packages/ui/src/themes/citrine-ash.css +147 -0
- package/packages/ui/src/themes/concord.css +147 -0
- package/packages/ui/src/themes/garnet-honey.css +147 -0
- package/packages/ui/src/themes/harbor-rose.css +147 -0
- package/packages/ui/src/themes/ledger.css +147 -0
- package/packages/ui/src/themes/neon-noir.css +74 -0
- package/packages/ui/src/themes/obsidian-iris.css +147 -0
- package/packages/ui/src/themes/pixpax.css +147 -0
- package/packages/ui/src/themes/print.css +147 -0
- package/packages/ui/src/themes/prism.css +147 -0
- package/packages/ui/src/themes/proof.css +145 -0
- package/packages/ui/src/themes/semanticThemeContract.js +2256 -0
- package/packages/ui/src/themes/spruce-ink.css +147 -0
- package/packages/ui/src/themes/sunset.css +147 -0
- package/packages/ui/tailwind.config.js +64 -0
- package/packages/ui/vite.config.js +35 -0
- package/packages/ui/vite.config.js.timestamp-1780697224943-89fbc929987bc.mjs +38 -0
- package/packages/utils/CHANGELOG.md +111 -0
- package/packages/utils/README.md +3 -0
- package/packages/utils/package.json +46 -0
- package/packages/utils/src/index.test.js +39 -0
- package/packages/utils/src/index.ts +289 -0
- package/packages/utils/tsconfig.build.json +12 -0
- package/packages/utils/vite.config.js +28 -0
- package/pnpm-workspace.yaml +8 -0
- package/scripts/vite/package-lib-config.ts +59 -0
- package/tsconfig.json +24 -0
- package/tsconfig.node.json +9 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { BadgeTone } from "../../primitives/Badge/Badge.types";
|
|
2
|
+
import type {
|
|
3
|
+
VerificationContext,
|
|
4
|
+
VerificationStatus,
|
|
5
|
+
VerificationSurface,
|
|
6
|
+
} from "./verification.types";
|
|
7
|
+
|
|
8
|
+
export function getVerificationStatusLabel(status: VerificationStatus): string {
|
|
9
|
+
if (status === "verified") return "Verified";
|
|
10
|
+
if (status === "failed") return "Failed";
|
|
11
|
+
return "Unknown";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function getVerificationHeadline(status: VerificationStatus): string {
|
|
15
|
+
if (status === "verified") return "Verified proof";
|
|
16
|
+
if (status === "failed") return "Failed proof";
|
|
17
|
+
return "Unknown proof";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function getVerificationBadgeTone(status: VerificationStatus): BadgeTone {
|
|
21
|
+
if (status === "verified") return "success";
|
|
22
|
+
if (status === "failed") return "critical";
|
|
23
|
+
return "neutral";
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function getVerificationSurfaceLabel(surface?: VerificationSurface): string | undefined {
|
|
27
|
+
if (surface === "browser") return "Browser";
|
|
28
|
+
if (surface === "cli") return "CLI";
|
|
29
|
+
if (surface === "ci") return "CI";
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getVerificationContextSubtext(
|
|
34
|
+
status: VerificationStatus,
|
|
35
|
+
context?: VerificationContext,
|
|
36
|
+
): string | undefined {
|
|
37
|
+
if (status === "unknown") return undefined;
|
|
38
|
+
|
|
39
|
+
if (status === "verified") {
|
|
40
|
+
if (context?.surface === "cli") return "Verified via CLI";
|
|
41
|
+
if (context?.surface === "ci") return "Verified in CI";
|
|
42
|
+
if (context?.surface === "browser") return "Verified in browser";
|
|
43
|
+
return "Independent verification successful";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (context?.surface === "cli") return "Verification failed via CLI";
|
|
47
|
+
if (context?.surface === "ci") return "Verification failed in CI";
|
|
48
|
+
if (context?.surface === "browser") return "Verification failed in browser";
|
|
49
|
+
return "Independent verification failed";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function truncateMiddle(value: string, leading = 12, trailing = 12): string {
|
|
53
|
+
if (value.length <= leading + trailing + 3) {
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return `${value.slice(0, leading)}...${value.slice(-trailing)}`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function copyToClipboard(value: string): Promise<boolean> {
|
|
61
|
+
if (
|
|
62
|
+
typeof navigator === "undefined" ||
|
|
63
|
+
!navigator.clipboard ||
|
|
64
|
+
typeof navigator.clipboard.writeText !== "function"
|
|
65
|
+
) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
await navigator.clipboard.writeText(value);
|
|
71
|
+
return true;
|
|
72
|
+
} catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import "../style.css";
|
|
2
|
+
|
|
3
|
+
export { default as FeatureCard } from "./FeatureCard/FeatureCard.vue";
|
|
4
|
+
export { default as FormField } from "./FormField/FormField.vue";
|
|
5
|
+
export { default as KeyValueList } from "./KeyValueList/KeyValueList.vue";
|
|
6
|
+
export { default as LandingPage } from "./LandingPage/LandingPage.vue";
|
|
7
|
+
export { default as ListWorkspaceLayout } from "./ListWorkspaceLayout/ListWorkspaceLayout.vue";
|
|
8
|
+
export { default as Logo } from "./Logo/Logo.vue";
|
|
9
|
+
export { default as PanelChrome } from "./PanelChrome/PanelChrome.vue";
|
|
10
|
+
export { default as PageSurface } from "./PageSurface/PageSurface.vue";
|
|
11
|
+
export { default as PreviewPanel } from "./PreviewPanel/PreviewPanel.vue";
|
|
12
|
+
export { default as RecordList } from "./RecordList/RecordList.vue";
|
|
13
|
+
export { default as SectionClarifier } from "./SectionClarifier/SectionClarifier.vue";
|
|
14
|
+
export { default as SectionIntro } from "./SectionIntro/SectionIntro.vue";
|
|
15
|
+
export { default as SidebarNav } from "./SidebarNav/SidebarNav.vue";
|
|
16
|
+
export { default as SplitView } from "./SplitView/SplitView.vue";
|
|
17
|
+
export { default as StepList } from "./StepList/StepList.vue";
|
|
18
|
+
export type * from "./KeyValueList/KeyValueList.types";
|
|
19
|
+
export type * from "./LandingPage/LandingPage.types";
|
|
20
|
+
export type * from "./PanelChrome/PanelChrome.types";
|
|
21
|
+
export type * from "./RecordList/RecordList.types";
|
|
22
|
+
export type * from "./SidebarNav/SidebarNav.types";
|
|
23
|
+
export type * from "./SplitView/SplitView.types";
|
|
24
|
+
export * from "./Verification";
|
|
25
|
+
export * from "./IdentityGlyph";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import AccordionItem from "../Accordion/AccordionItem.vue";
|
|
3
|
+
|
|
4
|
+
defineOptions({ inheritAttrs: false });
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<template>
|
|
8
|
+
<AccordionItem v-bind="$attrs">
|
|
9
|
+
<template v-if="$slots.title" #title>
|
|
10
|
+
<slot name="title" />
|
|
11
|
+
</template>
|
|
12
|
+
<slot />
|
|
13
|
+
</AccordionItem>
|
|
14
|
+
</template>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PropType } from "vue";
|
|
2
|
+
import type { AccordionValue } from "./Accordion.types";
|
|
3
|
+
|
|
4
|
+
export const accordionProps = {
|
|
5
|
+
multiple: {
|
|
6
|
+
type: Boolean,
|
|
7
|
+
default: false,
|
|
8
|
+
},
|
|
9
|
+
collapsible: {
|
|
10
|
+
type: Boolean,
|
|
11
|
+
default: true,
|
|
12
|
+
},
|
|
13
|
+
lazyMount: {
|
|
14
|
+
type: Boolean,
|
|
15
|
+
default: true,
|
|
16
|
+
},
|
|
17
|
+
value: {
|
|
18
|
+
type: [String, Array] as PropType<AccordionValue>,
|
|
19
|
+
default: undefined,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Accordion
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Disclosure primitive for stacked sections of related content.
|
|
6
|
+
|
|
7
|
+
## Category
|
|
8
|
+
|
|
9
|
+
Primitive
|
|
10
|
+
|
|
11
|
+
## Public API
|
|
12
|
+
|
|
13
|
+
`Accordion` props:
|
|
14
|
+
|
|
15
|
+
- `multiple`
|
|
16
|
+
- `collapsible`
|
|
17
|
+
- `lazyMount`
|
|
18
|
+
- `value`
|
|
19
|
+
|
|
20
|
+
`Accordion` events:
|
|
21
|
+
|
|
22
|
+
- `update:value`
|
|
23
|
+
|
|
24
|
+
`AccordionItem` props:
|
|
25
|
+
|
|
26
|
+
- `value`
|
|
27
|
+
- `title`
|
|
28
|
+
- `disabled`
|
|
29
|
+
|
|
30
|
+
Slots:
|
|
31
|
+
|
|
32
|
+
- `AccordionItem#title`
|
|
33
|
+
- default item content
|
|
34
|
+
|
|
35
|
+
## Accessibility
|
|
36
|
+
|
|
37
|
+
- built on Ark accordion semantics
|
|
38
|
+
- keyboard navigation and disclosure state come from Ark
|
|
39
|
+
- supports controlled usage through `value` + `update:value`
|
|
40
|
+
|
|
41
|
+
## Keyboard behavior
|
|
42
|
+
|
|
43
|
+
- trigger is focusable
|
|
44
|
+
- Enter/Space toggle sections
|
|
45
|
+
- arrow-key behavior follows Ark accordion rules
|
|
46
|
+
|
|
47
|
+
## Compatibility
|
|
48
|
+
|
|
49
|
+
Canonical naming is `Accordion` / `AccordionItem`.
|
|
50
|
+
Legacy `Accordian` / `AccordianItem` exports remain as compatibility aliases for now.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const accordionRootClass = "w-full divide-y divide-[var(--ui-border)]";
|
|
2
|
+
export const accordionItemClass = "group";
|
|
3
|
+
export const accordionTriggerClass =
|
|
4
|
+
"flex w-full items-center justify-between gap-3 py-4 text-left text-[var(--ui-fg)] " +
|
|
5
|
+
"transition-[color] duration-[var(--ui-duration-normal)] ease-[var(--ui-ease-out)] " +
|
|
6
|
+
"hover:text-[var(--ui-primary)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-ring)]";
|
|
7
|
+
export const accordionTitleClass = "flex-1 text-sm font-medium";
|
|
8
|
+
export const accordionIndicatorClass =
|
|
9
|
+
"size-4 text-[var(--ui-fg-muted)] transition-transform duration-[var(--ui-duration-normal)] ease-[var(--ui-ease-out)] group-data-[state=open]:rotate-180";
|
|
10
|
+
export const accordionContentClass =
|
|
11
|
+
"overflow-hidden text-sm text-[var(--ui-fg-muted)] data-[state=open]:animate-[accordion-down_var(--ui-duration-normal)_var(--ui-ease-out)] data-[state=closed]:animate-[accordion-up_var(--ui-duration-fast)_var(--ui-ease-out)]";
|
|
12
|
+
export const accordionPanelClass = "pb-4 pt-1";
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { Accordion as ArkAccordion } from "@ark-ui/vue/accordion";
|
|
3
|
+
import { computed, normalizeClass, useAttrs } from "vue";
|
|
4
|
+
import { twMerge } from "tailwind-merge";
|
|
5
|
+
import { accordionProps } from "./Accordion.props";
|
|
6
|
+
import type { AccordionValue } from "./Accordion.types";
|
|
7
|
+
import { accordionRootClass } from "./Accordion.variants";
|
|
8
|
+
|
|
9
|
+
defineOptions({ inheritAttrs: false });
|
|
10
|
+
|
|
11
|
+
const emit = defineEmits<{
|
|
12
|
+
"update:value": [value: AccordionValue];
|
|
13
|
+
}>();
|
|
14
|
+
|
|
15
|
+
const attrs = useAttrs();
|
|
16
|
+
const props = defineProps(accordionProps);
|
|
17
|
+
|
|
18
|
+
const rootClass = computed(() => twMerge(accordionRootClass, normalizeClass(attrs.class)));
|
|
19
|
+
const modelValue = computed<string[]>(() => {
|
|
20
|
+
if (Array.isArray(props.value)) return props.value;
|
|
21
|
+
if (typeof props.value === "string" && props.value.length > 0) return [props.value];
|
|
22
|
+
return [];
|
|
23
|
+
});
|
|
24
|
+
const rootAttrs = computed(() => {
|
|
25
|
+
const { class: _class, ...rest } = attrs;
|
|
26
|
+
return rest;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
function handleValueChange(value: string[]) {
|
|
30
|
+
emit("update:value", props.multiple ? value : value[0]);
|
|
31
|
+
}
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<template>
|
|
35
|
+
<ArkAccordion.Root
|
|
36
|
+
:class="rootClass"
|
|
37
|
+
:multiple="props.multiple"
|
|
38
|
+
:collapsible="props.collapsible"
|
|
39
|
+
:lazy-mount="props.lazyMount"
|
|
40
|
+
:model-value="modelValue"
|
|
41
|
+
unmount-on-exit
|
|
42
|
+
v-bind="rootAttrs"
|
|
43
|
+
@update:model-value="handleValueChange"
|
|
44
|
+
>
|
|
45
|
+
<slot />
|
|
46
|
+
</ArkAccordion.Root>
|
|
47
|
+
</template>
|
|
48
|
+
|
|
49
|
+
<style scoped>
|
|
50
|
+
@keyframes accordion-down {
|
|
51
|
+
from {
|
|
52
|
+
height: 0;
|
|
53
|
+
opacity: 0.01;
|
|
54
|
+
}
|
|
55
|
+
to {
|
|
56
|
+
height: var(--height);
|
|
57
|
+
opacity: 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@keyframes accordion-up {
|
|
62
|
+
from {
|
|
63
|
+
height: var(--height);
|
|
64
|
+
opacity: 1;
|
|
65
|
+
}
|
|
66
|
+
to {
|
|
67
|
+
height: 0;
|
|
68
|
+
opacity: 0.01;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
</style>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { Accordion as ArkAccordion } from "@ark-ui/vue/accordion";
|
|
3
|
+
import { accordionItemProps } from "./AccordionItem.props";
|
|
4
|
+
import {
|
|
5
|
+
accordionContentClass,
|
|
6
|
+
accordionIndicatorClass,
|
|
7
|
+
accordionItemClass,
|
|
8
|
+
accordionPanelClass,
|
|
9
|
+
accordionTitleClass,
|
|
10
|
+
accordionTriggerClass,
|
|
11
|
+
} from "./Accordion.variants";
|
|
12
|
+
|
|
13
|
+
const props = defineProps(accordionItemProps);
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<ArkAccordion.Item :value="props.value" :disabled="props.disabled" :class="accordionItemClass">
|
|
18
|
+
<ArkAccordion.ItemTrigger :class="accordionTriggerClass">
|
|
19
|
+
<slot name="title">
|
|
20
|
+
<span :class="accordionTitleClass">{{ props.title }}</span>
|
|
21
|
+
</slot>
|
|
22
|
+
<ArkAccordion.ItemIndicator :class="accordionIndicatorClass">
|
|
23
|
+
<svg viewBox="0 0 20 20" fill="none" class="size-full" aria-hidden="true">
|
|
24
|
+
<path
|
|
25
|
+
d="m5 7.5 5 5 5-5"
|
|
26
|
+
stroke="currentColor"
|
|
27
|
+
stroke-width="1.75"
|
|
28
|
+
stroke-linecap="round"
|
|
29
|
+
stroke-linejoin="round"
|
|
30
|
+
/>
|
|
31
|
+
</svg>
|
|
32
|
+
</ArkAccordion.ItemIndicator>
|
|
33
|
+
</ArkAccordion.ItemTrigger>
|
|
34
|
+
<ArkAccordion.ItemContent :class="accordionContentClass">
|
|
35
|
+
<div :class="accordionPanelClass">
|
|
36
|
+
<slot />
|
|
37
|
+
</div>
|
|
38
|
+
</ArkAccordion.ItemContent>
|
|
39
|
+
</ArkAccordion.Item>
|
|
40
|
+
</template>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PropType } from "vue";
|
|
2
|
+
import type { BadgeSize, BadgeTone, BadgeVariant } from "./Badge.types";
|
|
3
|
+
|
|
4
|
+
export const badgeProps = {
|
|
5
|
+
tone: {
|
|
6
|
+
type: String as PropType<BadgeTone>,
|
|
7
|
+
default: "neutral",
|
|
8
|
+
},
|
|
9
|
+
variant: {
|
|
10
|
+
type: String as PropType<BadgeVariant>,
|
|
11
|
+
default: "soft",
|
|
12
|
+
},
|
|
13
|
+
size: {
|
|
14
|
+
type: String as PropType<BadgeSize>,
|
|
15
|
+
default: "sm",
|
|
16
|
+
},
|
|
17
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const badgeToneValues = [
|
|
2
|
+
"neutral",
|
|
3
|
+
"primary",
|
|
4
|
+
"secondary",
|
|
5
|
+
"accent",
|
|
6
|
+
"success",
|
|
7
|
+
"warning",
|
|
8
|
+
"critical",
|
|
9
|
+
] as const;
|
|
10
|
+
export const badgeVariantValues = ["soft", "solid", "outline"] as const;
|
|
11
|
+
export const badgeSizeValues = ["xs", "sm", "md"] as const;
|
|
12
|
+
|
|
13
|
+
export type BadgeTone = (typeof badgeToneValues)[number];
|
|
14
|
+
export type BadgeVariant = (typeof badgeVariantValues)[number];
|
|
15
|
+
export type BadgeSize = (typeof badgeSizeValues)[number];
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { BadgeSize, BadgeTone, BadgeVariant } from "./Badge.types";
|
|
2
|
+
|
|
3
|
+
export const badgeBaseClass =
|
|
4
|
+
"inline-flex items-center gap-1 rounded-full border font-medium tracking-[0.02em]";
|
|
5
|
+
|
|
6
|
+
export const badgeSizeClasses: Record<BadgeSize, string> = {
|
|
7
|
+
xs: "px-2 py-0.5 text-[11px]",
|
|
8
|
+
sm: "px-2.5 py-0.5 text-xs",
|
|
9
|
+
md: "px-3 py-1 text-sm",
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const badgeToneVariantClasses: Record<BadgeTone, Record<BadgeVariant, string>> = {
|
|
13
|
+
neutral: {
|
|
14
|
+
soft: "border-[var(--ui-border)] bg-[var(--ui-tonal-secondary)] text-[var(--ui-fg)]",
|
|
15
|
+
solid: "border-transparent bg-[var(--ui-fg)] text-[var(--ui-bg)]",
|
|
16
|
+
outline: "border-[var(--ui-border)] bg-transparent text-[var(--ui-fg)]",
|
|
17
|
+
},
|
|
18
|
+
primary: {
|
|
19
|
+
soft: "border-[var(--ui-primary-muted)] bg-[var(--ui-primary-muted)] text-[var(--ui-primary)]",
|
|
20
|
+
solid: "border-transparent bg-[var(--ui-primary)] text-[var(--ui-on-primary)]",
|
|
21
|
+
outline: "border-[var(--ui-primary)] bg-transparent text-[var(--ui-primary)]",
|
|
22
|
+
},
|
|
23
|
+
secondary: {
|
|
24
|
+
soft: "border-[var(--ui-secondary-muted)] bg-[var(--ui-secondary-muted)] text-[var(--ui-secondary)]",
|
|
25
|
+
solid: "border-transparent bg-[var(--ui-secondary)] text-[var(--ui-on-secondary)]",
|
|
26
|
+
outline: "border-[var(--ui-secondary)] bg-transparent text-[var(--ui-secondary)]",
|
|
27
|
+
},
|
|
28
|
+
accent: {
|
|
29
|
+
soft: "border-[var(--ui-accent-muted)] bg-[var(--ui-accent-muted)] text-[var(--ui-accent)]",
|
|
30
|
+
solid: "border-transparent bg-[var(--ui-accent)] text-[var(--ui-on-accent)]",
|
|
31
|
+
outline: "border-[var(--ui-accent)] bg-transparent text-[var(--ui-accent)]",
|
|
32
|
+
},
|
|
33
|
+
success: {
|
|
34
|
+
soft: "border-[var(--ui-success-muted)] bg-[var(--ui-success-muted)] text-[var(--ui-success)]",
|
|
35
|
+
solid: "border-transparent bg-[var(--ui-success)] text-[var(--ui-on-success)]",
|
|
36
|
+
outline: "border-[var(--ui-success)] bg-transparent text-[var(--ui-success)]",
|
|
37
|
+
},
|
|
38
|
+
warning: {
|
|
39
|
+
soft: "border-[var(--ui-warning-muted)] bg-[var(--ui-warning-muted)] text-[var(--ui-warning)]",
|
|
40
|
+
solid: "border-transparent bg-[var(--ui-warning)] text-[var(--ui-on-warning)]",
|
|
41
|
+
outline: "border-[var(--ui-warning)] bg-transparent text-[var(--ui-warning)]",
|
|
42
|
+
},
|
|
43
|
+
critical: {
|
|
44
|
+
soft: "border-[var(--ui-critical-muted)] bg-[var(--ui-critical-muted)] text-[var(--ui-critical)]",
|
|
45
|
+
solid: "border-transparent bg-[var(--ui-critical)] text-[var(--ui-on-critical)]",
|
|
46
|
+
outline: "border-[var(--ui-critical)] bg-transparent text-[var(--ui-critical)]",
|
|
47
|
+
},
|
|
48
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, normalizeClass, useAttrs } from "vue";
|
|
3
|
+
import { twMerge } from "tailwind-merge";
|
|
4
|
+
import { badgeProps } from "./Badge.props";
|
|
5
|
+
import { badgeBaseClass, badgeSizeClasses, badgeToneVariantClasses } from "./Badge.variants";
|
|
6
|
+
|
|
7
|
+
defineOptions({ inheritAttrs: false });
|
|
8
|
+
|
|
9
|
+
const attrs = useAttrs();
|
|
10
|
+
const props = defineProps(badgeProps);
|
|
11
|
+
|
|
12
|
+
const classes = computed(() =>
|
|
13
|
+
twMerge(
|
|
14
|
+
badgeBaseClass,
|
|
15
|
+
badgeSizeClasses[props.size],
|
|
16
|
+
badgeToneVariantClasses[props.tone][props.variant],
|
|
17
|
+
normalizeClass(attrs.class),
|
|
18
|
+
),
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
const badgeAttrs = computed(() => {
|
|
22
|
+
const { class: _class, ...rest } = attrs;
|
|
23
|
+
return rest;
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<template>
|
|
28
|
+
<span :class="classes" v-bind="badgeAttrs">
|
|
29
|
+
<slot />
|
|
30
|
+
</span>
|
|
31
|
+
</template>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PropType } from "vue";
|
|
2
|
+
import type { ButtonElement, ButtonNativeType, ButtonSize, ButtonVariant } from "./Button.types";
|
|
3
|
+
|
|
4
|
+
export const buttonProps = {
|
|
5
|
+
as: {
|
|
6
|
+
type: String as PropType<ButtonElement>,
|
|
7
|
+
default: "button",
|
|
8
|
+
},
|
|
9
|
+
variant: {
|
|
10
|
+
type: String as PropType<ButtonVariant>,
|
|
11
|
+
default: "primary",
|
|
12
|
+
},
|
|
13
|
+
size: {
|
|
14
|
+
type: String as PropType<ButtonSize>,
|
|
15
|
+
default: "md",
|
|
16
|
+
},
|
|
17
|
+
type: {
|
|
18
|
+
type: String as PropType<ButtonNativeType>,
|
|
19
|
+
default: "button",
|
|
20
|
+
},
|
|
21
|
+
disabled: {
|
|
22
|
+
type: Boolean,
|
|
23
|
+
default: false,
|
|
24
|
+
},
|
|
25
|
+
loading: {
|
|
26
|
+
type: Boolean,
|
|
27
|
+
default: false,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Button
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Primary interactive action primitive for `ternent-ui` v2.
|
|
6
|
+
Use it for clicks, submissions, and lightweight link-style actions that still need the shared system silhouette.
|
|
7
|
+
|
|
8
|
+
## Category
|
|
9
|
+
|
|
10
|
+
Primitive
|
|
11
|
+
|
|
12
|
+
## Anatomy
|
|
13
|
+
|
|
14
|
+
- root element
|
|
15
|
+
- optional `leading` slot
|
|
16
|
+
- default label slot
|
|
17
|
+
- optional `trailing` slot
|
|
18
|
+
- optional loading spinner in the leading position
|
|
19
|
+
|
|
20
|
+
## Public API
|
|
21
|
+
|
|
22
|
+
Props:
|
|
23
|
+
|
|
24
|
+
- `as`: `"button" | "a" | "RouterLink"`; defaults to `"button"`
|
|
25
|
+
- `variant`: `primary | secondary | tertiary | critical | plain-primary | plain-secondary | critical-secondary`
|
|
26
|
+
- `size`: `micro | xs | sm | md | lg | xl`
|
|
27
|
+
- `type`: `button | submit | reset`; only applied when `as="button"`
|
|
28
|
+
- `disabled`: boolean
|
|
29
|
+
- `loading`: boolean
|
|
30
|
+
|
|
31
|
+
Slots:
|
|
32
|
+
|
|
33
|
+
- default: button label or content
|
|
34
|
+
- `leading`: leading icon or adornment
|
|
35
|
+
- `trailing`: trailing icon or adornment
|
|
36
|
+
|
|
37
|
+
Events:
|
|
38
|
+
|
|
39
|
+
- `click`: emitted when the control is activated and not inactive
|
|
40
|
+
|
|
41
|
+
## API decisions
|
|
42
|
+
|
|
43
|
+
- The current variant vocabulary is preserved intentionally because it already exists in the v2 seed and maps cleanly to the current token contract.
|
|
44
|
+
- The current six-step size scale is preserved intentionally because the repo already uses it in legacy button work and supporting design-system utilities.
|
|
45
|
+
- Polymorphism is deliberately restrained to `button`, `a`, and `RouterLink`.
|
|
46
|
+
- Link-like behavior should use `as="a"` with standard anchor attrs or `as="RouterLink"` with a `to` attr passed through from the app.
|
|
47
|
+
|
|
48
|
+
## Variants
|
|
49
|
+
|
|
50
|
+
- `primary`: main call to action
|
|
51
|
+
- `secondary`: neutral tonal emphasis
|
|
52
|
+
- `tertiary`: lighter tonal action
|
|
53
|
+
- `critical`: destructive primary action
|
|
54
|
+
- `plain-primary`: low-emphasis primary text action
|
|
55
|
+
- `plain-secondary`: low-emphasis neutral text action
|
|
56
|
+
- `critical-secondary`: outlined destructive secondary action
|
|
57
|
+
|
|
58
|
+
## Sizes
|
|
59
|
+
|
|
60
|
+
- `micro`: densest utility button
|
|
61
|
+
- `xs`: compact action
|
|
62
|
+
- `sm`: small control
|
|
63
|
+
- `md`: default control
|
|
64
|
+
- `lg`: emphasized action
|
|
65
|
+
- `xl`: largest standard action
|
|
66
|
+
|
|
67
|
+
## States
|
|
68
|
+
|
|
69
|
+
- default
|
|
70
|
+
- hover
|
|
71
|
+
- active
|
|
72
|
+
- focus-visible
|
|
73
|
+
- disabled
|
|
74
|
+
- loading
|
|
75
|
+
|
|
76
|
+
Notes:
|
|
77
|
+
|
|
78
|
+
- `loading` and `disabled` both make the control inactive.
|
|
79
|
+
- When `as="a"`, inactive state is enforced with `aria-disabled`, `tabindex="-1"`, and click prevention.
|
|
80
|
+
|
|
81
|
+
## Accessibility
|
|
82
|
+
|
|
83
|
+
- Native `<button>` semantics are used by default.
|
|
84
|
+
- Native `<a>` semantics are preserved when `as="a"`.
|
|
85
|
+
- `RouterLink` is treated as non-button navigation and receives the same inactive protection as anchor-like usage.
|
|
86
|
+
- Focus-visible treatment uses the shared `--ui-ring` token.
|
|
87
|
+
- Loading state exposes `aria-busy="true"`.
|
|
88
|
+
- Icon-only usage must still provide an accessible name via visible text, `aria-label`, or equivalent attrs.
|
|
89
|
+
|
|
90
|
+
## Token usage
|
|
91
|
+
|
|
92
|
+
The primitive uses only the current `--ui-*` contract:
|
|
93
|
+
|
|
94
|
+
- primary and critical action tokens
|
|
95
|
+
- tonal surface tokens
|
|
96
|
+
- ring token
|
|
97
|
+
- radius token
|
|
98
|
+
- shadow tokens
|
|
99
|
+
- duration and easing tokens
|
|
100
|
+
- interaction motion tokens
|
|
101
|
+
|
|
102
|
+
## Examples
|
|
103
|
+
|
|
104
|
+
```vue
|
|
105
|
+
<Button>Save changes</Button>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
```vue
|
|
109
|
+
<Button variant="critical" type="submit">
|
|
110
|
+
Delete record
|
|
111
|
+
</Button>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```vue
|
|
115
|
+
<Button as="a" href="/settings" variant="plain-secondary">
|
|
116
|
+
Open settings
|
|
117
|
+
</Button>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```vue
|
|
121
|
+
<Button as="RouterLink" to="/app">
|
|
122
|
+
Open app
|
|
123
|
+
</Button>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```vue
|
|
127
|
+
<Button loading>
|
|
128
|
+
Saving
|
|
129
|
+
</Button>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```vue
|
|
133
|
+
<Button variant="secondary">
|
|
134
|
+
<template #leading>
|
|
135
|
+
<IconSearch />
|
|
136
|
+
</template>
|
|
137
|
+
Search
|
|
138
|
+
</Button>
|
|
139
|
+
```
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const buttonVariantValues = [
|
|
2
|
+
"primary",
|
|
3
|
+
"accent",
|
|
4
|
+
"secondary",
|
|
5
|
+
"tertiary",
|
|
6
|
+
"critical",
|
|
7
|
+
"plain-primary",
|
|
8
|
+
"plain-secondary",
|
|
9
|
+
"critical-secondary",
|
|
10
|
+
] as const;
|
|
11
|
+
|
|
12
|
+
export const buttonSizeValues = ["micro", "xs", "sm", "md", "lg", "xl", "hero"] as const;
|
|
13
|
+
export const buttonElementValues = ["button", "a", "RouterLink"] as const;
|
|
14
|
+
export const buttonTypeValues = ["button", "submit", "reset"] as const;
|
|
15
|
+
|
|
16
|
+
export type ButtonVariant = (typeof buttonVariantValues)[number];
|
|
17
|
+
export type ButtonSize = (typeof buttonSizeValues)[number];
|
|
18
|
+
export type ButtonElement = (typeof buttonElementValues)[number];
|
|
19
|
+
export type ButtonNativeType = (typeof buttonTypeValues)[number];
|