@actioneer/ads-mcp 0.7.0 → 0.8.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.
Files changed (3) hide show
  1. package/manifest.json +226 -237
  2. package/package.json +2 -2
  3. package/src/tools.mjs +33 -6
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actioneer/ads",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "importPath": "@actioneer/ads",
5
5
  "styleImport": "@import \"@actioneer/ads/styles.css\";",
6
6
  "families": [
@@ -16,9 +16,9 @@
16
16
  "Chat"
17
17
  ],
18
18
  "counts": {
19
- "total": 743,
20
- "component": 323,
21
- "type": 312,
19
+ "total": 740,
20
+ "component": 322,
21
+ "type": 310,
22
22
  "hook": 10,
23
23
  "util": 98
24
24
  },
@@ -31,7 +31,7 @@
31
31
  "text-background",
32
32
  "border-background"
33
33
  ],
34
- "description": ""
34
+ "description": "The shell canvas and its ink: the ground between top-level panels."
35
35
  },
36
36
  {
37
37
  "name": "--color-foreground",
@@ -41,7 +41,7 @@
41
41
  "text-foreground",
42
42
  "border-foreground"
43
43
  ],
44
- "description": ""
44
+ "description": "The shell canvas and its ink: the ground between top-level panels."
45
45
  },
46
46
  {
47
47
  "name": "--color-on-white-primary",
@@ -141,7 +141,7 @@
141
141
  "text-surface",
142
142
  "border-surface"
143
143
  ],
144
- "description": ""
144
+ "description": "One continuous recess inside a white surface, never a screen-level ground."
145
145
  },
146
146
  {
147
147
  "name": "--color-surface-foreground",
@@ -150,7 +150,7 @@
150
150
  "text-surface-foreground",
151
151
  "bg-surface-foreground"
152
152
  ],
153
- "description": ""
153
+ "description": "One continuous recess inside a white surface, never a screen-level ground."
154
154
  },
155
155
  {
156
156
  "name": "--color-elevated",
@@ -160,7 +160,7 @@
160
160
  "text-elevated",
161
161
  "border-elevated"
162
162
  ],
163
- "description": ""
163
+ "description": "One continuous recess inside a white surface, never a screen-level ground."
164
164
  },
165
165
  {
166
166
  "name": "--color-muted",
@@ -170,7 +170,7 @@
170
170
  "text-muted",
171
171
  "border-muted"
172
172
  ],
173
- "description": ""
173
+ "description": "The hover and row-state wash: interaction, not a default item background."
174
174
  },
175
175
  {
176
176
  "name": "--color-muted-foreground",
@@ -179,7 +179,7 @@
179
179
  "text-muted-foreground",
180
180
  "bg-muted-foreground"
181
181
  ],
182
- "description": ""
182
+ "description": "The hover and row-state wash: interaction, not a default item background."
183
183
  },
184
184
  {
185
185
  "name": "--color-card",
@@ -189,7 +189,7 @@
189
189
  "text-card",
190
190
  "border-card"
191
191
  ],
192
- "description": ""
192
+ "description": "The white working plane that sits on the canvas, and the specimen hairline."
193
193
  },
194
194
  {
195
195
  "name": "--color-card-foreground",
@@ -198,7 +198,7 @@
198
198
  "text-card-foreground",
199
199
  "bg-card-foreground"
200
200
  ],
201
- "description": ""
201
+ "description": "The white working plane that sits on the canvas, and the specimen hairline."
202
202
  },
203
203
  {
204
204
  "name": "--color-specimen-stroke",
@@ -208,7 +208,7 @@
208
208
  "text-specimen-stroke",
209
209
  "border-specimen-stroke"
210
210
  ],
211
- "description": ""
211
+ "description": "The white working plane that sits on the canvas, and the specimen hairline."
212
212
  },
213
213
  {
214
214
  "name": "--color-action-primary",
@@ -335,7 +335,7 @@
335
335
  "text-table-shell",
336
336
  "border-table-shell"
337
337
  ],
338
- "description": "Quiet fill avatars, chips, and disabled controls"
338
+ "description": "Table surfaces: the white tray, its hairlines, and header ink."
339
339
  },
340
340
  {
341
341
  "name": "--color-table-stroke",
@@ -345,7 +345,7 @@
345
345
  "text-table-stroke",
346
346
  "border-table-stroke"
347
347
  ],
348
- "description": "Quiet fill avatars, chips, and disabled controls"
348
+ "description": "Table surfaces: the white tray, its hairlines, and header ink."
349
349
  },
350
350
  {
351
351
  "name": "--color-table-header-foreground",
@@ -354,7 +354,7 @@
354
354
  "text-table-header-foreground",
355
355
  "bg-table-header-foreground"
356
356
  ],
357
- "description": "Quiet fill avatars, chips, and disabled controls"
357
+ "description": "Table surfaces: the white tray, its hairlines, and header ink."
358
358
  },
359
359
  {
360
360
  "name": "--color-artifact-canvas",
@@ -364,7 +364,7 @@
364
364
  "text-artifact-canvas",
365
365
  "border-artifact-canvas"
366
366
  ],
367
- "description": ""
367
+ "description": "The artifact sheet: white warmed by a trace of the brand mark."
368
368
  },
