@stll/ui 0.44.1 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +2 -1
  2. package/dist/components/accordion.d.ts +6 -2
  3. package/dist/components/accordion.js +4 -4
  4. package/dist/components/ai-label.d.ts +33 -0
  5. package/dist/components/ai-label.js +42 -0
  6. package/dist/components/alert-dialog.js +3 -2
  7. package/dist/components/animated-count.d.ts +13 -0
  8. package/dist/components/animated-count.js +63 -0
  9. package/dist/components/application-rail.js +1 -1
  10. package/dist/components/brand-icons.d.ts +1 -0
  11. package/dist/components/brand-icons.js +8 -1
  12. package/dist/components/button.d.ts +2 -2
  13. package/dist/components/button.js +12 -2
  14. package/dist/components/command.js +1 -1
  15. package/dist/components/court-badge.d.ts +7 -1
  16. package/dist/components/court-badge.js +13 -3
  17. package/dist/components/date-picker-popover.d.ts +12 -2
  18. package/dist/components/date-picker-popover.js +105 -9
  19. package/dist/components/date-range-filter.d.ts +14 -0
  20. package/dist/components/date-range-filter.js +74 -0
  21. package/dist/components/dialog.js +3 -2
  22. package/dist/components/document-identity-badge.d.ts +12 -0
  23. package/dist/components/document-identity-badge.js +94 -0
  24. package/dist/components/document-identity-badge.logic.d.ts +25 -0
  25. package/dist/components/document-identity-badge.logic.js +25 -0
  26. package/dist/components/input-group.d.ts +1 -1
  27. package/dist/components/input-otp.js +1 -1
  28. package/dist/components/landing.d.ts +1 -1
  29. package/dist/components/landing.js +2 -2
  30. package/dist/components/list.d.ts +8 -2
  31. package/dist/components/list.js +10 -4
  32. package/dist/components/matter-icon.d.ts +16 -0
  33. package/dist/components/matter-icon.js +56 -0
  34. package/dist/components/menu.d.ts +9 -1
  35. package/dist/components/menu.js +6 -6
  36. package/dist/components/outline-rail.d.ts +8 -1
  37. package/dist/components/outline-rail.js +95 -48
  38. package/dist/components/popover.js +1 -1
  39. package/dist/components/search-field.js +30 -34
  40. package/dist/components/select.js +1 -1
  41. package/dist/components/sheet.js +22 -4
  42. package/dist/components/sidebar.d.ts +1 -1
  43. package/dist/components/sidebar.js +8 -8
  44. package/dist/components/status-mark.d.ts +17 -0
  45. package/dist/components/status-mark.js +74 -0
  46. package/dist/components/swap-text.d.ts +16 -0
  47. package/dist/components/swap-text.js +52 -0
  48. package/dist/components/switch.d.ts +5 -0
  49. package/dist/components/switch.js +16 -0
  50. package/dist/components/table-chart.d.ts +20 -0
  51. package/dist/components/table-chart.js +274 -0
  52. package/dist/components/tabs.js +1 -1
  53. package/dist/components/toast.js +42 -25
  54. package/dist/components/workspace-shell.js +5 -4
  55. package/dist/icons.js +1 -2
  56. package/dist/index.d.ts +3 -3
  57. package/dist/index.js +3 -3
  58. package/dist/inspector/dock.js +1 -1
  59. package/dist/inspector/entity-tab.js +1 -2
  60. package/dist/kanban/virtual-cell.js +1 -1
  61. package/dist/lib/control-size.d.ts +1 -1
  62. package/dist/lib/matter-colors.d.ts +38 -0
  63. package/dist/lib/matter-colors.js +65 -0
  64. package/dist/lib/panel-inset.d.ts +11 -0
  65. package/dist/lib/panel-inset.js +33 -0
  66. package/dist/lib/safe-area.d.ts +11 -0
  67. package/dist/lib/safe-area.js +12 -0
  68. package/dist/review/review-word-diff.d.ts +13 -0
  69. package/dist/review/review-word-diff.js +78 -0
  70. package/dist/styles/theme.css +79 -0
  71. package/package.json +64 -8
