@sableui/react 0.13.0 → 0.13.2

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 (87) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +6 -0
  4. package/bin/sable.mjs +23 -4
  5. package/dist/blocks/index.d.ts +1 -1
  6. package/dist/components/accordion/accordion.meta.js +2 -1
  7. package/dist/components/badge/badge.meta.js +2 -1
  8. package/dist/components/banner/banner.meta.js +4 -2
  9. package/dist/components/button-group/button-group.meta.js +2 -1
  10. package/dist/components/checkbox/checkbox.meta.js +2 -1
  11. package/dist/components/collapsible/collapsible.meta.js +2 -1
  12. package/dist/components/combobox/combobox.meta.js +4 -2
  13. package/dist/components/command-menu/command-menu.meta.js +6 -3
  14. package/dist/components/context-card/context-card.meta.js +2 -1
  15. package/dist/components/dialog/dialog.meta.js +6 -3
  16. package/dist/components/disclosure-picker/disclosure-picker.meta.js +2 -1
  17. package/dist/components/inline-status/inline-status.meta.js +2 -1
  18. package/dist/components/menu/menu.meta.js +2 -1
  19. package/dist/components/menubar/menubar.meta.js +2 -1
  20. package/dist/components/meter/meter.meta.js +2 -1
  21. package/dist/components/note/note.meta.js +2 -1
  22. package/dist/components/page-loader/page-loader.meta.js +2 -1
  23. package/dist/components/pill/pill.meta.js +2 -1
  24. package/dist/components/popover/popover.meta.js +4 -2
  25. package/dist/components/progress/progress.meta.js +2 -1
  26. package/dist/components/radio/radio.meta.js +2 -1
  27. package/dist/components/segmented-bar/segmented-bar.meta.js +2 -1
  28. package/dist/components/select/select.meta.js +4 -2
  29. package/dist/components/sheet/sheet.meta.js +4 -2
  30. package/dist/components/side-nav/side-nav.meta.js +2 -1
  31. package/dist/components/skeleton/skeleton.meta.js +2 -1
  32. package/dist/components/spinner/spinner.meta.js +2 -1
  33. package/dist/components/stepper/stepper.meta.js +4 -2
  34. package/dist/components/switch/switch.meta.js +2 -1
  35. package/dist/components/table/table.meta.js +2 -1
  36. package/dist/components/tabs/tabs.meta.js +4 -2
  37. package/dist/components/thinking-orb/thinking-orb.meta.js +4 -2
  38. package/dist/components/toast/toast.meta.js +2 -1
  39. package/dist/components/toggle/toggle.meta.js +2 -1
  40. package/dist/components/toolbar/toolbar.meta.js +2 -1
  41. package/dist/components/tooltip/tooltip.meta.js +2 -1
  42. package/dist/file-hashes.json +41 -41
  43. package/dist/index.d.ts +3 -3
  44. package/dist/index.js +1 -1
  45. package/dist/{meta-DVG8ceze.d.ts → meta-DX5r5wQL.d.ts} +8 -0
  46. package/dist/patterns/index.d.ts +1 -1
  47. package/llms/components/accordion.md +1 -1
  48. package/llms/components/badge.md +1 -1
  49. package/llms/components/banner.md +2 -2
  50. package/llms/components/button-group.md +1 -1
  51. package/llms/components/checkbox.md +1 -1
  52. package/llms/components/collapsible.md +1 -1
  53. package/llms/components/combobox.md +2 -2
  54. package/llms/components/command-menu.md +3 -3
  55. package/llms/components/context-card.md +1 -1
  56. package/llms/components/dialog.md +3 -3
  57. package/llms/components/disclosure-picker.md +1 -1
  58. package/llms/components/inline-status.md +1 -1
  59. package/llms/components/menu.md +1 -1
  60. package/llms/components/menubar.md +1 -1
  61. package/llms/components/meter.md +1 -1
  62. package/llms/components/note.md +1 -1
  63. package/llms/components/page-loader.md +1 -1
  64. package/llms/components/pill.md +1 -1
  65. package/llms/components/popover.md +2 -2
  66. package/llms/components/progress.md +1 -1
  67. package/llms/components/radio.md +1 -1
  68. package/llms/components/segmented-bar.md +1 -1
  69. package/llms/components/select.md +2 -2
  70. package/llms/components/sheet.md +2 -2
  71. package/llms/components/side-nav.md +1 -1
  72. package/llms/components/skeleton.md +1 -1
  73. package/llms/components/spinner.md +1 -1
  74. package/llms/components/stepper.md +2 -2
  75. package/llms/components/switch.md +1 -1
  76. package/llms/components/table.md +1 -1
  77. package/llms/components/tabs.md +2 -2
  78. package/llms/components/thinking-orb.md +2 -2
  79. package/llms/components/toast.md +1 -1
  80. package/llms/components/toggle.md +1 -1
  81. package/llms/components/toolbar.md +1 -1
  82. package/llms/components/tooltip.md +1 -1
  83. package/llms-full.txt +62 -54
  84. package/llms.txt +14 -6
  85. package/package.json +1 -1
  86. package/registry.json +215 -49
  87. package/skills/sable/SKILL.md +13 -4
