@page-speed/forms 0.3.7 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.cjs +2 -2
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +2 -2
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/inputs.cjs +162 -176
- package/dist/inputs.cjs.map +1 -1
- package/dist/inputs.js +162 -176
- package/dist/inputs.js.map +1 -1
- package/package.json +1 -1
package/dist/inputs.js
CHANGED
|
@@ -21,8 +21,8 @@ function TextInput({
|
|
|
21
21
|
const handleBlur = () => {
|
|
22
22
|
onBlur?.();
|
|
23
23
|
};
|
|
24
|
-
const baseClassName = "text-
|
|
25
|
-
const errorClassName = error ? "
|
|
24
|
+
const baseClassName = "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm";
|
|
25
|
+
const errorClassName = error ? "border-red-500 ring-1 ring-red-500" : "";
|
|
26
26
|
const combinedClassName = `${baseClassName} ${errorClassName} ${className}`.trim();
|
|
27
27
|
return /* @__PURE__ */ React7.createElement(
|
|
28
28
|
"input",
|
|
@@ -68,8 +68,8 @@ function TextArea({
|
|
|
68
68
|
const handleBlur = () => {
|
|
69
69
|
onBlur?.();
|
|
70
70
|
};
|
|
71
|
-
const baseClassName = "
|
|
72
|
-
const errorClassName = error ? "
|
|
71
|
+
const baseClassName = "flex min-h-20 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm";
|
|
72
|
+
const errorClassName = error ? "border-red-500 ring-1 ring-red-500" : "";
|
|
73
73
|
const combinedClassName = `${baseClassName} ${errorClassName} ${className}`.trim();
|
|
74
74
|
return /* @__PURE__ */ React7.createElement(
|
|
75
75
|
"textarea",
|
|
@@ -122,12 +122,7 @@ function Checkbox({
|
|
|
122
122
|
const handleBlur = () => {
|
|
123
123
|
onBlur?.();
|
|
124
124
|
};
|
|
125
|
-
const
|
|
126
|
-
const errorClassName = error ? "checkbox--error" : "";
|
|
127
|
-
const checkedClassName = value ? "checkbox--checked" : "";
|
|
128
|
-
const disabledClassName = disabled ? "checkbox--disabled" : "";
|
|
129
|
-
const combinedClassName = `${baseClassName} ${errorClassName} ${checkedClassName} ${disabledClassName} ${className}`.trim();
|
|
130
|
-
const checkbox = /* @__PURE__ */ React7.createElement(
|
|
125
|
+
const checkbox = /* @__PURE__ */ React7.createElement("div", { className: "relative inline-flex" }, /* @__PURE__ */ React7.createElement(
|
|
131
126
|
"input",
|
|
132
127
|
{
|
|
133
128
|
ref: inputRef,
|
|
@@ -139,22 +134,29 @@ function Checkbox({
|
|
|
139
134
|
onBlur: handleBlur,
|
|
140
135
|
disabled,
|
|
141
136
|
required,
|
|
142
|
-
className:
|
|
137
|
+
className: `peer relative flex size-4 shrink-0 appearance-none items-center justify-center rounded-lg border border-input bg-transparent outline-none transition-colors focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 ${error ? "border-destructive ring-3 ring-destructive/20" : ""} ${value ? "bg-primary border-primary" : ""} ${className}`,
|
|
143
138
|
"aria-invalid": error || props["aria-invalid"],
|
|
144
139
|
"aria-describedby": description ? `${checkboxId}-description` : props["aria-describedby"],
|
|
145
140
|
"aria-required": required || props["aria-required"],
|
|
146
141
|
...props
|
|
147
142
|
}
|
|
148
|
-
);
|
|
143
|
+
), value && /* @__PURE__ */ React7.createElement("span", { className: "pointer-events-none absolute top-1/2 left-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center justify-center text-primary-foreground" }, /* @__PURE__ */ React7.createElement("svg", { className: "size-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3" }, /* @__PURE__ */ React7.createElement("polyline", { points: "20 6 9 17 4 12" }))), indeterminate && !value && /* @__PURE__ */ React7.createElement("span", { className: "pointer-events-none absolute top-1/2 left-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center justify-center text-primary" }, /* @__PURE__ */ React7.createElement("svg", { className: "size-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3" }, /* @__PURE__ */ React7.createElement("line", { x1: "5", y1: "12", x2: "19", y2: "12" }))));
|
|
149
144
|
if (label) {
|
|
150
|
-
return /* @__PURE__ */ React7.createElement(
|
|
151
|
-
"
|
|
145
|
+
return /* @__PURE__ */ React7.createElement(
|
|
146
|
+
"label",
|
|
152
147
|
{
|
|
153
|
-
className: "
|
|
154
|
-
|
|
148
|
+
className: `flex w-fit gap-2 items-center ${disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"}`,
|
|
149
|
+
htmlFor: checkboxId
|
|
155
150
|
},
|
|
156
|
-
description
|
|
157
|
-
|
|
151
|
+
/* @__PURE__ */ React7.createElement("div", { className: "flex w-full flex-row items-center gap-2" }, checkbox, /* @__PURE__ */ React7.createElement("div", { className: "flex flex-1 flex-col gap-0.5" }, /* @__PURE__ */ React7.createElement("div", { className: "flex items-center gap-2 text-sm font-medium" }, label), description && /* @__PURE__ */ React7.createElement(
|
|
152
|
+
"p",
|
|
153
|
+
{
|
|
154
|
+
className: "text-muted-foreground text-sm",
|
|
155
|
+
id: `${checkboxId}-description`
|
|
156
|
+
},
|
|
157
|
+
description
|
|
158
|
+
)))
|
|
159
|
+
);
|
|
158
160
|
}
|
|
159
161
|
return checkbox;
|
|
160
162
|
}
|
|
@@ -205,15 +207,13 @@ function CheckboxGroup({
|
|
|
205
207
|
const handleBlur = () => {
|
|
206
208
|
onBlur?.();
|
|
207
209
|
};
|
|
208
|
-
const
|
|
209
|
-
const
|
|
210
|
-
const layoutClassName = `checkbox-group--${layout}`;
|
|
211
|
-
const combinedClassName = `${baseClassName} ${errorClassName} ${layoutClassName} ${className}`.trim();
|
|
210
|
+
const layoutClass = layout === "inline" ? "flex flex-row flex-wrap gap-4" : layout === "grid" ? `grid gap-3` : "flex flex-col gap-3";
|
|
211
|
+
const containerClass = `w-full ${layoutClass} ${className}`.trim();
|
|
212
212
|
const maxReached = Boolean(maxSelections && value.length >= maxSelections);
|
|
213
213
|
return /* @__PURE__ */ React7.createElement(
|
|
214
214
|
"div",
|
|
215
215
|
{
|
|
216
|
-
className:
|
|
216
|
+
className: containerClass,
|
|
217
217
|
role: "group",
|
|
218
218
|
"aria-invalid": error || props["aria-invalid"],
|
|
219
219
|
"aria-describedby": props["aria-describedby"],
|
|
@@ -223,25 +223,32 @@ function CheckboxGroup({
|
|
|
223
223
|
gridTemplateColumns: `repeat(${gridColumns}, 1fr)`
|
|
224
224
|
} : void 0
|
|
225
225
|
},
|
|
226
|
-
label && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
227
|
-
description && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
228
|
-
|
|
229
|
-
"
|
|
226
|
+
label && /* @__PURE__ */ React7.createElement("div", { className: "text-sm font-medium" }, label),
|
|
227
|
+
description && /* @__PURE__ */ React7.createElement("div", { className: "text-muted-foreground text-sm" }, description),
|
|
228
|
+
showSelectAll && enabledOptions.length > 0 && /* @__PURE__ */ React7.createElement(
|
|
229
|
+
"label",
|
|
230
230
|
{
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
231
|
+
className: `flex w-fit gap-2 items-center ${disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"}`
|
|
232
|
+
},
|
|
233
|
+
/* @__PURE__ */ React7.createElement("div", { className: "flex w-full flex-row items-center gap-2" }, /* @__PURE__ */ React7.createElement("div", { className: "relative inline-flex" }, /* @__PURE__ */ React7.createElement(
|
|
234
|
+
"input",
|
|
235
|
+
{
|
|
236
|
+
type: "checkbox",
|
|
237
|
+
checked: allSelected,
|
|
238
|
+
ref: (input) => {
|
|
239
|
+
if (input) {
|
|
240
|
+
input.indeterminate = someSelected;
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
onChange: (e) => handleSelectAll(e.target.checked),
|
|
244
|
+
onBlur: handleBlur,
|
|
245
|
+
disabled,
|
|
246
|
+
className: "peer relative flex size-4 shrink-0 appearance-none items-center justify-center rounded-lg border border-input bg-transparent outline-none transition-colors focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50",
|
|
247
|
+
"aria-label": selectAllLabel
|
|
248
|
+
}
|
|
249
|
+
), allSelected && /* @__PURE__ */ React7.createElement("span", { className: "pointer-events-none absolute top-1/2 left-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center justify-center text-primary-foreground" }, /* @__PURE__ */ React7.createElement("svg", { className: "size-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3" }, /* @__PURE__ */ React7.createElement("polyline", { points: "20 6 9 17 4 12" }))), someSelected && !allSelected && /* @__PURE__ */ React7.createElement("span", { className: "pointer-events-none absolute top-1/2 left-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center justify-center text-primary" }, /* @__PURE__ */ React7.createElement("svg", { className: "size-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3" }, /* @__PURE__ */ React7.createElement("line", { x1: "5", y1: "12", x2: "19", y2: "12" })))), /* @__PURE__ */ React7.createElement("span", { className: "text-sm font-medium" }, selectAllLabel))
|
|
250
|
+
),
|
|
251
|
+
options.map((option) => {
|
|
245
252
|
const isChecked = value.includes(option.value);
|
|
246
253
|
const isDisabled = disabled || option.disabled || maxReached && !isChecked;
|
|
247
254
|
const checkboxId = `${name}-${option.value}`;
|
|
@@ -249,10 +256,10 @@ function CheckboxGroup({
|
|
|
249
256
|
"label",
|
|
250
257
|
{
|
|
251
258
|
key: option.value,
|
|
252
|
-
className: `
|
|
259
|
+
className: `flex w-fit gap-2 items-center ${isDisabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"}`,
|
|
253
260
|
htmlFor: checkboxId
|
|
254
261
|
},
|
|
255
|
-
/* @__PURE__ */ React7.createElement(
|
|
262
|
+
/* @__PURE__ */ React7.createElement("div", { className: "flex w-full flex-row items-center gap-2" }, /* @__PURE__ */ React7.createElement("div", { className: "relative inline-flex" }, /* @__PURE__ */ React7.createElement(
|
|
256
263
|
"input",
|
|
257
264
|
{
|
|
258
265
|
type: "checkbox",
|
|
@@ -264,21 +271,20 @@ function CheckboxGroup({
|
|
|
264
271
|
onBlur: handleBlur,
|
|
265
272
|
disabled: isDisabled,
|
|
266
273
|
required: required && minSelections ? value.length < minSelections : false,
|
|
267
|
-
className:
|
|
274
|
+
className: `peer relative flex size-4 shrink-0 appearance-none items-center justify-center rounded-lg border border-input bg-transparent outline-none transition-colors focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 ${error ? "border-destructive ring-3 ring-destructive/20" : ""} ${isChecked ? "bg-primary border-primary" : ""}`,
|
|
268
275
|
"aria-describedby": option.description ? `${checkboxId}-description` : props["aria-describedby"]
|
|
269
276
|
}
|
|
270
|
-
),
|
|
271
|
-
|
|
272
|
-
"span",
|
|
277
|
+
), isChecked && /* @__PURE__ */ React7.createElement("span", { className: "pointer-events-none absolute top-1/2 left-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center justify-center text-primary-foreground" }, /* @__PURE__ */ React7.createElement("svg", { className: "size-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3" }, /* @__PURE__ */ React7.createElement("polyline", { points: "20 6 9 17 4 12" })))), /* @__PURE__ */ React7.createElement("div", { className: "flex flex-1 flex-col gap-0.5" }, renderOption ? renderOption(option) : /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement("div", { className: "flex items-center gap-2 text-sm font-medium" }, option.label), option.description && /* @__PURE__ */ React7.createElement(
|
|
278
|
+
"p",
|
|
273
279
|
{
|
|
274
|
-
className: "
|
|
280
|
+
className: "text-muted-foreground text-sm",
|
|
275
281
|
id: `${checkboxId}-description`
|
|
276
282
|
},
|
|
277
283
|
option.description
|
|
278
|
-
)))
|
|
284
|
+
))))
|
|
279
285
|
);
|
|
280
|
-
})
|
|
281
|
-
(minSelections || maxSelections) && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
286
|
+
}),
|
|
287
|
+
(minSelections || maxSelections) && /* @__PURE__ */ React7.createElement("div", { className: "text-sm text-muted-foreground mt-2", "aria-live": "polite" }, minSelections && value.length < minSelections && /* @__PURE__ */ React7.createElement("span", { className: "text-destructive" }, "Select at least ", minSelections, " option", minSelections !== 1 ? "s" : ""), maxSelections && /* @__PURE__ */ React7.createElement("span", null, value.length, "/", maxSelections, " selected"))
|
|
282
288
|
);
|
|
283
289
|
}
|
|
284
290
|
CheckboxGroup.displayName = "CheckboxGroup";
|
|
@@ -327,22 +333,20 @@ function Radio({
|
|
|
327
333
|
const handleBlur = () => {
|
|
328
334
|
onBlur?.();
|
|
329
335
|
};
|
|
330
|
-
const
|
|
331
|
-
const
|
|
332
|
-
const layoutClassName = `radio-group--${layout}`;
|
|
333
|
-
const combinedClassName = `${baseClassName} ${errorClassName} ${layoutClassName} ${className}`.trim();
|
|
336
|
+
const layoutClass = layout === "inline" ? "flex flex-row flex-wrap gap-4" : "grid w-full gap-2";
|
|
337
|
+
const containerClass = `${layoutClass} ${className}`.trim();
|
|
334
338
|
return /* @__PURE__ */ React7.createElement(
|
|
335
339
|
"div",
|
|
336
340
|
{
|
|
337
|
-
className:
|
|
341
|
+
className: containerClass,
|
|
338
342
|
role: "radiogroup",
|
|
339
343
|
"aria-invalid": error || props["aria-invalid"],
|
|
340
344
|
"aria-describedby": props["aria-describedby"],
|
|
341
345
|
"aria-required": required || props["aria-required"],
|
|
342
346
|
"aria-label": typeof label === "string" ? label : props["aria-label"]
|
|
343
347
|
},
|
|
344
|
-
label && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
345
|
-
|
|
348
|
+
label && /* @__PURE__ */ React7.createElement("div", { className: "text-sm font-medium mb-2" }, label),
|
|
349
|
+
options.map((option, index) => {
|
|
346
350
|
const isChecked = value === option.value;
|
|
347
351
|
const isDisabled = disabled || option.disabled;
|
|
348
352
|
const radioId = `${name}-${option.value}`;
|
|
@@ -350,19 +354,19 @@ function Radio({
|
|
|
350
354
|
"label",
|
|
351
355
|
{
|
|
352
356
|
key: option.value,
|
|
353
|
-
className: `
|
|
357
|
+
className: `flex w-fit gap-2 items-center ${isDisabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"}`,
|
|
354
358
|
htmlFor: radioId,
|
|
355
359
|
onKeyDown: (e) => handleKeyDown(e, index),
|
|
356
|
-
tabIndex: 0
|
|
360
|
+
tabIndex: isDisabled ? -1 : 0
|
|
357
361
|
},
|
|
358
|
-
/* @__PURE__ */ React7.createElement("div", { className: "
|
|
359
|
-
"
|
|
362
|
+
/* @__PURE__ */ React7.createElement("div", { className: "flex w-full flex-row items-center gap-2" }, /* @__PURE__ */ React7.createElement("div", { className: "flex flex-1 flex-col gap-0.5" }, option.description ? /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement("div", { className: "flex items-center gap-2 text-sm font-medium" }, option.label), /* @__PURE__ */ React7.createElement(
|
|
363
|
+
"p",
|
|
360
364
|
{
|
|
361
|
-
className: "
|
|
365
|
+
className: "text-muted-foreground text-sm",
|
|
362
366
|
id: `${radioId}-description`
|
|
363
367
|
},
|
|
364
368
|
option.description
|
|
365
|
-
)), /* @__PURE__ */ React7.createElement(
|
|
369
|
+
)) : /* @__PURE__ */ React7.createElement("span", { className: "text-sm font-medium" }, option.label)), /* @__PURE__ */ React7.createElement("div", { className: "relative" }, /* @__PURE__ */ React7.createElement(
|
|
366
370
|
"input",
|
|
367
371
|
{
|
|
368
372
|
type: "radio",
|
|
@@ -374,12 +378,12 @@ function Radio({
|
|
|
374
378
|
onBlur: handleBlur,
|
|
375
379
|
disabled: isDisabled,
|
|
376
380
|
required,
|
|
377
|
-
className:
|
|
381
|
+
className: `peer relative flex aspect-square size-4 shrink-0 appearance-none rounded-full border border-input outline-none transition-colors focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 ${error ? "border-destructive" : ""} ${isChecked ? "border-primary bg-primary" : "bg-transparent"}`,
|
|
378
382
|
"aria-describedby": option.description ? `${radioId}-description` : props["aria-describedby"]
|
|
379
383
|
}
|
|
380
|
-
))
|
|
384
|
+
), isChecked && /* @__PURE__ */ React7.createElement("span", { className: "pointer-events-none absolute top-1/2 left-1/2 flex size-4 -translate-x-1/2 -translate-y-1/2 items-center justify-center text-primary-foreground" }, /* @__PURE__ */ React7.createElement("svg", { className: "size-2 fill-current", viewBox: "0 0 24 24" }, /* @__PURE__ */ React7.createElement("circle", { cx: "12", cy: "12", r: "10" })))))
|
|
381
385
|
);
|
|
382
|
-
})
|
|
386
|
+
})
|
|
383
387
|
);
|
|
384
388
|
}
|
|
385
389
|
Radio.displayName = "Radio";
|
|
@@ -544,11 +548,7 @@ function Select({
|
|
|
544
548
|
};
|
|
545
549
|
}
|
|
546
550
|
}, [isOpen]);
|
|
547
|
-
const
|
|
548
|
-
const errorClassName = error ? "select--error" : "";
|
|
549
|
-
const disabledClassName = disabled ? "select--disabled" : "";
|
|
550
|
-
const openClassName = isOpen ? "select--open" : "";
|
|
551
|
-
const combinedClassName = `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${className}`.trim();
|
|
551
|
+
const combinedClassName = `relative w-full ${className}`.trim();
|
|
552
552
|
return /* @__PURE__ */ React7.createElement(
|
|
553
553
|
"div",
|
|
554
554
|
{
|
|
@@ -576,7 +576,7 @@ function Select({
|
|
|
576
576
|
/* @__PURE__ */ React7.createElement(
|
|
577
577
|
"div",
|
|
578
578
|
{
|
|
579
|
-
className: "
|
|
579
|
+
className: `flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm cursor-pointer transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring ${disabled ? "cursor-not-allowed opacity-50 pointer-events-none" : ""} ${error ? "border-red-500 ring-1 ring-red-500" : ""}`,
|
|
580
580
|
onClick: handleToggle,
|
|
581
581
|
role: "combobox",
|
|
582
582
|
"aria-expanded": isOpen,
|
|
@@ -587,39 +587,39 @@ function Select({
|
|
|
587
587
|
"aria-disabled": disabled,
|
|
588
588
|
tabIndex: disabled ? -1 : 0
|
|
589
589
|
},
|
|
590
|
-
/* @__PURE__ */ React7.createElement("span", { className: "
|
|
591
|
-
/* @__PURE__ */ React7.createElement("div", { className: "
|
|
590
|
+
/* @__PURE__ */ React7.createElement("span", { className: "flex items-center flex-1 overflow-hidden text-ellipsis" }, selectedOption ? renderOption ? renderOption(selectedOption) : selectedOption.label : /* @__PURE__ */ React7.createElement("span", { className: "text-muted-foreground" }, placeholder)),
|
|
591
|
+
/* @__PURE__ */ React7.createElement("div", { className: "flex items-center gap-1 ml-2" }, loading && /* @__PURE__ */ React7.createElement("span", { className: "text-xs" }, "\u23F3"), clearable && value && !disabled && !loading && /* @__PURE__ */ React7.createElement(
|
|
592
592
|
"button",
|
|
593
593
|
{
|
|
594
594
|
type: "button",
|
|
595
|
-
className: "
|
|
595
|
+
className: "flex items-center justify-center h-4 w-4 rounded-sm border-none bg-transparent text-muted-foreground cursor-pointer text-xs p-0 transition-opacity hover:opacity-70",
|
|
596
596
|
onClick: handleClear,
|
|
597
597
|
"aria-label": "Clear selection",
|
|
598
598
|
tabIndex: -1
|
|
599
599
|
},
|
|
600
600
|
"\u2715"
|
|
601
|
-
), /* @__PURE__ */ React7.createElement("span", { className: "
|
|
601
|
+
), /* @__PURE__ */ React7.createElement("span", { className: "text-muted-foreground text-xs leading-none", "aria-hidden": "true" }, isOpen ? "\u25B2" : "\u25BC"))
|
|
602
602
|
),
|
|
603
|
-
isOpen && /* @__PURE__ */ React7.createElement("div", { id: dropdownId, className: "
|
|
603
|
+
isOpen && /* @__PURE__ */ React7.createElement("div", { id: dropdownId, className: "absolute z-50 top-full mt-1 min-w-full overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md", role: "listbox" }, searchable && /* @__PURE__ */ React7.createElement("div", { className: "p-2 border-b border-border" }, /* @__PURE__ */ React7.createElement(
|
|
604
604
|
"input",
|
|
605
605
|
{
|
|
606
606
|
ref: searchInputRef,
|
|
607
607
|
type: "text",
|
|
608
|
-
className: "
|
|
608
|
+
className: "w-full border border-input rounded px-2 py-1 text-sm bg-transparent outline-none focus:ring-1 focus:ring-ring",
|
|
609
609
|
placeholder: "Search...",
|
|
610
610
|
value: searchQuery,
|
|
611
611
|
onChange: handleSearchChange,
|
|
612
612
|
onClick: (e) => e.stopPropagation(),
|
|
613
613
|
"aria-label": "Search options"
|
|
614
614
|
}
|
|
615
|
-
)), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
615
|
+
)), /* @__PURE__ */ React7.createElement("div", { className: "max-h-64 overflow-y-auto p-1" }, filteredOptions.length === 0 ? /* @__PURE__ */ React7.createElement("div", { className: "py-2 px-3 text-center text-sm text-muted-foreground" }, "No options found") : optionGroups.length > 0 ? (
|
|
616
616
|
// Render grouped options
|
|
617
617
|
optionGroups.map((group, groupIndex) => {
|
|
618
618
|
const groupOptions = group.options.filter(
|
|
619
619
|
(opt) => filteredOptions.includes(opt)
|
|
620
620
|
);
|
|
621
621
|
if (groupOptions.length === 0) return null;
|
|
622
|
-
return /* @__PURE__ */ React7.createElement("div", { key: groupIndex, className: "
|
|
622
|
+
return /* @__PURE__ */ React7.createElement("div", { key: groupIndex, className: "py-1" }, /* @__PURE__ */ React7.createElement("div", { className: "py-1.5 px-2 text-xs font-semibold text-muted-foreground" }, group.label), groupOptions.map((option) => {
|
|
623
623
|
const globalIndex = filteredOptions.indexOf(option);
|
|
624
624
|
const isSelected = value === option.value;
|
|
625
625
|
const isFocused = globalIndex === focusedIndex;
|
|
@@ -628,7 +628,7 @@ function Select({
|
|
|
628
628
|
"div",
|
|
629
629
|
{
|
|
630
630
|
key: option.value,
|
|
631
|
-
className: `
|
|
631
|
+
className: `relative flex w-full cursor-pointer items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground ${isFocused ? "bg-accent text-accent-foreground" : ""} ${isSelected ? "font-medium bg-accent" : ""} ${isDisabled ? "pointer-events-none opacity-50" : ""}`,
|
|
632
632
|
onClick: () => !isDisabled && handleSelect(option.value),
|
|
633
633
|
role: "option",
|
|
634
634
|
"aria-selected": isSelected,
|
|
@@ -648,7 +648,7 @@ function Select({
|
|
|
648
648
|
"div",
|
|
649
649
|
{
|
|
650
650
|
key: option.value,
|
|
651
|
-
className: `
|
|
651
|
+
className: `relative flex w-full cursor-pointer items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground ${isFocused ? "bg-accent text-accent-foreground" : ""} ${isSelected ? "font-medium bg-accent" : ""} ${isDisabled ? "pointer-events-none opacity-50" : ""}`,
|
|
652
652
|
onClick: () => !isDisabled && handleSelect(option.value),
|
|
653
653
|
role: "option",
|
|
654
654
|
"aria-selected": isSelected,
|
|
@@ -928,11 +928,7 @@ function FileInput({
|
|
|
928
928
|
}
|
|
929
929
|
};
|
|
930
930
|
}, [value, imageToCrop]);
|
|
931
|
-
const
|
|
932
|
-
const errorClassName = error ? "file-input--error" : "";
|
|
933
|
-
const dragClassName = dragActive ? "file-input--drag-active" : "";
|
|
934
|
-
const disabledClassName = disabled ? "file-input--disabled" : "";
|
|
935
|
-
const combinedClassName = `${baseClassName} ${errorClassName} ${dragClassName} ${disabledClassName} ${className}`.trim();
|
|
931
|
+
const combinedClassName = `${className}`.trim();
|
|
936
932
|
return /* @__PURE__ */ React7.createElement("div", { className: combinedClassName }, /* @__PURE__ */ React7.createElement(
|
|
937
933
|
"input",
|
|
938
934
|
{
|
|
@@ -945,7 +941,6 @@ function FileInput({
|
|
|
945
941
|
multiple,
|
|
946
942
|
disabled,
|
|
947
943
|
required: required && value.length === 0,
|
|
948
|
-
className: "file-input__native",
|
|
949
944
|
"aria-invalid": error || props["aria-invalid"],
|
|
950
945
|
"aria-describedby": props["aria-describedby"],
|
|
951
946
|
"aria-required": required || props["aria-required"],
|
|
@@ -954,7 +949,7 @@ function FileInput({
|
|
|
954
949
|
), /* @__PURE__ */ React7.createElement(
|
|
955
950
|
"div",
|
|
956
951
|
{
|
|
957
|
-
className: "
|
|
952
|
+
className: `flex min-h-32 w-full cursor-pointer items-center justify-center rounded-md border-2 border-dashed border-input bg-transparent p-6 transition-colors hover:bg-accent/50 hover:border-ring ${dragActive ? "bg-accent border-ring" : ""} ${disabled ? "cursor-not-allowed opacity-50" : ""} ${error ? "border-red-500" : ""}`,
|
|
958
953
|
onDragEnter: handleDrag,
|
|
959
954
|
onDragLeave: handleDrag,
|
|
960
955
|
onDragOver: handleDrag,
|
|
@@ -966,10 +961,10 @@ function FileInput({
|
|
|
966
961
|
"aria-label": placeholder,
|
|
967
962
|
"aria-disabled": disabled
|
|
968
963
|
},
|
|
969
|
-
/* @__PURE__ */ React7.createElement("div", { className: "
|
|
964
|
+
/* @__PURE__ */ React7.createElement("div", { className: "flex flex-col items-center gap-2 text-center" }, /* @__PURE__ */ React7.createElement(
|
|
970
965
|
"svg",
|
|
971
966
|
{
|
|
972
|
-
className: "
|
|
967
|
+
className: "text-muted-foreground",
|
|
973
968
|
width: "48",
|
|
974
969
|
height: "48",
|
|
975
970
|
viewBox: "0 0 24 24",
|
|
@@ -983,30 +978,36 @@ function FileInput({
|
|
|
983
978
|
/* @__PURE__ */ React7.createElement("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
|
|
984
979
|
/* @__PURE__ */ React7.createElement("polyline", { points: "17 8 12 3 7 8" }),
|
|
985
980
|
/* @__PURE__ */ React7.createElement("line", { x1: "12", y1: "3", x2: "12", y2: "15" })
|
|
986
|
-
), /* @__PURE__ */ React7.createElement("p", { className: "
|
|
987
|
-
), value.length > 0 && /* @__PURE__ */ React7.createElement("ul", { className: "
|
|
981
|
+
), /* @__PURE__ */ React7.createElement("p", { className: "text-sm font-medium" }, value.length > 0 ? `${value.length} file(s) selected` : placeholder), accept && /* @__PURE__ */ React7.createElement("p", { className: "text-xs text-muted-foreground" }, "Accepted: ", accept), maxSize && /* @__PURE__ */ React7.createElement("p", { className: "text-xs text-muted-foreground" }, "Max size: ", formatFileSize(maxSize)))
|
|
982
|
+
), value.length > 0 && /* @__PURE__ */ React7.createElement("ul", { className: "flex flex-col gap-2 mt-4", role: "list" }, value.map((file, index) => {
|
|
988
983
|
const previewUrl = showPreview ? getPreviewUrl(file) : null;
|
|
989
|
-
return /* @__PURE__ */ React7.createElement("li", { key: `${file.name}-${index}`, className: "
|
|
984
|
+
return /* @__PURE__ */ React7.createElement("li", { key: `${file.name}-${index}`, className: "flex items-center gap-3 p-3 rounded-md border border-border bg-card hover:bg-accent/50 transition-colors" }, previewUrl && /* @__PURE__ */ React7.createElement(
|
|
990
985
|
"img",
|
|
991
986
|
{
|
|
992
987
|
src: previewUrl,
|
|
993
988
|
alt: file.name,
|
|
994
|
-
className: "
|
|
989
|
+
className: "w-12 h-12 rounded object-cover",
|
|
995
990
|
width: "48",
|
|
996
991
|
height: "48"
|
|
997
992
|
}
|
|
998
|
-
), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
993
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "flex flex-col flex-1 min-w-0" }, /* @__PURE__ */ React7.createElement("span", { className: "text-sm font-medium truncate" }, file.name), /* @__PURE__ */ React7.createElement("span", { className: "text-xs text-muted-foreground" }, formatFileSize(file.size)), showProgress && uploadProgress[file.name] !== void 0 && /* @__PURE__ */ React7.createElement("div", { className: "flex items-center gap-2 mt-1" }, /* @__PURE__ */ React7.createElement(
|
|
999
994
|
"div",
|
|
1000
995
|
{
|
|
1001
|
-
className: "
|
|
1002
|
-
style: { width: `${uploadProgress[file.name]}%` },
|
|
996
|
+
className: "h-1.5 bg-muted rounded-full overflow-hidden flex-1",
|
|
1003
997
|
role: "progressbar",
|
|
1004
998
|
"aria-valuenow": uploadProgress[file.name],
|
|
1005
999
|
"aria-valuemin": 0,
|
|
1006
1000
|
"aria-valuemax": 100,
|
|
1007
1001
|
"aria-label": `Upload progress: ${uploadProgress[file.name]}%`
|
|
1008
|
-
}
|
|
1009
|
-
|
|
1002
|
+
},
|
|
1003
|
+
/* @__PURE__ */ React7.createElement(
|
|
1004
|
+
"div",
|
|
1005
|
+
{
|
|
1006
|
+
className: "h-full bg-primary transition-all",
|
|
1007
|
+
style: { width: `${uploadProgress[file.name]}%` }
|
|
1008
|
+
}
|
|
1009
|
+
)
|
|
1010
|
+
), /* @__PURE__ */ React7.createElement("span", { className: "text-xs text-muted-foreground" }, uploadProgress[file.name], "%"))), enableCropping && file.type.startsWith("image/") && /* @__PURE__ */ React7.createElement(
|
|
1010
1011
|
"button",
|
|
1011
1012
|
{
|
|
1012
1013
|
type: "button",
|
|
@@ -1015,7 +1016,7 @@ function FileInput({
|
|
|
1015
1016
|
handleCrop(file);
|
|
1016
1017
|
},
|
|
1017
1018
|
disabled,
|
|
1018
|
-
className: "
|
|
1019
|
+
className: "flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent text-muted-foreground hover:text-foreground transition-colors",
|
|
1019
1020
|
"aria-label": `Crop ${file.name}`
|
|
1020
1021
|
},
|
|
1021
1022
|
/* @__PURE__ */ React7.createElement(
|
|
@@ -1043,7 +1044,7 @@ function FileInput({
|
|
|
1043
1044
|
handleRemove(index);
|
|
1044
1045
|
},
|
|
1045
1046
|
disabled,
|
|
1046
|
-
className: "
|
|
1047
|
+
className: "flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent text-muted-foreground hover:text-foreground transition-colors",
|
|
1047
1048
|
"aria-label": `Remove ${file.name}`
|
|
1048
1049
|
},
|
|
1049
1050
|
/* @__PURE__ */ React7.createElement(
|
|
@@ -1063,26 +1064,26 @@ function FileInput({
|
|
|
1063
1064
|
/* @__PURE__ */ React7.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
|
|
1064
1065
|
)
|
|
1065
1066
|
));
|
|
1066
|
-
})), cropperOpen && imageToCrop && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1067
|
+
})), cropperOpen && imageToCrop && /* @__PURE__ */ React7.createElement("div", { className: "fixed inset-0 z-50 flex items-center justify-center" }, /* @__PURE__ */ React7.createElement(
|
|
1067
1068
|
"div",
|
|
1068
1069
|
{
|
|
1069
|
-
className: "
|
|
1070
|
+
className: "absolute inset-0 bg-black/50",
|
|
1070
1071
|
onClick: handleCropCancel,
|
|
1071
1072
|
"aria-label": "Close cropper"
|
|
1072
1073
|
}
|
|
1073
|
-
), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1074
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "relative bg-popover border border-border rounded-lg shadow-lg max-w-3xl w-full mx-4" }, /* @__PURE__ */ React7.createElement("div", { className: "flex items-center justify-between p-4 border-b border-border" }, /* @__PURE__ */ React7.createElement("h3", { className: "text-lg font-semibold" }, "Crop Image"), /* @__PURE__ */ React7.createElement(
|
|
1074
1075
|
"button",
|
|
1075
1076
|
{
|
|
1076
1077
|
type: "button",
|
|
1077
|
-
className: "
|
|
1078
|
+
className: "flex items-center justify-center h-8 w-8 rounded hover:bg-accent text-muted-foreground hover:text-foreground transition-colors",
|
|
1078
1079
|
onClick: handleCropCancel,
|
|
1079
1080
|
"aria-label": "Close"
|
|
1080
1081
|
},
|
|
1081
1082
|
"\u2715"
|
|
1082
|
-
)), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1083
|
+
)), /* @__PURE__ */ React7.createElement("div", { className: "p-4" }, /* @__PURE__ */ React7.createElement(
|
|
1083
1084
|
"div",
|
|
1084
1085
|
{
|
|
1085
|
-
className: "
|
|
1086
|
+
className: "relative w-full h-96 bg-muted rounded-md overflow-hidden",
|
|
1086
1087
|
onMouseDown: (e) => {
|
|
1087
1088
|
e.preventDefault();
|
|
1088
1089
|
const startX = e.clientX - crop.x;
|
|
@@ -1106,7 +1107,7 @@ function FileInput({
|
|
|
1106
1107
|
{
|
|
1107
1108
|
src: imageToCrop.url,
|
|
1108
1109
|
alt: "Crop preview",
|
|
1109
|
-
className: "
|
|
1110
|
+
className: "absolute inset-0 w-full h-full object-contain",
|
|
1110
1111
|
style: {
|
|
1111
1112
|
transform: `translate(${crop.x}px, ${crop.y}px) scale(${zoom})`
|
|
1112
1113
|
},
|
|
@@ -1136,15 +1137,15 @@ function FileInput({
|
|
|
1136
1137
|
/* @__PURE__ */ React7.createElement(
|
|
1137
1138
|
"div",
|
|
1138
1139
|
{
|
|
1139
|
-
className: "
|
|
1140
|
+
className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 border-2 border-primary rounded pointer-events-none",
|
|
1140
1141
|
style: {
|
|
1141
1142
|
width: cropAspectRatio ? `${Math.min(80, 80 * cropAspectRatio)}%` : "80%",
|
|
1142
1143
|
aspectRatio: cropAspectRatio ? String(cropAspectRatio) : void 0
|
|
1143
1144
|
}
|
|
1144
1145
|
},
|
|
1145
|
-
/* @__PURE__ */ React7.createElement("div", { className: "
|
|
1146
|
+
/* @__PURE__ */ React7.createElement("div", { className: "absolute inset-0 grid grid-cols-3 grid-rows-3" }, /* @__PURE__ */ React7.createElement("div", { className: "border-r border-b border-primary/30" }), /* @__PURE__ */ React7.createElement("div", { className: "border-r border-b border-primary/30" }), /* @__PURE__ */ React7.createElement("div", { className: "border-b border-primary/30" }), /* @__PURE__ */ React7.createElement("div", { className: "border-r border-b border-primary/30" }), /* @__PURE__ */ React7.createElement("div", { className: "border-r border-b border-primary/30" }), /* @__PURE__ */ React7.createElement("div", { className: "border-b border-primary/30" }), /* @__PURE__ */ React7.createElement("div", { className: "border-r border-primary/30" }), /* @__PURE__ */ React7.createElement("div", { className: "border-r border-primary/30" }), /* @__PURE__ */ React7.createElement("div", null))
|
|
1146
1147
|
)
|
|
1147
|
-
), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1148
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "flex items-center gap-3 mt-4" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "zoom-slider", className: "text-sm font-medium whitespace-nowrap" }, "Zoom: ", zoom.toFixed(1), "x"), /* @__PURE__ */ React7.createElement(
|
|
1148
1149
|
"input",
|
|
1149
1150
|
{
|
|
1150
1151
|
id: "zoom-slider",
|
|
@@ -1154,14 +1155,14 @@ function FileInput({
|
|
|
1154
1155
|
step: "0.1",
|
|
1155
1156
|
value: zoom,
|
|
1156
1157
|
onChange: (e) => onZoomChange(parseFloat(e.target.value)),
|
|
1157
|
-
className: "
|
|
1158
|
+
className: "flex-1 h-2 bg-muted rounded-lg appearance-none cursor-pointer",
|
|
1158
1159
|
"aria-label": "Zoom level"
|
|
1159
1160
|
}
|
|
1160
|
-
))), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1161
|
+
))), /* @__PURE__ */ React7.createElement("div", { className: "flex items-center justify-end gap-2 p-4 border-t border-border" }, /* @__PURE__ */ React7.createElement(
|
|
1161
1162
|
"button",
|
|
1162
1163
|
{
|
|
1163
1164
|
type: "button",
|
|
1164
|
-
className: "
|
|
1165
|
+
className: "inline-flex items-center justify-center h-9 rounded-md px-4 text-sm font-medium border border-input bg-transparent hover:bg-accent hover:text-accent-foreground transition-colors",
|
|
1165
1166
|
onClick: handleCropCancel
|
|
1166
1167
|
},
|
|
1167
1168
|
"Cancel"
|
|
@@ -1169,7 +1170,7 @@ function FileInput({
|
|
|
1169
1170
|
"button",
|
|
1170
1171
|
{
|
|
1171
1172
|
type: "button",
|
|
1172
|
-
className: "
|
|
1173
|
+
className: "inline-flex items-center justify-center h-9 rounded-md px-4 text-sm font-medium bg-primary text-primary-foreground hover:bg-primary/90 transition-colors",
|
|
1173
1174
|
onClick: handleCropSave
|
|
1174
1175
|
},
|
|
1175
1176
|
"Save"
|
|
@@ -1317,27 +1318,27 @@ function DatePicker({
|
|
|
1317
1318
|
const handleNextMonth = () => {
|
|
1318
1319
|
setSelectedMonth(new Date(year, month + 1, 1));
|
|
1319
1320
|
};
|
|
1320
|
-
return /* @__PURE__ */ React7.createElement("div", {
|
|
1321
|
+
return /* @__PURE__ */ React7.createElement("div", { role: "grid", "aria-label": "Calendar" }, /* @__PURE__ */ React7.createElement("div", { className: "flex items-center justify-between pb-2 border-b border-border" }, /* @__PURE__ */ React7.createElement(
|
|
1321
1322
|
"button",
|
|
1322
1323
|
{
|
|
1323
1324
|
type: "button",
|
|
1324
|
-
className: "
|
|
1325
|
+
className: "flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent cursor-pointer",
|
|
1325
1326
|
onClick: handlePrevMonth,
|
|
1326
1327
|
"aria-label": "Previous month"
|
|
1327
1328
|
},
|
|
1328
1329
|
"\u2190"
|
|
1329
|
-
), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1330
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "font-medium text-sm" }, `${monthNames[month]} ${year}`), /* @__PURE__ */ React7.createElement(
|
|
1330
1331
|
"button",
|
|
1331
1332
|
{
|
|
1332
1333
|
type: "button",
|
|
1333
|
-
className: "
|
|
1334
|
+
className: "flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent cursor-pointer",
|
|
1334
1335
|
onClick: handleNextMonth,
|
|
1335
1336
|
"aria-label": "Next month"
|
|
1336
1337
|
},
|
|
1337
1338
|
"\u2192"
|
|
1338
|
-
)), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1339
|
+
)), /* @__PURE__ */ React7.createElement("div", { className: "grid grid-cols-7 gap-1 mt-2" }, ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map((day) => /* @__PURE__ */ React7.createElement("div", { key: day, className: "flex items-center justify-center h-8 w-full text-xs text-muted-foreground font-medium" }, day))), /* @__PURE__ */ React7.createElement("div", { className: "grid grid-cols-7 gap-1" }, days.map((date, index) => {
|
|
1339
1340
|
if (!date) {
|
|
1340
|
-
return /* @__PURE__ */ React7.createElement("div", { key: `empty-${index}
|
|
1341
|
+
return /* @__PURE__ */ React7.createElement("div", { key: `empty-${index}` });
|
|
1341
1342
|
}
|
|
1342
1343
|
const isSelected = value && date.toDateString() === value.toDateString();
|
|
1343
1344
|
const isToday = date.toDateString() === (/* @__PURE__ */ new Date()).toDateString();
|
|
@@ -1347,7 +1348,7 @@ function DatePicker({
|
|
|
1347
1348
|
{
|
|
1348
1349
|
key: date.toISOString(),
|
|
1349
1350
|
type: "button",
|
|
1350
|
-
className: `
|
|
1351
|
+
className: `flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${isSelected ? "bg-primary text-primary-foreground font-semibold" : ""} ${isToday ? "border border-primary" : ""} ${disabled2 ? "cursor-not-allowed opacity-50 pointer-events-none" : ""}`,
|
|
1351
1352
|
onClick: () => !disabled2 && handleDateSelect(date),
|
|
1352
1353
|
disabled: disabled2,
|
|
1353
1354
|
"aria-label": formatDate(date, format)
|
|
@@ -1356,11 +1357,7 @@ function DatePicker({
|
|
|
1356
1357
|
);
|
|
1357
1358
|
})));
|
|
1358
1359
|
};
|
|
1359
|
-
const
|
|
1360
|
-
const errorClassName = error ? "datepicker--error" : "";
|
|
1361
|
-
const disabledClassName = disabled ? "datepicker--disabled" : "";
|
|
1362
|
-
const openClassName = isOpen ? "datepicker--open" : "";
|
|
1363
|
-
const combinedClassName = `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${className}`.trim();
|
|
1360
|
+
const combinedClassName = `relative ${className}`.trim();
|
|
1364
1361
|
return /* @__PURE__ */ React7.createElement("div", { ref: containerRef, className: combinedClassName }, /* @__PURE__ */ React7.createElement(
|
|
1365
1362
|
"input",
|
|
1366
1363
|
{
|
|
@@ -1368,7 +1365,7 @@ function DatePicker({
|
|
|
1368
1365
|
name,
|
|
1369
1366
|
value: value ? value.toISOString() : ""
|
|
1370
1367
|
}
|
|
1371
|
-
), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1368
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "relative" }, showIcon && /* @__PURE__ */ React7.createElement("span", { className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground pointer-events-none", "aria-hidden": "true" }, /* @__PURE__ */ React7.createElement(
|
|
1372
1369
|
"svg",
|
|
1373
1370
|
{
|
|
1374
1371
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -1387,7 +1384,7 @@ function DatePicker({
|
|
|
1387
1384
|
{
|
|
1388
1385
|
ref: inputRef,
|
|
1389
1386
|
type: "text",
|
|
1390
|
-
className:
|
|
1387
|
+
className: `flex h-9 w-full rounded-md border border-input bg-transparent ${showIcon ? "pl-10" : "pl-3"} ${clearable && value ? "pr-10" : "pr-3"} py-1 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm ${error ? "border-red-500 ring-1 ring-red-500" : ""}`,
|
|
1391
1388
|
value: inputValue,
|
|
1392
1389
|
onChange: handleInputChange,
|
|
1393
1390
|
onClick: handleToggle,
|
|
@@ -1404,13 +1401,13 @@ function DatePicker({
|
|
|
1404
1401
|
"button",
|
|
1405
1402
|
{
|
|
1406
1403
|
type: "button",
|
|
1407
|
-
className: "
|
|
1404
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors",
|
|
1408
1405
|
onClick: handleClear,
|
|
1409
1406
|
"aria-label": "Clear date",
|
|
1410
1407
|
tabIndex: -1
|
|
1411
1408
|
},
|
|
1412
1409
|
"\u2715"
|
|
1413
|
-
)), isOpen && !disabled && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1410
|
+
)), isOpen && !disabled && /* @__PURE__ */ React7.createElement("div", { className: "absolute z-50 top-full mt-1 min-w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md p-3" }, renderCalendar()));
|
|
1414
1411
|
}
|
|
1415
1412
|
DatePicker.displayName = "DatePicker";
|
|
1416
1413
|
function parseTimeString(timeStr, use24Hour) {
|
|
@@ -1543,11 +1540,7 @@ function TimePicker({
|
|
|
1543
1540
|
}
|
|
1544
1541
|
return mins;
|
|
1545
1542
|
}, [minuteStep]);
|
|
1546
|
-
const
|
|
1547
|
-
const errorClassName = error ? "timepicker--error" : "";
|
|
1548
|
-
const disabledClassName = disabled ? "timepicker--disabled" : "";
|
|
1549
|
-
const openClassName = isOpen ? "timepicker--open" : "";
|
|
1550
|
-
const combinedClassName = `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${className}`.trim();
|
|
1543
|
+
const combinedClassName = `relative ${className}`.trim();
|
|
1551
1544
|
const displayValue = formatTimeValue(timeValue, use24Hour);
|
|
1552
1545
|
return /* @__PURE__ */ React7.createElement("div", { ref: containerRef, className: combinedClassName }, /* @__PURE__ */ React7.createElement(
|
|
1553
1546
|
"input",
|
|
@@ -1556,7 +1549,7 @@ function TimePicker({
|
|
|
1556
1549
|
name,
|
|
1557
1550
|
value
|
|
1558
1551
|
}
|
|
1559
|
-
), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1552
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "relative" }, showIcon && /* @__PURE__ */ React7.createElement("span", { className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground pointer-events-none", "aria-hidden": "true" }, /* @__PURE__ */ React7.createElement(
|
|
1560
1553
|
"svg",
|
|
1561
1554
|
{
|
|
1562
1555
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -1576,7 +1569,7 @@ function TimePicker({
|
|
|
1576
1569
|
{
|
|
1577
1570
|
ref: inputRef,
|
|
1578
1571
|
type: "text",
|
|
1579
|
-
className:
|
|
1572
|
+
className: `flex h-9 w-full rounded-md border border-input bg-transparent ${showIcon ? "pl-10" : "pl-3"} ${clearable && value ? "pr-10" : "pr-3"} py-1 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm ${error ? "border-red-500 ring-1 ring-red-500" : ""}`,
|
|
1580
1573
|
value: displayValue,
|
|
1581
1574
|
onClick: handleToggle,
|
|
1582
1575
|
onBlur,
|
|
@@ -1592,13 +1585,13 @@ function TimePicker({
|
|
|
1592
1585
|
"button",
|
|
1593
1586
|
{
|
|
1594
1587
|
type: "button",
|
|
1595
|
-
className: "
|
|
1588
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors",
|
|
1596
1589
|
onClick: handleClear,
|
|
1597
1590
|
"aria-label": "Clear time",
|
|
1598
1591
|
tabIndex: -1
|
|
1599
1592
|
},
|
|
1600
1593
|
"\u2715"
|
|
1601
|
-
)), isOpen && !disabled && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1594
|
+
)), isOpen && !disabled && /* @__PURE__ */ React7.createElement("div", { className: "absolute z-50 top-full mt-1 min-w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md p-3" }, /* @__PURE__ */ React7.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React7.createElement("div", { className: "flex flex-col flex-1" }, /* @__PURE__ */ React7.createElement("div", { className: "text-xs font-medium text-muted-foreground mb-2 text-center" }, use24Hour ? "Hour" : "Hour"), /* @__PURE__ */ React7.createElement("div", { className: "flex flex-col gap-1 max-h-48 overflow-y-auto" }, hours.map((hour) => {
|
|
1602
1595
|
const displayHour = use24Hour ? hour : hour;
|
|
1603
1596
|
const isSelected = use24Hour ? timeValue?.hour === (hour === 0 ? 12 : hour > 12 ? hour - 12 : hour) && timeValue?.period === (hour >= 12 ? "PM" : "AM") : timeValue?.hour === hour;
|
|
1604
1597
|
return /* @__PURE__ */ React7.createElement(
|
|
@@ -1606,7 +1599,7 @@ function TimePicker({
|
|
|
1606
1599
|
{
|
|
1607
1600
|
key: hour,
|
|
1608
1601
|
type: "button",
|
|
1609
|
-
className: `
|
|
1602
|
+
className: `flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${isSelected ? "bg-primary text-primary-foreground font-semibold" : ""}`,
|
|
1610
1603
|
onClick: () => {
|
|
1611
1604
|
if (use24Hour) {
|
|
1612
1605
|
const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;
|
|
@@ -1626,24 +1619,24 @@ function TimePicker({
|
|
|
1626
1619
|
},
|
|
1627
1620
|
String(displayHour).padStart(2, "0")
|
|
1628
1621
|
);
|
|
1629
|
-
}))), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1622
|
+
}))), /* @__PURE__ */ React7.createElement("div", { className: "flex flex-col flex-1" }, /* @__PURE__ */ React7.createElement("div", { className: "text-xs font-medium text-muted-foreground mb-2 text-center" }, "Minute"), /* @__PURE__ */ React7.createElement("div", { className: "flex flex-col gap-1 max-h-48 overflow-y-auto" }, minutes.map((minute) => {
|
|
1630
1623
|
const isSelected = timeValue?.minute === minute;
|
|
1631
1624
|
return /* @__PURE__ */ React7.createElement(
|
|
1632
1625
|
"button",
|
|
1633
1626
|
{
|
|
1634
1627
|
key: minute,
|
|
1635
1628
|
type: "button",
|
|
1636
|
-
className: `
|
|
1629
|
+
className: `flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${isSelected ? "bg-primary text-primary-foreground font-semibold" : ""}`,
|
|
1637
1630
|
onClick: () => handleMinuteChange(minute),
|
|
1638
1631
|
"aria-label": `${String(minute).padStart(2, "0")} minutes`
|
|
1639
1632
|
},
|
|
1640
1633
|
String(minute).padStart(2, "0")
|
|
1641
1634
|
);
|
|
1642
|
-
}))), !use24Hour && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1635
|
+
}))), !use24Hour && /* @__PURE__ */ React7.createElement("div", { className: "flex flex-col w-20" }, /* @__PURE__ */ React7.createElement("div", { className: "text-xs font-medium text-muted-foreground mb-2 text-center" }, "Period"), /* @__PURE__ */ React7.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ React7.createElement(
|
|
1643
1636
|
"button",
|
|
1644
1637
|
{
|
|
1645
1638
|
type: "button",
|
|
1646
|
-
className: `
|
|
1639
|
+
className: `flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${timeValue?.period === "AM" ? "bg-primary text-primary-foreground font-semibold" : ""}`,
|
|
1647
1640
|
onClick: () => handlePeriodChange("AM")
|
|
1648
1641
|
},
|
|
1649
1642
|
"AM"
|
|
@@ -1651,7 +1644,7 @@ function TimePicker({
|
|
|
1651
1644
|
"button",
|
|
1652
1645
|
{
|
|
1653
1646
|
type: "button",
|
|
1654
|
-
className: `
|
|
1647
|
+
className: `flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${timeValue?.period === "PM" ? "bg-primary text-primary-foreground font-semibold" : ""}`,
|
|
1655
1648
|
onClick: () => handlePeriodChange("PM")
|
|
1656
1649
|
},
|
|
1657
1650
|
"PM"
|
|
@@ -1790,27 +1783,27 @@ function DateRangePicker({
|
|
|
1790
1783
|
const handleNextMonth = () => {
|
|
1791
1784
|
setSelectedMonth(new Date(year, month + 1, 1));
|
|
1792
1785
|
};
|
|
1793
|
-
return /* @__PURE__ */ React7.createElement("div", {
|
|
1786
|
+
return /* @__PURE__ */ React7.createElement("div", { role: "grid", "aria-label": "Calendar" }, /* @__PURE__ */ React7.createElement("div", { className: "flex items-center justify-between pb-2 border-b border-border" }, /* @__PURE__ */ React7.createElement(
|
|
1794
1787
|
"button",
|
|
1795
1788
|
{
|
|
1796
1789
|
type: "button",
|
|
1797
|
-
className: "
|
|
1790
|
+
className: "flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent cursor-pointer",
|
|
1798
1791
|
onClick: handlePrevMonth,
|
|
1799
1792
|
"aria-label": "Previous month"
|
|
1800
1793
|
},
|
|
1801
1794
|
"\u2190"
|
|
1802
|
-
), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1795
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "font-medium text-sm" }, `${monthNames[month]} ${year}`), /* @__PURE__ */ React7.createElement(
|
|
1803
1796
|
"button",
|
|
1804
1797
|
{
|
|
1805
1798
|
type: "button",
|
|
1806
|
-
className: "
|
|
1799
|
+
className: "flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent cursor-pointer",
|
|
1807
1800
|
onClick: handleNextMonth,
|
|
1808
1801
|
"aria-label": "Next month"
|
|
1809
1802
|
},
|
|
1810
1803
|
"\u2192"
|
|
1811
|
-
)), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1804
|
+
)), /* @__PURE__ */ React7.createElement("div", { className: "grid grid-cols-7 gap-1 mt-2" }, ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map((day) => /* @__PURE__ */ React7.createElement("div", { key: day, className: "flex items-center justify-center h-8 w-full text-xs text-muted-foreground font-medium" }, day))), /* @__PURE__ */ React7.createElement("div", { className: "grid grid-cols-7 gap-1" }, days.map((date, index) => {
|
|
1812
1805
|
if (!date) {
|
|
1813
|
-
return /* @__PURE__ */ React7.createElement("div", { key: `empty-${index}
|
|
1806
|
+
return /* @__PURE__ */ React7.createElement("div", { key: `empty-${index}` });
|
|
1814
1807
|
}
|
|
1815
1808
|
const isStart = rangeStart && date.toDateString() === rangeStart.toDateString();
|
|
1816
1809
|
const isEnd = rangeEnd && date.toDateString() === rangeEnd.toDateString();
|
|
@@ -1823,7 +1816,7 @@ function DateRangePicker({
|
|
|
1823
1816
|
{
|
|
1824
1817
|
key: date.toISOString(),
|
|
1825
1818
|
type: "button",
|
|
1826
|
-
className: `
|
|
1819
|
+
className: `flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${isStart || isEnd ? "bg-primary text-primary-foreground font-semibold" : ""} ${isInRange || isInHoverRange ? "bg-accent/50" : ""} ${isToday ? "border border-primary" : ""} ${disabled2 ? "cursor-not-allowed opacity-50 pointer-events-none" : ""}`,
|
|
1827
1820
|
onClick: () => !disabled2 && handleDateSelect(date),
|
|
1828
1821
|
onMouseEnter: () => setHoverDate(date),
|
|
1829
1822
|
onMouseLeave: () => setHoverDate(null),
|
|
@@ -1834,11 +1827,7 @@ function DateRangePicker({
|
|
|
1834
1827
|
);
|
|
1835
1828
|
})));
|
|
1836
1829
|
};
|
|
1837
|
-
const
|
|
1838
|
-
const errorClassName = error ? "daterangepicker--error" : "";
|
|
1839
|
-
const disabledClassName = disabled ? "daterangepicker--disabled" : "";
|
|
1840
|
-
const openClassName = isOpen ? "daterangepicker--open" : "";
|
|
1841
|
-
const combinedClassName = `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${className}`.trim();
|
|
1830
|
+
const combinedClassName = `relative ${className}`.trim();
|
|
1842
1831
|
const displayValue = rangeStart && rangeEnd ? `${formatDate2(rangeStart, format)}${separator}${formatDate2(rangeEnd, format)}` : rangeStart ? formatDate2(rangeStart, format) : "";
|
|
1843
1832
|
return /* @__PURE__ */ React7.createElement("div", { ref: containerRef, className: combinedClassName }, /* @__PURE__ */ React7.createElement(
|
|
1844
1833
|
"input",
|
|
@@ -1854,7 +1843,7 @@ function DateRangePicker({
|
|
|
1854
1843
|
name: `${name}[end]`,
|
|
1855
1844
|
value: rangeEnd ? rangeEnd.toISOString() : ""
|
|
1856
1845
|
}
|
|
1857
|
-
), /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1846
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "relative" }, showIcon && /* @__PURE__ */ React7.createElement("span", { className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground pointer-events-none", "aria-hidden": "true" }, /* @__PURE__ */ React7.createElement(
|
|
1858
1847
|
"svg",
|
|
1859
1848
|
{
|
|
1860
1849
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -1872,7 +1861,7 @@ function DateRangePicker({
|
|
|
1872
1861
|
"input",
|
|
1873
1862
|
{
|
|
1874
1863
|
type: "text",
|
|
1875
|
-
className:
|
|
1864
|
+
className: `flex h-9 w-full rounded-md border border-input bg-transparent ${showIcon ? "pl-10" : "pl-3"} ${clearable && (rangeStart || rangeEnd) ? "pr-10" : "pr-3"} py-1 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm ${error ? "border-red-500 ring-1 ring-red-500" : ""}`,
|
|
1876
1865
|
value: displayValue,
|
|
1877
1866
|
onClick: handleToggle,
|
|
1878
1867
|
onBlur,
|
|
@@ -1888,13 +1877,13 @@ function DateRangePicker({
|
|
|
1888
1877
|
"button",
|
|
1889
1878
|
{
|
|
1890
1879
|
type: "button",
|
|
1891
|
-
className: "
|
|
1880
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors",
|
|
1892
1881
|
onClick: handleClear,
|
|
1893
1882
|
"aria-label": "Clear date range",
|
|
1894
1883
|
tabIndex: -1
|
|
1895
1884
|
},
|
|
1896
1885
|
"\u2715"
|
|
1897
|
-
)), isOpen && !disabled && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
1886
|
+
)), isOpen && !disabled && /* @__PURE__ */ React7.createElement("div", { className: "absolute z-50 top-full mt-1 min-w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md p-3" }, renderCalendar(), rangeStart && !rangeEnd && /* @__PURE__ */ React7.createElement("div", { className: "text-xs text-muted-foreground text-center pt-2 border-t border-border mt-2" }, "Select end date")));
|
|
1898
1887
|
}
|
|
1899
1888
|
DateRangePicker.displayName = "DateRangePicker";
|
|
1900
1889
|
function htmlToMarkdown(html) {
|
|
@@ -2049,17 +2038,13 @@ function RichTextEditor({
|
|
|
2049
2038
|
}
|
|
2050
2039
|
}
|
|
2051
2040
|
};
|
|
2052
|
-
const
|
|
2053
|
-
const errorClassName = error ? "richtexteditor--error" : "";
|
|
2054
|
-
const disabledClassName = disabled ? "richtexteditor--disabled" : "";
|
|
2055
|
-
const modeClassName = `richtexteditor--${currentMode}`;
|
|
2056
|
-
const combinedClassName = `${baseClassName} ${errorClassName} ${disabledClassName} ${modeClassName} ${className}`.trim();
|
|
2041
|
+
const combinedClassName = `rounded-md border border-input ${error ? "border-red-500 ring-1 ring-red-500" : ""} ${disabled ? "opacity-50 cursor-not-allowed" : ""} ${className}`.trim();
|
|
2057
2042
|
const editorStyle = {
|
|
2058
2043
|
minHeight,
|
|
2059
2044
|
maxHeight,
|
|
2060
2045
|
overflowY: maxHeight ? "auto" : void 0
|
|
2061
2046
|
};
|
|
2062
|
-
return /* @__PURE__ */ React7.createElement("div", { className: combinedClassName }, /* @__PURE__ */ React7.createElement("input", { type: "hidden", name, value: content }), showToolbar && /* @__PURE__ */ React7.createElement("div", { className: "
|
|
2047
|
+
return /* @__PURE__ */ React7.createElement("div", { className: combinedClassName }, /* @__PURE__ */ React7.createElement("input", { type: "hidden", name, value: content }), showToolbar && /* @__PURE__ */ React7.createElement("div", { className: "flex items-center justify-between p-2 border-b border-border bg-muted/50" }, /* @__PURE__ */ React7.createElement("div", { className: "flex items-center gap-1" }, toolbarButtons.map((buttonName) => {
|
|
2063
2048
|
const button = toolbarConfig[buttonName];
|
|
2064
2049
|
if (!button) return null;
|
|
2065
2050
|
return /* @__PURE__ */ React7.createElement(
|
|
@@ -2067,7 +2052,7 @@ function RichTextEditor({
|
|
|
2067
2052
|
{
|
|
2068
2053
|
key: buttonName,
|
|
2069
2054
|
type: "button",
|
|
2070
|
-
className: "
|
|
2055
|
+
className: "flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer transition-colors disabled:cursor-not-allowed disabled:opacity-50",
|
|
2071
2056
|
onClick: () => editorRef.current && button.action(editorRef.current),
|
|
2072
2057
|
title: button.title,
|
|
2073
2058
|
disabled: disabled || currentMode === "markdown",
|
|
@@ -2079,18 +2064,18 @@ function RichTextEditor({
|
|
|
2079
2064
|
"button",
|
|
2080
2065
|
{
|
|
2081
2066
|
type: "button",
|
|
2082
|
-
className: "
|
|
2067
|
+
className: "flex items-center justify-center h-8 px-3 rounded border-none bg-transparent hover:bg-accent text-xs font-medium text-muted-foreground hover:text-foreground cursor-pointer transition-colors disabled:cursor-not-allowed disabled:opacity-50",
|
|
2083
2068
|
onClick: handleModeToggle,
|
|
2084
2069
|
disabled,
|
|
2085
2070
|
title: `Switch to ${currentMode === "wysiwyg" ? "Markdown" : "WYSIWYG"}`,
|
|
2086
2071
|
"aria-label": `Switch to ${currentMode === "wysiwyg" ? "Markdown" : "WYSIWYG"}`
|
|
2087
2072
|
},
|
|
2088
2073
|
currentMode === "wysiwyg" ? "MD" : "WYSIWYG"
|
|
2089
|
-
)), /* @__PURE__ */ React7.createElement("div", {
|
|
2074
|
+
)), /* @__PURE__ */ React7.createElement("div", { style: editorStyle }, currentMode === "wysiwyg" ? /* @__PURE__ */ React7.createElement(
|
|
2090
2075
|
"div",
|
|
2091
2076
|
{
|
|
2092
2077
|
ref: editorRef,
|
|
2093
|
-
className: "
|
|
2078
|
+
className: "w-full p-3 text-base md:text-sm outline-none bg-transparent focus-visible:outline-none [&:empty:before]:content-[attr(data-placeholder)] [&:empty:before]:text-muted-foreground",
|
|
2094
2079
|
role: "textbox",
|
|
2095
2080
|
contentEditable: !disabled,
|
|
2096
2081
|
onInput: handleWysiwygChange,
|
|
@@ -2105,7 +2090,7 @@ function RichTextEditor({
|
|
|
2105
2090
|
"textarea",
|
|
2106
2091
|
{
|
|
2107
2092
|
ref: textareaRef,
|
|
2108
|
-
className: "
|
|
2093
|
+
className: "w-full p-3 text-base md:text-sm outline-none bg-transparent resize-none focus-visible:outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
|
|
2109
2094
|
value: content,
|
|
2110
2095
|
onChange: handleMarkdownChange,
|
|
2111
2096
|
onBlur,
|
|
@@ -2114,7 +2099,8 @@ function RichTextEditor({
|
|
|
2114
2099
|
placeholder,
|
|
2115
2100
|
"aria-invalid": error || props["aria-invalid"] ? "true" : "false",
|
|
2116
2101
|
"aria-describedby": props["aria-describedby"],
|
|
2117
|
-
"aria-required": required || props["aria-required"]
|
|
2102
|
+
"aria-required": required || props["aria-required"],
|
|
2103
|
+
style: editorStyle
|
|
2118
2104
|
}
|
|
2119
2105
|
)));
|
|
2120
2106
|
}
|