@keyfunc/keybricks-ds 1.0.0

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 (418) hide show
  1. package/DEPLOY.md +204 -0
  2. package/DESIGN.md +269 -0
  3. package/INTEGRATION.md +417 -0
  4. package/SKILL.md +32 -0
  5. package/_adherence.oxlintrc.json +1469 -0
  6. package/_scripts/build-index.mjs +80 -0
  7. package/_scripts/build-tokens.mjs +135 -0
  8. package/assets/icons/icon-index.js +1 -0
  9. package/assets/icons/icon-index.json +1 -0
  10. package/assets/icons/unicons-index.js +1 -0
  11. package/assets/icons/unicons-index.json +1 -0
  12. package/assets/keybricks-logo.png +0 -0
  13. package/components/_cards/accordion.card.html +32 -0
  14. package/components/_cards/action-chip.card.html +22 -0
  15. package/components/_cards/activity.card.html +34 -0
  16. package/components/_cards/alert.card.html +32 -0
  17. package/components/_cards/app-chrome.card.html +36 -0
  18. package/components/_cards/banner.card.html +21 -0
  19. package/components/_cards/brand-visual.card.html +43 -0
  20. package/components/_cards/breadcrumb.card.html +23 -0
  21. package/components/_cards/button-1-base.card.html +39 -0
  22. package/components/_cards/button-2-states.card.html +56 -0
  23. package/components/_cards/button-3-sizes-icons.card.html +32 -0
  24. package/components/_cards/button-4-group.card.html +47 -0
  25. package/components/_cards/canvas-zoom-controls.card.html +19 -0
  26. package/components/_cards/cards-indicators.card.html +59 -0
  27. package/components/_cards/charts-1-sparkline.card.html +55 -0
  28. package/components/_cards/charts-10-gauge.card.html +31 -0
  29. package/components/_cards/charts-11-funnel.card.html +28 -0
  30. package/components/_cards/charts-12-treemap.card.html +23 -0
  31. package/components/_cards/charts-14-radar.card.html +31 -0
  32. package/components/_cards/charts-15-distribution.card.html +32 -0
  33. package/components/_cards/charts-16-pareto.card.html +25 -0
  34. package/components/_cards/charts-17-candlestick.card.html +34 -0
  35. package/components/_cards/charts-18-sankey.card.html +29 -0
  36. package/components/_cards/charts-19-chord.card.html +31 -0
  37. package/components/_cards/charts-2-line.card.html +46 -0
  38. package/components/_cards/charts-20-sunburst.card.html +38 -0
  39. package/components/_cards/charts-21-worldmap.card.html +33 -0
  40. package/components/_cards/charts-22-gantt.card.html +37 -0
  41. package/components/_cards/charts-23-bar3d.card.html +26 -0
  42. package/components/_cards/charts-24-pie3d.card.html +32 -0
  43. package/components/_cards/charts-25-surface3d.card.html +24 -0
  44. package/components/_cards/charts-26-scatter3d.card.html +24 -0
  45. package/components/_cards/charts-27-ribbon3d.card.html +23 -0
  46. package/components/_cards/charts-3-bar.card.html +71 -0
  47. package/components/_cards/charts-4-barlist.card.html +30 -0
  48. package/components/_cards/charts-5-donut.card.html +35 -0
  49. package/components/_cards/charts-6-scatter.card.html +26 -0
  50. package/components/_cards/charts-7-heatmap.card.html +28 -0
  51. package/components/_cards/charts-8-waterfall.card.html +25 -0
  52. package/components/_cards/charts-9-bullet.card.html +31 -0
  53. package/components/_cards/charts-99-fullpage.card.html +194 -0
  54. package/components/_cards/checkbox.card.html +34 -0
  55. package/components/_cards/codeblock.card.html +19 -0
  56. package/components/_cards/combobox.card.html +25 -0
  57. package/components/_cards/context-menu.card.html +21 -0
  58. package/components/_cards/datatable.card.html +48 -0
  59. package/components/_cards/date-picker.card.html +31 -0
  60. package/components/_cards/diffvalue.card.html +21 -0
  61. package/components/_cards/divider.card.html +24 -0
  62. package/components/_cards/drawer.card.html +30 -0
  63. package/components/_cards/dropdown-menu.card.html +38 -0
  64. package/components/_cards/dropzone.card.html +22 -0
  65. package/components/_cards/empty-state.card.html +29 -0
  66. package/components/_cards/filter-bar.card.html +34 -0
  67. package/components/_cards/icon-button.card.html +27 -0
  68. package/components/_cards/icons-1-core.card.html +49 -0
  69. package/components/_cards/icons-2-feather.card.html +39 -0
  70. package/components/_cards/icons-3-unicons.card.html +44 -0
  71. package/components/_cards/input.card.html +25 -0
  72. package/components/_cards/kbd.card.html +20 -0
  73. package/components/_cards/keyvalue.card.html +23 -0
  74. package/components/_cards/listrow.card.html +30 -0
  75. package/components/_cards/loading.card.html +33 -0
  76. package/components/_cards/log-viewer.card.html +23 -0
  77. package/components/_cards/modal.card.html +35 -0
  78. package/components/_cards/multi-select.card.html +26 -0
  79. package/components/_cards/number-stepper.card.html +24 -0
  80. package/components/_cards/pagination.card.html +25 -0
  81. package/components/_cards/people.card.html +46 -0
  82. package/components/_cards/pipeline-node.card.html +76 -0
  83. package/components/_cards/pipeline-palette.card.html +54 -0
  84. package/components/_cards/search.card.html +23 -0
  85. package/components/_cards/select.card.html +23 -0
  86. package/components/_cards/slider.card.html +25 -0
  87. package/components/_cards/smart-table.card.html +37 -0
  88. package/components/_cards/spreadsheet.card.html +31 -0
  89. package/components/_cards/stepper.card.html +25 -0
  90. package/components/_cards/tabs.card.html +25 -0
  91. package/components/_cards/tag.card.html +26 -0
  92. package/components/_cards/textarea.card.html +27 -0
  93. package/components/_cards/timeline.card.html +32 -0
  94. package/components/_cards/toast.card.html +33 -0
  95. package/components/_cards/toggles.card.html +68 -0
  96. package/components/_cards/tooltip.card.html +22 -0
  97. package/components/_cards/tree.card.html +150 -0
  98. package/components/_shared/frame-theme.js +16 -0
  99. package/components/_shared/src-brand.js +1 -0
  100. package/components/_shared/src-buttons.js +1 -0
  101. package/components/_shared/src-charts.js +1 -0
  102. package/components/_shared/src-data.js +1 -0
  103. package/components/_shared/src-display.js +1 -0
  104. package/components/_shared/src-feedback.js +1 -0
  105. package/components/_shared/src-forms.js +1 -0
  106. package/components/_shared/src-icons.js +1 -0
  107. package/components/_shared/src-navigation.js +1 -0
  108. package/components/_shared/src-pipeline.js +1 -0
  109. package/components/_shared/src-tabs.js +1 -0
  110. package/components/_shared/svg-download.js +19 -0
  111. package/components/_shared/view-source.js +185 -0
  112. package/components/_vue/index.mjs +114 -0
  113. package/components/brand/BrandVisual.d.ts +17 -0
  114. package/components/brand/BrandVisual.jsx +29 -0
  115. package/components/brand/BrandVisual.vue +34 -0
  116. package/components/brand/_dir.card.html +13 -0
  117. package/components/brand/brandMotifs.js +210 -0
  118. package/components/buttons/ActionChip.d.ts +10 -0
  119. package/components/buttons/ActionChip.jsx +20 -0
  120. package/components/buttons/ActionChip.vue +18 -0
  121. package/components/buttons/Button.d.ts +40 -0
  122. package/components/buttons/Button.jsx +101 -0
  123. package/components/buttons/Button.vue +87 -0
  124. package/components/buttons/IconButton.d.ts +26 -0
  125. package/components/buttons/IconButton.jsx +28 -0
  126. package/components/buttons/IconButton.vue +21 -0
  127. package/components/buttons/_dir.card.html +13 -0
  128. package/components/buttons/buttons.prompt.md +19 -0
  129. package/components/charts/Bar3D.d.ts +15 -0
  130. package/components/charts/Bar3D.jsx +93 -0
  131. package/components/charts/Bar3D.vue +79 -0
  132. package/components/charts/BarChart.d.ts +23 -0
  133. package/components/charts/BarChart.jsx +135 -0
  134. package/components/charts/BarChart.vue +139 -0
  135. package/components/charts/BarList.d.ts +13 -0
  136. package/components/charts/BarList.jsx +31 -0
  137. package/components/charts/BarList.vue +25 -0
  138. package/components/charts/BoxPlot.d.ts +18 -0
  139. package/components/charts/BoxPlot.jsx +62 -0
  140. package/components/charts/BoxPlot.vue +58 -0
  141. package/components/charts/BulletChart.d.ts +12 -0
  142. package/components/charts/BulletChart.jsx +41 -0
  143. package/components/charts/BulletChart.vue +33 -0
  144. package/components/charts/CandlestickChart.d.ts +15 -0
  145. package/components/charts/CandlestickChart.jsx +63 -0
  146. package/components/charts/CandlestickChart.vue +62 -0
  147. package/components/charts/ChartKit.d.ts +8 -0
  148. package/components/charts/ChartKit.jsx +76 -0
  149. package/components/charts/ChartKit.vue +47 -0
  150. package/components/charts/ChordChart.d.ts +13 -0
  151. package/components/charts/ChordChart.jsx +55 -0
  152. package/components/charts/ChordChart.vue +54 -0
  153. package/components/charts/DonutChart.d.ts +15 -0
  154. package/components/charts/DonutChart.jsx +73 -0
  155. package/components/charts/DonutChart.vue +61 -0
  156. package/components/charts/FunnelChart.d.ts +11 -0
  157. package/components/charts/FunnelChart.jsx +37 -0
  158. package/components/charts/FunnelChart.vue +29 -0
  159. package/components/charts/GanttChart.d.ts +20 -0
  160. package/components/charts/GanttChart.jsx +80 -0
  161. package/components/charts/GanttChart.vue +60 -0
  162. package/components/charts/GaugeChart.d.ts +13 -0
  163. package/components/charts/GaugeChart.jsx +33 -0
  164. package/components/charts/GaugeChart.vue +29 -0
  165. package/components/charts/HeatmapChart.d.ts +13 -0
  166. package/components/charts/HeatmapChart.jsx +62 -0
  167. package/components/charts/HeatmapChart.vue +38 -0
  168. package/components/charts/Histogram.d.ts +16 -0
  169. package/components/charts/Histogram.jsx +56 -0
  170. package/components/charts/Histogram.vue +53 -0
  171. package/components/charts/LineChart.d.ts +17 -0
  172. package/components/charts/LineChart.jsx +84 -0
  173. package/components/charts/LineChart.vue +86 -0
  174. package/components/charts/ParetoChart.d.ts +13 -0
  175. package/components/charts/ParetoChart.jsx +54 -0
  176. package/components/charts/ParetoChart.vue +55 -0
  177. package/components/charts/Pie3D.d.ts +17 -0
  178. package/components/charts/Pie3D.jsx +145 -0
  179. package/components/charts/Pie3D.vue +115 -0
  180. package/components/charts/RadarChart.d.ts +14 -0
  181. package/components/charts/RadarChart.jsx +79 -0
  182. package/components/charts/RadarChart.vue +73 -0
  183. package/components/charts/Ribbon3D.d.ts +13 -0
  184. package/components/charts/Ribbon3D.jsx +89 -0
  185. package/components/charts/Ribbon3D.vue +79 -0
  186. package/components/charts/SankeyChart.d.ts +15 -0
  187. package/components/charts/SankeyChart.jsx +59 -0
  188. package/components/charts/SankeyChart.vue +53 -0
  189. package/components/charts/Scatter3D.d.ts +12 -0
  190. package/components/charts/Scatter3D.jsx +69 -0
  191. package/components/charts/Scatter3D.vue +59 -0
  192. package/components/charts/ScatterChart.d.ts +12 -0
  193. package/components/charts/ScatterChart.jsx +53 -0
  194. package/components/charts/ScatterChart.vue +57 -0
  195. package/components/charts/Sparkline.d.ts +19 -0
  196. package/components/charts/Sparkline.jsx +63 -0
  197. package/components/charts/Sparkline.vue +54 -0
  198. package/components/charts/SunburstChart.d.ts +12 -0
  199. package/components/charts/SunburstChart.jsx +61 -0
  200. package/components/charts/SunburstChart.vue +60 -0
  201. package/components/charts/Surface3D.d.ts +13 -0
  202. package/components/charts/Surface3D.jsx +70 -0
  203. package/components/charts/Surface3D.vue +63 -0
  204. package/components/charts/TreemapChart.d.ts +11 -0
  205. package/components/charts/TreemapChart.jsx +35 -0
  206. package/components/charts/TreemapChart.vue +27 -0
  207. package/components/charts/WaterfallChart.d.ts +11 -0
  208. package/components/charts/WaterfallChart.jsx +59 -0
  209. package/components/charts/WaterfallChart.vue +46 -0
  210. package/components/charts/WorldMap.d.ts +21 -0
  211. package/components/charts/WorldMap.jsx +107 -0
  212. package/components/charts/WorldMap.vue +73 -0
  213. package/components/charts/_dir.card.html +7 -0
  214. package/components/charts/chart-3d.js +84 -0
  215. package/components/charts/chart-geometry.js +223 -0
  216. package/components/charts/charts.prompt.md +24 -0
  217. package/components/data/CodeBlock.d.ts +9 -0
  218. package/components/data/CodeBlock.jsx +19 -0
  219. package/components/data/CodeBlock.vue +22 -0
  220. package/components/data/DataTable.d.ts +28 -0
  221. package/components/data/DataTable.jsx +32 -0
  222. package/components/data/DataTable.vue +25 -0
  223. package/components/data/DiffValue.d.ts +11 -0
  224. package/components/data/DiffValue.jsx +15 -0
  225. package/components/data/DiffValue.vue +13 -0
  226. package/components/data/FilterBar.d.ts +16 -0
  227. package/components/data/FilterBar.jsx +22 -0
  228. package/components/data/FilterBar.vue +23 -0
  229. package/components/data/KeyValue.d.ts +16 -0
  230. package/components/data/KeyValue.jsx +25 -0
  231. package/components/data/KeyValue.vue +26 -0
  232. package/components/data/ListRow.d.ts +14 -0
  233. package/components/data/ListRow.jsx +25 -0
  234. package/components/data/ListRow.vue +25 -0
  235. package/components/data/Pagination.d.ts +12 -0
  236. package/components/data/Pagination.jsx +27 -0
  237. package/components/data/Pagination.vue +24 -0
  238. package/components/data/SmartTable.d.ts +30 -0
  239. package/components/data/SmartTable.jsx +73 -0
  240. package/components/data/SmartTable.vue +74 -0
  241. package/components/data/Spreadsheet.d.ts +33 -0
  242. package/components/data/Spreadsheet.jsx +110 -0
  243. package/components/data/Spreadsheet.vue +95 -0
  244. package/components/data/_dir.card.html +13 -0
  245. package/components/data/data.prompt.md +33 -0
  246. package/components/display/Avatar.d.ts +21 -0
  247. package/components/display/Avatar.jsx +31 -0
  248. package/components/display/Avatar.vue +34 -0
  249. package/components/display/Badge.d.ts +27 -0
  250. package/components/display/Badge.jsx +40 -0
  251. package/components/display/Badge.vue +47 -0
  252. package/components/display/Card.d.ts +27 -0
  253. package/components/display/Card.jsx +27 -0
  254. package/components/display/Card.vue +28 -0
  255. package/components/display/Divider.d.ts +8 -0
  256. package/components/display/Divider.jsx +14 -0
  257. package/components/display/Divider.vue +13 -0
  258. package/components/display/Kbd.d.ts +7 -0
  259. package/components/display/Kbd.jsx +12 -0
  260. package/components/display/Kbd.vue +9 -0
  261. package/components/display/ProgressBar.d.ts +42 -0
  262. package/components/display/ProgressBar.jsx +70 -0
  263. package/components/display/ProgressBar.vue +69 -0
  264. package/components/display/Tag.d.ts +9 -0
  265. package/components/display/Tag.jsx +15 -0
  266. package/components/display/Tag.vue +15 -0
  267. package/components/display/_dir.card.html +13 -0
  268. package/components/display/display.prompt.md +30 -0
  269. package/components/feedback/Accordion.d.ts +13 -0
  270. package/components/feedback/Accordion.jsx +21 -0
  271. package/components/feedback/Accordion.vue +22 -0
  272. package/components/feedback/ActivityItem.d.ts +25 -0
  273. package/components/feedback/ActivityItem.jsx +39 -0
  274. package/components/feedback/ActivityItem.vue +46 -0
  275. package/components/feedback/Alert.d.ts +36 -0
  276. package/components/feedback/Alert.jsx +48 -0
  277. package/components/feedback/Alert.vue +59 -0
  278. package/components/feedback/Banner.d.ts +15 -0
  279. package/components/feedback/Banner.jsx +25 -0
  280. package/components/feedback/Banner.vue +25 -0
  281. package/components/feedback/ContextMenu.d.ts +8 -0
  282. package/components/feedback/ContextMenu.jsx +18 -0
  283. package/components/feedback/ContextMenu.vue +19 -0
  284. package/components/feedback/Drawer.d.ts +18 -0
  285. package/components/feedback/Drawer.jsx +26 -0
  286. package/components/feedback/Drawer.vue +24 -0
  287. package/components/feedback/Menu.d.ts +10 -0
  288. package/components/feedback/Menu.jsx +24 -0
  289. package/components/feedback/Menu.vue +21 -0
  290. package/components/feedback/Modal.d.ts +38 -0
  291. package/components/feedback/Modal.jsx +69 -0
  292. package/components/feedback/Modal.vue +65 -0
  293. package/components/feedback/Stepper.d.ts +9 -0
  294. package/components/feedback/Stepper.jsx +24 -0
  295. package/components/feedback/Stepper.vue +18 -0
  296. package/components/feedback/Timeline.d.ts +15 -0
  297. package/components/feedback/Timeline.jsx +27 -0
  298. package/components/feedback/Timeline.vue +21 -0
  299. package/components/feedback/_dir.card.html +13 -0
  300. package/components/feedback/feedback.prompt.md +35 -0
  301. package/components/forms/Checkbox.d.ts +13 -0
  302. package/components/forms/Checkbox.jsx +17 -0
  303. package/components/forms/Checkbox.vue +18 -0
  304. package/components/forms/Combobox.d.ts +13 -0
  305. package/components/forms/Combobox.jsx +34 -0
  306. package/components/forms/Combobox.vue +35 -0
  307. package/components/forms/DatePicker.d.ts +12 -0
  308. package/components/forms/DatePicker.jsx +48 -0
  309. package/components/forms/DatePicker.vue +46 -0
  310. package/components/forms/Dropzone.d.ts +20 -0
  311. package/components/forms/Dropzone.jsx +36 -0
  312. package/components/forms/Dropzone.vue +28 -0
  313. package/components/forms/Field.d.ts +13 -0
  314. package/components/forms/Field.jsx +13 -0
  315. package/components/forms/Field.vue +12 -0
  316. package/components/forms/Input.d.ts +18 -0
  317. package/components/forms/Input.jsx +35 -0
  318. package/components/forms/Input.vue +38 -0
  319. package/components/forms/MultiSelect.d.ts +14 -0
  320. package/components/forms/MultiSelect.jsx +33 -0
  321. package/components/forms/MultiSelect.vue +36 -0
  322. package/components/forms/NumberStepper.d.ts +13 -0
  323. package/components/forms/NumberStepper.jsx +15 -0
  324. package/components/forms/NumberStepper.vue +17 -0
  325. package/components/forms/Radio.vue +16 -0
  326. package/components/forms/RadioGroup.vue +11 -0
  327. package/components/forms/SearchInput.d.ts +12 -0
  328. package/components/forms/SearchInput.jsx +17 -0
  329. package/components/forms/SearchInput.vue +14 -0
  330. package/components/forms/Select.d.ts +14 -0
  331. package/components/forms/Select.jsx +17 -0
  332. package/components/forms/Select.vue +16 -0
  333. package/components/forms/Slider.d.ts +15 -0
  334. package/components/forms/Slider.jsx +21 -0
  335. package/components/forms/Slider.vue +23 -0
  336. package/components/forms/Switch.d.ts +31 -0
  337. package/components/forms/Switch.jsx +40 -0
  338. package/components/forms/Switch.vue +16 -0
  339. package/components/forms/_dir.card.html +13 -0
  340. package/components/forms/forms.prompt.md +23 -0
  341. package/components/icons/Icon.d.ts +19 -0
  342. package/components/icons/Icon.jsx +93 -0
  343. package/components/icons/Icon.prompt.md +8 -0
  344. package/components/icons/Icon.vue +12 -0
  345. package/components/icons/Unicon.d.ts +12 -0
  346. package/components/icons/Unicon.jsx +16 -0
  347. package/components/icons/Unicon.vue +15 -0
  348. package/components/icons/_dir.card.html +13 -0
  349. package/components/icons/feather-paths.js +2 -0
  350. package/components/icons/icon-paths.js +73 -0
  351. package/components/index.d.ts +87 -0
  352. package/components/index.js +110 -0
  353. package/components/navigation/Breadcrumb.d.ts +24 -0
  354. package/components/navigation/Breadcrumb.jsx +120 -0
  355. package/components/navigation/Breadcrumb.vue +94 -0
  356. package/components/navigation/DocTree.d.ts +18 -0
  357. package/components/navigation/DocTree.jsx +37 -0
  358. package/components/navigation/DocTree.vue +25 -0
  359. package/components/navigation/Sidebar.d.ts +29 -0
  360. package/components/navigation/Sidebar.jsx +75 -0
  361. package/components/navigation/Sidebar.vue +54 -0
  362. package/components/navigation/TopBar.d.ts +27 -0
  363. package/components/navigation/TopBar.jsx +44 -0
  364. package/components/navigation/TopBar.vue +51 -0
  365. package/components/navigation/Tree.d.ts +83 -0
  366. package/components/navigation/Tree.jsx +347 -0
  367. package/components/navigation/Tree.vue +258 -0
  368. package/components/navigation/_dir.card.html +13 -0
  369. package/components/navigation/navigation.prompt.md +22 -0
  370. package/components/pipeline/ConfigPanel.d.ts +18 -0
  371. package/components/pipeline/ConfigPanel.jsx +30 -0
  372. package/components/pipeline/ConfigPanel.vue +32 -0
  373. package/components/pipeline/DataPreview.d.ts +14 -0
  374. package/components/pipeline/DataPreview.jsx +24 -0
  375. package/components/pipeline/DataPreview.vue +21 -0
  376. package/components/pipeline/NodeCard.d.ts +47 -0
  377. package/components/pipeline/NodeCard.jsx +97 -0
  378. package/components/pipeline/NodeCard.vue +75 -0
  379. package/components/pipeline/PaletteItem.vue +15 -0
  380. package/components/pipeline/PaletteListItem.vue +15 -0
  381. package/components/pipeline/PalettePanel.d.ts +20 -0
  382. package/components/pipeline/PalettePanel.jsx +74 -0
  383. package/components/pipeline/PalettePanel.vue +45 -0
  384. package/components/pipeline/PipelineCanvas.d.ts +25 -0
  385. package/components/pipeline/PipelineCanvas.jsx +94 -0
  386. package/components/pipeline/PipelineCanvas.vue +73 -0
  387. package/components/pipeline/ZoomControls.d.ts +9 -0
  388. package/components/pipeline/ZoomControls.jsx +15 -0
  389. package/components/pipeline/ZoomControls.vue +15 -0
  390. package/components/pipeline/_dir.card.html +13 -0
  391. package/components/pipeline/pipeline.prompt.md +22 -0
  392. package/components/tabs/SegmentedControl.d.ts +11 -0
  393. package/components/tabs/SegmentedControl.jsx +21 -0
  394. package/components/tabs/SegmentedControl.vue +15 -0
  395. package/components/tabs/Tabs.d.ts +13 -0
  396. package/components/tabs/Tabs.jsx +52 -0
  397. package/components/tabs/Tabs.vue +39 -0
  398. package/components/tabs/ViewToggle.d.ts +8 -0
  399. package/components/tabs/ViewToggle.jsx +12 -0
  400. package/components/tabs/ViewToggle.vue +12 -0
  401. package/components/tabs/_dir.card.html +13 -0
  402. package/components/tabs/tabs.prompt.md +14 -0
  403. package/package.json +76 -0
  404. package/readme.md +150 -0
  405. package/styles.css +10 -0
  406. package/tokens/alpha.css +27 -0
  407. package/tokens/charts.css +55 -0
  408. package/tokens/colors-extended.css +40 -0
  409. package/tokens/colors.css +39 -0
  410. package/tokens/dark.css +96 -0
  411. package/tokens/fonts.css +4 -0
  412. package/tokens/interaction.css +48 -0
  413. package/tokens/layout.css +30 -0
  414. package/tokens/motion.css +22 -0
  415. package/tokens/tokens.d.ts +680 -0
  416. package/tokens/tokens.js +1018 -0
  417. package/tokens/tokens.json +2928 -0
  418. package/tokens/typography.css +22 -0
