@nucleux/mcp 0.6.0 → 0.7.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.js CHANGED
@@ -6,7 +6,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
6
6
  // src/catalog.json
7
7
  var catalog_default = {
8
8
  library: "@nucleux/react",
9
- version: "0.6.0",
9
+ version: "0.7.0",
10
10
  generatedFrom: "packages/* (do not edit \u2014 run scripts/gen-mcp-catalog.mjs)",
11
11
  setup: {
12
12
  installFull: "pnpm add @nucleux/react @nucleux/tokens",
@@ -43,8 +43,8 @@ module.exports = {
43
43
  note: "Every component is also re-exported from the @nucleux/react umbrella. Icons in the examples come from lucide-react (optional; any icon set works)."
44
44
  },
45
45
  counts: {
46
- components: 164,
47
- packages: 169,
46
+ components: 176,
47
+ packages: 181,
48
48
  examples: 6
49
49
  },
50
50
  packages: [
@@ -6259,6 +6259,242 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
6259
6259
  "react-dom": ">=18"
6260
6260
  }
6261
6261
  },
6262
+ {
6263
+ name: "madlibs",
6264
+ package: "@nucleux/madlibs",
6265
+ kind: "component",
6266
+ description: 'Madlibs \u2014 a request written as a natural sentence with a few labelled\nblanks ("Write a [friendly] reply to [Sam] about [the proposal]."). Each\nblank is an inline field with suggested values and a free-text fallback;\noptional clauses leave the sentence while empty; the assembled request\nshows as it fills. An agent-suggested value stays marked until kept. Use\nprompt names any missing blank in words (clearing nothing) and otherwise\nhands the sentence to `onUse` for the composer \u2014 it never sends \u2014 then\nconfirms with Undo. Variants: inline dropdowns, form rows, chip builder.',
6267
+ summary: "Madlibs \u2014 a request written as a sentence with a few labelled blanks, filled and reviewed before it goes to the composer \u2014 Nucleux agentic UI for React.",
6268
+ keywords: [
6269
+ "nucleux",
6270
+ "react",
6271
+ "ui",
6272
+ "components",
6273
+ "agentic",
6274
+ "ai",
6275
+ "tailwind",
6276
+ "madlibs",
6277
+ "prompt-scaffold",
6278
+ "fill-in-the-blank"
6279
+ ],
6280
+ exports: [
6281
+ "parseMadlibsTemplate",
6282
+ "getMadlibsBlanks",
6283
+ "assembleMadlibsPrompt",
6284
+ "madlibsBlankWidth",
6285
+ "useMadlibs",
6286
+ "useMadlibsBlank",
6287
+ "Madlibs",
6288
+ "MadlibsVariant",
6289
+ "MadlibsBlankStyle",
6290
+ "MadlibsDensity",
6291
+ "MadlibsValues",
6292
+ "MadlibsBlank",
6293
+ "MadlibsSuggestion",
6294
+ "MadlibsPart",
6295
+ "MadlibsTemplatePart",
6296
+ "MadlibsStatus",
6297
+ "MadlibsProps",
6298
+ "MadlibsController",
6299
+ "UseMadlibsBlankOptions"
6300
+ ],
6301
+ components: [
6302
+ "Madlibs"
6303
+ ],
6304
+ import: 'import { Madlibs } from "@nucleux/madlibs";',
6305
+ installSingle: "pnpm add @nucleux/madlibs @nucleux/tokens",
6306
+ props: [
6307
+ {
6308
+ name: "MadlibsProps",
6309
+ source: 'export interface MadlibsProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, "defaultValue" | "onChange"> {\n /**\n * The scaffold sentence. `{id}` is a blank; `[ \u2026 ]` wraps an optional clause\n * that leaves the sentence while its blank is empty:\n * `"Summarize {document} for {audience}[, focusing on {topic}]."`\n * Blanks outside a clause are required. Keep it to two\u2013four blanks \u2014 more is a form.\n */\n template: string;\n /** Label and options for each blank in the template. */\n blanks: MadlibsBlank[];\n /** Controlled values, keyed by blank id. */\n values?: MadlibsValues;\n /** Initial values when uncontrolled. */\n defaultValues?: MadlibsValues;\n /** Called with every change to the values. */\n onValuesChange?: (values: MadlibsValues) => void;\n /**\n * Called by Use prompt once every required blank is filled, with the\n * assembled sentence. Put it in the composer for a final edit \u2014 the scaffold\n * never sends.\n */\n onUse?: (prompt: string, values: MadlibsValues) => void;\n /**\n * Called by Undo after the prompt was placed. Restore the composer\'s previous\n * draft; the scaffold returns to its blanks. Without it, no Undo is offered.\n */\n onUndo?: () => void;\n /** Controlled "placed in the composer" state. */\n placed?: boolean;\n /** Initial placed state when uncontrolled. */\n defaultPlaced?: boolean;\n /** Called when the placed state changes (Use prompt, Undo, Back to the blanks). */\n onPlacedChange?: (placed: boolean) => void;\n /** A value the agent inferred for an empty blank, shown marked until kept. */\n suggestion?: MadlibsSuggestion | null;\n /** Called when the person keeps the suggestion (its value becomes the blank\'s value). */\n onSuggestionKeep?: (suggestion: MadlibsSuggestion) => void;\n /** Called when the person clears the suggestion. */\n onSuggestionClear?: (suggestion: MadlibsSuggestion) => void;\n /** Who suggests values. Defaults to "the assistant". */\n agentName?: string;\n /** Overline above the sentence. Defaults to "Build your request". */\n heading?: React.ReactNode;\n /** Helper line under the heading. */\n description?: React.ReactNode;\n /** Small print beside Use prompt. Defaults to "Nothing is sent until you send it."; `null` hides it. */\n note?: React.ReactNode;\n /** Label of the use button. Defaults to "Use prompt". */\n submitLabel?: string;\n /** Overline once placed. Defaults to "Placed in the composer". */\n placedHeading?: React.ReactNode;\n /** Message once placed. */\n placedMessage?: React.ReactNode;\n /** Show the assembled request as it fills. Defaults to true. */\n showPreview?: boolean;\n /** Label of the assembled request. Defaults to "Preview". */\n previewLabel?: string;\n /** Layout. Defaults to "inline-dropdowns". */\n variant?: MadlibsVariant;\n /** Blank treatment. Defaults to "filled". */\n blankStyle?: MadlibsBlankStyle;\n /** Spacing. Defaults to "comfortable". */\n density?: MadlibsDensity;\n /** Flag missing required blanks from the start, as if Use prompt had been pressed. */\n defaultShowErrors?: boolean;\n}',
6310
+ extends: [
6311
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "defaultValue" | "onChange">'
6312
+ ],
6313
+ members: [
6314
+ {
6315
+ name: "template",
6316
+ type: "string",
6317
+ required: true,
6318
+ description: 'The scaffold sentence. `{id}` is a blank; `[ \u2026 ]` wraps an optional clause that leaves the sentence while its blank is empty: `"Summarize {document} for {audience}[, focusing on {topic}]."` Blanks outside a clause are required. Keep it to two\u2013four blanks \u2014 more is a form.'
6319
+ },
6320
+ {
6321
+ name: "blanks",
6322
+ type: "MadlibsBlank[]",
6323
+ required: true,
6324
+ description: "Label and options for each blank in the template."
6325
+ },
6326
+ {
6327
+ name: "values",
6328
+ type: "MadlibsValues",
6329
+ required: false,
6330
+ description: "Controlled values, keyed by blank id."
6331
+ },
6332
+ {
6333
+ name: "defaultValues",
6334
+ type: "MadlibsValues",
6335
+ required: false,
6336
+ description: "Initial values when uncontrolled."
6337
+ },
6338
+ {
6339
+ name: "onValuesChange",
6340
+ type: "(values: MadlibsValues) => void",
6341
+ required: false,
6342
+ description: "Called with every change to the values."
6343
+ },
6344
+ {
6345
+ name: "onUse",
6346
+ type: "(prompt: string, values: MadlibsValues) => void",
6347
+ required: false,
6348
+ description: "Called by Use prompt once every required blank is filled, with the assembled sentence. Put it in the composer for a final edit \u2014 the scaffold never sends."
6349
+ },
6350
+ {
6351
+ name: "onUndo",
6352
+ type: "() => void",
6353
+ required: false,
6354
+ description: "Called by Undo after the prompt was placed. Restore the composer's previous draft; the scaffold returns to its blanks. Without it, no Undo is offered."
6355
+ },
6356
+ {
6357
+ name: "placed",
6358
+ type: "boolean",
6359
+ required: false,
6360
+ description: 'Controlled "placed in the composer" state.'
6361
+ },
6362
+ {
6363
+ name: "defaultPlaced",
6364
+ type: "boolean",
6365
+ required: false,
6366
+ description: "Initial placed state when uncontrolled."
6367
+ },
6368
+ {
6369
+ name: "onPlacedChange",
6370
+ type: "(placed: boolean) => void",
6371
+ required: false,
6372
+ description: "Called when the placed state changes (Use prompt, Undo, Back to the blanks)."
6373
+ },
6374
+ {
6375
+ name: "suggestion",
6376
+ type: "MadlibsSuggestion | null",
6377
+ required: false,
6378
+ description: "A value the agent inferred for an empty blank, shown marked until kept."
6379
+ },
6380
+ {
6381
+ name: "onSuggestionKeep",
6382
+ type: "(suggestion: MadlibsSuggestion) => void",
6383
+ required: false,
6384
+ description: "Called when the person keeps the suggestion (its value becomes the blank's value)."
6385
+ },
6386
+ {
6387
+ name: "onSuggestionClear",
6388
+ type: "(suggestion: MadlibsSuggestion) => void",
6389
+ required: false,
6390
+ description: "Called when the person clears the suggestion."
6391
+ },
6392
+ {
6393
+ name: "agentName",
6394
+ type: "string",
6395
+ required: false,
6396
+ description: 'Who suggests values. Defaults to "the assistant".'
6397
+ },
6398
+ {
6399
+ name: "heading",
6400
+ type: "React.ReactNode",
6401
+ required: false,
6402
+ description: 'Overline above the sentence. Defaults to "Build your request".'
6403
+ },
6404
+ {
6405
+ name: "description",
6406
+ type: "React.ReactNode",
6407
+ required: false,
6408
+ description: "Helper line under the heading."
6409
+ },
6410
+ {
6411
+ name: "note",
6412
+ type: "React.ReactNode",
6413
+ required: false,
6414
+ description: 'Small print beside Use prompt. Defaults to "Nothing is sent until you send it."; `null` hides it.'
6415
+ },
6416
+ {
6417
+ name: "submitLabel",
6418
+ type: "string",
6419
+ required: false,
6420
+ description: 'Label of the use button. Defaults to "Use prompt".'
6421
+ },
6422
+ {
6423
+ name: "placedHeading",
6424
+ type: "React.ReactNode",
6425
+ required: false,
6426
+ description: 'Overline once placed. Defaults to "Placed in the composer".'
6427
+ },
6428
+ {
6429
+ name: "placedMessage",
6430
+ type: "React.ReactNode",
6431
+ required: false,
6432
+ description: "Message once placed."
6433
+ },
6434
+ {
6435
+ name: "showPreview",
6436
+ type: "boolean",
6437
+ required: false,
6438
+ description: "Show the assembled request as it fills. Defaults to true."
6439
+ },
6440
+ {
6441
+ name: "previewLabel",
6442
+ type: "string",
6443
+ required: false,
6444
+ description: 'Label of the assembled request. Defaults to "Preview".'
6445
+ },
6446
+ {
6447
+ name: "variant",
6448
+ type: "MadlibsVariant",
6449
+ required: false,
6450
+ description: 'Layout. Defaults to "inline-dropdowns".',
6451
+ values: [
6452
+ "inline-dropdowns",
6453
+ "form-rows",
6454
+ "chip-builder"
6455
+ ]
6456
+ },
6457
+ {
6458
+ name: "blankStyle",
6459
+ type: "MadlibsBlankStyle",
6460
+ required: false,
6461
+ description: 'Blank treatment. Defaults to "filled".',
6462
+ values: [
6463
+ "filled",
6464
+ "underline"
6465
+ ]
6466
+ },
6467
+ {
6468
+ name: "density",
6469
+ type: "MadlibsDensity",
6470
+ required: false,
6471
+ description: 'Spacing. Defaults to "comfortable".',
6472
+ values: [
6473
+ "comfortable",
6474
+ "compact"
6475
+ ]
6476
+ },
6477
+ {
6478
+ name: "defaultShowErrors",
6479
+ type: "boolean",
6480
+ required: false,
6481
+ description: "Flag missing required blanks from the start, as if Use prompt had been pressed."
6482
+ }
6483
+ ]
6484
+ }
6485
+ ],
6486
+ readme: '# @nucleux/madlibs\n\nMadlibs \u2014 a request written as a sentence with a few labelled blanks, filled and reviewed before it goes to the composer \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\nA fill-in-the-blank prompt scaffold: "Summarize [document] for [audience], focusing on [topic]." Each blank has a\nhuman label, suggested values and a free-text fallback; an optional clause (`[ \u2026 ]`) leaves the sentence while its\nblank is empty; the assembled request shows as it fills. An agent-suggested value stays marked until kept. Use prompt\nnames any missing blank in words (clearing nothing), otherwise hands the sentence to `onUse` for your composer \u2014 the\nscaffold never sends \u2014 and confirms with Undo.\n\n## Exports\n\n- **`Madlibs`** \u2014 the scaffold card\n- `useMadlibs`, `useMadlibsBlank` \u2014 the shared state machine and blank keyboard/ARIA wiring (used by `@nucleux/md3-madlibs`)\n- `parseMadlibsTemplate`, `getMadlibsBlanks`, `assembleMadlibsPrompt`, `madlibsBlankWidth` \u2014 template helpers\n- Types: `MadlibsProps`, `MadlibsBlank`, `MadlibsValues`, `MadlibsSuggestion`, `MadlibsVariant`, `MadlibsBlankStyle`, `MadlibsDensity`, `MadlibsStatus`, `MadlibsPart`, `MadlibsTemplatePart`, `MadlibsController`, `UseMadlibsBlankOptions`\n\n## Variants\n\n| `variant` | Use |\n| --- | --- |\n| `inline-dropdowns` (default) | A flowing sentence; each blank is an inline field with a list of values |\n| `form-rows` | One labelled row per blank, when each slot needs room |\n| `chip-builder` | Tap chips to fill the next blank; tap a filled chip to remove it |\n\n`blankStyle` (`filled` / `underline`) and `density` (`comfortable` / `compact`) adjust the look.\n\n## Keyboard\n\nEach blank is an editable combobox: type anything, or ArrowDown/ArrowUp to open and move through its values, Enter to\npick, Escape to close.\n\n## Install\n\n```bash\npnpm add @nucleux/madlibs @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Madlibs } from "@nucleux/madlibs";\nimport { OpenInput } from "@nucleux/open-input";\n\n<Madlibs\n template="Summarize {document} for {audience}[, focusing on {topic}]."\n blanks={[\n { id: "document", label: "Document", options: ["Q3 Customer Research", "September release notes"] },\n { id: "audience", label: "Audience", options: ["Leadership", "Engineering"] },\n { id: "topic", label: "Topic", options: ["Onboarding issues", "Pricing feedback"] },\n ]}\n suggestion={{ blank: "audience", value: "Leadership", reason: "the document\'s owner is the leadership team." }}\n onUse={(prompt) => { previous.current = draft; setDraft(prompt); }}\n onUndo={() => setDraft(previous.current)}\n/>\n<OpenInput aria-label="Message" value={draft} onValueChange={setDraft} onSubmit={send} />\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
6487
+ peerDependencies: {
6488
+ react: ">=18",
6489
+ "react-dom": ">=18"
6490
+ },
6491
+ twin: {
6492
+ name: "md3-madlibs",
6493
+ package: "@nucleux/md3-madlibs",
6494
+ component: "Md3Madlibs",
6495
+ sharesApi: true
6496
+ }
6497
+ },
6262
6498
  {
6263
6499
  name: "marker",
6264
6500
  package: "@nucleux/marker",
@@ -9118,6 +9354,56 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
9118
9354
  "react-dom": ">=18"
9119
9355
  }
9120
9356
  },
9357
+ {
9358
+ name: "md3-madlibs",
9359
+ package: "@nucleux/md3-madlibs",
9360
+ kind: "component",
9361
+ description: "Material 3 Madlibs \u2014 the same scaffold and API as `Madlibs` from\n`@nucleux/madlibs`: a sentence with labelled blanks (tonal inline fields\nthat settle into the sentence as they fill), optional clauses, the\nassembled request below, and Use prompt, which places the sentence in the\ncomposer (never sends) and confirms with Undo. An agent-suggested value is\nitalic, primary-tinted and marked until kept; a missing required blank\ngets an error outline and words, and keeps everything else.",
9362
+ summary: "Material 3 Madlibs \u2014 a request written as a sentence with a few labelled blanks, filled and reviewed before it goes to the composer \u2014 Nucleux agentic UI for React.",
9363
+ keywords: [
9364
+ "nucleux",
9365
+ "react",
9366
+ "ui",
9367
+ "components",
9368
+ "agentic",
9369
+ "ai",
9370
+ "tailwind",
9371
+ "md3",
9372
+ "material",
9373
+ "md3-madlibs",
9374
+ "madlibs",
9375
+ "prompt-scaffold",
9376
+ "fill-in-the-blank"
9377
+ ],
9378
+ exports: [
9379
+ "Md3Madlibs",
9380
+ "Md3MadlibsProps",
9381
+ "Md3MadlibsVariant",
9382
+ "Md3MadlibsBlankStyle",
9383
+ "Md3MadlibsDensity",
9384
+ "Md3MadlibsValues",
9385
+ "Md3MadlibsBlank",
9386
+ "Md3MadlibsSuggestion",
9387
+ "Md3MadlibsStatus"
9388
+ ],
9389
+ components: [
9390
+ "Md3Madlibs"
9391
+ ],
9392
+ import: 'import { Md3Madlibs } from "@nucleux/md3-madlibs";',
9393
+ installSingle: "pnpm add @nucleux/md3-madlibs @nucleux/tokens",
9394
+ props: [],
9395
+ readme: '# @nucleux/md3-madlibs\n\nMaterial 3 Madlibs \u2014 a request written as a sentence with a few labelled blanks, filled and reviewed before it goes to the composer \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n**Same API as the shadcn twin.** The props, callbacks, keyboard model and accessible names are those of [`@nucleux/madlibs`](https://www.npmjs.com/package/@nucleux/madlibs) (`Madlibs`) \u2014 the props types are re-exported from it and the state logic is shared \u2014 so you switch families by changing only the import. Only the look differs: tonal inline fields that settle into the sentence as they fill, an italic primary-tinted suggested value, an error outline with words, Material 3 colour roles, shape and state layers (motion reduced under `prefers-reduced-motion`).\n\n## Exports\n\n- **`Md3Madlibs`** \u2014 the scaffold card (variants `inline-dropdowns`, `form-rows`, `chip-builder`; `blankStyle` `filled` / `underline`; `density`)\n- Types: `Md3MadlibsProps`, `Md3MadlibsBlank`, `Md3MadlibsValues`, `Md3MadlibsSuggestion`, `Md3MadlibsVariant`, `Md3MadlibsBlankStyle`, `Md3MadlibsDensity`, `Md3MadlibsStatus`\n\n## Install\n\n```bash\npnpm add @nucleux/md3-madlibs @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Md3Madlibs } from "@nucleux/md3-madlibs";\nimport { Md3AgentComposer } from "@nucleux/md3-agent-composer";\n\n<Md3Madlibs\n template="Summarize {document} for {audience}[, focusing on {topic}]."\n blanks={blanks}\n description="Fill in the blanks \u2014 you can edit the whole sentence before sending."\n onUse={(prompt) => { previous.current = draft; setDraft(prompt); }}\n onUndo={() => setDraft(previous.current)}\n/>\n<Md3AgentComposer placeholder="Or write your own request\u2026" value={draft} onValueChange={setDraft} onSubmit={send} />\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
9396
+ peerDependencies: {
9397
+ react: ">=18",
9398
+ "react-dom": ">=18"
9399
+ },
9400
+ twin: {
9401
+ name: "madlibs",
9402
+ package: "@nucleux/madlibs",
9403
+ component: "Madlibs",
9404
+ sharesApi: true
9405
+ }
9406
+ },
9121
9407
  {
9122
9408
  name: "md3-mcp-connection",
9123
9409
  package: "@nucleux/md3-mcp-connection",
@@ -9359,6 +9645,68 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
9359
9645
  sharesApi: true
9360
9646
  }
9361
9647
  },
9648
+ {
9649
+ name: "md3-modes",
9650
+ package: "@nucleux/md3-modes",
9651
+ kind: "component",
9652
+ description: "Material 3 segmented control for Modes: an outlined track of segments, the\nactive one in secondary-container with a check. Same radio group and keyboard\nmodel as the shadcn `ModesSegmented` (Arrow keys move, Space/Enter choose).",
9653
+ summary: "Material 3 Modes \u2014 choose how the agent approaches a request (Brainstorm, Draft, Review, Plan), shown as a chip in the composer and switchable before sending \u2014 Nucleux agentic UI for React.",
9654
+ keywords: [
9655
+ "nucleux",
9656
+ "react",
9657
+ "ui",
9658
+ "components",
9659
+ "agentic",
9660
+ "ai",
9661
+ "tailwind",
9662
+ "md3",
9663
+ "material",
9664
+ "md3-modes",
9665
+ "modes",
9666
+ "mode-picker",
9667
+ "prompt-scaffolds"
9668
+ ],
9669
+ exports: [
9670
+ "Md3ModesSegmented",
9671
+ "Md3ModesList",
9672
+ "Md3ModesChip",
9673
+ "Md3ModesPicker",
9674
+ "Md3ModesNote",
9675
+ "Md3Modes",
9676
+ "Md3ModeOption",
9677
+ "Md3ModesNotice",
9678
+ "Md3ModesVariant",
9679
+ "Md3ModesSubmitDetails",
9680
+ "Md3ModesProps",
9681
+ "Md3ModesSegmentedProps",
9682
+ "Md3ModesListProps",
9683
+ "Md3ModesChipProps",
9684
+ "Md3ModesPickerProps",
9685
+ "Md3ModesNoteProps"
9686
+ ],
9687
+ components: [
9688
+ "Md3Modes",
9689
+ "Md3ModesSegmented",
9690
+ "Md3ModesList",
9691
+ "Md3ModesChip",
9692
+ "Md3ModesPicker",
9693
+ "Md3ModesNote"
9694
+ ],
9695
+ import: 'import { Md3Modes, Md3ModesSegmented, Md3ModesList, Md3ModesChip } from "@nucleux/md3-modes";',
9696
+ installSingle: "pnpm add @nucleux/md3-modes @nucleux/tokens",
9697
+ props: [],
9698
+ readme: '# @nucleux/md3-modes\n\nMaterial 3 Modes \u2014 choose how the agent approaches a request (Brainstorm, Draft, Review, Plan), shown as a chip in the composer and switchable before sending \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n**Same API as the shadcn twin.** The props, callbacks, states, keyboard model and accessible names are those of [`@nucleux/modes`](https://www.npmjs.com/package/@nucleux/modes) (`Modes`) \u2014 the props types are re-exported from it and the state logic (`useModes`) is shared \u2014 so you switch families by changing only the import. Only the look differs: Material 3 colour roles, shape, elevation, state layers and motion (reduced under `prefers-reduced-motion`). In the `composer` variant the Mode chip sits in an `Md3AgentComposer` toolbar and the picker grows up from the composer.\n\n## Exports\n\n- **`Md3Modes`** \u2014 the whole pattern (`variant`: `composer` \xB7 `segmented` \xB7 `list` \xB7 `chip`)\n- **`Md3ModesSegmented`** \u2014 an `Md3SegmentedButton` of modes (radio group)\n- **`Md3ModesList`** \u2014 mode rows: 40dp icon tile, name, what changes, unavailable reason, trailing check\n- **`Md3ModesChip`** \u2014 outlined "Mode \u25BE" assist chip, or tonal "Mode **Plan** \u25BE \xD7" once set\n- **`Md3ModesPicker`** \u2014 the menu-surface dialog: heading, rows, error-container alert, "No mode"\n- **`Md3ModesNote`** \u2014 "Mode changed to \u2026 Your text is unchanged." with Undo\n- Types: `Md3ModesProps`, `Md3ModeOption`, `Md3ModesVariant`, `Md3ModesNotice`, `Md3ModesSubmitDetails`, and each sub-component\'s `Md3\u2026Props`\n\n## Install\n\n```bash\npnpm add @nucleux/md3-modes @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Md3Modes } from "@nucleux/md3-modes";\nimport { Flag, Lightbulb, NotebookPen, Eye } from "lucide-react";\n\n<Md3Modes\n modes={[\n { id: "brainstorm", name: "Brainstorm", icon: <Lightbulb />, description: "Explore several possible directions." },\n { id: "draft", name: "Draft", icon: <NotebookPen />, description: "Write a first version you can edit." },\n { id: "review", name: "Review", icon: <Eye />, description: "Check existing work for gaps and risks." },\n { id: "plan", name: "Plan", icon: <Flag />, description: "Break the work into steps with owners and dates." },\n ]}\n onSubmit={(text, { mode }) => send(text, { mode: mode?.id })}\n/>\n```\n\n`sendLabel` is accepted for API parity; the send button is named by `Md3AgentComposer` ("Send").\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
9699
+ peerDependencies: {
9700
+ react: ">=18",
9701
+ "react-dom": ">=18"
9702
+ },
9703
+ twin: {
9704
+ name: "modes",
9705
+ package: "@nucleux/modes",
9706
+ component: "Modes",
9707
+ sharesApi: true
9708
+ }
9709
+ },
9362
9710
  {
9363
9711
  name: "md3-name",
9364
9712
  package: "@nucleux/md3-name",
@@ -9822,6 +10170,59 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
9822
10170
  sharesApi: true
9823
10171
  }
9824
10172
  },
10173
+ {
10174
+ name: "md3-preset-styles",
10175
+ package: "@nucleux/md3-preset-styles",
10176
+ kind: "component",
10177
+ description: 'The Material 3 twin of `PresetStyles` \u2014 same props, states, keyboard model\nand accessible names (they share `usePresetStyles`). In `variant="menu"` the\nStyle control sits in `Md3AgentComposer`\'s toolbar and opens "Use style": a\nmenu surface with the styles on the left (secondary-container for the chosen\none, a state layer for the one being previewed) and a sample reply on the\nright that follows pointer and focus; Create & edit styles opens an outlined\ncard with a segmented "Start from", a linear progress while the app\ngenerates, then a review card with filled text fields and Save / Save and\nuse. `"grid"` and `"list"` draw the swatches on M3 container roles with a\nprimary outline for the chosen one. Motion is reduced under\n`prefers-reduced-motion`.',
10178
+ summary: "Material 3 Preset Styles \u2014 named styles for how replies are written, previewed and switchable mid-conversation \u2014 Nucleux agentic UI for React.",
10179
+ keywords: [
10180
+ "nucleux",
10181
+ "react",
10182
+ "ui",
10183
+ "components",
10184
+ "agentic",
10185
+ "ai",
10186
+ "tailwind",
10187
+ "md3",
10188
+ "material",
10189
+ "md3-preset-styles",
10190
+ "preset-styles",
10191
+ "styles",
10192
+ "style-picker",
10193
+ "prompt-scaffold"
10194
+ ],
10195
+ exports: [
10196
+ "Md3PresetStyles",
10197
+ "Md3PresetStylesProps",
10198
+ "Md3PresetStylesVariant",
10199
+ "Md3PresetStylesView",
10200
+ "Md3PresetStylesNotice",
10201
+ "Md3PresetStyle",
10202
+ "Md3PresetStyleSwatch",
10203
+ "Md3PresetStyleReference",
10204
+ "Md3PresetStyleRequest",
10205
+ "Md3PresetStyleDraft",
10206
+ "Md3PresetStyleSource"
10207
+ ],
10208
+ components: [
10209
+ "Md3PresetStyles"
10210
+ ],
10211
+ import: 'import { Md3PresetStyles } from "@nucleux/md3-preset-styles";',
10212
+ installSingle: "pnpm add @nucleux/md3-preset-styles @nucleux/tokens",
10213
+ props: [],
10214
+ readme: '# @nucleux/md3-preset-styles\n\nMaterial 3 Preset Styles \u2014 named styles for how replies are written, previewed and switchable mid-conversation \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n**Same API as the shadcn twin.** The props, callbacks, keyboard model, states and accessible names are those of [`@nucleux/preset-styles`](https://www.npmjs.com/package/@nucleux/preset-styles) (`PresetStyles`) \u2014 the props types are re-exported from it and both run on its `usePresetStyles` \u2014 so you switch families by changing only the import. Only the look differs: Material 3 colour roles, shape, elevation, state layers and motion (reduced under `prefers-reduced-motion`).\n\n## Exports\n\n- **`Md3PresetStyles`** \u2014 `variant="menu"`: the Style control in `Md3AgentComposer`\'s toolbar opens "Use style" \u2014 styles on the left (secondary-container for the chosen one), a sample reply on the right that follows pointer and focus, Create & edit styles (an outlined card with a segmented "Start from", linear progress, then a review card with filled text fields). `"grid"` / `"list"`: swatches on M3 container roles with a primary outline.\n- Types: `Md3PresetStylesProps`, `Md3PresetStyle`, `Md3PresetStylesVariant`, `Md3PresetStylesView`, `Md3PresetStylesNotice`, `Md3PresetStyleSwatch`, `Md3PresetStyleReference`, `Md3PresetStyleRequest`, `Md3PresetStyleDraft`, `Md3PresetStyleSource`\n\n## Install\n\n```bash\npnpm add @nucleux/md3-preset-styles @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Md3PresetStyles } from "@nucleux/md3-preset-styles";\n\n<Md3PresetStyles\n variant="menu"\n styles={styles}\n previewPrompt="Summarize the October release."\n onGenerateStyle={(req) => api.generateStyle(req)}\n onSubmit={(text, style) => send(text, { style })}\n/>\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
10215
+ peerDependencies: {
10216
+ react: ">=18",
10217
+ "react-dom": ">=18"
10218
+ },
10219
+ twin: {
10220
+ name: "preset-styles",
10221
+ package: "@nucleux/preset-styles",
10222
+ component: "PresetStyles",
10223
+ sharesApi: true
10224
+ }
10225
+ },
9825
10226
  {
9826
10227
  name: "md3-proactive",
9827
10228
  package: "@nucleux/md3-proactive",
@@ -9962,6 +10363,57 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
9962
10363
  sharesApi: false
9963
10364
  }
