@shapesos/clay 0.18.0 → 0.19.1

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 (60) hide show
  1. package/dist/artifacts.cjs +207 -139
  2. package/dist/artifacts.cjs.map +1 -1
  3. package/dist/artifacts.js +5 -2
  4. package/dist/badge.cjs +70 -0
  5. package/dist/badge.cjs.map +1 -0
  6. package/dist/badge.d.cts +28 -0
  7. package/dist/badge.d.ts +28 -0
  8. package/dist/badge.js +9 -0
  9. package/dist/badge.js.map +1 -0
  10. package/dist/blocks.cjs +452 -185
  11. package/dist/blocks.cjs.map +1 -1
  12. package/dist/blocks.css +1 -1
  13. package/dist/blocks.d.cts +14 -3
  14. package/dist/blocks.d.ts +14 -3
  15. package/dist/blocks.js +17 -5
  16. package/dist/chat.cjs +457 -240
  17. package/dist/chat.cjs.map +1 -1
  18. package/dist/chat.d.cts +1 -1
  19. package/dist/chat.d.ts +1 -1
  20. package/dist/chat.js +10 -5
  21. package/dist/{chunk-JGMN6W72.js → chunk-2X4KUXYP.js} +1 -1
  22. package/dist/{chunk-QR4VBGK4.js → chunk-63AGNGKG.js} +81 -200
  23. package/dist/chunk-63AGNGKG.js.map +1 -0
  24. package/dist/chunk-CSTCTO3B.js +161 -0
  25. package/dist/chunk-CSTCTO3B.js.map +1 -0
  26. package/dist/chunk-EIAWZXE4.js +69 -0
  27. package/dist/chunk-EIAWZXE4.js.map +1 -0
  28. package/dist/chunk-EXRNGIQ2.js +41 -0
  29. package/dist/chunk-EXRNGIQ2.js.map +1 -0
  30. package/dist/{chunk-4MZZH3WX.js → chunk-HU5W7CGE.js} +37 -2
  31. package/dist/chunk-HU5W7CGE.js.map +1 -0
  32. package/dist/chunk-PISZYS2H.js +406 -0
  33. package/dist/chunk-PISZYS2H.js.map +1 -0
  34. package/dist/{chunk-CATIRDZP.js → chunk-PWSEEUVL.js} +10 -44
  35. package/dist/chunk-PWSEEUVL.js.map +1 -0
  36. package/dist/copy-button.cjs +439 -0
  37. package/dist/copy-button.cjs.map +1 -0
  38. package/dist/copy-button.d.cts +20 -0
  39. package/dist/copy-button.d.ts +20 -0
  40. package/dist/copy-button.js +12 -0
  41. package/dist/copy-button.js.map +1 -0
  42. package/dist/index.cjs +533 -298
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.cts +4 -2
  45. package/dist/index.d.ts +4 -2
  46. package/dist/index.js +26 -9
  47. package/dist/table.cjs +40 -0
  48. package/dist/table.cjs.map +1 -1
  49. package/dist/table.d.cts +37 -2
  50. package/dist/table.d.ts +37 -2
  51. package/dist/table.js +11 -1
  52. package/dist/{types-BDYPVP2N.d.cts → types-Bhg0_ES8.d.cts} +74 -2
  53. package/dist/{types-BMwa4bPW.d.ts → types-orOQcI2z.d.ts} +74 -2
  54. package/package.json +11 -1
  55. package/dist/chunk-4MZZH3WX.js.map +0 -1
  56. package/dist/chunk-7MY4X4YL.js +0 -250
  57. package/dist/chunk-7MY4X4YL.js.map +0 -1
  58. package/dist/chunk-CATIRDZP.js.map +0 -1
  59. package/dist/chunk-QR4VBGK4.js.map +0 -1
  60. /package/dist/{chunk-JGMN6W72.js.map → chunk-2X4KUXYP.js.map} +0 -0
