@estiva-app/ui 0.35.2 → 0.36.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.
Files changed (123) hide show
  1. package/dist/eslint/escape.d.ts +23 -6
  2. package/dist/eslint/escape.d.ts.map +1 -1
  3. package/dist/eslint/index.js +70 -9
  4. package/dist/eslint/index.js.map +2 -2
  5. package/dist/eslint/no-raw-element.d.ts +7 -0
  6. package/dist/eslint/no-raw-element.d.ts.map +1 -1
  7. package/dist/eslint/no-restyled-part.d.ts +8 -0
  8. package/dist/eslint/no-restyled-part.d.ts.map +1 -1
  9. package/dist/gates/app-checks.d.ts.map +1 -1
  10. package/dist/gates/{chunk-DRIHHXQK.js → chunk-CC6L4B5U.js} +23 -17
  11. package/dist/gates/chunk-CC6L4B5U.js.map +7 -0
  12. package/dist/gates/chunk-SYVKGOWM.js +1131 -0
  13. package/dist/gates/chunk-SYVKGOWM.js.map +7 -0
  14. package/dist/gates/ci.d.ts +18 -0
  15. package/dist/gates/ci.d.ts.map +1 -0
  16. package/dist/gates/cli.js +20 -3
  17. package/dist/gates/cli.js.map +2 -2
  18. package/dist/gates/create-app.d.ts.map +1 -1
  19. package/dist/gates/create-app.js +1 -1
  20. package/dist/gates/escapes.d.ts +23 -0
  21. package/dist/gates/escapes.d.ts.map +1 -0
  22. package/dist/gates/gate-config.d.ts.map +1 -1
  23. package/dist/gates/hook.d.ts +2 -0
  24. package/dist/gates/hook.d.ts.map +1 -1
  25. package/dist/gates/index.d.ts +5 -1
  26. package/dist/gates/index.d.ts.map +1 -1
  27. package/dist/gates/index.js +37 -183
  28. package/dist/gates/index.js.map +4 -4
  29. package/dist/gates/name-escapes.d.ts +14 -0
  30. package/dist/gates/name-escapes.d.ts.map +1 -0
  31. package/dist/gates/status.d.ts +3 -1
  32. package/dist/gates/status.d.ts.map +1 -1
  33. package/dist/gates/token-lint.d.ts.map +1 -1
  34. package/dist/gates/token-style.d.ts +21 -0
  35. package/dist/gates/token-style.d.ts.map +1 -0
  36. package/dist/index.js +13 -13
  37. package/dist/index.js.map +1 -1
  38. package/dist/registry/{app-3ALZE6XO.js → app-YMABQII6.js} +3 -3
  39. package/dist/registry/app.d.ts.map +1 -1
  40. package/dist/registry/behaviours.d.ts +71 -0
  41. package/dist/registry/behaviours.d.ts.map +1 -0
  42. package/dist/registry/{build-NDXMVFQ5.js → build-3EANARLQ.js} +2 -2
  43. package/dist/registry/build.d.ts.map +1 -1
  44. package/dist/registry/{chunk-3WJ7ZZ7Z.js → chunk-EVJW26UR.js} +51 -4
  45. package/dist/registry/chunk-EVJW26UR.js.map +7 -0
  46. package/dist/registry/{chunk-XVII7P6G.js → chunk-SIB44CES.js} +276 -90
  47. package/dist/registry/chunk-SIB44CES.js.map +7 -0
  48. package/dist/registry/{chunk-5K2TRR4X.js → chunk-XK747STJ.js} +18 -3
  49. package/dist/registry/chunk-XK747STJ.js.map +7 -0
  50. package/dist/registry/cli.js +7 -6
  51. package/dist/registry/cli.js.map +2 -2
  52. package/dist/registry/contract.d.ts +13 -1
  53. package/dist/registry/contract.d.ts.map +1 -1
  54. package/dist/registry/index.d.ts +1 -1
  55. package/dist/registry/index.d.ts.map +1 -1
  56. package/dist/registry/index.js +11 -5
  57. package/package.json +4 -1
  58. package/registry.json +293 -17
  59. package/skill/estiva-ui.md +2 -1
  60. package/src/AppShell.mdx +2 -1
  61. package/src/AttachmentCard.tsx +7 -7
  62. package/src/Button.tsx +1 -1
  63. package/src/Card.tsx +2 -2
  64. package/src/ChipInput.mdx +2 -0
  65. package/src/ChipInput.tsx +1 -1
  66. package/src/CommandPalette.tsx +3 -3
  67. package/src/DialogShell.tsx +1 -1
  68. package/src/EmptyState.mdx +4 -3
  69. package/src/Lightbox.tsx +1 -1
  70. package/src/NavItem.tsx +1 -1
  71. package/src/PersonTrigger.tsx +1 -1
  72. package/src/Reaction.tsx +1 -1
  73. package/src/ScrollArea.mdx +4 -0
  74. package/src/Select.tsx +1 -1
  75. package/src/TopBar.mdx +1 -1
  76. package/src/eslint/escape.ts +43 -14
  77. package/src/eslint/has-a-page-and-a-story.test.ts +1 -1
  78. package/src/eslint/index.test.ts +2 -2
  79. package/src/eslint/no-copied-look.test.ts +1 -1
  80. package/src/eslint/no-hand-rolled-behaviour.test.ts +3 -3
  81. package/src/eslint/no-handmade-empty-state.test.ts +2 -2
  82. package/src/eslint/no-handmade-header.test.ts +2 -2
  83. package/src/eslint/no-native-title.test.ts +2 -2
  84. package/src/eslint/no-raw-element.test.ts +47 -15
  85. package/src/eslint/no-raw-element.ts +53 -3
  86. package/src/eslint/no-rebuilt-behaviour.test.ts +9 -9
  87. package/src/eslint/no-restyled-part.test.ts +21 -2
  88. package/src/eslint/no-restyled-part.ts +30 -0
  89. package/src/eslint/raw-element-outside-a-wrapper.test.ts +3 -3
  90. package/src/gates/app-checks.ts +4 -3
  91. package/src/gates/ci.ts +152 -0
  92. package/src/gates/cli.ts +19 -3
  93. package/src/gates/count.ts +1 -1
  94. package/src/gates/create-app.test.ts +2 -2
  95. package/src/gates/create-app.ts +22 -16
  96. package/src/gates/escapes.ts +111 -0
  97. package/src/gates/gate-config.ts +2 -0
  98. package/src/gates/gates.test.ts +86 -1
  99. package/src/gates/hook.ts +38 -4
  100. package/src/gates/index.ts +5 -1
  101. package/src/gates/name-escapes.ts +77 -0
  102. package/src/gates/status.ts +45 -2
  103. package/src/gates/token-lint.ts +11 -4
  104. package/src/gates/token-style.ts +79 -0
  105. package/src/how.test.ts +282 -0
  106. package/src/pages.test.ts +6 -0
  107. package/src/registry/app.test.ts +34 -0
  108. package/src/registry/app.ts +52 -2
  109. package/src/registry/behaviours.ts +223 -0
  110. package/src/registry/build.ts +36 -0
  111. package/src/registry/cli.ts +5 -3
  112. package/src/registry/contract.test.ts +27 -2
  113. package/src/registry/contract.ts +28 -3
  114. package/src/registry/index.ts +1 -1
  115. package/src/registry/registry.test.ts +14 -0
  116. package/dist/gates/chunk-DBMUQAR6.js +0 -607
  117. package/dist/gates/chunk-DBMUQAR6.js.map +0 -7
  118. package/dist/gates/chunk-DRIHHXQK.js.map +0 -7
  119. package/dist/registry/chunk-3WJ7ZZ7Z.js.map +0 -7
  120. package/dist/registry/chunk-5K2TRR4X.js.map +0 -7
  121. package/dist/registry/chunk-XVII7P6G.js.map +0 -7
  122. /package/dist/registry/{app-3ALZE6XO.js.map → app-YMABQII6.js.map} +0 -0
  123. /package/dist/registry/{build-NDXMVFQ5.js.map → build-3EANARLQ.js.map} +0 -0
