@vritti/quantum-ui 0.3.5 → 0.3.7

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 (114) hide show
  1. package/dist/Avatar.js +5 -5
  2. package/dist/Checkbox2.js +2 -2
  3. package/dist/Combination.js +1 -1
  4. package/dist/ConfirmContext.js +20 -1
  5. package/dist/ConfirmContext.js.map +1 -1
  6. package/dist/Dialog.js +24 -38
  7. package/dist/Dialog.js.map +1 -1
  8. package/dist/DropdownMenu.js +1 -0
  9. package/dist/DropdownMenu.js.map +1 -1
  10. package/dist/Progress.js +2 -2
  11. package/dist/RadioGroup.js +2 -2
  12. package/dist/Sidebar.js +1 -1
  13. package/dist/Switch.js +19 -16
  14. package/dist/Switch.js.map +1 -1
  15. package/dist/TabsSkeleton.js +1 -1
  16. package/dist/TextField.js +64 -45
  17. package/dist/TextField.js.map +1 -1
  18. package/dist/Toggle.js +1 -1
  19. package/dist/ViewTabs.js +1 -2
  20. package/dist/ViewTabs.js.map +1 -1
  21. package/dist/assets/quantum-ui.css +13 -16
  22. package/dist/cells.js +50 -21
  23. package/dist/cells.js.map +1 -1
  24. package/dist/components/Dialog.js +1 -1
  25. package/dist/components/RichTextEditor.js +1 -1
  26. package/dist/dropdown-menu.js +3 -2
  27. package/dist/dropdown-menu.js.map +1 -1
  28. package/dist/image-component.js +1 -1
  29. package/dist/index.js +2 -3
  30. package/dist/index.js.map +1 -1
  31. package/dist/index12.js +3 -2
  32. package/dist/index12.js.map +1 -1
  33. package/dist/index13.js +2 -1
  34. package/dist/index13.js.map +1 -1
  35. package/dist/index14.js +6 -5
  36. package/dist/index14.js.map +1 -1
  37. package/dist/index15.js +1 -1
  38. package/dist/index16.js +1 -1
  39. package/dist/index18.js +1 -1
  40. package/dist/index20.js +1 -1
  41. package/dist/index21.js +1 -1
  42. package/dist/index23.js +1 -1
  43. package/dist/index25.js +3 -2534
  44. package/dist/index25.js.map +1 -1
  45. package/dist/index26.js +2526 -22
  46. package/dist/index26.js.map +1 -1
  47. package/dist/index27.js +32 -4
  48. package/dist/index27.js.map +1 -1
  49. package/dist/index28.js +4 -37
  50. package/dist/index28.js.map +1 -1
  51. package/dist/index29.js +36 -310
  52. package/dist/index29.js.map +1 -1
  53. package/dist/index30.js +309 -7
  54. package/dist/index30.js.map +1 -1
  55. package/dist/index31.js +8 -30
  56. package/dist/index31.js.map +1 -1
  57. package/dist/index32.js +29 -59
  58. package/dist/index32.js.map +1 -1
  59. package/dist/index33.js +59 -10
  60. package/dist/index33.js.map +1 -1
  61. package/dist/index34.js +10 -35
  62. package/dist/index34.js.map +1 -1
  63. package/dist/index35.js +27 -36810
  64. package/dist/index35.js.map +1 -1
  65. package/dist/index36.js +36809 -70
  66. package/dist/index36.js.map +1 -1
  67. package/dist/index37.js +72 -187
  68. package/dist/index37.js.map +1 -1
  69. package/dist/index38.js +199 -0
  70. package/dist/index38.js.map +1 -0
  71. package/dist/index4.js +1 -1
  72. package/dist/lib/components/DataTable/components/DataTableImportDialog.d.ts.map +1 -1
  73. package/dist/lib/components/DataTable/components/DataTableViewTabs.d.ts.map +1 -1
  74. package/dist/lib/components/DataTable/components/DataTableViewsMenu.d.ts.map +1 -1
  75. package/dist/lib/components/DataTable/components/RowActions.d.ts.map +1 -1
  76. package/dist/lib/components/Dialog/Dialog.d.ts +15 -16
  77. package/dist/lib/components/Dialog/Dialog.d.ts.map +1 -1
  78. package/dist/lib/components/Dialog/index.d.ts +2 -2
  79. package/dist/lib/components/Dialog/index.d.ts.map +1 -1
  80. package/dist/lib/components/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  81. package/dist/lib/components/DropdownMenu/types.d.ts +2 -1
  82. package/dist/lib/components/DropdownMenu/types.d.ts.map +1 -1
  83. package/dist/lib/components/Switch/Switch.d.ts.map +1 -1
  84. package/dist/lib/components/TextField/TextField.d.ts.map +1 -1
  85. package/dist/lib/context/ConfirmContext.d.ts.map +1 -1
  86. package/dist/lib/selects/index.d.ts +0 -1
  87. package/dist/lib/selects/index.d.ts.map +1 -1
  88. package/dist/lib/selects/tax-group/TaxGroupFilter.d.ts +12 -0
  89. package/dist/lib/selects/tax-group/TaxGroupFilter.d.ts.map +1 -0
  90. package/dist/lib/selects/tax-group/TaxGroupSelector.d.ts +4 -0
  91. package/dist/lib/selects/tax-group/TaxGroupSelector.d.ts.map +1 -0
  92. package/dist/lib/selects/tax-group/index.d.ts +3 -0
  93. package/dist/lib/selects/tax-group/index.d.ts.map +1 -0
  94. package/dist/selects/tax-group.js +37 -0
  95. package/dist/selects/tax-group.js.map +1 -0
  96. package/dist/shadcn/shadcnSwitch/Switch.d.ts +1 -1
  97. package/dist/shadcn/shadcnSwitch/Switch.d.ts.map +1 -1
  98. package/dist/trash-2.js +17 -3
  99. package/dist/trash-2.js.map +1 -1
  100. package/dist/utils/motion.js +2 -2
  101. package/dist/value.js +1 -1
  102. package/package.json +5 -5
  103. package/dist/BomSelector.js +0 -37
  104. package/dist/BomSelector.js.map +0 -1
  105. package/dist/lib/selects/bom/BomFilter.d.ts +0 -12
  106. package/dist/lib/selects/bom/BomFilter.d.ts.map +0 -1
  107. package/dist/lib/selects/bom/BomSelector.d.ts +0 -4
  108. package/dist/lib/selects/bom/BomSelector.d.ts.map +0 -1
  109. package/dist/lib/selects/bom/index.d.ts +0 -3
  110. package/dist/lib/selects/bom/index.d.ts.map +0 -1
  111. package/dist/plus.js +0 -18
  112. package/dist/plus.js.map +0 -1
  113. package/dist/selects/bom.js +0 -2
  114. package/dist/selects/bom.js.map +0 -1
package/dist/TextField.js CHANGED
@@ -7,7 +7,22 @@ import { C as ChevronUp } from './chevron-up.js';
7
7
  import { C as ChevronDown } from './chevron-down.js';
8
8
 
