@heyramzi/ui 2.0.1 → 2.2.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 (341) hide show
  1. package/package.json +48 -24
  2. package/scripts/sync-shadcn.mjs +3 -4
  3. package/src/agents/agent-avatar.svelte +604 -575
  4. package/src/agents/agent-cast.svelte +179 -183
  5. package/src/agents/demo.svelte +125 -113
  6. package/src/agents/helpers.ts +23 -17
  7. package/src/agents/index.ts +4 -4
  8. package/src/agents/page-state.ts +6 -6
  9. package/src/agents/types.ts +6 -6
  10. package/src/ai/ai-button/AiButton.svelte +4 -12
  11. package/src/ai/generation-progress/GenerationProgress.svelte +10 -3
  12. package/src/ai/prompt-input/PromptInputTextarea.svelte +1 -2
  13. package/src/ai/response/Response.css +2 -3
  14. package/src/animations/avatar-group-hover.css +2 -16
  15. package/src/animations/card-tilt.css +3 -6
  16. package/src/animations/digit-pop-in.css +2 -15
  17. package/src/animations/dropdown.css +4 -17
  18. package/src/animations/input-clear-dissolve.css +5 -18
  19. package/src/animations/input-shake.css +9 -41
  20. package/src/animations/learn-more-hover.css +17 -9
  21. package/src/animations/like-button.css +2 -4
  22. package/src/animations/page-side-by-side.css +2 -10
  23. package/src/animations/plus-menu-morph.css +2 -5
  24. package/src/animations/shimmer-text.css +5 -18
  25. package/src/animations/spinning-counter.css +2 -6
  26. package/src/animations/success-check.css +2 -15
  27. package/src/animations/thinking-states.css +2 -7
  28. package/src/brand/brand.test.ts +21 -5
  29. package/src/brand/index.ts +4 -10
  30. package/src/canvas/README.md +9 -12
  31. package/src/canvas/card/card-frame.svelte +43 -39
  32. package/src/canvas/card/resize-handles.svelte +89 -80
  33. package/src/canvas/chrome/chrome-zoom.svelte +101 -100
  34. package/src/canvas/chrome/lock-badge.svelte +8 -8
  35. package/src/canvas/chrome/side-handles.svelte +24 -19
  36. package/src/canvas/chrome/size-chip.svelte +30 -30
  37. package/src/canvas/chrome/snap-guides.svelte +20 -20
  38. package/src/canvas/components/icons/ToolIcon.svelte +8 -8
  39. package/src/canvas/components/shared/svg/PreviewSvg.svelte +19 -19
  40. package/src/canvas/components/shared/svg/ShapeOutline.svelte +71 -48
  41. package/src/canvas/components/shared/svg/StrokeNode.svelte +21 -27
  42. package/src/canvas/components/shared/svg/TextRule.svelte +25 -17
  43. package/src/canvas/edges/bend-handle.svelte +46 -46
  44. package/src/canvas/edges/edge-gradient.svelte +10 -10
  45. package/src/canvas/edges/gradient-edge.svelte +45 -29
  46. package/src/canvas/editor/lock.test.ts +6 -1
  47. package/src/canvas/editor/style.ts +7 -1
  48. package/src/canvas/headless/svg-figure.test.ts +5 -1
  49. package/src/canvas/lod/lod-switch.svelte +111 -106
  50. package/src/canvas/pen/PenField.svelte +87 -81
  51. package/src/canvas/pen/PenOverlay.svelte +127 -127
  52. package/src/canvas/pen/ShapeNode.svelte +31 -32
  53. package/src/canvas/pen/TextNode.svelte +54 -53
  54. package/src/canvas/pen/host-field.test.svelte +7 -7
  55. package/src/canvas/pen/shapes.ts +7 -1
  56. package/src/canvas/screen/GlyphIcon.svelte +22 -17
  57. package/src/canvas/screen/PartView.svelte +138 -72
  58. package/src/canvas/screen/ScreenBody.svelte +81 -60
  59. package/src/canvas/screen/ScreenCard.svelte +20 -20
  60. package/src/canvas/ui/CanvasToolbar.svelte +173 -85
  61. package/src/canvas/ui/FrameLayer.svelte +59 -59
  62. package/src/canvas/ui/PenLayer.svelte +39 -30
  63. package/src/canvas/ui/StylePanel.svelte +119 -102
  64. package/src/canvas/ui/canvas-grid.svelte +137 -129
  65. package/src/charts/animated-value.svelte +1 -1
  66. package/src/charts/area-chart.css +2 -5
  67. package/src/charts/area-chart.svelte +1 -1
  68. package/src/charts/bar-chart.css +2 -3
  69. package/src/charts/bar-chart.svelte +1 -1
  70. package/src/charts/charts.css +5 -17
  71. package/src/charts/crosshair.svelte +1 -1
  72. package/src/charts/dashboard/dashboard-empty.svelte +25 -25
  73. package/src/charts/dashboard/dashboard-section.svelte +24 -24
  74. package/src/charts/dashboard/data-panel.svelte +50 -50
  75. package/src/charts/dashboard/data-sort-head.svelte +56 -56
  76. package/src/charts/dashboard/data-table.svelte +138 -138
  77. package/src/charts/dashboard/panel-grid.svelte +30 -30
  78. package/src/charts/dashboard/period-filter.svelte +25 -25
  79. package/src/charts/dashboard/rating-chip.svelte +19 -19
  80. package/src/charts/dashboard/stat-band.svelte +32 -32
  81. package/src/charts/dashboard/stat-tile.svelte +106 -99
  82. package/src/charts/donut-chart.svelte +1 -1
  83. package/src/charts/edge-fade.svelte +1 -1
  84. package/src/charts/figure.svelte +1 -1
  85. package/src/charts/gauge-chart.css +4 -7
  86. package/src/charts/gauge-chart.svelte +1 -1
  87. package/src/charts/hover-focus.svelte +1 -1
  88. package/src/charts/legend.css +1 -3
  89. package/src/charts/legend.svelte +1 -1
  90. package/src/charts/line-chart.svelte +1 -1
  91. package/src/charts/number-chart.css +6 -9
  92. package/src/charts/number-chart.svelte +1 -1
  93. package/src/charts/reference-line.svelte +19 -19
  94. package/src/charts/reveal.svelte +1 -1
  95. package/src/charts/ring-chart.css +2 -4
  96. package/src/charts/ring-chart.svelte +1 -1
  97. package/src/charts/sparkline.svelte +5 -2
  98. package/src/charts/stat-card.svelte +1 -1
  99. package/src/charts/time-series-chart.css +2 -5
  100. package/src/charts/trend-pill.css +2 -4
  101. package/src/charts/trend-pill.svelte +1 -1
  102. package/src/components/copy/copy-button.svelte +93 -98
  103. package/src/components/copy/copy-button.test.ts +10 -2
  104. package/src/components/data-table/infinite-scroll.svelte +42 -42
  105. package/src/components/data-table/pagination.svelte +34 -22
  106. package/src/components/data-table/row-arrow.svelte +19 -16
  107. package/src/components/data-table/row-context-menu.svelte +52 -52
  108. package/src/components/data-table/sortable-head.svelte +25 -25
  109. package/src/components/data-table/table-skeleton.svelte +41 -36
  110. package/src/components/docs/doc-page.svelte +18 -9
  111. package/src/components/docs/on-this-page.svelte +16 -3
  112. package/src/components/docs/scroll-spy.svelte.ts +2 -3
  113. package/src/components/field-row/field-row.svelte +10 -8
  114. package/src/components/hold-to-confirm/hold-to-confirm.svelte +5 -1
  115. package/src/components/icon/icon.svelte +14 -14
  116. package/src/components/language-flag/language-flag.svelte +3 -1
  117. package/src/components/list-page/detail-empty.svelte +34 -34
  118. package/src/components/list-page/detail-header.svelte +55 -47
  119. package/src/components/list-page/detail-panel.svelte +51 -59
  120. package/src/components/list-page/detail-row.svelte +19 -19
  121. package/src/components/list-page/detail-stack.svelte +21 -21
  122. package/src/components/list-page/empty-state.svelte +30 -30
  123. package/src/components/list-page/filter-item.svelte +20 -20
  124. package/src/components/list-page/filter-popover.svelte +60 -55
  125. package/src/components/list-page/grouped-list.svelte +4 -2
  126. package/src/components/list-page/index.ts +8 -4
  127. package/src/components/list-page/list-page-shell.svelte +2 -5
  128. package/src/components/list-page/master-detail.svelte +87 -88
  129. package/src/components/list-page/notice-bar.svelte +38 -38
  130. package/src/components/list-page/prev-next.svelte +63 -63
  131. package/src/components/list-page/rail-body.svelte +18 -18
  132. package/src/components/list-page/rail-empty.svelte +23 -30
  133. package/src/components/list-page/rail-head.svelte +24 -24
  134. package/src/components/list-page/rail-row.svelte +77 -73
  135. package/src/components/list-page/section-host.ts +2 -3
  136. package/src/components/locale-switch/locale-switch.svelte +41 -41
  137. package/src/components/mark/mark.svelte +34 -38
  138. package/src/components/open-in/index.ts +1 -5
  139. package/src/components/open-in/open-in.svelte +40 -40
  140. package/src/components/picker/mark-picker.svelte +49 -49
  141. package/src/components/picker/picker.svelte +5 -3
  142. package/src/components/section-header/index.ts +1 -0
  143. package/src/components/section-header/section-header.svelte +1 -1
  144. package/src/components/section-header/section-header.test.ts +7 -1
  145. package/src/components/section-header/section-label.svelte +39 -0
  146. package/src/components/segmented/animated-tabs.svelte +31 -2
  147. package/src/components/segmented/collapse.test.ts +2 -1
  148. package/src/components/segmented/index.ts +2 -0
  149. package/src/components/segmented/segment.svelte +52 -49
  150. package/src/components/segmented/segmented-filter.svelte +79 -80
  151. package/src/components/segmented/segmented-nav.svelte +34 -40
  152. package/src/components/segmented/segmented-overflow.svelte +53 -50
  153. package/src/components/segmented/segmented-track.svelte +62 -46
  154. package/src/components/segmented/segmented.ts +2 -3
  155. package/src/components/star-rating-input/star-rating-input.svelte +103 -103
  156. package/src/components/svg/svg.svelte +4 -4
  157. package/src/components/table-view/table-view.svelte +17 -2
  158. package/src/components/table-view/table-view.test.ts +7 -1
  159. package/src/components/table-view/types.ts +11 -11
  160. package/src/components/tags-input/index.ts +13 -0
  161. package/src/components/tags-input/tags-input.svelte +305 -0
  162. package/src/components/tags-input/tags.test.ts +64 -0
  163. package/src/components/tags-input/tags.ts +142 -0
  164. package/src/components/theme/index.ts +2 -4
  165. package/src/components/theme/theme-provider.svelte +1 -3
  166. package/src/components/toolbar/index.ts +2 -0
  167. package/src/components/{list-page → toolbar}/toolbar-search.svelte +25 -25
  168. package/src/components/toolbar/toolbar.svelte +13 -9
  169. package/src/components/toolbar/toolbar.test.ts +10 -1
  170. package/src/design/index.css +21 -78
  171. package/src/design/polish.css +26 -35
  172. package/src/editor/editor-toolbar.svelte +104 -99
  173. package/src/editor/editor.svelte +296 -266
  174. package/src/editor/image-toolbar.svelte +20 -22
  175. package/src/editor/index.ts +1 -4
  176. package/src/editor/inline-editor.svelte +280 -238
  177. package/src/editor/markdown.ts +15 -15
  178. package/src/editor/renderer.svelte +71 -71
  179. package/src/editor/slash-menu.svelte +24 -27
  180. package/src/effects/animated-beam/diagrams/BeamSvg.svelte +1 -1
  181. package/src/effects/image-comparison/ImageComparison.svelte +11 -1
  182. package/src/effects/interactive-hover-button/InteractiveHoverButton.svelte +59 -46
  183. package/src/effects/magic-card/MagicCard.css +14 -7
  184. package/src/effects/marquee/Marquee.svelte +3 -5
  185. package/src/effects/reveal/observe.ts +0 -3
  186. package/src/effects/spotlight/Spotlight.svelte +1 -1
  187. package/src/effects/theme-toggle/ThemeToggle.css +25 -22
  188. package/src/effects/theme-toggle/ThemeToggle.svelte +6 -7
  189. package/src/gallery.test.ts +14 -4
  190. package/src/inbox/README.md +27 -0
  191. package/src/inbox/inbox.test.ts +214 -0
  192. package/src/inbox/index.ts +31 -0
  193. package/src/inbox/logic.ts +169 -0
  194. package/src/inbox/thread-inbox.svelte +439 -0
  195. package/src/inbox/types.ts +161 -0
  196. package/src/lib/theme-transition.ts +2 -4
  197. package/src/lib/tone.ts +2 -4
  198. package/src/lib/utils.ts +2 -2
  199. package/src/modules.test.ts +105 -0
  200. package/src/onboarding/define-tours.test.ts +55 -40
  201. package/src/onboarding/define-tours.ts +23 -23
  202. package/src/onboarding/demo.svelte +24 -5
  203. package/src/onboarding/index.ts +1 -8
  204. package/src/onboarding/onboarding-provider.svelte +19 -7
  205. package/src/onboarding/onboarding.svelte.ts +16 -16
  206. package/src/onboarding/pick.test.ts +61 -52
  207. package/src/onboarding/pick.ts +16 -13
  208. package/src/onboarding/stores.test.ts +80 -80
  209. package/src/onboarding/stores.ts +41 -39
  210. package/src/onboarding/tour-card.svelte +30 -5
  211. package/src/onboarding/tour-runner.svelte +12 -3
  212. package/src/onboarding/types.ts +20 -12
  213. package/src/onboarding/wait.ts +22 -22
  214. package/src/panel/README.md +5 -0
  215. package/src/panel/index.ts +2 -0
  216. package/src/panel/side-panel.svelte +194 -0
  217. package/src/record/README.md +3 -0
  218. package/src/record/demo-data.ts +352 -0
  219. package/src/record/field-section.svelte +57 -0
  220. package/src/record/fields.ts +194 -0
  221. package/src/record/format.ts +94 -0
  222. package/src/{tasks/record → record}/index.ts +49 -35
  223. package/src/{tasks/record → record}/info-list.svelte +145 -114
  224. package/src/record/kinds.ts +42 -0
  225. package/src/record/logic.ts +326 -0
  226. package/src/record/next-up.svelte +81 -0
  227. package/src/{tasks/record → record}/project-list.svelte +56 -50
  228. package/src/{tasks/record → record}/record-demo.svelte +130 -110
  229. package/src/{tasks/record → record}/record-header.svelte +37 -28
  230. package/src/{tasks/record → record}/record-shell.svelte +54 -54
  231. package/src/record/record-stats.svelte +48 -0
  232. package/src/record/record-timeline.svelte +251 -0
  233. package/src/record/record.test.ts +471 -0
  234. package/src/{tasks/record → record}/steps-rail.svelte +225 -216
  235. package/src/record/types.ts +299 -0
  236. package/src/record/where-we-are.svelte +125 -0
  237. package/src/shadcn/button/button.svelte +1 -1
  238. package/src/shadcn/card/card-title.svelte +1 -5
  239. package/src/shadcn/hooks/use-highlighted-code.svelte.ts +2 -13
  240. package/src/shadcn/sheet/sheet-content.svelte +2 -4
  241. package/src/shadcn/table/table-cell.svelte +2 -3
  242. package/src/shadcn/utilities.css +3 -8
  243. package/src/slides/Controls.svelte +150 -124
  244. package/src/slides/Deck.svelte +243 -238
  245. package/src/slides/Fragment.svelte +64 -57
  246. package/src/slides/Overview.svelte +106 -101
  247. package/src/slides/Presenter.svelte +300 -266
  248. package/src/slides/Slide.svelte +185 -170
  249. package/src/slides/SlideList.svelte +16 -12
  250. package/src/slides/ambient.d.ts +1 -1
  251. package/src/slides/bridges.ts +42 -23
  252. package/src/slides/deck-controller.svelte.ts +47 -35
  253. package/src/slides/demo-slides.svelte +330 -306
  254. package/src/slides/demo.svelte +164 -160
  255. package/src/slides/export/capture.ts +20 -16
  256. package/src/slides/export/ffmpeg.ts +43 -38
  257. package/src/slides/export/index.ts +5 -5
  258. package/src/slides/export/launch.ts +3 -1
  259. package/src/slides/export/pdf.ts +30 -27
  260. package/src/slides/export/types.ts +10 -8
  261. package/src/slides/index.ts +11 -11
  262. package/src/slides/labels.ts +22 -19
  263. package/src/slides/layout.ts +9 -2
  264. package/src/slides/model.ts +4 -4
  265. package/src/slides/navigation.ts +43 -31
  266. package/src/slides/theme.css +5 -7
  267. package/src/slides/types.ts +9 -10
  268. package/src/status/README.md +18 -0
  269. package/src/status/define-statuses.ts +25 -0
  270. package/src/status/index.ts +11 -0
  271. package/src/{tasks → status}/status-badge.svelte +3 -1
  272. package/src/{tasks → status}/status-dot.svelte +1 -3
  273. package/src/{tasks → status}/status-icon.svelte +1 -1
  274. package/src/status/status-types.ts +40 -0
  275. package/src/tasks/README.md +1 -1
  276. package/src/tasks/board-order.ts +2 -4
  277. package/src/tasks/demo.svelte +192 -34
  278. package/src/tasks/detail/detail-demo.svelte +75 -15
  279. package/src/tasks/detail/detail-types.ts +45 -45
  280. package/src/tasks/detail/task-detail.svelte +40 -10
  281. package/src/tasks/detail/task-property.svelte +8 -2
  282. package/src/tasks/detail/task-thread.svelte +53 -12
  283. package/src/tasks/gantt/gantt-bar.svelte +17 -6
  284. package/src/tasks/gantt/gantt-grid.svelte +40 -9
  285. package/src/tasks/gantt/gantt-group-row.svelte +8 -2
  286. package/src/tasks/gantt/gantt-header.svelte +9 -3
  287. package/src/tasks/gantt/gantt-task-row.svelte +26 -6
  288. package/src/tasks/gantt/gantt.css +2 -1
  289. package/src/tasks/gantt/gantt.test.ts +4 -2
  290. package/src/tasks/gantt/logic.test.ts +110 -20
  291. package/src/tasks/gantt/logic.ts +42 -6
  292. package/src/tasks/inbox/inbox-card.svelte +15 -7
  293. package/src/tasks/inbox/inbox-draft.svelte +1 -1
  294. package/src/tasks/inbox/inbox-logic.ts +6 -40
  295. package/src/tasks/inbox/inbox-statuses.ts +24 -24
  296. package/src/tasks/inbox/inbox-trace.svelte +9 -3
  297. package/src/tasks/inbox/inbox-types.ts +54 -58
  298. package/src/tasks/inbox/index.ts +22 -21
  299. package/src/tasks/index.ts +52 -53
  300. package/src/tasks/kanban-board.svelte +16 -12
  301. package/src/tasks/kanban-types.ts +2 -3
  302. package/src/tasks/presets/sales.ts +7 -7
  303. package/src/tasks/task-gantt.svelte +28 -8
  304. package/src/tasks/task-list.svelte +41 -17
  305. package/src/tasks/time/duration.ts +40 -40
  306. package/src/tasks/time/time-chip.svelte +9 -2
  307. package/src/tasks/time/time-dot.svelte +1 -1
  308. package/src/tasks/time/time-ring.svelte +11 -3
  309. package/src/tasks/time/time-tracker.svelte +57 -15
  310. package/src/tasks/time/time-types.ts +57 -57
  311. package/src/tasks/use-kanban-dnd.svelte.ts +2 -3
  312. package/src/thread/README.md +31 -0
  313. package/src/thread/index.ts +12 -0
  314. package/src/thread/logic.ts +61 -0
  315. package/src/thread/thread.svelte +432 -0
  316. package/src/thread/thread.test.ts +73 -0
  317. package/src/thread/types.ts +93 -0
  318. package/src/tokens/craft.css +17 -53
  319. package/src/tokens/index.css +3 -13
  320. package/src/tokens/palette.css +13 -11
  321. package/src/tokens/primitives.css +10 -23
  322. package/src/components/list-page/section-label.svelte +0 -39
  323. package/src/tasks/define-statuses.ts +0 -32
  324. package/src/tasks/inbox/inbox.svelte +0 -203
  325. package/src/tasks/record/demo-data.ts +0 -286
  326. package/src/tasks/record/field-section.svelte +0 -53
  327. package/src/tasks/record/fields.ts +0 -142
  328. package/src/tasks/record/format.ts +0 -87
  329. package/src/tasks/record/kinds.ts +0 -42
  330. package/src/tasks/record/logic.ts +0 -324
  331. package/src/tasks/record/next-up.svelte +0 -70
  332. package/src/tasks/record/record-stats.svelte +0 -48
  333. package/src/tasks/record/record-timeline.svelte +0 -231
  334. package/src/tasks/record/record.test.ts +0 -350
  335. package/src/tasks/record/types.ts +0 -280
  336. package/src/tasks/record/where-we-are.svelte +0 -121
  337. package/src/tasks/side-panel.svelte +0 -193
  338. package/src/tasks/status-types.ts +0 -40
  339. /package/src/components/{list-page → toolbar}/toolbar-trigger.ts +0 -0
  340. /package/src/{tasks → panel}/side-panel-types.ts +0 -0
  341. /package/src/{tasks/record → record}/gutter.ts +0 -0