package/registry.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://sable.design/registry.schema.json",
3
3
  "name": "@sableui/react",
4
- "version": "0.13.0",
4
+ "version": "0.13.2",
5
5
  "description": "Themeable React components, semantic tokens, layout patterns, presets, and package-owned agent skills. Default theme: Sable.",
6
6
  "engine": {
7
7
  "behavior": "@base-ui/react",
@@ -2706,7 +2706,10 @@
2706
2706
  },
2707
2707
  {
2708
2708
  "guidance": "dont",
2709
- "description": "Do not nest an Accordion inside an Accordion. Two layers of roving focus fight each other, and the arrow keys become ambiguous — flatten the hierarchy or use a Tree."
2709
+ "description": "Do not nest an Accordion inside an Accordion. Two layers of roving focus fight each other, and the arrow keys become ambiguous — flatten the hierarchy or use a Tree.",
2710
+ "instead": [
2711
+ "Tree"
2712
+ ]
2710
2713
  }
2711
2714
  ],
2712
2715
  "anatomy": [
@@ -3819,7 +3822,11 @@
3819
3822
  },
3820
3823
  {
3821
3824
  "guidance": "dont",
3822
- "description": "Use a Badge as a button. If it triggers an action, use Button, Toggle, or a menu item."
3825
+ "description": "Use a Badge as a button. If it triggers an action, use Button, Toggle, or a menu item.",
3826
+ "instead": [
3827
+ "Button",
3828
+ "Toggle"
3829
+ ]
3823
3830
  },
3824
3831
  {
3825
3832
  "guidance": "do",
@@ -4047,11 +4054,18 @@
4047
4054
  },
4048
4055
  {
4049
4056
  "guidance": "dont",
4050
- "description": "Use Banner for field-level validation, row status, or small local hints; use Field, InlineStatus, or Badge instead."
4057
+ "description": "Use Banner for field-level validation, row status, or small local hints; use Field, InlineStatus, or Badge instead.",
4058
+ "instead": [
4059
+ "InlineStatus",
4060
+ "Badge"
4061
+ ]
4051
4062
  },
4052
4063
  {
4053
4064
  "guidance": "dont",
4054
- "description": "Use Banner inside a dialog, a form, or a section to qualify the content around it — that is Note. Banner is a full-width announcement strip for page- or app-level state, so in a modal it reads as a slab heavier than the fields it warns about, and its soft appearance has no border and no tone-colored icon: the severity survives only as a faint wash."
4065
+ "description": "Use Banner inside a dialog, a form, or a section to qualify the content around it — that is Note. Banner is a full-width announcement strip for page- or app-level state, so in a modal it reads as a slab heavier than the fields it warns about, and its soft appearance has no border and no tone-colored icon: the severity survives only as a faint wash.",
4066
+ "instead": [
4067
+ "Note"
4068
+ ]
4055
4069
  }
4056
4070
  ],
4057
4071
  "anatomy": [
@@ -5282,7 +5296,10 @@
5282
5296
  },
5283
5297
  {
5284
5298
  "guidance": "dont",
5285
- "description": "Do not use it for a selection that stays on. That is ToggleGroup, which carries the pressed state."
5299
+ "description": "Do not use it for a selection that stays on. That is ToggleGroup, which carries the pressed state.",
5300
+ "instead": [
5301
+ "ToggleGroup"
5302
+ ]
5286
5303
  }
5287
5304
  ]
5288
5305
  },
@@ -6317,7 +6334,11 @@
6317
6334
  },
