@devalok/shilp-sutra 0.57.0 → 0.59.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/MIGRATION.md +91 -0
- package/dist/_chunks/badge-group.js +75 -188
- package/dist/_chunks/badge-group.js.map +1 -1
- package/dist/_chunks/chat.js +244 -243
- package/dist/_chunks/chat.js.map +1 -1
- package/dist/_chunks/image-preview.js +71 -70
- package/dist/_chunks/image-preview.js.map +1 -1
- package/dist/_chunks/motion-preference.js +15 -0
- package/dist/_chunks/motion-preference.js.map +1 -0
- package/dist/_chunks/motion-provider.js +1 -1
- package/dist/_chunks/motion-provider.js.map +1 -1
- package/dist/_chunks/popover.js +50 -49
- package/dist/_chunks/popover.js.map +1 -1
- package/dist/_chunks/primitives-internal.js +29 -29
- package/dist/_chunks/primitives-internal.js.map +1 -1
- package/dist/_chunks/shared.js +48 -47
- package/dist/_chunks/shared.js.map +1 -1
- package/dist/_chunks/success.js +34 -34
- package/dist/_chunks/tree-view.js +1 -1
- package/dist/_chunks/tree-view.js.map +1 -1
- package/dist/ai/block-renderer.js +8 -8
- package/dist/ai/command-bar.js +65 -65
- package/dist/ai/command-bar.js.map +1 -1
- package/dist/ai/conversation.js +35 -35
- package/dist/ai/conversation.js.map +1 -1
- package/dist/ai/index.js +4 -4
- package/dist/composed/activity-feed.d.ts.map +1 -1
- package/dist/composed/activity-feed.js +108 -107
- package/dist/composed/activity-feed.js.map +1 -1
- package/dist/composed/command-palette.js +137 -137
- package/dist/composed/command-palette.js.map +1 -1
- package/dist/composed/content-card.js +1 -1
- package/dist/composed/content-card.js.map +1 -1
- package/dist/composed/date-picker/index.js +5 -5
- package/dist/composed/date-picker/index.js.map +1 -1
- package/dist/composed/empty-state.js +4 -4
- package/dist/composed/file-preview/image-preview.d.ts.map +1 -1
- package/dist/composed/file-preview/shared.d.ts.map +1 -1
- package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
- package/dist/composed/file-preview.js +151 -150
- package/dist/composed/file-preview.js.map +1 -1
- package/dist/composed/filter-bar.d.ts.map +1 -1
- package/dist/composed/filter-bar.js +53 -52
- package/dist/composed/filter-bar.js.map +1 -1
- package/dist/composed/form-section.d.ts.map +1 -1
- package/dist/composed/form-section.js +38 -37
- package/dist/composed/form-section.js.map +1 -1
- package/dist/composed/master-detail.d.ts.map +1 -1
- package/dist/composed/master-detail.js +1 -1
- package/dist/composed/master-detail.js.map +1 -1
- package/dist/composed/multi-select-popover.d.ts.map +1 -1
- package/dist/composed/multi-select-popover.js +109 -108
- package/dist/composed/multi-select-popover.js.map +1 -1
- package/dist/composed/rich-chat-input/attachment-strip.d.ts.map +1 -1
- package/dist/composed/rich-chat-input/reply-banner.d.ts.map +1 -1
- package/dist/composed/rich-chat-input/schedule-send.d.ts.map +1 -1
- package/dist/composed/rich-chat-input.d.ts.map +1 -1
- package/dist/composed/rich-chat-input.js +467 -466
- package/dist/composed/rich-chat-input.js.map +1 -1
- package/dist/composed/rich-text-editor.js +3 -3
- package/dist/composed/rich-text-editor.js.map +1 -1
- package/dist/composed/schedule-view.js +2 -2
- package/dist/composed/schedule-view.js.map +1 -1
- package/dist/composed/status-badge.d.ts.map +1 -1
- package/dist/composed/status-badge.js +29 -28
- package/dist/composed/status-badge.js.map +1 -1
- package/dist/motion/index.d.ts +1 -0
- package/dist/motion/index.d.ts.map +1 -1
- package/dist/motion/index.js +2 -15
- package/dist/motion/motion-preference.d.ts +36 -0
- package/dist/motion/motion-preference.d.ts.map +1 -0
- package/dist/motion/motion-provider.d.ts +2 -1
- package/dist/motion/motion-provider.d.ts.map +1 -1
- package/dist/motion/primitives-index.js +103 -102
- package/dist/motion/primitives-index.js.map +1 -1
- package/dist/motion/primitives.d.ts.map +1 -1
- package/dist/shell/bottom-navbar.js +19 -19
- package/dist/shell/bottom-navbar.js.map +1 -1
- package/dist/shell/index.d.ts +1 -1
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/notification-center.d.ts +17 -0
- package/dist/shell/notification-center.d.ts.map +1 -1
- package/dist/shell/notification-center.js +109 -104
- package/dist/shell/notification-center.js.map +1 -1
- package/dist/shell/notification-preferences.js +1 -1
- package/dist/shell/notification-preferences.js.map +1 -1
- package/dist/shell/top-bar.js +1 -1
- package/dist/shell/top-bar.js.map +1 -1
- package/dist/tokens/index.css +1 -0
- package/dist/tokens/palettes.css +292 -0
- package/dist/tokens/semantic.css +72 -8
- package/dist/tokens/shilp-sutra.css +1 -0
- package/dist/tokens/utilities.css +10 -7
- package/dist/ui/accordion.d.ts.map +1 -1
- package/dist/ui/accordion.js +27 -26
- package/dist/ui/accordion.js.map +1 -1
- package/dist/ui/alert-dialog.d.ts.map +1 -1
- package/dist/ui/alert-dialog.js +60 -59
- package/dist/ui/alert-dialog.js.map +1 -1
- package/dist/ui/alert.d.ts.map +1 -1
- package/dist/ui/alert.js +55 -113
- package/dist/ui/alert.js.map +1 -1
- package/dist/ui/autocomplete.js +80 -80
- package/dist/ui/autocomplete.js.map +1 -1
- package/dist/ui/avatar.d.ts.map +1 -1
- package/dist/ui/avatar.js +69 -68
- package/dist/ui/avatar.js.map +1 -1
- package/dist/ui/badge-indicator.d.ts +4 -8
- package/dist/ui/badge-indicator.d.ts.map +1 -1
- package/dist/ui/badge-indicator.js +3 -8
- package/dist/ui/badge-indicator.js.map +1 -1
- package/dist/ui/badge.d.ts +8 -1
- package/dist/ui/badge.d.ts.map +1 -1
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +42 -40
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/button-group.d.ts.map +1 -1
- package/dist/ui/button-group.js +3 -23
- package/dist/ui/button-group.js.map +1 -1
- package/dist/ui/button.d.ts +10 -1
- package/dist/ui/button.d.ts.map +1 -1
- package/dist/ui/button.js +79 -212
- package/dist/ui/button.js.map +1 -1
- package/dist/ui/card.d.ts.map +1 -1
- package/dist/ui/card.js +75 -72
- package/dist/ui/card.js.map +1 -1
- package/dist/ui/charts/radar-chart.d.ts.map +1 -1
- package/dist/ui/charts/radar-chart.js +1 -1
- package/dist/ui/charts/radar-chart.js.map +1 -1
- package/dist/ui/chat/message-list.d.ts.map +1 -1
- package/dist/ui/chat/message.d.ts.map +1 -1
- package/dist/ui/chat/typing-indicator.d.ts.map +1 -1
- package/dist/ui/code.js +1 -1
- package/dist/ui/code.js.map +1 -1
- package/dist/ui/color-input.d.ts.map +1 -1
- package/dist/ui/color-input.js +151 -150
- package/dist/ui/color-input.js.map +1 -1
- package/dist/ui/combobox.d.ts +14 -0
- package/dist/ui/combobox.d.ts.map +1 -1
- package/dist/ui/combobox.js +152 -148
- package/dist/ui/combobox.js.map +1 -1
- package/dist/ui/context-menu.d.ts.map +1 -1
- package/dist/ui/context-menu.js +70 -69
- package/dist/ui/context-menu.js.map +1 -1
- package/dist/ui/data-table-body.js +2 -2
- package/dist/ui/data-table-body.js.map +1 -1
- package/dist/ui/data-table-context.js +2 -2
- package/dist/ui/data-table-context.js.map +1 -1
- package/dist/ui/data-table-header.d.ts.map +1 -1
- package/dist/ui/data-table-header.js +41 -40
- package/dist/ui/data-table-header.js.map +1 -1
- package/dist/ui/data-table-pagination.js +2 -2
- package/dist/ui/data-table-pagination.js.map +1 -1
- package/dist/ui/dialog.d.ts.map +1 -1
- package/dist/ui/dialog.js +61 -60
- package/dist/ui/dialog.js.map +1 -1
- package/dist/ui/dot.d.ts.map +1 -1
- package/dist/ui/dot.js +10 -41
- package/dist/ui/dot.js.map +1 -1
- package/dist/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/ui/dropdown-menu.js +79 -78
- package/dist/ui/dropdown-menu.js.map +1 -1
- package/dist/ui/file-upload.d.ts.map +1 -1
- package/dist/ui/file-upload.js +116 -115
- package/dist/ui/file-upload.js.map +1 -1
- package/dist/ui/form.d.ts.map +1 -1
- package/dist/ui/form.js +27 -26
- package/dist/ui/form.js.map +1 -1
- package/dist/ui/hover-card.d.ts.map +1 -1
- package/dist/ui/hover-card.js +26 -25
- package/dist/ui/hover-card.js.map +1 -1
- package/dist/ui/icon.js +7 -7
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +3 -3
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/input.js +1 -1
- package/dist/ui/input.js.map +1 -1
- package/dist/ui/menubar.d.ts.map +1 -1
- package/dist/ui/menubar.js +73 -72
- package/dist/ui/menubar.js.map +1 -1
- package/dist/ui/navigation-menu.d.ts.map +1 -1
- package/dist/ui/navigation-menu.js +80 -79
- package/dist/ui/navigation-menu.js.map +1 -1
- package/dist/ui/popover.d.ts.map +1 -1
- package/dist/ui/progress.d.ts.map +1 -1
- package/dist/ui/progress.js +72 -68
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/radio.d.ts.map +1 -1
- package/dist/ui/radio.js +32 -31
- package/dist/ui/radio.js.map +1 -1
- package/dist/ui/search-input.d.ts.map +1 -1
- package/dist/ui/search-input.js +28 -27
- package/dist/ui/search-input.js.map +1 -1
- package/dist/ui/select.d.ts.map +1 -1
- package/dist/ui/select.js +64 -63
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/sidebar.d.ts.map +1 -1
- package/dist/ui/sidebar.js +4 -4
- package/dist/ui/sidebar.js.map +1 -1
- package/dist/ui/slider.d.ts +63 -9
- package/dist/ui/slider.d.ts.map +1 -1
- package/dist/ui/slider.js +74 -32
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/split-button.d.ts +8 -2
- package/dist/ui/split-button.d.ts.map +1 -1
- package/dist/ui/split-button.js +49 -95
- package/dist/ui/split-button.js.map +1 -1
- package/dist/ui/stat-card.d.ts.map +1 -1
- package/dist/ui/stat-card.js +89 -88
- package/dist/ui/stat-card.js.map +1 -1
- package/dist/ui/stat-flash.js +16 -16
- package/dist/ui/stepper.d.ts.map +1 -1
- package/dist/ui/stepper.js +63 -62
- package/dist/ui/stepper.js.map +1 -1
- package/dist/ui/table.js +3 -3
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/tabs.d.ts.map +1 -1
- package/dist/ui/tabs.js +67 -66
- package/dist/ui/tabs.js.map +1 -1
- package/dist/ui/textarea.js +1 -1
- package/dist/ui/textarea.js.map +1 -1
- package/dist/ui/toast.d.ts.map +1 -1
- package/dist/ui/toast.js +195 -194
- package/dist/ui/toast.js.map +1 -1
- package/dist/ui/toggle.d.ts.map +1 -1
- package/dist/ui/toggle.js +24 -22
- package/dist/ui/toggle.js.map +1 -1
- package/dist/ui/tooltip.d.ts.map +1 -1
- package/dist/ui/tooltip.js +37 -36
- package/dist/ui/tooltip.js.map +1 -1
- package/dist/ui/tree-view/tree-item.d.ts.map +1 -1
- package/docs/recipes/customize-brand.md +58 -0
- package/docs/recipes/install-astro.md +1 -1
- package/docs/recipes/install-next-app-router.md +1 -1
- package/docs/recipes/install-next-pages.md +22 -1
- package/docs/recipes/install-remix.md +1 -1
- package/docs/recipes/install-tanstack-start.md +1 -1
- package/docs/recipes/install-vite.md +2 -1
- package/docs/recipes/server-components.md +7 -4
- package/docs/recipes/troubleshoot.md +1 -0
- package/llms.txt +1 -1
- package/mcp-manifest.json +9 -4
- package/package.json +3 -2
- package/skill/SKILL.md +1 -1
- package/skill/references/components.md +1 -1
- package/skill/references/customize-brand.md +58 -0
- package/skill/references/server-components.md +7 -4
- package/skill/references/setup-astro.md +1 -1
- package/skill/references/setup-next-app-router.md +1 -1
- package/skill/references/setup-next-pages.md +22 -1
- package/skill/references/setup-remix.md +1 -1
- package/skill/references/setup-tanstack-start.md +1 -1
- package/skill/references/setup-vite.md +2 -1
- package/skill/references/troubleshoot.md +1 -0
- package/dist/motion/check-motion-provider.d.ts +0 -2
- package/dist/motion/check-motion-provider.d.ts.map +0 -1
- package/dist/motion/index.js.map +0 -1
package/dist/_chunks/shared.js
CHANGED
|
@@ -1,36 +1,37 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { tweens as e } from "../ui/lib/motion.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { MotionPreference as t } from "./motion-preference.js";
|
|
4
|
+
import { cn as n } from "../ui/lib/utils.js";
|
|
5
|
+
import { Icon as r } from "../ui/icon.js";
|
|
6
|
+
import { Button as i } from "../ui/button.js";
|
|
7
|
+
import { Range as a, Root as o, Thumb as s, Track as c } from "./primitives/react-slider.js";
|
|
7
8
|
import "react";
|
|
8
|
-
import { jsx as
|
|
9
|
-
import { IconAlertTriangle as
|
|
10
|
-
import { motion as
|
|
9
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
10
|
+
import { IconAlertTriangle as d, IconDownload as f, IconVolume as p, IconVolumeOff as m } from "@tabler/icons-react";
|
|
11
|
+
import { motion as h } from "framer-motion";
|
|
11
12
|
//#region src/composed/file-preview/shared.tsx
|
|
12
|
-
function
|
|
13
|
-
return /* @__PURE__ */
|
|
13
|
+
function g({ message: e, url: t }) {
|
|
14
|
+
return /* @__PURE__ */ u("div", {
|
|
14
15
|
className: "flex flex-col items-center justify-center gap-ds-04 rounded-control border border-surface-border bg-surface-sunken p-ds-08 text-center",
|
|
15
16
|
children: [
|
|
16
|
-
/* @__PURE__ */
|
|
17
|
-
icon:
|
|
17
|
+
/* @__PURE__ */ l(r, {
|
|
18
|
+
icon: d,
|
|
18
19
|
size: "2xl",
|
|
19
20
|
className: "text-warning-9"
|
|
20
21
|
}),
|
|
21
|
-
/* @__PURE__ */
|
|
22
|
+
/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
|
|
22
23
|
className: "text-body-md font-semibold text-surface-fg",
|
|
23
24
|
children: "Preview unavailable"
|
|
24
|
-
}), /* @__PURE__ */
|
|
25
|
+
}), /* @__PURE__ */ l("p", {
|
|
25
26
|
className: "text-body-sm text-surface-fg-muted mt-ds-01",
|
|
26
27
|
children: e
|
|
27
28
|
})] }),
|
|
28
|
-
/* @__PURE__ */
|
|
29
|
+
/* @__PURE__ */ l(i, {
|
|
29
30
|
variant: "outline",
|
|
30
31
|
size: "xs",
|
|
31
|
-
startIcon: /* @__PURE__ */
|
|
32
|
+
startIcon: /* @__PURE__ */ l(r, { icon: f }),
|
|
32
33
|
asChild: !0,
|
|
33
|
-
children: /* @__PURE__ */
|
|
34
|
+
children: /* @__PURE__ */ l("a", {
|
|
34
35
|
href: t,
|
|
35
36
|
download: !0,
|
|
36
37
|
target: "_blank",
|
|
@@ -41,8 +42,8 @@ function h({ message: e, url: t }) {
|
|
|
41
42
|
]
|
|
42
43
|
});
|
|
43
44
|
}
|
|
44
|
-
function
|
|
45
|
-
return /* @__PURE__ */
|
|
45
|
+
function _({ children: r, className: i }) {
|
|
46
|
+
return /* @__PURE__ */ l(t, { children: /* @__PURE__ */ l(h.div, {
|
|
46
47
|
initial: {
|
|
47
48
|
opacity: 0,
|
|
48
49
|
y: 8
|
|
@@ -52,48 +53,48 @@ function g({ children: n, className: r }) {
|
|
|
52
53
|
y: 0
|
|
53
54
|
},
|
|
54
55
|
transition: e.fade,
|
|
55
|
-
className:
|
|
56
|
-
children:
|
|
57
|
-
});
|
|
56
|
+
className: n("flex items-center gap-ds-01 rounded-control bg-surface-overlay/95 px-ds-02 py-ds-01 shadow-floating backdrop-blur-xs", i),
|
|
57
|
+
children: r
|
|
58
|
+
}) });
|
|
58
59
|
}
|
|
59
|
-
function
|
|
60
|
-
return /* @__PURE__ */
|
|
60
|
+
function v() {
|
|
61
|
+
return /* @__PURE__ */ l("div", { className: "mx-ds-01 h-4 w-px bg-surface-border-subtle" });
|
|
61
62
|
}
|
|
62
|
-
function
|
|
63
|
+
function y({ value: e, max: t = 100, step: r = 1, onValueChange: i, tone: d = "light", ariaLabel: f, disabled: p, className: m }) {
|
|
63
64
|
let h = d === "dark";
|
|
64
|
-
return /* @__PURE__ */
|
|
65
|
-
className:
|
|
65
|
+
return /* @__PURE__ */ u(o, {
|
|
66
|
+
className: n("group/ms relative flex h-3 w-full cursor-pointer touch-none select-none items-center", m),
|
|
66
67
|
value: [e],
|
|
67
|
-
max:
|
|
68
|
+
max: t,
|
|
68
69
|
step: r,
|
|
69
70
|
disabled: p,
|
|
70
|
-
onValueChange: (e) =>
|
|
71
|
+
onValueChange: (e) => i(e[0] ?? 0),
|
|
71
72
|
"aria-label": f,
|
|
72
|
-
children: [/* @__PURE__ */ c
|
|
73
|
-
className:
|
|
74
|
-
children: /* @__PURE__ */
|
|
75
|
-
}), /* @__PURE__ */
|
|
73
|
+
children: [/* @__PURE__ */ l(c, {
|
|
74
|
+
className: n("relative h-1 w-full grow overflow-hidden rounded-pill", h ? "bg-white/30" : "bg-surface-sunken"),
|
|
75
|
+
children: /* @__PURE__ */ l(a, { className: n("absolute h-full rounded-pill", h ? "bg-white" : "bg-accent-9") })
|
|
76
|
+
}), /* @__PURE__ */ l(s, { className: n("block h-3 w-3 rounded-pill shadow-raised outline-hidden transition-[opacity,transform] duration-fast-02", "opacity-0 group-hover/ms:opacity-100 focus:opacity-100 active:scale-110", "focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-1", h ? "bg-white focus-visible:ring-white" : "bg-accent-9 focus-visible:ring-accent-9") })]
|
|
76
77
|
});
|
|
77
78
|
}
|
|
78
|
-
function
|
|
79
|
-
let s =
|
|
80
|
-
return /* @__PURE__ */
|
|
79
|
+
function b({ volume: e, muted: t, onVolumeChange: i, onMuteToggle: a, variant: o = "light" }) {
|
|
80
|
+
let s = t ? 0 : e;
|
|
81
|
+
return /* @__PURE__ */ u("div", {
|
|
81
82
|
className: "flex items-center gap-ds-02 shrink-0 group/vol",
|
|
82
|
-
children: [/* @__PURE__ */
|
|
83
|
+
children: [/* @__PURE__ */ l("button", {
|
|
83
84
|
onClick: a,
|
|
84
|
-
className:
|
|
85
|
-
"aria-label":
|
|
86
|
-
title:
|
|
87
|
-
children:
|
|
88
|
-
icon:
|
|
85
|
+
className: n("transition-colors", o === "dark" ? "text-white hover:text-white/80" : "text-surface-fg-muted hover:text-surface-fg"),
|
|
86
|
+
"aria-label": t ? "Unmute (M)" : "Mute (M)",
|
|
87
|
+
title: t ? "Unmute" : "Mute",
|
|
88
|
+
children: t || e === 0 ? /* @__PURE__ */ l(r, {
|
|
89
|
+
icon: m,
|
|
89
90
|
size: "sm"
|
|
90
|
-
}) : /* @__PURE__ */
|
|
91
|
-
icon:
|
|
91
|
+
}) : /* @__PURE__ */ l(r, {
|
|
92
|
+
icon: p,
|
|
92
93
|
size: "sm"
|
|
93
94
|
})
|
|
94
|
-
}), /* @__PURE__ */
|
|
95
|
+
}), /* @__PURE__ */ l("div", {
|
|
95
96
|
className: "flex w-0 items-center overflow-hidden transition-[width] duration-200 ease-productive-standard group-hover/vol:w-20 focus-within:w-20",
|
|
96
|
-
children: /* @__PURE__ */
|
|
97
|
+
children: /* @__PURE__ */ l(y, {
|
|
97
98
|
value: s,
|
|
98
99
|
max: 1,
|
|
99
100
|
step: .01,
|
|
@@ -104,10 +105,10 @@ function y({ volume: e, muted: r, onVolumeChange: i, onMuteToggle: a, variant: o
|
|
|
104
105
|
})]
|
|
105
106
|
});
|
|
106
107
|
}
|
|
107
|
-
function
|
|
108
|
+
function x(e) {
|
|
108
109
|
if (!isFinite(e) || e < 0) return "0:00";
|
|
109
110
|
let t = Math.floor(e / 3600), n = Math.floor(e % 3600 / 60), r = Math.floor(e % 60);
|
|
110
111
|
return t > 0 ? `${t}:${n.toString().padStart(2, "0")}:${r.toString().padStart(2, "0")}` : `${n}:${r.toString().padStart(2, "0")}`;
|
|
111
112
|
}
|
|
112
113
|
//#endregion
|
|
113
|
-
export {
|
|
114
|
+
export { g as ErrorFallback, y as MediaSlider, _ as Toolbar, v as ToolbarDivider, b as VolumeControl, x as formatTime };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","names":[],"sources":["../../src/composed/file-preview/shared.tsx"],"sourcesContent":["'use client'\n\nimport * as SliderPrimitive from '@primitives/react-slider'\nimport {\n IconAlertTriangle,\n IconDownload,\n IconVolume,\n IconVolumeOff,\n} from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { Button } from '../../ui/button'\nimport { Icon } from '../../ui/icon'\nimport { tweens } from '../../ui/lib/motion'\nimport { cn } from '../../ui/lib/utils'\n\n// ============================================================\n// Shared: Error Fallback\n// ============================================================\n\nexport function ErrorFallback({ message, url }: { message: string; url: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-ds-04 rounded-control border border-surface-border bg-surface-sunken p-ds-08 text-center\">\n <Icon icon={IconAlertTriangle} size=\"2xl\" className=\"text-warning-9\" />\n <div>\n <p className=\"text-body-md font-semibold text-surface-fg\">Preview unavailable</p>\n <p className=\"text-body-sm text-surface-fg-muted mt-ds-01\">{message}</p>\n </div>\n <Button variant=\"outline\" size=\"xs\" startIcon={<Icon icon={IconDownload} />} asChild>\n <a href={url} download target=\"_blank\" rel=\"noopener noreferrer\">Download file</a>\n </Button>\n </div>\n )\n}\n\n// ============================================================\n// Shared: Floating Toolbar\n// ============================================================\n\nexport function Toolbar({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <motion.div\n
|
|
1
|
+
{"version":3,"file":"shared.js","names":[],"sources":["../../src/composed/file-preview/shared.tsx"],"sourcesContent":["'use client'\n\nimport * as SliderPrimitive from '@primitives/react-slider'\nimport {\n IconAlertTriangle,\n IconDownload,\n IconVolume,\n IconVolumeOff,\n} from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { MotionPreference } from '../../motion/motion-preference'\nimport { Button } from '../../ui/button'\nimport { Icon } from '../../ui/icon'\nimport { tweens } from '../../ui/lib/motion'\nimport { cn } from '../../ui/lib/utils'\n\n// ============================================================\n// Shared: Error Fallback\n// ============================================================\n\nexport function ErrorFallback({ message, url }: { message: string; url: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-ds-04 rounded-control border border-surface-border bg-surface-sunken p-ds-08 text-center\">\n <Icon icon={IconAlertTriangle} size=\"2xl\" className=\"text-warning-9\" />\n <div>\n <p className=\"text-body-md font-semibold text-surface-fg\">Preview unavailable</p>\n <p className=\"text-body-sm text-surface-fg-muted mt-ds-01\">{message}</p>\n </div>\n <Button variant=\"outline\" size=\"xs\" startIcon={<Icon icon={IconDownload} />} asChild>\n <a href={url} download target=\"_blank\" rel=\"noopener noreferrer\">Download file</a>\n </Button>\n </div>\n )\n}\n\n// ============================================================\n// Shared: Floating Toolbar\n// ============================================================\n\nexport function Toolbar({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <MotionPreference>\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={tweens.fade}\n className={cn(\n 'flex items-center gap-ds-01 rounded-control bg-surface-overlay/95 px-ds-02 py-ds-01 shadow-floating backdrop-blur-xs',\n className,\n )}\n >\n {children}\n </motion.div>\n </MotionPreference>\n )\n}\n\nexport function ToolbarDivider() {\n return <div className=\"mx-ds-01 h-4 w-px bg-surface-border-subtle\" />\n}\n\n// ============================================================\n// Shared: MediaSlider — slim seek/scrub/volume control\n// Composes the Radix Slider primitive (the same one ui/Slider uses) so it's\n// keyboard-operable (Arrow/Home/End), shows a visible focus ring, and forced-colors-safe —\n// unlike the old mouse-only <div role=\"slider\">. Styled slim for media chrome;\n// the thumb is hover/focus-reveal (hidden at rest, shown on hover, drag, or\n// keyboard focus). `tone=\"dark\"` = white-on-overlay; `tone=\"light\"` = accent.\n// ============================================================\n\nexport function MediaSlider({\n value,\n max = 100,\n step = 1,\n onValueChange,\n tone = 'light',\n ariaLabel,\n disabled,\n className,\n}: {\n value: number\n max?: number\n step?: number\n onValueChange: (v: number) => void\n tone?: 'light' | 'dark'\n ariaLabel: string\n disabled?: boolean\n className?: string\n}) {\n const isDark = tone === 'dark'\n return (\n <SliderPrimitive.Root\n className={cn(\n 'group/ms relative flex h-3 w-full cursor-pointer touch-none select-none items-center',\n className,\n )}\n value={[value]}\n max={max}\n step={step}\n disabled={disabled}\n onValueChange={(vals) => onValueChange(vals[0] ?? 0)}\n aria-label={ariaLabel}\n >\n <SliderPrimitive.Track\n className={cn(\n 'relative h-1 w-full grow overflow-hidden rounded-pill',\n isDark ? 'bg-white/30' : 'bg-surface-sunken',\n )}\n >\n <SliderPrimitive.Range\n className={cn('absolute h-full rounded-pill', isDark ? 'bg-white' : 'bg-accent-9')}\n />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb\n className={cn(\n 'block h-3 w-3 rounded-pill shadow-raised outline-hidden transition-[opacity,transform] duration-fast-02',\n // hover/focus-reveal: hidden at rest, shown on hover, drag (focus), or keyboard\n 'opacity-0 group-hover/ms:opacity-100 focus:opacity-100 active:scale-110',\n 'focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-1',\n isDark ? 'bg-white focus-visible:ring-white' : 'bg-accent-9 focus-visible:ring-accent-9',\n )}\n />\n </SliderPrimitive.Root>\n )\n}\n\n// ============================================================\n// Shared: Volume Slider (Spotify/YouTube style)\n// ============================================================\n\nexport function VolumeControl({\n volume,\n muted,\n onVolumeChange,\n onMuteToggle,\n variant = 'light',\n}: {\n volume: number\n muted: boolean\n onVolumeChange: (v: number) => void\n onMuteToggle: () => void\n variant?: 'light' | 'dark'\n}) {\n const displayVolume = muted ? 0 : volume\n const isDark = variant === 'dark'\n const iconClass = isDark ? 'text-white hover:text-white/80' : 'text-surface-fg-muted hover:text-surface-fg'\n\n return (\n <div className=\"flex items-center gap-ds-02 shrink-0 group/vol\">\n <button onClick={onMuteToggle} className={cn('transition-colors', iconClass)} aria-label={muted ? 'Unmute (M)' : 'Mute (M)'} title={muted ? 'Unmute' : 'Mute'}>\n {muted || volume === 0 ? <Icon icon={IconVolumeOff} size=\"sm\" /> : <Icon icon={IconVolume} size=\"sm\" />}\n </button>\n <div className=\"flex w-0 items-center overflow-hidden transition-[width] duration-200 ease-productive-standard group-hover/vol:w-20 focus-within:w-20\">\n <MediaSlider\n value={displayVolume}\n max={1}\n step={0.01}\n onValueChange={onVolumeChange}\n tone={variant}\n ariaLabel=\"Volume\"\n />\n </div>\n </div>\n )\n}\n\n// ============================================================\n// Shared: Time Formatting\n// ============================================================\n\nexport function formatTime(s: number): string {\n if (!isFinite(s) || s < 0) return '0:00'\n const h = Math.floor(s / 3600)\n const m = Math.floor((s % 3600) / 60)\n const sec = Math.floor(s % 60)\n if (h > 0) return `${h}:${m.toString().padStart(2, '0')}:${sec.toString().padStart(2, '0')}`\n return `${m}:${sec.toString().padStart(2, '0')}`\n}\n"],"mappings":"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"}
|
package/dist/_chunks/success.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { durations as e, springs as t, tweens as n } from "../ui/lib/motion.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { useMotion as r } from "./motion-provider.js";
|
|
4
|
+
import { cn as i } from "../ui/lib/utils.js";
|
|
5
|
+
import { Icon as a } from "../ui/icon.js";
|
|
6
|
+
import { Alert as o } from "../ui/alert.js";
|
|
7
7
|
import { Skeleton as s } from "../ui/skeleton.js";
|
|
8
8
|
import { BadgeCompound as c } from "./badge-group.js";
|
|
9
9
|
import { Button as l } from "../ui/button.js";
|
|
@@ -45,29 +45,29 @@ function j(e, t, n) {
|
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
var M = C.memo(function({ data: e, confidence: n }) {
|
|
48
|
-
let { reducedMotion:
|
|
49
|
-
e.sortable && (
|
|
48
|
+
let { reducedMotion: a } = r(), [o, s] = C.useState(null), [c, l] = C.useState(null), u = C.useCallback((t) => {
|
|
49
|
+
e.sortable && (o === t ? c === "asc" ? l("desc") : c === "desc" && (s(null), l(null)) : (s(t), l("asc")));
|
|
50
50
|
}, [
|
|
51
51
|
e.sortable,
|
|
52
|
-
|
|
52
|
+
o,
|
|
53
53
|
c
|
|
54
|
-
]), d = e.columns ?? [], f = j(e.rows ?? [],
|
|
54
|
+
]), d = e.columns ?? [], f = j(e.rows ?? [], o, c);
|
|
55
55
|
return /* @__PURE__ */ w(S, {
|
|
56
56
|
confidence: n,
|
|
57
57
|
className: "overflow-x-auto",
|
|
58
58
|
children: /* @__PURE__ */ T(p, { children: [
|
|
59
59
|
e.caption && /* @__PURE__ */ w(h, { children: e.caption }),
|
|
60
60
|
/* @__PURE__ */ w(v, { children: /* @__PURE__ */ w(y, { children: d.map((t) => {
|
|
61
|
-
let n =
|
|
61
|
+
let n = o === t.key, r = e.sortable ? n ? c === "asc" ? "ascending" : "descending" : "none" : void 0;
|
|
62
62
|
return /* @__PURE__ */ w(_, {
|
|
63
63
|
role: "columnheader",
|
|
64
|
-
className:
|
|
64
|
+
className: i(t.variant === "number" && "text-right", e.sortable && "cursor-pointer select-none"),
|
|
65
65
|
tabIndex: e.sortable ? 0 : void 0,
|
|
66
66
|
onClick: e.sortable ? () => u(t.key) : void 0,
|
|
67
67
|
onKeyDown: e.sortable ? (e) => {
|
|
68
68
|
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), u(t.key));
|
|
69
69
|
} : void 0,
|
|
70
|
-
"aria-sort":
|
|
70
|
+
"aria-sort": r,
|
|
71
71
|
children: /* @__PURE__ */ T("span", {
|
|
72
72
|
className: "inline-flex items-center gap-1",
|
|
73
73
|
children: [
|
|
@@ -85,10 +85,10 @@ var M = C.memo(function({ data: e, confidence: n }) {
|
|
|
85
85
|
}, t.key);
|
|
86
86
|
}) }) }),
|
|
87
87
|
/* @__PURE__ */ w(m, { children: f.map((e, n) => {
|
|
88
|
-
let
|
|
89
|
-
return /* @__PURE__ */ w(
|
|
88
|
+
let r = typeof e.id == "string" || typeof e.id == "number" ? String(e.id) : `row-${n}`;
|
|
89
|
+
return /* @__PURE__ */ w(a ? "tr" : k.tr, {
|
|
90
90
|
className: "hover:bg-surface-panel-hover transition-colors",
|
|
91
|
-
...
|
|
91
|
+
...a ? {} : {
|
|
92
92
|
initial: {
|
|
93
93
|
opacity: 0,
|
|
94
94
|
y: 6
|
|
@@ -103,10 +103,10 @@ var M = C.memo(function({ data: e, confidence: n }) {
|
|
|
103
103
|
}
|
|
104
104
|
},
|
|
105
105
|
children: d.map((t) => /* @__PURE__ */ w(g, {
|
|
106
|
-
className:
|
|
106
|
+
className: i("text-body-sm py-ds-02b px-ds-04", t.variant === "number" && "text-right tabular-nums font-medium"),
|
|
107
107
|
children: A(e[t.key], t)
|
|
108
108
|
}, t.key))
|
|
109
|
-
},
|
|
109
|
+
}, r);
|
|
110
110
|
}) })
|
|
111
111
|
] })
|
|
112
112
|
});
|
|
@@ -161,7 +161,7 @@ N.displayName = "ConfirmBlock";
|
|
|
161
161
|
//#endregion
|
|
162
162
|
//#region src/ai/blocks/divider.tsx
|
|
163
163
|
var P = C.memo(function(e) {
|
|
164
|
-
let { reducedMotion: t } =
|
|
164
|
+
let { reducedMotion: t } = r();
|
|
165
165
|
return t ? /* @__PURE__ */ w(b, {}) : /* @__PURE__ */ w(k.div, {
|
|
166
166
|
initial: { scaleX: 0 },
|
|
167
167
|
animate: { scaleX: 1 },
|
|
@@ -174,7 +174,7 @@ P.displayName = "DividerBlock";
|
|
|
174
174
|
//#endregion
|
|
175
175
|
//#region src/ai/blocks/info.tsx
|
|
176
176
|
var F = C.memo(function({ data: e }) {
|
|
177
|
-
return /* @__PURE__ */ w(
|
|
177
|
+
return /* @__PURE__ */ w(o, {
|
|
178
178
|
color: "info",
|
|
179
179
|
variant: "subtle",
|
|
180
180
|
role: "status",
|
|
@@ -201,7 +201,7 @@ function L({ status: e }) {
|
|
|
201
201
|
switch (e) {
|
|
202
202
|
case "done": return /* @__PURE__ */ w("span", {
|
|
203
203
|
"data-testid": "step-icon-done",
|
|
204
|
-
children: /* @__PURE__ */ w(
|
|
204
|
+
children: /* @__PURE__ */ w(a, {
|
|
205
205
|
icon: D,
|
|
206
206
|
size: "sm",
|
|
207
207
|
className: "text-success-11"
|
|
@@ -210,7 +210,7 @@ function L({ status: e }) {
|
|
|
210
210
|
case "active": return /* @__PURE__ */ w(I, {});
|
|
211
211
|
case "error": return /* @__PURE__ */ w("span", {
|
|
212
212
|
"data-testid": "step-icon-error",
|
|
213
|
-
children: /* @__PURE__ */ w(
|
|
213
|
+
children: /* @__PURE__ */ w(a, {
|
|
214
214
|
icon: O,
|
|
215
215
|
size: "sm",
|
|
216
216
|
className: "text-error-11"
|
|
@@ -218,7 +218,7 @@ function L({ status: e }) {
|
|
|
218
218
|
});
|
|
219
219
|
default: return /* @__PURE__ */ w("span", {
|
|
220
220
|
"data-testid": "step-icon-pending",
|
|
221
|
-
children: /* @__PURE__ */ w(
|
|
221
|
+
children: /* @__PURE__ */ w(a, {
|
|
222
222
|
icon: E,
|
|
223
223
|
size: "sm",
|
|
224
224
|
className: "text-surface-fg-subtle opacity-50"
|
|
@@ -227,7 +227,7 @@ function L({ status: e }) {
|
|
|
227
227
|
}
|
|
228
228
|
}
|
|
229
229
|
var R = C.memo(function({ data: t }) {
|
|
230
|
-
let { reducedMotion: n } =
|
|
230
|
+
let { reducedMotion: n } = r(), a = n;
|
|
231
231
|
if (t.lines != null) {
|
|
232
232
|
let e = Math.max(1, t.lines);
|
|
233
233
|
return /* @__PURE__ */ T("div", {
|
|
@@ -237,7 +237,7 @@ var R = C.memo(function({ data: t }) {
|
|
|
237
237
|
className: "flex flex-col gap-2",
|
|
238
238
|
children: [Array.from({ length: e }).map((t, n) => /* @__PURE__ */ w(s, {
|
|
239
239
|
animation: "shimmer",
|
|
240
|
-
className:
|
|
240
|
+
className: i("h-4", n === e - 1 ? "w-3/5" : "w-full")
|
|
241
241
|
}, n)), /* @__PURE__ */ w("span", {
|
|
242
242
|
className: "sr-only",
|
|
243
243
|
children: "Loading"
|
|
@@ -251,7 +251,7 @@ var R = C.memo(function({ data: t }) {
|
|
|
251
251
|
className: "flex flex-col gap-2",
|
|
252
252
|
children: [t.steps.map((t, n) => /* @__PURE__ */ T(k.div, {
|
|
253
253
|
className: "flex items-center gap-2",
|
|
254
|
-
initial:
|
|
254
|
+
initial: a ? void 0 : {
|
|
255
255
|
opacity: 0,
|
|
256
256
|
x: -8
|
|
257
257
|
},
|
|
@@ -259,12 +259,12 @@ var R = C.memo(function({ data: t }) {
|
|
|
259
259
|
opacity: 1,
|
|
260
260
|
x: 0
|
|
261
261
|
},
|
|
262
|
-
transition:
|
|
262
|
+
transition: a ? { duration: 0 } : {
|
|
263
263
|
duration: e.moderate01b,
|
|
264
264
|
delay: n * .06
|
|
265
265
|
},
|
|
266
266
|
children: [/* @__PURE__ */ w(L, { status: t.status }), /* @__PURE__ */ w("span", {
|
|
267
|
-
className:
|
|
267
|
+
className: i("text-body-sm", t.status === "done" || t.status === "active" ? "text-surface-fg" : "text-surface-fg-subtle"),
|
|
268
268
|
children: t.label
|
|
269
269
|
})]
|
|
270
270
|
}, t.id)), /* @__PURE__ */ w("span", {
|
|
@@ -285,10 +285,10 @@ R.displayName = "LoadingBlock";
|
|
|
285
285
|
//#endregion
|
|
286
286
|
//#region src/ai/blocks/stat-row.tsx
|
|
287
287
|
var z = C.memo(function({ data: e }) {
|
|
288
|
-
let { reducedMotion: n } =
|
|
289
|
-
return
|
|
288
|
+
let { reducedMotion: n } = r(), i = e.stats ?? [];
|
|
289
|
+
return i.length === 0 ? null : /* @__PURE__ */ w("div", {
|
|
290
290
|
className: "flex flex-wrap gap-ds-05",
|
|
291
|
-
children:
|
|
291
|
+
children: i.map((e, r) => {
|
|
292
292
|
let i = e.change ? {
|
|
293
293
|
value: e.change.value,
|
|
294
294
|
direction: e.change.direction
|
|
@@ -323,8 +323,8 @@ var z = C.memo(function({ data: e }) {
|
|
|
323
323
|
z.displayName = "StatRowBlock";
|
|
324
324
|
//#endregion
|
|
325
325
|
//#region src/ai/blocks/success.tsx
|
|
326
|
-
var B = 5e3, V = C.memo(function({ data: e, blockId: t, confidence: n, onAction:
|
|
327
|
-
let { reducedMotion:
|
|
326
|
+
var B = 5e3, V = C.memo(function({ data: e, blockId: t, confidence: n, onAction: i }) {
|
|
327
|
+
let { reducedMotion: a } = r(), s = a, c = e.undoTimeout ?? B, [u, d] = C.useState(c), [f, p] = C.useState(!!e.undoable);
|
|
328
328
|
C.useEffect(() => {
|
|
329
329
|
if (!e.undoable) return;
|
|
330
330
|
let t = setInterval(() => {
|
|
@@ -336,11 +336,11 @@ var B = 5e3, V = C.memo(function({ data: e, blockId: t, confidence: n, onAction:
|
|
|
336
336
|
return () => clearInterval(t);
|
|
337
337
|
}, [e.undoable, c]);
|
|
338
338
|
let m = C.useCallback(() => {
|
|
339
|
-
|
|
340
|
-
}, [t,
|
|
339
|
+
i?.(t || "unknown", "undo");
|
|
340
|
+
}, [t, i]), h = Math.ceil(u / 1e3), g = 2 * Math.PI * 9;
|
|
341
341
|
return /* @__PURE__ */ T(S, {
|
|
342
342
|
confidence: n,
|
|
343
|
-
children: [/* @__PURE__ */ w(
|
|
343
|
+
children: [/* @__PURE__ */ w(o, {
|
|
344
344
|
color: "success",
|
|
345
345
|
variant: "subtle",
|
|
346
346
|
title: e.title,
|
|
@@ -175,7 +175,7 @@ var _ = a.forwardRef(({ itemId: o, label: s, icon: d, secondaryLabel: f, actions
|
|
|
175
175
|
onClick: w,
|
|
176
176
|
onKeyDown: E,
|
|
177
177
|
style: { paddingLeft: `calc(${_} * var(--spacing-ds-05b) + var(--spacing-ds-03))` },
|
|
178
|
-
className: t("flex items-center gap-ds-02 py-ds-02 px-ds-02 rounded-control cursor-pointer transition-colors duration-fast-01", "hover:bg-surface-panel-hover", "focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9", C && "bg-accent-
|
|
178
|
+
className: t("flex items-center gap-ds-02 py-ds-02 px-ds-02 rounded-control cursor-pointer transition-colors duration-fast-01", !C && "hover:bg-surface-panel-hover", "focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9", C && "bg-accent-4 text-accent-11 hover:bg-accent-5", h && "opacity-action-disabled cursor-not-allowed pointer-events-none", v),
|
|
179
179
|
children: [
|
|
180
180
|
x ? /* @__PURE__ */ c("button", {
|
|
181
181
|
type: "button",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-view.js","names":[],"sources":["../../src/ui/tree-view/use-tree.ts","../../src/ui/tree-view/tree-view.tsx","../../src/ui/tree-view/tree-item.tsx"],"sourcesContent":["import { useCallback,useState } from 'react'\n\nimport type { IconInput } from '../lib/icon-input'\n\nexport interface TreeNode {\n id: string\n label: string\n icon?: IconInput\n children?: TreeNode[]\n disabled?: boolean\n}\n\ninterface UseTreeOptions {\n defaultExpanded?: string[]\n defaultSelected?: string[]\n multiSelect?: boolean\n onSelect?: (selectedIds: string[]) => void\n onExpand?: (expandedIds: string[]) => void\n}\n\nexport function useTree(options: UseTreeOptions = {}) {\n const { defaultExpanded, defaultSelected, multiSelect, onSelect, onExpand } = options\n\n const [expanded, setExpanded] = useState<Set<string>>(\n new Set(defaultExpanded ?? []),\n )\n const [selected, setSelected] = useState<Set<string>>(\n new Set(defaultSelected ?? []),\n )\n\n const toggle = useCallback(\n (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onExpand?.(Array.from(next))\n return next\n })\n },\n [onExpand],\n )\n\n const select = useCallback(\n (id: string, event?: React.MouseEvent) => {\n setSelected((prev) => {\n let next: Set<string>\n if (multiSelect && event?.ctrlKey) {\n next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n } else {\n next = new Set([id])\n }\n onSelect?.(Array.from(next))\n return next\n })\n },\n [multiSelect, onSelect],\n )\n\n return {\n expanded,\n selected,\n toggle,\n select,\n isExpanded: (id: string) => expanded.has(id),\n isSelected: (id: string) => selected.has(id),\n expandAll: (ids: string[]) => setExpanded(new Set(ids)),\n collapseAll: () => setExpanded(new Set()),\n }\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { TreeItem } from './tree-item'\nimport { type TreeNode,useTree } from './use-tree'\n\n// ─── Context ────────────────────────────────────────────────────────\ninterface TreeContextValue {\n tree: ReturnType<typeof useTree>\n checkboxes: boolean\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null)\n\nexport function useTreeContext() {\n const ctx = React.useContext(TreeContext)\n if (!ctx) {\n throw new Error('TreeItem must be used within a <TreeView>')\n }\n return ctx\n}\n\n// ─── Props ──────────────────────────────────────────────────────────\nexport interface TreeViewProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n /** Data-driven mode: pass items array */\n items?: TreeNode[]\n /** Initially expanded node IDs */\n defaultExpanded?: string[]\n /** Initially selected node IDs */\n defaultSelected?: string[]\n /** Enable multi-select */\n multiSelect?: boolean\n /** Show checkboxes before each item */\n checkboxes?: boolean\n /** Called when selection changes */\n onSelect?: (ids: string[]) => void\n /** Called when expansion changes */\n onExpand?: (ids: string[]) => void\n className?: string\n /** Declarative mode: render TreeItem children directly */\n children?: React.ReactNode\n}\n\n// ─── Render nodes recursively (data-driven mode) ───────────────────\nfunction renderNodes(nodes: TreeNode[], depth: number = 0): React.ReactNode {\n return nodes.map((node) => (\n <TreeItem\n key={node.id}\n itemId={node.id}\n label={node.label}\n icon={node.icon}\n disabled={node.disabled}\n depth={depth}\n >\n {node.children && node.children.length > 0\n ? renderNodes(node.children, depth + 1)\n : undefined}\n </TreeItem>\n ))\n}\n\n// ─── Helper: collect all visible item IDs ───────────────────────────\nfunction getVisibleItemElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>('[data-tree-item]'),\n ).filter((el) => {\n // Items inside collapsed groups should not be focusable\n let parent = el.parentElement\n while (parent && parent !== container) {\n if (parent.getAttribute('role') === 'group') {\n const grid = parent.parentElement\n if (grid && grid.classList.contains('grid-rows-[0fr]')) {\n return false\n }\n }\n parent = parent.parentElement\n }\n return true\n })\n}\n\n// ─── Component ──────────────────────────────────────────────────────\nconst TreeView = React.forwardRef<HTMLUListElement, TreeViewProps>(\n (\n {\n items,\n defaultExpanded,\n defaultSelected,\n multiSelect = false,\n checkboxes = false,\n onSelect,\n onExpand,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const tree = useTree({\n defaultExpanded,\n defaultSelected,\n multiSelect,\n onSelect,\n onExpand,\n })\n\n const innerRef = React.useRef<HTMLUListElement>(null)\n const containerRef = (ref as React.RefObject<HTMLUListElement>) ?? innerRef\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLUListElement>) => {\n const container = containerRef.current\n if (!container) return\n\n const visibleItems = getVisibleItemElements(container)\n const currentIndex = visibleItems.findIndex(\n (el) => el === document.activeElement,\n )\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n const next = visibleItems[currentIndex + 1]\n next?.focus()\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n const prev = visibleItems[currentIndex - 1]\n prev?.focus()\n break\n }\n case 'ArrowRight': {\n // Handled in TreeItem for expand; if already expanded, move to first child\n const current = visibleItems[currentIndex]\n if (current) {\n const itemId = current.getAttribute('data-tree-item')\n if (itemId && tree.isExpanded(itemId)) {\n e.preventDefault()\n const nextItem = visibleItems[currentIndex + 1]\n nextItem?.focus()\n }\n }\n break\n }\n case 'ArrowLeft': {\n // Handled in TreeItem for collapse; if already collapsed or leaf, move to parent\n const current = visibleItems[currentIndex]\n if (current) {\n const itemId = current.getAttribute('data-tree-item')\n const treeItem = current.closest('[role=\"treeitem\"]')\n const parentGroup = treeItem?.parentElement?.closest(\n '[role=\"treeitem\"]',\n )\n if (itemId && !tree.isExpanded(itemId) && parentGroup) {\n e.preventDefault()\n const parentRow = parentGroup.querySelector<HTMLElement>(\n '[data-tree-item]',\n )\n parentRow?.focus()\n }\n }\n break\n }\n case 'Home': {\n e.preventDefault()\n visibleItems[0]?.focus()\n break\n }\n case 'End': {\n e.preventDefault()\n visibleItems[visibleItems.length - 1]?.focus()\n break\n }\n }\n }\n\n const ctxValue = React.useMemo<TreeContextValue>(\n () => ({ tree, checkboxes }),\n [tree, checkboxes],\n )\n\n const content = items ? renderNodes(items) : children\n\n return (\n <TreeContext.Provider value={ctxValue}>\n <ul\n ref={containerRef}\n role=\"tree\"\n aria-multiselectable={multiSelect || undefined}\n onKeyDown={handleKeyDown}\n className={cn('m-0 list-none p-0', className)}\n {...props}\n >\n {content}\n </ul>\n </TreeContext.Provider>\n )\n },\n)\nTreeView.displayName = 'TreeView'\n\nexport { TreeView }\n","'use client'\n\nimport { IconChevronRight } from '@tabler/icons-react'\nimport * as React from 'react'\n\nimport { Checkbox } from '../checkbox'\nimport { Icon } from '../icon'\nimport { IconProvider } from '../icon-context'\nimport type { IconInput } from '../lib/icon-input'\nimport { normalizeIcon } from '../lib/normalize-icon'\nimport { cn } from '../lib/utils'\nimport { useTreeContext } from './tree-view'\n\nexport interface TreeItemProps {\n /** Unique identifier for this tree item */\n itemId: string\n /** Primary label content */\n label: React.ReactNode\n /** Optional icon rendered before the label. Accepts any `IconInput`. */\n icon?: IconInput\n /** Secondary label rendered after the primary label */\n secondaryLabel?: React.ReactNode\n /** Action buttons rendered at the end of the row */\n actions?: React.ReactNode\n /** Whether this item is disabled */\n disabled?: boolean\n /** Nested tree items */\n children?: React.ReactNode\n /** Depth level (used internally) */\n depth?: number\n /** Additional CSS class names */\n className?: string\n}\n\nconst TreeItem = React.forwardRef<HTMLLIElement, TreeItemProps>(\n (\n {\n itemId,\n label,\n icon,\n secondaryLabel,\n actions,\n disabled = false,\n children,\n depth = 0,\n className,\n },\n ref,\n ) => {\n const ctx = useTreeContext()\n const hasChildren = React.Children.count(children) > 0\n const isExpanded = ctx.tree.isExpanded(itemId)\n const isSelected = ctx.tree.isSelected(itemId)\n\n const handleRowClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n ctx.tree.select(itemId, e)\n }\n\n const handleChevronClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n if (disabled) return\n ctx.tree.toggle(itemId)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n ctx.tree.select(itemId)\n }\n if (e.key === 'ArrowRight' && hasChildren && !isExpanded) {\n e.preventDefault()\n e.stopPropagation()\n ctx.tree.toggle(itemId)\n }\n if (e.key === 'ArrowLeft' && hasChildren && isExpanded) {\n e.preventDefault()\n e.stopPropagation()\n ctx.tree.toggle(itemId)\n }\n }\n\n // Compute indeterminate state for checkbox mode\n const checkboxState = React.useMemo(() => {\n if (!ctx.checkboxes || !hasChildren) {\n return { checked: isSelected, indeterminate: false }\n }\n // Collect all descendant IDs\n const descendants: string[] = []\n const collectIds = (nodes: React.ReactNode) => {\n React.Children.forEach(nodes, (child) => {\n if (React.isValidElement<TreeItemProps>(child) && child.props.itemId) {\n descendants.push(child.props.itemId)\n if (child.props.children) {\n collectIds(child.props.children)\n }\n }\n })\n }\n collectIds(children)\n const selectedCount = descendants.filter((id) =>\n ctx.tree.isSelected(id),\n ).length\n if (selectedCount === 0 && !isSelected) {\n return { checked: false, indeterminate: false }\n }\n if (selectedCount === descendants.length) {\n return { checked: true, indeterminate: false }\n }\n return { checked: false, indeterminate: true }\n }, [ctx.checkboxes, hasChildren, children, isSelected, ctx.tree])\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-selected={isSelected}\n aria-level={depth + 1}\n aria-disabled={disabled || undefined}\n className=\"list-none\"\n >\n {/* Row */}\n <div\n role=\"presentation\"\n data-tree-item={itemId}\n tabIndex={disabled ? -1 : 0}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n style={{ paddingLeft: `calc(${depth} * var(--spacing-ds-05b) + var(--spacing-ds-03))` }}\n className={cn(\n 'flex items-center gap-ds-02 py-ds-02 px-ds-02 rounded-control cursor-pointer transition-colors duration-fast-01',\n 'hover:bg-surface-panel-hover',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9',\n isSelected &&\n 'bg-accent-3 text-accent-11',\n disabled && 'opacity-action-disabled cursor-not-allowed pointer-events-none',\n className,\n )}\n >\n {/* Expand chevron */}\n {hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onClick={handleChevronClick}\n className=\"flex shrink-0 items-center justify-center p-0 border-0 bg-transparent cursor-pointer\"\n >\n <Icon\n icon={IconChevronRight}\n size=\"sm\"\n className={cn(\n 'transition-transform duration-moderate-02',\n isExpanded && 'rotate-90',\n )}\n />\n </button>\n ) : (\n <span className=\"inline-block w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n\n {/* Checkbox (optional) */}\n {ctx.checkboxes && (\n <Checkbox\n checked={checkboxState.checked}\n indeterminate={checkboxState.indeterminate}\n disabled={disabled}\n tabIndex={-1}\n onClick={(e) => e.stopPropagation()}\n onCheckedChange={() => {\n if (!disabled) ctx.tree.select(itemId)\n }}\n className=\"shrink-0\"\n />\n )}\n\n {/* Icon */}\n {icon && (\n <span className=\"flex shrink-0 items-center text-surface-fg-subtle\">\n <IconProvider size=\"sm\">{normalizeIcon(icon)}</IconProvider>\n </span>\n )}\n\n {/* Label */}\n <span className=\"min-w-0 truncate text-body-sm\">{label}</span>\n\n {/* Secondary label */}\n {secondaryLabel && (\n <span className=\"ml-auto truncate text-caption text-surface-fg-muted\">\n {secondaryLabel}\n </span>\n )}\n\n {/* Actions */}\n {actions && (\n <span\n className=\"ml-auto flex shrink-0 items-center gap-ds-01\"\n onClick={(e) => e.stopPropagation()}\n role=\"presentation\"\n >\n {actions}\n </span>\n )}\n </div>\n\n {/* Children (collapsible) */}\n {hasChildren && (\n <div\n role=\"group\"\n className={cn(\n 'grid transition-[grid-template-rows] duration-moderate-02 ease-productive-standard',\n isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n )}\n >\n <ul role=\"group\" className=\"overflow-hidden m-0 p-0\">\n {React.Children.map(children, (child) => {\n if (React.isValidElement<TreeItemProps>(child)) {\n return React.cloneElement(child, {\n depth: depth + 1,\n })\n }\n return child\n })}\n </ul>\n </div>\n )}\n </li>\n )\n },\n)\nTreeItem.displayName = 'TreeItem'\n\nexport { TreeItem }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tree-view.js","names":[],"sources":["../../src/ui/tree-view/use-tree.ts","../../src/ui/tree-view/tree-view.tsx","../../src/ui/tree-view/tree-item.tsx"],"sourcesContent":["import { useCallback,useState } from 'react'\n\nimport type { IconInput } from '../lib/icon-input'\n\nexport interface TreeNode {\n id: string\n label: string\n icon?: IconInput\n children?: TreeNode[]\n disabled?: boolean\n}\n\ninterface UseTreeOptions {\n defaultExpanded?: string[]\n defaultSelected?: string[]\n multiSelect?: boolean\n onSelect?: (selectedIds: string[]) => void\n onExpand?: (expandedIds: string[]) => void\n}\n\nexport function useTree(options: UseTreeOptions = {}) {\n const { defaultExpanded, defaultSelected, multiSelect, onSelect, onExpand } = options\n\n const [expanded, setExpanded] = useState<Set<string>>(\n new Set(defaultExpanded ?? []),\n )\n const [selected, setSelected] = useState<Set<string>>(\n new Set(defaultSelected ?? []),\n )\n\n const toggle = useCallback(\n (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onExpand?.(Array.from(next))\n return next\n })\n },\n [onExpand],\n )\n\n const select = useCallback(\n (id: string, event?: React.MouseEvent) => {\n setSelected((prev) => {\n let next: Set<string>\n if (multiSelect && event?.ctrlKey) {\n next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n } else {\n next = new Set([id])\n }\n onSelect?.(Array.from(next))\n return next\n })\n },\n [multiSelect, onSelect],\n )\n\n return {\n expanded,\n selected,\n toggle,\n select,\n isExpanded: (id: string) => expanded.has(id),\n isSelected: (id: string) => selected.has(id),\n expandAll: (ids: string[]) => setExpanded(new Set(ids)),\n collapseAll: () => setExpanded(new Set()),\n }\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { TreeItem } from './tree-item'\nimport { type TreeNode,useTree } from './use-tree'\n\n// ─── Context ────────────────────────────────────────────────────────\ninterface TreeContextValue {\n tree: ReturnType<typeof useTree>\n checkboxes: boolean\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null)\n\nexport function useTreeContext() {\n const ctx = React.useContext(TreeContext)\n if (!ctx) {\n throw new Error('TreeItem must be used within a <TreeView>')\n }\n return ctx\n}\n\n// ─── Props ──────────────────────────────────────────────────────────\nexport interface TreeViewProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n /** Data-driven mode: pass items array */\n items?: TreeNode[]\n /** Initially expanded node IDs */\n defaultExpanded?: string[]\n /** Initially selected node IDs */\n defaultSelected?: string[]\n /** Enable multi-select */\n multiSelect?: boolean\n /** Show checkboxes before each item */\n checkboxes?: boolean\n /** Called when selection changes */\n onSelect?: (ids: string[]) => void\n /** Called when expansion changes */\n onExpand?: (ids: string[]) => void\n className?: string\n /** Declarative mode: render TreeItem children directly */\n children?: React.ReactNode\n}\n\n// ─── Render nodes recursively (data-driven mode) ───────────────────\nfunction renderNodes(nodes: TreeNode[], depth: number = 0): React.ReactNode {\n return nodes.map((node) => (\n <TreeItem\n key={node.id}\n itemId={node.id}\n label={node.label}\n icon={node.icon}\n disabled={node.disabled}\n depth={depth}\n >\n {node.children && node.children.length > 0\n ? renderNodes(node.children, depth + 1)\n : undefined}\n </TreeItem>\n ))\n}\n\n// ─── Helper: collect all visible item IDs ───────────────────────────\nfunction getVisibleItemElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>('[data-tree-item]'),\n ).filter((el) => {\n // Items inside collapsed groups should not be focusable\n let parent = el.parentElement\n while (parent && parent !== container) {\n if (parent.getAttribute('role') === 'group') {\n const grid = parent.parentElement\n if (grid && grid.classList.contains('grid-rows-[0fr]')) {\n return false\n }\n }\n parent = parent.parentElement\n }\n return true\n })\n}\n\n// ─── Component ──────────────────────────────────────────────────────\nconst TreeView = React.forwardRef<HTMLUListElement, TreeViewProps>(\n (\n {\n items,\n defaultExpanded,\n defaultSelected,\n multiSelect = false,\n checkboxes = false,\n onSelect,\n onExpand,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const tree = useTree({\n defaultExpanded,\n defaultSelected,\n multiSelect,\n onSelect,\n onExpand,\n })\n\n const innerRef = React.useRef<HTMLUListElement>(null)\n const containerRef = (ref as React.RefObject<HTMLUListElement>) ?? innerRef\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLUListElement>) => {\n const container = containerRef.current\n if (!container) return\n\n const visibleItems = getVisibleItemElements(container)\n const currentIndex = visibleItems.findIndex(\n (el) => el === document.activeElement,\n )\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n const next = visibleItems[currentIndex + 1]\n next?.focus()\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n const prev = visibleItems[currentIndex - 1]\n prev?.focus()\n break\n }\n case 'ArrowRight': {\n // Handled in TreeItem for expand; if already expanded, move to first child\n const current = visibleItems[currentIndex]\n if (current) {\n const itemId = current.getAttribute('data-tree-item')\n if (itemId && tree.isExpanded(itemId)) {\n e.preventDefault()\n const nextItem = visibleItems[currentIndex + 1]\n nextItem?.focus()\n }\n }\n break\n }\n case 'ArrowLeft': {\n // Handled in TreeItem for collapse; if already collapsed or leaf, move to parent\n const current = visibleItems[currentIndex]\n if (current) {\n const itemId = current.getAttribute('data-tree-item')\n const treeItem = current.closest('[role=\"treeitem\"]')\n const parentGroup = treeItem?.parentElement?.closest(\n '[role=\"treeitem\"]',\n )\n if (itemId && !tree.isExpanded(itemId) && parentGroup) {\n e.preventDefault()\n const parentRow = parentGroup.querySelector<HTMLElement>(\n '[data-tree-item]',\n )\n parentRow?.focus()\n }\n }\n break\n }\n case 'Home': {\n e.preventDefault()\n visibleItems[0]?.focus()\n break\n }\n case 'End': {\n e.preventDefault()\n visibleItems[visibleItems.length - 1]?.focus()\n break\n }\n }\n }\n\n const ctxValue = React.useMemo<TreeContextValue>(\n () => ({ tree, checkboxes }),\n [tree, checkboxes],\n )\n\n const content = items ? renderNodes(items) : children\n\n return (\n <TreeContext.Provider value={ctxValue}>\n <ul\n ref={containerRef}\n role=\"tree\"\n aria-multiselectable={multiSelect || undefined}\n onKeyDown={handleKeyDown}\n className={cn('m-0 list-none p-0', className)}\n {...props}\n >\n {content}\n </ul>\n </TreeContext.Provider>\n )\n },\n)\nTreeView.displayName = 'TreeView'\n\nexport { TreeView }\n","'use client'\n\nimport { IconChevronRight } from '@tabler/icons-react'\nimport * as React from 'react'\n\nimport { Checkbox } from '../checkbox'\nimport { Icon } from '../icon'\nimport { IconProvider } from '../icon-context'\nimport type { IconInput } from '../lib/icon-input'\nimport { normalizeIcon } from '../lib/normalize-icon'\nimport { cn } from '../lib/utils'\nimport { useTreeContext } from './tree-view'\n\nexport interface TreeItemProps {\n /** Unique identifier for this tree item */\n itemId: string\n /** Primary label content */\n label: React.ReactNode\n /** Optional icon rendered before the label. Accepts any `IconInput`. */\n icon?: IconInput\n /** Secondary label rendered after the primary label */\n secondaryLabel?: React.ReactNode\n /** Action buttons rendered at the end of the row */\n actions?: React.ReactNode\n /** Whether this item is disabled */\n disabled?: boolean\n /** Nested tree items */\n children?: React.ReactNode\n /** Depth level (used internally) */\n depth?: number\n /** Additional CSS class names */\n className?: string\n}\n\nconst TreeItem = React.forwardRef<HTMLLIElement, TreeItemProps>(\n (\n {\n itemId,\n label,\n icon,\n secondaryLabel,\n actions,\n disabled = false,\n children,\n depth = 0,\n className,\n },\n ref,\n ) => {\n const ctx = useTreeContext()\n const hasChildren = React.Children.count(children) > 0\n const isExpanded = ctx.tree.isExpanded(itemId)\n const isSelected = ctx.tree.isSelected(itemId)\n\n const handleRowClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n ctx.tree.select(itemId, e)\n }\n\n const handleChevronClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n if (disabled) return\n ctx.tree.toggle(itemId)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n ctx.tree.select(itemId)\n }\n if (e.key === 'ArrowRight' && hasChildren && !isExpanded) {\n e.preventDefault()\n e.stopPropagation()\n ctx.tree.toggle(itemId)\n }\n if (e.key === 'ArrowLeft' && hasChildren && isExpanded) {\n e.preventDefault()\n e.stopPropagation()\n ctx.tree.toggle(itemId)\n }\n }\n\n // Compute indeterminate state for checkbox mode\n const checkboxState = React.useMemo(() => {\n if (!ctx.checkboxes || !hasChildren) {\n return { checked: isSelected, indeterminate: false }\n }\n // Collect all descendant IDs\n const descendants: string[] = []\n const collectIds = (nodes: React.ReactNode) => {\n React.Children.forEach(nodes, (child) => {\n if (React.isValidElement<TreeItemProps>(child) && child.props.itemId) {\n descendants.push(child.props.itemId)\n if (child.props.children) {\n collectIds(child.props.children)\n }\n }\n })\n }\n collectIds(children)\n const selectedCount = descendants.filter((id) =>\n ctx.tree.isSelected(id),\n ).length\n if (selectedCount === 0 && !isSelected) {\n return { checked: false, indeterminate: false }\n }\n if (selectedCount === descendants.length) {\n return { checked: true, indeterminate: false }\n }\n return { checked: false, indeterminate: true }\n }, [ctx.checkboxes, hasChildren, children, isSelected, ctx.tree])\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-selected={isSelected}\n aria-level={depth + 1}\n aria-disabled={disabled || undefined}\n className=\"list-none\"\n >\n {/* Row */}\n <div\n role=\"presentation\"\n data-tree-item={itemId}\n tabIndex={disabled ? -1 : 0}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n style={{ paddingLeft: `calc(${depth} * var(--spacing-ds-05b) + var(--spacing-ds-03))` }}\n className={cn(\n 'flex items-center gap-ds-02 py-ds-02 px-ds-02 rounded-control cursor-pointer transition-colors duration-fast-01',\n // Hover only applies when NOT selected. `hover:bg-…` is specificity\n // (0,2,0) while the conditional `bg-accent-4` below compiles to a\n // plain (0,1,0) class, so an unqualified hover won every time and\n // pointing at a selected row visibly deselected it. Table solves the\n // same problem with `data-[state=selected]:hover:…`.\n !isSelected && 'hover:bg-surface-panel-hover',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9',\n isSelected &&\n 'bg-accent-4 text-accent-11 hover:bg-accent-5',\n disabled && 'opacity-action-disabled cursor-not-allowed pointer-events-none',\n className,\n )}\n >\n {/* Expand chevron */}\n {hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onClick={handleChevronClick}\n className=\"flex shrink-0 items-center justify-center p-0 border-0 bg-transparent cursor-pointer\"\n >\n <Icon\n icon={IconChevronRight}\n size=\"sm\"\n className={cn(\n 'transition-transform duration-moderate-02',\n isExpanded && 'rotate-90',\n )}\n />\n </button>\n ) : (\n <span className=\"inline-block w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n\n {/* Checkbox (optional) */}\n {ctx.checkboxes && (\n <Checkbox\n checked={checkboxState.checked}\n indeterminate={checkboxState.indeterminate}\n disabled={disabled}\n tabIndex={-1}\n onClick={(e) => e.stopPropagation()}\n onCheckedChange={() => {\n if (!disabled) ctx.tree.select(itemId)\n }}\n className=\"shrink-0\"\n />\n )}\n\n {/* Icon */}\n {icon && (\n <span className=\"flex shrink-0 items-center text-surface-fg-subtle\">\n <IconProvider size=\"sm\">{normalizeIcon(icon)}</IconProvider>\n </span>\n )}\n\n {/* Label */}\n <span className=\"min-w-0 truncate text-body-sm\">{label}</span>\n\n {/* Secondary label */}\n {secondaryLabel && (\n <span className=\"ml-auto truncate text-caption text-surface-fg-muted\">\n {secondaryLabel}\n </span>\n )}\n\n {/* Actions */}\n {actions && (\n <span\n className=\"ml-auto flex shrink-0 items-center gap-ds-01\"\n onClick={(e) => e.stopPropagation()}\n role=\"presentation\"\n >\n {actions}\n </span>\n )}\n </div>\n\n {/* Children (collapsible) */}\n {hasChildren && (\n <div\n role=\"group\"\n className={cn(\n 'grid transition-[grid-template-rows] duration-moderate-02 ease-productive-standard',\n isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n )}\n >\n <ul role=\"group\" className=\"overflow-hidden m-0 p-0\">\n {React.Children.map(children, (child) => {\n if (React.isValidElement<TreeItemProps>(child)) {\n return React.cloneElement(child, {\n depth: depth + 1,\n })\n }\n return child\n })}\n </ul>\n </div>\n )}\n </li>\n )\n },\n)\nTreeItem.displayName = 'TreeItem'\n\nexport { TreeItem }\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { springs as e } from "../ui/lib/motion.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { useMotion as t } from "../_chunks/motion-provider.js";
|
|
4
|
+
import { cn as n } from "../ui/lib/utils.js";
|
|
5
|
+
import { Alert as r } from "../ui/alert.js";
|
|
6
6
|
import { useAICommand as i } from "./ai-command-provider.js";
|
|
7
7
|
import { BlockTable as a, ConfirmBlock as o, DividerBlock as s, InfoBlock as c, LoadingBlock as l, StatRowBlock as u, SuccessBlock as d } from "../_chunks/success.js";
|
|
8
8
|
import { ErrorBlock as f } from "./blocks/error.js";
|
|
@@ -23,7 +23,7 @@ var _ = {
|
|
|
23
23
|
stat_row: u
|
|
24
24
|
};
|
|
25
25
|
function v({ data: e, type: t }) {
|
|
26
|
-
return /* @__PURE__ */ h(
|
|
26
|
+
return /* @__PURE__ */ h(r, {
|
|
27
27
|
color: "info",
|
|
28
28
|
variant: "subtle",
|
|
29
29
|
title: `Unknown block type: ${t}`,
|
|
@@ -33,15 +33,15 @@ function v({ data: e, type: t }) {
|
|
|
33
33
|
})
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
|
-
var y = m.forwardRef(({ blocks:
|
|
37
|
-
let u = i(), { reducedMotion: d } =
|
|
36
|
+
var y = m.forwardRef(({ blocks: r, onAction: a, customBlocks: o, staggerDelay: s = 50, className: c }, l) => {
|
|
37
|
+
let u = i(), { reducedMotion: d } = t(), f = m.useMemo(() => ({
|
|
38
38
|
...u?.customBlocks ?? {},
|
|
39
39
|
...o
|
|
40
40
|
}), [u?.customBlocks, o]), p = a ?? u?.onAction;
|
|
41
41
|
return /* @__PURE__ */ h("div", {
|
|
42
42
|
ref: l,
|
|
43
|
-
className:
|
|
44
|
-
children:
|
|
43
|
+
className: n("flex flex-col gap-ds-04", c),
|
|
44
|
+
children: r.map((t, n) => {
|
|
45
45
|
let r = f[t.type] ?? _[t.type] ?? null, i = {
|
|
46
46
|
data: t.data,
|
|
47
47
|
blockId: t.id,
|