cursedbelt 4.7.0 → 5.0.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 (175) hide show
  1. package/README.md +36 -0
  2. package/dist/react/chat/index.d.ts +1 -0
  3. package/dist/react/chat/index.d.ts.map +1 -1
  4. package/dist/react/chat/index.js +1 -0
  5. package/dist/react/chat/index.js.map +1 -1
  6. package/dist/react/chat/usePresence.d.ts +75 -0
  7. package/dist/react/chat/usePresence.d.ts.map +1 -0
  8. package/dist/react/chat/usePresence.js +109 -0
  9. package/dist/react/chat/usePresence.js.map +1 -0
  10. package/dist/react/components/SecretInput.d.ts +7 -2
  11. package/dist/react/components/SecretInput.d.ts.map +1 -1
  12. package/dist/react/components/SecretInput.js +5 -2
  13. package/dist/react/components/SecretInput.js.map +1 -1
  14. package/dist/react/components/TooltipImpl.d.ts.map +1 -1
  15. package/dist/react/components/TooltipImpl.js +52 -3
  16. package/dist/react/components/TooltipImpl.js.map +1 -1
  17. package/dist/react/emoji/EmojiPicker.d.ts.map +1 -1
  18. package/dist/react/emoji/EmojiPicker.js +49 -8
  19. package/dist/react/emoji/EmojiPicker.js.map +1 -1
  20. package/dist/react/index.d.ts +1 -0
  21. package/dist/react/index.d.ts.map +1 -1
  22. package/dist/react/index.js +1 -0
  23. package/dist/react/index.js.map +1 -1
  24. package/dist/react/lib/form.d.ts +2 -2
  25. package/dist/react/lib/form.d.ts.map +1 -1
  26. package/dist/react/lib/form.js +4 -41
  27. package/dist/react/lib/form.js.map +1 -1
  28. package/dist/react/lib/zodResolver.d.ts +9 -0
  29. package/dist/react/lib/zodResolver.d.ts.map +1 -0
  30. package/dist/react/lib/zodResolver.js +105 -0
  31. package/dist/react/lib/zodResolver.js.map +1 -0
  32. package/dist/react/master-lock/MasterLockDialog.d.ts.map +1 -1
  33. package/dist/react/master-lock/MasterLockDialog.js +2 -1
  34. package/dist/react/master-lock/MasterLockDialog.js.map +1 -1
  35. package/dist/react/master-lock/MasterLockProvider.d.ts +12 -18
  36. package/dist/react/master-lock/MasterLockProvider.d.ts.map +1 -1
  37. package/dist/react/master-lock/MasterLockProvider.js +14 -20
  38. package/dist/react/master-lock/MasterLockProvider.js.map +1 -1
  39. package/dist/react/media/MediaUploadControl.d.ts +3 -7
  40. package/dist/react/media/MediaUploadControl.d.ts.map +1 -1
  41. package/dist/react/media/MediaUploadControl.js +4 -13
  42. package/dist/react/media/MediaUploadControl.js.map +1 -1
  43. package/dist/react/media/fileUploadClient.d.ts +0 -8
  44. package/dist/react/media/fileUploadClient.d.ts.map +1 -1
  45. package/dist/react/media/fileUploadClient.js +0 -8
  46. package/dist/react/media/fileUploadClient.js.map +1 -1
  47. package/dist/react/media/hlsSource.d.ts.map +1 -1
  48. package/dist/react/media/hlsSource.js +4 -2
  49. package/dist/react/media/hlsSource.js.map +1 -1
  50. package/dist/react/media/index.d.ts +0 -4
  51. package/dist/react/media/index.d.ts.map +1 -1
  52. package/dist/react/media/index.js +0 -4
  53. package/dist/react/media/index.js.map +1 -1
  54. package/dist/react/sessionAuth.d.ts +1 -2
  55. package/dist/react/sessionAuth.d.ts.map +1 -1
  56. package/dist/react/sessionAuth.js +2 -3
  57. package/dist/react/sessionAuth.js.map +1 -1
  58. package/dist/scripts/guardrailsEnforce.d.ts.map +1 -1
  59. package/dist/styles-areas/activity-bar.css +1 -1
  60. package/dist/styles-areas/analytics.css +1 -1
  61. package/dist/styles-areas/auth.css +1 -1
  62. package/dist/styles-areas/charts.css +1 -1
  63. package/dist/styles-areas/chat.css +1 -1
  64. package/dist/styles-areas/core.css +1 -1
  65. package/dist/styles-areas/dashboard-grid.css +1 -1
  66. package/dist/styles-areas/data-table.css +1 -1
  67. package/dist/styles-areas/deep-link.css +1 -1
  68. package/dist/styles-areas/disk-usage.css +1 -1
  69. package/dist/styles-areas/emoji.css +1 -1
  70. package/dist/styles-areas/fields.css +1 -1
  71. package/dist/styles-areas/file-tree.css +1 -1
  72. package/dist/styles-areas/keep-awake.css +1 -1
  73. package/dist/styles-areas/layout-engine.css +1 -1
  74. package/dist/styles-areas/markdown.css +1 -1
  75. package/dist/styles-areas/master-detail.css +1 -1
  76. package/dist/styles-areas/master-lock.css +108 -2
  77. package/dist/styles-areas/media-gallery.css +1 -1
  78. package/dist/styles-areas/media.css +1 -17
  79. package/dist/styles-areas/nav.css +1 -1
  80. package/dist/styles-areas/notifications.css +1 -1
  81. package/dist/styles-areas/overlays.css +1 -1
  82. package/dist/styles-areas/palette.css +1 -1
  83. package/dist/styles-areas/spreadsheet.css +1 -1
  84. package/dist/styles-areas/virtual.css +1 -1
  85. package/dist/styles-areas/wizard.css +1 -1
  86. package/dist/styles-areas/workbench.css +1 -1
  87. package/dist/styles-areas/workbook-viewer.css +1 -1
  88. package/dist/styles-utilities.css +0 -16
  89. package/dist/testing/_noBun.d.ts +2 -0
  90. package/dist/testing/_noBun.d.ts.map +1 -0
  91. package/dist/testing/_noBun.js +10 -0
  92. package/dist/testing/_noBun.js.map +1 -0
  93. package/package.json +54 -20
  94. package/scripts/checkAreaStyles.spec.ts +71 -0
  95. package/scripts/checkAreaStyles.ts +150 -0
  96. package/scripts/guardrailsEnforce.spec.ts +43 -0
  97. package/scripts/guardrailsEnforce.ts +46 -1
  98. package/scripts/styleAreas.ts +1 -2
  99. package/src/barrelsReachNoOptionalPeer.spec.ts +6 -3
  100. package/src/bundlerOnlyEntries.spec.ts +101 -0
  101. package/src/declaredImports.spec.ts +4 -0
  102. package/src/optionalPeersTable.spec.ts +127 -0
  103. package/src/react/chat/index.ts +8 -0
  104. package/src/react/chat/usePresence.spec.tsx +138 -0
  105. package/src/react/chat/usePresence.ts +185 -0
  106. package/src/react/components/SecretInput.tsx +12 -1
  107. package/src/react/components/TooltipImpl.tsx +54 -5
  108. package/src/react/emoji/EmojiPicker.tsx +70 -19
  109. package/src/react/index.ts +8 -0
  110. package/src/react/lib/form.ts +5 -48
  111. package/src/react/lib/zodResolver.spec.ts +82 -0
  112. package/src/react/lib/zodResolver.ts +136 -0
  113. package/src/react/master-lock/MasterLockDialog.tsx +13 -9
  114. package/src/react/master-lock/MasterLockProvider.spec.tsx +17 -0
  115. package/src/react/master-lock/MasterLockProvider.tsx +16 -19
  116. package/src/react/media/MediaUploadControl.tsx +8 -29
  117. package/src/react/media/fileUploadClient.ts +7 -17
  118. package/src/react/media/hlsSource.ts +4 -1
  119. package/src/react/media/index.ts +0 -16
  120. package/src/react/sessionAuth.ts +2 -3
  121. package/src/scriptsResolve.spec.ts +66 -0
  122. package/src/styles-areas/activity-bar.css +1 -1
  123. package/src/styles-areas/analytics.css +1 -1
  124. package/src/styles-areas/auth.css +1 -1
  125. package/src/styles-areas/charts.css +1 -1
  126. package/src/styles-areas/chat.css +1 -1
  127. package/src/styles-areas/core.css +1 -1
  128. package/src/styles-areas/dashboard-grid.css +1 -1
  129. package/src/styles-areas/data-table.css +1 -1
  130. package/src/styles-areas/deep-link.css +1 -1
  131. package/src/styles-areas/disk-usage.css +1 -1
  132. package/src/styles-areas/emoji.css +1 -1
  133. package/src/styles-areas/fields.css +1 -1
  134. package/src/styles-areas/file-tree.css +1 -1
  135. package/src/styles-areas/keep-awake.css +1 -1
  136. package/src/styles-areas/layout-engine.css +1 -1
  137. package/src/styles-areas/markdown.css +1 -1
  138. package/src/styles-areas/master-detail.css +1 -1
  139. package/src/styles-areas/master-lock.css +108 -2
  140. package/src/styles-areas/media-gallery.css +1 -1
  141. package/src/styles-areas/media.css +1 -17
  142. package/src/styles-areas/nav.css +1 -1
  143. package/src/styles-areas/notifications.css +1 -1
  144. package/src/styles-areas/overlays.css +1 -1
  145. package/src/styles-areas/palette.css +1 -1
  146. package/src/styles-areas/spreadsheet.css +1 -1
  147. package/src/styles-areas/virtual.css +1 -1
  148. package/src/styles-areas/wizard.css +1 -1
  149. package/src/styles-areas/workbench.css +1 -1
  150. package/src/styles-areas/workbook-viewer.css +1 -1
  151. package/src/styles-utilities.css +0 -16
  152. package/src/testing/_noBun.ts +12 -0
  153. package/src/unpeeredStaysOffTheBarrel.spec.ts +99 -0
  154. package/src/verifyGraph.spec.ts +11 -0
  155. package/dist/react/media/PrivateIndexView.d.ts +0 -6
  156. package/dist/react/media/PrivateIndexView.d.ts.map +0 -1
  157. package/dist/react/media/PrivateIndexView.js +0 -44
  158. package/dist/react/media/PrivateIndexView.js.map +0 -1
  159. package/dist/react/media/PrivateModeBadge.d.ts +0 -17
  160. package/dist/react/media/PrivateModeBadge.d.ts.map +0 -1
  161. package/dist/react/media/PrivateModeBadge.js +0 -24
  162. package/dist/react/media/PrivateModeBadge.js.map +0 -1
  163. package/dist/react/media/privateClient.d.ts +0 -34
  164. package/dist/react/media/privateClient.d.ts.map +0 -1
  165. package/dist/react/media/privateClient.js +0 -36
  166. package/dist/react/media/privateClient.js.map +0 -1
  167. package/dist/react/media/usePrivateUnlock.d.ts +0 -25
  168. package/dist/react/media/usePrivateUnlock.d.ts.map +0 -1
  169. package/dist/react/media/usePrivateUnlock.js +0 -68
  170. package/dist/react/media/usePrivateUnlock.js.map +0 -1
  171. package/src/react/media/PrivateIndexView.tsx +0 -113
  172. package/src/react/media/PrivateModeBadge.tsx +0 -50
  173. package/src/react/media/privateClient.spec.ts +0 -113
  174. package/src/react/media/privateClient.ts +0 -82
  175. package/src/react/media/usePrivateUnlock.ts +0 -132
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 1312 candidate(s) scanned.
18
+ * when this file is stale. 1317 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 300 candidate(s) scanned.
18
+ * when this file is stale. 302 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 463 candidate(s) scanned.
18
+ * when this file is stale. 464 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 348 candidate(s) scanned.
18
+ * when this file is stale. 390 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
15
15
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
16
- * when this file is stale. 5187 candidate(s) scanned.
16
+ * when this file is stale. 5214 candidate(s) scanned.
17
17
  *
