@ctrliq/quantic-components 1.88.0 → 1.89.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.
Files changed (42) hide show
  1. package/dist/action-group/action-group.component.js +3 -1
  2. package/dist/badge/badge-group.component.js +3 -1
  3. package/dist/code-input/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/llms/components/quantic-action-group.md +4 -1
  6. package/dist/llms/components/quantic-badge-group.md +4 -1
  7. package/dist/llms/components/quantic-code-input.md +3 -0
  8. package/dist/llms/components/quantic-number-input.md +3 -0
  9. package/dist/llms/components/quantic-option-card.md +4 -0
  10. package/dist/llms/components/quantic-splitter-group.md +3 -0
  11. package/dist/llms/components/quantic-tab-button.md +5 -1
  12. package/dist/llms/components/quantic-tabs.md +4 -0
  13. package/dist/llms/components/quantic-tag-group.md +4 -1
  14. package/dist/llms/components/quantic-text-input.md +3 -0
  15. package/dist/llms/components/quantic-textarea.md +3 -0
  16. package/dist/llms/setup.md +1 -1
  17. package/dist/llms.txt +1 -1
  18. package/dist/meta/index.js.map +1 -1
  19. package/dist/meta/part-parity.test.d.ts +1 -0
  20. package/dist/meta/part-parity.test.js +68 -0
  21. package/dist/meta/serialize.d.ts +6 -2
  22. package/dist/meta/serialize.js +2 -0
  23. package/dist/meta/serialize.test.js +7 -0
  24. package/dist/meta.json +83 -5
  25. package/dist/number-input/index.js +1 -0
  26. package/dist/option-card/option-card.component.js +4 -0
  27. package/dist/quantic-components.js +30 -5
  28. package/dist/quantic-components.js.map +1 -1
  29. package/dist/quantic-components.min.js +11 -11
  30. package/dist/quantic-components.min.js.map +1 -1
  31. package/dist/register.js.map +1 -1
  32. package/dist/shared/meta.types.d.ts +4 -0
  33. package/dist/splitter/splitter-group.component.js +3 -0
  34. package/dist/tabs/button.component.js +6 -2
  35. package/dist/tabs/tabs.component.js +4 -0
  36. package/dist/tag/tag-group.component.js +3 -1
  37. package/dist/text-input/index.js +1 -0
  38. package/dist/textarea/index.js +1 -0
  39. package/dist/types/meta/part-parity.test.d.ts +1 -0
  40. package/dist/types/meta/serialize.d.ts +6 -2
  41. package/dist/types/shared/meta.types.d.ts +4 -0
  42. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,68 @@
