cursedbelt 5.0.1 → 5.2.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 (137) hide show
  1. package/dist/react/engagement/beacon.d.ts +38 -0
  2. package/dist/react/engagement/beacon.d.ts.map +1 -0
  3. package/dist/react/engagement/beacon.js +62 -0
  4. package/dist/react/engagement/beacon.js.map +1 -0
  5. package/dist/react/engagement/beaconClient.d.ts +119 -0
  6. package/dist/react/engagement/beaconClient.d.ts.map +1 -0
  7. package/dist/react/engagement/beaconClient.js +203 -0
  8. package/dist/react/engagement/beaconClient.js.map +1 -0
  9. package/dist/react/engagement/index.d.ts +3 -0
  10. package/dist/react/engagement/index.d.ts.map +1 -0
  11. package/dist/react/engagement/index.js +5 -0
  12. package/dist/react/engagement/index.js.map +1 -0
  13. package/dist/react/lib/directUpload.d.ts +130 -0
  14. package/dist/react/lib/directUpload.d.ts.map +1 -0
  15. package/dist/react/lib/directUpload.js +228 -0
  16. package/dist/react/lib/directUpload.js.map +1 -0
  17. package/dist/react/media/FocusViewer.d.ts.map +1 -1
  18. package/dist/react/media/FocusViewer.js.map +1 -1
  19. package/dist/react/media/MediaThumb.d.ts.map +1 -1
  20. package/dist/react/media/MediaThumb.js.map +1 -1
  21. package/dist/react/media/VideoTurner.d.ts.map +1 -1
  22. package/dist/react/media/VideoTurner.js.map +1 -1
  23. package/dist/react/media-gallery/GalleryTable.js.map +1 -1
  24. package/dist/react/media-gallery/MediaGallery.d.ts.map +1 -1
  25. package/dist/react/media-gallery/MediaGallery.js.map +1 -1
  26. package/dist/styles-areas/activity-bar.css +8 -11
  27. package/dist/styles-areas/analytics.css +30 -653
  28. package/dist/styles-areas/auth.css +10 -135
  29. package/dist/styles-areas/calendar.css +22 -397
  30. package/dist/styles-areas/chart-table.css +8 -20
  31. package/dist/styles-areas/charts.css +9 -70
  32. package/dist/styles-areas/chat.css +17 -345
  33. package/dist/styles-areas/clipboard.css +7 -7
  34. package/dist/styles-areas/code-editor.css +8 -111
  35. package/dist/styles-areas/companion-link.css +8 -51
  36. package/dist/styles-areas/core.css +131 -2488
  37. package/dist/styles-areas/dashboard-grid.css +10 -65
  38. package/dist/styles-areas/data-table.css +30 -638
  39. package/dist/styles-areas/deep-link.css +7 -7
  40. package/dist/styles-areas/diff-viewer.css +8 -11
  41. package/dist/styles-areas/disk-usage.css +13 -243
  42. package/dist/styles-areas/emoji.css +9 -135
  43. package/dist/styles-areas/fields.css +32 -563
  44. package/dist/styles-areas/file-tree.css +8 -14
  45. package/dist/styles-areas/filter-rail.css +14 -216
  46. package/dist/styles-areas/folder-tree.css +12 -200
  47. package/dist/styles-areas/keep-awake.css +7 -7
  48. package/dist/styles-areas/layout-engine.css +12 -220
  49. package/dist/styles-areas/markdown.css +9 -68
  50. package/dist/styles-areas/master-detail.css +14 -220
  51. package/dist/styles-areas/master-lock.css +9 -113
  52. package/dist/styles-areas/media-gallery.css +15 -332
  53. package/dist/styles-areas/media.css +20 -623
  54. package/dist/styles-areas/nav.css +24 -469
  55. package/dist/styles-areas/notifications.css +12 -226
  56. package/dist/styles-areas/overlays.css +14 -114
  57. package/dist/styles-areas/palette.css +15 -121
  58. package/dist/styles-areas/pdf-viewer.css +8 -28
  59. package/dist/styles-areas/problem-detail.css +9 -78
  60. package/dist/styles-areas/rich-text.css +9 -148
  61. package/dist/styles-areas/sharing.css +13 -134
  62. package/dist/styles-areas/spreadsheet.css +8 -18
  63. package/dist/styles-areas/stats.css +19 -262
  64. package/dist/styles-areas/test-report.css +13 -114
  65. package/dist/styles-areas/virtual.css +8 -11
  66. package/dist/styles-areas/wizard.css +21 -362
  67. package/dist/styles-areas/workbench.css +27 -524
  68. package/dist/styles-areas/workbook-viewer.css +8 -25
  69. package/dist/styles-static.css +1 -0
  70. package/dist/styles.css +1 -0
  71. package/package.json +20 -2
  72. package/scripts/checkAreaStyles.spec.ts +158 -1
  73. package/scripts/checkAreaStyles.ts +226 -6
  74. package/scripts/cssRules.ts +8 -1
  75. package/scripts/gate.ts +1 -1
  76. package/scripts/generateAreaStyles.ts +130 -10
  77. package/scripts/paths.ts +1 -1
  78. package/scripts/styleAreas.ts +2 -0
  79. package/src/react/components/ActionBar.spec.tsx +1 -0
  80. package/src/react/engagement/beacon.tsx +63 -0
  81. package/src/react/engagement/beaconClient.spec.ts +138 -0
  82. package/src/react/engagement/beaconClient.ts +228 -0
  83. package/src/react/engagement/index.ts +13 -0
  84. package/src/react/file-tree/FileTree.tsx +3 -3
  85. package/src/react/lib/directUpload.spec.ts +128 -0
  86. package/src/react/lib/directUpload.ts +334 -0
  87. package/src/react/media/FocusViewer.tsx +1 -0
  88. package/src/react/media/MediaThumb.tsx +0 -1
  89. package/src/react/media/VideoTurner.tsx +0 -1
  90. package/src/react/media-gallery/GalleryTable.tsx +0 -1
  91. package/src/react/media-gallery/MediaGallery.tsx +0 -1
  92. package/src/styles-areas/activity-bar.css +8 -11
  93. package/src/styles-areas/analytics.css +30 -653
  94. package/src/styles-areas/auth.css +10 -135
  95. package/src/styles-areas/calendar.css +22 -397
  96. package/src/styles-areas/chart-table.css +8 -20
  97. package/src/styles-areas/charts.css +9 -70
  98. package/src/styles-areas/chat.css +17 -345
  99. package/src/styles-areas/clipboard.css +7 -7
  100. package/src/styles-areas/code-editor.css +8 -111
  101. package/src/styles-areas/companion-link.css +8 -51
  102. package/src/styles-areas/core.css +131 -2488
  103. package/src/styles-areas/dashboard-grid.css +10 -65
  104. package/src/styles-areas/data-table.css +30 -638
  105. package/src/styles-areas/deep-link.css +7 -7
  106. package/src/styles-areas/diff-viewer.css +8 -11
  107. package/src/styles-areas/disk-usage.css +13 -243
  108. package/src/styles-areas/emoji.css +9 -135
  109. package/src/styles-areas/fields.css +32 -563
  110. package/src/styles-areas/file-tree.css +8 -14
  111. package/src/styles-areas/filter-rail.css +14 -216
  112. package/src/styles-areas/folder-tree.css +12 -200
  113. package/src/styles-areas/keep-awake.css +7 -7
  114. package/src/styles-areas/layout-engine.css +12 -220
  115. package/src/styles-areas/markdown.css +9 -68
  116. package/src/styles-areas/master-detail.css +14 -220
  117. package/src/styles-areas/master-lock.css +9 -113
  118. package/src/styles-areas/media-gallery.css +15 -332
  119. package/src/styles-areas/media.css +20 -623
  120. package/src/styles-areas/nav.css +24 -469
  121. package/src/styles-areas/notifications.css +12 -226
  122. package/src/styles-areas/overlays.css +14 -114
  123. package/src/styles-areas/palette.css +15 -121
  124. package/src/styles-areas/pdf-viewer.css +8 -28
  125. package/src/styles-areas/problem-detail.css +9 -78
  126. package/src/styles-areas/rich-text.css +9 -148
  127. package/src/styles-areas/sharing.css +13 -134
  128. package/src/styles-areas/spreadsheet.css +8 -18
  129. package/src/styles-areas/stats.css +19 -262
  130. package/src/styles-areas/test-report.css +13 -114
  131. package/src/styles-areas/virtual.css +8 -11
  132. package/src/styles-areas/wizard.css +21 -362
  133. package/src/styles-areas/workbench.css +27 -524
  134. package/src/styles-areas/workbook-viewer.css +8 -25
  135. package/src/styles-static.css +1 -0
  136. package/src/styles.css +1 -0
  137. package/src/stylesAreas.spec.ts +12 -7