9964
10365
  },
10366
+ {
10367
+ name: "md3-prompt-enhancer",
10368
+ package: "@nucleux/md3-prompt-enhancer",
10369
+ kind: "component",
10370
+ description: "The Material 3 Prompt Enhancer: an Improve-style tool in the\n`Md3AgentComposer` toolbar proposes a clearer version of the request, shown\nin an outlined card above the composer \u2014 what they wrote beside the\nsuggestion, every addition highlighted in primary-container and explained,\nassumptions labelled, each change removable with a checkbox. Use updates the\ncomposer with Undo and sends nothing; Edit, Keep original and a failure line\nthat leaves the original untouched are built in. Same API, states and\naccessible names as `PromptEnhancer` from `@nucleux/prompt-enhancer`.",
10371
+ summary: "Material 3 Prompt Enhancer \u2014 proposes a clearer version of the request you wrote, every addition marked and explained \u2014 Nucleux agentic UI for React.",
10372
+ keywords: [
10373
+ "nucleux",
10374
+ "react",
10375
+ "ui",
10376
+ "components",
10377
+ "agentic",
10378
+ "ai",
10379
+ "tailwind",
10380
+ "md3",
10381
+ "material",
10382
+ "md3-prompt-enhancer",
10383
+ "prompt-enhancer",
10384
+ "prompt",
10385
+ "enhance",
10386
+ "prompt-scaffold"
10387
+ ],
10388
+ exports: [
10389
+ "Md3PromptEnhancer",
10390
+ "Md3PromptEnhancerProps",
10391
+ "Md3PromptEnhancerVariant",
10392
+ "Md3PromptEnhancerState",
10393
+ "Md3PromptEnhancerDiffStyle",
10394
+ "Md3PromptEnhancerChange",
10395
+ "Md3PromptEnhancerSuggestion",
10396
+ "Md3PromptEnhancerSegment",
10397
+ "Md3PromptEnhancerController"
10398
+ ],
10399
+ components: [
10400
+ "Md3PromptEnhancer"
10401
+ ],
10402
+ import: 'import { Md3PromptEnhancer } from "@nucleux/md3-prompt-enhancer";',
10403
+ installSingle: "pnpm add @nucleux/md3-prompt-enhancer @nucleux/tokens",
10404
+ props: [],
10405
+ readme: '# @nucleux/md3-prompt-enhancer\n\nMaterial 3 Prompt Enhancer \u2014 proposes a clearer version of the request you wrote, every addition marked and explained \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n**Same API as the shadcn twin.** The props, callbacks, states, keyboard model and accessible names are those of [`@nucleux/prompt-enhancer`](https://www.npmjs.com/package/@nucleux/prompt-enhancer) (`PromptEnhancer`) \u2014 the props types are re-exported from it and the logic is its `usePromptEnhancer` \u2014 so you switch families by changing only the import. Only the look differs: an outlined review card above an `Md3AgentComposer`, primary-container highlights, M3 checkboxes, text/outlined/filled buttons, state layers and motion (reduced under `prefers-reduced-motion`).\n\n## Exports\n\n- **`Md3PromptEnhancer`** \u2014 the composer with an Enhance tool, the review card and status lines\n- Types: `Md3PromptEnhancerProps`, `Md3PromptEnhancerVariant`, `Md3PromptEnhancerState`, `Md3PromptEnhancerDiffStyle`, `Md3PromptEnhancerChange`, `Md3PromptEnhancerSuggestion`, `Md3PromptEnhancerSegment`, `Md3PromptEnhancerController`\n\n## Install\n\n```bash\npnpm add @nucleux/md3-prompt-enhancer @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Md3PromptEnhancer } from "@nucleux/md3-prompt-enhancer";\n\n<Md3PromptEnhancer\n value={draft}\n onValueChange={setDraft}\n onEnhance={(prompt, { signal }) => api.enhance(prompt, { signal })}\n onSubmit={send}\n/>\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
10406
+ peerDependencies: {
10407
+ react: ">=18",
10408
+ "react-dom": ">=18"
10409
+ },
10410
+ twin: {
10411
+ name: "prompt-enhancer",
10412
+ package: "@nucleux/prompt-enhancer",
10413
+ component: "PromptEnhancer",
10414
+ sharesApi: true
10415
+ }
10416
+ },
9965
10417
  {
9966
10418
  name: "md3-radio",
9967
10419
  package: "@nucleux/md3-radio",
@@ -10806,11 +11258,11 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
10806
11258
  }
10807
11259
  },
10808
11260
  {
10809
- name: "md3-switch",
10810
- package: "@nucleux/md3-switch",
11261
+ name: "md3-suggestions",
11262
+ package: "@nucleux/md3-suggestions",
10811
11263
  kind: "component",
10812
- description: "A Material Design 3 switch with a growing handle and optional check icon.",
10813
- summary: "Material 3 switch \u2014 Nucleux agentic UI for React.",
11264
+ description: 'The Material 3 suggestions row \u2014 the same API and behaviour as\n`Suggestions`: at most three verb-labelled chips above the composer\n("compose"), under an answer ("follow-up") or as a floating toolbar on a\nselection ("selection"). The row is headed by the agent\'s mark and name\n(`label`, "Aria suggests") with an info icon button that reveals why\n(`reason`) and a close icon button (Escape too); compose chips are outlined\nM3 suggestion chips with a leading primary add icon and the standard state\nlayer. Choosing a chip only calls `onSelect` \u2014 never sends \u2014 and `status`\nswaps the row for a one-line confirmation with a text Undo, a dismissed or\nno-longer-relevant line, a loading indicator or an error-container line\nwith Retry. Arrow keys, Home and End move between chips; motion is reduced\nunder `prefers-reduced-motion`.',
11265
+ summary: "Material 3 Suggestions \u2014 agent-marked suggestion chips above the composer that add to the request, never send it \u2014 Nucleux agentic UI for React.",
10814
11266
  keywords: [
10815
11267
  "nucleux",
10816
11268
  "react",
@@ -10819,16 +11271,66 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
10819
11271
  "agentic",
10820
11272
  "ai",
10821
11273
  "tailwind",
10822
- "md3-switch"
11274
+ "md3",
11275
+ "material",
11276
+ "md3-suggestions",
11277
+ "suggestions",
11278
+ "prompt-scaffold",
11279
+ "chips"
10823
11280
  ],
10824
11281
  exports: [
10825
- "Md3Switch",
10826
- "Md3SwitchProps"
11282
+ "Md3Suggestions",
11283
+ "Md3SuggestionsComposer",
11284
+ "Md3SuggestionsProps",
11285
+ "Md3SuggestionsComposerProps",
11286
+ "Md3SuggestionItem",
11287
+ "Md3SuggestionsVariant",
11288
+ "Md3SuggestionsStatus",
11289
+ "Md3SuggestionsMessages"
10827
11290
  ],
10828
11291
  components: [
10829
- "Md3Switch"
11292
+ "Md3Suggestions",
11293
+ "Md3SuggestionsComposer"
10830
11294
  ],
10831
- import: 'import { Md3Switch } from "@nucleux/md3-switch";',
11295
+ import: 'import { Md3Suggestions, Md3SuggestionsComposer } from "@nucleux/md3-suggestions";',
11296
+ installSingle: "pnpm add @nucleux/md3-suggestions @nucleux/tokens",
11297
+ props: [],
11298
+ readme: '# @nucleux/md3-suggestions\n\nMaterial 3 Suggestions \u2014 agent-marked suggestion chips above the composer that add to the request, never send it \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n**Same API as the shadcn twin.** The props, callbacks, keyboard model, states and accessible names are those of [`@nucleux/suggestions`](https://www.npmjs.com/package/@nucleux/suggestions) (`Suggestions`, `SuggestionsComposer`) \u2014 the props types are re-exported from it and the state logic is shared \u2014 so you switch families by changing only the import. Only the look differs: Material 3 colour roles, outlined suggestion chips with a primary add icon, state layers, a raised composer card, and motion reduced under `prefers-reduced-motion`.\n\n## Exports\n\n- **`Md3Suggestions`** \u2014 the "Aria suggests" chip row with Why and Dismiss icon buttons, its status lines (added with Undo, dismissed, no longer relevant, loading, error with Retry), plus `follow-up` and `selection` variants\n- **`Md3SuggestionsComposer`** \u2014 the row wired to `Md3AgentComposer`\n- Re-exported helpers: `appendSuggestion`, `suggestionsMessages`\n- Types: `Md3SuggestionsProps`, `Md3SuggestionsComposerProps`, `Md3SuggestionItem`, `Md3SuggestionsVariant`, `Md3SuggestionsStatus`, `Md3SuggestionsMessages`\n\n## Install\n\n```bash\npnpm add @nucleux/md3-suggestions @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Md3SuggestionsComposer } from "@nucleux/md3-suggestions";\n\n<Md3SuggestionsComposer\n defaultValue="Summarize the September release."\n label="Aria suggests"\n reason="Release summaries are read to decide what still needs attention."\n suggestions={[\n { label: "Include unresolved blockers" },\n { label: "Group the work by owner" },\n { label: "Compare with the August release" },\n ]}\n isRelevant={(draft) => /release/i.test(draft)}\n onSubmit={send}\n/>\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
11299
+ peerDependencies: {
11300
+ react: ">=18",
11301
+ "react-dom": ">=18"
11302
+ },
11303
+ twin: {
11304
+ name: "suggestions",
11305
+ package: "@nucleux/suggestions",
11306
+ component: "Suggestions",
11307
+ sharesApi: true
11308
+ }
11309
+ },
11310
+ {
11311
+ name: "md3-switch",
11312
+ package: "@nucleux/md3-switch",
11313
+ kind: "component",
11314
+ description: "A Material Design 3 switch with a growing handle and optional check icon.",
11315
+ summary: "Material 3 switch \u2014 Nucleux agentic UI for React.",
11316
+ keywords: [
11317
+ "nucleux",
11318
+ "react",
11319
+ "ui",
11320
+ "components",
11321
+ "agentic",
11322
+ "ai",
11323
+ "tailwind",
11324
+ "md3-switch"
11325
+ ],
11326
+ exports: [
11327
+ "Md3Switch",
11328
+ "Md3SwitchProps"
11329
+ ],
11330
+ components: [
11331
+ "Md3Switch"
11332
+ ],
11333
+ import: 'import { Md3Switch } from "@nucleux/md3-switch";',
10832
11334
  installSingle: "pnpm add @nucleux/md3-switch @nucleux/tokens",
10833
11335
  props: [
10834
11336
  {
@@ -11541,6 +12043,49 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
11541
12043
  sharesApi: true
11542
12044
  }
11543
12045
  },
12046
+ {
12047
+ name: "md3-voice-tone",
12048
+ package: "@nucleux/md3-voice-tone",
12049
+ kind: "component",
12050
+ description: 'Voice & Tone in Material 3 \u2014 the twin of `VoiceTone`, with the same props, callbacks, keyboard\nmodel and accessible names (the logic is `useVoiceTone` from `@nucleux/voice-tone`). In the\ncomposer (`variant="composer"`), a Tone chip sits in the `Md3AgentComposer` toolbar: closed it is\nan outlined assist chip; set, it takes the secondary-container role and reads \u201CTone Professional\u201D\nwith a chevron to change and \xD7 to remove (with Undo). It opens a surface-container picker of tone\ncards \u2014 the chosen card gets a 2px primary outline and a check \u2014 with a sample line that follows\nfocus and hover, the agent\'s recommendation marked but never applied, and an outlined \u201COr describe\na tone\u201D field. `variant="settings"` is the same choice as an outlined card with a rules list of\n`Md3Checkbox`es and a sample sentence. Tone travels beside the prompt as a setting; the prompt text\nis never edited, and state layers and motion respect `prefers-reduced-motion`.',
12051
+ summary: "Material 3 Voice & Tone \u2014 say how the reply should sound (tone cards, a rules list, a sample line), shown as a Tone chip in the composer and never editing the prompt \u2014 Nucleux agentic UI for React.",
12052
+ keywords: [
12053
+ "nucleux",
12054
+ "react",
12055
+ "ui",
12056
+ "components",
12057
+ "agentic",
12058
+ "ai",
12059
+ "tailwind",
12060
+ "md3",
12061
+ "material",
12062
+ "md3-voice-tone",
12063
+ "voice-tone",
12064
+ "tone",
12065
+ "prompt-scaffold"
12066
+ ],
12067
+ exports: [
12068
+ "Md3VoiceTone",
12069
+ "Md3VoiceToneProps"
12070
+ ],
12071
+ components: [
12072
+ "Md3VoiceTone"
12073
+ ],
12074
+ import: 'import { Md3VoiceTone } from "@nucleux/md3-voice-tone";',
12075
+ installSingle: "pnpm add @nucleux/md3-voice-tone @nucleux/tokens",
12076
+ props: [],
12077
+ readme: '# @nucleux/md3-voice-tone\n\nMaterial 3 Voice & Tone \u2014 say how the reply should sound (tone cards, a rules list, a sample line), shown as a Tone chip in the composer and never editing the prompt \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n**Same API as the shadcn twin.** The props, callbacks, keyboard model and accessible names are those of [`@nucleux/voice-tone`](https://www.npmjs.com/package/@nucleux/voice-tone) (`VoiceTone`) \u2014 the props types are re-exported from it and the logic is its `useVoiceTone` \u2014 so you switch families by changing only the import. Only the look differs: Material 3 colour roles, shape, elevation, state layers and motion (reduced under `prefers-reduced-motion`).\n\n## Exports\n\n- **`Md3VoiceTone`** \u2014 a Tone chip in `Md3AgentComposer` (outlined assist chip; set, a secondary-container chip \u201CTone Professional\u201D with change and remove) opening a surface-container picker of tone cards with a sample line, the recommendation marked and an outlined \u201COr describe a tone\u201D field; or (`variant="settings"`) an outlined card with tone presets, `Md3Checkbox` rules and a sample sentence\n- Re-exported from the twin: `useVoiceTone`, `defaultVoiceTones`, `defaultVoiceToneRules`, `VOICE_TONE_CUSTOM`\n- Types: `Md3VoiceToneProps`, `VoiceToneOption`, `VoiceToneRule`, `VoiceToneSetting`, `VoiceToneVariant`, `VoiceToneLayout`, `VoiceToneNotice`, `VoiceToneState`\n\n## Install\n\n```bash\npnpm add @nucleux/md3-voice-tone @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Md3VoiceTone } from "@nucleux/md3-voice-tone";\n\n<Md3VoiceTone\n variant="composer"\n defaultValue="professional"\n onSubmit={(text, setting) => send(text, { tone: setting })}\n/>\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
12078
+ peerDependencies: {
12079
+ react: ">=18",
12080
+ "react-dom": ">=18"
12081
+ },
12082
+ twin: {
12083
+ name: "voice-tone",
12084
+ package: "@nucleux/voice-tone",
12085
+ component: "VoiceTone",
12086
+ sharesApi: true
12087
+ }
12088
+ },
11544
12089
  {
11545
12090
  name: "menubar",
11546
12091
  package: "@nucleux/menubar",
@@ -11886,11 +12431,11 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
11886
12431
  }
11887
12432
  },