@@ -15,94 +15,90 @@ export type InboxOutcome = "approve" | "decline" | "clarify";
15
15
 
16
16
  /** An editable email, filled in from a template by the agent. */
17
17
  export type InboxDraft = {
18
- /** The template it came from. Comes back in the verdict so the host knows which one was sent. */
19
- templateId: string;
20
- /** The button's word: "Pre-qualify", "Decline", "Clarify". */
21
- label: string;
22
- subject: string;
23
- body: string;
24
- outcome?: InboxOutcome;
18
+ /** The template it came from. Comes back in the verdict so the host knows which one was sent. */
19
+ templateId: string;
20
+ /** The button's word: "Pre-qualify", "Decline", "Clarify". */
21
+ label: string;
22
+ subject: string;
23
+ body: string;
24
+ outcome?: InboxOutcome;
25
25
  };
26
26
 
27
27
  /** What the agent wants to do, in one line, with the drafts it prepared. */
28
28
  export type InboxProposal = {
29
- summary: string;
30
- detail?: string;
31
- drafts?: InboxDraft[];
32
- /** The draft to open on. Defaults to the first. */
33
- recommended?: string;
29
+ summary: string;
30
+ detail?: string;
31
+ drafts?: InboxDraft[];
32
+ /** The draft to open on. Defaults to the first. */
33
+ recommended?: string;
34
34
  };