369
369
  {
370
370
  "name": "--color-accent",
@@ -374,7 +374,7 @@
374
374
  "text-accent",
375
375
  "border-accent"
376
376
  ],
377
- "description": ""
377
+ "description": "The active and selected wash, one step above hover."
378
378
  },
379
379
  {
380
380
  "name": "--color-accent-foreground",
@@ -383,7 +383,7 @@
383
383
  "text-accent-foreground",
384
384
  "bg-accent-foreground"
385
385
  ],
386
- "description": ""
386
+ "description": "The active and selected wash, one step above hover."
387
387
  },
388
388
  {
389
389
  "name": "--color-success",
@@ -393,7 +393,7 @@
393
393
  "text-success",
394
394
  "border-success"
395
395
  ],
396
- "description": "Lichen success-700 clears AA on White and both success soft fills;"
396
+ "description": "Lichen success-700 clears AA on White and both success soft fills; success-600 is reserved for non-text marks because its 3.73:1 contrast on White does not clear body-text AA."
397
397
  },
398
398
  {
399
399
  "name": "--color-success-foreground",
@@ -402,7 +402,7 @@
402
402
  "text-success-foreground",
403
403
  "bg-success-foreground"
404
404
  ],
405
- "description": "Lichen success-700 clears AA on White and both success soft fills;"
405
+ "description": "Lichen success-700 clears AA on White and both success soft fills; success-600 is reserved for non-text marks because its 3.73:1 contrast on White does not clear body-text AA."
406
406
  },
407
407
  {
408
408
  "name": "--color-warning",
@@ -412,7 +412,7 @@
412
412
  "text-warning",
413
413
  "border-warning"
414
414
  ],
415
- "description": "Amber-500 fill kept (it IS the caution signal); dark ink foreground"
415
+ "description": "Amber-500 fill kept (it IS the caution signal); dark ink foreground instead of white = 6.94:1 (white on amber was 2.35:1, failed even 3:1)."
416
416
  },
417
417
  {
418
418
  "name": "--color-warning-foreground",
@@ -421,7 +421,7 @@
421
421
  "text-warning-foreground",
422
422
  "bg-warning-foreground"
423
423
  ],
424
- "description": "Amber-500 fill kept (it IS the caution signal); dark ink foreground"
424
+ "description": "Amber-500 fill kept (it IS the caution signal); dark ink foreground instead of white = 6.94:1 (white on amber was 2.35:1, failed even 3:1)."
425
425
  },
426
426
  {
427
427
  "name": "--color-danger",
@@ -431,7 +431,7 @@
431
431
  "text-danger",
432
432
  "border-danger"
433
433
  ],
434
- "description": "Amber-500 fill kept (it IS the caution signal); dark ink foreground"
434
+ "description": "Danger and info: solid semantic fills carrying white foregrounds."
435
435
  },
436
436
  {
437
437
  "name": "--color-danger-foreground",
@@ -440,7 +440,7 @@
440
440
  "text-danger-foreground",
441
441
  "bg-danger-foreground"
442
442
  ],
443
- "description": "Amber-500 fill kept (it IS the caution signal); dark ink foreground"
443
+ "description": "Danger and info: solid semantic fills carrying white foregrounds."
444
444
  },
445
445
  {
446
446
  "name": "--color-info",
@@ -450,7 +450,7 @@
450
450
  "text-info",
451
451
  "border-info"
452
452
  ],
453
- "description": "Amber-500 fill kept (it IS the caution signal); dark ink foreground"
453
+ "description": "Danger and info: solid semantic fills carrying white foregrounds."
454
454
  },
455
455
  {
456
456
  "name": "--color-info-foreground",
@@ -459,7 +459,7 @@
459
459
  "text-info-foreground",
460
460
  "bg-info-foreground"
461
461
  ],
462
- "description": "Amber-500 fill kept (it IS the caution signal); dark ink foreground"
462
+ "description": "Danger and info: solid semantic fills carrying white foregrounds."
463
463
  },
464
464
  {
465
465
  "name": "--color-border-primary",
@@ -469,7 +469,7 @@
469
469
  "text-border-primary",
470
470
  "border-border-primary"
471
471
  ],
472
- "description": ""
472
+ "description": "The neutral stroke ladder: every 1px UI border stays within WG3 to WG5."
473
473
  },
474
474
  {
475
475
  "name": "--color-border-secondary",
@@ -479,7 +479,7 @@
479
479
  "text-border-secondary",
480
480
  "border-border-secondary"
481
481
  ],
482
- "description": ""
482
+ "description": "The neutral stroke ladder: every 1px UI border stays within WG3 to WG5."
483
483
  },
484
484
  {
485
485
  "name": "--color-border-tertiary",
@@ -489,7 +489,7 @@
489
489
  "text-border-tertiary",
490
490
  "border-border-tertiary"
491
491
  ],
492
- "description": ""
492
+ "description": "The neutral stroke ladder: every 1px UI border stays within WG3 to WG5."
493
493
  },
494
494
  {
495
495
  "name": "--color-border",
@@ -499,7 +499,7 @@
499
499
  "text-border",
500
500
  "border-border"
501
501
  ],