11888
12433
  {
11889
- name: "name",
11890
- package: "@nucleux/name",
12434
+ name: "modes",
12435
+ package: "@nucleux/modes",
11891
12436
  kind: "component",
11892
- description: 'The agent\'s name, presented consistently so it can be referred to,\ntalked to and remembered ("Ask Aria to summarise this"). Three variants:\n`wordmark`, `name-status` ("Aria is drafting", announced politely) and\n`name-avatar-lockup` (the AgentAvatar mark with name and descriptor).\nThe descriptor keeps the name honest by saying what the agent is.',
11893
- summary: "Name \u2014 a consistent name and role for the AI so it can be referred to and remembered \u2014 Nucleux agentic UI for React.",
12437
+ description: "The segmented control: three or four labelled segments in a bordered track,\nthe active one filled with the primary colour. A radio group with roving\nfocus (Arrow keys move, Space/Enter choose).",
12438
+ summary: "Modes \u2014 choose how the agent works on a request (Fast, Balanced, Deep research), shown in the composer and switchable before sending \u2014 Nucleux agentic UI for React.",
11894
12439
  keywords: [
11895
12440
  "nucleux",
11896
12441
  "react",
@@ -11899,168 +12444,608 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
11899
12444
  "agentic",
11900
12445
  "ai",
11901
12446
  "tailwind",
11902
- "name"
12447
+ "modes",
12448
+ "mode-picker",
12449
+ "prompt-scaffolds"
11903
12450
  ],
11904
12451
  exports: [
11905
- "AgentName",
11906
- "AgentNameVariant",
11907
- "AgentNameProps"
12452
+ "useModes",
12453
+ "useModesRoving",
12454
+ "useModesDismiss",
12455
+ "modesLabels",
12456
+ "modeSupportingText",
12457
+ "ModesSegmented",
12458
+ "ModesList",
12459
+ "ModesChip",
12460
+ "ModesPicker",
12461
+ "ModesNote",
12462
+ "Modes",
12463
+ "ModeOption",
12464
+ "ModesNotice",
12465
+ "ModesVariant",
12466
+ "UseModesOptions",
12467
+ "ModesState",
12468
+ "ModesSegmentedProps",
12469
+ "ModesListProps",
12470
+ "ModesChipProps",
12471
+ "ModesPickerProps",
12472
+ "ModesNoteProps",
12473
+ "ModesSubmitDetails",
12474
+ "ModesProps"
11908
12475
  ],
11909
12476
  components: [
11910
- "AgentName"
11911
- ],
11912
- import: 'import { AgentName } from "@nucleux/name";',
11913
- installSingle: "pnpm add @nucleux/name @nucleux/tokens",
12477
+ "Modes",
12478
+ "ModesSegmented",
12479
+ "ModesList",
12480
+ "ModesChip",
12481
+ "ModesPicker",
12482
+ "ModesNote"
12483
+ ],
12484
+ import: 'import { Modes, ModesSegmented, ModesList, ModesChip } from "@nucleux/modes";',
12485
+ installSingle: "pnpm add @nucleux/modes @nucleux/tokens",
11914
12486
  props: [
11915
12487
  {
11916
- name: "AgentNameProps",
11917
- source: 'export interface AgentNameProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The agent\'s proper name \u2014 short (\u2264 12 characters), pronounceable, capitalised the same everywhere. Not a real person\'s name. */\n name: string;\n /**\n * `wordmark` (the name in product type, for headers and brand contexts),\n * `name-status` (the name with what the agent is doing now) or\n * `name-avatar-lockup` (mark + name, for attribution rows and signatures).\n * Default `name-avatar-lockup`.\n */\n variant?: AgentNameVariant;\n /** What the agent is, in product words: "Intelligaia agent", "Meeting Intelligence Agent". Defaults to "AI agent". On compact surfaces it stays in the accessible name. */\n descriptor?: React.ReactNode;\n /**\n * `name-status`: what the agent is doing, as a verb phrase \u2014 "drafting",\n * "thinking". Rendered as "Aria is drafting" in a polite live region.\n * Omit for an idle agent ("Aria").\n */\n status?: string;\n /** `name-status`: show the working dots (and the working ring on the mark). Defaults to `true` when `status` is set. */\n working?: boolean;\n /** Previous name after a rename, shown as "formerly Aria" for a while. */\n formerName?: string;\n /** Image for the agent mark (`name-status`, `name-avatar-lockup`). */\n avatarSrc?: string;\n /** Glyph for the agent mark when there is no image. Defaults to the reserved AI sparkle. */\n avatarGlyph?: React.ReactNode;\n}',
12488
+ name: "ModesSegmentedProps",
12489
+ source: 'export interface ModesSegmentedProps\n extends ModesGroupBase,\n Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect" | "defaultValue"> {}',
11918
12490
  extends: [
11919
- "React.HTMLAttributes<HTMLDivElement>"
12491
+ "ModesGroupBase",
12492
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect" | "defaultValue">'
12493
+ ],
12494
+ members: []
12495
+ },
12496
+ {
12497
+ name: "ModesListProps",
12498
+ source: `export interface ModesListProps
12499
+ extends ModesGroupBase,
12500
+ Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect" | "defaultValue"> {
12501
+ /** Show each mode's description (meta such as latency always shows). Defaults to true. */
12502
+ showDescriptions?: boolean;
12503
+ /** Draw the rows as a bordered card with dividers (default) or as bare menu rows. */
12504
+ framed?: boolean;
12505
+ }`,
12506
+ extends: [
12507
+ "ModesGroupBase",
12508
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect" | "defaultValue">'
11920
12509
  ],
11921
12510
  members: [
11922
12511
  {
11923
- name: "name",
11924
- type: "string",
12512
+ name: "showDescriptions",
12513
+ type: "boolean",
12514
+ required: false,
12515
+ description: "Show each mode's description (meta such as latency always shows). Defaults to true.",
12516
+ default: "true"
12517
+ },
12518
+ {
12519
+ name: "framed",
12520
+ type: "boolean",
12521
+ required: false,
12522
+ description: "Draw the rows as a bordered card with dividers (default) or as bare menu rows.",
12523
+ default: "true"
12524
+ }
12525
+ ]
12526
+ },
12527
+ {
12528
+ name: "ModesChipProps",
12529
+ source: 'export interface ModesChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "children"> {\n /** The active mode, or null (the chip then reads just the label). */\n mode: ModeOption | null;\n /** The setting\'s name. Defaults to "Mode". */\n label?: string;\n /** Whether the picker it controls is open (sets `aria-expanded`). */\n open?: boolean;\n /** Shows a remove button that clears the mode. */\n onRemove?: () => void;\n}',
12530
+ extends: [
12531
+ 'Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "children">'
12532
+ ],
12533
+ members: [
12534
+ {
12535
+ name: "mode",
12536
+ type: "ModeOption | null",
11925
12537
  required: true,
11926
- description: "The agent's proper name \u2014 short (\u2264 12 characters), pronounceable, capitalised the same everywhere. Not a real person's name."
12538
+ description: "The active mode, or null (the chip then reads just the label)."
11927
12539
  },
11928
12540
  {
11929
- name: "variant",
11930
- type: "AgentNameVariant",
12541
+ name: "label",
12542
+ type: "string",
11931
12543
  required: false,
11932
- description: "`wordmark` (the name in product type, for headers and brand contexts), `name-status` (the name with what the agent is doing now) or `name-avatar-lockup` (mark + name, for attribution rows and signatures). Default `name-avatar-lockup`.",
11933
- values: [
11934
- "wordmark",
11935
- "name-status",
11936
- "name-avatar-lockup"
11937
- ],
11938
- default: '"name-avatar-lockup"'
12544
+ description: `The setting's name. Defaults to "Mode".`,
12545
+ default: '"Mode"'
11939
12546
  },
11940
12547
  {
11941
- name: "descriptor",
11942
- type: "React.ReactNode",
12548
+ name: "open",
12549
+ type: "boolean",
11943
12550
  required: false,
11944
- description: 'What the agent is, in product words: "Intelligaia agent", "Meeting Intelligence Agent". Defaults to "AI agent". On compact surfaces it stays in the accessible name.',
11945
- default: '"AI agent"'
12551
+ description: "Whether the picker it controls is open (sets `aria-expanded`).",
12552
+ default: "false"
11946
12553
  },
11947
12554
  {
11948
- name: "status",
11949
- type: "string",
12555
+ name: "onRemove",
12556
+ type: "() => void",
11950
12557
  required: false,
11951
- description: '`name-status`: what the agent is doing, as a verb phrase \u2014 "drafting", "thinking". Rendered as "Aria is drafting" in a polite live region. Omit for an idle agent ("Aria").'
12558
+ description: "Shows a remove button that clears the mode."
12559
+ }
12560
+ ]
12561
+ },
12562
+ {
12563
+ name: "ModesPickerProps",
12564
+ source: `export interface ModesPickerProps
12565
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect" | "defaultValue" | "title"> {
12566
+ modes: ModeOption[];
12567
+ value: string | null;
12568
+ onSelect: (id: string) => void;
12569
+ /** Shows "No mode" while a mode is active. */
12570
+ onClear?: () => void;
12571
+ /** Called on Escape. */
12572
+ onClose?: () => void;
12573
+ /** The setting's name, used for the heading and accessible names. Defaults to "Mode". */
12574
+ label?: string;
12575
+ /** One line under the heading. */
12576
+ description?: React.ReactNode;
12577
+ /** The unavailable mode the person just tried, if any; its reason shows as an alert. */
12578
+ rejected?: ModeOption | null;
12579
+ showDescriptions?: boolean;
12580
+ /** Move focus to the active (or first) mode when it mounts. */
12581
+ autoFocus?: boolean;
12582
+ }`,
12583
+ extends: [
12584
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect" | "defaultValue" | "title">'
12585
+ ],
12586
+ members: [
12587
+ {
12588
+ name: "modes",
12589
+ type: "ModeOption[]",
12590
+ required: true
11952
12591
  },
11953
12592
  {
11954
- name: "working",
11955
- type: "boolean",
12593
+ name: "value",
12594
+ type: "string | null",
12595
+ required: true
12596
+ },
12597
+ {
12598
+ name: "onSelect",
12599
+ type: "(id: string) => void",
12600
+ required: true
12601
+ },
12602
+ {
12603
+ name: "onClear",
12604
+ type: "() => void",
11956
12605
  required: false,
11957
- description: "`name-status`: show the working dots (and the working ring on the mark). Defaults to `true` when `status` is set."
12606
+ description: 'Shows "No mode" while a mode is active.'
11958
12607
  },
11959
12608
  {
11960
- name: "formerName",
11961
- type: "string",
12609
+ name: "onClose",
12610
+ type: "() => void",
11962
12611
  required: false,
11963
- description: 'Previous name after a rename, shown as "formerly Aria" for a while.'
12612
+ description: "Called on Escape."
11964
12613
  },
11965
12614
  {
11966
- name: "avatarSrc",
12615
+ name: "label",
11967
12616
  type: "string",
11968
12617
  required: false,
11969
- description: "Image for the agent mark (`name-status`, `name-avatar-lockup`)."
12618
+ description: `The setting's name, used for the heading and accessible names. Defaults to "Mode".`,
12619
+ default: '"Mode"'
11970
12620
  },
11971
12621
  {
11972
- name: "avatarGlyph",
12622
+ name: "description",
11973
12623
  type: "React.ReactNode",
11974
12624
  required: false,
11975
- description: "Glyph for the agent mark when there is no image. Defaults to the reserved AI sparkle."
12625
+ description: "One line under the heading.",
12626
+ default: '"How the agent approaches this request. Model and effort stay as they are."'
12627
+ },
12628
+ {
12629
+ name: "rejected",
12630
+ type: "ModeOption | null",
12631
+ required: false,
12632
+ description: "The unavailable mode the person just tried, if any; its reason shows as an alert."
12633
+ },
12634
+ {
12635
+ name: "showDescriptions",
12636
+ type: "boolean",
12637
+ required: false,
12638
+ default: "true"
12639
+ },
12640
+ {
12641
+ name: "autoFocus",
12642
+ type: "boolean",
12643
+ required: false,
12644
+ description: "Move focus to the active (or first) mode when it mounts.",
12645
+ default: "false"
11976
12646
  }
11977
12647
  ]
11978
- }
11979
- ],
11980
- readme: '# @nucleux/name\n\nName \u2014 a consistent name and role for the AI so it can be referred to and remembered \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n## Exports\n\n- **`AgentName`** \u2014 the agent\'s name, presented the same everywhere. `name` (required); `variant`: `wordmark` / `name-status` / `name-avatar-lockup` (default); `descriptor` (default "AI agent"); `status` (verb phrase \u2192 "Aria is drafting", polite live region); `working`; `formerName` ("formerly Aria" after a rename); `avatarSrc`, `avatarGlyph`\n\nThe lockup and status variants use `AgentAvatar` from `@nucleux/agent-avatar`. Keep the name short (\u2264 12 characters), pronounceable, capitalised consistently, and never a real person\'s name.\n\n## Install\n\n```bash\npnpm add @nucleux/name @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { AgentName } from "@nucleux/name";\n\n<AgentName name="Aria" descriptor="Intelligaia agent" />\n<AgentName name="Aria" variant="name-status" status={thinking ? "thinking" : undefined} />\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
11981
- peerDependencies: {
11982
- react: ">=18",
11983
- "react-dom": ">=18"
11984
- },
11985
- twin: {
11986
- name: "md3-name",
11987
- package: "@nucleux/md3-name",
11988
- component: "Md3AgentName",
11989
- sharesApi: true
11990
- }
11991
- },
11992
- {
11993
- name: "native-select",
11994
- package: "@nucleux/native-select",
11995
- kind: "component",
11996
- description: "An accessible select built on the native `<select>` element (full keyboard +\nscreen-reader support), styled to match the design system with a chevron.\nPass `<option>`s as children.",
11997
- summary: "Styled native <select> \u2014 Nucleux agentic UI for React.",
11998
- keywords: [
11999
- "nucleux",
12000
- "react",
12001
- "ui",
12002
- "components",
12003
- "agentic",
12004
- "ai",
12005
- "tailwind",
12006
- "native-select"
12007
- ],
12008
- exports: [
12009
- "NativeSelect",
12010
- "NativeSelectOption",
12011
- "NativeSelectOptGroup",
12012
- "NativeSelectProps"
12013
- ],
12014
- components: [
12015
- "NativeSelect",
12016
- "NativeSelectOption",
12017
- "NativeSelectOptGroup"
12018
- ],
12019
- import: 'import { NativeSelect, NativeSelectOption, NativeSelectOptGroup } from "@nucleux/native-select";',
12020
- installSingle: "pnpm add @nucleux/native-select @nucleux/tokens",
12021
- props: [
12648
+ },
12022
12649
  {
12023
- name: "NativeSelectProps",
12024
- source: "export interface NativeSelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n /** Wrapper className (the chevron is positioned within it). */\n containerClassName?: string;\n}",
12650
+ name: "ModesNoteProps",
12651
+ source: "export interface ModesNoteProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Shows an Undo button that restores the previous mode. */\n onUndo?: () => void;\n}",
12025
12652
  extends: [
12026
- "React.SelectHTMLAttributes<HTMLSelectElement>"
12653
+ "React.HTMLAttributes<HTMLDivElement>"
12027
12654
  ],
12028
12655
  members: [
12029
12656
  {
12030
- name: "containerClassName",
12031
- type: "string",
12657
+ name: "onUndo",
12658
+ type: "() => void",
12032
12659
  required: false,
12033
- description: "Wrapper className (the chevron is positioned within it)."
12660
+ description: "Shows an Undo button that restores the previous mode."
12034
12661
  }
12035
12662
  ]
12036
- }
12037
- ],
12038
- readme: '# @nucleux/native-select\n\nAccessible native-backed select with a chevron \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n## Install\n\n```bash\npnpm add @nucleux/native-select @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { NativeSelect } from "@nucleux/native-select";\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
12039
- peerDependencies: {
12040
- react: ">=18",
12041
- "react-dom": ">=18"
12042
- }
12043
- },
12044
- {
12045
- name: "navigation-menu",
12046
- package: "@nucleux/navigation-menu",
12047
- kind: "component",
12048
- description: "A site navigation bar with hover/focus-revealed dropdown panels.",
12049
- summary: "Navigation menu with dropdown panels \u2014 Nucleux agentic UI for React.",
12050
- keywords: [
12051
- "nucleux",
12052
- "react",
12053
- "ui",
12054
- "components",
12055
- "agentic",
12056
- "ai",
12057
- "tailwind",
12058
- "navigation-menu"
12059
- ],
12060
- exports: [
12061
- "NavigationMenu",
12062
- "NavigationMenuList",
12063
- "NavigationMenuItem",
12663
+ },
12664
+ {
12665
+ name: "ModesProps",
12666
+ source: `export interface ModesProps
12667
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, "defaultValue" | "onSubmit" | "onChange"> {
12668
+ /** The modes the product supports, in order. */
12669
+ modes: ModeOption[];
12670
+ /** Active mode id (controlled); null for none. */
12671
+ value?: string | null;
12672
+ /** Initial mode id when uncontrolled. Defaults to none. */
12673
+ defaultValue?: string | null;
12674
+ /** Called with the new mode id (null when cleared). */
12675
+ onValueChange?: (id: string | null, mode: ModeOption | null) => void;
12676
+ /** Presentation. Defaults to "composer" (the site's live preview). */
12677
+ variant?: ModesVariant;
12678
+ /** Whether the chip's picker is open (controlled). */
12679
+ open?: boolean;
12680
+ /** Initial picker state when uncontrolled. */
12681
+ defaultOpen?: boolean;
12682
+ onOpenChange?: (open: boolean) => void;
12683
+ /** Allow clearing the mode (chip \xD7, "No mode"). Defaults to true. */
12684
+ clearable?: boolean;
12685
+ /** Show each mode's one-line description. Defaults to true. */
12686
+ showDescriptions?: boolean;
12687
+ /** The setting's name. Defaults to "Mode". */
12688
+ label?: string;
12689
+ /** Line under the picker heading. */
12690
+ pickerDescription?: string;
12691
+ /** Initial notice, e.g. to show a just-changed or refused state. */
12692
+ defaultNotice?: ModesNotice;
12693
+ /** Called when someone chooses a mode that can't be applied here. */
12694
+ onUnavailable?: (mode: ModeOption) => void;
12695
+ /** Composer text (controlled). The mode never changes it. */
12696
+ draft?: string;
12697
+ /** Initial composer text when uncontrolled. */
12698
+ defaultDraft?: string;
12699
+ onDraftChange?: (text: string) => void;
12700
+ /** Called when the person sends from the composer, with the active mode. Modes never sends on its own. */
12701
+ onSubmit?: (text: string, details: ModesSubmitDetails) => void;
12702
+ /** Composer placeholder. */
12703
+ placeholder?: string;
12704
+ /** Composer controls before the field (attach\u2026). */
12705
+ composerLeading?: React.ReactNode;
12706
+ /** Composer controls after the mode chip (model chip, voice\u2026). */
12707
+ composerActions?: React.ReactNode;
12708
+ /** Accessible name of the send button. Defaults to "Send". */
12709
+ sendLabel?: string;
12710
+ }`,
12711
+ extends: [
12712
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "defaultValue" | "onSubmit" | "onChange">'
12713
+ ],
12714
+ members: [
12715
+ {
12716
+ name: "modes",
12717
+ type: "ModeOption[]",
12718
+ required: true,
12719
+ description: "The modes the product supports, in order."
12720
+ },
12721
+ {
12722
+ name: "value",
12723
+ type: "string | null",
12724
+ required: false,
12725
+ description: "Active mode id (controlled); null for none."
12726
+ },
12727
+ {
12728
+ name: "defaultValue",
12729
+ type: "string | null",
12730
+ required: false,
12731
+ description: "Initial mode id when uncontrolled. Defaults to none."
12732
+ },
12733
+ {
12734
+ name: "onValueChange",
12735
+ type: "(id: string | null, mode: ModeOption | null) => void",
12736
+ required: false,
12737
+ description: "Called with the new mode id (null when cleared)."
12738
+ },
12739
+ {
12740
+ name: "variant",
12741
+ type: "ModesVariant",
12742
+ required: false,
12743
+ description: `Presentation. Defaults to "composer" (the site's live preview).`,
12744
+ values: [
12745
+ "composer",
12746
+ "segmented",
12747
+ "list",
12748
+ "chip"
12749
+ ],
12750
+ default: '"composer"'
12751
+ },
12752
+ {
12753
+ name: "open",
12754
+ type: "boolean",
12755
+ required: false,
12756
+ description: "Whether the chip's picker is open (controlled)."
12757
+ },
12758
+ {
12759
+ name: "defaultOpen",
12760
+ type: "boolean",
12761
+ required: false,
12762
+ description: "Initial picker state when uncontrolled."
12763
+ },
12764
+ {
12765
+ name: "onOpenChange",
12766
+ type: "(open: boolean) => void",
12767
+ required: false
12768
+ },
12769
+ {
12770
+ name: "clearable",
12771
+ type: "boolean",
12772
+ required: false,
12773
+ description: 'Allow clearing the mode (chip \xD7, "No mode"). Defaults to true.',
12774
+ default: "true"
12775
+ },
12776
+ {
12777
+ name: "showDescriptions",
12778
+ type: "boolean",
12779
+ required: false,
12780
+ description: "Show each mode's one-line description. Defaults to true.",
12781
+ default: "true"
12782
+ },
12783
+ {
12784
+ name: "label",
12785
+ type: "string",
12786
+ required: false,
12787
+ description: `The setting's name. Defaults to "Mode".`,
12788
+ default: '"Mode"'
12789
+ },
12790
+ {
12791
+ name: "pickerDescription",
12792
+ type: "string",
12793
+ required: false,
12794
+ description: "Line under the picker heading."
12795
+ },
12796
+ {
12797
+ name: "defaultNotice",
12798
+ type: "ModesNotice",
12799
+ required: false,
12800
+ description: "Initial notice, e.g. to show a just-changed or refused state."
12801
+ },
12802
+ {
12803
+ name: "onUnavailable",
12804
+ type: "(mode: ModeOption) => void",
12805
+ required: false,
12806
+ description: "Called when someone chooses a mode that can't be applied here."
12807
+ },
12808
+ {
12809
+ name: "draft",
12810
+ type: "string",
12811
+ required: false,
12812
+ description: "Composer text (controlled). The mode never changes it."
12813
+ },
12814
+ {
12815
+ name: "defaultDraft",
12816
+ type: "string",
12817
+ required: false,
12818
+ description: "Initial composer text when uncontrolled.",
12819
+ default: '""'
12820
+ },
12821
+ {
12822
+ name: "onDraftChange",
12823
+ type: "(text: string) => void",
12824
+ required: false
12825
+ },
12826
+ {
12827
+ name: "onSubmit",
12828
+ type: "(text: string, details: ModesSubmitDetails) => void",
12829
+ required: false,
12830
+ description: "Called when the person sends from the composer, with the active mode. Modes never sends on its own."
12831
+ },
12832
+ {
12833
+ name: "placeholder",
12834
+ type: "string",
12835
+ required: false,
12836
+ description: "Composer placeholder.",
12837
+ default: '"Ask Aria\u2026"'
12838
+ },
12839
+ {
12840
+ name: "composerLeading",
12841
+ type: "React.ReactNode",
12842
+ required: false,
12843
+ description: "Composer controls before the field (attach\u2026)."
12844
+ },
12845
+ {
12846
+ name: "composerActions",
12847
+ type: "React.ReactNode",
12848
+ required: false,
12849
+ description: "Composer controls after the mode chip (model chip, voice\u2026)."
12850
+ },
12851
+ {
12852
+ name: "sendLabel",
12853
+ type: "string",
12854
+ required: false,
12855
+ description: 'Accessible name of the send button. Defaults to "Send".',
12856
+ default: '"Send"'
12857
+ }
12858
+ ]
12859
+ }
12860
+ ],
12861
+ readme: '# @nucleux/modes\n\nModes \u2014 choose how the agent works on a request (Fast, Balanced, Deep research), shown in the composer and switchable before sending \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\nA named set of behaviour presets that makes the speed/depth trade-off \u2014 or the\nway of working \u2014 legible without exposing raw parameters. Each mode says what\nchanges and how long it takes; the active mode sits in the composer as a chip\nthat can be changed or cleared before sending; unavailable modes stay listed\nwith the reason; a change adds one quiet line with Undo. Choosing a mode never\ntouches the prompt text, and Modes never sends on its own.\n\n## Exports\n\n- **`Modes`** \u2014 the whole pattern (`variant`: `composer` \xB7 `segmented` \xB7 `list` \xB7 `chip`)\n- **`ModesSegmented`** \u2014 the segmented control (radio group)\n- **`ModesList`** \u2014 rich rows: icon, name, expected speed \xB7 what it\'s for, unavailable reason\n- **`ModesChip`** \u2014 the composer chip ("\u26A1 Fast \u25BE") with an optional \xD7\n- **`ModesPicker`** \u2014 the dialog the chip opens: heading, rows, refusal alert, "No mode"\n- **`ModesNote`** \u2014 "Mode changed to \u2026 Your text is unchanged." with Undo\n- Shared logic (also used by `@nucleux/md3-modes`): `useModes`, `useModesRoving`, `useModesDismiss`, `modesLabels`, `modeSupportingText`\n- Types: `ModesProps`, `ModeOption`, `ModesVariant`, `ModesNotice`, `ModesSubmitDetails`, `UseModesOptions`, `ModesState`, and each sub-component\'s `\u2026Props`\n\n## Variants\n\n| `variant` | Use |\n| --- | --- |\n| `composer` (default) | The site\'s live preview: segmented control, the mode list and the chip in the composer. |\n| `segmented` | Three or four labelled segments \u2014 session-level, like a tab (right rail, code). |\n| `list` | Rich rows with expected speed \u2014 generation settings. |\n| `chip` | Only the chip and its picker \u2014 beside the send button (chat, email). |\n\n## Behaviour\n\n- `modes` (`{ id, name, shortName?, description?, meta?, icon?, unavailable? }[]`), `value` / `defaultValue` / `onValueChange(id | null, mode | null)`.\n- `open` / `defaultOpen` / `onOpenChange` for the picker; `clearable` (default true); `showDescriptions` (default true); `label` (default "Mode").\n- Choosing an `unavailable` mode is refused: it isn\'t applied, the picker shows why (`role="alert"`), `onUnavailable(mode)` fires.\n- Composer: `draft` / `defaultDraft` / `onDraftChange`, `onSubmit(text, { mode })`, `placeholder`, `composerLeading`, `composerActions`, `sendLabel`.\n- Keyboard: radio groups with one tab stop; Arrow keys / Home / End move, Space or Enter chooses; Escape closes the picker and returns focus to the chip. Changes are announced politely.\n\n## Install\n\n```bash\npnpm add @nucleux/modes @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Modes } from "@nucleux/modes";\n\n<Modes\n modes={[\n { id: "fast", name: "Fast", icon: "\u26A1", meta: "~3 seconds", description: "everyday asks and quick lookups" },\n { id: "balanced", name: "Balanced", icon: "\u2696\uFE0F", meta: "~15 seconds", description: "most tasks" },\n { id: "deep", name: "Deep research", shortName: "Deep", icon: "\u{1F9E0}", meta: "~1 minute", description: "multi-source, high-stakes" },\n ]}\n defaultValue="balanced"\n onSubmit={(text, { mode }) => send(text, { mode: mode?.id })}\n/>\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
12862
+ peerDependencies: {
12863
+ react: ">=18",
12864
+ "react-dom": ">=18"
12865
+ },
12866
+ twin: {
12867
+ name: "md3-modes",
12868
+ package: "@nucleux/md3-modes",
12869
+ component: "Md3Modes",
12870
+ sharesApi: true
12871
+ }
12872
+ },
12873
+ {
12874
+ name: "name",
12875
+ package: "@nucleux/name",
12876
+ kind: "component",
12877
+ description: 'The agent\'s name, presented consistently so it can be referred to,\ntalked to and remembered ("Ask Aria to summarise this"). Three variants:\n`wordmark`, `name-status` ("Aria is drafting", announced politely) and\n`name-avatar-lockup` (the AgentAvatar mark with name and descriptor).\nThe descriptor keeps the name honest by saying what the agent is.',
12878
+ summary: "Name \u2014 a consistent name and role for the AI so it can be referred to and remembered \u2014 Nucleux agentic UI for React.",
12879
+ keywords: [
12880
+ "nucleux",
12881
+ "react",
12882
+ "ui",
12883
+ "components",
12884
+ "agentic",
12885
+ "ai",
12886
+ "tailwind",
12887
+ "name"
12888
+ ],
12889
+ exports: [
12890
+ "AgentName",
12891
+ "AgentNameVariant",
12892
+ "AgentNameProps"
12893
+ ],
12894
+ components: [
12895
+ "AgentName"
12896
+ ],
12897
+ import: 'import { AgentName } from "@nucleux/name";',
12898
+ installSingle: "pnpm add @nucleux/name @nucleux/tokens",
12899
+ props: [
12900
+ {
12901
+ name: "AgentNameProps",
12902
+ source: 'export interface AgentNameProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The agent\'s proper name \u2014 short (\u2264 12 characters), pronounceable, capitalised the same everywhere. Not a real person\'s name. */\n name: string;\n /**\n * `wordmark` (the name in product type, for headers and brand contexts),\n * `name-status` (the name with what the agent is doing now) or\n * `name-avatar-lockup` (mark + name, for attribution rows and signatures).\n * Default `name-avatar-lockup`.\n */\n variant?: AgentNameVariant;\n /** What the agent is, in product words: "Intelligaia agent", "Meeting Intelligence Agent". Defaults to "AI agent". On compact surfaces it stays in the accessible name. */\n descriptor?: React.ReactNode;\n /**\n * `name-status`: what the agent is doing, as a verb phrase \u2014 "drafting",\n * "thinking". Rendered as "Aria is drafting" in a polite live region.\n * Omit for an idle agent ("Aria").\n */\n status?: string;\n /** `name-status`: show the working dots (and the working ring on the mark). Defaults to `true` when `status` is set. */\n working?: boolean;\n /** Previous name after a rename, shown as "formerly Aria" for a while. */\n formerName?: string;\n /** Image for the agent mark (`name-status`, `name-avatar-lockup`). */\n avatarSrc?: string;\n /** Glyph for the agent mark when there is no image. Defaults to the reserved AI sparkle. */\n avatarGlyph?: React.ReactNode;\n}',
12903
+ extends: [
12904
+ "React.HTMLAttributes<HTMLDivElement>"
12905
+ ],
12906
+ members: [
12907
+ {
12908
+ name: "name",
12909
+ type: "string",
12910
+ required: true,
12911
+ description: "The agent's proper name \u2014 short (\u2264 12 characters), pronounceable, capitalised the same everywhere. Not a real person's name."
12912
+ },
12913
+ {
12914
+ name: "variant",
12915
+ type: "AgentNameVariant",
12916
+ required: false,
12917
+ description: "`wordmark` (the name in product type, for headers and brand contexts), `name-status` (the name with what the agent is doing now) or `name-avatar-lockup` (mark + name, for attribution rows and signatures). Default `name-avatar-lockup`.",
12918
+ values: [
12919
+ "wordmark",
12920
+ "name-status",
12921
+ "name-avatar-lockup"
12922
+ ],
12923
+ default: '"name-avatar-lockup"'
12924
+ },
12925
+ {
12926
+ name: "descriptor",
12927
+ type: "React.ReactNode",
12928
+ required: false,
12929
+ description: 'What the agent is, in product words: "Intelligaia agent", "Meeting Intelligence Agent". Defaults to "AI agent". On compact surfaces it stays in the accessible name.',
12930
+ default: '"AI agent"'
12931
+ },
12932
+ {
12933
+ name: "status",
12934
+ type: "string",
12935
+ required: false,
12936
+ description: '`name-status`: what the agent is doing, as a verb phrase \u2014 "drafting", "thinking". Rendered as "Aria is drafting" in a polite live region. Omit for an idle agent ("Aria").'
12937
+ },
12938
+ {
12939
+ name: "working",
12940
+ type: "boolean",
12941
+ required: false,
12942
+ description: "`name-status`: show the working dots (and the working ring on the mark). Defaults to `true` when `status` is set."
12943
+ },
12944
+ {
12945
+ name: "formerName",
12946
+ type: "string",
12947
+ required: false,
12948
+ description: 'Previous name after a rename, shown as "formerly Aria" for a while.'
12949
+ },
12950
+ {
12951
+ name: "avatarSrc",
12952
+ type: "string",
12953
+ required: false,
12954
+ description: "Image for the agent mark (`name-status`, `name-avatar-lockup`)."
12955
+ },
12956
+ {
12957
+ name: "avatarGlyph",
12958
+ type: "React.ReactNode",
12959
+ required: false,
12960
+ description: "Glyph for the agent mark when there is no image. Defaults to the reserved AI sparkle."
12961
+ }
12962
+ ]
12963
+ }
12964
+ ],
12965
+ readme: '# @nucleux/name\n\nName \u2014 a consistent name and role for the AI so it can be referred to and remembered \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n## Exports\n\n- **`AgentName`** \u2014 the agent\'s name, presented the same everywhere. `name` (required); `variant`: `wordmark` / `name-status` / `name-avatar-lockup` (default); `descriptor` (default "AI agent"); `status` (verb phrase \u2192 "Aria is drafting", polite live region); `working`; `formerName` ("formerly Aria" after a rename); `avatarSrc`, `avatarGlyph`\n\nThe lockup and status variants use `AgentAvatar` from `@nucleux/agent-avatar`. Keep the name short (\u2264 12 characters), pronounceable, capitalised consistently, and never a real person\'s name.\n\n## Install\n\n```bash\npnpm add @nucleux/name @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { AgentName } from "@nucleux/name";\n\n<AgentName name="Aria" descriptor="Intelligaia agent" />\n<AgentName name="Aria" variant="name-status" status={thinking ? "thinking" : undefined} />\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
12966
+ peerDependencies: {
12967
+ react: ">=18",
12968
+ "react-dom": ">=18"
12969
+ },
12970
+ twin: {
12971
+ name: "md3-name",
12972
+ package: "@nucleux/md3-name",
12973
+ component: "Md3AgentName",
12974
+ sharesApi: true
12975
+ }
12976
+ },
12977
+ {
12978
+ name: "native-select",
12979
+ package: "@nucleux/native-select",
12980
+ kind: "component",
12981
+ description: "An accessible select built on the native `<select>` element (full keyboard +\nscreen-reader support), styled to match the design system with a chevron.\nPass `<option>`s as children.",
12982
+ summary: "Styled native <select> \u2014 Nucleux agentic UI for React.",
12983
+ keywords: [
12984
+ "nucleux",
12985
+ "react",
12986
+ "ui",
12987
+ "components",
12988
+ "agentic",
12989
+ "ai",
12990
+ "tailwind",
12991
+ "native-select"
12992
+ ],
12993
+ exports: [
12994
+ "NativeSelect",
12995
+ "NativeSelectOption",
12996
+ "NativeSelectOptGroup",
12997
+ "NativeSelectProps"
12998
+ ],
12999
+ components: [
13000
+ "NativeSelect",
13001
+ "NativeSelectOption",
13002
+ "NativeSelectOptGroup"
13003
+ ],
13004
+ import: 'import { NativeSelect, NativeSelectOption, NativeSelectOptGroup } from "@nucleux/native-select";',
13005
+ installSingle: "pnpm add @nucleux/native-select @nucleux/tokens",
13006
+ props: [
13007
+ {
13008
+ name: "NativeSelectProps",
13009
+ source: "export interface NativeSelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n /** Wrapper className (the chevron is positioned within it). */\n containerClassName?: string;\n}",
13010
+ extends: [
13011
+ "React.SelectHTMLAttributes<HTMLSelectElement>"
13012
+ ],
13013
+ members: [
13014
+ {
13015
+ name: "containerClassName",
13016
+ type: "string",
13017
+ required: false,
13018
+ description: "Wrapper className (the chevron is positioned within it)."
13019
+ }
13020
+ ]
13021
+ }
13022
+ ],
13023
+ readme: '# @nucleux/native-select\n\nAccessible native-backed select with a chevron \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n## Install\n\n```bash\npnpm add @nucleux/native-select @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { NativeSelect } from "@nucleux/native-select";\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
13024
+ peerDependencies: {
13025
+ react: ">=18",
13026
+ "react-dom": ">=18"
13027
+ }
13028
+ },
13029
+ {
13030
+ name: "navigation-menu",
13031
+ package: "@nucleux/navigation-menu",
13032
+ kind: "component",
13033
+ description: "A site navigation bar with hover/focus-revealed dropdown panels.",
13034
+ summary: "Navigation menu with dropdown panels \u2014 Nucleux agentic UI for React.",
13035
+ keywords: [
13036
+ "nucleux",
13037
+ "react",
13038
+ "ui",
13039
+ "components",
13040
+ "agentic",
13041
+ "ai",
13042
+ "tailwind",
13043
+ "navigation-menu"
13044
+ ],
13045
+ exports: [
13046
+ "NavigationMenu",
13047
+ "NavigationMenuList",
13048
+ "NavigationMenuItem",
12064
13049
  "NavigationMenuTrigger",
12065
13050
  "NavigationMenuContent",
12066
13051
  "NavigationMenuLink",
@@ -12742,93 +13727,379 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
12742
13727
  source: "export interface PopoverProps {\n /** Whether the popover is open (controlled). */\n open?: boolean;\n /** Initial open state (uncontrolled). */\n defaultOpen?: boolean;\n /** Called when the popover requests to open or close. */\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}",
12743
13728
  members: [
12744
13729
  {
12745
- name: "open",
12746
- type: "boolean",
13730
+ name: "open",
13731
+ type: "boolean",
13732
+ required: false,
13733
+ description: "Whether the popover is open (controlled)."
13734
+ },
13735
+ {
13736
+ name: "defaultOpen",
13737
+ type: "boolean",
13738
+ required: false,
13739
+ description: "Initial open state (uncontrolled).",
13740
+ default: "false"
13741
+ },
13742
+ {
13743
+ name: "onOpenChange",
13744
+ type: "(open: boolean) => void",
13745
+ required: false,
13746
+ description: "Called when the popover requests to open or close."
13747
+ },
13748
+ {
13749
+ name: "children",
13750
+ type: "React.ReactNode",
13751
+ required: true
13752
+ }
13753
+ ]
13754
+ },
13755
+ {
13756
+ name: "PopoverTriggerProps",
13757
+ source: 'export interface PopoverTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Additional classes merged onto the trigger button. */\n className?: string;\n /** Button type. Defaults to "button". */\n type?: "button" | "submit" | "reset";\n}',
13758
+ extends: [
13759
+ "React.ButtonHTMLAttributes<HTMLButtonElement>"
13760
+ ],
13761
+ members: [
13762
+ {
13763
+ name: "className",
13764
+ type: "string",
13765
+ required: false,
13766
+ description: "Additional classes merged onto the trigger button."
13767
+ },
13768
+ {
13769
+ name: "type",
13770
+ type: '"button" | "submit" | "reset"',
13771
+ required: false,
13772
+ description: 'Button type. Defaults to "button".',
13773
+ values: [
13774
+ "button",
13775
+ "submit",
13776
+ "reset"
13777
+ ],
13778
+ default: '"button"'
13779
+ }
13780
+ ]
13781
+ },
13782
+ {
13783
+ name: "PopoverContentProps",
13784
+ source: 'export interface PopoverContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Horizontal alignment relative to the trigger. */\n align?: "start" | "end";\n /**\n * Alias of `align` (CSS flex vocabulary). Deprecated \u2014 use `align`.\n * @deprecated Use `align` instead. Alias kept so agents reaching for the\n * CSS property name are caught; it maps 1:1.\n */\n alignItems?: "start" | "end";\n}',
13785
+ extends: [
13786
+ "React.HTMLAttributes<HTMLDivElement>"
13787
+ ],
13788
+ members: [
13789
+ {
13790
+ name: "align",
13791
+ type: '"start" | "end"',
13792
+ required: false,
13793
+ description: "Horizontal alignment relative to the trigger.",
13794
+ values: [
13795
+ "start",
13796
+ "end"
13797
+ ]
13798
+ },
13799
+ {
13800
+ name: "alignItems",
13801
+ type: '"start" | "end"',
13802
+ required: false,
13803
+ description: "Alias of `align` (CSS flex vocabulary). Deprecated \u2014 use `align`.",
13804
+ values: [
13805
+ "start",
13806
+ "end"
13807
+ ],
13808
+ deprecated: "Use `align` instead. Alias kept so agents reaching for the CSS property name are caught; it maps 1:1."
13809
+ }
13810
+ ]
13811
+ }
13812
+ ],
13813
+ readme: '# @nucleux/popover\n\nClick popover with outside-click/Escape \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n## Install\n\n```bash\npnpm add @nucleux/popover @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Popover, PopoverTrigger, PopoverContent } from "@nucleux/popover";\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
13814
+ peerDependencies: {
13815
+ react: ">=18",
13816
+ "react-dom": ">=18"
13817
+ }
13818
+ },
13819
+ {
13820
+ name: "preset-styles",
13821
+ package: "@nucleux/preset-styles",
13822
+ kind: "component",
13823
+ description: 'One-tap named styles that set how the agent\'s output looks or reads, without\nrestating it in every request. `variant="grid"` (default) is a swatch grid\npicked before generating, with a "Match a style" reference-image drop and a\nper-project lock; `"list"` is a short list of brand-agreed presets;\n`"menu"` puts a Style control in the composer that opens "Use style" \u2014 each\nstyle with one line on what it changes, a sample reply that follows pointer\nand focus, and "Create & edit styles", which turns writing the person likes\n(or a description) into their own style through the app\'s\n`onGenerateStyle`, reviewed and editable before saving. Choosing applies at\nonce, the chip names the style, \xD7 goes back to the base style with Undo, and\nthe request text is never edited. Arrow keys move between styles; Escape\ncloses the menu and returns focus to the control.',
13824
+ summary: "Preset Styles \u2014 one-click named styles for how the agent's output looks or reads \u2014 Nucleux agentic UI for React.",
13825
+ keywords: [
13826
+ "nucleux",
13827
+ "react",
13828
+ "ui",
13829
+ "components",
13830
+ "agentic",
13831
+ "ai",
13832
+ "tailwind",
13833
+ "preset-styles",
13834
+ "styles",
13835
+ "style-picker",
13836
+ "prompt-scaffold"
13837
+ ],
13838
+ exports: [
13839
+ "presetStylesCopy",
13840
+ "presetStylesNoticeText",
13841
+ "presetStylesMoveFocus",
13842
+ "usePresetStyles",
13843
+ "PresetStyles",
13844
+ "PresetStylesVariant",
13845
+ "PresetStyleSwatch",
13846
+ "PresetStylesView",
13847
+ "PresetStylesNotice",
13848
+ "PresetStyleSource",
13849
+ "PresetStyle",
13850
+ "PresetStyleReference",
13851
+ "PresetStyleRequest",
13852
+ "PresetStyleDraft",
13853
+ "PresetStylesProps",
13854
+ "PresetStylesState"
13855
+ ],
13856
+ components: [
13857
+ "PresetStyles"
13858
+ ],
13859
+ import: 'import { PresetStyles } from "@nucleux/preset-styles";',
13860
+ installSingle: "pnpm add @nucleux/preset-styles @nucleux/tokens",
13861
+ props: [
13862
+ {
13863
+ name: "PresetStylesProps",
13864
+ source: 'export interface PresetStylesProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue" | "onSubmit"> {\n /** The presets, in order. In `"menu"`, the first one is the base style (Normal) unless `baseStyle` says otherwise. */\n styles: PresetStyle[];\n /** Chosen style id (controlled). */\n value?: string;\n /** Initial style id (uncontrolled). Defaults to the base style. */\n defaultValue?: string;\n /** Called when a style is chosen (or \xD7 returns to the base style). Never touches the request text. */\n onValueChange?: (id: string) => void;\n /** Layout. Defaults to `"grid"`. */\n variant?: PresetStylesVariant;\n /** Heading. Defaults to `"Output style"` (grid, list) or `"Use style"` (menu). Also the group\'s accessible name. */\n label?: string;\n /** Menu sub-heading. Defaults to `"How {agentName} writes its replies \u2014 not what it knows or does."`. */\n description?: string;\n /** The plain style \xD7 goes back to. Defaults to the first style. */\n baseStyle?: string;\n /** Who writes, for the copy. Defaults to `"Aria"`. */\n agentName?: string;\n\n /** Grid / list: show the per-project lock line. */\n lockable?: boolean;\n /** Locked (controlled). */\n locked?: boolean;\n /** Initially locked (uncontrolled). */\n defaultLocked?: boolean;\n /** Called when the lock is switched. */\n onLockedChange?: (locked: boolean) => void;\n /** What the lock covers. Defaults to `"this project"`. */\n lockScope?: string;\n\n /** Grid / list: show the "Match a style" reference-image drop. */\n allowReference?: boolean;\n /** The attached reference (controlled; `null` for none). */\n reference?: PresetStyleReference | null;\n /** Initially attached reference (uncontrolled). */\n defaultReference?: PresetStyleReference | null;\n /** Called with the dropped or picked image, or `null` when removed. */\n onReferenceChange?: (file: File | null) => void;\n\n /** Menu: what is showing at first. Defaults to `"closed"`. */\n defaultView?: PresetStylesView;\n /** Menu: called when the menu or a card opens or closes. */\n onViewChange?: (view: PresetStylesView) => void;\n /** Menu: show a sample reply for the style under the pointer or focus. Defaults to `true`. */\n showPreview?: boolean;\n /** Menu: the style previewed when the menu opens. Defaults to the chosen one. */\n defaultPreview?: string;\n /** Menu: the familiar request the preview answers, e.g. `"Summarize the October release."`. */\n previewPrompt?: string;\n /** Menu: what a style applies to. Defaults to `"new messages, edits and retries"`. */\n scope?: string;\n /** Menu: the conversation already has replies \u2014 switching says earlier ones keep their style. */\n earlierReplies?: boolean;\n /** Menu: the confirmation line shown at first (restoring UI). */\n defaultNotice?: PresetStylesNotice | null;\n\n /** Menu: makes a custom style from an example or a description. Enables "Create & edit styles". */\n onGenerateStyle?: (request: PresetStyleRequest) => Promise<PresetStyleDraft>;\n /** Menu: called when a custom style is saved (`use` = Save and use). It is also kept locally. */\n onSaveStyle?: (style: PresetStyle, use: boolean) => void;\n /** Menu: the generated draft to review when `defaultView="review"`. */\n defaultGenerated?: PresetStyleDraft;\n\n /** Menu: render the family\'s composer with the Style control in its toolbar. Defaults to `true`; `false` renders only the control. */\n withComposer?: boolean;\n /** Composer text (controlled). */\n message?: string;\n /** Composer text at first (uncontrolled). */\n defaultMessage?: string;\n /** Called as the composer text changes. */\n onMessageChange?: (text: string) => void;\n /** Called on send with the request and the chosen style id. The style is a setting; the text is never edited. */\n onSubmit?: (text: string, styleId: string) => void;\n /** Composer placeholder. Defaults to `"Describe what you need\u2026"`. */\n placeholder?: string;\n}',
13865
+ extends: [
13866
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue" | "onSubmit">'
13867
+ ],
13868
+ members: [
13869
+ {
13870
+ name: "styles",
13871
+ type: "PresetStyle[]",
13872
+ required: true,
13873
+ description: 'The presets, in order. In `"menu"`, the first one is the base style (Normal) unless `baseStyle` says otherwise.'
13874
+ },
13875
+ {
13876
+ name: "value",
13877
+ type: "string",
13878
+ required: false,
13879
+ description: "Chosen style id (controlled)."
13880
+ },
13881
+ {
13882
+ name: "defaultValue",
13883
+ type: "string",
13884
+ required: false,
13885
+ description: "Initial style id (uncontrolled). Defaults to the base style."
13886
+ },
13887
+ {
13888
+ name: "onValueChange",
13889
+ type: "(id: string) => void",
13890
+ required: false,
13891
+ description: "Called when a style is chosen (or \xD7 returns to the base style). Never touches the request text."
13892
+ },
13893
+ {
13894
+ name: "variant",
13895
+ type: "PresetStylesVariant",
13896
+ required: false,
13897
+ description: 'Layout. Defaults to `"grid"`.',
13898
+ values: [
13899
+ "grid",
13900
+ "list",
13901
+ "menu"
13902
+ ]
13903
+ },
13904
+ {
13905
+ name: "label",
13906
+ type: "string",
13907
+ required: false,
13908
+ description: 'Heading. Defaults to `"Output style"` (grid, list) or `"Use style"` (menu). Also the group\'s accessible name.'
13909
+ },
13910
+ {
13911
+ name: "description",
13912
+ type: "string",
13913
+ required: false,
13914
+ description: 'Menu sub-heading. Defaults to `"How {agentName} writes its replies \u2014 not what it knows or does."`.'
13915
+ },
13916
+ {
13917
+ name: "baseStyle",
13918
+ type: "string",
13919
+ required: false,
13920
+ description: "The plain style \xD7 goes back to. Defaults to the first style."
13921
+ },
13922
+ {
13923
+ name: "agentName",
13924
+ type: "string",
13925
+ required: false,
13926
+ description: 'Who writes, for the copy. Defaults to `"Aria"`.'
13927
+ },
13928
+ {
13929
+ name: "lockable",
13930
+ type: "boolean",
13931
+ required: false,
13932
+ description: "Grid / list: show the per-project lock line."
13933
+ },
13934
+ {
13935
+ name: "locked",
13936
+ type: "boolean",
13937
+ required: false,
13938
+ description: "Locked (controlled)."
13939
+ },
13940
+ {
13941
+ name: "defaultLocked",
13942
+ type: "boolean",
13943
+ required: false,
13944
+ description: "Initially locked (uncontrolled)."
13945
+ },
13946
+ {
13947
+ name: "onLockedChange",
13948
+ type: "(locked: boolean) => void",
13949
+ required: false,
13950
+ description: "Called when the lock is switched."
13951
+ },
13952
+ {
13953
+ name: "lockScope",
13954
+ type: "string",
13955
+ required: false,
13956
+ description: 'What the lock covers. Defaults to `"this project"`.'
13957
+ },
13958
+ {
13959
+ name: "allowReference",
13960
+ type: "boolean",
13961
+ required: false,
13962
+ description: 'Grid / list: show the "Match a style" reference-image drop.'
13963
+ },
13964
+ {
13965
+ name: "reference",
13966
+ type: "PresetStyleReference | null",
13967
+ required: false,
13968
+ description: "The attached reference (controlled; `null` for none)."
13969
+ },
13970
+ {
13971
+ name: "defaultReference",
13972
+ type: "PresetStyleReference | null",
13973
+ required: false,
13974
+ description: "Initially attached reference (uncontrolled)."
13975
+ },
13976
+ {
13977
+ name: "onReferenceChange",
13978
+ type: "(file: File | null) => void",
13979
+ required: false,
13980
+ description: "Called with the dropped or picked image, or `null` when removed."
13981
+ },
13982
+ {
13983
+ name: "defaultView",
13984
+ type: "PresetStylesView",
13985
+ required: false,
13986
+ description: 'Menu: what is showing at first. Defaults to `"closed"`.',
13987
+ values: [
13988
+ "closed",
13989
+ "menu",
13990
+ "create",
13991
+ "review"
13992
+ ]
13993
+ },
13994
+ {
13995
+ name: "onViewChange",
13996
+ type: "(view: PresetStylesView) => void",
13997
+ required: false,
13998
+ description: "Menu: called when the menu or a card opens or closes."
13999
+ },
14000
+ {
14001
+ name: "showPreview",
14002
+ type: "boolean",
14003
+ required: false,
14004
+ description: "Menu: show a sample reply for the style under the pointer or focus. Defaults to `true`."
14005
+ },
14006
+ {
14007
+ name: "defaultPreview",
14008
+ type: "string",
14009
+ required: false,
14010
+ description: "Menu: the style previewed when the menu opens. Defaults to the chosen one."
14011
+ },
14012
+ {
14013
+ name: "previewPrompt",
14014
+ type: "string",
14015
+ required: false,
14016
+ description: 'Menu: the familiar request the preview answers, e.g. `"Summarize the October release."`.'
14017
+ },
14018
+ {
14019
+ name: "scope",
14020
+ type: "string",
12747
14021
  required: false,
12748
- description: "Whether the popover is open (controlled)."
14022
+ description: 'Menu: what a style applies to. Defaults to `"new messages, edits and retries"`.'
12749
14023
  },
12750
14024
  {
12751
- name: "defaultOpen",
14025
+ name: "earlierReplies",
12752
14026
  type: "boolean",
12753
14027
  required: false,
12754
- description: "Initial open state (uncontrolled).",
12755
- default: "false"
14028
+ description: "Menu: the conversation already has replies \u2014 switching says earlier ones keep their style."
12756
14029
  },
12757
14030
  {
12758
- name: "onOpenChange",
12759
- type: "(open: boolean) => void",
14031
+ name: "defaultNotice",
14032
+ type: "PresetStylesNotice | null",
12760
14033
  required: false,
12761
- description: "Called when the popover requests to open or close."
14034
+ description: "Menu: the confirmation line shown at first (restoring UI)."
12762
14035
  },
12763
14036
  {
12764
- name: "children",
12765
- type: "React.ReactNode",
12766
- required: true
12767
- }
12768
- ]
12769
- },
12770
- {
12771
- name: "PopoverTriggerProps",
12772
- source: 'export interface PopoverTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Additional classes merged onto the trigger button. */\n className?: string;\n /** Button type. Defaults to "button". */\n type?: "button" | "submit" | "reset";\n}',
12773
- extends: [
12774
- "React.ButtonHTMLAttributes<HTMLButtonElement>"
12775
- ],
12776
- members: [
14037
+ name: "onGenerateStyle",
14038
+ type: "(request: PresetStyleRequest) => Promise<PresetStyleDraft>",
14039
+ required: false,
14040
+ description: 'Menu: makes a custom style from an example or a description. Enables "Create & edit styles".'
14041
+ },
12777
14042
  {
12778
- name: "className",
14043
+ name: "onSaveStyle",
14044
+ type: "(style: PresetStyle, use: boolean) => void",
14045
+ required: false,
14046
+ description: "Menu: called when a custom style is saved (`use` = Save and use). It is also kept locally."
14047
+ },
14048
+ {
14049
+ name: "defaultGenerated",
14050
+ type: "PresetStyleDraft",
14051
+ required: false,
14052
+ description: 'Menu: the generated draft to review when `defaultView="review"`.'
14053
+ },
14054
+ {
14055
+ name: "withComposer",
14056
+ type: "boolean",
14057
+ required: false,
14058
+ description: "Menu: render the family's composer with the Style control in its toolbar. Defaults to `true`; `false` renders only the control."
14059
+ },
14060
+ {
14061
+ name: "message",
12779
14062
  type: "string",
12780
14063
  required: false,
12781
- description: "Additional classes merged onto the trigger button."
14064
+ description: "Composer text (controlled)."
12782
14065
  },
12783
14066
  {
12784
- name: "type",
12785
- type: '"button" | "submit" | "reset"',
14067
+ name: "defaultMessage",
14068
+ type: "string",
12786
14069
  required: false,
12787
- description: 'Button type. Defaults to "button".',
12788
- values: [
12789
- "button",
12790
- "submit",
12791
- "reset"
12792
- ],
12793
- default: '"button"'
12794
- }
12795
- ]
12796
- },
12797
- {
12798
- name: "PopoverContentProps",
12799
- source: 'export interface PopoverContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Horizontal alignment relative to the trigger. */\n align?: "start" | "end";\n /**\n * Alias of `align` (CSS flex vocabulary). Deprecated \u2014 use `align`.\n * @deprecated Use `align` instead. Alias kept so agents reaching for the\n * CSS property name are caught; it maps 1:1.\n */\n alignItems?: "start" | "end";\n}',
12800
- extends: [
12801
- "React.HTMLAttributes<HTMLDivElement>"
12802
- ],
12803
- members: [
14070
+ description: "Composer text at first (uncontrolled)."
14071
+ },
12804
14072
  {
12805
- name: "align",
12806
- type: '"start" | "end"',
14073
+ name: "onMessageChange",
14074
+ type: "(text: string) => void",
12807
14075
  required: false,
12808
- description: "Horizontal alignment relative to the trigger.",
12809
- values: [
12810
- "start",
12811
- "end"
12812
- ]
14076
+ description: "Called as the composer text changes."
12813
14077
  },
12814
14078
  {
12815
- name: "alignItems",
12816
- type: '"start" | "end"',
14079
+ name: "onSubmit",
14080
+ type: "(text: string, styleId: string) => void",
12817
14081
  required: false,
12818
- description: "Alias of `align` (CSS flex vocabulary). Deprecated \u2014 use `align`.",
12819
- values: [
12820
- "start",
12821
- "end"
12822
- ],
12823
- deprecated: "Use `align` instead. Alias kept so agents reaching for the CSS property name are caught; it maps 1:1."
14082
+ description: "Called on send with the request and the chosen style id. The style is a setting; the text is never edited."
14083
+ },
14084
+ {
14085
+ name: "placeholder",
14086
+ type: "string",
14087
+ required: false,
14088
+ description: 'Composer placeholder. Defaults to `"Describe what you need\u2026"`.'
12824
14089
  }
12825
14090
  ]
12826
14091
  }