35
35
 
36
36
  /** A short quote the agent read. */
37
37
  export type InboxEvidence = {
38
- quote: string;
39
- /** Who said it, or where it sat: "Priya", "line 14". */
40
- by?: string;
41
- /** A position in the source, such as "12:41" in a call. */
42
- at?: string;
38
+ quote: string;
39
+ /** Who said it, or where it sat: "Priya", "line 14". */
40
+ by?: string;
41
+ /** A position in the source, such as "12:41" in a call. */
42
+ at?: string;
43
43
  };
44
44
 
45
45
  /** Where an item came from and what the agent made of it. Every verdict is traceable to this. */
46
46
  export type InboxTrace = {
47
- source: {
48
- type: InboxSourceType;
49
- label: string;
50
- /** Display time, formatted by the host so server and browser agree. */
51
- at: string;
52
- href?: string;
53
- };
54
- evidence: InboxEvidence[];
55
- reasoning: string;
47
+ source: {
48
+ type: InboxSourceType;
49
+ label: string;
50
+ /** Display time, formatted by the host so server and browser agree. */
51
+ at: string;
52
+ href?: string;
53
+ };
54
+ evidence: InboxEvidence[];
55
+ reasoning: string;
56
56
  };
57
57
 
58
58
  export type InboxConfidence = {
59
- /** 0 to 1. */
60
- score: number;
61
- /** What the agent couldn't tell. Shown when the agent is unsure. */
62
- missing?: string;
59
+ /** 0 to 1. */
60
+ score: number;
61
+ /** What the agent couldn't tell. Shown when the agent is unsure. */
62
+ missing?: string;
63
63
  };
