@nucleux/md3-structured-input 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +93 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +94 -10
- package/dist/index.js.map +1 -1
- package/package.json +8 -6
package/dist/index.cjs
CHANGED
|
@@ -6,6 +6,7 @@ var utils = require('@nucleux/utils');
|
|
|
6
6
|
var md3Button = require('@nucleux/md3-button');
|
|
7
7
|
var md3Card = require('@nucleux/md3-card');
|
|
8
8
|
var md3Chip = require('@nucleux/md3-chip');
|
|
9
|
+
var md3SegmentedButton = require('@nucleux/md3-segmented-button');
|
|
9
10
|
var structuredInput = require('@nucleux/structured-input');
|
|
10
11
|
var lucideReact = require('lucide-react');
|
|
11
12
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -190,6 +191,12 @@ var Md3StructuredInputSlots = React__namespace.forwardRef(
|
|
|
190
191
|
onSubmit,
|
|
191
192
|
submitLabel = "Generate",
|
|
192
193
|
label = "Structured prompt builder",
|
|
194
|
+
title,
|
|
195
|
+
icon,
|
|
196
|
+
aside,
|
|
197
|
+
showProgress = false,
|
|
198
|
+
onCancel,
|
|
199
|
+
cancelLabel = "Cancel",
|
|
193
200
|
className,
|
|
194
201
|
...props
|
|
195
202
|
}, ref) => {
|
|
@@ -204,29 +211,55 @@ var Md3StructuredInputSlots = React__namespace.forwardRef(
|
|
|
204
211
|
setEdited((e) => ({ ...e, [name]: true }));
|
|
205
212
|
onValuesChange?.(next);
|
|
206
213
|
};
|
|
214
|
+
const filled = (name) => !!values[name]?.trim();
|
|
215
|
+
const filledCount = slots.filter((slot) => filled(slot.name)).length;
|
|
216
|
+
const requiredMet = slots.every((slot) => !slot.required || filled(slot.name));
|
|
207
217
|
const hasAny = Object.values(values).some((v) => v && v.trim()) || extra.trim().length > 0;
|
|
218
|
+
const canSubmit = hasAny && requiredMet;
|
|
208
219
|
const freeformLabel = typeof freeform === "string" ? freeform : "Anything else?";
|
|
220
|
+
const titleId = `${baseId}-title`;
|
|
209
221
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
210
222
|
"form",
|
|
211
223
|
{
|
|
212
224
|
ref,
|
|
213
|
-
"aria-label": label,
|
|
225
|
+
"aria-label": title == null ? label : void 0,
|
|
226
|
+
"aria-labelledby": title == null ? void 0 : titleId,
|
|
214
227
|
className: utils.cn("grid grid-cols-1 gap-4 text-md-on-surface sm:grid-cols-2", className),
|
|
215
228
|
onSubmit: (e) => {
|
|
216
229
|
e.preventDefault();
|
|
217
|
-
if (
|
|
230
|
+
if (canSubmit) onSubmit?.(values, extra);
|
|
218
231
|
},
|
|
219
232
|
...props,
|
|
220
233
|
children: [
|
|
234
|
+
(title != null || aside != null) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 sm:col-span-2", children: [
|
|
235
|
+
icon != null && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "inline-flex shrink-0 text-md-primary [&_svg]:size-6", children: icon }),
|
|
236
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { id: titleId, className: "flex-1 text-[1.375rem] leading-7 text-md-on-surface", children: title }),
|
|
237
|
+
aside != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-md-on-surface-variant", children: aside })
|
|
238
|
+
] }),
|
|
221
239
|
slots.map((slot) => {
|
|
222
240
|
const id = `${baseId}-${slot.name}`;
|
|
223
241
|
const helperId = `${id}-helper`;
|
|
224
242
|
const isEdited = !!edited[slot.name];
|
|
225
243
|
const mark = slot.suggested ? isEdited ? "edited" : "suggested" : null;
|
|
226
244
|
const describedBy = slot.helper || mark === "suggested" ? helperId : void 0;
|
|
245
|
+
const type = structuredInput.structuredSlotType(slot);
|
|
227
246
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("flex flex-col gap-1.5", slot.wide && "sm:col-span-2"), children: [
|
|
228
247
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-6 items-center gap-2", children: [
|
|
229
|
-
/* @__PURE__ */ jsxRuntime.
|
|
248
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
249
|
+
"label",
|
|
250
|
+
{
|
|
251
|
+
id: `${id}-label`,
|
|
252
|
+
htmlFor: id,
|
|
253
|
+
className: utils.cn(
|
|
254
|
+
"tracking-[0.1px]",
|
|
255
|
+
title != null ? "text-sm font-medium text-md-on-surface" : "text-xs font-medium tracking-[0.5px] text-md-on-surface-variant"
|
|
256
|
+
),
|
|
257
|
+
children: [
|
|
258
|
+
slot.label,
|
|
259
|
+
slot.required && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: " *" })
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
),
|
|
230
263
|
mark && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
231
264
|
"span",
|
|
232
265
|
{
|
|
@@ -241,29 +274,70 @@ var Md3StructuredInputSlots = React__namespace.forwardRef(
|
|
|
241
274
|
}
|
|
242
275
|
)
|
|
243
276
|
] }),
|
|
244
|
-
slot.options ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
277
|
+
type === "select" && slot.options ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
245
278
|
"select",
|
|
246
279
|
{
|
|
247
280
|
id,
|
|
248
281
|
value: values[slot.name] ?? "",
|
|
249
282
|
"aria-describedby": describedBy,
|
|
283
|
+
"aria-required": slot.required || void 0,
|
|
250
284
|
onChange: (e) => setValue(slot.name, e.target.value),
|
|
251
|
-
className: utils.cn(fieldClass, "h-14 cursor-pointer", !values[slot.name] && "text-md-on-surface-variant"),
|
|
285
|
+
className: utils.cn(fieldClass, "h-14 cursor-pointer bg-md-surface", !values[slot.name] && "text-md-on-surface-variant"),
|
|
252
286
|
children: [
|
|
253
287
|
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, children: slot.placeholder ?? "Choose\u2026" }),
|
|
254
288
|
slot.options.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: typeof o.label === "string" || typeof o.label === "number" ? o.label : o.value }, o.value))
|
|
255
289
|
]
|
|
256
290
|
}
|
|
257
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
291
|
+
) : type === "segmented" && slot.options ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
292
|
+
md3SegmentedButton.Md3SegmentedButton,
|
|
293
|
+
{
|
|
294
|
+
id,
|
|
295
|
+
"aria-labelledby": `${id}-label`,
|
|
296
|
+
"aria-describedby": describedBy,
|
|
297
|
+
value: values[slot.name] ?? "",
|
|
298
|
+
onValueChange: (v) => setValue(slot.name, typeof v === "string" ? v : v[0] ?? ""),
|
|
299
|
+
className: "h-14 w-fit max-w-full",
|
|
300
|
+
children: slot.options.map((o) => /* @__PURE__ */ jsxRuntime.jsx(md3SegmentedButton.Md3SegmentedButtonItem, { value: o.value, className: "min-w-24 text-base", children: o.label }, o.value))
|
|
301
|
+
}
|
|
302
|
+
) : type === "tags" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn(fieldClass, "flex min-h-14 flex-wrap items-center gap-2 bg-md-surface px-2 py-2 focus-within:border-md-primary"), children: [
|
|
303
|
+
structuredInput.splitStructuredTags(values[slot.name]).map((t, _i, all) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
304
|
+
md3Chip.Md3Chip,
|
|
305
|
+
{
|
|
306
|
+
variant: "input",
|
|
307
|
+
onRemove: () => setValue(slot.name, all.filter((x) => x !== t).join(", ")),
|
|
308
|
+
children: t
|
|
309
|
+
},
|
|
310
|
+
t
|
|
311
|
+
)),
|
|
312
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
313
|
+
"input",
|
|
314
|
+
{
|
|
315
|
+
id,
|
|
316
|
+
placeholder: slot.placeholder ?? "Add\u2026",
|
|
317
|
+
"aria-describedby": describedBy,
|
|
318
|
+
onKeyDown: (e) => {
|
|
319
|
+
const el = e.currentTarget;
|
|
320
|
+
if ((e.key === "Enter" || e.key === ",") && el.value.trim()) {
|
|
321
|
+
e.preventDefault();
|
|
322
|
+
const tags = structuredInput.splitStructuredTags(values[slot.name]);
|
|
323
|
+
if (!tags.includes(el.value.trim())) setValue(slot.name, [...tags, el.value.trim()].join(", "));
|
|
324
|
+
el.value = "";
|
|
325
|
+
}
|
|
326
|
+
},
|
|
327
|
+
className: "min-w-16 flex-1 bg-transparent px-2 text-base outline-none placeholder:text-md-on-surface-variant"
|
|
328
|
+
}
|
|
329
|
+
)
|
|
330
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
258
331
|
"input",
|
|
259
332
|
{
|
|
260
333
|
id,
|
|
261
|
-
type: "text",
|
|
334
|
+
type: type === "date" ? "date" : "text",
|
|
262
335
|
value: values[slot.name] ?? "",
|
|
263
336
|
placeholder: slot.placeholder,
|
|
264
337
|
"aria-describedby": describedBy,
|
|
338
|
+
"aria-required": slot.required || void 0,
|
|
265
339
|
onChange: (e) => setValue(slot.name, e.target.value),
|
|
266
|
-
className: utils.cn(fieldClass, "h-14")
|
|
340
|
+
className: utils.cn(fieldClass, "h-14 bg-md-surface")
|
|
267
341
|
}
|
|
268
342
|
),
|
|
269
343
|
describedBy && /* @__PURE__ */ jsxRuntime.jsxs("p", { id: helperId, className: "px-4 text-xs text-md-on-surface-variant", children: [
|
|
@@ -293,7 +367,17 @@ var Md3StructuredInputSlots = React__namespace.forwardRef(
|
|
|
293
367
|
}
|
|
294
368
|
)
|
|
295
369
|
] }),
|
|
296
|
-
onSubmit && /* @__PURE__ */ jsxRuntime.
|
|
370
|
+
(onSubmit || onCancel || showProgress) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 sm:col-span-2", children: [
|
|
371
|
+
showProgress && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-md-on-surface-variant", "aria-live": "polite", children: [
|
|
372
|
+
filledCount,
|
|
373
|
+
" of ",
|
|
374
|
+
slots.length,
|
|
375
|
+
" filled"
|
|
376
|
+
] }),
|
|
377
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1" }),
|
|
378
|
+
onCancel && /* @__PURE__ */ jsxRuntime.jsx(md3Button.Md3Button, { type: "button", variant: "text", onClick: onCancel, children: cancelLabel }),
|
|
379
|
+
onSubmit && /* @__PURE__ */ jsxRuntime.jsx(md3Button.Md3Button, { type: "submit", variant: "filled", disabled: !canSubmit, children: submitLabel })
|
|
380
|
+
] })
|
|
297
381
|
]
|
|
298
382
|
}
|
|
299
383
|
);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx"],"names":["cn","React","jsxs","Md3Card","jsx","Check","Md3Button","Sparkles","UserPen","structuredPartsToText","X","Md3Chip"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@nucleux/utils\";\nimport { Md3Button } from \"@nucleux/md3-button\";\nimport { Md3Card } from \"@nucleux/md3-card\";\nimport { Md3Chip } from \"@nucleux/md3-chip\";\nimport {\n structuredPartsToText,\n type StructuredInputPart,\n type StructuredInputProps,\n type StructuredInputSlotsProps,\n type StructuredInputTagsProps,\n type StructuredInputTagTrigger,\n type StructuredInputValues,\n type StructuredInputWizardProps,\n} from \"@nucleux/structured-input\";\nimport { Check, Sparkles, UserPen, X } from \"lucide-react\";\n\n// Same API as the shadcn twin: the props and data shapes are the twin's own types.\nexport type Md3StructuredInputProps = StructuredInputProps;\nexport type Md3StructuredInputSlotsProps = StructuredInputSlotsProps;\nexport type Md3StructuredInputTagsProps = StructuredInputTagsProps;\nexport type Md3StructuredInputWizardProps = StructuredInputWizardProps;\nexport type {\n StructuredOption,\n StructuredInputSlot,\n StructuredInputValues,\n StructuredInputTagTrigger,\n StructuredInputPart,\n} from \"@nucleux/structured-input\";\n/** Serialise parts into the plain prompt text — shared with `@nucleux/structured-input`. */\nexport { structuredPartsToText };\n\nconst stateLayer =\n \"before:absolute before:inset-0 before:bg-current before:opacity-0 before:transition-opacity before:content-[''] hover:before:opacity-[0.08] focus-visible:before:opacity-[0.12] active:before:opacity-[0.12]\";\n\n/** MD3 outlined field chrome, shared by text inputs, selects and textareas. */\nconst fieldClass = cn(\n \"w-full rounded-md-xs border border-md-outline bg-transparent px-4 text-base text-md-on-surface outline-none transition-colors\",\n \"placeholder:text-md-on-surface-variant hover:border-md-on-surface\",\n \"focus:border-md-primary focus:ring-1 focus:ring-inset focus:ring-md-primary\",\n \"disabled:cursor-not-allowed disabled:opacity-[0.38]\",\n);\n\n/**\n * Material 3 structured input: an agent-generated clarifying question as a\n * compact MD3 card — single or multi-select options drawn as MD3 radio and\n * checkbox rows with a state layer, a free-text escape, and a skip. Arrow keys\n * move and select in single mode, exactly as in the twin. The other variants\n * are composable siblings: {@link Md3StructuredInputSlots},\n * {@link Md3StructuredInputTags} and {@link Md3StructuredInputWizard}. Shares\n * its API with `StructuredInput` from `@nucleux/structured-input`.\n */\nexport const Md3StructuredInput = React.forwardRef<HTMLDivElement, Md3StructuredInputProps>(\n (\n {\n question,\n options,\n multiple = false,\n value,\n defaultValue = [],\n onValueChange,\n allowOther = false,\n otherPlaceholder = \"Something else…\",\n onSubmit,\n onSkip,\n submitLabel = \"Continue\",\n skipLabel = \"Skip\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<string[]>(defaultValue);\n const [other, setOther] = React.useState(\"\");\n const questionId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const selected = value !== undefined ? value : internal;\n\n const setSelected = (next: string[]) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n const toggle = (val: string) => {\n if (multiple) {\n setSelected(selected.includes(val) ? selected.filter((v) => v !== val) : [...selected, val]);\n } else {\n setSelected([val]);\n }\n };\n\n return (\n <Md3Card\n ref={ref}\n variant=\"outlined\"\n className={cn(\"flex flex-col gap-4 rounded-md-lg p-5 animate-nx-fade-in motion-reduce:animate-none\", className)}\n {...props}\n >\n <p id={questionId} className=\"text-base font-medium tracking-[0.15px] text-md-on-surface\">\n {question}\n </p>\n <div\n ref={groupRef}\n role={multiple ? \"group\" : \"radiogroup\"}\n aria-labelledby={questionId}\n className=\"flex flex-col gap-1\"\n onKeyDown={(e) => {\n // Radio-group keyboard pattern: arrows move and select.\n if (multiple || ![\"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(e.key)) return;\n const radios = Array.from(groupRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]') ?? []);\n const i = radios.indexOf(document.activeElement as HTMLButtonElement);\n if (i < 0) return;\n e.preventDefault();\n const step = e.key === \"ArrowDown\" || e.key === \"ArrowRight\" ? 1 : -1;\n const next = (i + step + radios.length) % radios.length;\n radios[next].focus();\n setSelected([options[next].value]);\n }}\n >\n {options.map((option, index) => {\n const active = selected.includes(option.value);\n const tabbable = multiple || index === Math.max(0, options.findIndex((o) => selected.includes(o.value)));\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multiple ? \"checkbox\" : \"radio\"}\n aria-checked={active}\n tabIndex={tabbable ? 0 : -1}\n onClick={() => toggle(option.value)}\n className={cn(\n \"relative flex min-h-12 items-center gap-4 overflow-hidden rounded-md-md px-3 py-2 text-left text-sm transition-colors duration-200 motion-reduce:transition-none\",\n stateLayer,\n \"outline-none focus-visible:ring-2 focus-visible:ring-md-primary\",\n active\n ? \"bg-md-secondary-container text-md-on-secondary-container\"\n : \"text-md-on-surface\",\n )}\n >\n {multiple ? (\n <span\n className={cn(\n \"relative inline-flex size-[18px] shrink-0 items-center justify-center rounded-[2px] border-2 transition-colors [&_svg]:size-3.5\",\n active ? \"border-md-primary bg-md-primary text-md-on-primary\" : \"border-md-on-surface-variant\",\n )}\n >\n {active && <Check strokeWidth={3} aria-hidden=\"true\" />}\n </span>\n ) : (\n <span\n className={cn(\n \"relative inline-flex size-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors\",\n active ? \"border-md-primary\" : \"border-md-on-surface-variant\",\n )}\n >\n <span\n className={cn(\n \"size-2.5 rounded-full bg-md-primary transition-transform duration-200 motion-reduce:transition-none\",\n active ? \"scale-100\" : \"scale-0\",\n )}\n />\n </span>\n )}\n <span className=\"relative flex-1\">{option.label}</span>\n </button>\n );\n })}\n </div>\n {allowOther && (\n <input\n type=\"text\"\n value={other}\n onChange={(e) => setOther(e.target.value)}\n placeholder={otherPlaceholder}\n aria-label={otherPlaceholder}\n className={cn(fieldClass, \"h-12\")}\n />\n )}\n <div className=\"flex items-center justify-end gap-2\">\n {onSkip && (\n <Md3Button variant=\"text\" onClick={onSkip}>\n {skipLabel}\n </Md3Button>\n )}\n {onSubmit && (\n <Md3Button\n variant=\"filled\"\n onClick={() => onSubmit(selected, allowOther ? other : undefined)}\n disabled={selected.length === 0 && !(allowOther && other.trim())}\n >\n {submitLabel}\n </Md3Button>\n )}\n </div>\n </Md3Card>\n );\n },\n);\nMd3StructuredInput.displayName = \"Md3StructuredInput\";\n\n/* -------------------------------------------------------------------------- */\n/* Named slots */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Material 3 named slots: a short set of plain-language MD3 outlined fields\n * (2–4) that fill a prompt template — text fields or native selects with\n * visible labels and helper text, an optional freeform override, and a submit\n * that never requires every field. Agent-suggested values carry a\n * primary-container “Suggested” mark with their reason and turn into a neutral\n * “Edited by you” once changed; the component never changes a value the person\n * set. Shares its API with `StructuredInputSlots`.\n */\nexport const Md3StructuredInputSlots = React.forwardRef<HTMLFormElement, Md3StructuredInputSlotsProps>(\n (\n {\n slots,\n values: valuesProp,\n defaultValues,\n onValuesChange,\n freeform = false,\n onSubmit,\n submitLabel = \"Generate\",\n label = \"Structured prompt builder\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<StructuredInputValues>(defaultValues ?? {});\n const values = valuesProp ?? internal;\n const [edited, setEdited] = React.useState<Record<string, boolean>>({});\n const [extra, setExtra] = React.useState(\"\");\n const baseId = React.useId();\n\n const setValue = (name: string, value: string) => {\n const next = { ...values, [name]: value };\n if (valuesProp === undefined) setInternal(next);\n setEdited((e) => ({ ...e, [name]: true }));\n onValuesChange?.(next);\n };\n\n const hasAny = Object.values(values).some((v) => v && v.trim()) || extra.trim().length > 0;\n const freeformLabel = typeof freeform === \"string\" ? freeform : \"Anything else?\";\n\n return (\n <form\n ref={ref}\n aria-label={label}\n className={cn(\"grid grid-cols-1 gap-4 text-md-on-surface sm:grid-cols-2\", className)}\n onSubmit={(e) => {\n e.preventDefault();\n if (hasAny) onSubmit?.(values, extra);\n }}\n {...props}\n >\n {slots.map((slot) => {\n const id = `${baseId}-${slot.name}`;\n const helperId = `${id}-helper`;\n const isEdited = !!edited[slot.name];\n const mark = slot.suggested ? (isEdited ? \"edited\" : \"suggested\") : null;\n const describedBy = slot.helper || mark === \"suggested\" ? helperId : undefined;\n return (\n <div key={slot.name} className={cn(\"flex flex-col gap-1.5\", slot.wide && \"sm:col-span-2\")}>\n <div className=\"flex min-h-6 items-center gap-2\">\n <label htmlFor={id} className=\"text-xs font-medium tracking-[0.5px] text-md-on-surface-variant\">\n {slot.label}\n </label>\n {mark && (\n <span\n className={cn(\n \"inline-flex h-6 items-center gap-1 rounded-md-sm px-2 text-[11px] font-medium tracking-[0.5px] [&_svg]:size-3.5\",\n mark === \"suggested\"\n ? \"bg-md-primary-container text-md-on-primary-container\"\n : \"bg-md-surface-container-high text-md-on-surface-variant\",\n )}\n >\n {mark === \"suggested\" ? <Sparkles aria-hidden=\"true\" /> : <UserPen aria-hidden=\"true\" />}\n {mark === \"suggested\" ? \"Suggested\" : \"Edited by you\"}\n </span>\n )}\n </div>\n {slot.options ? (\n <select\n id={id}\n value={values[slot.name] ?? \"\"}\n aria-describedby={describedBy}\n onChange={(e) => setValue(slot.name, e.target.value)}\n className={cn(fieldClass, \"h-14 cursor-pointer\", !values[slot.name] && \"text-md-on-surface-variant\")}\n >\n <option value=\"\" disabled>\n {slot.placeholder ?? \"Choose…\"}\n </option>\n {slot.options.map((o) => (\n <option key={o.value} value={o.value}>\n {typeof o.label === \"string\" || typeof o.label === \"number\" ? o.label : o.value}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={id}\n type=\"text\"\n value={values[slot.name] ?? \"\"}\n placeholder={slot.placeholder}\n aria-describedby={describedBy}\n onChange={(e) => setValue(slot.name, e.target.value)}\n className={cn(fieldClass, \"h-14\")}\n />\n )}\n {describedBy && (\n <p id={helperId} className=\"px-4 text-xs text-md-on-surface-variant\">\n {mark === \"suggested\" ? `Suggested ${slot.suggested}. ` : \"\"}\n {slot.helper}\n </p>\n )}\n </div>\n );\n })}\n {freeform && (\n <div className=\"flex flex-col gap-1.5 sm:col-span-2\">\n <label\n htmlFor={`${baseId}-freeform`}\n className=\"text-xs font-medium tracking-[0.5px] text-md-on-surface-variant\"\n >\n {freeformLabel}\n </label>\n <textarea\n id={`${baseId}-freeform`}\n rows={2}\n value={extra}\n placeholder=\"Say it in your own words — this overrides the fields above\"\n onChange={(e) => setExtra(e.target.value)}\n className={cn(fieldClass, \"resize-none py-3\")}\n />\n </div>\n )}\n {onSubmit && (\n <div className=\"flex justify-end sm:col-span-2\">\n <Md3Button type=\"submit\" variant=\"filled\" disabled={!hasAny}>\n {submitLabel}\n </Md3Button>\n </div>\n )}\n </form>\n );\n },\n);\nMd3StructuredInputSlots.displayName = \"Md3StructuredInputSlots\";\n\n/* -------------------------------------------------------------------------- */\n/* Tagged input */\n/* -------------------------------------------------------------------------- */\n\n// Same defaults as the twin (internal there).\nconst DEFAULT_TRIGGERS: StructuredInputTagTrigger[] = [\n { trigger: \"@\", label: \"Person\" },\n { trigger: \"p:\", label: \"Project\" },\n { trigger: \"/\", label: \"File\" },\n];\n\n/** MD3 tonal roles for tag chips, cycled per trigger. */\nconst TAG_TONES = [\n \"bg-md-primary-container text-md-on-primary-container\",\n \"bg-md-secondary-container text-md-on-secondary-container\",\n \"bg-md-tertiary-container text-md-on-tertiary-container\",\n \"bg-md-surface-container-high text-md-on-surface\",\n];\n\n/**\n * Material 3 tagged input: a prompt field (MD3 outlined) where typed prefixes\n * (`@` person, `p:` project, `/` file — configurable) become removable input\n * chips in tonal containers, with type-ahead suggestions as MD3 suggestion\n * chips. Backspace on an empty field removes the last tag; Enter sends. Tags\n * are optional — plain text always works. Shares its API (and\n * `structuredPartsToText`) with `StructuredInputTags`.\n */\nexport const Md3StructuredInputTags = React.forwardRef<HTMLDivElement, Md3StructuredInputTagsProps>(\n (\n {\n triggers = DEFAULT_TRIGGERS,\n value: valueProp,\n defaultValue,\n onValueChange,\n onSubmit,\n placeholder = \"Type @ for people, p: for projects, / for files\",\n submitLabel = \"Send\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<StructuredInputPart[]>(defaultValue ?? []);\n const parts = valueProp ?? internal;\n const [draft, setDraft] = React.useState(\"\");\n const inputRef = React.useRef<HTMLInputElement>(null);\n const hintId = React.useId();\n\n const commit = (next: StructuredInputPart[]) => {\n if (valueProp === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n // Longest trigger first so \"p:\" wins over \"p\".\n const ordered = [...triggers].sort((a, b) => b.trigger.length - a.trigger.length);\n const matchTag = (word: string) => {\n const t = ordered.find((tr) => word.startsWith(tr.trigger) && word.length > tr.trigger.length);\n return t ? { trigger: t.trigger, value: word.slice(t.trigger.length) } : null;\n };\n\n const lastWord = draft.split(\" \").pop() ?? \"\";\n const activeTrigger = ordered.find((tr) => lastWord.startsWith(tr.trigger));\n const query = activeTrigger ? lastWord.slice(activeTrigger.trigger.length).toLowerCase() : \"\";\n const suggestions =\n activeTrigger?.suggestions?.filter((s) => s.toLowerCase().startsWith(query)).slice(0, 5) ?? [];\n\n /** Split the draft into text + a trailing tag (if any) and commit them. */\n const flush = (source = draft, forceTag?: { trigger: string; value: string }): StructuredInputPart[] => {\n const words = source.split(\" \");\n const last = words.pop() ?? \"\";\n const tag = forceTag ?? matchTag(last);\n const textBefore = (tag ? words.join(\" \") : source).trim();\n const next = [...parts];\n if (textBefore) next.push({ type: \"text\", text: textBefore });\n if (tag) next.push({ type: \"tag\", ...tag });\n if (next.length !== parts.length) commit(next);\n setDraft(\"\");\n return next;\n };\n\n const toneFor = (trigger: string) => {\n const i = triggers.findIndex((t) => t.trigger === trigger);\n return TAG_TONES[(i < 0 ? 0 : i) % TAG_TONES.length];\n };\n const labelFor = (trigger: string) => triggers.find((t) => t.trigger === trigger)?.label ?? \"Tag\";\n\n const submit = () => {\n const next = flush();\n const text = structuredPartsToText(next);\n if (text) onSubmit?.(next, text);\n };\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-2 text-md-on-surface\", className)} {...props}>\n <div\n className={cn(\n \"flex min-h-14 flex-wrap items-center gap-1.5 rounded-md-xs border border-md-outline bg-transparent px-3 py-2 text-base text-md-on-surface transition-colors\",\n \"hover:border-md-on-surface focus-within:border-md-primary focus-within:ring-1 focus-within:ring-inset focus-within:ring-md-primary\",\n )}\n onClick={() => inputRef.current?.focus()}\n >\n {parts.map((part, i) =>\n part.type === \"text\" ? (\n <span key={i}>{part.text}</span>\n ) : (\n <span\n key={i}\n className={cn(\n \"inline-flex h-7 items-center gap-0.5 rounded-md-sm pl-2 pr-0.5 text-sm font-medium animate-nx-fade-in motion-reduce:animate-none\",\n toneFor(part.trigger),\n )}\n >\n {part.trigger}\n {part.value}\n <button\n type=\"button\"\n aria-label={`Remove ${labelFor(part.trigger).toLowerCase()} ${part.trigger}${part.value}`}\n onClick={(e) => {\n e.stopPropagation();\n commit(parts.filter((_, j) => j !== i));\n inputRef.current?.focus();\n }}\n className={cn(\n \"relative inline-flex size-6 items-center justify-center overflow-hidden rounded-full [&_svg]:size-3.5\",\n stateLayer,\n \"outline-none focus-visible:ring-2 focus-visible:ring-md-primary\",\n )}\n >\n <X className=\"relative\" aria-hidden=\"true\" />\n </button>\n </span>\n ),\n )}\n <input\n ref={inputRef}\n type=\"text\"\n value={draft}\n aria-label={placeholder}\n aria-describedby={hintId}\n placeholder={parts.length ? undefined : placeholder}\n onChange={(e) => {\n const v = e.target.value;\n // A space after a tag word (incl. mobile keyboards that skip keydown) makes it a chip.\n if (v.endsWith(\" \") && matchTag(v.trimEnd().split(\" \").pop() ?? \"\")) flush(v.trimEnd());\n else setDraft(v);\n }}\n onKeyDown={(e) => {\n if (e.key === \" \" && matchTag(lastWord)) {\n e.preventDefault();\n flush();\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n submit();\n } else if (e.key === \"Backspace\" && draft === \"\" && parts.length) {\n e.preventDefault();\n const last = parts[parts.length - 1];\n commit(parts.slice(0, -1));\n if (last.type === \"text\") setDraft(last.text);\n }\n }}\n className=\"h-8 min-w-[8rem] flex-1 bg-transparent text-base text-md-on-surface outline-none placeholder:text-md-on-surface-variant\"\n />\n </div>\n <p id={hintId} className=\"sr-only\">\n {triggers.map((t) => `${t.trigger} for ${t.label.toLowerCase()}`).join(\", \")}. Space turns a tag into a\n chip; Backspace removes the last one; Enter sends.\n </p>\n {activeTrigger && suggestions.length > 0 && (\n <div role=\"group\" aria-label={`${activeTrigger.label} suggestions`} className=\"flex flex-wrap gap-2\">\n {suggestions.map((s) => (\n <Md3Chip\n key={s}\n variant=\"suggestion\"\n onClick={() => {\n flush(draft, { trigger: activeTrigger.trigger, value: s });\n inputRef.current?.focus();\n }}\n >\n {activeTrigger.trigger}\n {s}\n </Md3Chip>\n ))}\n </div>\n )}\n {onSubmit && (\n <div className=\"flex justify-end\">\n <Md3Button variant=\"filled\" onClick={submit} disabled={parts.length === 0 && draft.trim() === \"\"}>\n {submitLabel}\n </Md3Button>\n </div>\n )}\n </div>\n );\n },\n);\nMd3StructuredInputTags.displayName = \"Md3StructuredInputTags\";\n\n/* -------------------------------------------------------------------------- */\n/* Wizard step */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Material 3 wizard step: a multi-step MD3 card for high-stakes prompts\n * (legal, HR, medical) — a segmented progress track in the primary colour,\n * “Step 2 of 3 · Audience”, the step's question and fields (children), and\n * Back / Next / Generate as MD3 text and filled buttons. Focus moves to the\n * step heading when the step changes; nothing forces every step to be filled\n * before generating. Shares its API with `StructuredInputWizard`.\n */\nexport const Md3StructuredInputWizard = React.forwardRef<HTMLDivElement, Md3StructuredInputWizardProps>(\n (\n {\n steps,\n step: stepProp,\n defaultStep = 0,\n onStepChange,\n description,\n onSubmit,\n submitLabel = \"Generate\",\n allowEarlySubmit = true,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState(defaultStep);\n const step = Math.min(Math.max(stepProp ?? internal, 0), Math.max(steps.length - 1, 0));\n const headingRef = React.useRef<HTMLParagraphElement>(null);\n const headingId = React.useId();\n const moved = React.useRef(false);\n\n React.useEffect(() => {\n if (moved.current) headingRef.current?.focus();\n }, [step]);\n\n const go = (next: number) => {\n moved.current = true;\n if (stepProp === undefined) setInternal(next);\n onStepChange?.(next);\n };\n\n const last = step === steps.length - 1;\n\n return (\n <Md3Card\n ref={ref}\n variant=\"outlined\"\n role=\"group\"\n aria-labelledby={headingId}\n className={cn(\"flex flex-col gap-3 rounded-md-lg p-4\", className)}\n {...props}\n >\n <div className=\"flex gap-1\" aria-hidden=\"true\">\n {steps.map((_, i) => (\n <span\n key={i}\n className={cn(\n \"h-1 flex-1 rounded-full transition-colors duration-300 motion-reduce:transition-none\",\n i <= step ? \"bg-md-primary\" : \"bg-md-secondary-container\",\n )}\n />\n ))}\n </div>\n <div className=\"flex flex-col gap-1\">\n <p\n ref={headingRef}\n id={headingId}\n tabIndex={-1}\n className=\"rounded-md-xs text-sm font-medium tracking-[0.1px] text-md-on-surface outline-none focus-visible:ring-2 focus-visible:ring-md-primary\"\n >\n Step {step + 1} of {steps.length} · {steps[step]}\n </p>\n {description && <p className=\"text-sm text-md-on-surface-variant\">{description}</p>}\n </div>\n {children}\n <div className=\"flex items-center gap-2\">\n {step > 0 && (\n <Md3Button variant=\"text\" onClick={() => go(step - 1)}>\n Back\n </Md3Button>\n )}\n <span className=\"flex-1\" />\n {!last && allowEarlySubmit && onSubmit && (\n <Md3Button variant=\"text\" onClick={onSubmit}>\n {submitLabel} now\n </Md3Button>\n )}\n {last ? (\n onSubmit && (\n <Md3Button variant=\"filled\" onClick={onSubmit}>\n {submitLabel}\n </Md3Button>\n )\n ) : (\n <Md3Button variant=\"filled\" onClick={() => go(step + 1)}>\n Next\n </Md3Button>\n )}\n </div>\n </Md3Card>\n );\n },\n);\nMd3StructuredInputWizard.displayName = \"Md3StructuredInputWizard\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx"],"names":["cn","React","jsxs","Md3Card","jsx","Check","Md3Button","structuredSlotType","Sparkles","UserPen","Md3SegmentedButton","Md3SegmentedButtonItem","splitStructuredTags","Md3Chip","structuredPartsToText","X"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@nucleux/utils\";\nimport { Md3Button } from \"@nucleux/md3-button\";\nimport { Md3Card } from \"@nucleux/md3-card\";\nimport { Md3Chip } from \"@nucleux/md3-chip\";\nimport { Md3SegmentedButton, Md3SegmentedButtonItem } from \"@nucleux/md3-segmented-button\";\nimport {\n splitStructuredTags,\n structuredSlotType,\n structuredPartsToText,\n type StructuredInputPart,\n type StructuredInputProps,\n type StructuredInputSlotsProps,\n type StructuredInputTagsProps,\n type StructuredInputTagTrigger,\n type StructuredInputValues,\n type StructuredInputWizardProps,\n} from \"@nucleux/structured-input\";\nimport { Check, Sparkles, UserPen, X } from \"lucide-react\";\n\n// Same API as the shadcn twin: the props and data shapes are the twin's own types.\nexport type Md3StructuredInputProps = StructuredInputProps;\nexport type Md3StructuredInputSlotsProps = StructuredInputSlotsProps;\nexport type Md3StructuredInputTagsProps = StructuredInputTagsProps;\nexport type Md3StructuredInputWizardProps = StructuredInputWizardProps;\nexport type {\n StructuredOption,\n StructuredInputSlotType,\n StructuredInputSlot,\n StructuredInputValues,\n StructuredInputTagTrigger,\n StructuredInputPart,\n} from \"@nucleux/structured-input\";\n/** Serialise parts into the plain prompt text — shared with `@nucleux/structured-input`. */\nexport { structuredPartsToText };\n\nconst stateLayer =\n \"before:absolute before:inset-0 before:bg-current before:opacity-0 before:transition-opacity before:content-[''] hover:before:opacity-[0.08] focus-visible:before:opacity-[0.12] active:before:opacity-[0.12]\";\n\n/** MD3 outlined field chrome, shared by text inputs, selects and textareas. */\nconst fieldClass = cn(\n \"w-full rounded-md-xs border border-md-outline bg-transparent px-4 text-base text-md-on-surface outline-none transition-colors\",\n \"placeholder:text-md-on-surface-variant hover:border-md-on-surface\",\n \"focus:border-md-primary focus:ring-1 focus:ring-inset focus:ring-md-primary\",\n \"disabled:cursor-not-allowed disabled:opacity-[0.38]\",\n);\n\n/**\n * Material 3 structured input: an agent-generated clarifying question as a\n * compact MD3 card — single or multi-select options drawn as MD3 radio and\n * checkbox rows with a state layer, a free-text escape, and a skip. Arrow keys\n * move and select in single mode, exactly as in the twin. The other variants\n * are composable siblings: {@link Md3StructuredInputSlots},\n * {@link Md3StructuredInputTags} and {@link Md3StructuredInputWizard}. Shares\n * its API with `StructuredInput` from `@nucleux/structured-input`.\n */\nexport const Md3StructuredInput = React.forwardRef<HTMLDivElement, Md3StructuredInputProps>(\n (\n {\n question,\n options,\n multiple = false,\n value,\n defaultValue = [],\n onValueChange,\n allowOther = false,\n otherPlaceholder = \"Something else…\",\n onSubmit,\n onSkip,\n submitLabel = \"Continue\",\n skipLabel = \"Skip\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<string[]>(defaultValue);\n const [other, setOther] = React.useState(\"\");\n const questionId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const selected = value !== undefined ? value : internal;\n\n const setSelected = (next: string[]) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n const toggle = (val: string) => {\n if (multiple) {\n setSelected(selected.includes(val) ? selected.filter((v) => v !== val) : [...selected, val]);\n } else {\n setSelected([val]);\n }\n };\n\n return (\n <Md3Card\n ref={ref}\n variant=\"outlined\"\n className={cn(\"flex flex-col gap-4 rounded-md-lg p-5 animate-nx-fade-in motion-reduce:animate-none\", className)}\n {...props}\n >\n <p id={questionId} className=\"text-base font-medium tracking-[0.15px] text-md-on-surface\">\n {question}\n </p>\n <div\n ref={groupRef}\n role={multiple ? \"group\" : \"radiogroup\"}\n aria-labelledby={questionId}\n className=\"flex flex-col gap-1\"\n onKeyDown={(e) => {\n // Radio-group keyboard pattern: arrows move and select.\n if (multiple || ![\"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(e.key)) return;\n const radios = Array.from(groupRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]') ?? []);\n const i = radios.indexOf(document.activeElement as HTMLButtonElement);\n if (i < 0) return;\n e.preventDefault();\n const step = e.key === \"ArrowDown\" || e.key === \"ArrowRight\" ? 1 : -1;\n const next = (i + step + radios.length) % radios.length;\n radios[next].focus();\n setSelected([options[next].value]);\n }}\n >\n {options.map((option, index) => {\n const active = selected.includes(option.value);\n const tabbable = multiple || index === Math.max(0, options.findIndex((o) => selected.includes(o.value)));\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multiple ? \"checkbox\" : \"radio\"}\n aria-checked={active}\n tabIndex={tabbable ? 0 : -1}\n onClick={() => toggle(option.value)}\n className={cn(\n \"relative flex min-h-12 items-center gap-4 overflow-hidden rounded-md-md px-3 py-2 text-left text-sm transition-colors duration-200 motion-reduce:transition-none\",\n stateLayer,\n \"outline-none focus-visible:ring-2 focus-visible:ring-md-primary\",\n active\n ? \"bg-md-secondary-container text-md-on-secondary-container\"\n : \"text-md-on-surface\",\n )}\n >\n {multiple ? (\n <span\n className={cn(\n \"relative inline-flex size-[18px] shrink-0 items-center justify-center rounded-[2px] border-2 transition-colors [&_svg]:size-3.5\",\n active ? \"border-md-primary bg-md-primary text-md-on-primary\" : \"border-md-on-surface-variant\",\n )}\n >\n {active && <Check strokeWidth={3} aria-hidden=\"true\" />}\n </span>\n ) : (\n <span\n className={cn(\n \"relative inline-flex size-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors\",\n active ? \"border-md-primary\" : \"border-md-on-surface-variant\",\n )}\n >\n <span\n className={cn(\n \"size-2.5 rounded-full bg-md-primary transition-transform duration-200 motion-reduce:transition-none\",\n active ? \"scale-100\" : \"scale-0\",\n )}\n />\n </span>\n )}\n <span className=\"relative flex-1\">{option.label}</span>\n </button>\n );\n })}\n </div>\n {allowOther && (\n <input\n type=\"text\"\n value={other}\n onChange={(e) => setOther(e.target.value)}\n placeholder={otherPlaceholder}\n aria-label={otherPlaceholder}\n className={cn(fieldClass, \"h-12\")}\n />\n )}\n <div className=\"flex items-center justify-end gap-2\">\n {onSkip && (\n <Md3Button variant=\"text\" onClick={onSkip}>\n {skipLabel}\n </Md3Button>\n )}\n {onSubmit && (\n <Md3Button\n variant=\"filled\"\n onClick={() => onSubmit(selected, allowOther ? other : undefined)}\n disabled={selected.length === 0 && !(allowOther && other.trim())}\n >\n {submitLabel}\n </Md3Button>\n )}\n </div>\n </Md3Card>\n );\n },\n);\nMd3StructuredInput.displayName = \"Md3StructuredInput\";\n\n/* -------------------------------------------------------------------------- */\n/* Named slots */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Material 3 named slots: a short set of plain-language MD3 outlined fields\n * (2–4) that fill a prompt template — text fields or native selects with\n * visible labels and helper text, an optional freeform override, and a submit\n * that never requires every field. Agent-suggested values carry a\n * primary-container “Suggested” mark with their reason and turn into a neutral\n * “Edited by you” once changed; the component never changes a value the person\n * set. Shares its API with `StructuredInputSlots`.\n */\nexport const Md3StructuredInputSlots = React.forwardRef<HTMLFormElement, Md3StructuredInputSlotsProps>(\n (\n {\n slots,\n values: valuesProp,\n defaultValues,\n onValuesChange,\n freeform = false,\n onSubmit,\n submitLabel = \"Generate\",\n label = \"Structured prompt builder\",\n title,\n icon,\n aside,\n showProgress = false,\n onCancel,\n cancelLabel = \"Cancel\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<StructuredInputValues>(defaultValues ?? {});\n const values = valuesProp ?? internal;\n const [edited, setEdited] = React.useState<Record<string, boolean>>({});\n const [extra, setExtra] = React.useState(\"\");\n const baseId = React.useId();\n\n const setValue = (name: string, value: string) => {\n const next = { ...values, [name]: value };\n if (valuesProp === undefined) setInternal(next);\n setEdited((e) => ({ ...e, [name]: true }));\n onValuesChange?.(next);\n };\n\n const filled = (name: string) => !!values[name]?.trim();\n const filledCount = slots.filter((slot) => filled(slot.name)).length;\n const requiredMet = slots.every((slot) => !slot.required || filled(slot.name));\n const hasAny = Object.values(values).some((v) => v && v.trim()) || extra.trim().length > 0;\n const canSubmit = hasAny && requiredMet;\n const freeformLabel = typeof freeform === \"string\" ? freeform : \"Anything else?\";\n const titleId = `${baseId}-title`;\n\n return (\n <form\n ref={ref}\n aria-label={title == null ? label : undefined}\n aria-labelledby={title == null ? undefined : titleId}\n className={cn(\"grid grid-cols-1 gap-4 text-md-on-surface sm:grid-cols-2\", className)}\n onSubmit={(e) => {\n e.preventDefault();\n if (canSubmit) onSubmit?.(values, extra);\n }}\n {...props}\n >\n {(title != null || aside != null) && (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 sm:col-span-2\">\n {icon != null && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-md-primary [&_svg]:size-6\">\n {icon}\n </span>\n )}\n <h3 id={titleId} className=\"flex-1 text-[1.375rem] leading-7 text-md-on-surface\">\n {title}\n </h3>\n {aside != null && <div className=\"text-sm text-md-on-surface-variant\">{aside}</div>}\n </div>\n )}\n {slots.map((slot) => {\n const id = `${baseId}-${slot.name}`;\n const helperId = `${id}-helper`;\n const isEdited = !!edited[slot.name];\n const mark = slot.suggested ? (isEdited ? \"edited\" : \"suggested\") : null;\n const describedBy = slot.helper || mark === \"suggested\" ? helperId : undefined;\n const type = structuredSlotType(slot);\n return (\n <div key={slot.name} className={cn(\"flex flex-col gap-1.5\", slot.wide && \"sm:col-span-2\")}>\n <div className=\"flex min-h-6 items-center gap-2\">\n <label\n id={`${id}-label`}\n htmlFor={id}\n className={cn(\n \"tracking-[0.1px]\",\n title != null ? \"text-sm font-medium text-md-on-surface\" : \"text-xs font-medium tracking-[0.5px] text-md-on-surface-variant\",\n )}\n >\n {slot.label}\n {slot.required && <span aria-hidden=\"true\"> *</span>}\n </label>\n {mark && (\n <span\n className={cn(\n \"inline-flex h-6 items-center gap-1 rounded-md-sm px-2 text-[11px] font-medium tracking-[0.5px] [&_svg]:size-3.5\",\n mark === \"suggested\"\n ? \"bg-md-primary-container text-md-on-primary-container\"\n : \"bg-md-surface-container-high text-md-on-surface-variant\",\n )}\n >\n {mark === \"suggested\" ? <Sparkles aria-hidden=\"true\" /> : <UserPen aria-hidden=\"true\" />}\n {mark === \"suggested\" ? \"Suggested\" : \"Edited by you\"}\n </span>\n )}\n </div>\n {type === \"select\" && slot.options ? (\n <select\n id={id}\n value={values[slot.name] ?? \"\"}\n aria-describedby={describedBy}\n aria-required={slot.required || undefined}\n onChange={(e) => setValue(slot.name, e.target.value)}\n className={cn(fieldClass, \"h-14 cursor-pointer bg-md-surface\", !values[slot.name] && \"text-md-on-surface-variant\")}\n >\n <option value=\"\" disabled>\n {slot.placeholder ?? \"Choose…\"}\n </option>\n {slot.options.map((o) => (\n <option key={o.value} value={o.value}>\n {typeof o.label === \"string\" || typeof o.label === \"number\" ? o.label : o.value}\n </option>\n ))}\n </select>\n ) : type === \"segmented\" && slot.options ? (\n <Md3SegmentedButton\n id={id}\n aria-labelledby={`${id}-label`}\n aria-describedby={describedBy}\n value={values[slot.name] ?? \"\"}\n onValueChange={(v) => setValue(slot.name, typeof v === \"string\" ? v : (v[0] ?? \"\"))}\n className=\"h-14 w-fit max-w-full\"\n >\n {slot.options.map((o) => (\n <Md3SegmentedButtonItem key={o.value} value={o.value} className=\"min-w-24 text-base\">\n {o.label}\n </Md3SegmentedButtonItem>\n ))}\n </Md3SegmentedButton>\n ) : type === \"tags\" ? (\n <div className={cn(fieldClass, \"flex min-h-14 flex-wrap items-center gap-2 bg-md-surface px-2 py-2 focus-within:border-md-primary\")}>\n {splitStructuredTags(values[slot.name]).map((t, _i, all) => (\n <Md3Chip\n key={t}\n variant=\"input\"\n onRemove={() => setValue(slot.name, all.filter((x) => x !== t).join(\", \"))}\n >\n {t}\n </Md3Chip>\n ))}\n <input\n id={id}\n placeholder={slot.placeholder ?? \"Add…\"}\n aria-describedby={describedBy}\n onKeyDown={(e) => {\n const el = e.currentTarget;\n if ((e.key === \"Enter\" || e.key === \",\") && el.value.trim()) {\n e.preventDefault();\n const tags = splitStructuredTags(values[slot.name]);\n if (!tags.includes(el.value.trim())) setValue(slot.name, [...tags, el.value.trim()].join(\", \"));\n el.value = \"\";\n }\n }}\n className=\"min-w-16 flex-1 bg-transparent px-2 text-base outline-none placeholder:text-md-on-surface-variant\"\n />\n </div>\n ) : (\n <input\n id={id}\n type={type === \"date\" ? \"date\" : \"text\"}\n value={values[slot.name] ?? \"\"}\n placeholder={slot.placeholder}\n aria-describedby={describedBy}\n aria-required={slot.required || undefined}\n onChange={(e) => setValue(slot.name, e.target.value)}\n className={cn(fieldClass, \"h-14 bg-md-surface\")}\n />\n )}\n {describedBy && (\n <p id={helperId} className=\"px-4 text-xs text-md-on-surface-variant\">\n {mark === \"suggested\" ? `Suggested ${slot.suggested}. ` : \"\"}\n {slot.helper}\n </p>\n )}\n </div>\n );\n })}\n {freeform && (\n <div className=\"flex flex-col gap-1.5 sm:col-span-2\">\n <label\n htmlFor={`${baseId}-freeform`}\n className=\"text-xs font-medium tracking-[0.5px] text-md-on-surface-variant\"\n >\n {freeformLabel}\n </label>\n <textarea\n id={`${baseId}-freeform`}\n rows={2}\n value={extra}\n placeholder=\"Say it in your own words — this overrides the fields above\"\n onChange={(e) => setExtra(e.target.value)}\n className={cn(fieldClass, \"resize-none py-3\")}\n />\n </div>\n )}\n {(onSubmit || onCancel || showProgress) && (\n <div className=\"flex items-center gap-2 sm:col-span-2\">\n {showProgress && (\n <span className=\"text-sm text-md-on-surface-variant\" aria-live=\"polite\">\n {filledCount} of {slots.length} filled\n </span>\n )}\n <span className=\"flex-1\" />\n {onCancel && (\n <Md3Button type=\"button\" variant=\"text\" onClick={onCancel}>\n {cancelLabel}\n </Md3Button>\n )}\n {onSubmit && (\n <Md3Button type=\"submit\" variant=\"filled\" disabled={!canSubmit}>\n {submitLabel}\n </Md3Button>\n )}\n </div>\n )}\n </form>\n );\n },\n);\nMd3StructuredInputSlots.displayName = \"Md3StructuredInputSlots\";\n\n/* -------------------------------------------------------------------------- */\n/* Tagged input */\n/* -------------------------------------------------------------------------- */\n\n// Same defaults as the twin (internal there).\nconst DEFAULT_TRIGGERS: StructuredInputTagTrigger[] = [\n { trigger: \"@\", label: \"Person\" },\n { trigger: \"p:\", label: \"Project\" },\n { trigger: \"/\", label: \"File\" },\n];\n\n/** MD3 tonal roles for tag chips, cycled per trigger. */\nconst TAG_TONES = [\n \"bg-md-primary-container text-md-on-primary-container\",\n \"bg-md-secondary-container text-md-on-secondary-container\",\n \"bg-md-tertiary-container text-md-on-tertiary-container\",\n \"bg-md-surface-container-high text-md-on-surface\",\n];\n\n/**\n * Material 3 tagged input: a prompt field (MD3 outlined) where typed prefixes\n * (`@` person, `p:` project, `/` file — configurable) become removable input\n * chips in tonal containers, with type-ahead suggestions as MD3 suggestion\n * chips. Backspace on an empty field removes the last tag; Enter sends. Tags\n * are optional — plain text always works. Shares its API (and\n * `structuredPartsToText`) with `StructuredInputTags`.\n */\nexport const Md3StructuredInputTags = React.forwardRef<HTMLDivElement, Md3StructuredInputTagsProps>(\n (\n {\n triggers = DEFAULT_TRIGGERS,\n value: valueProp,\n defaultValue,\n onValueChange,\n onSubmit,\n placeholder = \"Type @ for people, p: for projects, / for files\",\n submitLabel = \"Send\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<StructuredInputPart[]>(defaultValue ?? []);\n const parts = valueProp ?? internal;\n const [draft, setDraft] = React.useState(\"\");\n const inputRef = React.useRef<HTMLInputElement>(null);\n const hintId = React.useId();\n\n const commit = (next: StructuredInputPart[]) => {\n if (valueProp === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n // Longest trigger first so \"p:\" wins over \"p\".\n const ordered = [...triggers].sort((a, b) => b.trigger.length - a.trigger.length);\n const matchTag = (word: string) => {\n const t = ordered.find((tr) => word.startsWith(tr.trigger) && word.length > tr.trigger.length);\n return t ? { trigger: t.trigger, value: word.slice(t.trigger.length) } : null;\n };\n\n const lastWord = draft.split(\" \").pop() ?? \"\";\n const activeTrigger = ordered.find((tr) => lastWord.startsWith(tr.trigger));\n const query = activeTrigger ? lastWord.slice(activeTrigger.trigger.length).toLowerCase() : \"\";\n const suggestions =\n activeTrigger?.suggestions?.filter((s) => s.toLowerCase().startsWith(query)).slice(0, 5) ?? [];\n\n /** Split the draft into text + a trailing tag (if any) and commit them. */\n const flush = (source = draft, forceTag?: { trigger: string; value: string }): StructuredInputPart[] => {\n const words = source.split(\" \");\n const last = words.pop() ?? \"\";\n const tag = forceTag ?? matchTag(last);\n const textBefore = (tag ? words.join(\" \") : source).trim();\n const next = [...parts];\n if (textBefore) next.push({ type: \"text\", text: textBefore });\n if (tag) next.push({ type: \"tag\", ...tag });\n if (next.length !== parts.length) commit(next);\n setDraft(\"\");\n return next;\n };\n\n const toneFor = (trigger: string) => {\n const i = triggers.findIndex((t) => t.trigger === trigger);\n return TAG_TONES[(i < 0 ? 0 : i) % TAG_TONES.length];\n };\n const labelFor = (trigger: string) => triggers.find((t) => t.trigger === trigger)?.label ?? \"Tag\";\n\n const submit = () => {\n const next = flush();\n const text = structuredPartsToText(next);\n if (text) onSubmit?.(next, text);\n };\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-2 text-md-on-surface\", className)} {...props}>\n <div\n className={cn(\n \"flex min-h-14 flex-wrap items-center gap-1.5 rounded-md-xs border border-md-outline bg-transparent px-3 py-2 text-base text-md-on-surface transition-colors\",\n \"hover:border-md-on-surface focus-within:border-md-primary focus-within:ring-1 focus-within:ring-inset focus-within:ring-md-primary\",\n )}\n onClick={() => inputRef.current?.focus()}\n >\n {parts.map((part, i) =>\n part.type === \"text\" ? (\n <span key={i}>{part.text}</span>\n ) : (\n <span\n key={i}\n className={cn(\n \"inline-flex h-7 items-center gap-0.5 rounded-md-sm pl-2 pr-0.5 text-sm font-medium animate-nx-fade-in motion-reduce:animate-none\",\n toneFor(part.trigger),\n )}\n >\n {part.trigger}\n {part.value}\n <button\n type=\"button\"\n aria-label={`Remove ${labelFor(part.trigger).toLowerCase()} ${part.trigger}${part.value}`}\n onClick={(e) => {\n e.stopPropagation();\n commit(parts.filter((_, j) => j !== i));\n inputRef.current?.focus();\n }}\n className={cn(\n \"relative inline-flex size-6 items-center justify-center overflow-hidden rounded-full [&_svg]:size-3.5\",\n stateLayer,\n \"outline-none focus-visible:ring-2 focus-visible:ring-md-primary\",\n )}\n >\n <X className=\"relative\" aria-hidden=\"true\" />\n </button>\n </span>\n ),\n )}\n <input\n ref={inputRef}\n type=\"text\"\n value={draft}\n aria-label={placeholder}\n aria-describedby={hintId}\n placeholder={parts.length ? undefined : placeholder}\n onChange={(e) => {\n const v = e.target.value;\n // A space after a tag word (incl. mobile keyboards that skip keydown) makes it a chip.\n if (v.endsWith(\" \") && matchTag(v.trimEnd().split(\" \").pop() ?? \"\")) flush(v.trimEnd());\n else setDraft(v);\n }}\n onKeyDown={(e) => {\n if (e.key === \" \" && matchTag(lastWord)) {\n e.preventDefault();\n flush();\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n submit();\n } else if (e.key === \"Backspace\" && draft === \"\" && parts.length) {\n e.preventDefault();\n const last = parts[parts.length - 1];\n commit(parts.slice(0, -1));\n if (last.type === \"text\") setDraft(last.text);\n }\n }}\n className=\"h-8 min-w-[8rem] flex-1 bg-transparent text-base text-md-on-surface outline-none placeholder:text-md-on-surface-variant\"\n />\n </div>\n <p id={hintId} className=\"sr-only\">\n {triggers.map((t) => `${t.trigger} for ${t.label.toLowerCase()}`).join(\", \")}. Space turns a tag into a\n chip; Backspace removes the last one; Enter sends.\n </p>\n {activeTrigger && suggestions.length > 0 && (\n <div role=\"group\" aria-label={`${activeTrigger.label} suggestions`} className=\"flex flex-wrap gap-2\">\n {suggestions.map((s) => (\n <Md3Chip\n key={s}\n variant=\"suggestion\"\n onClick={() => {\n flush(draft, { trigger: activeTrigger.trigger, value: s });\n inputRef.current?.focus();\n }}\n >\n {activeTrigger.trigger}\n {s}\n </Md3Chip>\n ))}\n </div>\n )}\n {onSubmit && (\n <div className=\"flex justify-end\">\n <Md3Button variant=\"filled\" onClick={submit} disabled={parts.length === 0 && draft.trim() === \"\"}>\n {submitLabel}\n </Md3Button>\n </div>\n )}\n </div>\n );\n },\n);\nMd3StructuredInputTags.displayName = \"Md3StructuredInputTags\";\n\n/* -------------------------------------------------------------------------- */\n/* Wizard step */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Material 3 wizard step: a multi-step MD3 card for high-stakes prompts\n * (legal, HR, medical) — a segmented progress track in the primary colour,\n * “Step 2 of 3 · Audience”, the step's question and fields (children), and\n * Back / Next / Generate as MD3 text and filled buttons. Focus moves to the\n * step heading when the step changes; nothing forces every step to be filled\n * before generating. Shares its API with `StructuredInputWizard`.\n */\nexport const Md3StructuredInputWizard = React.forwardRef<HTMLDivElement, Md3StructuredInputWizardProps>(\n (\n {\n steps,\n step: stepProp,\n defaultStep = 0,\n onStepChange,\n description,\n onSubmit,\n submitLabel = \"Generate\",\n allowEarlySubmit = true,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState(defaultStep);\n const step = Math.min(Math.max(stepProp ?? internal, 0), Math.max(steps.length - 1, 0));\n const headingRef = React.useRef<HTMLParagraphElement>(null);\n const headingId = React.useId();\n const moved = React.useRef(false);\n\n React.useEffect(() => {\n if (moved.current) headingRef.current?.focus();\n }, [step]);\n\n const go = (next: number) => {\n moved.current = true;\n if (stepProp === undefined) setInternal(next);\n onStepChange?.(next);\n };\n\n const last = step === steps.length - 1;\n\n return (\n <Md3Card\n ref={ref}\n variant=\"outlined\"\n role=\"group\"\n aria-labelledby={headingId}\n className={cn(\"flex flex-col gap-3 rounded-md-lg p-4\", className)}\n {...props}\n >\n <div className=\"flex gap-1\" aria-hidden=\"true\">\n {steps.map((_, i) => (\n <span\n key={i}\n className={cn(\n \"h-1 flex-1 rounded-full transition-colors duration-300 motion-reduce:transition-none\",\n i <= step ? \"bg-md-primary\" : \"bg-md-secondary-container\",\n )}\n />\n ))}\n </div>\n <div className=\"flex flex-col gap-1\">\n <p\n ref={headingRef}\n id={headingId}\n tabIndex={-1}\n className=\"rounded-md-xs text-sm font-medium tracking-[0.1px] text-md-on-surface outline-none focus-visible:ring-2 focus-visible:ring-md-primary\"\n >\n Step {step + 1} of {steps.length} · {steps[step]}\n </p>\n {description && <p className=\"text-sm text-md-on-surface-variant\">{description}</p>}\n </div>\n {children}\n <div className=\"flex items-center gap-2\">\n {step > 0 && (\n <Md3Button variant=\"text\" onClick={() => go(step - 1)}>\n Back\n </Md3Button>\n )}\n <span className=\"flex-1\" />\n {!last && allowEarlySubmit && onSubmit && (\n <Md3Button variant=\"text\" onClick={onSubmit}>\n {submitLabel} now\n </Md3Button>\n )}\n {last ? (\n onSubmit && (\n <Md3Button variant=\"filled\" onClick={onSubmit}>\n {submitLabel}\n </Md3Button>\n )\n ) : (\n <Md3Button variant=\"filled\" onClick={() => go(step + 1)}>\n Next\n </Md3Button>\n )}\n </div>\n </Md3Card>\n );\n },\n);\nMd3StructuredInputWizard.displayName = \"Md3StructuredInputWizard\";\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { StructuredInputProps, StructuredInputSlotsProps, StructuredInputTagsProps, StructuredInputWizardProps } from '@nucleux/structured-input';
|
|
3
|
-
export { StructuredInputPart, StructuredInputSlot, StructuredInputTagTrigger, StructuredInputValues, StructuredOption, structuredPartsToText } from '@nucleux/structured-input';
|
|
3
|
+
export { StructuredInputPart, StructuredInputSlot, StructuredInputSlotType, StructuredInputTagTrigger, StructuredInputValues, StructuredOption, structuredPartsToText } from '@nucleux/structured-input';
|
|
4
4
|
|
|
5
5
|
type Md3StructuredInputProps = StructuredInputProps;
|
|
6
6
|
type Md3StructuredInputSlotsProps = StructuredInputSlotsProps;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { StructuredInputProps, StructuredInputSlotsProps, StructuredInputTagsProps, StructuredInputWizardProps } from '@nucleux/structured-input';
|
|
3
|
-
export { StructuredInputPart, StructuredInputSlot, StructuredInputTagTrigger, StructuredInputValues, StructuredOption, structuredPartsToText } from '@nucleux/structured-input';
|
|
3
|
+
export { StructuredInputPart, StructuredInputSlot, StructuredInputSlotType, StructuredInputTagTrigger, StructuredInputValues, StructuredOption, structuredPartsToText } from '@nucleux/structured-input';
|
|
4
4
|
|
|
5
5
|
type Md3StructuredInputProps = StructuredInputProps;
|
|
6
6
|
type Md3StructuredInputSlotsProps = StructuredInputSlotsProps;
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,8 @@ import { cn } from '@nucleux/utils';
|
|
|
4
4
|
import { Md3Button } from '@nucleux/md3-button';
|
|
5
5
|
import { Md3Card } from '@nucleux/md3-card';
|
|
6
6
|
import { Md3Chip } from '@nucleux/md3-chip';
|
|
7
|
-
import {
|
|
7
|
+
import { Md3SegmentedButton, Md3SegmentedButtonItem } from '@nucleux/md3-segmented-button';
|
|
8
|
+
import { structuredSlotType, splitStructuredTags, structuredPartsToText } from '@nucleux/structured-input';
|
|
8
9
|
export { structuredPartsToText } from '@nucleux/structured-input';
|
|
9
10
|
import { Check, Sparkles, UserPen, X } from 'lucide-react';
|
|
10
11
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -169,6 +170,12 @@ var Md3StructuredInputSlots = React.forwardRef(
|
|
|
169
170
|
onSubmit,
|
|
170
171
|
submitLabel = "Generate",
|
|
171
172
|
label = "Structured prompt builder",
|
|
173
|
+
title,
|
|
174
|
+
icon,
|
|
175
|
+
aside,
|
|
176
|
+
showProgress = false,
|
|
177
|
+
onCancel,
|
|
178
|
+
cancelLabel = "Cancel",
|
|
172
179
|
className,
|
|
173
180
|
...props
|
|
174
181
|
}, ref) => {
|
|
@@ -183,29 +190,55 @@ var Md3StructuredInputSlots = React.forwardRef(
|
|
|
183
190
|
setEdited((e) => ({ ...e, [name]: true }));
|
|
184
191
|
onValuesChange?.(next);
|
|
185
192
|
};
|
|
193
|
+
const filled = (name) => !!values[name]?.trim();
|
|
194
|
+
const filledCount = slots.filter((slot) => filled(slot.name)).length;
|
|
195
|
+
const requiredMet = slots.every((slot) => !slot.required || filled(slot.name));
|
|
186
196
|
const hasAny = Object.values(values).some((v) => v && v.trim()) || extra.trim().length > 0;
|
|
197
|
+
const canSubmit = hasAny && requiredMet;
|
|
187
198
|
const freeformLabel = typeof freeform === "string" ? freeform : "Anything else?";
|
|
199
|
+
const titleId = `${baseId}-title`;
|
|
188
200
|
return /* @__PURE__ */ jsxs(
|
|
189
201
|
"form",
|
|
190
202
|
{
|
|
191
203
|
ref,
|
|
192
|
-
"aria-label": label,
|
|
204
|
+
"aria-label": title == null ? label : void 0,
|
|
205
|
+
"aria-labelledby": title == null ? void 0 : titleId,
|
|
193
206
|
className: cn("grid grid-cols-1 gap-4 text-md-on-surface sm:grid-cols-2", className),
|
|
194
207
|
onSubmit: (e) => {
|
|
195
208
|
e.preventDefault();
|
|
196
|
-
if (
|
|
209
|
+
if (canSubmit) onSubmit?.(values, extra);
|
|
197
210
|
},
|
|
198
211
|
...props,
|
|
199
212
|
children: [
|
|
213
|
+
(title != null || aside != null) && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 sm:col-span-2", children: [
|
|
214
|
+
icon != null && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "inline-flex shrink-0 text-md-primary [&_svg]:size-6", children: icon }),
|
|
215
|
+
/* @__PURE__ */ jsx("h3", { id: titleId, className: "flex-1 text-[1.375rem] leading-7 text-md-on-surface", children: title }),
|
|
216
|
+
aside != null && /* @__PURE__ */ jsx("div", { className: "text-sm text-md-on-surface-variant", children: aside })
|
|
217
|
+
] }),
|
|
200
218
|
slots.map((slot) => {
|
|
201
219
|
const id = `${baseId}-${slot.name}`;
|
|
202
220
|
const helperId = `${id}-helper`;
|
|
203
221
|
const isEdited = !!edited[slot.name];
|
|
204
222
|
const mark = slot.suggested ? isEdited ? "edited" : "suggested" : null;
|
|
205
223
|
const describedBy = slot.helper || mark === "suggested" ? helperId : void 0;
|
|
224
|
+
const type = structuredSlotType(slot);
|
|
206
225
|
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-1.5", slot.wide && "sm:col-span-2"), children: [
|
|
207
226
|
/* @__PURE__ */ jsxs("div", { className: "flex min-h-6 items-center gap-2", children: [
|
|
208
|
-
/* @__PURE__ */
|
|
227
|
+
/* @__PURE__ */ jsxs(
|
|
228
|
+
"label",
|
|
229
|
+
{
|
|
230
|
+
id: `${id}-label`,
|
|
231
|
+
htmlFor: id,
|
|
232
|
+
className: cn(
|
|
233
|
+
"tracking-[0.1px]",
|
|
234
|
+
title != null ? "text-sm font-medium text-md-on-surface" : "text-xs font-medium tracking-[0.5px] text-md-on-surface-variant"
|
|
235
|
+
),
|
|
236
|
+
children: [
|
|
237
|
+
slot.label,
|
|
238
|
+
slot.required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: " *" })
|
|
239
|
+
]
|
|
240
|
+
}
|
|
241
|
+
),
|
|
209
242
|
mark && /* @__PURE__ */ jsxs(
|
|
210
243
|
"span",
|
|
211
244
|
{
|
|
@@ -220,29 +253,70 @@ var Md3StructuredInputSlots = React.forwardRef(
|
|
|
220
253
|
}
|
|
221
254
|
)
|
|
222
255
|
] }),
|
|
223
|
-
slot.options ? /* @__PURE__ */ jsxs(
|
|
256
|
+
type === "select" && slot.options ? /* @__PURE__ */ jsxs(
|
|
224
257
|
"select",
|
|
225
258
|
{
|
|
226
259
|
id,
|
|
227
260
|
value: values[slot.name] ?? "",
|
|
228
261
|
"aria-describedby": describedBy,
|
|
262
|
+
"aria-required": slot.required || void 0,
|
|
229
263
|
onChange: (e) => setValue(slot.name, e.target.value),
|
|
230
|
-
className: cn(fieldClass, "h-14 cursor-pointer", !values[slot.name] && "text-md-on-surface-variant"),
|
|
264
|
+
className: cn(fieldClass, "h-14 cursor-pointer bg-md-surface", !values[slot.name] && "text-md-on-surface-variant"),
|
|
231
265
|
children: [
|
|
232
266
|
/* @__PURE__ */ jsx("option", { value: "", disabled: true, children: slot.placeholder ?? "Choose\u2026" }),
|
|
233
267
|
slot.options.map((o) => /* @__PURE__ */ jsx("option", { value: o.value, children: typeof o.label === "string" || typeof o.label === "number" ? o.label : o.value }, o.value))
|
|
234
268
|
]
|
|
235
269
|
}
|
|
236
|
-
) : /* @__PURE__ */ jsx(
|
|
270
|
+
) : type === "segmented" && slot.options ? /* @__PURE__ */ jsx(
|
|
271
|
+
Md3SegmentedButton,
|
|
272
|
+
{
|
|
273
|
+
id,
|
|
274
|
+
"aria-labelledby": `${id}-label`,
|
|
275
|
+
"aria-describedby": describedBy,
|
|
276
|
+
value: values[slot.name] ?? "",
|
|
277
|
+
onValueChange: (v) => setValue(slot.name, typeof v === "string" ? v : v[0] ?? ""),
|
|
278
|
+
className: "h-14 w-fit max-w-full",
|
|
279
|
+
children: slot.options.map((o) => /* @__PURE__ */ jsx(Md3SegmentedButtonItem, { value: o.value, className: "min-w-24 text-base", children: o.label }, o.value))
|
|
280
|
+
}
|
|
281
|
+
) : type === "tags" ? /* @__PURE__ */ jsxs("div", { className: cn(fieldClass, "flex min-h-14 flex-wrap items-center gap-2 bg-md-surface px-2 py-2 focus-within:border-md-primary"), children: [
|
|
282
|
+
splitStructuredTags(values[slot.name]).map((t, _i, all) => /* @__PURE__ */ jsx(
|
|
283
|
+
Md3Chip,
|
|
284
|
+
{
|
|
285
|
+
variant: "input",
|
|
286
|
+
onRemove: () => setValue(slot.name, all.filter((x) => x !== t).join(", ")),
|
|
287
|
+
children: t
|
|
288
|
+
},
|
|
289
|
+
t
|
|
290
|
+
)),
|
|
291
|
+
/* @__PURE__ */ jsx(
|
|
292
|
+
"input",
|
|
293
|
+
{
|
|
294
|
+
id,
|
|
295
|
+
placeholder: slot.placeholder ?? "Add\u2026",
|
|
296
|
+
"aria-describedby": describedBy,
|
|
297
|
+
onKeyDown: (e) => {
|
|
298
|
+
const el = e.currentTarget;
|
|
299
|
+
if ((e.key === "Enter" || e.key === ",") && el.value.trim()) {
|
|
300
|
+
e.preventDefault();
|
|
301
|
+
const tags = splitStructuredTags(values[slot.name]);
|
|
302
|
+
if (!tags.includes(el.value.trim())) setValue(slot.name, [...tags, el.value.trim()].join(", "));
|
|
303
|
+
el.value = "";
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
className: "min-w-16 flex-1 bg-transparent px-2 text-base outline-none placeholder:text-md-on-surface-variant"
|
|
307
|
+
}
|
|
308
|
+
)
|
|
309
|
+
] }) : /* @__PURE__ */ jsx(
|
|
237
310
|
"input",
|
|
238
311
|
{
|
|
239
312
|
id,
|
|
240
|
-
type: "text",
|
|
313
|
+
type: type === "date" ? "date" : "text",
|
|
241
314
|
value: values[slot.name] ?? "",
|
|
242
315
|
placeholder: slot.placeholder,
|
|
243
316
|
"aria-describedby": describedBy,
|
|
317
|
+
"aria-required": slot.required || void 0,
|
|
244
318
|
onChange: (e) => setValue(slot.name, e.target.value),
|
|
245
|
-
className: cn(fieldClass, "h-14")
|
|
319
|
+
className: cn(fieldClass, "h-14 bg-md-surface")
|
|
246
320
|
}
|
|
247
321
|
),
|
|
248
322
|
describedBy && /* @__PURE__ */ jsxs("p", { id: helperId, className: "px-4 text-xs text-md-on-surface-variant", children: [
|
|
@@ -272,7 +346,17 @@ var Md3StructuredInputSlots = React.forwardRef(
|
|
|
272
346
|
}
|
|
273
347
|
)
|
|
274
348
|
] }),
|
|
275
|
-
onSubmit && /* @__PURE__ */
|
|
349
|
+
(onSubmit || onCancel || showProgress) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 sm:col-span-2", children: [
|
|
350
|
+
showProgress && /* @__PURE__ */ jsxs("span", { className: "text-sm text-md-on-surface-variant", "aria-live": "polite", children: [
|
|
351
|
+
filledCount,
|
|
352
|
+
" of ",
|
|
353
|
+
slots.length,
|
|
354
|
+
" filled"
|
|
355
|
+
] }),
|
|
356
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1" }),
|
|
357
|
+
onCancel && /* @__PURE__ */ jsx(Md3Button, { type: "button", variant: "text", onClick: onCancel, children: cancelLabel }),
|
|
358
|
+
onSubmit && /* @__PURE__ */ jsx(Md3Button, { type: "submit", variant: "filled", disabled: !canSubmit, children: submitLabel })
|
|
359
|
+
] })
|
|
276
360
|
]
|
|
277
361
|
}
|
|
278
362
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@nucleux/utils\";\nimport { Md3Button } from \"@nucleux/md3-button\";\nimport { Md3Card } from \"@nucleux/md3-card\";\nimport { Md3Chip } from \"@nucleux/md3-chip\";\nimport {\n structuredPartsToText,\n type StructuredInputPart,\n type StructuredInputProps,\n type StructuredInputSlotsProps,\n type StructuredInputTagsProps,\n type StructuredInputTagTrigger,\n type StructuredInputValues,\n type StructuredInputWizardProps,\n} from \"@nucleux/structured-input\";\nimport { Check, Sparkles, UserPen, X } from \"lucide-react\";\n\n// Same API as the shadcn twin: the props and data shapes are the twin's own types.\nexport type Md3StructuredInputProps = StructuredInputProps;\nexport type Md3StructuredInputSlotsProps = StructuredInputSlotsProps;\nexport type Md3StructuredInputTagsProps = StructuredInputTagsProps;\nexport type Md3StructuredInputWizardProps = StructuredInputWizardProps;\nexport type {\n StructuredOption,\n StructuredInputSlot,\n StructuredInputValues,\n StructuredInputTagTrigger,\n StructuredInputPart,\n} from \"@nucleux/structured-input\";\n/** Serialise parts into the plain prompt text — shared with `@nucleux/structured-input`. */\nexport { structuredPartsToText };\n\nconst stateLayer =\n \"before:absolute before:inset-0 before:bg-current before:opacity-0 before:transition-opacity before:content-[''] hover:before:opacity-[0.08] focus-visible:before:opacity-[0.12] active:before:opacity-[0.12]\";\n\n/** MD3 outlined field chrome, shared by text inputs, selects and textareas. */\nconst fieldClass = cn(\n \"w-full rounded-md-xs border border-md-outline bg-transparent px-4 text-base text-md-on-surface outline-none transition-colors\",\n \"placeholder:text-md-on-surface-variant hover:border-md-on-surface\",\n \"focus:border-md-primary focus:ring-1 focus:ring-inset focus:ring-md-primary\",\n \"disabled:cursor-not-allowed disabled:opacity-[0.38]\",\n);\n\n/**\n * Material 3 structured input: an agent-generated clarifying question as a\n * compact MD3 card — single or multi-select options drawn as MD3 radio and\n * checkbox rows with a state layer, a free-text escape, and a skip. Arrow keys\n * move and select in single mode, exactly as in the twin. The other variants\n * are composable siblings: {@link Md3StructuredInputSlots},\n * {@link Md3StructuredInputTags} and {@link Md3StructuredInputWizard}. Shares\n * its API with `StructuredInput` from `@nucleux/structured-input`.\n */\nexport const Md3StructuredInput = React.forwardRef<HTMLDivElement, Md3StructuredInputProps>(\n (\n {\n question,\n options,\n multiple = false,\n value,\n defaultValue = [],\n onValueChange,\n allowOther = false,\n otherPlaceholder = \"Something else…\",\n onSubmit,\n onSkip,\n submitLabel = \"Continue\",\n skipLabel = \"Skip\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<string[]>(defaultValue);\n const [other, setOther] = React.useState(\"\");\n const questionId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const selected = value !== undefined ? value : internal;\n\n const setSelected = (next: string[]) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n const toggle = (val: string) => {\n if (multiple) {\n setSelected(selected.includes(val) ? selected.filter((v) => v !== val) : [...selected, val]);\n } else {\n setSelected([val]);\n }\n };\n\n return (\n <Md3Card\n ref={ref}\n variant=\"outlined\"\n className={cn(\"flex flex-col gap-4 rounded-md-lg p-5 animate-nx-fade-in motion-reduce:animate-none\", className)}\n {...props}\n >\n <p id={questionId} className=\"text-base font-medium tracking-[0.15px] text-md-on-surface\">\n {question}\n </p>\n <div\n ref={groupRef}\n role={multiple ? \"group\" : \"radiogroup\"}\n aria-labelledby={questionId}\n className=\"flex flex-col gap-1\"\n onKeyDown={(e) => {\n // Radio-group keyboard pattern: arrows move and select.\n if (multiple || ![\"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(e.key)) return;\n const radios = Array.from(groupRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]') ?? []);\n const i = radios.indexOf(document.activeElement as HTMLButtonElement);\n if (i < 0) return;\n e.preventDefault();\n const step = e.key === \"ArrowDown\" || e.key === \"ArrowRight\" ? 1 : -1;\n const next = (i + step + radios.length) % radios.length;\n radios[next].focus();\n setSelected([options[next].value]);\n }}\n >\n {options.map((option, index) => {\n const active = selected.includes(option.value);\n const tabbable = multiple || index === Math.max(0, options.findIndex((o) => selected.includes(o.value)));\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multiple ? \"checkbox\" : \"radio\"}\n aria-checked={active}\n tabIndex={tabbable ? 0 : -1}\n onClick={() => toggle(option.value)}\n className={cn(\n \"relative flex min-h-12 items-center gap-4 overflow-hidden rounded-md-md px-3 py-2 text-left text-sm transition-colors duration-200 motion-reduce:transition-none\",\n stateLayer,\n \"outline-none focus-visible:ring-2 focus-visible:ring-md-primary\",\n active\n ? \"bg-md-secondary-container text-md-on-secondary-container\"\n : \"text-md-on-surface\",\n )}\n >\n {multiple ? (\n <span\n className={cn(\n \"relative inline-flex size-[18px] shrink-0 items-center justify-center rounded-[2px] border-2 transition-colors [&_svg]:size-3.5\",\n active ? \"border-md-primary bg-md-primary text-md-on-primary\" : \"border-md-on-surface-variant\",\n )}\n >\n {active && <Check strokeWidth={3} aria-hidden=\"true\" />}\n </span>\n ) : (\n <span\n className={cn(\n \"relative inline-flex size-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors\",\n active ? \"border-md-primary\" : \"border-md-on-surface-variant\",\n )}\n >\n <span\n className={cn(\n \"size-2.5 rounded-full bg-md-primary transition-transform duration-200 motion-reduce:transition-none\",\n active ? \"scale-100\" : \"scale-0\",\n )}\n />\n </span>\n )}\n <span className=\"relative flex-1\">{option.label}</span>\n </button>\n );\n })}\n </div>\n {allowOther && (\n <input\n type=\"text\"\n value={other}\n onChange={(e) => setOther(e.target.value)}\n placeholder={otherPlaceholder}\n aria-label={otherPlaceholder}\n className={cn(fieldClass, \"h-12\")}\n />\n )}\n <div className=\"flex items-center justify-end gap-2\">\n {onSkip && (\n <Md3Button variant=\"text\" onClick={onSkip}>\n {skipLabel}\n </Md3Button>\n )}\n {onSubmit && (\n <Md3Button\n variant=\"filled\"\n onClick={() => onSubmit(selected, allowOther ? other : undefined)}\n disabled={selected.length === 0 && !(allowOther && other.trim())}\n >\n {submitLabel}\n </Md3Button>\n )}\n </div>\n </Md3Card>\n );\n },\n);\nMd3StructuredInput.displayName = \"Md3StructuredInput\";\n\n/* -------------------------------------------------------------------------- */\n/* Named slots */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Material 3 named slots: a short set of plain-language MD3 outlined fields\n * (2–4) that fill a prompt template — text fields or native selects with\n * visible labels and helper text, an optional freeform override, and a submit\n * that never requires every field. Agent-suggested values carry a\n * primary-container “Suggested” mark with their reason and turn into a neutral\n * “Edited by you” once changed; the component never changes a value the person\n * set. Shares its API with `StructuredInputSlots`.\n */\nexport const Md3StructuredInputSlots = React.forwardRef<HTMLFormElement, Md3StructuredInputSlotsProps>(\n (\n {\n slots,\n values: valuesProp,\n defaultValues,\n onValuesChange,\n freeform = false,\n onSubmit,\n submitLabel = \"Generate\",\n label = \"Structured prompt builder\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<StructuredInputValues>(defaultValues ?? {});\n const values = valuesProp ?? internal;\n const [edited, setEdited] = React.useState<Record<string, boolean>>({});\n const [extra, setExtra] = React.useState(\"\");\n const baseId = React.useId();\n\n const setValue = (name: string, value: string) => {\n const next = { ...values, [name]: value };\n if (valuesProp === undefined) setInternal(next);\n setEdited((e) => ({ ...e, [name]: true }));\n onValuesChange?.(next);\n };\n\n const hasAny = Object.values(values).some((v) => v && v.trim()) || extra.trim().length > 0;\n const freeformLabel = typeof freeform === \"string\" ? freeform : \"Anything else?\";\n\n return (\n <form\n ref={ref}\n aria-label={label}\n className={cn(\"grid grid-cols-1 gap-4 text-md-on-surface sm:grid-cols-2\", className)}\n onSubmit={(e) => {\n e.preventDefault();\n if (hasAny) onSubmit?.(values, extra);\n }}\n {...props}\n >\n {slots.map((slot) => {\n const id = `${baseId}-${slot.name}`;\n const helperId = `${id}-helper`;\n const isEdited = !!edited[slot.name];\n const mark = slot.suggested ? (isEdited ? \"edited\" : \"suggested\") : null;\n const describedBy = slot.helper || mark === \"suggested\" ? helperId : undefined;\n return (\n <div key={slot.name} className={cn(\"flex flex-col gap-1.5\", slot.wide && \"sm:col-span-2\")}>\n <div className=\"flex min-h-6 items-center gap-2\">\n <label htmlFor={id} className=\"text-xs font-medium tracking-[0.5px] text-md-on-surface-variant\">\n {slot.label}\n </label>\n {mark && (\n <span\n className={cn(\n \"inline-flex h-6 items-center gap-1 rounded-md-sm px-2 text-[11px] font-medium tracking-[0.5px] [&_svg]:size-3.5\",\n mark === \"suggested\"\n ? \"bg-md-primary-container text-md-on-primary-container\"\n : \"bg-md-surface-container-high text-md-on-surface-variant\",\n )}\n >\n {mark === \"suggested\" ? <Sparkles aria-hidden=\"true\" /> : <UserPen aria-hidden=\"true\" />}\n {mark === \"suggested\" ? \"Suggested\" : \"Edited by you\"}\n </span>\n )}\n </div>\n {slot.options ? (\n <select\n id={id}\n value={values[slot.name] ?? \"\"}\n aria-describedby={describedBy}\n onChange={(e) => setValue(slot.name, e.target.value)}\n className={cn(fieldClass, \"h-14 cursor-pointer\", !values[slot.name] && \"text-md-on-surface-variant\")}\n >\n <option value=\"\" disabled>\n {slot.placeholder ?? \"Choose…\"}\n </option>\n {slot.options.map((o) => (\n <option key={o.value} value={o.value}>\n {typeof o.label === \"string\" || typeof o.label === \"number\" ? o.label : o.value}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={id}\n type=\"text\"\n value={values[slot.name] ?? \"\"}\n placeholder={slot.placeholder}\n aria-describedby={describedBy}\n onChange={(e) => setValue(slot.name, e.target.value)}\n className={cn(fieldClass, \"h-14\")}\n />\n )}\n {describedBy && (\n <p id={helperId} className=\"px-4 text-xs text-md-on-surface-variant\">\n {mark === \"suggested\" ? `Suggested ${slot.suggested}. ` : \"\"}\n {slot.helper}\n </p>\n )}\n </div>\n );\n })}\n {freeform && (\n <div className=\"flex flex-col gap-1.5 sm:col-span-2\">\n <label\n htmlFor={`${baseId}-freeform`}\n className=\"text-xs font-medium tracking-[0.5px] text-md-on-surface-variant\"\n >\n {freeformLabel}\n </label>\n <textarea\n id={`${baseId}-freeform`}\n rows={2}\n value={extra}\n placeholder=\"Say it in your own words — this overrides the fields above\"\n onChange={(e) => setExtra(e.target.value)}\n className={cn(fieldClass, \"resize-none py-3\")}\n />\n </div>\n )}\n {onSubmit && (\n <div className=\"flex justify-end sm:col-span-2\">\n <Md3Button type=\"submit\" variant=\"filled\" disabled={!hasAny}>\n {submitLabel}\n </Md3Button>\n </div>\n )}\n </form>\n );\n },\n);\nMd3StructuredInputSlots.displayName = \"Md3StructuredInputSlots\";\n\n/* -------------------------------------------------------------------------- */\n/* Tagged input */\n/* -------------------------------------------------------------------------- */\n\n// Same defaults as the twin (internal there).\nconst DEFAULT_TRIGGERS: StructuredInputTagTrigger[] = [\n { trigger: \"@\", label: \"Person\" },\n { trigger: \"p:\", label: \"Project\" },\n { trigger: \"/\", label: \"File\" },\n];\n\n/** MD3 tonal roles for tag chips, cycled per trigger. */\nconst TAG_TONES = [\n \"bg-md-primary-container text-md-on-primary-container\",\n \"bg-md-secondary-container text-md-on-secondary-container\",\n \"bg-md-tertiary-container text-md-on-tertiary-container\",\n \"bg-md-surface-container-high text-md-on-surface\",\n];\n\n/**\n * Material 3 tagged input: a prompt field (MD3 outlined) where typed prefixes\n * (`@` person, `p:` project, `/` file — configurable) become removable input\n * chips in tonal containers, with type-ahead suggestions as MD3 suggestion\n * chips. Backspace on an empty field removes the last tag; Enter sends. Tags\n * are optional — plain text always works. Shares its API (and\n * `structuredPartsToText`) with `StructuredInputTags`.\n */\nexport const Md3StructuredInputTags = React.forwardRef<HTMLDivElement, Md3StructuredInputTagsProps>(\n (\n {\n triggers = DEFAULT_TRIGGERS,\n value: valueProp,\n defaultValue,\n onValueChange,\n onSubmit,\n placeholder = \"Type @ for people, p: for projects, / for files\",\n submitLabel = \"Send\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<StructuredInputPart[]>(defaultValue ?? []);\n const parts = valueProp ?? internal;\n const [draft, setDraft] = React.useState(\"\");\n const inputRef = React.useRef<HTMLInputElement>(null);\n const hintId = React.useId();\n\n const commit = (next: StructuredInputPart[]) => {\n if (valueProp === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n // Longest trigger first so \"p:\" wins over \"p\".\n const ordered = [...triggers].sort((a, b) => b.trigger.length - a.trigger.length);\n const matchTag = (word: string) => {\n const t = ordered.find((tr) => word.startsWith(tr.trigger) && word.length > tr.trigger.length);\n return t ? { trigger: t.trigger, value: word.slice(t.trigger.length) } : null;\n };\n\n const lastWord = draft.split(\" \").pop() ?? \"\";\n const activeTrigger = ordered.find((tr) => lastWord.startsWith(tr.trigger));\n const query = activeTrigger ? lastWord.slice(activeTrigger.trigger.length).toLowerCase() : \"\";\n const suggestions =\n activeTrigger?.suggestions?.filter((s) => s.toLowerCase().startsWith(query)).slice(0, 5) ?? [];\n\n /** Split the draft into text + a trailing tag (if any) and commit them. */\n const flush = (source = draft, forceTag?: { trigger: string; value: string }): StructuredInputPart[] => {\n const words = source.split(\" \");\n const last = words.pop() ?? \"\";\n const tag = forceTag ?? matchTag(last);\n const textBefore = (tag ? words.join(\" \") : source).trim();\n const next = [...parts];\n if (textBefore) next.push({ type: \"text\", text: textBefore });\n if (tag) next.push({ type: \"tag\", ...tag });\n if (next.length !== parts.length) commit(next);\n setDraft(\"\");\n return next;\n };\n\n const toneFor = (trigger: string) => {\n const i = triggers.findIndex((t) => t.trigger === trigger);\n return TAG_TONES[(i < 0 ? 0 : i) % TAG_TONES.length];\n };\n const labelFor = (trigger: string) => triggers.find((t) => t.trigger === trigger)?.label ?? \"Tag\";\n\n const submit = () => {\n const next = flush();\n const text = structuredPartsToText(next);\n if (text) onSubmit?.(next, text);\n };\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-2 text-md-on-surface\", className)} {...props}>\n <div\n className={cn(\n \"flex min-h-14 flex-wrap items-center gap-1.5 rounded-md-xs border border-md-outline bg-transparent px-3 py-2 text-base text-md-on-surface transition-colors\",\n \"hover:border-md-on-surface focus-within:border-md-primary focus-within:ring-1 focus-within:ring-inset focus-within:ring-md-primary\",\n )}\n onClick={() => inputRef.current?.focus()}\n >\n {parts.map((part, i) =>\n part.type === \"text\" ? (\n <span key={i}>{part.text}</span>\n ) : (\n <span\n key={i}\n className={cn(\n \"inline-flex h-7 items-center gap-0.5 rounded-md-sm pl-2 pr-0.5 text-sm font-medium animate-nx-fade-in motion-reduce:animate-none\",\n toneFor(part.trigger),\n )}\n >\n {part.trigger}\n {part.value}\n <button\n type=\"button\"\n aria-label={`Remove ${labelFor(part.trigger).toLowerCase()} ${part.trigger}${part.value}`}\n onClick={(e) => {\n e.stopPropagation();\n commit(parts.filter((_, j) => j !== i));\n inputRef.current?.focus();\n }}\n className={cn(\n \"relative inline-flex size-6 items-center justify-center overflow-hidden rounded-full [&_svg]:size-3.5\",\n stateLayer,\n \"outline-none focus-visible:ring-2 focus-visible:ring-md-primary\",\n )}\n >\n <X className=\"relative\" aria-hidden=\"true\" />\n </button>\n </span>\n ),\n )}\n <input\n ref={inputRef}\n type=\"text\"\n value={draft}\n aria-label={placeholder}\n aria-describedby={hintId}\n placeholder={parts.length ? undefined : placeholder}\n onChange={(e) => {\n const v = e.target.value;\n // A space after a tag word (incl. mobile keyboards that skip keydown) makes it a chip.\n if (v.endsWith(\" \") && matchTag(v.trimEnd().split(\" \").pop() ?? \"\")) flush(v.trimEnd());\n else setDraft(v);\n }}\n onKeyDown={(e) => {\n if (e.key === \" \" && matchTag(lastWord)) {\n e.preventDefault();\n flush();\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n submit();\n } else if (e.key === \"Backspace\" && draft === \"\" && parts.length) {\n e.preventDefault();\n const last = parts[parts.length - 1];\n commit(parts.slice(0, -1));\n if (last.type === \"text\") setDraft(last.text);\n }\n }}\n className=\"h-8 min-w-[8rem] flex-1 bg-transparent text-base text-md-on-surface outline-none placeholder:text-md-on-surface-variant\"\n />\n </div>\n <p id={hintId} className=\"sr-only\">\n {triggers.map((t) => `${t.trigger} for ${t.label.toLowerCase()}`).join(\", \")}. Space turns a tag into a\n chip; Backspace removes the last one; Enter sends.\n </p>\n {activeTrigger && suggestions.length > 0 && (\n <div role=\"group\" aria-label={`${activeTrigger.label} suggestions`} className=\"flex flex-wrap gap-2\">\n {suggestions.map((s) => (\n <Md3Chip\n key={s}\n variant=\"suggestion\"\n onClick={() => {\n flush(draft, { trigger: activeTrigger.trigger, value: s });\n inputRef.current?.focus();\n }}\n >\n {activeTrigger.trigger}\n {s}\n </Md3Chip>\n ))}\n </div>\n )}\n {onSubmit && (\n <div className=\"flex justify-end\">\n <Md3Button variant=\"filled\" onClick={submit} disabled={parts.length === 0 && draft.trim() === \"\"}>\n {submitLabel}\n </Md3Button>\n </div>\n )}\n </div>\n );\n },\n);\nMd3StructuredInputTags.displayName = \"Md3StructuredInputTags\";\n\n/* -------------------------------------------------------------------------- */\n/* Wizard step */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Material 3 wizard step: a multi-step MD3 card for high-stakes prompts\n * (legal, HR, medical) — a segmented progress track in the primary colour,\n * “Step 2 of 3 · Audience”, the step's question and fields (children), and\n * Back / Next / Generate as MD3 text and filled buttons. Focus moves to the\n * step heading when the step changes; nothing forces every step to be filled\n * before generating. Shares its API with `StructuredInputWizard`.\n */\nexport const Md3StructuredInputWizard = React.forwardRef<HTMLDivElement, Md3StructuredInputWizardProps>(\n (\n {\n steps,\n step: stepProp,\n defaultStep = 0,\n onStepChange,\n description,\n onSubmit,\n submitLabel = \"Generate\",\n allowEarlySubmit = true,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState(defaultStep);\n const step = Math.min(Math.max(stepProp ?? internal, 0), Math.max(steps.length - 1, 0));\n const headingRef = React.useRef<HTMLParagraphElement>(null);\n const headingId = React.useId();\n const moved = React.useRef(false);\n\n React.useEffect(() => {\n if (moved.current) headingRef.current?.focus();\n }, [step]);\n\n const go = (next: number) => {\n moved.current = true;\n if (stepProp === undefined) setInternal(next);\n onStepChange?.(next);\n };\n\n const last = step === steps.length - 1;\n\n return (\n <Md3Card\n ref={ref}\n variant=\"outlined\"\n role=\"group\"\n aria-labelledby={headingId}\n className={cn(\"flex flex-col gap-3 rounded-md-lg p-4\", className)}\n {...props}\n >\n <div className=\"flex gap-1\" aria-hidden=\"true\">\n {steps.map((_, i) => (\n <span\n key={i}\n className={cn(\n \"h-1 flex-1 rounded-full transition-colors duration-300 motion-reduce:transition-none\",\n i <= step ? \"bg-md-primary\" : \"bg-md-secondary-container\",\n )}\n />\n ))}\n </div>\n <div className=\"flex flex-col gap-1\">\n <p\n ref={headingRef}\n id={headingId}\n tabIndex={-1}\n className=\"rounded-md-xs text-sm font-medium tracking-[0.1px] text-md-on-surface outline-none focus-visible:ring-2 focus-visible:ring-md-primary\"\n >\n Step {step + 1} of {steps.length} · {steps[step]}\n </p>\n {description && <p className=\"text-sm text-md-on-surface-variant\">{description}</p>}\n </div>\n {children}\n <div className=\"flex items-center gap-2\">\n {step > 0 && (\n <Md3Button variant=\"text\" onClick={() => go(step - 1)}>\n Back\n </Md3Button>\n )}\n <span className=\"flex-1\" />\n {!last && allowEarlySubmit && onSubmit && (\n <Md3Button variant=\"text\" onClick={onSubmit}>\n {submitLabel} now\n </Md3Button>\n )}\n {last ? (\n onSubmit && (\n <Md3Button variant=\"filled\" onClick={onSubmit}>\n {submitLabel}\n </Md3Button>\n )\n ) : (\n <Md3Button variant=\"filled\" onClick={() => go(step + 1)}>\n Next\n </Md3Button>\n )}\n </div>\n </Md3Card>\n );\n },\n);\nMd3StructuredInputWizard.displayName = \"Md3StructuredInputWizard\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@nucleux/utils\";\nimport { Md3Button } from \"@nucleux/md3-button\";\nimport { Md3Card } from \"@nucleux/md3-card\";\nimport { Md3Chip } from \"@nucleux/md3-chip\";\nimport { Md3SegmentedButton, Md3SegmentedButtonItem } from \"@nucleux/md3-segmented-button\";\nimport {\n splitStructuredTags,\n structuredSlotType,\n structuredPartsToText,\n type StructuredInputPart,\n type StructuredInputProps,\n type StructuredInputSlotsProps,\n type StructuredInputTagsProps,\n type StructuredInputTagTrigger,\n type StructuredInputValues,\n type StructuredInputWizardProps,\n} from \"@nucleux/structured-input\";\nimport { Check, Sparkles, UserPen, X } from \"lucide-react\";\n\n// Same API as the shadcn twin: the props and data shapes are the twin's own types.\nexport type Md3StructuredInputProps = StructuredInputProps;\nexport type Md3StructuredInputSlotsProps = StructuredInputSlotsProps;\nexport type Md3StructuredInputTagsProps = StructuredInputTagsProps;\nexport type Md3StructuredInputWizardProps = StructuredInputWizardProps;\nexport type {\n StructuredOption,\n StructuredInputSlotType,\n StructuredInputSlot,\n StructuredInputValues,\n StructuredInputTagTrigger,\n StructuredInputPart,\n} from \"@nucleux/structured-input\";\n/** Serialise parts into the plain prompt text — shared with `@nucleux/structured-input`. */\nexport { structuredPartsToText };\n\nconst stateLayer =\n \"before:absolute before:inset-0 before:bg-current before:opacity-0 before:transition-opacity before:content-[''] hover:before:opacity-[0.08] focus-visible:before:opacity-[0.12] active:before:opacity-[0.12]\";\n\n/** MD3 outlined field chrome, shared by text inputs, selects and textareas. */\nconst fieldClass = cn(\n \"w-full rounded-md-xs border border-md-outline bg-transparent px-4 text-base text-md-on-surface outline-none transition-colors\",\n \"placeholder:text-md-on-surface-variant hover:border-md-on-surface\",\n \"focus:border-md-primary focus:ring-1 focus:ring-inset focus:ring-md-primary\",\n \"disabled:cursor-not-allowed disabled:opacity-[0.38]\",\n);\n\n/**\n * Material 3 structured input: an agent-generated clarifying question as a\n * compact MD3 card — single or multi-select options drawn as MD3 radio and\n * checkbox rows with a state layer, a free-text escape, and a skip. Arrow keys\n * move and select in single mode, exactly as in the twin. The other variants\n * are composable siblings: {@link Md3StructuredInputSlots},\n * {@link Md3StructuredInputTags} and {@link Md3StructuredInputWizard}. Shares\n * its API with `StructuredInput` from `@nucleux/structured-input`.\n */\nexport const Md3StructuredInput = React.forwardRef<HTMLDivElement, Md3StructuredInputProps>(\n (\n {\n question,\n options,\n multiple = false,\n value,\n defaultValue = [],\n onValueChange,\n allowOther = false,\n otherPlaceholder = \"Something else…\",\n onSubmit,\n onSkip,\n submitLabel = \"Continue\",\n skipLabel = \"Skip\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<string[]>(defaultValue);\n const [other, setOther] = React.useState(\"\");\n const questionId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const selected = value !== undefined ? value : internal;\n\n const setSelected = (next: string[]) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n const toggle = (val: string) => {\n if (multiple) {\n setSelected(selected.includes(val) ? selected.filter((v) => v !== val) : [...selected, val]);\n } else {\n setSelected([val]);\n }\n };\n\n return (\n <Md3Card\n ref={ref}\n variant=\"outlined\"\n className={cn(\"flex flex-col gap-4 rounded-md-lg p-5 animate-nx-fade-in motion-reduce:animate-none\", className)}\n {...props}\n >\n <p id={questionId} className=\"text-base font-medium tracking-[0.15px] text-md-on-surface\">\n {question}\n </p>\n <div\n ref={groupRef}\n role={multiple ? \"group\" : \"radiogroup\"}\n aria-labelledby={questionId}\n className=\"flex flex-col gap-1\"\n onKeyDown={(e) => {\n // Radio-group keyboard pattern: arrows move and select.\n if (multiple || ![\"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(e.key)) return;\n const radios = Array.from(groupRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]') ?? []);\n const i = radios.indexOf(document.activeElement as HTMLButtonElement);\n if (i < 0) return;\n e.preventDefault();\n const step = e.key === \"ArrowDown\" || e.key === \"ArrowRight\" ? 1 : -1;\n const next = (i + step + radios.length) % radios.length;\n radios[next].focus();\n setSelected([options[next].value]);\n }}\n >\n {options.map((option, index) => {\n const active = selected.includes(option.value);\n const tabbable = multiple || index === Math.max(0, options.findIndex((o) => selected.includes(o.value)));\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multiple ? \"checkbox\" : \"radio\"}\n aria-checked={active}\n tabIndex={tabbable ? 0 : -1}\n onClick={() => toggle(option.value)}\n className={cn(\n \"relative flex min-h-12 items-center gap-4 overflow-hidden rounded-md-md px-3 py-2 text-left text-sm transition-colors duration-200 motion-reduce:transition-none\",\n stateLayer,\n \"outline-none focus-visible:ring-2 focus-visible:ring-md-primary\",\n active\n ? \"bg-md-secondary-container text-md-on-secondary-container\"\n : \"text-md-on-surface\",\n )}\n >\n {multiple ? (\n <span\n className={cn(\n \"relative inline-flex size-[18px] shrink-0 items-center justify-center rounded-[2px] border-2 transition-colors [&_svg]:size-3.5\",\n active ? \"border-md-primary bg-md-primary text-md-on-primary\" : \"border-md-on-surface-variant\",\n )}\n >\n {active && <Check strokeWidth={3} aria-hidden=\"true\" />}\n </span>\n ) : (\n <span\n className={cn(\n \"relative inline-flex size-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors\",\n active ? \"border-md-primary\" : \"border-md-on-surface-variant\",\n )}\n >\n <span\n className={cn(\n \"size-2.5 rounded-full bg-md-primary transition-transform duration-200 motion-reduce:transition-none\",\n active ? \"scale-100\" : \"scale-0\",\n )}\n />\n </span>\n )}\n <span className=\"relative flex-1\">{option.label}</span>\n </button>\n );\n })}\n </div>\n {allowOther && (\n <input\n type=\"text\"\n value={other}\n onChange={(e) => setOther(e.target.value)}\n placeholder={otherPlaceholder}\n aria-label={otherPlaceholder}\n className={cn(fieldClass, \"h-12\")}\n />\n )}\n <div className=\"flex items-center justify-end gap-2\">\n {onSkip && (\n <Md3Button variant=\"text\" onClick={onSkip}>\n {skipLabel}\n </Md3Button>\n )}\n {onSubmit && (\n <Md3Button\n variant=\"filled\"\n onClick={() => onSubmit(selected, allowOther ? other : undefined)}\n disabled={selected.length === 0 && !(allowOther && other.trim())}\n >\n {submitLabel}\n </Md3Button>\n )}\n </div>\n </Md3Card>\n );\n },\n);\nMd3StructuredInput.displayName = \"Md3StructuredInput\";\n\n/* -------------------------------------------------------------------------- */\n/* Named slots */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Material 3 named slots: a short set of plain-language MD3 outlined fields\n * (2–4) that fill a prompt template — text fields or native selects with\n * visible labels and helper text, an optional freeform override, and a submit\n * that never requires every field. Agent-suggested values carry a\n * primary-container “Suggested” mark with their reason and turn into a neutral\n * “Edited by you” once changed; the component never changes a value the person\n * set. Shares its API with `StructuredInputSlots`.\n */\nexport const Md3StructuredInputSlots = React.forwardRef<HTMLFormElement, Md3StructuredInputSlotsProps>(\n (\n {\n slots,\n values: valuesProp,\n defaultValues,\n onValuesChange,\n freeform = false,\n onSubmit,\n submitLabel = \"Generate\",\n label = \"Structured prompt builder\",\n title,\n icon,\n aside,\n showProgress = false,\n onCancel,\n cancelLabel = \"Cancel\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<StructuredInputValues>(defaultValues ?? {});\n const values = valuesProp ?? internal;\n const [edited, setEdited] = React.useState<Record<string, boolean>>({});\n const [extra, setExtra] = React.useState(\"\");\n const baseId = React.useId();\n\n const setValue = (name: string, value: string) => {\n const next = { ...values, [name]: value };\n if (valuesProp === undefined) setInternal(next);\n setEdited((e) => ({ ...e, [name]: true }));\n onValuesChange?.(next);\n };\n\n const filled = (name: string) => !!values[name]?.trim();\n const filledCount = slots.filter((slot) => filled(slot.name)).length;\n const requiredMet = slots.every((slot) => !slot.required || filled(slot.name));\n const hasAny = Object.values(values).some((v) => v && v.trim()) || extra.trim().length > 0;\n const canSubmit = hasAny && requiredMet;\n const freeformLabel = typeof freeform === \"string\" ? freeform : \"Anything else?\";\n const titleId = `${baseId}-title`;\n\n return (\n <form\n ref={ref}\n aria-label={title == null ? label : undefined}\n aria-labelledby={title == null ? undefined : titleId}\n className={cn(\"grid grid-cols-1 gap-4 text-md-on-surface sm:grid-cols-2\", className)}\n onSubmit={(e) => {\n e.preventDefault();\n if (canSubmit) onSubmit?.(values, extra);\n }}\n {...props}\n >\n {(title != null || aside != null) && (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 sm:col-span-2\">\n {icon != null && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-md-primary [&_svg]:size-6\">\n {icon}\n </span>\n )}\n <h3 id={titleId} className=\"flex-1 text-[1.375rem] leading-7 text-md-on-surface\">\n {title}\n </h3>\n {aside != null && <div className=\"text-sm text-md-on-surface-variant\">{aside}</div>}\n </div>\n )}\n {slots.map((slot) => {\n const id = `${baseId}-${slot.name}`;\n const helperId = `${id}-helper`;\n const isEdited = !!edited[slot.name];\n const mark = slot.suggested ? (isEdited ? \"edited\" : \"suggested\") : null;\n const describedBy = slot.helper || mark === \"suggested\" ? helperId : undefined;\n const type = structuredSlotType(slot);\n return (\n <div key={slot.name} className={cn(\"flex flex-col gap-1.5\", slot.wide && \"sm:col-span-2\")}>\n <div className=\"flex min-h-6 items-center gap-2\">\n <label\n id={`${id}-label`}\n htmlFor={id}\n className={cn(\n \"tracking-[0.1px]\",\n title != null ? \"text-sm font-medium text-md-on-surface\" : \"text-xs font-medium tracking-[0.5px] text-md-on-surface-variant\",\n )}\n >\n {slot.label}\n {slot.required && <span aria-hidden=\"true\"> *</span>}\n </label>\n {mark && (\n <span\n className={cn(\n \"inline-flex h-6 items-center gap-1 rounded-md-sm px-2 text-[11px] font-medium tracking-[0.5px] [&_svg]:size-3.5\",\n mark === \"suggested\"\n ? \"bg-md-primary-container text-md-on-primary-container\"\n : \"bg-md-surface-container-high text-md-on-surface-variant\",\n )}\n >\n {mark === \"suggested\" ? <Sparkles aria-hidden=\"true\" /> : <UserPen aria-hidden=\"true\" />}\n {mark === \"suggested\" ? \"Suggested\" : \"Edited by you\"}\n </span>\n )}\n </div>\n {type === \"select\" && slot.options ? (\n <select\n id={id}\n value={values[slot.name] ?? \"\"}\n aria-describedby={describedBy}\n aria-required={slot.required || undefined}\n onChange={(e) => setValue(slot.name, e.target.value)}\n className={cn(fieldClass, \"h-14 cursor-pointer bg-md-surface\", !values[slot.name] && \"text-md-on-surface-variant\")}\n >\n <option value=\"\" disabled>\n {slot.placeholder ?? \"Choose…\"}\n </option>\n {slot.options.map((o) => (\n <option key={o.value} value={o.value}>\n {typeof o.label === \"string\" || typeof o.label === \"number\" ? o.label : o.value}\n </option>\n ))}\n </select>\n ) : type === \"segmented\" && slot.options ? (\n <Md3SegmentedButton\n id={id}\n aria-labelledby={`${id}-label`}\n aria-describedby={describedBy}\n value={values[slot.name] ?? \"\"}\n onValueChange={(v) => setValue(slot.name, typeof v === \"string\" ? v : (v[0] ?? \"\"))}\n className=\"h-14 w-fit max-w-full\"\n >\n {slot.options.map((o) => (\n <Md3SegmentedButtonItem key={o.value} value={o.value} className=\"min-w-24 text-base\">\n {o.label}\n </Md3SegmentedButtonItem>\n ))}\n </Md3SegmentedButton>\n ) : type === \"tags\" ? (\n <div className={cn(fieldClass, \"flex min-h-14 flex-wrap items-center gap-2 bg-md-surface px-2 py-2 focus-within:border-md-primary\")}>\n {splitStructuredTags(values[slot.name]).map((t, _i, all) => (\n <Md3Chip\n key={t}\n variant=\"input\"\n onRemove={() => setValue(slot.name, all.filter((x) => x !== t).join(\", \"))}\n >\n {t}\n </Md3Chip>\n ))}\n <input\n id={id}\n placeholder={slot.placeholder ?? \"Add…\"}\n aria-describedby={describedBy}\n onKeyDown={(e) => {\n const el = e.currentTarget;\n if ((e.key === \"Enter\" || e.key === \",\") && el.value.trim()) {\n e.preventDefault();\n const tags = splitStructuredTags(values[slot.name]);\n if (!tags.includes(el.value.trim())) setValue(slot.name, [...tags, el.value.trim()].join(\", \"));\n el.value = \"\";\n }\n }}\n className=\"min-w-16 flex-1 bg-transparent px-2 text-base outline-none placeholder:text-md-on-surface-variant\"\n />\n </div>\n ) : (\n <input\n id={id}\n type={type === \"date\" ? \"date\" : \"text\"}\n value={values[slot.name] ?? \"\"}\n placeholder={slot.placeholder}\n aria-describedby={describedBy}\n aria-required={slot.required || undefined}\n onChange={(e) => setValue(slot.name, e.target.value)}\n className={cn(fieldClass, \"h-14 bg-md-surface\")}\n />\n )}\n {describedBy && (\n <p id={helperId} className=\"px-4 text-xs text-md-on-surface-variant\">\n {mark === \"suggested\" ? `Suggested ${slot.suggested}. ` : \"\"}\n {slot.helper}\n </p>\n )}\n </div>\n );\n })}\n {freeform && (\n <div className=\"flex flex-col gap-1.5 sm:col-span-2\">\n <label\n htmlFor={`${baseId}-freeform`}\n className=\"text-xs font-medium tracking-[0.5px] text-md-on-surface-variant\"\n >\n {freeformLabel}\n </label>\n <textarea\n id={`${baseId}-freeform`}\n rows={2}\n value={extra}\n placeholder=\"Say it in your own words — this overrides the fields above\"\n onChange={(e) => setExtra(e.target.value)}\n className={cn(fieldClass, \"resize-none py-3\")}\n />\n </div>\n )}\n {(onSubmit || onCancel || showProgress) && (\n <div className=\"flex items-center gap-2 sm:col-span-2\">\n {showProgress && (\n <span className=\"text-sm text-md-on-surface-variant\" aria-live=\"polite\">\n {filledCount} of {slots.length} filled\n </span>\n )}\n <span className=\"flex-1\" />\n {onCancel && (\n <Md3Button type=\"button\" variant=\"text\" onClick={onCancel}>\n {cancelLabel}\n </Md3Button>\n )}\n {onSubmit && (\n <Md3Button type=\"submit\" variant=\"filled\" disabled={!canSubmit}>\n {submitLabel}\n </Md3Button>\n )}\n </div>\n )}\n </form>\n );\n },\n);\nMd3StructuredInputSlots.displayName = \"Md3StructuredInputSlots\";\n\n/* -------------------------------------------------------------------------- */\n/* Tagged input */\n/* -------------------------------------------------------------------------- */\n\n// Same defaults as the twin (internal there).\nconst DEFAULT_TRIGGERS: StructuredInputTagTrigger[] = [\n { trigger: \"@\", label: \"Person\" },\n { trigger: \"p:\", label: \"Project\" },\n { trigger: \"/\", label: \"File\" },\n];\n\n/** MD3 tonal roles for tag chips, cycled per trigger. */\nconst TAG_TONES = [\n \"bg-md-primary-container text-md-on-primary-container\",\n \"bg-md-secondary-container text-md-on-secondary-container\",\n \"bg-md-tertiary-container text-md-on-tertiary-container\",\n \"bg-md-surface-container-high text-md-on-surface\",\n];\n\n/**\n * Material 3 tagged input: a prompt field (MD3 outlined) where typed prefixes\n * (`@` person, `p:` project, `/` file — configurable) become removable input\n * chips in tonal containers, with type-ahead suggestions as MD3 suggestion\n * chips. Backspace on an empty field removes the last tag; Enter sends. Tags\n * are optional — plain text always works. Shares its API (and\n * `structuredPartsToText`) with `StructuredInputTags`.\n */\nexport const Md3StructuredInputTags = React.forwardRef<HTMLDivElement, Md3StructuredInputTagsProps>(\n (\n {\n triggers = DEFAULT_TRIGGERS,\n value: valueProp,\n defaultValue,\n onValueChange,\n onSubmit,\n placeholder = \"Type @ for people, p: for projects, / for files\",\n submitLabel = \"Send\",\n className,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState<StructuredInputPart[]>(defaultValue ?? []);\n const parts = valueProp ?? internal;\n const [draft, setDraft] = React.useState(\"\");\n const inputRef = React.useRef<HTMLInputElement>(null);\n const hintId = React.useId();\n\n const commit = (next: StructuredInputPart[]) => {\n if (valueProp === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n // Longest trigger first so \"p:\" wins over \"p\".\n const ordered = [...triggers].sort((a, b) => b.trigger.length - a.trigger.length);\n const matchTag = (word: string) => {\n const t = ordered.find((tr) => word.startsWith(tr.trigger) && word.length > tr.trigger.length);\n return t ? { trigger: t.trigger, value: word.slice(t.trigger.length) } : null;\n };\n\n const lastWord = draft.split(\" \").pop() ?? \"\";\n const activeTrigger = ordered.find((tr) => lastWord.startsWith(tr.trigger));\n const query = activeTrigger ? lastWord.slice(activeTrigger.trigger.length).toLowerCase() : \"\";\n const suggestions =\n activeTrigger?.suggestions?.filter((s) => s.toLowerCase().startsWith(query)).slice(0, 5) ?? [];\n\n /** Split the draft into text + a trailing tag (if any) and commit them. */\n const flush = (source = draft, forceTag?: { trigger: string; value: string }): StructuredInputPart[] => {\n const words = source.split(\" \");\n const last = words.pop() ?? \"\";\n const tag = forceTag ?? matchTag(last);\n const textBefore = (tag ? words.join(\" \") : source).trim();\n const next = [...parts];\n if (textBefore) next.push({ type: \"text\", text: textBefore });\n if (tag) next.push({ type: \"tag\", ...tag });\n if (next.length !== parts.length) commit(next);\n setDraft(\"\");\n return next;\n };\n\n const toneFor = (trigger: string) => {\n const i = triggers.findIndex((t) => t.trigger === trigger);\n return TAG_TONES[(i < 0 ? 0 : i) % TAG_TONES.length];\n };\n const labelFor = (trigger: string) => triggers.find((t) => t.trigger === trigger)?.label ?? \"Tag\";\n\n const submit = () => {\n const next = flush();\n const text = structuredPartsToText(next);\n if (text) onSubmit?.(next, text);\n };\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-2 text-md-on-surface\", className)} {...props}>\n <div\n className={cn(\n \"flex min-h-14 flex-wrap items-center gap-1.5 rounded-md-xs border border-md-outline bg-transparent px-3 py-2 text-base text-md-on-surface transition-colors\",\n \"hover:border-md-on-surface focus-within:border-md-primary focus-within:ring-1 focus-within:ring-inset focus-within:ring-md-primary\",\n )}\n onClick={() => inputRef.current?.focus()}\n >\n {parts.map((part, i) =>\n part.type === \"text\" ? (\n <span key={i}>{part.text}</span>\n ) : (\n <span\n key={i}\n className={cn(\n \"inline-flex h-7 items-center gap-0.5 rounded-md-sm pl-2 pr-0.5 text-sm font-medium animate-nx-fade-in motion-reduce:animate-none\",\n toneFor(part.trigger),\n )}\n >\n {part.trigger}\n {part.value}\n <button\n type=\"button\"\n aria-label={`Remove ${labelFor(part.trigger).toLowerCase()} ${part.trigger}${part.value}`}\n onClick={(e) => {\n e.stopPropagation();\n commit(parts.filter((_, j) => j !== i));\n inputRef.current?.focus();\n }}\n className={cn(\n \"relative inline-flex size-6 items-center justify-center overflow-hidden rounded-full [&_svg]:size-3.5\",\n stateLayer,\n \"outline-none focus-visible:ring-2 focus-visible:ring-md-primary\",\n )}\n >\n <X className=\"relative\" aria-hidden=\"true\" />\n </button>\n </span>\n ),\n )}\n <input\n ref={inputRef}\n type=\"text\"\n value={draft}\n aria-label={placeholder}\n aria-describedby={hintId}\n placeholder={parts.length ? undefined : placeholder}\n onChange={(e) => {\n const v = e.target.value;\n // A space after a tag word (incl. mobile keyboards that skip keydown) makes it a chip.\n if (v.endsWith(\" \") && matchTag(v.trimEnd().split(\" \").pop() ?? \"\")) flush(v.trimEnd());\n else setDraft(v);\n }}\n onKeyDown={(e) => {\n if (e.key === \" \" && matchTag(lastWord)) {\n e.preventDefault();\n flush();\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n submit();\n } else if (e.key === \"Backspace\" && draft === \"\" && parts.length) {\n e.preventDefault();\n const last = parts[parts.length - 1];\n commit(parts.slice(0, -1));\n if (last.type === \"text\") setDraft(last.text);\n }\n }}\n className=\"h-8 min-w-[8rem] flex-1 bg-transparent text-base text-md-on-surface outline-none placeholder:text-md-on-surface-variant\"\n />\n </div>\n <p id={hintId} className=\"sr-only\">\n {triggers.map((t) => `${t.trigger} for ${t.label.toLowerCase()}`).join(\", \")}. Space turns a tag into a\n chip; Backspace removes the last one; Enter sends.\n </p>\n {activeTrigger && suggestions.length > 0 && (\n <div role=\"group\" aria-label={`${activeTrigger.label} suggestions`} className=\"flex flex-wrap gap-2\">\n {suggestions.map((s) => (\n <Md3Chip\n key={s}\n variant=\"suggestion\"\n onClick={() => {\n flush(draft, { trigger: activeTrigger.trigger, value: s });\n inputRef.current?.focus();\n }}\n >\n {activeTrigger.trigger}\n {s}\n </Md3Chip>\n ))}\n </div>\n )}\n {onSubmit && (\n <div className=\"flex justify-end\">\n <Md3Button variant=\"filled\" onClick={submit} disabled={parts.length === 0 && draft.trim() === \"\"}>\n {submitLabel}\n </Md3Button>\n </div>\n )}\n </div>\n );\n },\n);\nMd3StructuredInputTags.displayName = \"Md3StructuredInputTags\";\n\n/* -------------------------------------------------------------------------- */\n/* Wizard step */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Material 3 wizard step: a multi-step MD3 card for high-stakes prompts\n * (legal, HR, medical) — a segmented progress track in the primary colour,\n * “Step 2 of 3 · Audience”, the step's question and fields (children), and\n * Back / Next / Generate as MD3 text and filled buttons. Focus moves to the\n * step heading when the step changes; nothing forces every step to be filled\n * before generating. Shares its API with `StructuredInputWizard`.\n */\nexport const Md3StructuredInputWizard = React.forwardRef<HTMLDivElement, Md3StructuredInputWizardProps>(\n (\n {\n steps,\n step: stepProp,\n defaultStep = 0,\n onStepChange,\n description,\n onSubmit,\n submitLabel = \"Generate\",\n allowEarlySubmit = true,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const [internal, setInternal] = React.useState(defaultStep);\n const step = Math.min(Math.max(stepProp ?? internal, 0), Math.max(steps.length - 1, 0));\n const headingRef = React.useRef<HTMLParagraphElement>(null);\n const headingId = React.useId();\n const moved = React.useRef(false);\n\n React.useEffect(() => {\n if (moved.current) headingRef.current?.focus();\n }, [step]);\n\n const go = (next: number) => {\n moved.current = true;\n if (stepProp === undefined) setInternal(next);\n onStepChange?.(next);\n };\n\n const last = step === steps.length - 1;\n\n return (\n <Md3Card\n ref={ref}\n variant=\"outlined\"\n role=\"group\"\n aria-labelledby={headingId}\n className={cn(\"flex flex-col gap-3 rounded-md-lg p-4\", className)}\n {...props}\n >\n <div className=\"flex gap-1\" aria-hidden=\"true\">\n {steps.map((_, i) => (\n <span\n key={i}\n className={cn(\n \"h-1 flex-1 rounded-full transition-colors duration-300 motion-reduce:transition-none\",\n i <= step ? \"bg-md-primary\" : \"bg-md-secondary-container\",\n )}\n />\n ))}\n </div>\n <div className=\"flex flex-col gap-1\">\n <p\n ref={headingRef}\n id={headingId}\n tabIndex={-1}\n className=\"rounded-md-xs text-sm font-medium tracking-[0.1px] text-md-on-surface outline-none focus-visible:ring-2 focus-visible:ring-md-primary\"\n >\n Step {step + 1} of {steps.length} · {steps[step]}\n </p>\n {description && <p className=\"text-sm text-md-on-surface-variant\">{description}</p>}\n </div>\n {children}\n <div className=\"flex items-center gap-2\">\n {step > 0 && (\n <Md3Button variant=\"text\" onClick={() => go(step - 1)}>\n Back\n </Md3Button>\n )}\n <span className=\"flex-1\" />\n {!last && allowEarlySubmit && onSubmit && (\n <Md3Button variant=\"text\" onClick={onSubmit}>\n {submitLabel} now\n </Md3Button>\n )}\n {last ? (\n onSubmit && (\n <Md3Button variant=\"filled\" onClick={onSubmit}>\n {submitLabel}\n </Md3Button>\n )\n ) : (\n <Md3Button variant=\"filled\" onClick={() => go(step + 1)}>\n Next\n </Md3Button>\n )}\n </div>\n </Md3Card>\n );\n },\n);\nMd3StructuredInputWizard.displayName = \"Md3StructuredInputWizard\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nucleux/md3-structured-input",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "Material 3 Structured Input — a compact form for exact values, suggestions marked and every value yours — Nucleux agentic UI for React.",
|
|
@@ -39,11 +39,13 @@
|
|
|
39
39
|
"react-dom": ">=18"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@nucleux/md3-
|
|
43
|
-
"@nucleux/md3-
|
|
44
|
-
"@nucleux/md3-
|
|
45
|
-
"@nucleux/
|
|
46
|
-
"@nucleux/
|
|
42
|
+
"@nucleux/md3-open-input": "0.10.0",
|
|
43
|
+
"@nucleux/md3-segmented-button": "0.10.0",
|
|
44
|
+
"@nucleux/md3-button": "0.10.0",
|
|
45
|
+
"@nucleux/md3-card": "0.10.0",
|
|
46
|
+
"@nucleux/md3-chip": "0.10.0",
|
|
47
|
+
"@nucleux/structured-input": "0.10.0",
|
|
48
|
+
"@nucleux/utils": "0.10.0",
|
|
47
49
|
"lucide-react": "^0.469.0"
|
|
48
50
|
},
|
|
49
51
|
"devDependencies": {
|