package/registry.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "kind": "package",
5
5
  "repo": "estiva-ui",
6
6
  "package": "@estiva-app/ui",
7
- "packageVersion": "0.35.2",
7
+ "packageVersion": "0.36.0",
8
8
  "exports": 87,
9
9
  "typeExports": 96,
10
10
  "files": null
@@ -218,7 +218,20 @@
218
218
  ]
219
219
  }
220
220
  ],
221
- "ownsBehaviours": [],
221
+ "ownsBehaviours": [
222
+ {
223
+ "id": "base-ui",
224
+ "behaviour": "Is built on Base UI"
225
+ },
226
+ {
227
+ "id": "role",
228
+ "behaviour": "Says what it is to assistive technology"
229
+ },
230
+ {
231
+ "id": "tab-stop",
232
+ "behaviour": "Is reachable with Tab"
233
+ }
234
+ ],
222
235
  "status": "stable",
223
236
  "migrationStage": null,
224
237
  "docsId": "components-attachmentcard--docs",
@@ -728,6 +741,10 @@
728
741
  {
729
742
  "id": "role",
730
743
  "behaviour": "Says what it is to assistive technology"
744
+ },
745
+ {
746
+ "id": "tab-stop",
747
+ "behaviour": "Is reachable with Tab"
731
748
  }
732
749
  ],