64
64
 
65
65
  export type InboxProject = {
66
- id: string;
67
- name: string;
68
- client?: string;
69
- /** The project timeline. Decided items link here. */
70
- href?: string;
66
+ id: string;
67
+ name: string;
68
+ client?: string;
69
+ /** The project timeline. Decided items link here. */
70
+ href?: string;
71
71
  };
72
72
 
73
73
  export type InboxAgent = {
74
- name: string;
75
- shape?: AgentShape;
76
- color?: string;
74
+ name: string;
75
+ shape?: AgentShape;
76
+ color?: string;
77
77
  };
78
78
 
79
79
  export type InboxItem = {
80
- id: string;
81
- kind: InboxKind;
82
- tier: InboxTier;
83
- state: InboxState;
84
- title: string;
85
- project: InboxProject;
86
- proposal: InboxProposal;
87
- confidence: InboxConfidence;
88
- trace: InboxTrace;
89
- agent?: InboxAgent;
90
- /** The last steer note, shown while the agent re-runs. */
91
- steer?: string;
80
+ id: string;
81
+ kind: InboxKind;
82
+ tier: InboxTier;
83
+ state: InboxState;
84
+ title: string;
85
+ project: InboxProject;
86
+ proposal: InboxProposal;
87
+ confidence: InboxConfidence;
88
+ trace: InboxTrace;
89
+ agent?: InboxAgent;
90
+ /** The last steer note, shown while the agent re-runs. */
91
+ steer?: string;
92
92
  };
