@heyramzi/ui 2.24.0 → 3.1.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 (860) hide show
  1. package/COMPONENTS.md +13 -9
  2. package/README.md +5 -4
  3. package/dist/canvas/index.js +0 -1
  4. package/dist/canvas/pen/node-name.svelte.js +25 -0
  5. package/dist/canvas/ui/tools.js +7 -0
  6. package/dist/charts/chart-a11y.js +59 -0
  7. package/dist/charts/dashboard/index.js +0 -1
  8. package/dist/charts/dual-axis.js +38 -0
  9. package/dist/components/data-table/menu-key.js +19 -0
  10. package/dist/components/list-page/index.js +0 -1
  11. package/dist/components/theme/index.js +0 -1
  12. package/dist/components/toolbar/index.js +2 -4
  13. package/dist/components/work-parts/index.js +0 -1
  14. package/dist/editor/block-move.js +40 -0
  15. package/dist/editor/doc-blocks.js +2 -2
  16. package/dist/editor/extensions.js +14 -1
  17. package/dist/effects/border-beam/index.js +2 -0
  18. package/dist/effects/image-comparison/index.js +1 -0
  19. package/dist/effects/interactive-hover-button/index.js +1 -0
  20. package/dist/effects/magic-card/index.js +1 -0
  21. package/dist/effects/marquee/index.js +1 -0
  22. package/dist/effects/progressive-blur/index.js +1 -0
  23. package/dist/effects/spotlight/index.js +1 -0
  24. package/dist/effects/theme-toggle/index.js +1 -0
  25. package/dist/inbox/index.js +1 -1
  26. package/dist/lib/focus.js +15 -0
  27. package/dist/lib/tone.js +3 -4
  28. package/dist/shadcn/alert/alert-variants.js +1 -1
  29. package/dist/shadcn/attachment/context.js +10 -0
  30. package/dist/shadcn/dropdown-menu/menu-item.js +1 -1
  31. package/dist/shadcn/hooks/highlighter.js +58 -5
  32. package/dist/shadcn/sidebar/constants.js +1 -1
  33. package/dist/shadcn/sidebar/context.svelte.js +12 -1
  34. package/dist/slides/deck-controller.svelte.js +64 -34
  35. package/dist/slides/layout.js +3 -2
  36. package/dist/status/index.js +0 -1
  37. package/dist/work/index.js +0 -1
  38. package/dist/work/kanban-keyboard.js +10 -5
  39. package/package.json +44 -107
  40. package/scripts/svelte-dts.mjs +65 -0
  41. package/scripts/sync-shadcn.mjs +3 -1
  42. package/src/agents/agent-avatar.svelte +24 -12
  43. package/src/agents/agent-avatar.svelte.d.ts +6 -0
  44. package/src/agents/agent-avatar.test.ts +40 -0
  45. package/src/agents/agent-cast.svelte +83 -78
  46. package/src/agents/agent-cast.svelte.d.ts +20 -0
  47. package/src/agents/types.ts +1 -0
  48. package/src/ai/ai-button/AiButton.svelte +21 -10
  49. package/src/ai/ai-button/AiButton.svelte.d.ts +16 -0
  50. package/src/ai/ai-button/ai-button.svelte.test.ts +27 -0
  51. package/src/ai/confirmation/Confirmation.svelte +20 -4
  52. package/src/ai/confirmation/Confirmation.svelte.d.ts +12 -0
  53. package/src/ai/confirmation/ConfirmationAction.svelte +10 -3
  54. package/src/ai/confirmation/ConfirmationAction.svelte.d.ts +8 -0
  55. package/src/ai/confirmation/ConfirmationActions.svelte.d.ts +9 -0
  56. package/src/ai/confirmation/ConfirmationState.svelte.d.ts +10 -0
  57. package/src/ai/confirmation/ConfirmationTitle.svelte.d.ts +9 -0
  58. package/src/ai/confirmation/confirmation-focus.test.svelte +33 -0
  59. package/src/ai/confirmation/confirmation-focus.test.svelte.d.ts +8 -0
  60. package/src/ai/confirmation/confirmation-focus.test.ts +34 -0
  61. package/src/ai/confirmation/confirmation-parts.test.svelte.d.ts +7 -0
  62. package/src/ai/generation-progress/GenerationProgress.svelte +198 -171
  63. package/src/ai/generation-progress/GenerationProgress.svelte.d.ts +15 -0
  64. package/src/ai/generation-progress/generation-progress.test.ts +37 -0
  65. package/src/ai/loading-state/PixelLoader.svelte +41 -36
  66. package/src/ai/loading-state/PixelLoader.svelte.d.ts +13 -0
  67. package/src/ai/prompt-input/PromptInput.svelte +1 -1
  68. package/src/ai/prompt-input/PromptInput.svelte.d.ts +14 -0
  69. package/src/ai/prompt-input/PromptInputBody.svelte.d.ts +9 -0
  70. package/src/ai/prompt-input/PromptInputSubmit.svelte +3 -3
  71. package/src/ai/prompt-input/PromptInputSubmit.svelte.d.ts +19 -0
  72. package/src/ai/prompt-input/PromptInputTextarea.svelte +6 -1
  73. package/src/ai/prompt-input/PromptInputTextarea.svelte.d.ts +14 -0
  74. package/src/ai/prompt-input/PromptInputToolbar.svelte.d.ts +9 -0
  75. package/src/ai/prompt-input/prompt-input.test.ts +64 -0
  76. package/src/ai/reasoning/Reasoning.svelte.d.ts +10 -0
  77. package/src/ai/reasoning/ReasoningContent.svelte.d.ts +8 -0
  78. package/src/ai/reasoning/ReasoningTrigger.svelte +2 -1
  79. package/src/ai/reasoning/ReasoningTrigger.svelte.d.ts +8 -0
  80. package/src/ai/response/Response.css +23 -19
  81. package/src/ai/response/Response.svelte.d.ts +11 -0
  82. package/src/ai/suggestion/Suggestion.svelte.d.ts +10 -0
  83. package/src/ai/suggestion/Suggestions.svelte +5 -2
  84. package/src/ai/suggestion/Suggestions.svelte.d.ts +11 -0
  85. package/src/ai/typing-dots/TypingDots.css +27 -23
  86. package/src/ai/typing-dots/TypingDots.svelte.d.ts +12 -0
  87. package/src/ai/voice-waveform/VoiceWaveform.css +31 -27
  88. package/src/ai/voice-waveform/VoiceWaveform.svelte.d.ts +10 -0
  89. package/src/animations/avatar-group-hover.css +25 -21
  90. package/src/animations/card-tilt.css +71 -65
  91. package/src/animations/digit-pop-in.css +49 -40
  92. package/src/animations/dropdown.css +125 -107
  93. package/src/animations/input-clear-dissolve.css +69 -59
  94. package/src/animations/input-shake.css +55 -48
  95. package/src/animations/learn-more-hover.css +53 -43
  96. package/src/animations/like-button.css +74 -62
  97. package/src/animations/modal.css +83 -74
  98. package/src/animations/page-side-by-side.css +50 -42
  99. package/src/animations/plus-menu-morph.css +96 -87
  100. package/src/animations/resize.css +16 -13
  101. package/src/animations/shimmer-text.css +46 -40
  102. package/src/animations/spinning-counter.css +50 -43
  103. package/src/animations/success-check.css +69 -58
  104. package/src/animations/text-swap.css +35 -31
  105. package/src/animations/thinking-states.css +61 -54
  106. package/src/canvas/card/card-frame.svelte.d.ts +14 -0
  107. package/src/canvas/card/card.css +16 -10
  108. package/src/canvas/card/resize-handles.svelte.d.ts +11 -0
  109. package/src/canvas/chrome/chrome-zoom.svelte.d.ts +3 -0
  110. package/src/canvas/chrome/chrome.css +75 -69
  111. package/src/canvas/chrome/lock-badge.svelte.d.ts +8 -0
  112. package/src/canvas/chrome/side-handles.svelte.d.ts +6 -0
  113. package/src/canvas/chrome/size-chip.svelte.d.ts +3 -0
  114. package/src/canvas/chrome/snap-guides.svelte +16 -12
  115. package/src/canvas/chrome/snap-guides.svelte.d.ts +9 -0
  116. package/src/canvas/components/icons/ToolIcon.svelte.d.ts +8 -0
  117. package/src/canvas/components/shared/svg/PreviewSvg.svelte +9 -5
  118. package/src/canvas/components/shared/svg/PreviewSvg.svelte.d.ts +13 -0
  119. package/src/canvas/components/shared/svg/ShapeOutline.svelte +8 -4
  120. package/src/canvas/components/shared/svg/ShapeOutline.svelte.d.ts +15 -0
  121. package/src/canvas/components/shared/svg/StrokeNode.svelte +21 -11
  122. package/src/canvas/components/shared/svg/StrokeNode.svelte.d.ts +5 -0
  123. package/src/canvas/components/shared/svg/TextRule.svelte +8 -4
  124. package/src/canvas/components/shared/svg/TextRule.svelte.d.ts +9 -0
  125. package/src/canvas/edges/bend-handle.svelte +18 -14
  126. package/src/canvas/edges/bend-handle.svelte.d.ts +10 -0
  127. package/src/canvas/edges/edge-gradient.svelte.d.ts +16 -0
  128. package/src/canvas/edges/gradient-edge.svelte.d.ts +21 -0
  129. package/src/canvas/index.ts +0 -1
  130. package/src/canvas/lod/lod-switch.svelte +38 -33
  131. package/src/canvas/lod/lod-switch.svelte.d.ts +14 -0
  132. package/src/canvas/pen/PenField.svelte.d.ts +26 -0
  133. package/src/canvas/pen/PenOverlay.svelte +10 -6
  134. package/src/canvas/pen/PenOverlay.svelte.d.ts +23 -0
  135. package/src/canvas/pen/ShapeNode.svelte +6 -0
  136. package/src/canvas/pen/ShapeNode.svelte.d.ts +5 -0
  137. package/src/canvas/pen/TextNode.svelte +12 -2
  138. package/src/canvas/pen/TextNode.svelte.d.ts +5 -0
  139. package/src/canvas/pen/host-field.test.svelte.d.ts +6 -0
  140. package/src/canvas/pen/node-name.svelte.ts +32 -0
  141. package/src/canvas/pen/pen.css +69 -63
  142. package/src/canvas/screen/GlyphIcon.svelte.d.ts +9 -0
  143. package/src/canvas/screen/PartView.svelte +25 -25
  144. package/src/canvas/screen/PartView.svelte.d.ts +17 -0
  145. package/src/canvas/screen/ScreenBody.svelte +4 -4
  146. package/src/canvas/screen/ScreenBody.svelte.d.ts +11 -0
  147. package/src/canvas/screen/ScreenCard.svelte.d.ts +9 -0
  148. package/src/canvas/screen/screen.css +509 -505
  149. package/src/canvas/ui/CanvasToolbar.svelte.d.ts +30 -0
  150. package/src/canvas/ui/FrameLayer.svelte +18 -14
  151. package/src/canvas/ui/FrameLayer.svelte.d.ts +9 -0
  152. package/src/canvas/ui/PenLayer.svelte.d.ts +15 -0
  153. package/src/canvas/ui/StylePanel.svelte +41 -37
  154. package/src/canvas/ui/StylePanel.svelte.d.ts +32 -0
  155. package/src/canvas/ui/canvas-grid.svelte.d.ts +11 -0
  156. package/src/canvas/ui/canvas-ui.css +286 -277
  157. package/src/canvas/ui/tools.test.ts +39 -0
  158. package/src/canvas/ui/tools.ts +8 -0
  159. package/src/charts/README.md +2 -2
  160. package/src/charts/animated-value.css +6 -2
  161. package/src/charts/animated-value.svelte.d.ts +24 -0
  162. package/src/charts/area-chart.css +33 -21
  163. package/src/charts/area-chart.svelte +157 -27
  164. package/src/charts/area-chart.svelte.d.ts +69 -0
  165. package/src/charts/bar-chart.css +112 -102
  166. package/src/charts/bar-chart.svelte +39 -41
  167. package/src/charts/bar-chart.svelte.d.ts +64 -0
  168. package/src/charts/chart-a11y.css +23 -0
  169. package/src/charts/chart-a11y.test.ts +59 -0
  170. package/src/charts/chart-a11y.ts +92 -0
  171. package/src/charts/chart-plot.svelte +106 -0
  172. package/src/charts/chart-plot.svelte.d.ts +18 -0
  173. package/src/charts/chart-tokens.css +53 -51
  174. package/src/charts/charts.css +154 -142
  175. package/src/charts/crosshair.svelte.d.ts +7 -0
  176. package/src/charts/dashboard/dashboard-section.svelte +19 -3
  177. package/src/charts/dashboard/dashboard-section.svelte.d.ts +17 -0
  178. package/src/charts/dashboard/data-table.svelte +1 -1
  179. package/src/charts/dashboard/data-table.svelte.d.ts +86 -0
  180. package/src/charts/dashboard/index.ts +0 -1
  181. package/src/charts/dashboard/panel-grid.svelte +1 -1
  182. package/src/charts/dashboard/panel-grid.svelte.d.ts +14 -0
  183. package/src/charts/dashboard/period-filter.svelte.d.ts +37 -0
  184. package/src/charts/dashboard/rating-chip.svelte.d.ts +9 -0
  185. package/src/charts/dashboard/stat-band.svelte.d.ts +14 -0
  186. package/src/charts/dashboard/stat-tile.svelte +9 -5
  187. package/src/charts/dashboard/stat-tile.svelte.d.ts +62 -0
  188. package/src/charts/donut-chart.css +52 -46
  189. package/src/charts/donut-chart.svelte.d.ts +39 -0
  190. package/src/charts/dual-axis.test.ts +40 -0
  191. package/src/charts/dual-axis.ts +43 -0
  192. package/src/charts/edge-fade.svelte.d.ts +9 -0
  193. package/src/charts/figure.css +104 -91
  194. package/src/charts/figure.svelte.d.ts +40 -0
  195. package/src/charts/gauge-chart.css +74 -70
  196. package/src/charts/gauge-chart.svelte.d.ts +58 -0
  197. package/src/charts/hover-focus.svelte.d.ts +14 -0
  198. package/src/charts/legend.css +112 -108
  199. package/src/charts/legend.svelte +3 -3
  200. package/src/charts/legend.svelte.d.ts +30 -0
  201. package/src/charts/line-chart.css +27 -21
  202. package/src/charts/line-chart.svelte +61 -37
  203. package/src/charts/line-chart.svelte.d.ts +53 -0
  204. package/src/charts/number-chart.css +185 -163
  205. package/src/charts/number-chart.svelte +8 -4
  206. package/src/charts/number-chart.svelte.d.ts +58 -0
  207. package/src/charts/pop-value.svelte.d.ts +9 -0
  208. package/src/charts/primitives/chart-container.svelte.d.ts +9 -0
  209. package/src/charts/primitives/chart-style.svelte.d.ts +8 -0
  210. package/src/charts/primitives/chart-tooltip.svelte +1 -1
  211. package/src/charts/primitives/chart-tooltip.svelte.d.ts +26 -0
  212. package/src/charts/reference-line.css +18 -14
  213. package/src/charts/reference-line.svelte.d.ts +15 -0
  214. package/src/charts/reveal.svelte.d.ts +9 -0
  215. package/src/charts/ring-chart.css +82 -78
  216. package/src/charts/ring-chart.svelte +3 -3
  217. package/src/charts/ring-chart.svelte.d.ts +41 -0
  218. package/src/charts/sparkline.css +43 -34
  219. package/src/charts/sparkline.svelte +52 -8
  220. package/src/charts/sparkline.svelte.d.ts +51 -0
  221. package/src/charts/stat-card.css +110 -92
  222. package/src/charts/stat-card.svelte.d.ts +65 -0
  223. package/src/charts/time-series-chart.css +24 -19
  224. package/src/charts/time-series-chart.svelte +43 -10
  225. package/src/charts/time-series-chart.svelte.d.ts +30 -0
  226. package/src/charts/trend-pill.css +39 -32
  227. package/src/charts/trend-pill.svelte.d.ts +14 -0
  228. package/src/class-tokens.test.ts +34 -0
  229. package/src/components/chip/count-chip.svelte.d.ts +12 -0
  230. package/src/components/chip/tag-chip.svelte +6 -6
  231. package/src/components/chip/tag-chip.svelte.d.ts +20 -0
  232. package/src/components/copy/copy-button.svelte +22 -18
  233. package/src/components/copy/copy-button.svelte.d.ts +37 -0
  234. package/src/components/data-table/infinite-scroll.svelte.d.ts +37 -0
  235. package/src/components/data-table/menu-key.ts +22 -0
  236. package/src/components/data-table/pagination.svelte +36 -11
  237. package/src/components/data-table/pagination.svelte.d.ts +14 -0
  238. package/src/components/data-table/row-arrow.svelte.d.ts +6 -0
  239. package/src/components/data-table/row-context-menu.svelte +7 -6
  240. package/src/components/data-table/row-context-menu.svelte.d.ts +15 -0
  241. package/src/components/data-table/sortable-head.svelte +13 -18
  242. package/src/components/data-table/sortable-head.svelte.d.ts +38 -0
  243. package/src/components/data-table/table-skeleton.svelte.d.ts +18 -0
  244. package/src/components/docs/doc-page.svelte +8 -4
  245. package/src/components/docs/doc-page.svelte.d.ts +34 -0
  246. package/src/components/docs/on-this-page.svelte +109 -101
  247. package/src/components/docs/on-this-page.svelte.d.ts +17 -0
  248. package/src/components/field-row/field-row.svelte.d.ts +16 -0
  249. package/src/components/hold-to-confirm/hold-to-confirm.svelte +113 -66
  250. package/src/components/hold-to-confirm/hold-to-confirm.svelte.d.ts +22 -0
  251. package/src/components/hold-to-confirm/hold-to-confirm.test.ts +105 -0
  252. package/src/components/language-flag/language-flag.svelte +2 -1
  253. package/src/components/language-flag/language-flag.svelte.d.ts +11 -0
  254. package/src/components/list-page/detail-header.svelte.d.ts +15 -0
  255. package/src/components/list-page/detail-row.svelte.d.ts +9 -0
  256. package/src/components/list-page/detail-stack.svelte.d.ts +9 -0
  257. package/src/components/list-page/empty-state.svelte +16 -12
  258. package/src/components/list-page/empty-state.svelte.d.ts +23 -0
  259. package/src/components/list-page/filter-item.svelte +1 -1
  260. package/src/components/list-page/filter-item.svelte.d.ts +10 -0
  261. package/src/components/list-page/filter-popover.svelte +1 -1
  262. package/src/components/list-page/filter-popover.svelte.d.ts +20 -0
  263. package/src/components/list-page/grouped-list.svelte +1 -0
  264. package/src/components/list-page/grouped-list.svelte.d.ts +49 -0
  265. package/src/components/list-page/index.ts +0 -1
  266. package/src/components/list-page/list-page-shell.svelte.d.ts +31 -0
  267. package/src/components/list-page/master-detail-focus.test.ts +28 -0
  268. package/src/components/list-page/master-detail.svelte +57 -28
  269. package/src/components/list-page/master-detail.svelte.d.ts +18 -0
  270. package/src/components/list-page/master-detail.test.ts +1 -1
  271. package/src/components/list-page/notice-bar.svelte.d.ts +14 -0
  272. package/src/components/list-page/prev-next.svelte +7 -7
  273. package/src/components/list-page/prev-next.svelte.d.ts +14 -0
  274. package/src/components/list-page/rail-body.svelte.d.ts +8 -0
  275. package/src/components/list-page/rail-head.svelte.d.ts +10 -0
  276. package/src/components/list-page/rail-row.svelte.d.ts +18 -0
  277. package/src/components/mark/mark.svelte +2 -0
  278. package/src/components/mark/mark.svelte.d.ts +16 -0
  279. package/src/components/open-in/open-in.svelte +3 -3
  280. package/src/components/open-in/open-in.svelte.d.ts +35 -0
  281. package/src/components/picker/mark-picker.svelte +2 -2
  282. package/src/components/picker/mark-picker.svelte.d.ts +38 -0
  283. package/src/components/picker/picker.svelte +47 -3
  284. package/src/components/picker/picker.svelte.d.ts +59 -0
  285. package/src/components/picker/picker.test.ts +71 -0
  286. package/src/components/section-card/section-card.svelte.d.ts +13 -0
  287. package/src/components/section-header/section-header.svelte.d.ts +17 -0
  288. package/src/components/section-header/section-label.svelte.d.ts +10 -0
  289. package/src/components/segmented/animated-tabs.svelte.d.ts +61 -0
  290. package/src/components/segmented/section-runs.svelte.d.ts +23 -0
  291. package/src/components/segmented/segment.svelte +1 -1
  292. package/src/components/segmented/segment.svelte.d.ts +30 -0
  293. package/src/components/segmented/segmented-filter.svelte +4 -4
  294. package/src/components/segmented/segmented-filter.svelte.d.ts +43 -0
  295. package/src/components/segmented/segmented-nav.svelte.d.ts +17 -0
  296. package/src/components/segmented/segmented-overflow.svelte +1 -0
  297. package/src/components/segmented/segmented-overflow.svelte.d.ts +37 -0
  298. package/src/components/segmented/segmented-track.svelte +107 -103
  299. package/src/components/segmented/segmented-track.svelte.d.ts +19 -0
  300. package/src/components/star-rating-input/star-rating-input.svelte +151 -146
  301. package/src/components/star-rating-input/star-rating-input.svelte.d.ts +31 -0
  302. package/src/components/star-rating-input/star-rating-input.test.ts +90 -0
  303. package/src/components/svg/svg.svelte.d.ts +7 -0
  304. package/src/components/table-view/table-view.svelte +34 -28
  305. package/src/components/table-view/table-view.svelte.d.ts +96 -0
  306. package/src/components/table-view/table-view.test.ts +32 -6
  307. package/src/components/tags-input/tags-input.svelte +68 -16
  308. package/src/components/tags-input/tags-input.svelte.d.ts +40 -0
  309. package/src/components/tags-input/tags-input.test.ts +101 -0
  310. package/src/components/theme/index.ts +0 -1
  311. package/src/components/theme/theme-provider.svelte +8 -3
  312. package/src/components/theme/theme-provider.svelte.d.ts +19 -0
  313. package/src/components/theme/theme-provider.test.ts +5 -5
  314. package/src/components/toolbar/index.ts +2 -4
  315. package/src/components/toolbar/toolbar-search.svelte +4 -0
  316. package/src/components/toolbar/toolbar-search.svelte.d.ts +11 -0
  317. package/src/components/toolbar/toolbar.svelte +1 -1
  318. package/src/components/toolbar/toolbar.svelte.d.ts +47 -0
  319. package/src/components/toolbar/toolbar.test.ts +7 -0
  320. package/src/components/work-parts/group-head.svelte.d.ts +16 -0
  321. package/src/components/work-parts/index.ts +0 -1
  322. package/src/components/work-parts/property-row.svelte.d.ts +19 -0
  323. package/src/components/work-parts/work-card.svelte.d.ts +11 -0
  324. package/src/components/work-parts/work-well.svelte.d.ts +13 -0
  325. package/src/css-layers.test.ts +138 -0
  326. package/src/editor/README.md +1 -1
  327. package/src/editor/block-move.test.ts +58 -0
  328. package/src/editor/block-move.ts +52 -0
  329. package/src/editor/content.css +356 -352
  330. package/src/editor/doc-blocks.ts +3 -3
  331. package/src/editor/doc-page.css +328 -324
  332. package/src/editor/editor-toolbar.svelte +65 -50
  333. package/src/editor/editor-toolbar.svelte.d.ts +13 -0
  334. package/src/editor/editor.svelte +219 -158
  335. package/src/editor/editor.svelte.d.ts +27 -0
  336. package/src/editor/extensions.ts +18 -2
  337. package/src/editor/image-align.test.ts +35 -0
  338. package/src/editor/image-toolbar.svelte +73 -57
  339. package/src/editor/image-toolbar.svelte.d.ts +11 -0
  340. package/src/editor/inline-editor.svelte +27 -16
  341. package/src/editor/inline-editor.svelte.d.ts +40 -0
  342. package/src/editor/renderer.svelte.d.ts +11 -0
  343. package/src/editor/slash-menu.svelte +103 -88
  344. package/src/editor/slash-menu.svelte.d.ts +17 -0
  345. package/src/effects/animated-beam/AnimatedBeam.svelte.d.ts +4 -0
  346. package/src/effects/animated-beam/diagrams/BeamSvg.svelte.d.ts +22 -0
  347. package/src/effects/border-beam/BorderBeam.svelte.d.ts +4 -0
  348. package/src/effects/border-beam/index.ts +10 -0
  349. package/src/effects/image-comparison/ImageComparison.css +114 -97
  350. package/src/effects/image-comparison/ImageComparison.svelte.d.ts +44 -0
  351. package/src/effects/image-comparison/index.ts +4 -0
  352. package/src/effects/image-reveal/ImageReveal.css +14 -9
  353. package/src/effects/image-reveal/ImageReveal.svelte.d.ts +11 -0
  354. package/src/effects/interactive-hover-button/InteractiveHoverButton.svelte +234 -222
  355. package/src/effects/interactive-hover-button/InteractiveHoverButton.svelte.d.ts +16 -0
  356. package/src/effects/interactive-hover-button/index.ts +1 -0
  357. package/src/effects/magic-card/MagicCard.css +49 -45
  358. package/src/effects/magic-card/MagicCard.svelte.d.ts +15 -0
  359. package/src/effects/magic-card/index.ts +1 -0
  360. package/src/effects/marquee/Marquee.css +81 -62
  361. package/src/effects/marquee/Marquee.svelte +1 -0
  362. package/src/effects/marquee/Marquee.svelte.d.ts +27 -0
  363. package/src/effects/marquee/index.ts +1 -0
  364. package/src/effects/marquee/marquee.test.ts +24 -0
  365. package/src/effects/progressive-blur/ProgressiveBlur.css +13 -8
  366. package/src/effects/progressive-blur/ProgressiveBlur.svelte.d.ts +14 -0
  367. package/src/effects/progressive-blur/index.ts +1 -0
  368. package/src/effects/reveal/AnimatedGroup.svelte.d.ts +14 -0
  369. package/src/effects/reveal/InView.svelte.d.ts +12 -0
  370. package/src/effects/reveal/TextEffect.svelte.d.ts +16 -0
  371. package/src/effects/reveal/reveal.css +89 -73
  372. package/src/effects/shader-gradient/ShaderGradient.svelte.d.ts +4 -0
  373. package/src/effects/spotlight/Spotlight.css +8 -4
  374. package/src/effects/spotlight/Spotlight.svelte.d.ts +8 -0
  375. package/src/effects/spotlight/index.ts +1 -0
  376. package/src/effects/theme-toggle/ThemeToggle.css +165 -160
  377. package/src/effects/theme-toggle/ThemeToggle.svelte +12 -6
  378. package/src/effects/theme-toggle/ThemeToggle.svelte.d.ts +24 -0
  379. package/src/effects/theme-toggle/index.ts +1 -0
  380. package/src/icon-names.test.ts +88 -0
  381. package/src/inbox/index.ts +1 -2
  382. package/src/inbox/thread-inbox.svelte +1 -1
  383. package/src/inbox/thread-inbox.svelte.d.ts +52 -0
  384. package/src/lib/focus.ts +19 -0
  385. package/src/lib/live-region.svelte +14 -0
  386. package/src/lib/live-region.svelte.d.ts +5 -0
  387. package/src/lib/panel.svelte +2 -2
  388. package/src/lib/panel.svelte.d.ts +30 -0
  389. package/src/lib/tone.ts +3 -4
  390. package/src/modules.test.ts +119 -7
  391. package/src/onboarding/README.md +2 -2
  392. package/src/onboarding/onboarding-provider.svelte +1 -1
  393. package/src/onboarding/onboarding-provider.svelte.d.ts +17 -0
  394. package/src/onboarding/tour-card.svelte +10 -10
  395. package/src/onboarding/tour-card.svelte.d.ts +21 -0
  396. package/src/onboarding/tour-runner.svelte +62 -60
  397. package/src/onboarding/tour-runner.svelte.d.ts +11 -0
  398. package/src/panel/side-panel.svelte +4 -9
  399. package/src/panel/side-panel.svelte.d.ts +48 -0
  400. package/src/record/field-section.svelte.d.ts +19 -0
  401. package/src/record/info-list.svelte +4 -3
  402. package/src/record/info-list.svelte.d.ts +25 -0
  403. package/src/record/next-up.svelte.d.ts +14 -0
  404. package/src/record/project-list.svelte.d.ts +18 -0
  405. package/src/record/record-header.svelte.d.ts +27 -0
  406. package/src/record/record-rail.svelte.d.ts +23 -0
  407. package/src/record/record-shell.svelte.d.ts +48 -0
  408. package/src/record/record-stats.svelte.d.ts +10 -0
  409. package/src/record/record-timeline.svelte +3 -1
  410. package/src/record/record-timeline.svelte.d.ts +29 -0
  411. package/src/record/steps-rail.svelte +9 -9
  412. package/src/record/steps-rail.svelte.d.ts +23 -0
  413. package/src/record/where-we-are.svelte.d.ts +25 -0
  414. package/src/shadcn/accordion/accordion-content.svelte.d.ts +4 -0
  415. package/src/shadcn/accordion/accordion-item.svelte.d.ts +4 -0
  416. package/src/shadcn/accordion/accordion-trigger.svelte +1 -1
  417. package/src/shadcn/accordion/accordion-trigger.svelte.d.ts +12 -0
  418. package/src/shadcn/accordion/accordion.svelte.d.ts +4 -0
  419. package/src/shadcn/alert/alert-description.svelte.d.ts +5 -0
  420. package/src/shadcn/alert/alert-title.svelte.d.ts +5 -0
  421. package/src/shadcn/alert/alert-variants.ts +1 -1
  422. package/src/shadcn/alert/alert.svelte.d.ts +10 -0
  423. package/src/shadcn/alert-dialog/alert-dialog-action.svelte.d.ts +4 -0
  424. package/src/shadcn/alert-dialog/alert-dialog-cancel.svelte.d.ts +4 -0
  425. package/src/shadcn/alert-dialog/alert-dialog-content.svelte.d.ts +10 -0
  426. package/src/shadcn/alert-dialog/alert-dialog-description.svelte.d.ts +4 -0
  427. package/src/shadcn/alert-dialog/alert-dialog-footer.svelte.d.ts +9 -0
  428. package/src/shadcn/alert-dialog/alert-dialog-header.svelte.d.ts +5 -0
  429. package/src/shadcn/alert-dialog/alert-dialog-overlay.svelte.d.ts +4 -0
  430. package/src/shadcn/alert-dialog/alert-dialog-portal.svelte.d.ts +3 -0
  431. package/src/shadcn/alert-dialog/alert-dialog-title.svelte.d.ts +4 -0
  432. package/src/shadcn/alert-dialog/alert-dialog-trigger.svelte.d.ts +4 -0
  433. package/src/shadcn/alert-dialog/alert-dialog.svelte.d.ts +3 -0
  434. package/src/shadcn/attachment/attachment-action.svelte +7 -0
  435. package/src/shadcn/attachment/attachment-action.svelte.d.ts +4 -0
  436. package/src/shadcn/attachment/attachment-actions.svelte.d.ts +5 -0
  437. package/src/shadcn/attachment/attachment-content.svelte.d.ts +5 -0
  438. package/src/shadcn/attachment/attachment-description.svelte.d.ts +5 -0
  439. package/src/shadcn/attachment/attachment-group.svelte.d.ts +5 -0
  440. package/src/shadcn/attachment/attachment-media.svelte.d.ts +16 -0
  441. package/src/shadcn/attachment/attachment-title.svelte +3 -0
  442. package/src/shadcn/attachment/attachment-title.svelte.d.ts +5 -0
  443. package/src/shadcn/attachment/attachment-trigger.svelte +5 -0
  444. package/src/shadcn/attachment/attachment-trigger.svelte.d.ts +11 -0
  445. package/src/shadcn/attachment/attachment.svelte +4 -0
  446. package/src/shadcn/attachment/attachment.svelte.d.ts +25 -0
  447. package/src/shadcn/attachment/context.ts +13 -0
  448. package/src/shadcn/avatar/avatar-badge.svelte.d.ts +5 -0
  449. package/src/shadcn/avatar/avatar-fallback.svelte.d.ts +4 -0
  450. package/src/shadcn/avatar/avatar-group-count.svelte.d.ts +5 -0
  451. package/src/shadcn/avatar/avatar-group.svelte.d.ts +5 -0
  452. package/src/shadcn/avatar/avatar-image.svelte.d.ts +4 -0
  453. package/src/shadcn/avatar/avatar.svelte.d.ts +7 -0
  454. package/src/shadcn/badge/badge.svelte.d.ts +13 -0
  455. package/src/shadcn/breadcrumb/breadcrumb-ellipsis.svelte +1 -1
  456. package/src/shadcn/breadcrumb/breadcrumb-ellipsis.svelte.d.ts +5 -0
  457. package/src/shadcn/breadcrumb/breadcrumb-item.svelte.d.ts +5 -0
  458. package/src/shadcn/breadcrumb/breadcrumb-link.svelte.d.ts +11 -0
  459. package/src/shadcn/breadcrumb/breadcrumb-list.svelte.d.ts +5 -0
  460. package/src/shadcn/breadcrumb/breadcrumb-page.svelte.d.ts +5 -0
  461. package/src/shadcn/breadcrumb/breadcrumb-separator.svelte +1 -1
  462. package/src/shadcn/breadcrumb/breadcrumb-separator.svelte.d.ts +5 -0
  463. package/src/shadcn/breadcrumb/breadcrumb.svelte.d.ts +5 -0
  464. package/src/shadcn/bubble/bubble-content.svelte.d.ts +11 -0
  465. package/src/shadcn/bubble/bubble-group.svelte.d.ts +5 -0
  466. package/src/shadcn/bubble/bubble-reactions.svelte.d.ts +22 -0
  467. package/src/shadcn/bubble/bubble.svelte +1 -1
  468. package/src/shadcn/bubble/bubble.svelte.d.ts +22 -0
  469. package/src/shadcn/button/button.svelte +1 -1
  470. package/src/shadcn/button/button.svelte.d.ts +33 -0
  471. package/src/shadcn/calendar/calendar-caption.svelte.d.ts +19 -0
  472. package/src/shadcn/calendar/calendar-cell.svelte.d.ts +4 -0
  473. package/src/shadcn/calendar/calendar-day.svelte.d.ts +4 -0
  474. package/src/shadcn/calendar/calendar-grid-body.svelte.d.ts +4 -0
  475. package/src/shadcn/calendar/calendar-grid-head.svelte.d.ts +4 -0
  476. package/src/shadcn/calendar/calendar-grid-row.svelte.d.ts +4 -0
  477. package/src/shadcn/calendar/calendar-grid.svelte.d.ts +4 -0
  478. package/src/shadcn/calendar/calendar-head-cell.svelte.d.ts +4 -0
  479. package/src/shadcn/calendar/calendar-header.svelte.d.ts +4 -0
  480. package/src/shadcn/calendar/calendar-heading.svelte.d.ts +4 -0
  481. package/src/shadcn/calendar/calendar-month-select.svelte +1 -1
  482. package/src/shadcn/calendar/calendar-month-select.svelte.d.ts +4 -0
  483. package/src/shadcn/calendar/calendar-month.svelte.d.ts +5 -0
  484. package/src/shadcn/calendar/calendar-months.svelte.d.ts +5 -0
  485. package/src/shadcn/calendar/calendar-nav.svelte.d.ts +5 -0
  486. package/src/shadcn/calendar/calendar-next-button.svelte +1 -1
  487. package/src/shadcn/calendar/calendar-next-button.svelte.d.ts +8 -0
  488. package/src/shadcn/calendar/calendar-prev-button.svelte +1 -1
  489. package/src/shadcn/calendar/calendar-prev-button.svelte.d.ts +8 -0
  490. package/src/shadcn/calendar/calendar-year-select.svelte +1 -1
  491. package/src/shadcn/calendar/calendar-year-select.svelte.d.ts +4 -0
  492. package/src/shadcn/calendar/calendar.svelte.d.ts +21 -0
  493. package/src/shadcn/card/card-action.svelte.d.ts +5 -0
  494. package/src/shadcn/card/card-content.svelte.d.ts +5 -0
  495. package/src/shadcn/card/card-description.svelte.d.ts +5 -0
  496. package/src/shadcn/card/card-footer.svelte.d.ts +5 -0
  497. package/src/shadcn/card/card-header.svelte.d.ts +5 -0
  498. package/src/shadcn/card/card-title.svelte.d.ts +8 -0
  499. package/src/shadcn/card/card.svelte.d.ts +8 -0
  500. package/src/shadcn/checkbox/checkbox.svelte +2 -2
  501. package/src/shadcn/checkbox/checkbox.svelte.d.ts +4 -0
  502. package/src/shadcn/code-block/code-block-actions.svelte.d.ts +5 -0
  503. package/src/shadcn/code-block/code-block-content.svelte +1 -1
  504. package/src/shadcn/code-block/code-block-content.svelte.d.ts +12 -0
  505. package/src/shadcn/code-block/code-block-copy-button.svelte.d.ts +3 -0
  506. package/src/shadcn/code-block/code-block-footer.svelte.d.ts +5 -0
  507. package/src/shadcn/code-block/code-block-header.svelte +1 -1
  508. package/src/shadcn/code-block/code-block-header.svelte.d.ts +5 -0
  509. package/src/shadcn/code-block/code-block-line.svelte +1 -1
  510. package/src/shadcn/code-block/code-block-line.svelte.d.ts +25 -0
  511. package/src/shadcn/code-block/code-block-title.svelte +1 -1
  512. package/src/shadcn/code-block/code-block-title.svelte.d.ts +5 -0
  513. package/src/shadcn/code-block/code-block.svelte +3 -2
  514. package/src/shadcn/code-block/code-block.svelte.d.ts +18 -0
  515. package/src/shadcn/collapsible/collapsible-content.svelte.d.ts +4 -0
  516. package/src/shadcn/collapsible/collapsible-trigger.svelte.d.ts +4 -0
  517. package/src/shadcn/collapsible/collapsible.svelte.d.ts +4 -0
  518. package/src/shadcn/command/command-dialog.svelte.d.ts +14 -0
  519. package/src/shadcn/command/command-empty.svelte.d.ts +4 -0
  520. package/src/shadcn/command/command-group.svelte.d.ts +7 -0
  521. package/src/shadcn/command/command-input.svelte +2 -2
  522. package/src/shadcn/command/command-input.svelte.d.ts +13 -0
  523. package/src/shadcn/command/command-item.svelte +1 -1
  524. package/src/shadcn/command/command-item.svelte.d.ts +4 -0
  525. package/src/shadcn/command/command-link-item.svelte.d.ts +4 -0
  526. package/src/shadcn/command/command-list.svelte +7 -1
  527. package/src/shadcn/command/command-list.svelte.d.ts +4 -0
  528. package/src/shadcn/command/command-loading.svelte.d.ts +4 -0
  529. package/src/shadcn/command/command-separator.svelte.d.ts +4 -0
  530. package/src/shadcn/command/command-shortcut.svelte.d.ts +5 -0
  531. package/src/shadcn/command/command.svelte.d.ts +8 -0
  532. package/src/shadcn/context-menu/context-menu-checkbox-item.svelte +1 -1
  533. package/src/shadcn/context-menu/context-menu-checkbox-item.svelte.d.ts +10 -0
  534. package/src/shadcn/context-menu/context-menu-content.svelte.d.ts +10 -0
  535. package/src/shadcn/context-menu/context-menu-group-heading.svelte.d.ts +7 -0
  536. package/src/shadcn/context-menu/context-menu-group.svelte.d.ts +4 -0
  537. package/src/shadcn/context-menu/context-menu-item.svelte +1 -1
  538. package/src/shadcn/context-menu/context-menu-item.svelte.d.ts +8 -0
  539. package/src/shadcn/context-menu/context-menu-label.svelte.d.ts +8 -0
  540. package/src/shadcn/context-menu/context-menu-portal.svelte.d.ts +3 -0
  541. package/src/shadcn/context-menu/context-menu-radio-group.svelte.d.ts +4 -0
  542. package/src/shadcn/context-menu/context-menu-radio-item.svelte +1 -1
  543. package/src/shadcn/context-menu/context-menu-radio-item.svelte.d.ts +8 -0
  544. package/src/shadcn/context-menu/context-menu-separator.svelte.d.ts +4 -0
  545. package/src/shadcn/context-menu/context-menu-shortcut.svelte.d.ts +5 -0
  546. package/src/shadcn/context-menu/context-menu-sub-content.svelte.d.ts +4 -0
  547. package/src/shadcn/context-menu/context-menu-sub-trigger.svelte +1 -1
  548. package/src/shadcn/context-menu/context-menu-sub-trigger.svelte.d.ts +8 -0
  549. package/src/shadcn/context-menu/context-menu-sub.svelte.d.ts +3 -0
  550. package/src/shadcn/context-menu/context-menu-trigger.svelte.d.ts +4 -0
  551. package/src/shadcn/context-menu/context-menu.svelte.d.ts +3 -0
  552. package/src/shadcn/dialog/dialog-body.svelte.d.ts +5 -0
  553. package/src/shadcn/dialog/dialog-close.svelte.d.ts +4 -0
  554. package/src/shadcn/dialog/dialog-content.svelte +3 -4
  555. package/src/shadcn/dialog/dialog-content.svelte.d.ts +16 -0
  556. package/src/shadcn/dialog/dialog-description.svelte.d.ts +4 -0
  557. package/src/shadcn/dialog/dialog-footer.svelte.d.ts +15 -0
  558. package/src/shadcn/dialog/dialog-header.svelte.d.ts +5 -0
  559. package/src/shadcn/dialog/dialog-overlay.svelte.d.ts +4 -0
  560. package/src/shadcn/dialog/dialog-portal.svelte.d.ts +3 -0
  561. package/src/shadcn/dialog/dialog-title.svelte.d.ts +4 -0
  562. package/src/shadcn/dialog/dialog-trigger.svelte.d.ts +4 -0
  563. package/src/shadcn/dialog/dialog.svelte.d.ts +3 -0
  564. package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +4 -0
  565. package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-item.svelte +2 -2
  566. package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +9 -0
  567. package/src/shadcn/dropdown-menu/dropdown-menu-content.svelte.d.ts +10 -0
  568. package/src/shadcn/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +8 -0
  569. package/src/shadcn/dropdown-menu/dropdown-menu-group.svelte.d.ts +4 -0
  570. package/src/shadcn/dropdown-menu/dropdown-menu-item.svelte.d.ts +8 -0
  571. package/src/shadcn/dropdown-menu/dropdown-menu-label.svelte.d.ts +8 -0
  572. package/src/shadcn/dropdown-menu/dropdown-menu-portal.svelte.d.ts +3 -0
  573. package/src/shadcn/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +4 -0
  574. package/src/shadcn/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  575. package/src/shadcn/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +4 -0
  576. package/src/shadcn/dropdown-menu/dropdown-menu-separator.svelte.d.ts +4 -0
  577. package/src/shadcn/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +5 -0
  578. package/src/shadcn/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +4 -0
  579. package/src/shadcn/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  580. package/src/shadcn/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +7 -0
  581. package/src/shadcn/dropdown-menu/dropdown-menu-sub.svelte.d.ts +3 -0
  582. package/src/shadcn/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +4 -0
  583. package/src/shadcn/dropdown-menu/dropdown-menu.svelte.d.ts +3 -0
  584. package/src/shadcn/dropdown-menu/menu-item.ts +1 -1
  585. package/src/shadcn/empty/empty-content.svelte.d.ts +5 -0
  586. package/src/shadcn/empty/empty-description.svelte.d.ts +5 -0
  587. package/src/shadcn/empty/empty-header.svelte.d.ts +5 -0
  588. package/src/shadcn/empty/empty-media.svelte.d.ts +16 -0
  589. package/src/shadcn/empty/empty-title.svelte.d.ts +5 -0
  590. package/src/shadcn/empty/empty.svelte.d.ts +5 -0
  591. package/src/shadcn/field/field-content.svelte.d.ts +5 -0
  592. package/src/shadcn/field/field-description.svelte.d.ts +5 -0
  593. package/src/shadcn/field/field-error.svelte +1 -1
  594. package/src/shadcn/field/field-error.svelte.d.ts +12 -0
  595. package/src/shadcn/field/field-group.svelte.d.ts +5 -0
  596. package/src/shadcn/field/field-label.svelte.d.ts +10 -0
  597. package/src/shadcn/field/field-legend.svelte.d.ts +8 -0
  598. package/src/shadcn/field/field-separator.svelte.d.ts +9 -0
  599. package/src/shadcn/field/field-set.svelte.d.ts +5 -0
  600. package/src/shadcn/field/field-title.svelte.d.ts +5 -0
  601. package/src/shadcn/field/field.svelte +1 -1
  602. package/src/shadcn/field/field.svelte.d.ts +17 -0
  603. package/src/shadcn/field/simple-field.svelte.d.ts +15 -0
  604. package/src/shadcn/hooks/highlighter.ts +51 -2
  605. package/src/shadcn/hover-card/hover-card-content.svelte.d.ts +10 -0
  606. package/src/shadcn/hover-card/hover-card-portal.svelte.d.ts +3 -0
  607. package/src/shadcn/hover-card/hover-card-trigger.svelte.d.ts +4 -0
  608. package/src/shadcn/hover-card/hover-card.svelte.d.ts +3 -0
  609. package/src/shadcn/input/input.svelte.d.ts +13 -0
  610. package/src/shadcn/input/secret-input.svelte +3 -3
  611. package/src/shadcn/input/secret-input.svelte.d.ts +9 -0
  612. package/src/shadcn/input-otp/input-otp-group.svelte.d.ts +5 -0
  613. package/src/shadcn/input-otp/input-otp-separator.svelte.d.ts +5 -0
  614. package/src/shadcn/input-otp/input-otp-slot.svelte.d.ts +4 -0
  615. package/src/shadcn/input-otp/input-otp.svelte.d.ts +4 -0
  616. package/src/shadcn/kbd/kbd-group.svelte.d.ts +5 -0
  617. package/src/shadcn/kbd/kbd.svelte.d.ts +5 -0
  618. package/src/shadcn/label/label.svelte.d.ts +4 -0
  619. package/src/shadcn/marker/marker-content.svelte.d.ts +5 -0
  620. package/src/shadcn/marker/marker-icon.svelte.d.ts +5 -0
  621. package/src/shadcn/marker/marker.svelte.d.ts +21 -0
  622. package/src/shadcn/message/message-avatar.svelte.d.ts +5 -0
  623. package/src/shadcn/message/message-content.svelte.d.ts +5 -0
  624. package/src/shadcn/message/message-footer.svelte.d.ts +5 -0
  625. package/src/shadcn/message/message-group.svelte.d.ts +5 -0
  626. package/src/shadcn/message/message-header.svelte.d.ts +5 -0
  627. package/src/shadcn/message/message.svelte.d.ts +8 -0
  628. package/src/shadcn/message-scroller/message-scroller-button.svelte +13 -1
  629. package/src/shadcn/message-scroller/message-scroller-button.svelte.d.ts +9 -0
  630. package/src/shadcn/message-scroller/message-scroller-content.svelte.d.ts +4 -0
  631. package/src/shadcn/message-scroller/message-scroller-item.svelte.d.ts +4 -0
  632. package/src/shadcn/message-scroller/message-scroller-provider.svelte.d.ts +4 -0
  633. package/src/shadcn/message-scroller/message-scroller-viewport.svelte.d.ts +4 -0
  634. package/src/shadcn/message-scroller/message-scroller.svelte.d.ts +4 -0
  635. package/src/shadcn/popover/popover-close.svelte.d.ts +4 -0
  636. package/src/shadcn/popover/popover-content.svelte.d.ts +10 -0
  637. package/src/shadcn/popover/popover-description.svelte.d.ts +5 -0
  638. package/src/shadcn/popover/popover-header.svelte.d.ts +5 -0
  639. package/src/shadcn/popover/popover-portal.svelte.d.ts +3 -0
  640. package/src/shadcn/popover/popover-title.svelte.d.ts +5 -0
  641. package/src/shadcn/popover/popover-trigger.svelte.d.ts +4 -0
  642. package/src/shadcn/popover/popover.svelte.d.ts +3 -0
  643. package/src/shadcn/progress/progress.svelte.d.ts +10 -0
  644. package/src/shadcn/radio-group/radio-group-item.svelte +1 -1
  645. package/src/shadcn/radio-group/radio-group-item.svelte.d.ts +4 -0
  646. package/src/shadcn/radio-group/radio-group.svelte.d.ts +4 -0
  647. package/src/shadcn/scroll-area/scroll-area-scrollbar.svelte.d.ts +4 -0
  648. package/src/shadcn/scroll-area/scroll-area.svelte +1 -0
  649. package/src/shadcn/scroll-area/scroll-area.svelte.d.ts +11 -0
  650. package/src/shadcn/select/select-content.svelte.d.ts +11 -0
  651. package/src/shadcn/select/select-group-heading.svelte.d.ts +10 -0
  652. package/src/shadcn/select/select-group.svelte.d.ts +4 -0
  653. package/src/shadcn/select/select-item.svelte +1 -1
  654. package/src/shadcn/select/select-item.svelte.d.ts +4 -0
  655. package/src/shadcn/select/select-label.svelte.d.ts +6 -0
  656. package/src/shadcn/select/select-portal.svelte.d.ts +3 -0
  657. package/src/shadcn/select/select-scroll-down-button.svelte +1 -1
  658. package/src/shadcn/select/select-scroll-down-button.svelte.d.ts +4 -0
  659. package/src/shadcn/select/select-scroll-up-button.svelte +1 -1
  660. package/src/shadcn/select/select-scroll-up-button.svelte.d.ts +4 -0
  661. package/src/shadcn/select/select-separator.svelte.d.ts +4 -0
  662. package/src/shadcn/select/select-trigger.svelte +1 -0
  663. package/src/shadcn/select/select-trigger.svelte.d.ts +8 -0
  664. package/src/shadcn/select/select.svelte.d.ts +3 -0
  665. package/src/shadcn/separator/separator.svelte.d.ts +4 -0
  666. package/src/shadcn/sheet/sheet-body.svelte.d.ts +5 -0
  667. package/src/shadcn/sheet/sheet-close.svelte.d.ts +4 -0
  668. package/src/shadcn/sheet/sheet-content.svelte +5 -7
  669. package/src/shadcn/sheet/sheet-content.svelte.d.ts +21 -0
  670. package/src/shadcn/sheet/sheet-description.svelte.d.ts +4 -0
  671. package/src/shadcn/sheet/sheet-footer.svelte.d.ts +12 -0
  672. package/src/shadcn/sheet/sheet-header.svelte.d.ts +5 -0
  673. package/src/shadcn/sheet/sheet-overlay.svelte.d.ts +4 -0
  674. package/src/shadcn/sheet/sheet-portal.svelte.d.ts +3 -0
  675. package/src/shadcn/sheet/sheet-title.svelte.d.ts +4 -0
  676. package/src/shadcn/sheet/sheet-trigger.svelte.d.ts +4 -0
  677. package/src/shadcn/sheet/sheet.css +47 -43
  678. package/src/shadcn/sheet/sheet.svelte.d.ts +3 -0
  679. package/src/shadcn/sidebar/constants.ts +1 -1
  680. package/src/shadcn/sidebar/context.svelte.ts +16 -1
  681. package/src/shadcn/sidebar/sidebar-content.svelte.d.ts +5 -0
  682. package/src/shadcn/sidebar/sidebar-footer.svelte.d.ts +5 -0
  683. package/src/shadcn/sidebar/sidebar-group-action.svelte.d.ts +11 -0
  684. package/src/shadcn/sidebar/sidebar-group-content.svelte.d.ts +5 -0
  685. package/src/shadcn/sidebar/sidebar-group-label.svelte.d.ts +11 -0
  686. package/src/shadcn/sidebar/sidebar-group.svelte.d.ts +5 -0
  687. package/src/shadcn/sidebar/sidebar-header.svelte.d.ts +5 -0
  688. package/src/shadcn/sidebar/sidebar-input.svelte.d.ts +11 -0
  689. package/src/shadcn/sidebar/sidebar-inset.svelte.d.ts +5 -0
  690. package/src/shadcn/sidebar/sidebar-menu-action.svelte.d.ts +12 -0
  691. package/src/shadcn/sidebar/sidebar-menu-badge.svelte.d.ts +5 -0
  692. package/src/shadcn/sidebar/sidebar-menu-button.svelte.d.ts +31 -0
  693. package/src/shadcn/sidebar/sidebar-menu-item.svelte.d.ts +5 -0
  694. package/src/shadcn/sidebar/sidebar-menu-skeleton.svelte.d.ts +8 -0
  695. package/src/shadcn/sidebar/sidebar-menu-sub-button.svelte.d.ts +13 -0
  696. package/src/shadcn/sidebar/sidebar-menu-sub-item.svelte.d.ts +5 -0
  697. package/src/shadcn/sidebar/sidebar-menu-sub.svelte.d.ts +5 -0
  698. package/src/shadcn/sidebar/sidebar-menu.svelte.d.ts +5 -0
  699. package/src/shadcn/sidebar/sidebar-provider.svelte +3 -0
  700. package/src/shadcn/sidebar/sidebar-provider.svelte.d.ts +9 -0
  701. package/src/shadcn/sidebar/sidebar-rail.svelte.d.ts +5 -0
  702. package/src/shadcn/sidebar/sidebar-separator.svelte.d.ts +13 -0
  703. package/src/shadcn/sidebar/sidebar-trigger.svelte +3 -1
  704. package/src/shadcn/sidebar/sidebar-trigger.svelte.d.ts +8 -0
  705. package/src/shadcn/sidebar/sidebar.svelte +3 -0
  706. package/src/shadcn/sidebar/sidebar.svelte.d.ts +10 -0
  707. package/src/shadcn/sidebar/sidebar.test.ts +69 -0
  708. package/src/shadcn/skeleton/skeleton-delay.svelte.d.ts +20 -0
  709. package/src/shadcn/skeleton/skeleton.svelte.d.ts +5 -0
  710. package/src/shadcn/slider/slider.svelte.d.ts +11 -0
  711. package/src/shadcn/sonner/sonner.svelte +4 -4
  712. package/src/shadcn/sonner/sonner.svelte.d.ts +4 -0
  713. package/src/shadcn/spinner/spinner.svelte.d.ts +4 -0
  714. package/src/shadcn/switch/switch.svelte.d.ts +8 -0
  715. package/src/shadcn/table/table-body.svelte.d.ts +5 -0
  716. package/src/shadcn/table/table-caption.svelte.d.ts +5 -0
  717. package/src/shadcn/table/table-cell.svelte +16 -12
  718. package/src/shadcn/table/table-cell.svelte.d.ts +9 -0
  719. package/src/shadcn/table/table-footer.svelte.d.ts +5 -0
  720. package/src/shadcn/table/table-head.svelte.d.ts +5 -0
  721. package/src/shadcn/table/table-header.svelte.d.ts +5 -0
  722. package/src/shadcn/table/table-row.svelte.d.ts +5 -0
  723. package/src/shadcn/table/table.svelte.d.ts +5 -0
  724. package/src/shadcn/tabs/tabs-content.svelte.d.ts +4 -0
  725. package/src/shadcn/tabs/tabs-list.svelte.d.ts +8 -0
  726. package/src/shadcn/tabs/tabs-trigger.svelte.d.ts +4 -0
  727. package/src/shadcn/tabs/tabs.svelte.d.ts +4 -0
  728. package/src/shadcn/textarea/textarea.svelte.d.ts +5 -0
  729. package/src/shadcn/toggle/toggle.svelte.d.ts +10 -0
  730. package/src/shadcn/toggle-group/toggle-group-item.svelte.d.ts +6 -0
  731. package/src/shadcn/toggle-group/toggle-group.svelte.d.ts +15 -0
  732. package/src/shadcn/tooltip/tooltip-content.svelte.d.ts +11 -0
  733. package/src/shadcn/tooltip/tooltip-portal.svelte.d.ts +4 -0
  734. package/src/shadcn/tooltip/tooltip-provider.svelte.d.ts +4 -0
  735. package/src/shadcn/tooltip/tooltip-trigger.svelte.d.ts +4 -0
  736. package/src/shadcn/tooltip/tooltip.svelte.d.ts +4 -0
  737. package/src/shadcn/trace/trace-collapsible-content.svelte.d.ts +4 -0
  738. package/src/shadcn/trace/trace-collapsible-trigger.svelte +2 -2
  739. package/src/shadcn/trace/trace-collapsible-trigger.svelte.d.ts +4 -0
  740. package/src/shadcn/trace/trace-collapsible.svelte.d.ts +4 -0
  741. package/src/shadcn/trace/trace-description.svelte +1 -1
  742. package/src/shadcn/trace/trace-description.svelte.d.ts +5 -0
  743. package/src/shadcn/trace/trace-icon.svelte.d.ts +5 -0
  744. package/src/shadcn/trace/trace-line.svelte +1 -1
  745. package/src/shadcn/trace/trace-line.svelte.d.ts +9 -0
  746. package/src/shadcn/trace/trace-title.svelte.d.ts +5 -0
  747. package/src/shadcn/trace/trace.svelte.d.ts +5 -0
  748. package/src/slides/Controls.svelte +96 -92
  749. package/src/slides/Controls.svelte.d.ts +10 -0
  750. package/src/slides/Deck.svelte +77 -60
  751. package/src/slides/Deck.svelte.d.ts +5 -0
  752. package/src/slides/Fragment.svelte +25 -21
  753. package/src/slides/Fragment.svelte.d.ts +15 -0
  754. package/src/slides/Overview.svelte +71 -60
  755. package/src/slides/Overview.svelte.d.ts +8 -0
  756. package/src/slides/Presenter.svelte +146 -139
  757. package/src/slides/Presenter.svelte.d.ts +8 -0
  758. package/src/slides/README.md +2 -2
  759. package/src/slides/Slide.svelte +74 -63
  760. package/src/slides/Slide.svelte.d.ts +18 -0
  761. package/src/slides/SlideList.svelte.d.ts +9 -0
  762. package/src/slides/deck-controller.svelte.ts +63 -36
  763. package/src/slides/deck-keys.test.ts +49 -0
  764. package/src/slides/layout.ts +3 -2
  765. package/src/slides/theme.css +227 -177
  766. package/src/slides/types.ts +2 -1
  767. package/src/status/index.ts +0 -1
  768. package/src/status/status-badge.svelte +7 -5
  769. package/src/status/status-badge.svelte.d.ts +28 -0
  770. package/src/status/status-badge.test.ts +44 -0
  771. package/src/status/status-dot.svelte +54 -49
  772. package/src/status/status-dot.svelte.d.ts +16 -0
  773. package/src/status/status-icon.svelte +19 -6
  774. package/src/status/status-icon.svelte.d.ts +14 -0
  775. package/src/status/status-pill.svelte.d.ts +13 -0
  776. package/src/test-setup.test.ts +5 -0
  777. package/src/thread/thread-body.svelte.d.ts +9 -0
  778. package/src/thread/thread-events.svelte.d.ts +8 -0
  779. package/src/thread/thread-focus.svelte.test.ts +90 -0
  780. package/src/thread/thread.svelte +70 -15
  781. package/src/thread/thread.svelte.d.ts +40 -0
  782. package/src/tokens/base.css +47 -45
  783. package/src/tokens/design.css +8 -0
  784. package/src/tokens/index.css +3 -0
  785. package/src/triage/triage-plan.svelte +42 -9
  786. package/src/triage/triage-plan.svelte.d.ts +28 -0
  787. package/src/triage/triage-queue.svelte +61 -23
  788. package/src/triage/triage-queue.svelte.d.ts +41 -0
  789. package/src/triage/triage-task.svelte +11 -3
  790. package/src/triage/triage-task.svelte.d.ts +22 -0
  791. package/src/triage/triage.svelte.test.ts +130 -0
  792. package/src/work/README.md +8 -7
  793. package/src/work/detail/task-chip.svelte.d.ts +10 -0
  794. package/src/work/detail/task-detail.svelte.d.ts +36 -0
  795. package/src/work/docs/doc-editor-page.svelte +20 -16
  796. package/src/work/docs/doc-editor-page.svelte.d.ts +31 -0
  797. package/src/work/docs/doc-menu.svelte +44 -38
  798. package/src/work/docs/doc-menu.svelte.d.ts +35 -0
  799. package/src/work/docs/edited-chip.svelte +9 -9
  800. package/src/work/docs/edited-chip.svelte.d.ts +26 -0
  801. package/src/work/gantt/gantt-bar.svelte +87 -78
  802. package/src/work/gantt/gantt-bar.svelte.d.ts +29 -0
  803. package/src/work/gantt/gantt-grid.svelte +30 -26
  804. package/src/work/gantt/gantt-grid.svelte.d.ts +14 -0
  805. package/src/work/gantt/gantt-group-row.svelte +12 -8
  806. package/src/work/gantt/gantt-group-row.svelte.d.ts +12 -0
  807. package/src/work/gantt/gantt-header.svelte +2 -4
  808. package/src/work/gantt/gantt-header.svelte.d.ts +17 -0
  809. package/src/work/gantt/gantt-task-row.svelte +43 -36
  810. package/src/work/gantt/gantt-task-row.svelte.d.ts +53 -0
  811. package/src/work/gantt/gantt.css +14 -10
  812. package/src/work/gantt/gantt.test.ts +14 -2
  813. package/src/work/inbox/inbox-card.svelte +13 -16
  814. package/src/work/inbox/inbox-card.svelte.d.ts +22 -0
  815. package/src/work/inbox/inbox-draft.svelte +3 -3
  816. package/src/work/inbox/inbox-draft.svelte.d.ts +18 -0
  817. package/src/work/inbox/inbox-trace.svelte.d.ts +11 -0
  818. package/src/work/index.ts +0 -24
  819. package/src/work/kanban-board.svelte +103 -66
  820. package/src/work/kanban-board.svelte.d.ts +107 -0
  821. package/src/work/kanban-board.svelte.test.ts +89 -0
  822. package/src/work/kanban-column-head.svelte.d.ts +40 -0
  823. package/src/work/kanban-column.svelte +45 -43
  824. package/src/work/kanban-column.svelte.d.ts +20 -0
  825. package/src/work/kanban-fold-chevron.svelte +15 -11
  826. package/src/work/kanban-fold-chevron.svelte.d.ts +8 -0
  827. package/src/work/kanban-hidden-rail.svelte +2 -1
  828. package/src/work/kanban-hidden-rail.svelte.d.ts +39 -0
  829. package/src/work/kanban-keyboard.ts +8 -6
  830. package/src/work/task-gantt.svelte +18 -4
  831. package/src/work/task-gantt.svelte.d.ts +85 -0
  832. package/src/work/task-list.svelte +166 -116
  833. package/src/work/task-list.svelte.d.ts +81 -0
  834. package/src/work/task-list.svelte.test.ts +113 -0
  835. package/src/work/time/time-chip.svelte +2 -4
  836. package/src/work/time/time-chip.svelte.d.ts +14 -0
  837. package/src/work/time/time-dot.svelte +30 -25
  838. package/src/work/time/time-dot.svelte.d.ts +9 -0
  839. package/src/work/time/time-ring.svelte +15 -11
  840. package/src/work/time/time-ring.svelte.d.ts +18 -0
  841. package/src/work/time/time-tracker.svelte +49 -44
  842. package/src/work/time/time-tracker.svelte.d.ts +59 -0
  843. package/dist/ai/index.js +0 -40
  844. package/dist/index.js +0 -18
  845. package/dist/record/demo-data.js +0 -485
  846. package/dist/test-setup.js +0 -30
  847. package/src/agents/demo.svelte +0 -137
  848. package/src/ai/index.ts +0 -101
  849. package/src/design/index.css +0 -215
  850. package/src/design/polish.css +0 -150
  851. package/src/index.ts +0 -53
  852. package/src/onboarding/demo.svelte +0 -105
  853. package/src/record/demo-data.ts +0 -352
  854. package/src/record/record-demo.svelte +0 -342
  855. package/src/slides/demo-slides.svelte +0 -382
  856. package/src/slides/demo.svelte +0 -180
  857. package/src/test-setup.ts +0 -34
  858. package/src/work/demo.svelte +0 -561
  859. package/src/work/detail/detail-demo.svelte +0 -258
  860. package/src/work/docs/docs-demo.svelte +0 -227