6318
6335
  {
6319
6336
  "guidance": "dont",
6320
- "description": "Do not use Checkbox for mutually exclusive choices; use Radio or Select instead."
6337
+ "description": "Do not use Checkbox for mutually exclusive choices; use Radio or Select instead.",
6338
+ "instead": [
6339
+ "Radio",
6340
+ "Select"
6341
+ ]
6321
6342
  },
6322
6343
  {
6323
6344
  "guidance": "dont",
@@ -6804,7 +6825,11 @@
6804
6825
  },
6805
6826
  {
6806
6827
  "guidance": "dont",
6807
- "description": "Do not use Collapsible for multi-section navigation; use Accordion or Tabs instead."
6828
+ "description": "Do not use Collapsible for multi-section navigation; use Accordion or Tabs instead.",
6829
+ "instead": [
6830
+ "Accordion",
6831
+ "Tabs"
6832
+ ]
6808
6833
  },
6809
6834
  {
6810
6835
  "guidance": "dont",
@@ -7078,7 +7103,11 @@
7078
7103
  },
7079
7104
  {
7080
7105
  "guidance": "dont",
7081
- "description": "Use Combobox for tiny option sets where Select or Radio would be easier to scan."
7106
+ "description": "Use Combobox for tiny option sets where Select or Radio would be easier to scan.",
7107
+ "instead": [
7108
+ "Select",
7109
+ "Radio"
7110
+ ]
7082
7111
  },
7083
7112
  {
7084
7113
  "guidance": "do",
@@ -7090,7 +7119,10 @@
7090
7119
  },
7091
7120
  {
7092
7121
  "guidance": "dont",
7093
- "description": "Use Combobox as a command launcher. Use CommandMenu for actions and navigation."
7122
+ "description": "Use Combobox as a command launcher. Use CommandMenu for actions and navigation.",
7123
+ "instead": [
7124
+ "CommandMenu"
7125
+ ]
7094
7126
  },
7095
7127
  {
7096
7128
  "guidance": "dont",
@@ -7332,7 +7364,10 @@
7332
7364
  },
7333
7365
  {
7334
7366
  "guidance": "dont",
7335
- "description": "Hand-style a <button> to look like a search field, or put a SearchInput in the header that opens a dialog when focused. The first drifts from the field it imitates; the second is a text box you cannot type in. A header search that opens the palette is CommandMenuTrigger."
7367
+ "description": "Hand-style a <button> to look like a search field, or put a SearchInput in the header that opens a dialog when focused. The first drifts from the field it imitates; the second is a text box you cannot type in. A header search that opens the palette is CommandMenuTrigger.",
7368
+ "instead": [
7369
+ "CommandMenuTrigger"
7370
+ ]
7336
7371
  },
7337
7372
  {
7338
7373
  "guidance": "do",
@@ -7348,7 +7383,12 @@
7348
7383
  },
7349
7384
  {
7350
7385
  "guidance": "dont",
7351
- "description": "Use CommandMenu as a replacement for every dropdown. Simple choices belong in Select, Menu, or Tabs."
7386
+ "description": "Use CommandMenu as a replacement for every dropdown. Simple choices belong in Select, Menu, or Tabs.",
7387
+ "instead": [
7388
+ "Select",
7389
+ "Menu",
7390
+ "Tabs"
7391
+ ]
7352
7392
  },
7353
7393
  {
7354
7394
  "guidance": "do",
@@ -7368,7 +7408,10 @@
7368
7408
  },
7369
7409
  {
7370
7410
  "guidance": "dont",
7371
- "description": "Hand-build a palette mock from a search glyph, a row of buttons and a highlight. That is CommandMenuPanel, and the hand-built one has no combobox, no filtering and no keyboard model."
7411
+ "description": "Hand-build a palette mock from a search glyph, a row of buttons and a highlight. That is CommandMenuPanel, and the hand-built one has no combobox, no filtering and no keyboard model.",
7412
+ "instead": [
7413
+ "CommandMenuPanel"
7414
+ ]
7372
7415
  },
7373
7416
  {
7374
7417
  "guidance": "dont",
@@ -7625,7 +7668,10 @@
7625
7668
  },
7626
7669
  {
7627
7670
  "guidance": "dont",
7628
- "description": "Do not open it on click. It is a hover/focus preview; making it click-triggered gives you a Popover with no dismiss affordance and no way to reach the content it previews."
7671
+ "description": "Do not open it on click. It is a hover/focus preview; making it click-triggered gives you a Popover with no dismiss affordance and no way to reach the content it previews.",
7672
+ "instead": [
7673
+ "Popover"
7674
+ ]
7629
7675
  }
