@misoto22/design 0.5.0 → 0.6.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/README.md +124 -0
- package/bin/misoto22-design.mjs +205 -0
- package/dist/agent/Accordion.md +41 -0
- package/dist/agent/Alert.md +42 -0
- package/dist/agent/AppShell.md +40 -0
- package/dist/agent/AreaChart.md +68 -0
- package/dist/agent/Article.md +41 -0
- package/dist/agent/Avatar.md +32 -0
- package/dist/agent/Badge.md +40 -0
- package/dist/agent/BarChart.md +65 -0
- package/dist/agent/BarList.md +40 -0
- package/dist/agent/BigNumber.md +45 -0
- package/dist/agent/BoxPlot.md +58 -0
- package/dist/agent/Breadcrumb.md +32 -0
- package/dist/agent/BulletChart.md +48 -0
- package/dist/agent/Button.md +56 -0
- package/dist/agent/Calendar.md +42 -0
- package/dist/agent/Card.md +49 -0
- package/dist/agent/Checkbox.md +35 -0
- package/dist/agent/Collapsible.md +46 -0
- package/dist/agent/Combobox.md +50 -0
- package/dist/agent/Command.md +93 -0
- package/dist/agent/ComposedChart.md +57 -0
- package/dist/agent/ContextMenu.md +59 -0
- package/dist/agent/DatePicker.md +75 -0
- package/dist/agent/Diagram.md +46 -0
- package/dist/agent/Dialog.md +52 -0
- package/dist/agent/DropdownMenu.md +70 -0
- package/dist/agent/EmptyState.md +37 -0
- package/dist/agent/ErrorState.md +41 -0
- package/dist/agent/Facet.md +82 -0
- package/dist/agent/Field.md +37 -0
- package/dist/agent/FigureBand.md +37 -0
- package/dist/agent/FloatingIconButton.md +38 -0
- package/dist/agent/FunnelChart.md +52 -0
- package/dist/agent/Heatmap.md +53 -0
- package/dist/agent/Histogram.md +63 -0
- package/dist/agent/Input.md +30 -0
- package/dist/agent/Kbd.md +29 -0
- package/dist/agent/LineChart.md +60 -0
- package/dist/agent/LinkArrow.md +29 -0
- package/dist/agent/NativeSelect.md +40 -0
- package/dist/agent/NavItem.md +35 -0
- package/dist/agent/Pagination.md +43 -0
- package/dist/agent/PieChart.md +55 -0
- package/dist/agent/Popover.md +57 -0
- package/dist/agent/Progress.md +33 -0
- package/dist/agent/RadarChart.md +54 -0
- package/dist/agent/RadialChart.md +57 -0
- package/dist/agent/RadioGroup.md +44 -0
- package/dist/agent/SankeyChart.md +61 -0
- package/dist/agent/ScatterChart.md +54 -0
- package/dist/agent/ScrollArea.md +40 -0
- package/dist/agent/SearchableMenu.md +46 -0
- package/dist/agent/Select.md +75 -0
- package/dist/agent/Separator.md +35 -0
- package/dist/agent/Sheet.md +57 -0
- package/dist/agent/Skeleton.md +73 -0
- package/dist/agent/Slider.md +39 -0
- package/dist/agent/Sparkline.md +45 -0
- package/dist/agent/Spinner.md +39 -0
- package/dist/agent/StatusDot.md +36 -0
- package/dist/agent/StatusPill.md +28 -0
- package/dist/agent/Steps.md +44 -0
- package/dist/agent/Switch.md +29 -0
- package/dist/agent/Table.md +85 -0
- package/dist/agent/Tabs.md +48 -0
- package/dist/agent/Tag.md +35 -0
- package/dist/agent/Textarea.md +26 -0
- package/dist/agent/Toast.md +26 -0
- package/dist/agent/ToggleGroup.md +44 -0
- package/dist/agent/Tooltip.md +51 -0
- package/dist/agent/TreemapChart.md +52 -0
- package/dist/agent/WaterfallChart.md +62 -0
- package/dist/agent/catalog.json +1863 -0
- package/dist/agent/index.md +131 -0
- package/dist/charts/AreaChart/AreaChart.d.ts +191 -0
- package/dist/charts/AreaChart/AreaChart.js +480 -0
- package/dist/charts/AreaChart/AreaChart.js.map +1 -0
- package/dist/charts/BarChart/BarChart.d.ts +179 -0
- package/dist/charts/BarChart/BarChart.js +591 -0
- package/dist/charts/BarChart/BarChart.js.map +1 -0
- package/dist/charts/BarList/BarList.d.ts +57 -0
- package/dist/charts/BarList/BarList.js +71 -0
- package/dist/charts/BarList/BarList.js.map +1 -0
- package/dist/charts/BigNumber/BigNumber.d.ts +56 -0
- package/dist/charts/BigNumber/BigNumber.js +31 -0
- package/dist/charts/BigNumber/BigNumber.js.map +1 -0
- package/dist/charts/BoxPlot/BoxPlot.d.ts +177 -0
- package/dist/charts/BoxPlot/BoxPlot.js +495 -0
- package/dist/charts/BoxPlot/BoxPlot.js.map +1 -0
- package/dist/charts/BulletChart/BulletChart.d.ts +100 -0
- package/dist/charts/BulletChart/BulletChart.js +162 -0
- package/dist/charts/BulletChart/BulletChart.js.map +1 -0
- package/dist/charts/ComposedChart/ComposedChart.d.ts +171 -0
- package/dist/charts/ComposedChart/ComposedChart.js +667 -0
- package/dist/charts/ComposedChart/ComposedChart.js.map +1 -0
- package/dist/charts/Facet/Facet.d.ts +240 -0
- package/dist/charts/Facet/Facet.js +133 -0
- package/dist/charts/Facet/Facet.js.map +1 -0
- package/dist/charts/Facet/panels.d.ts +187 -0
- package/dist/charts/Facet/panels.js +203 -0
- package/dist/charts/Facet/panels.js.map +1 -0
- package/dist/charts/FunnelChart/FunnelChart.d.ts +101 -0
- package/dist/charts/FunnelChart/FunnelChart.js +147 -0
- package/dist/charts/FunnelChart/FunnelChart.js.map +1 -0
- package/dist/charts/Heatmap/Heatmap.d.ts +78 -0
- package/dist/charts/Heatmap/Heatmap.js +108 -0
- package/dist/charts/Heatmap/Heatmap.js.map +1 -0
- package/dist/charts/Histogram/Histogram.d.ts +165 -0
- package/dist/charts/Histogram/Histogram.js +350 -0
- package/dist/charts/Histogram/Histogram.js.map +1 -0
- package/dist/charts/LineChart/LineChart.d.ts +167 -0
- package/dist/charts/LineChart/LineChart.js +486 -0
- package/dist/charts/LineChart/LineChart.js.map +1 -0
- package/dist/charts/PieChart/PieChart.d.ts +128 -0
- package/dist/charts/PieChart/PieChart.js +309 -0
- package/dist/charts/PieChart/PieChart.js.map +1 -0
- package/dist/charts/RadarChart/RadarChart.d.ts +123 -0
- package/dist/charts/RadarChart/RadarChart.js +299 -0
- package/dist/charts/RadarChart/RadarChart.js.map +1 -0
- package/dist/charts/RadialChart/RadialChart.d.ts +124 -0
- package/dist/charts/RadialChart/RadialChart.js +257 -0
- package/dist/charts/RadialChart/RadialChart.js.map +1 -0
- package/dist/charts/SankeyChart/SankeyChart.d.ts +137 -0
- package/dist/charts/SankeyChart/SankeyChart.js +501 -0
- package/dist/charts/SankeyChart/SankeyChart.js.map +1 -0
- package/dist/charts/ScatterChart/ScatterChart.d.ts +128 -0
- package/dist/charts/ScatterChart/ScatterChart.js +269 -0
- package/dist/charts/ScatterChart/ScatterChart.js.map +1 -0
- package/dist/charts/Sparkline/Sparkline.d.ts +53 -0
- package/dist/charts/Sparkline/Sparkline.js +93 -0
- package/dist/charts/Sparkline/Sparkline.js.map +1 -0
- package/dist/charts/TreemapChart/TreemapChart.d.ts +93 -0
- package/dist/charts/TreemapChart/TreemapChart.js +118 -0
- package/dist/charts/TreemapChart/TreemapChart.js.map +1 -0
- package/dist/charts/WaterfallChart/WaterfallChart.d.ts +164 -0
- package/dist/charts/WaterfallChart/WaterfallChart.js +319 -0
- package/dist/charts/WaterfallChart/WaterfallChart.js.map +1 -0
- package/dist/charts/index.d.ts +41 -0
- package/dist/charts/index.js +128 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/lib/annotations.d.ts +103 -0
- package/dist/charts/lib/annotations.js +99 -0
- package/dist/charts/lib/annotations.js.map +1 -0
- package/dist/charts/lib/axis.d.ts +18 -0
- package/dist/charts/lib/axis.js +21 -0
- package/dist/charts/lib/axis.js.map +1 -0
- package/dist/charts/lib/background.d.ts +33 -0
- package/dist/charts/lib/background.js +173 -0
- package/dist/charts/lib/background.js.map +1 -0
- package/dist/charts/lib/brush.d.ts +94 -0
- package/dist/charts/lib/brush.js +535 -0
- package/dist/charts/lib/brush.js.map +1 -0
- package/dist/charts/lib/chart.d.ts +94 -0
- package/dist/charts/lib/chart.js +134 -0
- package/dist/charts/lib/chart.js.map +1 -0
- package/dist/charts/lib/dot.d.ts +29 -0
- package/dist/charts/lib/dot.js +78 -0
- package/dist/charts/lib/dot.js.map +1 -0
- package/dist/charts/lib/empty.d.ts +31 -0
- package/dist/charts/lib/empty.js +13 -0
- package/dist/charts/lib/empty.js.map +1 -0
- package/dist/charts/lib/export.d.ts +103 -0
- package/dist/charts/lib/export.js +204 -0
- package/dist/charts/lib/export.js.map +1 -0
- package/dist/charts/lib/figure.d.ts +61 -0
- package/dist/charts/lib/figure.js +59 -0
- package/dist/charts/lib/figure.js.map +1 -0
- package/dist/charts/lib/format.d.ts +46 -0
- package/dist/charts/lib/format.js +56 -0
- package/dist/charts/lib/format.js.map +1 -0
- package/dist/charts/lib/legend.d.ts +45 -0
- package/dist/charts/lib/legend.js +117 -0
- package/dist/charts/lib/legend.js.map +1 -0
- package/dist/charts/lib/loading.d.ts +48 -0
- package/dist/charts/lib/loading.js +105 -0
- package/dist/charts/lib/loading.js.map +1 -0
- package/dist/charts/lib/paint.d.ts +154 -0
- package/dist/charts/lib/paint.js +551 -0
- package/dist/charts/lib/paint.js.map +1 -0
- package/dist/charts/lib/sonify-control.d.ts +163 -0
- package/dist/charts/lib/sonify-control.js +172 -0
- package/dist/charts/lib/sonify-control.js.map +1 -0
- package/dist/charts/lib/sonify.d.ts +248 -0
- package/dist/charts/lib/sonify.js +262 -0
- package/dist/charts/lib/sonify.js.map +1 -0
- package/dist/charts/lib/toolbar.d.ts +143 -0
- package/dist/charts/lib/toolbar.js +156 -0
- package/dist/charts/lib/toolbar.js.map +1 -0
- package/dist/charts/lib/tooltip.d.ts +59 -0
- package/dist/charts/lib/tooltip.js +135 -0
- package/dist/charts/lib/tooltip.js.map +1 -0
- package/dist/charts/lib/values.d.ts +56 -0
- package/dist/charts/lib/values.js +71 -0
- package/dist/charts/lib/values.js.map +1 -0
- package/dist/charts/lib/zoom.d.ts +139 -0
- package/dist/charts/lib/zoom.js +314 -0
- package/dist/charts/lib/zoom.js.map +1 -0
- package/dist/semantic.css +19 -0
- package/dist/styles.css +1 -1
- package/dist/themes.css +50 -0
- package/dist/tokens.css +118 -0
- package/dist/tokens.d.ts +17 -0
- package/dist/tokens.js +101 -0
- package/dist/tokens.json +101 -0
- package/package.json +26 -4
- package/skills/misoto22-design/SKILL.md +209 -0
- package/skills/misoto22-design/evals/claims.json +95 -0
- package/skills/misoto22-design/rules/a11y.md +115 -0
- package/skills/misoto22-design/rules/composition.md +108 -0
- package/skills/misoto22-design/rules/forms.md +128 -0
- package/skills/misoto22-design/rules/naming.md +155 -0
- package/skills/misoto22-design/rules/tokens.md +131 -0
package/dist/tokens.js
CHANGED
|
@@ -168,6 +168,75 @@ export const TOKENS = {
|
|
|
168
168
|
"light": "var(--clay)",
|
|
169
169
|
"dark": "var(--clay)"
|
|
170
170
|
},
|
|
171
|
+
"series-1": {
|
|
172
|
+
"layer": "tokens",
|
|
173
|
+
"category": "data",
|
|
174
|
+
"light": "#101010",
|
|
175
|
+
"comment": "─── Data ─────────────────────────────────────────────────────────────── The series ramp a chart paints with, and the one place the White Reset has to answer a question a monochrome system would rather not be asked: how do you tell six lines apart with no hue left to spend? The answer is that hue was never the primary carrier here — TEXTURE is. Every chart primitive ships a fill variant (hatched, dotted, lines, stripped, duotone) and the series ramp below is the SECOND encoding, not the first. That ordering is what makes the set legible to a colour-blind reader, in greyscale print, and under forced-colours, none of which a hue-first categorical palette survives. The eight steps are interleaved rather than sequential — light, dark, light, dark — so neighbouring series sit as far apart on the lightness ramp as eight steps allow. Adjacent separation is ΔE 21.0 (OKLab ×100) against a 15 floor, and every step clears 3:1 on its own ground. Two checks a chromatic palette would pass fail here BY DESIGN, and are stated rather than hidden: the chroma floor (these are greys) and the lightness band (--series-1 is ink, and ink is the darkest mark the system has). Texture plus a legend is the relief, and both are mandatory — `Chart.Legend` is not optional above one series. A consumer who genuinely needs hue does not hand-pick hexes: it sets `data-chart-palette=\"chroma\"` (see themes.css), which re-points these eight names onto a categorical palette validated against both grounds.",
|
|
176
|
+
"dark": "CanvasText"
|
|
177
|
+
},
|
|
178
|
+
"series-2": {
|
|
179
|
+
"layer": "tokens",
|
|
180
|
+
"category": "data",
|
|
181
|
+
"light": "#565656",
|
|
182
|
+
"dark": "CanvasText"
|
|
183
|
+
},
|
|
184
|
+
"series-3": {
|
|
185
|
+
"layer": "tokens",
|
|
186
|
+
"category": "data",
|
|
187
|
+
"light": "#202020",
|
|
188
|
+
"dark": "CanvasText"
|
|
189
|
+
},
|
|
190
|
+
"series-4": {
|
|
191
|
+
"layer": "tokens",
|
|
192
|
+
"category": "data",
|
|
193
|
+
"light": "#6a6a6a",
|
|
194
|
+
"dark": "CanvasText"
|
|
195
|
+
},
|
|
196
|
+
"series-5": {
|
|
197
|
+
"layer": "tokens",
|
|
198
|
+
"category": "data",
|
|
199
|
+
"light": "#313131",
|
|
200
|
+
"dark": "CanvasText"
|
|
201
|
+
},
|
|
202
|
+
"series-6": {
|
|
203
|
+
"layer": "tokens",
|
|
204
|
+
"category": "data",
|
|
205
|
+
"light": "#7e7e7e",
|
|
206
|
+
"dark": "CanvasText"
|
|
207
|
+
},
|
|
208
|
+
"series-7": {
|
|
209
|
+
"layer": "tokens",
|
|
210
|
+
"category": "data",
|
|
211
|
+
"light": "#434343",
|
|
212
|
+
"dark": "CanvasText"
|
|
213
|
+
},
|
|
214
|
+
"series-8": {
|
|
215
|
+
"layer": "tokens",
|
|
216
|
+
"category": "data",
|
|
217
|
+
"light": "#939393",
|
|
218
|
+
"dark": "CanvasText"
|
|
219
|
+
},
|
|
220
|
+
"series-track": {
|
|
221
|
+
"layer": "tokens",
|
|
222
|
+
"category": "data",
|
|
223
|
+
"light": "#eeece7",
|
|
224
|
+
"comment": "The empty ground a part-of-whole mark is drawn against — the unfilled remainder of a radial bar, the track behind a gauge. Not --rule: a track is a field, and a field that reads as a hairline disappears at radius.",
|
|
225
|
+
"dark": "Canvas"
|
|
226
|
+
},
|
|
227
|
+
"chart-fill": {
|
|
228
|
+
"layer": "tokens",
|
|
229
|
+
"category": "data",
|
|
230
|
+
"light": "0.14",
|
|
231
|
+
"comment": "How solid a translucent mark is, and the one pair of tokens in the file that is NOT the same number on both grounds. A wash is `ink at N% over the page`. On paper, ink at 14% lands around #e3e3e3 — a legible, recessive band. Run the same 14% the other way and paper-white over near-black lands around #2c2c2c, which on a #0d0d0d ground is not a band, it is nothing. Perceived lightness is not linear and the two directions do not meet in the middle, so a single number cannot serve both: the dark side needs roughly twice the alpha to read as the same weight of mark. Every area fill, texture and flow band in the chart package reads these rather than carrying its own literal.",
|
|
232
|
+
"dark": "0.45"
|
|
233
|
+
},
|
|
234
|
+
"chart-texture": {
|
|
235
|
+
"layer": "tokens",
|
|
236
|
+
"category": "data",
|
|
237
|
+
"light": "0.42",
|
|
238
|
+
"dark": "1"
|
|
239
|
+
},
|
|
171
240
|
"sans": {
|
|
172
241
|
"layer": "tokens",
|
|
173
242
|
"category": "type",
|
|
@@ -695,6 +764,38 @@ export const TOKENS = {
|
|
|
695
764
|
"light": "#101010",
|
|
696
765
|
"comment": "The photo scrim is always dark by design, so it takes the ink literal rather than the semantic token (which inverts)."
|
|
697
766
|
},
|
|
767
|
+
"chart-surface": {
|
|
768
|
+
"layer": "semantic",
|
|
769
|
+
"category": "data",
|
|
770
|
+
"light": "var(--paper)",
|
|
771
|
+
"comment": "─── Data ───────────────────────────────────────────────────────────── What a chart is allowed to read. The series ramp itself stays a primitive — a chart names a SERIES by index, and an index has no role to alias — but everything around the marks does have one, and naming it here is what keeps a chart from reaching for --rule or --ink directly. --chart-cursor is deliberately heavier than --chart-grid: the crosshair has to be findable against the grid it crosses, and at hairline weight on a dashed grid it was not."
|
|
772
|
+
},
|
|
773
|
+
"chart-grid": {
|
|
774
|
+
"layer": "semantic",
|
|
775
|
+
"category": "data",
|
|
776
|
+
"light": "var(--rule)"
|
|
777
|
+
},
|
|
778
|
+
"chart-cursor": {
|
|
779
|
+
"layer": "semantic",
|
|
780
|
+
"category": "data",
|
|
781
|
+
"light": "var(--rule-2)"
|
|
782
|
+
},
|
|
783
|
+
"chart-axis": {
|
|
784
|
+
"layer": "semantic",
|
|
785
|
+
"category": "data",
|
|
786
|
+
"light": "var(--ink-3-aa)"
|
|
787
|
+
},
|
|
788
|
+
"chart-track": {
|
|
789
|
+
"layer": "semantic",
|
|
790
|
+
"category": "data",
|
|
791
|
+
"light": "var(--series-track)"
|
|
792
|
+
},
|
|
793
|
+
"chart-pattern": {
|
|
794
|
+
"layer": "semantic",
|
|
795
|
+
"category": "data",
|
|
796
|
+
"light": "var(--rule)",
|
|
797
|
+
"comment": "The decorative plate behind the plot — a dot field, a hatch, a grid of plus marks. One step quieter than the grid, because it sits BEHIND data and must never compete with it for the same read."
|
|
798
|
+
},
|
|
698
799
|
"shadow-color": {
|
|
699
800
|
"layer": "semantic",
|
|
700
801
|
"category": "depth",
|
package/dist/tokens.json
CHANGED
|
@@ -167,6 +167,75 @@
|
|
|
167
167
|
"light": "var(--clay)",
|
|
168
168
|
"dark": "var(--clay)"
|
|
169
169
|
},
|
|
170
|
+
"series-1": {
|
|
171
|
+
"layer": "tokens",
|
|
172
|
+
"category": "data",
|
|
173
|
+
"light": "#101010",
|
|
174
|
+
"comment": "─── Data ─────────────────────────────────────────────────────────────── The series ramp a chart paints with, and the one place the White Reset has to answer a question a monochrome system would rather not be asked: how do you tell six lines apart with no hue left to spend? The answer is that hue was never the primary carrier here — TEXTURE is. Every chart primitive ships a fill variant (hatched, dotted, lines, stripped, duotone) and the series ramp below is the SECOND encoding, not the first. That ordering is what makes the set legible to a colour-blind reader, in greyscale print, and under forced-colours, none of which a hue-first categorical palette survives. The eight steps are interleaved rather than sequential — light, dark, light, dark — so neighbouring series sit as far apart on the lightness ramp as eight steps allow. Adjacent separation is ΔE 21.0 (OKLab ×100) against a 15 floor, and every step clears 3:1 on its own ground. Two checks a chromatic palette would pass fail here BY DESIGN, and are stated rather than hidden: the chroma floor (these are greys) and the lightness band (--series-1 is ink, and ink is the darkest mark the system has). Texture plus a legend is the relief, and both are mandatory — `Chart.Legend` is not optional above one series. A consumer who genuinely needs hue does not hand-pick hexes: it sets `data-chart-palette=\"chroma\"` (see themes.css), which re-points these eight names onto a categorical palette validated against both grounds.",
|
|
175
|
+
"dark": "CanvasText"
|
|
176
|
+
},
|
|
177
|
+
"series-2": {
|
|
178
|
+
"layer": "tokens",
|
|
179
|
+
"category": "data",
|
|
180
|
+
"light": "#565656",
|
|
181
|
+
"dark": "CanvasText"
|
|
182
|
+
},
|
|
183
|
+
"series-3": {
|
|
184
|
+
"layer": "tokens",
|
|
185
|
+
"category": "data",
|
|
186
|
+
"light": "#202020",
|
|
187
|
+
"dark": "CanvasText"
|
|
188
|
+
},
|
|
189
|
+
"series-4": {
|
|
190
|
+
"layer": "tokens",
|
|
191
|
+
"category": "data",
|
|
192
|
+
"light": "#6a6a6a",
|
|
193
|
+
"dark": "CanvasText"
|
|
194
|
+
},
|
|
195
|
+
"series-5": {
|
|
196
|
+
"layer": "tokens",
|
|
197
|
+
"category": "data",
|
|
198
|
+
"light": "#313131",
|
|
199
|
+
"dark": "CanvasText"
|
|
200
|
+
},
|
|
201
|
+
"series-6": {
|
|
202
|
+
"layer": "tokens",
|
|
203
|
+
"category": "data",
|
|
204
|
+
"light": "#7e7e7e",
|
|
205
|
+
"dark": "CanvasText"
|
|
206
|
+
},
|
|
207
|
+
"series-7": {
|
|
208
|
+
"layer": "tokens",
|
|
209
|
+
"category": "data",
|
|
210
|
+
"light": "#434343",
|
|
211
|
+
"dark": "CanvasText"
|
|
212
|
+
},
|
|
213
|
+
"series-8": {
|
|
214
|
+
"layer": "tokens",
|
|
215
|
+
"category": "data",
|
|
216
|
+
"light": "#939393",
|
|
217
|
+
"dark": "CanvasText"
|
|
218
|
+
},
|
|
219
|
+
"series-track": {
|
|
220
|
+
"layer": "tokens",
|
|
221
|
+
"category": "data",
|
|
222
|
+
"light": "#eeece7",
|
|
223
|
+
"comment": "The empty ground a part-of-whole mark is drawn against — the unfilled remainder of a radial bar, the track behind a gauge. Not --rule: a track is a field, and a field that reads as a hairline disappears at radius.",
|
|
224
|
+
"dark": "Canvas"
|
|
225
|
+
},
|
|
226
|
+
"chart-fill": {
|
|
227
|
+
"layer": "tokens",
|
|
228
|
+
"category": "data",
|
|
229
|
+
"light": "0.14",
|
|
230
|
+
"comment": "How solid a translucent mark is, and the one pair of tokens in the file that is NOT the same number on both grounds. A wash is `ink at N% over the page`. On paper, ink at 14% lands around #e3e3e3 — a legible, recessive band. Run the same 14% the other way and paper-white over near-black lands around #2c2c2c, which on a #0d0d0d ground is not a band, it is nothing. Perceived lightness is not linear and the two directions do not meet in the middle, so a single number cannot serve both: the dark side needs roughly twice the alpha to read as the same weight of mark. Every area fill, texture and flow band in the chart package reads these rather than carrying its own literal.",
|
|
231
|
+
"dark": "0.45"
|
|
232
|
+
},
|
|
233
|
+
"chart-texture": {
|
|
234
|
+
"layer": "tokens",
|
|
235
|
+
"category": "data",
|
|
236
|
+
"light": "0.42",
|
|
237
|
+
"dark": "1"
|
|
238
|
+
},
|
|
170
239
|
"sans": {
|
|
171
240
|
"layer": "tokens",
|
|
172
241
|
"category": "type",
|
|
@@ -694,6 +763,38 @@
|
|
|
694
763
|
"light": "#101010",
|
|
695
764
|
"comment": "The photo scrim is always dark by design, so it takes the ink literal rather than the semantic token (which inverts)."
|
|
696
765
|
},
|
|
766
|
+
"chart-surface": {
|
|
767
|
+
"layer": "semantic",
|
|
768
|
+
"category": "data",
|
|
769
|
+
"light": "var(--paper)",
|
|
770
|
+
"comment": "─── Data ───────────────────────────────────────────────────────────── What a chart is allowed to read. The series ramp itself stays a primitive — a chart names a SERIES by index, and an index has no role to alias — but everything around the marks does have one, and naming it here is what keeps a chart from reaching for --rule or --ink directly. --chart-cursor is deliberately heavier than --chart-grid: the crosshair has to be findable against the grid it crosses, and at hairline weight on a dashed grid it was not."
|
|
771
|
+
},
|
|
772
|
+
"chart-grid": {
|
|
773
|
+
"layer": "semantic",
|
|
774
|
+
"category": "data",
|
|
775
|
+
"light": "var(--rule)"
|
|
776
|
+
},
|
|
777
|
+
"chart-cursor": {
|
|
778
|
+
"layer": "semantic",
|
|
779
|
+
"category": "data",
|
|
780
|
+
"light": "var(--rule-2)"
|
|
781
|
+
},
|
|
782
|
+
"chart-axis": {
|
|
783
|
+
"layer": "semantic",
|
|
784
|
+
"category": "data",
|
|
785
|
+
"light": "var(--ink-3-aa)"
|
|
786
|
+
},
|
|
787
|
+
"chart-track": {
|
|
788
|
+
"layer": "semantic",
|
|
789
|
+
"category": "data",
|
|
790
|
+
"light": "var(--series-track)"
|
|
791
|
+
},
|
|
792
|
+
"chart-pattern": {
|
|
793
|
+
"layer": "semantic",
|
|
794
|
+
"category": "data",
|
|
795
|
+
"light": "var(--rule)",
|
|
796
|
+
"comment": "The decorative plate behind the plot — a dot field, a hatch, a grid of plus marks. One step quieter than the grid, because it sits BEHIND data and must never compete with it for the same read."
|
|
797
|
+
},
|
|
697
798
|
"shadow-color": {
|
|
698
799
|
"layer": "semantic",
|
|
699
800
|
"category": "depth",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@misoto22/design",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Monochrome design system — CSS tokens and accessible React primitives",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,14 +11,23 @@
|
|
|
11
11
|
],
|
|
12
12
|
"files": [
|
|
13
13
|
"dist",
|
|
14
|
+
"skills",
|
|
15
|
+
"bin",
|
|
14
16
|
"LICENSE",
|
|
15
17
|
"README.md"
|
|
16
18
|
],
|
|
19
|
+
"bin": {
|
|
20
|
+
"misoto22-design": "./bin/misoto22-design.mjs"
|
|
21
|
+
},
|
|
17
22
|
"exports": {
|
|
18
23
|
".": {
|
|
19
24
|
"types": "./dist/index.d.ts",
|
|
20
25
|
"import": "./dist/index.js"
|
|
21
26
|
},
|
|
27
|
+
"./charts": {
|
|
28
|
+
"types": "./dist/charts/index.d.ts",
|
|
29
|
+
"import": "./dist/charts/index.js"
|
|
30
|
+
},
|
|
22
31
|
"./styles.css": "./dist/styles.css",
|
|
23
32
|
"./tokens.css": "./dist/tokens.css",
|
|
24
33
|
"./semantic.css": "./dist/semantic.css",
|
|
@@ -35,8 +44,10 @@
|
|
|
35
44
|
"main": "./dist/index.js",
|
|
36
45
|
"types": "./dist/index.d.ts",
|
|
37
46
|
"peerDependencies": {
|
|
47
|
+
"motion": "^12.23.26",
|
|
38
48
|
"react": "^19.0.0",
|
|
39
|
-
"react-dom": "^19.0.0"
|
|
49
|
+
"react-dom": "^19.0.0",
|
|
50
|
+
"recharts": "^3.8.0"
|
|
40
51
|
},
|
|
41
52
|
"dependencies": {
|
|
42
53
|
"@radix-ui/react-accordion": "^1.2.14",
|
|
@@ -83,9 +94,11 @@
|
|
|
83
94
|
"esbuild": "^0.28.2",
|
|
84
95
|
"esbuild-fix-imports-plugin": "^1.0.23",
|
|
85
96
|
"jsdom": "^29.1.1",
|
|
97
|
+
"motion": "^12.43.0",
|
|
86
98
|
"publint": "^0.3.24",
|
|
87
99
|
"react": "^19.2.8",
|
|
88
100
|
"react-dom": "^19.2.8",
|
|
101
|
+
"recharts": "3.8.0",
|
|
89
102
|
"tailwindcss": "4.3.3",
|
|
90
103
|
"tsup": "^8.5.0",
|
|
91
104
|
"typescript": "^6.0.3",
|
|
@@ -116,14 +129,23 @@
|
|
|
116
129
|
"publishConfig": {
|
|
117
130
|
"access": "public"
|
|
118
131
|
},
|
|
132
|
+
"peerDependenciesMeta": {
|
|
133
|
+
"motion": {
|
|
134
|
+
"optional": true
|
|
135
|
+
},
|
|
136
|
+
"recharts": {
|
|
137
|
+
"optional": true
|
|
138
|
+
}
|
|
139
|
+
},
|
|
119
140
|
"scripts": {
|
|
120
141
|
"build:fonts": "node scripts/vendor-fonts.mjs",
|
|
121
142
|
"build:js": "NODE_OPTIONS=--max-old-space-size=6144 tsup",
|
|
122
143
|
"build:css": "tailwindcss -i ./src/styles/index.css -o ./dist/styles.css --minify && node scripts/copy-portable-css.mjs && node scripts/emit-tokens.mjs",
|
|
123
|
-
"build": "
|
|
144
|
+
"build:agent": "node scripts/emit-agent.mjs",
|
|
145
|
+
"build": "pnpm run build:fonts && pnpm run build:js && pnpm run build:css && pnpm run build:agent",
|
|
124
146
|
"dev": "tsup --watch",
|
|
125
147
|
"typecheck": "tsc --noEmit",
|
|
126
|
-
"lint": "eslint src",
|
|
148
|
+
"lint": "eslint src scripts agent bin",
|
|
127
149
|
"test": "vitest run",
|
|
128
150
|
"test:watch": "vitest",
|
|
129
151
|
"clean": "rm -rf dist",
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: misoto22-design
|
|
3
|
+
description: Builds UI with @misoto22/design — a monochrome design system of CSS tokens and 72 accessible React primitives, charts included. Use when a project imports '@misoto22/design' or '@misoto22/design/charts', sets data-mode / data-surface / data-radius / data-density, or uses cn(), CONTROL_BASE, or isInvalid. Also applies when adding a component, theming, plotting data, or fixing a form, table, dialog, or toast in such a project.
|
|
4
|
+
allowed-tools: Bash(npx misoto22-design *), Bash(pnpm exec misoto22-design *), Bash(bunx misoto22-design *)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# @misoto22/design
|
|
8
|
+
|
|
9
|
+
CSS tokens plus React 19 primitives. Components ship compiled — you import them,
|
|
10
|
+
you do not copy them into the project.
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
import { Button, Field, Input } from '@misoto22/design'
|
|
14
|
+
import '@misoto22/design/styles.css'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Two entry points
|
|
18
|
+
|
|
19
|
+
The root entry has no dependencies a consumer has to install. Everything that
|
|
20
|
+
plots data lives behind a second specifier, because it needs a rendering engine
|
|
21
|
+
and an animation runtime that nothing else in the package does:
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import { AreaChart, BarList, BigNumber } from '@misoto22/design/charts'
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pnpm add recharts motion # optional peers, only for the charts entry
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
That separation is the reason an app that renders a Badge never resolves
|
|
32
|
+
`recharts` — so importing a chart from the root specifier does not render a
|
|
33
|
+
blank component, it throws. `docs <Component>` prints the right line for each
|
|
34
|
+
one; the `Import:` header is derived from the tree the component lives in, not
|
|
35
|
+
written by hand.
|
|
36
|
+
|
|
37
|
+
Some of the charts need no engine at all — `Heatmap` is a `<table>`,
|
|
38
|
+
`Sparkline` is one `<path>`, `BarList`, `BigNumber` and `BulletChart` are plain
|
|
39
|
+
HTML — but they ship from the charts entry all the same, so the boundary stays
|
|
40
|
+
one line rather than a list to memorise.
|
|
41
|
+
|
|
42
|
+
One more, for surfaces that cannot read a custom property — an OpenGraph card, a
|
|
43
|
+
`theme-color`, a canvas:
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { TOKENS } from '@misoto22/design/tokens'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Never for styling a component. A literal in a stylesheet is a value that stops
|
|
50
|
+
following the theme, and every one of these mirrors a token that does.
|
|
51
|
+
|
|
52
|
+
## What this project has installed
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
!`npx misoto22-design docs --installed`
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
That is the version resolved in this project and every component it ships. Get
|
|
59
|
+
one component's full contract — every prop with its type and default, its
|
|
60
|
+
exported unions, its keyboard map, its accessibility promises, its examples —
|
|
61
|
+
with:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npx misoto22-design docs Button
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Run that before writing against a component you have not used in this session.
|
|
68
|
+
The median component is ~500 tokens and the largest is ~1,300, against far more
|
|
69
|
+
for all seventy-two. It is generated from the installed source, so it cannot be
|
|
70
|
+
out of date the way the website can.
|
|
71
|
+
|
|
72
|
+
It also resolves parts and types, not just components: `docs CardBody`,
|
|
73
|
+
`docs TH` and `docs ButtonVariant` all land on the right file. When an import
|
|
74
|
+
fails, ask it about the identifier you tried.
|
|
75
|
+
|
|
76
|
+
## The one thing to internalise
|
|
77
|
+
|
|
78
|
+
**This is not shadcn/ui, and the names differ where it matters most.** A model
|
|
79
|
+
writing from habit produces imports that do not exist. The full table is in
|
|
80
|
+
[naming.md](./rules/naming.md); these four are the ones that come up every time:
|
|
81
|
+
|
|
82
|
+
| Habit | Here |
|
|
83
|
+
| --- | --- |
|
|
84
|
+
| `CardContent` | **`CardBody`** |
|
|
85
|
+
| `TableHeader` / `TableBody` / `TableRow` / `TableHead` / `TableCell` | **`THead` / `TBody` / `TR` / `TH` / `TD`** |
|
|
86
|
+
| `<DialogTitle>` as a child | **`<DialogContent title="…">`** — a prop, not a child |
|
|
87
|
+
| `<AlertTitle>` / `<AlertDescription>` | **`<Alert tone title="…">`** — props, not children |
|
|
88
|
+
|
|
89
|
+
## Critical rules
|
|
90
|
+
|
|
91
|
+
Always enforced. Each links to a file with Incorrect/Correct pairs — read it when
|
|
92
|
+
you are about to do that thing, not before.
|
|
93
|
+
|
|
94
|
+
### Colour and theming → [tokens.md](./rules/tokens.md)
|
|
95
|
+
|
|
96
|
+
- **Never write a raw colour.** No `bg-neutral-900`, no `text-gray-500`, no hex.
|
|
97
|
+
Read the semantic layer: `bg-(--background)`, `text-(--foreground-muted)`,
|
|
98
|
+
`border-(--border-color)`.
|
|
99
|
+
- **Never write a `dark:` variant.** Dark mode is a value swap behind
|
|
100
|
+
`data-mode="dark"`; a `dark:` override fights it and wins in only one theme.
|
|
101
|
+
- **Theme with the `data-*` axes**, set on any element, not just `:root`.
|
|
102
|
+
`data-mode`, `data-surface`, `data-radius`, `data-rules`, `data-type`,
|
|
103
|
+
`data-motion`, `data-density`, `data-table-density`, `data-chart-palette`.
|
|
104
|
+
There is no `data-accent` — `--accent` is a custom property, re-pointed in
|
|
105
|
+
CSS. `npx misoto22-design docs --installed` prints the current list; it is
|
|
106
|
+
read out of the stylesheets rather than kept by hand here.
|
|
107
|
+
- **Durations and radii come from tokens.** `duration-(--duration-fast)`,
|
|
108
|
+
`rounded-(--radius)` — not `duration-150`, not `rounded-lg`.
|
|
109
|
+
- **No blurred shadow.** `--shadow*` resolves to `none` on purpose. Depth is a
|
|
110
|
+
hairline, a change of ground, or `--lift`.
|
|
111
|
+
|
|
112
|
+
### Composition → [composition.md](./rules/composition.md)
|
|
113
|
+
|
|
114
|
+
- **`className` adjusts layout, never appearance.** Margin, width, grid
|
|
115
|
+
placement — yes. Colour, border, radius, font — no; that is what the props and
|
|
116
|
+
the axes are for.
|
|
117
|
+
- **Use `cn()` for conditional classes.** It is exported. Plain template
|
|
118
|
+
literals emit both sides of a Tailwind conflict and let stylesheet order pick
|
|
119
|
+
the winner.
|
|
120
|
+
- **Card uses the full set.** `Card` → `CardHeader` / `CardTitle` / `CardBody` /
|
|
121
|
+
`CardFooter`. Do not dump everything into one div.
|
|
122
|
+
- **`Select` is one component, not a compound.** It takes `label`, `placeholder`
|
|
123
|
+
and `SelectItem` children. There is no `SelectTrigger` or `SelectValue`.
|
|
124
|
+
- **Logical properties, always.** `ps-` / `pe-` / `start-` / `end-` /
|
|
125
|
+
`text-start`. The package is RTL-correct and a physical property breaks it.
|
|
126
|
+
|
|
127
|
+
### Forms → [forms.md](./rules/forms.md)
|
|
128
|
+
|
|
129
|
+
- **A labelled control is a `Field`.** `<Field label hint error required>` wraps
|
|
130
|
+
one control and wires `aria-describedby`, `aria-required` and `aria-invalid`
|
|
131
|
+
onto it. Never hand-roll `<label>` + input + error div.
|
|
132
|
+
- **Errors go in `Field`'s `error` prop.** It replaces `hint` — they are one
|
|
133
|
+
slot, not two stacked messages — and it sets `aria-invalid` on the control for
|
|
134
|
+
you, so do not also pass `invalid`.
|
|
135
|
+
- **Outside a `Field`, invalid state is `invalid` or `aria-invalid`** on the
|
|
136
|
+
control. Never a red border class.
|
|
137
|
+
- **One control per `Field`.** The wiring clones a single element child; a
|
|
138
|
+
wrapper div around two controls silently wires nothing.
|
|
139
|
+
- **Build custom controls on `CONTROL_BASE` + `CONTROL_BORDER`** and read the
|
|
140
|
+
state with `isInvalid()`. All three are exported.
|
|
141
|
+
|
|
142
|
+
### Accessibility → [a11y.md](./rules/a11y.md)
|
|
143
|
+
|
|
144
|
+
- **Four props are required by the type because forgetting them ships an
|
|
145
|
+
unusable control**: `Table.caption`, `Progress.label`, `Avatar.alt`,
|
|
146
|
+
`FloatingIconButton.label`. `Select.label` and `Badge.children` too.
|
|
147
|
+
- **`<Button iconOnly>` needs `aria-label`.** There is no text to read.
|
|
148
|
+
- **Decoration is `aria-hidden`.** A status dot beside the word "Available"
|
|
149
|
+
repeats it.
|
|
150
|
+
- **Colour is never the only carrier** of a status. Every tone is doubled by an
|
|
151
|
+
icon or by the words.
|
|
152
|
+
|
|
153
|
+
### Imports
|
|
154
|
+
|
|
155
|
+
- **`toast` comes from `@misoto22/design`, not from `sonner`.** Render `<Toaster />`
|
|
156
|
+
once at the app root.
|
|
157
|
+
- **Styles are a separate import.** `@misoto22/design/styles.css` for the whole
|
|
158
|
+
compiled sheet, or `tokens.css` + `semantic.css` + `keyframes.css` when the app
|
|
159
|
+
compiles its own Tailwind.
|
|
160
|
+
|
|
161
|
+
## Key patterns
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
// A labelled, validated field. Field does the ARIA wiring, including
|
|
165
|
+
// aria-invalid — do not also pass `invalid` on the control.
|
|
166
|
+
<Field label="Email" required error={errors.email}>
|
|
167
|
+
<Input type="email" />
|
|
168
|
+
</Field>
|
|
169
|
+
|
|
170
|
+
// A select. One component; label is required.
|
|
171
|
+
<Select label="Region" placeholder="Choose one">
|
|
172
|
+
<SelectItem value="au">Australia</SelectItem>
|
|
173
|
+
</Select>
|
|
174
|
+
|
|
175
|
+
// A dialog. The title is a prop, and it is not optional for a screen reader.
|
|
176
|
+
<Dialog>
|
|
177
|
+
<DialogTrigger asChild><Button>Open</Button></DialogTrigger>
|
|
178
|
+
<DialogContent title="Delete project" description="This cannot be undone.">
|
|
179
|
+
<Button variant="danger">Delete</Button>
|
|
180
|
+
</DialogContent>
|
|
181
|
+
</Dialog>
|
|
182
|
+
|
|
183
|
+
// A table. caption is required; it is what a screen reader announces.
|
|
184
|
+
<Table caption="Open invoices" borders="rows">
|
|
185
|
+
<THead><TR><TH>Client</TH><TH align="end">Amount</TH></TR></THead>
|
|
186
|
+
<TBody><TR><TD>Acme</TD><TD align="end">$1,200</TD></TR></TBody>
|
|
187
|
+
</Table>
|
|
188
|
+
|
|
189
|
+
// Colour: semantic tokens, no raw values, no dark: variant.
|
|
190
|
+
<div className="bg-(--card-background) text-(--foreground-muted)"> // correct
|
|
191
|
+
<div className="bg-white text-gray-500 dark:bg-neutral-900"> // wrong
|
|
192
|
+
|
|
193
|
+
// Theming: an axis on any element themes the subtree below it.
|
|
194
|
+
<section data-surface="warm" data-radius="round">…</section>
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Variants, in full
|
|
198
|
+
|
|
199
|
+
Short enough to inline; everything else comes from `docs <Component>`.
|
|
200
|
+
|
|
201
|
+
Every union is exported under the name in brackets, so a wrapper can take one
|
|
202
|
+
without retyping it.
|
|
203
|
+
|
|
204
|
+
- `Button` — `variant` [`ButtonVariant`]: `primary` `secondary` `ghost` `danger` · `size` [`ButtonSize`]: `sm` `md` `lg` · also `href`, `asChild`, `loading`, `iconOnly`, `keycap`
|
|
205
|
+
- `Badge` — `tone` [`BadgeTone`]: `neutral` `success` `warning` `danger` `outline`
|
|
206
|
+
- `Alert` — `tone` [`AlertTone`]: `info` `success` `warning` `danger`
|
|
207
|
+
- `Card` — `variant`: `outline` `plate` `flat`
|
|
208
|
+
- `Table` — `borders` [`TableBorders`]: `rows` `grid` `bordered` `bordered-grid` `none` · `density`: `comfortable` `compact`
|
|
209
|
+
- `TH` / `TD` — `align` [`TableAlign`]: `start` `center` `end`
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Every identifier the skill tells an agent to write, paired with the habit it replaces. `skill.test.ts` asserts that each `use` is really exported, that each `avoid` really is not, and that both still appear in the rules — so a rename in the package, or a rule quietly deleted from the prose, fails the build instead of teaching the next agent something that stopped being true.",
|
|
3
|
+
"naming": [
|
|
4
|
+
{ "use": "CardBody", "avoid": "CardContent" },
|
|
5
|
+
{ "use": "THead", "avoid": "TableHeader" },
|
|
6
|
+
{ "use": "TBody", "avoid": "TableBody" },
|
|
7
|
+
{ "use": "TR", "avoid": "TableRow" },
|
|
8
|
+
{ "use": "TH", "avoid": "TableHead" },
|
|
9
|
+
{ "use": "TD", "avoid": "TableCell" },
|
|
10
|
+
{ "use": "DialogContent", "avoid": "DialogTitle" },
|
|
11
|
+
{ "use": "DialogContent", "avoid": "DialogHeader" },
|
|
12
|
+
{ "use": "SheetContent", "avoid": "SheetTitle" },
|
|
13
|
+
{ "use": "Tooltip", "avoid": "TooltipTrigger" },
|
|
14
|
+
{ "use": "Tooltip", "avoid": "TooltipContent" },
|
|
15
|
+
{ "use": "Alert", "avoid": "AlertTitle" },
|
|
16
|
+
{ "use": "Alert", "avoid": "AlertDescription" },
|
|
17
|
+
{ "use": "AccordionItem", "avoid": "AccordionTrigger" },
|
|
18
|
+
{ "use": "AccordionItem", "avoid": "AccordionContent" },
|
|
19
|
+
{ "use": "Select", "avoid": "SelectTrigger" },
|
|
20
|
+
{ "use": "Select", "avoid": "SelectValue" },
|
|
21
|
+
{ "use": "Select", "avoid": "SelectContent" }
|
|
22
|
+
],
|
|
23
|
+
"$comment2": "Identifiers the skill names as real and reachable, without pairing them against a habit. Same guarantee: named in the prose, exported by the package.",
|
|
24
|
+
"exported": [
|
|
25
|
+
"cn",
|
|
26
|
+
"toast",
|
|
27
|
+
"Toaster",
|
|
28
|
+
"CONTROL_BASE",
|
|
29
|
+
"CONTROL_BORDER",
|
|
30
|
+
"isInvalid",
|
|
31
|
+
"Field",
|
|
32
|
+
"Input",
|
|
33
|
+
"Textarea",
|
|
34
|
+
"NativeSelect",
|
|
35
|
+
"Combobox",
|
|
36
|
+
"Checkbox",
|
|
37
|
+
"Switch",
|
|
38
|
+
"RadioGroup",
|
|
39
|
+
"RadioGroupItem",
|
|
40
|
+
"ToggleGroup",
|
|
41
|
+
"ToggleGroupItem",
|
|
42
|
+
"Slider",
|
|
43
|
+
"DatePicker",
|
|
44
|
+
"DateRangePicker",
|
|
45
|
+
"Card",
|
|
46
|
+
"CardHeader",
|
|
47
|
+
"CardTitle",
|
|
48
|
+
"CardFooter",
|
|
49
|
+
"Table",
|
|
50
|
+
"EmptyState",
|
|
51
|
+
"ErrorState",
|
|
52
|
+
"Separator",
|
|
53
|
+
"Skeleton",
|
|
54
|
+
"SkeletonLine",
|
|
55
|
+
"SkeletonText",
|
|
56
|
+
"SkeletonPage",
|
|
57
|
+
"Badge",
|
|
58
|
+
"StatusPill",
|
|
59
|
+
"Kbd",
|
|
60
|
+
"Breadcrumb",
|
|
61
|
+
"AppShell",
|
|
62
|
+
"Steps",
|
|
63
|
+
"Article",
|
|
64
|
+
"SelectItem",
|
|
65
|
+
"TooltipProvider",
|
|
66
|
+
"DialogTrigger",
|
|
67
|
+
"ButtonVariant",
|
|
68
|
+
"ButtonSize",
|
|
69
|
+
"BadgeTone",
|
|
70
|
+
"AlertTone",
|
|
71
|
+
"TableAlign",
|
|
72
|
+
"TableBorders"
|
|
73
|
+
],
|
|
74
|
+
"$comment3": "Required-by-the-type props the a11y rule promises. `skill.test.ts` checks each against the extracted source, so a prop that stops being required stops being advertised as required.",
|
|
75
|
+
"requiredProps": [
|
|
76
|
+
{ "component": "Table", "part": "Table", "prop": "caption" },
|
|
77
|
+
{ "component": "Progress", "part": "Progress", "prop": "label" },
|
|
78
|
+
{ "component": "Avatar", "part": "Avatar", "prop": "alt" },
|
|
79
|
+
{ "component": "Avatar", "part": "Avatar", "prop": "fallback" },
|
|
80
|
+
{ "component": "FloatingIconButton", "part": "FloatingIconButton", "prop": "label" },
|
|
81
|
+
{ "component": "FloatingIconButton", "part": "FloatingIconButton", "prop": "position" },
|
|
82
|
+
{ "component": "Select", "part": "Select", "prop": "label" },
|
|
83
|
+
{ "component": "Combobox", "part": "Combobox", "prop": "label" },
|
|
84
|
+
{ "component": "Combobox", "part": "Combobox", "prop": "options" },
|
|
85
|
+
{ "component": "Sheet", "part": "SheetContent", "prop": "title" },
|
|
86
|
+
{ "component": "Accordion", "part": "AccordionItem", "prop": "title" },
|
|
87
|
+
{ "component": "EmptyState", "part": "EmptyState", "prop": "title" },
|
|
88
|
+
{ "component": "Badge", "part": "Badge", "prop": "children" }
|
|
89
|
+
],
|
|
90
|
+
"$comment4": "Props the skill describes as OPTIONAL where a reader would assume otherwise. Guarded in the same direction: if one becomes required, the prose that says it is not has to change with it.",
|
|
91
|
+
"optionalProps": [
|
|
92
|
+
{ "component": "Dialog", "part": "DialogContent", "prop": "title" },
|
|
93
|
+
{ "component": "Alert", "part": "Alert", "prop": "title" }
|
|
94
|
+
]
|
|
95
|
+
}
|