12827
14092
  ],
12828
- readme: '# @nucleux/popover\n\nClick popover with outside-click/Escape \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n## Install\n\n```bash\npnpm add @nucleux/popover @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Popover, PopoverTrigger, PopoverContent } from "@nucleux/popover";\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
14093
+ readme: '# @nucleux/preset-styles\n\nPreset Styles \u2014 one-click named styles for how the agent\'s output looks or reads \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\nA style communicates in one tap what would take a paragraph to describe. Pick\nit before generating (a swatch grid or a list of brand presets), or set how\nreplies are written from the composer\'s Style control \u2014 with a sample reply\nthat follows the pointer, a chip that names the active style, \xD7 back to the\nbase style with Undo, and custom styles made from the person\'s own writing.\nThe request text is never edited: the style travels with the send.\n\n## Exports\n\n- **`PresetStyles`** \u2014 the picker (`variant`: `"grid"` | `"list"` | `"menu"`)\n- **`usePresetStyles`** \u2014 its state and behaviour (shared with the Material 3 twin), plus `presetStylesCopy`, `presetStylesNoticeText` and `presetStylesMoveFocus`\n- Types: `PresetStylesProps`, `PresetStyle`, `PresetStylesVariant`, `PresetStylesView`, `PresetStylesNotice`, `PresetStyleSwatch`, `PresetStyleReference`, `PresetStyleRequest`, `PresetStyleDraft`, `PresetStyleSource`\n\n## Variants\n\n| `variant` | Use |\n| --- | --- |\n| `grid` (default) | Swatch tiles picked before generating; `allowReference` adds "Match a style" (drop or pick an image), `lockable` the per-project lock. |\n| `list` | A short list of named, brand-agreed presets. |\n| `menu` | A Style control in the composer (`OpenInput`) that opens "Use style": styles with one line each, a live preview, Create & edit styles. |\n\n## Behaviour\n\n- `styles`, `value` / `defaultValue` / `onValueChange`. Arrow keys, Home and End move between styles.\n- Grid / list: `lockable`, `locked` / `defaultLocked` / `onLockedChange`, `lockScope`; `allowReference`, `reference` / `defaultReference` / `onReferenceChange(file | null)`.\n- Menu: choosing applies at once and closes; Escape or an outside click closes and returns focus to the control. `previewPrompt` + each style\'s `sample` drive the preview (`showPreview`). One status line says where the style applies (`scope`, `earlierReplies`); \xD7 returns to `baseStyle` with Undo.\n- Custom styles: pass `onGenerateStyle(request) => Promise<draft>` (the app\'s model call) to enable Create & edit styles \u2014 paste or upload an example, or describe the style; the component shows progress and a retryable error, then a review card where name, description and instructions are editable, with a preview, Save and Save and use (`onSaveStyle(style, use)`).\n- `withComposer={false}` renders only the Style control for your own composer; otherwise `message` / `defaultMessage` / `onMessageChange` and `onSubmit(text, styleId)`.\n\n## Usage\n\n```tsx\nimport { PresetStyles } from "@nucleux/preset-styles";\n\n<PresetStyles\n variant="menu"\n styles={[\n { id: "normal", name: "Normal", description: "Aria\u2019s default replies.", sample: normalReply },\n { id: "concise", name: "Concise", description: "Shorter, more direct replies.", sample: conciseReply },\n ]}\n previewPrompt="Summarize the October release."\n onGenerateStyle={(req) => api.generateStyle(req)}\n onSubmit={(text, style) => send(text, { style })}\n/>\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
12829
14094
  peerDependencies: {
12830
14095
  react: ">=18",
12831
14096
  "react-dom": ">=18"
14097
+ },
14098
+ twin: {
14099
+ name: "md3-preset-styles",
14100
+ package: "@nucleux/md3-preset-styles",
14101
+ component: "Md3PresetStyles",
14102
+ sharesApi: true
12832
14103
  }
12833
14104
  },
12834
14105
  {
@@ -13051,45 +14322,303 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
13051
14322
  name: "value",
13052
14323
  type: "number",
13053
14324
  required: false,
13054
- description: "Current value (0\u2013max). Omit for an indeterminate bar."
14325
+ description: "Current value (0\u2013max). Omit for an indeterminate bar."
14326
+ },
14327
+ {
14328
+ name: "max",
14329
+ type: "number",
14330
+ required: false,
14331
+ description: "Maximum value.",
14332
+ default: "100"
14333
+ },
14334
+ {
14335
+ name: "size",
14336
+ type: "ProgressSize",
14337
+ required: false,
14338
+ description: 'Thickness preset: "sm" or "md" (default).',
14339
+ values: [
14340
+ "sm",
14341
+ "md"
14342
+ ],
14343
+ default: '"md"'
14344
+ },
14345
+ {
14346
+ name: "indicatorClassName",
14347
+ type: "string",
14348
+ required: false,
14349
+ description: 'Class applied to the filled indicator (e.g. "bg-success").'
14350
+ }
14351
+ ]
14352
+ }
14353
+ ],
14354
+ readme: '# @nucleux/progress\n\nDeterminate/indeterminate progress bar \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n## Install\n\n```bash\npnpm add @nucleux/progress @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Progress } from "@nucleux/progress";\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
14355
+ peerDependencies: {
14356
+ react: ">=18",
14357
+ "react-dom": ">=18"
14358
+ },
14359
+ twin: {
14360
+ name: "md3-progress",
14361
+ package: "@nucleux/md3-progress",
14362
+ component: "Md3LinearProgress",
14363
+ sharesApi: false
14364
+ }
14365
+ },
14366
+ {
14367
+ name: "prompt-enhancer",
14368
+ package: "@nucleux/prompt-enhancer",
14369
+ kind: "component",
14370
+ description: "The fixed copy both families use, so accessible names match.",
14371
+ summary: "Prompt Enhancer \u2014 a magic-wand action that rewrites a short ask into a precise one, shown as a reviewable diff \u2014 Nucleux agentic UI for React.",
14372
+ keywords: [
14373
+ "nucleux",
14374
+ "react",
14375
+ "ui",
14376
+ "components",
14377
+ "agentic",
14378
+ "ai",
14379
+ "tailwind",
14380
+ "prompt-enhancer",
14381
+ "prompt",
14382
+ "enhance",
14383
+ "prompt-scaffold"
14384
+ ],
14385
+ exports: [
14386
+ "PROMPT_ENHANCER_TEXT",
14387
+ "buildEnhancedPrompt",
14388
+ "resolveEnhancedPrompt",
14389
+ "getPromptEnhancerSegments",
14390
+ "describePromptEnhancerChange",
14391
+ "usePromptEnhancer",
14392
+ "splitPromptEnhancerProps",
14393
+ "PromptEnhancer",
14394
+ "PromptEnhancerVariant",
14395
+ "PromptEnhancerState",
14396
+ "PromptEnhancerDiffStyle",
14397
+ "PromptEnhancerChange",
14398
+ "PromptEnhancerSuggestion",
14399
+ "PromptEnhancerSegment",
14400
+ "PromptEnhancerProps",
14401
+ "PromptEnhancerController"
14402
+ ],
14403
+ components: [
14404
+ "PromptEnhancer",
14405
+ "PROMPT_ENHANCER_TEXT"
14406
+ ],
14407
+ import: 'import { PromptEnhancer, PROMPT_ENHANCER_TEXT } from "@nucleux/prompt-enhancer";',
14408
+ installSingle: "pnpm add @nucleux/prompt-enhancer @nucleux/tokens",
14409
+ props: [
14410
+ {
14411
+ name: "PromptEnhancerProps",
14412
+ source: 'export interface PromptEnhancerProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSubmit" | "defaultValue" | "onChange"> {\n /** The composer text (controlled). Omit and use `defaultValue` for an uncontrolled composer. */\n value?: string;\n /** Initial composer text when uncontrolled. */\n defaultValue?: string;\n /** Called whenever the composer text changes \u2014 typing, Use, Undo. */\n onValueChange?: (value: string) => void;\n /**\n * Produces the suggestion for a prompt. No model is called by the component:\n * the app supplies this. May be async; a rejection shows the failed state and\n * leaves the original untouched. `signal` aborts when the person cancels.\n */\n onEnhance?: (\n prompt: string,\n options: { signal: AbortSignal },\n ) => PromptEnhancerSuggestion | Promise<PromptEnhancerSuggestion>;\n /** Called with the trimmed text when the person sends. Without it the composer shows no send button. The enhancer never sends on its own. */\n onSubmit?: (value: string) => void;\n /** Called when the person uses the suggestion \u2014 the composer now holds `enhanced`. */\n onUse?: (enhanced: string, original: string) => void;\n /** Called when the person dismisses the suggestion and keeps their prompt. */\n onKeepOriginal?: () => void;\n /** Called when the person undoes Use \u2014 the composer holds `original` again. */\n onUndo?: (original: string) => void;\n /** Called on every state change. */\n onStateChange?: (state: PromptEnhancerState) => void;\n /** "preview-diff" (default), "wand-button" or "auto-enhance-toggle". */\n variant?: PromptEnhancerVariant;\n /** "split" (default) or "inline". */\n diffStyle?: PromptEnhancerDiffStyle;\n /** Mark each addition and list the changes with a checkbox each. Defaults to true. */\n showChanges?: boolean;\n /** Show the reason under each change. Defaults to true. */\n explain?: boolean;\n /** Offer Edit, which opens the suggestion in a text field. Defaults to true. */\n allowEdit?: boolean;\n /** Offer Keep original. Defaults to true. */\n allowKeepOriginal?: boolean;\n /** Offer Undo after Use. Defaults to true. */\n undo?: boolean;\n /** Auto-enhance switch (controlled), for the "auto-enhance-toggle" variant. */\n autoEnhance?: boolean;\n /** Initial auto-enhance switch state when uncontrolled. Defaults to false. */\n defaultAutoEnhance?: boolean;\n /** Called when the auto-enhance switch changes. */\n onAutoEnhanceChange?: (on: boolean) => void;\n /** State to start in (stories, restored sessions). Defaults to "original". States after a suggestion need `defaultSuggestion`. */\n defaultState?: PromptEnhancerState;\n /** Suggestion to start with, for `defaultState` "enhanced" / "editing". */\n defaultSuggestion?: PromptEnhancerSuggestion;\n /** Ids of changes that start removed. */\n defaultRemoved?: string[];\n /** The prompt as written before Use, for `defaultState` "accepted" (what Undo restores). */\n defaultOriginal?: string;\n /** Label of the enhance action. Defaults to "Enhance". */\n actionLabel?: string;\n /** Heading of the review. Defaults to "Suggested improvements". */\n heading?: string;\n /** Quiet line in the composer footer, e.g. "Aria will expand this prompt". */\n hint?: React.ReactNode;\n /** Composer placeholder, also its accessible name. Defaults to "Describe what you need\u2026". */\n placeholder?: string;\n /** Copy for the failed state. Say the original is unchanged. */\n failureMessage?: string;\n /** Extra composer tools (model chip, attach\u2026), placed beside the enhance action. */\n composerActions?: React.ReactNode;\n}',
14413
+ extends: [
14414
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "onSubmit" | "defaultValue" | "onChange">'
14415
+ ],
14416
+ members: [
14417
+ {
14418
+ name: "value",
14419
+ type: "string",
14420
+ required: false,
14421
+ description: "The composer text (controlled). Omit and use `defaultValue` for an uncontrolled composer."
14422
+ },
14423
+ {
14424
+ name: "defaultValue",
14425
+ type: "string",
14426
+ required: false,
14427
+ description: "Initial composer text when uncontrolled."
14428
+ },
14429
+ {
14430
+ name: "onValueChange",
14431
+ type: "(value: string) => void",
14432
+ required: false,
14433
+ description: "Called whenever the composer text changes \u2014 typing, Use, Undo."
14434
+ },
14435
+ {
14436
+ name: "onEnhance",
14437
+ type: "( prompt: string, options: { signal: AbortSignal }, ) => PromptEnhancerSuggestion | Promise<PromptEnhancerSuggestion>",
14438
+ required: false,
14439
+ description: "Produces the suggestion for a prompt. No model is called by the component: the app supplies this. May be async; a rejection shows the failed state and leaves the original untouched. `signal` aborts when the person cancels."
14440
+ },
14441
+ {
14442
+ name: "onSubmit",
14443
+ type: "(value: string) => void",
14444
+ required: false,
14445
+ description: "Called with the trimmed text when the person sends. Without it the composer shows no send button. The enhancer never sends on its own."
14446
+ },
14447
+ {
14448
+ name: "onUse",
14449
+ type: "(enhanced: string, original: string) => void",
14450
+ required: false,
14451
+ description: "Called when the person uses the suggestion \u2014 the composer now holds `enhanced`."
14452
+ },
14453
+ {
14454
+ name: "onKeepOriginal",
14455
+ type: "() => void",
14456
+ required: false,
14457
+ description: "Called when the person dismisses the suggestion and keeps their prompt."
14458
+ },
14459
+ {
14460
+ name: "onUndo",
14461
+ type: "(original: string) => void",
14462
+ required: false,
14463
+ description: "Called when the person undoes Use \u2014 the composer holds `original` again."
14464
+ },
14465
+ {
14466
+ name: "onStateChange",
14467
+ type: "(state: PromptEnhancerState) => void",
14468
+ required: false,
14469
+ description: "Called on every state change."
14470
+ },
14471
+ {
14472
+ name: "variant",
14473
+ type: "PromptEnhancerVariant",
14474
+ required: false,
14475
+ description: '"preview-diff" (default), "wand-button" or "auto-enhance-toggle".',
14476
+ values: [
14477
+ "preview-diff",
14478
+ "wand-button",
14479
+ "auto-enhance-toggle"
14480
+ ]
14481
+ },
14482
+ {
14483
+ name: "diffStyle",
14484
+ type: "PromptEnhancerDiffStyle",
14485
+ required: false,
14486
+ description: '"split" (default) or "inline".',
14487
+ values: [
14488
+ "split",
14489
+ "inline"
14490
+ ]
14491
+ },
14492
+ {
14493
+ name: "showChanges",
14494
+ type: "boolean",
14495
+ required: false,
14496
+ description: "Mark each addition and list the changes with a checkbox each. Defaults to true."
14497
+ },
14498
+ {
14499
+ name: "explain",
14500
+ type: "boolean",
14501
+ required: false,
14502
+ description: "Show the reason under each change. Defaults to true."
14503
+ },
14504
+ {
14505
+ name: "allowEdit",
14506
+ type: "boolean",
14507
+ required: false,
14508
+ description: "Offer Edit, which opens the suggestion in a text field. Defaults to true."
14509
+ },
14510
+ {
14511
+ name: "allowKeepOriginal",
14512
+ type: "boolean",
14513
+ required: false,
14514
+ description: "Offer Keep original. Defaults to true."
14515
+ },
14516
+ {
14517
+ name: "undo",
14518
+ type: "boolean",
14519
+ required: false,
14520
+ description: "Offer Undo after Use. Defaults to true."
14521
+ },
14522
+ {
14523
+ name: "autoEnhance",
14524
+ type: "boolean",
14525
+ required: false,
14526
+ description: 'Auto-enhance switch (controlled), for the "auto-enhance-toggle" variant.'
14527
+ },
14528
+ {
14529
+ name: "defaultAutoEnhance",
14530
+ type: "boolean",
14531
+ required: false,
14532
+ description: "Initial auto-enhance switch state when uncontrolled. Defaults to false."
14533
+ },
14534
+ {
14535
+ name: "onAutoEnhanceChange",
14536
+ type: "(on: boolean) => void",
14537
+ required: false,
14538
+ description: "Called when the auto-enhance switch changes."
14539
+ },
14540
+ {
14541
+ name: "defaultState",
14542
+ type: "PromptEnhancerState",
14543
+ required: false,
14544
+ description: 'State to start in (stories, restored sessions). Defaults to "original". States after a suggestion need `defaultSuggestion`.',
14545
+ values: [
14546
+ "original",
14547
+ "enhancing",
14548
+ "enhanced",
14549
+ "editing",
14550
+ "accepted",
14551
+ "reverted",
14552
+ "failed"
14553
+ ]
14554
+ },
14555
+ {
14556
+ name: "defaultSuggestion",
14557
+ type: "PromptEnhancerSuggestion",
14558
+ required: false,
14559
+ description: 'Suggestion to start with, for `defaultState` "enhanced" / "editing".'
14560
+ },
14561
+ {
14562
+ name: "defaultRemoved",
14563
+ type: "string[]",
14564
+ required: false,
14565
+ description: "Ids of changes that start removed."
14566
+ },
14567
+ {
14568
+ name: "defaultOriginal",
14569
+ type: "string",
14570
+ required: false,
14571
+ description: 'The prompt as written before Use, for `defaultState` "accepted" (what Undo restores).'
14572
+ },
14573
+ {
14574
+ name: "actionLabel",
14575
+ type: "string",
14576
+ required: false,
14577
+ description: 'Label of the enhance action. Defaults to "Enhance".'
14578
+ },
14579
+ {
14580
+ name: "heading",
14581
+ type: "string",
14582
+ required: false,
14583
+ description: 'Heading of the review. Defaults to "Suggested improvements".'
14584
+ },
14585
+ {
14586
+ name: "hint",
14587
+ type: "React.ReactNode",
14588
+ required: false,
14589
+ description: 'Quiet line in the composer footer, e.g. "Aria will expand this prompt".'
13055
14590
  },
13056
14591
  {
13057
- name: "max",
13058
- type: "number",
14592
+ name: "placeholder",
14593
+ type: "string",
13059
14594
  required: false,
13060
- description: "Maximum value.",
13061
- default: "100"
14595
+ description: 'Composer placeholder, also its accessible name. Defaults to "Describe what you need\u2026".'
13062
14596
  },
13063
14597
  {
13064
- name: "size",
13065
- type: "ProgressSize",
14598
+ name: "failureMessage",
14599
+ type: "string",
13066
14600
  required: false,
13067
- description: 'Thickness preset: "sm" or "md" (default).',
13068
- values: [
13069
- "sm",
13070
- "md"
13071
- ],
13072
- default: '"md"'
14601
+ description: "Copy for the failed state. Say the original is unchanged."
13073
14602
  },
13074
14603
  {
13075
- name: "indicatorClassName",
13076
- type: "string",
14604
+ name: "composerActions",
14605
+ type: "React.ReactNode",
13077
14606
  required: false,
13078
- description: 'Class applied to the filled indicator (e.g. "bg-success").'
14607
+ description: "Extra composer tools (model chip, attach\u2026), placed beside the enhance action."
13079
14608
  }
13080
14609
  ]
13081
14610
  }
13082
14611
  ],
13083
- readme: '# @nucleux/progress\n\nDeterminate/indeterminate progress bar \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\n## Install\n\n```bash\npnpm add @nucleux/progress @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { Progress } from "@nucleux/progress";\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
14612
+ readme: '# @nucleux/prompt-enhancer\n\nPrompt Enhancer \u2014 a magic-wand action that rewrites a short ask into a precise one, shown as a reviewable diff \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\nAn Enhance action in the composer expands a terse prompt into a clearer one\nand shows it beside the original \u2014 each addition marked, explained and\nremovable, assumptions labelled. It never silently replaces the prompt: Use\nputs the result in the composer with Undo and sends nothing; Keep original and\nEdit are always there, and a failure leaves the original untouched. The\ncomponent calls no model \u2014 the app supplies `onEnhance`.\n\n## Exports\n\n- **`PromptEnhancer`** \u2014 the composer, the Enhance action and the review\n- **`usePromptEnhancer`** \u2014 the shared, non-visual logic (state machine, async enhance with cancel, Use/Undo)\n- Helpers: `buildEnhancedPrompt`, `resolveEnhancedPrompt`, `getPromptEnhancerSegments`, `describePromptEnhancerChange`, `PROMPT_ENHANCER_TEXT`\n- Types: `PromptEnhancerProps`, `PromptEnhancerVariant`, `PromptEnhancerState`, `PromptEnhancerDiffStyle`, `PromptEnhancerChange`, `PromptEnhancerSuggestion`, `PromptEnhancerSegment`, `PromptEnhancerController`\n\n## Variants\n\n| `variant` | Use |\n| --- | --- |\n| `preview-diff` (default) | Original and enhanced side by side (`diffStyle="split"`) or one sentence with additions marked (`"inline"`) |\n| `wand-button` | The enhancement is applied in place; Undo restores the original |\n| `auto-enhance-toggle` | A switch: when on, Send enhances the prompt first, then sends it |\n\nStates: `original`, `enhancing` (cancel), `enhanced`, `editing`, `accepted` (Undo), `reverted`, `failed` (Try again / Keep original).\n\n## Install\n\n```bash\npnpm add @nucleux/prompt-enhancer @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { PromptEnhancer } from "@nucleux/prompt-enhancer";\n\n<PromptEnhancer\n value={draft}\n onValueChange={setDraft}\n hint="Aria will expand this prompt"\n onEnhance={(prompt, { signal }) => api.enhance(prompt, { signal })}\n // resolves with { changes: [{ id, text: " from the last quarter", reason, assumption? }] }\n // or { text: "the whole enhanced prompt" }\n onSubmit={send}\n/>\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
13084
14613
  peerDependencies: {
13085
14614
  react: ">=18",
13086
14615
  "react-dom": ">=18"
13087
14616
  },
13088
14617
  twin: {
13089
- name: "md3-progress",
13090
- package: "@nucleux/md3-progress",
13091
- component: "Md3LinearProgress",
13092
- sharesApi: false
14618
+ name: "md3-prompt-enhancer",
14619
+ package: "@nucleux/md3-prompt-enhancer",
14620
+ component: "Md3PromptEnhancer",
14621
+ sharesApi: true
13093
14622
  }
13094
14623
  },