7630
7676
  ],
7631
7677
  "anatomy": [
@@ -8504,7 +8550,10 @@
8504
8550
  },
8505
8551
  {
8506
8552
  "guidance": "dont",
8507
- "description": "Put large multipage workflows in a centered dialog. Use Sheet or a page route when the task needs space."
8553
+ "description": "Put large multipage workflows in a centered dialog. Use Sheet or a page route when the task needs space.",
8554
+ "instead": [
8555
+ "Sheet"
8556
+ ]
8508
8557
  },
8509
8558
  {
8510
8559
  "guidance": "do",
@@ -8512,7 +8561,10 @@
8512
8561
  },
8513
8562
  {
8514
8563
  "guidance": "dont",
8515
- "description": "Use size=\"fullscreen\" for forms, confirmations, or anything that isn't media. A dialog that happens to need room is a Sheet or a page; the fullscreen affordances (dark scrim, corner close, centred content) all assume something to look at."
8564
+ "description": "Use size=\"fullscreen\" for forms, confirmations, or anything that isn't media. A dialog that happens to need room is a Sheet or a page; the fullscreen affordances (dark scrim, corner close, centred content) all assume something to look at.",
8565
+ "instead": [
8566
+ "Sheet"
8567
+ ]
8516
8568
  },
8517
8569
  {
8518
8570
  "guidance": "dont",
@@ -8520,7 +8572,12 @@
8520
8572
  },
8521
8573
  {
8522
8574
  "guidance": "dont",
8523
- "description": "Open a dialog for passive status updates. Use Toast, Banner, or InlineStatus instead."
8575
+ "description": "Open a dialog for passive status updates. Use Toast, Banner, or InlineStatus instead.",
8576
+ "instead": [
8577
+ "Toast",
8578
+ "Banner",
8579
+ "InlineStatus"
8580
+ ]
8524
8581
  },
8525
8582
  {
8526
8583
  "guidance": "do",
@@ -8770,7 +8827,10 @@
8770
8827
  },
8771
8828
  {
8772
8829
  "guidance": "dont",
8773
- "description": "Use it in a page-register form. A form field that pushes the form down on open reads as a layout jump; that is Select's job."
8830
+ "description": "Use it in a page-register form. A form field that pushes the form down on open reads as a layout jump; that is Select's job.",
8831
+ "instead": [
8832
+ "Select"
8833
+ ]
8774
8834
  },
8775
8835
  {
8776
8836
  "guidance": "dont",
@@ -10424,7 +10484,10 @@
10424
10484
  },
10425
10485
  {
10426
10486
  "guidance": "dont",
10427
- "description": "Do not use InlineStatus for global announcements or page-level alerts."
10487
+ "description": "Do not use InlineStatus for global announcements or page-level alerts.",
10488
+ "instead": [
10489
+ "Banner"
10490
+ ]
10428
10491
  },
10429
10492
  {
10430
10493
  "guidance": "dont",
@@ -11966,7 +12029,10 @@
11966
12029
  },
11967
12030
  {
11968
12031
  "guidance": "dont",
11969
- "description": "Do not build a Select out of it. A menu fires actions and has no value; a Select holds one and reports changes. Swapping them loses form semantics and keyboard type-ahead."
12032
+ "description": "Do not build a Select out of it. A menu fires actions and has no value; a Select holds one and reports changes. Swapping them loses form semantics and keyboard type-ahead.",
12033
+ "instead": [
12034
+ "Select"
12035
+ ]
11970
12036
  },
11971
12037
  {
11972
12038
  "guidance": "do",
@@ -12162,7 +12228,10 @@
12162
12228
  },
12163
12229
  {
12164
12230
  "guidance": "dont",
12165
- "description": "Do not use a menubar for site navigation. Its items are commands in menus (role=menuitem), not links between pages."
12231
+ "description": "Do not use a menubar for site navigation. Its items are commands in menus (role=menuitem), not links between pages.",
12232
+ "instead": [
12233
+ "NavigationMenu"
12234
+ ]
12166
12235
  }
12167
12236
  ],
12168
12237
  "anatomy": [
@@ -12654,7 +12723,10 @@
12654
12723
  },
12655
12724
  {
12656
12725
  "guidance": "dont",
12657
- "description": "Do not use Meter for a task in flight — an upload, an install, a step count. That is Progress; Meter tells assistive tech nothing is happening."
12726
+ "description": "Do not use Meter for a task in flight — an upload, an install, a step count. That is Progress; Meter tells assistive tech nothing is happening.",
12727
+ "instead": [
12728
+ "Progress"
12729
+ ]
12658
12730
  },