733
750
  "status": "stable",
@@ -902,6 +919,22 @@
902
919
  "id": "portal",
903
920
  "behaviour": "Floats on top of the page"
904
921
  },
922
+ {
923
+ "id": "press-outside",
924
+ "behaviour": "Closes on a press outside"
925
+ },
926
+ {
927
+ "id": "page-keys",
928
+ "behaviour": "Takes its keys by itself"
929
+ },
930
+ {
931
+ "id": "focus",
932
+ "behaviour": "Holds focus inside while open, and gives it back"
933
+ },
934
+ {
935
+ "id": "follow",
936
+ "behaviour": "Stays attached to its anchor on scroll and resize"
937
+ },
905
938
  {
906
939
  "id": "walking",
907
940
  "behaviour": "Moves through its items with the arrow keys"
@@ -1100,10 +1133,22 @@
1100
1133
  "id": "portal",
1101
1134
  "behaviour": "Floats on top of the page"
1102
1135
  },
1136
+ {
1137
+ "id": "press-outside",
1138
+ "behaviour": "Closes on a press outside"
1139
+ },
1140
+ {
1141
+ "id": "page-keys",
1142
+ "behaviour": "Takes its keys by itself"
1143
+ },
1103
1144
  {
1104
1145
  "id": "focus",
1105
1146
  "behaviour": "Holds focus inside while open, and gives it back"
1106
1147
  },
1148
+ {
1149
+ "id": "scroll-lock",
1150
+ "behaviour": "Stops the page behind it scrolling"
1151
+ },
1107
1152
  {
1108
1153
  "id": "walking",
1109
1154
  "behaviour": "Moves through its items with the arrow keys"
@@ -1316,7 +1361,20 @@
1316
1361
  }
1317
1362
  ],
1318
1363
  "variants": [],
1319
- "ownsBehaviours": [],
1364
+ "ownsBehaviours": [
1365
+ {
1366
+ "id": "base-ui",
1367
+ "behaviour": "Is built on Base UI"
1368
+ },
1369
+ {
1370
+ "id": "portal",
1371
+ "behaviour": "Floats on top of the page"
1372
+ },
1373
+ {
1374
+ "id": "walking",
1375
+ "behaviour": "Moves through its items with the arrow keys"
1376
+ }
1377
+ ],
1320
1378
  "status": "stable",
1321
1379
  "migrationStage": null,
1322
1380
  "docsId": "overlays-commandpalette--docs",
@@ -1415,6 +1473,22 @@
1415
1473
  "id": "portal",
1416
1474
  "behaviour": "Floats on top of the page"
1417
1475
  },
1476
+ {
1477
+ "id": "press-outside",
1478
+ "behaviour": "Closes on a press outside"
1479
+ },
1480
+ {
1481
+ "id": "page-keys",
1482
+ "behaviour": "Takes its keys by itself"
1483
+ },
1484
+ {
1485
+ "id": "focus",
1486
+ "behaviour": "Holds focus inside while open, and gives it back"
1487
+ },
1488
+ {
1489
+ "id": "scroll-lock",
1490
+ "behaviour": "Stops the page behind it scrolling"
1491
+ },
1418
1492
  {
1419
1493
  "id": "role",
1420
1494
  "behaviour": "Says what it is to assistive technology"
@@ -1710,7 +1784,12 @@
1710
1784
  }
1711
1785
  ],
1712
1786
  "variants": [],
1713
- "ownsBehaviours": [],
1787
+ "ownsBehaviours": [
1788
+ {
1789
+ "id": "base-ui",
1790
+ "behaviour": "Is built on Base UI"
1791
+ }
1792
+ ],
1714
1793
  "status": "stable",
1715
1794
  "migrationStage": null,
1716
1795
  "docsId": "inputs-editabletext--docs",
@@ -2483,7 +2562,20 @@
2483
2562
  }
2484
2563
  ],
2485
2564
  "variants": [],
2486
- "ownsBehaviours": [],
2565
+ "ownsBehaviours": [
2566
+ {
2567
+ "id": "base-ui",
2568
+ "behaviour": "Is built on Base UI"
2569
+ },
2570
+ {
2571
+ "id": "role",
2572
+ "behaviour": "Says what it is to assistive technology"
2573
+ },
2574
+ {
2575
+ "id": "tab-stop",
2576
+ "behaviour": "Is reachable with Tab"
2577
+ }
2578
+ ],
2487
2579
  "status": "stable",
2488
2580
  "migrationStage": null,
2489
2581
  "docsId": "inputs-chipinput--docs",
@@ -2568,10 +2660,18 @@
2568
2660
  ],
2569
2661
  "variants": [],