13095
14624
  {
@@ -15288,54 +16817,368 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
15288
16817
  default: '"chip-row"'
15289
16818
  },
15290
16819
  {
15291
- name: "label",
15292
- type: "React.ReactNode",
16820
+ name: "label",
16821
+ type: "React.ReactNode",
16822
+ required: false,
16823
+ description: 'A short lead shown before the set ("Try asking:"); also names the list.'
16824
+ },
16825
+ {
16826
+ name: "max",
16827
+ type: "number",
16828
+ required: false,
16829
+ description: "The most items shown. Defaults to 5 (the spec's 3\u20135 cap).",
16830
+ default: "5"
16831
+ },
16832
+ {
16833
+ name: "afterSelect",
16834
+ type: "SuggestedPromptsAfterSelect",
16835
+ required: false,
16836
+ description: 'After a choice: "keep" (default) leaves the set as is, "mark" keeps the others in view with the chosen one marked, "remove" removes the chosen one.',
16837
+ values: [
16838
+ "keep",
16839
+ "mark",
16840
+ "remove"
16841
+ ],
16842
+ default: '"keep"'
16843
+ },
16844
+ {
16845
+ name: "selectedId",
16846
+ type: "string | null",
16847
+ required: false,
16848
+ description: 'Controlled chosen item (its id) for `afterSelect="mark"`.'
16849
+ },
16850
+ {
16851
+ name: "onDismiss",
16852
+ type: "() => void",
16853
+ required: false,
16854
+ description: "Shows a dismiss button (contextual tooltip) and is called when it is pressed or Escape is hit."
16855
+ }
16856
+ ]
16857
+ }
16858
+ ],
16859
+ readme: '# @nucleux/suggested-prompts\n\nSuggested Prompts \u2014 smart, context-aware preset actions to jumpstart engagement \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\nA few ready-made prompts that answer "what do I type?" without blocking the\ncomposer. Choosing one hands its prompt to `onSelect` \u2014 place it in the\ncomposer as editable text; never send it.\n\n## Exports\n\n- **`SuggestedPrompts`** \u2014 the set (`items` + `onSelect`, or compose children)\n- **`SuggestedPrompt`** \u2014 one suggestion (a button; `icon`, `description`, `selected`)\n- Types: `SuggestedPromptsProps`, `SuggestedPromptProps`, `SuggestedPromptItem`, `SuggestedPromptsVariant`, `SuggestedPromptsAfterSelect`\n\n## Variants\n\n| `variant` | Use |\n| --- | --- |\n| `chip-row` (default) | Pills above the composer in an empty thread. |\n| `card-list` | Stacked cards with a supporting line, in an assistant panel. |\n| `contextual-tooltip` | A dark bubble by the selection or cursor with one action; `onDismiss` adds \xD7 and Escape. |\n\n## Behaviour\n\n- `items` are strings or `{ id?, title, prompt?, description?, icon? }`; `onSelect(prompt, item)` gets the fuller `prompt` when there is one.\n- Capped at `max` (5).\n- `afterSelect`: `"keep"` (default), `"mark"` (others stay, the chosen one gets `aria-pressed`; control it with `selectedId`) or `"remove"` (remove once tapped).\n- With `items` the set is a list named by `label` ("Try asking:"), or "Suggested prompts".\n- Hide the set once the person types (the `hidden` attribute, or don\'t render it). `InitialCta` does this for you.\n\n## Usage\n\n```tsx\nimport { SuggestedPrompts } from "@nucleux/suggested-prompts";\n\n<SuggestedPrompts\n label="Try asking:"\n items={[\n { title: "Find unresolved decisions", prompt: "Find the unresolved decisions blocking the September release." },\n "Draft a follow-up to Acme Corp",\n "Which accounts need attention?",\n ]}\n onSelect={(prompt) => { setDraft(prompt); composerRef.current?.focus(); }}\n/>\n```\n\n## Install\n\n```bash\npnpm add @nucleux/suggested-prompts @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
16860
+ peerDependencies: {
16861
+ react: ">=18",
16862
+ "react-dom": ">=18"
16863
+ },
16864
+ twin: {
16865
+ name: "md3-suggested-prompts",
16866
+ package: "@nucleux/md3-suggested-prompts",
16867
+ component: "Md3SuggestedPrompts",
16868
+ sharesApi: true
16869
+ }
16870
+ },
16871
+ {
16872
+ name: "suggestions",
16873
+ package: "@nucleux/suggestions",
16874
+ kind: "component",
16875
+ description: 'Context-aware quick-action chips that save the person forming, typing and\nsubmitting the obvious next step: above the composer as starters or quick\nedits ("compose"), under an answer as follow-ups ("follow-up", marked \u21B3),\nor as a floating toolbar on highlighted content ("selection"). At most three\nverb-labelled chips; the row can be marked as the agent\'s (`label`), explain\nitself behind an info toggle (`reason`) and be dismissed (button or Escape).\nChoosing a chip only calls `onSelect` \u2014 it never sends \u2014 and the row can\nthen show a one-line confirmation with Undo, a dismissed or no-longer-relevant\nline, a loading line or an error with Retry, through `status`. Arrow keys,\nHome and End move between chips.',
16876
+ summary: "Suggestions \u2014 quick-action chips above the composer, under an answer or on a selection that add to the request, never send it \u2014 Nucleux agentic UI for React.",
16877
+ keywords: [
16878
+ "nucleux",
16879
+ "react",
16880
+ "ui",
16881
+ "components",
16882
+ "agentic",
16883
+ "ai",
16884
+ "tailwind",
16885
+ "suggestions",
16886
+ "prompt-scaffold",
16887
+ "chips"
16888
+ ],
16889
+ exports: [
16890
+ "suggestionsMessages",
16891
+ "suggestionKey",
16892
+ "appendSuggestion",
16893
+ "handleSuggestionsKeyDown",
16894
+ "useSuggestions",
16895
+ "Suggestions",
16896
+ "useSuggestionsComposer",
16897
+ "SuggestionsComposer",
16898
+ "SuggestionItem",
16899
+ "SuggestionsVariant",
16900
+ "SuggestionsStatus",
16901
+ "SuggestionsMessages",
16902
+ "SuggestionsProps",
16903
+ "SuggestionsComposerProps"
16904
+ ],
16905
+ components: [
16906
+ "Suggestions",
16907
+ "SuggestionsComposer"
16908
+ ],
16909
+ import: 'import { Suggestions, SuggestionsComposer } from "@nucleux/suggestions";',
16910
+ installSingle: "pnpm add @nucleux/suggestions @nucleux/tokens",
16911
+ props: [
16912
+ {
16913
+ name: "SuggestionsProps",
16914
+ source: 'export interface SuggestionsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect"> {\n /** The chips. Only the first `max` are shown. */\n suggestions: SuggestionItem[];\n /** "compose" (default), "follow-up" or "selection". */\n variant?: SuggestionsVariant;\n /** What the row shows. Defaults to "available". */\n status?: SuggestionsStatus;\n /** Visible heading marking the row as the agent\'s ("Aria suggests"). Also names the group. */\n label?: React.ReactNode;\n /** Why these help \u2014 behind an info toggle (`aria-expanded`). */\n reason?: React.ReactNode;\n /**\n * Prefix for each chip\'s accessible name, saying what pressing it does:\n * "Add to prompt" makes a chip read "Add to prompt: Include unresolved blockers".\n */\n actionLabel?: string;\n /** Maximum chips shown. Defaults to 3 \u2014 more is a menu, not a shortcut. */\n max?: number;\n /** A chip whose action is running: it shows a spinner and `aria-busy`. */\n pendingId?: string;\n /** The suggestion that was added \u2014 named by the "accepted" line. */\n accepted?: SuggestionItem;\n /** Called with the chosen suggestion and its index. The row never sends anything itself. */\n onSelect?: (item: SuggestionItem, index: number) => void;\n /** Shows a dismiss button (Escape works too) and is called when it is pressed. */\n onDismiss?: () => void;\n /** Shows Undo on the "accepted" line. */\n onUndo?: () => void;\n /** Shows Retry on the "error" line. */\n onRetry?: () => void;\n /** Copy overrides. */\n messages?: Partial<SuggestionsMessages>;\n}',
16915
+ extends: [
16916
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect">'
16917
+ ],
16918
+ members: [
16919
+ {
16920
+ name: "suggestions",
16921
+ type: "SuggestionItem[]",
16922
+ required: true,
16923
+ description: "The chips. Only the first `max` are shown."
16924
+ },
16925
+ {
16926
+ name: "variant",
16927
+ type: "SuggestionsVariant",
16928
+ required: false,
16929
+ description: '"compose" (default), "follow-up" or "selection".',
16930
+ values: [
16931
+ "compose",
16932
+ "follow-up",
16933
+ "selection"
16934
+ ]
16935
+ },
16936
+ {
16937
+ name: "status",
16938
+ type: "SuggestionsStatus",
16939
+ required: false,
16940
+ description: 'What the row shows. Defaults to "available".',
16941
+ values: [
16942
+ "idle",
16943
+ "loading",
16944
+ "available",
16945
+ "error",
16946
+ "accepted",
16947
+ "dismissed",
16948
+ "irrelevant"
16949
+ ]
16950
+ },
16951
+ {
16952
+ name: "label",
16953
+ type: "React.ReactNode",
16954
+ required: false,
16955
+ description: `Visible heading marking the row as the agent's ("Aria suggests"). Also names the group.`
16956
+ },
16957
+ {
16958
+ name: "reason",
16959
+ type: "React.ReactNode",
16960
+ required: false,
16961
+ description: "Why these help \u2014 behind an info toggle (`aria-expanded`)."
16962
+ },
16963
+ {
16964
+ name: "actionLabel",
16965
+ type: "string",
16966
+ required: false,
16967
+ description: `Prefix for each chip's accessible name, saying what pressing it does: "Add to prompt" makes a chip read "Add to prompt: Include unresolved blockers".`
16968
+ },
16969
+ {
16970
+ name: "max",
16971
+ type: "number",
16972
+ required: false,
16973
+ description: "Maximum chips shown. Defaults to 3 \u2014 more is a menu, not a shortcut."
16974
+ },
16975
+ {
16976
+ name: "pendingId",
16977
+ type: "string",
16978
+ required: false,
16979
+ description: "A chip whose action is running: it shows a spinner and `aria-busy`."
16980
+ },
16981
+ {
16982
+ name: "accepted",
16983
+ type: "SuggestionItem",
16984
+ required: false,
16985
+ description: 'The suggestion that was added \u2014 named by the "accepted" line.'
16986
+ },
16987
+ {
16988
+ name: "onSelect",
16989
+ type: "(item: SuggestionItem, index: number) => void",
16990
+ required: false,
16991
+ description: "Called with the chosen suggestion and its index. The row never sends anything itself."
16992
+ },
16993
+ {
16994
+ name: "onDismiss",
16995
+ type: "() => void",
16996
+ required: false,
16997
+ description: "Shows a dismiss button (Escape works too) and is called when it is pressed."
16998
+ },
16999
+ {
17000
+ name: "onUndo",
17001
+ type: "() => void",
17002
+ required: false,
17003
+ description: 'Shows Undo on the "accepted" line.'
17004
+ },
17005
+ {
17006
+ name: "onRetry",
17007
+ type: "() => void",
17008
+ required: false,
17009
+ description: 'Shows Retry on the "error" line.'
17010
+ },
17011
+ {
17012
+ name: "messages",
17013
+ type: "Partial<SuggestionsMessages>",
17014
+ required: false,
17015
+ description: "Copy overrides."
17016
+ }
17017
+ ]
17018
+ },
17019
+ {
17020
+ name: "SuggestionsComposerProps",
17021
+ source: 'export interface SuggestionsComposerProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSubmit" | "onSelect" | "defaultValue" | "onChange"> {\n /** Controlled draft. Omit (and use `defaultValue`) for an uncontrolled composer. */\n value?: string;\n /** Initial draft when uncontrolled. */\n defaultValue?: string;\n /** Called whenever the draft changes \u2014 typing, adding a suggestion, Undo. */\n onValueChange?: (value: string) => void;\n /** Called with the trimmed draft when the person sends. Suggestions never send on their own. */\n onSubmit: (value: string) => void | Promise<unknown>;\n /** Suggestions the app already has for this request (data, no model call). */\n suggestions?: SuggestionItem[];\n /**\n * Fetch suggestions for the draft after a pause in typing. Abort on `signal`.\n * While pending the row shows a loading line; a rejection shows Retry.\n */\n loadSuggestions?: (draft: string, options: { signal: AbortSignal }) => Promise<SuggestionItem[]>;\n /** How long typing must pause before suggestions are offered, in ms. Defaults to 900. */\n pauseMs?: number;\n /** Shortest draft (trimmed) that gets suggestions. Defaults to 12 characters. */\n minLength?: number;\n /** Whether the suggestions still fit the draft. When it turns false they withdraw quietly. */\n isRelevant?: (draft: string, suggestions: SuggestionItem[]) => boolean;\n /** How a suggestion is added to the draft. Defaults to `appendSuggestion` \u2014 after their words, never replacing them. */\n join?: (draft: string, text: string) => string;\n /** Visible heading marking the row as the agent\'s ("Aria suggests"). */\n label?: React.ReactNode;\n /** Why these help \u2014 behind an info toggle. */\n reason?: React.ReactNode;\n /** Chip accessible-name prefix. Defaults to "Add to prompt". */\n actionLabel?: string;\n /** Allow Dismiss. Defaults to true. */\n dismissible?: boolean;\n /** Offer Undo after adding. Defaults to true. */\n undoable?: boolean;\n /** Maximum chips. Defaults to 3. */\n max?: number;\n /** Called after a suggestion was added, with the new draft. */\n onAccept?: (item: SuggestionItem, draft: string) => void;\n /** Called when the suggestions are dismissed. */\n onDismiss?: () => void;\n /** Called after Undo restored the draft. */\n onUndo?: () => void;\n /** Composer placeholder \u2014 also the field\'s accessible name. */\n placeholder?: string;\n /** Extra composer controls (attach, voice, model\u2026). */\n composerActions?: React.ReactNode;\n /** Show the agent as busy (send becomes stop). */\n loading?: boolean;\n /** Called by the stop button while `loading`. */\n onStop?: () => void;\n /** Copy overrides for the row. */\n messages?: Partial<SuggestionsMessages>;\n}',
17022
+ extends: [
17023
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "onSubmit" | "onSelect" | "defaultValue" | "onChange">'
17024
+ ],
17025
+ members: [
17026
+ {
17027
+ name: "value",
17028
+ type: "string",
17029
+ required: false,
17030
+ description: "Controlled draft. Omit (and use `defaultValue`) for an uncontrolled composer."
17031
+ },
17032
+ {
17033
+ name: "defaultValue",
17034
+ type: "string",
17035
+ required: false,
17036
+ description: "Initial draft when uncontrolled."
17037
+ },
17038
+ {
17039
+ name: "onValueChange",
17040
+ type: "(value: string) => void",
17041
+ required: false,
17042
+ description: "Called whenever the draft changes \u2014 typing, adding a suggestion, Undo."
17043
+ },
17044
+ {
17045
+ name: "onSubmit",
17046
+ type: "(value: string) => void | Promise<unknown>",
17047
+ required: true,
17048
+ description: "Called with the trimmed draft when the person sends. Suggestions never send on their own."
17049
+ },
17050
+ {
17051
+ name: "suggestions",
17052
+ type: "SuggestionItem[]",
17053
+ required: false,
17054
+ description: "Suggestions the app already has for this request (data, no model call)."
17055
+ },
17056
+ {
17057
+ name: "loadSuggestions",
17058
+ type: "(draft: string, options: { signal: AbortSignal }) => Promise<SuggestionItem[]>",
17059
+ required: false,
17060
+ description: "Fetch suggestions for the draft after a pause in typing. Abort on `signal`. While pending the row shows a loading line; a rejection shows Retry."
17061
+ },
17062
+ {
17063
+ name: "pauseMs",
17064
+ type: "number",
17065
+ required: false,
17066
+ description: "How long typing must pause before suggestions are offered, in ms. Defaults to 900."
17067
+ },
17068
+ {
17069
+ name: "minLength",
17070
+ type: "number",
17071
+ required: false,
17072
+ description: "Shortest draft (trimmed) that gets suggestions. Defaults to 12 characters."
17073
+ },
17074
+ {
17075
+ name: "isRelevant",
17076
+ type: "(draft: string, suggestions: SuggestionItem[]) => boolean",
17077
+ required: false,
17078
+ description: "Whether the suggestions still fit the draft. When it turns false they withdraw quietly."
17079
+ },
17080
+ {
17081
+ name: "join",
17082
+ type: "(draft: string, text: string) => string",
17083
+ required: false,
17084
+ description: "How a suggestion is added to the draft. Defaults to `appendSuggestion` \u2014 after their words, never replacing them."
17085
+ },
17086
+ {
17087
+ name: "label",
17088
+ type: "React.ReactNode",
17089
+ required: false,
17090
+ description: `Visible heading marking the row as the agent's ("Aria suggests").`
17091
+ },
17092
+ {
17093
+ name: "reason",
17094
+ type: "React.ReactNode",
17095
+ required: false,
17096
+ description: "Why these help \u2014 behind an info toggle."
17097
+ },
17098
+ {
17099
+ name: "actionLabel",
17100
+ type: "string",
17101
+ required: false,
17102
+ description: 'Chip accessible-name prefix. Defaults to "Add to prompt".'
17103
+ },
17104
+ {
17105
+ name: "dismissible",
17106
+ type: "boolean",
17107
+ required: false,
17108
+ description: "Allow Dismiss. Defaults to true."
17109
+ },
17110
+ {
17111
+ name: "undoable",
17112
+ type: "boolean",
17113
+ required: false,
17114
+ description: "Offer Undo after adding. Defaults to true."
17115
+ },
17116
+ {
17117
+ name: "max",
17118
+ type: "number",
17119
+ required: false,
17120
+ description: "Maximum chips. Defaults to 3."
17121
+ },
17122
+ {
17123
+ name: "onAccept",
17124
+ type: "(item: SuggestionItem, draft: string) => void",
17125
+ required: false,
17126
+ description: "Called after a suggestion was added, with the new draft."
17127
+ },
17128
+ {
17129
+ name: "onDismiss",
17130
+ type: "() => void",
17131
+ required: false,
17132
+ description: "Called when the suggestions are dismissed."
17133
+ },
17134
+ {
17135
+ name: "onUndo",
17136
+ type: "() => void",
17137
+ required: false,
17138
+ description: "Called after Undo restored the draft."
17139
+ },
17140
+ {
17141
+ name: "placeholder",
17142
+ type: "string",
15293
17143
  required: false,
15294
- description: 'A short lead shown before the set ("Try asking:"); also names the list.'
17144
+ description: "Composer placeholder \u2014 also the field's accessible name."
15295
17145
  },
15296
17146
  {
15297
- name: "max",
15298
- type: "number",
17147
+ name: "composerActions",
17148
+ type: "React.ReactNode",
15299
17149
  required: false,
15300
- description: "The most items shown. Defaults to 5 (the spec's 3\u20135 cap).",
15301
- default: "5"
17150
+ description: "Extra composer controls (attach, voice, model\u2026)."
15302
17151
  },
15303
17152
  {
15304
- name: "afterSelect",
15305
- type: "SuggestedPromptsAfterSelect",
17153
+ name: "loading",
17154
+ type: "boolean",
15306
17155
  required: false,
15307
- description: 'After a choice: "keep" (default) leaves the set as is, "mark" keeps the others in view with the chosen one marked, "remove" removes the chosen one.',
15308
- values: [
15309
- "keep",
15310
- "mark",
15311
- "remove"
15312
- ],
15313
- default: '"keep"'
17156
+ description: "Show the agent as busy (send becomes stop)."
15314
17157
  },
15315
17158
  {
15316
- name: "selectedId",
15317
- type: "string | null",
17159
+ name: "onStop",
17160
+ type: "() => void",
15318
17161
  required: false,
15319
- description: 'Controlled chosen item (its id) for `afterSelect="mark"`.'
17162
+ description: "Called by the stop button while `loading`."
15320
17163
  },
15321
17164
  {
15322
- name: "onDismiss",
15323
- type: "() => void",
17165
+ name: "messages",
17166
+ type: "Partial<SuggestionsMessages>",
15324
17167
  required: false,
15325
- description: "Shows a dismiss button (contextual tooltip) and is called when it is pressed or Escape is hit."
17168
+ description: "Copy overrides for the row."
15326
17169
  }
15327
17170
  ]
15328
17171
  }
15329
17172
  ],
15330
- readme: '# @nucleux/suggested-prompts\n\nSuggested Prompts \u2014 smart, context-aware preset actions to jumpstart engagement \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\nA few ready-made prompts that answer "what do I type?" without blocking the\ncomposer. Choosing one hands its prompt to `onSelect` \u2014 place it in the\ncomposer as editable text; never send it.\n\n## Exports\n\n- **`SuggestedPrompts`** \u2014 the set (`items` + `onSelect`, or compose children)\n- **`SuggestedPrompt`** \u2014 one suggestion (a button; `icon`, `description`, `selected`)\n- Types: `SuggestedPromptsProps`, `SuggestedPromptProps`, `SuggestedPromptItem`, `SuggestedPromptsVariant`, `SuggestedPromptsAfterSelect`\n\n## Variants\n\n| `variant` | Use |\n| --- | --- |\n| `chip-row` (default) | Pills above the composer in an empty thread. |\n| `card-list` | Stacked cards with a supporting line, in an assistant panel. |\n| `contextual-tooltip` | A dark bubble by the selection or cursor with one action; `onDismiss` adds \xD7 and Escape. |\n\n## Behaviour\n\n- `items` are strings or `{ id?, title, prompt?, description?, icon? }`; `onSelect(prompt, item)` gets the fuller `prompt` when there is one.\n- Capped at `max` (5).\n- `afterSelect`: `"keep"` (default), `"mark"` (others stay, the chosen one gets `aria-pressed`; control it with `selectedId`) or `"remove"` (remove once tapped).\n- With `items` the set is a list named by `label` ("Try asking:"), or "Suggested prompts".\n- Hide the set once the person types (the `hidden` attribute, or don\'t render it). `InitialCta` does this for you.\n\n## Usage\n\n```tsx\nimport { SuggestedPrompts } from "@nucleux/suggested-prompts";\n\n<SuggestedPrompts\n label="Try asking:"\n items={[\n { title: "Find unresolved decisions", prompt: "Find the unresolved decisions blocking the September release." },\n "Draft a follow-up to Acme Corp",\n "Which accounts need attention?",\n ]}\n onSelect={(prompt) => { setDraft(prompt); composerRef.current?.focus(); }}\n/>\n```\n\n## Install\n\n```bash\npnpm add @nucleux/suggested-prompts @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
17173
+ readme: '# @nucleux/suggestions\n\nSuggestions \u2014 quick-action chips above the composer, under an answer or on a selection that add to the request, never send it \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\nContext-aware chips that turn the likely next step into a tap. At most three,\nlabelled with verbs. They can be marked as the agent\'s ("Aria suggests"),\nexplain themselves behind an info toggle and be dismissed. Choosing one never\nsends: it is appended after the person\'s own words, stays editable, and is\nconfirmed in one line with Undo.\n\n## Exports\n\n- **`Suggestions`** \u2014 the chip row and its status lines\n- **`SuggestionsComposer`** \u2014 the row wired to `OpenInput`: pause before offering, append with Undo, dismiss, withdraw when no longer relevant, optional async loading\n- Helpers shared with the Material 3 twin: `appendSuggestion`, `handleSuggestionsKeyDown`, `useSuggestions`, `useSuggestionsComposer`, `suggestionsMessages`, `suggestionKey`\n- Types: `SuggestionsProps`, `SuggestionsComposerProps`, `SuggestionItem`, `SuggestionsVariant`, `SuggestionsStatus`, `SuggestionsMessages`\n\n## Variants\n\n| `variant` | Use |\n| --- | --- |\n| `compose` (default) | Chips just above the composer: starters or quick edits. |\n| `follow-up` | Under an answer: what to ask next (marked \u21B3). |\n| `selection` | A floating toolbar of actions on highlighted content (`role="toolbar"`). |\n\n## States (`status`)\n\n`available` (chips) \xB7 `loading` \xB7 `error` (Retry via `onRetry`) \xB7 `accepted` (Undo via `onUndo`) \xB7 `dismissed` \xB7 `irrelevant` \xB7 `idle` (renders nothing).\n\n## Behaviour\n\n- `label` gives the row a visible heading and names the group; without it, pass `aria-label`.\n- `reason` sits behind an info button (`aria-expanded`). `onDismiss` adds a close button; Escape dismisses too.\n- `actionLabel` prefixes each chip\'s accessible name ("Add to prompt: Include unresolved blockers").\n- Arrow keys move between chips, Home/End jump to the ends; every chip is also a Tab stop.\n- `pendingId` marks a chip whose action is running (spinner, `aria-busy`).\n- No model calls: suggestions are data (`suggestions`) or an async `loadSuggestions(draft, { signal })` the app supplies.\n\n## Usage\n\n```tsx\nimport { SuggestionsComposer } from "@nucleux/suggestions";\n\n<SuggestionsComposer\n label="Aria suggests"\n reason="Release summaries are read to decide what still needs attention."\n suggestions={[\n { label: "Include unresolved blockers" },\n { label: "Group the work by owner" },\n { label: "Compare with the August release" },\n ]}\n isRelevant={(draft) => /release/i.test(draft)}\n onSubmit={send}\n/>\n```\n\n```tsx\nimport { Suggestions } from "@nucleux/suggestions";\n\n<Suggestions variant="follow-up" aria-label="Suggested follow-ups"\n suggestions={[{ label: "Why Acme?" }, { label: "Draft outreach" }]} onSelect={(s) => ask(s.label)} />\n```\n\n## Install\n\n```bash\npnpm add @nucleux/suggestions @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
15331
17174
  peerDependencies: {
15332
17175
  react: ">=18",
15333
17176
  "react-dom": ">=18"
15334
17177
  },
15335
17178
  twin: {
15336
- name: "md3-suggested-prompts",
15337
- package: "@nucleux/md3-suggested-prompts",
15338
- component: "Md3SuggestedPrompts",
17179
+ name: "md3-suggestions",
17180
+ package: "@nucleux/md3-suggestions",
17181
+ component: "Md3Suggestions",
15339
17182
  sharesApi: true
15340
17183
  }
15341
17184
  },