@@ -0,0 +1,161 @@
1
+ // node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs
2
+ import { forwardRef, createElement } from "react";
3
+
4
+ // node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs
5
+ var defaultAttributes = {
6
+ outline: {
7
+ xmlns: "http://www.w3.org/2000/svg",
8
+ width: 24,
9
+ height: 24,
10
+ viewBox: "0 0 24 24",
11
+ fill: "none",
12
+ stroke: "currentColor",
13
+ strokeWidth: 2,
14
+ strokeLinecap: "round",
15
+ strokeLinejoin: "round"
16
+ },
17
+ filled: {
18
+ xmlns: "http://www.w3.org/2000/svg",
19
+ width: 24,
20
+ height: 24,
21
+ viewBox: "0 0 24 24",
22
+ fill: "currentColor",
23
+ stroke: "none"
24
+ }
25
+ };
26
+
27
+ // node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs
28
+ var createReactComponent = (type, iconName, iconNamePascal, iconNode) => {
29
+ const Component = forwardRef(
30
+ ({ color = "currentColor", size = 24, stroke = 2, title, className, children, ...rest }, ref) => createElement(
31
+ "svg",
32
+ {
33
+ ref,
34
+ ...defaultAttributes[type],
35
+ width: size,
36
+ height: size,
37
+ className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(" "),
38
+ ...type === "filled" ? {
39
+ fill: color
40
+ } : {
41
+ strokeWidth: stroke,
42
+ stroke: color
43
+ },
44
+ ...rest
45
+ },
46
+ [
47
+ title && createElement("title", { key: "svg-title" }, title),
48
+ ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),
49
+ ...Array.isArray(children) ? children : [children]
50
+ ]
51
+ )
52
+ );
53
+ Component.displayName = `${iconNamePascal}`;
54
+ return Component;
55
+ };
56
+
57
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs
58
+ var __iconNode = [["path", { "d": "M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0", "key": "svg-0" }], ["path", { "d": "M12 8v4", "key": "svg-1" }], ["path", { "d": "M12 16h.01", "key": "svg-2" }]];
59
+ var IconAlertCircle = createReactComponent("outline", "alert-circle", "AlertCircle", __iconNode);
60
+
61
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconArrowsMaximize.mjs
62
+ var __iconNode2 = [["path", { "d": "M16 4l4 0l0 4", "key": "svg-0" }], ["path", { "d": "M14 10l6 -6", "key": "svg-1" }], ["path", { "d": "M8 20l-4 0l0 -4", "key": "svg-2" }], ["path", { "d": "M4 20l6 -6", "key": "svg-3" }], ["path", { "d": "M16 20l4 0l0 -4", "key": "svg-4" }], ["path", { "d": "M14 14l6 6", "key": "svg-5" }], ["path", { "d": "M8 4l-4 0l0 4", "key": "svg-6" }], ["path", { "d": "M4 4l6 6", "key": "svg-7" }]];
63
+ var IconArrowsMaximize = createReactComponent("outline", "arrows-maximize", "ArrowsMaximize", __iconNode2);
64
+
65
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconArrowsMinimize.mjs
66
+ var __iconNode3 = [["path", { "d": "M5 9l4 0l0 -4", "key": "svg-0" }], ["path", { "d": "M3 3l6 6", "key": "svg-1" }], ["path", { "d": "M5 15l4 0l0 4", "key": "svg-2" }], ["path", { "d": "M3 21l6 -6", "key": "svg-3" }], ["path", { "d": "M19 9l-4 0l0 -4", "key": "svg-4" }], ["path", { "d": "M15 9l6 -6", "key": "svg-5" }], ["path", { "d": "M19 15l-4 0l0 4", "key": "svg-6" }], ["path", { "d": "M15 15l6 6", "key": "svg-7" }]];
67
+ var IconArrowsMinimize = createReactComponent("outline", "arrows-minimize", "ArrowsMinimize", __iconNode3);
68
+
69
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs
70
+ var __iconNode4 = [["path", { "d": "M5 12l5 5l10 -10", "key": "svg-0" }]];
71
+ var IconCheck = createReactComponent("outline", "check", "Check", __iconNode4);
72
+
73
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs
74
+ var __iconNode5 = [["path", { "d": "M6 9l6 6l6 -6", "key": "svg-0" }]];
75
+ var IconChevronDown = createReactComponent("outline", "chevron-down", "ChevronDown", __iconNode5);
76
+
77
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.mjs
78
+ var __iconNode6 = [["path", { "d": "M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666", "key": "svg-0" }], ["path", { "d": "M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1", "key": "svg-1" }]];
79
+ var IconCopy = createReactComponent("outline", "copy", "Copy", __iconNode6);
80
+
81
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconDownload.mjs
82
+ var __iconNode7 = [["path", { "d": "M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2", "key": "svg-0" }], ["path", { "d": "M7 11l5 5l5 -5", "key": "svg-1" }], ["path", { "d": "M12 4l0 12", "key": "svg-2" }]];
83
+ var IconDownload = createReactComponent("outline", "download", "Download", __iconNode7);
84
+
85
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconFileSpreadsheet.mjs
86
+ var __iconNode8 = [["path", { "d": "M14 3v4a1 1 0 0 0 1 1h4", "key": "svg-0" }], ["path", { "d": "M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2", "key": "svg-1" }], ["path", { "d": "M8 11h8v7h-8l0 -7", "key": "svg-2" }], ["path", { "d": "M8 15h8", "key": "svg-3" }], ["path", { "d": "M11 11v7", "key": "svg-4" }]];
87
+ var IconFileSpreadsheet = createReactComponent("outline", "file-spreadsheet", "FileSpreadsheet", __iconNode8);
88
+
89
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconLoader2.mjs
90
+ var __iconNode9 = [["path", { "d": "M12 3a9 9 0 1 0 9 9", "key": "svg-0" }]];
91
+ var IconLoader2 = createReactComponent("outline", "loader-2", "Loader2", __iconNode9);
92
+
93
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconPhoto.mjs
94
+ var __iconNode10 = [["path", { "d": "M15 8h.01", "key": "svg-0" }], ["path", { "d": "M3 6a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-12", "key": "svg-1" }], ["path", { "d": "M3 16l5 -5c.928 -.893 2.072 -.893 3 0l5 5", "key": "svg-2" }], ["path", { "d": "M14 14l1 -1c.928 -.893 2.072 -.893 3 0l3 3", "key": "svg-3" }]];
95
+ var IconPhoto = createReactComponent("outline", "photo", "Photo", __iconNode10);
96
+
97
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconFlask2Filled.mjs
98
+ var __iconNode11 = [["path", { "d": "M15 2a1 1 0 0 1 0 2v5.674l.062 .03a7 7 0 0 1 3.85 5.174l.037 .262a7 7 0 0 1 -3.078 6.693a1 1 0 0 1 -.553 .167h-6.635a1 1 0 0 1 -.552 -.166a7 7 0 0 1 .807 -12.134l.062 -.028v-5.672a1 1 0 1 1 0 -2h6zm-2 2h-2v6.34a1 1 0 0 1 -.551 .894l-.116 .049a5 5 0 0 0 -2.92 2.717h9.172a5 5 0 0 0 -2.918 -2.715a1 1 0 0 1 -.667 -.943v-6.342z", "key": "svg-0" }]];
99
+ var IconFlask2Filled = createReactComponent("filled", "flask-2-filled", "Flask2Filled", __iconNode11);
100
+
101
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.mjs
102
+ var __iconNode12 = [["path", { "d": "M15 6l-6 6l6 6", "key": "svg-0" }]];
103
+ var IconChevronLeft = createReactComponent("outline", "chevron-left", "ChevronLeft", __iconNode12);
104
+
105
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.mjs
106
+ var __iconNode13 = [["path", { "d": "M9 6l6 6l-6 6", "key": "svg-0" }]];
107
+ var IconChevronRight = createReactComponent("outline", "chevron-right", "ChevronRight", __iconNode13);
108
+
109
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconThumbDown.mjs
110
+ var __iconNode14 = [["path", { "d": "M7 13v-8a1 1 0 0 0 -1 -1h-2a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h3a4 4 0 0 1 4 4v1a2 2 0 0 0 4 0v-5h3a2 2 0 0 0 2 -2l-1 -5a2 3 0 0 0 -2 -2h-7a3 3 0 0 0 -3 3", "key": "svg-0" }]];
111
+ var IconThumbDown = createReactComponent("outline", "thumb-down", "ThumbDown", __iconNode14);
112
+
113
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconThumbUp.mjs
114
+ var __iconNode15 = [["path", { "d": "M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3", "key": "svg-0" }]];
115
+ var IconThumbUp = createReactComponent("outline", "thumb-up", "ThumbUp", __iconNode15);
116
+
117
+ export {
118
+ IconAlertCircle,
119
+ IconArrowsMaximize,
120
+ IconArrowsMinimize,
121
+ IconCheck,
122
+ IconChevronDown,
123
+ IconChevronLeft,
124
+ IconChevronRight,
125
+ IconCopy,
126
+ IconDownload,
127
+ IconFileSpreadsheet,
128
+ IconLoader2,
129
+ IconPhoto,
130
+ IconThumbDown,
131
+ IconThumbUp,
132
+ IconFlask2Filled
133
+ };
134
+ /*! Bundled license information:
135
+
136
+ @tabler/icons-react/dist/esm/defaultAttributes.mjs:
137
+ @tabler/icons-react/dist/esm/createReactComponent.mjs:
138
+ @tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs:
139
+ @tabler/icons-react/dist/esm/icons/IconArrowsMaximize.mjs:
140
+ @tabler/icons-react/dist/esm/icons/IconArrowsMinimize.mjs:
141
+ @tabler/icons-react/dist/esm/icons/IconCheck.mjs:
142
+ @tabler/icons-react/dist/esm/icons/IconChevronDown.mjs:
143
+ @tabler/icons-react/dist/esm/icons/IconCopy.mjs:
144
+ @tabler/icons-react/dist/esm/icons/IconDownload.mjs:
145
+ @tabler/icons-react/dist/esm/icons/IconFileSpreadsheet.mjs:
146
+ @tabler/icons-react/dist/esm/icons/IconLoader2.mjs:
147
+ @tabler/icons-react/dist/esm/icons/IconPhoto.mjs:
148
+ @tabler/icons-react/dist/esm/icons/IconFlask2Filled.mjs:
149
+ @tabler/icons-react/dist/esm/icons/IconChevronLeft.mjs:
150
+ @tabler/icons-react/dist/esm/icons/IconChevronRight.mjs:
151
+ @tabler/icons-react/dist/esm/icons/IconThumbDown.mjs:
152
+ @tabler/icons-react/dist/esm/icons/IconThumbUp.mjs:
153
+ @tabler/icons-react/dist/esm/tabler-icons-react.mjs:
154
+ (**
155
+ * @license @tabler/icons-react v3.37.1 - MIT
156
+ *
157
+ * This source code is licensed under the MIT license.
158
+ * See the LICENSE file in the root directory of this source tree.
159
+ *)
160
+ */
161
+ //# sourceMappingURL=chunk-CSTCTO3B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/@tabler/icons-react/src/defaultAttributes.ts","../node_modules/@tabler/icons-react/src/createReactComponent.ts","../node_modules/@tabler/icons-react/src/icons/IconAlertCircle.ts","../node_modules/@tabler/icons-react/src/icons/IconArrowsMaximize.ts","../node_modules/@tabler/icons-react/src/icons/IconArrowsMinimize.ts","../node_modules/@tabler/icons-react/src/icons/IconCheck.ts","../node_modules/@tabler/icons-react/src/icons/IconChevronDown.ts","../node_modules/@tabler/icons-react/src/icons/IconCopy.ts","../node_modules/@tabler/icons-react/src/icons/IconDownload.ts","../node_modules/@tabler/icons-react/src/icons/IconFileSpreadsheet.ts","../node_modules/@tabler/icons-react/src/icons/IconLoader2.ts","../node_modules/@tabler/icons-react/src/icons/IconPhoto.ts","../node_modules/@tabler/icons-react/src/icons/IconFlask2Filled.ts","../node_modules/@tabler/icons-react/src/icons/IconChevronLeft.ts","../node_modules/@tabler/icons-react/src/icons/IconChevronRight.ts","../node_modules/@tabler/icons-react/src/icons/IconThumbDown.ts","../node_modules/@tabler/icons-react/src/icons/IconThumbUp.ts"],"sourcesContent":["export default {\n outline: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n filled: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n },\n};\n","import { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport type { IconNode, IconProps, Icon } from './types';\n\nconst createReactComponent = (\n type: 'outline' | 'filled',\n iconName: string,\n iconNamePascal: string,\n iconNode: IconNode,\n) => {\n const Component = forwardRef<SVGSVGElement, IconProps>(\n (\n { color = 'currentColor', size = 24, stroke = 2, title, className, children, ...rest }: IconProps,\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes[type],\n width: size,\n height: size,\n className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(' '),\n ...(type === 'filled'\n ? {\n fill: color,\n }\n : {\n strokeWidth: stroke,\n stroke: color,\n }),\n ...rest,\n },\n [\n title && createElement('title', { key: 'svg-title' }, title),\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n );\n\n Component.displayName = `${iconNamePascal}`;\n\n return Component;\n};\n\nexport default createReactComponent;\n","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M12 8v4\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M12 16h.01\",\"key\":\"svg-2\"}]]\n\nconst IconAlertCircle = createReactComponent('outline', 'alert-circle', 'AlertCircle', __iconNode);\n\nexport default IconAlertCircle;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M16 4l4 0l0 4\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M14 10l6 -6\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M8 20l-4 0l0 -4\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M4 20l6 -6\",\"key\":\"svg-3\"}],[\"path\",{\"d\":\"M16 20l4 0l0 -4\",\"key\":\"svg-4\"}],[\"path\",{\"d\":\"M14 14l6 6\",\"key\":\"svg-5\"}],[\"path\",{\"d\":\"M8 4l-4 0l0 4\",\"key\":\"svg-6\"}],[\"path\",{\"d\":\"M4 4l6 6\",\"key\":\"svg-7\"}]]\n\nconst IconArrowsMaximize = createReactComponent('outline', 'arrows-maximize', 'ArrowsMaximize', __iconNode);\n\nexport default IconArrowsMaximize;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M5 9l4 0l0 -4\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M3 3l6 6\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M5 15l4 0l0 4\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M3 21l6 -6\",\"key\":\"svg-3\"}],[\"path\",{\"d\":\"M19 9l-4 0l0 -4\",\"key\":\"svg-4\"}],[\"path\",{\"d\":\"M15 9l6 -6\",\"key\":\"svg-5\"}],[\"path\",{\"d\":\"M19 15l-4 0l0 4\",\"key\":\"svg-6\"}],[\"path\",{\"d\":\"M15 15l6 6\",\"key\":\"svg-7\"}]]\n\nconst IconArrowsMinimize = createReactComponent('outline', 'arrows-minimize', 'ArrowsMinimize', __iconNode);\n\nexport default IconArrowsMinimize;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M5 12l5 5l10 -10\",\"key\":\"svg-0\"}]]\n\nconst IconCheck = createReactComponent('outline', 'check', 'Check', __iconNode);\n\nexport default IconCheck;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M6 9l6 6l6 -6\",\"key\":\"svg-0\"}]]\n\nconst IconChevronDown = createReactComponent('outline', 'chevron-down', 'ChevronDown', __iconNode);\n\nexport default IconChevronDown;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1\",\"key\":\"svg-1\"}]]\n\nconst IconCopy = createReactComponent('outline', 'copy', 'Copy', __iconNode);\n\nexport default IconCopy;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M7 11l5 5l5 -5\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M12 4l0 12\",\"key\":\"svg-2\"}]]\n\nconst IconDownload = createReactComponent('outline', 'download', 'Download', __iconNode);\n\nexport default IconDownload;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M14 3v4a1 1 0 0 0 1 1h4\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M8 11h8v7h-8l0 -7\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M8 15h8\",\"key\":\"svg-3\"}],[\"path\",{\"d\":\"M11 11v7\",\"key\":\"svg-4\"}]]\n\nconst IconFileSpreadsheet = createReactComponent('outline', 'file-spreadsheet', 'FileSpreadsheet', __iconNode);\n\nexport default IconFileSpreadsheet;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M12 3a9 9 0 1 0 9 9\",\"key\":\"svg-0\"}]]\n\nconst IconLoader2 = createReactComponent('outline', 'loader-2', 'Loader2', __iconNode);\n\nexport default IconLoader2;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M15 8h.01\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M3 6a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-12\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M3 16l5 -5c.928 -.893 2.072 -.893 3 0l5 5\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M14 14l1 -1c.928 -.893 2.072 -.893 3 0l3 3\",\"key\":\"svg-3\"}]]\n\nconst IconPhoto = createReactComponent('outline', 'photo', 'Photo', __iconNode);\n\nexport default IconPhoto;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M15 2a1 1 0 0 1 0 2v5.674l.062 .03a7 7 0 0 1 3.85 5.174l.037 .262a7 7 0 0 1 -3.078 6.693a1 1 0 0 1 -.553 .167h-6.635a1 1 0 0 1 -.552 -.166a7 7 0 0 1 .807 -12.134l.062 -.028v-5.672a1 1 0 1 1 0 -2h6zm-2 2h-2v6.34a1 1 0 0 1 -.551 .894l-.116 .049a5 5 0 0 0 -2.92 2.717h9.172a5 5 0 0 0 -2.918 -2.715a1 1 0 0 1 -.667 -.943v-6.342z\",\"key\":\"svg-0\"}]]\n\nconst IconFlask2Filled = createReactComponent('filled', 'flask-2-filled', 'Flask2Filled', __iconNode);\n\nexport default IconFlask2Filled;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M15 6l-6 6l6 6\",\"key\":\"svg-0\"}]]\n\nconst IconChevronLeft = createReactComponent('outline', 'chevron-left', 'ChevronLeft', __iconNode);\n\nexport default IconChevronLeft;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M9 6l6 6l-6 6\",\"key\":\"svg-0\"}]]\n\nconst IconChevronRight = createReactComponent('outline', 'chevron-right', 'ChevronRight', __iconNode);\n\nexport default IconChevronRight;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M7 13v-8a1 1 0 0 0 -1 -1h-2a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h3a4 4 0 0 1 4 4v1a2 2 0 0 0 4 0v-5h3a2 2 0 0 0 2 -2l-1 -5a2 3 0 0 0 -2 -2h-7a3 3 0 0 0 -3 3\",\"key\":\"svg-0\"}]]\n\nconst IconThumbDown = createReactComponent('outline', 'thumb-down', 'ThumbDown', __iconNode);\n\nexport default IconThumbDown;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3\",\"key\":\"svg-0\"}]]\n\nconst IconThumbUp = createReactComponent('outline', 'thumb-up', 'ThumbUp', __iconNode);\n\nexport default IconThumbUp;"],"mappings":"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","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"]}
@@ -0,0 +1,69 @@
1
+ import {
2
+ IconCheck,
3
+ IconCopy
4
+ } from "./chunk-CSTCTO3B.js";
5
+ import {
6
+ IconButton
7
+ } from "./chunk-E36VI2HA.js";
8
+
9
+ // src/components/chat/hooks/use-copy-to-clipboard.ts
10
+ import { useState, useCallback, useRef, useEffect } from "react";
11
+
12
+ // src/utils/clipboard.ts
13
+ function copyToClipboard(text, options) {
14
+ navigator.clipboard.writeText(text).then(
15
+ () => options?.onSuccess?.(),
16
+ (error) => options?.onFailure?.(error)
17
+ );
18
+ }
19
+
20
+ // src/components/chat/hooks/use-copy-to-clipboard.ts
21
+ var RESET_DELAY_MS = 2e3;
22
+ function useCopyToClipboard() {
23
+ const [isCopied, setIsCopied] = useState(false);
24
+ const timeoutRef = useRef(null);
25
+ useEffect(() => {
26
+ return () => {
27
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
28
+ };
29
+ }, []);
30
+ const copy = useCallback((text) => {
31
+ copyToClipboard(text, {
32
+ onSuccess: () => {
33
+ setIsCopied(true);
34
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
35
+ timeoutRef.current = setTimeout(() => {
36
+ setIsCopied(false);
37
+ timeoutRef.current = null;
38
+ }, RESET_DELAY_MS);
39
+ }
40
+ });
41
+ }, []);
42
+ return { isCopied, copy };
43
+ }
44
+
45
+ // src/components/copy-button/copy-button.tsx
46
+ import { jsx } from "react/jsx-runtime";
47
+ function CopyButton({
48
+ text,
49
+ copyLabel = "Copy",
50
+ copiedLabel = "Copied",
51
+ className
52
+ }) {
53
+ const { isCopied, copy } = useCopyToClipboard();
54
+ return /* @__PURE__ */ jsx(
55
+ IconButton,
56
+ {
57
+ icon: isCopied ? IconCheck : IconCopy,
58
+ onClick: () => copy(text),
59
+ "aria-label": isCopied ? copiedLabel : copyLabel,
60
+ className
61
+ }
62
+ );
63
+ }
64
+
65
+ export {
66
+ useCopyToClipboard,
67
+ CopyButton
68
+ };
69
+ //# sourceMappingURL=chunk-EIAWZXE4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chat/hooks/use-copy-to-clipboard.ts","../src/utils/clipboard.ts","../src/components/copy-button/copy-button.tsx"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from \"react\";\n\nimport { copyToClipboard } from \"@/utils/clipboard\";\n\nconst RESET_DELAY_MS = 2000;\n\ninterface UseCopyToClipboardResult {\n isCopied: boolean;\n copy: (text: string) => void;\n}\n\nexport function useCopyToClipboard(): UseCopyToClipboardResult {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n // Write text verbatim — callers (copyMessageText + each BlockService.toClipboardText) are\n // responsible for converting their own format to clipboard-ready plain text.\n const copy = useCallback((text: string) => {\n copyToClipboard(text, {\n onSuccess: () => {\n setIsCopied(true);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setIsCopied(false);\n timeoutRef.current = null;\n }, RESET_DELAY_MS);\n },\n });\n }, []);\n\n return { isCopied, copy };\n}\n","/** Options for the {@link copyToClipboard} function. */\ninterface CopyToClipboardOptions {\n /** Called after the text has been successfully written to the clipboard. */\n onSuccess?: () => void;\n /** Called if the clipboard write fails (e.g., permission denied). */\n onFailure?: (error: unknown) => void;\n}\n\n/**\n * Copies text to the system clipboard using the Clipboard API.\n * @param text - The string to copy.\n * @param options - Optional success/failure callbacks.\n */\nexport function copyToClipboard(text: string, options?: CopyToClipboardOptions): void {\n navigator.clipboard.writeText(text).then(\n () => options?.onSuccess?.(),\n (error) => options?.onFailure?.(error)\n );\n}\n","import type { ReactNode } from \"react\";\nimport { IconCheck, IconCopy } from \"@tabler/icons-react\";\n\nimport { useCopyToClipboard } from \"../chat/hooks/use-copy-to-clipboard\";\nimport { IconButton } from \"../icon-button/icon-button\";\n\nexport interface CopyButtonProps {\n /** Text written to the clipboard on click. */\n text: string;\n /** Accessible label + tooltip in the idle state. Default \"Copy\". */\n copyLabel?: string;\n /** Accessible label while the success flash is showing. Default \"Copied\". */\n copiedLabel?: string;\n /** Extra classes forwarded to the underlying `IconButton`. */\n className?: string;\n}\n\n/**\n * Icon button that copies `text` to the clipboard and flashes a check for ~2s (`IconCopy` →\n * `IconCheck`). Wraps `IconButton` + `useCopyToClipboard`; for copying plain text (not images —\n * for image capture use `ArtifactCopyAsImageButton`).\n */\nexport function CopyButton({\n text,\n copyLabel = \"Copy\",\n copiedLabel = \"Copied\",\n className,\n}: CopyButtonProps): ReactNode {\n const { isCopied, copy } = useCopyToClipboard();\n return (\n <IconButton\n icon={isCopied ? IconCheck : IconCopy}\n onClick={() => copy(text)}\n aria-label={isCopied ? copiedLabel : copyLabel}\n className={className}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,UAAU,aAAa,QAAQ,iBAAiB;;;ACalD,SAAS,gBAAgB,MAAc,SAAwC;AACpF,YAAU,UAAU,UAAU,IAAI,EAAE;AAAA,IAClC,MAAM,SAAS,YAAY;AAAA,IAC3B,CAAC,UAAU,SAAS,YAAY,KAAK;AAAA,EACvC;AACF;;;ADdA,IAAM,iBAAiB;AAOhB,SAAS,qBAA+C;AAC7D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,aAAa,OAA6C,IAAI;AAEpE,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,CAAC;AAIL,QAAM,OAAO,YAAY,CAAC,SAAiB;AACzC,oBAAgB,MAAM;AAAA,MACpB,WAAW,MAAM;AACf,oBAAY,IAAI;AAChB,YAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AACvD,mBAAW,UAAU,WAAW,MAAM;AACpC,sBAAY,KAAK;AACjB,qBAAW,UAAU;AAAA,QACvB,GAAG,cAAc;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,UAAU,KAAK;AAC1B;;;AEPI;AARG,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AACF,GAA+B;AAC7B,QAAM,EAAE,UAAU,KAAK,IAAI,mBAAmB;AAC9C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,WAAW,YAAY;AAAA,MAC7B,SAAS,MAAM,KAAK,IAAI;AAAA,MACxB,cAAY,WAAW,cAAc;AAAA,MACrC;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,41 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-P6GUNIAE.js";
4
+
5
+ // src/components/badge/badge.tsx
6
+ import { jsx } from "react/jsx-runtime";
7
+ var BASE = "inline-flex items-center whitespace-nowrap rounded-full";
8
+ var SIZES = {
9
+ // `sm` is a uniform scale-down of `md` (text 10/12 of caption): padding and line-height keep
10
+ // md's proportions (caption is 12px text on a 16px line = 1.333 ratio) so the pill shape matches.
11
+ md: "px-2.5 py-0.5 text-geist-label-caption-medium",
12
+ sm: "px-2 py-0.5 text-[11px]/[1.333] font-medium"
13
+ };
14
+ var SUBTLE = {
15
+ neutral: "bg-brown-20 text-brown-70",
16
+ warning: "bg-orange-50 text-orange-600",
17
+ violet: "bg-violet-50 text-violet-600"
18
+ };
19
+ var OUTLINE = {
20
+ neutral: "border border-brown-30 bg-white text-brown-100",
21
+ warning: "border border-orange-200 bg-white text-orange-600",
22
+ violet: "border border-violet-400 bg-white text-violet-600"
23
+ };
24
+ var VARIANTS = {
25
+ subtle: SUBTLE,
26
+ outline: OUTLINE
27
+ };
28
+ function Badge({
29
+ variant = "subtle",
30
+ tone = "neutral",
31
+ size = "md",
32
+ className,
33
+ children
34
+ }) {
35
+ return /* @__PURE__ */ jsx("span", { className: cn(BASE, SIZES[size], VARIANTS[variant][tone], className), children });
36
+ }
37
+
38
+ export {
39
+ Badge
40
+ };
41
+ //# sourceMappingURL=chunk-EXRNGIQ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/badge/badge.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\n/** Fill treatment of the badge. */\nexport type BadgeVariant = \"subtle\" | \"outline\";\n\n/** Semantic color of the badge. */\nexport type BadgeTone = \"neutral\" | \"warning\" | \"violet\";\n\n/** Overall size — `md` (default) or a more compact `sm` for eyebrow-style tags. */\nexport type BadgeSize = \"sm\" | \"md\";\n\nexport interface BadgeProps {\n /** Fill treatment. `subtle` = tinted background, `outline` = bordered on white. Default `subtle`. */\n variant?: BadgeVariant;\n /** Semantic color. `neutral` = brown, `warning` = orange, `violet` = violet. Default `neutral`. */\n tone?: BadgeTone;\n /** Size. `md` (12px text) or `sm` (10px text, tighter padding). Default `md`. */\n size?: BadgeSize;\n /** Extra classes merged after the variant/tone classes (last-wins via tailwind-merge). */\n className?: string;\n /** Badge label content. */\n children: ReactNode;\n}\n\nconst BASE = \"inline-flex items-center whitespace-nowrap rounded-full\";\n\n/** Padding + text size per size. Kept as one class each so there is a single font-size utility (deterministic override). */\nconst SIZES: Record<BadgeSize, string> = {\n // `sm` is a uniform scale-down of `md` (text 10/12 of caption): padding and line-height keep\n // md's proportions (caption is 12px text on a 16px line = 1.333 ratio) so the pill shape matches.\n md: \"px-2.5 py-0.5 text-geist-label-caption-medium\",\n sm: \"px-2 py-0.5 text-[11px]/[1.333] font-medium\",\n};\n\n/** Tinted background — low-emphasis tag. */\nconst SUBTLE: Record<BadgeTone, string> = {\n neutral: \"bg-brown-20 text-brown-70\",\n warning: \"bg-orange-50 text-orange-600\",\n violet: \"bg-violet-50 text-violet-600\",\n};\n\n/** Bordered on white — reads as a discrete chip. */\nconst OUTLINE: Record<BadgeTone, string> = {\n neutral: \"border border-brown-30 bg-white text-brown-100\",\n warning: \"border border-orange-200 bg-white text-orange-600\",\n violet: \"border border-violet-400 bg-white text-violet-600\",\n};\n\nconst VARIANTS: Record<BadgeVariant, Record<BadgeTone, string>> = {\n subtle: SUBTLE,\n outline: OUTLINE,\n};\n\n/**\n * Small pill for labels, counts, and status tags — recipient chips, \"+N\" overflow, \"Email\n * (fallback)\" tags, \"Labs\". Presentational only; on clay tokens. Compose the label at the call\n * site.\n */\nexport function Badge({\n variant = \"subtle\",\n tone = \"neutral\",\n size = \"md\",\n className,\n children,\n}: BadgeProps): ReactNode {\n return <span className={cn(BASE, SIZES[size], VARIANTS[variant][tone], className)}>{children}</span>;\n}\n"],"mappings":";;;;;AAmES;AAzCT,IAAM,OAAO;AAGb,IAAM,QAAmC;AAAA;AAAA;AAAA,EAGvC,IAAI;AAAA,EACJ,IAAI;AACN;AAGA,IAAM,SAAoC;AAAA,EACxC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACV;AAGA,IAAM,UAAqC;AAAA,EACzC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,IAAM,WAA4D;AAAA,EAChE,QAAQ;AAAA,EACR,SAAS;AACX;AAOO,SAAS,MAAM;AAAA,EACpB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAA0B;AACxB,SAAO,oBAAC,UAAK,WAAW,GAAG,MAAM,MAAM,IAAI,GAAG,SAAS,OAAO,EAAE,IAAI,GAAG,SAAS,GAAI,UAAS;AAC/F;","names":[]}
@@ -79,6 +79,36 @@ function useScrollShadow() {
79
79
  return { targetRef, isScrolled };
80
80
  }