2570
2662
  "ownsBehaviours": [
2663
+ {
2664
+ "id": "base-ui",
2665
+ "behaviour": "Is built on Base UI"
2666
+ },
2571
2667
  {
2572
2668
  "id": "portal",
2573
2669
  "behaviour": "Floats on top of the page"
2574
2670
  },
2671
+ {
2672
+ "id": "press-outside",
2673
+ "behaviour": "Closes on a press outside"
2674
+ },
2575
2675
  {
2576
2676
  "id": "page-keys",
2577
2677
  "behaviour": "Takes its keys by itself"
@@ -2583,6 +2683,10 @@
2583
2683
  {
2584
2684
  "id": "scroll-lock",
2585
2685
  "behaviour": "Stops the page behind it scrolling"
2686
+ },
2687
+ {
2688
+ "id": "role",
2689
+ "behaviour": "Says what it is to assistive technology"
2586
2690
  }
2587
2691
  ],
2588
2692
  "status": "stable",
@@ -2820,6 +2924,10 @@
2820
2924
  "id": "page-keys",
2821
2925
  "behaviour": "Takes its keys by itself"
2822
2926
  },
2927
+ {
2928
+ "id": "focus",
2929
+ "behaviour": "Holds focus inside while open, and gives it back"
2930
+ },
2823
2931
  {
2824
2932
  "id": "follow",
2825
2933
  "behaviour": "Stays attached to its anchor on scroll and resize"
@@ -2926,7 +3034,16 @@
2926
3034
  ]
2927
3035
  }
2928
3036
  ],
2929
- "ownsBehaviours": [],
3037
+ "ownsBehaviours": [
3038
+ {
3039
+ "id": "base-ui",
3040
+ "behaviour": "Is built on Base UI"
3041
+ },
3042
+ {
3043
+ "id": "role",
3044
+ "behaviour": "Says what it is to assistive technology"
3045
+ }
3046
+ ],
2930
3047
  "status": "stable",
2931
3048
  "migrationStage": null,
2932
3049
  "docsId": "overlays-menuitem--docs",
@@ -3024,7 +3141,16 @@
3024
3141
  }
3025
3142
  ],
3026
3143
  "variants": [],
3027
- "ownsBehaviours": [],
3144
+ "ownsBehaviours": [
3145
+ {
3146
+ "id": "base-ui",
3147
+ "behaviour": "Is built on Base UI"
3148
+ },
3149
+ {
3150
+ "id": "role",
3151
+ "behaviour": "Says what it is to assistive technology"
3152
+ }
3153
+ ],
3028
3154
  "status": "stable",
3029
3155
  "migrationStage": null,
3030
3156
  "docsId": "overlays-menu--docs",
@@ -3093,7 +3219,16 @@
3093
3219
  }
3094
3220
  ],
3095
3221
  "variants": [],
3096
- "ownsBehaviours": [],
3222
+ "ownsBehaviours": [
3223
+ {
3224
+ "id": "base-ui",
3225
+ "behaviour": "Is built on Base UI"
3226
+ },
3227
+ {
3228
+ "id": "role",
3229
+ "behaviour": "Says what it is to assistive technology"
3230
+ }
3231
+ ],
3097
3232
  "status": "stable",
3098
3233
  "migrationStage": null,
3099
3234
  "docsId": "overlays-menu--docs",
@@ -3265,7 +3400,20 @@
3265
3400
  }
3266
3401
  ],
3267
3402
  "variants": [],
3268
- "ownsBehaviours": [],
3403
+ "ownsBehaviours": [
3404
+ {
3405
+ "id": "base-ui",
3406
+ "behaviour": "Is built on Base UI"
3407
+ },
3408
+ {
3409
+ "id": "role",
3410
+ "behaviour": "Says what it is to assistive technology"
3411
+ },
3412
+ {
3413
+ "id": "tab-stop",
3414
+ "behaviour": "Is reachable with Tab"
3415
+ }
3416
+ ],
3269
3417
  "status": "stable",
3270
3418
  "migrationStage": null,
3271
3419
  "docsId": "components-persontrigger--docs",
@@ -3399,6 +3547,10 @@
3399
3547
  "id": "page-keys",
3400
3548
  "behaviour": "Takes its keys by itself"
3401
3549
  },
3550
+ {
3551
+ "id": "focus",
3552
+ "behaviour": "Holds focus inside while open, and gives it back"
3553
+ },
3402
3554
  {
3403
3555
  "id": "follow",
3404
3556
  "behaviour": "Stays attached to its anchor on scroll and resize"
@@ -3494,6 +3646,10 @@
3494
3646
  "id": "press-outside",
3495
3647
  "behaviour": "Closes on a press outside"
3496
3648
  },