18
18
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
19
19
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 208 candidate(s) scanned.
18
+ * when this file is stale. 209 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 1349 candidate(s) scanned.
18
+ * when this file is stale. 1355 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 188 candidate(s) scanned.
18
+ * when this file is stale. 190 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 290 candidate(s) scanned.
18
+ * when this file is stale. 289 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 100 candidate(s) scanned.
18
+ * when this file is stale. 103 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 613 candidate(s) scanned.
18
+ * when this file is stale. 619 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 574 candidate(s) scanned.
18
+ * when this file is stale. 573 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 154 candidate(s) scanned.
18
+ * when this file is stale. 155 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 243 candidate(s) scanned.
18
+ * when this file is stale. 245 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 110 candidate(s) scanned.
18
+ * when this file is stale. 112 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 195 candidate(s) scanned.
18
+ * when this file is stale. 198 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,12 +15,118 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 147 candidate(s) scanned.
18
+ * when this file is stale. 189 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
22
22
  * import closures rather than a hand-written list, is scripts/styleAreas.ts.
23
23
  */
24
24
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
25
+ @layer properties;
25
26
  @layer theme, base, components, utilities;
26
- @layer utilities;
27
+ @layer utilities {
28
+ .self-stretch {
29
+ align-self: stretch;
30
+ }
31
+ .focus-within\:border-field-ring:focus-within {
32
+ border-color: var(--field-ring);
33
+ }
34
+ .focus-within\:ring-2:focus-within {
35
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
36
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
37
+ }
38
+ .focus-within\:ring-field-ring\/30:focus-within {
39
+ --tw-ring-color: var(--field-ring);
40
+ @supports (color: color-mix(in lab, red, red)) {
41
+ --tw-ring-color: color-mix(in oklab, var(--field-ring) 30%, transparent);
42
+ }
43
+ }
44
+ .has-\[\[aria-invalid\=true\]\]\:border-field-error:has(:is([aria-invalid=true])) {
45
+ border-color: var(--field-error);
46
+ }
47
+ }
48
+ @property --tw-shadow {
49
+ syntax: "*";
50
+ inherits: false;
51
+ initial-value: 0 0 #0000;
52
+ }
53
+ @property --tw-shadow-color {
54
+ syntax: "*";
55
+ inherits: false;
56
+ }
57
+ @property --tw-shadow-alpha {
58
+ syntax: "<percentage>";
59
+ inherits: false;
60
+ initial-value: 100%;
61
+ }
62
+ @property --tw-inset-shadow {
63
+ syntax: "*";
64
+ inherits: false;
65
+ initial-value: 0 0 #0000;
66
+ }
67
+ @property --tw-inset-shadow-color {
68
+ syntax: "*";
69
+ inherits: false;
70
+ }
71
+ @property --tw-inset-shadow-alpha {
72
+ syntax: "<percentage>";
73
+ inherits: false;
74
+ initial-value: 100%;
75
+ }
76
+ @property --tw-ring-color {
77
+ syntax: "*";
78
+ inherits: false;
79
+ }
80
+ @property --tw-ring-shadow {
81
+ syntax: "*";
82
+ inherits: false;
83
+ initial-value: 0 0 #0000;
84
+ }
85
+ @property --tw-inset-ring-color {
86
+ syntax: "*";
87
+ inherits: false;
88
+ }
89
+ @property --tw-inset-ring-shadow {
90
+ syntax: "*";
91
+ inherits: false;
92
+ initial-value: 0 0 #0000;
93
+ }
94
+ @property --tw-ring-inset {
95
+ syntax: "*";
96
+ inherits: false;
97
+ }
98
+ @property --tw-ring-offset-width {
99
+ syntax: "<length>";
100
+ inherits: false;
101
+ initial-value: 0px;
102
+ }
103
+ @property --tw-ring-offset-color {
104
+ syntax: "*";
105
+ inherits: false;
106
+ initial-value: #fff;
107
+ }
108
+ @property --tw-ring-offset-shadow {
109
+ syntax: "*";
110
+ inherits: false;
111
+ initial-value: 0 0 #0000;
112
+ }
113
+ @layer properties {
114
+ @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
115
+ *, ::before, ::after, ::backdrop {
116
+ --tw-shadow: 0 0 #0000;
117
+ --tw-shadow-color: initial;
118
+ --tw-shadow-alpha: 100%;
119
+ --tw-inset-shadow: 0 0 #0000;
120
+ --tw-inset-shadow-color: initial;
121
+ --tw-inset-shadow-alpha: 100%;
122
+ --tw-ring-color: initial;
123
+ --tw-ring-shadow: 0 0 #0000;
124
+ --tw-inset-ring-color: initial;
125
+ --tw-inset-ring-shadow: 0 0 #0000;
126
+ --tw-ring-inset: initial;
127
+ --tw-ring-offset-width: 0px;
128
+ --tw-ring-offset-color: #fff;
129
+ --tw-ring-offset-shadow: 0 0 #0000;
130
+ }
131
+ }
132
+ }
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 2162 candidate(s) scanned.
18
+ * when this file is stale. 2157 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 2849 candidate(s) scanned.
18
+ * when this file is stale. 2775 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -156,9 +156,6 @@
156
156
  border-block-style: var(--tw-border-style);