@@ -16765,6 +18608,259 @@ Source: Figma "Context Expansion / Connector suggestion card".`,
16765
18608
  component: "Md3VoiceInput",
16766
18609
  sharesApi: true
16767
18610
  }
18611
+ },
18612
+ {
18613
+ name: "voice-tone",
18614
+ package: "@nucleux/voice-tone",
18615
+ kind: "component",
18616
+ description: "The id a described (custom) tone takes as the value.",
18617
+ summary: "Voice & Tone \u2014 say how the reply should sound (named presets, a rules list, a sample line), sent beside the prompt and never editing it \u2014 Nucleux agentic UI for React.",
18618
+ keywords: [
18619
+ "nucleux",
18620
+ "react",
18621
+ "ui",
18622
+ "components",
18623
+ "agentic",
18624
+ "ai",
18625
+ "tailwind",
18626
+ "voice-tone",
18627
+ "tone",
18628
+ "prompt-scaffold"
18629
+ ],
18630
+ exports: [
18631
+ "VOICE_TONE_CUSTOM",
18632
+ "defaultVoiceTones",
18633
+ "defaultVoiceToneRules",
18634
+ "useVoiceTone",
18635
+ "VoiceTone",
18636
+ "VoiceToneOption",
18637
+ "VoiceToneRule",
18638
+ "VoiceToneSetting",
18639
+ "VoiceToneVariant",
18640
+ "VoiceToneLayout",
18641
+ "VoiceToneNotice",
18642
+ "VoiceToneProps",
18643
+ "VoiceToneState"
18644
+ ],
18645
+ components: [
18646
+ "VoiceTone",
18647
+ "VOICE_TONE_CUSTOM"
18648
+ ],
18649
+ import: 'import { VoiceTone, VOICE_TONE_CUSTOM } from "@nucleux/voice-tone";',
18650
+ installSingle: "pnpm add @nucleux/voice-tone @nucleux/tokens",
18651
+ props: [
18652
+ {
18653
+ name: "VoiceToneProps",
18654
+ source: 'export interface VoiceToneProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "onSubmit" | "defaultValue"> {\n /** Where the scaffold sits. Defaults to `"settings"`. */\n variant?: VoiceToneVariant;\n /** How tones are chosen. Defaults to `"cards"`. */\n layout?: VoiceToneLayout;\n /** The tones on offer \u2014 three or four familiar ones. Defaults to {@link defaultVoiceTones}. Pass `[]` for a rules-only panel. */\n tones?: VoiceToneOption[];\n /** Chosen tone id (controlled). `null` is the agent\'s default voice; `"custom"` a described tone. */\n value?: string | null;\n /** Initial tone id (uncontrolled). Defaults to `null`. */\n defaultValue?: string | null;\n /** Called when the tone is chosen, switched, removed or restored. */\n onValueChange?: (value: string | null) => void;\n /** Offer \u201COr describe a tone\u201D. Defaults to `true` in the composer and chip, `false` in settings. */\n allowCustom?: boolean;\n /** The described tone (controlled). */\n customTone?: string;\n /** Initial described tone (uncontrolled). */\n defaultCustomTone?: string;\n /** Called when a described tone is applied. */\n onCustomToneChange?: (text: string) => void;\n /** The rules list (settings panel). The composer variants send the rules that are on with each request. */\n rules?: VoiceToneRule[];\n /** Ids of the rules that are on (controlled). */\n ruleValues?: string[];\n /** Ids of the rules that are on initially (uncontrolled). */\n defaultRuleValues?: string[];\n /** Called with the ids of the rules that are on. */\n onRulesChange?: (ids: string[]) => void;\n /** Show the sample sentence for the tone in focus or chosen. Defaults to `true`. */\n showSample?: boolean;\n /** Let people remove the tone from the composer (with Undo). Defaults to `true`. */\n removable?: boolean;\n /** Picker open (controlled), for the composer and chip variants. */\n open?: boolean;\n /** Picker open initially (uncontrolled). */\n defaultOpen?: boolean;\n /** Called when the picker opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Seed the quiet line, e.g. to show a state in docs. A seeded `"removed"` line\'s Undo restores the\n * recommended (or first) tone.\n */\n defaultNotice?: VoiceToneNotice | null;\n /** Name of the setting \u2014 the chip, picker and group label. Defaults to `"Tone"`. */\n label?: string;\n /** Who writes, for the notices. Defaults to `"Aria"`. */\n agentName?: string;\n /** Composer text (controlled). The tone never edits it. */\n draft?: string;\n /** Initial composer text (uncontrolled). Cleared after a send. */\n defaultDraft?: string;\n /** Called when the composer text changes. */\n onDraftChange?: (text: string) => void;\n /** Called on send with the trimmed text and the tone setting, sent beside the prompt. */\n onSubmit?: (text: string, setting: VoiceToneSetting) => void;\n /** Composer placeholder, also its accessible name. Defaults to `"Describe what to write\u2026"`. */\n placeholder?: string;\n /** Show the agent as busy \u2014 the send button becomes a stop button. */\n loading?: boolean;\n /** Called by the stop button while `loading`. */\n onStop?: () => void;\n /** More composer tools, placed after the Tone chip. */\n actions?: React.ReactNode;\n}',
18655
+ extends: [
18656
+ 'Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "onSubmit" | "defaultValue">'
18657
+ ],
18658
+ members: [
18659
+ {
18660
+ name: "variant",
18661
+ type: "VoiceToneVariant",
18662
+ required: false,
18663
+ description: 'Where the scaffold sits. Defaults to `"settings"`.',
18664
+ values: [
18665
+ "settings",
18666
+ "composer",
18667
+ "chip"
18668
+ ]
18669
+ },
18670
+ {
18671
+ name: "layout",
18672
+ type: "VoiceToneLayout",
18673
+ required: false,
18674
+ description: 'How tones are chosen. Defaults to `"cards"`.',
18675
+ values: [
18676
+ "cards",
18677
+ "list",
18678
+ "segmented",
18679
+ "slider"
18680
+ ]
18681
+ },
18682
+ {
18683
+ name: "tones",
18684
+ type: "VoiceToneOption[]",
18685
+ required: false,
18686
+ description: "The tones on offer \u2014 three or four familiar ones. Defaults to {@link defaultVoiceTones}. Pass `[]` for a rules-only panel."
18687
+ },
18688
+ {
18689
+ name: "value",
18690
+ type: "string | null",
18691
+ required: false,
18692
+ description: 'Chosen tone id (controlled). `null` is the agent\'s default voice; `"custom"` a described tone.'
18693
+ },
18694
+ {
18695
+ name: "defaultValue",
18696
+ type: "string | null",
18697
+ required: false,
18698
+ description: "Initial tone id (uncontrolled). Defaults to `null`."
18699
+ },
18700
+ {
18701
+ name: "onValueChange",
18702
+ type: "(value: string | null) => void",
18703
+ required: false,
18704
+ description: "Called when the tone is chosen, switched, removed or restored."
18705
+ },
18706
+ {
18707
+ name: "allowCustom",
18708
+ type: "boolean",
18709
+ required: false,
18710
+ description: "Offer \u201COr describe a tone\u201D. Defaults to `true` in the composer and chip, `false` in settings."
18711
+ },
18712
+ {
18713
+ name: "customTone",
18714
+ type: "string",
18715
+ required: false,
18716
+ description: "The described tone (controlled)."
18717
+ },
18718
+ {
18719
+ name: "defaultCustomTone",
18720
+ type: "string",
18721
+ required: false,
18722
+ description: "Initial described tone (uncontrolled)."
18723
+ },
18724
+ {
18725
+ name: "onCustomToneChange",
18726
+ type: "(text: string) => void",
18727
+ required: false,
18728
+ description: "Called when a described tone is applied."
18729
+ },
18730
+ {
18731
+ name: "rules",
18732
+ type: "VoiceToneRule[]",
18733
+ required: false,
18734
+ description: "The rules list (settings panel). The composer variants send the rules that are on with each request."
18735
+ },
18736
+ {
18737
+ name: "ruleValues",
18738
+ type: "string[]",
18739
+ required: false,
18740
+ description: "Ids of the rules that are on (controlled)."
18741
+ },
18742
+ {
18743
+ name: "defaultRuleValues",
18744
+ type: "string[]",
18745
+ required: false,
18746
+ description: "Ids of the rules that are on initially (uncontrolled)."
18747
+ },
18748
+ {
18749
+ name: "onRulesChange",
18750
+ type: "(ids: string[]) => void",
18751
+ required: false,
18752
+ description: "Called with the ids of the rules that are on."
18753
+ },
18754
+ {
18755
+ name: "showSample",
18756
+ type: "boolean",
18757
+ required: false,
18758
+ description: "Show the sample sentence for the tone in focus or chosen. Defaults to `true`."
18759
+ },
18760
+ {
18761
+ name: "removable",
18762
+ type: "boolean",
18763
+ required: false,
18764
+ description: "Let people remove the tone from the composer (with Undo). Defaults to `true`."
18765
+ },
18766
+ {
18767
+ name: "open",
18768
+ type: "boolean",
18769
+ required: false,
18770
+ description: "Picker open (controlled), for the composer and chip variants."
18771
+ },
18772
+ {
18773
+ name: "defaultOpen",
18774
+ type: "boolean",
18775
+ required: false,
18776
+ description: "Picker open initially (uncontrolled)."
18777
+ },
18778
+ {
18779
+ name: "onOpenChange",
18780
+ type: "(open: boolean) => void",
18781
+ required: false,
18782
+ description: "Called when the picker opens or closes."
18783
+ },
18784
+ {
18785
+ name: "defaultNotice",
18786
+ type: "VoiceToneNotice | null",
18787
+ required: false,
18788
+ description: 'Seed the quiet line, e.g. to show a state in docs. A seeded `"removed"` line\'s Undo restores the recommended (or first) tone.'
18789
+ },
18790
+ {
18791
+ name: "label",
18792
+ type: "string",
18793
+ required: false,
18794
+ description: 'Name of the setting \u2014 the chip, picker and group label. Defaults to `"Tone"`.'
18795
+ },
18796
+ {
18797
+ name: "agentName",
18798
+ type: "string",
18799
+ required: false,
18800
+ description: 'Who writes, for the notices. Defaults to `"Aria"`.'
18801
+ },
18802
+ {
18803
+ name: "draft",
18804
+ type: "string",
18805
+ required: false,
18806
+ description: "Composer text (controlled). The tone never edits it."
18807
+ },
18808
+ {
18809
+ name: "defaultDraft",
18810
+ type: "string",
18811
+ required: false,
18812
+ description: "Initial composer text (uncontrolled). Cleared after a send."
18813
+ },
18814
+ {
18815
+ name: "onDraftChange",
18816
+ type: "(text: string) => void",
18817
+ required: false,
18818
+ description: "Called when the composer text changes."
18819
+ },
18820
+ {
18821
+ name: "onSubmit",
18822
+ type: "(text: string, setting: VoiceToneSetting) => void",
18823
+ required: false,
18824
+ description: "Called on send with the trimmed text and the tone setting, sent beside the prompt."
18825
+ },
18826
+ {
18827
+ name: "placeholder",
18828
+ type: "string",
18829
+ required: false,
18830
+ description: 'Composer placeholder, also its accessible name. Defaults to `"Describe what to write\u2026"`.'
18831
+ },
18832
+ {
18833
+ name: "loading",
18834
+ type: "boolean",
18835
+ required: false,
18836
+ description: "Show the agent as busy \u2014 the send button becomes a stop button."
18837
+ },
18838
+ {
18839
+ name: "onStop",
18840
+ type: "() => void",
18841
+ required: false,
18842
+ description: "Called by the stop button while `loading`."
18843
+ },
18844
+ {
18845
+ name: "actions",
18846
+ type: "React.ReactNode",
18847
+ required: false,
18848
+ description: "More composer tools, placed after the Tone chip."
18849
+ }
18850
+ ]
18851
+ }
18852
+ ],
18853
+ readme: '# @nucleux/voice-tone\n\nVoice & Tone \u2014 say how the reply should sound (named presets, a rules list, a sample line), sent beside the prompt and never editing it \u2014 Nucleux agentic UI for React.\n\nPart of **[Nucleux](https://github.com/intelligaia-open-labs/nucleux)** \u2014 agentic UI components for React. Install a single component, or the full kit via [`@nucleux/react`](https://www.npmjs.com/package/@nucleux/react).\n\nA Material 3 twin with the same API ships as [`@nucleux/md3-voice-tone`](https://www.npmjs.com/package/@nucleux/md3-voice-tone).\n\n## Exports\n\n- **`VoiceTone`** \u2014 `variant="settings"` (default): a preferences panel with tone presets, a rules list and a sample sentence. `variant="composer"`: a composer with a Tone chip that opens the tone picker (cards, list, segmented or slider; sample line; recommendation marked, never applied; \u201COr describe a tone\u201D), then names the choice and can be changed or removed with Undo. `variant="chip"`: the chip and picker alone, for your own composer.\n- **`useVoiceTone`** \u2014 the shared state and keyboard model (used by the Material 3 twin).\n- **`defaultVoiceTones`**, **`defaultVoiceToneRules`**, **`VOICE_TONE_CUSTOM`**\n- Types: `VoiceToneProps`, `VoiceToneOption`, `VoiceToneRule`, `VoiceToneSetting`, `VoiceToneVariant`, `VoiceToneLayout`, `VoiceToneNotice`, `VoiceToneState`\n\n## Install\n\n```bash\npnpm add @nucleux/voice-tone @nucleux/tokens\n```\n\n`react` / `react-dom` are peer dependencies.\n\n## Usage\n\n```tsx\nimport { VoiceTone, defaultVoiceToneRules } from "@nucleux/voice-tone";\n\n// Preferences: set once, applied to every reply.\n<VoiceTone defaultValue="professional" rules={defaultVoiceToneRules} onValueChange={saveTone} onRulesChange={saveRules} />\n\n// In the composer: the tone travels with the request as a setting \u2014 the prompt is never edited.\n<VoiceTone variant="composer" onSubmit={(text, setting) => send(text, { tone: setting })} />\n```\n\nRequires the theme once in your app: `import "@nucleux/tokens/styles.css";`\nand the Tailwind preset from `@nucleux/tokens/preset`.\n\n## License\n\nMIT \xA9 Nucleux',
18854
+ peerDependencies: {
18855
+ react: ">=18",
18856
+ "react-dom": ">=18"
18857
+ },
18858
+ twin: {
18859
+ name: "md3-voice-tone",
18860
+ package: "@nucleux/md3-voice-tone",
18861
+ component: "Md3VoiceTone",
18862
+ sharesApi: true
18863
+ }
16768
18864
  }
16769
18865
  ],