3649
+ {
3650
+ "id": "page-keys",
3651
+ "behaviour": "Takes its keys by itself"
3652
+ },
3497
3653
  {
3498
3654
  "id": "follow",
3499
3655
  "behaviour": "Stays attached to its anchor on scroll and resize"
@@ -3757,6 +3913,10 @@
3757
3913
  {
3758
3914
  "id": "base-ui",
3759
3915
  "behaviour": "Is built on Base UI"
3916
+ },
3917
+ {
3918
+ "id": "tab-stop",
3919
+ "behaviour": "Is reachable with Tab"
3760
3920
  }
3761
3921
  ],
3762
3922
  "status": "stable",
@@ -3814,7 +3974,12 @@
3814
3974
  }
3815
3975
  ],
3816
3976
  "variants": [],
3817
- "ownsBehaviours": [],
3977
+ "ownsBehaviours": [
3978
+ {
3979
+ "id": "page-keys",
3980
+ "behaviour": "Takes its keys by itself"
3981
+ }
3982
+ ],
3818
3983
  "status": "stable",
3819
3984
  "migrationStage": null,
3820
3985
  "docsId": "components-reactionpicker--docs",
@@ -3890,6 +4055,10 @@
3890
4055
  "id": "base-ui",
3891
4056
  "behaviour": "Is built on Base UI"
3892
4057
  },
4058
+ {
4059
+ "id": "tab-stop",
4060
+ "behaviour": "Is reachable with Tab"
4061
+ },
3893
4062
  {
3894
4063
  "id": "scroll",
3895
4064
  "behaviour": "Scrolls with our scrollbar"
@@ -4201,6 +4370,10 @@
4201
4370
  "id": "page-keys",
4202
4371
  "behaviour": "Takes its keys by itself"
4203
4372
  },
4373
+ {
4374
+ "id": "focus",
4375
+ "behaviour": "Holds focus inside while open, and gives it back"
4376
+ },
4204
4377
  {
4205
4378
  "id": "follow",
4206
4379
  "behaviour": "Stays attached to its anchor on scroll and resize"
@@ -4437,6 +4610,10 @@
4437
4610
  {
4438
4611
  "id": "role",
4439
4612
  "behaviour": "Says what it is to assistive technology"
4613
+ },
4614
+ {
4615
+ "id": "tab-stop",
4616
+ "behaviour": "Is reachable with Tab"
4440
4617
  }
4441
4618
  ],
4442
4619
  "status": "stable",
@@ -4459,7 +4636,12 @@
4459
4636
  "purposeFrom": "page",
4460
4637
  "props": [],
4461
4638
  "variants": [],
4462
- "ownsBehaviours": [],
4639
+ "ownsBehaviours": [
4640
+ {
4641
+ "id": "base-ui",
4642
+ "behaviour": "Is built on Base UI"
4643
+ }
4644
+ ],
4463
4645
  "status": "stable",
4464
4646
  "migrationStage": null,
4465
4647
  "docsId": "inputs-textarea--docs",
@@ -4615,7 +4797,24 @@
4615
4797
  }
4616
4798
  ],
4617
4799
  "variants": [],
4618
- "ownsBehaviours": [],
4800
+ "ownsBehaviours": [
4801
+ {
4802
+ "id": "base-ui",
4803
+ "behaviour": "Is built on Base UI"
4804
+ },
4805
+ {
4806
+ "id": "portal",
4807
+ "behaviour": "Floats on top of the page"
4808
+ },
4809
+ {
4810
+ "id": "page-keys",
4811
+ "behaviour": "Takes its keys by itself"
4812
+ },
4813
+ {
4814
+ "id": "follow",
4815
+ "behaviour": "Stays attached to its anchor on scroll and resize"
4816
+ }
4817
+ ],
4619
4818
  "status": "stable",
4620
4819
  "migrationStage": null,
4621
4820
  "docsId": "feedback-toast--docs",
@@ -4701,6 +4900,10 @@
4701
4900
  {
4702
4901
  "id": "role",
4703
4902
  "behaviour": "Says what it is to assistive technology"
4903
+ },
4904
+ {
4905
+ "id": "tab-stop",
4906
+ "behaviour": "Is reachable with Tab"
4704
4907
  }
4705
4908
  ],
4706
4909
  "status": "stable",
@@ -4800,7 +5003,16 @@
4800
5003
  ]
4801
5004
  }
4802
5005
  ],
4803
- "ownsBehaviours": [],
5006
+ "ownsBehaviours": [
5007
+ {
5008
+ "id": "base-ui",
5009
+ "behaviour": "Is built on Base UI"
5010
+ },
5011
+ {
5012
+ "id": "role",
5013
+ "behaviour": "Says what it is to assistive technology"
5014
+ }
5015
+ ],
4804
5016
  "status": "stable",
4805
5017
  "migrationStage": null,
4806
5018
  "docsId": "primitives-toolbar--docs",