@@ -0,0 +1,33 @@
1
+ Data lists: `DataTable` (hairline table, mono cells, selectable, dense preview mode) and `ListRow` (expandable workflow rows in a `Card pad={false}`).
2
+
3
+ ```jsx
4
+ <DataTable selectable columns={[
5
+ {key:"module",label:"Module"},
6
+ {key:"code",label:"Code",mono:true},
7
+ {key:"cur",label:"Current Value"},
8
+ {key:"next",label:"New Value"},
9
+ ]} rows={[{module:"Financial Settings",code:"FIN_CURRENCY_DEFAULT",cur:"USD",next:"EUR"}]}/>
10
+ <ListRow icon="chart-line" title="Business Analysis" meta="1 document" trailing="1 item"/>
11
+ ```
12
+
13
+ dense mode = 29px rows/11px headers for the pipeline data-preview drawer.
14
+
15
+ `Pagination` (addition) sits under a table:
16
+
17
+ ```jsx
18
+ <Pagination page={p} pageCount={7} total={128} pageSize={20} onChange={setP}/>
19
+ ```
20
+
21
+ `KeyValue`/`KeyValueList` and `DiffValue` (additions) — formalize the label/value and before→after patterns used throughout config and confirmation steps:
22
+
23
+ ```jsx
24
+ <KeyValueList rows={[{label:"Node Type",value:"Data Source · Detail Sheet"},{label:"Node Name",value:"Sales Orders"}]}/>
25
+ <DiffValue from="USD" to="EUR" tone="warning"/>
26
+ <DiffValue to="8" tone="success"/>
27
+ ```
28
+
29
+ `CodeBlock` (addition) — SQL Preview / JSON export display with a copy button:
30
+
31
+ ```jsx
32
+ <CodeBlock language="sql" code={"SELECT * FROM sales_orders"}/>
33
+ ```
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ /**
3
+ * Initials avatar (tinted from the category palette). The source file ships no avatar
4
+ * imagery — people render as initials unless you pass a real `src`. Addition.
5
+ */
6
+ export interface AvatarProps {
7
+ name?: string;
8
+ /** Real image URL; omit for initials */
9
+ src?: string;
10
+ size?: number;
11
+ style?: React.CSSProperties;
12
+ }
13
+ export declare function Avatar(props: AvatarProps): JSX.Element;
14
+ /** Overlapping avatar row with a +N overflow chip. */
15
+ export interface AvatarGroupProps {
16
+ names?: string[];
17
+ size?: number;
18
+ max?: number;
19
+ style?: React.CSSProperties;
20
+ }
21
+ export declare function AvatarGroup(props: AvatarGroupProps): JSX.Element;
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+
3
+ const palette = ["var(--cat-join)", "var(--cat-source)", "var(--cat-transform)", "var(--cat-merge)", "var(--cat-output)"];
4
+ function initials(name = "") {
5
+ const parts = name.trim().split(/\s+/);
6
+ if (!parts[0]) return "?";
7
+ if (/[\u4e00-\u9fff]/.test(name)) return name.slice(-2);
8
+ return (parts[0][0] + (parts[1] ? parts[1][0] : "")).toUpperCase();
9
+ }
10
+
11
+ /** Initials avatar — the source file ships no avatar imagery, so people render as tinted initials. */
12
+ export function Avatar({ name = "", src, size = 28, style }) {
13
+ const hue = palette[[...name].reduce((a, c) => a + c.charCodeAt(0), 0) % palette.length];
14
+ if (src) return <img src={src} alt={name} style={{ width: size, height: size, borderRadius: "var(--radius-full)", objectFit: "cover", flexShrink: 0, ...style }} />;
15
+ return (
16
+ <span title={name} style={{ width: size, height: size, borderRadius: "var(--radius-full)", background: "var(--bg-hover)", color: hue, display: "inline-flex", alignItems: "center", justifyContent: "center", fontFamily: "var(--font-sans)", fontWeight: "var(--weight-medium)", fontSize: Math.max(9, Math.round(size * .4)), letterSpacing: 0, flexShrink: 0, boxSizing: "border-box", border: "1px solid var(--border-card)", ...style }}>
17
+ {initials(name)}
18
+ </span>
19
+ );
20
+ }
21
+
22
+ /** Overlapping avatar row (assignees on a task). */
23
+ export function AvatarGroup({ names = [], size = 24, max = 4, style }) {
24
+ const shown = names.slice(0, max), rest = names.length - shown.length;
25
+ return (
26
+ <div style={{ display: "flex", alignItems: "center", ...style }}>
27
+ {shown.map((n, i) => <Avatar key={n + i} name={n} size={size} style={{ marginLeft: i ? -8 : 0, boxShadow: "var(--ring-surface)" }} />)}
28
+ {rest > 0 ? <span style={{ marginLeft: -8, width: size, height: size, borderRadius: "var(--radius-full)", background: "var(--bg-active)", color: "var(--text-secondary)", boxShadow: "var(--ring-surface)", display: "inline-flex", alignItems: "center", justifyContent: "center", fontFamily: "var(--font-sans)", fontSize: Math.max(9, Math.round(size * .38)) }}>+{rest}</span> : null}
29
+ </div>
30
+ );
31
+ }
@@ -0,0 +1,34 @@
1
+ <script setup>
2
+ import { computed } from 'vue'
3
+ const palette = ['var(--cat-join)', 'var(--cat-source)', 'var(--cat-transform)', 'var(--cat-merge)', 'var(--cat-output)']
4
+ function initials(name = '') {
5
+ const parts = name.trim().split(/\s+/)
6
+ if (!parts[0]) return '?'
7
+ if (/[\u4e00-\u9fff]/.test(name)) return name.slice(-2)
8
+ return (parts[0][0] + (parts[1] ? parts[1][0] : '')).toUpperCase()
9
+ }
10
+ // Initials avatar — the source file ships no avatar imagery, so people render as tinted initials.
11
+ const props = defineProps({ name: { type: String, default: '' }, src: String, size: { type: Number, default: 28 }, style: Object })
12
+ const hue = computed(() => palette[[...props.name].reduce((a, c) => a + c.charCodeAt(0), 0) % palette.length])
13
+ </script>
14
+ <template>
15
+ <img v-if="src" :src="src" :alt="name" :style="{ width: size, height: size, borderRadius: 'var(--radius-full)', objectFit: 'cover', flexShrink: 0, ...style }" />
16
+ <span v-else :title="name" :style="{ width: size, height: size, borderRadius: 'var(--radius-full)', background: 'var(--bg-hover)', color: hue, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', fontFamily: 'var(--font-sans)', fontWeight: 'var(--weight-medium)', fontSize: Math.max(9, Math.round(size * .4)), letterSpacing: 0, flexShrink: 0, boxSizing: 'border-box', border: '1px solid var(--border-card)', ...style }">{{ initials(name) }}</span>
17
+ </template>
18
+
19
+ <!-- AvatarGroup — overlapping avatar row (assignees on a task). -->
20
+ <!--
21
+ <script setup name="AvatarGroup">
22
+ import { computed } from 'vue'
23
+ import Avatar from './Avatar.vue'
24
+ const props = defineProps({ names: { type: Array, default: () => [] }, size: { type: Number, default: 24 }, max: { type: Number, default: 4 }, style: Object })
25
+ const shown = computed(() => props.names.slice(0, props.max))
26
+ const rest = computed(() => props.names.length - shown.value.length)
27
+ </script>
28
+ <template>
29
+ <div :style="{ display: 'flex', alignItems: 'center', ...style }">
30
+ <Avatar v-for="(n, i) in shown" :key="n + i" :name="n" :size="size" :style="{ marginLeft: i ? -8 : 0, boxShadow: 'var(--ring-surface)' }" />
31
+ <span v-if="rest > 0" :style="{ marginLeft: -8, width: size, height: size, borderRadius: 'var(--radius-full)', background: 'var(--bg-active)', color: 'var(--text-secondary)', boxShadow: 'var(--ring-surface)', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', fontFamily: 'var(--font-sans)', fontSize: Math.max(9, Math.round(size * .38)) }">+{{ rest }}</span>
32
+ </div>
33
+ </template>
34
+ -->
@@ -0,0 +1,27 @@
1
+ import * as React from "react";
2
+ /** Solid circular badge with 2px white ring — error/warning dots on nodes, stepper circles. */
3
+ export interface StatusBadgeProps {
4
+ tone?: "success" | "danger" | "warning" | "pending" | "info";
5
+ /** Optional glyph (check, x, bug, clock, ...) */
6
+ icon?: string;
7
+ /** Diameter px (13 node dot · 20 overlay · 32 stepper) */
8
+ size?: number;
9
+ ring?: boolean;
10
+ style?: React.CSSProperties;
11
+ }
12
+ export declare function StatusBadge(props: StatusBadgeProps): JSX.Element;
13
+ /** Tinted pill text badge for table statuses. 20px, 11px/500. */
14
+ export interface BadgeProps {
15
+ tone?: "success" | "danger" | "warning" | "info" | "neutral";
16
+ children?: React.ReactNode;
17
+ style?: React.CSSProperties;
18
+ }
19
+ export declare function Badge(props: BadgeProps): JSX.Element;
20
+ /** Tinted category icon tile. hue: source|join|transform|merge|output; kind: palette 40/r14 · node 48/r16 · row 32/r8. */
21
+ export interface IconTileProps {
22
+ icon: string;
23
+ hue?: "source" | "join" | "transform" | "merge" | "output";
24
+ kind?: "palette" | "node" | "row";
25
+ style?: React.CSSProperties;
26
+ }
27
+ export declare function IconTile(props: IconTileProps): JSX.Element;
@@ -0,0 +1,40 @@
1
+ import React from "react";
2
+ import { Icon } from "../icons/Icon.jsx";
3
+
4
+ const badgeTones = {
5
+ success: "var(--success)", danger: "var(--danger)", warning: "var(--warning)",
6
+ pending: "var(--dot-neutral)", info: "var(--action-primary)",
7
+ };
8
+
9
+ /** Circular status badge with white ring (node error/warning dots, step icons). */
10
+ export function StatusBadge({ tone = "danger", icon, size = 20, ring = true, style }) {
11
+ return (
12
+ <span style={{ width: size, height: size, borderRadius: "var(--radius-full)", background: badgeTones[tone], boxShadow: ring ? "var(--ring-surface)" : "none", display: "inline-flex", alignItems: "center", justifyContent: "center", color: "var(--on-accent)", flexShrink: 0, ...style }}>
13
+ {icon ? <Icon name={icon} size={Math.round(size * .6)} strokeWidth={2.5} /> : null}
14
+ </span>
15
+ );
16
+ }
17
+
18
+ /** Inline tinted text badge (table statuses: Completed / Failed / Partial). */
19
+ export function Badge({ tone = "neutral", children, style }) {
20
+ const tones = {
21
+ success: { background: "var(--success-bg)", color: "var(--success-text)" },
22
+ danger: { background: "var(--danger-bg)", color: "var(--danger-text)" },
23
+ warning: { background: "var(--warning-bg)", color: "var(--warning-text)" },
24
+ info: { background: "var(--info-bg)", color: "var(--action-primary)" },
25
+ neutral: { background: "var(--bg-hover)", color: "var(--text-body)" },
26
+ };
27
+ return <span style={{ display: "inline-flex", alignItems: "center", height: 20, padding: "0 8px", borderRadius: "var(--radius-full)", fontFamily: "var(--font-sans)", fontWeight: "var(--weight-medium)", fontSize: "var(--text-xs)", lineHeight: 1, letterSpacing: "var(--tracking-xs)", ...tones[tone], ...style }}>{children}</span>;
28
+ }
29
+
30
+ /** Category icon tile — the signature tinted square. kind: palette 40/r14 · node 48/r16 · row 32/r8 (hairline). */
31
+ export function IconTile({ icon, hue = "source", kind = "palette", style }) {
32
+ const dims = { palette: { box: 40, r: "var(--radius-tile)", icon: 18 }, node: { box: 48, r: "var(--radius-node)", icon: 22 }, row: { box: 32, r: "var(--radius-md)", icon: 16 } };
33
+ const t = dims[kind];
34
+ const tinted = kind !== "row";
35
+ return (
36
+ <span style={{ width: t.box, height: t.box, borderRadius: t.r, background: tinted ? `var(--cat-${hue}-bg)` : "var(--bg-surface)", border: tinted ? "none" : "1px solid var(--border-control)", display: "inline-flex", alignItems: "center", justifyContent: "center", color: tinted ? `var(--cat-${hue})` : "var(--text-body)", flexShrink: 0, boxSizing: "border-box", ...style }}>
37
+ <Icon name={icon} size={t.icon} strokeWidth={2} />
38
+ </span>
39
+ );
40
+ }
@@ -0,0 +1,47 @@
1
+ <script setup>
2
+ import { computed } from 'vue'
3
+ import Icon from '../icons/Icon.vue'
4
+ const badgeTones = { success: 'var(--success)', danger: 'var(--danger)', warning: 'var(--warning)', pending: 'var(--dot-neutral)', info: 'var(--action-primary)' }
5
+ // StatusBadge — circular status badge with white ring (node error/warning dots, step icons).
6
+ const props = defineProps({ tone: { type: String, default: 'danger' }, icon: String, size: { type: Number, default: 20 }, ring: { type: Boolean, default: true }, style: Object })
7
+ const iconSize = computed(() => Math.round(props.size * .6))
8
+ </script>
9
+ <template>
10
+ <span :style="{ width: size, height: size, borderRadius: 'var(--radius-full)', background: badgeTones[tone], boxShadow: ring ? 'var(--ring-surface)' : 'none', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', color: 'var(--on-accent)', flexShrink: 0, ...style }">
11
+ <Icon v-if="icon" :name="icon" :size="iconSize" :stroke-width="2.5" />
12
+ </span>
13
+ </template>
14
+
15
+ <!-- Badge — inline tinted text badge (table statuses: Completed / Failed / Partial). -->
16
+ <!--
17
+ <script setup name="Badge">
18
+ const tones = {
19
+ success: { background: 'var(--success-bg)', color: 'var(--success-text)' },
20
+ danger: { background: 'var(--danger-bg)', color: 'var(--danger-text)' },
21
+ warning: { background: 'var(--warning-bg)', color: 'var(--warning-text)' },
22
+ info: { background: 'var(--info-bg)', color: 'var(--action-primary)' },
23
+ neutral: { background: 'var(--bg-hover)', color: 'var(--text-body)' },
24
+ }
25
+ defineProps({ tone: { type: String, default: 'neutral' }, style: Object })
26
+ </script>
27
+ <template>
28
+ <span :style="{ display: 'inline-flex', alignItems: 'center', height: 20, padding: '0 8px', borderRadius: 'var(--radius-full)', fontFamily: 'var(--font-sans)', fontWeight: 'var(--weight-medium)', fontSize: 'var(--text-xs)', lineHeight: 1, letterSpacing: 'var(--tracking-xs)', ...tones[tone], ...style }"><slot /></span>
29
+ </template>
30
+ -->
31
+
32
+ <!-- IconTile — category icon tile — the signature tinted square. kind: palette 40/r14 · node 48/r16 · row 32/r8 (hairline). -->
33
+ <!--
34
+ <script setup name="IconTile">
35
+ import { computed } from 'vue'
36
+ import Icon from '../icons/Icon.vue'
37
+ const dims = { palette: { box: 40, r: 'var(--radius-tile)', icon: 18 }, node: { box: 48, r: 'var(--radius-node)', icon: 22 }, row: { box: 32, r: 'var(--radius-md)', icon: 16 } }
38
+ const props = defineProps({ icon: String, hue: { type: String, default: 'source' }, kind: { type: String, default: 'palette' }, style: Object })
39
+ const t = computed(() => dims[props.kind])
40
+ const tinted = computed(() => props.kind !== 'row')
41
+ </script>
42
+ <template>
43
+ <span :style="{ width: t.box, height: t.box, borderRadius: t.r, background: tinted ? `var(--cat-${hue}-bg)` : 'var(--bg-surface)', border: tinted ? 'none' : '1px solid var(--border-control)', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', color: tinted ? `var(--cat-${hue})` : 'var(--text-body)', flexShrink: 0, boxSizing: 'border-box', ...style }">
44
+ <Icon :name="icon" :size="t.icon" :stroke-width="2" />
45
+ </span>
46
+ </template>
47
+ -->
@@ -0,0 +1,27 @@
1
+ import * as React from "react";
2
+ /**
3
+ * White r10 hairline card, 21px padding (17px dense). Never elevated. Work in progress.
4
+ */
5
+ export interface CardProps {
6
+ /** 13px/500 header row */
7
+ title?: string;
8
+ /** Right-aligned header slot */
9
+ action?: React.ReactNode;
10
+ /** 17px padding */
11
+ dense?: boolean;
12
+ /** false = no padding (list containers) */
13
+ pad?: boolean;
14
+ children?: React.ReactNode;
15
+ style?: React.CSSProperties;
16
+ }
17
+ export declare function Card(props: CardProps): JSX.Element;
18
+ /** Stat card: muted label + 24px/300 numeral + optional chart child. */
19
+ export interface StatCardProps {
20
+ label: string;
21
+ value?: string | number;
22
+ /** 17px padding */
23
+ dense?: boolean;
24
+ children?: React.ReactNode;
25
+ style?: React.CSSProperties;
26
+ }
27
+ export declare function StatCard(props: StatCardProps): JSX.Element;
@@ -0,0 +1,27 @@
1
+ import React from "react";
2
+
3
+ /** White surface card — r10, hairline rgba(229,229,229,.6) border, flat. */
4
+ export function Card({ title, action, dense, pad = true, children, style }) {
5
+ return (
6
+ <div style={{ background: "var(--bg-surface)", borderRadius: "var(--radius-lg)", border: "1px solid var(--border-card)", boxSizing: "border-box", padding: pad ? (dense ? "var(--card-pad-sm)" : "var(--card-pad)") : 0, ...style }}>
7
+ {title ? (
8
+ <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 16 }}>
9
+ <span style={{ fontFamily: "var(--font-sans)", fontWeight: "var(--weight-medium)", fontSize: "var(--text-base)", lineHeight: "var(--leading-base)", letterSpacing: "var(--tracking-base)", color: "var(--text-heading)" }}>{title}</span>
10
+ {action}
11
+ </div>
12
+ ) : null}
13
+ {children}
14
+ </div>
15
+ );
16
+ }
17
+
18
+ /** Dashboard stat card: muted 13px label + light 24px number + optional chart slot. */
19
+ export function StatCard({ label, value, dense, children, style }) {
20
+ return (
21
+ <Card dense={dense} style={{ display: "flex", flexDirection: "column", gap: 12, ...style }}>
22
+ <span style={{ fontFamily: "var(--font-sans)", fontSize: "var(--text-base)", lineHeight: "var(--leading-base)", letterSpacing: "var(--tracking-base)", color: "var(--text-secondary)" }}>{label}</span>
23
+ {children}
24
+ {value != null ? <span style={{ fontFamily: "var(--font-sans)", fontWeight: "var(--weight-light)", fontSize: "var(--text-num)", lineHeight: "var(--leading-num)", letterSpacing: "var(--tracking-num)", color: "var(--text-primary)" }}>{value}</span> : null}
25
+ </Card>
26
+ );
27
+ }
@@ -0,0 +1,28 @@
1
+ <script setup>
2
+ // White surface card — r10, hairline rgba(229,229,229,.6) border, flat.
3
+ defineProps({ title: String, dense: Boolean, pad: { type: Boolean, default: true }, style: Object })
4
+ </script>
5
+ <template>
6
+ <div :style="{ background: 'var(--bg-surface)', borderRadius: 'var(--radius-lg)', border: '1px solid var(--border-card)', boxSizing: 'border-box', padding: pad ? (dense ? 'var(--card-pad-sm)' : 'var(--card-pad)') : 0, ...style }">
7
+ <div v-if="title" style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
8
+ <span style="font-family:var(--font-sans);font-weight:var(--weight-medium);font-size:var(--text-base);line-height:var(--leading-base);letter-spacing:var(--tracking-base);color:var(--text-heading)">{{ title }}</span>
9
+ <slot name="action" />
10
+ </div>
11
+ <slot />
12
+ </div>
13
+ </template>
14
+
15
+ <!-- StatCard — dashboard stat card: muted 13px label + light 24px number + optional chart slot. -->
16
+ <!--
17
+ <script setup name="StatCard">
18
+ import Card from './Card.vue'
19
+ defineProps({ label: String, value: [String, Number], dense: Boolean, style: Object })
20
+ </script>
21
+ <template>
22
+ <Card :dense="dense" :style="{ display: 'flex', flexDirection: 'column', gap: 12, ...style }">
23
+ <span style="font-family:var(--font-sans);font-size:var(--text-base);line-height:var(--leading-base);letter-spacing:var(--tracking-base);color:var(--text-secondary)">{{ label }}</span>
24
+ <slot />
25
+ <span v-if="value != null" style="font-family:var(--font-sans);font-weight:var(--weight-light);font-size:var(--text-num);line-height:var(--leading-num);letter-spacing:var(--tracking-num);color:var(--text-primary)">{{ value }}</span>
26
+ </Card>
27
+ </template>
28
+ -->
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ /** Hairline rule, optionally labeled or vertical. Addition — formalizes the ad-hoc 1px separator div used everywhere. */
3
+ export interface DividerProps {
4
+ label?: string;
5
+ vertical?: boolean;
6
+ style?: React.CSSProperties;
7
+ }
8
+ export declare function Divider(props: DividerProps): JSX.Element;
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+
3
+ /** Hairline rule. Pass `label` for a centered caption ("OR", "Advanced Settings"); `vertical` for a column rule. */
4
+ export function Divider({ label, vertical, style }) {
5
+ if (vertical) return <span style={{ width: 1, alignSelf: "stretch", background: "var(--border-subtle)", ...style }} />;
6
+ if (!label) return <div style={{ height: 1, background: "var(--border-subtle)", ...style }} />;
7
+ return (
8
+ <div style={{ display: "flex", alignItems: "center", gap: 12, ...style }}>
9
+ <div style={{ flex: 1, height: 1, background: "var(--border-subtle)" }} />
10
+ <span style={{ fontFamily: "var(--font-sans)", fontSize: "var(--text-xs)", letterSpacing: "var(--tracking-xs)", color: "var(--text-muted)", whiteSpace: "nowrap" }}>{label}</span>
11
+ <div style={{ flex: 1, height: 1, background: "var(--border-subtle)" }} />
12
+ </div>
13
+ );
14
+ }
@@ -0,0 +1,13 @@
1
+ <script setup>
2
+ // Hairline rule. Pass `label` for a centered caption ("OR", "Advanced Settings"); `vertical` for a column rule.
3
+ defineProps({ label: String, vertical: Boolean, style: Object })
4
+ </script>
5
+ <template>
6
+ <span v-if="vertical" :style="{ width: 1, alignSelf: 'stretch', background: 'var(--border-subtle)', ...style }" />
7
+ <div v-else-if="!label" :style="{ height: 1, background: 'var(--border-subtle)', ...style }" />
8
+ <div v-else :style="{ display: 'flex', alignItems: 'center', gap: 12, ...style }">
9
+ <div style="flex:1;height:1px;background:var(--border-subtle)" />
10
+ <span style="font-family:var(--font-sans);font-size:var(--text-xs);letter-spacing:var(--tracking-xs);color:var(--text-muted);white-space:nowrap">{{ label }}</span>
11
+ <div style="flex:1;height:1px;background:var(--border-subtle)" />
12
+ </div>
13
+ </template>
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ /** Keyboard shortcut keycap row (20px, mono). Addition — for a power-user data tool's shortcut hints. */
3
+ export interface KbdProps {
4
+ keys?: string[];
5
+ style?: React.CSSProperties;
6
+ }
7
+ export declare function Kbd(props: KbdProps): JSX.Element;
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+
3
+ /** Keyboard shortcut hint, e.g. <Kbd keys={["⌘","K"]}/>. */
4
+ export function Kbd({ keys = [], style }) {
5
+ return (
6
+ <span style={{ display: "inline-flex", gap: 3, ...style }}>
7
+ {keys.map((k, i) => (
8
+ <span key={i} style={{ display: "inline-flex", alignItems: "center", justifyContent: "center", minWidth: 20, height: 20, padding: "0 5px", borderRadius: "var(--radius-sm)", background: "var(--bg-inset)", border: "1px solid var(--border-control)", boxSizing: "border-box", fontFamily: "var(--font-mono)", fontSize: "var(--text-xs)", color: "var(--text-secondary)" }}>{k}</span>
9
+ ))}
10
+ </span>
11
+ );
12
+ }
@@ -0,0 +1,9 @@
1
+ <script setup>
2
+ // Keyboard shortcut hint, e.g. <Kbd :keys="['⌘','K']"/>.
3
+ defineProps({ keys: { type: Array, default: () => [] }, style: Object })
4
+ </script>
5
+ <template>
6
+ <span :style="{ display: 'inline-flex', gap: 3, ...style }">
7
+ <span v-for="(k, i) in keys" :key="i" style="display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 5px;border-radius:var(--radius-sm);background:var(--bg-inset);border:1px solid var(--border-control);box-sizing:border-box;font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-secondary)">{{ k }}</span>
8
+ </span>
9
+ </template>
@@ -0,0 +1,42 @@
1
+ import * as React from "react";
2
+ /** Labeled 6px progress bar (Expense Distribution). */
3
+ export interface ProgressBarProps {
4
+ label?: string;
5
+ /** 0–100 */
6
+ value?: number;
7
+ color?: string;
8
+ showValue?: boolean;
9
+ style?: React.CSSProperties;
10
+ }
11
+ export declare function ProgressBar(props: ProgressBarProps): JSX.Element;
12
+ /** Ring chart with centered 20px/300 numeral (Budget vs Actual, Task Distribution). */
13
+ export interface DonutProps {
14
+ size?: number;
15
+ thickness?: number;
16
+ /** Multi-segment mode: [{value(0-100), color}] */
17
+ segments?: { value: number; color: string }[];
18
+ /** Single-value mode 0–100 */
19
+ value?: number;
20
+ /** Center text override */
21
+ label?: string;
22
+ style?: React.CSSProperties;
23
+ }
24
+ export declare function Donut(props: DonutProps): JSX.Element;
25
+ /** Blue 1.22px line + gradient area (Revenue Trend). */
26
+ export interface AreaChartProps {
27
+ points?: number[];
28
+ width?: number;
29
+ height?: number;
30
+ color?: string;
31
+ style?: React.CSSProperties;
32
+ }
33
+ export declare function AreaChart(props: AreaChartProps): JSX.Element;
34
+ /** Rounded mini bar chart for stat cards. */
35
+ export interface MiniBarsProps {
36
+ bars?: number[];
37
+ width?: number;
38
+ height?: number;
39
+ color?: string;
40
+ style?: React.CSSProperties;
41
+ }
42
+ export declare function MiniBars(props: MiniBarsProps): JSX.Element;
@@ -0,0 +1,70 @@
1
+ import React from "react";
2
+
3
+ /** Labeled horizontal progress bar (Expense Distribution rows). */
4
+ export function ProgressBar({ label, value = 50, color = "var(--chart-blue)", showValue = true, style }) {
5
+ return (
6
+ <div style={{ display: "flex", flexDirection: "column", gap: 4, ...style }}>
7
+ {label != null ? (
8
+ <div style={{ display: "flex", justifyContent: "space-between", fontFamily: "var(--font-sans)", fontSize: "var(--text-base)", lineHeight: "var(--leading-base)", letterSpacing: "var(--tracking-base)" }}>
9
+ <span style={{ color: "var(--text-body)" }}>{label}</span>
10
+ {showValue ? <span style={{ color: "var(--text-heading)" }}>{value}%</span> : null}
11
+ </div>
12
+ ) : null}
13
+ <div style={{ height: 6, borderRadius: "var(--radius-full)", background: "var(--track)", overflow: "hidden" }}>
14
+ <div style={{ width: `${value}%`, height: "100%", borderRadius: "var(--radius-full)", background: color, transition: "width .3s ease" }} />
15
+ </div>
16
+ </div>
17
+ );
18
+ }
19
+
20
+ /** Ring/donut chart. segments: [{value, color}]; centered light numeral. */
21
+ export function Donut({ size = 128, thickness = 7.68, segments, value = 75, label, style }) {
22
+ const r = (size - thickness) / 2 - (size * .1 - thickness / 2 > 0 ? size * .1 - thickness / 2 : 0);
23
+ const R = size / 2 - thickness / 2 - size * .02;
24
+ const C = 2 * Math.PI * R;
25
+ const segs = segments || [{ value, color: "var(--chart-blue)" }];
26
+ let offset = 0;
27
+ return (
28
+ <div style={{ position: "relative", width: size, height: size, ...style }}>
29
+ <svg width={size} height={size} style={{ transform: "rotate(-90deg)" }}>
30
+ <circle cx={size / 2} cy={size / 2} r={R} fill="none" stroke="var(--track)" strokeWidth={thickness} />
31
+ {segs.map((s, i) => {
32
+ const len = (s.value / 100) * C;
33
+ const el = <circle key={i} cx={size / 2} cy={size / 2} r={R} fill="none" stroke={s.color} strokeWidth={thickness} strokeDasharray={`${len} ${C - len}`} strokeDashoffset={-offset} strokeLinecap="butt" />;
34
+ offset += len;
35
+ return el;
36
+ })}
37
+ </svg>
38
+ <div style={{ position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center", fontFamily: "var(--font-sans)", fontWeight: "var(--weight-light)", fontSize: 20, letterSpacing: "var(--tracking-xl)", color: "var(--text-primary)" }}>{label != null ? label : `${value}%`}</div>
39
+ </div>
40
+ );
41
+ }
42
+
43
+ /** Area line chart (Revenue Trend): 1.22px blue line + fading gradient fill. points: 0–100 values. */
44
+ export function AreaChart({ points = [65, 75, 60, 85, 70, 90, 85, 95, 100], width = 350, height = 128, color = "var(--chart-blue)", style }) {
45
+ const step = width / (points.length - 1);
46
+ const ys = points.map((p) => height - (p / 100) * height * .48 - height * .5);
47
+ const line = ys.map((y, i) => `${i ? "L" : "M"} ${i * step} ${y}`).join(" ");
48
+ const id = React.useId ? React.useId().replace(/:/g, "") : "g" + Math.round(Math.random() * 1e6);
49
+ return (
50
+ <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} style={{ display: "block", ...style }}>
51
+ <defs><linearGradient id={id} x1="0" y1="0" x2="0" y2="1"><stop offset="0" stopColor={color} stopOpacity=".3" /><stop offset="1" stopColor={color} stopOpacity="0" /></linearGradient></defs>
52
+ <path d={`${line} L ${width} ${height} L 0 ${height} Z`} fill={`url(#${id})`} />
53
+ <path d={line} fill="none" stroke={color} strokeWidth="1.22" />
54
+ </svg>
55
+ );
56
+ }
57
+
58
+ /** Mini bar chart used in stat cards. bars: 0–100 values. */
59
+ export function MiniBars({ bars = [40, 65, 50, 80, 60, 90, 70], width = 248, height = 96, color = "var(--chart-blue)", style }) {
60
+ const gap = 6;
61
+ const bw = (width - gap * (bars.length - 1)) / bars.length;
62
+ return (
63
+ <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} style={{ display: "block", ...style }}>
64
+ {bars.map((b, i) => {
65
+ const h = (b / 100) * height;
66
+ return <rect key={i} x={i * (bw + gap)} y={height - h} width={bw} height={h} rx={2} fill={color} opacity={.85} />;
67
+ })}
68
+ </svg>
69
+ );
70
+ }
@@ -0,0 +1,69 @@
1
+ <script setup>
2
+ // Labeled horizontal progress bar (Expense Distribution rows).
3
+ defineProps({ label: String, value: { type: Number, default: 50 }, color: { type: String, default: 'var(--chart-blue)' }, showValue: { type: Boolean, default: true }, style: Object })
4
+ </script>
5
+ <template>
6
+ <div :style="{ display: 'flex', flexDirection: 'column', gap: 4, ...style }">
7
+ <div v-if="label != null" style="display:flex;justify-content:space-between;font-family:var(--font-sans);font-size:var(--text-base);line-height:var(--leading-base);letter-spacing:var(--tracking-base)">
8
+ <span style="color:var(--text-body)">{{ label }}</span>
9
+ <span v-if="showValue" style="color:var(--text-heading)">{{ value }}%</span>
10
+ </div>
11
+ <div style="height:6px;border-radius:var(--radius-full);background:var(--track);overflow:hidden">
12
+ <div :style="{ width: value + '%', height: '100%', borderRadius: 'var(--radius-full)', background: color, transition: 'width .3s ease' }" />
13
+ </div>
14
+ </div>
15
+ </template>
16
+
17
+ <!-- Donut — ring/donut chart. segments: [{value, color}]; centered light numeral. -->
18
+ <!--
19
+ <script setup name="Donut">
20
+ import { computed } from 'vue'
21
+ const props = defineProps({ size: { type: Number, default: 128 }, thickness: { type: Number, default: 7.68 }, segments: Array, value: { type: Number, default: 75 }, label: [String, Number], style: Object })
22
+ const R = computed(() => props.size / 2 - props.thickness / 2 - props.size * .02)
23
+ const C = computed(() => 2 * Math.PI * R.value)
24
+ const segs = computed(() => props.segments || [{ value: props.value, color: 'var(--chart-blue)' }])
25
+ const arcs = computed(() => { let offset = 0; return segs.value.map(s => { const len = (s.value / 100) * C.value; const a = { ...s, len, offset }; offset += len; return a }) })
26
+ </script>
27
+ <template>
28
+ <div :style="{ position: 'relative', width: size, height: size, ...style }">
29
+ <svg :width="size" :height="size" style="transform:rotate(-90deg)">
30
+ <circle :cx="size / 2" :cy="size / 2" :r="R" fill="none" stroke="var(--track)" :stroke-width="thickness" />
31
+ <circle v-for="(s, i) in arcs" :key="i" :cx="size / 2" :cy="size / 2" :r="R" fill="none" :stroke="s.color" :stroke-width="thickness" :stroke-dasharray="`${s.len} ${C - s.len}`" :stroke-dashoffset="-s.offset" stroke-linecap="butt" />
32
+ </svg>
33
+ <div style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-family:var(--font-sans);font-weight:var(--weight-light);font-size:20px;letter-spacing:var(--tracking-xl);color:var(--text-primary)">{{ label != null ? label : `${value}%` }}</div>
34
+ </div>
35
+ </template>
36
+ -->
37
+
38
+ <!-- AreaChart — area line chart (Revenue Trend): 1.22px blue line + fading gradient fill. points: 0–100 values. -->
39
+ <!--
40
+ <script setup name="AreaChart">
41
+ import { computed } from 'vue'
42
+ const props = defineProps({ points: { type: Array, default: () => [65, 75, 60, 85, 70, 90, 85, 95, 100] }, width: { type: Number, default: 350 }, height: { type: Number, default: 128 }, color: { type: String, default: 'var(--chart-blue)' }, style: Object })
43
+ const gid = 'g' + Math.round(Math.random() * 1e6)
44
+ const step = computed(() => props.width / (props.points.length - 1))
45
+ const line = computed(() => props.points.map((p, i) => `${i ? 'L' : 'M'} ${i * step.value} ${props.height - (p / 100) * props.height * .48 - props.height * .5}`).join(' '))
46
+ </script>
47
+ <template>
48
+ <svg :width="width" :height="height" :viewBox="`0 0 ${width} ${height}`" :style="{ display: 'block', ...style }">
49
+ <defs><linearGradient :id="gid" x1="0" y1="0" x2="0" y2="1"><stop offset="0" :stop-color="color" stop-opacity=".3" /><stop offset="1" :stop-color="color" stop-opacity="0" /></linearGradient></defs>
50
+ <path :d="`${line} L ${width} ${height} L 0 ${height} Z`" :fill="`url(#${gid})`" />
51
+ <path :d="line" fill="none" :stroke="color" stroke-width="1.22" />
52
+ </svg>
53
+ </template>
54
+ -->
55
+
56
+ <!-- MiniBars — mini bar chart used in stat cards. bars: 0–100 values. -->
57
+ <!--
58
+ <script setup name="MiniBars">
59
+ import { computed } from 'vue'
60
+ const props = defineProps({ bars: { type: Array, default: () => [40, 65, 50, 80, 60, 90, 70] }, width: { type: Number, default: 248 }, height: { type: Number, default: 96 }, color: { type: String, default: 'var(--chart-blue)' }, style: Object })
61
+ const gap = 6
62
+ const bw = computed(() => (props.width - gap * (props.bars.length - 1)) / props.bars.length)
63
+ </script>
64
+ <template>
65
+ <svg :width="width" :height="height" :viewBox="`0 0 ${width} ${height}`" :style="{ display: 'block', ...style }">
66
+ <rect v-for="(b, i) in bars" :key="i" :x="i * (bw + gap)" :y="height - (b / 100) * height" :width="bw" :height="(b / 100) * height" rx="2" :fill="color" opacity=".85" />
67
+ </svg>
68
+ </template>
69
+ -->
@@ -0,0 +1,9 @@
1
+ import * as React from "react";
2
+ /** Small removable filter tag (22px, full radius). Addition — distinct from Badge/ActionChip. */
3
+ export interface TagProps {
4
+ children?: React.ReactNode;
5
+ onRemove?: () => void;
6
+ tone?: "neutral" | "info";
7
+ style?: React.CSSProperties;
8
+ }
9
+ export declare function Tag(props: TagProps): JSX.Element;
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import { Icon } from "../icons/Icon.jsx";
3
+
4
+ const tones = { neutral: { bg: "var(--bg-hover)", fg: "var(--text-body)" }, info: { bg: "var(--info-bg)", fg: "var(--info-fg)" } };
5
+
6
+ /** Small removable filter tag — distinct from Badge (status) and ActionChip (bulk action). */
7
+ export function Tag({ children, onRemove, tone = "neutral", style }) {
8
+ const t = tones[tone] || tones.neutral;
9
+ return (
10
+ <span style={{ display: "inline-flex", alignItems: "center", gap: 4, height: 22, padding: onRemove ? "0 6px 0 10px" : "0 10px", borderRadius: "var(--radius-full)", background: t.bg, color: t.fg, fontFamily: "var(--font-sans)", fontSize: "var(--text-xs)", fontWeight: "var(--weight-medium)", letterSpacing: "var(--tracking-xs)", ...style }}>
11
+ {children}
12
+ {onRemove ? <button type="button" onClick={onRemove} style={{ border: "none", background: "transparent", cursor: "pointer", color: "inherit", opacity: .7, display: "flex", padding: 0 }}><Icon name="x" size={11} /></button> : null}
13
+ </span>
14
+ );
15
+ }