@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,22 @@
1
+ # Logo
2
+
3
+ ## Purpose
4
+
5
+ Shared Ternent brand mark for product chrome, headers, and navigation.
6
+
7
+ ## Category
8
+
9
+ Pattern
10
+
11
+ ## Public API
12
+
13
+ Props:
14
+
15
+ - `decorative`
16
+ - `title`
17
+
18
+ Behavior:
19
+
20
+ - merges consumer classes so callers control rendered size
21
+ - uses per-instance SVG ids to avoid collisions when multiple logos render on one page
22
+ - uses `--ui-logo-start`, `--ui-logo-end`, and `--ui-logo-cutout` so the mark follows the active theme without overloading generic component colors
@@ -0,0 +1,160 @@
1
+ <script setup lang="ts">
2
+ import { computed, normalizeClass, useAttrs, useId } from "vue";
3
+ import { twMerge } from "tailwind-merge";
4
+
5
+ defineOptions({ inheritAttrs: false });
6
+
7
+ const props = withDefaults(
8
+ defineProps<{
9
+ decorative?: boolean;
10
+ title?: string;
11
+ }>(),
12
+ {
13
+ decorative: true,
14
+ title: "Ternent logo",
15
+ },
16
+ );
17
+
18
+ const attrs = useAttrs();
19
+ const instanceId = useId().replace(/:/g, "");
20
+
21
+ const classes = computed(() => twMerge("block h-auto w-12 shrink-0", normalizeClass(attrs.class)));
22
+
23
+ const forwardedAttrs = computed(() => {
24
+ const { class: _class, ...rest } = attrs;
25
+ return rest;
26
+ });
27
+
28
+ const ids = {
29
+ title: `ternent-logo-title-${instanceId}`,
30
+ topClip: `ternent-logo-top-clip-${instanceId}`,
31
+ topGradient: `ternent-logo-top-gradient-${instanceId}`,
32
+ rightClip: `ternent-logo-right-clip-${instanceId}`,
33
+ rightGradient: `ternent-logo-right-gradient-${instanceId}`,
34
+ frameClip: `ternent-logo-frame-clip-${instanceId}`,
35
+ innerFrameClip: `ternent-logo-inner-frame-clip-${instanceId}`,
36
+ frameGradient: `ternent-logo-frame-gradient-${instanceId}`,
37
+ bodyClip: `ternent-logo-body-clip-${instanceId}`,
38
+ } as const;
39
+ </script>
40
+
41
+ <template>
42
+ <svg
43
+ xmlns="http://www.w3.org/2000/svg"
44
+ xmlns:xlink="http://www.w3.org/1999/xlink"
45
+ viewBox="0 0 375 374.999991"
46
+ preserveAspectRatio="xMidYMid meet"
47
+ version="1.0"
48
+ :class="classes"
49
+ :role="props.decorative ? undefined : 'img'"
50
+ :aria-hidden="props.decorative ? 'true' : undefined"
51
+ :aria-labelledby="props.decorative ? undefined : ids.title"
52
+ focusable="false"
53
+ v-bind="forwardedAttrs"
54
+ >
55
+ <title v-if="!props.decorative" :id="ids.title">{{ props.title }}</title>
56
+ <defs>
57
+ <clipPath :id="ids.topClip">
58
+ <path
59
+ d="M 88.570312 12.242188 L 360.371094 12.242188 L 360.371094 281.835938 L 88.570312 281.835938 Z M 88.570312 12.242188 "
60
+ clip-rule="nonzero"
61
+ />
62
+ </clipPath>
63
+ <linearGradient
64
+ :id="ids.topGradient"
65
+ x1="-0.0000042293"
66
+ y1="0"
67
+ x2="255.999987"
68
+ y2="0"
69
+ gradientUnits="userSpaceOnUse"
70
+ gradientTransform="matrix(1.061725, 0, 0, 1.05311, 88.568506, 12.24124)"
71
+ >
72
+ <stop stop-opacity="1" stop-color="var(--ui-logo-start)" offset="0" />
73
+ <stop stop-opacity="1" stop-color="var(--ui-logo-end)" offset="1" />
74
+ </linearGradient>
75
+
76
+ <clipPath :id="ids.rightClip">
77
+ <path
78
+ d="M 12.242188 90.773438 L 284.042969 90.773438 L 284.042969 360.371094 L 12.242188 360.371094 Z M 12.242188 90.773438 "
79
+ clip-rule="nonzero"
80
+ />
81
+ </clipPath>
82
+ <linearGradient
83
+ :id="ids.rightGradient"
84
+ x1="-0.000000461562"
85
+ y1="0"
86
+ x2="255.999991"
87
+ y2="0"
88
+ gradientUnits="userSpaceOnUse"
89
+ gradientTransform="matrix(1.061725, 0, 0, 1.05311, 12.241246, 90.774018)"
90
+ >
91
+ <stop stop-opacity="1" stop-color="var(--ui-logo-start)" offset="0" />
92
+ <stop stop-opacity="1" stop-color="var(--ui-logo-end)" offset="1" />
93
+ </linearGradient>
94
+
95
+ <clipPath :id="ids.frameClip">
96
+ <path
97
+ d="M 12.242188 12.242188 L 360.371094 12.242188 L 360.371094 360.371094 L 12.242188 360.371094 Z M 12.242188 12.242188 "
98
+ clip-rule="nonzero"
99
+ />
100
+ </clipPath>
101
+ <clipPath :id="ids.innerFrameClip">
102
+ <path
103
+ d="M 66.636719 12.242188 L 305.976562 12.242188 C 336.015625 12.242188 360.371094 36.59375 360.371094 66.636719 L 360.371094 305.976562 C 360.371094 336.015625 336.015625 360.371094 305.976562 360.371094 L 66.636719 360.371094 C 36.59375 360.371094 12.242188 336.015625 12.242188 305.976562 L 12.242188 66.636719 C 12.242188 36.59375 36.59375 12.242188 66.636719 12.242188 Z M 66.636719 12.242188 "
104
+ clip-rule="nonzero"
105
+ />
106
+ </clipPath>
107
+ <linearGradient
108
+ :id="ids.frameGradient"
109
+ x1="-0.000000360364"
110
+ y1="0"
111
+ x2="255.999979"
112
+ y2="0"
113
+ gradientUnits="userSpaceOnUse"
114
+ gradientTransform="matrix(1.359879, 0, 0, 1.359879, 12.241246, 12.24124)"
115
+ >
116
+ <stop stop-opacity="1" stop-color="var(--ui-logo-start)" offset="0" />
117
+ <stop stop-opacity="1" stop-color="var(--ui-logo-end)" offset="1" />
118
+ </linearGradient>
119
+
120
+ <clipPath :id="ids.bodyClip">
121
+ <path
122
+ d="M 44.277344 44.277344 L 325 44.277344 L 325 325 L 44.277344 325 Z M 44.277344 44.277344 "
123
+ clip-rule="nonzero"
124
+ />
125
+ </clipPath>
126
+ </defs>
127
+
128
+ <g :clip-path="`url(#${ids.topClip})`">
129
+ <path
130
+ :fill="`url(#${ids.topGradient})`"
131
+ d="M 88.570312 12.242188 L 88.570312 281.835938 L 360.371094 281.835938 L 360.371094 12.242188 Z M 88.570312 12.242188 "
132
+ fill-rule="nonzero"
133
+ />
134
+ </g>
135
+ <g :clip-path="`url(#${ids.rightClip})`">
136
+ <path
137
+ :fill="`url(#${ids.rightGradient})`"
138
+ d="M 12.242188 90.773438 L 12.242188 360.371094 L 284.042969 360.371094 L 284.042969 90.773438 Z M 12.242188 90.773438 "
139
+ fill-rule="nonzero"
140
+ />
141
+ </g>
142
+ <g :clip-path="`url(#${ids.frameClip})`">
143
+ <g :clip-path="`url(#${ids.innerFrameClip})`">
144
+ <path
145
+ :fill="`url(#${ids.frameGradient})`"
146
+ d="M 12.242188 12.242188 L 12.242188 360.371094 L 360.371094 360.371094 L 360.371094 12.242188 Z M 12.242188 12.242188 "
147
+ fill-rule="nonzero"
148
+ />
149
+ </g>
150
+ </g>
151
+ <g :clip-path="`url(#${ids.bodyClip})`">
152
+ <path
153
+ fill="var(--ui-logo-cutout)"
154
+ d="M 81.441406 44.277344 C 46.167969 44.277344 44.277344 77.660156 44.277344 79.550781 L 44.277344 324.582031 C 169.625 324.582031 266 324.582031 287.417969 324.582031 C 322.691406 324.582031 324.582031 291.195312 324.582031 289.308594 L 324.582031 44.277344 Z M 89 129.941406 C 89 129.941406 100.96875 143.171875 129.3125 143.171875 C 157.660156 143.171875 168.996094 129.941406 168.996094 129.941406 C 168.996094 147.582031 151.359375 162.066406 129.3125 162.066406 C 107.265625 162.066406 89 147.582031 89 129.941406 Z M 248.992188 237.027344 C 239.546875 242.695312 228.835938 246.472656 216.867188 249.625 C 206.789062 252.144531 196.710938 253.402344 186.003906 253.402344 C 173.40625 253.402344 161.4375 251.511719 149.46875 248.363281 C 138.761719 245.214844 128.683594 240.804688 119.863281 235.765625 C 114.195312 231.988281 112.9375 225.058594 116.085938 219.386719 C 119.863281 213.71875 126.792969 212.460938 132.460938 215.609375 C 139.390625 220.019531 146.949219 223.167969 155.769531 225.6875 C 173.40625 230.726562 193.5625 230.726562 211.828125 226.945312 C 221.277344 224.425781 230.097656 221.277344 237.027344 216.867188 C 242.695312 213.71875 249.625 215.609375 253.402344 220.648438 C 256.550781 226.316406 254.664062 233.875 248.992188 237.027344 Z M 245.214844 162.066406 C 223.167969 162.066406 205.53125 147.582031 205.53125 129.941406 C 205.53125 129.941406 217.5 143.171875 245.84375 143.171875 C 274.1875 143.171875 285.527344 129.941406 285.527344 129.941406 C 284.898438 147.582031 266.628906 162.066406 245.214844 162.066406 Z M 245.214844 162.066406 "
155
+ fill-opacity="1"
156
+ fill-rule="nonzero"
157
+ />
158
+ </g>
159
+ </svg>
160
+ </template>
@@ -0,0 +1,15 @@
1
+ # PageSurface
2
+
3
+ ## Purpose
4
+
5
+ Token-driven full-page canvas for marketing and product landing layouts.
6
+
7
+ ## Category
8
+
9
+ Pattern
10
+
11
+ ## Behavior
12
+
13
+ - provides a quiet atmospheric background
14
+ - keeps all decoration inside the pattern rather than route-local styling
15
+ - preserves app content structure through the default slot
@@ -0,0 +1,85 @@
1
+ <template>
2
+ <div class="ui-page-surface">
3
+ <div class="ui-page-surface__mesh" aria-hidden="true"></div>
4
+ <div class="ui-page-surface__glow ui-page-surface__glow--primary" aria-hidden="true"></div>
5
+ <div class="ui-page-surface__glow ui-page-surface__glow--accent" aria-hidden="true"></div>
6
+ <div class="ui-page-surface__content">
7
+ <slot />
8
+ </div>
9
+ </div>
10
+ </template>
11
+
12
+ <style scoped>
13
+ .ui-page-surface {
14
+ position: relative;
15
+ min-height: 100vh;
16
+ overflow-x: clip;
17
+ overflow-y: visible;
18
+ background:
19
+ radial-gradient(
20
+ circle at top center,
21
+ color-mix(in srgb, var(--ui-primary-muted) 70%, transparent),
22
+ transparent 42%
23
+ ),
24
+ linear-gradient(
25
+ 180deg,
26
+ color-mix(in srgb, var(--ui-tonal-tertiary) 72%, transparent),
27
+ transparent 34%
28
+ ),
29
+ var(--ui-bg);
30
+ color: var(--ui-fg);
31
+ isolation: isolate;
32
+ }
33
+
34
+ .ui-page-surface__content {
35
+ position: relative;
36
+ z-index: 1;
37
+ background: color-mix(in srgb, var(--ui-bg) 35%, transparent);
38
+ box-shadow:
39
+ 0 20px 50px rgba(8, 10, 24, 0.14),
40
+ inset 0 24px 48px color-mix(in srgb, var(--ui-bg) 26%, transparent),
41
+ inset 0 -24px 48px color-mix(in srgb, var(--ui-bg) 22%, transparent);
42
+ backdrop-filter: blur(16px) saturate(120%);
43
+ }
44
+
45
+ .ui-page-surface__mesh,
46
+ .ui-page-surface__glow {
47
+ pointer-events: none;
48
+ position: absolute;
49
+ inset: 0;
50
+ }
51
+
52
+ .ui-page-surface__mesh {
53
+ opacity: 0.3;
54
+ background-image:
55
+ linear-gradient(color-mix(in srgb, var(--ui-border) 72%, transparent) 1px, transparent 1px),
56
+ linear-gradient(
57
+ 90deg,
58
+ color-mix(in srgb, var(--ui-border) 72%, transparent) 1px,
59
+ transparent 1px
60
+ );
61
+ background-size: 2rem 2rem;
62
+ mask-image: radial-gradient(circle at center, black, transparent 72%);
63
+ }
64
+
65
+ .ui-page-surface__glow {
66
+ filter: blur(64px);
67
+ opacity: 0.5;
68
+ }
69
+
70
+ .ui-page-surface__glow--primary {
71
+ top: 12%;
72
+ left: 58%;
73
+ width: 22rem;
74
+ height: 22rem;
75
+ background: color-mix(in srgb, var(--ui-primary) 22%, transparent);
76
+ }
77
+
78
+ .ui-page-surface__glow--accent {
79
+ top: 48%;
80
+ left: 8%;
81
+ width: 18rem;
82
+ height: 18rem;
83
+ background: color-mix(in srgb, var(--ui-info) 16%, transparent);
84
+ }
85
+ </style>
@@ -0,0 +1,39 @@
1
+ # PanelChrome
2
+
3
+ ## Purpose
4
+
5
+ Reusable bottom/side panel shell with collapsible chrome and token-driven resize behavior.
6
+
7
+ ## Category
8
+
9
+ Pattern
10
+
11
+ ## Public API
12
+
13
+ Models:
14
+
15
+ - `v-model:open` (`boolean`)
16
+ - `v-model:height` (`number`)
17
+ - `v-model:dragging` (`boolean`)
18
+
19
+ Props:
20
+
21
+ - `container`: optional resize bounds container
22
+ - `minHeight`: minimum expanded panel height
23
+ - `maxHeight`: optional maximum expanded panel height
24
+ - `collapsedHeight`: panel height when closed
25
+ - `resizable`: enables drag handle
26
+ - `title`: fallback header text
27
+
28
+ Slots:
29
+
30
+ - `header`
31
+ - `actions`
32
+ - default body slot
33
+
34
+ ## Behavior
35
+
36
+ - composes primitive `Button` and `Separator`
37
+ - uses pointer drag on a dedicated resize handle
38
+ - clamps height to min/max bounds
39
+ - keeps collapse toggle behavior consistent across panel consumers
@@ -0,0 +1 @@
1
+ export type PanelChromeContainer = HTMLElement | null;
@@ -0,0 +1,187 @@
1
+ <script setup lang="ts">
2
+ import { computed, onBeforeUnmount, ref, watch } from "vue";
3
+ import Button from "../../primitives/Button/Button.vue";
4
+ import Separator from "../../primitives/Separator/Separator.vue";
5
+ import type { PanelChromeContainer } from "./PanelChrome.types";
6
+
7
+ const props = withDefaults(
8
+ defineProps<{
9
+ collapsedHeight?: number;
10
+ container?: PanelChromeContainer;
11
+ maxHeight?: number;
12
+ minHeight?: number;
13
+ resizable?: boolean;
14
+ title?: string;
15
+ }>(),
16
+ {
17
+ collapsedHeight: 32,
18
+ container: null,
19
+ maxHeight: undefined,
20
+ minHeight: 200,
21
+ resizable: true,
22
+ title: undefined,
23
+ },
24
+ );
25
+
26
+ const open = defineModel<boolean>("open", { default: false });
27
+ const height = defineModel<number>("height", { default: 320 });
28
+ const dragging = defineModel<boolean>("dragging", { default: false });
29
+
30
+ const draggingPointerId = ref<number | null>(null);
31
+
32
+ const clampedHeight = computed(() => clamp(height.value, props.minHeight, resolveMaxHeight()));
33
+
34
+ watch(clampedHeight, (nextHeight) => {
35
+ if (nextHeight !== height.value) {
36
+ height.value = nextHeight;
37
+ }
38
+ });
39
+
40
+ function clamp(value: number, min: number, max: number): number {
41
+ return Math.max(min, Math.min(max, value));
42
+ }
43
+
44
+ function resolveContainerBottom(): number {
45
+ if (props.container) {
46
+ return props.container.getBoundingClientRect().bottom;
47
+ }
48
+
49
+ if (typeof window !== "undefined") {
50
+ return window.innerHeight;
51
+ }
52
+
53
+ return clampedHeight.value;
54
+ }
55
+
56
+ function resolveMaxHeight(): number {
57
+ if (typeof props.maxHeight === "number") {
58
+ return Math.max(props.maxHeight, props.minHeight);
59
+ }
60
+
61
+ const containerBottom = resolveContainerBottom();
62
+ return Math.max(props.minHeight, containerBottom - props.collapsedHeight);
63
+ }
64
+
65
+ function computeHeightFromPointer(clientY: number): number {
66
+ const nextHeight = resolveContainerBottom() - clientY;
67
+ return clamp(nextHeight, props.minHeight, resolveMaxHeight());
68
+ }
69
+
70
+ function stopDragging(): void {
71
+ if (!dragging.value) {
72
+ return;
73
+ }
74
+
75
+ dragging.value = false;
76
+ draggingPointerId.value = null;
77
+
78
+ if (typeof window !== "undefined") {
79
+ window.removeEventListener("pointermove", handlePointerMove);
80
+ window.removeEventListener("pointerup", handlePointerUp);
81
+ window.removeEventListener("pointercancel", handlePointerUp);
82
+ }
83
+ }
84
+
85
+ function handlePointerMove(event: PointerEvent): void {
86
+ if (!dragging.value) {
87
+ return;
88
+ }
89
+
90
+ height.value = computeHeightFromPointer(event.clientY);
91
+ }
92
+
93
+ function handlePointerUp(): void {
94
+ stopDragging();
95
+ }
96
+
97
+ function startResize(event: PointerEvent): void {
98
+ if (!open.value || !props.resizable) {
99
+ return;
100
+ }
101
+
102
+ event.preventDefault();
103
+ dragging.value = true;
104
+ draggingPointerId.value = event.pointerId;
105
+
106
+ if (typeof window !== "undefined") {
107
+ window.addEventListener("pointermove", handlePointerMove);
108
+ window.addEventListener("pointerup", handlePointerUp);
109
+ window.addEventListener("pointercancel", handlePointerUp);
110
+ }
111
+ }
112
+
113
+ function toggleOpen(): void {
114
+ open.value = !open.value;
115
+ }
116
+
117
+ onBeforeUnmount(() => {
118
+ stopDragging();
119
+ });
120
+ </script>
121
+
122
+ <template>
123
+ <section
124
+ class="relative z-40 flex min-h-0 flex-col"
125
+ :class="{
126
+ 'h-9': !open,
127
+ 'transition-[height] duration-[var(--ui-duration-normal)] ease-[var(--ui-ease-out)]':
128
+ !dragging,
129
+ }"
130
+ :style="open ? { height: `${clampedHeight}px` } : undefined"
131
+ >
132
+ <div
133
+ v-if="open && props.resizable"
134
+ role="separator"
135
+ aria-orientation="horizontal"
136
+ class="cursor-row-resize px-2 py-1"
137
+ @pointerdown="startResize"
138
+ >
139
+ <Separator orientation="horizontal" />
140
+ </div>
141
+
142
+ <div
143
+ class="relative z-10 flex items-center justify-between border-t border-[var(--ui-border)] bg-[var(--ui-surface)] px-3 py-1"
144
+ >
145
+ <div class="flex min-w-0 flex-1 items-center gap-2">
146
+ <slot name="header">
147
+ <p v-if="props.title" class="m-0 text-xs text-[var(--ui-fg-muted)]">
148
+ {{ props.title }}
149
+ </p>
150
+ </slot>
151
+ </div>
152
+
153
+ <div class="flex items-center gap-2">
154
+ <slot name="actions" />
155
+ <Button
156
+ aria-label="Toggle panel"
157
+ :aria-pressed="open"
158
+ variant="plain-secondary"
159
+ size="xs"
160
+ class="ml-1 h-7 w-7 !px-0"
161
+ @click="toggleOpen"
162
+ >
163
+ <svg
164
+ xmlns="http://www.w3.org/2000/svg"
165
+ class="h-5 w-5 transition-transform duration-[var(--ui-duration-normal)]"
166
+ :class="open ? 'rotate-0' : 'rotate-180'"
167
+ fill="none"
168
+ viewBox="0 0 24 24"
169
+ stroke="currentColor"
170
+ aria-hidden="true"
171
+ >
172
+ <path
173
+ stroke-linecap="round"
174
+ stroke-linejoin="round"
175
+ stroke-width="2"
176
+ d="M19 9l-7 7-7-7"
177
+ />
178
+ </svg>
179
+ </Button>
180
+ </div>
181
+ </div>
182
+
183
+ <div v-show="open" class="flex min-h-0 flex-1 overflow-auto bg-[var(--ui-surface)]">
184
+ <slot />
185
+ </div>
186
+ </section>
187
+ </template>
@@ -0,0 +1,31 @@
1
+ # PreviewPanel
2
+
3
+ ## Purpose
4
+
5
+ Reusable technical preview surface for code, structured rows, and status-heavy callouts.
6
+
7
+ ## Category
8
+
9
+ Pattern
10
+
11
+ ## Public API
12
+
13
+ Props:
14
+
15
+ - `title`
16
+ - `meta`
17
+ - `tabs`
18
+ - `activeTab`
19
+ - `rows`
20
+ - `code`
21
+ - `statusLabel`
22
+ - `statusTone`
23
+ - `emphasis`: `subtle | default | strong`
24
+ - `badgeMode`: `default | quiet`
25
+ - `footerLabel`
26
+ - `footerTone`
27
+ - `footerText`
28
+
29
+ Slots:
30
+
31
+ - default: custom panel body when `rows` and `code` are not enough
@@ -0,0 +1,23 @@
1
+ export const previewPanelToneValues = [
2
+ "neutral",
3
+ "primary",
4
+ "secondary",
5
+ "accent",
6
+ "success",
7
+ "warning",
8
+ "critical",
9
+ "info",
10
+ ] as const;
11
+
12
+ export const previewPanelEmphasisValues = ["subtle", "default", "strong"] as const;
13
+ export const previewPanelBadgeModeValues = ["default", "quiet"] as const;
14
+
15
+ export type PreviewPanelTone = (typeof previewPanelToneValues)[number];
16
+ export type PreviewPanelEmphasis = (typeof previewPanelEmphasisValues)[number];
17
+ export type PreviewPanelBadgeMode = (typeof previewPanelBadgeModeValues)[number];
18
+
19
+ export type PreviewPanelRow = {
20
+ label: string;
21
+ value: string;
22
+ valueTone?: PreviewPanelTone;
23
+ };