12659
12731
  {
12660
12732
  "guidance": "dont",
@@ -13169,7 +13241,10 @@
13169
13241
  },
13170
13242
  {
13171
13243
  "guidance": "dont",
13172
- "description": "Do not use Note for state the whole page or app is in (an outage, an offline session, a blocked account) — that is Banner — or for a message tied to one field, which is the field's own error text."
13244
+ "description": "Do not use Note for state the whole page or app is in (an outage, an offline session, a blocked account) — that is Banner — or for a message tied to one field, which is the field's own error text.",
13245
+ "instead": [
13246
+ "Banner"
13247
+ ]
13173
13248
  },
13174
13249
  {
13175
13250
  "guidance": "dont",
@@ -13936,7 +14011,12 @@
13936
14011
  },
13937
14012
  {
13938
14013
  "guidance": "dont",
13939
- "description": "Do not use PageLoader for small inline waits; use Spinner, an indeterminate Progress, or Skeleton."
14014
+ "description": "Do not use PageLoader for small inline waits; use Spinner, an indeterminate Progress, or Skeleton.",
14015
+ "instead": [
14016
+ "Spinner",
14017
+ "Progress",
14018
+ "Skeleton"
14019
+ ]
13940
14020
  },
13941
14021
  {
13942
14022
  "guidance": "dont",
@@ -14768,7 +14848,10 @@
14768
14848
  },
14769
14849
  {
14770
14850
  "guidance": "dont",
14771
- "description": "Do not use Pill as a static label. A pressable-looking chip that does nothing is the most common cause of dead clicks in a filter row — that is a Badge."
14851
+ "description": "Do not use Pill as a static label. A pressable-looking chip that does nothing is the most common cause of dead clicks in a filter row — that is a Badge.",
14852
+ "instead": [
14853
+ "Badge"
14854
+ ]
14772
14855
  },
14773
14856
  {
14774
14857
  "guidance": "dont",
@@ -14913,11 +14996,17 @@
14913
14996
  },
14914
14997
  {
14915
14998
  "guidance": "dont",
14916
- "description": "Do not use Popover for blocking confirmations, long forms, or critical information."
14999
+ "description": "Do not use Popover for blocking confirmations, long forms, or critical information.",
15000
+ "instead": [
15001
+ "Dialog"
15002
+ ]
14917
15003
  },
14918
15004
  {
14919
15005
  "guidance": "dont",
14920
- "description": "Do not put a form that can fail validation inside one. A popover dismisses on outside click, which discards what the user typed with no warning — that is a Dialog."
15006
+ "description": "Do not put a form that can fail validation inside one. A popover dismisses on outside click, which discards what the user typed with no warning — that is a Dialog.",
15007
+ "instead": [
15008
+ "Dialog"
15009
+ ]
14921
15010
  }
14922
15011
  ],
14923
15012
  "anatomy": [
@@ -15054,7 +15143,10 @@
15054
15143
  },
15055
15144
  {
15056
15145
  "guidance": "dont",
15057
- "description": "Do not use a determinate Progress for an unknown duration. A bar that sits at 90% is worse than a Spinner, because it makes a promise about time that you cannot keep."
15146
+ "description": "Do not use a determinate Progress for an unknown duration. A bar that sits at 90% is worse than a Spinner, because it makes a promise about time that you cannot keep.",
15147
+ "instead": [
15148
+ "Spinner"
15149
+ ]
15058
15150
  }
15059
15151
  ],
15060
15152
  "anatomy": [
@@ -15654,7 +15746,11 @@
15654
15746
  },
15655
15747
  {
15656
15748
  "guidance": "dont",
15657
- "description": "Do not use Radio for independent toggles or multiple selection; use Checkbox or Switch."
15749
+ "description": "Do not use Radio for independent toggles or multiple selection; use Checkbox or Switch.",
15750
+ "instead": [
15751
+ "Checkbox",
15752
+ "Switch"
15753
+ ]
15658
15754
  },
15659
15755
  {
15660
15756
  "guidance": "dont",
@@ -16611,7 +16707,10 @@
16611
16707
  },
16612
16708
  {
16613
16709
  "guidance": "dont",
16614
- "description": "Use it for a single value against a limit; that is Meter, which carries the meter role and its value."
16710
+ "description": "Use it for a single value against a limit; that is Meter, which carries the meter role and its value.",
16711
+ "instead": [
16712
+ "Meter"
16713
+ ]
16615
16714
  },
