@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
@@ -2,7 +2,11 @@
2
2
  import type { Snippet } from "svelte";
3
3
  import { Circle, CheckCircle, PencilSimple } from "phosphor-svelte";
4
4
  import { cn } from "../../lib/utils.js";
5
- import { DEFAULT_TASK_DETAIL_LABELS, type TaskComment, type TaskDetailLabels } from "./detail-types.js";
5
+ import {
6
+ DEFAULT_TASK_DETAIL_LABELS,
7
+ type TaskComment,
8
+ type TaskDetailLabels,
9
+ } from "./detail-types.js";
6
10
  import TaskThread from "./task-thread.svelte";
7
11
 
8
12
  interface Props {
@@ -119,7 +123,10 @@
119
123
  onclick={onToggleDone}
120
124
  disabled={!onToggleDone}
121
125
  aria-label={done ? labels.markIncomplete : labels.markComplete}
122
- class={cn("tk-icon mt-px", done ? "text-success" : "text-muted-foreground/60 hover:text-foreground")}
126
+ class={cn(
127
+ "tk-icon mt-px",
128
+ done ? "text-success" : "text-muted-foreground/60 hover:text-foreground",
129
+ )}
123
130
  >
124
131
  {#if done}
125
132
  <CheckCircle class="size-5" weight="fill" aria-hidden="true" />
@@ -139,7 +146,9 @@
139
146
  class="-mx-2 -my-1 min-w-0 flex-1 resize-none rounded-md border border-input bg-transparent px-2 py-1 text-2xl leading-tight font-semibold tracking-tight outline-none focus-visible:ring-3 focus-visible:ring-ring/50"
140
147
  ></textarea>
141
148
  {:else}
142
- <h1 class="min-w-0 flex-1 text-2xl leading-tight font-semibold tracking-tight text-balance break-words">
149
+ <h1
150
+ class="min-w-0 flex-1 text-2xl leading-tight font-semibold tracking-tight text-balance break-words"
151
+ >
143
152
  <button
144
153
  type="button"
145
154
  onclick={startTitle}
@@ -153,14 +162,19 @@
153
162
  >
154
163
  {title}
155
164
  {#if onTitleChange}
156
- <PencilSimple class="ms-1.5 inline size-3.5 align-middle text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100" aria-hidden="true" />
165
+ <PencilSimple
166
+ class="ms-1.5 inline size-3.5 align-middle text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100"
167
+ aria-hidden="true"
168
+ />
157
169
  {/if}
158
170
  </button>
159
171
  </h1>
160
172
  {/if}
161
173
  </div>
162
174
  {#if meta}
163
- <div class="mt-2 flex min-h-5 flex-wrap items-center gap-x-3 gap-y-1 ps-9 text-xs text-muted-foreground">
175
+ <div
176
+ class="mt-2 flex min-h-5 flex-wrap items-center gap-x-3 gap-y-1 ps-9 text-xs text-muted-foreground"
177
+ >
164
178
  {@render meta()}
165
179
  </div>
166
180
  {/if}
@@ -171,10 +185,14 @@
171
185
  class="px-4 pt-3 @3xl:col-start-2 @3xl:row-span-2 @3xl:row-start-1 @3xl:border-s @3xl:border-border @3xl:px-5 @3xl:pt-6"
172
186
  aria-label={labels.properties}
173
187
  >
174
- <div class="flex flex-wrap items-center gap-1 @3xl:sticky @3xl:top-0 @3xl:flex-col @3xl:items-stretch @3xl:gap-0.5">
188
+ <div
189
+ class="flex flex-wrap items-center gap-1 @3xl:sticky @3xl:top-0 @3xl:flex-col @3xl:items-stretch @3xl:gap-0.5"
190
+ >
175
191
  {@render properties?.()}
176
192
  {#if railFooter}
177
- <div class="mt-2 hidden w-full border-t border-border/60 pt-3 @3xl:block">{@render railFooter()}</div>
193
+ <div class="mt-2 hidden w-full border-t border-border/60 pt-3 @3xl:block">
194
+ {@render railFooter()}
195
+ </div>
178
196
  {/if}
179
197
  </div>
180
198
  </aside>
@@ -185,7 +203,12 @@
185
203
  <div class="flex h-7 items-center justify-between">
186
204
  <h2 class="text-xs font-medium text-muted-foreground">{labels.description}</h2>
187
205
  {#if !editingDescription && description && onDescriptionChange}
188
- <button type="button" class="tk-icon" onclick={startDescription} aria-label={labels.editDescription}>
206
+ <button
207
+ type="button"
208
+ class="tk-icon"
209
+ onclick={startDescription}
210
+ aria-label={labels.editDescription}
211
+ >
189
212
  <PencilSimple class="size-3.5" aria-hidden="true" />
190
213
  </button>
191
214
  {/if}
@@ -200,8 +223,15 @@
200
223
  class="w-full resize-y rounded-md border border-input bg-transparent px-3 py-2 text-sm leading-relaxed outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50"
201
224
  ></textarea>
202
225
  <div class="mt-1 flex justify-end gap-1.5">
203
- <button type="button" class="tk-button" onclick={() => (editingDescription = false)}>{labels.cancel}</button>
204
- <button type="button" class="tk-button tk-primary" onclick={saveDescription} disabled={savingDescription}>
226
+ <button type="button" class="tk-button" onclick={() => (editingDescription = false)}
227
+ >{labels.cancel}</button
228
+ >
229
+ <button
230
+ type="button"
231
+ class="tk-button tk-primary"
232
+ onclick={saveDescription}
233
+ disabled={savingDescription}
234
+ >
205
235
  {savingDescription ? labels.saving : labels.save}
206
236
  </button>
207
237
  </div>
@@ -11,7 +11,13 @@
11
11
 
12
12
  <!-- A labelled row in the rail. In the narrow chip row the label hides and
13
13
  names the group for assistive tech. -->
14
- <div class="flex min-h-7 items-center @3xl:grid @3xl:grid-cols-[6rem_minmax(0,1fr)]" role="group" aria-label={label}>
15
- <span class="hidden text-xs font-medium text-muted-foreground @3xl:block" aria-hidden="true">{label}</span>
14
+ <div
15
+ class="flex min-h-7 items-center @3xl:grid @3xl:grid-cols-[6rem_minmax(0,1fr)]"
16
+ role="group"
17
+ aria-label={label}
18
+ >
19
+ <span class="hidden text-xs font-medium text-muted-foreground @3xl:block" aria-hidden="true"
20
+ >{label}</span
21
+ >
16
22
  <div class="flex min-w-0 items-center">{@render children()}</div>
17
23
  </div>
@@ -5,7 +5,11 @@
5
5
  import { AgentAvatar } from "../../agents/index.js";
6
6
  import { TONE_CLASS } from "../../lib/tone.js";
7
7
  import { Skeleton } from "../../shadcn/skeleton/index.js";
8
- import { DEFAULT_TASK_DETAIL_LABELS, type TaskComment, type TaskDetailLabels } from "./detail-types.js";
8
+ import {
9
+ DEFAULT_TASK_DETAIL_LABELS,
10
+ type TaskComment,
11
+ type TaskDetailLabels,
12
+ } from "./detail-types.js";
9
13
 
10
14
  interface Props {
11
15
  comments: TaskComment[];
@@ -31,7 +35,8 @@
31
35
  labels: labelOverrides,
32
36
  agentAvatar,
33
37
  avatar,
34
- when = (comment) => new Date(comment.createdAt).toLocaleDateString(undefined, { month: "short", day: "numeric" }),
38
+ when = (comment) =>
39
+ new Date(comment.createdAt).toLocaleDateString(undefined, { month: "short", day: "numeric" }),
35
40
  onSend,
36
41
  onEdit,
37
42
  onDelete,
@@ -100,7 +105,10 @@
100
105
  {#each comments as comment (comment.id)}
101
106
  <li class="group relative flex gap-3">
102
107
  <!-- The rail that ties one avatar to the next, as in an activity feed. -->
103
- <span class="absolute start-[11.5px] top-8 -bottom-3 w-px bg-border group-last:hidden" aria-hidden="true"></span>
108
+ <span
109
+ class="absolute start-[11.5px] top-8 -bottom-3 w-px bg-border group-last:hidden"
110
+ aria-hidden="true"
111
+ ></span>
104
112
  <span class="relative size-6 shrink-0">
105
113
  {#if comment.agent}
106
114
  {#if agentAvatar}
@@ -111,7 +119,10 @@
111
119
  {:else if avatar}
112
120
  {@render avatar(comment)}
113
121
  {:else}
114
- <span class="grid size-6 place-items-center rounded-full bg-muted text-xs font-medium text-muted-foreground" aria-hidden="true">
122
+ <span
123
+ class="grid size-6 place-items-center rounded-full bg-muted text-xs font-medium text-muted-foreground"
124
+ aria-hidden="true"
125
+ >
115
126
  {initial(comment.author)}
116
127
  </span>
117
128
  {/if}
@@ -121,7 +132,12 @@
121
132
  <div class="flex h-6 items-center gap-2">
122
133
  <span class="truncate text-[13px] font-medium">{comment.author}</span>
123
134
  {#if comment.agent}
124
- <span class={cn("inline-flex h-5 items-center rounded-sm border px-1.5 text-xs font-medium", TONE_CLASS.accent)}>
135
+ <span
136
+ class={cn(
137
+ "inline-flex h-5 items-center rounded-sm border px-1.5 text-xs font-medium",
138
+ TONE_CLASS.accent,
139
+ )}
140
+ >
125
141
  {labels.ai}
126
142
  </span>
127
143
  {/if}
@@ -130,14 +146,26 @@
130
146
  <span class="text-xs text-muted-foreground">{labels.commentEdited}</span>
131
147
  {/if}
132
148
  {#if canEdit(comment) && editingId !== comment.id}
133
- <span class="ms-auto flex gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 [@media(hover:none)]:opacity-100">
149
+ <span
150
+ class="ms-auto flex gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 [@media(hover:none)]:opacity-100"
151
+ >
134
152
  {#if onEdit}
135
- <button type="button" class="thread-icon" aria-label={labels.commentEdit} onclick={() => startEdit(comment)}>
153
+ <button
154
+ type="button"
155
+ class="thread-icon"
156
+ aria-label={labels.commentEdit}
157
+ onclick={() => startEdit(comment)}
158
+ >
136
159
  <PencilSimple class="size-3.5" aria-hidden="true" />
137
160
  </button>
138
161
  {/if}
139
162
  {#if onDelete}
140
- <button type="button" class="thread-icon" aria-label={labels.commentDelete} onclick={() => onDelete?.(comment)}>
163
+ <button
164
+ type="button"
165
+ class="thread-icon"
166
+ aria-label={labels.commentDelete}
167
+ onclick={() => onDelete?.(comment)}
168
+ >
141
169
  <Trash class="size-3.5" aria-hidden="true" />
142
170
  </button>
143
171
  {/if}
@@ -153,8 +181,14 @@
153
181
  class="mt-1 w-full resize-y rounded-md border border-input bg-transparent px-2.5 py-2 text-sm leading-relaxed outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50"
154
182
  ></textarea>
155
183
  <div class="mt-2 flex justify-end gap-1.5">
156
- <button type="button" class="thread-button" onclick={() => (editingId = null)}>{labels.cancel}</button>
157
- <button type="button" class="thread-button thread-primary" onclick={() => saveEdit(comment)}>{labels.save}</button>
184
+ <button type="button" class="thread-button" onclick={() => (editingId = null)}
185
+ >{labels.cancel}</button
186
+ >
187
+ <button
188
+ type="button"
189
+ class="thread-button thread-primary"
190
+ onclick={() => saveEdit(comment)}>{labels.save}</button
191
+ >
158
192
  </div>
159
193
  {:else}
160
194
  <p class="text-sm leading-relaxed whitespace-pre-wrap text-pretty">{comment.body}</p>
@@ -168,7 +202,9 @@
168
202
  {/if}
169
203
 
170
204
  {#if onSend}
171
- <div class="rounded-lg border border-input transition-shadow focus-within:ring-3 focus-within:ring-ring/50">
205
+ <div
206
+ class="rounded-lg border border-input transition-shadow focus-within:ring-3 focus-within:ring-ring/50"
207
+ >
172
208
  <textarea
173
209
  bind:value={draft}
174
210
  onkeydown={onComposerKeydown}
@@ -178,7 +214,12 @@
178
214
  class="block max-h-60 min-h-16 w-full resize-none border-0 bg-transparent px-3 py-2 text-sm leading-relaxed outline-none [field-sizing:content] placeholder:text-muted-foreground"
179
215
  ></textarea>
180
216
  <div class="flex justify-end px-2 pb-2">
181
- <button type="button" class="thread-button thread-primary" onclick={send} disabled={!canSend}>
217
+ <button
218
+ type="button"
219
+ class="thread-button thread-primary"
220
+ onclick={send}
221
+ disabled={!canSend}
222
+ >
182
223
  {sending ? labels.saving : labels.commentSend}
183
224
  </button>
184
225
  </div>
@@ -54,7 +54,9 @@
54
54
  function onPointerDown(e: PointerEvent, mode: Drag["mode"]): void {
55
55
  if (!editable || e.button !== 0) return;
56
56
  e.stopPropagation();
57
- (e.currentTarget as HTMLElement).closest<HTMLElement>("[data-bar]")?.setPointerCapture(e.pointerId);
57
+ (e.currentTarget as HTMLElement)
58
+ .closest<HTMLElement>("[data-bar]")
59
+ ?.setPointerCapture(e.pointerId);
58
60
  setDrag({ id, mode, originX: e.clientX, dx: 0 });
59
61
  }
60
62
 
@@ -95,7 +97,9 @@
95
97
  role="button"
96
98
  tabindex="0"
97
99
  aria-roledescription="task bar"
98
- aria-label="{title}, {describe(span)}.{editable ? ' Arrow keys move it a day, Shift plus arrow keys change its end.' : ''}"
100
+ aria-label="{title}, {describe(span)}.{editable
101
+ ? ' Arrow keys move it a day, Shift plus arrow keys change its end.'
102
+ : ''}"
99
103
  class={cn(
100
104
  "g-bar g-enter absolute top-1/2 flex -translate-y-1/2 items-center rounded-lg outline-none focus-visible:ring-2 focus-visible:ring-ring/60",
101
105
  editable && "cursor-grab",
@@ -117,15 +121,21 @@
117
121
  {#if progress > 0}
118
122
  <!-- The clip keeps the bar's rounded corners while the fill scales. -->
119
123
  <span class="absolute inset-0 overflow-hidden rounded-lg" aria-hidden="true">
120
- <span class="g-progress absolute inset-0 origin-left" style:transform="scaleX({progress})"></span>
124
+ <span class="g-progress absolute inset-0 origin-left" style:transform="scaleX({progress})"
125
+ ></span>
121
126
  </span>
122
127
  {/if}
123
128
  {#if width >= inlineTitleMin}
124
129
  <span class="relative truncate px-2.5 text-xs font-medium text-foreground">{title}</span>
125
130
  {/if}
126
131
  {#if editable}
127
- <span class="g-handle left-0" aria-hidden="true" onpointerdown={(e) => onPointerDown(e, "start")}></span>
128
- <span class="g-handle right-0" aria-hidden="true" onpointerdown={(e) => onPointerDown(e, "end")}></span>
132
+ <span
133
+ class="g-handle left-0"
134
+ aria-hidden="true"
135
+ onpointerdown={(e) => onPointerDown(e, "start")}
136
+ ></span>
137
+ <span class="g-handle right-0" aria-hidden="true" onpointerdown={(e) => onPointerDown(e, "end")}
138
+ ></span>
129
139
  {/if}
130
140
  {#if dragging && drag && drag.dx !== 0}
131
141
  <span
@@ -182,7 +192,8 @@
182
192
 
183
193
  .g-progress {
184
194
  background: color-mix(in oklab, var(--g-hue) 32%, var(--color-card, white));
185
- transition: transform var(--duration-fast, 250ms) var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
195
+ transition: transform var(--duration-fast, 250ms)
196
+ var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
186
197
  }
187
198
 
188
199
  /* Resize grips: a wide invisible hit area, a slim pill that shows on hover. */
@@ -16,26 +16,55 @@
16
16
  </script>
17
17
 
18
18
  <!-- The layer behind every row: weekends, week lines, the today line and arrows. -->
19
- <div class="pointer-events-none absolute inset-y-0 left-(--g-label)" style:width="{layout.timelineWidth}px" aria-hidden="true">
19
+ <div
20
+ class="pointer-events-none absolute inset-y-0 left-(--g-label)"
21
+ style:width="{layout.timelineWidth}px"
22
+ aria-hidden="true"
23
+ >
20
24
  {#each days as d (d.day)}
21
25
  {#if d.weekend}
22
- <div class="absolute inset-y-0 bg-foreground/[0.025]" style:left="{d.i * layout.dayWidth}px" style:width="{layout.dayWidth}px"></div>
26
+ <div
27
+ class="absolute inset-y-0 bg-foreground/[0.025]"
28
+ style:left="{d.i * layout.dayWidth}px"
29
+ style:width="{layout.dayWidth}px"
30
+ ></div>
23
31
  {/if}
24
32
  {#if d.wd === 1}
25
- <div class="absolute inset-y-0 w-px bg-border/70" style:left="{d.i * layout.dayWidth}px"></div>
33
+ <div
34
+ class="absolute inset-y-0 w-px bg-border/70"
35
+ style:left="{d.i * layout.dayWidth}px"
36
+ ></div>
26
37
  {/if}
27
38
  {/each}
28
39
  {#if layout.todayDay >= layout.first && layout.todayDay <= layout.last}
29
- <div class="g-today absolute inset-y-0 w-px bg-primary" style:left="{dayX(layout, layout.todayDay) + layout.dayWidth / 2}px">
40
+ <div
41
+ class="g-today absolute inset-y-0 w-px bg-primary"
42
+ style:left="{dayX(layout, layout.todayDay) + layout.dayWidth / 2}px"
43
+ >
30
44
  <span class="absolute -top-1 -left-[3px] size-[7px] rounded-full bg-primary"></span>
31
45
  </div>
32
46
  {/if}
33
- <svg class="absolute inset-0 overflow-visible" width={layout.timelineWidth} height={rowCount * layout.rowHeight}>
47
+ <svg
48
+ class="absolute inset-0 overflow-visible"
49
+ width={layout.timelineWidth}
50
+ height={rowCount * layout.rowHeight}
51
+ >
34
52
  {#each arrows as arrow (arrow.key)}
35
- {@const lit = hoveredId === arrow.from || hoveredId === arrow.to || draggingId === arrow.from || draggingId === arrow.to}
53
+ {@const lit =
54
+ hoveredId === arrow.from ||
55
+ hoveredId === arrow.to ||
56
+ draggingId === arrow.from ||
57
+ draggingId === arrow.to}
36
58
  <g class="g-arrow" class:g-arrow-lit={lit}>
37
59
  <path d={arrow.d} pathLength="1" fill="none" stroke-width="1.5" class="g-arrow-line"></path>
38
- <path d={arrow.head} fill="none" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="g-arrow-head"></path>
60
+ <path
61
+ d={arrow.head}
62
+ fill="none"
63
+ stroke-width="1.5"
64
+ stroke-linecap="round"
65
+ stroke-linejoin="round"
66
+ class="g-arrow-head"
67
+ ></path>
39
68
  </g>
40
69
  {/each}
41
70
  </svg>
@@ -44,7 +73,8 @@
44
73
  <style>
45
74
  .g-today {
46
75
  transform-origin: top;
47
- animation: g-today-in var(--duration-very-slow, 500ms) var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
76
+ animation: g-today-in var(--duration-very-slow, 500ms)
77
+ var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
48
78
  }
49
79
 
50
80
  .g-arrow {
@@ -59,7 +89,8 @@
59
89
  .g-arrow-line {
60
90
  stroke-dasharray: 1;
61
91
  stroke-dashoffset: 0;
62
- animation: g-draw var(--duration-very-slow, 500ms) var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) 300ms backwards;
92
+ animation: g-draw var(--duration-very-slow, 500ms)
93
+ var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) 300ms backwards;
63
94
  }
64
95
 
65
96
  .g-arrow-head {
@@ -15,13 +15,19 @@
15
15
  let hue = $derived(row.group.hue ?? "var(--color-primary)");
16
16
  </script>
17
17
 
18
- <div role="listitem" class="relative flex border-b border-border/60 bg-muted/30" style:height="{layout.rowHeight}px">
18
+ <div
19
+ role="listitem"
20
+ class="relative flex border-b border-border/60 bg-muted/30"
21
+ style:height="{layout.rowHeight}px"
22
+ >
19
23
  <!-- Opaque card under the row's muted tint, so bars never show through the pinned column. -->
20
24
  <div class="sticky left-0 z-10 w-(--g-label) shrink-0 border-r border-border bg-card">
21
25
  <div class="flex h-full items-center gap-2 bg-muted/30 px-3">
22
26
  <span class="size-2 shrink-0 rounded-full" style:background={hue}></span>
23
27
  <span class="truncate text-sm font-medium text-foreground">{row.group.label}</span>
24
- <span class="grid h-5 min-w-5 place-items-center rounded-sm bg-foreground/5 px-1 text-xs font-medium text-muted-foreground tabular-nums">
28
+ <span
29
+ class="grid h-5 min-w-5 place-items-center rounded-sm bg-foreground/5 px-1 text-xs font-medium text-muted-foreground tabular-nums"
30
+ >
25
31
  {row.count}
26
32
  </span>
27
33
  </div>
@@ -13,7 +13,9 @@
13
13
 
14
14
  let { layout, days, months, labelHeading, locale, corner = $bindable() }: Props = $props();
15
15
 
16
- let weekdayFormat = $derived(new Intl.DateTimeFormat(locale, { weekday: "narrow", timeZone: "UTC" }));
16
+ let weekdayFormat = $derived(
17
+ new Intl.DateTimeFormat(locale, { weekday: "narrow", timeZone: "UTC" }),
18
+ );
17
19
  </script>
18
20
 
19
21
  <!-- Months over days, pinned to the top. -->
@@ -32,7 +34,9 @@
32
34
  style:left="{month.i * layout.dayWidth}px"
33
35
  style:width="{month.length * layout.dayWidth}px"
34
36
  >
35
- <span class="sticky left-(--g-label) inline-block px-2 pt-1.5 text-xs font-medium whitespace-nowrap text-foreground">
37
+ <span
38
+ class="sticky left-(--g-label) inline-block px-2 pt-1.5 text-xs font-medium whitespace-nowrap text-foreground"
39
+ >
36
40
  {month.label}
37
41
  </span>
38
42
  </div>
@@ -51,7 +55,9 @@
51
55
  style:width="{layout.dayWidth}px"
52
56
  >
53
57
  {#if layout.dayWidth >= 26}
54
- <span class="mb-0.5 opacity-70">{weekdayFormat.format(new Date(d.day * 86_400_000))}</span>
58
+ <span class="mb-0.5 opacity-70"
59
+ >{weekdayFormat.format(new Date(d.day * 86_400_000))}</span
60
+ >
55
61
  {/if}
56
62
  {#if showNumber}
57
63
  <span
@@ -3,7 +3,14 @@
3
3
  import { CaretRight, FlagPennant } from "phosphor-svelte";
4
4
  import type { GanttChange, GanttLabelContext } from "../task-types.js";
5
5
  import GanttBar from "./gantt-bar.svelte";
6
- import { barWidth, dayX, type Drag, type Layout, type Span, type TaskRow } from "./logic.js";
6
+ import {
7
+ barWidth,
8
+ dayX,
9
+ type Drag,
10
+ type Layout,
11
+ type Span,
12
+ type TaskRow,
13
+ } from "./logic.js";
7
14
  import "./gantt.css";
8
15
 
9
16
  interface Props<T> {
@@ -60,7 +67,12 @@
60
67
  let hot = $derived(hovered || drag?.id === row.id);
61
68
  </script>
62
69
 
63
- <div role="listitem" class="g-row relative flex border-b border-border/40 last:border-b-0" class:g-row-hot={hot} style:height="{layout.rowHeight}px">
70
+ <div
71
+ role="listitem"
72
+ class="g-row relative flex border-b border-border/40 last:border-b-0"
73
+ class:g-row-hot={hot}
74
+ style:height="{layout.rowHeight}px"
75
+ >
64
76
  <div
65
77
  class="sticky left-0 z-10 flex w-(--g-label) shrink-0 items-center gap-2 border-r border-border bg-card px-3 text-sm"
66
78
  style:padding-inline-start={nested ? `${row.depth * indent + 12}px` : undefined}
@@ -74,7 +86,11 @@
74
86
  onclick={() => onToggle(row.id)}
75
87
  class="-ml-1 grid size-5 shrink-0 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"
76
88
  >
77
- <span class="g-chevron size-3.5 [&>svg]:size-full" class:g-chevron-open={row.open} aria-hidden="true">
89
+ <span
90
+ class="g-chevron size-3.5 [&>svg]:size-full"
91
+ class:g-chevron-open={row.open}
92
+ aria-hidden="true"
93
+ >
78
94
  <CaretRight weight="bold" />
79
95
  </span>
80
96
  </button>
@@ -108,7 +124,9 @@
108
124
  onpointerenter={() => onhover(row.id, true)}
109
125
  onpointerleave={() => onhover(row.id, false)}
110
126
  >
111
- <span class="size-5 [&>svg]:size-full" aria-hidden="true"><FlagPennant weight="fill" /></span>
127
+ <span class="size-5 [&>svg]:size-full" aria-hidden="true"
128
+ ><FlagPennant weight="fill" /></span
129
+ >
112
130
  </button>
113
131
  {:else if !row.own}
114
132
  <!-- A parent with no dates of its own: the span of what is below it. Not draggable. -->
@@ -124,7 +142,8 @@
124
142
  style:width="{barWidth(span, layout)}px"
125
143
  style:height="{Math.max(layout.rowHeight - 24, 10)}px"
126
144
  onclick={() => onSelect?.(row.id)}
127
- onkeydown={(e) => (e.key === "Enter" || e.key === " ") && (e.preventDefault(), onSelect?.(row.id))}
145
+ onkeydown={(e) =>
146
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), onSelect?.(row.id))}
128
147
  onpointerenter={() => onhover(row.id, true)}
129
148
  onpointerleave={() => onhover(row.id, false)}
130
149
  ></div>
@@ -161,7 +180,8 @@
161
180
  }
162
181
 
163
182
  .g-chevron {
164
- transition: rotate var(--duration-fast, 250ms) var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
183
+ transition: rotate var(--duration-fast, 250ms)
184
+ var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1));
165
185
  }
166
186
 
167
187
  .g-chevron-open {
@@ -1,6 +1,7 @@
1
1
  /* Shared by the bar, the derived bar and the group summary: they all slide in the same way. */
2
2
  .g-enter {
3
- animation: g-bar-in var(--duration-slow, 400ms) var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
3
+ animation: g-bar-in var(--duration-slow, 400ms)
4
+ var(--ease-smooth-out, cubic-bezier(0.22, 1, 0.36, 1)) backwards;
4
5
  animation-delay: calc(var(--g-i, 0) * var(--duration-stagger, 40ms));
5
6
  }
6
7
 
@@ -16,7 +16,7 @@ let app: Record<string, unknown> | undefined;
16
16
  function render(extra: Record<string, unknown> = {}) {
17
17
  target = document.createElement("div");
18
18
  document.body.append(target);
19
- app = mount(TaskGantt, {
19
+ app = mount(TaskGantt<Task>, {
20
20
  target,
21
21
  props: {
22
22
  items,
@@ -50,7 +50,9 @@ describe("TaskGantt", () => {
50
50
  const root = render({ onChange: (_id: string, change: GanttChange) => changes.push(change) });
51
51
  const bar = root.querySelector("[data-bar]");
52
52
  bar?.dispatchEvent(new KeyboardEvent("keydown", { key: "ArrowRight", bubbles: true }));
53
- bar?.dispatchEvent(new KeyboardEvent("keydown", { key: "ArrowRight", shiftKey: true, bubbles: true }));
53
+ bar?.dispatchEvent(
54
+ new KeyboardEvent("keydown", { key: "ArrowRight", shiftKey: true, bubbles: true }),
55
+ );
54
56
  await tick();
55
57
  expect(changes).toEqual([
56
58
  { start: "2026-10-06", end: "2026-10-10" },