@pithyjs/pidl-catalog 0.1.0-beta.3 → 0.1.0-beta.7
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/specs/atoms/actions/button.pidl.json +8 -7
- package/dist/specs/atoms/actions/icon-group.pidl.json +1 -0
- package/dist/specs/atoms/actions/segmented-control.pidl.json +1 -0
- package/dist/specs/atoms/content/action-tile.pidl.json +2 -1
- package/dist/specs/atoms/content/badge.pidl.json +2 -0
- package/dist/specs/atoms/content/callout.pidl.json +1 -0
- package/dist/specs/atoms/content/code-block.pidl.json +1 -0
- package/dist/specs/atoms/content/heading.pidl.json +3 -2
- package/dist/specs/atoms/content/icon.pidl.json +7 -6
- package/dist/specs/atoms/content/image.pidl.json +9 -8
- package/dist/specs/atoms/content/prose.pidl.json +1 -0
- package/dist/specs/atoms/content/stat.pidl.json +1 -0
- package/dist/specs/atoms/content/tabs.pidl.json +1 -0
- package/dist/specs/atoms/content/text.pidl.json +1 -0
- package/dist/specs/atoms/content/tile.pidl.json +10 -3
- package/dist/specs/atoms/data/bars.pidl.json +1 -0
- package/dist/specs/atoms/data/donut.pidl.json +1 -0
- package/dist/specs/atoms/data/gauge.pidl.json +1 -0
- package/dist/specs/atoms/data/line-area.pidl.json +1 -0
- package/dist/specs/atoms/data/line.pidl.json +3 -2
- package/dist/specs/atoms/data/stacked-bar.pidl.json +1 -0
- package/dist/specs/atoms/forms/checkbox-group.pidl.json +1 -0
- package/dist/specs/atoms/forms/checkbox.pidl.json +1 -0
- package/dist/specs/atoms/forms/file-picker.pidl.json +1 -0
- package/dist/specs/atoms/forms/form-field.pidl.json +1 -0
- package/dist/specs/atoms/forms/input.pidl.json +1 -0
- package/dist/specs/atoms/forms/radio-group.pidl.json +1 -0
- package/dist/specs/atoms/forms/radio.pidl.json +1 -0
- package/dist/specs/atoms/forms/search-input.pidl.json +1 -0
- package/dist/specs/atoms/forms/select.pidl.json +1 -0
- package/dist/specs/atoms/forms/slider.pidl.json +298 -0
- package/dist/specs/atoms/forms/textarea.pidl.json +1 -0
- package/dist/specs/atoms/forms/toggle.pidl.json +1 -0
- package/dist/specs/layout/grid-item.pidl.json +2 -0
- package/dist/specs/layout/grid.pidl.json +2 -0
- package/dist/specs/layout/page-section.pidl.json +4 -3
- package/dist/specs/layout/smart-container.pidl.json +1 -0
- package/dist/specs/layout/stack.pidl.json +1 -0
- package/dist/specs/organisms/content/accordion.pidl.json +1 -0
- package/dist/specs/organisms/content/card.pidl.json +36 -2
- package/dist/specs/organisms/feedback/alert-dialog.pidl.json +2 -1
- package/dist/specs/organisms/feedback/modal.pidl.json +12 -3
- package/dist/specs/organisms/feedback/toast.pidl.json +1 -0
- package/dist/specs/organisms/forms/dynamic-form.pidl.json +2 -1
- package/dist/specs/organisms/forms/form.pidl.json +1 -0
- package/dist/specs/organisms/forms/subscribe-form.pidl.json +1 -0
- package/dist/specs/organisms/navigation/command-palette.pidl.json +1 -0
- package/dist/specs/organisms/navigation/docs-sidebar.pidl.json +1 -0
- package/dist/specs/organisms/navigation/navbar.pidl.json +7 -1
- package/dist/specs/organisms/navigation/table-of-contents.pidl.json +1 -0
- package/dist/specs/sections/contact-section.pidl.json +2 -1
- package/dist/specs/sections/cta-section.pidl.json +1 -0
- package/dist/specs/sections/faq-section.pidl.json +1 -0
- package/dist/specs/sections/features-section.pidl.json +1 -0
- package/dist/specs/sections/footer-section.pidl.json +1 -0
- package/dist/specs/sections/hero-section.pidl.json +2 -1
- package/dist/src/borders-psychology.js.map +1 -1
- package/dist/src/color-psychology.js.map +1 -1
- package/dist/src/design-intelligence.js.map +1 -1
- package/dist/src/index.d.ts +290 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/motion-psychology.js.map +1 -1
- package/dist/src/mutation-vocabulary.d.ts.map +1 -1
- package/dist/src/mutation-vocabulary.js +65 -0
- package/dist/src/mutation-vocabulary.js.map +1 -1
- package/dist/src/radius-psychology.js.map +1 -1
- package/dist/src/shadows-psychology.js.map +1 -1
- package/dist/src/spacing-psychology.js.map +1 -1
- package/dist/src/typography-psychology.d.ts.map +1 -1
- package/dist/src/typography-psychology.js +3 -2
- package/dist/src/typography-psychology.js.map +1 -1
- package/package.json +7 -2
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "actions",
|
|
9
|
+
"icon": "cursor-click",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Accessible, reactive button with variants, color schemes, loading state, and anchor mode. Keyboard and ARIA correct by default. Uses aria-disabled to keep button focusable for assistive tech.",
|
|
11
12
|
"props": [
|
|
@@ -214,12 +215,12 @@
|
|
|
214
215
|
"Primary solid button for main CTA: <Button color=\"'primary'\">Save</Button>",
|
|
215
216
|
"Danger outline for destructive actions: <Button variant=\"'outline'\" color=\"'danger'\">Delete</Button>",
|
|
216
217
|
"Ghost button in card footer: <Button variant=\"'ghost'\" size=\"'sm'\">Learn More</Button>",
|
|
217
|
-
"Full-width submit: <Button type=\"'submit'\" fullWidth>Sign Up</Button>",
|
|
218
|
+
"Full-width submit: <Button type=\"'submit'\" fullWidth=\"true\">Sign Up</Button>",
|
|
218
219
|
"Loading state: <Button loading=\"isSaving\">Saving...</Button>",
|
|
219
220
|
"Pill shape for tags/filters: <Button shape=\"'xl'\" variant=\"'outline'\">All</Button>",
|
|
220
|
-
"Square chrome button: <Button color=\"'
|
|
221
|
-
"Toggle button: <Button variant=\"'ghost'\"
|
|
222
|
-
"Disclosure trigger: <Button
|
|
221
|
+
"Square chrome button: <Button color=\"'secondary'\" variant=\"'ghost'\" shape=\"'none'\">⌘K</Button>",
|
|
222
|
+
"Toggle button: <Button variant=\"'ghost'\" [aria-pressed]=\"isOn() ? 'true' : 'false'\" @click=\"toggle()\">Bold</Button>",
|
|
223
|
+
"Disclosure trigger: <Button [aria-expanded]=\"isOpen() ? 'true' : 'false'\" @click=\"toggle()\">Filters</Button>"
|
|
223
224
|
]
|
|
224
225
|
},
|
|
225
226
|
"examples": [
|
|
@@ -268,17 +269,17 @@
|
|
|
268
269
|
{
|
|
269
270
|
"id": "pill-shape",
|
|
270
271
|
"title": "Pill-shaped filter button",
|
|
271
|
-
"pithy": "<Button shape=\"'xl'\" variant=\"'outline'\" color=\"'
|
|
272
|
+
"pithy": "<Button shape=\"'xl'\" variant=\"'outline'\" color=\"'secondary'\">All</Button>",
|
|
272
273
|
"assertions": [
|
|
273
274
|
"data-shape='xl'",
|
|
274
275
|
"border-radius resolves from --radius-xl",
|
|
275
|
-
"data-color='
|
|
276
|
+
"data-color='secondary'"
|
|
276
277
|
]
|
|
277
278
|
},
|
|
278
279
|
{
|
|
279
280
|
"id": "toggle-pressed",
|
|
280
281
|
"title": "Toggle button with aria-pressed",
|
|
281
|
-
"pithy": "<Button variant=\"'ghost'\"
|
|
282
|
+
"pithy": "<Button variant=\"'ghost'\" [aria-pressed]=\"isBold() ? 'true' : 'false'\" @click=\"toggle()\">B</Button>",
|
|
282
283
|
"assertions": [
|
|
283
284
|
"aria-pressed reflects state",
|
|
284
285
|
"persistent on-state styling distinct from :active",
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "actions",
|
|
9
|
+
"icon": "shapes",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Single-select icon-only segmented pill. Renders role='radiogroup' with one role='radio' button per item; the active option gets a circular indicator behind its icon.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "actions",
|
|
9
|
+
"icon": "toggle-left",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Single-select segmented filter. Renders a role='radiogroup' container with one role='radio' button per item. Supports arrow-key navigation, Home/End jump, and roving tabindex.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "card",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Full-width actionable row with a leading icon/glyph slot beside a bold title and a muted description. Renders a <button>. Used for choice lists — publish tiers, export options, setup steps.",
|
|
11
12
|
"props": [
|
|
@@ -128,7 +129,7 @@
|
|
|
128
129
|
{
|
|
129
130
|
"id": "disabled",
|
|
130
131
|
"title": "Disabled action tile",
|
|
131
|
-
"pithy": "<ActionTile title=\"'Go Live'\" description=\"'Coming soon'\" disabled=\"true\"><Icon name=\"'send'\" /></ActionTile>",
|
|
132
|
+
"pithy": "<ActionTile title=\"'Go Live'\" description=\"'Coming soon'\" disabled=\"true\"><Icon name=\"'send'\" decorative=\"true\" /></ActionTile>",
|
|
132
133
|
"assertions": ["aria-disabled='true'", "data-disabled='true'"]
|
|
133
134
|
}
|
|
134
135
|
]
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "tag",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Inline status badge for counts, labels, and dot indicators. Renders a <span> with semantic color, size, and variant styling. In dot mode renders a compact colored circle with role='status'.",
|
|
11
12
|
"props": [
|
|
@@ -22,6 +23,7 @@
|
|
|
22
23
|
"reactive": true,
|
|
23
24
|
"label": "Leading icon",
|
|
24
25
|
"type": "icon",
|
|
26
|
+
"editor": { "visibleWhen": { "prop": "dot", "equals": false } },
|
|
25
27
|
"description": "Icon shown before the badge text. Ignored in dot mode."
|
|
26
28
|
},
|
|
27
29
|
{
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "info",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Static, tone-driven admonition/callout container for docs pages. Renders a role=note region with a decorative leading tone icon, a visually-hidden tone label (so tone is never conveyed by color alone), an optional bold title, and the body content. Tone (info | tip | warning | danger) drives the accent bar, tinted surface, and default icon.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "code",
|
|
9
10
|
"bidi": false,
|
|
10
11
|
"description": "Syntax-highlighted code display for documentation pages. Renders a plaintext <pre><code> immediately (no layout shift), then lazy-loads Shiki and swaps in dual-theme highlighted markup. Supports 'Copy' and 'Copy as AI prompt' actions via ui-kit Button components.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "heading",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Semantic heading component for page titles and section headers. Renders the correct <h1>-<h6> tag based on level prop. Size and weight can be overridden independently of heading level.",
|
|
11
12
|
"props": [
|
|
@@ -134,7 +135,7 @@
|
|
|
134
135
|
"Section heading: <Heading level=\"2\" color=\"'primary'\">Features</Heading>",
|
|
135
136
|
"Visually large h3: <Heading level=\"3\" size=\"'2xl'\">Big Section</Heading>",
|
|
136
137
|
"Centered subtitle: <Heading level=\"2\" size=\"'lg'\" align=\"'center'\" color=\"'text-muted'\">Our Mission</Heading>",
|
|
137
|
-
"Card title: <Heading level=\"3\" size=\"'
|
|
138
|
+
"Card title: <Heading level=\"3\" size=\"'lg'\" weight=\"'bold'\">Card Title</Heading>"
|
|
138
139
|
]
|
|
139
140
|
},
|
|
140
141
|
"examples": [
|
|
@@ -168,7 +169,7 @@
|
|
|
168
169
|
{
|
|
169
170
|
"id": "truncated-heading",
|
|
170
171
|
"title": "Truncated heading",
|
|
171
|
-
"pithy": "<Heading level=\"3\" truncate>Very Long Heading That Truncates</Heading>",
|
|
172
|
+
"pithy": "<Heading level=\"3\" truncate=\"true\">Very Long Heading That Truncates</Heading>",
|
|
172
173
|
"assertions": ["has u-truncate class"]
|
|
173
174
|
}
|
|
174
175
|
]
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "shapes",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Inline icon wrapper with accessible sizing and labelling. Renders children (inline SVG or icon markup) inside a <span> with design-system icon size tokens and proper ARIA attributes. Discriminated union enforces label when not decorative.",
|
|
11
12
|
"props": [
|
|
@@ -94,9 +95,9 @@
|
|
|
94
95
|
"patterns": [
|
|
95
96
|
"Semantic icon (inline SVG): <Icon label=\"'Search'\" size=\"'lg'\"><svg>...</svg></Icon>",
|
|
96
97
|
"Semantic icon (sprite): <Icon label=\"'Search'\" name=\"'search'\" size=\"'lg'\" />",
|
|
97
|
-
"Decorative icon: <Icon decorative size=\"'sm'\" name=\"'
|
|
98
|
-
"Colored icon: <Icon label=\"'Warning'\" color=\"'warning'\" name=\"'
|
|
99
|
-
"Reactive icon
|
|
98
|
+
"Decorative icon: <Icon decorative=\"true\" size=\"'sm'\" name=\"'sparkle'\" />",
|
|
99
|
+
"Colored icon: <Icon label=\"'Warning'\" color=\"'warning'\" name=\"'alert'\" />",
|
|
100
|
+
"Reactive icon: <Icon decorative=\"true\" name=\"() => revealed() ? 'eye-off' : 'eye'\" />"
|
|
100
101
|
]
|
|
101
102
|
},
|
|
102
103
|
"examples": [
|
|
@@ -109,16 +110,16 @@
|
|
|
109
110
|
{
|
|
110
111
|
"id": "decorative",
|
|
111
112
|
"title": "Decorative icon",
|
|
112
|
-
"pithy": "<Icon decorative size=\"'sm'\"><svg viewBox=\"0 0 24 24\"><path d=\"M...\"/></svg></Icon>",
|
|
113
|
+
"pithy": "<Icon decorative=\"true\" size=\"'sm'\"><svg viewBox=\"0 0 24 24\"><path d=\"M...\"/></svg></Icon>",
|
|
113
114
|
"assertions": ["aria-hidden='true'", "role='none'", "has u-icon-sm class"]
|
|
114
115
|
},
|
|
115
116
|
{
|
|
116
117
|
"id": "reactive-name",
|
|
117
118
|
"title": "Reactive icon driven by a signal",
|
|
118
|
-
"pithy": "<Icon decorative name=\"() =>
|
|
119
|
+
"pithy": "<Icon decorative=\"true\" name=\"() => revealed() ? 'eye-off' : 'eye'\" />",
|
|
119
120
|
"assertions": [
|
|
120
121
|
"data-icon swaps when signal changes",
|
|
121
|
-
"<use href>
|
|
122
|
+
"the inline <svg> is replaced \u2014 a sprite <use href> only when a sprite registers both names",
|
|
122
123
|
"no SVG rebuild when signal fires with same value",
|
|
123
124
|
"effect disposed on destroy()"
|
|
124
125
|
]
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "image",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Accessible, optimized image component. Mobile-first with lazy loading and async decoding by default. Enforces alt text for accessibility. Supports <picture> with multiple <source> elements for format negotiation (AVIF, WebP, fallback). Use width/height to prevent layout shift (CLS = 0).",
|
|
11
12
|
"props": [
|
|
@@ -123,7 +124,7 @@
|
|
|
123
124
|
"editor": { "tab": "effects" },
|
|
124
125
|
"type": "boolean | RadiusLevel",
|
|
125
126
|
"default": "none",
|
|
126
|
-
"description": "Border radius — true for 'md', or explicit level: 'xs', 'sm', 'md', 'lg', 'xl'
|
|
127
|
+
"description": "Border radius — true for 'md', or explicit level: 'xs', 'sm', 'md', 'lg', 'xl'"
|
|
127
128
|
}
|
|
128
129
|
],
|
|
129
130
|
"events": [],
|
|
@@ -173,9 +174,9 @@
|
|
|
173
174
|
"patterns": [
|
|
174
175
|
"Hero image (LCP): <Image src=\"'/hero.jpg'\" alt=\"'Hero banner'\" width=\"1200\" height=\"600\" loading=\"'eager'\" fetchPriority=\"'high'\" aspectRatio=\"'16/9'\" />",
|
|
175
176
|
"Card thumbnail: <Image src=\"'/thumb.jpg'\" alt=\"'Product'\" width=\"400\" height=\"300\" rounded=\"'md'\" />",
|
|
176
|
-
"Avatar: <Image src=\"'/avatar.jpg'\" alt=\"'User photo'\" width=\"64\" height=\"64\" rounded=\"'
|
|
177
|
-
"Multi-format (AVIF/WebP): <Image src=\"'/photo.jpg'\" alt=\"'Photo'\" width=\"800\" height=\"600\"
|
|
178
|
-
"Decorative: <Image src=\"'/pattern.svg'\" alt=\"''\" />"
|
|
177
|
+
"Avatar: <Image src=\"'/avatar.jpg'\" alt=\"'User photo'\" width=\"64\" height=\"64\" rounded=\"'xl'\" />",
|
|
178
|
+
"Multi-format (AVIF/WebP): <Image src=\"'/photo.jpg'\" alt=\"'Photo'\" width=\"800\" height=\"600\" sources=\"[{src:'/photo.avif',type:'image/avif'},{src:'/photo.webp',type:'image/webp'}]\" />",
|
|
179
|
+
"Decorative: <Image src=\"'/pattern.svg'\" alt=\"''\" width=\"48\" height=\"48\" />"
|
|
179
180
|
]
|
|
180
181
|
},
|
|
181
182
|
"examples": [
|
|
@@ -203,13 +204,13 @@
|
|
|
203
204
|
{
|
|
204
205
|
"id": "rounded-avatar",
|
|
205
206
|
"title": "Rounded avatar image",
|
|
206
|
-
"pithy": "<Image src=\"'/avatar.jpg'\" alt=\"'Jane Doe'\" width=\"100\" height=\"100\" rounded=\"'
|
|
207
|
-
"assertions": ["has u-radius-
|
|
207
|
+
"pithy": "<Image src=\"'/avatar.jpg'\" alt=\"'Jane Doe'\" width=\"100\" height=\"100\" rounded=\"'xl'\" />",
|
|
208
|
+
"assertions": ["has u-radius-xl class", "width=100", "height=100"]
|
|
208
209
|
},
|
|
209
210
|
{
|
|
210
211
|
"id": "picture-sources",
|
|
211
212
|
"title": "Multi-format with AVIF/WebP fallback",
|
|
212
|
-
"pithy": "<Image src=\"'/photo.jpg'\" alt=\"'Nature scene'\" width=\"800\" height=\"600\"
|
|
213
|
+
"pithy": "<Image src=\"'/photo.jpg'\" alt=\"'Nature scene'\" width=\"800\" height=\"600\" sources=\"[{src:'/photo.avif',type:'image/avif'},{src:'/photo.webp',type:'image/webp'}]\" />",
|
|
213
214
|
"assertions": [
|
|
214
215
|
"renders <picture> element",
|
|
215
216
|
"has <source> for AVIF",
|
|
@@ -220,7 +221,7 @@
|
|
|
220
221
|
{
|
|
221
222
|
"id": "decorative",
|
|
222
223
|
"title": "Decorative image (hidden from AT)",
|
|
223
|
-
"pithy": "<Image src=\"'/pattern.svg'\" alt=\"''\" />",
|
|
224
|
+
"pithy": "<Image src=\"'/pattern.svg'\" alt=\"''\" width=\"48\" height=\"48\" />",
|
|
224
225
|
"assertions": ["alt=''", "role='presentation'"]
|
|
225
226
|
}
|
|
226
227
|
]
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "text",
|
|
9
10
|
"studioReady": false,
|
|
10
11
|
"bidi": true,
|
|
11
12
|
"description": "Long-form content wrapper for docs and articles. A thin semantic container that applies the design-system .u-prose utility (plus the .u-prose-{size} measure variant) and projects its children. All element-level typographic treatment — vertical rhythm, links, inline code, blockquote, tables, figures, description lists — lives in .u-prose in @pithyjs/design-system, not in the component, so the same treatment is available to consumers who use the utility class without the component.",
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "molecule",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "trending-up",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Display statistic — a large value over a caption/label, with optional smaller supporting description. Non-interactive display primitive reusable across landing pages, dashboards, and marketing sections.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "panel-top",
|
|
9
10
|
"bidi": false,
|
|
10
11
|
"description": "Accessible tabbed interface implementing the WAI-ARIA tablist pattern. Renders a role=tablist of role=tab buttons over eagerly-mounted role=tabpanel panels toggled via [hidden]. Roving tabindex with arrow-key navigation (Home/End, wrap), horizontal or vertical orientation, and automatic or manual activation.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "text",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Typography wrapper for body text content. Maps props to design-system typography tokens and utility classes. Uses logical properties for RTL/LTR support. Supports 18 semantic HTML tags.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "content",
|
|
9
|
+
"icon": "card",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Compact clickable tile with an icon/glyph slot above a visible label. Renders a <button> with optional selected state. Used for launchers, recents rails, and template pickers.",
|
|
11
12
|
"props": [
|
|
@@ -55,6 +56,12 @@
|
|
|
55
56
|
"required": false,
|
|
56
57
|
"description": "Map of data-* attrs. CamelCase keys emit kebab-case attrs ({ componentId: 'card' } → data-component-id='card')."
|
|
57
58
|
},
|
|
59
|
+
{
|
|
60
|
+
"name": "mediaRef",
|
|
61
|
+
"type": "function",
|
|
62
|
+
"required": false,
|
|
63
|
+
"description": "Callback invoked with the rendered media span. Lets consumers mount a component into the media slot, which a projected component tag cannot do. Supplying it also creates the span when the tile has no children."
|
|
64
|
+
},
|
|
58
65
|
{
|
|
59
66
|
"name": "labelRef",
|
|
60
67
|
"type": "function",
|
|
@@ -114,7 +121,7 @@
|
|
|
114
121
|
],
|
|
115
122
|
"patterns": [
|
|
116
123
|
"Recent picker: <Tile label=\"'Card'\" @click=\"insert\"> <Icon name=\"'card'\" decorative=\"true\" size=\"'sm'\" /> </Tile>",
|
|
117
|
-
"Selected tile: <Tile label=\"'Hero'\" selected=\"isHero\" @click=\"choose\"> <Icon name=\"'
|
|
124
|
+
"Selected tile: <Tile label=\"'Hero'\" selected=\"isHero\" @click=\"choose\"> <Icon name=\"'shapes'\" /> </Tile>",
|
|
118
125
|
"Disabled tile: <Tile label=\"'Coming soon'\" disabled=\"true\"> <Icon name=\"'lock'\" /> </Tile>"
|
|
119
126
|
]
|
|
120
127
|
},
|
|
@@ -139,13 +146,13 @@
|
|
|
139
146
|
{
|
|
140
147
|
"id": "selected",
|
|
141
148
|
"title": "Selected tile",
|
|
142
|
-
"pithy": "<Tile label=\"'Hero'\" selected=\"true\"><Icon name=\"'
|
|
149
|
+
"pithy": "<Tile label=\"'Hero'\" selected=\"true\"><Icon name=\"'sparkle'\" decorative=\"true\" size=\"'sm'\" /></Tile>",
|
|
143
150
|
"assertions": ["data-selected='true'", "aria-pressed='true'"]
|
|
144
151
|
},
|
|
145
152
|
{
|
|
146
153
|
"id": "disabled",
|
|
147
154
|
"title": "Disabled launcher tile",
|
|
148
|
-
"pithy": "<Tile label=\"'Locked'\" disabled=\"true\"><Icon name=\"'lock'\" /></Tile>",
|
|
155
|
+
"pithy": "<Tile label=\"'Locked'\" disabled=\"true\"><Icon name=\"'lock'\" decorative=\"true\" /></Tile>",
|
|
149
156
|
"assertions": [
|
|
150
157
|
"disabled attribute present",
|
|
151
158
|
"data-disabled='true'",
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "data",
|
|
9
|
+
"icon": "bar-chart",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Horizontal bar chart for comparing categories against one shared scale. Each row is a category name, a track with a proportional fill, and the value — rows are independent, so no bar is affected by its neighbours. Rendered in DOM rather than SVG so names can ellipsis, numbers can be tabular, and text rescales with the reader's own font size. The drawing is aria-hidden; a visually-hidden data table carries every exact value and is the chart's accessible representation. There is no colour key: every row already carries its own name and number. Loading, empty (no rows at all — an all-zero chart stays ready, because its rows still name themselves), and error states are first-class.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "data",
|
|
9
|
+
"icon": "pie-chart",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Parts-of-a-whole chart drawn as arcs on one stroked ring. Each segment is a full <circle> showing a single dash of its own share, positioned by stroke-dasharray/stroke-dashoffset, with the ring rotated -90° so segment one starts at twelve o'clock. The SVG is aria-hidden; a visually-hidden data table carries every value and share and is the chart's accessible representation. A colour key is built in and on by default — a segment is identified by its colour and by nothing else, and nobody can name a colour. Loading, empty (including an all-zero total), and error states are first-class.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "data",
|
|
9
|
+
"icon": "pie-chart",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "One value's position within a range, drawn on a half circle. A full-length track path sits under a value path revealed by stroke-dasharray, so a short arc reads as 'short out of this much' rather than just 'short'. The arc is πr — half a circle, not a full one. The SVG is aria-hidden; a visually-hidden table carries the reading, the domain and the share of it. Colour is a prop: threshold-to-colour is application policy, not component behaviour.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "data",
|
|
9
|
+
"icon": "line-chart",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "One series over an ordered category axis, drawn as a line with the area beneath it filled. The chart for a single trend — how one quantity moved across a sequence a reader already understands as ordered: weeks, releases, cohorts. The plot is SVG because a polyline is a path; the axis labels beneath it are DOM, so a long category name can ellipsis, a numeric axis can use tabular figures, and the type rescales with the reader's own font setting. The drawing and the axis are both aria-hidden; a visually-hidden data table carries every exact reading and is the chart's accessible representation. Readings may be negative. A non-finite reading is a hole the line breaks across rather than drawing through. Loading, empty (no reading anywhere — an all-zero series stays ready, because a flat line is a real answer) and error states are first-class.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "data",
|
|
9
|
+
"icon": "line-chart",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Up to six named series over one shared category axis, drawn as stroked lines with a marker on every reading. The chart for COMPARING trends: several quantities measured at the same points, on one domain, so their shapes can be read against each other. The plot is SVG because a polyline is a path; the axis labels beneath it are DOM, so a long category name can ellipsis, a numeric axis can use tabular figures, and the type rescales with the reader's own font setting. A colour key is on by default whenever there is more than one series, because a line is named by its colour and by nothing else on screen. The drawing, the axis and the key are all aria-hidden; a visually-hidden data table with one column per series carries every exact reading. Readings may be negative. A non-finite reading is a hole the line breaks across. Loading, empty and error states are first-class.",
|
|
11
12
|
"props": [
|
|
@@ -258,7 +259,7 @@
|
|
|
258
259
|
"Basic: <Line label=\"'Latency by region'\" series=\"regions\" labels=\"days\" />",
|
|
259
260
|
"Key under the plot: <Line label=\"'Latency'\" series=\"regions\" labels=\"days\" legend=\"'bottom'\" />",
|
|
260
261
|
"Stable scale: <Line label=\"'Latency'\" series=\"regions\" labels=\"days\" min=\"0\" max=\"200\" />",
|
|
261
|
-
"Semantic colours: series=[{name:'Failed',values:[
|
|
262
|
+
"Semantic colours: series=[{name:'Failed',values:[4,2,6],color:'danger'},{name:'Passed',values:[96,98,94],color:'success'}]",
|
|
262
263
|
"Live: <Line label=\"'Latency'\" series=\"() => regions()\" labels=\"days\" loading=\"isFetching\" />"
|
|
263
264
|
]
|
|
264
265
|
},
|
|
@@ -278,7 +279,7 @@
|
|
|
278
279
|
{
|
|
279
280
|
"id": "single-series",
|
|
280
281
|
"title": "One line needs no key",
|
|
281
|
-
"pithy": "<Line label=\"'Latency'\" series=\"[{name:'eu-west',values:[
|
|
282
|
+
"pithy": "<Line label=\"'Latency'\" series=\"[{name:'eu-west',values:[128,142,119,156,134]}]\" labels=\"['Mon','Tue','Wed','Thu','Fri']\" />",
|
|
282
283
|
"assertions": [
|
|
283
284
|
"no data-legend attribute and no .ui-chart-legend element",
|
|
284
285
|
"the chart's own label names the line"
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "data",
|
|
9
|
+
"icon": "bar-chart",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "A single horizontal bar divided into proportional parts of one whole, with a colour key beneath. The same statement a Donut makes, drawn straight — better wherever the chart has to sit in a band rather than a square, and wherever the parts are lopsided, because a 2% slice of a ring is a wedge too narrow to see at its point while 2% of a bar is a stripe of constant height. Rendered in DOM as a flex row of segments, not SVG. The drawing and the key are aria-hidden; a visually-hidden data table carries every exact value and share and is the chart's accessible representation. Loading, empty (including an all-zero stack), and error states are first-class.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "forms",
|
|
9
|
+
"icon": "check",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Accessible group wrapper for related <Checkbox> controls. Renders <fieldset><legend> with optional helper/error text and aria-describedby wiring. Native fieldset[disabled] cascades to all child checkboxes. Children are projected through the full PithyJS pipeline.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "forms",
|
|
9
|
+
"icon": "check",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Accessible checkbox atom with a custom-rendered box and inline SVG mark (animated checkmark + indeterminate dash via stroke-dashoffset), error/success states with shake animation, helper/error text, loading spinner, and full a11y wiring. No validation logic — states driven externally.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "forms",
|
|
9
|
+
"icon": "upload",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Accessible file upload control with a click/drag-and-drop zone. Built on a semantic <label> wrapping a real focusable native <input type='file'> (no role='button'), validates type against `accept` and size against `maxSizeBytes`, shows an optional image preview, and surfaces inline errors via aria-live. No upload logic — the consumer wires `onSelect`.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "molecule",
|
|
8
8
|
"domain": "forms",
|
|
9
|
+
"icon": "form-input",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Form field molecule — wraps a form atom (Input, Select, Textarea) with a visible label and optional required asterisk indicator. Provides label-to-input association via <label for>.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.3.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "forms",
|
|
9
|
+
"icon": "form-input",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Text input atom with floating label, success/error states with shake animation and state icons, helper text, error message with aria-describedby, character counter, clear button, password visibility toggle, loading spinner, and polished prefix/suffix grouping. No validation logic — states driven externally.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "forms",
|
|
9
|
+
"icon": "radio",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Accessible group wrapper for related <Radio> controls. Renders <fieldset><legend> with optional helper/error text and aria-describedby wiring. Native fieldset[disabled] cascades to all child radios. Children are projected through the full PithyJS pipeline. Does NOT auto-inject `name` onto children — each <Radio> must declare its own.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "forms",
|
|
9
|
+
"icon": "radio",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Accessible radio button atom with a custom-rendered circle and inline SVG inner dot (animated via transform/opacity), error/success states with shake animation, helper/error text, loading spinner, arrow-key navigation across siblings sharing a `name`, and full a11y wiring. No validation logic — states driven externally.",
|
|
11
12
|
"props": [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "forms",
|
|
9
|
+
"icon": "search",
|
|
9
10
|
"studioReady": true,
|
|
10
11
|
"bidi": true,
|
|
11
12
|
"description": "Search field composed from the <Input> atom — leading magnifier, clear button, optional keyboard-shortcut chip, and a debounced query callback. Renders a <form role=\"search\"> landmark by default, which can be dropped (landmark=false) when the field lives inside a dialog such as <CommandPalette>. This is UI only: it owns no index, no fetching and no results list. Wire onSearch to whatever backend you have — the docs search engine itself lands in R3.",
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"version": "0.1.0",
|
|
7
7
|
"level": "atom",
|
|
8
8
|
"domain": "forms",
|
|
9
|
+
"icon": "chevron-down",
|
|
9
10
|
"bidi": true,
|
|
10
11
|
"description": "Custom select dropdown atom with searchable options, keyboard navigation, success/error states with shake animation and state icons, helper text, error message with aria-describedby, clear button, and loading spinner. No validation logic — states driven externally.",
|
|
11
12
|
"props": [
|