93
93
 
94
94
  /** The draft as the person left it, after editing. */
95
95
  export type InboxDraftEdit = Pick<InboxDraft, "templateId" | "subject" | "body">;
96
96
 
97
97
  export type InboxVerdict =
98
- | { type: "approve"; id: string; draft?: InboxDraftEdit }
99
- | { type: "decline"; id: string; draft?: InboxDraftEdit }
100
- | { type: "steer"; id: string; note: string }
101
- | { type: "undo"; id: string };
102
-
103
- export type InboxLane = "needs" | "auto" | "decided";
104
-
105
- export type InboxKindFilter = "all" | InboxKind;
98
+ | { type: "approve"; id: string; draft?: InboxDraftEdit }
99
+ | { type: "decline"; id: string; draft?: InboxDraftEdit }
100
+ | { type: "steer"; id: string; note: string }
101
+ | { type: "undo"; id: string };
106
102
 
107
103
  /** What the person typed into the drafts, by template id. */
108
104
  export type InboxDraftEdits = Record<string, { subject: string; body: string }>;
@@ -1,23 +1,24 @@
1
- export { default as Inbox } from "./inbox.svelte";
2
- export { confidenceLevel, inboxConfidence, inboxKinds, inboxStates } from "./inbox-statuses.js";
3
- export { flatten, groupByProject, inLane, laneOf } from "./inbox-logic.js";
1
+ export {
2
+ confidenceLevel,
3
+ inboxConfidence,
4
+ inboxKinds,
5
+ inboxStates,
6
+ } from "./inbox-statuses.js";
4
7
  export type {
5
- InboxAgent,
6
- InboxConfidence,
7
- InboxDraft,
8
- InboxDraftEdit,
9
- InboxDraftEdits,
10
- InboxEvidence,
11
- InboxItem,
12
- InboxKind,
13
- InboxKindFilter,
14
- InboxLane,
15
- InboxOutcome,
16
- InboxProject,
17
- InboxProposal,
18
- InboxSourceType,
19
- InboxState,
20
- InboxTier,
21
- InboxTrace,
22
- InboxVerdict,
8
+ InboxAgent,
9
+ InboxConfidence,
10
+ InboxDraft,
11
+ InboxDraftEdit,
12
+ InboxDraftEdits,
13
+ InboxEvidence,
14
+ InboxItem,
15
+ InboxKind,
16
+ InboxOutcome,
17
+ InboxProject,
18
+ InboxProposal,
19
+ InboxSourceType,
20
+ InboxState,
21
+ InboxTier,
22
+ InboxTrace,
23
+ InboxVerdict,
23
24
  } from "./inbox-types.js";
@@ -6,34 +6,31 @@ export { boardOrderAt, keyBetween } from "./board-order.js";
6
6
  export { reorderByIds } from "./reorder.js";
7
7
  export type { KanbanDndConfig, KanbanDragOver } from "./use-kanban-dnd.svelte.js";
8
8
  export type {
9
- KanbanCardContext,
10
- KanbanCardSnippet,
11
- KanbanColumn as KanbanColumnDef,
12
- KanbanColumnContext,
13
- KanbanMove,
14
- KanbanSortKey,
9
+ KanbanCardContext,
10
+ KanbanCardSnippet,
11
+ KanbanColumn as KanbanColumnDef,
12
+ KanbanColumnContext,
13
+ KanbanMove,
14
+ KanbanSortKey,
15
15
  } from "./kanban-types.js";
16
- export { default as StatusBadge } from "./status-badge.svelte";
17
- export { default as StatusDot } from "./status-dot.svelte";
18
- export { default as StatusIcon } from "./status-icon.svelte";
19
- export { defineStatuses } from "./define-statuses.js";
16
+ export { StatusBadge, StatusDot, StatusIcon, defineStatuses } from "../status/index.js";
20
17
  export type {
21
- StatusDef,
22
- StatusDotVariant,
23
- StatusId,
24
- StatusMap,
25
- Statuses,
26
- } from "./status-types.js";
27
- export { default as SidePanel } from "./side-panel.svelte";
28
- export type { PanelStat, SidePanelWidth } from "./side-panel-types.js";
18
+ StatusDef,
19
+ StatusDotVariant,
20
+ StatusId,
21
+ StatusMap,
22
+ Statuses,
23
+ } from "../status/index.js";
24
+ export { SidePanel } from "../panel/index.js";
25
+ export type { PanelStat, SidePanelWidth } from "../panel/index.js";
29
26
  export { default as TaskList } from "./task-list.svelte";
30
27
  export { default as TaskGantt } from "./task-gantt.svelte";
31
28
  export { addDays, dayNumber, isoFromDay, todayIso } from "./dates.js";
32
29
  export type {
33
- GanttChange,
34
- GanttLabelContext,
35
- TaskListGroupContext,
36
- TaskListRowContext,
30
+ GanttChange,
31
+ GanttLabelContext,
32
+ TaskListGroupContext,
33
+ TaskListRowContext,
37
34
  } from "./task-types.js";
38
35
  export { default as TaskDetail } from "./detail/task-detail.svelte";
39
36
  export { default as TaskThread } from "./detail/task-thread.svelte";
@@ -46,40 +43,42 @@ export { default as TimeChip } from "./time/time-chip.svelte";
46
43
  export { default as TimeRing } from "./time/time-ring.svelte";
47
44
  export { default as TimeDot } from "./time/time-dot.svelte";
48
45
  export {
49
- budgetTone,
50
- dayLabel,
51
- formatClock,
52
- formatMinutes,
53
- localDay,
54
- parseMinutes,
55
- personColor,
46
+ budgetTone,
47
+ dayLabel,
48
+ formatClock,
49
+ formatMinutes,
50
+ localDay,
51
+ parseMinutes,
52
+ personColor,
56
53
  } from "./time/duration.js";
57
54
  export {
58
- Inbox,
59
- confidenceLevel,
60
- inboxConfidence,
61
- inboxKinds,
62
- inboxStates,
55
+ confidenceLevel,
56
+ inboxConfidence,
57
+ inboxKinds,
58
+ inboxStates,
63
59
  } from "./inbox/index.js";
