cursedbelt 5.92.1 → 5.92.3

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 (39) hide show
  1. package/dist/react/components/Button.d.ts.map +1 -1
  2. package/dist/react/components/Button.js +6 -0
  3. package/dist/react/components/Button.js.map +1 -1
  4. package/dist/react/components/CommentThread.d.ts.map +1 -1
  5. package/dist/react/components/CommentThread.js +6 -2
  6. package/dist/react/components/CommentThread.js.map +1 -1
  7. package/dist/react/components/DataTable/DataTable.d.ts.map +1 -1
  8. package/dist/react/components/DataTable/DataTable.js +39 -2
  9. package/dist/react/components/DataTable/DataTable.js.map +1 -1
  10. package/dist/react/components/ReactionBar.d.ts.map +1 -1
  11. package/dist/react/components/ReactionBar.js +4 -2
  12. package/dist/react/components/ReactionBar.js.map +1 -1
  13. package/dist/react/components/TagsInput.d.ts +1 -1
  14. package/dist/react/components/TagsInput.d.ts.map +1 -1
  15. package/dist/react/components/TagsInput.js +5 -1
  16. package/dist/react/components/TagsInput.js.map +1 -1
  17. package/dist/react/nav/HeaderSearch.d.ts.map +1 -1
  18. package/dist/react/nav/HeaderSearch.js +4 -1
  19. package/dist/react/nav/HeaderSearch.js.map +1 -1
  20. package/dist/styles-areas/core.css +9 -9
  21. package/dist/styles-areas/nav.css +13 -13
  22. package/dist/styles-utilities.css +3 -0
  23. package/package.json +8 -1
  24. package/scripts/checkAreaStyles.spec.ts +14 -0
  25. package/scripts/checkAreaStyles.ts +15 -1
  26. package/src/react/components/Button.tsx +6 -0
  27. package/src/react/components/CommentThread.spec.tsx +8 -0
  28. package/src/react/components/CommentThread.tsx +5 -2
  29. package/src/react/components/DataTable/DataTable.tsx +36 -2
  30. package/src/react/components/ReactionBar.spec.tsx +8 -0
  31. package/src/react/components/ReactionBar.tsx +5 -3
  32. package/src/react/components/TagsInput.spec.tsx +9 -0
  33. package/src/react/components/TagsInput.tsx +5 -1
  34. package/src/react/hooks/useScrollMemory.spec.tsx +8 -7
  35. package/src/react/nav/HeaderSearch.tsx +3 -1
  36. package/src/react/nav/nav.spec.tsx +6 -0
  37. package/src/styles-areas/core.css +9 -9
  38. package/src/styles-areas/nav.css +13 -13
  39. package/src/styles-utilities.css +3 -0