502
- "description": ""
502
+ "description": "The neutral stroke ladder: every 1px UI border stays within WG3 to WG5."
503
503
  },
504
504
  {
505
505
  "name": "--color-border-strong",
@@ -509,7 +509,7 @@
509
509
  "text-border-strong",
510
510
  "border-border-strong"
511
511
  ],
512
- "description": ""
512
+ "description": "The neutral stroke ladder: every 1px UI border stays within WG3 to WG5."
513
513
  },
514
514
  {
515
515
  "name": "--color-input",
@@ -519,7 +519,7 @@
519
519
  "text-input",
520
520
  "border-input"
521
521
  ],
522
- "description": ""
522
+ "description": "The neutral stroke ladder: every 1px UI border stays within WG3 to WG5."
523
523
  },
524
524
  {
525
525
  "name": "--color-menu-stroke",
@@ -529,7 +529,7 @@
529
529
  "text-menu-stroke",
530
530
  "border-menu-stroke"
531
531
  ],
532
- "description": ""
532
+ "description": "The neutral stroke ladder: every 1px UI border stays within WG3 to WG5."
533
533
  },
534
534
  {
535
535
  "name": "--color-toast-stroke",
@@ -539,7 +539,7 @@
539
539
  "text-toast-stroke",
540
540
  "border-toast-stroke"
541
541
  ],
542
- "description": ""
542
+ "description": "The neutral stroke ladder: every 1px UI border stays within WG3 to WG5."
543
543
  },
544
544
  {
545
545
  "name": "--color-tree-stroke",
@@ -549,7 +549,7 @@
549
549
  "text-tree-stroke",
550
550
  "border-tree-stroke"
551
551
  ],
552
- "description": ""
552
+ "description": "The neutral stroke ladder: every 1px UI border stays within WG3 to WG5."
553
553
  },
554
554
  {
555
555
  "name": "--color-ring",
@@ -557,7 +557,7 @@
557
557
  "utilities": [
558
558
  "ring-ring"
559
559
  ],
560
- "description": ""
560
+ "description": "Focus ring and scrim, both translucent warm ink."
561
561
  },
562
562
  {
563
563
  "name": "--color-overlay",
@@ -567,7 +567,7 @@
567
567
  "text-overlay",
568
568
  "border-overlay"
569
569
  ],
570
- "description": ""
570
+ "description": "Focus ring and scrim, both translucent warm ink."
571
571
  }
572
572
  ],
573
573
  "exports": [
@@ -1838,7 +1838,6 @@
1838
1838
  "props": [
1839
1839
  "open",
1840
1840
  "onOpenChange",
1841
- "appearance",
1842
1841
  "dismissible",
1843
1842
  "containerClassName",
1844
1843
  "className",
@@ -2021,33 +2020,6 @@
2021
2020
  "children"
2022
2021
  ]
2023
2022
  },
2024
- {
2025
- "name": "FloatingDrawer",
2026
- "family": "Overlays",
2027
- "kind": "component",
2028
- "importPath": "@actioneer/ads",
2029
- "module": "drawer",
2030
- "showcaseUrl": "https://ads.actioneer.dev/#/drawer",
2031
- "variants": {
2032
- "side": {
2033
- "values": [
2034
- "right",
2035
- "left",
2036
- "bottom"
2037
- ],
2038
- "default": "right"
2039
- },
2040
- "size": {
2041
- "values": [
2042
- "sm",
2043
- "md",
2044
- "lg",
2045
- "xl"
2046
- ],
2047
- "default": "md"
2048
- }
2049
- }
2050
- },
2051
2023
  {
2052
2024
  "name": "InlineDrawer",
2053
2025
  "family": "Overlays",
@@ -2413,13 +2385,6 @@
2413
2385
  "importPath": "@actioneer/ads",
2414
2386
  "module": "command-palette"
2415
2387
  },
2416
- {
2417
- "name": "DrawerAppearance",
2418
- "family": "Overlays",
2419
- "kind": "type",
2420
- "importPath": "@actioneer/ads",
2421
- "module": "drawer"
2422
- },
2423
2388
  {
2424
2389
  "name": "DrawerProps",
2425
2390
  "family": "Overlays",
@@ -2455,13 +2420,6 @@
2455
2420
  "importPath": "@actioneer/ads",
2456
2421
  "module": "dropdown"
2457
2422
  },