@@ -4834,7 +5046,16 @@
4834
5046
  ]
4835
5047
  }
4836
5048
  ],
4837
- "ownsBehaviours": [],
5049
+ "ownsBehaviours": [
5050
+ {
5051
+ "id": "base-ui",
5052
+ "behaviour": "Is built on Base UI"
5053
+ },
5054
+ {
5055
+ "id": "role",
5056
+ "behaviour": "Says what it is to assistive technology"
5057
+ }
5058
+ ],
4838
5059
  "status": "stable",
4839
5060
  "migrationStage": null,
4840
5061
  "docsId": "primitives-toolbar--docs",
@@ -4920,7 +5141,16 @@
4920
5141
  ]
4921
5142
  }
4922
5143
  ],
4923
- "ownsBehaviours": [],
5144
+ "ownsBehaviours": [
5145
+ {
5146
+ "id": "base-ui",
5147
+ "behaviour": "Is built on Base UI"
5148
+ },
5149
+ {
5150
+ "id": "role",
5151
+ "behaviour": "Says what it is to assistive technology"
5152
+ }
5153
+ ],
4924
5154
  "status": "stable",
4925
5155
  "migrationStage": null,
4926
5156
  "docsId": "primitives-toolbar--docs",
@@ -4946,7 +5176,16 @@
4946
5176
  }
4947
5177
  ],
4948
5178
  "variants": [],
4949
- "ownsBehaviours": [],
5179
+ "ownsBehaviours": [
5180
+ {
5181
+ "id": "base-ui",
5182
+ "behaviour": "Is built on Base UI"
5183
+ },
5184
+ {
5185
+ "id": "role",
5186
+ "behaviour": "Says what it is to assistive technology"
5187
+ }
5188
+ ],
4950
5189
  "status": "stable",
4951
5190
  "migrationStage": null,
4952
5191
  "docsId": "primitives-toolbar--docs",
@@ -5041,7 +5280,28 @@
5041
5280
  }
5042
5281
  ],
5043
5282
  "variants": [],
5044
- "ownsBehaviours": [],
5283
+ "ownsBehaviours": [
5284
+ {
5285
+ "id": "base-ui",
5286
+ "behaviour": "Is built on Base UI"
5287
+ },
5288
+ {
5289
+ "id": "portal",
5290
+ "behaviour": "Floats on top of the page"
5291
+ },
5292
+ {
5293
+ "id": "press-outside",
5294
+ "behaviour": "Closes on a press outside"
5295
+ },
5296
+ {
5297
+ "id": "page-keys",
5298
+ "behaviour": "Takes its keys by itself"
5299
+ },
5300
+ {
5301
+ "id": "follow",
5302
+ "behaviour": "Stays attached to its anchor on scroll and resize"
5303
+ }
5304
+ ],
5045
5305
  "status": "stable",
5046
5306
  "migrationStage": null,
5047
5307
  "docsId": "primitives-tooltip--docs",
@@ -5193,6 +5453,22 @@
5193
5453
  "id": "base-ui",
5194
5454
  "behaviour": "Is built on Base UI"
5195
5455
  },