@@ -1,5 +1,5 @@
1
1
  /*
2
- * cursedbelt — the `workbench` area. GENERATED BUILD ARTIFACT. Never hand-edit.
2
+ * cursedbelt — the `workbench` area's utility candidates. GENERATED BUILD ARTIFACT. Never hand-edit.
3
3
  *
4
4
  * the resizable/split/panelled work surfaces and the drag-and-drop affordances.
5
5
  *
@@ -13,531 +13,34 @@
13
13
  * @import "cursedbelt/styles-areas/workbench.css";
14
14
  * @import "cursedbelt/theme.css";
15
15
  *
16
- * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
- * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 776 candidate(s) scanned.
16
+ * These are CANDIDATES (`@source inline`), not CSS: the app's own Tailwind pass generates
17
+ * them, sorted together with the app's utilities, so an area can never put a base utility
18
+ * after an app's responsive variant (task 2124). An app that imports every area gets exactly
19
+ * what `cursedbelt/styles-utilities.css` emits — proved rule by rule in
20
+ * src/stylesAreas.spec.ts, which is also what fails when this file is stale.
21
+ * 106 candidate(s).
19
22
  *
20
23
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
24
  * `bun run build` runs. The map of what is in which area, and why the areas are
22
25
  * import closures rather than a hand-written list, is scripts/styleAreas.ts.
23
26
  */