1
+ import { globSync, readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { describe, expect, it } from 'vitest';
5
+ const SRC_DIR = join(dirname(fileURLToPath(import.meta.url)), '..');
6
+ const TAG = /@quanticElement\(\s*['"`]([^'"`]+)['"`]\s*\)/;
7
+ // A negative lookbehind for `[` excludes `[part="divider"]`-style CSS selector strings
8
+ // used to query the rendered part from JS, which are not a `::part()` declaration.
9
+ const PART_ATTR = /(?<!\[)\bpart="([^"]+)"/g;
10
+ const PART_KEY = /(?:'([^']*)'|([A-Za-z_$][\w$]*))\s*:\s*\{/g;
11
+ // Read from source rather than importing allMeta: that would pull in every component
12
+ // module, and several import generated icon files that only exist after a build.
13
+ function componentSources() {
14
+ return globSync('**/*.ts', { cwd: SRC_DIR })
15
+ .filter((file) => !/\.(stories|test|d)\.ts$/.test(file))
16
+ .map((file) => ({ file, source: readFileSync(join(SRC_DIR, file), 'utf-8') }));
17
+ }
18
+ /** Top-level keys of the `parts: { ... }` object, by brace matching from its opening. */
19
+ function declaredParts(source) {
20
+ const start = source.indexOf('parts: {');
21
+ if (start === -1)
22
+ return new Set();
23
+ const open = source.indexOf('{', start);
24
+ let depth = 0;
25
+ let end = open;
26
+ for (; end < source.length; end++) {
27
+ if (source[end] === '{')
28
+ depth++;
29
+ else if (source[end] === '}' && --depth === 0)
30
+ break;
31
+ }
32
+ const body = source.slice(open + 1, end);
33
+ const names = new Set();
34
+ let nesting = 0;
35
+ for (const match of body.matchAll(PART_KEY)) {
36
+ // Only keys sitting directly in the parts object name a part; `description` and
37
+ // friends live one level down.
38
+ nesting = [...body.slice(0, match.index)].reduce((depth, character) => depth + (character === '{' ? 1 : character === '}' ? -1 : 0), 0);
39
+ if (nesting === 0)
40
+ names.add(match[1] ?? match[2]);
41
+ }
42
+ return names;
43
+ }
44
+ /** Rendered `::part()` names per tag. */
45
+ function renderedParts() {
46
+ return componentSources().flatMap(({ file, source }) => {
47
+ const tag = source.match(TAG)?.[1];
48
+ if (!tag || tag.includes('${'))
49
+ return [];
50
+ const names = [...new Set([...source.matchAll(PART_ATTR)].map(([, name]) => name))];
51
+ return names.length ? [{ tag, file, names, declared: declaredParts(source) }] : [];
52
+ });
53
+ }
54
+ describe('part parity', () => {
55
+ // The manifest is the only thing anything reads. A part that render() serves but meta
56
+ // does not declare is invisible to generated docs and to meta.json, and it turns
57
+ // `::part()` into an escape hatch nobody outside this repo can discover.
58
+ it('declares every part that render serves', () => {
59
+ const undeclared = renderedParts().flatMap(({ tag, file, names, declared }) => {
60
+ const missing = names.filter((name) => !declared.has(name));
61
+ return missing.length ? [`${tag} (${file}) is missing: ${missing.join(', ')}`] : [];
62
+ });
63
+ expect(undeclared).toEqual([]);
64
+ });
65
+ it('found parts to check', () => {
66
+ expect(renderedParts().length).toBeGreaterThan(0);
67
+ });
68
+ });
@@ -1,5 +1,5 @@
1
1
  import type { CopyRule } from '../shared/copy-rules';
2
- import type { ComponentMeta, EventMeta, PropMeta, SlotMeta } from '../shared/meta.types';
2
+ import type { ComponentMeta, EventMeta, PartMeta, PropMeta, SlotMeta } from '../shared/meta.types';
3
3
  export declare const MANIFEST_SCHEMA_VERSION = 1;
4
4
  export type ManifestProp = PropMeta & {
5
5
  name: string;
@@ -10,10 +10,14 @@ export type ManifestSlot = SlotMeta & {
10
10
  export type ManifestEvent = EventMeta & {
11
11
  name: string;
12
12
  };
13
- export interface ManifestComponent extends Omit<ComponentMeta, 'props' | 'slots' | 'events'> {
13
+ export type ManifestPart = PartMeta & {
14
+ name: string;
15
+ };
16
+ export interface ManifestComponent extends Omit<ComponentMeta, 'props' | 'slots' | 'events' | 'parts'> {
14
17
  props?: ManifestProp[];
15
18
  slots?: ManifestSlot[];
16
19
  events?: ManifestEvent[];
20
+ parts?: ManifestPart[];
17
21
  /** Derived from the children's `subComponentOf`, never hand-authored. */
18
22
  subComponents?: string[];
19
23
  }
@@ -8,6 +8,7 @@ export function serializeComponent(component, subComponents) {
8
8
  const props = toNamedArray(component.props);
9
9
  const events = toNamedArray(component.events);
10
10
  const slots = toNamedArray(component.slots);
11
+ const parts = toNamedArray(component.parts);
11
12
  const accessibility = component.accessibility?.providedByComponent?.length ||
12
13
  component.accessibility?.requiredFromConsumer?.length
13
14
  ? component.accessibility
@@ -22,6 +23,7 @@ export function serializeComponent(component, subComponents) {
22
23
  ...(props ? { props } : {}),
23
24
  ...(events ? { events } : {}),
24
25
  ...(slots ? { slots } : {}),
26
+ ...(parts ? { parts } : {}),
25
27
  ...(component.examples?.length ? { examples: component.examples } : {}),
26
28
  ...(component.relatedTo?.length ? { relatedTo: component.relatedTo } : {}),
27
29
  ...(component.avoidWhen?.length ? { avoidWhen: component.avoidWhen } : {}),
@@ -24,6 +24,13 @@ describe('serializeComponent', () => {
24
24
  const { slots } = serializeComponent(makeComponent({ slots: { header: { description: 'Header', required: true } } }));
25
25
  expect(slots).toEqual([{ name: 'header', description: 'Header', required: true }]);
26
26
  });
27
+ it('converts parts to an array carrying the part name', () => {
28
+ const { parts } = serializeComponent(makeComponent({ parts: { group: { description: 'The flex container' } } }));
29
+ expect(parts).toEqual([{ name: 'group', description: 'The flex container' }]);
30
+ });
31
+ it('omits parts entirely when the component declares none', () => {
32
+ expect(serializeComponent(makeComponent()).parts).toBeUndefined();
33
+ });
27
34
  it('keeps forwarded events and flags them', () => {
28
35
  const { events } = serializeComponent(makeComponent({
29
36
  events: {
package/dist/meta.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generated": "2026-09-01T06:43:34.670Z",
3
+ "generated": "2026-09-04T09:04:13.164Z",
4
4
  "copyRules": {
5
5
  "field-label": {
6
6
  "rule": "Noun phrase, sentence case, no trailing colon.",
@@ -171,7 +171,7 @@
171
171
  "components": [
172
172
  {
173
173
  "tag": "quantic-action-group",
174
- "description": "A row of related actions sharing one accessible name and a consistent gap. Takes quantic-button, and quantic-dropdown-menu or quantic-popover when the trigger is a button. Wraps when the row runs out of width. Gap: --quantic-component-action-group-gap. Layout: ::part(group), for a column or a different alignment. Use quantic-button-bar when the buttons should read as one joined control.",
174
+ "description": "A row of related actions sharing one accessible name and a consistent gap. Takes quantic-button, and quantic-dropdown-menu or quantic-popover when the trigger is a button. Wraps when the row runs out of width. Gap: --quantic-component-action-group-gap. Use quantic-button-bar when the buttons should read as one joined control.",
175
175
  "category": "action",
176
176
  "props": [
177
177
  {
@@ -186,6 +186,12 @@
186
186
  "description": "quantic-button elements, or a quantic-dropdown-menu or quantic-popover triggered by one."
187
187
  }
188
188
  ],
189
+ "parts": [
190
+ {
191
+ "name": "group",
192
+ "description": "The flex container, for a column layout or a different alignment."
193
+ }
194
+ ],
189
195
  "examples": [
190
196
  "<quantic-action-group ><quantic-button variant=\"outline\">Cancel</quantic-button><quantic-button variant=\"primary\">Save</quantic-button></quantic-action-group>",
191
197
  "<quantic-action-group aria-label=\"Asset actions\">\n <quantic-button variant=\"ghost\" size=\"sm\">\n <quantic-icon-lucide-copy size=\"xs\"></quantic-icon-lucide-copy>\n </quantic-button>\n <quantic-button variant=\"ghost\" size=\"sm\">\n <quantic-icon-lucide-download size=\"xs\"></quantic-icon-lucide-download>\n </quantic-button>\n </quantic-action-group>",
@@ -406,7 +412,7 @@
406
412
  },
407
413
  {
408
414
  "tag": "quantic-badge-group",
409
- "description": "A run of quantic-badge or quantic-status-badge sharing one accessible name and a consistent gap. Wraps across lines, and each badge keeps its own size. Gap: --quantic-component-badge-group-gap. Layout: ::part(group), for a column or a different alignment. Use quantic-tag-group for tags.",
415
+ "description": "A run of quantic-badge or quantic-status-badge sharing one accessible name and a consistent gap. Wraps across lines, and each badge keeps its own size. Gap: --quantic-component-badge-group-gap. Use quantic-tag-group for tags.",
410
416
  "category": "display",
411
417
  "props": [
412
418
  {
@@ -421,6 +427,12 @@
421
427
  "description": "quantic-badge or quantic-status-badge elements."
422
428
  }
423
429
  ],
430
+ "parts": [
431
+ {
432
+ "name": "group",
433
+ "description": "The flex container, for a column layout or a different alignment."
434
+ }
435
+ ],
424
436
  "examples": [
425
437
  "<quantic-badge-group ><quantic-badge color=\"gray\" size=\"sm\">Backgrounds</quantic-badge><quantic-badge color=\"gray\" size=\"sm\">Email signatures</quantic-badge><quantic-badge color=\"gray\" size=\"sm\">Headers</quantic-badge></quantic-badge-group>",
426
438
  "<quantic-badge-group aria-label=\"Service status\">\n <quantic-status-badge color=\"success\" size=\"sm\">Running</quantic-status-badge>\n <quantic-status-badge color=\"warning\" size=\"sm\">Degraded</quantic-status-badge>\n <quantic-status-badge color=\"error\" size=\"sm\">Offline</quantic-status-badge>\n </quantic-badge-group>",
@@ -1719,6 +1731,12 @@
1719
1731
  "detail": "{ value: string }"
1720
1732
  }
1721
1733
  ],
1734
+ "parts": [
1735
+ {
1736
+ "name": "textarea",
1737
+ "description": "The native textarea element."
1738
+ }
1739
+ ],
1722
1740
  "examples": [
1723
1741
  "<quantic-code-input\n name=\"code-input\"\n placeholder=\"Enter code here...\"\n rows=\"6\"\n size=\"md\"\n line-numbers\n ></quantic-code-input>",
1724
1742
  "<quantic-code-input\n name=\"code-input\"\n placeholder=\"Enter code here...\"\n rows=\"6\"\n size=\"md\"\n disabled\n line-numbers\n ></quantic-code-input>",
@@ -3382,6 +3400,12 @@
3382
3400
  "description": "Leading content (e.g. icon or unit symbol)."
3383
3401
  }
3384
3402
  ],
3403
+ "parts": [
3404
+ {
3405
+ "name": "input",
3406
+ "description": "The native input element."
3407
+ }
3408
+ ],
3385
3409
  "examples": [
3386
3410
  "<quantic-number-input\n value=\"16\"\n placeholder=\"0\"\n size=\"md\"\n name=\"number-input\"\n ></quantic-number-input>",
3387
3411
  "<quantic-number-input\n value=\"16\"\n placeholder=\"0\"\n size=\"md\"\n name=\"number-input\"\n disabled\n ></quantic-number-input>",
@@ -3513,6 +3537,16 @@
3513
3537
  "description": "Optional secondary description below the label."
3514
3538
  }
3515
3539
  ],
3540
+ "parts": [
3541
+ {
3542
+ "name": "label",
3543
+ "description": "The wrapping label element."
3544
+ },
3545
+ {
3546
+ "name": "indicator",
3547
+ "description": "The checkbox or radio visual."
3548
+ }
3549
+ ],
3516
3550
  "examples": [
3517
3551
  "<div style=\"display: flex; flex-direction: column; gap: 1rem;\">\n <quantic-option-card value=\"small\" size=\"sm\" variant=\"ghost\">\n <quantic-icon-lucide-user slot=\"icon\"></quantic-icon-lucide-user>\n <div>Small size</div>\n <div slot=\"description\">This is a small option card</div>\n </quantic-option-card>\n\n <quantic-option-card value=\"medium\" size=\"md\" variant=\"ghost\">\n <quantic-icon-lucide-users slot=\"icon\"></quantic-icon-lucide-users>\n <div>Medium size (default)</div>\n <div slot=\"description\">This is a medium option card</div>\n </quantic-option-card>\n\n <quantic-option-card value=\"large\" size=\"lg\" variant=\"ghost\">\n <quantic-icon-lucide-building-2 slot=\"icon\"></quantic-icon-lucide-building-2>\n <div>Large size</div>\n <div slot=\"description\">This is a large option card</div>\n </quantic-option-card>\n </div>",
3518
3552
  "<quantic-option-card value=\"pro\" variant=\"solid\" size=\"md\" checked>\n <div>Pro plan</div>\n <div slot=\"description\">Most popular choice for growing businesses</div>\n </quantic-option-card>",
@@ -5168,6 +5202,12 @@
5168
5202
  "description": "Two or more quantic-splitter-pane elements."
5169
5203
  }
5170
5204
  ],
5205
+ "parts": [
5206
+ {
5207
+ "name": "divider",
5208
+ "description": "The draggable handle between two panes."
5209
+ }
5210
+ ],
5171
5211
  "examples": [
5172
5212
  "<div style=\"height: 400px;\">\n <quantic-splitter-group>\n <quantic-splitter-pane>\n <div style=\"padding: 16px; font-family: sans-serif;\">Left</div>\n </quantic-splitter-pane>\n <quantic-splitter-pane variant=\"solid\">\n <div style=\"padding: 16px; font-family: sans-serif;\">Right</div>\n </quantic-splitter-pane>\n </quantic-splitter-group>\n </div>",
5173
5213
  "<div style=\"height: 400px;\">\n <quantic-splitter-group resizable split=\"50 50\">\n <quantic-splitter-pane>\n <div style=\"padding: 16px; font-family: sans-serif;\">\n <quantic-card-group>\n <quantic-card variant=\"solid\">\n <quantic-card-title slot=\"header\">Alice Johnson</quantic-card-title>\n Product Designer · San Francisco\n </quantic-card>\n <quantic-card variant=\"solid\">\n <quantic-card-title slot=\"header\">Bob Martinez</quantic-card-title>\n Frontend Engineer · New York\n </quantic-card>\n <quantic-card variant=\"solid\">\n <quantic-card-title slot=\"header\">Clara Lee</quantic-card-title>\n Engineering Manager · London\n </quantic-card>\n <quantic-card variant=\"solid\">\n <quantic-card-title slot=\"header\">David Kim</quantic-card-title>\n Backend Engineer · Seoul\n </quantic-card>\n </quantic-card-group>\n </div>\n </quantic-splitter-pane>\n <quantic-splitter-pane>\n <div style=\"padding: 16px; font-family: sans-serif;\">\n <quantic-field-group>\n <quantic-text-field label=\"Full Name\" placeholder=\"Enter full name\" required></quantic-text-field>\n <quantic-text-field label=\"Email\" type=\"email\" placeholder=\"Enter email address\" hint=\"We'll never share your email\" required></quantic-text-field>\n <quantic-select-field name=\"role\" label=\"Role\" placeholder=\"Select a role\">\n <option value=\"designer\">Product Designer</option>\n <option value=\"frontend\">Frontend Engineer</option>\n <option value=\"backend\">Backend Engineer</option>\n <option value=\"manager\">Engineering Manager</option>\n </quantic-select-field>\n <quantic-select-field name=\"location\" label=\"Location\" placeholder=\"Select a location\">\n <option value=\"sf\">San Francisco</option>\n <option value=\"ny\">New York</option>\n <option value=\"london\">London</option>\n <option value=\"seoul\">Seoul</option>\n </quantic-select-field>\n </quantic-field-group>\n </div>\n </quantic-splitter-pane>\n </quantic-splitter-group>\n </div>",
@@ -5388,7 +5428,7 @@
5388
5428
  },
5389
5429
  {
5390
5430
  "tag": "quantic-tab-button",
5391
- "description": "Individual tab trigger button within quantic-tabs. Set index to match the corresponding quantic-tab-panel. Size and orientation are inherited via context from the parent quantic-tabs. Reflects a selected attribute while active. Restyle the mark with ::part(indicator) or --quantic-component-tab-indicator-* / --quantic-component-tab-active-bg.",
5431
+ "description": "Individual tab trigger button within quantic-tabs. Set index to match the corresponding quantic-tab-panel. Size and orientation are inherited via context from the parent quantic-tabs. Reflects a selected attribute while active. Restyle the mark with --quantic-component-tab-indicator-* / --quantic-component-tab-active-bg.",
5392
5432
  "category": "navigation",
5393
5433
  "props": [
5394
5434
  {
@@ -5437,6 +5477,16 @@
5437
5477
  "description": "Tab label text or custom content."
5438
5478
  }
5439
5479
  ],
5480
+ "parts": [
5481
+ {
5482
+ "name": "button",
5483
+ "description": "The native button element."
5484
+ },
5485
+ {
5486
+ "name": "indicator",
5487
+ "description": "The active-tab mark."
5488
+ }
5489
+ ],
5440
5490
  "relatedTo": [
5441
5491
  "quantic-tabs",
5442
5492
  "quantic-tab-panel"
@@ -5856,6 +5906,16 @@
5856
5906
  "description": "quantic-tab-button and quantic-tab-panel elements as direct children."
5857
5907
  }
5858
5908
  ],
5909
+ "parts": [
5910
+ {
5911
+ "name": "nav",
5912
+ "description": "The tablist container wrapping the tab buttons."
5913
+ },
5914
+ {
5915
+ "name": "panels",
5916
+ "description": "The container wrapping the tab panels."
5917
+ }
5918
+ ],
5859
5919
  "examples": [
5860
5920
  "<style>\n .stack-tabs-frame {\n width: 28rem;\n max-width: 100%;\n border: 1px solid var(--quantic-border-secondary);\n border-radius: var(--quantic-radius-md);\n padding: var(--quantic-spacing-4);\n resize: horizontal;\n overflow: auto;\n }\n </style>\n <div class=\"stack-tabs-frame\">\n <quantic-tabs\n selected-index=\"0\"\n size=\"md\"\n orientation=\"vertical\"\n collapse-below=\"640px\"\n >\n <quantic-tab-button index=\"0\">Profile</quantic-tab-button>\n <quantic-tab-button index=\"1\">Notifications</quantic-tab-button>\n <quantic-tab-button index=\"2\">Security</quantic-tab-button>\n\n <quantic-tab-panel index=\"0\">\n <p class=\"story-copy\">Stacked when the tabs container is 640px wide or less.</p>\n </quantic-tab-panel>\n <quantic-tab-panel index=\"1\">\n <p class=\"story-copy\">Email Notifications: Enabled</p>\n </quantic-tab-panel>\n <quantic-tab-panel index=\"2\">\n <p class=\"story-copy\">Change Password</p>\n </quantic-tab-panel>\n </quantic-tabs>\n </div>",
5861
5921
  "<quantic-tabs\n selected-index=\"0\"\n size=\"md\"\n orientation=\"horizontal\"\n style=\"--quantic-component-tabs-gap: var(--quantic-spacing-1)\"\n >\n <quantic-tab-button index=\"0\">Profile</quantic-tab-button>\n <quantic-tab-button index=\"1\">Notifications</quantic-tab-button>\n <quantic-tab-button index=\"2\">Security</quantic-tab-button>\n\n <quantic-tab-panel index=\"0\">\n <p class=\"story-lead\">Jane Doe</p>\n <p class=\"story-copy\">Email: jane.doe@example.com</p>\n </quantic-tab-panel>\n <quantic-tab-panel index=\"1\">\n <p class=\"story-copy\">Email Notifications: Enabled</p>\n </quantic-tab-panel>\n <quantic-tab-panel index=\"2\">\n <p class=\"story-copy\">Change Password</p>\n </quantic-tab-panel>\n </quantic-tabs>",
@@ -5983,7 +6043,7 @@
5983
6043
  },
5984
6044
  {
5985
6045
  "tag": "quantic-tag-group",
5986
- "description": "A run of quantic-tag, quantic-status-tag or quantic-count-tag sharing one accessible name and a consistent gap. Wraps across lines, and each tag keeps its own size. Gap: --quantic-component-tag-group-gap. Layout: ::part(group), for a column or a different alignment. Use quantic-badge-group for badges.",
6046
+ "description": "A run of quantic-tag, quantic-status-tag or quantic-count-tag sharing one accessible name and a consistent gap. Wraps across lines, and each tag keeps its own size. Gap: --quantic-component-tag-group-gap. Use quantic-badge-group for badges.",
5987
6047
  "category": "display",
5988
6048
  "props": [
5989
6049
  {
@@ -5998,6 +6058,12 @@
5998
6058
  "description": "quantic-tag, quantic-status-tag or quantic-count-tag elements."
5999
6059
  }
6000
6060
  ],
6061
+ "parts": [
6062
+ {
6063
+ "name": "group",
6064
+ "description": "The flex container, for a column layout or a different alignment."
6065
+ }
6066
+ ],
6001
6067
  "examples": [
6002
6068
  "<quantic-tag-group ><quantic-tag size=\"md\">Compute</quantic-tag><quantic-tag size=\"md\">Storage</quantic-tag><quantic-tag size=\"md\">Networking</quantic-tag></quantic-tag-group>",
6003
6069
  "<quantic-tag-group aria-label=\"Applied filters\">\n <quantic-tag dismissible>Compute</quantic-tag>\n <quantic-tag dismissible>Storage</quantic-tag>\n <quantic-tag dismissible>Networking</quantic-tag>\n </quantic-tag-group>",
@@ -6356,6 +6422,12 @@
6356
6422
  "description": "Trailing content (e.g. icon or unit label)."
6357
6423
  }
6358
6424
  ],
6425
+ "parts": [
6426
+ {
6427
+ "name": "input",
6428
+ "description": "The native input element."
6429
+ }
6430
+ ],
6359
6431
  "examples": [
6360
6432
  "<quantic-text-input value=\"Sample text\" placeholder=\"Type something...\" size=\"md\" name=\"text-input\"></quantic-text-input>",
6361
6433
  "<quantic-text-input value=\"Sample text\" placeholder=\"Type something...\" size=\"md\" name=\"text-input\" disabled></quantic-text-input>",
@@ -6538,6 +6610,12 @@
6538
6610
  "detail": "{ value: string }"
6539
6611
  }
6540
6612
  ],
6613
+ "parts": [
6614
+ {
6615
+ "name": "input",
6616
+ "description": "The native textarea element."
6617
+ }
6618
+ ],
6541
6619
  "examples": [
6542
6620
  "<quantic-textarea value=\"Sample text\" placeholder=\"Type something...\" size=\"md\" name=\"textarea\" rows=\"4\" resize=\"vertical\"></quantic-textarea>",
6543
6621
  "<quantic-textarea value=\"Sample text\" placeholder=\"Type something...\" size=\"md\" name=\"textarea\" rows=\"4\" resize=\"vertical\" disabled></quantic-textarea>",
@@ -190,6 +190,7 @@ NumberInput.meta = {
190
190
  ],
191
191
  },
192
192
  slots: { prefix: { description: 'Leading content (e.g. icon or unit symbol).' } },
193
+ parts: { input: { description: 'The native input element.' } },
193
194
  relatedTo: ['quantic-field', 'quantic-text-input'],
194
195
  };
195
196
  NumberInput.formAssociated = true;
@@ -184,6 +184,10 @@ OptionCard.meta = {
184
184
  description: 'Optional secondary description below the label.',
185
185
  },
186
186
  },
187
+ parts: {
188
+ label: { description: 'The wrapping label element.' },
189
+ indicator: { description: 'The checkbox or radio visual.' },
190
+ },
187
191
  relatedTo: ['quantic-option-card-group', 'quantic-field'],
188
192
  };
189
193
  OptionCard.formAssociated = true;
@@ -5867,7 +5867,6 @@
5867
5867
  tag: 'quantic-badge-group',
5868
5868
  description: 'A run of quantic-badge or quantic-status-badge sharing one accessible name and a consistent gap. ' +
5869
5869
  'Wraps across lines, and each badge keeps its own size. Gap: --quantic-component-badge-group-gap. ' +
5870
- 'Layout: ::part(group), for a column or a different alignment. ' +
5871
5870
  'Use quantic-tag-group for tags.',
5872
5871
  category: 'display',
5873
5872
  accessibility: {
@@ -5879,6 +5878,9 @@
5879
5878
  description: 'quantic-badge or quantic-status-badge elements.',
5880
5879
  },
5881
5880
  },
5881
+ parts: {
5882
+ group: { description: 'The flex container, for a column layout or a different alignment.' },
5883
+ },
5882
5884
  relatedTo: ['quantic-badge', 'quantic-tag-group', 'quantic-status-badge'],
5883
5885
  };
5884
5886
  exports.BadgeGroup.styles = i$7 `
@@ -6118,7 +6120,6 @@
6118
6120
  description: 'A row of related actions sharing one accessible name and a consistent gap. ' +
6119
6121
  'Takes quantic-button, and quantic-dropdown-menu or quantic-popover when the trigger is a button. ' +
6120
6122
  'Wraps when the row runs out of width. Gap: --quantic-component-action-group-gap. ' +
6121
- 'Layout: ::part(group), for a column or a different alignment. ' +
6122
6123
  'Use quantic-button-bar when the buttons should read as one joined control.',
6123
6124
  category: 'action',
6124
6125
  avoidWhen: [
@@ -6136,6 +6137,9 @@
6136
6137
  description: 'quantic-button elements, or a quantic-dropdown-menu or quantic-popover triggered by one.',
6137
6138
  },
6138
6139
  },
6140
+ parts: {
6141
+ group: { description: 'The flex container, for a column layout or a different alignment.' },
6142
+ },
6139
6143
  relatedTo: [
6140
6144
  'quantic-button',
6141
6145
  'quantic-button-bar',
@@ -8059,6 +8063,7 @@
8059
8063
  'a visible label, by wrapping in quantic-field, or the ariaLabel prop',
8060
8064
  ],
8061
8065
  },
8066
+ parts: { textarea: { description: 'The native textarea element.' } },
8062
8067
  relatedTo: ['quantic-field', 'quantic-text-input'],
8063
8068
  };
8064
8069
  exports.CodeInput.formAssociated = true;
@@ -13785,6 +13790,7 @@
13785
13790
  prefix: { description: 'Leading content (e.g. icon or currency symbol).' },
13786
13791
  suffix: { description: 'Trailing content (e.g. icon or unit label).' },
13787
13792
  },
