@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.
- package/package.json +48 -24
- package/scripts/sync-shadcn.mjs +3 -4
- package/src/agents/agent-avatar.svelte +604 -575
- package/src/agents/agent-cast.svelte +179 -183
- package/src/agents/demo.svelte +125 -113
- package/src/agents/helpers.ts +23 -17
- package/src/agents/index.ts +4 -4
- package/src/agents/page-state.ts +6 -6
- package/src/agents/types.ts +6 -6
- package/src/ai/ai-button/AiButton.svelte +4 -12
- package/src/ai/generation-progress/GenerationProgress.svelte +10 -3
- package/src/ai/prompt-input/PromptInputTextarea.svelte +1 -2
- package/src/ai/response/Response.css +2 -3
- package/src/animations/avatar-group-hover.css +2 -16
- package/src/animations/card-tilt.css +3 -6
- package/src/animations/digit-pop-in.css +2 -15
- package/src/animations/dropdown.css +4 -17
- package/src/animations/input-clear-dissolve.css +5 -18
- package/src/animations/input-shake.css +9 -41
- package/src/animations/learn-more-hover.css +17 -9
- package/src/animations/like-button.css +2 -4
- package/src/animations/page-side-by-side.css +2 -10
- package/src/animations/plus-menu-morph.css +2 -5
- package/src/animations/shimmer-text.css +5 -18
- package/src/animations/spinning-counter.css +2 -6
- package/src/animations/success-check.css +2 -15
- package/src/animations/thinking-states.css +2 -7
- package/src/brand/brand.test.ts +21 -5
- package/src/brand/index.ts +4 -10
- package/src/canvas/README.md +9 -12
- package/src/canvas/card/card-frame.svelte +43 -39
- package/src/canvas/card/resize-handles.svelte +89 -80
- package/src/canvas/chrome/chrome-zoom.svelte +101 -100
- package/src/canvas/chrome/lock-badge.svelte +8 -8
- package/src/canvas/chrome/side-handles.svelte +24 -19
- package/src/canvas/chrome/size-chip.svelte +30 -30
- package/src/canvas/chrome/snap-guides.svelte +20 -20
- package/src/canvas/components/icons/ToolIcon.svelte +8 -8
- package/src/canvas/components/shared/svg/PreviewSvg.svelte +19 -19
- package/src/canvas/components/shared/svg/ShapeOutline.svelte +71 -48
- package/src/canvas/components/shared/svg/StrokeNode.svelte +21 -27
- package/src/canvas/components/shared/svg/TextRule.svelte +25 -17
- package/src/canvas/edges/bend-handle.svelte +46 -46
- package/src/canvas/edges/edge-gradient.svelte +10 -10
- package/src/canvas/edges/gradient-edge.svelte +45 -29
- package/src/canvas/editor/lock.test.ts +6 -1
- package/src/canvas/editor/style.ts +7 -1
- package/src/canvas/headless/svg-figure.test.ts +5 -1
- package/src/canvas/lod/lod-switch.svelte +111 -106
- package/src/canvas/pen/PenField.svelte +87 -81
- package/src/canvas/pen/PenOverlay.svelte +127 -127
- package/src/canvas/pen/ShapeNode.svelte +31 -32
- package/src/canvas/pen/TextNode.svelte +54 -53
- package/src/canvas/pen/host-field.test.svelte +7 -7
- package/src/canvas/pen/shapes.ts +7 -1
- package/src/canvas/screen/GlyphIcon.svelte +22 -17
- package/src/canvas/screen/PartView.svelte +138 -72
- package/src/canvas/screen/ScreenBody.svelte +81 -60
- package/src/canvas/screen/ScreenCard.svelte +20 -20
- package/src/canvas/ui/CanvasToolbar.svelte +173 -85
- package/src/canvas/ui/FrameLayer.svelte +59 -59
- package/src/canvas/ui/PenLayer.svelte +39 -30
- package/src/canvas/ui/StylePanel.svelte +119 -102
- package/src/canvas/ui/canvas-grid.svelte +137 -129
- package/src/charts/animated-value.svelte +1 -1
- package/src/charts/area-chart.css +2 -5
- package/src/charts/area-chart.svelte +1 -1
- package/src/charts/bar-chart.css +2 -3
- package/src/charts/bar-chart.svelte +1 -1
- package/src/charts/charts.css +5 -17
- package/src/charts/crosshair.svelte +1 -1
- package/src/charts/dashboard/dashboard-empty.svelte +25 -25
- package/src/charts/dashboard/dashboard-section.svelte +24 -24
- package/src/charts/dashboard/data-panel.svelte +50 -50
- package/src/charts/dashboard/data-sort-head.svelte +56 -56
- package/src/charts/dashboard/data-table.svelte +138 -138
- package/src/charts/dashboard/panel-grid.svelte +30 -30
- package/src/charts/dashboard/period-filter.svelte +25 -25
- package/src/charts/dashboard/rating-chip.svelte +19 -19
- package/src/charts/dashboard/stat-band.svelte +32 -32
- package/src/charts/dashboard/stat-tile.svelte +106 -99
- package/src/charts/donut-chart.svelte +1 -1
- package/src/charts/edge-fade.svelte +1 -1
- package/src/charts/figure.svelte +1 -1
- package/src/charts/gauge-chart.css +4 -7
- package/src/charts/gauge-chart.svelte +1 -1
- package/src/charts/hover-focus.svelte +1 -1
- package/src/charts/legend.css +1 -3
- package/src/charts/legend.svelte +1 -1
- package/src/charts/line-chart.svelte +1 -1
- package/src/charts/number-chart.css +6 -9
- package/src/charts/number-chart.svelte +1 -1
- package/src/charts/reference-line.svelte +19 -19
- package/src/charts/reveal.svelte +1 -1
- package/src/charts/ring-chart.css +2 -4
- package/src/charts/ring-chart.svelte +1 -1
- package/src/charts/sparkline.svelte +5 -2
- package/src/charts/stat-card.svelte +1 -1
- package/src/charts/time-series-chart.css +2 -5
- package/src/charts/trend-pill.css +2 -4
- package/src/charts/trend-pill.svelte +1 -1
- package/src/components/copy/copy-button.svelte +93 -98
- package/src/components/copy/copy-button.test.ts +10 -2
- package/src/components/data-table/infinite-scroll.svelte +42 -42
- package/src/components/data-table/pagination.svelte +34 -22
- package/src/components/data-table/row-arrow.svelte +19 -16
- package/src/components/data-table/row-context-menu.svelte +52 -52
- package/src/components/data-table/sortable-head.svelte +25 -25
- package/src/components/data-table/table-skeleton.svelte +41 -36
- package/src/components/docs/doc-page.svelte +18 -9
- package/src/components/docs/on-this-page.svelte +16 -3
- package/src/components/docs/scroll-spy.svelte.ts +2 -3
- package/src/components/field-row/field-row.svelte +10 -8
- package/src/components/hold-to-confirm/hold-to-confirm.svelte +5 -1
- package/src/components/icon/icon.svelte +14 -14
- package/src/components/language-flag/language-flag.svelte +3 -1
- package/src/components/list-page/detail-empty.svelte +34 -34
- package/src/components/list-page/detail-header.svelte +55 -47
- package/src/components/list-page/detail-panel.svelte +51 -59
- package/src/components/list-page/detail-row.svelte +19 -19
- package/src/components/list-page/detail-stack.svelte +21 -21
- package/src/components/list-page/empty-state.svelte +30 -30
- package/src/components/list-page/filter-item.svelte +20 -20
- package/src/components/list-page/filter-popover.svelte +60 -55
- package/src/components/list-page/grouped-list.svelte +4 -2
- package/src/components/list-page/index.ts +8 -4
- package/src/components/list-page/list-page-shell.svelte +2 -5
- package/src/components/list-page/master-detail.svelte +87 -88
- package/src/components/list-page/notice-bar.svelte +38 -38
- package/src/components/list-page/prev-next.svelte +63 -63
- package/src/components/list-page/rail-body.svelte +18 -18
- package/src/components/list-page/rail-empty.svelte +23 -30
- package/src/components/list-page/rail-head.svelte +24 -24
- package/src/components/list-page/rail-row.svelte +77 -73
- package/src/components/list-page/section-host.ts +2 -3
- package/src/components/locale-switch/locale-switch.svelte +41 -41
- package/src/components/mark/mark.svelte +34 -38
- package/src/components/open-in/index.ts +1 -5
- package/src/components/open-in/open-in.svelte +40 -40
- package/src/components/picker/mark-picker.svelte +49 -49
- package/src/components/picker/picker.svelte +5 -3
- package/src/components/section-header/index.ts +1 -0
- package/src/components/section-header/section-header.svelte +1 -1
- package/src/components/section-header/section-header.test.ts +7 -1
- package/src/components/section-header/section-label.svelte +39 -0
- package/src/components/segmented/animated-tabs.svelte +31 -2
- package/src/components/segmented/collapse.test.ts +2 -1
- package/src/components/segmented/index.ts +2 -0
- package/src/components/segmented/segment.svelte +52 -49
- package/src/components/segmented/segmented-filter.svelte +79 -80
- package/src/components/segmented/segmented-nav.svelte +34 -40
- package/src/components/segmented/segmented-overflow.svelte +53 -50
- package/src/components/segmented/segmented-track.svelte +62 -46
- package/src/components/segmented/segmented.ts +2 -3
- package/src/components/star-rating-input/star-rating-input.svelte +103 -103
- package/src/components/svg/svg.svelte +4 -4
- package/src/components/table-view/table-view.svelte +17 -2
- package/src/components/table-view/table-view.test.ts +7 -1
- package/src/components/table-view/types.ts +11 -11
- package/src/components/tags-input/index.ts +13 -0
- package/src/components/tags-input/tags-input.svelte +305 -0
- package/src/components/tags-input/tags.test.ts +64 -0
- package/src/components/tags-input/tags.ts +142 -0
- package/src/components/theme/index.ts +2 -4
- package/src/components/theme/theme-provider.svelte +1 -3
- package/src/components/toolbar/index.ts +2 -0
- package/src/components/{list-page → toolbar}/toolbar-search.svelte +25 -25
- package/src/components/toolbar/toolbar.svelte +13 -9
- package/src/components/toolbar/toolbar.test.ts +10 -1
- package/src/design/index.css +21 -78
- package/src/design/polish.css +26 -35
- package/src/editor/editor-toolbar.svelte +104 -99
- package/src/editor/editor.svelte +296 -266
- package/src/editor/image-toolbar.svelte +20 -22
- package/src/editor/index.ts +1 -4
- package/src/editor/inline-editor.svelte +280 -238
- package/src/editor/markdown.ts +15 -15
- package/src/editor/renderer.svelte +71 -71
- package/src/editor/slash-menu.svelte +24 -27
- package/src/effects/animated-beam/diagrams/BeamSvg.svelte +1 -1
- package/src/effects/image-comparison/ImageComparison.svelte +11 -1
- package/src/effects/interactive-hover-button/InteractiveHoverButton.svelte +59 -46
- package/src/effects/magic-card/MagicCard.css +14 -7
- package/src/effects/marquee/Marquee.svelte +3 -5
- package/src/effects/reveal/observe.ts +0 -3
- package/src/effects/spotlight/Spotlight.svelte +1 -1
- package/src/effects/theme-toggle/ThemeToggle.css +25 -22
- package/src/effects/theme-toggle/ThemeToggle.svelte +6 -7
- package/src/gallery.test.ts +14 -4
- package/src/inbox/README.md +27 -0
- package/src/inbox/inbox.test.ts +214 -0
- package/src/inbox/index.ts +31 -0
- package/src/inbox/logic.ts +169 -0
- package/src/inbox/thread-inbox.svelte +439 -0
- package/src/inbox/types.ts +161 -0
- package/src/lib/theme-transition.ts +2 -4
- package/src/lib/tone.ts +2 -4
- package/src/lib/utils.ts +2 -2
- package/src/modules.test.ts +105 -0
- package/src/onboarding/define-tours.test.ts +55 -40
- package/src/onboarding/define-tours.ts +23 -23
- package/src/onboarding/demo.svelte +24 -5
- package/src/onboarding/index.ts +1 -8
- package/src/onboarding/onboarding-provider.svelte +19 -7
- package/src/onboarding/onboarding.svelte.ts +16 -16
- package/src/onboarding/pick.test.ts +61 -52
- package/src/onboarding/pick.ts +16 -13
- package/src/onboarding/stores.test.ts +80 -80
- package/src/onboarding/stores.ts +41 -39
- package/src/onboarding/tour-card.svelte +30 -5
- package/src/onboarding/tour-runner.svelte +12 -3
- package/src/onboarding/types.ts +20 -12
- package/src/onboarding/wait.ts +22 -22
- package/src/panel/README.md +5 -0
- package/src/panel/index.ts +2 -0
- package/src/panel/side-panel.svelte +194 -0
- package/src/record/README.md +3 -0
- package/src/record/demo-data.ts +352 -0
- package/src/record/field-section.svelte +57 -0
- package/src/record/fields.ts +194 -0
- package/src/record/format.ts +94 -0
- package/src/{tasks/record → record}/index.ts +49 -35
- package/src/{tasks/record → record}/info-list.svelte +145 -114
- package/src/record/kinds.ts +42 -0
- package/src/record/logic.ts +326 -0
- package/src/record/next-up.svelte +81 -0
- package/src/{tasks/record → record}/project-list.svelte +56 -50
- package/src/{tasks/record → record}/record-demo.svelte +130 -110
- package/src/{tasks/record → record}/record-header.svelte +37 -28
- package/src/{tasks/record → record}/record-shell.svelte +54 -54
- package/src/record/record-stats.svelte +48 -0
- package/src/record/record-timeline.svelte +251 -0
- package/src/record/record.test.ts +471 -0
- package/src/{tasks/record → record}/steps-rail.svelte +225 -216
- package/src/record/types.ts +299 -0
- package/src/record/where-we-are.svelte +125 -0
- package/src/shadcn/button/button.svelte +1 -1
- package/src/shadcn/card/card-title.svelte +1 -5
- package/src/shadcn/hooks/use-highlighted-code.svelte.ts +2 -13
- package/src/shadcn/sheet/sheet-content.svelte +2 -4
- package/src/shadcn/table/table-cell.svelte +2 -3
- package/src/shadcn/utilities.css +3 -8
- package/src/slides/Controls.svelte +150 -124
- package/src/slides/Deck.svelte +243 -238
- package/src/slides/Fragment.svelte +64 -57
- package/src/slides/Overview.svelte +106 -101
- package/src/slides/Presenter.svelte +300 -266
- package/src/slides/Slide.svelte +185 -170
- package/src/slides/SlideList.svelte +16 -12
- package/src/slides/ambient.d.ts +1 -1
- package/src/slides/bridges.ts +42 -23
- package/src/slides/deck-controller.svelte.ts +47 -35
- package/src/slides/demo-slides.svelte +330 -306
- package/src/slides/demo.svelte +164 -160
- package/src/slides/export/capture.ts +20 -16
- package/src/slides/export/ffmpeg.ts +43 -38
- package/src/slides/export/index.ts +5 -5
- package/src/slides/export/launch.ts +3 -1
- package/src/slides/export/pdf.ts +30 -27
- package/src/slides/export/types.ts +10 -8
- package/src/slides/index.ts +11 -11
- package/src/slides/labels.ts +22 -19
- package/src/slides/layout.ts +9 -2
- package/src/slides/model.ts +4 -4
- package/src/slides/navigation.ts +43 -31
- package/src/slides/theme.css +5 -7
- package/src/slides/types.ts +9 -10
- package/src/status/README.md +18 -0
- package/src/status/define-statuses.ts +25 -0
- package/src/status/index.ts +11 -0
- package/src/{tasks → status}/status-badge.svelte +3 -1
- package/src/{tasks → status}/status-dot.svelte +1 -3
- package/src/{tasks → status}/status-icon.svelte +1 -1
- package/src/status/status-types.ts +40 -0
- package/src/tasks/README.md +1 -1
- package/src/tasks/board-order.ts +2 -4
- package/src/tasks/demo.svelte +192 -34
- package/src/tasks/detail/detail-demo.svelte +75 -15
- package/src/tasks/detail/detail-types.ts +45 -45
- package/src/tasks/detail/task-detail.svelte +40 -10
- package/src/tasks/detail/task-property.svelte +8 -2
- package/src/tasks/detail/task-thread.svelte +53 -12
- package/src/tasks/gantt/gantt-bar.svelte +17 -6
- package/src/tasks/gantt/gantt-grid.svelte +40 -9
- package/src/tasks/gantt/gantt-group-row.svelte +8 -2
- package/src/tasks/gantt/gantt-header.svelte +9 -3
- package/src/tasks/gantt/gantt-task-row.svelte +26 -6
- package/src/tasks/gantt/gantt.css +2 -1
- package/src/tasks/gantt/gantt.test.ts +4 -2
- package/src/tasks/gantt/logic.test.ts +110 -20
- package/src/tasks/gantt/logic.ts +42 -6
- package/src/tasks/inbox/inbox-card.svelte +15 -7
- package/src/tasks/inbox/inbox-draft.svelte +1 -1
- package/src/tasks/inbox/inbox-logic.ts +6 -40
- package/src/tasks/inbox/inbox-statuses.ts +24 -24
- package/src/tasks/inbox/inbox-trace.svelte +9 -3
- package/src/tasks/inbox/inbox-types.ts +54 -58
- package/src/tasks/inbox/index.ts +22 -21
- package/src/tasks/index.ts +52 -53
- package/src/tasks/kanban-board.svelte +16 -12
- package/src/tasks/kanban-types.ts +2 -3
- package/src/tasks/presets/sales.ts +7 -7
- package/src/tasks/task-gantt.svelte +28 -8
- package/src/tasks/task-list.svelte +41 -17
- package/src/tasks/time/duration.ts +40 -40
- package/src/tasks/time/time-chip.svelte +9 -2
- package/src/tasks/time/time-dot.svelte +1 -1
- package/src/tasks/time/time-ring.svelte +11 -3
- package/src/tasks/time/time-tracker.svelte +57 -15
- package/src/tasks/time/time-types.ts +57 -57
- package/src/tasks/use-kanban-dnd.svelte.ts +2 -3
- package/src/thread/README.md +31 -0
- package/src/thread/index.ts +12 -0
- package/src/thread/logic.ts +61 -0
- package/src/thread/thread.svelte +432 -0
- package/src/thread/thread.test.ts +73 -0
- package/src/thread/types.ts +93 -0
- package/src/tokens/craft.css +17 -53
- package/src/tokens/index.css +3 -13
- package/src/tokens/palette.css +13 -11
- package/src/tokens/primitives.css +10 -23
- package/src/components/list-page/section-label.svelte +0 -39
- package/src/tasks/define-statuses.ts +0 -32
- package/src/tasks/inbox/inbox.svelte +0 -203
- package/src/tasks/record/demo-data.ts +0 -286
- package/src/tasks/record/field-section.svelte +0 -53
- package/src/tasks/record/fields.ts +0 -142
- package/src/tasks/record/format.ts +0 -87
- package/src/tasks/record/kinds.ts +0 -42
- package/src/tasks/record/logic.ts +0 -324
- package/src/tasks/record/next-up.svelte +0 -70
- package/src/tasks/record/record-stats.svelte +0 -48
- package/src/tasks/record/record-timeline.svelte +0 -231
- package/src/tasks/record/record.test.ts +0 -350
- package/src/tasks/record/types.ts +0 -280
- package/src/tasks/record/where-we-are.svelte +0 -121
- package/src/tasks/side-panel.svelte +0 -193
- package/src/tasks/status-types.ts +0 -40
- /package/src/components/{list-page → toolbar}/toolbar-trigger.ts +0 -0
- /package/src/{tasks → panel}/side-panel-types.ts +0 -0
- /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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
name: string;
|
|
75
|
+
shape?: AgentShape;
|
|
76
|
+
color?: string;
|
|
77
77
|
};
|
|
78
78
|
|
|
79
79
|
export type InboxItem = {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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 }>;
|
package/src/tasks/inbox/index.ts
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
export {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
export {
|
|
2
|
+
confidenceLevel,
|
|
3
|
+
inboxConfidence,
|
|
4
|
+
inboxKinds,
|
|
5
|
+
inboxStates,
|
|
6
|
+
} from "./inbox-statuses.js";
|
|
4
7
|
export type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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";
|
package/src/tasks/index.ts
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
KanbanCardContext,
|
|
10
|
+
KanbanCardSnippet,
|
|
11
|
+
KanbanColumn as KanbanColumnDef,
|
|
12
|
+
KanbanColumnContext,
|
|
13
|
+
KanbanMove,
|
|
14
|
+
KanbanSortKey,
|
|
15
15
|
} from "./kanban-types.js";
|
|
16
|
-
export {
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
} from "
|
|
27
|
-
export {
|
|
28
|
-
export type { PanelStat, SidePanelWidth } from "
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
46
|
+
budgetTone,
|
|
47
|
+
dayLabel,
|
|
48
|
+
formatClock,
|
|
49
|
+
formatMinutes,
|
|
50
|
+
localDay,
|
|
51
|
+
parseMinutes,
|
|
52
|
+
personColor,
|
|
56
53
|
} from "./time/duration.js";
|
|
57
54
|
export {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
inboxStates,
|
|
55
|
+
confidenceLevel,
|
|
56
|
+
inboxConfidence,
|
|
57
|
+
inboxKinds,
|
|
58
|
+
inboxStates,
|
|
63
59
|
} from "./inbox/index.js";
|
|
64
60
|
export type {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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 {
|
|
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
|
|
46
|
-
*
|
|
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
|
|
56
|
-
*
|
|
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) ??
|
|
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
|
-
*
|
|
220
|
-
*
|
|
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) ??
|
|
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}
|
|
469
|
-
|
|
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"
|
|
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
|
|
28
|
-
*
|
|
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 "
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
37
|
-
*
|
|
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(
|
|
137
|
-
|
|
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(
|
|
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
|
|
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({
|
|
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
|
|
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 {
|
|
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
|
|
22
|
-
*
|
|
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
|
|
40
|
-
*
|
|
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) ??
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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)
|
|
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)
|
|
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)
|
|
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
|
}
|