@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.
Files changed (313) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +17 -0
  3. package/.github/workflows/deploy-armour.yml +42 -0
  4. package/.github/workflows/deploy-identity.yml +42 -0
  5. package/.github/workflows/deploy-seal.yml +42 -0
  6. package/.github/workflows/deploy-ui.yml +42 -0
  7. package/.github/workflows/deploy-utils.yml +42 -0
  8. package/.github/workflows/release-create.yml +59 -0
  9. package/.github/workflows/release-publish.yml +54 -0
  10. package/.nvmrc +1 -0
  11. package/.ops/publish.mjs +31 -0
  12. package/package.json +16 -0
  13. package/packages/README.md +0 -0
  14. package/packages/armour/CHANGELOG.md +66 -0
  15. package/packages/armour/CLAUDE.md +8 -0
  16. package/packages/armour/README.md +103 -0
  17. package/packages/armour/SPEC.md +92 -0
  18. package/packages/armour/package.json +45 -0
  19. package/packages/armour/src/constants.ts +5 -0
  20. package/packages/armour/src/deps.d.ts +56 -0
  21. package/packages/armour/src/errors.ts +172 -0
  22. package/packages/armour/src/files.ts +73 -0
  23. package/packages/armour/src/identity.ts +72 -0
  24. package/packages/armour/src/index.ts +56 -0
  25. package/packages/armour/src/init.ts +10 -0
  26. package/packages/armour/src/passphrase.ts +33 -0
  27. package/packages/armour/src/recipients.ts +73 -0
  28. package/packages/armour/src/text.ts +68 -0
  29. package/packages/armour/src/types.ts +93 -0
  30. package/packages/armour/test/armour.test.ts +270 -0
  31. package/packages/armour/tsconfig.build.json +12 -0
  32. package/packages/armour/tsconfig.json +12 -0
  33. package/packages/armour/vite.config.ts +29 -0
  34. package/packages/concord/CHANGELOG.md +83 -0
  35. package/packages/concord/CLAUDE.md +9 -0
  36. package/packages/concord/README.md +146 -0
  37. package/packages/concord/SPEC.md +287 -0
  38. package/packages/concord/package.json +51 -0
  39. package/packages/concord/src/app.ts +717 -0
  40. package/packages/concord/src/errors.ts +9 -0
  41. package/packages/concord/src/index.ts +20 -0
  42. package/packages/concord/src/types.ts +127 -0
  43. package/packages/concord/test/concord.test.ts +978 -0
  44. package/packages/concord/tsconfig.json +12 -0
  45. package/packages/concord/vite.browser.config.ts +27 -0
  46. package/packages/concord/vite.config.ts +35 -0
  47. package/packages/concord/vite.config.ts.timestamp-1774262297922-ffd76e35ea668.mjs +83 -0
  48. package/packages/identity/CHANGELOG.md +47 -0
  49. package/packages/identity/README.md +236 -0
  50. package/packages/identity/package.json +41 -0
  51. package/packages/identity/src/index.ts +538 -0
  52. package/packages/identity/test/identity.test.ts +172 -0
  53. package/packages/identity/tsconfig.build.json +12 -0
  54. package/packages/identity/vite.config.ts +17 -0
  55. package/packages/ledger/CHANGELOG.md +69 -0
  56. package/packages/ledger/CLAUDE.md +9 -0
  57. package/packages/ledger/SPEC.md +304 -0
  58. package/packages/ledger/package.json +48 -0
  59. package/packages/ledger/src/index.ts +2 -0
  60. package/packages/ledger/src/ledger.ts +1286 -0
  61. package/packages/ledger/src/seal-cli.d.ts +25 -0
  62. package/packages/ledger/src/types.ts +294 -0
  63. package/packages/ledger/test/ledger.test.ts +838 -0
  64. package/packages/ledger/tsconfig.json +12 -0
  65. package/packages/ledger/vite.browser.config.ts +27 -0
  66. package/packages/ledger/vite.config.ts +39 -0
  67. package/packages/seal/CHANGELOG.md +137 -0
  68. package/packages/seal/CLAUDE.md +8 -0
  69. package/packages/seal/README.md +258 -0
  70. package/packages/seal/bin/seal +6 -0
  71. package/packages/seal/package.json +59 -0
  72. package/packages/seal/src/artifact.ts +380 -0
  73. package/packages/seal/src/cli.ts +372 -0
  74. package/packages/seal/src/commands/identity.ts +52 -0
  75. package/packages/seal/src/commands/manifest.ts +71 -0
  76. package/packages/seal/src/commands/publicKey.ts +7 -0
  77. package/packages/seal/src/commands/sign.ts +56 -0
  78. package/packages/seal/src/commands/verify.ts +54 -0
  79. package/packages/seal/src/crypto.ts +85 -0
  80. package/packages/seal/src/errors.ts +88 -0
  81. package/packages/seal/src/index.ts +5 -0
  82. package/packages/seal/src/manifest.ts +114 -0
  83. package/packages/seal/src/node.ts +18 -0
  84. package/packages/seal/src/proof.ts +344 -0
  85. package/packages/seal/test/artifact.test.ts +86 -0
  86. package/packages/seal/test/cli.test.ts +208 -0
  87. package/packages/seal/test/crypto.test.ts +21 -0
  88. package/packages/seal/test/manifest.test.ts +32 -0
  89. package/packages/seal/test/proof.test.ts +60 -0
  90. package/packages/seal/tsconfig.json +12 -0
  91. package/packages/seal/vite.config.ts +54 -0
  92. package/packages/ui/CHANGELOG.md +393 -0
  93. package/packages/ui/README.md +57 -0
  94. package/packages/ui/jsconfig.json +19 -0
  95. package/packages/ui/package.json +64 -0
  96. package/packages/ui/scripts/check-tokens.js +56 -0
  97. package/packages/ui/scripts/generate-theme-css.mjs +85 -0
  98. package/packages/ui/src/design-system/base.css +8 -0
  99. package/packages/ui/src/design-system/docs/ACCESSIBILITY_RULES.md +186 -0
  100. package/packages/ui/src/design-system/docs/AI_SYSTEM.md +281 -0
  101. package/packages/ui/src/design-system/docs/PATTERN_RULES.md +83 -0
  102. package/packages/ui/src/design-system/docs/PRIMITIVE_RULES.md +258 -0
  103. package/packages/ui/src/design-system/docs/TOKEN_RULES.md +235 -0
  104. package/packages/ui/src/design-system/docs/VISUAL_DIRECTION.md +68 -0
  105. package/packages/ui/src/design-system/foundation.js +420 -0
  106. package/packages/ui/src/design-system/tokens.css +140 -0
  107. package/packages/ui/src/design-system/tokens.js +327 -0
  108. package/packages/ui/src/design-system/utils.js +246 -0
  109. package/packages/ui/src/main.js +4 -0
  110. package/packages/ui/src/patterns/FeatureCard/FeatureCard.spec.md +24 -0
  111. package/packages/ui/src/patterns/FeatureCard/FeatureCard.types.ts +8 -0
  112. package/packages/ui/src/patterns/FeatureCard/FeatureCard.vue +175 -0
  113. package/packages/ui/src/patterns/FormField/FormField.spec.md +65 -0
  114. package/packages/ui/src/patterns/FormField/FormField.types.ts +11 -0
  115. package/packages/ui/src/patterns/FormField/FormField.vue +87 -0
  116. package/packages/ui/src/patterns/IdentityGlyph/IdentityGlyph.vue +61 -0
  117. package/packages/ui/src/patterns/IdentityGlyph/IdentityHandle.vue +58 -0
  118. package/packages/ui/src/patterns/IdentityGlyph/identityGlyph.types.ts +36 -0
  119. package/packages/ui/src/patterns/IdentityGlyph/identityGlyph.utils.ts +585 -0
  120. package/packages/ui/src/patterns/IdentityGlyph/index.ts +5 -0
  121. package/packages/ui/src/patterns/KeyValueList/KeyValueList.spec.md +28 -0
  122. package/packages/ui/src/patterns/KeyValueList/KeyValueList.types.ts +16 -0
  123. package/packages/ui/src/patterns/KeyValueList/KeyValueList.vue +50 -0
  124. package/packages/ui/src/patterns/LandingPage/LandingIcon.vue +90 -0
  125. package/packages/ui/src/patterns/LandingPage/LandingPage.spec.md +24 -0
  126. package/packages/ui/src/patterns/LandingPage/LandingPage.types.ts +212 -0
  127. package/packages/ui/src/patterns/LandingPage/LandingPage.vue +599 -0
  128. package/packages/ui/src/patterns/ListWorkspaceLayout/ListWorkspaceLayout.test.ts +33 -0
  129. package/packages/ui/src/patterns/ListWorkspaceLayout/ListWorkspaceLayout.vue +44 -0
  130. package/packages/ui/src/patterns/Logo/Logo.spec.md +22 -0
  131. package/packages/ui/src/patterns/Logo/Logo.vue +160 -0
  132. package/packages/ui/src/patterns/PageSurface/PageSurface.spec.md +15 -0
  133. package/packages/ui/src/patterns/PageSurface/PageSurface.vue +85 -0
  134. package/packages/ui/src/patterns/PanelChrome/PanelChrome.spec.md +39 -0
  135. package/packages/ui/src/patterns/PanelChrome/PanelChrome.types.ts +1 -0
  136. package/packages/ui/src/patterns/PanelChrome/PanelChrome.vue +187 -0
  137. package/packages/ui/src/patterns/PreviewPanel/PreviewPanel.spec.md +31 -0
  138. package/packages/ui/src/patterns/PreviewPanel/PreviewPanel.types.ts +23 -0
  139. package/packages/ui/src/patterns/PreviewPanel/PreviewPanel.vue +354 -0
  140. package/packages/ui/src/patterns/RecordList/RecordList.spec.md +35 -0
  141. package/packages/ui/src/patterns/RecordList/RecordList.test.ts +42 -0
  142. package/packages/ui/src/patterns/RecordList/RecordList.types.ts +9 -0
  143. package/packages/ui/src/patterns/RecordList/RecordList.utils.ts +5 -0
  144. package/packages/ui/src/patterns/RecordList/RecordList.vue +134 -0
  145. package/packages/ui/src/patterns/SectionClarifier/SectionClarifier.vue +85 -0
  146. package/packages/ui/src/patterns/SectionIntro/SectionIntro.spec.md +25 -0
  147. package/packages/ui/src/patterns/SectionIntro/SectionIntro.types.ts +7 -0
  148. package/packages/ui/src/patterns/SectionIntro/SectionIntro.vue +141 -0
  149. package/packages/ui/src/patterns/SidebarNav/SidebarNav.spec.md +34 -0
  150. package/packages/ui/src/patterns/SidebarNav/SidebarNav.types.ts +17 -0
  151. package/packages/ui/src/patterns/SidebarNav/SidebarNav.vue +110 -0
  152. package/packages/ui/src/patterns/SplitView/SplitView.spec.md +28 -0
  153. package/packages/ui/src/patterns/SplitView/SplitView.test.ts +22 -0
  154. package/packages/ui/src/patterns/SplitView/SplitView.types.ts +3 -0
  155. package/packages/ui/src/patterns/SplitView/SplitView.utils.ts +13 -0
  156. package/packages/ui/src/patterns/SplitView/SplitView.vue +39 -0
  157. package/packages/ui/src/patterns/StepList/StepList.spec.md +15 -0
  158. package/packages/ui/src/patterns/StepList/StepList.types.ts +4 -0
  159. package/packages/ui/src/patterns/StepList/StepList.vue +91 -0
  160. package/packages/ui/src/patterns/Verification/VerificationBadge.vue +97 -0
  161. package/packages/ui/src/patterns/Verification/VerificationComponents.test.ts +153 -0
  162. package/packages/ui/src/patterns/Verification/VerificationDetailsPanel.vue +270 -0
  163. package/packages/ui/src/patterns/Verification/VerificationSummary.vue +171 -0
  164. package/packages/ui/src/patterns/Verification/index.ts +6 -0
  165. package/packages/ui/src/patterns/Verification/verification.types.ts +8 -0
  166. package/packages/ui/src/patterns/Verification/verification.utils.test.ts +37 -0
  167. package/packages/ui/src/patterns/Verification/verification.utils.ts +75 -0
  168. package/packages/ui/src/patterns/index.ts +25 -0
  169. package/packages/ui/src/primitives/Accordian/Accordian.vue +11 -0
  170. package/packages/ui/src/primitives/Accordian/AccordianItem.vue +14 -0
  171. package/packages/ui/src/primitives/Accordion/Accordion.props.ts +21 -0
  172. package/packages/ui/src/primitives/Accordion/Accordion.spec.md +50 -0
  173. package/packages/ui/src/primitives/Accordion/Accordion.types.ts +4 -0
  174. package/packages/ui/src/primitives/Accordion/Accordion.variants.ts +12 -0
  175. package/packages/ui/src/primitives/Accordion/Accordion.vue +71 -0
  176. package/packages/ui/src/primitives/Accordion/AccordionItem.props.ts +14 -0
  177. package/packages/ui/src/primitives/Accordion/AccordionItem.vue +40 -0
  178. package/packages/ui/src/primitives/Badge/Badge.props.ts +17 -0
  179. package/packages/ui/src/primitives/Badge/Badge.spec.md +17 -0
  180. package/packages/ui/src/primitives/Badge/Badge.types.ts +15 -0
  181. package/packages/ui/src/primitives/Badge/Badge.variants.ts +48 -0
  182. package/packages/ui/src/primitives/Badge/Badge.vue +31 -0
  183. package/packages/ui/src/primitives/Button/Button.props.ts +29 -0
  184. package/packages/ui/src/primitives/Button/Button.spec.md +139 -0
  185. package/packages/ui/src/primitives/Button/Button.types.ts +19 -0
  186. package/packages/ui/src/primitives/Button/Button.variants.ts +72 -0
  187. package/packages/ui/src/primitives/Button/Button.vue +90 -0
  188. package/packages/ui/src/primitives/Card/Card.props.ts +17 -0
  189. package/packages/ui/src/primitives/Card/Card.spec.md +29 -0
  190. package/packages/ui/src/primitives/Card/Card.types.ts +12 -0
  191. package/packages/ui/src/primitives/Card/Card.variants.ts +27 -0
  192. package/packages/ui/src/primitives/Card/Card.vue +37 -0
  193. package/packages/ui/src/primitives/Checkbox/Checkbox.props.ts +21 -0
  194. package/packages/ui/src/primitives/Checkbox/Checkbox.spec.md +51 -0
  195. package/packages/ui/src/primitives/Checkbox/Checkbox.types.ts +4 -0
  196. package/packages/ui/src/primitives/Checkbox/Checkbox.variants.ts +34 -0
  197. package/packages/ui/src/primitives/Checkbox/Checkbox.vue +92 -0
  198. package/packages/ui/src/primitives/Dialog/Dialog.props.ts +29 -0
  199. package/packages/ui/src/primitives/Dialog/Dialog.spec.md +52 -0
  200. package/packages/ui/src/primitives/Dialog/Dialog.types.ts +3 -0
  201. package/packages/ui/src/primitives/Dialog/Dialog.variants.ts +27 -0
  202. package/packages/ui/src/primitives/Dialog/Dialog.vue +78 -0
  203. package/packages/ui/src/primitives/Drawer/Drawer.props.ts +33 -0
  204. package/packages/ui/src/primitives/Drawer/Drawer.spec.md +50 -0
  205. package/packages/ui/src/primitives/Drawer/Drawer.types.ts +5 -0
  206. package/packages/ui/src/primitives/Drawer/Drawer.variants.ts +35 -0
  207. package/packages/ui/src/primitives/Drawer/Drawer.vue +88 -0
  208. package/packages/ui/src/primitives/FieldMessage/FieldMessage.props.ts +17 -0
  209. package/packages/ui/src/primitives/FieldMessage/FieldMessage.spec.md +35 -0
  210. package/packages/ui/src/primitives/FieldMessage/FieldMessage.types.ts +5 -0
  211. package/packages/ui/src/primitives/FieldMessage/FieldMessage.variants.ts +14 -0
  212. package/packages/ui/src/primitives/FieldMessage/FieldMessage.vue +40 -0
  213. package/packages/ui/src/primitives/FileInput/FileInput.props.ts +41 -0
  214. package/packages/ui/src/primitives/FileInput/FileInput.types.ts +6 -0
  215. package/packages/ui/src/primitives/FileInput/FileInput.variants.ts +46 -0
  216. package/packages/ui/src/primitives/FileInput/FileInput.vue +163 -0
  217. package/packages/ui/src/primitives/Input/Input.props.ts +29 -0
  218. package/packages/ui/src/primitives/Input/Input.spec.md +79 -0
  219. package/packages/ui/src/primitives/Input/Input.types.ts +13 -0
  220. package/packages/ui/src/primitives/Input/Input.variants.ts +54 -0
  221. package/packages/ui/src/primitives/Input/Input.vue +99 -0
  222. package/packages/ui/src/primitives/Label/Label.props.ts +25 -0
  223. package/packages/ui/src/primitives/Label/Label.spec.md +31 -0
  224. package/packages/ui/src/primitives/Label/Label.types.ts +3 -0
  225. package/packages/ui/src/primitives/Label/Label.variants.ts +17 -0
  226. package/packages/ui/src/primitives/Label/Label.vue +38 -0
  227. package/packages/ui/src/primitives/Menu/Menu.props.ts +17 -0
  228. package/packages/ui/src/primitives/Menu/Menu.spec.md +38 -0
  229. package/packages/ui/src/primitives/Menu/Menu.types.ts +10 -0
  230. package/packages/ui/src/primitives/Menu/Menu.variants.ts +10 -0
  231. package/packages/ui/src/primitives/Menu/Menu.vue +57 -0
  232. package/packages/ui/src/primitives/Popover/Popover.props.ts +25 -0
  233. package/packages/ui/src/primitives/Popover/Popover.spec.md +49 -0
  234. package/packages/ui/src/primitives/Popover/Popover.types.ts +3 -0
  235. package/packages/ui/src/primitives/Popover/Popover.variants.ts +18 -0
  236. package/packages/ui/src/primitives/Popover/Popover.vue +74 -0
  237. package/packages/ui/src/primitives/RadioGroup/RadioGroup.props.ts +29 -0
  238. package/packages/ui/src/primitives/RadioGroup/RadioGroup.spec.md +50 -0
  239. package/packages/ui/src/primitives/RadioGroup/RadioGroup.types.ts +12 -0
  240. package/packages/ui/src/primitives/RadioGroup/RadioGroup.variants.ts +48 -0
  241. package/packages/ui/src/primitives/RadioGroup/RadioGroup.vue +87 -0
  242. package/packages/ui/src/primitives/Separator/Separator.props.ts +9 -0
  243. package/packages/ui/src/primitives/Separator/Separator.spec.md +15 -0
  244. package/packages/ui/src/primitives/Separator/Separator.types.ts +3 -0
  245. package/packages/ui/src/primitives/Separator/Separator.variants.ts +8 -0
  246. package/packages/ui/src/primitives/Separator/Separator.vue +23 -0
  247. package/packages/ui/src/primitives/Skeleton/Skeleton.props.ts +21 -0
  248. package/packages/ui/src/primitives/Skeleton/Skeleton.spec.md +18 -0
  249. package/packages/ui/src/primitives/Skeleton/Skeleton.types.ts +5 -0
  250. package/packages/ui/src/primitives/Skeleton/Skeleton.variants.ts +18 -0
  251. package/packages/ui/src/primitives/Skeleton/Skeleton.vue +37 -0
  252. package/packages/ui/src/primitives/Spinner/Spinner.props.ts +13 -0
  253. package/packages/ui/src/primitives/Spinner/Spinner.spec.md +16 -0
  254. package/packages/ui/src/primitives/Spinner/Spinner.types.ts +5 -0
  255. package/packages/ui/src/primitives/Spinner/Spinner.variants.ts +15 -0
  256. package/packages/ui/src/primitives/Spinner/Spinner.vue +33 -0
  257. package/packages/ui/src/primitives/SplitButton/SplitButton.vue +108 -0
  258. package/packages/ui/src/primitives/Switch/Switch.props.ts +21 -0
  259. package/packages/ui/src/primitives/Switch/Switch.spec.md +49 -0
  260. package/packages/ui/src/primitives/Switch/Switch.types.ts +3 -0
  261. package/packages/ui/src/primitives/Switch/Switch.variants.ts +34 -0
  262. package/packages/ui/src/primitives/Switch/Switch.vue +71 -0
  263. package/packages/ui/src/primitives/Tabs/Tabs.props.ts +25 -0
  264. package/packages/ui/src/primitives/Tabs/Tabs.spec.md +48 -0
  265. package/packages/ui/src/primitives/Tabs/Tabs.types.ts +11 -0
  266. package/packages/ui/src/primitives/Tabs/Tabs.variants.ts +28 -0
  267. package/packages/ui/src/primitives/Tabs/Tabs.vue +59 -0
  268. package/packages/ui/src/primitives/Textarea/Textarea.props.ts +33 -0
  269. package/packages/ui/src/primitives/Textarea/Textarea.spec.md +59 -0
  270. package/packages/ui/src/primitives/Textarea/Textarea.types.ts +5 -0
  271. package/packages/ui/src/primitives/Textarea/Textarea.variants.ts +27 -0
  272. package/packages/ui/src/primitives/Textarea/Textarea.vue +74 -0
  273. package/packages/ui/src/primitives/Tooltip/Tooltip.props.ts +21 -0
  274. package/packages/ui/src/primitives/Tooltip/Tooltip.spec.md +45 -0
  275. package/packages/ui/src/primitives/Tooltip/Tooltip.types.ts +3 -0
  276. package/packages/ui/src/primitives/Tooltip/Tooltip.variants.ts +4 -0
  277. package/packages/ui/src/primitives/Tooltip/Tooltip.vue +31 -0
  278. package/packages/ui/src/primitives/TreeView/TreeView.types.ts +10 -0
  279. package/packages/ui/src/primitives/TreeView/TreeView.vue +113 -0
  280. package/packages/ui/src/primitives/TreeView/TreeViewNode.vue +190 -0
  281. package/packages/ui/src/primitives/index.ts +29 -0
  282. package/packages/ui/src/style.css +7 -0
  283. package/packages/ui/src/style.js +1 -0
  284. package/packages/ui/src/themes/armour.css +147 -0
  285. package/packages/ui/src/themes/aurora.css +147 -0
  286. package/packages/ui/src/themes/citrine-ash.css +147 -0
  287. package/packages/ui/src/themes/concord.css +147 -0
  288. package/packages/ui/src/themes/garnet-honey.css +147 -0
  289. package/packages/ui/src/themes/harbor-rose.css +147 -0
  290. package/packages/ui/src/themes/ledger.css +147 -0
  291. package/packages/ui/src/themes/neon-noir.css +74 -0
  292. package/packages/ui/src/themes/obsidian-iris.css +147 -0
  293. package/packages/ui/src/themes/pixpax.css +147 -0
  294. package/packages/ui/src/themes/print.css +147 -0
  295. package/packages/ui/src/themes/prism.css +147 -0
  296. package/packages/ui/src/themes/proof.css +145 -0
  297. package/packages/ui/src/themes/semanticThemeContract.js +2256 -0
  298. package/packages/ui/src/themes/spruce-ink.css +147 -0
  299. package/packages/ui/src/themes/sunset.css +147 -0
  300. package/packages/ui/tailwind.config.js +64 -0
  301. package/packages/ui/vite.config.js +35 -0
  302. package/packages/ui/vite.config.js.timestamp-1780697224943-89fbc929987bc.mjs +38 -0
  303. package/packages/utils/CHANGELOG.md +111 -0
  304. package/packages/utils/README.md +3 -0
  305. package/packages/utils/package.json +46 -0
  306. package/packages/utils/src/index.test.js +39 -0
  307. package/packages/utils/src/index.ts +289 -0
  308. package/packages/utils/tsconfig.build.json +12 -0
  309. package/packages/utils/vite.config.js +28 -0
  310. package/pnpm-workspace.yaml +8 -0
  311. package/scripts/vite/package-lib-config.ts +59 -0
  312. package/tsconfig.json +24 -0
  313. 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,11 @@
