@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 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 (hasAny) onSubmit?.(values, extra);
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.jsx("label", { htmlFor: id, className: "text-xs font-medium tracking-[0.5px] text-md-on-surface-variant", children: slot.label }),
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.jsx("div", { className: "flex justify-end sm:col-span-2", children: /* @__PURE__ */ jsxRuntime.jsx(md3Button.Md3Button, { type: "submit", variant: "filled", disabled: !hasAny, children: submitLabel }) })
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
  );
@@ -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 { structuredPartsToText } from '@nucleux/structured-input';
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 (hasAny) onSubmit?.(values, extra);
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__ */ jsx("label", { htmlFor: id, className: "text-xs font-medium tracking-[0.5px] text-md-on-surface-variant", children: slot.label }),
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__ */ jsx("div", { className: "flex justify-end sm:col-span-2", children: /* @__PURE__ */ jsx(Md3Button, { type: "submit", variant: "filled", disabled: !hasAny, children: submitLabel }) })
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.8.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-button": "0.8.0",
43
- "@nucleux/md3-card": "0.8.0",
44
- "@nucleux/md3-chip": "0.8.0",
45
- "@nucleux/structured-input": "0.8.0",
46
- "@nucleux/utils": "0.8.0",
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": {