16616
16715
  {
16617
16716
  "guidance": "dont",
@@ -16772,11 +16871,18 @@
16772
16871
  },
16773
16872
  {
16774
16873
  "guidance": "dont",
16775
- "description": "Use Select for very large or fuzzy lists. Use Combobox when typing is the primary way to find an option."
16874
+ "description": "Use Select for very large or fuzzy lists. Use Combobox when typing is the primary way to find an option.",
16875
+ "instead": [
16876
+ "Combobox"
16877
+ ]
16776
16878
  },
16777
16879
  {
16778
16880
  "guidance": "dont",
16779
- "description": "Use Select for binary on/off settings. Use Switch or Checkbox instead."
16881
+ "description": "Use Select for binary on/off settings. Use Switch or Checkbox instead.",
16882
+ "instead": [
16883
+ "Switch",
16884
+ "Checkbox"
16885
+ ]
16780
16886
  },
16781
16887
  {
16782
16888
  "guidance": "do",
@@ -17257,11 +17363,17 @@
17257
17363
  },
17258
17364
  {
17259
17365
  "guidance": "dont",
17260
- "description": "Do not use Sheet for simple confirmations or deeply nested workflows."
17366
+ "description": "Do not use Sheet for simple confirmations or deeply nested workflows.",
17367
+ "instead": [
17368
+ "Dialog"
17369
+ ]
17261
17370
  },
17262
17371
  {
17263
17372
  "guidance": "dont",
17264
- "description": "Do not use it on desktop where a Dialog fits. A sheet's affordance is edge-anchored travel for thumb reach; on a wide viewport it becomes a dialog that arrives from the wrong place."
17373
+ "description": "Do not use it on desktop where a Dialog fits. A sheet's affordance is edge-anchored travel for thumb reach; on a wide viewport it becomes a dialog that arrives from the wrong place.",
17374
+ "instead": [
17375
+ "Dialog"
17376
+ ]
17265
17377
  }
17266
17378
  ],
17267
17379
  "anatomy": [
@@ -17701,7 +17813,10 @@
17701
17813
  },
17702
17814
  {
17703
17815
  "guidance": "dont",
17704
- "description": "Use SideNav for bottom mobile navigation; use BottomNav in AppShell's bottomNav slot."
17816
+ "description": "Use SideNav for bottom mobile navigation; use BottomNav in AppShell's bottomNav slot.",
17817
+ "instead": [
17818
+ "BottomNav"
17819
+ ]
17705
17820
  },
17706
17821
  {
17707
17822
  "guidance": "dont",
@@ -17841,7 +17956,10 @@
17841
17956
  },
17842
17957
  {
17843
17958
  "guidance": "dont",
17844
- "description": "Do not leave Skeleton visible after an error or empty state; switch to EmptyState (tone='destructive' for an error)."
17959
+ "description": "Do not leave Skeleton visible after an error or empty state; switch to EmptyState (tone='destructive' for an error).",
17960
+ "instead": [
17961
+ "EmptyState"
17962
+ ]
17845
17963
  },
17846
17964
  {
17847
17965
  "guidance": "dont",
@@ -18306,7 +18424,11 @@
18306
18424
  },
18307
18425
  {
18308
18426
  "guidance": "dont",
18309
- "description": "Do not use Spinner as the only content for long waits or full page loading."
18427
+ "description": "Do not use Spinner as the only content for long waits or full page loading.",
18428
+ "instead": [
18429
+ "Skeleton",
18430
+ "PageLoader"
18431
+ ]
18310
18432
  },
18311
18433
  {
18312
18434
  "guidance": "dont",
@@ -18697,11 +18819,17 @@
18697
18819
  },
18698
18820
  {
18699
18821
  "guidance": "dont",
18700
- "description": "Do not use Stepper for a task with unknown length or for a percentage. That is Progress; a stepper promises a fixed set of named stops."
18822
+ "description": "Do not use Stepper for a task with unknown length or for a percentage. That is Progress; a stepper promises a fixed set of named stops.",
18823
+ "instead": [
18824
+ "Progress"
18825
+ ]
18701
18826
  },
