exploreda 0.0.6 → 0.1.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 (208) hide show
  1. package/README.md +144 -0
  2. package/dist/ExplorEda.cjs +4608 -11288
  3. package/dist/ExplorEda.cjs.map +1 -1
  4. package/dist/ExplorEda.css +2282 -1689
  5. package/dist/ExplorEda.css.map +1 -1
  6. package/dist/ExplorEda.d.cts +124 -278
  7. package/dist/ExplorEda.d.ts +124 -278
  8. package/dist/ExplorEda.js +4479 -11166
  9. package/dist/ExplorEda.js.map +1 -1
  10. package/dist/calculations.cjs +18 -0
  11. package/dist/calculations.cjs.map +1 -0
  12. package/dist/calculations.d.cts +63 -0
  13. package/dist/calculations.d.ts +63 -0
  14. package/dist/calculations.js +3 -0
  15. package/dist/calculations.js.map +1 -0
  16. package/dist/charts/bar.cjs +27 -0
  17. package/dist/charts/bar.cjs.map +1 -0
  18. package/dist/charts/bar.d.cts +2 -0
  19. package/dist/charts/bar.d.ts +2 -0
  20. package/dist/charts/bar.js +18 -0
  21. package/dist/charts/bar.js.map +1 -0
  22. package/dist/charts/box-plot.cjs +26 -0
  23. package/dist/charts/box-plot.cjs.map +1 -0
  24. package/dist/charts/box-plot.d.cts +2 -0
  25. package/dist/charts/box-plot.d.ts +2 -0
  26. package/dist/charts/box-plot.js +17 -0
  27. package/dist/charts/box-plot.js.map +1 -0
  28. package/dist/charts/color-legend.cjs +22 -0
  29. package/dist/charts/color-legend.cjs.map +1 -0
  30. package/dist/charts/color-legend.d.cts +2 -0
  31. package/dist/charts/color-legend.d.ts +2 -0
  32. package/dist/charts/color-legend.js +13 -0
  33. package/dist/charts/color-legend.js.map +1 -0
  34. package/dist/charts/data-table.cjs +22 -0
  35. package/dist/charts/data-table.cjs.map +1 -0
  36. package/dist/charts/data-table.d.cts +2 -0
  37. package/dist/charts/data-table.d.ts +2 -0
  38. package/dist/charts/data-table.js +13 -0
  39. package/dist/charts/data-table.js.map +1 -0
  40. package/dist/charts/line.cjs +30 -0
  41. package/dist/charts/line.cjs.map +1 -0
  42. package/dist/charts/line.d.cts +2 -0
  43. package/dist/charts/line.d.ts +2 -0
  44. package/dist/charts/line.js +17 -0
  45. package/dist/charts/line.js.map +1 -0
  46. package/dist/charts/markdown.cjs +16 -0
  47. package/dist/charts/markdown.cjs.map +1 -0
  48. package/dist/charts/markdown.css +77 -0
  49. package/dist/charts/markdown.css.map +1 -0
  50. package/dist/charts/markdown.d.cts +2 -0
  51. package/dist/charts/markdown.d.ts +2 -0
  52. package/dist/charts/markdown.js +7 -0
  53. package/dist/charts/markdown.js.map +1 -0
  54. package/dist/charts/pivot-table.cjs +23 -0
  55. package/dist/charts/pivot-table.cjs.map +1 -0
  56. package/dist/charts/pivot-table.d.cts +2 -0
  57. package/dist/charts/pivot-table.d.ts +2 -0
  58. package/dist/charts/pivot-table.js +14 -0
  59. package/dist/charts/pivot-table.js.map +1 -0
  60. package/dist/charts/row.cjs +27 -0
  61. package/dist/charts/row.cjs.map +1 -0
  62. package/dist/charts/row.d.cts +6 -0
  63. package/dist/charts/row.d.ts +6 -0
  64. package/dist/charts/row.js +18 -0
  65. package/dist/charts/row.js.map +1 -0
  66. package/dist/charts/scatter.cjs +24 -0
  67. package/dist/charts/scatter.cjs.map +1 -0
  68. package/dist/charts/scatter.d.cts +2 -0
  69. package/dist/charts/scatter.d.ts +2 -0
  70. package/dist/charts/scatter.js +15 -0
  71. package/dist/charts/scatter.js.map +1 -0
  72. package/dist/charts/summary-table.cjs +19 -0
  73. package/dist/charts/summary-table.cjs.map +1 -0
  74. package/dist/charts/summary-table.d.cts +2 -0
  75. package/dist/charts/summary-table.d.ts +2 -0
  76. package/dist/charts/summary-table.js +10 -0
  77. package/dist/charts/summary-table.js.map +1 -0
  78. package/dist/charts/three-d-scatter.cjs +24 -0
  79. package/dist/charts/three-d-scatter.cjs.map +1 -0
  80. package/dist/charts/three-d-scatter.d.cts +6 -0
  81. package/dist/charts/three-d-scatter.d.ts +6 -0
  82. package/dist/charts/three-d-scatter.js +15 -0
  83. package/dist/charts/three-d-scatter.js.map +1 -0
  84. package/dist/chunk-3PGYFLE3.cjs +499 -0
  85. package/dist/chunk-3PGYFLE3.cjs.map +1 -0
  86. package/dist/chunk-4HNDKMWF.js +167 -0
  87. package/dist/chunk-4HNDKMWF.js.map +1 -0
  88. package/dist/chunk-4QNENKTV.cjs +1214 -0
  89. package/dist/chunk-4QNENKTV.cjs.map +1 -0
  90. package/dist/chunk-54M32JJB.js +132 -0
  91. package/dist/chunk-54M32JJB.js.map +1 -0
  92. package/dist/chunk-5B23JVH3.cjs +2238 -0
  93. package/dist/chunk-5B23JVH3.cjs.map +1 -0
  94. package/dist/chunk-5LH6NSNL.js +456 -0
  95. package/dist/chunk-5LH6NSNL.js.map +1 -0
  96. package/dist/chunk-6DOKKCJ5.cjs +313 -0
  97. package/dist/chunk-6DOKKCJ5.cjs.map +1 -0
  98. package/dist/chunk-6HZX5CBT.cjs +1074 -0
  99. package/dist/chunk-6HZX5CBT.cjs.map +1 -0
  100. package/dist/chunk-6U5DOIQM.js +1071 -0
  101. package/dist/chunk-6U5DOIQM.js.map +1 -0
  102. package/dist/chunk-7GBZIK2R.cjs +80 -0
  103. package/dist/chunk-7GBZIK2R.cjs.map +1 -0
  104. package/dist/chunk-7PTJNIOD.js +520 -0
  105. package/dist/chunk-7PTJNIOD.js.map +1 -0
  106. package/dist/chunk-AHZYQ7FN.js +319 -0
  107. package/dist/chunk-AHZYQ7FN.js.map +1 -0
  108. package/dist/chunk-AOODAOL4.cjs +55 -0
  109. package/dist/chunk-AOODAOL4.cjs.map +1 -0
  110. package/dist/chunk-ASKFIRMC.cjs +165 -0
  111. package/dist/chunk-ASKFIRMC.cjs.map +1 -0
  112. package/dist/chunk-B7OQUBH4.cjs +171 -0
  113. package/dist/chunk-B7OQUBH4.cjs.map +1 -0
  114. package/dist/chunk-BIMEHDLB.js +72 -0
  115. package/dist/chunk-BIMEHDLB.js.map +1 -0
  116. package/dist/chunk-C62KHV7S.js +1225 -0
  117. package/dist/chunk-C62KHV7S.js.map +1 -0
  118. package/dist/chunk-C7GQT65O.cjs +1119 -0
  119. package/dist/chunk-C7GQT65O.cjs.map +1 -0
  120. package/dist/chunk-CGDWDV4Z.js +1211 -0
  121. package/dist/chunk-CGDWDV4Z.js.map +1 -0
  122. package/dist/chunk-CJQQFNEY.js +69 -0
  123. package/dist/chunk-CJQQFNEY.js.map +1 -0
  124. package/dist/chunk-DHYLSXNR.js +964 -0
  125. package/dist/chunk-DHYLSXNR.js.map +1 -0
  126. package/dist/chunk-DKFA4KOJ.cjs +87 -0
  127. package/dist/chunk-DKFA4KOJ.cjs.map +1 -0
  128. package/dist/chunk-DS5BS7PP.cjs +357 -0
  129. package/dist/chunk-DS5BS7PP.cjs.map +1 -0
  130. package/dist/chunk-EGMFQSGK.js +909 -0
  131. package/dist/chunk-EGMFQSGK.js.map +1 -0
  132. package/dist/chunk-EU5EFHO5.cjs +53 -0
  133. package/dist/chunk-EU5EFHO5.cjs.map +1 -0
  134. package/dist/chunk-FM46QSDM.js +837 -0
  135. package/dist/chunk-FM46QSDM.js.map +1 -0
  136. package/dist/chunk-GV2LRR32.cjs +843 -0
  137. package/dist/chunk-GV2LRR32.cjs.map +1 -0
  138. package/dist/chunk-H3XKFSA5.cjs +322 -0
  139. package/dist/chunk-H3XKFSA5.cjs.map +1 -0
  140. package/dist/chunk-H5AVMMCE.js +347 -0
  141. package/dist/chunk-H5AVMMCE.js.map +1 -0
  142. package/dist/chunk-JDMUN4VK.cjs +986 -0
  143. package/dist/chunk-JDMUN4VK.cjs.map +1 -0
  144. package/dist/chunk-JNO7OXCC.js +2171 -0
  145. package/dist/chunk-JNO7OXCC.js.map +1 -0
  146. package/dist/chunk-JQMG4ZR7.js +111 -0
  147. package/dist/chunk-JQMG4ZR7.js.map +1 -0
  148. package/dist/chunk-L2Q2R43U.cjs +118 -0
  149. package/dist/chunk-L2Q2R43U.cjs.map +1 -0
  150. package/dist/chunk-LBTZVERO.js +466 -0
  151. package/dist/chunk-LBTZVERO.js.map +1 -0
  152. package/dist/chunk-LUUGGTTK.cjs +1227 -0
  153. package/dist/chunk-LUUGGTTK.cjs.map +1 -0
  154. package/dist/chunk-MEEPH7ZC.cjs +911 -0
  155. package/dist/chunk-MEEPH7ZC.cjs.map +1 -0
  156. package/dist/chunk-MJPDJ5AS.js +184 -0
  157. package/dist/chunk-MJPDJ5AS.js.map +1 -0
  158. package/dist/chunk-MJROUIDZ.cjs +219 -0
  159. package/dist/chunk-MJROUIDZ.cjs.map +1 -0
  160. package/dist/chunk-MUWSBYJS.js +528 -0
  161. package/dist/chunk-MUWSBYJS.js.map +1 -0
  162. package/dist/chunk-NDF5LCST.js +1088 -0
  163. package/dist/chunk-NDF5LCST.js.map +1 -0
  164. package/dist/chunk-NGWTPED4.js +311 -0
  165. package/dist/chunk-NGWTPED4.js.map +1 -0
  166. package/dist/chunk-PP4VCONW.js +739 -0
  167. package/dist/chunk-PP4VCONW.js.map +1 -0
  168. package/dist/chunk-PRMC2A6P.cjs +488 -0
  169. package/dist/chunk-PRMC2A6P.cjs.map +1 -0
  170. package/dist/chunk-PST6UU6S.cjs +742 -0
  171. package/dist/chunk-PST6UU6S.cjs.map +1 -0
  172. package/dist/chunk-Q7LK2UWH.js +33 -0
  173. package/dist/chunk-Q7LK2UWH.js.map +1 -0
  174. package/dist/chunk-SFV5LZPD.js +162 -0
  175. package/dist/chunk-SFV5LZPD.js.map +1 -0
  176. package/dist/chunk-SKXGYJJG.cjs +370 -0
  177. package/dist/chunk-SKXGYJJG.cjs.map +1 -0
  178. package/dist/chunk-SWLNKY6R.js +477 -0
  179. package/dist/chunk-SWLNKY6R.js.map +1 -0
  180. package/dist/chunk-TGVLNHUB.cjs +483 -0
  181. package/dist/chunk-TGVLNHUB.cjs.map +1 -0
  182. package/dist/chunk-TLLRW6S3.js +74 -0
  183. package/dist/chunk-TLLRW6S3.js.map +1 -0
  184. package/dist/chunk-TRAIXZ6M.cjs +140 -0
  185. package/dist/chunk-TRAIXZ6M.cjs.map +1 -0
  186. package/dist/chunk-U74A5VK5.cjs +74 -0
  187. package/dist/chunk-U74A5VK5.cjs.map +1 -0
  188. package/dist/chunk-UAVDLBTA.cjs +74 -0
  189. package/dist/chunk-UAVDLBTA.cjs.map +1 -0
  190. package/dist/chunk-UJWS6TRV.js +354 -0
  191. package/dist/chunk-UJWS6TRV.js.map +1 -0
  192. package/dist/chunk-UUJMUPB3.cjs +531 -0
  193. package/dist/chunk-UUJMUPB3.cjs.map +1 -0
  194. package/dist/chunk-VTKHZIJB.cjs +549 -0
  195. package/dist/chunk-VTKHZIJB.cjs.map +1 -0
  196. package/dist/chunk-YXPAWUXO.js +51 -0
  197. package/dist/chunk-YXPAWUXO.js.map +1 -0
  198. package/dist/chunk-ZD64SCZB.js +80 -0
  199. package/dist/chunk-ZD64SCZB.js.map +1 -0
  200. package/dist/core.cjs +28 -0
  201. package/dist/core.cjs.map +1 -0
  202. package/dist/core.d.cts +22 -0
  203. package/dist/core.d.ts +22 -0
  204. package/dist/core.js +3 -0
  205. package/dist/core.js.map +1 -0
  206. package/dist/dataLayerState-B4XmQjQN.d.cts +258 -0
  207. package/dist/dataLayerState-B4XmQjQN.d.ts +258 -0
  208. package/package.json +30 -52
