@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.
- package/dist/action-group/action-group.component.js +3 -1
- package/dist/badge/badge-group.component.js +3 -1
- package/dist/code-input/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/llms/components/quantic-action-group.md +4 -1
- package/dist/llms/components/quantic-badge-group.md +4 -1
- package/dist/llms/components/quantic-code-input.md +3 -0
- package/dist/llms/components/quantic-number-input.md +3 -0
- package/dist/llms/components/quantic-option-card.md +4 -0
- package/dist/llms/components/quantic-splitter-group.md +3 -0
- package/dist/llms/components/quantic-tab-button.md +5 -1
- package/dist/llms/components/quantic-tabs.md +4 -0
- package/dist/llms/components/quantic-tag-group.md +4 -1
- package/dist/llms/components/quantic-text-input.md +3 -0
- package/dist/llms/components/quantic-textarea.md +3 -0
- package/dist/llms/setup.md +1 -1
- package/dist/llms.txt +1 -1
- package/dist/meta/index.js.map +1 -1
- package/dist/meta/part-parity.test.d.ts +1 -0
- package/dist/meta/part-parity.test.js +68 -0
- package/dist/meta/serialize.d.ts +6 -2
- package/dist/meta/serialize.js +2 -0
- package/dist/meta/serialize.test.js +7 -0
- package/dist/meta.json +83 -5
- package/dist/number-input/index.js +1 -0
- package/dist/option-card/option-card.component.js +4 -0
- package/dist/quantic-components.js +30 -5
- package/dist/quantic-components.js.map +1 -1
- package/dist/quantic-components.min.js +11 -11
- package/dist/quantic-components.min.js.map +1 -1
- package/dist/register.js.map +1 -1
- package/dist/shared/meta.types.d.ts +4 -0
- package/dist/splitter/splitter-group.component.js +3 -0
- package/dist/tabs/button.component.js +6 -2
- package/dist/tabs/tabs.component.js +4 -0
- package/dist/tag/tag-group.component.js +3 -1
- package/dist/text-input/index.js +1 -0
- package/dist/textarea/index.js +1 -0
- package/dist/types/meta/part-parity.test.d.ts +1 -0
- package/dist/types/meta/serialize.d.ts +6 -2
- package/dist/types/shared/meta.types.d.ts +4 -0
- 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
|
+
});
|
package/dist/meta/serialize.d.ts
CHANGED
|
@@ -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
|
|
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
|
}
|
package/dist/meta/serialize.js
CHANGED
|
@@ -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-
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
69936
|
-
'
|
|
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;
|