13793
+ parts: { input: { description: 'The native input element.' } },
13788
13794
  relatedTo: ['quantic-field', 'quantic-number-input', 'quantic-select'],
13789
13795
  };
13790
13796
  exports.TextInput.formAssociated = true;
@@ -63910,6 +63916,7 @@
63910
63916
  ],
63911
63917
  },
63912
63918
  slots: { prefix: { description: 'Leading content (e.g. icon or unit symbol).' } },
63919
+ parts: { input: { description: 'The native input element.' } },
63913
63920
  relatedTo: ['quantic-field', 'quantic-text-input'],
63914
63921
  };
63915
63922
  exports.NumberInput.formAssociated = true;
@@ -66631,6 +66638,10 @@
66631
66638
  description: 'Optional secondary description below the label.',
66632
66639
  },
66633
66640
  },
66641
+ parts: {
66642
+ label: { description: 'The wrapping label element.' },
66643
+ indicator: { description: 'The checkbox or radio visual.' },
66644
+ },
66634
66645
  relatedTo: ['quantic-option-card-group', 'quantic-field'],
66635
66646
  };
66636
66647
  exports.OptionCard.formAssociated = true;
@@ -68744,6 +68755,9 @@
68744
68755
  requiredFromConsumer: ['an accessible name for each pane'],