2458
- {
2459
- "name": "FloatingDrawerProps",
2460
- "family": "Overlays",
2461
- "kind": "type",
2462
- "importPath": "@actioneer/ads",
2463
- "module": "drawer"
2464
- },
2465
2423
  {
2466
2424
  "name": "InlineDrawerProps",
2467
2425
  "family": "Overlays",
@@ -3630,7 +3588,7 @@
3630
3588
  "kind": "component",
3631
3589
  "importPath": "@actioneer/ads",
3632
3590
  "module": "table",
3633
- "description": "Use Table for structured tabular data that may need row selection, column sorting, sticky columns, or a paginated footer — not for simple key-value lists. Interactive rows inherit the shared soft neutral hover/focus sink and keep their normal table geometry; do not add a brand tint or hover-only corner rounding. Primary record links stay text-only in every state: never reveal an arrow, chevron, or other directional icon only on hover. Persistent row actions use a final sticky-right column plus elevatedActionColumn so one body-column shadow lifts the action surface instead of repeating on individual cells. The empty matching header cell remains transparent and non-sticky.",
3591
+ "description": "Use Table for structured tabular data that may need row selection, column sorting, sticky columns, or a paginated footer — not for simple key-value lists. Every primary body-cell value defaults to text-m (15px / 22px); only clearly secondary metadata inside a cell may opt down to text-s. Interactive rows inherit the shared soft neutral hover/focus sink and keep their normal table geometry; do not add a brand tint or hover-only corner rounding. Primary record links stay text-only in every state: never reveal an arrow, chevron, or other directional icon only on hover. Persistent row actions use a final sticky-right column plus elevatedActionColumn so one body-column shadow lifts the action surface instead of repeating on individual cells. The empty matching header cell remains transparent and non-sticky.",
3634
3592
  "showcaseUrl": "https://ads.actioneer.dev/#/table",
3635
3593
  "props": [
3636
3594
  "wrapperClassName",
@@ -8396,6 +8354,168 @@
8396
8354
  "note": "Vendored assistant-ui component. Props follow upstream assistant-ui, not ADS conventions; the chat family needs an <AssistantRuntimeProvider> (chat runtime) and a <TooltipProvider> ancestor. Import from \"@actioneer/ads\" like any ADS export."
8397
8355
  }
8398
8356
  ],
8357
+ "scales": {
8358
+ "typography": {
8359
+ "display": {
8360
+ "fontFamily": "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif",
8361
+ "fontSize": "31px",
8362
+ "fontWeight": 500,
8363
+ "lineHeight": "38px"
8364
+ },
8365
+ "title": {
8366
+ "fontFamily": "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif",
8367
+ "fontSize": "25px",
8368
+ "fontWeight": 500,
8369
+ "lineHeight": "32px"
8370
+ },
8371
+ "headline": {
8372
+ "fontFamily": "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif",
8373
+ "fontSize": "19px",
8374
+ "fontWeight": 500,
8375
+ "lineHeight": "26px"
8376
+ },
8377
+ "body": {
8378
+ "fontFamily": "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif",
8379
+ "fontSize": "15px",
8380
+ "fontWeight": 400,
8381
+ "lineHeight": "22px"
8382
+ },
8383
+ "label": {
8384
+ "fontFamily": "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif",
8385
+ "fontSize": "13px",
8386
+ "fontWeight": 400,
8387
+ "lineHeight": "18px"
8388
+ },
8389
+ "mono": {
8390
+ "fontFamily": "\"JetBrains Mono Variable\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", \"Courier New\", monospace",
8391
+ "fontSize": "13px",
8392
+ "fontWeight": 400,
8393
+ "lineHeight": "18px"
8394
+ }
8395
+ },
8396
+ "radius": {
8397
+ "xs": "2px",
8398
+ "sm": "4px",
8399
+ "md": "6px",
8400
+ "lg": "8px",
8401
+ "xl": "12px",
8402
+ "full": "9999px"
8403
+ },
8404
+ "shadow": [
8405
+ {
8406
+ "name": "0",
8407
+ "value": "none"
8408
+ },
8409
+ {
8410
+ "name": "100",
8411
+ "value": "0 1px 0 0 rgb(32 32 32 / 0.07)"
8412
+ },
8413
+ {
8414
+ "name": "200",
8415
+ "value": "0 3px 1px -1px rgb(32 32 32 / 0.07)"
8416
+ },
8417
+ {
8418
+ "name": "300",
8419
+ "value": "0 4px 6px -2px rgb(32 32 32 / 0.2)"
8420
+ },
8421
+ {
8422
+ "name": "400",
8423
+ "value": "0 8px 16px -4px rgb(32 32 32 / 0.22)"
8424
+ },
8425
+ {
8426
+ "name": "500",
8427
+ "value": "0 12px 20px -8px rgb(32 32 32 / 0.24)"
8428
+ },
8429
+ {
8430
+ "name": "600",
8431
+ "value": "0 20px 20px -8px rgb(32 32 32 / 0.28)"
8432
+ },
8433
+ {
8434
+ "name": "elevation",
8435
+ "value": "none"
8436
+ },
8437
+ {
8438
+ "name": "table-smudge-left",
8439
+ "value": "8px 0 24px -14px rgb(32 32 32 / 0.05)"
8440
+ },
8441
+ {
8442
+ "name": "table-smudge-right",
8443
+ "value": "-8px 0 24px -14px rgb(32 32 32 / 0.05)"
8444
+ }
8445
+ ],
8446
+ "motion": [
8447
+ {
8448
+ "name": "springEffect",
8449
+ "purpose": "Fade/slide effects: Animate UI Effect, Fade, Slide, Blur, and Zoom.",
8450
+ "value": "type: \"spring\", stiffness: 200, damping: 20"
8451
+ },
8452
+ {
8453
+ "name": "springControl",
8454
+ "purpose": "Selection highlights: Animate UI Tabs and Toggle Group.",
8455
+ "value": "type: \"spring\", stiffness: 200, damping: 25"
8456
+ },
8457
+ {
8458
+ "name": "springOverlay",
8459
+ "purpose": "Floating UI: Animate UI Popover, Tooltip, Hover Card, and Preview Card.",
8460
+ "value": "type: \"spring\", stiffness: 300, damping: 25"
8461
+ },
8462
+ {
8463
+ "name": "springDialog",
8464
+ "purpose": "Modal surfaces: Animate UI Dialog and Alert Dialog.",
8465
+ "value": "type: \"spring\", stiffness: 150, damping: 25"
8466
+ },
8467
+ {
8468
+ "name": "springSheet",
8469
+ "purpose": "Side panels: Animate UI Sheet.",
8470
+ "value": "type: \"spring\", stiffness: 150, damping: 22"
8471
+ },
8472
+ {
8473
+ "name": "springDisclosure",
8474
+ "purpose": "Auto-sized content: Animate UI Auto Height and animated tab panels.",
8475
+ "value": "type: \"spring\", stiffness: 300, damping: 30, bounce: 0, restDelta: 0.01"
8476
+ },
8477
+ {
8478
+ "name": "springHighlight",
8479
+ "purpose": "Menus and active-item highlights: Animate UI Menu and Highlight.",
8480
+ "value": "type: \"spring\", stiffness: 350, damping: 35"
8481
+ },
8482
+ {
8483
+ "name": "springProgress",
8484
+ "purpose": "Determinate value changes: Animate UI Progress.",
8485
+ "value": "type: \"spring\", stiffness: 100, damping: 30"
8486
+ },
8487
+ {
8488
+ "name": "springSwitch",
8489
+ "purpose": "Switch thumbs: Animate UI Switch.",
8490
+ "value": "type: \"spring\", stiffness: 300, damping: 25"
8491
+ },
8492
+ {
8493
+ "name": "springRadio",
8494
+ "purpose": "Radio indicators: Animate UI Radio Group.",
8495
+ "value": "type: \"spring\", stiffness: 200, damping: 16"
8496
+ },
8497
+ {
8498
+ "name": "springCarousel",
8499
+ "purpose": "Carousel tracks: Animate UI Carousel.",
8500
+ "value": "type: \"spring\", stiffness: 240, damping: 24"
8501
+ },
8502
+ {
8503
+ "name": "springSidebar",
8504
+ "purpose": "Collapsible application rails: Animate UI Sidebar.",
8505
+ "value": "type: \"spring\", stiffness: 350, damping: 35"
8506
+ },
8507
+ {
8508
+ "name": "checkDrawTransition",
8509
+ "purpose": "Checkbox mark drawing: Animate UI Checkbox.",
8510
+ "value": "duration: 0.2, ease: \"easeOut\""
8511
+ },
8512
+ {
8513
+ "name": "fadeTransition",
8514
+ "purpose": "Animate UI's backdrop treatment for dialogs and sheets.",
8515
+ "value": "duration: 0.2, ease: \"easeInOut\""
8516
+ }
8517
+ ]
8518
+ },
8399
8519
  "principles": [
8400
8520
  {
8401
8521
  "id": "fills-over-strokes",
@@ -8427,7 +8547,7 @@
8427
8547
  ],
8428
8548
  "dont": [
8429
8549
  "Infer permission to use a shadow from actionability, floating placement, or component type.",
8430
- "Use raw shadow values or legacy shadow-sm/md/lg/xl utilities.",
8550
+ "Use raw shadow values or legacy named shadow utilities.",
8431
8551
  "Put a shadow on a non-interactive surface for decoration.",
8432
8552
  "Use shadow-500 or shadow-600 as a routine default."
8433
8553
  ],
@@ -8461,18 +8581,18 @@
8461
8581
  ]
