cursedbelt 5.46.2 → 5.47.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 (145) hide show
  1. package/dist/react/charts/IntervalTimeline.d.ts.map +1 -1
  2. package/dist/react/charts/IntervalTimeline.js +2 -2
  3. package/dist/react/charts/IntervalTimeline.js.map +1 -1
  4. package/dist/react/chat/DateMarker.d.ts +4 -0
  5. package/dist/react/chat/DateMarker.d.ts.map +1 -1
  6. package/dist/react/chat/DateMarker.js +15 -2
  7. package/dist/react/chat/DateMarker.js.map +1 -1
  8. package/dist/react/components/Button.d.ts.map +1 -1
  9. package/dist/react/components/Button.js +5 -0
  10. package/dist/react/components/Button.js.map +1 -1
  11. package/dist/react/components/DataTable/DataTable.d.ts.map +1 -1
  12. package/dist/react/components/DataTable/DataTable.js +1 -1
  13. package/dist/react/components/DataTable/DataTable.js.map +1 -1
  14. package/dist/react/components/DataTable/SortHeader.d.ts +4 -1
  15. package/dist/react/components/DataTable/SortHeader.d.ts.map +1 -1
  16. package/dist/react/components/DataTable/SortHeader.js +22 -5
  17. package/dist/react/components/DataTable/SortHeader.js.map +1 -1
  18. package/dist/react/components/DataTable/types.d.ts +10 -0
  19. package/dist/react/components/DataTable/types.d.ts.map +1 -1
  20. package/dist/react/components/DataTable/types.js.map +1 -1
  21. package/dist/react/components/DropdownMenu.js +10 -4
  22. package/dist/react/components/DropdownMenu.js.map +1 -1
  23. package/dist/react/components/Field.d.ts +9 -1
  24. package/dist/react/components/Field.d.ts.map +1 -1
  25. package/dist/react/components/Field.js +3 -3
  26. package/dist/react/components/Field.js.map +1 -1
  27. package/dist/react/components/SecretInput.d.ts +4 -2
  28. package/dist/react/components/SecretInput.d.ts.map +1 -1
  29. package/dist/react/components/SecretInput.js +2 -2
  30. package/dist/react/components/SecretInput.js.map +1 -1
  31. package/dist/react/components/auth/AuthCard.d.ts.map +1 -1
  32. package/dist/react/components/auth/AuthCard.js +5 -1
  33. package/dist/react/components/auth/AuthCard.js.map +1 -1
  34. package/dist/react/components/auth/PasswordSetFields.d.ts.map +1 -1
  35. package/dist/react/components/auth/PasswordSetFields.js +2 -2
  36. package/dist/react/components/auth/PasswordSetFields.js.map +1 -1
  37. package/dist/react/components/auth/PasswordStrengthMeter.d.ts.map +1 -1
  38. package/dist/react/components/auth/PasswordStrengthMeter.js +3 -1
  39. package/dist/react/components/auth/PasswordStrengthMeter.js.map +1 -1
  40. package/dist/react/components/auth/RegisterForm.js +1 -1
  41. package/dist/react/components/auth/RegisterForm.js.map +1 -1
  42. package/dist/react/components/auth/SignupForm.d.ts.map +1 -1
  43. package/dist/react/components/auth/SignupForm.js +4 -2
  44. package/dist/react/components/auth/SignupForm.js.map +1 -1
  45. package/dist/react/components/auth/TotpEntry.d.ts.map +1 -1
  46. package/dist/react/components/auth/TotpEntry.js +18 -1
  47. package/dist/react/components/auth/TotpEntry.js.map +1 -1
  48. package/dist/react/components/auth/fields.d.ts +3 -1
  49. package/dist/react/components/auth/fields.d.ts.map +1 -1
  50. package/dist/react/components/auth/fields.js +6 -2
  51. package/dist/react/components/auth/fields.js.map +1 -1
  52. package/dist/react/components/calendar/DayAgenda.d.ts.map +1 -1
  53. package/dist/react/components/calendar/DayAgenda.js +4 -2
  54. package/dist/react/components/calendar/DayAgenda.js.map +1 -1
  55. package/dist/react/components/calendar/EventChip.d.ts +5 -1
  56. package/dist/react/components/calendar/EventChip.d.ts.map +1 -1
  57. package/dist/react/components/calendar/EventChip.js +10 -3
  58. package/dist/react/components/calendar/EventChip.js.map +1 -1
  59. package/dist/react/components/calendar/MonthGrid.js +1 -1
  60. package/dist/react/components/calendar/MonthGrid.js.map +1 -1
  61. package/dist/react/components/calendar/WeekView.d.ts.map +1 -1
  62. package/dist/react/components/calendar/WeekView.js +2 -2
  63. package/dist/react/components/calendar/WeekView.js.map +1 -1
  64. package/dist/react/components/calendar/colorUtils.d.ts.map +1 -1
  65. package/dist/react/components/calendar/colorUtils.js +13 -11
  66. package/dist/react/components/calendar/colorUtils.js.map +1 -1
  67. package/dist/react/components/fieldErrorText.d.ts +12 -0
  68. package/dist/react/components/fieldErrorText.d.ts.map +1 -0
  69. package/dist/react/components/fieldErrorText.js +12 -0
  70. package/dist/react/components/fieldErrorText.js.map +1 -0
  71. package/dist/react/deep-link/resume.d.ts.map +1 -1
  72. package/dist/react/deep-link/resume.js +9 -2
  73. package/dist/react/deep-link/resume.js.map +1 -1
  74. package/dist/react/file-tree/FileTree.d.ts +3 -0
  75. package/dist/react/file-tree/FileTree.d.ts.map +1 -1
  76. package/dist/react/file-tree/FileTree.js +12 -1
  77. package/dist/react/file-tree/FileTree.js.map +1 -1
  78. package/dist/react/file-tree/FolderViewMenus.d.ts +3 -1
  79. package/dist/react/file-tree/FolderViewMenus.d.ts.map +1 -1
  80. package/dist/react/file-tree/FolderViewMenus.js +51 -15
  81. package/dist/react/file-tree/FolderViewMenus.js.map +1 -1
  82. package/dist/react/file-tree/folderView.d.ts +25 -4
  83. package/dist/react/file-tree/folderView.d.ts.map +1 -1
  84. package/dist/react/file-tree/folderView.js +49 -9
  85. package/dist/react/file-tree/folderView.js.map +1 -1
  86. package/dist/react/file-tree/index.d.ts +2 -1
  87. package/dist/react/file-tree/index.d.ts.map +1 -1
  88. package/dist/react/file-tree/index.js +2 -1
  89. package/dist/react/file-tree/index.js.map +1 -1
  90. package/dist/react/file-tree/useFolderView.d.ts +34 -4
  91. package/dist/react/file-tree/useFolderView.d.ts.map +1 -1
  92. package/dist/react/file-tree/useFolderView.js +43 -11
  93. package/dist/react/file-tree/useFolderView.js.map +1 -1
  94. package/dist/styles-areas/analytics.css +26 -25
  95. package/dist/styles-areas/calendar.css +4 -4
  96. package/dist/styles-areas/data-table.css +26 -25
  97. package/dist/styles-utilities.css +24 -9
  98. package/package.json +5 -1
  99. package/scripts/demoCoverage.spec.ts +33 -0
  100. package/scripts/demoCoverage.ts +124 -0
  101. package/src/react/charts/IntervalTimeline.tsx +6 -4
  102. package/src/react/chat/DateMarker.tsx +22 -6
  103. package/src/react/chat/MessageThread.spec.tsx +25 -1
  104. package/src/react/components/Button.spec.tsx +11 -0
  105. package/src/react/components/Button.tsx +5 -0
  106. package/src/react/components/DataTable/DataTable.spec.tsx +43 -0
  107. package/src/react/components/DataTable/DataTable.tsx +1 -0
  108. package/src/react/components/DataTable/SortHeader.tsx +45 -5
  109. package/src/react/components/DataTable/types.ts +10 -0
  110. package/src/react/components/DropdownMenu.spec.tsx +26 -0
  111. package/src/react/components/DropdownMenu.tsx +10 -3
  112. package/src/react/components/Field.spec.tsx +24 -0
  113. package/src/react/components/Field.tsx +15 -5
  114. package/src/react/components/SecretInput.tsx +5 -1
  115. package/src/react/components/auth/AuthCard.spec.tsx +8 -0
  116. package/src/react/components/auth/AuthCard.tsx +4 -1
  117. package/src/react/components/auth/PasswordSetFields.tsx +7 -11
  118. package/src/react/components/auth/PasswordStrengthMeter.tsx +5 -3
  119. package/src/react/components/auth/RegisterForm.tsx +6 -6
  120. package/src/react/components/auth/SignupForm.spec.tsx +17 -0
  121. package/src/react/components/auth/SignupForm.tsx +11 -10
  122. package/src/react/components/auth/TotpEntry.spec.tsx +27 -0
  123. package/src/react/components/auth/TotpEntry.tsx +18 -1
  124. package/src/react/components/auth/fields.tsx +8 -1
  125. package/src/react/components/calendar/DayAgenda.spec.tsx +9 -0
  126. package/src/react/components/calendar/DayAgenda.tsx +5 -2
  127. package/src/react/components/calendar/EventChip.spec.tsx +12 -8
  128. package/src/react/components/calendar/EventChip.tsx +11 -6
  129. package/src/react/components/calendar/MonthGrid.tsx +1 -1
  130. package/src/react/components/calendar/WeekView.tsx +5 -3
  131. package/src/react/components/calendar/colorUtils.ts +13 -11
  132. package/src/react/components/fieldErrorText.tsx +17 -0
  133. package/src/react/deep-link/resume.spec.tsx +16 -0
  134. package/src/react/deep-link/resume.ts +9 -2
  135. package/src/react/file-tree/FileTree.tsx +14 -1
  136. package/src/react/file-tree/FolderViewMenus.tsx +57 -17
  137. package/src/react/file-tree/folderView.spec.ts +63 -1
  138. package/src/react/file-tree/folderView.ts +63 -12
  139. package/src/react/file-tree/folderViewTree.spec.tsx +111 -16
  140. package/src/react/file-tree/index.ts +15 -1
  141. package/src/react/file-tree/useFolderView.ts +73 -12
  142. package/src/styles-areas/analytics.css +26 -25
  143. package/src/styles-areas/calendar.css +4 -4
  144. package/src/styles-areas/data-table.css +26 -25
  145. package/src/styles-utilities.css +24 -9