16770
18866
  examples: [
@@ -16930,9 +19026,9 @@ export const Default: Story = {
16930
19026
 
16931
19027
  // src/knowledge.json
16932
19028
  var knowledge_default = {
16933
- version: "0.6.0",
19029
+ version: "0.7.0",
16934
19030
  generatedFrom: "knowledge/ (do not edit \u2014 run scripts/gen-mcp-knowledge.mjs)",
16935
- workflow: "# Building UI with Nucleux\n\nNucleux (`@nucleux/react`) is a React + Tailwind design system in two families:\nshadcn-style (`Button`, `Disclosure`, \u2026) and Material 3 (`Md3Button`,\n`Md3Disclosure`, \u2026). The `nucleux` MCP server holds its curated page patterns and\nexact component contracts. Work design-first: find the pattern, read the\ncontracts, then write code.\n\n## Rules\n\n1. Inspect the project before changing files. Keep its framework, router,\n state management, business logic and file layout.\n2. Look for a Nucleux pattern (`search_patterns`) before laying out any page.\n Prefer a whole pattern over assembling unrelated components.\n3. Read the contract (`get_component`) before using a component. Use only the\n imports, props and variant values it lists. Never guess a Nucleux export,\n prop or variant. If it is not in the catalog, it does not exist.\n4. Pick one family per app and do not mix them: Material 3 (`Md3*`) when the\n project already uses Material Design or the user asks for it, otherwise\n shadcn. Patterns are written with shadcn components; in a Material 3 app use\n each one's `Md3` twin, and where Material 3 has none (e.g. `DataTable`), the\n shadcn component under the `md3-theme` class. Agentic components have the\n same props in both families.\n5. For AI features use the agentic components (nucleux.in's patterns):\n `Disclosure` and `Caveat` for AI output, `Consent` before acting,\n `OpenInput`/`InitialCta`/`SuggestedPrompts` for asking, `Attachments`,\n `VoiceInput` and friends for input, `ModelSelection`, `KnowledgeBase`,\n `Connector` and `McpConnection` for context. Search for them with\n `search_components` instead of building your own.\n6. Do not rebuild something Nucleux already ships (navigation, tables, cards,\n dialogs, sheets, form controls, empty/error states). If you must, say why\n in your summary.\n7. Style with the semantic token classes (`bg-background`, `text-foreground`,\n `text-muted-foreground`, `border-border`, `bg-primary`, `text-destructive`\u2026;\n in a Material 3 app the `md-*` roles: `bg-md-surface`, `text-md-on-surface`,\n `bg-md-primary-container`\u2026).\n No hex colors, no arbitrary color values. Use the same variant for the same\n meaning everywhere (one `cta` primary action per page, `destructive` only\n for destructive actions).\n8. Every page must work from 360px wide: follow each pattern's responsive rules.\n9. Accessibility is part of done: labels for every control, `aria-label` on\n icon-only buttons, visible focus, status not conveyed by color alone.\n10. Every data view handles loading, empty and error (the `page-states` pattern).\n11. When Nucleux has no pattern or component for a need, build it from Nucleux\n primitives (or the ShadCN equivalent the tools name), keep it on Nucleux\n tokens, and report the gap. Never present an invented component as Nucleux.\n12. Nucleux is not mandatory. If the project already uses another component\n system and the user did not ask to switch, extend that system and say so.\n\n## Workflow\n\n**A. Inspect the project.** Find the framework (Vite, Next.js, Remix\u2026), package\nmanager (lockfile), TypeScript, Tailwind version and config, router, existing\ncomponent system, and any installed `@nucleux/*` packages. If Nucleux is not set\nup, call `get_setup` and follow it exactly.\n\n**B. Analyse the request.** List the pages, the main user journeys, the key\ninteractions on each page, and what matters most on each screen. Ask only about\nambiguities that change the architecture; pick sensible defaults otherwise.\n\n**C. Discover.** For each page call `search_patterns` with what the page is for,\nthen `get_pattern` for the best match (`app-shell` for the frame, plus one\npattern per page). Call `get_component` for every component you will use that\nyou have not read in this session. Use `search_components` for needs inside a\npage that no pattern covers.\n\n**D. Plan.** Write a short plan: shared layout, then each route \u2192\npattern(s) \u2192 components \u2192 app-specific pieces you will write \u2192 states. Mark\nanything Nucleux does not cover. Check the plan with `validate_design` (pattern\nids plus the components and props you intend to use) and fix every error.\n\n**E. Implement.** Build the shared shell once and wrap every route in it.\nStart each page from its pattern's example, replace the sample data with the\napp's data model, and keep app-specific components (a TaskCard bound to your\ndata) in the app, composed from Nucleux parts.\n\n**F. Validate.** Run the project's type check, lint, tests and production build;\nfix every error. Re-check each page against its pattern's responsive and\naccessibility rules.\n\n**G. Report.** Summarise the pages built, the patterns and components used per\npage, design decisions, the checks you ran and their results, anything you built\ncustom and why, and the gaps or open issues.",
19031
+ workflow: "# Building UI with Nucleux\n\nNucleux (`@nucleux/react`) is a React + Tailwind design system in two families:\nshadcn-style (`Button`, `Disclosure`, \u2026) and Material 3 (`Md3Button`,\n`Md3Disclosure`, \u2026). The `nucleux` MCP server holds its curated page patterns and\nexact component contracts. Work design-first: find the pattern, read the\ncontracts, then write code.\n\n## Rules\n\n1. Inspect the project before changing files. Keep its framework, router,\n state management, business logic and file layout.\n2. Look for a Nucleux pattern (`search_patterns`) before laying out any page.\n Prefer a whole pattern over assembling unrelated components.\n3. Read the contract (`get_component`) before using a component. Use only the\n imports, props and variant values it lists. Never guess a Nucleux export,\n prop or variant. If it is not in the catalog, it does not exist.\n4. Pick one family per app and do not mix them: Material 3 (`Md3*`) when the\n project already uses Material Design or the user asks for it, otherwise\n shadcn. Patterns are written with shadcn components; in a Material 3 app use\n each one's `Md3` twin, and where Material 3 has none (e.g. `DataTable`), the\n shadcn component under the `md3-theme` class. Agentic components have the\n same props in both families.\n5. For AI features use the agentic components (nucleux.in's patterns):\n `Disclosure` and `Caveat` for AI output, `Consent` before acting,\n `OpenInput`/`InitialCta`/`SuggestedPrompts` for asking, the Prompt Scaffolds\n (`Suggestions`, `Madlibs`, `PromptEnhancer`, `Modes`, `VoiceTone`,\n `PresetStyles`) for shaping a request beside the composer, `Attachments`,\n `VoiceInput` and friends for input, `ModelSelection`, `KnowledgeBase`,\n `Connector` and `McpConnection` for context. Search for them with\n `search_components` instead of building your own.\n6. Do not rebuild something Nucleux already ships (navigation, tables, cards,\n dialogs, sheets, form controls, empty/error states). If you must, say why\n in your summary.\n7. Style with the semantic token classes (`bg-background`, `text-foreground`,\n `text-muted-foreground`, `border-border`, `bg-primary`, `text-destructive`\u2026;\n in a Material 3 app the `md-*` roles: `bg-md-surface`, `text-md-on-surface`,\n `bg-md-primary-container`\u2026).\n No hex colors, no arbitrary color values. Use the same variant for the same\n meaning everywhere (one `cta` primary action per page, `destructive` only\n for destructive actions).\n8. Every page must work from 360px wide: follow each pattern's responsive rules.\n9. Accessibility is part of done: labels for every control, `aria-label` on\n icon-only buttons, visible focus, status not conveyed by color alone.\n10. Every data view handles loading, empty and error (the `page-states` pattern).\n11. When Nucleux has no pattern or component for a need, build it from Nucleux\n primitives (or the ShadCN equivalent the tools name), keep it on Nucleux\n tokens, and report the gap. Never present an invented component as Nucleux.\n12. Nucleux is not mandatory. If the project already uses another component\n system and the user did not ask to switch, extend that system and say so.\n\n## Workflow\n\n**A. Inspect the project.** Find the framework (Vite, Next.js, Remix\u2026), package\nmanager (lockfile), TypeScript, Tailwind version and config, router, existing\ncomponent system, and any installed `@nucleux/*` packages. If Nucleux is not set\nup, call `get_setup` and follow it exactly.\n\n**B. Analyse the request.** List the pages, the main user journeys, the key\ninteractions on each page, and what matters most on each screen. Ask only about\nambiguities that change the architecture; pick sensible defaults otherwise.\n\n**C. Discover.** For each page call `search_patterns` with what the page is for,\nthen `get_pattern` for the best match (`app-shell` for the frame, plus one\npattern per page). Call `get_component` for every component you will use that\nyou have not read in this session. Use `search_components` for needs inside a\npage that no pattern covers.\n\n**D. Plan.** Write a short plan: shared layout, then each route \u2192\npattern(s) \u2192 components \u2192 app-specific pieces you will write \u2192 states. Mark\nanything Nucleux does not cover. Check the plan with `validate_design` (pattern\nids plus the components and props you intend to use) and fix every error.\n\n**E. Implement.** Build the shared shell once and wrap every route in it.\nStart each page from its pattern's example, replace the sample data with the\napp's data model, and keep app-specific components (a TaskCard bound to your\ndata) in the app, composed from Nucleux parts.\n\n**F. Validate.** Run the project's type check, lint, tests and production build;\nfix every error. Re-check each page against its pattern's responsive and\naccessibility rules.\n\n**G. Report.** Summarise the pages built, the patterns and components used per\npage, design decisions, the checks you ran and their results, anything you built\ncustom and why, and the gaps or open issues.",
16936
19032
  patterns: [
16937
19033
  {
16938
19034
  id: "analytics-charts",
@@ -19509,7 +21605,7 @@ var FALLBACK_HINT = `_Need something Nucleux does not ship? Start from the ShadC
19509
21605
  // src/html-snippets.json
19510
21606
  var html_snippets_default = {
19511
21607
  generatedFrom: "packages/mcp/gen/fixtures.tsx (do not edit \u2014 run scripts/gen-html-snippets.mjs)",
19512
- count: 167,
21608
+ count: 179,
19513
21609
  snippets: {
19514
21610
  avatar: {
19515
21611
  name: "Avatar",
@@ -21016,6 +23112,213 @@ var html_snippets_default = {
21016
23112
  "Cancel",
21017
23113
  "Confirm"
21018
23114
  ]
23115
+ },
23116
+ suggestions: {
23117
+ name: "Suggestions",
23118
+ html: '<div role="group" aria-labelledby="__NX_ID_0__-label" class="flex flex-col gap-2 motion-safe:animate-nx-fade-in"><div class="flex min-h-8 items-center gap-2"><span id="__NX_ID_0__-label" class="inline-flex items-center gap-1.5 text-xs font-medium text-muted-foreground"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round" focusable="false" data-ai-glyph="generated" class="shrink-0 size-4 text-brand" aria-hidden="true"><path d="M5 4h14a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1h-7l-4 3v-3H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z"></path><path d="M12 6.5c.3 2.2 1.3 3.2 3.5 3.5-2.2.3-3.2 1.3-3.5 3.5-.3-2.2-1.3-3.2-3.5-3.5 2.2-.3 3.2-1.3 3.5-3.5z" fill="currentColor" stroke="none"></path></svg>Aria suggests</span><span class="ml-auto inline-flex items-center gap-0.5"><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap font-semibold tracking-[0.005em] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 hover:bg-accent size-8 rounded-lg text-muted-foreground" aria-label="Why these suggestions" aria-expanded="false"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info size-4" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg></button><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap font-semibold tracking-[0.005em] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 hover:bg-accent size-8 rounded-lg text-muted-foreground" aria-label="Dismiss suggestions"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x size-4" aria-hidden="true"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></button></span></div><div class="flex flex-wrap gap-1.5"><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap tracking-[0.005em] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 h-auto min-h-8 rounded-sm px-3 py-1.5 text-sm font-normal shadow-none transition-colors motion-reduce:transition-none border border-border bg-background text-foreground hover:border-foreground hover:bg-background" data-suggestion="" aria-label="Add to prompt: Include unresolved blockers">Include unresolved blockers</button><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap tracking-[0.005em] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 h-auto min-h-8 rounded-sm px-3 py-1.5 text-sm font-normal shadow-none transition-colors motion-reduce:transition-none border border-border bg-background text-foreground hover:border-foreground hover:bg-background" data-suggestion="" aria-label="Add to prompt: Group the work by owner">Group the work by owner</button><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap tracking-[0.005em] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 h-auto min-h-8 rounded-sm px-3 py-1.5 text-sm font-normal shadow-none transition-colors motion-reduce:transition-none border border-border bg-background text-foreground hover:border-foreground hover:bg-background" data-suggestion="" aria-label="Add to prompt: Compare with the August release">Compare with the August release</button></div></div>',
23119
+ idCount: 1,
23120
+ text: [
23121
+ "Aria suggests",
23122
+ "Include unresolved blockers",
23123
+ "Group the work by owner",
23124
+ "Compare with the August release"
23125
+ ]
23126
+ },
23127
+ md3suggestions: {
23128
+ name: "Md3Suggestions",
23129
+ html: `<div role="group" aria-labelledby="__NX_ID_0__-label" class="flex flex-col gap-2 motion-safe:animate-nx-fade-in"><div class="flex min-h-8 items-center gap-2 px-0.5"><span id="__NX_ID_0__-label" class="inline-flex items-center gap-1.5 text-sm font-medium text-md-on-surface-variant"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round" focusable="false" data-ai-glyph="generated" class="shrink-0 size-[18px]" aria-hidden="true"><path d="M5 4h14a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1h-7l-4 3v-3H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z"></path><path d="M12 6.5c.3 2.2 1.3 3.2 3.5 3.5-2.2.3-3.2 1.3-3.5 3.5-.3-2.2-1.3-3.2-3.5-3.5 2.2-.3 3.2-1.3 3.5-3.5z" fill="currentColor" stroke="none"></path></svg>Aria suggests</span><span class="ml-auto inline-flex items-center gap-0.5"><button type="button" class="relative inline-flex items-center justify-center overflow-hidden rounded-full transition-colors 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] outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface disabled:pointer-events-none disabled:opacity-[0.38] bg-transparent text-md-on-surface-variant size-8 [&_svg]:size-5" aria-label="Why these suggestions" aria-expanded="false"><span class="relative"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg></span></button><button type="button" class="relative inline-flex items-center justify-center overflow-hidden rounded-full transition-colors 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] outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface disabled:pointer-events-none disabled:opacity-[0.38] bg-transparent text-md-on-surface-variant size-8 [&_svg]:size-5" aria-label="Dismiss suggestions"><span class="relative"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x" aria-hidden="true"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></span></button></span></div><div class="flex flex-wrap gap-2"><button type="button" class="relative inline-flex items-center gap-1.5 overflow-hidden rounded-md-sm px-3 transition-colors [&_svg]:size-[18px] border outline-none focus-visible:ring-2 focus-visible:ring-md-primary disabled:pointer-events-none disabled:opacity-[0.38] 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] h-auto min-h-8 rounded-md-sm py-1 pl-2 pr-3.5 text-sm font-normal motion-reduce:before:transition-none border-md-outline-variant bg-md-surface text-md-on-surface-variant" data-suggestion="" aria-label="Add to prompt: Include unresolved blockers"><span class="relative shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plus text-md-primary" aria-hidden="true"><path d="M5 12h14"></path><path d="M12 5v14"></path></svg></span><span class="relative">Include unresolved blockers</span></button><button type="button" class="relative inline-flex items-center gap-1.5 overflow-hidden rounded-md-sm px-3 transition-colors [&_svg]:size-[18px] border outline-none focus-visible:ring-2 focus-visible:ring-md-primary disabled:pointer-events-none disabled:opacity-[0.38] 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] h-auto min-h-8 rounded-md-sm py-1 pl-2 pr-3.5 text-sm font-normal motion-reduce:before:transition-none border-md-outline-variant bg-md-surface text-md-on-surface-variant" data-suggestion="" aria-label="Add to prompt: Group the work by owner"><span class="relative shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plus text-md-primary" aria-hidden="true"><path d="M5 12h14"></path><path d="M12 5v14"></path></svg></span><span class="relative">Group the work by owner</span></button><button type="button" class="relative inline-flex items-center gap-1.5 overflow-hidden rounded-md-sm px-3 transition-colors [&_svg]:size-[18px] border outline-none focus-visible:ring-2 focus-visible:ring-md-primary disabled:pointer-events-none disabled:opacity-[0.38] 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] h-auto min-h-8 rounded-md-sm py-1 pl-2 pr-3.5 text-sm font-normal motion-reduce:before:transition-none border-md-outline-variant bg-md-surface text-md-on-surface-variant" data-suggestion="" aria-label="Add to prompt: Compare with the August release"><span class="relative shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plus text-md-primary" aria-hidden="true"><path d="M5 12h14"></path><path d="M12 5v14"></path></svg></span><span class="relative">Compare with the August release</span></button></div></div>`,
23130
+ idCount: 1,
23131
+ text: [
23132
+ "Aria suggests",
23133
+ "Include unresolved blockers",
23134
+ "Group the work by owner",
23135
+ "Compare with the August release"
23136
+ ]
23137
+ },
23138
+ madlibs: {
23139
+ name: "Madlibs",
23140
+ html: '<div class="border border-border bg-background text-foreground shadow-sm flex w-full max-w-xl flex-col rounded-2xl gap-3.5 p-5" role="group" aria-labelledby="__NX_ID_0__-heading" data-status="partial"><p id="__NX_ID_0__-heading" class="flex items-center gap-1.5 text-[10px] font-semibold uppercase leading-4 tracking-[0.1em] text-muted-foreground">Build your request</p><div class="text-[15px] text-foreground leading-[38px]"><span class="">Summarize </span><span class="relative max-w-full align-middle mx-1 inline-flex"><input id="__NX_ID_0__-blank-document" autoComplete="off" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="__NX_ID_0__-blank-document-list" type="text" placeholder="document" aria-label="Document" aria-required="true" style="width:calc(19.0ch + 2.5rem)" class="h-[34px] min-w-0 max-w-full pl-2.5 pr-7 text-[13px] font-medium text-foreground outline-none transition-colors placeholder:font-normal placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background motion-reduce:transition-none rounded-md border border-warning bg-warning/10" value="Q3 Customer Research"/><span aria-hidden="true" class="pointer-events-none absolute right-2 top-1/2 inline-flex -translate-y-1/2 text-warning"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down size-3.5"><path d="m6 9 6 6 6-6"></path></svg></span><span id="__NX_ID_0__-blank-document-list" role="listbox" aria-label="Document" hidden="" class="absolute left-0 top-full z-20 mt-1 w-max min-w-full max-w-xs rounded-md border border-border bg-background p-1 text-left shadow-md hidden"><span id="__NX_ID_0__-blank-document-list-0" role="option" aria-selected="false" class="flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm font-normal leading-5 text-foreground"><span class="flex-1">Q3 Customer Research</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check size-3.5" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg></span><span id="__NX_ID_0__-blank-document-list-1" role="option" aria-selected="false" class="flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm font-normal leading-5 text-foreground"><span class="flex-1">September release notes</span></span></span></span><span class=""> for </span><span class="relative max-w-full align-middle mx-1 inline-flex"><input id="__NX_ID_0__-blank-audience" autoComplete="off" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="__NX_ID_0__-blank-audience-list" type="text" placeholder="audience" aria-label="Audience" aria-required="true" style="width:calc(7.6ch + 2.5rem)" class="h-[34px] min-w-0 max-w-full pl-2.5 pr-7 text-[13px] font-medium text-foreground outline-none transition-colors placeholder:font-normal placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background motion-reduce:transition-none rounded-md border border-dashed border-muted-foreground/50 bg-background" value=""/><span aria-hidden="true" class="pointer-events-none absolute right-2 top-1/2 inline-flex -translate-y-1/2 text-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down size-3.5"><path d="m6 9 6 6 6-6"></path></svg></span><span id="__NX_ID_0__-blank-audience-list" role="listbox" aria-label="Audience" hidden="" class="absolute left-0 top-full z-20 mt-1 w-max min-w-full max-w-xs rounded-md border border-border bg-background p-1 text-left shadow-md hidden"><span id="__NX_ID_0__-blank-audience-list-0" role="option" aria-selected="false" class="flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm font-normal leading-5 text-foreground"><span class="flex-1">Leadership</span></span><span id="__NX_ID_0__-blank-audience-list-1" role="option" aria-selected="false" class="flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm font-normal leading-5 text-foreground"><span class="flex-1">Engineering</span></span></span></span><span class="text-muted-foreground">, focusing on </span><span class="relative max-w-full align-middle mx-1 inline-flex"><input id="__NX_ID_0__-blank-topic" autoComplete="off" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="__NX_ID_0__-blank-topic-list" type="text" placeholder="topic" aria-label="Topic (optional)" style="width:calc(4.8ch + 2.5rem)" class="h-[34px] min-w-0 max-w-full pl-2.5 pr-7 text-[13px] font-medium text-foreground outline-none transition-colors placeholder:font-normal placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background motion-reduce:transition-none rounded-md border border-dashed border-muted-foreground/50 bg-background" value=""/><span aria-hidden="true" class="pointer-events-none absolute right-2 top-1/2 inline-flex -translate-y-1/2 text-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down size-3.5"><path d="m6 9 6 6 6-6"></path></svg></span><span id="__NX_ID_0__-blank-topic-list" role="listbox" aria-label="Topic" hidden="" class="absolute left-0 top-full z-20 mt-1 w-max min-w-full max-w-xs rounded-md border border-border bg-background p-1 text-left shadow-md hidden"><span id="__NX_ID_0__-blank-topic-list-0" role="option" aria-selected="false" class="flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm font-normal leading-5 text-foreground"><span class="flex-1">Onboarding issues</span></span><span id="__NX_ID_0__-blank-topic-list-1" role="option" aria-selected="false" class="flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm font-normal leading-5 text-foreground"><span class="flex-1">Pricing feedback</span></span></span></span><span aria-hidden="true" class="-ml-0.5 mr-1 align-middle text-xs text-muted-foreground">optional</span><span class="">.</span></div><p class="rounded-lg border border-border bg-muted px-3 py-2.5 text-xs leading-[18px] text-muted-foreground"><span class="font-semibold text-foreground">Preview: </span><span data-madlibs-preview="">\u201CSummarize Q3 Customer Research for \u2026.\u201D</span></p><div class="flex flex-wrap items-center justify-between gap-x-3 gap-y-2"><span class="text-xs text-muted-foreground">Nothing is sent until you send it.</span><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap tracking-[0.005em] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 border border-border bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 h-8 rounded-lg ml-auto px-[18px] text-xs font-medium">Use prompt<span class="inline-flex shrink-0 items-center"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right size-3.5"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></span></button></div><p role="status" class="sr-only"></p></div>',
23141
+ idCount: 1,
23142
+ text: [
23143
+ "Build your request",
23144
+ "Summarize",
23145
+ "Q3 Customer Research",
23146
+ "September release notes",
23147
+ "for",
23148
+ "Leadership",
23149
+ "Engineering",
23150
+ ", focusing on",
23151
+ "Onboarding issues",
23152
+ "Pricing feedback",
23153
+ "optional",
23154
+ "Preview:",
23155
+ "\u201CSummarize Q3 Customer Research for \u2026.\u201D",
23156
+ "Nothing is sent until you send it.",
23157
+ "Use prompt"
23158
+ ]
23159
+ },
23160
+ md3madlibs: {
23161
+ name: "Md3Madlibs",
23162
+ html: `<div class="relative rounded-md-md border border-md-outline-variant bg-md-surface text-md-on-surface flex w-full max-w-[620px] flex-col overflow-visible rounded-md-lg animate-nx-fade-in motion-reduce:animate-none gap-3.5 px-5 py-[18px]" role="group" aria-labelledby="__NX_ID_0__-heading" data-status="partial"><p id="__NX_ID_0__-heading" class="flex items-center gap-1.5 text-[11.5px] font-semibold uppercase leading-4 tracking-[0.06em] text-md-on-surface-variant">Build your request</p><div class="text-md-on-surface text-[17px] leading-[44px]"><span class="">Summarize </span><span class="relative max-w-full align-middle leading-5 mx-[3px] inline-flex"><input id="__NX_ID_0__-blank-document" autoComplete="off" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="__NX_ID_0__-blank-document-list" type="text" placeholder="document" aria-label="Document" aria-required="true" style="width:calc(22.0ch + 3rem)" class="h-9 min-w-0 max-w-full pl-3 pr-[30px] text-[15px] font-medium outline-none transition-colors motion-reduce:transition-none placeholder:font-normal placeholder:text-md-on-surface-variant rounded-md-md border border-transparent bg-md-secondary-container text-md-on-secondary-container focus:border-2 focus:border-solid focus:border-md-primary focus:pl-[11px] focus:pr-[29px]" value="Q3 Customer Research"/><span aria-hidden="true" class="pointer-events-none absolute right-2 top-1/2 inline-flex -translate-y-1/2 [&_svg]:size-[18px] text-md-on-secondary-container"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down"><path d="m6 9 6 6 6-6"></path></svg></span><span id="__NX_ID_0__-blank-document-list" role="listbox" aria-label="Document" hidden="" class="absolute left-0 top-full z-20 mt-1 w-max min-w-full max-w-xs rounded-md-xs bg-md-surface-container py-2 text-left shadow-md-2 hidden"><span id="__NX_ID_0__-blank-document-list-0" role="option" aria-selected="false" class="relative flex h-12 cursor-pointer items-center gap-3 px-3 text-sm font-normal text-md-on-surface before:absolute before:inset-0 before:bg-md-on-surface before:opacity-0 before:content-[''] hover:before:opacity-[0.08]"><span class="relative flex-1">Q3 Customer Research</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check relative size-[18px] text-md-on-surface-variant" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg></span><span id="__NX_ID_0__-blank-document-list-1" role="option" aria-selected="false" class="relative flex h-12 cursor-pointer items-center gap-3 px-3 text-sm font-normal text-md-on-surface before:absolute before:inset-0 before:bg-md-on-surface before:opacity-0 before:content-[''] hover:before:opacity-[0.08]"><span class="relative flex-1">September release notes</span></span></span></span><span class=""> for </span><span class="relative max-w-full align-middle leading-5 mx-[3px] inline-flex"><input id="__NX_ID_0__-blank-audience" autoComplete="off" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="__NX_ID_0__-blank-audience-list" type="text" placeholder="audience" aria-label="Audience" aria-required="true" style="width:calc(8.8ch + 3rem)" class="h-9 min-w-0 max-w-full pl-3 pr-[30px] text-[15px] font-medium text-md-on-surface outline-none transition-colors motion-reduce:transition-none placeholder:font-normal placeholder:text-md-on-surface-variant rounded-md-md border border-dashed border-md-outline bg-md-surface focus:border-2 focus:border-solid focus:border-md-primary focus:pl-[11px] focus:pr-[29px]" value=""/><span aria-hidden="true" class="pointer-events-none absolute right-2 top-1/2 inline-flex -translate-y-1/2 [&_svg]:size-[18px] text-md-on-surface-variant"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down"><path d="m6 9 6 6 6-6"></path></svg></span><span id="__NX_ID_0__-blank-audience-list" role="listbox" aria-label="Audience" hidden="" class="absolute left-0 top-full z-20 mt-1 w-max min-w-full max-w-xs rounded-md-xs bg-md-surface-container py-2 text-left shadow-md-2 hidden"><span id="__NX_ID_0__-blank-audience-list-0" role="option" aria-selected="false" class="relative flex h-12 cursor-pointer items-center gap-3 px-3 text-sm font-normal text-md-on-surface before:absolute before:inset-0 before:bg-md-on-surface before:opacity-0 before:content-[''] hover:before:opacity-[0.08]"><span class="relative flex-1">Leadership</span></span><span id="__NX_ID_0__-blank-audience-list-1" role="option" aria-selected="false" class="relative flex h-12 cursor-pointer items-center gap-3 px-3 text-sm font-normal text-md-on-surface before:absolute before:inset-0 before:bg-md-on-surface before:opacity-0 before:content-[''] hover:before:opacity-[0.08]"><span class="relative flex-1">Engineering</span></span></span></span><span class="text-md-on-surface-variant">, focusing on </span><span class="relative max-w-full align-middle leading-5 mx-[3px] inline-flex"><input id="__NX_ID_0__-blank-topic" autoComplete="off" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="__NX_ID_0__-blank-topic-list" type="text" placeholder="topic" aria-label="Topic (optional)" style="width:calc(5.5ch + 3rem)" class="h-9 min-w-0 max-w-full pl-3 pr-[30px] text-[15px] font-medium text-md-on-surface outline-none transition-colors motion-reduce:transition-none placeholder:font-normal placeholder:text-md-on-surface-variant rounded-md-md border border-dashed border-md-outline bg-md-surface focus:border-2 focus:border-solid focus:border-md-primary focus:pl-[11px] focus:pr-[29px]" value=""/><span aria-hidden="true" class="pointer-events-none absolute right-2 top-1/2 inline-flex -translate-y-1/2 [&_svg]:size-[18px] text-md-on-surface-variant"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down"><path d="m6 9 6 6 6-6"></path></svg></span><span id="__NX_ID_0__-blank-topic-list" role="listbox" aria-label="Topic" hidden="" class="absolute left-0 top-full z-20 mt-1 w-max min-w-full max-w-xs rounded-md-xs bg-md-surface-container py-2 text-left shadow-md-2 hidden"><span id="__NX_ID_0__-blank-topic-list-0" role="option" aria-selected="false" class="relative flex h-12 cursor-pointer items-center gap-3 px-3 text-sm font-normal text-md-on-surface before:absolute before:inset-0 before:bg-md-on-surface before:opacity-0 before:content-[''] hover:before:opacity-[0.08]"><span class="relative flex-1">Onboarding issues</span></span><span id="__NX_ID_0__-blank-topic-list-1" role="option" aria-selected="false" class="relative flex h-12 cursor-pointer items-center gap-3 px-3 text-sm font-normal text-md-on-surface before:absolute before:inset-0 before:bg-md-on-surface before:opacity-0 before:content-[''] hover:before:opacity-[0.08]"><span class="relative flex-1">Pricing feedback</span></span></span></span><span aria-hidden="true" class="-ml-px mr-1 inline-block align-middle text-[11.5px] leading-4 text-md-on-surface-variant">optional</span><span class="">.</span></div><p class="flex items-baseline gap-2 rounded-md-md bg-md-surface-container-low px-3.5 py-2.5 text-[13px] leading-5 text-md-on-surface"><span class="shrink-0 font-semibold text-md-on-surface-variant">Preview</span><span data-madlibs-preview="">Summarize Q3 Customer Research for \u2026.</span></p><div class="flex flex-wrap items-center justify-between gap-x-3 gap-y-2"><span class="text-xs tracking-[0.4px] text-md-on-surface-variant">Nothing is sent until you send it.</span><button type="button" class="relative inline-flex h-10 items-center justify-center gap-2 overflow-hidden rounded-full text-sm font-medium transition-shadow px-6 [&_svg]:size-[18px] 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] outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface disabled:pointer-events-none disabled:opacity-[0.38] disabled:shadow-none bg-md-primary text-md-on-primary hover:shadow-md-1 ml-auto"><span class="relative shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></span><span class="relative">Use prompt</span></button></div><p role="status" class="sr-only"></p></div>`,
23163
+ idCount: 1,
23164
+ text: [
23165
+ "Build your request",
23166
+ "Summarize",
23167
+ "Q3 Customer Research",
23168
+ "September release notes",
23169
+ "for",
23170
+ "Leadership",
23171
+ "Engineering",
23172
+ ", focusing on",
23173
+ "Onboarding issues",
23174
+ "Pricing feedback",
23175
+ "optional",
23176
+ "Preview",
23177
+ "Summarize Q3 Customer Research for \u2026.",
23178
+ "Nothing is sent until you send it.",
23179
+ "Use prompt"
23180
+ ]
23181
+ },
23182
+ promptenhancer: {
23183
+ name: "PromptEnhancer",
23184
+ html: `<div data-state="enhanced" class="flex w-full flex-col gap-2.5"><div data-slot="input-group" role="group" class="group/input-group relative flex w-full items-center bg-background outline-none transition-[color,box-shadow] h-9 min-w-0 has-[&gt;textarea]:h-auto [&:has(&gt;[data-align=inline-start])&gt;input]:pl-2 [&:has(&gt;[data-align=inline-end])&gt;input]:pr-2 has-[&gt;[data-align=block-start]]:h-auto has-[&gt;[data-align=block-start]]:flex-col [&:has(&gt;[data-align=block-start])&gt;input]:pb-3 has-[&gt;[data-align=block-end]]:h-auto has-[&gt;[data-align=block-end]]:flex-col [&:has(&gt;[data-align=block-end])&gt;input]:pt-3 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-2 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-2 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 flex-col overflow-hidden rounded-xl border-[1.5px] border-border shadow-none"><textarea rows="1" class="flex border-input text-foreground transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-ring focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 rounded-none bg-transparent shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 resize-none border-0 min-h-0 w-full flex-none px-3.5 py-3 text-sm leading-5" data-slot="input-group-control" aria-label="Describe what you need\u2026" placeholder="Describe what you need\u2026">Summarize customer feedback.</textarea><div role="group" data-slot="input-group-addon" data-align="block-end" class="flex h-auto select-none items-center gap-2 text-sm font-medium text-muted-foreground group-data-[disabled=true]/input-group:opacity-50 [&&gt;kbd]:rounded-sm [&&gt;svg:not([class*='size-'])]:size-4 order-last w-full group-has-[&gt;input]/input-group:pb-2.5 cursor-default justify-between border-t border-border px-3.5 py-2 [&.border-t]:pt-2"><span class="flex items-center gap-2 text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 text-xs font-normal">Aria will expand this prompt</span><span class="ml-auto flex items-center gap-1.5"><button type="button" class="select-none justify-center whitespace-nowrap tracking-[0.005em] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 border border-border bg-primary text-primary-foreground hover:bg-primary/90 flex items-center shadow-none gap-1.5 rounded-md has-[&gt;svg]:px-2.5 h-8 px-3 text-sm font-medium" data-size="sm" aria-label="Enhance this prompt with AI"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sparkles size-3.5 text-warning" aria-hidden="true"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path><path d="M20 3v4"></path><path d="M22 5h-4"></path><path d="M4 17v2"></path><path d="M5 18H3"></path></svg>Enhance</button></span></div></div><div role="status" aria-live="polite" class="sr-only"></div><div role="region" aria-label="Suggested improvements to your prompt" class="flex flex-col gap-2.5 animate-nx-fade-in motion-reduce:animate-none"><div class="flex flex-wrap items-baseline justify-between gap-2 px-0.5"><p class="text-sm font-semibold text-foreground">Suggested improvements</p><span class="text-xs text-muted-foreground">2 of 2 changes</span></div><div class="grid grid-cols-1 gap-2 sm:grid-cols-2"><div class="rounded-[10px] border border-border bg-muted/50 px-3.5 py-3"><p class="flex items-center gap-1.5 text-[11px] font-bold uppercase leading-4 tracking-[0.08em] mb-1.5 text-muted-foreground">You wrote</p><p class="text-sm leading-[22px] text-foreground">Summarize customer feedback.</p></div><div class="rounded-[10px] border-[1.5px] border-warning bg-brand/5 px-3.5 py-3"><div class="mb-1.5"><p class="flex items-center gap-1.5 text-[11px] font-bold uppercase leading-4 tracking-[0.08em] text-warning-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sparkles size-3.5 text-warning" aria-hidden="true"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path><path d="M20 3v4"></path><path d="M22 5h-4"></path><path d="M4 17v2"></path><path d="M5 18H3"></path></svg>Enhanced</p></div><p class="text-sm leading-[22px] text-foreground">Summarize customer feedback <ins class="rounded-sm bg-warning/20 px-0.5 text-foreground underline decoration-warning decoration-dotted underline-offset-4 [box-decoration-break:clone]"><span class="sr-only">added: </span>from the last quarter</ins>, <ins class="rounded-sm bg-warning/20 px-0.5 text-foreground underline decoration-warning decoration-dotted underline-offset-4 [box-decoration-break:clone]"><span class="sr-only">added: </span>grouped by recurring theme</ins>.</p></div></div><div role="group" aria-label="Changes \u2014 untick to leave one out" class="flex flex-col divide-y divide-border border-y border-border"><div class="flex items-start gap-3 py-2.5"><button type="button" role="checkbox" aria-checked="true" data-state="checked" class="inline-flex size-4 shrink-0 items-center justify-center rounded-[4px] border shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 border-primary bg-primary text-primary-foreground mt-0.5" id="__NX_ID_0__-c-time" aria-labelledby="__NX_ID_0__-c-time-l" aria-describedby="__NX_ID_0__-c-time-why __NX_ID_0__-c-time-as"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check size-3"><path d="M20 6 9 17l-5-5"></path></svg></button><div class="flex min-w-0 flex-col gap-0.5"><label id="__NX_ID_0__-c-time-l" for="__NX_ID_0__-c-time" class="cursor-pointer text-sm font-medium leading-5 text-foreground">Add \u201Cfrom the last quarter\u201D</label><span id="__NX_ID_0__-c-time-why" class="text-xs leading-[18px] text-muted-foreground">A time range makes the summary comparable with the last one.</span><span id="__NX_ID_0__-c-time-as" class="mt-1 inline-flex items-center gap-1 self-start rounded-md bg-warning/15 px-2 py-0.5 text-xs font-medium text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-help size-3.5 text-muted-foreground" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><path d="M12 17h.01"></path></svg>Assumes you mean the last quarter.</span></div></div><div class="flex items-start gap-3 py-2.5"><button type="button" role="checkbox" aria-checked="true" data-state="checked" class="inline-flex size-4 shrink-0 items-center justify-center rounded-[4px] border shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 border-primary bg-primary text-primary-foreground mt-0.5" id="__NX_ID_0__-c-theme" aria-labelledby="__NX_ID_0__-c-theme-l" aria-describedby="__NX_ID_0__-c-theme-why"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check size-3"><path d="M20 6 9 17l-5-5"></path></svg></button><div class="flex min-w-0 flex-col gap-0.5"><label id="__NX_ID_0__-c-theme-l" for="__NX_ID_0__-c-theme" class="cursor-pointer text-sm font-medium leading-5 text-foreground">Add \u201Cgrouped by recurring theme\u201D</label><span id="__NX_ID_0__-c-theme-why" class="text-xs leading-[18px] text-muted-foreground">Themes make issues easier to act on than a list of comments.</span></div></div></div><div class="flex flex-wrap gap-2"><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap font-semibold tracking-[0.005em] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 border border-border bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 h-10 rounded-lg px-5 text-sm min-w-[10rem] flex-1">Use enhanced</button><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap font-semibold tracking-[0.005em] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 text-foreground hover:bg-accent h-10 rounded-lg px-5 text-sm"><span class="inline-flex shrink-0 items-center"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil size-3.5" aria-hidden="true"><path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"></path><path d="m15 5 4 4"></path></svg></span>Edit</button><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap font-semibold tracking-[0.005em] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 border border-border bg-background shadow-sm hover:bg-accent h-10 rounded-lg px-5 text-sm text-muted-foreground">Keep original</button></div></div></div>`,
23185
+ idCount: 1,
23186
+ text: [
23187
+ "Summarize customer feedback.",
23188
+ "Aria will expand this prompt",
23189
+ "Enhance",
23190
+ "Suggested improvements",
23191
+ "2 of 2 changes",
23192
+ "You wrote",
23193
+ "Enhanced",
23194
+ "Summarize customer feedback",
23195
+ "added:",
23196
+ "from the last quarter",
23197
+ "grouped by recurring theme",
23198
+ "Add \u201Cfrom the last quarter\u201D",
23199
+ "Assumes you mean the last quarter.",
23200
+ "Add \u201Cgrouped by recurring theme\u201D",
23201
+ "Use enhanced",
23202
+ "Edit",
23203
+ "Keep original"
23204
+ ]
23205
+ },
23206
+ md3promptenhancer: {
23207
+ name: "Md3PromptEnhancer",
23208
+ html: `<div data-state="enhanced" class="flex w-full flex-col gap-3"><div class="relative overflow-hidden rounded-md-md border border-md-outline-variant text-md-on-surface flex flex-col gap-3.5 rounded-md-lg bg-md-surface px-5 py-[18px] animate-nx-fade-in motion-reduce:animate-none" role="region" aria-label="Suggested improvements to your prompt"><div class="flex flex-wrap items-baseline justify-between gap-3"><p class="text-base font-medium leading-6 text-md-on-surface">Suggested improvements</p><span class="text-xs text-md-on-surface-variant">2 of 2 changes</span></div><div class="grid grid-cols-[repeat(auto-fit,minmax(210px,1fr))] gap-2.5"><div class="flex flex-col gap-2 rounded-md-md border border-transparent bg-md-on-surface/[0.04] px-3.5 py-3"><p class="flex items-center gap-1.5 text-[11.5px] font-semibold uppercase leading-4 tracking-[0.06em] text-md-on-surface-variant">You wrote</p><p class="text-[14.5px] leading-[22px] text-md-on-surface">Summarize customer feedback.</p></div><div class="flex flex-col gap-2 rounded-md-md border border-md-primary/45 bg-md-primary/5 px-3.5 py-3"><p class="flex items-center gap-1.5 text-[11.5px] font-semibold uppercase leading-4 tracking-[0.06em] text-md-primary"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-message-square-text size-4" aria-hidden="true"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path><path d="M13 8H7"></path><path d="M17 12H7"></path></svg>Enhanced</p><p class="text-[14.5px] leading-[22px] text-md-on-surface">Summarize customer feedback <ins class="rounded-md-xs bg-md-primary-container/75 px-0.5 text-md-on-primary-container underline decoration-md-primary/50 decoration-dotted underline-offset-4 [box-decoration-break:clone]"><span class="sr-only">added: </span>from the last quarter</ins>, <ins class="rounded-md-xs bg-md-primary-container/75 px-0.5 text-md-on-primary-container underline decoration-md-primary/50 decoration-dotted underline-offset-4 [box-decoration-break:clone]"><span class="sr-only">added: </span>grouped by recurring theme</ins>.</p></div></div><div role="group" aria-label="Changes \u2014 untick to leave one out" class="flex flex-col border-t border-md-outline-variant"><div class="flex items-start gap-2 border-b border-md-outline-variant py-2 last:border-b-0 last:pb-0"><button type="button" role="checkbox" aria-checked="true" class="relative inline-flex h-10 w-10 items-center justify-center rounded-full outline-none before:absolute before:inset-0 before:rounded-full before:bg-md-on-surface before:opacity-0 before:transition-opacity before:content-[''] hover:before:opacity-[0.08] focus-visible:before:opacity-[0.12] active:before:opacity-[0.12] focus-visible:ring-2 focus-visible:ring-md-primary disabled:pointer-events-none disabled:opacity-[0.38] -ml-2.5 shrink-0" id="__NX_ID_0__-c-time" aria-labelledby="__NX_ID_0__-c-time-l" aria-describedby="__NX_ID_0__-c-time-why __NX_ID_0__-c-time-as"><span class="relative flex h-[18px] w-[18px] items-center justify-center rounded-[2px] border-2 transition-colors [&_svg]:size-[14px] border-md-primary bg-md-primary text-md-on-primary"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg></span></button><div class="flex min-w-0 flex-col gap-0.5 pt-2.5"><label id="__NX_ID_0__-c-time-l" for="__NX_ID_0__-c-time" class="cursor-pointer text-sm font-medium leading-5 text-md-on-surface">Add \u201Cfrom the last quarter\u201D</label><span id="__NX_ID_0__-c-time-why" class="text-[12.5px] leading-[18px] text-md-on-surface-variant">A time range makes the summary comparable with the last one.</span><span id="__NX_ID_0__-c-time-as" class="mt-1 inline-flex items-center gap-1 self-start rounded-md-sm bg-md-surface-container-high px-2 py-0.5 text-[11.5px] font-medium text-md-on-surface-variant"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-help size-3.5" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><path d="M12 17h.01"></path></svg>Assumes you mean the last quarter.</span></div></div><div class="flex items-start gap-2 border-b border-md-outline-variant py-2 last:border-b-0 last:pb-0"><button type="button" role="checkbox" aria-checked="true" class="relative inline-flex h-10 w-10 items-center justify-center rounded-full outline-none before:absolute before:inset-0 before:rounded-full before:bg-md-on-surface before:opacity-0 before:transition-opacity before:content-[''] hover:before:opacity-[0.08] focus-visible:before:opacity-[0.12] active:before:opacity-[0.12] focus-visible:ring-2 focus-visible:ring-md-primary disabled:pointer-events-none disabled:opacity-[0.38] -ml-2.5 shrink-0" id="__NX_ID_0__-c-theme" aria-labelledby="__NX_ID_0__-c-theme-l" aria-describedby="__NX_ID_0__-c-theme-why"><span class="relative flex h-[18px] w-[18px] items-center justify-center rounded-[2px] border-2 transition-colors [&_svg]:size-[14px] border-md-primary bg-md-primary text-md-on-primary"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg></span></button><div class="flex min-w-0 flex-col gap-0.5 pt-2.5"><label id="__NX_ID_0__-c-theme-l" for="__NX_ID_0__-c-theme" class="cursor-pointer text-sm font-medium leading-5 text-md-on-surface">Add \u201Cgrouped by recurring theme\u201D</label><span id="__NX_ID_0__-c-theme-why" class="text-[12.5px] leading-[18px] text-md-on-surface-variant">Themes make issues easier to act on than a list of comments.</span></div></div></div><div class="flex flex-wrap items-center justify-between gap-x-3 gap-y-2"><button type="button" class="relative inline-flex h-10 items-center justify-center gap-2 overflow-hidden rounded-full text-sm font-medium transition-shadow px-3 [&_svg]:size-[18px] 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] outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface disabled:pointer-events-none disabled:opacity-[0.38] disabled:shadow-none bg-transparent text-md-primary -ml-1"><span class="relative shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil" aria-hidden="true"><path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"></path><path d="m15 5 4 4"></path></svg></span><span class="relative">Edit</span></button><span class="ml-auto inline-flex flex-wrap gap-2"><button type="button" class="relative inline-flex h-10 items-center justify-center gap-2 overflow-hidden rounded-full text-sm font-medium transition-shadow px-6 [&_svg]:size-[18px] 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] outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface disabled:pointer-events-none disabled:opacity-[0.38] disabled:shadow-none border border-md-outline bg-transparent text-md-primary"><span class="relative">Keep original</span></button><button type="button" class="relative inline-flex h-10 items-center justify-center gap-2 overflow-hidden rounded-full text-sm font-medium transition-shadow px-6 [&_svg]:size-[18px] 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] outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface disabled:pointer-events-none disabled:opacity-[0.38] disabled:shadow-none bg-md-primary text-md-on-primary hover:shadow-md-1"><span class="relative">Use enhanced</span></button></span></div></div><div role="status" aria-live="polite" class="sr-only"></div><div class="flex flex-col gap-3 rounded-md-xl p-3 focus-within:ring-2 focus-within:ring-md-primary rounded-md-xl border border-md-outline-variant bg-md-surface px-4 pb-2 pt-3.5 shadow-md-1 [&&gt;textarea]:text-base [&_button[aria-label=Send]]:hidden"><textarea rows="1" placeholder="Describe what you need\u2026" aria-label="Describe what you need\u2026" class="max-h-[inherit] w-full resize-none bg-transparent px-1 text-sm text-md-on-surface outline-none placeholder:text-md-on-surface-variant disabled:opacity-50">Summarize customer feedback.</textarea><div class="flex items-center justify-between gap-2"><div class="flex items-center gap-1"><span class="px-1 text-xs text-md-on-surface-variant">Aria will expand this prompt</span></div><div class="flex items-center gap-2"><button type="button" aria-label="Enhance this prompt with AI" class="relative inline-flex min-h-8 shrink-0 items-center gap-1.5 overflow-hidden rounded-md-sm border py-1 pl-2 pr-2.5 text-[13px] font-medium leading-5 outline-none transition-colors focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface disabled:pointer-events-none disabled:opacity-[0.38] motion-reduce:transition-none [&_svg]:size-[18px] 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] motion-reduce:before:transition-none border-md-outline-variant bg-transparent text-md-on-surface-variant"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sparkles relative" aria-hidden="true"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path><path d="M20 3v4"></path><path d="M22 5h-4"></path><path d="M4 17v2"></path><path d="M5 18H3"></path></svg><span class="relative">Enhance</span></button><button type="button" aria-label="Send" class="relative inline-flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-full bg-md-primary text-md-on-primary outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface before:absolute before:inset-0 before:bg-current before:opacity-0 before:transition-opacity before:content-[''] hover:before:opacity-[0.08] active:before:opacity-[0.12] disabled:opacity-[0.38] disabled:before:opacity-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up relative size-4"><path d="m5 12 7-7 7 7"></path><path d="M12 19V5"></path></svg></button></div></div></div></div>`,
23209
+ idCount: 1,
23210
+ text: [
23211
+ "Suggested improvements",
23212
+ "2 of 2 changes",
23213
+ "You wrote",
23214
+ "Summarize customer feedback.",
23215
+ "Enhanced",
23216
+ "Summarize customer feedback",
23217
+ "added:",
23218
+ "from the last quarter",
23219
+ "grouped by recurring theme",
23220
+ "Add \u201Cfrom the last quarter\u201D",
23221
+ "Assumes you mean the last quarter.",
23222
+ "Add \u201Cgrouped by recurring theme\u201D",
23223
+ "Edit",
23224
+ "Keep original",
23225
+ "Use enhanced",
23226
+ "Aria will expand this prompt",
23227
+ "Enhance"
23228
+ ]
23229
+ },
23230
+ modes: {
23231
+ name: "Modes",
23232
+ html: '<div class="flex flex-col gap-2"><div role="radiogroup" aria-label="Mode" class="divide-y divide-border overflow-hidden rounded-xl border border-border bg-background w-full max-w-[30rem]"><button type="button" role="radio" aria-checked="true" aria-labelledby="__NX_ID_0__-0-n" aria-describedby="__NX_ID_0__-0" tabindex="0" class="flex w-full items-center gap-2.5 px-3.5 py-2.5 text-left transition-colors motion-reduce:transition-none outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring bg-brand/[0.06]"><span aria-hidden="true" class="grid size-7 shrink-0 place-items-center rounded-[7px] text-[13px] [&_svg]:size-4 bg-primary text-primary-foreground"></span><span class="flex min-w-0 flex-1 flex-col"><span id="__NX_ID_0__-0-n" class="text-[13px] leading-5 font-semibold text-foreground">Fast<span aria-hidden="true"> \xB7 active</span></span><span id="__NX_ID_0__-0" class="flex flex-col text-[11px] leading-4 text-muted-foreground"><span class="">~3 seconds \xB7 everyday asks and quick lookups</span></span></span></button><button type="button" role="radio" aria-checked="false" aria-labelledby="__NX_ID_0__-1-n" aria-describedby="__NX_ID_0__-1" tabindex="-1" class="flex w-full items-center gap-2.5 px-3.5 py-2.5 text-left transition-colors motion-reduce:transition-none outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring hover:bg-muted/50"><span aria-hidden="true" class="grid size-7 shrink-0 place-items-center rounded-[7px] text-[13px] [&_svg]:size-4 bg-muted/60 text-muted-foreground"></span><span class="flex min-w-0 flex-1 flex-col"><span id="__NX_ID_0__-1-n" class="text-[13px] leading-5 text-foreground/70">Balanced</span><span id="__NX_ID_0__-1" class="flex flex-col text-[11px] leading-4 text-muted-foreground"><span class="">~15 seconds \xB7 most tasks</span></span></span></button><button type="button" role="radio" aria-checked="false" aria-disabled="true" aria-labelledby="__NX_ID_0__-2-n" aria-describedby="__NX_ID_0__-2" tabindex="-1" class="flex w-full items-center gap-2.5 px-3.5 py-2.5 text-left transition-colors motion-reduce:transition-none outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring hover:bg-muted/50 cursor-not-allowed"><span aria-hidden="true" class="grid size-7 shrink-0 place-items-center rounded-[7px] text-[13px] [&_svg]:size-4 bg-muted/60 text-muted-foreground opacity-50"></span><span class="flex min-w-0 flex-1 flex-col"><span id="__NX_ID_0__-2-n" class="text-[13px] leading-5 text-foreground/70 opacity-60">Deep research</span><span id="__NX_ID_0__-2" class="flex flex-col text-[11px] leading-4 text-muted-foreground"><span class="opacity-60">~1 minute \xB7 multi-source, high-stakes</span><span class="mt-0.5 inline-flex items-center gap-1 text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info size-3 shrink-0" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg>Not on this plan.</span></span></span></button></div><span role="status" aria-live="polite" class="sr-only"></span></div>',
23233
+ idCount: 1,
23234
+ text: [
23235
+ "Fast",
23236
+ "\xB7 active",
23237
+ "Balanced",
23238
+ "~15 seconds \xB7 most tasks",
23239
+ "Deep research",
23240
+ "~1 minute \xB7 multi-source, high-stakes",
23241
+ "Not on this plan."
23242
+ ]
23243
+ },
23244
+ md3modes: {
23245
+ name: "Md3Modes",
23246
+ html: `<div class="flex flex-col gap-2"><div role="radiogroup" aria-label="Mode" class="flex flex-col gap-0.5 rounded-md-lg border border-md-outline-variant bg-md-surface p-2 w-full max-w-[30rem]"><button type="button" role="radio" aria-checked="true" aria-labelledby="__NX_ID_0__-0-n" aria-describedby="__NX_ID_0__-0" tabindex="0" class="relative flex min-h-14 w-full items-center gap-3 overflow-hidden rounded-md-md px-3 py-2.5 text-left transition-colors motion-reduce:transition-none before:pointer-events-none 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] motion-reduce:before:transition-none outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-md-primary bg-md-secondary-container text-md-on-secondary-container"><span aria-hidden="true" class="relative grid size-10 shrink-0 place-items-center rounded-md-md text-base [&_svg]:size-[22px] bg-md-primary text-md-on-primary"></span><span class="relative flex min-w-0 flex-1 flex-col gap-0.5"><span id="__NX_ID_0__-0-n" class="text-sm font-medium leading-5">Fast</span><span id="__NX_ID_0__-0" class="flex flex-col gap-0.5 text-xs leading-[18px]"><span class="text-current">~3 seconds \xB7 everyday asks and quick lookups</span></span></span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check relative size-[22px] shrink-0 text-md-on-secondary-container" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg></button><button type="button" role="radio" aria-checked="false" aria-labelledby="__NX_ID_0__-1-n" aria-describedby="__NX_ID_0__-1" tabindex="-1" class="relative flex min-h-14 w-full items-center gap-3 overflow-hidden rounded-md-md px-3 py-2.5 text-left transition-colors motion-reduce:transition-none before:pointer-events-none 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] motion-reduce:before:transition-none outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-md-primary text-md-on-surface"><span aria-hidden="true" class="relative grid size-10 shrink-0 place-items-center rounded-md-md text-base [&_svg]:size-[22px] bg-md-surface-container-high text-md-on-surface-variant"></span><span class="relative flex min-w-0 flex-1 flex-col gap-0.5"><span id="__NX_ID_0__-1-n" class="text-sm font-medium leading-5">Balanced</span><span id="__NX_ID_0__-1" class="flex flex-col gap-0.5 text-xs leading-[18px]"><span class="text-md-on-surface-variant">~15 seconds \xB7 most tasks</span></span></span></button><button type="button" role="radio" aria-checked="false" aria-disabled="true" aria-labelledby="__NX_ID_0__-2-n" aria-describedby="__NX_ID_0__-2" tabindex="-1" class="relative flex min-h-14 w-full items-center gap-3 overflow-hidden rounded-md-md px-3 py-2.5 text-left transition-colors motion-reduce:transition-none before:pointer-events-none 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] motion-reduce:before:transition-none outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-md-primary text-md-on-surface cursor-not-allowed"><span aria-hidden="true" class="relative grid size-10 shrink-0 place-items-center rounded-md-md text-base [&_svg]:size-[22px] bg-md-surface-container-high text-md-on-surface-variant opacity-[0.55]"></span><span class="relative flex min-w-0 flex-1 flex-col gap-0.5"><span id="__NX_ID_0__-2-n" class="text-sm font-medium leading-5 opacity-[0.55]">Deep research</span><span id="__NX_ID_0__-2" class="flex flex-col gap-0.5 text-xs leading-[18px]"><span class="text-md-on-surface-variant opacity-[0.55]">~1 minute \xB7 multi-source, high-stakes</span><span class="inline-flex items-center gap-1 text-md-on-surface"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info size-3.5 shrink-0" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg>Not on this plan.</span></span></span></button></div><span role="status" aria-live="polite" class="sr-only"></span></div>`,
23247
+ idCount: 1,
23248
+ text: [
23249
+ "Fast",
23250
+ "Balanced",
23251
+ "~15 seconds \xB7 most tasks",
23252
+ "Deep research",
23253
+ "~1 minute \xB7 multi-source, high-stakes",
23254
+ "Not on this plan."
23255
+ ]
23256
+ },
23257
+ voicetone: {
23258
+ name: "VoiceTone",
23259
+ html: '<div role="group" aria-label="Voice and tone" data-variant="settings" class="w-full max-w-[30rem] overflow-hidden rounded-xl border border-border bg-background text-foreground"><div class="flex flex-col gap-3.5 px-[18px] pb-4 pt-4"><div class="flex flex-col gap-2.5"><p id="__NX_ID_0__-presets" class="text-[11px] font-semibold uppercase leading-4 tracking-[0.1em] text-muted-foreground">Tone preset</p><div role="radiogroup" aria-labelledby="__NX_ID_0__-presets" class="grid grid-cols-[repeat(auto-fit,minmax(8.5rem,1fr))] gap-1.5"><button type="button" role="radio" aria-checked="true" tabindex="0" class="flex flex-col rounded-lg border px-2 py-2.5 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background items-center gap-0.5 text-center border-primary bg-muted/50 ring-[0.5px] ring-inset ring-primary"><span class="flex w-full items-center gap-1.5 text-[13px] leading-5 justify-center font-semibold text-foreground">Professional</span><span class="text-[11px] leading-4 text-muted-foreground">Formal, clear</span></button><button type="button" role="radio" aria-checked="false" tabindex="-1" class="flex flex-col rounded-lg border px-2 py-2.5 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background items-center gap-0.5 text-center border-border bg-transparent hover:bg-accent/50"><span class="flex w-full items-center gap-1.5 text-[13px] leading-5 justify-center text-foreground/75">Friendly</span><span class="text-[11px] leading-4 text-muted-foreground">Warm, easy</span></button><button type="button" role="radio" aria-checked="false" tabindex="-1" class="flex flex-col rounded-lg border px-2 py-2.5 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background items-center gap-0.5 text-center border-border bg-transparent hover:bg-accent/50"><span class="flex w-full items-center gap-1.5 text-[13px] leading-5 justify-center text-foreground/75">Direct</span><span class="text-[11px] leading-4 text-muted-foreground">Brief, blunt</span></button></div></div><div role="group" aria-labelledby="__NX_ID_0__-rules" class="flex flex-col gap-2"><p id="__NX_ID_0__-rules" class="text-[11px] font-semibold uppercase leading-4 tracking-[0.1em] text-muted-foreground">Rules</p><div class="flex flex-col gap-1.5"><label class="flex w-fit cursor-pointer items-center gap-2.5 text-[13px] text-foreground"><button type="button" role="checkbox" aria-checked="true" data-state="checked" class="inline-flex shrink-0 items-center justify-center rounded-[4px] border shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 border-primary bg-primary text-primary-foreground size-[15px]" aria-labelledby="__NX_ID_0__-rule-no-emojis"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check size-3"><path d="M20 6 9 17l-5-5"></path></svg></button><span id="__NX_ID_0__-rule-no-emojis">No emojis</span></label></div></div></div><div class="flex flex-col gap-1 bg-muted/40 px-[18px] pb-3.5 pt-3"><p class="text-[11px] font-semibold uppercase leading-4 tracking-[0.1em] text-muted-foreground">Sample output</p><p class="text-[13px] italic leading-5 text-foreground" aria-live="polite">\u201CPlease find the updated proposal attached for your review.\u201D</p></div><span role="status" class="sr-only"></span></div>',
23260
+ idCount: 1,
23261
+ text: [
23262
+ "Tone preset",
23263
+ "Professional",
23264
+ "Formal, clear",
23265
+ "Friendly",
23266
+ "Warm, easy",
23267
+ "Direct",
23268
+ "Brief, blunt",
23269
+ "Rules",
23270
+ "No emojis",
23271
+ "Sample output"
23272
+ ]
23273
+ },
23274
+ md3voicetone: {
23275
+ name: "Md3VoiceTone",
23276
+ html: `<div class="relative overflow-hidden rounded-md-md border border-md-outline-variant bg-md-surface text-md-on-surface w-full max-w-[30rem] rounded-md-lg" role="group" aria-label="Voice and tone" data-variant="settings"><div class="flex flex-col gap-4 px-5 pb-4 pt-5"><div class="flex flex-col gap-2.5"><p id="__NX_ID_0__-presets" class="text-[11.5px] font-semibold uppercase leading-4 tracking-[0.06em] text-md-on-surface-variant">Tone preset</p><div role="radiogroup" aria-labelledby="__NX_ID_0__-presets" class="grid grid-cols-[repeat(auto-fit,minmax(8.5rem,1fr))] gap-2"><button type="button" role="radio" aria-checked="true" tabindex="0" class="relative overflow-hidden before:pointer-events-none 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] motion-reduce:before:transition-none outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface flex min-h-[4.75rem] flex-col items-start gap-1 rounded-md-md text-left text-md-on-surface transition-colors border-2 border-md-primary bg-md-primary/[0.06] px-[13px] py-[11px]"><span class="relative flex w-full items-center gap-1.5 text-sm font-semibold leading-5">Professional<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check ml-auto size-[18px] shrink-0 text-md-primary" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg></span><span class="relative text-[12.5px] leading-[18px] text-md-on-surface-variant">Formal, clear</span></button><button type="button" role="radio" aria-checked="false" tabindex="-1" class="relative overflow-hidden before:pointer-events-none 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] motion-reduce:before:transition-none outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface flex min-h-[4.75rem] flex-col items-start gap-1 rounded-md-md text-left text-md-on-surface transition-colors border border-md-outline-variant px-3.5 py-3"><span class="relative flex w-full items-center gap-1.5 text-sm font-semibold leading-5">Friendly</span><span class="relative text-[12.5px] leading-[18px] text-md-on-surface-variant">Warm, easy</span></button><button type="button" role="radio" aria-checked="false" tabindex="-1" class="relative overflow-hidden before:pointer-events-none 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] motion-reduce:before:transition-none outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface flex min-h-[4.75rem] flex-col items-start gap-1 rounded-md-md text-left text-md-on-surface transition-colors border border-md-outline-variant px-3.5 py-3"><span class="relative flex w-full items-center gap-1.5 text-sm font-semibold leading-5">Direct</span><span class="relative text-[12.5px] leading-[18px] text-md-on-surface-variant">Brief, blunt</span></button></div></div><div role="group" aria-labelledby="__NX_ID_0__-rules" class="flex flex-col gap-1"><p id="__NX_ID_0__-rules" class="text-[11.5px] font-semibold uppercase leading-4 tracking-[0.06em] text-md-on-surface-variant">Rules</p><div class="-ml-2.5 flex flex-col"><label class="flex w-fit cursor-pointer items-center gap-1 text-sm text-md-on-surface"><button type="button" role="checkbox" aria-checked="true" class="relative inline-flex h-10 w-10 items-center justify-center rounded-full outline-none before:absolute before:inset-0 before:rounded-full before:bg-md-on-surface before:opacity-0 before:transition-opacity before:content-[''] hover:before:opacity-[0.08] focus-visible:before:opacity-[0.12] active:before:opacity-[0.12] focus-visible:ring-2 focus-visible:ring-md-primary disabled:pointer-events-none disabled:opacity-[0.38]" aria-labelledby="__NX_ID_0__-rule-no-emojis"><span class="relative flex h-[18px] w-[18px] items-center justify-center rounded-[2px] border-2 transition-colors [&_svg]:size-[14px] border-md-primary bg-md-primary text-md-on-primary"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check" aria-hidden="true"><path d="M20 6 9 17l-5-5"></path></svg></span></button><span id="__NX_ID_0__-rule-no-emojis">No emojis</span></label></div></div></div><div class="flex flex-col gap-1 bg-md-surface-container-low px-5 pb-4 pt-3.5"><p class="text-[11.5px] font-semibold uppercase leading-4 tracking-[0.06em] text-md-on-surface-variant">Sample output</p><p class="text-sm italic leading-[21px] text-md-on-surface" aria-live="polite">\u201CPlease find the updated proposal attached for your review.\u201D</p></div><span role="status" class="sr-only"></span></div>`,
23277
+ idCount: 1,
23278
+ text: [
23279
+ "Tone preset",
23280
+ "Professional",
23281
+ "Formal, clear",
23282
+ "Friendly",
23283
+ "Warm, easy",
23284
+ "Direct",
23285
+ "Brief, blunt",
23286
+ "Rules",
23287
+ "No emojis",
23288
+ "Sample output"
23289
+ ]
23290
+ },
23291
+ presetstyles: {
23292
+ name: "PresetStyles",
23293
+ html: '<div class="rounded-xl border border-border bg-background text-foreground shadow-sm flex w-full max-w-[30rem] flex-col gap-3 p-4"><p id="__NX_ID_0__-label" class="text-[10px] font-semibold uppercase tracking-[0.1em] text-muted-foreground">Output style</p><div role="radiogroup" aria-labelledby="__NX_ID_0__-label" class="grid grid-cols-4 gap-2"><button type="button" role="radio" aria-checked="true" data-style-id="photo" tabindex="0" class="group flex min-w-0 flex-col items-center gap-1.5 rounded-[11px] outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><span aria-hidden="true" class="block aspect-square w-full overflow-hidden rounded-[9px] bg-gradient-to-br transition-[border-color,border-width] motion-reduce:transition-none from-destructive/10 to-destructive/20 border-[2.5px] border-foreground"></span><span class="max-w-full truncate text-[11px] font-semibold text-foreground">Photo</span></button><button type="button" role="radio" aria-checked="false" data-style-id="illustration" tabindex="-1" class="group flex min-w-0 flex-col items-center gap-1.5 rounded-[11px] outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><span aria-hidden="true" class="block aspect-square w-full overflow-hidden rounded-[9px] bg-gradient-to-br transition-[border-color,border-width] motion-reduce:transition-none from-info/15 to-info/30 border-[1.5px] border-border group-hover:border-muted-foreground/50"></span><span class="max-w-full truncate text-[11px] text-muted-foreground">Illustration</span></button><button type="button" role="radio" aria-checked="false" data-style-id="isometric" tabindex="-1" class="group flex min-w-0 flex-col items-center gap-1.5 rounded-[11px] outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><span aria-hidden="true" class="block aspect-square w-full overflow-hidden rounded-[9px] bg-gradient-to-br transition-[border-color,border-width] motion-reduce:transition-none from-success/15 to-success/30 border-[1.5px] border-border group-hover:border-muted-foreground/50"></span><span class="max-w-full truncate text-[11px] text-muted-foreground">Isometric</span></button><button type="button" role="radio" aria-checked="false" data-style-id="sketch" tabindex="-1" class="group flex min-w-0 flex-col items-center gap-1.5 rounded-[11px] outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><span aria-hidden="true" class="block aspect-square w-full overflow-hidden rounded-[9px] bg-gradient-to-br transition-[border-color,border-width] motion-reduce:transition-none from-warning/35 to-warning/60 border-[1.5px] border-border group-hover:border-muted-foreground/50"></span><span class="max-w-full truncate text-[11px] text-muted-foreground">Sketch</span></button></div><div class="flex items-center gap-2.5 rounded-[10px] border-[1.5px] border-dashed border-border p-3 transition-colors"><input type="file" accept="image/*" tabindex="-1" aria-hidden="true" class="sr-only" aria-label="Reference image"/><button type="button" class="flex min-w-0 flex-1 items-center gap-2.5 rounded-md text-left outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><span aria-hidden="true" class="grid size-10 shrink-0 place-items-center overflow-hidden rounded-[7px] bg-gradient-to-br from-muted to-border"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image size-4 text-muted-foreground"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"></rect><circle cx="9" cy="9" r="2"></circle><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"></path></svg></span><span class="flex min-w-0 flex-col"><span class="text-xs font-semibold text-foreground">Match a style</span><span class="truncate text-[11px] text-muted-foreground">Drop a reference image to copy its aesthetic</span></span></button></div><div class="flex items-center gap-2 rounded-lg border border-border bg-muted/50 px-3 py-2 text-[11px] text-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-palette size-3.5 shrink-0 text-brand" aria-hidden="true"><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"></circle><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"></circle><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"></circle><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"></circle><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z"></path></svg><span class="min-w-0 flex-1" aria-live="polite">Style locked to <strong class="font-semibold text-foreground">Photo</strong> for this project</span><button type="button" class="inline-flex select-none items-center justify-center gap-1.5 whitespace-nowrap tracking-[0.005em] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 text-foreground underline decoration-from-font underline-offset-2 hover:opacity-70 rounded-lg h-auto shrink-0 px-0 text-[11px] font-medium">Unlock</button></div></div>',
23294
+ idCount: 1,
23295
+ text: [
23296
+ "Output style",
23297
+ "Photo",
23298
+ "Illustration",
23299
+ "Isometric",
23300
+ "Sketch",
23301
+ "Match a style",
23302
+ "Style locked to",
23303
+ "for this project",
23304
+ "Unlock"
23305
+ ]
23306
+ },
23307
+ md3presetstyles: {
23308
+ name: "Md3PresetStyles",
23309
+ html: `<div class="relative overflow-hidden rounded-md-md border border-md-outline-variant bg-md-surface text-md-on-surface flex w-full max-w-[30rem] flex-col gap-3.5 rounded-md-lg p-4"><p id="__NX_ID_0__-label" class="text-[11.5px] font-semibold uppercase leading-4 tracking-[0.06em] text-md-on-surface-variant">Output style</p><div role="radiogroup" aria-labelledby="__NX_ID_0__-label" class="grid grid-cols-4 gap-2"><button type="button" role="radio" aria-checked="true" data-style-id="photo" tabindex="0" class="flex min-w-0 flex-col items-center gap-1.5 rounded-md-md outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface"><span aria-hidden="true" class="block aspect-square w-full overflow-hidden rounded-md-md bg-gradient-to-br transition-[border-color,border-width] motion-reduce:transition-none from-md-error-container to-md-error/25 border-[3px] border-md-primary"></span><span class="max-w-full truncate text-xs font-medium text-md-on-surface">Photo</span></button><button type="button" role="radio" aria-checked="false" data-style-id="illustration" tabindex="-1" class="flex min-w-0 flex-col items-center gap-1.5 rounded-md-md outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface"><span aria-hidden="true" class="block aspect-square w-full overflow-hidden rounded-md-md bg-gradient-to-br transition-[border-color,border-width] motion-reduce:transition-none from-md-primary-container to-md-primary/25 border border-md-outline-variant"></span><span class="max-w-full truncate text-xs text-md-on-surface-variant">Illustration</span></button><button type="button" role="radio" aria-checked="false" data-style-id="isometric" tabindex="-1" class="flex min-w-0 flex-col items-center gap-1.5 rounded-md-md outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface"><span aria-hidden="true" class="block aspect-square w-full overflow-hidden rounded-md-md bg-gradient-to-br transition-[border-color,border-width] motion-reduce:transition-none from-md-tertiary-container to-md-tertiary/25 border border-md-outline-variant"></span><span class="max-w-full truncate text-xs text-md-on-surface-variant">Isometric</span></button><button type="button" role="radio" aria-checked="false" data-style-id="sketch" tabindex="-1" class="flex min-w-0 flex-col items-center gap-1.5 rounded-md-md outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface"><span aria-hidden="true" class="block aspect-square w-full overflow-hidden rounded-md-md bg-gradient-to-br transition-[border-color,border-width] motion-reduce:transition-none from-md-secondary-container to-md-secondary/30 border border-md-outline-variant"></span><span class="max-w-full truncate text-xs text-md-on-surface-variant">Sketch</span></button></div><div class="flex items-center gap-3 rounded-md-md border border-dashed border-md-outline p-3 transition-colors"><input type="file" accept="image/*" tabindex="-1" aria-hidden="true" class="sr-only" aria-label="Reference image"/><button type="button" class="relative flex min-w-0 flex-1 items-center gap-3 rounded-md-sm text-left outline-none focus-visible:ring-2 focus-visible:ring-md-primary focus-visible:ring-offset-2 focus-visible:ring-offset-md-surface"><span aria-hidden="true" class="grid size-10 shrink-0 place-items-center overflow-hidden rounded-md-sm bg-md-surface-container-high text-md-on-surface-variant"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image size-5"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"></rect><circle cx="9" cy="9" r="2"></circle><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"></path></svg></span><span class="flex min-w-0 flex-col"><span class="text-sm font-medium text-md-on-surface">Match a style</span><span class="truncate text-xs text-md-on-surface-variant">Drop a reference image to copy its aesthetic</span></span></button></div><div class="flex items-center gap-2 rounded-md-md bg-md-surface-container-low px-3 py-1.5 text-[13px] text-md-on-surface-variant"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-palette size-[18px] shrink-0 text-md-primary" aria-hidden="true"><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"></circle><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"></circle><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"></circle><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"></circle><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z"></path></svg><span class="min-w-0 flex-1" aria-live="polite">Style locked to <strong class="font-medium text-md-on-surface">Photo</strong> for this project</span><button type="button" class="relative inline-flex min-h-8 items-center gap-1 rounded-full px-2.5 text-[13px] font-medium text-md-primary [&_svg]:size-[18px] before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:bg-current before:opacity-0 before:transition-opacity before:content-[''] hover:before:opacity-[0.08] active:before:opacity-[0.12] motion-reduce:before:transition-none outline-none focus-visible:ring-2 focus-visible:ring-md-primary shrink-0">Unlock</button></div></div>`,
23310
+ idCount: 1,
23311
+ text: [
23312
+ "Output style",
23313
+ "Photo",
23314
+ "Illustration",
23315
+ "Isometric",
23316
+ "Sketch",
23317
+ "Match a style",
23318
+ "Style locked to",
23319
+ "for this project",
23320
+ "Unlock"
23321
+ ]
21019
23322
  }
21020
23323
  }
21021
23324
  };