@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.
- package/dist/Avatar.js +5 -5
- package/dist/Checkbox2.js +2 -2
- package/dist/Combination.js +1 -1
- package/dist/ConfirmContext.js +20 -1
- package/dist/ConfirmContext.js.map +1 -1
- package/dist/Dialog.js +24 -38
- package/dist/Dialog.js.map +1 -1
- package/dist/DropdownMenu.js +1 -0
- package/dist/DropdownMenu.js.map +1 -1
- package/dist/Progress.js +2 -2
- package/dist/RadioGroup.js +2 -2
- package/dist/Sidebar.js +1 -1
- package/dist/Switch.js +19 -16
- package/dist/Switch.js.map +1 -1
- package/dist/TabsSkeleton.js +1 -1
- package/dist/TextField.js +64 -45
- package/dist/TextField.js.map +1 -1
- package/dist/Toggle.js +1 -1
- package/dist/ViewTabs.js +1 -2
- package/dist/ViewTabs.js.map +1 -1
- package/dist/assets/quantum-ui.css +13 -16
- package/dist/cells.js +50 -21
- package/dist/cells.js.map +1 -1
- package/dist/components/Dialog.js +1 -1
- package/dist/components/RichTextEditor.js +1 -1
- package/dist/dropdown-menu.js +3 -2
- package/dist/dropdown-menu.js.map +1 -1
- package/dist/image-component.js +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/index12.js +3 -2
- package/dist/index12.js.map +1 -1
- package/dist/index13.js +2 -1
- package/dist/index13.js.map +1 -1
- package/dist/index14.js +6 -5
- package/dist/index14.js.map +1 -1
- package/dist/index15.js +1 -1
- package/dist/index16.js +1 -1
- package/dist/index18.js +1 -1
- package/dist/index20.js +1 -1
- package/dist/index21.js +1 -1
- package/dist/index23.js +1 -1
- package/dist/index25.js +3 -2534
- package/dist/index25.js.map +1 -1
- package/dist/index26.js +2526 -22
- package/dist/index26.js.map +1 -1
- package/dist/index27.js +32 -4
- package/dist/index27.js.map +1 -1
- package/dist/index28.js +4 -37
- package/dist/index28.js.map +1 -1
- package/dist/index29.js +36 -310
- package/dist/index29.js.map +1 -1
- package/dist/index30.js +309 -7
- package/dist/index30.js.map +1 -1
- package/dist/index31.js +8 -30
- package/dist/index31.js.map +1 -1
- package/dist/index32.js +29 -59
- package/dist/index32.js.map +1 -1
- package/dist/index33.js +59 -10
- package/dist/index33.js.map +1 -1
- package/dist/index34.js +10 -35
- package/dist/index34.js.map +1 -1
- package/dist/index35.js +27 -36810
- package/dist/index35.js.map +1 -1
- package/dist/index36.js +36809 -70
- package/dist/index36.js.map +1 -1
- package/dist/index37.js +72 -187
- package/dist/index37.js.map +1 -1
- package/dist/index38.js +199 -0
- package/dist/index38.js.map +1 -0
- package/dist/index4.js +1 -1
- package/dist/lib/components/DataTable/components/DataTableImportDialog.d.ts.map +1 -1
- package/dist/lib/components/DataTable/components/DataTableViewTabs.d.ts.map +1 -1
- package/dist/lib/components/DataTable/components/DataTableViewsMenu.d.ts.map +1 -1
- package/dist/lib/components/DataTable/components/RowActions.d.ts.map +1 -1
- package/dist/lib/components/Dialog/Dialog.d.ts +15 -16
- package/dist/lib/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/lib/components/Dialog/index.d.ts +2 -2
- package/dist/lib/components/Dialog/index.d.ts.map +1 -1
- package/dist/lib/components/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/lib/components/DropdownMenu/types.d.ts +2 -1
- package/dist/lib/components/DropdownMenu/types.d.ts.map +1 -1
- package/dist/lib/components/Switch/Switch.d.ts.map +1 -1
- package/dist/lib/components/TextField/TextField.d.ts.map +1 -1
- package/dist/lib/context/ConfirmContext.d.ts.map +1 -1
- package/dist/lib/selects/index.d.ts +0 -1
- package/dist/lib/selects/index.d.ts.map +1 -1
- package/dist/lib/selects/tax-group/TaxGroupFilter.d.ts +12 -0
- package/dist/lib/selects/tax-group/TaxGroupFilter.d.ts.map +1 -0
- package/dist/lib/selects/tax-group/TaxGroupSelector.d.ts +4 -0
- package/dist/lib/selects/tax-group/TaxGroupSelector.d.ts.map +1 -0
- package/dist/lib/selects/tax-group/index.d.ts +3 -0
- package/dist/lib/selects/tax-group/index.d.ts.map +1 -0
- package/dist/selects/tax-group.js +37 -0
- package/dist/selects/tax-group.js.map +1 -0
- package/dist/shadcn/shadcnSwitch/Switch.d.ts +1 -1
- package/dist/shadcn/shadcnSwitch/Switch.d.ts.map +1 -1
- package/dist/trash-2.js +17 -3
- package/dist/trash-2.js.map +1 -1
- package/dist/utils/motion.js +2 -2
- package/dist/value.js +1 -1
- package/package.json +5 -5
- package/dist/BomSelector.js +0 -37
- package/dist/BomSelector.js.map +0 -1
- package/dist/lib/selects/bom/BomFilter.d.ts +0 -12
- package/dist/lib/selects/bom/BomFilter.d.ts.map +0 -1
- package/dist/lib/selects/bom/BomSelector.d.ts +0 -4
- package/dist/lib/selects/bom/BomSelector.d.ts.map +0 -1
- package/dist/lib/selects/bom/index.d.ts +0 -3
- package/dist/lib/selects/bom/index.d.ts.map +0 -1
- package/dist/plus.js +0 -18
- package/dist/plus.js.map +0 -1
- package/dist/selects/bom.js +0 -2
- 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
|
-
({
|
|
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
|
-
|
|
148
|
-
/* @__PURE__ */ jsx(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
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 })
|
package/dist/TextField.js.map
CHANGED
|
@@ -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":"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"}
|
|
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
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
|
package/dist/ViewTabs.js.map
CHANGED
|
@@ -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
|
-
|
|
21715
|
-
|
|
21716
|
-
|
|
21717
|
-
|
|
21718
|
-
|
|
21719
|
-
|
|
21720
|
-
|
|
21721
|
-
|
|
21722
|
-
|
|
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
|
-
|
|
21757
|
-
|
|
21758
|
-
|
|
21759
|
-
|
|
21760
|
-
|
|
21761
|
-
|
|
21762
|
-
|
|
21763
|
-
|
|
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: [
|