24
- /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
25
- @layer properties;
26
- @layer theme, base, components, utilities;
27
- @layer theme {
28
- :root, :host {
29
- --spacing: 0.25rem;
30
- --text-xl: 1.25rem;
31
- --text-xl--line-height: calc(1.75 / 1.25);
32
- --default-transition-duration: 150ms;
33
- --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
34
- }
35
- }
36
- @layer utilities {
37
- .right-4 {
38
- right: calc(var(--spacing) * 4);
39
- }
40
- .bottom-6 {
41
- bottom: calc(var(--spacing) * 6);
42
- }
43
- .left-0 {
44
- left: 0px;
45
- }
46
- .-my-0\.5 {
47
- margin-block: calc(var(--spacing) * -0.5);
48
- }
49
- .h-3\.5 {
50
- height: calc(var(--spacing) * 3.5);
51
- }
52
- .h-40 {
53
- height: calc(var(--spacing) * 40);
54
- }
55
- .h-\[420px\] {
56
- height: 420px;
57
- }
58
- .max-h-\[40dvh\] {
59
- max-height: 40dvh;
60
- }
61
- .max-h-\[65dvh\] {
62
- max-height: 65dvh;
63
- }
64
- .max-h-\[85dvh\] {
65
- max-height: 85dvh;
66
- }
67
- .max-h-full {
68
- max-height: 100%;
69
- }
70
- .min-h-20 {
71
- min-height: calc(var(--spacing) * 20);
72
- }
73
- .min-h-\[2\.25rem\] {
74
- min-height: 2.25rem;
75
- }
76
- .min-h-\[44px\] {
77
- min-height: 44px;
78
- }
79
- .min-h-dvh {
80
- min-height: 100dvh;
81
- }
82
- .min-h-full {
83
- min-height: 100%;
84
- }
85
- .w-1\/2 {
86
- width: calc(1 / 2 * 100%);
87
- }
88
- .w-2\/3 {
89
- width: calc(2 / 3 * 100%);
90
- }
91
- .w-3\.5 {
92
- width: calc(var(--spacing) * 3.5);
93
- }
94
- .w-\[352px\] {
95
- width: 352px;
96
- }
97
- .min-w-40 {
98
- min-width: calc(var(--spacing) * 40);
99
- }
100
- .min-w-\[5rem\] {
101
- min-width: 5rem;
102
- }
103
- .shrink-\[2\] {
104
- flex-shrink: 2;
105
- }
106
- .translate-y-0 {
107
- --tw-translate-y: 0px;
108
- translate: var(--tw-translate-x) var(--tw-translate-y);
109
- }
110
- .translate-y-2 {
111
- --tw-translate-y: calc(var(--spacing) * 2);
112
- translate: var(--tw-translate-x) var(--tw-translate-y);
113
- }
114
- .scale-\[1\.01\] {
115
- scale: 1.01;
116
- }
117
- .rotate-90 {
118
- rotate: 90deg;
119
- }
120
- .cursor-not-allowed {
121
- cursor: not-allowed;
122
- }
123
- .resize-none {
124
- resize: none;
125
- }
126
- .\[scrollbar-width\:none\] {
127
- scrollbar-width: none;
128
- }
129
- .flex-row {
130
- flex-direction: row;
131
- }
132
- .self-center {
133
- align-self: center;
134
- }
135
- .self-stretch {
136
- align-self: stretch;
137
- }
138
- .rounded-\[2\.5rem\] {
139
- border-radius: 2.5rem;
140
- }
141
- .rounded-t-xl {
142
- border-top-left-radius: 1.5rem;
143
- border-top-right-radius: 1.5rem;
144
- }
145
- .rounded-l-xl {
146
- border-top-left-radius: 1.5rem;
147
- border-bottom-left-radius: 1.5rem;
148
- }
149
- .rounded-r-xl {
150
- border-top-right-radius: 1.5rem;
151
- border-bottom-right-radius: 1.5rem;
152
- }
153
- .border-0 {
154
- border-style: var(--tw-border-style);
155
- border-width: 0px;
156
- }
157
- .border-2 {
158
- border-style: var(--tw-border-style);
159
- border-width: 2px;
160
- }
161
- .border-8 {
162
- border-style: var(--tw-border-style);
163
- border-width: 8px;
164
- }
165
- .border-r {
166
- border-right-style: var(--tw-border-style);
167
- border-right-width: 1px;
168
- }
169
- .border-l {
170
- border-left-style: var(--tw-border-style);
171
- border-left-width: 1px;
172
- }
173
- .border-dashed {
174
- --tw-border-style: dashed;
175
- border-style: dashed;
176
- }
177
- .border-solid {
178
- --tw-border-style: solid;
179
- border-style: solid;
180
- }
181
- .border-accent {
182
- border-color: var(--accent);
183
- }
184
- .border-accent-solid {
185
- border-color: var(--accent-solid);
186
- }
187
- .border-accent\/70 {
188
- border-color: var(--accent);
189
- @supports (color: color-mix(in lab, red, red)) {
190
- border-color: color-mix(in oklab, var(--accent) 70%, transparent);
191
- }
192
- }
193
- .border-border-strong\/60 {
194
- border-color: var(--border-strong);
195
- @supports (color: color-mix(in lab, red, red)) {
196
- border-color: color-mix(in oklab, var(--border-strong) 60%, transparent);
197
- }
198
- }
199
- .bg-accent\/8 {
200
- background-color: var(--accent);
201
- @supports (color: color-mix(in lab, red, red)) {
202
- background-color: color-mix(in oklab, var(--accent) 8%, transparent);
203
- }
204
- }
205
- .bg-accent\/15 {
206
- background-color: var(--accent);
207
- @supports (color: color-mix(in lab, red, red)) {
208
- background-color: color-mix(in oklab, var(--accent) 15%, transparent);
209
- }
210
- }
211
- .bg-accent\/40 {
212
- background-color: var(--accent);
213
- @supports (color: color-mix(in lab, red, red)) {
214
- background-color: color-mix(in oklab, var(--accent) 40%, transparent);
215
- }
216
- }
217
- .bg-border-strong {
218
- background-color: var(--border-strong);
219
- }
220
- .bg-card-overlay\/85 {
221
- background-color: var(--card-overlay);
222
- @supports (color: color-mix(in lab, red, red)) {
223
- background-color: color-mix(in oklab, var(--card-overlay) 85%, transparent);
224
- }
225
- }
226
- .bg-muted\/40 {
227
- background-color: var(--muted);
228
- @supports (color: color-mix(in lab, red, red)) {
229
- background-color: color-mix(in oklab, var(--muted) 40%, transparent);
230
- }
231
- }
232
- .bg-muted\/60 {
233
- background-color: var(--muted);
234
- @supports (color: color-mix(in lab, red, red)) {
235
- background-color: color-mix(in oklab, var(--muted) 60%, transparent);
236
- }
237
- }
238
- .bg-success\/8 {
239
- background-color: var(--success);
240
- @supports (color: color-mix(in lab, red, red)) {
241
- background-color: color-mix(in oklab, var(--success) 8%, transparent);
242
- }
243
- }
244
- .pb-0\.5 {
245
- padding-bottom: calc(var(--spacing) * 0.5);
246
- }
247
- .pb-\[max\(env\(safe-area-inset-bottom\,0px\)\,0\.5rem\)\] {
248
- padding-bottom: max(env(safe-area-inset-bottom,0px), 0.5rem);
249
- }
250
- .pl-1 {
251
- padding-left: var(--spacing);
252
- }
253
- .pl-3 {
254
- padding-left: calc(var(--spacing) * 3);
255
- }
256
- .text-xl {
257
- font-size: var(--text-xl);
258
- line-height: var(--tw-leading, var(--text-xl--line-height));
259
- }
260
- .break-words {
261
- overflow-wrap: break-word;
262
- }
263
- .text-muted-foreground\/60 {
264
- color: var(--muted-foreground);
265
- @supports (color: color-mix(in lab, red, red)) {
266
- color: color-mix(in oklab, var(--muted-foreground) 60%, transparent);
267
- }
268
- }
269
- .text-tone-amber-ink {
270
- color: var(--tone-amber-ink);
271
- }
272
- .text-tone-cyan-ink {
273
- color: var(--tone-cyan-ink);
274
- }
275
- .text-tone-emerald-ink {
276
- color: var(--tone-emerald-ink);
277
- }
278
- .text-tone-orange-ink {
279
- color: var(--tone-orange-ink);
280
- }
281
- .text-tone-purple-ink {
282
- color: var(--tone-purple-ink);
283
- }
284
- .text-tone-rose-ink {
285
- color: var(--tone-rose-ink);
286
- }
287
- .text-tone-sky-ink {
288
- color: var(--tone-sky-ink);
289
- }
290
- .text-tone-slate-ink {
291
- color: var(--tone-slate-ink);
292
- }
293
- .italic {
294
- font-style: italic;
295
- }
296
- .opacity-100 {
297
- opacity: 100%;
298
- }
299
- .ring-1 {
300
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
301
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
302
- }
303
- .ring-4 {
304
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
305
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
306
- }
307
- .ring-accent\/20 {
308
- --tw-ring-color: var(--accent);
309
- @supports (color: color-mix(in lab, red, red)) {
310
- --tw-ring-color: color-mix(in oklab, var(--accent) 20%, transparent);
311
- }
312
- }
313
- .ring-accent\/30 {
314
- --tw-ring-color: var(--accent);
315
- @supports (color: color-mix(in lab, red, red)) {
316
- --tw-ring-color: color-mix(in oklab, var(--accent) 30%, transparent);
317
- }
318
- }
319
- .ring-accent\/40 {
320
- --tw-ring-color: var(--accent);
321
- @supports (color: color-mix(in lab, red, red)) {
322
- --tw-ring-color: color-mix(in oklab, var(--accent) 40%, transparent);
323
- }
324
- }
325
- .ring-border {
326
- --tw-ring-color: var(--border);
327
- }
328
- .ring-ring {
329
- --tw-ring-color: var(--ring);
330
- }
331
- .transition-\[opacity\,transform\] {
332
- transition-property: opacity,transform;
333
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
334
- transition-duration: var(--tw-duration, var(--default-transition-duration));
335
- }
336
- .duration-150 {
337
- --tw-duration: 150ms;
338
- transition-duration: 150ms;
339
- }
340
- .ring-inset {
341
- --tw-ring-inset: inset;
342
- }
343
- .peer-focus\:rounded-lg:is(:where(.peer):focus ~ *) {
344
- border-radius: 1rem;
345
- }
346
- .peer-focus\:ring-2:is(:where(.peer):focus ~ *) {
347
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
348
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
349
- }
350
- .peer-focus\:ring-field-ring\/40:is(:where(.peer):focus ~ *) {
351
- --tw-ring-color: var(--field-ring);
352
- @supports (color: color-mix(in lab, red, red)) {
353
- --tw-ring-color: color-mix(in oklab, var(--field-ring) 40%, transparent);
354
- }
355
- }
356
- .peer-focus\:outline-none:is(:where(.peer):focus ~ *) {
357
- --tw-outline-style: none;
358
- outline-style: none;
359
- }
360
- @media (hover: hover) {
361
- .hover\:border-border-strong:hover {
362
- border-color: var(--border-strong);
363
- }
364
- .hover\:border-field-ring:hover {
365
- border-color: var(--field-ring);
366
- }
367
- .hover\:bg-card-overlay:hover {
368
- background-color: var(--card-overlay);
369
- }
370
- .hover\:bg-muted-foreground\/10:hover {
371
- background-color: var(--muted-foreground);
372
- }
373
- @supports (color: color-mix(in lab, red, red)) {
374
- .hover\:bg-muted-foreground\/10:hover {
375
- background-color: color-mix(in oklab, var(--muted-foreground) 10%, transparent);
376
- }
377
- }
378
- .hover\:bg-muted\/80:hover {
379
- background-color: var(--muted);
380
- }
381
- @supports (color: color-mix(in lab, red, red)) {
382
- .hover\:bg-muted\/80:hover {
383
- background-color: color-mix(in oklab, var(--muted) 80%, transparent);
384
- }
385
- }
386
- .hover\:shadow-popover:hover {
387
- --tw-shadow: var(--shadow-popover);
388
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
389
- }
390
- }
391
- .data-\[state\=closed\]\:slide-out-to-bottom[data-state="closed"] {
392
- --tw-exit-translate-y: 100%;
393
- }
394
- .data-\[state\=closed\]\:slide-out-to-left[data-state="closed"] {
395
- --tw-exit-translate-x: -100%;
396
- }
397
- .data-\[state\=closed\]\:slide-out-to-right[data-state="closed"] {
398
- --tw-exit-translate-x: 100%;
399
- }
400
- .data-\[state\=open\]\:slide-in-from-bottom[data-state="open"] {
401
- --tw-enter-translate-y: 100%;
402
- }
403
- .data-\[state\=open\]\:slide-in-from-left[data-state="open"] {
404
- --tw-enter-translate-x: -100%;
405
- }
406
- .data-\[state\=open\]\:slide-in-from-right[data-state="open"] {
407
- --tw-enter-translate-x: 100%;
408
- }
409
- @media (width >= 40rem) {
410
- .sm\:w-56 {
411
- width: calc(var(--spacing) * 56);
412
- }
413
- }
414
- @media (pointer: coarse) {
415
- .pointer-coarse\:h-12 {
416
- height: calc(var(--spacing) * 12);
417
- }
418
- .pointer-coarse\:w-12 {
419
- width: calc(var(--spacing) * 12);
420
- }
421
- }
422
- .\[\&_svg\]\:size-3\.5 svg {
423
- width: calc(var(--spacing) * 3.5);
424
- height: calc(var(--spacing) * 3.5);
425
- }
426
- .\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar {
427
- display: none;
428
- }
429
- }
430
- @property --tw-translate-x {
431
- syntax: "*";
432
- inherits: false;
433
- initial-value: 0;
434
- }
435
- @property --tw-translate-y {
436
- syntax: "*";
437
- inherits: false;
438
- initial-value: 0;
439
- }
440
- @property --tw-translate-z {
441
- syntax: "*";
442
- inherits: false;
443
- initial-value: 0;
444
- }
445
- @property --tw-border-style {
446
- syntax: "*";
447
- inherits: false;
448
- initial-value: solid;
449
- }
450
- @property --tw-shadow {
451
- syntax: "*";
452
- inherits: false;
453
- initial-value: 0 0 #0000;
454
- }
455
- @property --tw-shadow-color {
456
- syntax: "*";
457
- inherits: false;
458
- }
459
- @property --tw-shadow-alpha {
460
- syntax: "<percentage>";
461
- inherits: false;
462
- initial-value: 100%;
463
- }
464
- @property --tw-inset-shadow {
465
- syntax: "*";
466
- inherits: false;
467
- initial-value: 0 0 #0000;
468
- }
469
- @property --tw-inset-shadow-color {
470
- syntax: "*";
471
- inherits: false;
472
- }
473
- @property --tw-inset-shadow-alpha {
474
- syntax: "<percentage>";
475
- inherits: false;
476
- initial-value: 100%;
477
- }
478
- @property --tw-ring-color {
479
- syntax: "*";
480
- inherits: false;
481
- }
482
- @property --tw-ring-shadow {
483
- syntax: "*";
484
- inherits: false;
485
- initial-value: 0 0 #0000;
486
- }
487
- @property --tw-inset-ring-color {
488
- syntax: "*";
489
- inherits: false;
490
- }
491
- @property --tw-inset-ring-shadow {
492
- syntax: "*";
493
- inherits: false;
494
- initial-value: 0 0 #0000;
495
- }
496
- @property --tw-ring-inset {
497
- syntax: "*";
498
- inherits: false;
499
- }
500
- @property --tw-ring-offset-width {
501
- syntax: "<length>";
502
- inherits: false;
503
- initial-value: 0px;
504
- }
505
- @property --tw-ring-offset-color {
506
- syntax: "*";
507
- inherits: false;
508
- initial-value: #fff;
509
- }
510
- @property --tw-ring-offset-shadow {
511
- syntax: "*";
512
- inherits: false;
513
- initial-value: 0 0 #0000;
514
- }
515
- @property --tw-duration {
516
- syntax: "*";
517
- inherits: false;
518
- }
519
- @layer properties {
520
- @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
521
- *, ::before, ::after, ::backdrop {
522
- --tw-translate-x: 0;
523
- --tw-translate-y: 0;
524
- --tw-translate-z: 0;
525
- --tw-border-style: solid;
526
- --tw-shadow: 0 0 #0000;
527
- --tw-shadow-color: initial;
528
- --tw-shadow-alpha: 100%;
529
- --tw-inset-shadow: 0 0 #0000;
530
- --tw-inset-shadow-color: initial;
531
- --tw-inset-shadow-alpha: 100%;
532
- --tw-ring-color: initial;
533
- --tw-ring-shadow: 0 0 #0000;
534
- --tw-inset-ring-color: initial;
535
- --tw-inset-ring-shadow: 0 0 #0000;
536
- --tw-ring-inset: initial;
537
- --tw-ring-offset-width: 0px;
538
- --tw-ring-offset-color: #fff;
539
- --tw-ring-offset-shadow: 0 0 #0000;
540
- --tw-duration: initial;
541
- }
542
- }
543
- }
27
+ @source inline("-my-0.5 [&::-webkit-scrollbar]:hidden [&_svg]:size-3.5 [scrollbar-width:none] bg-accent/15");
28
+ @source inline("bg-accent/40 bg-accent/8 bg-border-strong bg-card-overlay/85 bg-muted/40 bg-muted/60");
29
+ @source inline("bg-success/8 border-0 border-2 border-8 border-accent border-accent-solid border-accent/70");
30
+ @source inline("border-border-strong/60 border-dashed border-l border-r border-solid bottom-6 break-words");
31
+ @source inline("cursor-not-allowed data-[state=closed]:slide-out-to-bottom data-[state=closed]:slide-out-to-left");
32
+ @source inline("data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-bottom");
33
+ @source inline("data-[state=open]:slide-in-from-left data-[state=open]:slide-in-from-right duration-150 flex-row");
34
+ @source inline("h-3.5 h-40 h-[420px] hover:bg-card-overlay hover:bg-muted-foreground/10 hover:bg-muted/80");
35
+ @source inline("hover:border-border-strong hover:border-field-ring hover:shadow-popover italic left-0");
36
+ @source inline("max-h-[40dvh] max-h-[65dvh] max-h-[85dvh] max-h-full min-h min-h-20 min-h-[2.25rem] min-h-[44px]");
37
+ @source inline("min-h-dvh min-h-full min-w-40 min-w-[5rem] opacity-100 pb-0.5");
38
+ @source inline("pb-[max(env(safe-area-inset-bottom,0px),0.5rem)] peer-focus peer-focus:outline-none");
39
+ @source inline("peer-focus:ring-2 peer-focus:ring-field-ring/40 peer-focus:rounded-lg pl-1 pl-3");
40
+ @source inline("pointer-coarse:h-12 pointer-coarse:w-12 resize-none right-4 ring-1 ring-4 ring-accent/20");
41
+ @source inline("ring-accent/30 ring-accent/40 ring-border ring-inset ring-ring rotate-90 rounded-[2.5rem]");
42
+ @source inline("rounded-l-xl rounded-r-xl rounded-t-xl scale-[1.01] self-center self-stretch shrink-[2] sm:w-56");
43
+ @source inline("text-muted-foreground/60 text-tone-amber-ink text-tone-cyan-ink text-tone-emerald-ink");
44
+ @source inline("text-tone-orange-ink text-tone-purple-ink text-tone-rose-ink text-tone-sky-ink");
45
+ @source inline("text-tone-slate-ink text-xl transition-[opacity,transform] translate-y-0 translate-y-2 w-1/2");
46
+ @source inline("w-2/3 w-3.5 w-[352px]");
@@ -1,5 +1,5 @@
1
1
  /*
2
- * cursedbelt — the `workbook-viewer` area. GENERATED BUILD ARTIFACT. Never hand-edit.
2
+ * cursedbelt — the `workbook-viewer` area's utility candidates. GENERATED BUILD ARTIFACT. Never hand-edit.
3
3
  *
4
4
  * the lazy XLSX viewer (an optional peer already).
5
5
  *
@@ -13,32 +13,15 @@
13
13
  * @import "cursedbelt/styles-areas/workbook-viewer.css";
14
14
  * @import "cursedbelt/theme.css";
15
15
  *
16
- * An app that imports every area gets exactly what `cursedbelt/styles-utilities.css`
17
- * emits — proved rule by rule in src/stylesAreas.spec.ts, which is also what fails
18
- * when this file is stale. 246 candidate(s) scanned.
16
+ * These are CANDIDATES (`@source inline`), not CSS: the app's own Tailwind pass generates
17
+ * them, sorted together with the app's utilities, so an area can never put a base utility
18
+ * after an app's responsive variant (task 2124). An app that imports every area gets exactly
19
+ * what `cursedbelt/styles-utilities.css` emits — proved rule by rule in
20
+ * src/stylesAreas.spec.ts, which is also what fails when this file is stale.
21
+ * 7 candidate(s).
19
22
  *
20
23
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
24
  * `bun run build` runs. The map of what is in which area, and why the areas are
22
25
  * import closures rather than a hand-written list, is scripts/styleAreas.ts.
23
26
  */