9
9
  const TextField = React__default.forwardRef(
10
- ({ label, description, error, className, id, disabled, startAdornment, endAdornment, positive, nonZero, integer, onChange, ...props }, ref) => {
10
+ ({
11
+ label,
12
+ description,
13
+ error,
14
+ className,
15
+ id,
16
+ disabled,
17
+ startAdornment,
18
+ endAdornment,
19
+ positive,
20
+ nonZero,
21
+ integer,
22
+ onChange,
23
+ style,
24
+ ...props
25
+ }, ref) => {
11
26
  const isNumberType = props.type === "number";
12
27
  const normalizedType = isNumberType ? "text" : props.type;
13
28
  const normalizedInputMode = props.inputMode ?? (isNumberType ? integer ? "numeric" : "decimal" : void 0);
@@ -17,6 +32,8 @@ const TextField = React__default.forwardRef(
17
32
  const effectiveMin = positiveFloor !== void 0 && propsMinValid !== void 0 ? Math.max(positiveFloor, propsMinValid) : propsMinValid ?? positiveFloor;
18
33
  const inputRef = React__default.useRef(null);
19
34
  const [rawInput, setRawInput] = React__default.useState("");
35
+ const endOverlayRef = React__default.useRef(null);
36
+ const [endPadding, setEndPadding] = React__default.useState(void 0);
20
37
  const assignRef = React__default.useCallback(
21
38
  (node) => {
22
39
  inputRef.current = node;
@@ -117,6 +134,20 @@ const TextField = React__default.forwardRef(
117
134
  autoConstraintText ? /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground whitespace-nowrap", children: autoConstraintText }) : null,
118
135
  endAdornment
119
136
  ] });
137
+ const hasEndContent = isNumberType || !!endAdornment || !!autoConstraintText;
138
+ React__default.useLayoutEffect(() => {
139
+ const node = endOverlayRef.current;
140
+ if (!hasEndContent || !node) {
141
+ setEndPadding(void 0);
142
+ return;
143
+ }
144
+ const measure = () => setEndPadding(node.offsetWidth + 4);
145
+ measure();
146
+ if (typeof ResizeObserver === "undefined") return;
147
+ const observer = new ResizeObserver(measure);
148
+ observer.observe(node);
149
+ return () => observer.disconnect();
150
+ }, [hasEndContent]);
120
151
  return /* @__PURE__ */ jsxs(Field, { "data-disabled": disabled, children: [
121
152
  label && /* @__PURE__ */ jsx(FieldLabel, { children: label }),
122
153
  /* @__PURE__ */ jsxs("div", { className: "relative", children: [
@@ -127,15 +158,10 @@ const TextField = React__default.forwardRef(
127
158
  "aria-invalid": !!error,
128
159
  ref: assignRef,
129
160
  disabled,
130
- className: cn(
131
- className,
132
- startAdornment && "pl-10",
133
- isNumberType && (endAdornment || autoConstraintText) && "pr-36",
134
- isNumberType && !endAdornment && !autoConstraintText && "pr-12",
135
- !isNumberType && (endAdornment || autoConstraintText) && "pr-10"
136
- ),
161
+ className: cn(className, startAdornment && "pl-10"),
137
162
  id,
138
163
  ...props,
164
+ style: { ...style, paddingRight: endPadding },
139
165
  value: displayValue,
140
166
  min: effectiveMin,
141
167
  type: normalizedType,
@@ -144,44 +170,37 @@ const TextField = React__default.forwardRef(
144
170
  onChange: handleChange
145
171
  }
146
172
  ),
147
- isNumberType && /* @__PURE__ */ jsx("div", { className: "absolute inset-y-0 right-2 z-20 flex items-center", children: /* @__PURE__ */ jsxs("div", { className: "flex h-7 w-4 flex-col overflow-hidden rounded-sm border border-border bg-background", children: [
148
- /* @__PURE__ */ jsx(
149
- "button",
150
- {
151
- type: "button",
152
- tabIndex: -1,
153
- className: "flex h-1/2 items-center justify-center border-b border-border text-muted-foreground hover:bg-accent disabled:opacity-50",
154
- onMouseDown: (event) => event.preventDefault(),
155
- onClick: () => setInputNumericValue(1),
156
- disabled,
157
- "aria-label": "Increase value",
158
- children: /* @__PURE__ */ jsx(ChevronUp, { className: "size-2.5" })
159
- }
160
- ),
161
- /* @__PURE__ */ jsx(
162
- "button",
163
- {
164
- type: "button",
165
- tabIndex: -1,
166
- className: "flex h-1/2 items-center justify-center text-muted-foreground hover:bg-accent disabled:opacity-50",
167
- onMouseDown: (event) => event.preventDefault(),
168
- onClick: () => setInputNumericValue(-1),
169
- disabled,
170
- "aria-label": "Decrease value",
171
- children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-2.5" })
172
- }
173
- )
174
- ] }) }),
175
- (endAdornment || autoConstraintText) && /* @__PURE__ */ jsx(
176
- "div",
177
- {
178
- className: cn(
179
- "absolute inset-y-0 flex items-center gap-2",
180
- isNumberType ? "right-8 pr-2 z-10" : "right-0 pr-3"
173
+ hasEndContent && /* @__PURE__ */ jsxs("div", { ref: endOverlayRef, className: "absolute inset-y-0 right-0 z-10 flex items-center gap-2 pr-2", children: [
174
+ (endAdornment || autoConstraintText) && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: combinedEndAdornment }),
175
+ isNumberType && /* @__PURE__ */ jsxs("div", { className: "flex h-7 w-4 flex-col overflow-hidden rounded-sm border border-border bg-background", children: [
176
+ /* @__PURE__ */ jsx(
177
+ "button",
178
+ {
179
+ type: "button",
180
+ tabIndex: -1,
181
+ className: "flex h-1/2 items-center justify-center border-b border-border text-muted-foreground hover:bg-accent disabled:opacity-50",
182
+ onMouseDown: (event) => event.preventDefault(),
183
+ onClick: () => setInputNumericValue(1),
184
+ disabled,
185
+ "aria-label": "Increase value",
186
+ children: /* @__PURE__ */ jsx(ChevronUp, { className: "size-2.5" })
187
+ }
181
188
  ),
182
- children: combinedEndAdornment
183
- }
184
- )
189
+ /* @__PURE__ */ jsx(
190
+ "button",
191
+ {
192
+ type: "button",
193
+ tabIndex: -1,
194
+ className: "flex h-1/2 items-center justify-center text-muted-foreground hover:bg-accent disabled:opacity-50",
195
+ onMouseDown: (event) => event.preventDefault(),
196
+ onClick: () => setInputNumericValue(-1),
197
+ disabled,
198
+ "aria-label": "Decrease value",
199
+ children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-2.5" })
200
+ }
201
+ )
202
+ ] })
203
+ ] })
185
204
  ] }),
186
205
  description && !error && /* @__PURE__ */ jsx(FieldDescription, { children: description }),
187
206
  error && /* @__PURE__ */ jsx(FieldError, { children: error })
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.js","sources":["../lib/components/TextField/TextField.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from 'lucide-react';\nimport React from 'react';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { cn } from '../../../shadcn/utils';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\nexport interface TextFieldProps extends React.ComponentProps<'input'> {\n label?: string;\n description?: React.ReactNode;\n error?: string;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n // Blocks negative values and '-'/'e' keys. Combined with `integer`, also blocks `0` and\n // sets min to 1 (so positive+integer means ≥1). For decimal mode, zero is still typeable so\n // the user can start \"0.5\"; zod is the final gate.\n positive?: boolean;\n // Blocks zero. Combined with `integer`, blocks `0` as the first keystroke. Use independently\n // from `positive` when the field accepts signed-but-not-zero values.\n nonZero?: boolean;\n // Blocks decimal input ('.' and ','); switches inputMode to numeric\n integer?: boolean;\n}\n\n// TextField molecule - Input + Label composition using Field system\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(\n (\n { label, description, error, className, id, disabled, startAdornment, endAdornment, positive, nonZero, integer, onChange, ...props },\n ref,\n ) => {\n const isNumberType = props.type === 'number';\n const normalizedType = isNumberType ? 'text' : props.type;\n const normalizedInputMode = props.inputMode ?? (isNumberType ? (integer ? 'numeric' : 'decimal') : undefined);\n // Resolve the actual minimum: positive floor takes precedence when both are set, so\n // `positive` always blocks negatives even if a contradictory `min` is passed.\n // For integer mode, `positive` means ≥1 (floor 1). For decimal mode, HTML min stays at 0 so\n // values like 0.3 / 0.5 remain typeable; the form/zod layer rejects plain 0.\n const positiveFloor = positive ? (integer ? 1 : 0) : undefined;\n const propsMinNum = props.min != null && props.min !== '' ? Number(props.min) : undefined;\n const propsMinValid = propsMinNum !== undefined && Number.isFinite(propsMinNum) ? propsMinNum : undefined;\n const effectiveMin =\n positiveFloor !== undefined && propsMinValid !== undefined\n ? Math.max(positiveFloor, propsMinValid)\n : (propsMinValid ?? positiveFloor);\n const inputRef = React.useRef<HTMLInputElement>(null);\n // Tracks the last raw string typed so intermediate states like \"-\" or \"0.\" survive the\n // round-trip through RHF. Must be state (not a ref) so updates trigger a re-render and\n // React's controlled input doesn't revert the DOM to the canonical number.\n const [rawInput, setRawInput] = React.useState<string>('');\n\n const assignRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const setInputNumericValue = React.useCallback(\n (delta: 1 | -1) => {\n if (!isNumberType || disabled) return;\n const input = inputRef.current;\n if (!input) return;\n\n const parsedStep = Number(props.step);\n const step = Number.isFinite(parsedStep) && parsedStep > 0 ? parsedStep : 1;\n const parsedMax = Number(props.max);\n const max = Number.isFinite(parsedMax) ? parsedMax : undefined;\n const current = Number(input.value);\n const baseValue = Number.isFinite(current) ? current : (effectiveMin ?? 0);\n\n let next = baseValue + delta * step;\n if (effectiveMin !== undefined) next = Math.max(effectiveMin, next);\n if (max !== undefined) next = Math.min(max, next);\n\n const stepString = String(step);\n const decimals = integer || stepString.includes('.') === false ? 0 : (stepString.split('.')[1]?.length ?? 0);\n const nextValue = decimals > 0 ? next.toFixed(decimals) : String(Math.round(next));\n\n const valueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;\n valueSetter?.call(input, nextValue);\n input.dispatchEvent(new Event('input', { bubbles: true }));\n },\n [isNumberType, disabled, effectiveMin, integer, props.max, props.step],\n );\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (isNumberType) {\n const raw = event.target.value;\n setRawInput(raw);\n const num = raw === '' ? NaN : Number(raw);\n (onChange as unknown as (v: number) => void)?.(num);\n } else {\n onChange?.(event);\n }\n },\n [isNumberType, onChange],\n );\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n props.onKeyDown?.(event);\n if (event.defaultPrevented || !isNumberType || disabled) return;\n if (positive && (event.key === '-' || event.key === 'e')) {\n event.preventDefault();\n return;\n }\n if (integer && (event.key === '.' || event.key === ',' || event.key === 'e')) {\n event.preventDefault();\n return;\n }\n // Block '0' as the first keystroke in integer mode when either `positive` (≥1) or\n // `nonZero` is set. Decimal mode needs '0' to remain typeable so the user can start \"0.3\".\n if (\n (positive || nonZero) &&\n integer &&\n event.key === '0' &&\n (event.currentTarget.value === '' || event.currentTarget.value === '0')\n ) {\n event.preventDefault();\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setInputNumericValue(1);\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n setInputNumericValue(-1);\n }\n },\n [isNumberType, disabled, positive, nonZero, integer, setInputNumericValue, props.onKeyDown],\n );\n\n // For number fields, prefer the raw typed string when it represents the same value as\n // the stored number — preserves intermediate states like \"0.\", \"1.50\", \"-\" that would\n // otherwise be lost as React reconciles the controlled input back to the canonical form.\n let displayValue: TextFieldProps['value'] = props.value;\n if (isNumberType && typeof props.value === 'number') {\n if (Number.isNaN(props.value)) {\n displayValue = rawInput;\n } else if (rawInput !== '' && Number(rawInput) === props.value) {\n displayValue = rawInput;\n }\n }\n\n const hasMin = propsMinValid !== undefined;\n const hasMax = props.max != null && props.max !== '';\n const hints: string[] = [];\n const integerLabel = positive ? '+Int' : 'Int';\n const positiveLabel = '+';\n const nonZeroLabel = '≠0';\n if (integer && nonZero) hints.push(`${integerLabel} ${nonZeroLabel}`);\n else if (integer) hints.push(integerLabel);\n else if (positive && nonZero) hints.push(`${positiveLabel} ${nonZeroLabel}`);\n else if (positive) hints.push(positiveLabel);\n else if (nonZero) hints.push(nonZeroLabel);\n if (hasMin && hasMax) hints.push(`Range: ${propsMinValid} - ${props.max}`);\n else if (hasMax) hints.push(`Max: ${props.max}`);\n else if (hasMin) hints.push(`Min: ${propsMinValid}`);\n const autoConstraintText = hints.join(', ');\n const combinedEndAdornment = (\n <>\n {autoConstraintText ? (\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">{autoConstraintText}</span>\n ) : null}\n {endAdornment}\n </>\n );\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n <div className=\"relative\">\n {startAdornment && (\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none\">{startAdornment}</div>\n )}\n <Input\n aria-invalid={!!error}\n ref={assignRef}\n disabled={disabled}\n className={cn(\n className,\n startAdornment && 'pl-10',\n isNumberType && (endAdornment || autoConstraintText) && 'pr-36',\n isNumberType && !endAdornment && !autoConstraintText && 'pr-12',\n !isNumberType && (endAdornment || autoConstraintText) && 'pr-10',\n )}\n id={id}\n {...props}\n value={displayValue}\n min={effectiveMin}\n type={normalizedType}\n inputMode={normalizedInputMode}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n />\n {isNumberType && (\n <div className=\"absolute inset-y-0 right-2 z-20 flex items-center\">\n <div className=\"flex h-7 w-4 flex-col overflow-hidden rounded-sm border border-border bg-background\">\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center border-b border-border text-muted-foreground hover:bg-accent disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setInputNumericValue(1)}\n disabled={disabled}\n aria-label=\"Increase value\"\n >\n <ChevronUp className=\"size-2.5\" />\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center text-muted-foreground hover:bg-accent disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setInputNumericValue(-1)}\n disabled={disabled}\n aria-label=\"Decrease value\"\n >\n <ChevronDown className=\"size-2.5\" />\n </button>\n </div>\n </div>\n )}\n {(endAdornment || autoConstraintText) && (\n <div\n className={cn(\n 'absolute inset-y-0 flex items-center gap-2',\n isNumberType ? 'right-8 pr-2 z-10' : 'right-0 pr-3',\n )}\n >\n {combinedEndAdornment}\n </div>\n )}\n </div>\n\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nTextField.displayName = 'TextField';\n"],"names":["React"],"mappings":";;;;;;;;AAwBO,MAAM,YAAYA,cAAA,CAAM,UAAA;AAAA,EAC7B,CACE,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAW,EAAA,EAAI,QAAA,EAAU,cAAA,EAAgB,YAAA,EAAc,UAAU,OAAA,EAAS,OAAA,EAAS,UAAU,GAAG,KAAA,IAC7H,GAAA,KACG;AACH,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,KAAS,QAAA;AACpC,IAAA,MAAM,cAAA,GAAiB,YAAA,GAAe,MAAA,GAAS,KAAA,CAAM,IAAA;AACrD,IAAA,MAAM,sBAAsB,KAAA,CAAM,SAAA,KAAc,YAAA,GAAgB,OAAA,GAAU,YAAY,SAAA,GAAa,MAAA,CAAA;AAKnG,IAAA,MAAM,aAAA,GAAgB,QAAA,GAAY,OAAA,GAAU,CAAA,GAAI,CAAA,GAAK,MAAA;AACrD,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,IAAO,IAAA,IAAQ,KAAA,CAAM,QAAQ,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA;AAChF,IAAA,MAAM,gBAAgB,WAAA,KAAgB,MAAA,IAAa,OAAO,QAAA,CAAS,WAAW,IAAI,WAAA,GAAc,MAAA;AAChG,IAAA,MAAM,YAAA,GACJ,aAAA,KAAkB,MAAA,IAAa,aAAA,KAAkB,MAAA,GAC7C,KAAK,GAAA,CAAI,aAAA,EAAe,aAAa,CAAA,GACpC,aAAA,IAAiB,aAAA;AACxB,IAAA,MAAM,QAAA,GAAWA,cAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AAIpD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,CAAM,SAAiB,EAAE,CAAA;AAEzD,IAAA,MAAM,YAAYA,cAAA,CAAM,WAAA;AAAA,MACtB,CAAC,IAAA,KAAkC;AACjC,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,QAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,UAAA,GAAA,CAAI,IAAI,CAAA;AAAA,QACV,WAAW,GAAA,EAAK;AACd,UAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,QAChB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,GAAG;AAAA,KACN;AAEA,IAAA,MAAM,uBAAuBA,cAAA,CAAM,WAAA;AAAA,MACjC,CAAC,KAAA,KAAkB;AACjB,QAAA,IAAI,CAAC,gBAAgB,QAAA,EAAU;AAC/B,QAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,QAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AACpC,QAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,IAAK,UAAA,GAAa,IAAI,UAAA,GAAa,CAAA;AAC1E,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAClC,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,SAAS,IAAI,SAAA,GAAY,MAAA;AACrD,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAClC,QAAA,MAAM,YAAY,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,GAAI,UAAW,YAAA,IAAgB,CAAA;AAExE,QAAA,IAAI,IAAA,GAAO,YAAY,KAAA,GAAQ,IAAA;AAC/B,QAAA,IAAI,iBAAiB,MAAA,EAAW,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,cAAc,IAAI,CAAA;AAClE,QAAA,IAAI,QAAQ,MAAA,EAAW,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAEhD,QAAA,MAAM,UAAA,GAAa,OAAO,IAAI,CAAA;AAC9B,QAAA,MAAM,QAAA,GAAW,OAAA,IAAW,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,KAAM,KAAA,GAAQ,CAAA,GAAK,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,MAAA,IAAU,CAAA;AAC1G,QAAA,MAAM,SAAA,GAAY,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEjF,QAAA,MAAM,cAAc,MAAA,CAAO,wBAAA,CAAyB,OAAO,gBAAA,CAAiB,SAAA,EAAW,OAAO,CAAA,EAAG,GAAA;AACjG,QAAA,WAAA,EAAa,IAAA,CAAK,OAAO,SAAS,CAAA;AAClC,QAAA,KAAA,CAAM,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,MAC3D,CAAA;AAAA,MACA,CAAC,cAAc,QAAA,EAAU,YAAA,EAAc,SAAS,KAAA,CAAM,GAAA,EAAK,MAAM,IAAI;AAAA,KACvE;AAEA,IAAA,MAAM,eAAeA,cAAA,CAAM,WAAA;AAAA,MACzB,CAAC,KAAA,KAA+C;AAC9C,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,KAAA;AACzB,UAAA,WAAA,CAAY,GAAG,CAAA;AACf,UAAA,MAAM,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,GAAA,GAAM,OAAO,GAAG,CAAA;AACzC,UAAC,WAA8C,GAAG,CAAA;AAAA,QACpD,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,cAAc,QAAQ;AAAA,KACzB;AAEA,IAAA,MAAM,gBAAgBA,cAAA,CAAM,WAAA;AAAA,MAC1B,CAAC,KAAA,KAAiD;AAChD,QAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AACvB,QAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,CAAC,YAAA,IAAgB,QAAA,EAAU;AACzD,QAAA,IAAI,aAAa,KAAA,CAAM,GAAA,KAAQ,GAAA,IAAO,KAAA,CAAM,QAAQ,GAAA,CAAA,EAAM;AACxD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAA,KAAY,MAAM,GAAA,KAAQ,GAAA,IAAO,MAAM,GAAA,KAAQ,GAAA,IAAO,KAAA,CAAM,GAAA,KAAQ,GAAA,CAAA,EAAM;AAC5E,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA;AAAA,QACF;AAGA,QAAA,IAAA,CACG,QAAA,IAAY,OAAA,KACb,OAAA,IACA,KAAA,CAAM,GAAA,KAAQ,GAAA,KACb,KAAA,CAAM,aAAA,CAAc,KAAA,KAAU,EAAA,IAAM,KAAA,CAAM,aAAA,CAAc,UAAU,GAAA,CAAA,EACnE;AACA,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AAC3B,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,oBAAA,CAAqB,CAAC,CAAA;AAAA,QACxB,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,WAAA,EAAa;AACpC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,oBAAA,CAAqB,EAAE,CAAA;AAAA,QACzB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,cAAc,QAAA,EAAU,QAAA,EAAU,SAAS,OAAA,EAAS,oBAAA,EAAsB,MAAM,SAAS;AAAA,KAC5F;AAKA,IAAA,IAAI,eAAwC,KAAA,CAAM,KAAA;AAClD,IAAA,IAAI,YAAA,IAAgB,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU;AACnD,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EAAG;AAC7B,QAAA,YAAA,GAAe,QAAA;AAAA,MACjB,WAAW,QAAA,KAAa,EAAA,IAAM,OAAO,QAAQ,CAAA,KAAM,MAAM,KAAA,EAAO;AAC9D,QAAA,YAAA,GAAe,QAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,aAAA,KAAkB,MAAA;AACjC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,IAAO,IAAA,IAAQ,MAAM,GAAA,KAAQ,EAAA;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,YAAA,GAAe,WAAW,MAAA,GAAS,KAAA;AACzC,IAAA,MAAM,aAAA,GAAgB,GAAA;AACtB,IAAA,MAAM,YAAA,GAAe,IAAA;AACrB,IAAA,IAAI,OAAA,IAAW,SAAS,KAAA,CAAM,IAAA,CAAK,GAAG,YAAY,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AAAA,SAAA,IAC3D,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AAAA,SAAA,IAChC,QAAA,IAAY,SAAS,KAAA,CAAM,IAAA,CAAK,GAAG,aAAa,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AAAA,SAAA,IAClE,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAAA,SAAA,IAClC,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,IAAI,MAAA,IAAU,QAAQ,KAAA,CAAM,IAAA,CAAK,UAAU,aAAa,CAAA,GAAA,EAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA;AAAA,SAAA,IAChE,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA;AAAA,SAAA,IACtC,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,aAAa,CAAA,CAAE,CAAA;AACnD,IAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,MAAM,uCACJ,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,kBAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAA,EAAmD,8BAAmB,CAAA,GACpF,IAAA;AAAA,MACH;AAAA,KAAA,EACH,CAAA;AAGF,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAM,eAAA,EAAe,QAAA,EACnB,QAAA,EAAA;AAAA,MAAA,KAAA,oBAAS,GAAA,CAAC,cAAY,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAE7B,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACZ,QAAA,EAAA;AAAA,QAAA,cAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EAAwE,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,wBAExG,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,cAAA,EAAc,CAAC,CAAC,KAAA;AAAA,YAChB,GAAA,EAAK,SAAA;AAAA,YACL,QAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,SAAA;AAAA,cACA,cAAA,IAAkB,OAAA;AAAA,cAClB,YAAA,KAAiB,gBAAgB,kBAAA,CAAA,IAAuB,OAAA;AAAA,cACxD,YAAA,IAAgB,CAAC,YAAA,IAAgB,CAAC,kBAAA,IAAsB,OAAA;AAAA,cACxD,CAAC,YAAA,KAAiB,YAAA,IAAgB,kBAAA,CAAA,IAAuB;AAAA,aAC3D;AAAA,YACA,EAAA;AAAA,YACC,GAAG,KAAA;AAAA,YACJ,KAAA,EAAO,YAAA;AAAA,YACP,GAAA,EAAK,YAAA;AAAA,YACL,IAAA,EAAM,cAAA;AAAA,YACN,SAAA,EAAW,mBAAA;AAAA,YACX,SAAA,EAAW,aAAA;AAAA,YACX,QAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QACC,YAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qFAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,SAAA,EAAU,yHAAA;AAAA,cACV,WAAA,EAAa,CAAC,KAAA,KAAU,KAAA,CAAM,cAAA,EAAe;AAAA,cAC7C,OAAA,EAAS,MAAM,oBAAA,CAAqB,CAAC,CAAA;AAAA,cACrC,QAAA;AAAA,cACA,YAAA,EAAW,gBAAA;AAAA,cAEX,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,WAClC;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,SAAA,EAAU,kGAAA;AAAA,cACV,WAAA,EAAa,CAAC,KAAA,KAAU,KAAA,CAAM,cAAA,EAAe;AAAA,cAC7C,OAAA,EAAS,MAAM,oBAAA,CAAqB,EAAE,CAAA;AAAA,cACtC,QAAA;AAAA,cACA,YAAA,EAAW,gBAAA;AAAA,cAEX,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AACpC,SAAA,EACF,CAAA,EACF,CAAA;AAAA,QAAA,CAEA,gBAAgB,kBAAA,qBAChB,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,4CAAA;AAAA,cACA,eAAe,mBAAA,GAAsB;AAAA,aACvC;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EAEJ,CAAA;AAAA,MAEC,WAAA,IAAe,CAAC,KAAA,oBAAS,GAAA,CAAC,oBAAkB,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,MACxD,KAAA,oBAAS,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAC/B,CAAA;AAAA,EAEJ;AACF;AAEA,SAAA,CAAU,WAAA,GAAc,WAAA;;;;"}
1
+ {"version":3,"file":"TextField.js","sources":["../lib/components/TextField/TextField.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from 'lucide-react';\nimport React from 'react';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { cn } from '../../../shadcn/utils';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\nexport interface TextFieldProps extends React.ComponentProps<'input'> {\n label?: string;\n description?: React.ReactNode;\n error?: string;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n // Blocks negative values and '-'/'e' keys. Combined with `integer`, also blocks `0` and\n // sets min to 1 (so positive+integer means ≥1). For decimal mode, zero is still typeable so\n // the user can start \"0.5\"; zod is the final gate.\n positive?: boolean;\n // Blocks zero. Combined with `integer`, blocks `0` as the first keystroke. Use independently\n // from `positive` when the field accepts signed-but-not-zero values.\n nonZero?: boolean;\n // Blocks decimal input ('.' and ','); switches inputMode to numeric\n integer?: boolean;\n}\n\n// TextField molecule - Input + Label composition using Field system\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n label,\n description,\n error,\n className,\n id,\n disabled,\n startAdornment,\n endAdornment,\n positive,\n nonZero,\n integer,\n onChange,\n style,\n ...props\n },\n ref,\n ) => {\n const isNumberType = props.type === 'number';\n const normalizedType = isNumberType ? 'text' : props.type;\n const normalizedInputMode = props.inputMode ?? (isNumberType ? (integer ? 'numeric' : 'decimal') : undefined);\n // Resolve the actual minimum: positive floor takes precedence when both are set, so\n // `positive` always blocks negatives even if a contradictory `min` is passed.\n // For integer mode, `positive` means ≥1 (floor 1). For decimal mode, HTML min stays at 0 so\n // values like 0.3 / 0.5 remain typeable; the form/zod layer rejects plain 0.\n const positiveFloor = positive ? (integer ? 1 : 0) : undefined;\n const propsMinNum = props.min != null && props.min !== '' ? Number(props.min) : undefined;\n const propsMinValid = propsMinNum !== undefined && Number.isFinite(propsMinNum) ? propsMinNum : undefined;\n const effectiveMin =\n positiveFloor !== undefined && propsMinValid !== undefined\n ? Math.max(positiveFloor, propsMinValid)\n : (propsMinValid ?? positiveFloor);\n const inputRef = React.useRef<HTMLInputElement>(null);\n // Tracks the last raw string typed so intermediate states like \"-\" or \"0.\" survive the\n // round-trip through RHF. Must be state (not a ref) so updates trigger a re-render and\n // React's controlled input doesn't revert the DOM to the canonical number.\n const [rawInput, setRawInput] = React.useState<string>('');\n // Trailing overlay (constraint hint + stepper / end adornment) is measured at runtime so the\n // input reserves exactly its width as right padding — a one-char hint like \"+\" no longer costs\n // the same as \"Range: 0 - 100\". Re-measures on content/size changes via ResizeObserver.\n const endOverlayRef = React.useRef<HTMLDivElement>(null);\n const [endPadding, setEndPadding] = React.useState<number | undefined>(undefined);\n\n const assignRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const setInputNumericValue = React.useCallback(\n (delta: 1 | -1) => {\n if (!isNumberType || disabled) return;\n const input = inputRef.current;\n if (!input) return;\n\n const parsedStep = Number(props.step);\n const step = Number.isFinite(parsedStep) && parsedStep > 0 ? parsedStep : 1;\n const parsedMax = Number(props.max);\n const max = Number.isFinite(parsedMax) ? parsedMax : undefined;\n const current = Number(input.value);\n const baseValue = Number.isFinite(current) ? current : (effectiveMin ?? 0);\n\n let next = baseValue + delta * step;\n if (effectiveMin !== undefined) next = Math.max(effectiveMin, next);\n if (max !== undefined) next = Math.min(max, next);\n\n const stepString = String(step);\n const decimals = integer || stepString.includes('.') === false ? 0 : (stepString.split('.')[1]?.length ?? 0);\n const nextValue = decimals > 0 ? next.toFixed(decimals) : String(Math.round(next));\n\n const valueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;\n valueSetter?.call(input, nextValue);\n input.dispatchEvent(new Event('input', { bubbles: true }));\n },\n [isNumberType, disabled, effectiveMin, integer, props.max, props.step],\n );\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (isNumberType) {\n const raw = event.target.value;\n setRawInput(raw);\n const num = raw === '' ? NaN : Number(raw);\n (onChange as unknown as (v: number) => void)?.(num);\n } else {\n onChange?.(event);\n }\n },\n [isNumberType, onChange],\n );\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n props.onKeyDown?.(event);\n if (event.defaultPrevented || !isNumberType || disabled) return;\n if (positive && (event.key === '-' || event.key === 'e')) {\n event.preventDefault();\n return;\n }\n if (integer && (event.key === '.' || event.key === ',' || event.key === 'e')) {\n event.preventDefault();\n return;\n }\n // Block '0' as the first keystroke in integer mode when either `positive` (≥1) or\n // `nonZero` is set. Decimal mode needs '0' to remain typeable so the user can start \"0.3\".\n if (\n (positive || nonZero) &&\n integer &&\n event.key === '0' &&\n (event.currentTarget.value === '' || event.currentTarget.value === '0')\n ) {\n event.preventDefault();\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setInputNumericValue(1);\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n setInputNumericValue(-1);\n }\n },\n [isNumberType, disabled, positive, nonZero, integer, setInputNumericValue, props.onKeyDown],\n );\n\n // For number fields, prefer the raw typed string when it represents the same value as\n // the stored number — preserves intermediate states like \"0.\", \"1.50\", \"-\" that would\n // otherwise be lost as React reconciles the controlled input back to the canonical form.\n let displayValue: TextFieldProps['value'] = props.value;\n if (isNumberType && typeof props.value === 'number') {\n if (Number.isNaN(props.value)) {\n displayValue = rawInput;\n } else if (rawInput !== '' && Number(rawInput) === props.value) {\n displayValue = rawInput;\n }\n }\n\n const hasMin = propsMinValid !== undefined;\n const hasMax = props.max != null && props.max !== '';\n const hints: string[] = [];\n const integerLabel = positive ? '+Int' : 'Int';\n const positiveLabel = '+';\n const nonZeroLabel = '≠0';\n if (integer && nonZero) hints.push(`${integerLabel} ${nonZeroLabel}`);\n else if (integer) hints.push(integerLabel);\n else if (positive && nonZero) hints.push(`${positiveLabel} ${nonZeroLabel}`);\n else if (positive) hints.push(positiveLabel);\n else if (nonZero) hints.push(nonZeroLabel);\n if (hasMin && hasMax) hints.push(`Range: ${propsMinValid} - ${props.max}`);\n else if (hasMax) hints.push(`Max: ${props.max}`);\n else if (hasMin) hints.push(`Min: ${propsMinValid}`);\n const autoConstraintText = hints.join(', ');\n const combinedEndAdornment = (\n <>\n {autoConstraintText ? (\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">{autoConstraintText}</span>\n ) : null}\n {endAdornment}\n </>\n );\n\n const hasEndContent = isNumberType || !!endAdornment || !!autoConstraintText;\n\n React.useLayoutEffect(() => {\n const node = endOverlayRef.current;\n if (!hasEndContent || !node) {\n setEndPadding(undefined);\n return;\n }\n // Reserve the overlay's width plus a small gap so input text never sits under it.\n const measure = () => setEndPadding(node.offsetWidth + 4);\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, [hasEndContent]);\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n <div className=\"relative\">\n {startAdornment && (\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none\">{startAdornment}</div>\n )}\n <Input\n aria-invalid={!!error}\n ref={assignRef}\n disabled={disabled}\n className={cn(className, startAdornment && 'pl-10')}\n id={id}\n {...props}\n style={{ ...style, paddingRight: endPadding }}\n value={displayValue}\n min={effectiveMin}\n type={normalizedType}\n inputMode={normalizedInputMode}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n />\n {hasEndContent && (\n <div ref={endOverlayRef} className=\"absolute inset-y-0 right-0 z-10 flex items-center gap-2 pr-2\">\n {(endAdornment || autoConstraintText) && (\n <div className=\"flex items-center gap-2\">{combinedEndAdornment}</div>\n )}\n {isNumberType && (\n <div className=\"flex h-7 w-4 flex-col overflow-hidden rounded-sm border border-border bg-background\">\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center border-b border-border text-muted-foreground hover:bg-accent disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setInputNumericValue(1)}\n disabled={disabled}\n aria-label=\"Increase value\"\n >\n <ChevronUp className=\"size-2.5\" />\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center text-muted-foreground hover:bg-accent disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setInputNumericValue(-1)}\n disabled={disabled}\n aria-label=\"Decrease value\"\n >\n <ChevronDown className=\"size-2.5\" />\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nTextField.displayName = 'TextField';\n"],"names":["React"],"mappings":"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"}
package/dist/Toggle.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { R as Root } from './index31.js';
2
+ import { R as Root } from './index32.js';
3
3
  import { c as cva } from './index8.js';
4
4
  import { c as cn } from './utils.js';
5
5
 
package/dist/ViewTabs.js CHANGED
@@ -8,10 +8,9 @@ import { C as Check } from './check.js';
8
8
  import { X } from './x.js';
9
9
  import { c as createLucideIcon } from './createLucideIcon.js';
10
10
  import { L as Lock } from './lock.js';
11
- import { P as Pencil, T as Trash2 } from './trash-2.js';
11
+ import { P as Pencil, T as Trash2, a as Plus } from './trash-2.js';
12
12
  import { S as Save, a as Share2 } from './share-2.js';
13
13
  import { E as Ellipsis } from './ellipsis.js';
14
- import { P as Plus } from './plus.js';
15
14
 
16
15
  /**
17
16
  * @license lucide-react v0.562.0 - ISC
@@ -1 +1 @@
1
- {"version":3,"file":"ViewTabs.js","sources":["../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/globe.js","../lib/components/ViewTabs/ViewTabs.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.562.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n];\nconst Globe = createLucideIcon(\"globe\", __iconNode);\n\nexport { __iconNode, Globe as default };\n//# sourceMappingURL=globe.js.map\n","import { Check, Ellipsis, Globe, Lock, Pencil, Plus, Save, Share2, Trash2, X } from 'lucide-react';\nimport { useCallback, useRef, useState } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport type { TableViewState } from '../../types/table-filter';\nimport { Button } from '../Button';\nimport { DropdownMenu, type MenuItem } from '../DropdownMenu';\nimport { Spinner } from '../Spinner';\n\nexport interface TableView {\n id: string;\n name: string;\n state: TableViewState;\n isShared: boolean;\n isOwn: boolean;\n}\n\nexport interface ViewTabsProps {\n defaultLabel?: string;\n views: TableView[];\n activeViewId: string | null;\n currentState: TableViewState;\n onActivate: (viewId: string | null) => void;\n onSave: (name: string) => void;\n onUpdate: (viewId: string) => void;\n onRename: (viewId: string, name: string) => void;\n onDelete: (viewId: string) => void;\n onToggleShare: (viewId: string, isShared: boolean) => void;\n isLoading?: boolean;\n}\n\n// Horizontal tab strip for switching between saved table views\nexport const ViewTabs: React.FC<ViewTabsProps> = ({\n defaultLabel = 'All',\n views,\n activeViewId,\n currentState: _currentState,\n onActivate,\n onSave,\n onUpdate,\n onRename,\n onDelete,\n onToggleShare,\n isLoading = false,\n}) => {\n const [isCreating, setIsCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editingName, setEditingName] = useState('');\n const newInputRef = useRef<HTMLInputElement>(null);\n const editInputRef = useRef<HTMLInputElement>(null);\n\n // Starts the inline create flow\n const handleStartCreate = useCallback(() => {\n setIsCreating(true);\n setNewName('');\n requestAnimationFrame(() => newInputRef.current?.focus());\n }, []);\n\n // Saves a new view from the inline input\n const handleConfirmCreate = useCallback(() => {\n const trimmed = newName.trim();\n if (trimmed) {\n onSave(trimmed);\n }\n setIsCreating(false);\n setNewName('');\n }, [newName, onSave]);\n\n // Cancels the inline create flow\n const handleCancelCreate = useCallback(() => {\n setIsCreating(false);\n setNewName('');\n }, []);\n\n // Starts inline rename for a view\n const handleStartRename = useCallback((view: TableView) => {\n setEditingId(view.id);\n setEditingName(view.name);\n requestAnimationFrame(() => editInputRef.current?.focus());\n }, []);\n\n // Confirms the rename\n const handleConfirmRename = useCallback(() => {\n if (editingId && editingName.trim()) {\n onRename(editingId, editingName.trim());\n }\n setEditingId(null);\n setEditingName('');\n }, [editingId, editingName, onRename]);\n\n // Cancels the rename\n const handleCancelRename = useCallback(() => {\n setEditingId(null);\n setEditingName('');\n }, []);\n\n if (isLoading) {\n return (\n <div className=\"flex items-center gap-2 border-b px-1 py-2\">\n <Spinner className=\"size-4 text-muted-foreground\" />\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-1 border-b overflow-x-auto\" role=\"tablist\" aria-label=\"Table views\">\n {/* Default \"All\" tab */}\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeViewId === null}\n className={cn(\n 'shrink-0 px-4 py-2 text-sm font-medium transition-colors border-b-2 whitespace-nowrap',\n activeViewId === null\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground hover:border-border',\n )}\n onClick={() => onActivate(null)}\n >\n {defaultLabel}\n </button>\n\n {/* Named view tabs */}\n {views.map((view) => (\n <div key={view.id} className=\"flex items-center shrink-0\">\n {editingId === view.id ? (\n <div className=\"flex items-center gap-1 px-2 py-1.5\">\n <input\n ref={editInputRef}\n type=\"text\"\n value={editingName}\n onChange={(e) => setEditingName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleConfirmRename();\n if (e.key === 'Escape') handleCancelRename();\n }}\n className=\"h-6 w-24 rounded border border-input bg-transparent px-2 text-sm outline-none focus-visible:border-ring\"\n />\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handleConfirmRename}>\n <Check className=\"size-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handleCancelRename}>\n <X className=\"size-3.5\" />\n </Button>\n </div>\n ) : (\n <>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeViewId === view.id}\n className={cn(\n 'px-4 py-2 text-sm font-medium transition-colors border-b-2 whitespace-nowrap',\n activeViewId === view.id\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground hover:border-border',\n )}\n onClick={() => onActivate(view.id)}\n >\n <span className=\"flex items-center gap-1.5\">\n {view.name}\n {view.isShared && <Globe className=\"size-3 text-muted-foreground\" />}\n {!view.isOwn && <Lock className=\"size-3 text-muted-foreground\" />}\n </span>\n </button>\n {(() => {\n const items: MenuItem[] = view.isOwn\n ? [\n {\n type: 'item',\n id: `${view.id}-rename`,\n label: 'Edit name',\n icon: Pencil,\n onClick: () => handleStartRename(view),\n },\n {\n type: 'item',\n id: `${view.id}-save`,\n label: 'Save changes',\n icon: Save,\n onClick: () => onUpdate(view.id),\n },\n {\n type: 'item',\n id: `${view.id}-share`,\n label: view.isShared ? 'Unshare' : 'Share',\n icon: Share2,\n onClick: () => onToggleShare(view.id, !view.isShared),\n },\n { type: 'separator' },\n {\n type: 'item',\n id: `${view.id}-delete`,\n label: 'Delete',\n icon: Trash2,\n variant: 'destructive',\n onClick: () => onDelete(view.id),\n },\n ]\n : [\n {\n type: 'item',\n id: `${view.id}-shared-by-others`,\n label: 'Shared by others',\n icon: Lock,\n disabled: true,\n },\n ];\n\n return (\n <DropdownMenu\n trigger={{\n children: (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <Ellipsis className=\"size-3.5\" />\n <span className=\"sr-only\">View options for {view.name}</span>\n </Button>\n ),\n }}\n items={items}\n align=\"start\"\n contentClassName=\"w-[180px]\"\n />\n );\n })()}\n </>\n )}\n </div>\n ))}\n\n {/* Create new view */}\n {isCreating ? (\n <div className=\"flex items-center gap-1 px-2 py-1.5 shrink-0\">\n <input\n ref={newInputRef}\n type=\"text\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleConfirmCreate();\n if (e.key === 'Escape') handleCancelCreate();\n }}\n placeholder=\"View name...\"\n className=\"h-6 w-28 rounded border border-input bg-transparent px-2 text-sm outline-none placeholder:text-muted-foreground focus-visible:border-ring\"\n />\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handleConfirmCreate}>\n <Check className=\"size-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handleCancelCreate}>\n <X className=\"size-3.5\" />\n </Button>\n </div>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={handleStartCreate}\n aria-label=\"Create new view\"\n >\n <Plus className=\"size-4\" />\n </Button>\n )}\n </div>\n );\n};\n\nViewTabs.displayName = 'ViewTabs';\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ViewTabs.js","sources":["../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/globe.js","../lib/components/ViewTabs/ViewTabs.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.562.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n];\nconst Globe = createLucideIcon(\"globe\", __iconNode);\n\nexport { __iconNode, Globe as default };\n//# sourceMappingURL=globe.js.map\n","import { Check, Ellipsis, Globe, Lock, Pencil, Plus, Save, Share2, Trash2, X } from 'lucide-react';\nimport { useCallback, useRef, useState } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport type { TableViewState } from '../../types/table-filter';\nimport { Button } from '../Button';\nimport { DropdownMenu, type MenuItem } from '../DropdownMenu';\nimport { Spinner } from '../Spinner';\n\nexport interface TableView {\n id: string;\n name: string;\n state: TableViewState;\n isShared: boolean;\n isOwn: boolean;\n}\n\nexport interface ViewTabsProps {\n defaultLabel?: string;\n views: TableView[];\n activeViewId: string | null;\n currentState: TableViewState;\n onActivate: (viewId: string | null) => void;\n onSave: (name: string) => void;\n onUpdate: (viewId: string) => void;\n onRename: (viewId: string, name: string) => void;\n onDelete: (viewId: string) => void;\n onToggleShare: (viewId: string, isShared: boolean) => void;\n isLoading?: boolean;\n}\n\n// Horizontal tab strip for switching between saved table views\nexport const ViewTabs: React.FC<ViewTabsProps> = ({\n defaultLabel = 'All',\n views,\n activeViewId,\n currentState: _currentState,\n onActivate,\n onSave,\n onUpdate,\n onRename,\n onDelete,\n onToggleShare,\n isLoading = false,\n}) => {\n const [isCreating, setIsCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editingName, setEditingName] = useState('');\n const newInputRef = useRef<HTMLInputElement>(null);\n const editInputRef = useRef<HTMLInputElement>(null);\n\n // Starts the inline create flow\n const handleStartCreate = useCallback(() => {\n setIsCreating(true);\n setNewName('');\n requestAnimationFrame(() => newInputRef.current?.focus());\n }, []);\n\n // Saves a new view from the inline input\n const handleConfirmCreate = useCallback(() => {\n const trimmed = newName.trim();\n if (trimmed) {\n onSave(trimmed);\n }\n setIsCreating(false);\n setNewName('');\n }, [newName, onSave]);\n\n // Cancels the inline create flow\n const handleCancelCreate = useCallback(() => {\n setIsCreating(false);\n setNewName('');\n }, []);\n\n // Starts inline rename for a view\n const handleStartRename = useCallback((view: TableView) => {\n setEditingId(view.id);\n setEditingName(view.name);\n requestAnimationFrame(() => editInputRef.current?.focus());\n }, []);\n\n // Confirms the rename\n const handleConfirmRename = useCallback(() => {\n if (editingId && editingName.trim()) {\n onRename(editingId, editingName.trim());\n }\n setEditingId(null);\n setEditingName('');\n }, [editingId, editingName, onRename]);\n\n // Cancels the rename\n const handleCancelRename = useCallback(() => {\n setEditingId(null);\n setEditingName('');\n }, []);\n\n if (isLoading) {\n return (\n <div className=\"flex items-center gap-2 border-b px-1 py-2\">\n <Spinner className=\"size-4 text-muted-foreground\" />\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-1 border-b overflow-x-auto\" role=\"tablist\" aria-label=\"Table views\">\n {/* Default \"All\" tab */}\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeViewId === null}\n className={cn(\n 'shrink-0 px-4 py-2 text-sm font-medium transition-colors border-b-2 whitespace-nowrap',\n activeViewId === null\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground hover:border-border',\n )}\n onClick={() => onActivate(null)}\n >\n {defaultLabel}\n </button>\n\n {/* Named view tabs */}\n {views.map((view) => (\n <div key={view.id} className=\"flex items-center shrink-0\">\n {editingId === view.id ? (\n <div className=\"flex items-center gap-1 px-2 py-1.5\">\n <input\n ref={editInputRef}\n type=\"text\"\n value={editingName}\n onChange={(e) => setEditingName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleConfirmRename();\n if (e.key === 'Escape') handleCancelRename();\n }}\n className=\"h-6 w-24 rounded border border-input bg-transparent px-2 text-sm outline-none focus-visible:border-ring\"\n />\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handleConfirmRename}>\n <Check className=\"size-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handleCancelRename}>\n <X className=\"size-3.5\" />\n </Button>\n </div>\n ) : (\n <>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeViewId === view.id}\n className={cn(\n 'px-4 py-2 text-sm font-medium transition-colors border-b-2 whitespace-nowrap',\n activeViewId === view.id\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground hover:border-border',\n )}\n onClick={() => onActivate(view.id)}\n >\n <span className=\"flex items-center gap-1.5\">\n {view.name}\n {view.isShared && <Globe className=\"size-3 text-muted-foreground\" />}\n {!view.isOwn && <Lock className=\"size-3 text-muted-foreground\" />}\n </span>\n </button>\n {(() => {\n const items: MenuItem[] = view.isOwn\n ? [\n {\n type: 'item',\n id: `${view.id}-rename`,\n label: 'Edit name',\n icon: Pencil,\n onClick: () => handleStartRename(view),\n },\n {\n type: 'item',\n id: `${view.id}-save`,\n label: 'Save changes',\n icon: Save,\n onClick: () => onUpdate(view.id),\n },\n {\n type: 'item',\n id: `${view.id}-share`,\n label: view.isShared ? 'Unshare' : 'Share',\n icon: Share2,\n onClick: () => onToggleShare(view.id, !view.isShared),\n },\n { type: 'separator' },\n {\n type: 'item',\n id: `${view.id}-delete`,\n label: 'Delete',\n icon: Trash2,\n variant: 'destructive',\n onClick: () => onDelete(view.id),\n },\n ]\n : [\n {\n type: 'item',\n id: `${view.id}-shared-by-others`,\n label: 'Shared by others',\n icon: Lock,\n disabled: true,\n },\n ];\n\n return (\n <DropdownMenu\n trigger={{\n children: (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <Ellipsis className=\"size-3.5\" />\n <span className=\"sr-only\">View options for {view.name}</span>\n </Button>\n ),\n }}\n items={items}\n align=\"start\"\n contentClassName=\"w-[180px]\"\n />\n );\n })()}\n </>\n )}\n </div>\n ))}\n\n {/* Create new view */}\n {isCreating ? (\n <div className=\"flex items-center gap-1 px-2 py-1.5 shrink-0\">\n <input\n ref={newInputRef}\n type=\"text\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleConfirmCreate();\n if (e.key === 'Escape') handleCancelCreate();\n }}\n placeholder=\"View name...\"\n className=\"h-6 w-28 rounded border border-input bg-transparent px-2 text-sm outline-none placeholder:text-muted-foreground focus-visible:border-ring\"\n />\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handleConfirmCreate}>\n <Check className=\"size-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handleCancelCreate}>\n <X className=\"size-3.5\" />\n </Button>\n </div>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={handleStartCreate}\n aria-label=\"Create new view\"\n >\n <Plus className=\"size-4\" />\n </Button>\n )}\n </div>\n );\n};\n\nViewTabs.displayName = 'ViewTabs';\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
@@ -1422,10 +1422,6 @@ select:-webkit-autofill:active {
1422
1422
  right: calc(var(--spacing) * 4);
1423
1423
  }
1424
1424
 
1425
- .right-8 {
1426
- right: calc(var(--spacing) * 8);
1427
- }
1428
-
1429
1425
  .-bottom-0\.5 {
1430
1426
  bottom: calc(var(--spacing) * -.5);
1431
1427
  }
@@ -3682,10 +3678,6 @@ select:-webkit-autofill:active {
3682
3678
  padding-right: calc(var(--spacing) * 2);
3683
3679
  }
3684
3680
 
3685
- .pr-3 {
3686
- padding-right: calc(var(--spacing) * 3);
3687
- }
3688
-
3689
3681
  .pr-5 {
3690
3682
  padding-right: calc(var(--spacing) * 5);
3691
3683
  }
@@ -3698,14 +3690,6 @@ select:-webkit-autofill:active {
3698
3690
  padding-right: calc(var(--spacing) * 10);
3699
3691
  }
3700
3692
 
3701
- .pr-12 {
3702
- padding-right: calc(var(--spacing) * 12);
3703
- }
3704
-
3705
- .pr-36 {
3706
- padding-right: calc(var(--spacing) * 36);
3707
- }
3708
-
3709
3693
  .pb-1\.5 {
3710
3694
  padding-bottom: calc(var(--spacing) * 1.5);
3711
3695
  }
@@ -4574,6 +4558,11 @@ select:-webkit-autofill:active {
4574
4558
  height: calc(var(--spacing) * 3);
4575
4559
  }
4576
4560
 
4561
+ .group-data-\[size\=lg\]\/switch\:size-5:is(:where(.group\/switch)[data-size="lg"] *) {
4562
+ width: calc(var(--spacing) * 5);
4563
+ height: calc(var(--spacing) * 5);
4564
+ }
4565
+
4577
4566
  .group-data-\[size\=sm\]\/avatar\:size-2:is(:where(.group\/avatar)[data-size="sm"] *) {
4578
4567
  width: calc(var(--spacing) * 2);
4579
4568
  height: calc(var(--spacing) * 2);
@@ -5781,6 +5770,14 @@ select:-webkit-autofill:active {
5781
5770
  height: calc(var(--spacing) * 10);
5782
5771
  }
5783
5772
 
5773
+ .data-\[size\=lg\]\:h-\[24px\][data-size="lg"] {
5774
+ height: 24px;
5775
+ }
5776
+
5777
+ .data-\[size\=lg\]\:w-\[40px\][data-size="lg"] {
5778
+ width: 40px;
5779
+ }
5780
+
5784
5781
  .data-\[size\=sm\]\:size-6[data-size="sm"] {
5785
5782
  width: calc(var(--spacing) * 6);
5786
5783
  height: calc(var(--spacing) * 6);
package/dist/cells.js CHANGED
@@ -3,7 +3,7 @@ import { c as cn } from './utils.js';
3
3
  import { S as Skeleton } from './Skeleton.js';
4
4
  import { a as useDialog, u as useConfirm } from './useConfirm.js';
5
5
  import { B as Button } from './Button.js';
6
- import { D as Dialog } from './Dialog.js';
6
+ import { D as Dialog, a as DialogActions } from './Dialog.js';
7
7
  import { D as DropdownMenu } from './DropdownMenu.js';
8
8
  import { c as createLucideIcon } from './createLucideIcon.js';
9
9
  import { useMutation, useQueryClient, useQuery } from '@tanstack/react-query';
@@ -19,6 +19,7 @@ import { a as Eye, E as EyeOff } from './eye.js';
19
19
  import { B as Badge } from './Badge.js';
20
20
  import { F as Form } from './Form.js';
21
21
  import { U as UploadFile } from './UploadFile.js';
22
+ import { U as Upload } from './upload.js';
22
23
  import { T as TextAlignJustify, D as Download } from './text-align-justify.js';
23
24
  import { C as CircleCheck } from './circle-check.js';
24
25
  import { S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem } from './select2.js';
@@ -36,7 +37,8 @@ import { a as Switch } from './Switch.js';
36
37
  import { a, o as object, s as string } from './schemas.js';
37
38
  import { T as TextField } from './TextField.js';
38
39
  import { S as Save, a as Share2 } from './share-2.js';
39
- import { P as Pencil, T as Trash2 } from './trash-2.js';
40
+ import { P as Pencil, a as Plus, T as Trash2 } from './trash-2.js';
41
+ import { T as TriangleAlert } from './triangle-alert.js';
40
42
  import { pluralize } from './utils/pluralize.js';
41
43
  import { C as Checkbox } from './Checkbox.js';
42
44
  import { g as getConfig } from './index7.js';
@@ -18018,6 +18020,8 @@ const DirectAction = ({ action, disabledAll }) => {
18018
18020
  Dialog,
18019
18021
  {
18020
18022
  handle: dialog,
18023
+ icon: action.icon,
18024
+ iconVariant: action.variant === "destructive" ? "destructive" : "default",
18021
18025
  title: action.dialog.title,
18022
18026
  description: action.dialog.description,
18023
18027
  badgeSlot: action.dialog.badgeSlot,
@@ -21627,6 +21631,7 @@ function DataTableImportDialog({
21627
21631
  Dialog,
21628
21632
  {
21629
21633
  handle: dialogHandle,
21634
+ icon: Upload,
21630
21635
  title,
21631
21636
  description,
21632
21637
  className: !isUploadStep && result && !result.success ? "max-w-3xl" : void 0,
@@ -21707,19 +21712,30 @@ function CreateViewDialog({ tableSlug, open, onClose }) {
21707
21712
  return /* @__PURE__ */ jsx(
21708
21713
  Dialog,
21709
21714
  {
21710
- mode: "form",
21711
21715
  handle,
21716
+ icon: Plus,
21712
21717
  title: "Create New View",
21713
21718
  description: "Save the current filters and sort as a named view.",
21714
- form,
21715
- mutation: mut,
21716
- transformSubmit: (data) => ({
21717
- name: data.name.trim(),
21718
- tableSlug,
21719
- state: useDataTableStore.getState().tables[tableSlug]?.activeState ?? EMPTY_TABLE_STATE
21720
- }),
21721
- submitLabel: "Save",
21722
- children: /* @__PURE__ */ jsx(TextField, { name: "name", label: "View name", placeholder: "e.g. High Region Providers" })
21719
+ content: (close) => /* @__PURE__ */ jsxs(
21720
+ Form,
21721
+ {
21722
+ form,
21723
+ mutation: mut,
21724
+ className: "space-y-4",
21725
+ transformSubmit: (data) => ({
21726
+ name: data.name.trim(),
21727
+ tableSlug,
21728
+ state: useDataTableStore.getState().tables[tableSlug]?.activeState ?? EMPTY_TABLE_STATE
21729
+ }),
21730
+ children: [
21731
+ /* @__PURE__ */ jsx(TextField, { name: "name", label: "View name", placeholder: "e.g. High Region Providers" }),
21732
+ /* @__PURE__ */ jsxs(DialogActions, { children: [
21733
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: close, children: "Cancel" }),
21734
+ /* @__PURE__ */ jsx(Button, { type: "submit", loadingText: "Saving...", children: "Save" })
21735
+ ] })
21736
+ ]
21737
+ }
21738
+ )
21723
21739
  }
21724
21740
  );
21725
21741
  }
@@ -21749,18 +21765,29 @@ function RenameViewDialog({ tableSlug, open, onClose, initialName }) {
21749
21765
  return /* @__PURE__ */ jsx(
21750
21766
  Dialog,
21751
21767
  {
21752
- mode: "form",
21753
21768
  handle,
21769
+ icon: Pencil,
21754
21770
  title: "Rename View",
21755
21771
  description: `Change the name of "${initialName}".`,
21756
- form,
21757
- mutation: mut,
21758
- transformSubmit: (data) => ({
21759
- id: activeViewId ?? "",
21760
- name: data.name.trim()
21761
- }),
21762
- submitLabel: "Rename",
21763
- children: /* @__PURE__ */ jsx(TextField, { name: "name", label: "View name" })
21772
+ content: (close) => /* @__PURE__ */ jsxs(
21773
+ Form,
21774
+ {
21775
+ form,
21776
+ mutation: mut,
21777
+ className: "space-y-4",
21778
+ transformSubmit: (data) => ({
21779
+ id: activeViewId ?? "",
21780
+ name: data.name.trim()
21781
+ }),
21782
+ children: [
21783
+ /* @__PURE__ */ jsx(TextField, { name: "name", label: "View name" }),
21784
+ /* @__PURE__ */ jsxs(DialogActions, { children: [
21785
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: close, children: "Cancel" }),
21786
+ /* @__PURE__ */ jsx(Button, { type: "submit", loadingText: "Saving...", children: "Rename" })
21787
+ ] })
21788
+ ]
21789
+ }
21790
+ )
21764
21791
  }
21765
21792
  );
21766
21793
  }
@@ -21799,6 +21826,7 @@ function ManageViewsDialog({ tableSlug, open, onClose }) {
21799
21826
  Dialog,
21800
21827
  {
21801
21828
  handle,
21829
+ icon: Settings2,
21802
21830
  title: "Manage Views",
21803
21831
  description: "Share or delete saved views for this table.",
21804
21832
  footer: /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: onClose, children: "Close" }),
@@ -22027,6 +22055,7 @@ function DataTableViewTabs({ slug }) {
22027
22055
  Dialog,
22028
22056
  {
22029
22057
  handle: dirtyGuard,
22058
+ icon: TriangleAlert,
22030
22059
  title: "Unsaved Changes",
22031
22060
  description: "This view has unsaved changes. What would you like to do?",
22032
22061
  footer: /* @__PURE__ */ jsxs("div", { className: "flex gap-2 justify-end w-full", children: [