157
157
  border-block-width: 2px;
158
158
  }
159
- .border-\[color\:var\(--border-strong\)\] {
160
- border-color: var(--border-strong);
161
- }
162
159
  .border-accent {
163
160
  border-color: var(--accent);
164
161
  }
@@ -171,12 +168,6 @@
171
168
  border-color: color-mix(in oklab, var(--color-white) 90%, transparent);
172
169
  }
173
170
  }
174
- .bg-\[color\:color-mix\(in_srgb\,var\(--accent-solid\)_8\%\,transparent\)\] {
175
- background-color: var(--accent-solid);
176
- @supports (color: color-mix(in lab, red, red)) {
177
- background-color: color-mix(in srgb,var(--accent-solid) 8%,transparent);
178
- }
179
- }
180
171
  .bg-accent\/15 {
181
172
  background-color: var(--accent);
182
173
  @supports (color: color-mix(in lab, red, red)) {
@@ -283,9 +274,6 @@
283
274
  .text-\[color\:var\(--accent\)\] {
284
275
  color: var(--accent);
285
276
  }
286
- .text-\[color\:var\(--muted-foreground\)\] {
287
- color: var(--muted-foreground);
288
- }
289
277
  .accent-white {
290
278
  accent-color: var(--color-white);
291
279
  }
@@ -322,10 +310,6 @@
322
310
  .group-focus-within\:opacity-100:is(:where(.group):focus-within *) {
323
311
  opacity: 100%;
324
312
  }
325
- .last\:border-b-0:last-child {
326
- border-bottom-style: var(--tw-border-style);
327
- border-bottom-width: 0px;
328
- }
329
313
  .focus-within\:opacity-100:focus-within {
330
314
  opacity: 100%;
331
315
  }
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 800 candidate(s) scanned.
18
+ * when this file is stale. 801 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 232 candidate(s) scanned.
18
+ * when this file is stale. 231 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 117 candidate(s) scanned.
18
+ * when this file is stale. 119 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 212 candidate(s) scanned.
18
+ * when this file is stale. 213 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 166 candidate(s) scanned.
18
+ * when this file is stale. 165 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 161 candidate(s) scanned.
18
+ * when this file is stale. 160 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 389 candidate(s) scanned.
18
+ * when this file is stale. 395 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 770 candidate(s) scanned.
18
+ * when this file is stale. 776 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
17
  * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 247 candidate(s) scanned.
18
+ * when this file is stale. 246 candidate(s) scanned.
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -1591,9 +1591,6 @@
1591
1591
  --tw-border-style: solid;
1592
1592
  border-style: solid;
1593
1593
  }
1594
- .border-\[color\:var\(--border-strong\)\] {
1595
- border-color: var(--border-strong);
1596
- }
1597
1594
  .border-\[var\(--border\)\] {
1598
1595
  border-color: var(--border);
1599
1596
  }
@@ -1741,12 +1738,6 @@
1741
1738
  .border-l-warning {
1742
1739
  border-left-color: var(--warning);
1743
1740
  }
1744
- .bg-\[color\:color-mix\(in_srgb\,var\(--accent-solid\)_8\%\,transparent\)\] {
1745
- background-color: var(--accent-solid);
1746
- @supports (color: color-mix(in lab, red, red)) {
1747
- background-color: color-mix(in srgb,var(--accent-solid) 8%,transparent);
1748
- }
1749
- }
1750
1741
  .bg-\[var\(--accent\)\]\/12 {
1751
1742
  background-color: var(--accent);
1752
1743
  @supports (color: color-mix(in lab, red, red)) {
@@ -2626,9 +2617,6 @@
2626
2617
  .text-\[color\:var\(--accent\)\] {
2627
2618
  color: var(--accent);
2628
2619
  }
2629
- .text-\[color\:var\(--muted-foreground\)\] {
2630
- color: var(--muted-foreground);
2631
- }
2632
2620
  .text-\[var\(--danger\)\] {
2633
2621
  color: var(--danger);
2634
2622
  }
@@ -3299,10 +3287,6 @@
3299
3287
  border-right-style: var(--tw-border-style);
3300
3288
  border-right-width: 0px;
3301
3289
  }
3302
- .last\:border-b-0:last-child {
3303
- border-bottom-style: var(--tw-border-style);
3304
- border-bottom-width: 0px;
3305
- }
3306
3290
  .last\:pr-1:last-child {
3307
3291
  padding-right: var(--spacing);
3308
3292
  }
@@ -0,0 +1,12 @@
1
+ // Loaded only on non-Bun runtimes (task 2087). The `cursedbelt/testing` export map routes the
2
+ // real module to Bun (the `bun` condition) and everything else here, so importing these helpers
3
+ // from Node fails with a sentence instead of `Named export 'waitFor' not found` — which is what
4
+ // Node said about `@testing-library/react`, a CommonJS module its ESM loader cannot name-import.
5
+ // Same shape as `cwip/testing`'s `_noBun`, and `tools/proveInstall.ts` excuses exactly this: a
6
+ // `bun` condition plus a plain `Error` of the package's own making.
7
+ throw new Error(
8
+ 'cursedbelt/testing requires the Bun runtime — it drives @testing-library/react under bun:test + happy-dom. ' +
9
+ 'Import it only from specs run with `bun test`.',
10
+ );
11
+
12
+ export {};
@@ -0,0 +1,99 @@
1
+ /**
2
+ * 🔴 Nothing the `cursedbelt/react` barrel reaches may import an `unpeered` package — not
3
+ * statically, and not through a literal `import()` either.
4
+ *
5
+ * `unpeered` (task 2087) lists packages some subpaths use that are kept out of
6
+ * `peerDependencies` because npm cannot resolve their own peer ranges beside ours. That keeps
7
+ * `npm install cursedbelt` clean, and it has a price that `barrelsReachNoOptionalPeer.spec.ts`
8
+ * could not see: **a bundler resolves a literal `import()` at BUILD time, and Vite stubs a
9
+ * missing import only when it is a DECLARED optional peer.** 5.0.0 listed `@hookform/resolvers`
10
+ * and `@emoji-mart/react` there while `react/lib/form.ts` and `react/emoji/EmojiPicker.tsx`
11
+ * lazily imported them — lazy, so the static-only check above passed — and every app's
12
+ * clean-install `vite build` failed: `Rollup failed to resolve import "@hookform/resolvers/zod"`.
13
+ * Primary checkouts hid it for a day, because their `node_modules` still held the 4.x copies.
14
+ *
15
+ * 5.0.1 depends on neither (its own zod resolver; emoji-mart's `Picker` mounted directly). This
16
+ * spec is what keeps a third from arriving. The barrel is the subject because it is what every
17
+ * app imports; an opt-in subpath that needs glide (`./react/spreadsheet` and its two siblings) is
18
+ * named in `docs/API-REFERENCE.md`'s install table, and its consumer installs it on purpose.
19
+ * `tools/proveInstall.ts`'s consumer-bundle step is the same rule, proved against the PUBLISHED
20
+ * tarball in an empty directory.
21
+ */
22
+ import { describe, expect, it } from 'bun:test';
23
+ import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
24
+ import { fileURLToPath } from 'node:url';
25
+ import pkg from '../package.json';
26
+
27
+ const REPO = fileURLToPath(new URL('..', import.meta.url));
28
+ const UNPEERED = Object.keys((pkg as { unpeered?: { packages?: Record<string, string> } }).unpeered?.packages ?? {});
29
+
30
+ /** `import x from "p"`, `export … from "p"`, `import "p"`, and — the 5.0.0 shape — `import("p")`. */
31
+ const ANY_SPECIFIER = /\bfrom\s*["']([^"'\n]+)["']|^\s*import\s*["']([^"'\n]+)["']|\bimport\(\s*["']([^"'\n]+)["']\s*\)/gm;
32
+
33
+ const packageOf = (specifier: string): string => {
34
+ const parts = specifier.split('/');
35
+ return (specifier.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0]) ?? specifier;
36
+ };
37
+
38
+ /** Every package an entry's bundle names, static or dynamic, with all packages left external. */
39
+ function packagesReachedBy(entry: string, label: string): Set<string> {
40
+ const outdir = `${process.env.TMPDIR ?? '/tmp'}/cursedbelt-unpeered-scan-${process.pid}/${label}`;
41
+ rmSync(outdir, { recursive: true, force: true });
42
+ const build = Bun.spawnSync(['bun', 'build', entry, '--target=browser', '--packages=external', '--outdir', outdir], {
43
+ cwd: REPO,
44
+ stdout: 'pipe',
45
+ stderr: 'pipe',
46
+ });
47
+ const emitted = [...new Bun.Glob('**/*.js').scanSync({ cwd: outdir, onlyFiles: true })];
48
+ const bundle = emitted.map((f) => readFileSync(`${outdir}/${f}`, 'utf8')).join('\n');
49
+ if (build.exitCode !== 0 || bundle.trim() === '') {
50
+ throw new Error(`could not bundle ${entry} (exit ${build.exitCode}) — a check that cannot measure is not a passing check:\n${build.stderr.toString()}`);
51
+ }
52
+ const found = new Set<string>();
53
+ for (const m of bundle.matchAll(ANY_SPECIFIER)) {
54
+ const specifier = m[1] ?? m[2] ?? m[3];
55
+ if (specifier && !specifier.startsWith('.') && !specifier.startsWith('/')) found.add(packageOf(specifier));
56
+ }
57
+ return found;
58
+ }
59
+
60
+ describe('unpeered packages stay off the cursedbelt/react barrel', () => {
61
+ it('🔴 the barrel names no unpeered package, even lazily', () => {
62
+ const source = (pkg.exports as Record<string, { source?: string }>)['./react']?.source;
63
+ expect(source, 'package.json has no ./react source entry').toBeString();
64
+ const reached = packagesReachedBy(`${REPO}${(source as string).slice(2)}`, 'barrel');
65
+ expect(reached.size, 'the scan found no packages at all — it is not measuring').toBeGreaterThan(0);
66
+ expect(
67
+ UNPEERED.filter((name) => reached.has(name)),
68
+ 'the barrel imports an `unpeered` package. A consumer who did not install it cannot even BUILD: ' +
69
+ 'Vite stubs only declared optional peers. Make it a declared optional peer, own the code, or ' +
70
+ 'move the component to an opt-in subpath named in docs/API-REFERENCE.md.',
71
+ ).toEqual([]);
72
+ });
73
+
74
+ it('`unpeered.subpaths` names only real opt-in subpaths, never the barrel, and only unpeered packages', () => {
75
+ // `tools/proveInstall.ts` excuses a fresh-install bundle failure ONLY for these pairs.
76
+ const subpaths = (pkg as { unpeered?: { subpaths?: Record<string, string[]> } }).unpeered?.subpaths ?? {};
77
+ expect(Object.keys(subpaths)).not.toContain('./react');
78
+ for (const [subpath, names] of Object.entries(subpaths)) {
79
+ expect(Object.keys(pkg.exports), `${subpath} is not an export`).toContain(subpath);
80
+ expect(names.filter((n) => !UNPEERED.includes(n)), `${subpath} names a package that is not unpeered`).toEqual([]);
81
+ }
82
+ // And every unpeered package is needed by at least one named subpath — or it is not needed.
83
+ const named = new Set(Object.values(subpaths).flat());
84
+ expect(UNPEERED.filter((n) => !named.has(n))).toEqual([]);
85
+ });
86
+
87
+ it('the scan sees a lazy import — 5.0.0 reproduced, so this check can go red', () => {
88
+ const dir = `${process.env.TMPDIR ?? '/tmp'}/cursedbelt-unpeered-fixture-${process.pid}`;
89
+ mkdirSync(dir, { recursive: true });
90
+ const entry = `${dir}/lazy.ts`;
91
+ writeFileSync(entry, "export const Picker = () => import('@emoji-mart/react');\nexport const zod = () => import('@hookform/resolvers/zod');\n");
92
+ try {
93
+ const reached = packagesReachedBy(entry, 'fixture');
94
+ expect([...reached].sort()).toEqual(['@emoji-mart/react', '@hookform/resolvers']);
95
+ } finally {
96
+ rmSync(dir, { recursive: true, force: true });
97
+ }
98
+ });
99
+ });
@@ -67,6 +67,17 @@ const MUST_RUN = [
67
67
  // added, removing it argues with this list.
68
68
  'typecheck:scripts',
69
69
  'demo:check',
70
+ // 🔴 Added 2026-09-23 (task 102). `biome lint` was in no command at all — `done:serial`
71
+ // called a `lint` script that did not exist, so the 31 errors it would have shown sat
72
+ // unseen. They were cleared in the same landing (29 were in Tailwind's generated output,
73
+ // now excluded in `biome.jsonc`), so the stage landed green.
74
+ 'lint',
75
+ // 🔴 Added 2026-09-23 with `no-raw-password` (task 077). This repo's own guardrails scan was
76
+ // in no command a gate ran, and it had been RED since task 269 gave every relative specifier
77
+ // its `.js`: `no-native-dialog` stopped recognising DeleteButton's `'../confirm.js'` import
78
+ // as the belt's own `confirm`. The rules this package ships to five apps were not being
79
+ // applied to the package itself.
80
+ 'guardrails:report',
70
81
  'styles',
71
82
  'build',
72
83
  'test',
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- import type { PrivateUnlock } from './usePrivateUnlock.js';
3
- export declare function PrivateIndexView({ unlock }: {
4
- unlock: PrivateUnlock;
5
- }): React.JSX.Element;
6
- //# sourceMappingURL=PrivateIndexView.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PrivateIndexView.d.ts","sourceRoot":"","sources":["../../../src/react/media/PrivateIndexView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAS5E,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,qBAmGrE"}