@@ -0,0 +1,118 @@
1
+ 'use strict';
2
+
3
+ var chunk5B23JVH3_cjs = require('./chunk-5B23JVH3.cjs');
4
+ var cmdk = require('cmdk');
5
+ var lucideReact = require('lucide-react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function Command({
9
+ className,
10
+ ...props
11
+ }) {
12
+ return /* @__PURE__ */ jsxRuntime.jsx(
13
+ cmdk.Command,
14
+ {
15
+ "data-slot": "command",
16
+ className: chunk5B23JVH3_cjs.cn(
17
+ "bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md",
18
+ className
19
+ ),
20
+ ...props
21
+ }
22
+ );
23
+ }
24
+ function CommandInput({
25
+ className,
26
+ ...props
27
+ }) {
28
+ return /* @__PURE__ */ jsxRuntime.jsxs(
29
+ "div",
30
+ {
31
+ "data-slot": "command-input-wrapper",
32
+ className: "flex h-9 items-center gap-2 border-b px-3",
33
+ children: [
34
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, { className: "size-4 shrink-0 opacity-50" }),
35
+ /* @__PURE__ */ jsxRuntime.jsx(
36
+ cmdk.Command.Input,
37
+ {
38
+ "data-slot": "command-input",
39
+ className: chunk5B23JVH3_cjs.cn(
40
+ "placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
41
+ className
42
+ ),
43
+ ...props
44
+ }
45
+ )
46
+ ]
47
+ }
48
+ );
49
+ }
50
+ function CommandList({
51
+ className,
52
+ ...props
53
+ }) {
54
+ return /* @__PURE__ */ jsxRuntime.jsx(
55
+ cmdk.Command.List,
56
+ {
57
+ "data-slot": "command-list",
58
+ className: chunk5B23JVH3_cjs.cn(
59
+ "max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto",
60
+ className
61
+ ),
62
+ ...props
63
+ }
64
+ );
65
+ }
66
+ function CommandEmpty({
67
+ ...props
68
+ }) {
69
+ return /* @__PURE__ */ jsxRuntime.jsx(
70
+ cmdk.Command.Empty,
71
+ {
72
+ "data-slot": "command-empty",
73
+ className: "py-6 text-center text-sm",
74
+ ...props
75
+ }
76
+ );
77
+ }
78
+ function CommandGroup({
79
+ className,
80
+ ...props
81
+ }) {
82
+ return /* @__PURE__ */ jsxRuntime.jsx(
83
+ cmdk.Command.Group,
84
+ {
85
+ "data-slot": "command-group",
86
+ className: chunk5B23JVH3_cjs.cn(
87
+ "text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium",
88
+ className
89
+ ),
90
+ ...props
91
+ }
92
+ );
93
+ }
94
+ function CommandItem({
95
+ className,
96
+ ...props
97
+ }) {
98
+ return /* @__PURE__ */ jsxRuntime.jsx(
99
+ cmdk.Command.Item,
100
+ {
101
+ "data-slot": "command-item",
102
+ className: chunk5B23JVH3_cjs.cn(
103
+ "data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled='true']:pointer-events-none data-[disabled='true']:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
104
+ className
105
+ ),
106
+ ...props
107
+ }
108
+ );
109
+ }
110
+
111
+ exports.Command = Command;
112
+ exports.CommandEmpty = CommandEmpty;
113
+ exports.CommandGroup = CommandGroup;
114
+ exports.CommandInput = CommandInput;
115
+ exports.CommandItem = CommandItem;
116
+ exports.CommandList = CommandList;
117
+ //# sourceMappingURL=chunk-L2Q2R43U.cjs.map
118
+ //# sourceMappingURL=chunk-L2Q2R43U.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/command.tsx"],"names":["jsx","CommandPrimitive","cn","jsxs","SearchIcon"],"mappings":";;;;;;;AAeA,SAAS,OAAQ,CAAA;AAAA,EACf,SAAA;AAAA,EACA,GAAG;AACL,CAAkD,EAAA;AAChD,EACE,uBAAAA,cAAA;AAAA,IAACC,YAAA;AAAA,IAAA;AAAA,MACC,WAAU,EAAA,SAAA;AAAA,MACV,SAAW,EAAAC,oBAAA;AAAA,QACT,2FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AA0BA,SAAS,YAAa,CAAA;AAAA,EACpB,SAAA;AAAA,EACA,GAAG;AACL,CAAwD,EAAA;AACtD,EACE,uBAAAC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAU,EAAA,uBAAA;AAAA,MACV,SAAU,EAAA,2CAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAACH,cAAA,CAAAI,sBAAA,EAAA,EAAW,WAAU,4BAA6B,EAAA,CAAA;AAAA,wBACnDJ,cAAA;AAAA,UAACC,YAAiB,CAAA,KAAA;AAAA,UAAjB;AAAA,YACC,WAAU,EAAA,eAAA;AAAA,YACV,SAAW,EAAAC,oBAAA;AAAA,cACT,0JAAA;AAAA,cACA;AAAA,aACF;AAAA,YACC,GAAG;AAAA;AAAA;AACN;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,WAAY,CAAA;AAAA,EACnB,SAAA;AAAA,EACA,GAAG;AACL,CAAuD,EAAA;AACrD,EACE,uBAAAF,cAAA;AAAA,IAACC,YAAiB,CAAA,IAAA;AAAA,IAAjB;AAAA,MACC,WAAU,EAAA,cAAA;AAAA,MACV,SAAW,EAAAC,oBAAA;AAAA,QACT,6DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,YAAa,CAAA;AAAA,EACpB,GAAG;AACL,CAAwD,EAAA;AACtD,EACE,uBAAAF,cAAA;AAAA,IAACC,YAAiB,CAAA,KAAA;AAAA,IAAjB;AAAA,MACC,WAAU,EAAA,eAAA;AAAA,MACV,SAAU,EAAA,0BAAA;AAAA,MACT,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,YAAa,CAAA;AAAA,EACpB,SAAA;AAAA,EACA,GAAG;AACL,CAAwD,EAAA;AACtD,EACE,uBAAAD,cAAA;AAAA,IAACC,YAAiB,CAAA,KAAA;AAAA,IAAjB;AAAA,MACC,WAAU,EAAA,eAAA;AAAA,MACV,SAAW,EAAAC,oBAAA;AAAA,QACT,wNAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAeA,SAAS,WAAY,CAAA;AAAA,EACnB,SAAA;AAAA,EACA,GAAG;AACL,CAAuD,EAAA;AACrD,EACE,uBAAAF,cAAA;AAAA,IAACC,YAAiB,CAAA,IAAA;AAAA,IAAjB;AAAA,MACC,WAAU,EAAA,cAAA;AAAA,MACV,SAAW,EAAAC,oBAAA;AAAA,QACT,yYAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-L2Q2R43U.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { SearchIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string;\n description?: string;\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent className=\"overflow-hidden p-0\">\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n >\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n </div>\n );\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n );\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"bg-border -mx-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled='true']:pointer-events-none data-[disabled='true']:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n"]}
@@ -0,0 +1,466 @@
1
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from './chunk-NDF5LCST.js';
2
+ import { Popover, PopoverTrigger, PopoverContent, Label, Input } from './chunk-MJPDJ5AS.js';
3
+ import { useDataLayer, buildConversionPreview, getFieldSettingsError, ActionTooltip, Button, cn } from './chunk-JNO7OXCC.js';
4
+ import { useState, useEffect, useMemo } from 'react';
5
+ import { Settings2, AlertCircle, ChevronDownIcon, CheckIcon, ChevronUpIcon } from 'lucide-react';
6
+ import * as SelectPrimitive from '@radix-ui/react-select';
7
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
+
9
+ function Select({
10
+ ...props
11
+ }) {
12
+ return /* @__PURE__ */ jsx(SelectPrimitive.Root, { "data-slot": "select", ...props });
13
+ }
14
+ function SelectValue({
15
+ ...props
16
+ }) {
17
+ return /* @__PURE__ */ jsx(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
18
+ }
19
+ function SelectTrigger({
20
+ className,
21
+ children,
22
+ ...props
23
+ }) {
24
+ return /* @__PURE__ */ jsxs(
25
+ SelectPrimitive.Trigger,
26
+ {
27
+ "data-slot": "select-trigger",
28
+ className: cn(
29
+ "border-input data-[placeholder]:text-muted-foreground aria-invalid:border-destructive ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex h-9 w-full items-center justify-between rounded-md border bg-transparent px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-0 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&>span]:line-clamp-1",
30
+ className
31
+ ),
32
+ ...props,
33
+ children: [
34
+ children,
35
+ /* @__PURE__ */ jsx(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4 opacity-50" }) })
36
+ ]
37
+ }
38
+ );
39
+ }
40
+ function SelectContent({
41
+ className,
42
+ children,
43
+ position = "popper",
44
+ ...props
45
+ }) {
46
+ return /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
47
+ SelectPrimitive.Content,
48
+ {
49
+ "data-slot": "select-content",
50
+ className: cn(
51
+ "bg-popover text-popover-foreground motion-safe:data-[state=open]:animate-in motion-safe:data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border shadow-md",
52
+ position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
53
+ className
54
+ ),
55
+ position,
56
+ ...props,
57
+ children: [
58
+ /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
59
+ /* @__PURE__ */ jsx(
60
+ SelectPrimitive.Viewport,
61
+ {
62
+ className: cn(
63
+ "p-1",
64
+ position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
65
+ ),
66
+ children
67
+ }
68
+ ),
69
+ /* @__PURE__ */ jsx(SelectScrollDownButton, {})
70
+ ]
71
+ }
72
+ ) });
73
+ }
74
+ function SelectItem({
75
+ className,
76
+ children,
77
+ ...props
78
+ }) {
79
+ return /* @__PURE__ */ jsxs(
80
+ SelectPrimitive.Item,
81
+ {
82
+ "data-slot": "select-item",
83
+ className: cn(
84
+ "focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
85
+ className
86
+ ),
87
+ ...props,
88
+ children: [
89
+ /* @__PURE__ */ jsx("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) }) }),
90
+ /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children })
91
+ ]
92
+ }
93
+ );
94
+ }
95
+ function SelectScrollUpButton({
96
+ className,
97
+ ...props
98
+ }) {
99
+ return /* @__PURE__ */ jsx(
100
+ SelectPrimitive.ScrollUpButton,
101
+ {
102
+ "data-slot": "select-scroll-up-button",
103
+ className: cn(
104
+ "flex cursor-default items-center justify-center py-1",
105
+ className
106
+ ),
107
+ ...props,
108
+ children: /* @__PURE__ */ jsx(ChevronUpIcon, { className: "size-4" })
109
+ }
110
+ );
111
+ }
112
+ function SelectScrollDownButton({
113
+ className,
114
+ ...props
115
+ }) {
116
+ return /* @__PURE__ */ jsx(
117
+ SelectPrimitive.ScrollDownButton,
118
+ {
119
+ "data-slot": "select-scroll-down-button",
120
+ className: cn(
121
+ "flex cursor-default items-center justify-center py-1",
122
+ className
123
+ ),
124
+ ...props,
125
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4" })
126
+ }
127
+ );
128
+ }
129
+ var dataTypes = ["numeric", "categorical", "datetime", "boolean"];
130
+ var formats = [
131
+ "auto",
132
+ "number",
133
+ "currency",
134
+ "percent",
135
+ "date",
136
+ "datetime"
137
+ ];
138
+ function FieldInspector({ field, children, open, onOpenChange }) {
139
+ const fieldSettings = useDataLayer((state) => state.fieldSettings);
140
+ const updateFieldSettings = useDataLayer(
141
+ (state) => state.updateFieldSettings
142
+ );
143
+ const getFieldConversionPreview = useDataLayer(
144
+ (state) => state.getFieldConversionPreview
145
+ );
146
+ const getFieldLabel = useDataLayer((state) => state.getFieldLabel);
147
+ const getColumnData = useDataLayer((state) => state.getColumnData);
148
+ const calculations = useDataLayer((state) => state.calculations);
149
+ const fieldProfiles = useDataLayer((state) => state.fieldProfiles);
150
+ const [draft, setDraft] = useState({});
151
+ const [showAllFailures, setShowAllFailures] = useState(false);
152
+ const [localOpen, setLocalOpen] = useState(false);
153
+ const isOpen = open ?? localOpen;
154
+ const setOpen = onOpenChange ?? setLocalOpen;
155
+ useEffect(() => {
156
+ if (isOpen && field) {
157
+ setDraft((fieldSettings ?? {})[field] ?? {});
158
+ setShowAllFailures(false);
159
+ }
160
+ }, [isOpen, field, fieldSettings]);
161
+ const applied = field ? (fieldSettings ?? {})[field] ?? {} : {};
162
+ const isCalculated = Boolean(
163
+ field && (calculations ?? []).some(
164
+ (calculation) => calculation.resultColumnName === field
165
+ )
166
+ );
167
+ const calculatedProfile = (fieldProfiles ?? []).find(
168
+ (profile) => profile.name === field
169
+ );
170
+ const preview = useMemo(() => {
171
+ if (!isOpen || !field) return null;
172
+ if (!isCalculated) return getFieldConversionPreview(field, draft);
173
+ const values = getColumnData(field);
174
+ const rows = Object.values(values).map((value) => ({ [field]: value }));
175
+ return buildConversionPreview(
176
+ field,
177
+ rows,
178
+ draft,
179
+ calculatedProfile?.dataType ?? "categorical"
180
+ );
181
+ }, [
182
+ field,
183
+ getFieldConversionPreview,
184
+ getColumnData,
185
+ calculatedProfile?.dataType,
186
+ isCalculated,
187
+ isOpen,
188
+ draft
189
+ ]);
190
+ const settingsError = getFieldSettingsError(draft);
191
+ const conversionChanged = !isCalculated && (draft.type !== applied.type || draft.datePreset !== applied.datePreset || JSON.stringify(draft.nullTokens ?? []) !== JSON.stringify(applied.nullTokens ?? []));
192
+ if (!field) return null;
193
+ const update = (next) => setDraft((current) => ({ ...current, ...next }));
194
+ return /* @__PURE__ */ jsxs(Popover, { open: isOpen, onOpenChange: setOpen, modal: false, children: [
195
+ /* @__PURE__ */ jsx(ActionTooltip, { content: `Inspect ${getFieldLabel(field)}`, children: /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: children ?? /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", "aria-label": `Inspect ${field}`, children: /* @__PURE__ */ jsx(Settings2, { className: "h-4 w-4" }) }) }) }),
196
+ /* @__PURE__ */ jsxs(
197
+ PopoverContent,
198
+ {
199
+ "aria-label": `Inspect field: ${getFieldLabel(field)}`,
200
+ align: "start",
201
+ side: "bottom",
202
+ collisionPadding: 12,
203
+ className: "w-[min(400px,calc(100vw-24px))] max-h-[min(480px,var(--radix-popover-content-available-height))] overflow-y-auto p-3",
204
+ children: [
205
+ /* @__PURE__ */ jsxs("div", { className: "mb-3 space-y-1", children: [
206
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm font-semibold", children: [
207
+ /* @__PURE__ */ jsx(Settings2, { className: "h-4 w-4" }),
208
+ "Inspect field: ",
209
+ getFieldLabel(field)
210
+ ] }),
211
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: field !== getFieldLabel(field) ? /* @__PURE__ */ jsxs(Fragment, { children: [
212
+ "Source name: ",
213
+ /* @__PURE__ */ jsx("code", { children: field })
214
+ ] }) : "Field settings for this analysis" })
215
+ ] }),
216
+ preview && /* @__PURE__ */ jsxs("div", { className: "mb-3 flex flex-wrap gap-x-3 gap-y-1 rounded bg-muted/50 px-2 py-2 text-xs", children: [
217
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-x-3 gap-y-1", children: [
218
+ /* @__PURE__ */ jsxs("span", { children: [
219
+ "Inferred: ",
220
+ /* @__PURE__ */ jsx("strong", { children: preview.inferredType })
221
+ ] }),
222
+ /* @__PURE__ */ jsxs("span", { children: [
223
+ "Effective: ",
224
+ /* @__PURE__ */ jsx("strong", { children: preview.effectiveType })
225
+ ] }),
226
+ /* @__PURE__ */ jsxs("span", { children: [
227
+ preview.validCount,
228
+ " valid"
229
+ ] }),
230
+ /* @__PURE__ */ jsxs("span", { children: [
231
+ preview.missingCount,
232
+ " missing"
233
+ ] }),
234
+ /* @__PURE__ */ jsxs("span", { children: [
235
+ preview.failedCount,
236
+ " failed"
237
+ ] })
238
+ ] }),
239
+ preview.failedCount > 0 && /* @__PURE__ */ jsx("div", { className: "mt-2 text-destructive", children: "Invalid values become missing. Review the failed rows below." })
240
+ ] }),
241
+ /* @__PURE__ */ jsxs(Tabs, { defaultValue: "display", children: [
242
+ /* @__PURE__ */ jsxs(TabsList, { className: "grid h-8 w-full grid-cols-3", children: [
243
+ /* @__PURE__ */ jsx(TabsTrigger, { value: "display", className: "text-xs", children: "Display" }),
244
+ /* @__PURE__ */ jsx(TabsTrigger, { value: "type", className: "text-xs", children: "Type" }),
245
+ /* @__PURE__ */ jsx(TabsTrigger, { value: "preview", className: "text-xs", children: "Preview" })
246
+ ] }),
247
+ /* @__PURE__ */ jsxs(TabsContent, { value: "display", className: "mt-3 space-y-3", children: [
248
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
249
+ /* @__PURE__ */ jsx(Label, { htmlFor: "field-label", children: "Display label" }),
250
+ /* @__PURE__ */ jsx(
251
+ Input,
252
+ {
253
+ id: "field-label",
254
+ value: draft.label ?? "",
255
+ placeholder: field,
256
+ onChange: (event) => update({ label: event.target.value })
257
+ }
258
+ )
259
+ ] }),
260
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
261
+ /* @__PURE__ */ jsx(Label, { htmlFor: "field-description", children: "Description" }),
262
+ /* @__PURE__ */ jsx(
263
+ Input,
264
+ {
265
+ id: "field-description",
266
+ value: draft.description ?? "",
267
+ onChange: (event) => update({ description: event.target.value })
268
+ }
269
+ )
270
+ ] }),
271
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
272
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
273
+ /* @__PURE__ */ jsx(Label, { children: "Display format" }),
274
+ /* @__PURE__ */ jsxs(
275
+ Select,
276
+ {
277
+ value: draft.format ?? "auto",
278
+ onValueChange: (value) => update({ format: value }),
279
+ children: [
280
+ /* @__PURE__ */ jsx(SelectTrigger, { "aria-label": "Display format", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
281
+ /* @__PURE__ */ jsx(SelectContent, { children: formats.map((format) => /* @__PURE__ */ jsx(SelectItem, { value: format, children: format }, format)) })
282
+ ]
283
+ }
284
+ )
285
+ ] }),
286
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
287
+ /* @__PURE__ */ jsx(Label, { htmlFor: "field-precision", children: "Precision" }),
288
+ /* @__PURE__ */ jsx(
289
+ Input,
290
+ {
291
+ id: "field-precision",
292
+ type: "number",
293
+ min: 0,
294
+ max: 20,
295
+ value: draft.precision ?? "",
296
+ onChange: (event) => update({
297
+ precision: event.target.value === "" ? void 0 : Number(event.target.value)
298
+ })
299
+ }
300
+ )
301
+ ] }),
302
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
303
+ /* @__PURE__ */ jsx(Label, { htmlFor: "field-unit", children: "Unit suffix" }),
304
+ /* @__PURE__ */ jsx(
305
+ Input,
306
+ {
307
+ id: "field-unit",
308
+ value: draft.unit ?? "",
309
+ placeholder: "kg, ms, USD",
310
+ onChange: (event) => update({ unit: event.target.value })
311
+ }
312
+ )
313
+ ] }),
314
+ draft.format === "currency" && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
315
+ /* @__PURE__ */ jsx(Label, { htmlFor: "field-currency", children: "Currency code" }),
316
+ /* @__PURE__ */ jsx(
317
+ Input,
318
+ {
319
+ id: "field-currency",
320
+ value: draft.currency ?? "USD",
321
+ maxLength: 3,
322
+ onChange: (event) => update({ currency: event.target.value.toUpperCase() })
323
+ }
324
+ )
325
+ ] })
326
+ ] })
327
+ ] }),
328
+ /* @__PURE__ */ jsxs(TabsContent, { value: "type", className: "mt-3 space-y-3", children: [
329
+ isCalculated && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "This is a calculated field. Its formula controls the runtime type. Use the formula editor for type changes; this inspector controls display settings and previews calculated values." }),
330
+ preview && /* @__PURE__ */ jsxs(Fragment, { children: [
331
+ " ",
332
+ /* @__PURE__ */ jsxs("p", { className: "mt-2 text-muted-foreground", children: [
333
+ "Automatic inference currently treats this field as",
334
+ " ",
335
+ /* @__PURE__ */ jsx("strong", { children: preview.inferredType }),
336
+ ". An override changes runtime values, filters, calculations, and chart positions."
337
+ ] })
338
+ ] }),
339
+ !isCalculated && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
340
+ /* @__PURE__ */ jsx(Label, { children: "Type override" }),
341
+ /* @__PURE__ */ jsxs(
342
+ Select,
343
+ {
344
+ value: draft.type ?? "auto",
345
+ onValueChange: (value) => update({
346
+ type: value === "auto" ? void 0 : value
347
+ }),
348
+ children: [
349
+ /* @__PURE__ */ jsx(SelectTrigger, { "aria-label": "Type override", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
350
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
351
+ /* @__PURE__ */ jsx(SelectItem, { value: "auto", children: "Automatic" }),
352
+ dataTypes.map((type) => /* @__PURE__ */ jsx(SelectItem, { value: type, children: type }, type))
353
+ ] })
354
+ ]
355
+ }
356
+ )
357
+ ] }),
358
+ !isCalculated && draft.type === "datetime" && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
359
+ /* @__PURE__ */ jsx(Label, { children: "Date input preset" }),
360
+ /* @__PURE__ */ jsxs(
361
+ Select,
362
+ {
363
+ value: draft.datePreset ?? "iso",
364
+ onValueChange: (value) => update({ datePreset: value }),
365
+ children: [
366
+ /* @__PURE__ */ jsx(SelectTrigger, { "aria-label": "Date input preset", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
367
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
368
+ /* @__PURE__ */ jsx(SelectItem, { value: "iso", children: "ISO" }),
369
+ /* @__PURE__ */ jsx(SelectItem, { value: "month-day-year", children: "Month / day / year" }),
370
+ /* @__PURE__ */ jsx(SelectItem, { value: "day-month-year", children: "Day / month / year" })
371
+ ] })
372
+ ]
373
+ }
374
+ )
375
+ ] }),
376
+ !isCalculated && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
377
+ /* @__PURE__ */ jsx(Label, { htmlFor: "field-null-tokens", children: "Null tokens" }),
378
+ /* @__PURE__ */ jsx(
379
+ Input,
380
+ {
381
+ id: "field-null-tokens",
382
+ value: draft.nullTokens?.join(", ") ?? "",
383
+ placeholder: "NA, N/A, -",
384
+ onChange: (event) => update({
385
+ nullTokens: event.target.value.split(",").map((token) => token.trim()).filter(Boolean)
386
+ })
387
+ }
388
+ )
389
+ ] }),
390
+ conversionChanged && /* @__PURE__ */ jsxs("div", { className: "flex gap-2 rounded-md border border-warning/40 bg-warning/10 p-3 text-xs", children: [
391
+ /* @__PURE__ */ jsx(AlertCircle, { className: "mt-0.5 h-4 w-4 shrink-0 text-warning" }),
392
+ "Applying a type, date preset, or null-token change clears filters for this field."
393
+ ] })
394
+ ] }),
395
+ /* @__PURE__ */ jsxs(TabsContent, { value: "preview", className: "mt-3", children: [
396
+ preview && preview.examples.length > 0 && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
397
+ /* @__PURE__ */ jsx("h3", { className: "text-xs font-medium", children: "Conversion preview" }),
398
+ /* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded-md border", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-xs", children: [
399
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "border-b text-left", children: [
400
+ /* @__PURE__ */ jsx("th", { className: "p-2", children: "Row" }),
401
+ /* @__PURE__ */ jsx("th", { className: "p-2", children: "Raw" }),
402
+ /* @__PURE__ */ jsx("th", { className: "p-2", children: "Runtime" })
403
+ ] }) }),
404
+ /* @__PURE__ */ jsx("tbody", { children: preview.examples.map((example) => /* @__PURE__ */ jsxs(
405
+ "tr",
406
+ {
407
+ className: "border-b last:border-0",
408
+ children: [
409
+ /* @__PURE__ */ jsx("td", { className: "p-2 tabular-nums", children: example.row + 1 }),
410
+ /* @__PURE__ */ jsx("td", { className: "p-2 font-mono", children: String(example.raw) }),
411
+ /* @__PURE__ */ jsx("td", { className: "p-2", children: String(example.value ?? "Missing") })
412
+ ]
413
+ },
414
+ example.row
415
+ )) })
416
+ ] }) })
417
+ ] }),
418
+ preview && preview.failures.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-4 space-y-1.5 text-xs", children: [
419
+ /* @__PURE__ */ jsx("h3", { className: "font-medium text-destructive", children: "Failed rows" }),
420
+ /* @__PURE__ */ jsx("ul", { className: "max-h-24 overflow-y-auto text-muted-foreground", children: (showAllFailures ? preview.failures : preview.failures.slice(0, 12)).map((failure) => /* @__PURE__ */ jsxs("li", { children: [
421
+ "Row ",
422
+ failure.row + 1,
423
+ ": ",
424
+ String(failure.raw),
425
+ " \u2014",
426
+ " ",
427
+ failure.reason
428
+ ] }, failure.row)) }),
429
+ preview.failures.length > 12 && /* @__PURE__ */ jsx(
430
+ Button,
431
+ {
432
+ variant: "ghost",
433
+ size: "sm",
434
+ onClick: () => setShowAllFailures((current) => !current),
435
+ children: showAllFailures ? "Show fewer failed rows" : `Show all ${preview.failures.length} failed rows`
436
+ }
437
+ )
438
+ ] }),
439
+ !preview?.examples.length && !preview?.failures.length && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "No conversion issues or sample rows." })
440
+ ] })
441
+ ] }),
442
+ settingsError && /* @__PURE__ */ jsx("p", { role: "alert", className: "text-xs text-destructive", children: settingsError }),
443
+ /* @__PURE__ */ jsxs("div", { className: "sticky bottom-[-16px] mt-4 flex justify-end gap-2 border-t bg-popover py-3", children: [
444
+ /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onClick: () => setOpen(false), children: "Cancel" }),
445
+ /* @__PURE__ */ jsx(
446
+ Button,
447
+ {
448
+ size: "sm",
449
+ disabled: Boolean(settingsError),
450
+ onClick: () => {
451
+ updateFieldSettings(field, draft);
452
+ setOpen(false);
453
+ },
454
+ children: "Apply field settings"
455
+ }
456
+ )
457
+ ] })
458
+ ]
459
+ }
460
+ )
461
+ ] });
462
+ }
463
+
464
+ export { FieldInspector };
465
+ //# sourceMappingURL=chunk-LBTZVERO.js.map
466
+ //# sourceMappingURL=chunk-LBTZVERO.js.map