64
60
  export type {
65
- InboxAgent,
66
- InboxConfidence,
67
- InboxDraft,
68
- InboxDraftEdit,
69
- InboxDraftEdits,
70
- InboxEvidence,
71
- InboxItem,
72
- InboxKind,
73
- InboxKindFilter,
74
- InboxLane,
75
- InboxOutcome,
76
- InboxProject,
77
- InboxProposal,
78
- InboxSourceType,
79
- InboxState,
80
- InboxTier,
81
- InboxTrace,
82
- InboxVerdict,
61
+ InboxAgent,
62
+ InboxConfidence,
63
+ InboxDraft,
64
+ InboxDraftEdit,
65
+ InboxDraftEdits,
66
+ InboxEvidence,
67
+ InboxItem,
68
+ InboxKind,
69
+ InboxOutcome,
70
+ InboxProject,
71
+ InboxProposal,
72
+ InboxSourceType,
73
+ InboxState,
74
+ InboxTier,
75
+ InboxTrace,
76
+ InboxVerdict,
83
77
  } from "./inbox/index.js";
84
78
  export { DEFAULT_TIME_LABELS } from "./time/time-types.js";
85
- export type { TimeLabels, TimeLogInput, TimeRunning, TimeStopInfo } from "./time/time-types.js";
79
+ export type {
80
+ TimeLabels,
81
+ TimeLogInput,
82
+ TimeRunning,
83
+ TimeStopInfo,
84
+ } from "./time/time-types.js";
@@ -42,8 +42,8 @@
42
42
  /** Rendered under a column's cards, e.g. a "Show all 12" or an add button. */
43
43
  columnFooter?: Snippet<[C, KanbanColumnContext]>;
44
44
  /**
45
- * Wraps a whole column, for a context menu or a tooltip around it. Render `column` once and
46
- * spread the `props` it hands you, so the wrapper's trigger lands on the column.
45
+ * Wraps a column for a context menu or tooltip: render `column` once and spread the
46
+ * `props` it hands you, so the trigger lands on the column.
47
47
  */
48
48
  wrapColumn?: Snippet<[C, Snippet<[Record<string, unknown>]>]>;
49
49
  /** Enter or Space on a focused card. Leave out when the card holds its own links and buttons. */
@@ -52,8 +52,8 @@
52
52
  getLabel?: (item: T) => string;
53
53
  emptyLabel?: string;
54
54
  /**
55
- * Cards a column shows before the rest fold behind a footer. Return undefined for no cap.
56
- * A capped column's empty space drops on top, since the tail is out of sight.
55
+ * Cards a column shows before the rest fold behind a footer, or undefined for no cap; a
56
+ * capped column drops on top, since its tail is out of sight.
57
57
  */
58
58
  limit?: (columnId: string) => number | undefined;
59
59
  /** Column ids whose `limit` is lifted. Controlled; leave out to let the board remember. */
@@ -158,7 +158,7 @@
158
158
  }
159
159
 
160
160
  function canDrop(columnId: string): boolean {
161
- return isDroppable?.(columnId) ?? (columns.find((c) => c.id === columnId)?.droppable ?? true);
161
+ return isDroppable?.(columnId) ?? columns.find((c) => c.id === columnId)?.droppable ?? true;
162
162
  }
163
163
 
164
164
  function expand(columnId: string): void {
@@ -216,9 +216,8 @@
216
216
  });
217
217
 
218
218
  /**
219
- * Keyboard move: Alt + ArrowLeft/Right drops the focused card in the
220
- * adjacent droppable column. Native drag stays the primary path; this
221
- * covers keyboard and touch-reader users with the same onMove contract.
219
+ * Alt + ArrowLeft/Right moves the focused card to the next droppable column, so
220
+ * keyboard and screen-reader users get drag's onMove contract.
222
221
  */
223
222
  function onCardKeyDown(e: KeyboardEvent, id: string): void {
224
223
  if (onSelect && e.target === e.currentTarget && (e.key === "Enter" || e.key === " ")) {
@@ -373,7 +372,8 @@
373
372
  <div
374
373
  role="listitem"
375
374
  tabindex="0"
376
- aria-label={getLabel?.(item) ?? "Card. Press Alt plus Left or Right arrow to move between columns."}
375
+ aria-label={getLabel?.(item) ??
376
+ "Card. Press Alt plus Left or Right arrow to move between columns."}
377
377
  aria-keyshortcuts="Alt+ArrowLeft Alt+ArrowRight"
378
378
  draggable="true"
379
379
  ondragstart={(e) => {
@@ -465,8 +465,10 @@
465
465
  "kanban-rail-item rounded-md transition-[background-color,outline-color] duration-[var(--duration-quick,120ms)] ease-[var(--ease-smooth-out,ease-out)]",
466
466
  leaving.has(column.id) && "kanban-rail-item-leaving",
467
467
  )}
468
- style:background="color-mix(in oklch, {hue} {over ? 10 : 0}%, transparent)"
469
- style:outline="1px solid color-mix(in oklch, {hue} {over ? 28 : 0}%, transparent)"
468
+ style:background="color-mix(in oklch, {hue}
469
+ {over ? 10 : 0}%, transparent)"
470
+ style:outline="1px solid color-mix(in oklch, {hue}
471
+ {over ? 28 : 0}%, transparent)"
470
472
  ondragover={(e) => onHiddenDragOver(e, column.id)}
471
473
  ondragleave={onHiddenDragLeave}
472
474
  ondrop={(e) => onHiddenDrop(e, column.id)}
@@ -481,7 +483,9 @@
481
483
  {:else}
482
484
  <span class="truncate whitespace-nowrap">{column.label}</span>