@@ -0,0 +1,52 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { useState } from "react";
5
+ //#region src/components/swap-text.tsx
6
+ /**
7
+ * A short label that changes in place (a live status line): the old text
8
+ * lifts out with a slight blur while the new one rises into the same cell,
9
+ * so the change reads as one motion instead of a blink. Both layers share a
10
+ * grid cell, so nothing reflows mid-swap. The first render is still, and
11
+ * under reduced motion the label simply changes.
12
+ */
13
+ const SwapText = ({ className, text }) => {
14
+ const [state, setState] = useState({
15
+ current: text,
16
+ generation: 0,
17
+ previous: null
18
+ });
19
+ if (state.current !== text) setState({
20
+ current: text,
21
+ generation: state.generation + 1,
22
+ previous: state.current
23
+ });
24
+ const hasSwapped = state.generation > 0;
25
+ return /* @__PURE__ */ jsxs("span", {
26
+ className: "inline-grid",
27
+ "data-slot": "swap-text",
28
+ children: [state.previous !== null && /* @__PURE__ */ jsx("span", {
29
+ "aria-hidden": "true",
30
+ className: "motion-safe:animate-swap-out col-start-1 row-start-1 motion-reduce:hidden",
31
+ onAnimationEnd: (event) => {
32
+ if (event.target !== event.currentTarget) return;
33
+ setState((current) => current.generation === state.generation ? {
34
+ ...current,
35
+ previous: null
36
+ } : current);
37
+ },
38
+ children: /* @__PURE__ */ jsx("span", {
39
+ className,
40
+ children: state.previous
41
+ })
42
+ }, `out-${state.generation}`), /* @__PURE__ */ jsx("span", {
43
+ className: cn("col-start-1 row-start-1", hasSwapped && "motion-safe:animate-swap-in"),
44
+ children: /* @__PURE__ */ jsx("span", {
45
+ className,
46
+ children: state.current
47
+ })
48
+ }, `in-${state.generation}`)]
49
+ });
50
+ };
51
+ //#endregion
52
+ export { SwapText };
@@ -0,0 +1,5 @@
1
+ import { Switch as Switch$1 } from "@base-ui/react/switch";
2
+ //#region src/components/switch.d.ts
3
+ declare const Switch: ({ className, ...props }: Switch$1.Root.Props) => import("react").JSX.Element;
4
+ //#endregion
5
+ export { Switch };
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Switch as Switch$1 } from "@base-ui/react/switch";
5
+ //#region src/components/switch.tsx
6
+ const Switch = ({ className, ...props }) => /* @__PURE__ */ jsx(Switch$1.Root, {
7
+ className: cn("focus-visible:ring-ring focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input relative inline-flex h-5 w-9 shrink-0 items-center rounded-full outline-none focus-visible:ring-2 focus-visible:ring-offset-1 data-disabled:opacity-64", className),
8
+ "data-slot": "switch",
9
+ ...props,
10
+ children: /* @__PURE__ */ jsx(Switch$1.Thumb, {
11
+ className: "bg-background pointer-events-none block size-4 rounded-full shadow-xs transition-transform ltr:data-checked:translate-x-4.5 ltr:data-unchecked:translate-x-0.5 rtl:data-checked:-translate-x-4.5 rtl:data-unchecked:-translate-x-0.5",
12
+ "data-slot": "switch-thumb"
13
+ })
14
+ });
15
+ //#endregion
16
+ export { Switch };
@@ -0,0 +1,20 @@
1
+ //#region src/components/table-chart.d.ts
2
+ export type TableChartKind = "bar" | "line" | "pie" | "scatter";
3
+ export type TableChartPoint = {
4
+ label: string;
5
+ x: number;
6
+ y: number;
7
+ series?: string;
8
+ };
9
+ export type TableChartProps = {
10
+ kind: TableChartKind;
11
+ points: readonly TableChartPoint[];
12
+ title: string;
13
+ summary: string;
14
+ xLabel?: string | undefined;
15
+ yLabel?: string | undefined;
16
+ xMode?: "numeric" | "category";
17
+ formatNumber: (value: number) => string;
18
+ };
19
+ export declare const TableChart: ({ kind, points, title, summary, xLabel, yLabel, xMode, formatNumber }: TableChartProps) => import("react").JSX.Element;
20
+ //#endregion
@@ -0,0 +1,274 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useId } from "react";
4
+ import { panic } from "better-result";
5
+ //#region src/components/table-chart.tsx
6
+ const WIDTH = 640;
7
+ const HEIGHT = 360;
8
+ const PLOT = {
9
+ x: 76,
10
+ y: 24,
11
+ width: 540,
12
+ height: 260
13
+ };
14
+ const MAX_POINTS = 500;
15
+ const TICK_COUNT = 4;
16
+ const PALETTE_SIZE = 8;
17
+ const scale = (values, includeZero) => {
18
+ const magnitude = Math.max(1, ...values.map((value) => Math.abs(value)));
19
+ const normalized = values.map((value) => value / magnitude);
20
+ let low = Math.min(...normalized, ...includeZero ? [0] : []);
21
+ let high = Math.max(...normalized, ...includeZero ? [0] : []);
22
+ if (low === high) {
23
+ low = Math.min(0, low);
24
+ high = Math.max(0, high);
25
+ if (low === high) {
26
+ low = -1;
27
+ high = 1;
28
+ }
29
+ }
30
+ return {
31
+ position: (value) => (value / magnitude - low) / (high - low),
32
+ tick: (index) => (low + (high - low) * index / TICK_COUNT) * magnitude
33
+ };
34
+ };
35
+ const color = (index) => `var(--chart-${index % PALETTE_SIZE + 1})`;
36
+ const identifyPoints = (points) => {
37
+ const occurrences = /* @__PURE__ */ new Map();
38
+ return points.map((point) => {
39
+ const identity = JSON.stringify([
40
+ point.label,
41
+ point.x,
42
+ point.y,
43
+ point.series
44
+ ]);
45
+ const occurrence = occurrences.get(identity) ?? 0;
46
+ occurrences.set(identity, occurrence + 1);
47
+ return {
48
+ point,
49
+ key: `${identity}:${occurrence}`
50
+ };
51
+ });
52
+ };
53
+ const CartesianPlot = ({ kind, points, formatNumber, xMode = "numeric" }) => {
54
+ const xScale = scale(points.map(({ x }) => x), false);
55
+ const yScale = scale(points.map(({ y }) => y), kind === "bar");
56
+ const x = (value) => PLOT.x + xScale.position(value) * PLOT.width;
57
+ const y = (value) => PLOT.y + (1 - yScale.position(value)) * PLOT.height;
58
+ const keyedPoints = identifyPoints(points);
59
+ const groups = Map.groupBy(keyedPoints, ({ point }) => point.series ?? "");
60
+ const seriesNames = [...groups.keys()];
61
+ const barStep = PLOT.width / points.length;
62
+ const labelStep = Math.max(1, Math.ceil(points.length / 8));
63
+ const categories = [...new Map(points.map((point) => [point.x, point])).values()];
64
+ const categoryStep = Math.max(1, Math.ceil(categories.length / 8));
65
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
66
+ Array.from({ length: 5 }, (_, index) => {
67
+ const value = yScale.tick(index);
68
+ const ordinate = PLOT.y + (1 - index / TICK_COUNT) * PLOT.height;
69
+ return /* @__PURE__ */ jsxs("g", {
70
+ "data-slot": "chart-y-tick",
71
+ children: [/* @__PURE__ */ jsx("line", {
72
+ x1: PLOT.x,
73
+ x2: PLOT.x + PLOT.width,
74
+ y1: ordinate,
75
+ y2: ordinate,
76
+ stroke: "var(--border)"
77
+ }), /* @__PURE__ */ jsx("text", {
78
+ x: PLOT.x - 8,
79
+ y: ordinate + 4,
80
+ textAnchor: "end",
81
+ fill: "var(--muted-foreground)",
82
+ children: formatNumber(value)
83
+ })]
84
+ }, index);
85
+ }),
86
+ /* @__PURE__ */ jsx("path", {
87
+ "data-slot": "chart-axis",
88
+ d: `M ${PLOT.x} ${PLOT.y} V ${PLOT.y + PLOT.height} H ${PLOT.x + PLOT.width}`,
89
+ fill: "none",
90
+ stroke: "var(--muted-foreground)"
91
+ }),
92
+ kind === "bar" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("line", {
93
+ "data-slot": "chart-zero",
94
+ x1: PLOT.x,
95
+ x2: PLOT.x + PLOT.width,
96
+ y1: y(0),
97
+ y2: y(0),
98
+ stroke: "var(--muted-foreground)"
99
+ }), keyedPoints.map(({ point, key }, index) => /* @__PURE__ */ jsxs("g", { children: [/* @__PURE__ */ jsx("rect", {
100
+ "data-slot": "chart-bar",
101
+ x: PLOT.x + index * barStep + barStep * .15,
102
+ y: Math.min(y(point.y), y(0)),
103
+ width: barStep * .7,
104
+ height: Math.abs(y(point.y) - y(0)),
105
+ fill: color(seriesNames.indexOf(point.series ?? "")),
106
+ children: /* @__PURE__ */ jsx("title", { children: `${point.label}: ${formatNumber(point.y)}${point.series ? ` (${point.series})` : ""}` })
107
+ }), index % labelStep === 0 && /* @__PURE__ */ jsx("text", {
108
+ x: PLOT.x + (index + .5) * barStep,
109
+ y: PLOT.y + PLOT.height + 20,
110
+ textAnchor: "middle",
111
+ fill: "var(--muted-foreground)",
112
+ style: { unicodeBidi: "plaintext" },
113
+ children: point.label.length > 16 ? `${point.label.slice(0, 15)}…` : point.label
114
+ })] }, key))] }) : /* @__PURE__ */ jsxs(Fragment, { children: [xMode === "category" ? categories.filter((_, index) => index % categoryStep === 0).map((point) => /* @__PURE__ */ jsx("text", {
115
+ "data-slot": "chart-x-tick",
116
+ x: x(point.x),
117
+ y: PLOT.y + PLOT.height + 20,
118
+ textAnchor: "middle",
119
+ fill: "var(--muted-foreground)",
120
+ style: { unicodeBidi: "plaintext" },
121
+ children: point.label.length > 16 ? `${point.label.slice(0, 15)}…` : point.label
122
+ }, point.x)) : Array.from({ length: 5 }, (_, index) => /* @__PURE__ */ jsx("text", {
123
+ "data-slot": "chart-x-tick",
124
+ x: PLOT.x + index / TICK_COUNT * PLOT.width,
125
+ y: PLOT.y + PLOT.height + 20,
126
+ textAnchor: "middle",
127
+ fill: "var(--muted-foreground)",
128
+ children: formatNumber(xScale.tick(index))
129
+ }, index)), [...groups].map(([name, group], index) => /* @__PURE__ */ jsxs("g", { children: [kind === "line" && /* @__PURE__ */ jsx("polyline", {
130
+ "data-slot": "chart-line",
131
+ points: group.map(({ point }) => `${x(point.x)},${y(point.y)}`).join(" "),
132
+ fill: "none",
133
+ stroke: color(index),
134
+ strokeWidth: 2
135
+ }), group.map(({ point, key }) => /* @__PURE__ */ jsx("circle", {
136
+ "data-slot": "chart-point",
137
+ cx: x(point.x),
138
+ cy: y(point.y),
139
+ r: 4,
140
+ fill: color(index),
141
+ children: /* @__PURE__ */ jsx("title", { children: `${point.label}: ${xMode === "numeric" ? `${formatNumber(point.x)}, ` : ""}${formatNumber(point.y)}${name ? ` (${name})` : ""}` })
142
+ }, key))] }, name))] })
143
+ ] });
144
+ };
145
+ const PiePlot = ({ points, formatNumber }) => {
146
+ if (points.some(({ y }) => y < 0)) panic("Pie chart values must be nonnegative");
147
+ const magnitude = Math.max(1, ...points.map(({ y }) => y));
148
+ const total = points.reduce((sum, { y }) => sum + y / magnitude, 0);
149
+ const radius = 110;
150
+ const center = {
151
+ x: WIDTH / 2,
152
+ y: 155
153
+ };
154
+ let angle = -Math.PI / 2;
155
+ const slices = [];
156
+ for (const [index, { point, key }] of identifyPoints(points).entries()) {
157
+ if (point.y === 0 || total === 0) continue;
158
+ const fraction = point.y / magnitude / total;
159
+ const start = angle;
160
+ angle += fraction * Math.PI * 2;
161
+ const path = `M ${center.x} ${center.y} L ${center.x + radius * Math.cos(start)} ${center.y + radius * Math.sin(start)} A ${radius} ${radius} 0 ${fraction > .5 ? 1 : 0} 1 ${center.x + radius * Math.cos(angle)} ${center.y + radius * Math.sin(angle)} Z`;
162
+ slices.push({
163
+ point,
164
+ key,
165
+ index,
166
+ fraction,
167
+ path
168
+ });
169
+ }
170
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("circle", {
171
+ cx: center.x,
172
+ cy: center.y,
173
+ r: radius,
174
+ fill: "var(--muted)"
175
+ }), slices.map(({ point, key, index, fraction, path }) => {
176
+ if (fraction === 1) return /* @__PURE__ */ jsx("circle", {
177
+ "data-slot": "chart-slice",
178
+ cx: center.x,
179
+ cy: center.y,
180
+ r: radius,
181
+ fill: color(index),
182
+ children: /* @__PURE__ */ jsx("title", { children: `${point.label}: ${formatNumber(point.y)}` })
183
+ }, key);
184
+ return /* @__PURE__ */ jsx("path", {
185
+ "data-slot": "chart-slice",
186
+ d: path,
187
+ fill: color(index),
188
+ stroke: "var(--background)",
189
+ children: /* @__PURE__ */ jsx("title", { children: `${point.label}: ${formatNumber(point.y)}` })
190
+ }, key);
191
+ })] });
192
+ };
193
+ const TableChart = ({ kind, points, title, summary, xLabel, yLabel, xMode = "numeric", formatNumber }) => {
194
+ const id = useId();
195
+ if (points.length === 0 || points.length > MAX_POINTS || points.some(({ x, y }) => !Number.isFinite(x) || !Number.isFinite(y))) panic("Chart requires between 1 and 500 finite points");
196
+ const legend = (kind === "pie" ? points.map(({ label, series }) => series ? `${label} (${series})` : label) : [...new Set(points.map(({ series }) => series ?? ""))]).map((name, index) => ({
197
+ name,
198
+ index
199
+ })).filter(({ name }) => name.length > 0);
200
+ return /* @__PURE__ */ jsxs("figure", {
201
+ "data-slot": "table-chart",
202
+ className: "text-foreground min-w-0 space-y-2",
203
+ children: [
204
+ /* @__PURE__ */ jsx("p", {
205
+ className: "text-sm font-medium",
206
+ children: /* @__PURE__ */ jsx("bdi", { children: title })
207
+ }),
208
+ /* @__PURE__ */ jsxs("svg", {
209
+ role: "img",
210
+ "aria-labelledby": `${id}-title`,
211
+ "aria-describedby": `${id}-summary`,
212
+ viewBox: `0 0 ${WIDTH} ${HEIGHT}`,
213
+ className: "block w-full text-xs tabular-nums",
214
+ direction: "ltr",
215
+ children: [
216
+ /* @__PURE__ */ jsx("title", {
217
+ id: `${id}-title`,
218
+ children: title
219
+ }),
220
+ /* @__PURE__ */ jsx("desc", {
221
+ id: `${id}-summary`,
222
+ children: summary
223
+ }),
224
+ kind === "pie" ? /* @__PURE__ */ jsx(PiePlot, {
225
+ points,
226
+ formatNumber
227
+ }) : /* @__PURE__ */ jsx(CartesianPlot, {
228
+ kind,
229
+ points,
230
+ formatNumber,
231
+ xMode
232
+ }),
233
+ kind !== "pie" && xLabel && /* @__PURE__ */ jsx("text", {
234
+ x: PLOT.x + PLOT.width / 2,
235
+ y: 344,
236
+ textAnchor: "middle",
237
+ fill: "var(--foreground)",
238
+ style: { unicodeBidi: "plaintext" },
239
+ children: xLabel
240
+ }),
241
+ kind !== "pie" && yLabel && /* @__PURE__ */ jsx("text", {
242
+ x: 18,
243
+ y: PLOT.y + PLOT.height / 2,
244
+ transform: `rotate(-90 18 ${PLOT.y + PLOT.height / 2})`,
245
+ textAnchor: "middle",
246
+ fill: "var(--foreground)",
247
+ style: { unicodeBidi: "plaintext" },
248
+ children: yLabel
249
+ })
250
+ ]
251
+ }),
252
+ legend.length > 0 && /* @__PURE__ */ jsx("ul", {
253
+ className: "flex flex-wrap gap-x-4 gap-y-1 text-xs",
254
+ children: legend.map(({ name, index }) => /* @__PURE__ */ jsxs("li", {
255
+ className: "flex min-w-0 items-center gap-1",
256
+ children: [/* @__PURE__ */ jsx("span", {
257
+ "aria-hidden": "true",
258
+ className: "size-2 shrink-0 rounded-full",
259
+ style: { background: color(index) }
260
+ }), /* @__PURE__ */ jsx("bdi", {
261
+ className: "wrap-break-word",
262
+ children: name
263
+ })]
264
+ }, index))
265
+ }),
266
+ /* @__PURE__ */ jsx("figcaption", {
267
+ className: "text-muted-foreground text-sm",
268
+ children: /* @__PURE__ */ jsx("bdi", { children: summary })
269
+ })
270
+ ]
271
+ });
272
+ };
273
+ //#endregion
274
+ export { TableChart };
@@ -33,7 +33,7 @@ const TabsList = ({ variant = "default", className, children, ref, ...props }) =
33
33
  });