81
81
 
82
+ // src/components/table/data-table.tsx
83
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
84
+ var DATA_TABLE_HEAD_CLASS = "h-auto py-2 px-4 text-xs font-medium text-foreground whitespace-nowrap text-left";
85
+ var DATA_TABLE_CELL_CLASS = "p-4 text-sm font-normal text-foreground align-top min-w-[150px] text-left";
86
+ var DATA_TABLE_ROW_CLASS = "border-b-brown-30 bg-background/70 hover:bg-secondary";
87
+ var DATA_TABLE_SCROLL_SHADOW = "0 1px 2px rgb(0 0 0 / 0.01), 0 6px 12px -2px rgb(0 0 0 / 0.03)";
88
+ function DataTable({ header, children, maxBodyHeight, className }) {
89
+ const { targetRef, isScrolled } = useScrollShadow();
90
+ return /* @__PURE__ */ jsx2(
91
+ "div",
92
+ {
93
+ ref: targetRef,
94
+ className: cn("overscroll-none", className),
95
+ style: maxBodyHeight !== void 0 ? { maxHeight: maxBodyHeight, overflowY: "auto" } : void 0,
96
+ children: /* @__PURE__ */ jsxs(Table, { containerClassName: "overflow-visible", children: [
97
+ /* @__PURE__ */ jsx2(
98
+ TableHeader,
99
+ {
100
+ "data-scrolled": isScrolled ? "true" : void 0,
101
+ className: "sticky top-0 z-10 bg-background/70 backdrop-blur-lg transition-shadow",
102
+ style: isScrolled ? { boxShadow: DATA_TABLE_SCROLL_SHADOW } : void 0,
103
+ children: header
104
+ }
105
+ ),
106
+ /* @__PURE__ */ jsx2(TableBody, { children })
107
+ ] })
108
+ }
109
+ );
110
+ }
111
+
82
112
  export {
83
113
  Table,
84
114
  TableHeader,
@@ -88,6 +118,11 @@ export {
88
118
  TableHead,
89
119
  TableCell,
90
120
  TableCaption,
91
- useScrollShadow
121
+ useScrollShadow,
122
+ DATA_TABLE_HEAD_CLASS,
123
+ DATA_TABLE_CELL_CLASS,
124
+ DATA_TABLE_ROW_CLASS,
125
+ DATA_TABLE_SCROLL_SHADOW,
126
+ DataTable
92
127
  };
93
- //# sourceMappingURL=chunk-4MZZH3WX.js.map
128
+ //# sourceMappingURL=chunk-HU5W7CGE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/table.tsx","../src/components/table/use-scroll-shadow.ts","../src/components/table/data-table.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\n/** Extension of shadcn's `Table` registry component: exposes `containerClassName` so callers can\n * override the wrapping `<div>`'s default `overflow-auto`. We need this for sticky-header support\n * (sticky uses the nearest overflow ancestor as its containing block — when the actual scroll\n * container is one level out, the inner overflow-auto needs to be neutralised with\n * `overflow-visible` so sticky aligns with the real scrolling parent). */\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement> & { containerClassName?: string }\n>(({ className, containerClassName, ...props }, ref) => (\n <div className={cn(\"relative w-full overflow-auto\", containerClassName)}>\n <table ref={ref} className={cn(\"w-full caption-bottom text-sm\", className)} {...props} />\n </div>\n));\nTable.displayName = \"Table\";\n\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n);\nTableHeader.displayName = \"TableHeader\";\n\nconst TableBody = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn(\"[&_tr:last-child]:border-0\", className)} {...props} />\n )\n);\nTableBody.displayName = \"TableBody\";\n\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <tfoot ref={ref} className={cn(\"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\", className)} {...props} />\n )\n);\nTableFooter.displayName = \"TableFooter\";\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\", className)}\n {...props}\n />\n )\n);\nTableRow.displayName = \"TableRow\";\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, React.ThHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n);\nTableHead.displayName = \"TableHead\";\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <td ref={ref} className={cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)} {...props} />\n )\n);\nTableCell.displayName = \"TableCell\";\n\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption ref={ref} className={cn(\"mt-4 text-sm text-muted-foreground\", className)} {...props} />\n )\n);\nTableCaption.displayName = \"TableCaption\";\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n","import { useEffect, useRef, useState, type RefObject } from \"react\";\n\n/**\n * Tracks whether a scroll container has scrolled past its top edge, for sticky-header shadow effects.\n *\n * Returns `targetRef` (attach to the scroll container itself or any element inside it) and\n * `isScrolled` (true once the container's `scrollTop > 0`). On mount the hook walks up the DOM\n * from the target to find the nearest overflow ancestor (or uses the target itself if it already\n * has `overflowY: auto | scroll`), then listens to its `scroll` event.\n *\n * Used to surface a subtle \"scroll lift\" shadow under sticky headers so users know there is\n * content hidden above.\n *\n * **Why a scroll listener and not a sentinel + IntersectionObserver:** an earlier version used a\n * 1px sentinel as the first child of the scroll container. The sentinel's height pushed the thead\n * down by one pixel in normal flow, and as soon as the user scrolled the thead snapped up to its\n * sticky position — a visible 1px jitter. A scroll listener has no layout footprint.\n *\n * `passive: true` so the listener doesn't block native scroll smoothness; we never call\n * `preventDefault`.\n */\nexport function useScrollShadow(): {\n targetRef: RefObject<HTMLDivElement | null>;\n isScrolled: boolean;\n} {\n const targetRef = useRef<HTMLDivElement>(null);\n const [isScrolled, setIsScrolled] = useState(false);\n\n useEffect(() => {\n const target = targetRef.current;\n if (!target) return;\n\n let scrollContainer: HTMLElement | null = target;\n while (scrollContainer) {\n const overflowY = getComputedStyle(scrollContainer).overflowY;\n if (overflowY === \"auto\" || overflowY === \"scroll\") break;\n scrollContainer = scrollContainer.parentElement;\n }\n if (!scrollContainer) return;\n\n setIsScrolled(scrollContainer.scrollTop > 0);\n\n const handleScroll = () => {\n if (!scrollContainer) return;\n setIsScrolled(scrollContainer.scrollTop > 0);\n };\n scrollContainer.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => scrollContainer.removeEventListener(\"scroll\", handleScroll);\n }, []);\n\n return { targetRef, isScrolled };\n}\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Table, TableBody, TableHeader } from \"@/components/ui/table\";\nimport { useScrollShadow } from \"./use-scroll-shadow\";\n\n/**\n * Header cell class — compact, left-aligned, non-wrapping. Apply to each `<TableHead>` composed at\n * the call site so every clay data table shares one header treatment.\n */\nexport const DATA_TABLE_HEAD_CLASS = \"h-auto py-2 px-4 text-xs font-medium text-foreground whitespace-nowrap text-left\";\n\n/** Body cell class — roomy padding, top-aligned, left-aligned, min width so columns don't collapse. */\nexport const DATA_TABLE_CELL_CLASS = \"p-4 text-sm font-normal text-foreground align-top min-w-[150px] text-left\";\n\n/**\n * Data-row class matching the frosted-glass card scheme: `border-b-brown-30` overrides shadcn's\n * default `--color-border` (brown-40) with the lighter brown-30; hover lifts to opaque `bg-secondary`.\n */\nexport const DATA_TABLE_ROW_CLASS = \"border-b-brown-30 bg-background/70 hover:bg-secondary\";\n\n/** Layered drop-shadow for the scroll-lift effect on the sticky header. */\nexport const DATA_TABLE_SCROLL_SHADOW = \"0 1px 2px rgb(0 0 0 / 0.01), 0 6px 12px -2px rgb(0 0 0 / 0.03)\";\n\nexport interface DataTableProps {\n /**\n * Header row content — typically a single `<TableRow>` of `<TableHead>` cells (use\n * `DATA_TABLE_HEAD_CLASS`). Rendered inside the sticky, frosted `<TableHeader>` shell.\n */\n header: ReactNode;\n /** Body rows composed at the call site (`<TableRow>`/`<TableCell>`). */\n children: ReactNode;\n /** Max body height (px) before vertical scroll engages. Omit for no cap (grows to content). */\n maxBodyHeight?: number;\n /** Extra classes for the scroll container. */\n className?: string;\n}\n\n/**\n * Shared styled-table shell — the scroll container, sticky frosted (`bg-background/70\n * backdrop-blur-lg`) header, and scroll-lift shadow (via {@link useScrollShadow}) that give clay\n * data tables (table artifact, notification-draft recipients) one consistent look. Callers compose\n * the header cells and body rows at the call site; this is only the shell.\n */\nexport function DataTable({ header, children, maxBodyHeight, className }: DataTableProps): ReactNode {\n const { targetRef, isScrolled } = useScrollShadow();\n return (\n <div\n ref={targetRef}\n className={cn(\"overscroll-none\", className)}\n style={maxBodyHeight !== undefined ? { maxHeight: maxBodyHeight, overflowY: \"auto\" } : undefined}\n >\n <Table containerClassName=\"overflow-visible\">\n <TableHeader\n data-scrolled={isScrolled ? \"true\" : undefined}\n className=\"sticky top-0 z-10 bg-background/70 backdrop-blur-lg transition-shadow\"\n style={isScrolled ? { boxShadow: DATA_TABLE_SCROLL_SHADOW } : undefined}\n >\n {header}\n </TableHeader>\n <TableBody>{children}</TableBody>\n </Table>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx"]}