cursedbelt 5.45.1 → 5.46.2
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/charts/format.d.ts.map +1 -1
- package/dist/react/charts/format.js +2 -1
- package/dist/react/charts/format.js.map +1 -1
- package/dist/react/components/ListToolbar.d.ts +5 -0
- package/dist/react/components/ListToolbar.d.ts.map +1 -1
- package/dist/react/components/ListToolbar.js +14 -2
- package/dist/react/components/ListToolbar.js.map +1 -1
- package/dist/react/media/PlayerStrip.d.ts +9 -1
- package/dist/react/media/PlayerStrip.d.ts.map +1 -1
- package/dist/react/media/PlayerStrip.js +30 -6
- package/dist/react/media/PlayerStrip.js.map +1 -1
- package/dist/react/media/splitActions.d.ts +15 -0
- package/dist/react/media/splitActions.d.ts.map +1 -0
- package/dist/react/media/splitActions.js +16 -0
- package/dist/react/media/splitActions.js.map +1 -0
- package/dist/react/nav/TopBar.d.ts +1 -0
- package/dist/react/nav/TopBar.d.ts.map +1 -1
- package/dist/react/nav/TopBar.js +5 -1
- package/dist/react/nav/TopBar.js.map +1 -1
- package/dist/styles-areas/workbench.css +5 -5
- package/dist/styles-utilities.css +9 -0
- package/package.json +1 -1
- package/src/react/charts/capacityFormat.spec.ts +12 -0
- package/src/react/charts/format.ts +2 -1
- package/src/react/components/ListToolbar.tsx +20 -3
- package/src/react/media/PlayerStrip.tsx +53 -4
- package/src/react/media/playerStrip.spec.tsx +20 -0
- package/src/react/media/splitActions.ts +23 -0
- package/src/react/nav/TopBar.spec.tsx +8 -0
- package/src/react/nav/TopBar.tsx +5 -0
- package/src/styles-areas/workbench.css +5 -5
- package/src/styles-utilities.css +9 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/react/charts/format.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/react/charts/format.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,MAQxC,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,MAmBpC,CAAC;AAGF,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,eAAU,KAAG,MAA4C,CAAC;AAGlG,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,eAAU,KAAG,MACoB,CAAC;AAU/E,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,EAAE,eAAa,KAAG,MACQ,CAAC;AAG9D,eAAO,MAAM,gBAAgB,GAAI,GAAG,MAAM,KAAG,MAQ5C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAC8B,CAAC;AAGrE,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,EAAE,qBAAmB,KAAG,MAMhE,CAAC;AAGF,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,KAAG,MAOxC,CAAC;AAEL;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,SAAQ,CAAC,CAAC,EAAE,MAAM,KAAK,MAAqB,KAAG,MAIzF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GACrB,QAAQ,MAAM,EACd,SAAQ,CAAC,CAAC,EAAE,MAAM,KAAK,MAAqB,EAC5C,OAAM,KAAK,GAAG,MAAM,GAAG,MAAc,KACpC,MAKF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAO5D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,GAAG,MAAM,KAAG,MAGvC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAU9C,CAAC"}
|
|
@@ -13,7 +13,8 @@ export const formatNumber = (n) => {
|
|
|
13
13
|
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
14
14
|
if (abs >= 1_000)
|
|
15
15
|
return `${(n / 1_000).toFixed(1)}k`;
|
|
16
|
-
|
|
16
|
+
// A fraction keeps its digits: rounded, a count axis peaking at 1 ticks 0.5 as a second "1".
|
|
17
|
+
return Number(n.toFixed(abs < 10 ? 2 : abs < 100 ? 1 : 0)).toString();
|
|
17
18
|
};
|
|
18
19
|
export const formatMs = (n) => {
|
|
19
20
|
if (!Number.isFinite(n))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/react/charts/format.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,oEAAoE;AAEpE,mFAAmF;AACnF,2EAA2E;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAS,EAAU,EAAE;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,GAAG,IAAI,aAAa;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACtE,IAAI,GAAG,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9D,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/react/charts/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,6 +73,11 @@ export interface ListToolbarProps {
|
|
|
73
73
|
* keeps the controls right when everything fits on one line and lets them ride down as
|
|
74
74
|
* a group when it does not.
|
|
75
75
|
*
|
|
76
|
+
* Except with chips, from `sm:`: a strip sized to its content took the whole row and wrapped the
|
|
77
|
+
* controls under it (18 genres in flix, at 1440 AND 2560 — forge task 2560), breaking the one
|
|
78
|
+
* line this component exists for. There the row stops wrapping and the strip becomes a scroll
|
|
79
|
+
* lane (`flex-1`, `min-w-0` from its own root) between a fixed search box and fixed controls.
|
|
80
|
+
*
|
|
76
81
|
* No `role='toolbar'`: that role promises arrow-key roving focus between its controls,
|
|
77
82
|
* which would take the arrow keys away from the text box and the native `<select>`
|
|
78
83
|
* that live on this line. Tab order is the correct affordance here.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListToolbar.d.ts","sourceRoot":"","sources":["../../../src/react/components/ListToolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGxE,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACrC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kFAAkF;IAClF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,wFAAwF;IACxF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED
|
|
1
|
+
{"version":3,"file":"ListToolbar.d.ts","sourceRoot":"","sources":["../../../src/react/components/ListToolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGxE,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACrC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kFAAkF;IAClF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,wFAAwF;IACxF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,KAAK,EACL,SAAgB,EAChB,YAAY,EACZ,UAAkB,EAClB,aAAa,EACb,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,GACV,EAAE,gBAAgB,+BAsDlB"}
|
|
@@ -36,6 +36,11 @@ import { SearchInput } from './SearchInput.js';
|
|
|
36
36
|
* keeps the controls right when everything fits on one line and lets them ride down as
|
|
37
37
|
* a group when it does not.
|
|
38
38
|
*
|
|
39
|
+
* Except with chips, from `sm:`: a strip sized to its content took the whole row and wrapped the
|
|
40
|
+
* controls under it (18 genres in flix, at 1440 AND 2560 — forge task 2560), breaking the one
|
|
41
|
+
* line this component exists for. There the row stops wrapping and the strip becomes a scroll
|
|
42
|
+
* lane (`flex-1`, `min-w-0` from its own root) between a fixed search box and fixed controls.
|
|
43
|
+
*
|
|
39
44
|
* No `role='toolbar'`: that role promises arrow-key roving focus between its controls,
|
|
40
45
|
* which would take the arrow keys away from the text box and the native `<select>`
|
|
41
46
|
* that live on this line. Tab order is the correct affordance here.
|
|
@@ -57,10 +62,17 @@ export function ListToolbar({ search, onSearchChange, searchPlaceholder, searchL
|
|
|
57
62
|
const showSearch = search !== undefined && onSearchChange !== undefined;
|
|
58
63
|
const showChips = chips !== undefined && chips.length > 0 && onChipChange !== undefined;
|
|
59
64
|
const showRight = Boolean(sort) || Boolean(view) || Boolean(actions);
|
|
60
|
-
return (_jsxs("div", { className: cn('flex flex-wrap items-center gap-x-3 gap-y-2',
|
|
65
|
+
return (_jsxs("div", { className: cn('flex flex-wrap items-center gap-x-3 gap-y-2',
|
|
66
|
+
// From `sm:` a row WITH chips never wraps: the chips are the one item that can give way
|
|
67
|
+
// (a scroll lane), so they take what the search box and the controls leave. Without
|
|
68
|
+
// chips nothing on the line can scroll, so it keeps wrapping rather than overflow.
|
|
69
|
+
showChips && 'sm:flex-nowrap', className), children: [showSearch ? (_jsx(SearchInput, { syntax: false, value: search, onChange: onSearchChange, placeholder: searchPlaceholder ?? 'Search', "aria-label": searchLabel ?? searchPlaceholder ?? 'Search',
|
|
61
70
|
// Full width on a phone (the chips then wrap beneath it, still tappable);
|
|
62
71
|
// a fixed, modest column from `sm:` so the chips share the line rather than
|
|
63
72
|
// being pushed off it by a box that grows with the container.
|
|
64
|
-
className: 'w-full min-w-40 sm:w-56' })) : null, showChips ? (_jsx(ChipFilterStrip, { options: [...chips], value: chipValue, onChange: onChipChange, multi: multiChips, ...(chipsAllLabel === undefined ? {} : { allLabel: chipsAllLabel })
|
|
73
|
+
className: 'w-full min-w-40 sm:w-56 sm:shrink-0' })) : null, showChips ? (_jsx(ChipFilterStrip, { options: [...chips], value: chipValue, onChange: onChipChange, multi: multiChips, ...(chipsAllLabel === undefined ? {} : { allLabel: chipsAllLabel }),
|
|
74
|
+
// The scroll lane. Sized to its CONTENT, twenty chips took the whole row and pushed
|
|
75
|
+
// sort/view onto a second line at 1440 and 2560 (forge task 2560, flix's genres).
|
|
76
|
+
className: 'sm:flex-1' })) : null, filters, showRight ? (_jsxs("span", { className: cn('ml-auto flex flex-wrap items-center gap-2', showChips && 'sm:shrink-0 sm:flex-nowrap'), children: [sort, view, actions] })) : null] }));
|
|
65
77
|
}
|
|
66
78
|
//# sourceMappingURL=ListToolbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListToolbar.js","sourceRoot":"","sources":["../../../src/react/components/ListToolbar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,eAAe,EAAmB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA0C/C
|
|
1
|
+
{"version":3,"file":"ListToolbar.js","sourceRoot":"","sources":["../../../src/react/components/ListToolbar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,eAAe,EAAmB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA0C/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,KAAK,EACL,SAAS,GAAG,IAAI,EAChB,YAAY,EACZ,UAAU,GAAG,KAAK,EAClB,aAAa,EACb,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,GACQ;IACjB,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,CAAC;IACxE,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,KAAK,SAAS,CAAC;IACxF,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErE,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,6CAA6C;QAC7C,wFAAwF;QACxF,oFAAoF;QACpF,mFAAmF;QACnF,SAAS,IAAI,gBAAgB,EAC7B,SAAS,CACV,aAEA,UAAU,CAAC,CAAC,CAAC,CAIZ,KAAC,WAAW,IACV,MAAM,EAAE,KAAK,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,iBAAiB,IAAI,QAAQ,gBAC9B,WAAW,IAAI,iBAAiB,IAAI,QAAQ;gBACxD,0EAA0E;gBAC1E,4EAA4E;gBAC5E,8DAA8D;gBAC9D,SAAS,EAAC,qCAAqC,GAC/C,CACH,CAAC,CAAC,CAAC,IAAI,EACP,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,eAAe,IACd,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,EACnB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,UAAU,KACb,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;gBACpE,oFAAoF;gBACpF,kFAAkF;gBAClF,SAAS,EAAC,WAAW,GACrB,CACH,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,EACP,SAAS,CAAC,CAAC,CAAC,CACX,gBAAM,SAAS,EAAE,EAAE,CAAC,2CAA2C,EAAE,SAAS,IAAI,4BAA4B,CAAC,aACxG,IAAI,EACJ,IAAI,EACJ,OAAO,IACH,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -60,6 +60,14 @@ export interface PlayerStripProps {
|
|
|
60
60
|
onMutedChange?: (muted: boolean) => void;
|
|
61
61
|
/** Actions on the TRACK — they sit beside its name, because that is what they act on. */
|
|
62
62
|
trackActions?: PlayerStripAction[];
|
|
63
|
+
/**
|
|
64
|
+
* How many track actions stand as buttons; the rest go behind one `⋯` menu (DAT-5). An
|
|
65
|
+
* action with a `popover` always stands, since a menu item cannot hold a panel. Default:
|
|
66
|
+
* all of them. Six 44px buttons beside the title left it four letters wide at 1440
|
|
67
|
+
* (music, forge task 2475) — the metadata column is a fixed share of a strip whose centre
|
|
68
|
+
* is pinned to the window, so every standing button is taken from the title.
|
|
69
|
+
*/
|
|
70
|
+
inlineActions?: number;
|
|
63
71
|
/** Actions on the PLAYER — queue, lyrics. They sit on the right, beside the volume. */
|
|
64
72
|
utilityActions?: PlayerStripAction[];
|
|
65
73
|
/**
|
|
@@ -106,5 +114,5 @@ export interface PlayerStripProps {
|
|
|
106
114
|
*/
|
|
107
115
|
rootRef?: React.Ref<HTMLElement>;
|
|
108
116
|
}
|
|
109
|
-
export declare function PlayerStrip({ art, title, subtitle, onReveal, revealLabel, revealBusy, playing, positionMs, durationMs, onToggle, onSeek, onNext, onPrevious, shuffle, onShuffleChange, repeat, onRepeatChange, volume, muted, onVolumeChange, onMutedChange, trackActions, utilityActions, seekLine, empty, error, errorTone, formatTime, className, rootRef, }: PlayerStripProps): React.ReactNode;
|
|
117
|
+
export declare function PlayerStrip({ art, title, subtitle, onReveal, revealLabel, revealBusy, playing, positionMs, durationMs, onToggle, onSeek, onNext, onPrevious, shuffle, onShuffleChange, repeat, onRepeatChange, volume, muted, onVolumeChange, onMutedChange, trackActions, inlineActions, utilityActions, seekLine, empty, error, errorTone, formatTime, className, rootRef, }: PlayerStripProps): React.ReactNode;
|
|
110
118
|
//# sourceMappingURL=PlayerStrip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlayerStrip.d.ts","sourceRoot":"","sources":["../../../src/react/media/PlayerStrip.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PlayerStrip.d.ts","sourceRoot":"","sources":["../../../src/react/media/PlayerStrip.tsx"],"names":[],"mappings":"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"}
|
|
@@ -37,11 +37,12 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
37
37
|
* glyph rather than a big painted button.
|
|
38
38
|
*/
|
|
39
39
|
import { useEffect, useId, useState } from "react";
|
|
40
|
-
import { Pause, Play, Repeat, Repeat1, Shuffle, SkipBack, SkipForward, Volume1, Volume2, VolumeX, } from "lucide-react";
|
|
40
|
+
import { MoreHorizontal, Pause, Play, Repeat, Repeat1, Shuffle, SkipBack, SkipForward, Volume1, Volume2, VolumeX, } from "lucide-react";
|
|
41
41
|
import { IconButton } from "../components/IconButton.js";
|
|
42
42
|
import { lazyPart } from "../components/DataTable/lazyPart.js";
|
|
43
43
|
import { Tooltip } from "../components/Tooltip.js";
|
|
44
44
|
import { cn } from "../lib/cn.js";
|
|
45
|
+
import { splitActions } from "./splitActions.js";
|
|
45
46
|
import "./playerStrip.css";
|
|
46
47
|
/**
|
|
47
48
|
* How far along a slider is, as a custom property the stylesheet paints the filled half
|
|
@@ -86,17 +87,40 @@ const NEXT_REPEAT = {
|
|
|
86
87
|
* starts. A strip with no popover action never fetches it.
|
|
87
88
|
*/
|
|
88
89
|
const LazyPopover = lazyPart(() => import("../components/Popover.js").then((m) => m.Popover));
|
|
90
|
+
/** The `⋯` menu, lazy for the same reason: Radix's menu is ~27 kB gzip a player strip must not carry eagerly. */
|
|
91
|
+
const LazyMenu = lazyPart(() => import("../components/DropdownMenu.js").then((m) => m.DropdownMenu));
|
|
89
92
|
/** The app's actions, drawn identically wherever they sit. */
|
|
90
|
-
function ActionButtons({ actions }) {
|
|
93
|
+
function ActionButtons({ actions, inline }) {
|
|
91
94
|
const hasPopover = actions.some((action) => action.popover);
|
|
95
|
+
const { standing, overflow } = splitActions(actions, inline);
|
|
96
|
+
const hasMenu = overflow.length > 0;
|
|
92
97
|
// Fetched as soon as the strip draws one, so it is in memory long before a thumb reaches it.
|
|
93
98
|
useEffect(() => {
|
|
94
99
|
if (hasPopover)
|
|
95
100
|
void LazyPopover.preload();
|
|
96
|
-
|
|
101
|
+
if (hasMenu)
|
|
102
|
+
void LazyMenu.preload();
|
|
103
|
+
}, [hasPopover, hasMenu]);
|
|
97
104
|
if (actions.length === 0)
|
|
98
105
|
return null;
|
|
99
|
-
return (
|
|
106
|
+
return (_jsxs("div", { className: "cbps__actions", children: [standing.map((action) => action.popover ? _jsx(PopoverAction, { action: action }, action.key) : _jsx(ActionButton, { action: action }, action.key)), _jsx(OverflowMenu, { actions: overflow })] }));
|
|
107
|
+
}
|
|
108
|
+
/** The `⋯` beside the standing actions. Controlled, like {@link PopoverAction}: a press before the chunk lands opens it. */
|
|
109
|
+
function OverflowMenu({ actions }) {
|
|
110
|
+
const [open, setOpen] = useState(false);
|
|
111
|
+
if (actions.length === 0)
|
|
112
|
+
return null;
|
|
113
|
+
const trigger = (onClick) => (_jsx(IconButton, { className: "cbps__icon", label: "More actions for this track", onClick: onClick, size: "lg", children: _jsx(MoreHorizontal, {}) }));
|
|
114
|
+
return (_jsx(LazyMenu, { align: "end", fallback: trigger(() => setOpen(true)), onOpenChange: setOpen, open: open, items: actions.map((action) => ({
|
|
115
|
+
key: action.key,
|
|
116
|
+
label: action.label,
|
|
117
|
+
icon: action.icon,
|
|
118
|
+
destructive: action.danger ?? false,
|
|
119
|
+
disabled: action.disabled ?? false,
|
|
120
|
+
...(action.hint ? { description: action.hint } : {}),
|
|
121
|
+
...(action.active !== undefined ? { checked: action.active } : {}),
|
|
122
|
+
...(action.onClick ? { onClick: action.onClick } : {}),
|
|
123
|
+
})), side: "top", trigger: trigger() }));
|
|
100
124
|
}
|
|
101
125
|
function ActionButton({ action, onClick }) {
|
|
102
126
|
return (_jsx(IconButton
|
|
@@ -111,7 +135,7 @@ function PopoverAction({ action }) {
|
|
|
111
135
|
const [open, setOpen] = useState(false);
|
|
112
136
|
return (_jsx(LazyPopover, { align: "center", fallback: _jsx(ActionButton, { action: action, onClick: () => setOpen(true) }), onOpenChange: setOpen, open: open, side: "top", trigger: _jsx(ActionButton, { action: action }), children: action.popover }));
|
|
113
137
|
}
|
|
114
|
-
export function PlayerStrip({ art, title, subtitle, onReveal, revealLabel = "Show this track in the list", revealBusy = false, playing, positionMs, durationMs, onToggle, onSeek, onNext, onPrevious, shuffle, onShuffleChange, repeat, onRepeatChange, volume = 1, muted = false, onVolumeChange, onMutedChange, trackActions = [], utilityActions = [], seekLine = true, empty, error = null, errorTone = "danger", formatTime = defaultFormatTime, className, rootRef, }) {
|
|
138
|
+
export function PlayerStrip({ art, title, subtitle, onReveal, revealLabel = "Show this track in the list", revealBusy = false, playing, positionMs, durationMs, onToggle, onSeek, onNext, onPrevious, shuffle, onShuffleChange, repeat, onRepeatChange, volume = 1, muted = false, onVolumeChange, onMutedChange, trackActions = [], inlineActions, utilityActions = [], seekLine = true, empty, error = null, errorTone = "danger", formatTime = defaultFormatTime, className, rootRef, }) {
|
|
115
139
|
const scrubberId = useId();
|
|
116
140
|
if (empty !== undefined && empty !== null)
|
|
117
141
|
return (_jsx("footer", { ref: rootRef, className: cn("cbps cbps--empty", className), children: _jsx("div", { className: "cbps__empty", children: empty }) }));
|
|
@@ -124,6 +148,6 @@ export function PlayerStrip({ art, title, subtitle, onReveal, revealLabel = "Sho
|
|
|
124
148
|
// list to this track and mutates nothing. cursedbelt's Button cannot carry a
|
|
125
149
|
// two-line block of cover art plus title plus artist without becoming a
|
|
126
150
|
// layout component, and this block being the target is the whole gesture.
|
|
127
|
-
className: "cbps__now cbps__now--reveal", disabled: revealBusy, onClick: onReveal, type: "button", children: metadata }) })) : (_jsx("div", { className: "cbps__now", children: metadata })), _jsx(ActionButtons, { actions: trackActions })] }), _jsxs("div", { className: "cbps__centre", children: [_jsxs("div", { className: "cbps__transport", children: [onShuffleChange ? (_jsx(IconButton, { "aria-pressed": shuffle === true, className: cn("cbps__icon", shuffle ? "is-active" : ""), label: "Shuffle", onClick: () => onShuffleChange(!shuffle), size: "lg", tooltip: shuffle ? "Shuffle is on" : "Shuffle is off", children: _jsx(Shuffle, {}) })) : null, onPrevious ? (_jsx(IconButton, { className: "cbps__icon", label: "Previous track", onClick: onPrevious, size: "lg", children: _jsx(SkipBack, {}) })) : null, _jsx(IconButton, { className: "cbps__icon cbps__play", label: playing ? "Pause" : "Play", onClick: onToggle, size: "lg", children: playing ? _jsx(Pause, {}) : _jsx(Play, {}) }), onNext ? (_jsx(IconButton, { className: "cbps__icon", label: "Next track", onClick: onNext, size: "lg", children: _jsx(SkipForward, {}) })) : null, onRepeatChange && repeat ? (_jsx(IconButton, { "aria-pressed": repeat !== "off", className: cn("cbps__icon", repeat !== "off" ? "is-active" : ""), label: REPEAT_LABEL[repeat], onClick: () => onRepeatChange(NEXT_REPEAT[repeat]), size: "lg", children: repeat === "one" ? _jsx(Repeat1, {}) : _jsx(Repeat, {}) })) : null] }), _jsxs("div", { className: "cbps__timeline", children: [_jsx("span", { className: "cbps__time", id: `${scrubberId}-at`, children: formatTime(positionMs) }), _jsx("input", { "aria-label": "Seek \u2014 drag to move through the track", "aria-valuetext": `${formatTime(positionMs)} of ${formatTime(durationMs)}`, className: "cbps__scrubber", max: Math.max(durationMs, 1), min: 0, onChange: (event) => onSeek(Number(event.target.value)), step: 1000, style: progressStyle(progress), type: "range", value: Math.min(positionMs, Math.max(durationMs, 1)) }), _jsx("span", { className: "cbps__time cbps__time--total", children: formatTime(durationMs) })] })] }), _jsxs("div", { className: "cbps__aside", children: [_jsx(ActionButtons, { actions: utilityActions }), onVolumeChange || onMutedChange ? (_jsxs("div", { className: "cbps__volume", children: [_jsx(IconButton, { className: cn("cbps__icon", muted ? "is-active" : ""), disabled: !onMutedChange, label: muted ? "Unmute" : "Mute", onClick: () => onMutedChange?.(!muted), size: "lg", children: _jsx(VolumeIcon, {}) }), _jsx("input", { "aria-label": "Volume", className: "cbps__scrubber cbps__scrubber--volume", max: 1, min: 0, onChange: (event) => onVolumeChange?.(Number(event.target.value)), step: 0.01, style: progressStyle(effectiveVolume), type: "range", value: effectiveVolume })] })) : null] }), error ? (_jsx("p", { className: `cbps__error${errorTone === "notice" ? " cbps__error--notice" : ""}`, role: "status", children: error })) : null] }));
|
|
151
|
+
className: "cbps__now cbps__now--reveal", disabled: revealBusy, onClick: onReveal, type: "button", children: metadata }) })) : (_jsx("div", { className: "cbps__now", children: metadata })), _jsx(ActionButtons, { actions: trackActions, inline: inlineActions })] }), _jsxs("div", { className: "cbps__centre", children: [_jsxs("div", { className: "cbps__transport", children: [onShuffleChange ? (_jsx(IconButton, { "aria-pressed": shuffle === true, className: cn("cbps__icon", shuffle ? "is-active" : ""), label: "Shuffle", onClick: () => onShuffleChange(!shuffle), size: "lg", tooltip: shuffle ? "Shuffle is on" : "Shuffle is off", children: _jsx(Shuffle, {}) })) : null, onPrevious ? (_jsx(IconButton, { className: "cbps__icon", label: "Previous track", onClick: onPrevious, size: "lg", children: _jsx(SkipBack, {}) })) : null, _jsx(IconButton, { className: "cbps__icon cbps__play", label: playing ? "Pause" : "Play", onClick: onToggle, size: "lg", children: playing ? _jsx(Pause, {}) : _jsx(Play, {}) }), onNext ? (_jsx(IconButton, { className: "cbps__icon", label: "Next track", onClick: onNext, size: "lg", children: _jsx(SkipForward, {}) })) : null, onRepeatChange && repeat ? (_jsx(IconButton, { "aria-pressed": repeat !== "off", className: cn("cbps__icon", repeat !== "off" ? "is-active" : ""), label: REPEAT_LABEL[repeat], onClick: () => onRepeatChange(NEXT_REPEAT[repeat]), size: "lg", children: repeat === "one" ? _jsx(Repeat1, {}) : _jsx(Repeat, {}) })) : null] }), _jsxs("div", { className: "cbps__timeline", children: [_jsx("span", { className: "cbps__time", id: `${scrubberId}-at`, children: formatTime(positionMs) }), _jsx("input", { "aria-label": "Seek \u2014 drag to move through the track", "aria-valuetext": `${formatTime(positionMs)} of ${formatTime(durationMs)}`, className: "cbps__scrubber", max: Math.max(durationMs, 1), min: 0, onChange: (event) => onSeek(Number(event.target.value)), step: 1000, style: progressStyle(progress), type: "range", value: Math.min(positionMs, Math.max(durationMs, 1)) }), _jsx("span", { className: "cbps__time cbps__time--total", children: formatTime(durationMs) })] })] }), _jsxs("div", { className: "cbps__aside", children: [_jsx(ActionButtons, { actions: utilityActions }), onVolumeChange || onMutedChange ? (_jsxs("div", { className: "cbps__volume", children: [_jsx(IconButton, { className: cn("cbps__icon", muted ? "is-active" : ""), disabled: !onMutedChange, label: muted ? "Unmute" : "Mute", onClick: () => onMutedChange?.(!muted), size: "lg", children: _jsx(VolumeIcon, {}) }), _jsx("input", { "aria-label": "Volume", className: "cbps__scrubber cbps__scrubber--volume", max: 1, min: 0, onChange: (event) => onVolumeChange?.(Number(event.target.value)), step: 0.01, style: progressStyle(effectiveVolume), type: "range", value: effectiveVolume })] })) : null] }), error ? (_jsx("p", { className: `cbps__error${errorTone === "notice" ? " cbps__error--notice" : ""}`, role: "status", children: error })) : null] }));
|
|
128
152
|
}
|
|
129
153
|
//# sourceMappingURL=PlayerStrip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlayerStrip.js","sourceRoot":"","sources":["../../../src/react/media/PlayerStrip.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlayerStrip.js","sourceRoot":"","sources":["../../../src/react/media/PlayerStrip.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The player strip's `inlineActions` split (forge task 2475), in its own module so it is not
|
|
3
|
+
* public surface: `media/index.ts` does not re-export it, and the spec imports it from here.
|
|
4
|
+
*/
|
|
5
|
+
import type { PlayerStripAction } from "./PlayerStrip.js";
|
|
6
|
+
/**
|
|
7
|
+
* Which actions stand as buttons and which go behind `⋯`. The first `inline` stand, and so does
|
|
8
|
+
* every action with a popover wherever it is (a menu item cannot hold a panel); the rest overflow,
|
|
9
|
+
* in their order. One left over is not worth a menu — it stands too.
|
|
10
|
+
*/
|
|
11
|
+
export declare function splitActions(actions: readonly PlayerStripAction[], inline: number | undefined): {
|
|
12
|
+
standing: PlayerStripAction[];
|
|
13
|
+
overflow: PlayerStripAction[];
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=splitActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splitActions.d.ts","sourceRoot":"","sources":["../../../src/react/media/splitActions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,SAAS,iBAAiB,EAAE,EACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB;IAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAQlE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which actions stand as buttons and which go behind `⋯`. The first `inline` stand, and so does
|
|
3
|
+
* every action with a popover wherever it is (a menu item cannot hold a panel); the rest overflow,
|
|
4
|
+
* in their order. One left over is not worth a menu — it stands too.
|
|
5
|
+
*/
|
|
6
|
+
export function splitActions(actions, inline) {
|
|
7
|
+
if (inline === undefined || actions.length <= inline + 1)
|
|
8
|
+
return { standing: [...actions], overflow: [] };
|
|
9
|
+
const standing = [];
|
|
10
|
+
const overflow = [];
|
|
11
|
+
actions.forEach((action, index) => {
|
|
12
|
+
(index < inline || action.popover ? standing : overflow).push(action);
|
|
13
|
+
});
|
|
14
|
+
return overflow.length > 1 ? { standing, overflow } : { standing: [...actions], overflow: [] };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=splitActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splitActions.js","sourceRoot":"","sources":["../../../src/react/media/splitActions.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC3B,OAAqC,EACrC,MAA0B;IAE1B,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1G,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACjC,CAAC,KAAK,GAAG,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAChG,CAAC"}
|
|
@@ -44,6 +44,7 @@ export interface TopBarProps {
|
|
|
44
44
|
* One control BEFORE the brand — a phone's way into the app's sidebar drawer (the owner's
|
|
45
45
|
* music report, 2026-09-28: *"there is a large horizontal scrolling header row and no sidebar
|
|
46
46
|
* popout"*). Top-left is where Gmail, Linear and Slack put it on a phone. Never shrinks.
|
|
47
|
+
* Below md the brand yields to it, as Gmail's does: the places keep the room.
|
|
47
48
|
*/
|
|
48
49
|
leading?: ReactNode;
|
|
49
50
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopBar.d.ts","sourceRoot":"","sources":["../../../src/react/nav/TopBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ1E,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnE,+FAA+F;AAC/F,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,CACjD,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,gGAAgG;IAChG,KAAK,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,IAAI,EAAE,SAAS,CAAC;IAChB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,oEAAoE;IACpE,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,+FAA+F;IAC/F,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;IACrF,mGAAmG;IACnG,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB
|
|
1
|
+
{"version":3,"file":"TopBar.d.ts","sourceRoot":"","sources":["../../../src/react/nav/TopBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ1E,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnE,+FAA+F;AAC/F,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,CACjD,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,gGAAgG;IAChG,KAAK,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,IAAI,EAAE,SAAS,CAAC;IAChB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,oEAAoE;IACpE,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,+FAA+F;IAC/F,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;IACrF,mGAAmG;IACnG,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,+FAA+F;IAC/F,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,OAAO,EACP,QAAgB,EAChB,WAAqB,EACrB,aAAa,EACb,QAAmB,EACnB,SAAS,GACV,EAAE,WAAW,+BAyEb;AAKD,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,GAAG,eAAe,GAAG,UAAU,CAAC;CAAG;AAEnG;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAgB,EAChB,WAAqB,EACrB,aAAa,EACb,QAAmB,GACpB,EAAE,iBAAiB,+BAsCnB"}
|
package/dist/react/nav/TopBar.js
CHANGED
|
@@ -38,7 +38,11 @@ export function TopBar({ brand, items, trailing, leading, center, density, iconO
|
|
|
38
38
|
? 'h-[var(--header-h-dense)]'
|
|
39
39
|
: density === 'roomy'
|
|
40
40
|
? 'h-[var(--header-h-roomy)]'
|
|
41
|
-
: 'h-[var(--header-h)]', className), children: [_jsxs("div", { "data-cb-topbar-zone": 'left', className: 'flex shrink-0 items-center gap-2', children: [leading ? _jsx("div", { className: 'flex shrink-0 items-center', children: leading }) : null, _jsxs("a", { ...brand.linkProps, href: brand.href, "aria-label": brand.label, "data-cb-topbar-brand": '', className: cn('flex shrink-0 items-center gap-2 rounded-md px-1.5 py-1 font-semibold text-foreground', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', TAP_TARGET_SQUARE, 'md:pointer-coarse:w-auto'
|
|
41
|
+
: 'h-[var(--header-h)]', className), children: [_jsxs("div", { "data-cb-topbar-zone": 'left', className: 'flex shrink-0 items-center gap-2', children: [leading ? _jsx("div", { className: 'flex shrink-0 items-center', children: leading }) : null, _jsxs("a", { ...brand.linkProps, href: brand.href, "aria-label": brand.label, "data-cb-topbar-brand": '', className: cn('flex shrink-0 items-center gap-2 rounded-md px-1.5 py-1 font-semibold text-foreground', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', TAP_TARGET_SQUARE, 'md:pointer-coarse:w-auto',
|
|
42
|
+
// Below md a `leading` drawer button holds the top-left, and the brand — a home link
|
|
43
|
+
// that repeats the first place — yields its 52px to the places. At 390 music's five
|
|
44
|
+
// icons overflowed by 34px behind both (forge task 2475, NAV-14).
|
|
45
|
+
leading ? 'max-md:hidden' : ''), children: [_jsx("span", { "aria-hidden": 'true', className: 'grid size-6 place-items-center [&_svg]:size-5', children: brand.icon }), _jsx("span", { "aria-hidden": 'true', className: 'hidden md:inline', children: brand.label })] })] }), _jsxs("div", { "data-cb-topbar-zone": 'center', className: 'flex h-full min-w-0 flex-1 items-center justify-center gap-3', children: [hasPlaces ? (_jsx(TopBarPlaces, { items: items, iconOnly: iconOnly, phonePlaces: phonePlaces, linkComponent: linkComponent, navLabel: navLabel })) : null, center ? _jsx("div", { className: 'flex min-w-0 flex-1 items-center justify-center', children: center }) : null] }), trailing ? (_jsx("div", { "data-cb-topbar-zone": 'right', className: 'flex shrink-0 items-center gap-1', children: trailing })) : null] }));
|
|
42
46
|
}
|
|
43
47
|
/** NAV-2's line: from here up a router's places show their words. */
|
|
44
48
|
const WIDE_QUERY = '(min-width: 768px)';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopBar.js","sourceRoot":"","sources":["../../../src/react/nav/TopBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAqB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"TopBar.js","sourceRoot":"","sources":["../../../src/react/nav/TopBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
*
|
|
21
|
+
* 106 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
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
@source inline("pointer-coarse:h-12 pointer-coarse:w-12 pr-16 pr-9 resize-none right-4 ring-1 ring-4");
|
|
41
41
|
@source inline("ring-accent/20 ring-accent/30 ring-accent/40 ring-border ring-inset ring-ring rotate-90");
|
|
42
42
|
@source inline("rounded-[var(--radius-device)] rounded-l-xl rounded-r-xl rounded-t-xl scale-[1.01] self-center");
|
|
43
|
-
@source inline("self-stretch shrink-[2] sm:w-56 text-muted-foreground/60
|
|
44
|
-
@source inline("text-tone-
|
|
45
|
-
@source inline("text-tone-
|
|
46
|
-
@source inline("translate-y-2 w-3.5 w-88");
|
|
43
|
+
@source inline("self-stretch shrink-[2] sm:flex-1 sm:flex-nowrap sm:shrink-0 sm:w-56 text-muted-foreground/60");
|
|
44
|
+
@source inline("text-tone-amber-ink text-tone-cyan-ink text-tone-emerald-ink text-tone-orange-ink");
|
|
45
|
+
@source inline("text-tone-purple-ink text-tone-rose-ink text-tone-sky-ink text-tone-slate-ink text-xl");
|
|
46
|
+
@source inline("transition-[opacity,transform] translate-y-0 translate-y-2 w-3.5 w-88");
|
|
@@ -4311,6 +4311,12 @@
|
|
|
4311
4311
|
.sm\:max-w-\[var\(--modal-w-sm\)\] {
|
|
4312
4312
|
max-width: var(--modal-w-sm);
|
|
4313
4313
|
}
|
|
4314
|
+
.sm\:flex-1 {
|
|
4315
|
+
flex: 1;
|
|
4316
|
+
}
|
|
4317
|
+
.sm\:shrink-0 {
|
|
4318
|
+
flex-shrink: 0;
|
|
4319
|
+
}
|
|
4314
4320
|
.sm\:-translate-x-1\/2 {
|
|
4315
4321
|
--tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
|
|
4316
4322
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
@@ -4334,6 +4340,9 @@
|
|
|
4334
4340
|
.sm\:flex-row {
|
|
4335
4341
|
flex-direction: row;
|
|
4336
4342
|
}
|
|
4343
|
+
.sm\:flex-nowrap {
|
|
4344
|
+
flex-wrap: nowrap;
|
|
4345
|
+
}
|
|
4337
4346
|
.sm\:items-center {
|
|
4338
4347
|
align-items: center;
|
|
4339
4348
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cursedbelt",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.46.2",
|
|
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.",
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { describe, expect, test } from 'bun:test';
|
|
2
2
|
import { formatBytes, formatCount, formatDays, formatDelta, formatNumber, formatRate } from './format.js';
|
|
3
3
|
|
|
4
|
+
describe('formatNumber', () => {
|
|
5
|
+
test('never rounds two axis ticks to one label', () => {
|
|
6
|
+
// A phone chart of small counts (max 1) ticks 0, 0.25, 0.5, 0.75, 1 — rounded, three read "1".
|
|
7
|
+
const ticks = [0, 0.25, 0.5, 0.75, 1].map(formatNumber);
|
|
8
|
+
expect(new Set(ticks).size).toBe(ticks.length);
|
|
9
|
+
expect(formatNumber(0.5)).toBe('0.5');
|
|
10
|
+
expect(formatNumber(12.5)).toBe('12.5');
|
|
11
|
+
expect(formatNumber(7)).toBe('7');
|
|
12
|
+
expect(formatNumber(1_500)).toBe('1.5k');
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
|
|
4
16
|
describe('formatDelta', () => {
|
|
5
17
|
test('signs the magnitude with the caller’s formatter', () => {
|
|
6
18
|
expect(formatDelta(1_048_576, formatBytes)).toStartWith('+');
|
|
@@ -11,7 +11,8 @@ export const formatNumber = (n: number): string => {
|
|
|
11
11
|
if (abs >= 1_000_000_000) return `${(n / 1_000_000_000).toFixed(1)}B`;
|
|
12
12
|
if (abs >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;
|
|
13
13
|
if (abs >= 1_000) return `${(n / 1_000).toFixed(1)}k`;
|
|
14
|
-
|
|
14
|
+
// A fraction keeps its digits: rounded, a count axis peaking at 1 ticks 0.5 as a second "1".
|
|
15
|
+
return Number(n.toFixed(abs < 10 ? 2 : abs < 100 ? 1 : 0)).toString();
|
|
15
16
|
};
|
|
16
17
|
|
|
17
18
|
export const formatMs = (n: number): string => {
|
|
@@ -77,6 +77,11 @@ export interface ListToolbarProps {
|
|
|
77
77
|
* keeps the controls right when everything fits on one line and lets them ride down as
|
|
78
78
|
* a group when it does not.
|
|
79
79
|
*
|
|
80
|
+
* Except with chips, from `sm:`: a strip sized to its content took the whole row and wrapped the
|
|
81
|
+
* controls under it (18 genres in flix, at 1440 AND 2560 — forge task 2560), breaking the one
|
|
82
|
+
* line this component exists for. There the row stops wrapping and the strip becomes a scroll
|
|
83
|
+
* lane (`flex-1`, `min-w-0` from its own root) between a fixed search box and fixed controls.
|
|
84
|
+
*
|
|
80
85
|
* No `role='toolbar'`: that role promises arrow-key roving focus between its controls,
|
|
81
86
|
* which would take the arrow keys away from the text box and the native `<select>`
|
|
82
87
|
* that live on this line. Tab order is the correct affordance here.
|
|
@@ -115,7 +120,16 @@ export function ListToolbar({
|
|
|
115
120
|
const showRight = Boolean(sort) || Boolean(view) || Boolean(actions);
|
|
116
121
|
|
|
117
122
|
return (
|
|
118
|
-
<div
|
|
123
|
+
<div
|
|
124
|
+
className={cn(
|
|
125
|
+
'flex flex-wrap items-center gap-x-3 gap-y-2',
|
|
126
|
+
// From `sm:` a row WITH chips never wraps: the chips are the one item that can give way
|
|
127
|
+
// (a scroll lane), so they take what the search box and the controls leave. Without
|
|
128
|
+
// chips nothing on the line can scroll, so it keeps wrapping rather than overflow.
|
|
129
|
+
showChips && 'sm:flex-nowrap',
|
|
130
|
+
className,
|
|
131
|
+
)}
|
|
132
|
+
>
|
|
119
133
|
{showSearch ? (
|
|
120
134
|
// The one search box (magnifier + themed Input). A bare Input drew an empty, unmarked
|
|
121
135
|
// rectangle whenever a caller passed no placeholder (forge task 2514). `syntax={false}`:
|
|
@@ -129,7 +143,7 @@ export function ListToolbar({
|
|
|
129
143
|
// Full width on a phone (the chips then wrap beneath it, still tappable);
|
|
130
144
|
// a fixed, modest column from `sm:` so the chips share the line rather than
|
|
131
145
|
// being pushed off it by a box that grows with the container.
|
|
132
|
-
className='w-full min-w-40 sm:w-56'
|
|
146
|
+
className='w-full min-w-40 sm:w-56 sm:shrink-0'
|
|
133
147
|
/>
|
|
134
148
|
) : null}
|
|
135
149
|
{showChips ? (
|
|
@@ -139,11 +153,14 @@ export function ListToolbar({
|
|
|
139
153
|
onChange={onChipChange}
|
|
140
154
|
multi={multiChips}
|
|
141
155
|
{...(chipsAllLabel === undefined ? {} : { allLabel: chipsAllLabel })}
|
|
156
|
+
// The scroll lane. Sized to its CONTENT, twenty chips took the whole row and pushed
|
|
157
|
+
// sort/view onto a second line at 1440 and 2560 (forge task 2560, flix's genres).
|
|
158
|
+
className='sm:flex-1'
|
|
142
159
|
/>
|
|
143
160
|
) : null}
|
|
144
161
|
{filters}
|
|
145
162
|
{showRight ? (
|
|
146
|
-
<span className='ml-auto flex flex-wrap items-center gap-2'>
|
|
163
|
+
<span className={cn('ml-auto flex flex-wrap items-center gap-2', showChips && 'sm:shrink-0 sm:flex-nowrap')}>
|
|
147
164
|
{sort}
|
|
148
165
|
{view}
|
|
149
166
|
{actions}
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
*/
|
|
38
38
|
import { useEffect, useId, useState } from "react";
|
|
39
39
|
import {
|
|
40
|
+
MoreHorizontal,
|
|
40
41
|
Pause,
|
|
41
42
|
Play,
|
|
42
43
|
Repeat,
|
|
@@ -48,11 +49,13 @@ import {
|
|
|
48
49
|
Volume2,
|
|
49
50
|
VolumeX,
|
|
50
51
|
} from "lucide-react";
|
|
52
|
+
import type { DropdownMenuProps } from "../components/DropdownMenu.js";
|
|
51
53
|
import { IconButton } from "../components/IconButton.js";
|
|
52
54
|
import { lazyPart } from "../components/DataTable/lazyPart.js";
|
|
53
55
|
import type { PopoverProps } from "../components/Popover.js";
|
|
54
56
|
import { Tooltip } from "../components/Tooltip.js";
|
|
55
57
|
import { cn } from "../lib/cn.js";
|
|
58
|
+
import { splitActions } from "./splitActions.js";
|
|
56
59
|
import "./playerStrip.css";
|
|
57
60
|
|
|
58
61
|
export type PlayerStripRepeat = "off" | "one" | "all";
|
|
@@ -122,6 +125,14 @@ export interface PlayerStripProps {
|
|
|
122
125
|
|
|
123
126
|
/** Actions on the TRACK — they sit beside its name, because that is what they act on. */
|
|
124
127
|
trackActions?: PlayerStripAction[];
|
|
128
|
+
/**
|
|
129
|
+
* How many track actions stand as buttons; the rest go behind one `⋯` menu (DAT-5). An
|
|
130
|
+
* action with a `popover` always stands, since a menu item cannot hold a panel. Default:
|
|
131
|
+
* all of them. Six 44px buttons beside the title left it four letters wide at 1440
|
|
132
|
+
* (music, forge task 2475) — the metadata column is a fixed share of a strip whose centre
|
|
133
|
+
* is pinned to the window, so every standing button is taken from the title.
|
|
134
|
+
*/
|
|
135
|
+
inlineActions?: number;
|
|
125
136
|
/** Actions on the PLAYER — queue, lyrics. They sit on the right, beside the volume. */
|
|
126
137
|
utilityActions?: PlayerStripAction[];
|
|
127
138
|
|
|
@@ -216,24 +227,61 @@ const NEXT_REPEAT: Record<PlayerStripRepeat, PlayerStripRepeat> = {
|
|
|
216
227
|
* starts. A strip with no popover action never fetches it.
|
|
217
228
|
*/
|
|
218
229
|
const LazyPopover = lazyPart<PopoverProps>(() => import("../components/Popover.js").then((m) => m.Popover));
|
|
230
|
+
/** The `⋯` menu, lazy for the same reason: Radix's menu is ~27 kB gzip a player strip must not carry eagerly. */
|
|
231
|
+
const LazyMenu = lazyPart<DropdownMenuProps>(() => import("../components/DropdownMenu.js").then((m) => m.DropdownMenu));
|
|
219
232
|
|
|
220
233
|
/** The app's actions, drawn identically wherever they sit. */
|
|
221
|
-
function ActionButtons({ actions }: { actions: PlayerStripAction[] }): React.ReactNode {
|
|
234
|
+
function ActionButtons({ actions, inline }: { actions: PlayerStripAction[]; inline?: number | undefined }): React.ReactNode {
|
|
222
235
|
const hasPopover = actions.some((action) => action.popover);
|
|
236
|
+
const { standing, overflow } = splitActions(actions, inline);
|
|
237
|
+
const hasMenu = overflow.length > 0;
|
|
223
238
|
// Fetched as soon as the strip draws one, so it is in memory long before a thumb reaches it.
|
|
224
239
|
useEffect(() => {
|
|
225
240
|
if (hasPopover) void LazyPopover.preload();
|
|
226
|
-
|
|
241
|
+
if (hasMenu) void LazyMenu.preload();
|
|
242
|
+
}, [hasPopover, hasMenu]);
|
|
227
243
|
if (actions.length === 0) return null;
|
|
228
244
|
return (
|
|
229
245
|
<div className="cbps__actions">
|
|
230
|
-
{
|
|
246
|
+
{standing.map((action) =>
|
|
231
247
|
action.popover ? <PopoverAction action={action} key={action.key} /> : <ActionButton action={action} key={action.key} />,
|
|
232
248
|
)}
|
|
249
|
+
<OverflowMenu actions={overflow} />
|
|
233
250
|
</div>
|
|
234
251
|
);
|
|
235
252
|
}
|
|
236
253
|
|
|
254
|
+
/** The `⋯` beside the standing actions. Controlled, like {@link PopoverAction}: a press before the chunk lands opens it. */
|
|
255
|
+
function OverflowMenu({ actions }: { actions: PlayerStripAction[] }): React.ReactNode {
|
|
256
|
+
const [open, setOpen] = useState(false);
|
|
257
|
+
if (actions.length === 0) return null;
|
|
258
|
+
const trigger = (onClick?: () => void) => (
|
|
259
|
+
<IconButton className="cbps__icon" label="More actions for this track" onClick={onClick} size="lg">
|
|
260
|
+
<MoreHorizontal />
|
|
261
|
+
</IconButton>
|
|
262
|
+
);
|
|
263
|
+
return (
|
|
264
|
+
<LazyMenu
|
|
265
|
+
align="end"
|
|
266
|
+
fallback={trigger(() => setOpen(true))}
|
|
267
|
+
onOpenChange={setOpen}
|
|
268
|
+
open={open}
|
|
269
|
+
items={actions.map((action) => ({
|
|
270
|
+
key: action.key,
|
|
271
|
+
label: action.label,
|
|
272
|
+
icon: action.icon,
|
|
273
|
+
destructive: action.danger ?? false,
|
|
274
|
+
disabled: action.disabled ?? false,
|
|
275
|
+
...(action.hint ? { description: action.hint } : {}),
|
|
276
|
+
...(action.active !== undefined ? { checked: action.active } : {}),
|
|
277
|
+
...(action.onClick ? { onClick: action.onClick } : {}),
|
|
278
|
+
}))}
|
|
279
|
+
side="top"
|
|
280
|
+
trigger={trigger()}
|
|
281
|
+
/>
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
237
285
|
function ActionButton({ action, onClick }: { action: PlayerStripAction; onClick?: () => void }): React.ReactNode {
|
|
238
286
|
return (
|
|
239
287
|
<IconButton
|
|
@@ -294,6 +342,7 @@ export function PlayerStrip({
|
|
|
294
342
|
onVolumeChange,
|
|
295
343
|
onMutedChange,
|
|
296
344
|
trackActions = [],
|
|
345
|
+
inlineActions,
|
|
297
346
|
utilityActions = [],
|
|
298
347
|
seekLine = true,
|
|
299
348
|
empty,
|
|
@@ -389,7 +438,7 @@ export function PlayerStrip({
|
|
|
389
438
|
) : (
|
|
390
439
|
<div className="cbps__now">{metadata}</div>
|
|
391
440
|
)}
|
|
392
|
-
<ActionButtons actions={trackActions} />
|
|
441
|
+
<ActionButtons actions={trackActions} inline={inlineActions} />
|
|
393
442
|
</div>
|
|
394
443
|
|
|
395
444
|
{/* ── Centre: the controls, over the timeline ────────────────────────────────── */}
|
|
@@ -12,6 +12,7 @@ import { readFileSync } from "node:fs";
|
|
|
12
12
|
import { join } from "node:path";
|
|
13
13
|
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
|
|
14
14
|
import { PlayerStrip } from "./PlayerStrip.js";
|
|
15
|
+
import { splitActions } from "./splitActions.js";
|
|
15
16
|
|
|
16
17
|
afterEach(cleanup);
|
|
17
18
|
|
|
@@ -164,6 +165,25 @@ describe("PlayerStrip — the app's own actions", () => {
|
|
|
164
165
|
expect(container.querySelector(".cbps__now--reveal")).not.toBeNull();
|
|
165
166
|
});
|
|
166
167
|
|
|
168
|
+
test("`inlineActions` stands the first N and puts the rest behind one ⋯ (forge task 2475)", () => {
|
|
169
|
+
const six = ["share", "keep", "rate", "fav", "tag", "del"].map((key) => action({ key, label: key }));
|
|
170
|
+
render(<PlayerStrip {...base} inlineActions={2} trackActions={six} />);
|
|
171
|
+
expect(screen.getByRole("button", { name: "share" })).toBeDefined();
|
|
172
|
+
expect(screen.getByRole("button", { name: "keep" })).toBeDefined();
|
|
173
|
+
expect(screen.queryByRole("button", { name: "del" })).toBeNull();
|
|
174
|
+
expect(screen.getByRole("button", { name: "More actions for this track" })).toBeDefined();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test("splitActions — a popover action always stands; one left over is not worth a menu", () => {
|
|
178
|
+
const a = (key: string, popover?: boolean) => ({ key, label: key, icon: null, ...(popover ? { popover: "p" } : {}) });
|
|
179
|
+
const keys = (list: { key: string }[]) => list.map((x) => x.key);
|
|
180
|
+
const split = splitActions([a("1"), a("2"), a("3", true), a("4"), a("5")], 1);
|
|
181
|
+
expect(keys(split.standing)).toEqual(["1", "3"]);
|
|
182
|
+
expect(keys(split.overflow)).toEqual(["2", "4", "5"]);
|
|
183
|
+
expect(keys(splitActions([a("1"), a("2"), a("3")], 2).standing)).toEqual(["1", "2", "3"]);
|
|
184
|
+
expect(keys(splitActions([a("1"), a("2"), a("3")], undefined).overflow)).toEqual([]);
|
|
185
|
+
});
|
|
186
|
+
|
|
167
187
|
test("nothing loaded renders the empty message and no transport", () => {
|
|
168
188
|
render(<PlayerStrip {...base} empty={<span>Nothing playing.</span>} />);
|
|
169
189
|
expect(screen.getByText("Nothing playing.")).toBeDefined();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The player strip's `inlineActions` split (forge task 2475), in its own module so it is not
|
|
3
|
+
* public surface: `media/index.ts` does not re-export it, and the spec imports it from here.
|
|
4
|
+
*/
|
|
5
|
+
import type { PlayerStripAction } from "./PlayerStrip.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Which actions stand as buttons and which go behind `⋯`. The first `inline` stand, and so does
|
|
9
|
+
* every action with a popover wherever it is (a menu item cannot hold a panel); the rest overflow,
|
|
10
|
+
* in their order. One left over is not worth a menu — it stands too.
|
|
11
|
+
*/
|
|
12
|
+
export function splitActions(
|
|
13
|
+
actions: readonly PlayerStripAction[],
|
|
14
|
+
inline: number | undefined,
|
|
15
|
+
): { standing: PlayerStripAction[]; overflow: PlayerStripAction[] } {
|
|
16
|
+
if (inline === undefined || actions.length <= inline + 1) return { standing: [...actions], overflow: [] };
|
|
17
|
+
const standing: PlayerStripAction[] = [];
|
|
18
|
+
const overflow: PlayerStripAction[] = [];
|
|
19
|
+
actions.forEach((action, index) => {
|
|
20
|
+
(index < inline || action.popover ? standing : overflow).push(action);
|
|
21
|
+
});
|
|
22
|
+
return overflow.length > 1 ? { standing, overflow } : { standing: [...actions], overflow: [] };
|
|
23
|
+
}
|
|
@@ -126,6 +126,14 @@ describe('TopBar — destinations have words (NAV-2, owner review 2026-10-01)',
|
|
|
126
126
|
expect(first.nextElementSibling?.hasAttribute('data-cb-topbar-brand')).toBe(true);
|
|
127
127
|
});
|
|
128
128
|
|
|
129
|
+
test('below md the brand yields to a leading control — the places keep its room (NAV-14)', () => {
|
|
130
|
+
const { container, rerender } = render(<TopBar brand={brand} items={items} leading={<span>☰</span>} />);
|
|
131
|
+
const brandLink = () => container.querySelector('[data-cb-topbar-brand]') as HTMLElement;
|
|
132
|
+
expect(brandLink().className).toContain('max-md:hidden');
|
|
133
|
+
rerender(<TopBar brand={brand} items={items} />);
|
|
134
|
+
expect(brandLink().className).not.toContain('max-md:hidden');
|
|
135
|
+
});
|
|
136
|
+
|
|
129
137
|
test('the brand is a link named by its label; its word is painted only from md up', () => {
|
|
130
138
|
const { getByRole } = render(<TopBar brand={brand} items={items} />);
|
|
131
139
|
const link = getByRole('link', { name: 'Music' });
|
package/src/react/nav/TopBar.tsx
CHANGED
|
@@ -52,6 +52,7 @@ export interface TopBarProps {
|
|
|
52
52
|
* One control BEFORE the brand — a phone's way into the app's sidebar drawer (the owner's
|
|
53
53
|
* music report, 2026-09-28: *"there is a large horizontal scrolling header row and no sidebar
|
|
54
54
|
* popout"*). Top-left is where Gmail, Linear and Slack put it on a phone. Never shrinks.
|
|
55
|
+
* Below md the brand yields to it, as Gmail's does: the places keep the room.
|
|
55
56
|
*/
|
|
56
57
|
leading?: ReactNode;
|
|
57
58
|
/**
|
|
@@ -152,6 +153,10 @@ export function TopBar({
|
|
|
152
153
|
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
|
|
153
154
|
TAP_TARGET_SQUARE,
|
|
154
155
|
'md:pointer-coarse:w-auto',
|
|
156
|
+
// Below md a `leading` drawer button holds the top-left, and the brand — a home link
|
|
157
|
+
// that repeats the first place — yields its 52px to the places. At 390 music's five
|
|
158
|
+
// icons overflowed by 34px behind both (forge task 2475, NAV-14).
|
|
159
|
+
leading ? 'max-md:hidden' : '',
|
|
155
160
|
)}
|
|
156
161
|
>
|
|
157
162
|
<span aria-hidden='true' className='grid size-6 place-items-center [&_svg]:size-5'>
|
|
@@ -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
|
-
*
|
|
21
|
+
* 106 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
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
@source inline("pointer-coarse:h-12 pointer-coarse:w-12 pr-16 pr-9 resize-none right-4 ring-1 ring-4");
|
|
41
41
|
@source inline("ring-accent/20 ring-accent/30 ring-accent/40 ring-border ring-inset ring-ring rotate-90");
|
|
42
42
|
@source inline("rounded-[var(--radius-device)] rounded-l-xl rounded-r-xl rounded-t-xl scale-[1.01] self-center");
|
|
43
|
-
@source inline("self-stretch shrink-[2] sm:w-56 text-muted-foreground/60
|
|
44
|
-
@source inline("text-tone-
|
|
45
|
-
@source inline("text-tone-
|
|
46
|
-
@source inline("translate-y-2 w-3.5 w-88");
|
|
43
|
+
@source inline("self-stretch shrink-[2] sm:flex-1 sm:flex-nowrap sm:shrink-0 sm:w-56 text-muted-foreground/60");
|
|
44
|
+
@source inline("text-tone-amber-ink text-tone-cyan-ink text-tone-emerald-ink text-tone-orange-ink");
|
|
45
|
+
@source inline("text-tone-purple-ink text-tone-rose-ink text-tone-sky-ink text-tone-slate-ink text-xl");
|
|
46
|
+
@source inline("transition-[opacity,transform] translate-y-0 translate-y-2 w-3.5 w-88");
|
package/src/styles-utilities.css
CHANGED
|
@@ -4311,6 +4311,12 @@
|
|
|
4311
4311
|
.sm\:max-w-\[var\(--modal-w-sm\)\] {
|
|
4312
4312
|
max-width: var(--modal-w-sm);
|
|
4313
4313
|
}
|
|
4314
|
+
.sm\:flex-1 {
|
|
4315
|
+
flex: 1;
|
|
4316
|
+
}
|
|
4317
|
+
.sm\:shrink-0 {
|
|
4318
|
+
flex-shrink: 0;
|
|
4319
|
+
}
|
|
4314
4320
|
.sm\:-translate-x-1\/2 {
|
|
4315
4321
|
--tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
|
|
4316
4322
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
@@ -4334,6 +4340,9 @@
|
|
|
4334
4340
|
.sm\:flex-row {
|
|
4335
4341
|
flex-direction: row;
|
|
4336
4342
|
}
|
|
4343
|
+
.sm\:flex-nowrap {
|
|
4344
|
+
flex-wrap: nowrap;
|
|
4345
|
+
}
|
|
4337
4346
|
.sm\:items-center {
|
|
4338
4347
|
align-items: center;
|
|
4339
4348
|
}
|