483
485
  {#if count > 0}
484
- <span class="ms-auto text-xs text-muted-foreground/60 tabular-nums">{count}</span>
486
+ <span class="ms-auto text-xs text-muted-foreground/60 tabular-nums"
487
+ >{count}</span
488
+ >
485
489
  {/if}
486
490
  {/if}
487
491
  </button>
@@ -24,9 +24,8 @@ export type KanbanMove = {
24
24
  */
25
25
  boardOrder?: string;
26
26
  /**
27
- * The cards that sit above and below the drop slot once the dragged card is
28
- * set aside. Set on manual drops only, null at an end. For a backend that
29
- * orders by neighbour instead of by key.
27
+ * The drop slot's neighbours, for a backend that orders by neighbour, not by
28
+ * key. Set on manual drops only, null at an end.
30
29
  */
31
30
  beforeId?: string | null;
32
31
  afterId?: string | null;
@@ -1,16 +1,16 @@
1
- import { defineStatuses } from "../define-statuses.js";
1
+ import { defineStatuses } from "../../status/define-statuses.js";
2
2
 
3
3
  /**
4
4
  * An example status map for a sales pipeline. Names are neutral on purpose:
5
5
  * swap the keys and labels for your own domain.
6
6
  */
7
7
  export const salesStatuses = defineStatuses({
8
- new: { label: "New", tone: "accent", variant: "open" },
9
- contacted: { label: "Contacted", tone: "info", variant: "open" },
10
- proposal: { label: "Proposal", tone: "accent", variant: "progress", progress: 0.25 },
11
- negotiation: { label: "Negotiation", tone: "warning", variant: "progress", progress: 0.75 },
12
- won: { label: "Won", tone: "success", variant: "completed" },
13
- lost: { label: "Lost", tone: "destructive", variant: "lost" },
8
+ new: { label: "New", tone: "accent", variant: "open" },
9
+ contacted: { label: "Contacted", tone: "info", variant: "open" },
10
+ proposal: { label: "Proposal", tone: "accent", variant: "progress", progress: 0.25 },
11
+ negotiation: { label: "Negotiation", tone: "warning", variant: "progress", progress: 0.75 },
12
+ won: { label: "Won", tone: "success", variant: "completed" },
13
+ lost: { label: "Lost", tone: "destructive", variant: "lost" },
14
14
  });
15
15
 
16
16
  export type SalesStatus = (typeof salesStatuses.ids)[number];
@@ -33,8 +33,8 @@
33
33
  /** ISO date, inclusive. See `getStart`. */
34
34
  getEnd: (item: T) => string | null | undefined;
35
35
  /**
36
- * The id of the task this one sits under. Children nest under their parent, indented
37
- * and foldable. A parent with no dates of its own draws the span of what is below it.
36
+ * The parent task's id; a parent with no dates of its own draws the span of the
37
+ * children nested under it.
38
38
  */
39
39
  getParent?: (item: T) => string | null | undefined;
40
40
  /** Draws a flag at the end date instead of a bar. Milestones are not draggable. */
@@ -133,10 +133,16 @@
133
133
  });
134
134
 
135
135
  let days = $derived(buildDays(range.first, dayCount));
136
- let monthFormat = $derived(new Intl.DateTimeFormat(locale, { month: "long", year: "numeric", timeZone: "UTC" }));
137
- let dayFormat = $derived(new Intl.DateTimeFormat(locale, { month: "short", day: "numeric", timeZone: "UTC" }));
136
+ let monthFormat = $derived(
137
+ new Intl.DateTimeFormat(locale, { month: "long", year: "numeric", timeZone: "UTC" }),
138
+ );
139
+ let dayFormat = $derived(
140
+ new Intl.DateTimeFormat(locale, { month: "short", day: "numeric", timeZone: "UTC" }),
141
+ );
138
142
  let months = $derived(buildMonths(days, monthFormat));
139
- let rows = $derived(buildRows(items, { getId, getStart, getEnd, getParent, groups, getGroup, folded, drag }));
143
+ let rows = $derived(
144
+ buildRows(items, { getId, getStart, getEnd, getParent, groups, getGroup, folded, drag }),
145
+ );
140
146
  let arrows = $derived(getDependsOn ? buildArrows(rows, layout, getDependsOn) : []);
141
147
  let groupHue = $derived(new Map((groups ?? []).map((g) => [g.id, g.hue])));
142
148
 
@@ -148,7 +154,11 @@
148
154
  }
149
155
 
150
156
  function hueOf(item: T): string {
151
- return getHue?.(item) ?? (getGroup ? groupHue.get(getGroup(item)) : undefined) ?? "var(--color-primary)";
157
+ return (
158
+ getHue?.(item) ??
159
+ (getGroup ? groupHue.get(getGroup(item)) : undefined) ??
160
+ "var(--color-primary)"
161
+ );
152
162
  }
153
163
 
154
164
  function hover(id: string, on: boolean): void {
@@ -172,7 +182,10 @@
172
182
  export function scrollToToday(): void {
173
183
  if (!scroller) return;
174
184
  const label = corner?.offsetWidth ?? 0;
175
- scroller.scrollTo({ left: Math.max(0, dayX(layout, todayDay) - (scroller.clientWidth - label) / 3), behavior: "smooth" });
185
+ scroller.scrollTo({
186
+ left: Math.max(0, dayX(layout, todayDay) - (scroller.clientWidth - label) / 3),
187
+ behavior: "smooth",
188
+ });
176
189
  }
177
190
  </script>
178
191
 
@@ -192,7 +205,14 @@
192
205
  <GanttHeader {layout} {days} {months} {labelHeading} {locale} bind:corner />
193
206
 
194
207
  <div class="relative">
195
- <GanttGrid {layout} {days} {arrows} rowCount={rows.length} {hoveredId} draggingId={drag?.id ?? null} />
208
+ <GanttGrid
209
+ {layout}
210
+ {days}
211
+ {arrows}
212
+ rowCount={rows.length}
213
+ {hoveredId}
214
+ draggingId={drag?.id ?? null}
215
+ />
196
216
 
197
217
  <div role="list" aria-label="Timeline">
198
218
  {#each rows as row, index (row.kind === "group" ? `g:${row.group.id}` : row.id)}
@@ -7,7 +7,11 @@
7
7
  import { cn } from "../lib/utils.js";
8
8
  import { createKanbanDnd } from "./use-kanban-dnd.svelte.js";
9
9
  import { CaretRight } from "phosphor-svelte";
10
- import type { KanbanColumn as KanbanColumnDef, KanbanMove, KanbanSortKey } from "./kanban-types.js";
10
+ import type {
11
+ KanbanColumn as KanbanColumnDef,
12
+ KanbanMove,
13
+ KanbanSortKey,
14
+ } from "./kanban-types.js";
11
15
  import type { TaskListGroupContext, TaskListRowContext } from "./task-types.js";
12
16
 
13
17
  interface Props<T, C extends KanbanColumnDef> {
@@ -18,8 +22,8 @@
18
22
  /** The group id a row belongs to. */
19
23
  getGroup: (item: T) => string;
20
24
  /**
21
- * Nests a group under another by its id, e.g. a project under its client. A child draws
22
- * inside its parent's section, indented, and folds with it. Return nothing for a top-level group.
25
+ * Nests a group under another by its id, e.g. a project under its client, so it folds with
26
+ * its parent. Return nothing for a top-level group.
23
27
  */
24
28
  getParent?: (group: C) => string | null | undefined;
25
29
  /** Called on drop with what to persist. Same contract as the board. */
@@ -36,8 +40,8 @@
36
40
  /** Breaks a tie in manual order: two rows with the same key, or both without one. */
37
41
  manualTiebreak?: (a: T, b: T) => number;
38
42
  /**
39
- * Rows are draggable and take Alt plus Up or Down. Turn it off for a list that only groups,
40
- * where rows hold their own links and buttons and a drop makes no sense.
43
+ * Rows drag and take Alt plus Up or Down. Turn it off for a list that only groups, where
44
+ * rows hold their own links and buttons.
41
45
  */
42
46
  draggable?: boolean;
43
47
  /** The screen-reader name of a row. Defaults to a hint about the keyboard move. */
@@ -115,7 +119,7 @@
115
119
  groups.filter((g) => {
116
120
  const parent = getParent?.(g);
117
121
  return !parent || !groupIds.has(parent);
118
- })
122
+ }),
119
123
  );