@@ -1 +1 @@
1
- {"version":3,"file":"TagsInput.d.ts","sourceRoot":"","sources":["../../../src/react/components/TagsInput.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAA+B,MAAM,OAAO,CAAC;AAE5F,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG7E,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;yEAEqE;IACrE,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAaD;qFACqF;AACrF,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,oGAAoG;AACpG,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;kBAC9G,MAAM;sBAKF,MAAM;mBACT,aAAa,CAAC,gBAAgB,CAAC;cASpC,MAAM;EASxB;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,UAU3G;AAED,eAAO,MAAM,gBAAgB,0IAC4G,CAAC;AAE1I,6CAA6C;AAE7C,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,iCAc7I;AAED,KAAK,eAAe,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;AAKrD,uEAAuE;AACvE,wBAAgB,0BAA0B,IAAI,OAAO,CAAC,eAAe,CAAC,CAQrE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BA+B9C"}
1
+ {"version":3,"file":"TagsInput.d.ts","sourceRoot":"","sources":["../../../src/react/components/TagsInput.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAA+B,MAAM,OAAO,CAAC;AAE5F,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI7E,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;yEAEqE;IACrE,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAaD;qFACqF;AACrF,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,oGAAoG;AACpG,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;kBAC9G,MAAM;sBAKF,MAAM;mBACT,aAAa,CAAC,gBAAgB,CAAC;cASpC,MAAM;EASxB;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,UAU3G;AAKD,eAAO,MAAM,gBAAgB,kKACiI,CAAC;AAE/J,6CAA6C;AAE7C,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,iCAc7I;AAED,KAAK,eAAe,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;AAKrD,uEAAuE;AACvE,wBAAgB,0BAA0B,IAAI,OAAO,CAAC,eAAe,CAAC,CAQrE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BA+B9C"}
@@ -3,6 +3,7 @@ import { X } from 'lucide-react';
3
3
  import { useEffect, useRef, useState } from 'react';
4
4
  import { cn } from '../lib/cn.js';
5
5
  import { CONTROL_MIN_HEIGHT_CLASS } from '../lib/field.js';
6
+ import { TAP_TARGET_HEIGHT } from '../lib/tapTarget.js';
6
7
  import { IconButton } from './IconButton.js';
7
8
  /** Append `additions` to `current`, trimming + dropping empties and duplicates
8
9
  * (case-sensitive, against both the existing tags and each other). */
@@ -55,7 +56,10 @@ export function tagsRowClass(size, disabled, className) {
55
56
  // guardrails-ignore control-height-tokens: min-height chip-wrapping row (not fixed) — py- clears wrapped lines
56
57
  'flex w-full flex-wrap items-center gap-1.5 rounded-field border border-field-border bg-field-bg px-2 py-1 transition focus-within:border-field-ring focus-within:ring-2 focus-within:ring-field-ring/30 aria-[invalid=true]:border-field-error', CONTROL_MIN_HEIGHT_CLASS[size], disabled && 'cursor-not-allowed opacity-50', className);
57
58
  }
58
- export const TAGS_INPUT_CLASS = 'min-w-24 flex-1 bg-transparent py-0.5 text-base text-field-fg outline-none placeholder:text-field-placeholder sm:pointer-fine:text-sm';
59
+ // `TAP_TARGET_HEIGHT`: at `py-0.5` the draft input was 28px tall on a coarse pointer, under the
60
+ // 44px tap floor (DESIGN.md LAY-13) — the row itself grows with it since this input is a flex
61
+ // child of `tagsRowClass`'s `items-center` row.
62
+ export const TAGS_INPUT_CLASS = `min-w-24 flex-1 bg-transparent py-0.5 text-base text-field-fg outline-none placeholder:text-field-placeholder sm:pointer-fine:text-sm ${TAP_TARGET_HEIGHT}`;
59
63
  /** The committed tags as removable chips. */
60
64
  // no-attribute-forward: a list of chips with no element of its own — the row it sits in takes the caller's attributes
61
65
  export function TagChips({ value, disabled, onRemove }) {
@@ -1 +1 @@
1
- {"version":3,"file":"TagsInput.js","sourceRoot":"","sources":["../../../src/react/components/TagsInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TagsInput.js","sourceRoot":"","sources":["../../../src/react/components/TagsInput.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderSearch.d.ts","sourceRoot":"","sources":["../../../src/react/nav/HeaderSearch.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,SAAS,EAA4B,MAAM,OAAO,CAAC;AACjE,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAK3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,KAAK,iBAAiB,EAIvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,4EAA4E;IAC5E,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,4FAA4F;IAC5F,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAuB,EACvB,UAAc,EACd,QAAY,EACZ,UAAoB,EACpB,YAA4B,EAC5B,aAAa,EACb,UAAU,EACV,eAAe,EACf,WAAW,EACX,SAAS,EACT,GAAG,IAAI,EACR,EAAE,iBAAiB,+BAqKnB"}
1
+ {"version":3,"file":"HeaderSearch.d.ts","sourceRoot":"","sources":["../../../src/react/nav/HeaderSearch.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,SAAS,EAA4B,MAAM,OAAO,CAAC;AACjE,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAK3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,KAAK,iBAAiB,EAIvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,4EAA4E;IAC5E,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,4FAA4F;IAC5F,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAuB,EACvB,UAAc,EACd,QAAY,EACZ,UAAoB,EACpB,YAA4B,EAC5B,aAAa,EACb,UAAU,EACV,eAAe,EACf,WAAW,EACX,SAAS,EACT,GAAG,IAAI,EACR,EAAE,iBAAiB,+BAuKnB"}
@@ -110,7 +110,10 @@ export function HeaderSearch({ catalogue, serverGroups, onQueryChange, placehold
110
110
  }
111
111
  }
112
112
  };
113
- return (_jsxs("div", { ...rest, className: cn('relative w-full', className), "data-cb-headersearch": '', children: [_jsxs("div", { className: 'relative', ref: refs.setReference, ...getReferenceProps(), children: [_jsx(Search, { className: 'pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground', "aria-hidden": 'true' }), _jsx(Input, { type: 'search', role: 'combobox', "aria-expanded": showPanel, "aria-controls": listboxId, "aria-autocomplete": 'list', "aria-activedescendant": showPanel && activeRow ? searchOptionId(baseId, activeRow.id) : undefined, placeholder: placeholder, value: query, className: 'pl-9 pr-9', onChange: (e) => update(e.target.value), onFocus: () => query.trim().length >= minChars && setOpen(true), onKeyDown: onKeyDown }), query && (_jsx(IconButton, { label: 'Clear search', variant: 'ghost', onClick: clear, className: 'absolute right-2 top-1/2 size-6 -translate-y-1/2 [&_svg]:size-4', children: _jsx(X, {}) }))] }), showPanel && (_jsx(FloatingPortal, { children: _jsx("div", { ref: refs.setFloating, style: floatingStyles, ...getFloatingProps(), className: 'z-50', children: _jsx(ScrollArea, { id: listboxId, axis: 'y', safeArea: false, space: 'none', className: 'max-h-[inherit] rounded-lg border border-border bg-popover py-1 text-popover-foreground shadow-[var(--shadow-overlay)]', children: _jsx(SearchResults, { groups: groups, activeId: activeRow?.id, optionIdPrefix: baseId, emptyContent: emptyContent, linkComponent: linkComponent, onNavigate: onNavigate, onAfterNavigate: () => {
113
+ return (_jsxs("div", { ...rest, className: cn('relative w-full', className), "data-cb-headersearch": '', children: [_jsxs("div", { className: 'relative', ref: refs.setReference, ...getReferenceProps(), children: [_jsx(Search, { className: 'pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground', "aria-hidden": 'true' }), _jsx(Input, { type: 'search', role: 'combobox', "aria-expanded": showPanel, "aria-controls": listboxId, "aria-autocomplete": 'list', "aria-activedescendant": showPanel && activeRow ? searchOptionId(baseId, activeRow.id) : undefined, placeholder: placeholder, value: query,
114
+ // The belt's own ✕ (below) is the clear button; a `type="search"` input draws a
115
+ // SECOND one natively in Chromium/Safari without this (DESIGN.md, two clear buttons).
116
+ className: 'pl-9 pr-9 [&::-webkit-search-cancel-button]:hidden', onChange: (e) => update(e.target.value), onFocus: () => query.trim().length >= minChars && setOpen(true), onKeyDown: onKeyDown }), query && (_jsx(IconButton, { label: 'Clear search', variant: 'ghost', onClick: clear, className: 'absolute right-2 top-1/2 size-6 -translate-y-1/2 [&_svg]:size-4', children: _jsx(X, {}) }))] }), showPanel && (_jsx(FloatingPortal, { children: _jsx("div", { ref: refs.setFloating, style: floatingStyles, ...getFloatingProps(), className: 'z-50', children: _jsx(ScrollArea, { id: listboxId, axis: 'y', safeArea: false, space: 'none', className: 'max-h-[inherit] rounded-lg border border-border bg-popover py-1 text-popover-foreground shadow-[var(--shadow-overlay)]', children: _jsx(SearchResults, { groups: groups, activeId: activeRow?.id, optionIdPrefix: baseId, emptyContent: emptyContent, linkComponent: linkComponent, onNavigate: onNavigate, onAfterNavigate: () => {
114
117
  onAfterNavigate?.();
115
118
  setOpen(false);
116
119
  }, resolveIcon: resolveIcon }) }) }) }))] }));
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderSearch.js","sourceRoot":"","sources":["../../../src/react/nav/HeaderSearch.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HeaderSearch.js","sourceRoot":"","sources":["../../../src/react/nav/HeaderSearch.tsx"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@
15
15
  * after an app's responsive variant (task 2124). An app that imports every area gets exactly
16
16
  * what `cursedbelt/styles-utilities.css` emits — proved rule by rule in
17
17
  * src/stylesAreas.spec.ts, which is also what fails when this file is stale.
18
- * 945 candidate(s).
18
+ * 946 candidate(s).
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
@@ -167,14 +167,14 @@
167
167
  @source inline("pb-[max(env(safe-area-inset-bottom,0px),0.75rem)] pb-[var(--empty-lift)] pl-2 pl-4 pl-8 place");
168
168
  @source inline("placeholder placeholder:text-field-placeholder point pointer pointer-coarse pointer-coarse:-m-2");
169
169
  @source inline("pointer-coarse:data-[state=checked]:translate-x-8 pointer-coarse:h-11 pointer-coarse:min-h-11");
170
- @source inline("pointer-coarse:min-w-11 pointer-coarse:opacity-100 pointer-coarse:size-5 pointer-coarse:size-9");
171
- @source inline("pointer-coarse:w-11 pointer-coarse:w-18 pointer-events pointer-events-auto pointer-events-none");
172
- @source inline("pr-1 pr-8 pt-2 pt-3 px px-0 px-1 px-1.5 px-2 px-2.5 px-3 px-4 px-5 px-6 px-row-x py-0 py-0.5");
173
- @source inline("py-1 py-1.5 py-12 py-2 py-2.5 py-3 py-4 py-6 py-[var(--panel-pad)] py-px py-row-y r re relative");
174
- @source inline("res resize right right-0 right-2 ring ring-2 ring-background ro rotate-90 round rounded");
175
- @source inline("rounded-[calc(var(--radius-md)-0.25rem)] rounded-field rounded-full rounded-l-full rounded-l-xl");
176
- @source inline("rounded-lg rounded-md rounded-none rounded-r-full rounded-r-xl rounded-sm rounded-t-xl");
177
- @source inline("rounded-xl ru run running s select select-all select-none self-start shadow");
170
+ @source inline("pointer-coarse:min-w-11 pointer-coarse:opacity-100 pointer-coarse:shrink-0 pointer-coarse:size-5");
171
+ @source inline("pointer-coarse:size-9 pointer-coarse:w-11 pointer-coarse:w-18 pointer-events pointer-events-auto");
172
+ @source inline("pointer-events-none pr-1 pr-8 pt-2 pt-3 px px-0 px-1 px-1.5 px-2 px-2.5 px-3 px-4 px-5 px-6");
173
+ @source inline("px-row-x py-0 py-0.5 py-1 py-1.5 py-12 py-2 py-2.5 py-3 py-4 py-6 py-[var(--panel-pad)] py-px");
174
+ @source inline("py-row-y r re relative res resize right right-0 right-2 ring ring-2 ring-background ro rotate-90");
175
+ @source inline("round rounded rounded-[calc(var(--radius-md)-0.25rem)] rounded-field rounded-full rounded-l-full");
176
+ @source inline("rounded-l-xl rounded-lg rounded-md rounded-none rounded-r-full rounded-r-xl rounded-sm");
177
+ @source inline("rounded-t-xl rounded-xl ru run running s select select-all select-none self-start shadow");
178
178
  @source inline("shadow-[var(--shadow-overlay)] shadow-[var(--shadow-popover)] shadow-none shadow-overlay");
179
179
  @source inline("shadow-raised shadow-sm shrink shrink-0 size size-0 size-1.5 size-10 size-12 size-14 size-2");
180
180
  @source inline("size-2.5 size-20 size-3 size-3.5 size-4 size-5 size-6 size-8 slid slide slide-in-from-left sm");
@@ -18,24 +18,24 @@
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
- * 128 candidate(s).
21
+ * 129 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("-mt-5 -right-0.5 -top-0.5 -top-1 [&::-webkit-scrollbar]:hidden [&>*]:min-w-0");
28
- @source inline("[&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:px-3");
29
- @source inline("[&_[cmdk-group-heading]]:py-1 [&_[cmdk-group-heading]]:text-muted-foreground");
30
- @source inline("[&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:tracking-wide");
31
- @source inline("[&_[cmdk-group-heading]]:uppercase [&_[data-cb-banner-icon]]:text-accent");
32
- @source inline("[&_[data-cb-banner-icon]]:text-destructive [&_[data-cb-banner-icon]]:text-warning");
33
- @source inline("[&_svg]:size-3.5 [scrollbar-width:none] aria-checked:ring-2 aria-checked:ring-foreground");
34
- @source inline("aria-checked:ring-offset-1 bg-accent/15 bg-card-overlay bg-destructive/10 bg-warning/10");
35
- @source inline("border-border/40 border-dashed collapse cursor-grab data-[disabled=true]:opacity-50");
36
- @source inline("data-[disabled=true]:pointer-events-none data-[selected=true]:bg-muted");
37
- @source inline("data-[selected=true]:text-foreground disabled:hover:scale-100 disabled:opacity-40");
38
- @source inline("focus-within:opacity-100 g grid-cols-4 group-hover/navitem:opacity-100");
27
+ @source inline("-mt-5 -right-0.5 -top-0.5 -top-1 [&::-webkit-scrollbar]:hidden");
28
+ @source inline("[&::-webkit-search-cancel-button]:hidden [&>*]:min-w-0 [&_[cmdk-group-heading]]:font-semibold");
29
+ @source inline("[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-1");
30
+ @source inline("[&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:text-xs");
31
+ @source inline("[&_[cmdk-group-heading]]:tracking-wide [&_[cmdk-group-heading]]:uppercase");
32
+ @source inline("[&_[data-cb-banner-icon]]:text-accent [&_[data-cb-banner-icon]]:text-destructive");
33
+ @source inline("[&_[data-cb-banner-icon]]:text-warning [&_svg]:size-3.5 [scrollbar-width:none]");
34
+ @source inline("aria-checked:ring-2 aria-checked:ring-foreground aria-checked:ring-offset-1 bg-accent/15");
35
+ @source inline("bg-card-overlay bg-destructive/10 bg-warning/10 border-border/40 border-dashed collapse");
36
+ @source inline("cursor-grab data-[disabled=true]:opacity-50 data-[disabled=true]:pointer-events-none");
37
+ @source inline("data-[selected=true]:bg-muted data-[selected=true]:text-foreground disabled:hover:scale-100");
38
+ @source inline("disabled:opacity-40 focus-within:opacity-100 g grid-cols-4 group-hover/navitem:opacity-100");
39
39
  @source inline("group-hover/tile:opacity-100 group/navitem group/tile h-12 h-[var(--header-h)]");
40
40
  @source inline("h-[var(--header-h-dense)] h-[var(--header-h-roomy)] h-dvh hover:border-foreground/20");
41
41
  @source inline("hover:decoration-border hover:scale-110 hover:underline-offset-4 inset-x-2 inset-x-3 inset-y-1");
@@ -5225,6 +5225,9 @@
5225
5225
  .pointer-coarse\:min-w-11 {
5226
5226
  min-width: calc(var(--spacing) * 11);
5227
5227
  }
5228
+ .pointer-coarse\:shrink-0 {
5229
+ flex-shrink: 0;
5230
+ }
5228
5231
  .pointer-coarse\:basis-full {
5229
5232
  flex-basis: 100%;
5230
5233
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cursedbelt",
3
- "version": "5.92.1",
3
+ "version": "5.92.3",
4
4
  "license": "ISC",
5
5
  "type": "module",
6
6
  "description": "The React design system of the cursedbelt split — components, styles, theme. cursedbelt-core below it; server tier in cursedbelt-server.",
@@ -31,6 +31,7 @@
31
31
  "./react/media",
32
32
  "./react/media-gallery",
33
33
  "./react/media/player-strip",
34
+ "./react/media/picture-editor",
34
35
  "./react/media/video-player",
35
36
  "./react/pane-split",
36
37
  "./react/pdf-viewer",
@@ -384,6 +385,12 @@
384
385
  "source": "./src/react/media/fileUploadClient.ts",
385
386
  "import": "./dist/react/media/fileUploadClient.js"
386
387
  },
388
+ "./react/media/picture-editor": {
389
+ "types": "./dist/react/media/PictureEditor.d.ts",
390
+ "bun": "./src/react/media/PictureEditor.tsx",
391
+ "source": "./src/react/media/PictureEditor.tsx",
392
+ "import": "./dist/react/media/PictureEditor.js"
393
+ },
387
394
  "./react/media/video-player": {
388
395
  "types": "./dist/react/media/VideoPlayer.d.ts",
389
396
  "bun": "./src/react/media/VideoPlayer.tsx",
@@ -316,6 +316,20 @@ describe('🔴 the THEME VARIABLE check — a `var()` of a theme variable no bui
316
316
  expect([...variablesDeclared('@property --tw-x{syntax:"*"}.a{--b:1;color:var(--c)}')].sort()).toEqual(['--b', '--tw-x']);
317
317
  });
318
318
 
319
+ test('🔴 a shadow-DOM library declaring a theme-named variable in its own CSS-in-JS string is DECLARED, not a miss (ReactionPicker/emoji-mart, forge task cursedbelt-reaction-bar-tap-floor)', () => {
320
+ // Verbatim in shape from emoji-mart's dist/module.js: its Picker custom element's
321
+ // shadow-root stylesheet, shipped as one JS string, declares --shadow on its own
322
+ // :host right beside the var(--shadow) that reads it — self-contained, but it
323
+ // happens to share a bare name with Tailwind's own theme --shadow.
324
+ const EMOJI_MART_JS =
325
+ '$exports = ":host {\\n border-radius: var(--border-radius);\\n box-shadow: var(--shadow);\\n ' +
326
+ '--border-radius: 10px;\\n --shadow-color: 0deg 0% 0%;\\n --shadow: .3px .5px 2.7px hsl(var(--shadow-color) / .14);\\n}\\n";';
327
+ const theme = new Set(['--shadow']);
328
+ // Without scanning JS for declarations this reported ["--shadow"] — a false positive: the
329
+ // declaration is real, just inside a shadow root no built CSS could ever carry.
330
+ expect(undefinedThemeVariables({ js: [EMOJI_MART_JS], css: [''] }, theme)).toEqual([]);
331
+ });
332
+
319
333
  test('the CLI exits 1 on a build that reads an undeclared theme variable, naming it', async () => {
320
334
  const dir = mkdtempSync(join(tmpdir(), 'belt-theme-var-check-'));
321
335
  try {
@@ -341,10 +341,24 @@ export function variablesReferenced(text: string): Set<string> {
341
341
  * Each one is a value that silently resolves to nothing — `var(--color-card)` as a background is
342
342
  * transparent, not an error. A fallback (`var(--x, red)`) does not excuse one: it renders, but not
343
343
  * as the theme says, which is the same divergence from the union.
344
+ *
345
+ * 🔴 `declared` also scans the JS, not only the CSS — a web-component library (emoji-mart's
346
+ * `Picker`) ships its shadow-root stylesheet as a CSS-in-JS STRING inside the bundle, declaring
347
+ * `--shadow` on its own `:host` right next to the `var(--shadow)` that reads it. That is a real,
348
+ * self-contained declaration — scoped to a shadow root Tailwind never reaches, but satisfied all
349
+ * the same — and it happens to share a bare name (`--shadow`) with a Tailwind theme variable the
350
+ * app's own build never emits because nothing on the page uses the stock `shadow` utility
351
+ * (`ReactionPicker`/`EmojiPicker`, forge task cursedbelt-reaction-bar-tap-floor). Scanning JS text
352
+ * for declarations too is the general fix: any library that carries its own scoped CSS in a string
353
+ * is covered, not only emoji-mart. The alternative — adding a page-level `--shadow` rule to this
354
+ * package's own CSS to satisfy the scan — would be the special case: `--shadow` is not a cursedbelt
355
+ * token (the shadow scale is `--shadow-raised`/`-overlay`/`-popover`), the declaration would sit in
356
+ * `:root` where a shadow-DOM `:host` rule can never be reached by it anyway, and it would needlessly
357
+ * risk colliding with Tailwind's own default `shadow` utility if an app ever used it unqualified.
344
358
  */
345
359
  export function undefinedThemeVariables(input: { js: string[]; css: string[] }, theme: ReadonlySet<string>): string[] {
346
360
  const declared = new Set<string>();
347
- for (const css of input.css) for (const name of variablesDeclared(css)) declared.add(name);
361
+ for (const text of [...input.css, ...input.js]) for (const name of variablesDeclared(text)) declared.add(name);
348
362
  const read = new Set<string>();
349
363
  for (const text of [...input.js, ...input.css]) for (const name of variablesReferenced(text)) read.add(name);
350
364
  return [...read].filter((name) => theme.has(name) && !declared.has(name)).sort();
@@ -38,6 +38,12 @@ export const buttonVariants = cva(
38
38
  // two, its text touching the top and bottom edges. A tight container gets a wider button, or
39
39
  // a shorter label; never a wrapped one.
40
40
  'whitespace-nowrap',
41
+ // …and on a touch screen it never shrinks below that line (forge task 3649). The coarse floor
42
+ // below (`pointer-coarse:min-w-11`) REPLACES a flex item's automatic minimum — its label's
43
+ // width — so in a row too narrow for it the button shrank to 44px and its one-line label spilled
44
+ // over its neighbor: desk's "Replace 39 in “Budget.csv”" lay across "Replace" on an iPhone SE.
45
+ // A mouse never needed this; `min-width: auto` already held the label there.
46
+ 'pointer-coarse:shrink-0',
41
47
  // 🔴 TACTILE (forge task family-app-ux-overhaul, 2026-10-06): a press is answered — eased
42
48
  // colors and a `--press-scale` dip while held. The contract and who is exempt: `lib/press.ts`.
43
49
  PRESS,
@@ -1,6 +1,7 @@
1
1
  import { afterEach, describe, expect, mock, test } from 'bun:test';
2
2
  import { cleanup, fireEvent, render } from '@testing-library/react';
3
3
  import { type CommentData, CommentThread } from './CommentThread.js';
4
+ import { TAP_TARGET_HEIGHT } from '../lib/tapTarget.js';
4
5
 
5
6
  afterEach(cleanup);
6
7
 
@@ -68,6 +69,13 @@ describe('CommentThread', () => {
68
69
  expect(onPost).not.toHaveBeenCalled();
69
70
  });
70
71
 
72
+ test('🔴 the composer textarea clears 44px on a coarse pointer (DESIGN.md LAY-13)', () => {
73
+ // At min-h-9 (36px) the composer fell short of the tap floor.
74
+ const { getByPlaceholderText } = render(<CommentThread comments={[]} onPost={() => {}} />);
75
+ const ta = getByPlaceholderText('Add a comment… (⌘/Ctrl+Enter to send)') as HTMLTextAreaElement;
76
+ expect(ta.className.split(/\s+/)).toContain(TAP_TARGET_HEIGHT);
77
+ });
78
+
71
79
  test('shows Reply button for non-deleted comments', () => {
72
80
  const { getAllByText } = render(<CommentThread comments={[makeComment()]} onPost={() => {}} />);
73
81
  expect(getAllByText('Reply').length).toBeGreaterThan(0);
@@ -2,6 +2,7 @@ import { Edit2, Send, Trash2 } from 'lucide-react';
2
2
  import { useState } from 'react';
3
3
  import { cn } from '../lib/cn.js';
4
4
  import { FIELD_CLASS } from '../lib/field.js';
5
+ import { TAP_TARGET_HEIGHT } from '../lib/tapTarget.js';
5
6
  import { AutoGrowTextarea } from './AutoGrowTextarea.js';
6
7
  import { Avatar } from './Avatar.js';
7
8
  import { Button } from './Button.js';
@@ -109,7 +110,9 @@ function Composer({
109
110
  if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) submit();
110
111
  if (e.key === 'Escape') onCancel?.();
111
112
  }}
112
- className={cn(FIELD_CLASS, 'min-h-9 flex-1')}
113
+ // `TAP_TARGET_HEIGHT`: at `min-h-9` (36px) the composer fell short of the 44px tap
114
+ // floor on a coarse pointer (DESIGN.md LAY-13).
115
+ className={cn(FIELD_CLASS, 'min-h-9 flex-1', TAP_TARGET_HEIGHT)}
113
116
  />
114
117
  <Button
115
118
  variant='primary'
@@ -195,7 +198,7 @@ function CommentItem({
195
198
  value={draft}
196
199
  rows={1}
197
200
  onChange={(e) => setDraft(e.target.value)}
198
- className={cn(FIELD_CLASS, 'min-h-9 flex-1')}
201
+ className={cn(FIELD_CLASS, 'min-h-9 flex-1', TAP_TARGET_HEIGHT)}
199
202
  />
200
203
  <Button
201
204
  variant='primary'
@@ -1469,6 +1469,16 @@ export function DataTable<TRow extends Record<string, unknown>>({
1469
1469
  * is-scrolling flag resets and on every re-render; only a MOVE may arm the settle timer, or
1470
1470
  * the flag's own reset re-asks for the window that was just requested (measured: twice). */
1471
1471
  const lastTopRef = useRef<number | null>(null);
1472
+ /**
1473
+ * 🔴 A smooth {@link DataTableHandle.scrollToIndex} still on its way: where it is going, and
1474
+ * the moment it stops counting as on its way. The settle timer reads "no move for `settleMs`"
1475
+ * as rest, and a starved main thread draws a smooth scroll's frames further apart than that —
1476
+ * under the gate's load the reveal of row 4,000 asked for the windows at 3,685 and 3,995 on its
1477
+ * way past them (forge task 3649), and a slow phone or a TV is that load. So while a reveal is
1478
+ * on its way the timer waits instead of firing; it ends on arrival, on the reader's own hand
1479
+ * (wheel, touch, pointer, key) or at the deadline, whichever comes first.
1480
+ */
1481
+ const revealRef = useRef<{ top: number; until: number } | null>(null);
1472
1482
  useEffect(
1473
1483
  () => () => {
1474
1484
  if (settleRef.current) clearTimeout(settleRef.current);
@@ -1496,18 +1506,27 @@ export function DataTable<TRow extends Record<string, unknown>>({
1496
1506
  const lastShown = (items.findLast((item) => item.start < bottom)?.index ?? items.at(-1)!.index) + 1;
1497
1507
  const moved = lastTopRef.current !== top;
1498
1508
  lastTopRef.current = top;
1509
+ const reveal = revealRef.current;
1510
+ if (reveal && (Math.abs(top - reveal.top) <= 1 || performance.now() > reveal.until)) revealRef.current = null;
1499
1511
  // Nothing on screen is loaded. Hand the destination over once the scroll RESTS,
1500
1512
  // and do not also ask for a page — it would load rows nowhere near the reader.
1501
1513
  if (firstShown >= end || lastShown <= start) {
1502
1514
  if (!moved) return;
1503
1515
  if (settleRef.current) clearTimeout(settleRef.current);
1504
- settleRef.current = setTimeout(() => {
1516
+ const settle = () => {
1517
+ // A reveal on its way has not rested, however long its last frame took.
1518
+ const onItsWay = revealRef.current;
1519
+ if (onItsWay && performance.now() <= onItsWay.until) {
1520
+ settleRef.current = setTimeout(settle, win.settleMs ?? 120);
1521
+ return;
1522
+ }
1505
1523
  settleRef.current = null;
1506
1524
  // Read at FIRE time: the window may have arrived while the scroll rested.
1507
1525
  const loaded = loadedRef.current;
1508
1526
  if (firstShown < loaded.end && lastShown > loaded.start) return;
1509
1527
  windowRef.current?.onNeedWindow?.(firstShown);
1510
- }, win.settleMs ?? 120);
1528
+ };
1529
+ settleRef.current = setTimeout(settle, win.settleMs ?? 120);
1511
1530
  return;
1512
1531
  }
1513
1532
  if (settleRef.current) {
@@ -1619,6 +1638,16 @@ export function DataTable<TRow extends Record<string, unknown>>({
1619
1638
  const clamped = Math.max(0, Math.min(index, loadedRef.current.total - 1));
1620
1639
  const [offset] = rowVirtualizer.getOffsetForIndex(clamped, options.align ?? 'center') ?? [clamped * rowEstimate];
1621
1640
  const top = Math.max(0, Math.round(offset));
1641
+ if (options.behavior === 'smooth' && element instanceof HTMLElement) {
1642
+ // Where the browser will actually stop: a target past the end clamps to the bottom.
1643
+ const lands = Math.min(top, Math.max(0, element.scrollHeight - element.clientHeight));
1644
+ revealRef.current = { top: lands, until: performance.now() + REVEAL_DEADLINE_MS };
1645
+ const takeOver = () => {
1646
+ revealRef.current = null;
1647
+ for (const type of REVEAL_INTERRUPTS) element.removeEventListener(type, takeOver);
1648
+ };
1649
+ for (const type of REVEAL_INTERRUPTS) element.addEventListener(type, takeOver, { once: true, passive: true });
1650
+ }
1622
1651
  element.scrollTo({ top, behavior: options.behavior ?? 'auto' });
1623
1652
  return top;
1624
1653
  },
@@ -2569,6 +2598,11 @@ type TableTier = 'cards' | 'list' | 'grid';
2569
2598
  /** Seeds for the narrow tiers' row heights; every rendered row is measured over them. */
2570
2599
  const CARD_ESTIMATE_PX = 160;
2571
2600
  const LIST_ESTIMATE_PX = 56;
2601
+ /** How long a smooth reveal may take before a quiet scroll counts as rest again — far past any
2602
+ * browser's smooth-scroll animation, so only a scroll that never arrives reaches it. */
2603
+ const REVEAL_DEADLINE_MS = 2000;
2604
+ /** The reader's own hand on the scroller: a reveal they interrupt is no longer on its way. */
2605
+ const REVEAL_INTERRUPTS = ['wheel', 'touchstart', 'pointerdown', 'keydown'] as const;
2572
2606
 
2573
2607
  /**
2574
2608
  * The tier `mobileCards`' container query shows at `el`'s width: its two steps are 36rem and
@@ -1,6 +1,7 @@
1
1
  import { afterEach, describe, expect, mock, test } from 'bun:test';
2
2
  import { cleanup, fireEvent, render } from '@testing-library/react';
3
3
  import { ReactionBar } from './ReactionBar.js';
4
+ import { TAP_TARGET } from '../lib/tapTarget.js';
4
5
 
5
6
  afterEach(cleanup);
6
7
 
@@ -52,6 +53,13 @@ describe('ReactionBar', () => {
52
53
  expect(getByLabelText('👍 — Alice, Bob, Carol').textContent).toContain('3');
53
54
  });
54
55
 
56
+ test('🔴 every pill clears 44px on a coarse pointer (DESIGN.md LAY-13)', () => {
57
+ // At h-7 (28px) the pill was well under the tap floor — TAP_TARGET widens it on touch only.
58
+ const { getByLabelText } = render(<ReactionBar emojis={EMOJIS} onReact={() => {}} />);
59
+ const cls = getByLabelText('👍 — Alice, Bob, Carol').getAttribute('class') ?? '';
60
+ for (const utility of TAP_TARGET.split(' ')) expect(cls).toContain(utility);
61
+ });
62
+
55
63
  test('empty emojis renders only the picker trigger', () => {
56
64
  const { container, getByLabelText } = render(<ReactionBar emojis={[]} onReact={() => {}} />);
57
65
  expect(container.querySelectorAll('button[aria-pressed]').length).toBe(0);
@@ -1,4 +1,5 @@
1
1
  import { cn } from '../lib/cn.js';
2
+ import { TAP_TARGET } from '../lib/tapTarget.js';
2
3
  import { ReactionPicker } from './ReactionPicker.js';
3
4
  import { Tooltip } from './Tooltip.js';
4
5
  import { RAW_BUTTON } from '../lib/cn.js';
@@ -44,10 +45,11 @@ export function ReactionBar({ emojis = [], myReaction, onReact, className, ...re
44
45
  onClick={() => onReact(g.emoji)}
45
46
  aria-label={`${g.emoji} — ${g.users.join(', ')}`}
46
47
  aria-pressed={mine}
47
- className={cn(RAW_BUTTON,
48
+ className={cn(RAW_BUTTON,
48
49
  // h-7, the add-reaction trigger's height: at py-0.5 a pill was 22px beside
49
- // the 24px trigger, one row at two heights (FND-4).
50
- 'inline-flex h-7 items-center gap-1 rounded-full border px-2.5 text-xs tabular-nums transition',
50
+ // the 24px trigger, one row at two heights (FND-4). `TAP_TARGET` grows it to
51
+ // 44px on a coarse pointer (DESIGN.md LAY-13) without touching the mouse size.
52
+ `inline-flex h-7 items-center gap-1 rounded-full border px-2.5 text-xs tabular-nums transition ${TAP_TARGET}`,
51
53
  // text-accent-strong (cbux-101) — plain text-accent only clears 4.43:1 on this tint.
52
54
  mine
53
55
  ? 'border-accent bg-accent/10 text-accent-strong'
@@ -4,6 +4,7 @@ import { join } from 'node:path';
4
4
  import { act, cleanup, fireEvent, render, waitFor } from '@testing-library/react';
5
5
  import { useState } from 'react';
6
6
  import { preloadSuggestingTagsInput, TagsInput } from './TagsInput.js';
7
+ import { TAP_TARGET_HEIGHT } from '../lib/tapTarget.js';
7
8
 
8
9
  afterEach(cleanup);
9
10
 
@@ -80,6 +81,14 @@ describe('TagsInput', () => {
80
81
  fireEvent.blur(input);
81
82
  expect(json(container)).toEqual(['late']);
82
83
  });
84
+
85
+ test('🔴 the draft field clears 44px on a coarse pointer (DESIGN.md LAY-13)', () => {
86
+ // At py-0.5 the draft input was 28px tall on a coarse pointer — under the tap floor.
87
+ const { container } = render(<TagsInput value={[]} onChange={() => {}} aria-label='Tags' />);
88
+ const input = container.querySelector('input') as HTMLInputElement;
89
+ const cls = (input.getAttribute('class') ?? '').split(/\s+/);
90
+ expect(cls).toContain(TAP_TARGET_HEIGHT);
91
+ });
83
92
  });
84
93
 
85
94
  /**
@@ -2,6 +2,7 @@ import { X } from 'lucide-react';
2
2
  import { type ComponentType, type KeyboardEvent, useEffect, useRef, useState } from 'react';
3
3
  import { cn } from '../lib/cn.js';
4
4
  import { CONTROL_MIN_HEIGHT_CLASS, type ControlSize } from '../lib/field.js';
5
+ import { TAP_TARGET_HEIGHT } from '../lib/tapTarget.js';
5
6
  import { IconButton } from './IconButton.js';
6
7
 
7
8
  export interface TagsInputProps {
@@ -100,8 +101,11 @@ export function tagsRowClass(size: ControlSize, disabled: boolean | undefined, c
100
101
  );
101
102
  }
102
103
 
104
+ // `TAP_TARGET_HEIGHT`: at `py-0.5` the draft input was 28px tall on a coarse pointer, under the
105
+ // 44px tap floor (DESIGN.md LAY-13) — the row itself grows with it since this input is a flex
106
+ // child of `tagsRowClass`'s `items-center` row.
103
107
  export const TAGS_INPUT_CLASS =
104
- 'min-w-24 flex-1 bg-transparent py-0.5 text-base text-field-fg outline-none placeholder:text-field-placeholder sm:pointer-fine:text-sm';
108
+ `min-w-24 flex-1 bg-transparent py-0.5 text-base text-field-fg outline-none placeholder:text-field-placeholder sm:pointer-fine:text-sm ${TAP_TARGET_HEIGHT}`;
105
109
 
106
110
  /** The committed tags as removable chips. */
107
111
  // no-attribute-forward: a list of chips with no element of its own — the row it sits in takes the caller's attributes
@@ -110,20 +110,21 @@ describe('useScrollMemory', () => {
110
110
  */
111
111
  test('a list growing page by page is followed past the deadline, as long as each page lands within it', async () => {
112
112
  const s = fakeScroller(20_000);
113
- const { rerender } = render(<Shell at='/' el={s.el} deadlineMs={150} />);
113
+ const { rerender } = render(<Shell at='/' el={s.el} deadlineMs={400} />);
114
114
  s.scrollTo(15_000);
115
115
  const list = { state: window.history.state, path: '/' };
116
116
  push('/item/7');
117
- rerender(<Shell at='/item/7' el={s.el} deadlineMs={150} />);
117
+ rerender(<Shell at='/item/7' el={s.el} deadlineMs={400} />);
118
118
 
119
119
  s.grow(3_000);
120
120
  back(list);
121
- rerender(<Shell at='/' el={s.el} deadlineMs={150} />);
122
- // Eight pages, 40ms apart: 320ms in all — over twice the 150ms deadline from the start, and
123
- // never near 150ms without a page. (A 60ms deadline left a 40ms sleep 1.5x headroom, and it
124
- // went red under a busy machine's full gate, 2026-10-13.)
121
+ rerender(<Shell at='/' el={s.el} deadlineMs={400} />);
122
+ // Eight pages, 100ms apart: 800ms in all — twice the 400ms deadline from the start, and 300ms
123
+ // of slack before any gap reaches it. Slack is what a loaded machine eats, in absolute time:
124
+ // a 60ms deadline over 40ms sleeps went red under a full gate on 2026-10-13, and 150ms over
125
+ // 40ms (110ms of slack) went red again on 2026-10-24 with two repos' gates running at once.
125
126
  for (const height of [5_000, 7_000, 9_000, 11_000, 13_000, 15_000, 17_000, 20_000]) {
126
- await act(() => Bun.sleep(40));
127
+ await act(() => Bun.sleep(100));
127
128
  s.grow(height);
128
129
  }
129
130
  await frames(2);
@@ -189,7 +189,9 @@ export function HeaderSearch({
189
189
  }
190
190
  placeholder={placeholder}
191
191
  value={query}
192
- className='pl-9 pr-9'
192
+ // The belt's own ✕ (below) is the clear button; a `type="search"` input draws a
193
+ // SECOND one natively in Chromium/Safari without this (DESIGN.md, two clear buttons).
194
+ className='pl-9 pr-9 [&::-webkit-search-cancel-button]:hidden'
193
195
  onChange={(e) => update(e.target.value)}
194
196
  onFocus={() => query.trim().length >= minChars && setOpen(true)}
195
197
  onKeyDown={onKeyDown}
@@ -315,6 +315,12 @@ describe('HeaderSearch', () => {
315
315
  expect(onNavigate).toHaveBeenCalledWith('/env-sets');
316
316
  });
317
317
 
318
+ test('🔴 the native search-cancel button is hidden — the belt draws its own ✕, never two', () => {
319
+ const { container } = render(<HeaderSearch catalogue={catalogue} onNavigate={() => {}} />);
320
+ const input = container.querySelector('input[type="search"]') as HTMLInputElement;
321
+ expect(input.className).toContain('[&::-webkit-search-cancel-button]:hidden');
322
+ });
323
+
318
324
  test('blank query shows no panel', () => {
319
325
  const { container } = render(<HeaderSearch catalogue={catalogue} onNavigate={() => {}} />);
320
326
  expect(container.querySelector('[role="listbox"]')).toBeNull();
@@ -15,7 +15,7 @@
15
15
  * after an app's responsive variant (task 2124). An app that imports every area gets exactly
16
16
  * what `cursedbelt/styles-utilities.css` emits — proved rule by rule in
17
17
  * src/stylesAreas.spec.ts, which is also what fails when this file is stale.
18
- * 945 candidate(s).
18
+ * 946 candidate(s).
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
@@ -167,14 +167,14 @@
167
167
  @source inline("pb-[max(env(safe-area-inset-bottom,0px),0.75rem)] pb-[var(--empty-lift)] pl-2 pl-4 pl-8 place");
168
168
  @source inline("placeholder placeholder:text-field-placeholder point pointer pointer-coarse pointer-coarse:-m-2");
169
169
  @source inline("pointer-coarse:data-[state=checked]:translate-x-8 pointer-coarse:h-11 pointer-coarse:min-h-11");
170
- @source inline("pointer-coarse:min-w-11 pointer-coarse:opacity-100 pointer-coarse:size-5 pointer-coarse:size-9");
171
- @source inline("pointer-coarse:w-11 pointer-coarse:w-18 pointer-events pointer-events-auto pointer-events-none");
172
- @source inline("pr-1 pr-8 pt-2 pt-3 px px-0 px-1 px-1.5 px-2 px-2.5 px-3 px-4 px-5 px-6 px-row-x py-0 py-0.5");
173
- @source inline("py-1 py-1.5 py-12 py-2 py-2.5 py-3 py-4 py-6 py-[var(--panel-pad)] py-px py-row-y r re relative");
174
- @source inline("res resize right right-0 right-2 ring ring-2 ring-background ro rotate-90 round rounded");
175
- @source inline("rounded-[calc(var(--radius-md)-0.25rem)] rounded-field rounded-full rounded-l-full rounded-l-xl");
176
- @source inline("rounded-lg rounded-md rounded-none rounded-r-full rounded-r-xl rounded-sm rounded-t-xl");
177
- @source inline("rounded-xl ru run running s select select-all select-none self-start shadow");
170
+ @source inline("pointer-coarse:min-w-11 pointer-coarse:opacity-100 pointer-coarse:shrink-0 pointer-coarse:size-5");
171
+ @source inline("pointer-coarse:size-9 pointer-coarse:w-11 pointer-coarse:w-18 pointer-events pointer-events-auto");
172
+ @source inline("pointer-events-none pr-1 pr-8 pt-2 pt-3 px px-0 px-1 px-1.5 px-2 px-2.5 px-3 px-4 px-5 px-6");
173
+ @source inline("px-row-x py-0 py-0.5 py-1 py-1.5 py-12 py-2 py-2.5 py-3 py-4 py-6 py-[var(--panel-pad)] py-px");
174
+ @source inline("py-row-y r re relative res resize right right-0 right-2 ring ring-2 ring-background ro rotate-90");
175
+ @source inline("round rounded rounded-[calc(var(--radius-md)-0.25rem)] rounded-field rounded-full rounded-l-full");
176
+ @source inline("rounded-l-xl rounded-lg rounded-md rounded-none rounded-r-full rounded-r-xl rounded-sm");
177
+ @source inline("rounded-t-xl rounded-xl ru run running s select select-all select-none self-start shadow");
178
178
  @source inline("shadow-[var(--shadow-overlay)] shadow-[var(--shadow-popover)] shadow-none shadow-overlay");
179
179
  @source inline("shadow-raised shadow-sm shrink shrink-0 size size-0 size-1.5 size-10 size-12 size-14 size-2");
180
180
  @source inline("size-2.5 size-20 size-3 size-3.5 size-4 size-5 size-6 size-8 slid slide slide-in-from-left sm");