18702
18827
  {
18703
18828
  "guidance": "dont",
18704
- "description": "Do not use it as navigation between independent sections. Sections the user can visit in any order are Tabs; a stepper implies each step depends on the one before."
18829
+ "description": "Do not use it as navigation between independent sections. Sections the user can visit in any order are Tabs; a stepper implies each step depends on the one before.",
18830
+ "instead": [
18831
+ "Tabs"
18832
+ ]
18705
18833
  },
18706
18834
  {
18707
18835
  "guidance": "dont",
@@ -19042,7 +19170,11 @@
19042
19170
  },
19043
19171
  {
19044
19172
  "guidance": "dont",
19045
- "description": "Do not use Switch for one-time agreement, multi-select choices, or submit-only booleans."
19173
+ "description": "Do not use Switch for one-time agreement, multi-select choices, or submit-only booleans.",
19174
+ "instead": [
19175
+ "Checkbox",
19176
+ "Radio"
19177
+ ]
19046
19178
  },
19047
19179
  {
19048
19180
  "guidance": "dont",
@@ -19197,7 +19329,11 @@
19197
19329
  },
19198
19330
  {
19199
19331
  "guidance": "dont",
19200
- "description": "Use Table for heterogeneous items with no stable columns. Use Card, Entity, or a list composition instead."
19332
+ "description": "Use Table for heterogeneous items with no stable columns. Use Card, Entity, or a list composition instead.",
19333
+ "instead": [
19334
+ "Card",
19335
+ "Entity"
19336
+ ]
19201
19337
  },
19202
19338
  {
19203
19339
  "guidance": "dont",
@@ -19347,11 +19483,18 @@
19347
19483
  },
19348
19484
  {
19349
19485
  "guidance": "dont",
19350
- "description": "Do not use Tabs for unrelated pages or primary navigation that needs distinct URLs."
19486
+ "description": "Do not use Tabs for unrelated pages or primary navigation that needs distinct URLs.",
19487
+ "instead": [
19488
+ "SideNav",
19489
+ "NavigationMenu"
19490
+ ]
19351
19491
  },
19352
19492
  {
19353
19493
  "guidance": "dont",
19354
- "description": "Do not use tabs for sequential steps. Tabs are peer views the user returns to in any order; a process with an order needs a stepper, or the user will skip ahead."
19494
+ "description": "Do not use tabs for sequential steps. Tabs are peer views the user returns to in any order; a process with an order needs a stepper, or the user will skip ahead.",
19495
+ "instead": [
19496
+ "Stepper"
19497
+ ]
19355
19498
  }
19356
19499
  ],
19357
19500
  "anatomy": [
@@ -19863,11 +20006,18 @@
19863
20006
  },
19864
20007
  {
19865
20008
  "guidance": "dont",
19866
- "description": "Do not put one on every row of a list or in a repeated skeleton. Each orb runs its own animation frame loop painting hundreds of arcs; use Skeleton for content-shaped waits and Spinner inside buttons."
20009
+ "description": "Do not put one on every row of a list or in a repeated skeleton. Each orb runs its own animation frame loop painting hundreds of arcs; use Skeleton for content-shaped waits and Spinner inside buttons.",
20010
+ "instead": [
20011
+ "Skeleton",
20012
+ "Spinner"
20013
+ ]
19867
20014
  },
19868
20015
  {
19869
20016
  "guidance": "dont",
19870
- "description": "Do not use it for a determinate wait. It carries no sense of how far along anything is — reach for Progress when a percentage exists."
20017
+ "description": "Do not use it for a determinate wait. It carries no sense of how far along anything is — reach for Progress when a percentage exists.",
20018
+ "instead": [
20019
+ "Progress"
20020
+ ]
19871
20021
  },
19872
20022
  {
19873
20023
  "guidance": "dont",
@@ -20023,7 +20173,11 @@
20023
20173
  },
20024
20174
  {
20025
20175
  "guidance": "dont",
20026
- "description": "Use Toast for critical blockers or persistent outages. Use Banner or Dialog when the user must notice and act."
20176
+ "description": "Use Toast for critical blockers or persistent outages. Use Banner or Dialog when the user must notice and act.",
20177
+ "instead": [
20178
+ "Banner",
20179
+ "Dialog"
20180
+ ]
20027
20181
  },
20028
20182
  {
20029
20183
  "guidance": "dont",
@@ -20295,7 +20449,10 @@
20295
20449
  },
20296
20450
  {
20297
20451
  "guidance": "dont",
20298
- "description": "Do not use Toggle for persistent application settings; use Switch."
20452
+ "description": "Do not use Toggle for persistent application settings; use Switch.",
20453
+ "instead": [
20454
+ "Switch"
20455
+ ]
20299
20456
  },