24
- /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
25
- @layer theme, base, components, utilities;
26
- @layer theme {
27
- :root, :host {
28
- --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', Arial,
29
- sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
30
- --spacing: 0.25rem;
31
- --text-sm: 0.875rem;
32
- }
33
- }
34
- @layer utilities {
35
- .collapse {
36
- visibility: collapse;
37
- }
38
- .w-48 {
39
- width: calc(var(--spacing) * 48);
40
- }
41
- .min-w-16 {
42
- min-width: calc(var(--spacing) * 16);
43
- }
44
- }
27
+ @source inline("--font-sans --text-sm col collapse min-w-16 w w-48");
@@ -186,6 +186,7 @@
186
186
  DismissableLayer re-enables the tooltip layer with an INLINE `pointer-events:
187
187
  auto` — exactly the case (tooltip inside an open modal) this rule exists for. */
188
188
  [data-cb-tooltip] {
189
+ /* biome-ignore lint/complexity/noImportantStyles: it must beat Radix's INLINE style, see above */
189
190
  pointer-events: none !important;
190
191
  }
191
192
 
package/src/styles.css CHANGED
@@ -188,6 +188,7 @@
188
188
  DismissableLayer re-enables the tooltip layer with an INLINE `pointer-events:
189
189
  auto` — exactly the case (tooltip inside an open modal) this rule exists for. */