68745
68756
  },
68746
68757
  slots: { '': { description: 'Two or more quantic-splitter-pane elements.' } },
68758
+ parts: {
68759
+ divider: { description: 'The draggable handle between two panes.' },
68760
+ },
68747
68761
  };
68748
68762
  exports.SplitterGroup.styles = i$7 `
68749
68763
  :host {
@@ -69711,6 +69725,10 @@
69711
69725
  description: 'quantic-tab-button and quantic-tab-panel elements as direct children.',
69712
69726
  },
69713
69727
  },
69728
+ parts: {
69729
+ nav: { description: 'The tablist container wrapping the tab buttons.' },
69730
+ panels: { description: 'The container wrapping the tab panels.' },
69731
+ },
69714
69732
  };
69715
69733
  exports.Tabs.styles = [
69716
69734
  i$7 `
@@ -69932,8 +69950,8 @@
69932
69950
  description: 'Individual tab trigger button within quantic-tabs. ' +
69933
69951
  'Set index to match the corresponding quantic-tab-panel. ' +
69934
69952
  'Size and orientation are inherited via context from the parent quantic-tabs. ' +
69935
- 'Reflects a selected attribute while active. Restyle the mark with ::part(indicator) ' +
69936
- 'or --quantic-component-tab-indicator-* / --quantic-component-tab-active-bg.',
69953
+ 'Reflects a selected attribute while active. Restyle the mark with ' +
69954
+ '--quantic-component-tab-indicator-* / --quantic-component-tab-active-bg.',
69937
69955
  category: 'navigation',
