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.
- package/dist/react/components/Button.d.ts.map +1 -1
- package/dist/react/components/Button.js +6 -0
- package/dist/react/components/Button.js.map +1 -1
- package/dist/react/components/CommentThread.d.ts.map +1 -1
- package/dist/react/components/CommentThread.js +6 -2
- package/dist/react/components/CommentThread.js.map +1 -1
- package/dist/react/components/DataTable/DataTable.d.ts.map +1 -1
- package/dist/react/components/DataTable/DataTable.js +39 -2
- package/dist/react/components/DataTable/DataTable.js.map +1 -1
- package/dist/react/components/ReactionBar.d.ts.map +1 -1
- package/dist/react/components/ReactionBar.js +4 -2
- package/dist/react/components/ReactionBar.js.map +1 -1
- package/dist/react/components/TagsInput.d.ts +1 -1
- package/dist/react/components/TagsInput.d.ts.map +1 -1
- package/dist/react/components/TagsInput.js +5 -1
- package/dist/react/components/TagsInput.js.map +1 -1
- package/dist/react/nav/HeaderSearch.d.ts.map +1 -1
- package/dist/react/nav/HeaderSearch.js +4 -1
- package/dist/react/nav/HeaderSearch.js.map +1 -1
- package/dist/styles-areas/core.css +9 -9
- package/dist/styles-areas/nav.css +13 -13
- package/dist/styles-utilities.css +3 -0
- package/package.json +8 -1
- package/scripts/checkAreaStyles.spec.ts +14 -0
- package/scripts/checkAreaStyles.ts +15 -1
- package/src/react/components/Button.tsx +6 -0
- package/src/react/components/CommentThread.spec.tsx +8 -0
- package/src/react/components/CommentThread.tsx +5 -2
- package/src/react/components/DataTable/DataTable.tsx +36 -2
- package/src/react/components/ReactionBar.spec.tsx +8 -0
- package/src/react/components/ReactionBar.tsx +5 -3
- package/src/react/components/TagsInput.spec.tsx +9 -0
- package/src/react/components/TagsInput.tsx +5 -1
- package/src/react/hooks/useScrollMemory.spec.tsx +8 -7
- package/src/react/nav/HeaderSearch.tsx +3 -1
- package/src/react/nav/nav.spec.tsx +6 -0
- package/src/styles-areas/core.css +9 -9
- package/src/styles-areas/nav.css +13 -13
- 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;
|
|
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
|
-
|
|
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,+
|
|
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,
|
|
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
|
-
*
|
|
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:
|
|
171
|
-
@source inline("pointer-coarse:w-11 pointer-coarse:w-18 pointer-events pointer-events-auto
|
|
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
|
|
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
|
|
174
|
-
@source inline("res resize right right-0 right-2 ring ring-2 ring-background ro rotate-90
|
|
175
|
-
@source inline("rounded-[calc(var(--radius-md)-0.25rem)] rounded-field rounded-full rounded-l-full
|
|
176
|
-
@source inline("rounded-lg rounded-md rounded-none rounded-r-full rounded-r-xl rounded-sm
|
|
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
|
-
*
|
|
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
|
|
28
|
-
@source inline("[
|
|
29
|
-
@source inline("[&_[cmdk-group-heading]]:
|
|
30
|
-
@source inline("[&_[cmdk-group-heading]]:text-
|
|
31
|
-
@source inline("[&_[cmdk-group-heading]]:
|
|
32
|
-
@source inline("[&_[data-cb-banner-icon]]:text-
|
|
33
|
-
@source inline("[&_svg]:size-3.5 [scrollbar-width:none]
|
|
34
|
-
@source inline("aria-checked:ring-
|
|
35
|
-
@source inline("border-border/40 border-dashed collapse
|
|
36
|
-
@source inline("data-[disabled=true]:
|
|
37
|
-
@source inline("data-[selected=true]:text-foreground disabled:hover:scale-100
|
|
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");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cursedbelt",
|
|
3
|
-
"version": "5.92.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
-
|
|
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={
|
|
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={
|
|
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={
|
|
122
|
-
// Eight pages,
|
|
123
|
-
//
|
|
124
|
-
// went red under a
|
|
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(
|
|
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
|
-
|
|
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
|
-
*
|
|
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:
|
|
171
|
-
@source inline("pointer-coarse:w-11 pointer-coarse:w-18 pointer-events pointer-events-auto
|
|
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
|
|
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
|
|
174
|
-
@source inline("res resize right right-0 right-2 ring ring-2 ring-background ro rotate-90
|
|
175
|
-
@source inline("rounded-[calc(var(--radius-md)-0.25rem)] rounded-field rounded-full rounded-l-full
|
|
176
|
-
@source inline("rounded-lg rounded-md rounded-none rounded-r-full rounded-r-xl rounded-sm
|
|
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");
|