190
190
  [data-cb-tooltip] {
191
+ /* biome-ignore lint/complexity/noImportantStyles: it must beat Radix's INLINE style, see above */
191
192
  pointer-events: none !important;
192
193
  }
193
194
 
@@ -41,7 +41,7 @@ import { REPO_ROOT } from '../scripts/generateStaticStyles.js';
41
41
  import {
42
42
  AREAS,
43
43
  CORE,
44
- MIN_CORE_CANDIDATES,
44
+ MIN_CORE_UTILITIES,
45
45
  areaFile,
46
46
  areaSubpath,
47
47
  readAreaStyles,
@@ -126,7 +126,9 @@ describe('the per-area stylesheets are generated and gated', () => {
126
126
 
127
127
  it('was compiled from a scan that did not collapse', () => {
128
128
  const core = areas.find((a) => a.name === CORE);
129
- expect(core?.candidates.length ?? 0).toBeGreaterThanOrEqual(MIN_CORE_CANDIDATES);
129
+ // `candidates` are the UTILITIES written into `@source inline` (5.1.0); the raw scan's own
130
+ // floor (`MIN_CORE_CANDIDATES`) is enforced by the generator before it filters.
131
+ expect(core?.candidates.length ?? 0).toBeGreaterThanOrEqual(MIN_CORE_UTILITIES);
130
132
  });
131
133
 
132
134
  it('covers every module under src/react', () => {
@@ -204,13 +206,16 @@ describe('the per-area stylesheets are generated and gated', () => {
204
206
  // The negative control for the whole exercise. If `core` grew until it were the
205
207
  // union again — one careless root away, since a root's closure is transitive —
206
208
  // every assertion above would still pass and no consumer would save a byte.
207
- const core = areas.find((a) => a.name === CORE) as (typeof areas)[number];
208
- const utilities = await Bun.file(`${REPO_ROOT}/src/styles-utilities.css`).text();
209
+ // Since 5.1.0 an area file is candidates, not CSS, so the comparison is between what an
210
+ // app COMPILES from core and from the union — not between two file sizes.
211
+ const coreOnly = (
212
+ await compileStylesheet(`@import "tailwindcss" source(none);\n@import "./styles-static.css";\n@import "./styles-areas/${CORE}.css";\n@import "./theme.css";\n`)
213
+ ).build([]);
209
214
  expect(
210
- core.css.length,
211
- `core is ${core.css.length} B against a ${utilities.length} B union — an area map where the\n` +
215
+ coreOnly.length,
216
+ `core compiles to ${coreOnly.length} B against a ${union.length} B union — an area map where the\n` +
212
217
  'primitives ARE the design system buys nothing. Move whatever grew it into an area.',
213
- ).toBeLessThan(utilities.length * 0.75);
218
+ ).toBeLessThan(union.length * 0.75);
214
219
  });
215
220
 
216
221
  it('exports every area as a subpath that resolves into a directory `files` ships', () => {