@@ -17,6 +17,13 @@
17
17
  * announced — *"Hiding or showing by tag can be stored per machine, so viewing the 'home'
18
18
  * tag at home doesn't change my work computer."*
19
19
  *
20
+ * An app that already keeps its own settings record hands the marks over instead — `store` — and
21
+ * then nothing goes to `localStorage` or the bus: desk carries them in its global settings blob
22
+ * beside the rest of its synced state, and vault seals them inside the vault, because its folder
23
+ * ids are folder NAMES and must never reach a disk in plaintext. `device: 'memory'` keeps the
24
+ * device half in page memory for the same reason; with it, "Hide on this device" is not offered,
25
+ * since a device list forgotten on reload would be a hide that silently undoes itself.
26
+ *
20
27
  * And because the tree's header belongs to the APP (collections' `FilterRail` section, desk's
21
28
  * explorer bar), the view menu has to be openable from outside the tree: the hook holds which
22
29
  * menu is open, and the tree draws it. `onContextMenu` is the one handler an app puts on its
@@ -27,6 +34,8 @@ import { useRememberedPreference } from '../media-gallery/rememberedPreference.j
27
34
  import {
28
35
  type FolderMarks,
29
36
  type FolderViewLocal,
37
+ type HiddenScope,
38
+ hiddenScope,
30
39
  normalizeTag,
31
40
  parseFolderMarks,
32
41
  parseFolderViewLocal,
@@ -50,14 +59,23 @@ export type FolderViewPanel =
50
59
  | { kind: 'view'; at: FolderViewPoint }
51
60
  | { kind: 'tags'; at: FolderViewPoint | null; ids: readonly string[] };
52
61
 
62
+ /** Which list a hide writes to, or an unhide takes from. */
63
+ export type HideScope = 'everywhere' | 'device';
64
+
53
65
  export interface FolderView {
54
66
  marks: FolderMarks;
55
67
  local: FolderViewLocal;
56
68
  /** Every tag in use, most-used first. */
57
69
  tags: readonly TagCount[];
70
+ /** Whether "Hide on this device" is offered — false when the device half is not kept. */
71
+ deviceHiding: boolean;
72
+ /** Which of the two lists hide this folder, if any. */
73
+ hiddenIn: (id: string) => HiddenScope | null;
58
74
 
59
- hide: (ids: readonly string[]) => void;
60
- unhide: (ids: readonly string[]) => void;
75
+ /** Hide these folders — everywhere unless `scope: 'device'`. */
76
+ hide: (ids: readonly string[], options?: { scope?: HideScope }) => void;
77
+ /** Unhide these folders from the one list named, or from both when none is. */
78
+ unhide: (ids: readonly string[], options?: { scope?: HideScope }) => void;
61
79
  /** Add or take away one tag on each folder named. */
62
80
  toggleTag: (ids: readonly string[], tag: string) => void;
63
81
  /** Replace one folder's tags. */
@@ -88,11 +106,39 @@ export interface UseFolderViewOptions {
88
106
  * origin must not hide each other's folders.
89
107
  */
90
108
  key: string;
109
+ /**
110
+ * The app keeps the marks itself — its own synced settings, or a sealed record. `marks` is
111
+ * what it holds now (`null` for none) and `write` is called with the next value to keep.
112
+ * Given a store, the marks never touch `localStorage` or the preference bus.
113
+ */
114
+ store?: FolderMarksStore;
115
+ /**
116
+ * Where this device's view (show hidden, the tag filter, the device-only hidden list) lives:
117
+ * `'local'` (the default) is `localStorage` under `${key}:device`, never announced;
118
+ * `'memory'` is this page only, for an app whose folder ids may not be written to disk.
119
+ */
120
+ device?: 'local' | 'memory';
91
121
  }
92
122
 
93
- export function useFolderView({ key }: UseFolderViewOptions): FolderView {
94
- const [rawMarks, writeMarks] = useRememberedPreference(key);
95
- const [rawLocal, writeLocal] = useRememberedPreference(`${key}:device`, { announce: false });
123
+ /** The marks, kept by the app — see {@link UseFolderViewOptions.store}. */
124
+ export interface FolderMarksStore {
125
+ /** The stored form (`serializeFolderMarks`), or `null` for no marks. */
126
+ marks: string | null;
127
+ write: (next: string | null) => void;
128
+ }
129
+
130
+ export function useFolderView({ key, store, device = 'local' }: UseFolderViewOptions): FolderView {
131
+ // Hooks run unconditionally; an undefined key is the remembered preference that keeps nothing.
132
+ const [rememberedMarks, rememberMarks] = useRememberedPreference(store ? undefined : key);
133
+ const [rememberedLocal, rememberLocal] = useRememberedPreference(
134
+ device === 'local' ? `${key}:device` : undefined,
135
+ { announce: false },
136
+ );
137
+ const [memoryLocal, setMemoryLocal] = useState<string | null>(null);
138
+ const rawMarks = store ? store.marks : rememberedMarks;
139
+ const writeMarks = store ? store.write : rememberMarks;
140
+ const rawLocal = device === 'local' ? rememberedLocal : memoryLocal;
141
+ const writeLocal = device === 'local' ? rememberLocal : setMemoryLocal;
96
142
  const marks = useMemo(() => parseFolderMarks(rawMarks), [rawMarks]);
97
143
  const local = useMemo(() => parseFolderViewLocal(rawLocal), [rawLocal]);
98
144
  const tags = useMemo(() => tagCounts(marks), [marks]);
@@ -114,13 +160,20 @@ export function useFolderView({ key }: UseFolderViewOptions): FolderView {
114
160
  },
115
161
  [writeMarks],
116
162
  );
163
+ // The same rule for this device's view: an Undo of "Hide on this device" must see the hide.
164
+ const latestLocal = useRef(local);
165
+ latestLocal.current = local;
117
166
  const saveLocal = useCallback(
118
167
  (next: FolderViewLocal) => {
119
- const empty = !next.showHidden && next.only.length === 0 && next.hide.length === 0;
168
+ if (next === latestLocal.current) return;
169
+ latestLocal.current = next;
170
+ const empty =
171
+ !next.showHidden && next.only.length === 0 && next.hide.length === 0 && next.hidden.length === 0;
120
172
  writeLocal(empty ? null : JSON.stringify(next));
121
173
  },
122
174
  [writeLocal],
123
175
  );
176
+ const deviceHiding = device === 'local';
124
177
 
125
178
  const onContextMenu = useCallback((event: { clientX: number; clientY: number; preventDefault: () => void }) => {
126
179
  event.preventDefault();
@@ -132,8 +185,16 @@ export function useFolderView({ key }: UseFolderViewOptions): FolderView {
132
185
  marks,
133
186
  local,
134
187
  tags,
135
- hide: (ids) => saveMarks(setHidden(latest.current, ids, true)),
136
- unhide: (ids) => saveMarks(setHidden(latest.current, ids, false)),
188
+ deviceHiding,
189
+ hiddenIn: (id) => hiddenScope(marks, local, id),
190
+ hide: (ids, options) => {
191
+ if (options?.scope === 'device' && deviceHiding) saveLocal(setHidden(latestLocal.current, ids, true));
192
+ else saveMarks(setHidden(latest.current, ids, true));
193
+ },
194
+ unhide: (ids, options) => {
195
+ if (options?.scope !== 'device') saveMarks(setHidden(latest.current, ids, false));
196
+ if (options?.scope !== 'everywhere') saveLocal(setHidden(latestLocal.current, ids, false));
197
+ },
137
198
  toggleTag: (ids, raw) => {
138
199
  const tag = normalizeTag(raw);
139
200
  if (!tag || ids.length === 0) return;
@@ -148,15 +209,15 @@ export function useFolderView({ key }: UseFolderViewOptions): FolderView {
148
209
  saveMarks(next);
149
210
  },
150
211
  setTags: (id, list) => saveMarks(setFolderTags(latest.current, id, list)),
151
- setShowHidden: (show) => saveLocal({ ...local, showHidden: show }),
152
- filterTag: (tag, mode) => saveLocal(setTagFilter(local, tag, mode)),
153
- clearTagFilter: () => saveLocal({ ...local, only: [], hide: [] }),
212
+ setShowHidden: (show) => saveLocal({ ...latestLocal.current, showHidden: show }),
213
+ filterTag: (tag, mode) => saveLocal(setTagFilter(latestLocal.current, tag, mode)),
214
+ clearTagFilter: () => saveLocal({ ...latestLocal.current, only: [], hide: [] }),
154
215
  panel,
155
216
  openViewMenu: (at) => setPanel({ kind: 'view', at }),
156
217
  openTagEditor: (ids, at) => setPanel({ kind: 'tags', at: at ?? null, ids }),
157
218
  closePanel: () => setPanel(null),
158
219
  onContextMenu,
159
220
  }),
160
- [marks, local, tags, panel, saveMarks, saveLocal, onContextMenu],
221
+ [marks, local, tags, deviceHiding, panel, saveMarks, saveLocal, onContextMenu],
161
222
  );
162
223
  }
@@ -18,35 +18,36 @@
18
18
  * after an app's responsive variant (task 2124). An app that imports every area gets exactly
19
19
  * what `cursedbelt/styles-utilities.css` emits — proved rule by rule in
20
20
  * src/stylesAreas.spec.ts, which is also what fails when this file is stale.
21
- * 148 candidate(s).
21
+ * 154 candidate(s).
22
22
  *
23
23
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
24
24
  * `bun run build` runs. The map of what is in which area, and why the areas are
25
25
  * import closures rather than a hand-written list, is scripts/styleAreas.ts.
26
26
  */
27
- @source inline("-m-1 -mt-2 -mt-6 -mx-1 -my-2.5 -my-3 @3xl:block @3xl:hidden @max-2xl:[&>*]:hidden");
28
- @source inline("@max-2xl:border-0 @max-2xl:min-w-0! @max-2xl:p-0! @max-2xl:w-0! @max-4xl:[&>*]:hidden");
27
+ @source inline("-m-1 -mt-2 -mt-6 -mx-1 -my-2.5 -my-3 @3xl:block @3xl:hidden @max-2xl @max-2xl:[&>*]:hidden");
28
+ @source inline("@max-2xl:border-0 @max-2xl:inline-flex @max-2xl:justify-center @max-2xl:min-w-0!");
29
+ @source inline("@max-2xl:min-w-11 @max-2xl:p-0! @max-2xl:sr-only @max-2xl:w-0! @max-4xl:[&>*]:hidden");
29
30
  @source inline("@max-4xl:border-0 @max-4xl:min-w-0! @max-4xl:p-0! @max-4xl:w-0! @max-6xl:[&>*]:hidden");
30
31
  @source inline("@max-6xl:border-0 @max-6xl:min-w-0! @max-6xl:p-0! @max-6xl:w-0! @xl:block @xl:hidden");
31
- @source inline("[&>*]:hidden [&>*]:max-w-none [&_svg]:size-3 [overflow-wrap:anywhere] active:cursor-grabbing");
32
- @source inline("appearance appearance-none bg-[var(--cb-frozen-bg)] bg-card/95 bg-gradient-to-t bg-muted/30");
33
- @source inline("bg-muted/40 bg-muted/50 border-accent-solid border-accent/60 border-field-error border-l");
34
- @source inline("border-r col collapse cursor-grab data-[ending-style]:opacity-0 data-[ending-style]:scale-95");
35
- @source inline("data-[highlighted]:bg-accent/10 data-[highlighted]:text-accent-strong");
36
- @source inline("data-[starting-style]:opacity-0 data-[starting-style]:scale-95");
37
- @source inline("data-[state=closed]:slide-out-to-bottom data-[state=closed]:slide-out-to-left");
38
- @source inline("data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-bottom");
39
- @source inline("data-[state=open]:slide-in-from-left data-[state=open]:slide-in-from-right disabled:opacity-40");
40
- @source inline("duration-100 fade-in focus-visible:ring-field-ring/40 focus-within:border-field-ring");
41
- @source inline("focus-within:ring-2 focus-within:ring-field-ring/30 from-card h-105");
42
- @source inline("has-[[aria-invalid=true]]:border-field-error hover:bg-background hover:bg-border");
43
- @source inline("hover:bg-muted/40 hover:border-field-ring hover:text-warning italic justify-self-end");
44
- @source inline("last:border-0 left-0 left-11 left-2.5 list-none max-h-64 max-h-88 max-h-[var(--sheet-h-lg)]");
45
- @source inline("max-h-[var(--sheet-h-md)] max-h-[var(--sheet-h-sm)] max-w-32 max-w-36 max-w-45 max-w-48 max-w-60");
46
- @source inline("max-w-sm min-h-20 min-h-dvh min-w-0! min-w-20 min-w-24 min-w-52 min-w-[var(--anchor-width)]");
47
- @source inline("min-w-max ml-1.5 mr-2 mt-1.5 mt-3 mt-4 not-italic ordinal p-0! pb-1.5 pl-1.5 pl-2 pr-0.5 pr-1");
48
- @source inline("pr-10 pr-16 pr-3 pr-9 pt-1 resize-none resize-y right-3 ring-field-error/30 rounded-l-xl");
49
- @source inline("rounded-r-xl rounded-t-xl self self-center self-stretch shadow-[1px_0_0_0_var(--color-border)]");
50
- @source inline("shrink-[2] size-2 size-7 slide-in-from-top-1 table-fixed text-accent-solid-foreground");
51
- @source inline("text-field-placeholder text-muted-foreground/60 text-success text-xl to-transparent top-3");
52
- @source inline("transition-[transform,opacity] w-0! w-11 w-20 w-32 w-36 w-40 w-88");
32
+ @source inline("[&>*]:hidden [&>*]:max-w-none [&>svg]:size-3.5 [&_svg]:size-3 [overflow-wrap:anywhere]");
33
+ @source inline("active:cursor-grabbing appearance appearance-none bg-[var(--cb-frozen-bg)] bg-card/95");
34
+ @source inline("bg-gradient-to-t bg-muted/30 bg-muted/40 bg-muted/50 border-accent-solid border-accent/60");
35
+ @source inline("border-field-error border-l border-r col collapse cursor-grab data-[ending-style]:opacity-0");
36
+ @source inline("data-[ending-style]:scale-95 data-[highlighted]:bg-accent/10");
37
+ @source inline("data-[highlighted]:text-accent-strong data-[starting-style]:opacity-0");
38
+ @source inline("data-[starting-style]:scale-95 data-[state=closed]:slide-out-to-bottom");
39
+ @source inline("data-[state=closed]:slide-out-to-left data-[state=closed]:slide-out-to-right");
40
+ @source inline("data-[state=open]:slide-in-from-bottom data-[state=open]:slide-in-from-left");
41
+ @source inline("data-[state=open]:slide-in-from-right disabled:opacity-40 duration-100 fade-in");
42
+ @source inline("focus-visible:ring-field-ring/40 focus-within:border-field-ring focus-within:ring-2");
43
+ @source inline("focus-within:ring-field-ring/30 from-card h-105 has-[[aria-invalid=true]]:border-field-error");
44
+ @source inline("hover:bg-background hover:bg-border hover:bg-muted/40 hover:border-field-ring hover:text-warning");
45
+ @source inline("italic justify-self-end last:border-0 left-0 left-11 left-2.5 list-none max-h-64 max-h-88");
46
+ @source inline("max-h-[var(--sheet-h-lg)] max-h-[var(--sheet-h-md)] max-h-[var(--sheet-h-sm)] max-w-32 max-w-36");
47
+ @source inline("max-w-45 max-w-48 max-w-60 max-w-sm min-h-20 min-h-dvh min-w-0! min-w-20 min-w-24 min-w-52");
48
+ @source inline("min-w-[var(--anchor-width)] min-w-max ml-1.5 mr-2 mt-1.5 mt-3 mt-4 not-italic ordinal p-0!");
49
+ @source inline("pb-1.5 pl-1.5 pl-2 pr-0.5 pr-1 pr-10 pr-16 pr-3 pr-9 pt-1 resize-none resize-y right-3");
50
+ @source inline("ring-field-error/30 rounded-l-xl rounded-r-xl rounded-t-xl self self-center self-stretch");
51
+ @source inline("shadow-[1px_0_0_0_var(--color-border)] shrink-[2] size-2 size-7 slide-in-from-top-1 table-fixed");
52
+ @source inline("text-accent-solid-foreground text-field-placeholder text-muted-foreground/60 text-success");
53
+ @source inline("text-xl to-transparent top-3 transition-[transform,opacity] w-0! w-11 w-20 w-32 w-36 w-40 w-88");
@@ -18,7 +18,7 @@
18
18
  * after an app's responsive variant (task 2124). An app that imports every area gets exactly
19
19
  * what `cursedbelt/styles-utilities.css` emits — proved rule by rule in
20
20
  * src/stylesAreas.spec.ts, which is also what fails when this file is stale.
21
- * 79 candidate(s).
21
+ * 78 candidate(s).
22
22
  *
23
23
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
24
24
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -32,9 +32,9 @@
32
32
  @source inline("dark:bg-sky-900/40 dark:bg-slate-800 dark:bg-teal-900/40 dark:bg-violet-900/40");
33
33
  @source inline("dark:text-amber-200 dark:text-blue-200 dark:text-emerald-200 dark:text-green-200");
34
34
  @source inline("dark:text-purple-200 dark:text-rose-200 dark:text-sky-200 dark:text-slate-200 dark:text-teal-200");
35
- @source inline("dark:text-violet-200 focus:opacity-100 g grid-cols-[repeat(7,minmax(0,1fr))]");
35
+ @source inline("dark:text-violet-200 focus:opacity-100 grid-cols-[repeat(7,minmax(0,1fr))]");
36
36
  @source inline("group-focus-within:opacity-100 h-3.5 hover:bg-muted/30 hover:bg-muted/40 hover:border-border/80");
37
37
  @source inline("last:border-r-0 line-through min-h-28 min-h-40 outline-1 outline-dashed outline-tone-amber-ink");
38
- @source inline("p-1.5 sm:flex-row sm:gap-1 sm:items-center sm:min-h-0 sm:min-h-24 sm:px-1.5 sm:text-xs");
38
+ @source inline("p-1.5 sm:inline sm:min-h-0 sm:min-h-24 sm:px-1.5 sm:text-xs text-accent-solid-foreground");
39
39
  @source inline("text-amber-900 text-blue-800 text-emerald-800 text-green-800 text-purple-800 text-rose-800");
40
- @source inline("text-sky-800 text-slate-800 text-teal-800 text-tone-amber-ink text-violet-800 w-3.5");
40
+ @source inline("text-sky-800 text-slate-800 text-teal-800 text-tone-amber-ink text-violet-800 w-20 w-3.5");
@@ -18,35 +18,36 @@
18
18
  * after an app's responsive variant (task 2124). An app that imports every area gets exactly
19
19
  * what `cursedbelt/styles-utilities.css` emits — proved rule by rule in
20
20
  * src/stylesAreas.spec.ts, which is also what fails when this file is stale.
21
- * 144 candidate(s).
21
+ * 150 candidate(s).
22
22
  *
23
23
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
24
24
  * `bun run build` runs. The map of what is in which area, and why the areas are
25
25
  * import closures rather than a hand-written list, is scripts/styleAreas.ts.
26
26
  */
27
- @source inline("-m-1 -mt-2 -mt-6 -mx-1 -my-2.5 -my-3 @3xl:block @3xl:hidden @max-2xl:[&>*]:hidden");
28
- @source inline("@max-2xl:border-0 @max-2xl:min-w-0! @max-2xl:p-0! @max-2xl:w-0! @max-4xl:[&>*]:hidden");
27
+ @source inline("-m-1 -mt-2 -mt-6 -mx-1 -my-2.5 -my-3 @3xl:block @3xl:hidden @max-2xl @max-2xl:[&>*]:hidden");
28
+ @source inline("@max-2xl:border-0 @max-2xl:inline-flex @max-2xl:justify-center @max-2xl:min-w-0!");
29
+ @source inline("@max-2xl:min-w-11 @max-2xl:p-0! @max-2xl:sr-only @max-2xl:w-0! @max-4xl:[&>*]:hidden");
29
30
  @source inline("@max-4xl:border-0 @max-4xl:min-w-0! @max-4xl:p-0! @max-4xl:w-0! @max-6xl:[&>*]:hidden");
30
31
  @source inline("@max-6xl:border-0 @max-6xl:min-w-0! @max-6xl:p-0! @max-6xl:w-0! @xl:block @xl:hidden");
31
- @source inline("[&>*]:hidden [&>*]:max-w-none [&_svg]:size-3 [overflow-wrap:anywhere] active:cursor-grabbing");
32
- @source inline("appearance appearance-none bg-[var(--cb-frozen-bg)] bg-card/95 bg-gradient-to-t bg-muted/30");
33
- @source inline("bg-muted/50 border-accent-solid border-accent/60 border-field-error border-l border-r col");
34
- @source inline("collapse cursor-grab data-[ending-style]:opacity-0 data-[ending-style]:scale-95");
35
- @source inline("data-[highlighted]:bg-accent/10 data-[highlighted]:text-accent-strong");
36
- @source inline("data-[starting-style]:opacity-0 data-[starting-style]:scale-95");
37
- @source inline("data-[state=closed]:slide-out-to-bottom data-[state=closed]:slide-out-to-left");
38
- @source inline("data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-bottom");
39
- @source inline("data-[state=open]:slide-in-from-left data-[state=open]:slide-in-from-right disabled:opacity-40");
40
- @source inline("duration-100 fade-in focus-visible:ring-field-ring/40 focus-within:border-field-ring");
41
- @source inline("focus-within:ring-2 focus-within:ring-field-ring/30 from-card h-105");
42
- @source inline("has-[[aria-invalid=true]]:border-field-error hover:bg-background hover:bg-border");
43
- @source inline("hover:bg-muted/40 hover:border-field-ring hover:text-warning justify-self-end last:border-0");
44
- @source inline("left-0 left-11 left-2.5 list-none max-h-64 max-h-88 max-h-[var(--sheet-h-lg)]");
45
- @source inline("max-h-[var(--sheet-h-md)] max-h-[var(--sheet-h-sm)] max-w-32 max-w-36 max-w-45 max-w-48 max-w-60");
46
- @source inline("max-w-sm min-h-20 min-h-dvh min-w-0! min-w-24 min-w-52 min-w-[var(--anchor-width)] min-w-max");
47
- @source inline("ml-1.5 mr-2 mt-1.5 mt-3 mt-4 not-italic ordinal p-0! pb-1.5 pl-1.5 pl-2 pr-0.5 pr-1 pr-10 pr-16");
48
- @source inline("pr-3 pr-9 pt-1 resize-none resize-y right-3 ring-field-error/30 rounded-l-xl rounded-r-xl");
49
- @source inline("rounded-t-xl self self-center self-stretch shadow-[1px_0_0_0_var(--color-border)] size-2 size-7");
50
- @source inline("slide-in-from-top-1 table-fixed text-accent-solid-foreground text-field-placeholder");
51
- @source inline("text-muted-foreground/60 text-success text-xl to-transparent top-3");
52
- @source inline("transition-[transform,opacity] w-0! w-11 w-20 w-32 w-36 w-40 w-88");
32
+ @source inline("[&>*]:hidden [&>*]:max-w-none [&>svg]:size-3.5 [&_svg]:size-3 [overflow-wrap:anywhere]");
33
+ @source inline("active:cursor-grabbing appearance appearance-none bg-[var(--cb-frozen-bg)] bg-card/95");
34
+ @source inline("bg-gradient-to-t bg-muted/30 bg-muted/50 border-accent-solid border-accent/60 border-field-error");
35
+ @source inline("border-l border-r col collapse cursor-grab data-[ending-style]:opacity-0");
36
+ @source inline("data-[ending-style]:scale-95 data-[highlighted]:bg-accent/10");
37
+ @source inline("data-[highlighted]:text-accent-strong data-[starting-style]:opacity-0");
38
+ @source inline("data-[starting-style]:scale-95 data-[state=closed]:slide-out-to-bottom");
39
+ @source inline("data-[state=closed]:slide-out-to-left data-[state=closed]:slide-out-to-right");
40
+ @source inline("data-[state=open]:slide-in-from-bottom data-[state=open]:slide-in-from-left");
41
+ @source inline("data-[state=open]:slide-in-from-right disabled:opacity-40 duration-100 fade-in");
42
+ @source inline("focus-visible:ring-field-ring/40 focus-within:border-field-ring focus-within:ring-2");
43
+ @source inline("focus-within:ring-field-ring/30 from-card h-105 has-[[aria-invalid=true]]:border-field-error");
44
+ @source inline("hover:bg-background hover:bg-border hover:bg-muted/40 hover:border-field-ring hover:text-warning");
45
+ @source inline("justify-self-end last:border-0 left-0 left-11 left-2.5 list-none max-h-64 max-h-88");
46
+ @source inline("max-h-[var(--sheet-h-lg)] max-h-[var(--sheet-h-md)] max-h-[var(--sheet-h-sm)] max-w-32 max-w-36");
47
+ @source inline("max-w-45 max-w-48 max-w-60 max-w-sm min-h-20 min-h-dvh min-w-0! min-w-24 min-w-52");
48
+ @source inline("min-w-[var(--anchor-width)] min-w-max ml-1.5 mr-2 mt-1.5 mt-3 mt-4 not-italic ordinal p-0!");
49
+ @source inline("pb-1.5 pl-1.5 pl-2 pr-0.5 pr-1 pr-10 pr-16 pr-3 pr-9 pt-1 resize-none resize-y right-3");
50
+ @source inline("ring-field-error/30 rounded-l-xl rounded-r-xl rounded-t-xl self self-center self-stretch");
51
+ @source inline("shadow-[1px_0_0_0_var(--color-border)] size-2 size-7 slide-in-from-top-1 table-fixed");
52
+ @source inline("text-accent-solid-foreground text-field-placeholder text-muted-foreground/60 text-success");
53
+ @source inline("text-xl to-transparent top-3 transition-[transform,opacity] w-0! w-11 w-20 w-32 w-36 w-40 w-88");
@@ -4337,18 +4337,9 @@
4337
4337
  .sm\:grid-cols-\[minmax\(7rem\,34rem\)_minmax\(4rem\,1fr\)_auto\] {
4338
4338
  grid-template-columns: minmax(7rem,34rem) minmax(4rem,1fr) auto;
4339
4339
  }
4340
- .sm\:flex-row {
4341
- flex-direction: row;
4342
- }
4343
4340
  .sm\:flex-nowrap {
4344
4341
  flex-wrap: nowrap;
4345
4342
  }
4346
- .sm\:items-center {
4347
- align-items: center;
4348
- }
4349
- .sm\:gap-1 {
4350
- gap: var(--spacing);
4351
- }
4352
4343
  .sm\:gap-3 {
4353
4344
  gap: calc(var(--spacing) * 3);
4354
4345
  }
@@ -4504,12 +4495,32 @@
4504
4495
  }
4505
4496
  }
4506
4497
  @container (width < 42rem) {
4498
+ .\@max-2xl\:sr-only {
4499
+ position: absolute;
4500
+ width: 1px;
4501
+ height: 1px;
4502
+ padding: 0;
4503
+ margin: -1px;
4504
+ overflow: hidden;
4505
+ clip-path: inset(50%);
4506
+ white-space: nowrap;
4507
+ border-width: 0;
4508
+ }
4509
+ .\@max-2xl\:inline-flex {
4510
+ display: inline-flex;
4511
+ }
4507
4512
  .\@max-2xl\:w-0\! {
4508
4513
  width: 0px !important;
4509
4514
  }
4510
4515
  .\@max-2xl\:min-w-0\! {
4511
4516
  min-width: 0px !important;
4512
4517
  }
4518
+ .\@max-2xl\:min-w-11 {
4519
+ min-width: calc(var(--spacing) * 11);
4520
+ }
4521
+ .\@max-2xl\:justify-center {
4522
+ justify-content: center;
4523
+ }
4513
4524
  .\@max-2xl\:border-0 {
4514
4525
  border-style: var(--tw-border-style);
4515
4526
  border-width: 0px;
@@ -4957,6 +4968,10 @@
4957
4968
  .\[\&\>span\>button\]\:rounded-none > span > button {
4958
4969
  border-radius: 0;
4959
4970
  }
4971
+ .\[\&\>svg\]\:size-3\.5 > svg {
4972
+ width: calc(var(--spacing) * 3.5);
4973
+ height: calc(var(--spacing) * 3.5);
4974
+ }
4960
4975
  }
4961
4976
  @property --tw-translate-x {
4962
4977
  syntax: "*";