@misoto22/design 0.3.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +1791 -0
- package/dist/agent/index.md +131 -0
- package/dist/article.css +393 -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/components/AppShell/AppShell.d.ts +15 -1
- package/dist/components/AppShell/AppShell.js +8 -4
- package/dist/components/AppShell/AppShell.js.map +1 -1
- package/dist/components/Article/Article.d.ts +51 -0
- package/dist/components/Article/Article.js +21 -0
- package/dist/components/Article/Article.js.map +1 -0
- package/dist/components/Button/Button.js +2 -2
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Calendar/Calendar.d.ts +1 -1
- package/dist/components/Calendar/Calendar.js +259 -24
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +1 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Collapsible/Collapsible.d.ts +15 -1
- package/dist/components/Collapsible/Collapsible.js +18 -0
- package/dist/components/Collapsible/Collapsible.js.map +1 -1
- package/dist/components/Combobox/Combobox.js +1 -1
- package/dist/components/Combobox/Combobox.js.map +1 -1
- package/dist/components/Command/Command.js +7 -7
- package/dist/components/Command/Command.js.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.js +2 -2
- package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/components/Diagram/Diagram.d.ts +81 -0
- package/dist/components/Diagram/Diagram.js +139 -0
- package/dist/components/Diagram/Diagram.js.map +1 -0
- package/dist/components/Dialog/Dialog.js +1 -1
- package/dist/components/Dialog/Dialog.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.js +2 -2
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/components/FigureBand/FigureBand.js +41 -30
- package/dist/components/FigureBand/FigureBand.js.map +1 -1
- package/dist/components/Popover/Popover.js +1 -1
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Select/Select.js +2 -2
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Sheet/Sheet.js +1 -1
- package/dist/components/Sheet/Sheet.js.map +1 -1
- package/dist/components/Slider/Slider.js +1 -1
- package/dist/components/Slider/Slider.js.map +1 -1
- package/dist/components/Steps/Steps.d.ts +65 -0
- package/dist/components/Steps/Steps.js +55 -0
- package/dist/components/Steps/Steps.js.map +1 -0
- package/dist/components/Switch/Switch.js +1 -1
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +1 -1
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/useSelectionIndicator.js +14 -10
- package/dist/lib/useSelectionIndicator.js.map +1 -1
- package/dist/semantic.css +19 -0
- package/dist/styles.css +1 -1
- package/dist/themes.css +103 -7
- package/dist/tokens.css +193 -10
- package/dist/tokens.d.ts +25 -0
- package/dist/tokens.js +154 -8
- package/dist/tokens.json +154 -8
- package/package.json +45 -20
- package/skills/misoto22-design/SKILL.md +171 -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.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",
|
|
@@ -269,29 +338,58 @@
|
|
|
269
338
|
"category": "space",
|
|
270
339
|
"light": "clamp(40px, calc(5 * var(--fluid)), 68px)"
|
|
271
340
|
},
|
|
341
|
+
"radius-factor": {
|
|
342
|
+
"layer": "tokens",
|
|
343
|
+
"category": "radius",
|
|
344
|
+
"light": "1"
|
|
345
|
+
},
|
|
346
|
+
"radius-gate": {
|
|
347
|
+
"layer": "tokens",
|
|
348
|
+
"category": "radius",
|
|
349
|
+
"light": "min(1, var(--radius-factor))",
|
|
350
|
+
"comment": "Clamps the factor at 1 for the ADDING direction only. A frame's air is a fixed number of pixels, so `--radius-lg + 16px` would leave a rounded frame around a square panel the moment the theme went square; gated, it collapses to nothing along with everything else."
|
|
351
|
+
},
|
|
352
|
+
"radius-xs": {
|
|
353
|
+
"layer": "tokens",
|
|
354
|
+
"category": "radius",
|
|
355
|
+
"light": "calc(4px * var(--radius-factor))",
|
|
356
|
+
"comment": "The numbers are the ones the rest of the industry settled on, and that is the argument for them: 8px for a control, 12px for a panel, and 4/6 for the small marks inside one. Tailwind's own scale, shadcn's `--radius` ± 2 and ± 4, Radix Themes' steps 3 and 4, and Material's `xs`/`sm`/`md` all agree within a pixel of this. The previous 2/4/6/10 was a step tighter than any of them, which is what made a card read as a rectangle with the corners shaved rather than as a rounded panel."
|
|
357
|
+
},
|
|
272
358
|
"radius-sm": {
|
|
273
359
|
"layer": "tokens",
|
|
274
360
|
"category": "radius",
|
|
275
|
-
"light": "6px",
|
|
276
|
-
"comment": "
|
|
361
|
+
"light": "calc(6px * var(--radius-factor))",
|
|
362
|
+
"comment": "a mark inside a tight box"
|
|
277
363
|
},
|
|
278
364
|
"radius": {
|
|
279
365
|
"layer": "tokens",
|
|
280
366
|
"category": "radius",
|
|
281
|
-
"light": "8px",
|
|
282
|
-
"comment": "
|
|
367
|
+
"light": "calc(8px * var(--radius-factor))",
|
|
368
|
+
"comment": "chips, keys, list rows"
|
|
283
369
|
},
|
|
284
370
|
"radius-lg": {
|
|
285
371
|
"layer": "tokens",
|
|
286
372
|
"category": "radius",
|
|
287
|
-
"light": "
|
|
288
|
-
"comment": "inputs,
|
|
373
|
+
"light": "calc(12px * var(--radius-factor))",
|
|
374
|
+
"comment": "inputs, code, small plates"
|
|
289
375
|
},
|
|
290
376
|
"radius-pill": {
|
|
291
377
|
"layer": "tokens",
|
|
292
378
|
"category": "radius",
|
|
293
|
-
"light": "999px",
|
|
294
|
-
"comment": "
|
|
379
|
+
"light": "calc(999px * var(--radius-factor))",
|
|
380
|
+
"comment": "cards, dialogs, menu panels"
|
|
381
|
+
},
|
|
382
|
+
"radius-row": {
|
|
383
|
+
"layer": "tokens",
|
|
384
|
+
"category": "radius",
|
|
385
|
+
"light": "max(0px, calc(var(--radius-lg) - 0.375rem))",
|
|
386
|
+
"comment": "The nesting law, applied to the two insets this system actually uses."
|
|
387
|
+
},
|
|
388
|
+
"radius-frame": {
|
|
389
|
+
"layer": "tokens",
|
|
390
|
+
"category": "radius",
|
|
391
|
+
"light": "calc(var(--radius-lg) + 1rem * var(--radius-gate))",
|
|
392
|
+
"comment": "a row in a 6px-padded panel"
|
|
295
393
|
},
|
|
296
394
|
"control-h-sm": {
|
|
297
395
|
"layer": "tokens",
|
|
@@ -367,6 +465,22 @@
|
|
|
367
465
|
"light": "0px",
|
|
368
466
|
"comment": "`0px`, not `0`. The cell rule adds to this inside a calc, and a unitless zero makes `calc(0 + 1.5rem)` invalid at computed-value time — the whole declaration is dropped and every column loses its gutter in silence."
|
|
369
467
|
},
|
|
468
|
+
"panel-bg": {
|
|
469
|
+
"layer": "tokens",
|
|
470
|
+
"category": "other",
|
|
471
|
+
"light": "var(--paper)",
|
|
472
|
+
"comment": "─── Floating surfaces ────────────────────────────────────────────────── What a panel that FLOATS fills with, and what it does to whatever is behind it. A dialog, a menu, a popover, a palette — the surfaces that sit OVER the page rather than in it, and therefore the only ones with anything behind them to treat. Both default to the plain surface and cost nothing. `--panel-filter: none` matters more than it looks: a `backdrop-filter` of any value, `blur(0px)` included, promotes its element to its own compositing layer and makes it a containing block for fixed descendants. Paid on every menu in the system, for a theme most readers will never turn on. `none` is not a blur of zero; it is no filter at all. A card is deliberately NOT on this list. It sits on the page ground, so there is nothing behind it to see through, and a card that blurs its own background is drawing an effect rather than an object."
|
|
473
|
+
},
|
|
474
|
+
"panel-border": {
|
|
475
|
+
"layer": "tokens",
|
|
476
|
+
"category": "other",
|
|
477
|
+
"light": "var(--rule-2)"
|
|
478
|
+
},
|
|
479
|
+
"panel-filter": {
|
|
480
|
+
"layer": "tokens",
|
|
481
|
+
"category": "other",
|
|
482
|
+
"light": "none"
|
|
483
|
+
},
|
|
370
484
|
"ease": {
|
|
371
485
|
"layer": "tokens",
|
|
372
486
|
"category": "motion",
|
|
@@ -649,6 +763,38 @@
|
|
|
649
763
|
"light": "#101010",
|
|
650
764
|
"comment": "The photo scrim is always dark by design, so it takes the ink literal rather than the semantic token (which inverts)."
|
|
651
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
|
+
},
|
|
652
798
|
"shadow-color": {
|
|
653
799
|
"layer": "semantic",
|
|
654
800
|
"category": "depth",
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@misoto22/design",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "Monochrome design system
|
|
5
|
+
"description": "Monochrome design system — CSS tokens and accessible React primitives",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Henry Chen",
|
|
8
8
|
"type": "module",
|
|
@@ -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",
|
|
@@ -29,26 +38,16 @@
|
|
|
29
38
|
"types": "./dist/tokens.d.ts",
|
|
30
39
|
"import": "./dist/tokens.js"
|
|
31
40
|
},
|
|
32
|
-
"./themes.css": "./dist/themes.css"
|
|
41
|
+
"./themes.css": "./dist/themes.css",
|
|
42
|
+
"./article.css": "./dist/article.css"
|
|
33
43
|
},
|
|
34
44
|
"main": "./dist/index.js",
|
|
35
45
|
"types": "./dist/index.d.ts",
|
|
36
|
-
"scripts": {
|
|
37
|
-
"build:fonts": "node scripts/vendor-fonts.mjs",
|
|
38
|
-
"build:js": "NODE_OPTIONS=--max-old-space-size=6144 tsup",
|
|
39
|
-
"build:css": "tailwindcss -i ./src/styles/index.css -o ./dist/styles.css --minify && node scripts/copy-portable-css.mjs && node scripts/emit-tokens.mjs",
|
|
40
|
-
"build": "pnpm run build:fonts && pnpm run build:js && pnpm run build:css",
|
|
41
|
-
"dev": "tsup --watch",
|
|
42
|
-
"typecheck": "tsc --noEmit",
|
|
43
|
-
"lint": "eslint src",
|
|
44
|
-
"test": "vitest run",
|
|
45
|
-
"test:watch": "vitest",
|
|
46
|
-
"clean": "rm -rf dist",
|
|
47
|
-
"check:size": "node scripts/check-size.mjs"
|
|
48
|
-
},
|
|
49
46
|
"peerDependencies": {
|
|
47
|
+
"motion": "^12.23.26",
|
|
50
48
|
"react": "^19.0.0",
|
|
51
|
-
"react-dom": "^19.0.0"
|
|
49
|
+
"react-dom": "^19.0.0",
|
|
50
|
+
"recharts": "^3.8.0"
|
|
52
51
|
},
|
|
53
52
|
"dependencies": {
|
|
54
53
|
"@radix-ui/react-accordion": "^1.2.14",
|
|
@@ -78,6 +77,7 @@
|
|
|
78
77
|
"tailwind-merge": "^3.4.0"
|
|
79
78
|
},
|
|
80
79
|
"devDependencies": {
|
|
80
|
+
"@arethetypeswrong/cli": "^0.18.5",
|
|
81
81
|
"@fontsource/hanken-grotesk": "^5.2.5",
|
|
82
82
|
"@fontsource/ibm-plex-mono": "^5.2.5",
|
|
83
83
|
"@fontsource/newsreader": "^5.2.5",
|
|
@@ -94,8 +94,11 @@
|
|
|
94
94
|
"esbuild": "^0.28.2",
|
|
95
95
|
"esbuild-fix-imports-plugin": "^1.0.23",
|
|
96
96
|
"jsdom": "^29.1.1",
|
|
97
|
+
"motion": "^12.43.0",
|
|
98
|
+
"publint": "^0.3.24",
|
|
97
99
|
"react": "^19.2.8",
|
|
98
100
|
"react-dom": "^19.2.8",
|
|
101
|
+
"recharts": "3.8.0",
|
|
99
102
|
"tailwindcss": "4.3.3",
|
|
100
103
|
"tsup": "^8.5.0",
|
|
101
104
|
"typescript": "^6.0.3",
|
|
@@ -105,10 +108,9 @@
|
|
|
105
108
|
"node": ">=24",
|
|
106
109
|
"pnpm": ">=11"
|
|
107
110
|
},
|
|
108
|
-
"packageManager": "pnpm@11.9.0",
|
|
109
111
|
"repository": {
|
|
110
112
|
"type": "git",
|
|
111
|
-
"url": "https://github.com/Misoto22/misoto22-design.git",
|
|
113
|
+
"url": "git+https://github.com/Misoto22/misoto22-design.git",
|
|
112
114
|
"directory": "packages/design"
|
|
113
115
|
},
|
|
114
116
|
"keywords": [
|
|
@@ -126,5 +128,28 @@
|
|
|
126
128
|
},
|
|
127
129
|
"publishConfig": {
|
|
128
130
|
"access": "public"
|
|
131
|
+
},
|
|
132
|
+
"peerDependenciesMeta": {
|
|
133
|
+
"motion": {
|
|
134
|
+
"optional": true
|
|
135
|
+
},
|
|
136
|
+
"recharts": {
|
|
137
|
+
"optional": true
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"scripts": {
|
|
141
|
+
"build:fonts": "node scripts/vendor-fonts.mjs",
|
|
142
|
+
"build:js": "NODE_OPTIONS=--max-old-space-size=6144 tsup",
|
|
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",
|
|
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",
|
|
146
|
+
"dev": "tsup --watch",
|
|
147
|
+
"typecheck": "tsc --noEmit",
|
|
148
|
+
"lint": "eslint src scripts agent bin",
|
|
149
|
+
"test": "vitest run",
|
|
150
|
+
"test:watch": "vitest",
|
|
151
|
+
"clean": "rm -rf dist",
|
|
152
|
+
"check:size": "node scripts/check-size.mjs",
|
|
153
|
+
"check:publish": "node scripts/check-publish.mjs"
|
|
129
154
|
}
|
|
130
|
-
}
|
|
155
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: misoto22-design
|
|
3
|
+
description: Builds UI with @misoto22/design — a monochrome design system of CSS tokens and 52 accessible React primitives. Use when a project imports '@misoto22/design', sets data-mode / data-surface / data-radius / data-accent, or uses cn(), CONTROL_BASE, or isInvalid. Also applies when adding a component, theming, 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
|
+
## What this project has installed
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
!`npx misoto22-design docs --installed`
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
That is the version resolved in this project and every component it ships. Get
|
|
24
|
+
one component's full contract — every prop with its type and default, its
|
|
25
|
+
exported unions, its keyboard map, its accessibility promises, its examples —
|
|
26
|
+
with:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npx misoto22-design docs Button
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Run that before writing against a component you have not used in this session.
|
|
33
|
+
The median component is ~500 tokens and the largest is ~1,300, against ~28,000
|
|
34
|
+
for all fifty-two. It is generated from the installed source, so it cannot be
|
|
35
|
+
out of date the way the website can.
|
|
36
|
+
|
|
37
|
+
It also resolves parts and types, not just components: `docs CardBody`,
|
|
38
|
+
`docs TH` and `docs ButtonVariant` all land on the right file. When an import
|
|
39
|
+
fails, ask it about the identifier you tried.
|
|
40
|
+
|
|
41
|
+
## The one thing to internalise
|
|
42
|
+
|
|
43
|
+
**This is not shadcn/ui, and the names differ where it matters most.** A model
|
|
44
|
+
writing from habit produces imports that do not exist. The full table is in
|
|
45
|
+
[naming.md](./rules/naming.md); these four are the ones that come up every time:
|
|
46
|
+
|
|
47
|
+
| Habit | Here |
|
|
48
|
+
| --- | --- |
|
|
49
|
+
| `CardContent` | **`CardBody`** |
|
|
50
|
+
| `TableHeader` / `TableBody` / `TableRow` / `TableHead` / `TableCell` | **`THead` / `TBody` / `TR` / `TH` / `TD`** |
|
|
51
|
+
| `<DialogTitle>` as a child | **`<DialogContent title="…">`** — a prop, not a child |
|
|
52
|
+
| `<AlertTitle>` / `<AlertDescription>` | **`<Alert tone title="…">`** — props, not children |
|
|
53
|
+
|
|
54
|
+
## Critical rules
|
|
55
|
+
|
|
56
|
+
Always enforced. Each links to a file with Incorrect/Correct pairs — read it when
|
|
57
|
+
you are about to do that thing, not before.
|
|
58
|
+
|
|
59
|
+
### Colour and theming → [tokens.md](./rules/tokens.md)
|
|
60
|
+
|
|
61
|
+
- **Never write a raw colour.** No `bg-neutral-900`, no `text-gray-500`, no hex.
|
|
62
|
+
Read the semantic layer: `bg-(--background)`, `text-(--foreground-muted)`,
|
|
63
|
+
`border-(--border-color)`.
|
|
64
|
+
- **Never write a `dark:` variant.** Dark mode is a value swap behind
|
|
65
|
+
`data-mode="dark"`; a `dark:` override fights it and wins in only one theme.
|
|
66
|
+
- **Theme with the seven `data-*` axes**, set on any element, not just `:root`.
|
|
67
|
+
`data-mode`, `data-surface`, `data-radius`, `data-rules`, `data-type`,
|
|
68
|
+
`data-motion`, `data-density`, plus `data-accent`.
|
|
69
|
+
- **Durations and radii come from tokens.** `duration-(--duration-fast)`,
|
|
70
|
+
`rounded-(--radius)` — not `duration-150`, not `rounded-lg`.
|
|
71
|
+
- **No blurred shadow.** `--shadow*` resolves to `none` on purpose. Depth is a
|
|
72
|
+
hairline, a change of ground, or `--lift`.
|
|
73
|
+
|
|
74
|
+
### Composition → [composition.md](./rules/composition.md)
|
|
75
|
+
|
|
76
|
+
- **`className` adjusts layout, never appearance.** Margin, width, grid
|
|
77
|
+
placement — yes. Colour, border, radius, font — no; that is what the props and
|
|
78
|
+
the axes are for.
|
|
79
|
+
- **Use `cn()` for conditional classes.** It is exported. Plain template
|
|
80
|
+
literals emit both sides of a Tailwind conflict and let stylesheet order pick
|
|
81
|
+
the winner.
|
|
82
|
+
- **Card uses the full set.** `Card` → `CardHeader` / `CardTitle` / `CardBody` /
|
|
83
|
+
`CardFooter`. Do not dump everything into one div.
|
|
84
|
+
- **`Select` is one component, not a compound.** It takes `label`, `placeholder`
|
|
85
|
+
and `SelectItem` children. There is no `SelectTrigger` or `SelectValue`.
|
|
86
|
+
- **Logical properties, always.** `ps-` / `pe-` / `start-` / `end-` /
|
|
87
|
+
`text-start`. The package is RTL-correct and a physical property breaks it.
|
|
88
|
+
|
|
89
|
+
### Forms → [forms.md](./rules/forms.md)
|
|
90
|
+
|
|
91
|
+
- **A labelled control is a `Field`.** `<Field label hint error required>` wraps
|
|
92
|
+
one control and wires `aria-describedby`, `aria-required` and `aria-invalid`
|
|
93
|
+
onto it. Never hand-roll `<label>` + input + error div.
|
|
94
|
+
- **Errors go in `Field`'s `error` prop.** It replaces `hint` — they are one
|
|
95
|
+
slot, not two stacked messages — and it sets `aria-invalid` on the control for
|
|
96
|
+
you, so do not also pass `invalid`.
|
|
97
|
+
- **Outside a `Field`, invalid state is `invalid` or `aria-invalid`** on the
|
|
98
|
+
control. Never a red border class.
|
|
99
|
+
- **One control per `Field`.** The wiring clones a single element child; a
|
|
100
|
+
wrapper div around two controls silently wires nothing.
|
|
101
|
+
- **Build custom controls on `CONTROL_BASE` + `CONTROL_BORDER`** and read the
|
|
102
|
+
state with `isInvalid()`. All three are exported.
|
|
103
|
+
|
|
104
|
+
### Accessibility → [a11y.md](./rules/a11y.md)
|
|
105
|
+
|
|
106
|
+
- **Four props are required by the type because forgetting them ships an
|
|
107
|
+
unusable control**: `Table.caption`, `Progress.label`, `Avatar.alt`,
|
|
108
|
+
`FloatingIconButton.label`. `Select.label` and `Badge.children` too.
|
|
109
|
+
- **`<Button iconOnly>` needs `aria-label`.** There is no text to read.
|
|
110
|
+
- **Decoration is `aria-hidden`.** A status dot beside the word "Available"
|
|
111
|
+
repeats it.
|
|
112
|
+
- **Colour is never the only carrier** of a status. Every tone is doubled by an
|
|
113
|
+
icon or by the words.
|
|
114
|
+
|
|
115
|
+
### Imports
|
|
116
|
+
|
|
117
|
+
- **`toast` comes from `@misoto22/design`, not from `sonner`.** Render `<Toaster />`
|
|
118
|
+
once at the app root.
|
|
119
|
+
- **Styles are a separate import.** `@misoto22/design/styles.css` for the whole
|
|
120
|
+
compiled sheet, or `tokens.css` + `semantic.css` + `keyframes.css` when the app
|
|
121
|
+
compiles its own Tailwind.
|
|
122
|
+
|
|
123
|
+
## Key patterns
|
|
124
|
+
|
|
125
|
+
```tsx
|
|
126
|
+
// A labelled, validated field. Field does the ARIA wiring, including
|
|
127
|
+
// aria-invalid — do not also pass `invalid` on the control.
|
|
128
|
+
<Field label="Email" required error={errors.email}>
|
|
129
|
+
<Input type="email" />
|
|
130
|
+
</Field>
|
|
131
|
+
|
|
132
|
+
// A select. One component; label is required.
|
|
133
|
+
<Select label="Region" placeholder="Choose one">
|
|
134
|
+
<SelectItem value="au">Australia</SelectItem>
|
|
135
|
+
</Select>
|
|
136
|
+
|
|
137
|
+
// A dialog. The title is a prop, and it is not optional for a screen reader.
|
|
138
|
+
<Dialog>
|
|
139
|
+
<DialogTrigger asChild><Button>Open</Button></DialogTrigger>
|
|
140
|
+
<DialogContent title="Delete project" description="This cannot be undone.">
|
|
141
|
+
<Button variant="danger">Delete</Button>
|
|
142
|
+
</DialogContent>
|
|
143
|
+
</Dialog>
|
|
144
|
+
|
|
145
|
+
// A table. caption is required; it is what a screen reader announces.
|
|
146
|
+
<Table caption="Open invoices" borders="rows">
|
|
147
|
+
<THead><TR><TH>Client</TH><TH align="end">Amount</TH></TR></THead>
|
|
148
|
+
<TBody><TR><TD>Acme</TD><TD align="end">$1,200</TD></TR></TBody>
|
|
149
|
+
</Table>
|
|
150
|
+
|
|
151
|
+
// Colour: semantic tokens, no raw values, no dark: variant.
|
|
152
|
+
<div className="bg-(--card-background) text-(--foreground-muted)"> // correct
|
|
153
|
+
<div className="bg-white text-gray-500 dark:bg-neutral-900"> // wrong
|
|
154
|
+
|
|
155
|
+
// Theming: an axis on any element themes the subtree below it.
|
|
156
|
+
<section data-surface="warm" data-radius="round">…</section>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Variants, in full
|
|
160
|
+
|
|
161
|
+
Short enough to inline; everything else comes from `docs <Component>`.
|
|
162
|
+
|
|
163
|
+
Every union is exported under the name in brackets, so a wrapper can take one
|
|
164
|
+
without retyping it.
|
|
165
|
+
|
|
166
|
+
- `Button` — `variant` [`ButtonVariant`]: `primary` `secondary` `ghost` `danger` · `size` [`ButtonSize`]: `sm` `md` `lg` · also `href`, `asChild`, `loading`, `iconOnly`, `keycap`
|
|
167
|
+
- `Badge` — `tone` [`BadgeTone`]: `neutral` `success` `warning` `danger` `outline`
|
|
168
|
+
- `Alert` — `tone` [`AlertTone`]: `info` `success` `warning` `danger`
|
|
169
|
+
- `Card` — `variant`: `outline` `plate` `flat`
|
|
170
|
+
- `Table` — `borders` [`TableBorders`]: `rows` `grid` `bordered` `bordered-grid` `none` · `density`: `comfortable` `compact`
|
|
171
|
+
- `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
|
+
}
|