34
34
  };
35
35
  const TabsTab = ({ className, ...props }) => /* @__PURE__ */ jsx(Tabs$1.Tab, {
36
- className: cn("hover:text-foreground focus-visible:ring-ring data-active:text-foreground relative flex h-9 shrink-0 grow cursor-pointer items-center justify-center gap-1.5 rounded-md border border-transparent px-[calc(--spacing(2.5)-1px)] text-base font-medium whitespace-nowrap outline-none focus-visible:ring-2 focus-visible:ring-inset data-disabled:pointer-events-none data-disabled:opacity-64 data-[orientation=vertical]:w-full data-[orientation=vertical]:justify-start sm:h-8 sm:text-sm [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4", className),
36
+ className: cn("hover:text-foreground focus-visible:ring-ring data-active:text-foreground relative flex h-9 shrink-0 grow cursor-pointer items-center justify-center gap-1.5 rounded-md border border-transparent px-[calc(--spacing(2.5)-1px)] text-base font-medium whitespace-nowrap outline-none select-none focus-visible:ring-2 focus-visible:ring-inset data-disabled:pointer-events-none data-disabled:opacity-64 data-[orientation=vertical]:w-full data-[orientation=vertical]:justify-start sm:h-8 sm:text-sm [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4", className),
37
37
  "data-slot": "tabs-tab",
38
38
  ...props
39
39
  });