69938
69956
  subComponentOf: 'quantic-tabs',
69939
69957
  slots: {
@@ -69944,6 +69962,10 @@
69944
69962
  description: 'Tab label text or custom content.',
69945
69963
  },
69946
69964
  },
69965
+ parts: {
69966
+ button: { description: 'The native button element.' },
69967
+ indicator: { description: 'The active-tab mark.' },
69968
+ },
69947
69969
  relatedTo: ['quantic-tabs', 'quantic-tab-panel'],
69948
69970
  };
69949
69971
  exports.TabButton.styles = i$7 `
@@ -70672,7 +70694,6 @@
70672
70694
  tag: 'quantic-tag-group',
70673
70695
  description: 'A run of quantic-tag, quantic-status-tag or quantic-count-tag sharing one accessible name and a consistent gap. ' +
70674
70696
  'Wraps across lines, and each tag keeps its own size. Gap: --quantic-component-tag-group-gap. ' +
70675
- 'Layout: ::part(group), for a column or a different alignment. ' +
70676
70697
  'Use quantic-badge-group for badges.',
70677
70698
  category: 'display',
70678
70699
  accessibility: {
@@ -70687,6 +70708,9 @@
70687
70708
  description: 'quantic-tag, quantic-status-tag or quantic-count-tag elements.',
70688
70709
  },
70689
70710
  },
70711
+ parts: {
70712
+ group: { description: 'The flex container, for a column layout or a different alignment.' },
70713
+ },
70690
70714
  relatedTo: [
70691
70715
  'quantic-tag',
70692
70716
  'quantic-badge-group',
@@ -70926,6 +70950,7 @@
70926
70950
  'a visible label, by wrapping in quantic-field, or the ariaLabel prop',
70927
70951
  ],
70928
70952
  },
70953
+ parts: { input: { description: 'The native textarea element.' } },
70929
70954
  relatedTo: ['quantic-field', 'quantic-text-input'],
70930
70955
  };
70931
70956
  exports.Textarea.formAssociated = true;