120
124
  let childrenOf = $derived.by(() => {
121
125
  const map = new Map<string, C[]>();
@@ -137,7 +141,7 @@
137
141
  function canDrop(groupId: string): boolean {
138
142
  // A group that only holds other groups has no rows of its own to drop into.
139
143
  if (childrenOf.has(groupId)) return false;
140
- return isDroppable?.(groupId) ?? (groups.find((g) => g.id === groupId)?.droppable ?? true);
144
+ return isDroppable?.(groupId) ?? groups.find((g) => g.id === groupId)?.droppable ?? true;
141
145
  }
142
146
 
143
147
  function idAt(list: T[], index: number): string | null {
@@ -194,7 +198,6 @@
194
198
  return;
195
199
  }
196
200
  }
197
-
198
201
  </script>
199
202
 
200
203
  {#snippet section(group: C, depth: number)}
@@ -207,7 +210,10 @@
207
210
  {@const context = { count, active, open, depth, hasChildren: children.length > 0 }}
208
211
  <section
209
212
  aria-label={group.ariaLabel ?? group.label}
210
- class={cn("tl-group group/tl", depth === 0 ? "border-b border-border last:border-b-0" : "border-t border-border/60")}
213
+ class={cn(
214
+ "tl-group group/tl",
215
+ depth === 0 ? "border-b border-border last:border-b-0" : "border-t border-border/60",
216
+ )}
211
217
  class:tl-group-active={active}
212
218
  style:--tl-hue={hue}
213
219
  ondragover={children.length ? undefined : (e) => dnd.onColumnDragOver(e, group.id)}
@@ -215,7 +221,11 @@
215
221
  ondrop={children.length ? undefined : (e) => dnd.onDrop(e, group.id)}
216
222
  >
217
223
  <div
218
- class={cn("sticky z-10 flex h-10 items-center gap-2 px-3 backdrop-blur-sm", flat ? "bg-background/90" : "bg-card/90", depth === 0 && (head ? "top-9" : "top-0"))}
224
+ class={cn(
225
+ "sticky z-10 flex h-10 items-center gap-2 px-3 backdrop-blur-sm",
226
+ flat ? "bg-background/90" : "bg-card/90",
227
+ depth === 0 && (head ? "top-9" : "top-0"),
228
+ )}
219
229
  style:top={depth > 0 ? `${(head ? 2.25 : 0) + depth * 2.5}rem` : undefined}
220
230
  style:padding-inline-start={depth > 0 ? `${0.75 + depth * 1.25}rem` : undefined}
221
231
  >
@@ -227,7 +237,11 @@
227
237
  onclick={() => toggle(group.id)}
228
238
  class="-ml-1 grid size-6 place-items-center rounded-md text-muted-foreground outline-none transition-colors duration-[var(--duration-quick,150ms)] hover:bg-foreground/5 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring/60"
229
239
  >
230
- <span class="tl-chevron size-3.5 [&>svg]:size-full" class:tl-chevron-open={open} aria-hidden="true">
240
+ <span
241
+ class="tl-chevron size-3.5 [&>svg]:size-full"
242
+ class:tl-chevron-open={open}
243
+ aria-hidden="true"
244
+ >
231
245
  <CaretRight weight="bold" />
232
246
  </span>
233
247
  </button>
@@ -267,7 +281,9 @@
267
281
  role="listitem"
268
282
  tabindex={draggable ? 0 : undefined}
269
283
  aria-label={getLabel?.(item) ??
270
- (draggable ? "Row. Press Alt plus Up or Down arrow to move between groups." : undefined)}
284
+ (draggable
285
+ ? "Row. Press Alt plus Up or Down arrow to move between groups."
286
+ : undefined)}
271
287
  aria-keyshortcuts={draggable ? "Alt+ArrowUp Alt+ArrowDown" : undefined}
272
288
  draggable={draggable ? "true" : undefined}
273
289
  animate:flip={{ duration: 250, easing: cubicOut }}
@@ -303,7 +319,9 @@
303
319
  {/if}
304
320
 
305
321
  {#if rows.length === 0 && children.length === 0 && !active}
306
- <p class="mx-1.5 rounded-lg border border-dashed border-border px-3 py-3 text-xs text-muted-foreground">
322
+ <p
323
+ class="mx-1.5 rounded-lg border border-dashed border-border px-3 py-3 text-xs text-muted-foreground"
324
+ >
307
325
  {emptyLabel}
308
326
  </p>
309
327
  {/if}
@@ -326,7 +344,10 @@
326
344
  >
327
345
  {#if head}
328
346
  <div
329
- class={cn("sticky top-0 z-20 flex h-9 shrink-0 items-center border-b border-border text-xs font-medium text-muted-foreground backdrop-blur-sm", flat ? "bg-background/90" : "bg-card/90")}
347
+ class={cn(
348
+ "sticky top-0 z-20 flex h-9 shrink-0 items-center border-b border-border text-xs font-medium text-muted-foreground backdrop-blur-sm",
349
+ flat ? "bg-background/90" : "bg-card/90",
350
+ )}
330
351
  >
331
352
  {@render head()}
332
353
  </div>
@@ -357,7 +378,8 @@
357
378
  }
358
379
 
359
380
  .tl-chevron {
360
- transition: rotate var(--duration-fast, 250ms) var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
381
+ transition: rotate var(--duration-fast, 250ms)
382
+ var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
361
383
  }
362
384
 
363
385
  .tl-chevron-open {
@@ -370,7 +392,8 @@
370
392
  grid-template-rows: 0fr;
371
393
  opacity: 0;
372
394
  transition:
373
- grid-template-rows var(--duration-fast, 250ms) var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)),
395
+ grid-template-rows var(--duration-fast, 250ms)
396
+ var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)),
374
397
  opacity var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out);
375
398
  }
376
399
 
@@ -385,7 +408,8 @@
385
408
  }
386
409
 
387
410
  .tl-row {
388
- animation: tl-row-in var(--duration-slow, 400ms) var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
411
+ animation: tl-row-in var(--duration-slow, 400ms)
412
+ var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
389
413
  animation-delay: calc(var(--tl-i, 0) * var(--duration-stagger, 40ms));
390
414
  transition: background-color var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out);
391
415
  }