@@ -1,8 +1,10 @@
1
1
  "use client";
2
2
  import { CircleAlertIcon, CircleCheckIcon, InfoIcon, TriangleAlertIcon, XIcon } from "../icons.js";
3
3
  import { cn } from "../lib/utils.js";
4
+ import { SAFE_AREA_TOAST_GEOMETRY_CLASS_NAME } from "../lib/safe-area.js";
4
5
  import { Loader } from "./loader.js";
5
6
  import { buttonVariants } from "./button.js";
7
+ import { ScrollArea } from "./scroll-area.js";
6
8
  import { jsx, jsxs } from "react/jsx-runtime";
7
9
  import * as React$1 from "react";
8
10
  import { Toast } from "@base-ui/react/toast";
@@ -61,11 +63,11 @@ const Toasts = ({ position }) => {
61
63
  return /* @__PURE__ */ jsx(Toast.Portal, {
62
64
  "data-slot": "toast-portal",
63
65
  children: /* @__PURE__ */ jsx(Toast.Viewport, {
64
- className: cn("fixed z-[90] mx-auto flex w-[calc(100%-var(--toast-inset)*2)] max-w-90 [--toast-inset:--spacing(4)] sm:[--toast-inset:--spacing(8)]", "md:data-[position*=right]:w-[calc(100%-var(--toast-inset)*2-min(var(--stella-toast-right-offset,0px),calc(100vw-var(--toast-inset)*2-10rem)))]", "data-[position*=top]:top-(--toast-inset)", "data-[position*=bottom]:bottom-(--toast-inset)", "data-[position*=left]:start-(--toast-inset)", "data-[position*=right]:end-(--toast-inset)", "md:data-[position*=right]:end-[calc(var(--toast-inset)+min(var(--stella-toast-right-offset,0px),calc(100vw-var(--toast-inset)*2-10rem)))]", "data-[position*=center]:left-1/2 data-[position*=center]:-translate-x-1/2"),
66
+ className: cn("fixed z-[90] mx-auto flex max-w-90 [--toast-inset:--spacing(4)] sm:[--toast-inset:--spacing(8)]", SAFE_AREA_TOAST_GEOMETRY_CLASS_NAME, "data-[position*=top]:top-[calc(var(--toast-inset)+var(--safe-area-top))]", "data-[position*=bottom]:bottom-[calc(var(--toast-inset)+var(--safe-area-bottom))]"),
65
67
  "data-position": position,
66
68
  "data-slot": "toast-viewport",
67
69
  children: toasts.map((toastItem) => /* @__PURE__ */ jsx(Toast.Root, {
68
- className: cn("bg-popover text-popover-foreground absolute z-[calc(9999-var(--toast-index))] h-(--toast-calc-height) w-full rounded-lg border shadow-lg/5 [transition:transform_.5s_var(--ease-smooth),opacity_.5s,height_.15s] not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] motion-reduce:transition-none dark:before:shadow-[0_-1px_--theme(--color-white/6%)]", "data-[position*=right]:start-auto data-[position*=right]:end-0", "data-[position*=left]:start-0 data-[position*=left]:end-auto", "data-[position*=center]:start-0 data-[position*=center]:end-0", "data-[position*=top]:top-0 data-[position*=top]:bottom-auto data-[position*=top]:origin-top", "data-[position*=bottom]:top-auto data-[position*=bottom]:bottom-0 data-[position*=bottom]:origin-bottom", "after:absolute after:start-0 after:h-[calc(var(--toast-gap)+1px)] after:w-full", "data-[position*=top]:after:top-full", "data-[position*=bottom]:after:bottom-full", "[--toast-calc-height:var(--toast-frontmost-height,var(--toast-height))] [--toast-gap:--spacing(3)] [--toast-peek:--spacing(3)] [--toast-scale:calc(max(0,1-(var(--toast-index)*.1)))] [--toast-shrink:calc(1-var(--toast-scale))]", "data-[position*=top]:[--toast-calc-offset-y:calc(var(--toast-offset-y)+var(--toast-index)*var(--toast-gap)+var(--toast-swipe-movement-y))]", "data-[position*=bottom]:[--toast-calc-offset-y:calc(var(--toast-offset-y)*-1+var(--toast-index)*var(--toast-gap)*-1+var(--toast-swipe-movement-y))]", "data-[position*=top]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)+(var(--toast-index)*var(--toast-peek))+(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]", "data-[position*=bottom]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)-(var(--toast-index)*var(--toast-peek))-(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]", "data-limited:opacity-0", "data-expanded:h-(--toast-height)", "data-position:data-expanded:transform-[translateX(var(--toast-swipe-movement-x))_translateY(var(--toast-calc-offset-y))]", "data-[position*=top]:data-starting-style:transform-[translateY(calc(-100%-var(--toast-inset)))]", "data-[position*=bottom]:data-starting-style:transform-[translateY(calc(100%+var(--toast-inset)))]", "data-ending-style:opacity-0", "data-ending-style:not-data-limited:not-data-swipe-direction:transform-[translateY(calc(100%+var(--toast-inset)))]", "data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]", "data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]", "data-expanded:data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-expanded:data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-expanded:data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]", "data-expanded:data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]"),
70
+ className: cn("bg-popover text-popover-foreground absolute z-[calc(9999-var(--toast-index))] h-(--toast-calc-height) w-full rounded-lg border shadow-lg/5 [transition:transform_300ms_var(--ease-out),opacity_300ms_var(--ease-out),height_150ms_var(--ease-out)] not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] data-ending-style:[transition-duration:200ms,200ms,150ms] motion-reduce:transition-none dark:before:shadow-[0_-1px_--theme(--color-white/6%)]", "data-[position*=right]:start-auto data-[position*=right]:end-0", "data-[position*=left]:start-0 data-[position*=left]:end-auto", "data-[position*=center]:start-0 data-[position*=center]:end-0", "data-[position*=top]:top-0 data-[position*=top]:bottom-auto data-[position*=top]:origin-top", "data-[position*=bottom]:top-auto data-[position*=bottom]:bottom-0 data-[position*=bottom]:origin-bottom", "after:absolute after:start-0 after:h-[calc(var(--toast-gap)+1px)] after:w-full", "data-[position*=top]:after:top-full", "data-[position*=bottom]:after:bottom-full", "[--toast-calc-height:var(--toast-frontmost-height,var(--toast-height))] [--toast-gap:--spacing(3)] [--toast-peek:--spacing(3)] [--toast-scale:calc(max(0,1-(var(--toast-index)*.1)))] [--toast-shrink:calc(1-var(--toast-scale))]", "data-[position*=top]:[--toast-calc-offset-y:calc(var(--toast-offset-y)+var(--toast-index)*var(--toast-gap)+var(--toast-swipe-movement-y))]", "data-[position*=bottom]:[--toast-calc-offset-y:calc(var(--toast-offset-y)*-1+var(--toast-index)*var(--toast-gap)*-1+var(--toast-swipe-movement-y))]", "data-[position*=top]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)+(var(--toast-index)*var(--toast-peek))+(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]", "data-[position*=bottom]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)-(var(--toast-index)*var(--toast-peek))-(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]", "data-limited:opacity-0", "data-expanded:h-(--toast-height)", "data-position:data-expanded:transform-[translateX(var(--toast-swipe-movement-x))_translateY(var(--toast-calc-offset-y))]", "data-[position*=top]:data-starting-style:transform-[translateY(calc(-100%-var(--toast-inset)))]", "data-[position*=bottom]:data-starting-style:transform-[translateY(calc(100%+var(--toast-inset)))]", "data-ending-style:opacity-0", "data-ending-style:not-data-limited:not-data-swipe-direction:transform-[translateY(calc(100%+var(--toast-inset)))]", "data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]", "data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]", "data-expanded:data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-expanded:data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-expanded:data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]", "data-expanded:data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]"),
69
71
  "data-position": position,
70
72
  swipeDirection: (() => {
71
73
  if (position.includes("center")) return [isTop ? "up" : "down"];
@@ -74,18 +76,22 @@ const Toasts = ({ position }) => {
74
76
  })(),
75
77
  toast: toastItem,
76
78
  children: /* @__PURE__ */ jsxs(Toast.Content, {
77
- className: "pointer-events-auto flex items-center gap-3 overflow-hidden px-3.5 py-3 text-sm transition-opacity duration-250 select-text data-behind:opacity-0 data-behind:not-data-expanded:pointer-events-none data-expanded:opacity-100",
79
+ className: "pointer-events-auto flex items-center gap-3 px-3.5 py-3 text-sm transition-opacity duration-250 select-text data-behind:opacity-0 data-behind:not-data-expanded:pointer-events-none data-expanded:opacity-100",
78
80
  children: [/* @__PURE__ */ jsxs("div", {
79
81
  className: "flex min-w-0 flex-1 gap-2",
80
- children: [/* @__PURE__ */ jsx(ToastIcon, { type: toastItem.type }), /* @__PURE__ */ jsxs("div", {
81
- className: "flex min-w-0 flex-col gap-0.5 select-text",
82
- children: [/* @__PURE__ */ jsx(Toast.Title, {
83
- className: "truncate font-medium",
84
- "data-slot": "toast-title"
85
- }), /* @__PURE__ */ jsx(Toast.Description, {
86
- className: "text-muted-foreground wrap-break-word",
87
- "data-slot": "toast-description"
88
- })]
82
+ children: [/* @__PURE__ */ jsx(ToastIcon, { type: toastItem.type }), /* @__PURE__ */ jsx(ScrollArea, {
83
+ axis: "vertical",
84
+ className: "h-auto min-w-0 flex-1 [&_[data-slot=scroll-area-viewport]]:max-h-[60dvh]",
85
+ children: /* @__PURE__ */ jsxs("div", {
86
+ className: "flex min-w-0 flex-col gap-0.5 select-text",
87
+ children: [/* @__PURE__ */ jsx(Toast.Title, {
88
+ className: "font-medium wrap-anywhere whitespace-pre-wrap",
89
+ "data-slot": "toast-title"
90
+ }), /* @__PURE__ */ jsx(Toast.Description, {
91
+ className: "text-muted-foreground wrap-anywhere whitespace-pre-wrap",
92
+ "data-slot": "toast-description"
93
+ })]
94
+ })
89
95
  })]
90
96
  }), /* @__PURE__ */ jsxs("div", {
91
97
  className: "ms-auto flex shrink-0 items-center gap-2",
@@ -132,20 +138,31 @@ const AnchoredToasts = () => {
132
138
  toast: toastItem,
133
139
  children: tooltipStyle ? /* @__PURE__ */ jsx(Toast.Content, {
134
140
  className: "pointer-events-auto px-2 py-1 select-text",
135
- children: /* @__PURE__ */ jsx(Toast.Title, { "data-slot": "toast-title" })
141
+ children: /* @__PURE__ */ jsx(ScrollArea, {
142
+ axis: "vertical",
143
+ className: "h-auto [&_[data-slot=scroll-area-viewport]]:max-h-[60dvh]",
144
+ children: /* @__PURE__ */ jsx(Toast.Title, {
145
+ className: "wrap-anywhere whitespace-pre-wrap",
146
+ "data-slot": "toast-title"
147
+ })
148
+ })
136
149
  }) : /* @__PURE__ */ jsxs(Toast.Content, {
137
- className: "pointer-events-auto flex items-center gap-3 overflow-hidden px-3.5 py-3 text-sm select-text",
150
+ className: "pointer-events-auto flex items-center gap-3 px-3.5 py-3 text-sm select-text",
138
151
  children: [/* @__PURE__ */ jsxs("div", {
139
152
  className: "flex min-w-0 flex-1 gap-2",
140
- children: [/* @__PURE__ */ jsx(ToastIcon, { type: toastItem.type }), /* @__PURE__ */ jsxs("div", {
141
- className: "flex min-w-0 flex-col gap-0.5 select-text",
142
- children: [/* @__PURE__ */ jsx(Toast.Title, {
143
- className: "truncate font-medium",
144
- "data-slot": "toast-title"
145
- }), /* @__PURE__ */ jsx(Toast.Description, {
146
- className: "text-muted-foreground wrap-break-word",
147
- "data-slot": "toast-description"
148
- })]
153
+ children: [/* @__PURE__ */ jsx(ToastIcon, { type: toastItem.type }), /* @__PURE__ */ jsx(ScrollArea, {
154
+ axis: "vertical",
155
+ className: "h-auto min-w-0 flex-1 [&_[data-slot=scroll-area-viewport]]:max-h-[60dvh]",
156
+ children: /* @__PURE__ */ jsxs("div", {
157
+ className: "flex min-w-0 flex-col gap-0.5 select-text",
158
+ children: [/* @__PURE__ */ jsx(Toast.Title, {
159
+ className: "font-medium wrap-anywhere whitespace-pre-wrap",
160
+ "data-slot": "toast-title"
161
+ }), /* @__PURE__ */ jsx(Toast.Description, {
162
+ className: "text-muted-foreground wrap-anywhere whitespace-pre-wrap",
163
+ "data-slot": "toast-description"
164
+ })]
165
+ })
149
166
  })]
150
167
  }), toastItem.actionProps && /* @__PURE__ */ jsx(Toast.Action, {
151
168
  className: cn(buttonVariants({ size: "xs" }), "ms-auto shrink-0 select-none"),
@@ -204,8 +221,8 @@ function normalizeToastActionProps({ action, actionProps, includeEmptyActionProp
204
221
  } };
205
222
  }
206
223
  function getDefaultToastTimeout(type) {
207
- if (type === "loading") return 0;
208
- if (type === "error" || type === "warning") return 6e3;
224
+ if (type === "loading" || type === "error") return 0;
225
+ if (type === "warning") return 6e3;
209
226
  return 4e3;
210
227
  }
211
228
  function normalizeToastTimeout(timeout) {
@@ -2,6 +2,7 @@
2
2
  import { NewChatIcon } from "../icons.js";
3
3
  import { cn } from "../lib/utils.js";
4
4
  import { SHELL_CHROME_LAYER_CLASS_NAME } from "../lib/overlay-layer.js";
5
+ import { SAFE_AREA_BOTTOM_EDGE_CLASS_NAME, SAFE_AREA_TOP_EDGE_CLASS_NAME } from "../lib/safe-area.js";
5
6
  import { useIsMobile } from "../hooks/use-mobile.js";
6
7
  import { InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton } from "../inspector/chrome.js";
7
8
  import { Sheet, SheetContent as SheetPopup, SheetTitle, SheetTrigger } from "./sheet.js";
@@ -36,12 +37,12 @@ const WorkspaceShell = ({ children, endDock, navigation, topBar }) => {
36
37
  })
37
38
  });
38
39
  const frame = /* @__PURE__ */ jsxs("div", {
39
- className: "flex h-dvh min-h-0 w-full overflow-hidden",
40
+ className: cn("flex h-dvh min-h-0 w-full overflow-hidden", SAFE_AREA_TOP_EDGE_CLASS_NAME, SAFE_AREA_BOTTOM_EDGE_CLASS_NAME),
40
41
  "data-slot": "workspace-shell",
41
42
  children: [
42
43
  navigation.mode === "responsive" ? navigation.content : navigation.desktop,
43
44
  /* @__PURE__ */ jsxs("main", {
44
- className: cn("bg-background relative flex w-full min-w-0 flex-1 flex-col overflow-hidden", "md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ms-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ms-2"),
45
+ className: cn("bg-background relative flex w-full min-w-0 flex-1 flex-col overflow-hidden", "max-md:ps-(--safe-area-inline-start) max-md:pe-(--safe-area-inline-end)", endDock === void 0 && "md:pe-(--safe-area-inline-end)", "md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ms-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ms-2"),
45
46
  "data-slot": "workspace-shell-main",
46
47
  children: [/* @__PURE__ */ jsx("div", {
47
48
  className: cn("bg-background sticky top-0 shrink-0", SHELL_CHROME_LAYER_CLASS_NAME),
@@ -68,7 +69,7 @@ const WorkspaceShell = ({ children, endDock, navigation, topBar }) => {
68
69
  className: "sr-only",
69
70
  children: compactNavigation.label
70
71
  }), /* @__PURE__ */ jsx("div", {
71
- className: "bg-background flex h-full min-h-0 flex-col overflow-y-auto [padding-inline:max(0.75rem,env(safe-area-inset-left))_max(0.75rem,env(safe-area-inset-right))] [padding-block:max(0.75rem,env(safe-area-inset-top))_max(0.75rem,env(safe-area-inset-bottom))]",
72
+ className: "bg-background flex h-full min-h-0 flex-col overflow-y-auto overscroll-contain p-3",
72
73
  "data-slot": "workspace-compact-navigation",
73
74
  children: compactNavigation.content
74
75
  })]
@@ -82,7 +83,7 @@ const WorkspaceShell = ({ children, endDock, navigation, topBar }) => {
82
83
  */
83
84
  const WorkspaceEndRail = ({ chatAction, children, className, label, overlay, topAction }) => /* @__PURE__ */ jsxs(InspectorRail, {
84
85
  "aria-label": label,
85
- className: cn("h-dvh", className),
86
+ className: cn("h-full", className),
86
87
  children: [
87
88
  /* @__PURE__ */ jsx(InspectorRailCell, { children: topAction }),
88
89
  /* @__PURE__ */ jsx(InspectorRailContent, { children }),
package/dist/icons.js CHANGED
@@ -1,2 +1 @@
1
- import { ActivityIcon, AlarmClockIcon, AlertCircleIcon, AlertTriangleIcon, AlignJustifyIcon, AlignLeftIcon, ArchiveIcon, ArchiveRestoreIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpDownIcon, ArrowUpIcon, AtSignIcon, BanIcon, BanknoteIcon, BellIcon, BlocksIcon, BoldIcon, BookOpenCheckIcon, BookOpenIcon as CaseLawIcon, BookOpenIcon as SkillIcon, BookTextIcon, BookmarkIcon, BookmarkPlusIcon, BotIcon, BracesIcon, BrainIcon, Building2Icon, BuildingIcon, CableIcon, CalendarClockIcon, CalendarIcon, CheckCheckIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleAlertIcon, CircleCheckIcon, CircleDashedIcon, CircleDotIcon, CircleHelpIcon, CircleIcon, CircleOffIcon, CircleUserRoundIcon, ClipboardCheckIcon, ClipboardCopyIcon, ClipboardIcon, ClipboardListIcon, ClipboardPasteIcon, Clock3Icon, ClockIcon, CogIcon, Columns2Icon, Columns3Icon, ColumnsIcon, CommandIcon, CompassIcon, CopyIcon, CopyPlusIcon, CornerDownLeftIcon, CpuIcon, CropIcon, DatabaseIcon, DollarSignIcon, DownloadIcon, EditIcon, EllipsisIcon, EllipsisVerticalIcon, EqualIcon, ExternalLinkIcon, EyeIcon, EyeOffIcon, FileBadgeIcon, FileCheckIcon, FileCodeIcon, FileDiffIcon, FileDigitIcon, FileDownIcon, FileIcon, FileImageIcon, FileOutputIcon, FilePenLineIcon, FilePlus2Icon, FilePlusIcon, FileQuestionIcon, FileSearchIcon, FileSpreadsheetIcon, FileTextIcon, FileUpIcon, FilterIcon, FilterXIcon, FlagIcon, FlaskConicalIcon, FoldHorizontalIcon, FolderIcon, FolderInputIcon, FolderOpenIcon, FolderPlusIcon, FolderSyncIcon, FolderTreeIcon, FunctionSquareIcon, GanttChartIcon, GaugeIcon, GitBranchIcon, GitCommitHorizontalIcon, GitPullRequestIcon, GlobeIcon, GraduationCapIcon, GripVerticalIcon, HashIcon, Heading1Icon, Heading2Icon, Heading3Icon, HelpCircleIcon, HighlighterIcon, HistoryIcon, ImageIcon, ImageOffIcon, InboxIcon, InfoIcon, ItalicIcon, KanbanIcon, KeyRoundIcon, KeyboardIcon, LandmarkIcon, LanguagesIcon, LaptopIcon, LayersIcon, LayoutDashboardIcon, LayoutGridIcon, LayoutTemplateIcon, LibraryBigIcon, LibraryIcon, Link2Icon, LinkIcon, ListChecksIcon, ListFilterIcon, ListIcon, ListMinusIcon, ListOrderedIcon, ListTodoIcon, ListTreeIcon, ListXIcon, Loader2Icon, LoaderCircleIcon, LoaderIcon, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, MailIcon, Maximize2Icon, MegaphoneIcon, MessageCircleQuestionIcon, MessageSquareIcon, MessageSquarePlusIcon as NewChatIcon, MessageSquareQuoteIcon as AddCommentIcon, MessageSquareTextIcon, MessageSquareWarningIcon, MessagesSquareIcon, Minimize2Icon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, NetworkIcon, PackageIcon, PaletteIcon, PanelLeftIcon, PanelRightIcon, PaperclipIcon, PauseIcon, PenIcon, PenLineIcon, PencilIcon, PencilLineIcon, PhoneIcon, PinIcon, PinOffIcon, PlayIcon, PlugIcon, PlusIcon, PowerIcon, PresentationIcon, PrinterIcon, QuoteIcon, Redo2Icon, RefreshCcwIcon, RefreshCwIcon, RepeatIcon, RotateCcwIcon, RotateCwIcon, RouteIcon, Rows2Icon, Rows3Icon, SaveIcon, ScanSearchIcon, ScanTextIcon, ScissorsIcon, ScrollTextIcon, SearchIcon, SearchXIcon, SendIcon, ServerIcon, Settings2Icon, ShapesIcon, ShieldAlertIcon, ShieldCheckIcon, ShieldIcon, SigmaIcon, SignatureIcon, SlashIcon, SlidersHorizontalIcon, SparklesIcon, SplitIcon, SquareCheckIcon, SquareIcon, SquareMinusIcon, SquarePenIcon, StarIcon, StarOffIcon, StickyNoteIcon, StrikethroughIcon, SunIcon, TableIcon, TagIcon, TagsIcon, TerminalIcon, TextIcon, TextQuoteIcon, ToggleLeftIcon, Trash2Icon, TrashIcon, TriangleAlertIcon, UnderlineIcon, Undo2Icon, UndoIcon, UnfoldHorizontalIcon, UngroupIcon, UploadIcon, UserCheckIcon, UserIcon, UserPlusIcon, UserRoundIcon, UsersIcon, VideoIcon, WandSparklesIcon as AiActionIcon, WavesIcon, WindIcon, WorkflowIcon, WrapTextIcon, WrenchIcon, XCircleIcon, XIcon, XSquareIcon, ZapIcon } from "lucide-react";
2
- export { ActivityIcon, AddCommentIcon, AiActionIcon, AlarmClockIcon, AlertCircleIcon, AlertTriangleIcon, AlignJustifyIcon, AlignLeftIcon, ArchiveIcon, ArchiveRestoreIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpDownIcon, ArrowUpIcon, AtSignIcon, BanIcon, BanknoteIcon, BellIcon, BlocksIcon, BoldIcon, BookOpenCheckIcon, BookTextIcon, BookmarkIcon, BookmarkPlusIcon, BotIcon, BracesIcon, BrainIcon, Building2Icon, BuildingIcon, CableIcon, CalendarClockIcon, CalendarIcon, CaseLawIcon, CheckCheckIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleAlertIcon, CircleCheckIcon, CircleDashedIcon, CircleDotIcon, CircleHelpIcon, CircleIcon, CircleOffIcon, CircleUserRoundIcon, ClipboardCheckIcon, ClipboardCopyIcon, ClipboardIcon, ClipboardListIcon, ClipboardPasteIcon, Clock3Icon, ClockIcon, CogIcon, Columns2Icon, Columns3Icon, ColumnsIcon, CommandIcon, CompassIcon, CopyIcon, CopyPlusIcon, CornerDownLeftIcon, CpuIcon, CropIcon, DatabaseIcon, DollarSignIcon, DownloadIcon, EditIcon, EllipsisIcon, EllipsisVerticalIcon, EqualIcon, ExternalLinkIcon, EyeIcon, EyeOffIcon, FileBadgeIcon, FileCheckIcon, FileCodeIcon, FileDiffIcon, FileDigitIcon, FileDownIcon, FileIcon, FileImageIcon, FileOutputIcon, FilePenLineIcon, FilePlus2Icon, FilePlusIcon, FileQuestionIcon, FileSearchIcon, FileSpreadsheetIcon, FileTextIcon, FileUpIcon, FilterIcon, FilterXIcon, FlagIcon, FlaskConicalIcon, FoldHorizontalIcon, FolderIcon, FolderInputIcon, FolderOpenIcon, FolderPlusIcon, FolderSyncIcon, FolderTreeIcon, FunctionSquareIcon, GanttChartIcon, GaugeIcon, GitBranchIcon, GitCommitHorizontalIcon, GitPullRequestIcon, GlobeIcon, GraduationCapIcon, GripVerticalIcon, HashIcon, Heading1Icon, Heading2Icon, Heading3Icon, HelpCircleIcon, HighlighterIcon, HistoryIcon, ImageIcon, ImageOffIcon, InboxIcon, InfoIcon, ItalicIcon, KanbanIcon, KeyRoundIcon, KeyboardIcon, LandmarkIcon, LanguagesIcon, LaptopIcon, LayersIcon, LayoutDashboardIcon, LayoutGridIcon, LayoutTemplateIcon, LibraryBigIcon, LibraryIcon, Link2Icon, LinkIcon, ListChecksIcon, ListFilterIcon, ListIcon, ListMinusIcon, ListOrderedIcon, ListTodoIcon, ListTreeIcon, ListXIcon, Loader2Icon, LoaderCircleIcon, LoaderIcon, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, MailIcon, Maximize2Icon, MegaphoneIcon, MessageCircleQuestionIcon, MessageSquareIcon, MessageSquareTextIcon, MessageSquareWarningIcon, MessagesSquareIcon, Minimize2Icon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, NetworkIcon, NewChatIcon, PackageIcon, PaletteIcon, PanelLeftIcon, PanelRightIcon, PaperclipIcon, PauseIcon, PenIcon, PenLineIcon, PencilIcon, PencilLineIcon, PhoneIcon, PinIcon, PinOffIcon, PlayIcon, PlugIcon, PlusIcon, PowerIcon, PresentationIcon, PrinterIcon, QuoteIcon, Redo2Icon, RefreshCcwIcon, RefreshCwIcon, RepeatIcon, RotateCcwIcon, RotateCwIcon, RouteIcon, Rows2Icon, Rows3Icon, SaveIcon, ScanSearchIcon, ScanTextIcon, ScissorsIcon, ScrollTextIcon, SearchIcon, SearchXIcon, SendIcon, ServerIcon, Settings2Icon, ShapesIcon, ShieldAlertIcon, ShieldCheckIcon, ShieldIcon, SigmaIcon, SignatureIcon, SkillIcon, SlashIcon, SlidersHorizontalIcon, SparklesIcon, SplitIcon, SquareCheckIcon, SquareIcon, SquareMinusIcon, SquarePenIcon, StarIcon, StarOffIcon, StickyNoteIcon, StrikethroughIcon, SunIcon, TableIcon, TagIcon, TagsIcon, TerminalIcon, TextIcon, TextQuoteIcon, ToggleLeftIcon, Trash2Icon, TrashIcon, TriangleAlertIcon, UnderlineIcon, Undo2Icon, UndoIcon, UnfoldHorizontalIcon, UngroupIcon, UploadIcon, UserCheckIcon, UserIcon, UserPlusIcon, UserRoundIcon, UsersIcon, VideoIcon, WavesIcon, WindIcon, WorkflowIcon, WrapTextIcon, WrenchIcon, XCircleIcon, XIcon, XSquareIcon, ZapIcon };
1
+ export { ActivityIcon, MessageSquareQuoteIcon as AddCommentIcon, WandSparklesIcon as AiActionIcon, AlarmClockIcon, AlertCircleIcon, AlertTriangleIcon, AlignJustifyIcon, AlignLeftIcon, ArchiveIcon, ArchiveRestoreIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpDownIcon, ArrowUpIcon, AtSignIcon, BanIcon, BanknoteIcon, BellIcon, BlocksIcon, BoldIcon, BookOpenCheckIcon, BookTextIcon, BookmarkIcon, BookmarkPlusIcon, BotIcon, BracesIcon, BrainIcon, Building2Icon, BuildingIcon, CableIcon, CalendarClockIcon, CalendarIcon, BookOpenIcon as CaseLawIcon, CheckCheckIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleAlertIcon, CircleCheckIcon, CircleDashedIcon, CircleDotIcon, CircleHelpIcon, CircleIcon, CircleOffIcon, CircleUserRoundIcon, ClipboardCheckIcon, ClipboardCopyIcon, ClipboardIcon, ClipboardListIcon, ClipboardPasteIcon, Clock3Icon, ClockIcon, CogIcon, Columns2Icon, Columns3Icon, ColumnsIcon, CommandIcon, CompassIcon, CopyIcon, CopyPlusIcon, CornerDownLeftIcon, CpuIcon, CropIcon, DatabaseIcon, DollarSignIcon, DownloadIcon, EditIcon, EllipsisIcon, EllipsisVerticalIcon, EqualIcon, ExternalLinkIcon, EyeIcon, EyeOffIcon, FileBadgeIcon, FileCheckIcon, FileCodeIcon, FileDiffIcon, FileDigitIcon, FileDownIcon, FileIcon, FileImageIcon, FileOutputIcon, FilePenLineIcon, FilePlus2Icon, FilePlusIcon, FileQuestionIcon, FileSearchIcon, FileSpreadsheetIcon, FileTextIcon, FileUpIcon, FilterIcon, FilterXIcon, FlagIcon, FlaskConicalIcon, FoldHorizontalIcon, FolderIcon, FolderInputIcon, FolderOpenIcon, FolderPlusIcon, FolderSyncIcon, FolderTreeIcon, FunctionSquareIcon, GanttChartIcon, GaugeIcon, GitBranchIcon, GitCommitHorizontalIcon, GitPullRequestIcon, GlobeIcon, GraduationCapIcon, GripVerticalIcon, HashIcon, Heading1Icon, Heading2Icon, Heading3Icon, HelpCircleIcon, HighlighterIcon, HistoryIcon, ImageIcon, ImageOffIcon, InboxIcon, InfoIcon, ItalicIcon, KanbanIcon, KeyRoundIcon, KeyboardIcon, LandmarkIcon, LanguagesIcon, LaptopIcon, LayersIcon, LayoutDashboardIcon, LayoutGridIcon, LayoutTemplateIcon, LibraryBigIcon, LibraryIcon, Link2Icon, LinkIcon, ListChecksIcon, ListFilterIcon, ListIcon, ListMinusIcon, ListOrderedIcon, ListTodoIcon, ListTreeIcon, ListXIcon, Loader2Icon, LoaderCircleIcon, LoaderIcon, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, MailIcon, Maximize2Icon, MegaphoneIcon, MessageCircleQuestionIcon, MessageSquareIcon, MessageSquareTextIcon, MessageSquareWarningIcon, MessagesSquareIcon, Minimize2Icon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, NetworkIcon, MessageSquarePlusIcon as NewChatIcon, PackageIcon, PaletteIcon, PanelLeftIcon, PanelRightIcon, PaperclipIcon, PauseIcon, PenIcon, PenLineIcon, PencilIcon, PencilLineIcon, PhoneIcon, PinIcon, PinOffIcon, PlayIcon, PlugIcon, PlusIcon, PowerIcon, PresentationIcon, PrinterIcon, QuoteIcon, Redo2Icon, RefreshCcwIcon, RefreshCwIcon, RepeatIcon, RotateCcwIcon, RotateCwIcon, RouteIcon, Rows2Icon, Rows3Icon, SaveIcon, ScanSearchIcon, ScanTextIcon, ScissorsIcon, ScrollTextIcon, SearchIcon, SearchXIcon, SendIcon, ServerIcon, Settings2Icon, ShapesIcon, ShieldAlertIcon, ShieldCheckIcon, ShieldIcon, SigmaIcon, SignatureIcon, BookOpenIcon as SkillIcon, SlashIcon, SlidersHorizontalIcon, SparklesIcon, SplitIcon, SquareCheckIcon, SquareIcon, SquareMinusIcon, SquarePenIcon, StarIcon, StarOffIcon, StickyNoteIcon, StrikethroughIcon, SunIcon, TableIcon, TagIcon, TagsIcon, TerminalIcon, TextIcon, TextQuoteIcon, ToggleLeftIcon, Trash2Icon, TrashIcon, TriangleAlertIcon, UnderlineIcon, Undo2Icon, UndoIcon, UnfoldHorizontalIcon, UngroupIcon, UploadIcon, UserCheckIcon, UserIcon, UserPlusIcon, UserRoundIcon, UsersIcon, VideoIcon, WavesIcon, WindIcon, WorkflowIcon, WrapTextIcon, WrenchIcon, XCircleIcon, XIcon, XSquareIcon, ZapIcon } from "lucide-react";