20300
20457
  {
20301
20458
  "guidance": "dont",
@@ -20450,7 +20607,12 @@
20450
20607
  },
20451
20608
  {
20452
20609
  "guidance": "dont",
20453
- "description": "Use Toolbar for navigation between pages or views. Links that go somewhere are Tabs, SideNav or Breadcrumbs; ToolbarLink is for the odd link that sits among actions, like Help."
20610
+ "description": "Use Toolbar for navigation between pages or views. Links that go somewhere are Tabs, SideNav or Breadcrumbs; ToolbarLink is for the odd link that sits among actions, like Help.",
20611
+ "instead": [
20612
+ "Tabs",
20613
+ "SideNav",
20614
+ "Breadcrumbs"
20615
+ ]
20454
20616
  },
20455
20617
  {
20456
20618
  "guidance": "dont",
@@ -20679,7 +20841,11 @@
20679
20841
  },
20680
20842
  {
20681
20843
  "guidance": "dont",
20682
- "description": "Do not put critical instructions, errors, or interactive content inside Tooltip."
20844
+ "description": "Do not put critical instructions, errors, or interactive content inside Tooltip.",
20845
+ "instead": [
20846
+ "Popover",
20847
+ "InlineStatus"
20848
+ ]
20683
20849
  },
20684
20850
  {
20685
20851
  "guidance": "dont",
@@ -110,11 +110,18 @@ The registry's parent is the package root; read its `AGENTS.md` (`sable docs AGE
110
110
  `packages/sable/registry.json`. Below, `sable` means this resolved CLI invoked with
111
111
  the target project as its working directory. Never fetch an unrelated public
112
112
  package with bare `npx sable`, or invent shell `build`, `inspire`, or `audit` commands.
113
+ If the session also has Sable's MCP tools (`search`, `get`, `docs` from
114
+ sableui.com/api/mcp), they serve the same contract. Use them only until the
115
+ package is installed, then use the CLI.
113
116
 
114
117
  If Sable is absent, read the trusted repository or package README's install recipe
115
118
  and registry `consume` block. Install from npm with the project's package
116
119
  manager, for example `pnpm add @sableui/react`; no registry setup or token is
117
- needed. Do not substitute an unrelated package with a similar name.
120
+ needed. Do not substitute an unrelated package with a similar name. Then run
121
+ `sable init` from the app root: it installs what is missing, wires the bundler,
122
+ CSS, fonts and `IconProvider`, installs these skill entries, and runs `sable
123
+ doctor`. Apply any snippet it prints for a file it could not change safely (a
124
+ Next.js layout, an unfamiliar config). `--dry-run` previews every change.
118
125
 
119
126
  A project that already has a router, data layer or form library keeps it: Sable
120
127
  depends on none, and its links, menus and nav take any router's link through
@@ -125,7 +132,9 @@ for server data, **TanStack Form** when a form needs validation logic, and
125
132
  tables-with-tanstack`). Say so in the brief, and use something else only when the
126
133
  user or the product asks for it.
127
134
 
128
- Complete setup before implementing UI:
135
+ Complete setup before implementing UI. `sable init` covers these on a fresh
136
+ install and `sable doctor --fix` on an app that is already wired; confirm each
137
+ rather than redoing it:
129
138
 
130
139
  - Match the installed package's React, React DOM, Tailwind, and Node requirements.
131
140
  - Dedupe React in the bundler. Import Tailwind, then Sable's stylesheet; add the
@@ -140,8 +149,8 @@ Complete setup before implementing UI:
140
149
  - Run `sable doctor`, repair wiring issues, and verify the app renders a real
141
150
  Sable component. Reuse an existing app server; never start duplicate instances.
142
151
 
143
- Run `sable setup --agent` once from the project root to install discoverable entry
144
- files for Codex/Cursor and Claude Code. `--target codex|claude|cursor|all` selects
152
+ `sable init` installs the discoverable entry files for Codex/Cursor and Claude
153
+ Code; in an app wired by hand, run `sable setup --agent` once from the project root. `--target codex|claude|cursor|all` selects
145
154
  hosts. For Claude Code, setup also prints a Stop hook that runs `sable check`
146
155
  before a task can end; it writes that hook to `.claude/settings.json` only with
147
156
  `--hook`, so add it only when the user wants it. The hook is one plain command