1
+ <script setup lang="ts">
2
+ import Accordion from "../Accordion/Accordion.vue";
3
+
4
+ defineOptions({ inheritAttrs: false });
5
+ </script>
6
+
7
+ <template>
8
+ <Accordion v-bind="$attrs">
9
+ <slot />
10
+ </Accordion>
11
+ </template>
@@ -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,4 @@
1
+ export const accordionValueModeValues = ["single", "multiple"] as const;
2
+
3
+ export type AccordionValueMode = (typeof accordionValueModeValues)[number];
4
+ export type AccordionValue = string | string[] | undefined;
@@ -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,14 @@
1
+ export const accordionItemProps = {
2
+ value: {
3
+ type: String,
4
+ required: true,
5
+ },
6
+ title: {
7
+ type: String,
8
+ default: undefined,
9
+ },
10
+ disabled: {
11
+ type: Boolean,
12
+ default: false,
13
+ },
14
+ };
@@ -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,17 @@
1
+ # Badge
2
+
3
+ ## Purpose
4
+
5
+ Compact status and metadata primitive.
6
+
7
+ ## Category
8
+
9
+ Primitive
10
+
11
+ ## Public API
12
+
13
+ Props:
14
+
15
+ - `tone`
16
+ - `variant`
17
+ - `size`
@@ -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];