@ctrliq/quantic-components 1.88.0 → 1.89.1
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/icon/__generated__/lucide-icon-names.enum.d.ts +321 -107
- package/dist/icon/__generated__/lucide-icon-names.enum.js +321 -107
- package/dist/icon/index.constants.d.ts +214 -107
- package/dist/icons.json +3247 -3242
- 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 +2 -2
- package/dist/llms.txt +2 -2
- 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 +351 -112
- package/dist/quantic-components.js.map +1 -1
- package/dist/quantic-components.min.js +56 -56
- 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/icon/__generated__/lucide-icon-names.enum.d.ts +321 -107
- package/dist/types/icon/index.constants.d.ts +214 -107
- 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:21:53.513Z",
|
|
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;
|