5456
+ {
5457
+ "id": "portal",
5458
+ "behaviour": "Floats on top of the page"
5459
+ },
5460
+ {
5461
+ "id": "press-outside",
5462
+ "behaviour": "Closes on a press outside"
5463
+ },
5464
+ {
5465
+ "id": "page-keys",
5466
+ "behaviour": "Takes its keys by itself"
5467
+ },
5468
+ {
5469
+ "id": "follow",
5470
+ "behaviour": "Stays attached to its anchor on scroll and resize"
5471
+ },
5196
5472
  {
5197
5473
  "id": "role",
5198
5474
  "behaviour": "Says what it is to assistive technology"
@@ -32,7 +32,8 @@ and when not to. Most of what gets asked for already exists somewhere.
32
32
  refuses a raw element, a rebuilt behaviour or a restyled part, and its error
33
33
  names the part to use.
34
34
  5. **An exception** carries its reason on the line above it. For the gate:
35
- `// @estiva-escape: <reason>`, never `eslint-disable`. For the token lint:
35
+ `// @estiva-escape(<rule>): <reason>`, naming the one rule it keeps off,
36
+ never `eslint-disable`. For the token lint:
36
37
  `// eslint-disable-next-line <rule> -- @estiva-escape: <reason>`.
37
38
 
38
39
  ## Gotchas
package/src/AppShell.mdx CHANGED
@@ -32,7 +32,8 @@ Layout only: no data, no routes.
32
32
  ## When not
33
33
 
34
34
  - Panels *inside* the content — lists beside conversations, side rails —
35
- are layout components, not the shell's business.
35
+ are layout components, not the shell's business. A list beside the
36
+ content is **ListColumn**.
36
37
  - Mixing the pairs (a rail in the solid frame, a sidebar in the floating
37
38
  one) is possible but is a new design, not a port — take it to the
38
39
  designer first.
@@ -89,7 +89,7 @@ const formatBytes = (bytes: number) => {
89
89
  const typeLabelOf = (name: string) => extensionOf(name).toUpperCase() || 'FILE'
90
90
 
91
91
  const TILE_CLASSES = 'size-9 rounded-md bg-bg-active flex items-center justify-center shrink-0 text-text-secondary'
92
- // @estiva-escape: A6 (Katerina, 24 September: record only): a 12px medium name, the text style InputChip's label also uses, not a copy of a part
92
+ // @estiva-escape(no-copied-look): A6 (Katerina, 24 September: record only): a 12px medium name, the text style InputChip's label also uses, not a copy of a part
93
93
  const NAME_CLASSES = 'text-caption font-medium text-text-primary truncate'
94
94
  const NOTE_CLASSES = 'text-small tracking-wide leading-tight truncate'
95
95
 
@@ -359,7 +359,7 @@ export function AttachmentCard({
359
359
  const failed = state === 'failed'
360
360
  const warning = state === 'warning'
361
361
  return (
362
- // @estiva-escape: a failed or warning file's strong hairline is AttachmentCard's own state; Card's attention hairlines are the soft ones (UIG-9, Katerina 17 September)
362
+ // @estiva-escape(no-restyled-part): a failed or warning file's strong hairline is AttachmentCard's own state; Card's attention hairlines are the soft ones (UIG-9, Katerina 17 September)
363
363
  <Card
364
364
  fill="elevated"
365
365
  className={cn('group relative flex items-center gap-2 w-[200px] p-1.5 pr-3', failed ? 'border-error-default' : warning && 'border-warning-default', className)}
@@ -390,7 +390,7 @@ export function AttachmentCard({
390
390
  {/* On Base UI's Button, as InputChip's ✕ is (Katerina, 2026-09-14): IconButton is a 24px square
391
391
  that fills on hover, and this is Peek's 20px round badge on the card's corner. */}
392
392
  {onRemove && (
393
- // @estiva-escape: N4 (Katerina, 24 September: record only): the small round button Lightbox's close also draws; a part if a third appears
393
+ // @estiva-escape(no-copied-look): N4 (Katerina, 24 September: record only): the small round button Lightbox's close also draws; a part if a third appears
394
394
  <BaseButton
395
395
  type="button"
396
396
  aria-label={`Remove ${name}`}
@@ -411,7 +411,7 @@ export function AttachmentCard({
411
411
 
412
412
  // Fades in with the card's hover or keyboard focus, and keeps its slot when hidden, so revealing it never shifts the row.
413
413
  const downloadControl = saving ? (
414
- // @estiva-escape: Download shows when its card is pointed at or focused, AttachmentCard's own action; IconButton has no reveal on its card's hover (UIG-9, Katerina 17 September)
414
+ // @estiva-escape(no-restyled-part): Download shows when its card is pointed at or focused, AttachmentCard's own action; IconButton has no reveal on its card's hover (UIG-9, Katerina 17 September)
415
415
  <IconButton
416
416
  variant="muted"
417
417
  tooltip="Download"
@@ -430,7 +430,7 @@ export function AttachmentCard({
430
430
  return (
431
431
  // `role="status"`: a plain box may not carry a name (axe, aria-prohibited-attr), and a
432
432
  // status says what it is doing — loading — to a reader that cannot see the pulse.
433
- // @estiva-escape: the loading pulse is AttachmentCard's own state; Card has no loading state (UIG-9, Katerina 17 September)
433
+ // @estiva-escape(no-restyled-part): the loading pulse is AttachmentCard's own state; Card has no loading state (UIG-9, Katerina 17 September)
434
434
  <Card role="status" fill="inset" aria-busy="true" aria-label={`Loading ${name}`} className={cn('w-[180px] h-28 animate-pulse', className)} {...props}>
435
435
  {null}
436
436
  </Card>
@@ -439,7 +439,7 @@ export function AttachmentCard({
439
439
 
440
440
  if (drawnState === 'unreadable') {
441
441
  return (
442
- // @estiva-escape: a file that could not be read is faded as well as dashed, AttachmentCard's own state; Card has no faded state (UIG-9, Katerina 17 September)
442
+ // @estiva-escape(no-restyled-part): a file that could not be read is faded as well as dashed, AttachmentCard's own state; Card has no faded state (UIG-9, Katerina 17 September)
443
443
  <Card fill="inset" unreadable className={cn('flex items-center gap-2 w-[240px] p-1.5 opacity-70', className)} {...props}>
444
444
  <div className={TILE_CLASSES}>
445
445
  <TypeIcon name={name} />
@@ -494,7 +494,7 @@ export function AttachmentCard({
494
494
  </>
495
495
  )
496
496
  return (
497
- // @estiva-escape: a file that cannot be opened is faded, AttachmentCard's own state; Card has no faded state (UIG-9, Katerina 17 September)
497
+ // @estiva-escape(no-restyled-part): a file that cannot be opened is faded, AttachmentCard's own state; Card has no faded state (UIG-9, Katerina 17 September)
498
498
  <Card fill="inset" hover={address ? 'hairline' : 'none'} className={cn('group flex items-center gap-2 w-[240px] p-1.5 pr-1', !address && 'opacity-70', className)} {...props}>
499
499
  {address ? (
500
500
  <Link href={address} external variant="plain" className="flex items-center gap-2 min-w-0 flex-1" onClick={(event) => event.stopPropagation()}>
package/src/Button.tsx CHANGED
@@ -92,7 +92,7 @@ export function Button({
92
92
  size === 'default' && (hasLeadingIcon ? 'pl-2 pr-3' : 'px-2'),
93
93
  size === 'small' && (hasLeadingIcon ? 'pl-1.5 pr-2' : 'px-1.5'),
94
94
  !state.disabled && (variant === 'primary' || variant === 'resolve') && 'bg-accent-primary hover:bg-accent-hover text-text-inverse cursor-pointer signal:font-semibold',
95
- // @estiva-escape: W2 (Katerina, 24 September: leave alone): an outlined button shares four words with Reaction's pill by coincidence
95
+ // @estiva-escape(no-copied-look): W2 (Katerina, 24 September: leave alone): an outlined button shares four words with Reaction's pill by coincidence
96
96
  !state.disabled && variant === 'outlined' && 'border border-border-default hover:bg-bg-hover text-text-primary cursor-pointer',
97
97
  !state.disabled && variant === 'muted' && 'hover:bg-bg-hover text-text-primary cursor-pointer',
98
98
  !state.disabled && variant === 'destructive' && 'hover:bg-error-muted text-error-default cursor-pointer',
package/src/Card.tsx CHANGED
@@ -127,14 +127,14 @@ export function Card({
127
127
  if (href !== undefined) {
128
128
  const { ref, ...anchorProps } = props as ComponentPropsWithRef<'a'>
129
129
  return (
130
- // @estiva-escape: a card that leads somewhere is drawn on Link's anchor (UIG-27 ruling 1), so this frame is Card's own look, not Link restyled
130
+ // @estiva-escape(no-copied-look, no-restyled-part): a card that leads somewhere is drawn on Link's anchor (UIG-27 ruling 1), so this frame is Card's own look, not Link restyled
131
131
  <Link href={href} variant="plain" ref={ref} className={classes} {...anchorProps}>
132
132
  {children}
133
133
  </Link>
134
134
  )
135
135
  }
136
136
  return (
137
- // @estiva-escape: N6 (Katerina, 24 September: leave alone): a card that cuts its content to its corners shares four words with the palette's window by coincidence
137
+ // @estiva-escape(no-copied-look): N6 (Katerina, 24 September: leave alone): a card that cuts its content to its corners shares four words with the palette's window by coincidence
138
138
  <div className={classes} {...props}>
139
139
  {children}
140
140
  </div>
package/src/ChipInput.mdx CHANGED
@@ -32,6 +32,8 @@ leading slots.
32
32
  ```tsx
33
33
  import { ChipInput } from '@estiva-app/ui'
34
34
 
35
+ const directory: { id: string; label: string; picture?: string }[] = people
36
+
35
37
  <ChipInput
36
38
  value={chosen}
37
39
  onChange={setChosen}
package/src/ChipInput.tsx CHANGED
@@ -62,7 +62,7 @@ export function InputChip({ label, leading, onRemove, removeLabel, truncate, cla
62
62
  return (
63
63
  <div className={cn(CHIP_BOX, chipPadding(!!leading, !!onRemove), className)}>
64
64
  {leading && <span className="flex shrink-0 items-center">{leading}</span>}
65
- {/* @estiva-escape: A6 (Katerina, 24 September: record only): a 12px medium label, the text style AttachmentCard's name also uses, not a copy of a part */}
65
+ {/* @estiva-escape(no-copied-look): A6 (Katerina, 24 September: record only): a 12px medium label, the text style AttachmentCard's name also uses, not a copy of a part */}
66
66
  <span className={cn(CHIP_LABEL, truncate && 'min-w-0 truncate')}>{label}</span>
67
67
  {/* Base UI's `Button`, as every button in the package is (D6). Base UI
68
68
  has no chip of its own — its only chips are `Combobox.Chip` and