package/COMPONENTS.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Every component in `@heyramzi/ui`, one line each. Import a component from its subpath, e.g.
4
4
  `import { Button } from "@heyramzi/ui/shadcn/button"`.
5
5
 
6
- The style layer lives in [`src/tokens.css`](./src/tokens.css) and the motion CSS in
6
+ The style layer lives in [`src/tokens`](./src/tokens) and the motion CSS in
7
7
  [`src/animations`](./src/animations). Components that already exist in
8
8
  [shadcn-svelte](https://shadcn-svelte.com) are linked there from the root README.
9
9
 
@@ -65,28 +65,30 @@ Generic pieces built on the primitives, imported from `@heyramzi/ui/components/<
65
65
  - `data-table` — SortableHead, Pagination, InfiniteScroll, RowContextMenu, TableSkeleton, and the sort, page and filter helpers
66
66
  - `hold-to-confirm` — HoldToConfirm, press and hold to confirm
67
67
  - `language-flag` — LanguageFlag, LANGUAGE_FLAGS (code to `/flags/*.svg`, also a SegmentedFilter option's `image`)
68
- - `list-page` — ListPageShell, MasterDetail, GroupedList, RailRow and the rest of the master-detail page kit, NoticeBar, EmptyState, FilterPopover, setSectionHost
69
- - `toolbar` — Toolbar: one row at any width; search, tabs and the view switch fold into menus in a narrow pane
68
+ - `list-page` — ListPageShell, MasterDetail, GroupedList, RailRow and the rest of the master-detail page kit, DetailPanel, ToolbarSearch, toolbarTriggerClass, NoticeBar, EmptyState, FilterPopover, setSectionHost
69
+ - `toolbar` — Toolbar: one row at any width; search, tabs and the view switch fold into menus in a narrow pane. Its search box is `list-page`'s ToolbarSearch
70
70
  - `mark` — Mark, a logo or photo glyph with an initial fallback
71
71
  - `open-in` — OpenIn, a link out to a tool that takes the tool's name, label and mark as a prop
72
72
  - `picker` — Picker, MarkPicker, pickerTriggerClass, a command palette at popover scale
73
73
  - `docs` — DocPage, OnThisPage, ScrollSpy: one page anatomy for documentation, an icon, title and summary header, a reading column and a contents rail that becomes a bar on a narrow pane
74
74
  - `section-card` — SectionCard, a card with a fixed-height header, an h3 title, optional actions and a line under it
75
- - `section-header` — SectionHeader, a section label with a count chip, a line of description and actions
75
+ - `section-header` — SectionHeader, a section label with a count chip, a line of description and actions; SectionLabel, the label alone
76
76
  - `field-row` — FieldRow, a labelled control with its action button at the control's height
77
77
  - `table-view` — TableView, a read-only table from columns and rows: numeric columns, footer row, custom cell; opt-in: `bare`, sortable heads (`column.sortable`, bind `sort`; the caller orders `rows`), `rowHref` (a real link over the row; `onRowLink` opens in place on a plain click), `onRowClick`, `selectable` + bind `selected`, `rowMenu` (context-menu items), `group` (a `null` key sits with no header) + `groupHeader` + `collapsible`, `subRow` + `expanded`, `loading` (skeleton rows in the frame), `empty`, `trailing`, `head`, and per-column `hideBelow`, `sticky`, `interactive`, `class`
78
78
  - `segmented` — AnimatedTabs (pill or underline), SegmentedFilter, SegmentedNav, SectionRuns, one bordered track with a sliding pill, a badge note and an overflow menu
79
- - `theme` — ThemeProvider, mode, userPrefersMode, setMode, toggleMode, resetMode: the one light and dark system (mode-watcher, optional peer). Mount `<ThemeProvider initial onChange themeColors modeStorageKey />` once; flip with `toggleMode()`, read `mode.current`. Pair with `theme-toggle`'s `revealTheme(event, toggleMode)` for the wipe
79
+ - `theme` — ThemeProvider, mode, userPrefersMode, setMode, toggleMode, resetMode: the one light and dark system (mode-watcher, optional peer). Mount `<ThemeProvider initial onModeChange themeColors modeStorageKey />` once; flip with `toggleMode()`, read `mode.current`. Pair with `revealTheme(event, toggleMode)` from `@heyramzi/ui/lib/theme-transition.js` for the wipe
80
80
  - `star-rating-input` — StarRatingInput
81
81
  - `svg` — Svg, an SVG file imported with `?raw`
82
82
 
83
83
  ## Effects (`src/effects`)
84
84
 
85
- - `interactive-hover-button` — InteractiveHoverButton, a dot that grows into the fill
85
+ Named exports from `@heyramzi/ui/effects/<name>`, e.g.
86
+ `import { Marquee } from "@heyramzi/ui/effects/marquee"`.
86
87
 
88
+ - `interactive-hover-button` — InteractiveHoverButton, a dot that grows into the fill
87
89
  - `animated-beam` — AnimatedBeam, AnimatedBeamProps, AnchorPosition
88
- - `border-beam` — BorderBeam
89
- - `image-comparison` — ImageComparison, a before/after wipe with a bindable position, side badges and a hint sweep
90
+ - `border-beam` — BorderBeam, sizePresets, sizeThemePresets, themeColors and their types
91
+ - `image-comparison` — ImageComparison, ComparisonImage, a before/after wipe with a bindable position, side badges and a hint sweep
90
92
  - `image-reveal` — ImageReveal, ImageRevealProps, ImageRevealHandle
91
93
  - `magnetic` — magnetic
92
94
  - `magic-card` — MagicCard. Props: `glow`, `radius`, `class`, `contentClass`; the glow colour is `--magic-card-glow` set on `class`.
@@ -95,7 +97,7 @@ Generic pieces built on the primitives, imported from `@heyramzi/ui/components/<
95
97
  - `reveal` — InView, AnimatedGroup, TextEffect, observeInView, RevealPreset, RevealPer
96
98
  - `shader-gradient` — ShaderGradient, ShaderGradientProps, ShaderGradientUniforms
97
99
  - `spotlight` — Spotlight
98
- - `theme-toggle` — ThemeToggle, revealTheme. Props: `isDark`, `mode` (`light`, `dark`, `system`; swaps in the Monitor icon), `onToggle`, `variant` (`outline`, `ghost`, `inverted`, `slide`; `inverted` boolean is an alias; `slide` is a pill with a moving thumb, coloured by `--theme-toggle-thumb-light`, `--theme-toggle-thumb-dark`, `--theme-toggle-track`, `--theme-toggle-glow` and friends set on `class`), `size`, `label`, `title`, `skipTransition`, `class`. `revealTheme(event, apply, { skip, duration, easing })` is the circular wipe on its own: `import { revealTheme } from "@heyramzi/ui"` (the `./lib/*` subpath points at `.js` and the source is `.ts`).
100
+ - `theme-toggle` — ThemeToggle. Props: `isDark`, `mode` (`light`, `dark`, `system`; swaps in the Monitor icon), `onToggle`, `variant` (`outline`, `ghost`, `inverted`, `slide`; `inverted` boolean is an alias; `slide` is a pill with a moving thumb, coloured by `--theme-toggle-thumb-light`, `--theme-toggle-thumb-dark`, `--theme-toggle-track`, `--theme-toggle-glow` and friends set on `class`), `size`, `label`, `title`, `skipTransition`, `class`. `revealTheme(event, apply, { skip, duration, easing })` is the circular wipe on its own: `import { revealTheme } from "@heyramzi/ui/lib/theme-transition.js"` (every `./lib` subpath ends in `.js`, though the source is `.ts`).
99
101
 
100
102
  ## Animations (`src/animations`)
101
103
 
@@ -119,6 +121,8 @@ Generic pieces built on the primitives, imported from `@heyramzi/ui/components/<
119
121
 
120
122
  ## AI and chat (`src/ai`)
121
123
 
124
+ Imported from `@heyramzi/ui/ai/<name>`, e.g. `import { AiButton } from "@heyramzi/ui/ai/ai-button"`.
125
+
122
126
  - `ai-button` — AiButton
123
127
  - `confirmation` — Confirmation, ConfirmationTitle, ConfirmationState (`when` names the kind it shows), ConfirmationActions, ConfirmationAction, type ConfirmationKind
124
128
  - `generation-progress` — GenerationProgress
package/README.md CHANGED
@@ -81,13 +81,14 @@ runes only.
81
81
 
82
82
  ## Using a component
83
83
 
84
- Import from a subpath:
84
+ Import a named export from its subpath. There's no package root and no default export, and
85
+ each name has exactly one path:
85
86
 
86
87
  ```svelte
87
88
  <script lang="ts">
88
89
  import { Button } from "@heyramzi/ui/shadcn/button";
89
90
  import { Card, CardHeader, CardTitle, CardContent } from "@heyramzi/ui/shadcn/card";
90
- import Marquee from "@heyramzi/ui/effects/marquee/Marquee.svelte";
91
+ import { Marquee } from "@heyramzi/ui/effects/marquee";
91
92
  </script>
92
93
  ```
93
94
 
@@ -99,14 +100,14 @@ Many components take their content through snippets, so you keep full control:
99
100
 
100
101
  ## Sound
101
102
 
102
- `@heyramzi/ui/lib/sound` gives the kit's controls interaction sounds from
103
+ `@heyramzi/ui/lib/sound.js` gives the kit's controls interaction sounds from
103
104
  [cuelume](https://cuelume.dev). They're off until the person turns them on, and the choice is
104
105
  saved in their browser. Start it once in the root layout:
105
106
 
106
107
  ```svelte
107
108
  <script lang="ts">
108
109
  import { onMount } from "svelte";
109
- import { startSound } from "@heyramzi/ui/lib/sound";
110
+ import { startSound } from "@heyramzi/ui/lib/sound.js";
110
111
 
111
112
  onMount(() => startSound());
112
113
  </script>
@@ -2,7 +2,6 @@
2
2
  // Svelte components are imported by path, like "@heyramzi/ui/canvas/ui/canvas-grid.svelte".
3
3
  export * from "./types.js";
4
4
  export * from "./plugin.js";
5
- export { tryCatch, tryCatchAsync } from "../lib/result.js";
6
5
  export * from "./ops/ops.js";
7
6
  export * from "./headless/alignment.js";
8
7
  export * from "./headless/canvas-cleanup.js";
@@ -0,0 +1,25 @@
1
+ // A pen node's accessible name. Svelte Flow puts `ariaLabel` on the focusable node wrapper,
2
+ // so the name has to live on the node object and follow its words as they're edited.
3
+ import { useSvelteFlow } from "@xyflow/svelte";
4
+ import { untrack } from "svelte";
5
+ const cap = (word) => word.charAt(0).toUpperCase() + word.slice(1);
6
+ /** "Idea" for a text, "Rectangle: Idea" for a labelled shape, "Pen stroke" for a drawing. */
7
+ export function penNodeName(kind, data) {
8
+ if (kind === "text") return data.text?.trim() || "Empty text";
9
+ if (kind === "stroke") return `${cap(data.tool ?? "pen")} stroke`;
10
+ const shape = cap(data.shape ?? "shape");
11
+ const label = data.label?.trim();
12
+ return label ? `${shape}: ${label}` : shape;
13
+ }
14
+ /** Keeps node `id`'s ariaLabel equal to `name()`. Call it from a node component. */
15
+ export function useNodeName(id, name) {
16
+ const { getNode, updateNode } = useSvelteFlow();
17
+ $effect(() => {
18
+ const nodeId = id();
19
+ const label = name();
20
+ // untrack: updateNode reads the node list, and tracking it would rerun this on every write.
21
+ untrack(() => {
22
+ if (getNode(nodeId)?.ariaLabel !== label) updateNode(nodeId, { ariaLabel: label });
23
+ });
24
+ });
25
+ }
@@ -1,5 +1,6 @@
1
1
  // The tool bar's tools, their keys and the shortcut list the help panel renders.
2
2
  // Pure data and two lookups, so the keyboard, the bar and the panel can't disagree.
3
+ import { isEditingTarget } from "../editor/keymap.js";
3
4
  import { PEN_DEFAULTS } from "../pen/types.js";
4
5
  /** Every tool with its single-letter key. Shapes share one bar button but keep a key each. */
5
6
  export const TOOLS = [
@@ -53,6 +54,12 @@ const TOOL_BY_KEY = new Map(TOOLS.map((tool) => [tool.key.toLowerCase(), tool.id
53
54
  export function toolForKey(key) {
54
55
  return TOOL_BY_KEY.get(key.toLowerCase()) ?? null;
55
56
  }
57
+ /** The tool a key press picks: the tooltip's bare letter, never with a modifier or while a field has focus. */
58
+ export function resolveToolKey(event) {
59
+ if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return null;
60
+ if (isEditingTarget(event.target)) return null;
61
+ return toolForKey(event.key);
62
+ }
56
63
  export function keyForTool(tool) {
57
64
  return TOOLS.find((entry) => entry.id === tool)?.key ?? "";
58
65
  }
@@ -0,0 +1,59 @@
1
+ /** Builds the table and summary every cartesian chart hands to ChartPlot. A missing value reads `empty`. */
2
+ export function chartTable(data, x, series, format, { xLabel = "", empty = "No data" } = {}) {
3
+ const xs = data.map(x);
4
+ const rows = data.map((d, i) => ({
5
+ x: xs[i],
6
+ cells: series.map((s) => {
7
+ const n = numeric(s.value(d));
8
+ return n == null ? empty : (s.format ?? format)(n);
9
+ })
10
+ }));
11
+ const lines = series.map((s) => seriesLine(s.label, data.map((d) => numeric(s.value(d))), s.format ?? format));
12
+ const range = xs.length === 0 ? "No data" : xs.length === 1 ? xs[0] : `${xs[0]} to ${xs.at(-1)}`;
13
+ return {
14
+ xLabel,
15
+ columns: series.map((s) => s.label),
16
+ rows,
17
+ summary: xs.length === 0 ? "No data." : [`${range}.`, ...lines].join(" ")
18
+ };
19
+ }
20
+ function numeric(v) {
21
+ if (v == null) return null;
22
+ const n = Number(v);
23
+ return Number.isFinite(n) ? n : null;
24
+ }
25
+ function seriesLine(label, values, format) {
26
+ const nums = values.filter((n) => n != null);
27
+ if (nums.length === 0) return `${label}: no data.`;
28
+ let low = nums[0];
29
+ let high = nums[0];
30
+ for (const n of nums) {
31
+ if (n < low) low = n;
32
+ if (n > high) high = n;
33
+ }
34
+ const ends = `first ${format(nums[0])}, last ${format(nums[nums.length - 1])}`;
35
+ return `${label}: ${ends}, low ${format(low)}, high ${format(high)}.`;
36
+ }
37
+ /** What one row reads as when the arrow keys land on it, like "Mar: Revenue $4,100, Cost $2,100". */
38
+ export function rowSummary(table, i) {
39
+ const row = table.rows[i];
40
+ if (!row) return "";
41
+ return `${row.x}: ${table.columns.map((c, j) => `${c} ${row.cells[j]}`).join(", ")}`;
42
+ }
43
+ /**
44
+ * The point a key moves to from `at`, where -1 is none yet. `undefined` means the key isn't the
45
+ * plot's, and `null` means Escape cleared the point.
46
+ */
47
+ export function nextPoint(key, at, count) {
48
+ if (count === 0) return undefined;
49
+ switch (key) {
50
+ case "ArrowRight":
51
+ case "ArrowDown": return at < 0 ? 0 : Math.min(at + 1, count - 1);
52
+ case "ArrowLeft":
53
+ case "ArrowUp": return at < 0 ? count - 1 : Math.max(at - 1, 0);
54
+ case "Home": return 0;
55
+ case "End": return count - 1;
56
+ case "Escape": return at < 0 ? undefined : null;
57
+ default: return undefined;
58
+ }
59
+ }
@@ -1,4 +1,3 @@
1
- export { default as DataPanel } from "../../../src/lib/panel.svelte";
2
1
  export { default as DataTable } from "../../../src/charts/dashboard/data-table.svelte";
3
2
  export { default as RatingChip } from "../../../src/charts/dashboard/rating-chip.svelte";
4
3
  export { default as DashboardSection } from "../../../src/charts/dashboard/dashboard-section.svelte";
@@ -0,0 +1,38 @@
1
+ const NICE = [
2
+ 1,
3
+ 2,
4
+ 2.5,
5
+ 5,
6
+ 10
7
+ ];
8
+ /** The smallest 1, 2, 2.5 or 5 times a power of ten that is at least `raw`. */
9
+ export function niceStep(raw) {
10
+ if (!(raw > 0) || !Number.isFinite(raw)) return 1;
11
+ const power = 10 ** Math.floor(Math.log10(raw));
12
+ // WHY the epsilon: 0.3 / 0.1 is 2.9999999999999996, which would skip 3 x 0.1 for the next step.
13
+ const multiple = NICE.find((m) => m * power >= raw * (1 - 1e-9)) ?? 10;
14
+ return multiple * power;
15
+ }
16
+ function ticksOf(step, count) {
17
+ // Rounded so 0.1 x 3 reads 0.3 on the axis, not 0.30000000000000004.
18
+ return Array.from({ length: count + 1 }, (_, i) => Number((i * step).toPrecision(12)));
19
+ }
20
+ /**
21
+ * Left and right domains from 0, with the same tick count so both axes sit on one grid.
22
+ * `target` is the number of intervals wanted; the left data may round it to one more or less.
23
+ */
24
+ export function dualAxis(leftMax, rightMax, target = 4) {
25
+ const leftStep = niceStep(Math.max(0, leftMax) / target);
26
+ const count = Math.max(1, Math.ceil(Math.max(0, leftMax) / leftStep - 1e-9));
27
+ const rightStep = niceStep(Math.max(0, rightMax) / count);
28
+ return {
29
+ left: {
30
+ max: leftStep * count,
31
+ ticks: ticksOf(leftStep, count)
32
+ },
33
+ right: {
34
+ max: rightStep * count,
35
+ ticks: ticksOf(rightStep, count)
36
+ }
37
+ };
38
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shift+F10 or the ContextMenu key sends Bits UI's ContextMenu the `contextmenu` event Safari
3
+ * never fires for a key. Preventing the key stops Chrome sending a second one.
4
+ */
5
+ export function openMenuFromKey(event) {
6
+ const menuKey = event.key === "ContextMenu" || event.shiftKey && event.key === "F10";
7
+ if (!menuKey || event.defaultPrevented) return;
8
+ event.preventDefault();
9
+ const row = event.currentTarget;
10
+ const box = row.getBoundingClientRect();
11
+ row.dispatchEvent(new MouseEvent("contextmenu", {
12
+ bubbles: true,
13
+ cancelable: true,
14
+ clientX: box.left + 16,
15
+ clientY: box.top + box.height
16
+ }));
17
+ }
18
+ /** What a row with a menu tells a screen reader about the keys that open it. */
19
+ export const MENU_KEYS = "Shift+F10 ContextMenu";
@@ -10,7 +10,6 @@ export { default as NoticeBar } from "../../../src/components/list-page/notice-b
10
10
  export { default as RailBody } from "../../../src/components/list-page/rail-body.svelte";
11
11
  export { default as RailHead } from "../../../src/components/list-page/rail-head.svelte";
12
12
  export { default as RailRow } from "../../../src/components/list-page/rail-row.svelte";
13
- export { default as SectionLabel } from "../../../src/components/section-header/section-label.svelte";
14
13
  export { queueRailClass, queueRailWidth } from "./queue-rail.js";
15
14
  export { default as FilterPopover } from "../../../src/components/list-page/filter-popover.svelte";
16
15
  export { filterSectionClass } from "./filter-section.js";
@@ -3,5 +3,4 @@
3
3
  * layout, or the no-flash script never runs.
4
4
  */
5
5
  export { default as ThemeProvider } from "../../../src/components/theme/theme-provider.svelte";
6
- export { revealTheme } from "../../lib/theme-transition.js";
7
6
  export { mode, resetMode, setMode, systemPrefersMode, toggleMode, userPrefersMode } from "mode-watcher";
@@ -1,7 +1,5 @@
1
1
  /**
2
- * One toolbar row for a list page. Wide, it shows search, tabs and a view switch inline. Narrow,
3
- * each of those folds into a menu and the row never wraps.
2
+ * One toolbar row for a list page: search, tabs and a view switch inline, folded into menus when
3
+ * narrow, never wrapping. `ToolbarSearch` lives in list-page.
4
4
  */
5
5
  export { default as Toolbar } from "../../../src/components/toolbar/toolbar.svelte";
6
- export { default as ToolbarSearch } from "../../../src/components/toolbar/toolbar-search.svelte";
7
- export { toolbarTriggerClass } from "./toolbar-trigger.js";
@@ -1,4 +1,3 @@
1
- export { default as CountChip } from "../../../src/components/chip/count-chip.svelte";
2
1
  export { default as GroupHead } from "../../../src/components/work-parts/group-head.svelte";
3
2
  export { default as PropertyRow } from "../../../src/components/work-parts/property-row.svelte";
4
3
  export { default as WorkCard } from "../../../src/components/work-parts/work-card.svelte";
@@ -0,0 +1,40 @@
1
+ import { Extension } from "@tiptap/core";
2
+ import { Fragment } from "@tiptap/pm/model";
3
+ import { NodeSelection, Selection, TextSelection } from "@tiptap/pm/state";
4
+ /**
5
+ * Swaps the top-level block holding the selection with its neighbour, the same block the drag
6
+ * handle moves. Null at the top or bottom of the document.
7
+ */
8
+ export function moveBlock(state, dir) {
9
+ const { selection, doc } = state;
10
+ const index = selection.$from.index(0);
11
+ const other = index + dir;
12
+ if (other < 0 || other >= doc.childCount) return null;
13
+ const node = doc.child(index);
14
+ const start = selection.$from.posAtIndex(index, 0);
15
+ const neighbour = doc.child(other);
16
+ const from = dir === 1 ? start : start - neighbour.nodeSize;
17
+ const to = from + node.nodeSize + neighbour.nodeSize;
18
+ const pair = dir === 1 ? [neighbour, node] : [node, neighbour];
19
+ const tr = state.tr.replaceWith(from, to, Fragment.fromArray(pair));
20
+ const moved = dir === 1 ? from + neighbour.nodeSize : from;
21
+ const shift = moved - start;
22
+ const next = selection instanceof NodeSelection ? NodeSelection.create(tr.doc, selection.from + shift) : selection instanceof TextSelection ? TextSelection.create(tr.doc, selection.anchor + shift, selection.head + shift) : Selection.near(tr.doc.resolve(selection.head + shift));
23
+ return tr.setSelection(next).scrollIntoView();
24
+ }
25
+ /** Alt+Shift+Up and Down: the keyboard way to do what the drag handle does. */
26
+ export const BlockMove = Extension.create({
27
+ name: "blockMove",
28
+ addKeyboardShortcuts() {
29
+ const run = (dir) => () => {
30
+ const tr = moveBlock(this.editor.state, dir);
31
+ if (!tr) return false;
32
+ this.editor.view.dispatch(tr);
33
+ return true;
34
+ };
35
+ return {
36
+ "Alt-Shift-ArrowUp": run(-1),
37
+ "Alt-Shift-ArrowDown": run(1)
38
+ };
39
+ }
40
+ });
@@ -15,7 +15,7 @@ export const HeadingAnchors = Extension.create({
15
15
  addOptions() {
16
16
  return {
17
17
  label: "Copy link",
18
- oncopy: undefined
18
+ onCopy: undefined
19
19
  };
20
20
  },
21
21
  addProseMirrorPlugins() {
@@ -52,7 +52,7 @@ export const HeadingAnchors = Extension.create({
52
52
  void copyText(url);
53
53
  button.dataset.copied = "true";
54
54
  setTimeout(() => delete button.dataset.copied, 1400);
55
- options.oncopy?.(url, id);
55
+ options.onCopy?.(url, id);
56
56
  });
57
57
  return button;
58
58
  }, {
@@ -6,6 +6,7 @@ import { DragHandle } from "@tiptap/extension-drag-handle";
6
6
  import { TaskItem, TaskList } from "@tiptap/extension-list";
7
7
  import { Table, TableCell, TableHeader, TableRow } from "@tiptap/extension-table";
8
8
  import { BlockIdExtension } from "./block-id.js";
9
+ import { BlockMove } from "./block-move.js";
9
10
  import { CodeBlockChrome, HeadingAnchors } from "./doc-blocks.js";
10
11
  const CmsBlock = TiptapNode.create({
11
12
  name: "cmsBlock",
@@ -114,6 +115,17 @@ function dedupeExtensions(extensions) {
114
115
  });
115
116
  }
116
117
  const DRAG_DOTS = `<svg width="12" height="12" viewBox="0 0 12 12" fill="none"><circle cx="2.5" cy="2.5" r="1" fill="currentColor"/><circle cx="2.5" cy="6" r="1" fill="currentColor"/><circle cx="2.5" cy="9.5" r="1" fill="currentColor"/><circle cx="6" cy="2.5" r="1" fill="currentColor"/><circle cx="6" cy="6" r="1" fill="currentColor"/><circle cx="6" cy="9.5" r="1" fill="currentColor"/></svg>`;
118
+ /** The stock Image has no align, so the image toolbar's choice was dropped. content.css reads data-align. */
119
+ const AlignedImage = Image.extend({ addAttributes() {
120
+ return {
121
+ ...this.parent?.(),
122
+ align: {
123
+ default: null,
124
+ parseHTML: (el) => el.getAttribute("data-align"),
125
+ renderHTML: (attrs) => attrs.align ? { "data-align": attrs.align } : {}
126
+ }
127
+ };
128
+ } });
117
129
  function dragHandle() {
118
130
  return DragHandle.configure({ render() {
119
131
  const el = document.createElement("div");
@@ -142,7 +154,7 @@ export function buildExtensions({ preset, placeholder, blockIds, anchors = false
142
154
  ...full ? [
143
155
  CmsBlock,
144
156
  Youtube,
145
- Image.configure({ inline: false }),
157
+ AlignedImage.configure({ inline: false }),
146
158
  TaskList,
147
159
  TaskItem.configure({ nested: true }),
148
160
  Table.configure({ resizable: false }),
@@ -154,6 +166,7 @@ export function buildExtensions({ preset, placeholder, blockIds, anchors = false
154
166
  ...anchors ? [HeadingAnchors.configure(anchors)] : [],
155
167
  Placeholder.configure({ placeholder }),
156
168
  dragHandle(),
169
+ BlockMove,
157
170
  ...blockIds ? [BlockIdExtension] : []
158
171
  ]);
159
172
  }
@@ -0,0 +1,2 @@
1
+ export { default as BorderBeam } from "../../../src/effects/border-beam/BorderBeam.svelte";
2
+ export { sizePresets, sizeThemePresets, themeColors } from "./presets.js";
@@ -0,0 +1 @@
1
+ export { default as ImageComparison } from "../../../src/effects/image-comparison/ImageComparison.svelte";
@@ -0,0 +1 @@
1
+ export { default as InteractiveHoverButton } from "../../../src/effects/interactive-hover-button/InteractiveHoverButton.svelte";
@@ -0,0 +1 @@
1
+ export { default as MagicCard } from "../../../src/effects/magic-card/MagicCard.svelte";
@@ -0,0 +1 @@
1
+ export { default as Marquee } from "../../../src/effects/marquee/Marquee.svelte";
@@ -0,0 +1 @@
1
+ export { default as ProgressiveBlur } from "../../../src/effects/progressive-blur/ProgressiveBlur.svelte";
@@ -0,0 +1 @@
1
+ export { default as Spotlight } from "../../../src/effects/spotlight/Spotlight.svelte";
@@ -0,0 +1 @@
1
+ export { default as ThemeToggle } from "../../../src/effects/theme-toggle/ThemeToggle.svelte";
@@ -1,5 +1,5 @@
1
1
  export { default as ThreadInbox } from "../../src/inbox/thread-inbox.svelte";
2
2
  export { NO_FILTER, actorNames, entryLine, filterThreads, inboxKeyOf, isPending, resolveInboxLabels, snoozeChoices, subjectTypes, threadsOf } from "./logic.js";
3
3
  export { ALL, DEFAULT_INBOX_LABELS } from "./types.js";
4
- // The approval card a pinned proposal is drawn with, and the types its `proposal` field carries.
4
+ // The approval card a pinned proposal is drawn with. Its `proposal` types come from `./work/inbox`.
5
5
  export { default as InboxCard } from "../../src/work/inbox/inbox-card.svelte";
@@ -0,0 +1,15 @@
1
+ import { tick } from "svelte";
2
+ /**
3
+ * Focuses the first target that takes focus, a selector under root or an element, once Svelte
4
+ * has rendered. A moved keyed item or opened pane is a new node.
5
+ */
6
+ export async function focusAfterRender(root, ...targets) {
7
+ await tick();
8
+ for (const target of targets) {
9
+ const el = typeof target === "string" ? root?.querySelector(target) : target;
10
+ if (!el?.isConnected) continue;
11
+ el.focus();
12
+ if (document.activeElement === el) return el;
13
+ }
14
+ return undefined;
15
+ }
package/dist/lib/tone.js CHANGED
@@ -11,9 +11,8 @@ export const TONE_CLASS = {
11
11
  destructive: "border-destructive/30 bg-destructive/10 text-destructive-ink"
12
12
  };
13
13
  /**
14
- * The scale as a quiet tint with no border: the icon and the text carry the tone, the fill only
15
- * groups them. Neutral reads off the foreground, not `bg-muted`, because muted sits 0.005 L from
16
- * the canvas and vanishes there (tokens board, "what fights the new scale").
14
+ * A quiet borderless tint: icon and text carry the tone. Neutral reads off the foreground,
15
+ * since `bg-muted` sits 0.005 L from the canvas and vanishes there.
17
16
  */
18
17
  export const TONE_TINT = {
19
18
  neutral: "bg-foreground/6 text-muted-foreground",
@@ -30,7 +29,7 @@ export const TONE_TEXT = {
30
29
  info: "text-info-800 dark:text-info-400",
31
30
  success: "text-success-800 dark:text-success-400",
32
31
  warning: "text-warning-800 dark:text-warning-400",
33
- destructive: "text-destructive"
32
+ destructive: "text-destructive-ink"
34
33
  };
35
34
  /** The same scale as icon color. */
36
35
  export const TONE_ICON = {
@@ -3,7 +3,7 @@ export const alertVariants = tv({
3
3
  base: "relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
4
4
  variants: { variant: {
5
5
  default: "bg-card text-card-foreground",
6
- destructive: "text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current"
6
+ destructive: "text-destructive-ink bg-card *:data-[slot=alert-description]:text-destructive-ink [&>svg]:text-current"
7
7
  } },
8
8
  defaultVariants: { variant: "default" }
9
9
  });
@@ -0,0 +1,10 @@
1
+ import { getContext, setContext } from "svelte";
2
+ const KEY = Symbol("attachment");
3
+ /** Called by Attachment.Root: the id its Title takes, so the Trigger and Actions can point at it. */
4
+ export function setAttachmentTitleId(id) {
5
+ setContext(KEY, id);
6
+ }
7
+ /** The enclosing card's title id, or undefined outside an Attachment.Root. */
8
+ export function getAttachmentTitleId() {
9
+ return getContext(KEY);
10
+ }
@@ -22,7 +22,7 @@ export const menuItemClass = tv({
22
22
  variants: {
23
23
  variant: {
24
24
  default: "hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground",
25
- destructive: "text-destructive *:[svg]:text-destructive hover:bg-destructive/10 focus:bg-destructive/10 focus:text-destructive dark:hover:bg-destructive/20 dark:focus:bg-destructive/20"
25
+ destructive: "text-destructive-ink *:[svg]:text-destructive hover:bg-destructive/10 focus:bg-destructive/10 focus:text-destructive-ink dark:hover:bg-destructive/20 dark:focus:bg-destructive/20"
26
26
  },
27
27
  /** A row in a set where a sibling carries a leading mark. */
28
28
  inset: {
@@ -28,10 +28,66 @@ const aliases = {
28
28
  yml: "yaml",
29
29
  zsh: "bash"
30
30
  };
31
+ // VS Code's pair colours an imported name too. No bundled light theme clears 4.5:1 on bg-muted.
32
+ const THEMES = {
33
+ light: "light-plus",
34
+ dark: "dark-plus"
35
+ };
36
+ // The faintest code surface in each mode: a highlighted line (bg-muted), the input tint in dark.
37
+ const SURFACES = {
38
+ light: [
39
+ 232,
40
+ 232,
41
+ 232
42
+ ],
43
+ dark: [
44
+ 52,
45
+ 52,
46
+ 52
47
+ ]
48
+ };
49
+ function luminance(rgb) {
50
+ const [r, g, b] = rgb.map((v) => {
51
+ const s = v / 255;
52
+ return s <= .04045 ? s / 12.92 : ((s + .055) / 1.055) ** 2.4;
53
+ });
54
+ return .2126 * r + .7152 * g + .0722 * b;
55
+ }
56
+ function contrast(a, b) {
57
+ const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x);
58
+ return (hi + .05) / (lo + .05);
59
+ }
60
+ // Steps an opaque hex colour toward black (light) or white (dark), keeping its hue, until it reads 4.5:1.
61
+ function readable(hex, mode) {
62
+ if (!/^#[\da-f]{6}(ff)?$/i.test(hex)) return hex;
63
+ const base = [
64
+ 1,
65
+ 3,
66
+ 5
67
+ ].map((i) => Number.parseInt(hex.slice(i, i + 2), 16));
68
+ let rgb = base;
69
+ for (let step = .01; contrast(rgb, SURFACES[mode]) < 4.5 && step <= 1; step += .01) {
70
+ rgb = base.map((v) => Math.round(mode === "light" ? v * (1 - step) : v + (255 - v) * step));
71
+ }
72
+ return `#${rgb.map((v) => v.toString(16).padStart(2, "0")).join("")}`;
73
+ }
74
+ async function readableTheme(theme, mode) {
75
+ const { default: raw } = await theme;
76
+ return {
77
+ ...raw,
78
+ tokenColors: raw.tokenColors?.map((rule) => rule.settings.foreground ? {
79
+ ...rule,
80
+ settings: {
81
+ ...rule.settings,
82
+ foreground: readable(rule.settings.foreground, mode)
83
+ }
84
+ } : rule)
85
+ };
86
+ }
31
87
  let highlighter;
32
88
  function getHighlighter() {
33
89
  highlighter ??= createHighlighterCore({
34
- themes: [import("shiki/themes/github-light.mjs"), import("shiki/themes/github-dark.mjs")],
90
+ themes: [readableTheme(import("shiki/themes/light-plus.mjs"), "light"), readableTheme(import("shiki/themes/dark-plus.mjs"), "dark")],
35
91
  langs: [],
36
92
  engine: createJavaScriptRegexEngine({ forgiving: true })
37
93
  });
@@ -71,10 +127,7 @@ export async function loadHighlighter(language) {
71
127
  highlight(code, state) {
72
128
  const tokenize = (text) => shiki.codeToTokens(text, {
73
129
  lang,
74
- themes: {
75
- light: "github-light",
76
- dark: "github-dark"
77
- },
130
+ themes: THEMES,
78
131
  defaultColor: false,
79
132
  grammarState: state
80
133
  }).tokens;
@@ -3,4 +3,4 @@ export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
3
3
  export const SIDEBAR_WIDTH = "16rem";
4
4
  export const SIDEBAR_WIDTH_MOBILE = "18rem";
5
5
  export const SIDEBAR_WIDTH_ICON = "3rem";
6
- export const SIDEBAR_KEYBOARD_SHORTCUT = "s";
6
+ export const SIDEBAR_KEYBOARD_SHORTCUT = "b";