8462
8582
  },
8463
8583
  {
8464
- "id": "icons-hugeicons-stroke",
8584
+ "id": "icons-phosphor-regular",
8465
8585
  "number": 4,
8466
- "title": "Icons: Hugeicons, stroke only",
8467
- "rule": "All icons come from Hugeicons in the Stroke Rounded style only. Components import named icons from the @/lib/icons registry — never from an icon package directly — so a free→Pro swap or a restyle touches one file.",
8586
+ "title": "Icons: Phosphor, regular weight (fill for active)",
8587
+ "rule": "All icons come from Phosphor Icons at the regular weight the stroke-led icon language of ADS. Components import named icons from the @/lib/icons registry — never from an icon package directly — so swapping the underlying set touches one file.",
8468
8588
  "do": [
8469
- "Import icons from the @/lib/icons registry; add a new one there (stroke variant) before using it.",
8589
+ "Import icons from the @/lib/icons registry; wrap a new Phosphor component with createIcon there before using it.",
8470
8590
  "Let icons default to size='1em' so they scale with text; size with a size prop or size-* class.",
8471
- "Keep stroke weight at the drawn 1.5; strokeWidth={2} is the one sanctioned emphasis step."
8591
+ "Render weight='fill' for the active or selected state, and weight='bold' for the rare heavier stroke."
8472
8592
  ],
8473
8593
  "dont": [
8474
- "Import from an icon package directly, or use solid/duotone/twotone/fill variants.",
8475
- "Use a stroke weight thinner than 1.5."
8594
+ "Import from an icon package directly, or install a second icon set.",
8595
+ "Leave an active nav item's icon at the regular stroke weight."
8476
8596
  ],
8477
8597
  "enforcedByLint": true,
8478
8598
  "lintRules": [
@@ -8510,15 +8630,19 @@
8510
8630
  "id": "ads-first",
8511
8631
  "number": 7,
8512
8632
  "title": "ADS-first UI: use the library; extend only when asked",
8513
- "rule": "Every UI decision stays synchronized with ADS. Before making a new screen/control/pattern, check the ADS component suite first and use the exact exported name from the public barrel. Do not hand-roll, alias, deep-import, or import external UI libraries.",
8633
+ "rule": "Every UI decision stays synchronized with ADS. Search the full catalog before deciding a component is missing, and use the exact exported name from the public barrel. When the barrel genuinely has no primitive, the sanctioned fallback is a shadcn/ui component vendored into src/components/ui through the repo's components.json recipe — never a hand-rolled control and never a UI library imported at a call site.",
8514
8634
  "do": [
8515
8635
  "Use an existing ADS component by its exact exported name from the package barrel; compose existing components for layout-only patterns.",
8516
- "Ask the user before extending ADS; only an explicit request authorizes new library work.",
8636
+ "Search the whole catalog before concluding a component is missing the documented specimens are a sample, not the inventory.",
8637
+ "Fall back to shadcn/ui when the barrel has no primitive: vendor it with npx shadcn add into src/components/ui, import cn from @/lib/utils, and swap its lucide icons for @/lib/icons.",
8638
+ "Let a vendored shadcn component inherit the ADS palette through the shadcn-compat aliases in theme.css rather than restyling it by hand.",
8639
+ "Ask the user before promoting a vendored component into the public barrel; only an explicit request authorizes new library work.",
8517
8640
  "When authorized, add the component to the right family, export its exact name through the barrel, and document it."
8518
8641
  ],
8519
8642
  "dont": [
8520
8643
  "Deep-import, alias, default/namespace-import, or hand-roll a local copy of a component.",
8521
- "Import a visual component directly from the web or an npm UI library."
8644
+ "Import a visual component directly from the web or an npm UI library at a call site.",
8645
+ "Reach for the shadcn fallback before searching the catalog, or install a second component library beside it."
8522
8646
  ],
8523
8647
  "enforcedByLint": true,
8524
8648
  "lintRules": [
@@ -9473,10 +9597,10 @@
9473
9597
  ]
9474
9598
  },
9475
9599
  "counts": {
9476
- "nodes": 810,
9477
- "edges": 552,
9478
- "component": 323,
9479
- "state": 465,
9600
+ "nodes": 802,
9601
+ "edges": 545,
9602
+ "component": 322,
9603
+ "state": 458,
9480
9604
  "principle": 11,
9481
9605
  "production": 9,
9482
9606
  "layout": 2
@@ -10880,99 +11004,6 @@
10880
11004
  "showcaseUrl": "https://ads.actioneer.dev/#/dropdown",
10881
11005
  "description": ""
10882
11006
  },
10883
- {
10884
- "id": "component:FloatingDrawer",
10885
- "kind": "component",
10886
- "label": "FloatingDrawer",
10887
- "family": "Overlays",
10888
- "module": "drawer",
10889
- "showcaseUrl": "https://ads.actioneer.dev/#/drawer",
10890
- "description": ""
10891
- },
10892
- {
10893
- "id": "state:FloatingDrawer:side=right",
10894
- "kind": "state",
10895
- "label": "side=right",
10896
- "component": "FloatingDrawer",
10897
- "axis": "side",
10898
- "value": "right",
10899
- "required": false,
10900
- "derived": true,
10901
- "isDefault": true,
10902
- "description": ""
10903
- },
10904
- {
10905
- "id": "state:FloatingDrawer:side=left",
10906
- "kind": "state",
10907
- "label": "side=left",
10908
- "component": "FloatingDrawer",
10909
- "axis": "side",
10910
- "value": "left",
10911
- "required": false,
10912
- "derived": true,
10913
- "isDefault": false,
10914
- "description": ""
10915
- },
10916
- {
10917
- "id": "state:FloatingDrawer:side=bottom",
10918
- "kind": "state",
10919
- "label": "side=bottom",
10920
- "component": "FloatingDrawer",
10921
- "axis": "side",
10922
- "value": "bottom",
10923
- "required": false,
10924
- "derived": true,
10925
- "isDefault": false,
10926
- "description": ""
10927
- },
10928
- {
10929
- "id": "state:FloatingDrawer:size=sm",
10930
- "kind": "state",
10931
- "label": "size=sm",
10932
- "component": "FloatingDrawer",
10933
- "axis": "size",
10934
- "value": "sm",
10935
- "required": false,
10936
- "derived": true,
10937
- "isDefault": false,
10938
- "description": ""
10939
- },
10940
- {
10941
- "id": "state:FloatingDrawer:size=md",
10942
- "kind": "state",
10943
- "label": "size=md",
10944
- "component": "FloatingDrawer",
10945
- "axis": "size",
10946
- "value": "md",
10947
- "required": false,
10948
- "derived": true,
10949
- "isDefault": true,
10950
- "description": ""
10951
- },
10952
- {
10953
- "id": "state:FloatingDrawer:size=lg",
10954
- "kind": "state",
10955
- "label": "size=lg",
10956
- "component": "FloatingDrawer",
10957
- "axis": "size",
10958
- "value": "lg",
10959
- "required": false,
10960
- "derived": true,
10961
- "isDefault": false,
10962
- "description": ""
10963
- },
10964
- {
10965
- "id": "state:FloatingDrawer:size=xl",
10966
- "kind": "state",
10967
- "label": "size=xl",
10968
- "component": "FloatingDrawer",
10969
- "axis": "size",
10970
- "value": "xl",
10971
- "required": false,
10972
- "derived": true,
10973
- "isDefault": false,
10974
- "description": ""
10975
- },
10976
11007
  {
10977
11008
  "id": "component:InlineDrawer",
10978
11009
  "kind": "component",
@@ -13971,7 +14002,7 @@
13971
14002
  "family": "Data display",
13972
14003
  "module": "table",
13973
14004
  "showcaseUrl": "https://ads.actioneer.dev/#/table",
13974
- "description": "Use Table for structured tabular data that may need row selection, column sorting, sticky columns, or a paginated footer — not for simple key-value lists. Interactive rows inherit the shared soft neutral hover/focus sink and keep their normal table geometry; do not add a brand tint or hover-only corner rounding. Primary record links stay text-only in every state: never reveal an arrow, chevron, or other directional icon only on hover. Persistent row actions use a final sticky-right column plus elevatedActionColumn so one body-column shadow lifts the action surface instead of repeating on individual cells. The empty matching header cell remains transparent and non-sticky."
14005
+ "description": "Use Table for structured tabular data that may need row selection, column sorting, sticky columns, or a paginated footer — not for simple key-value lists. Every primary body-cell value defaults to text-m (15px / 22px); only clearly secondary metadata inside a cell may opt down to text-s. Interactive rows inherit the shared soft neutral hover/focus sink and keep their normal table geometry; do not add a brand tint or hover-only corner rounding. Primary record links stay text-only in every state: never reveal an arrow, chevron, or other directional icon only on hover. Persistent row actions use a final sticky-right column plus elevatedActionColumn so one body-column shadow lifts the action surface instead of repeating on individual cells. The empty matching header cell remains transparent and non-sticky."
13975
14006
  },
13976
14007
  {
13977
14008
  "id": "component:TableAnswer",
@@ -17403,11 +17434,11 @@
17403
17434
  "rule": "Component motion follows the closest Animate UI interaction pattern, using role-specific presets defined in src/lib/motion.ts and exported from the ADS root barrel. Direct manipulation stays immediate, small CSS feedback stays local, and reduced motion is respected everywhere."
17404
17435
  },
17405
17436
  {
17406
- "id": "principle:icons-hugeicons-stroke",
17437
+ "id": "principle:icons-phosphor-regular",
17407
17438
  "kind": "principle",
17408
- "label": "Icons: Hugeicons, stroke only",
17439
+ "label": "Icons: Phosphor, regular weight (fill for active)",
17409
17440
  "number": 4,
17410
- "rule": "All icons come from Hugeicons in the Stroke Rounded style only. Components import named icons from the @/lib/icons registry — never from an icon package directly — so a free→Pro swap or a restyle touches one file."
17441
+ "rule": "All icons come from Phosphor Icons at the regular weight the stroke-led icon language of ADS. Components import named icons from the @/lib/icons registry — never from an icon package directly — so swapping the underlying set touches one file."
17411
17442
  },
17412
17443
  {
17413
17444
  "id": "principle:shell-owns-the-frame",
@@ -17428,7 +17459,7 @@
17428
17459
  "kind": "principle",
17429
17460
  "label": "ADS-first UI: use the library; extend only when asked",
17430
17461
  "number": 7,
17431
- "rule": "Every UI decision stays synchronized with ADS. Before making a new screen/control/pattern, check the ADS component suite first and use the exact exported name from the public barrel. Do not hand-roll, alias, deep-import, or import external UI libraries."
17462
+ "rule": "Every UI decision stays synchronized with ADS. Search the full catalog before deciding a component is missing, and use the exact exported name from the public barrel. When the barrel genuinely has no primitive, the sanctioned fallback is a shadcn/ui component vendored into src/components/ui through the repo's components.json recipe — never a hand-rolled control and never a UI library imported at a call site."
17432
17463
  },
17433
17464
  {
17434
17465
  "id": "principle:minimal-information",
@@ -18669,48 +18700,6 @@
18669
18700
  "target": "state:DrawerTitle:size=xl",
18670
18701
  "relation": "supports-state"
18671
18702
  },
18672
- {
18673
- "id": "component:FloatingDrawer:supports-state:state:FloatingDrawer:side=right:global",
18674
- "source": "component:FloatingDrawer",
18675
- "target": "state:FloatingDrawer:side=right",
18676
- "relation": "supports-state"
18677
- },
18678
- {
18679
- "id": "component:FloatingDrawer:supports-state:state:FloatingDrawer:side=left:global",
18680
- "source": "component:FloatingDrawer",
18681
- "target": "state:FloatingDrawer:side=left",
18682
- "relation": "supports-state"
18683
- },
18684
- {
18685
- "id": "component:FloatingDrawer:supports-state:state:FloatingDrawer:side=bottom:global",
18686
- "source": "component:FloatingDrawer",
18687
- "target": "state:FloatingDrawer:side=bottom",
18688
- "relation": "supports-state"
18689
- },
18690
- {
18691
- "id": "component:FloatingDrawer:supports-state:state:FloatingDrawer:size=sm:global",
18692
- "source": "component:FloatingDrawer",
18693
- "target": "state:FloatingDrawer:size=sm",
18694
- "relation": "supports-state"
18695
- },
18696
- {
18697
- "id": "component:FloatingDrawer:supports-state:state:FloatingDrawer:size=md:global",
18698
- "source": "component:FloatingDrawer",
18699
- "target": "state:FloatingDrawer:size=md",
18700
- "relation": "supports-state"
18701
- },
18702
- {
18703
- "id": "component:FloatingDrawer:supports-state:state:FloatingDrawer:size=lg:global",
18704
- "source": "component:FloatingDrawer",
18705
- "target": "state:FloatingDrawer:size=lg",
18706
- "relation": "supports-state"
18707
- },
18708
- {
18709
- "id": "component:FloatingDrawer:supports-state:state:FloatingDrawer:size=xl:global",
18710
- "source": "component:FloatingDrawer",
18711
- "target": "state:FloatingDrawer:size=xl",
18712
- "relation": "supports-state"
18713
- },
18714
18703
  {
18715
18704
  "id": "component:InlineDrawer:supports-state:state:InlineDrawer:side=right:global",
18716
18705
  "source": "component:InlineDrawer",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actioneer/ads-mcp",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "ADS MCP server: lets an agent in Claude Code / Cursor discover and import the Actioneer Design System",
5
5
  "type": "module",
6
6
  "bin": {
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@actioneer/ads-lint": "^0.2.0",
27
- "@actioneer/ads-manifest": "^0.2.0"
27
+ "@actioneer/ads-manifest": "^0.3.0"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "@actioneer/ads": "*",
package/src/tools.mjs CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  searchComponents,
9
9
  getComponent,
10
10
  getToken,
11
+ getScale,
11
12
  getPrinciples,
12
13
  getUiGrammar,
13
14
  getDesignGraph,
@@ -50,7 +51,10 @@ export function createTools({ manifest }) {
50
51
  name: "get_token",
51
52
  description:
52
53
  "Get the ADS semantic token(s) for a role or purpose (e.g. 'brand', 'muted-foreground', " +
53
- "'bg-danger', 'primary text'). Reference the returned token/utilities instead of a raw " +
54
+ "'bg-danger', 'primary text'). Also resolves the non-colour scales: type roles " +
55
+ "('body', 'label'), radius steps ('md'), the numbered shadow ladder ('shadow-300'), " +
56
+ "and the named motion presets ('springDialog') with their spring values and purpose. " +
57
+ "Reference the returned token/utilities instead of a raw " +
54
58
  "color literal — ads-lint rejects literals.",
55
59
  inputSchema: {
56
60
  type: "object",
@@ -154,11 +158,34 @@ export function createTools({ manifest }) {
154
158
  },
155
159
 
156
160
  get_token: (args) => {
157
- const tokens = getToken(manifest, args.role ?? "");
158
- if (tokens.length === 0) {
159
- return text(`No ADS token matches "${args.role}". Use a semantic role like 'brand' or 'muted-foreground'.`, true);
160
- }
161
- return json(tokens);
161
+ const raw = args.role ?? "";
162
+ const q = String(raw).trim().toLowerCase().replace(/^(bg|text|border|ring)-/, "");
163
+ const tokens = getToken(manifest, raw);
164
+ const scales = getScale(manifest, raw);
165
+
166
+ // Rank exact matches above fuzzy ones, colour first. getToken's fuzzy pass
167
+ // also searches token DESCRIPTIONS, so without this an exact scale key
168
+ // loses to a colour that merely mentions the word: "body" returned
169
+ // --color-success, whose description reads "...does not clear body-text AA".
170
+ const exactToken = tokens.filter((t) => t.role === q);
171
+ if (exactToken.length > 0) return json(exactToken);
172
+
173
+ const exactScale = scales.filter(
174
+ (s) =>
175
+ String(s.key).toLowerCase() === q ||
176
+ `${s.scale}-${String(s.key)}`.toLowerCase() === q ||
177
+ s.scale.toLowerCase() === q
178
+ );
179
+ if (exactScale.length > 0) return json(exactScale);
180
+
181
+ if (tokens.length > 0) return json(tokens);
182
+ if (scales.length > 0) return json(scales);
183
+ return text(
184
+ `No ADS token or scale matches "${raw}". Try a colour role ('brand', ` +
185
+ `'muted-foreground'), a type role ('body'), a radius step ('md'), a shadow ` +
186
+ `('shadow-300'), or a motion preset ('springDialog').`,
187
+ true
188
+ );
162
189
  },
163
190
 
164
191
  get_principles: (args) => {