morille 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +1 -0
- package/dist/app.js.map +1 -0
- package/dist/components/animated-subtitle.d.ts +19 -0
- package/dist/components/animated-subtitle.d.ts.map +1 -0
- package/dist/components/animated-subtitle.js +109 -0
- package/dist/components/animated-subtitle.js.map +1 -0
- package/dist/components/animated-title.d.ts +16 -0
- package/dist/components/animated-title.d.ts.map +1 -0
- package/dist/components/animated-title.js +47 -0
- package/dist/components/animated-title.js.map +1 -0
- package/dist/components/browse-detail-view.d.ts.map +1 -0
- package/dist/components/browse-detail-view.js +2 -1
- package/dist/components/browse-detail-view.js.map +1 -0
- package/dist/components/lyrics-panel.d.ts.map +1 -0
- package/dist/components/lyrics-view.d.ts.map +1 -0
- package/dist/components/lyrics-view.js +2 -1
- package/dist/components/lyrics-view.js.map +1 -0
- package/dist/components/panel-content.d.ts.map +1 -0
- package/dist/components/playback-status.d.ts.map +1 -0
- package/dist/components/player.d.ts.map +1 -1
- package/dist/components/player.js +12 -8
- package/dist/components/player.js.map +1 -1
- package/dist/components/progress-bar.d.ts.map +1 -0
- package/dist/components/progress-bar.js +2 -1
- package/dist/components/progress-bar.js.map +1 -0
- package/dist/components/queue-view.d.ts.map +1 -0
- package/dist/components/queue-view.js +2 -1
- package/dist/components/queue-view.js.map +1 -0
- package/dist/components/search-panel.d.ts.map +1 -0
- package/dist/components/search-panel.js +3 -2
- package/dist/components/search-panel.js.map +1 -0
- package/dist/components/shimmer.d.ts.map +1 -0
- package/dist/components/shimmer.js +2 -2
- package/dist/components/shimmer.js.map +1 -0
- package/dist/components/track-facts.d.ts +13 -0
- package/dist/components/track-facts.d.ts.map +1 -0
- package/dist/components/track-facts.js +52 -0
- package/dist/components/track-facts.js.map +1 -0
- package/dist/components/track-info-skeleton.d.ts.map +1 -0
- package/dist/components/track-info.d.ts.map +1 -0
- package/dist/components/track-info.js +2 -1
- package/dist/components/track-info.js.map +1 -0
- package/dist/config.d.ts +3 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -4
- package/dist/config.js.map +1 -1
- package/dist/contexts/lyrics-context.d.ts.map +1 -0
- package/dist/contexts/queue-context.d.ts.map +1 -0
- package/dist/contexts/search-context.d.ts.map +1 -0
- package/dist/hooks/use-album-art.d.ts.map +1 -0
- package/dist/hooks/use-album-art.js +2 -1
- package/dist/hooks/use-album-art.js.map +1 -0
- package/dist/hooks/use-browse.d.ts.map +1 -0
- package/dist/hooks/use-browse.js +6 -3
- package/dist/hooks/use-browse.js.map +1 -0
- package/dist/hooks/use-lyrics.d.ts.map +1 -0
- package/dist/hooks/use-playback.d.ts.map +1 -0
- package/dist/hooks/use-playback.js +30 -11
- package/dist/hooks/use-playback.js.map +1 -0
- package/dist/hooks/use-player-input.d.ts.map +1 -0
- package/dist/hooks/use-queue.d.ts.map +1 -0
- package/dist/hooks/use-queue.js +7 -3
- package/dist/hooks/use-queue.js.map +1 -0
- package/dist/hooks/use-search.d.ts.map +1 -0
- package/dist/icons.d.ts +22 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +35 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/spotify/auth.d.ts.map +1 -0
- package/dist/spotify/auth.js +2 -1
- package/dist/spotify/auth.js.map +1 -0
- package/dist/spotify/client.d.ts.map +1 -0
- package/dist/spotify/client.js +2 -1
- package/dist/spotify/client.js.map +1 -0
- package/dist/spotify/fetch-with-retry.d.ts.map +1 -0
- package/dist/spotify/lyrics.d.ts.map +1 -0
- package/dist/spotify/lyrics.js +4 -2
- package/dist/spotify/lyrics.js.map +1 -0
- package/dist/spotify/playback.d.ts +6 -0
- package/dist/spotify/playback.d.ts.map +1 -0
- package/dist/spotify/playback.js +14 -0
- package/dist/spotify/playback.js.map +1 -0
- package/dist/spotify/search.d.ts.map +1 -0
- package/dist/spotify/search.js +4 -4
- package/dist/spotify/search.js.map +1 -0
- package/dist/spotify/track-facts.d.ts +9 -0
- package/dist/spotify/track-facts.d.ts.map +1 -0
- package/dist/spotify/track-facts.js +95 -0
- package/dist/spotify/track-facts.js.map +1 -0
- package/package.json +21 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,GAAG,4CAmFlB"}
|
package/dist/app.js
CHANGED
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PanelMode } from '../contexts/panel-mode-context.js';
|
|
2
|
+
type AnimatedSubtitleProps = {
|
|
3
|
+
hasError: boolean;
|
|
4
|
+
hasTrack: boolean;
|
|
5
|
+
isPlaying: boolean;
|
|
6
|
+
panelMode: PanelMode;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Renders a dim, context-aware funny hint line under the title.
|
|
10
|
+
* The hint pool changes whenever the context (playback / panel / error)
|
|
11
|
+
* changes; within a stable context the hint rotates every few seconds.
|
|
12
|
+
* Rotation pauses when nothing is playing so a frozen player has a stable line.
|
|
13
|
+
* @param hasError - Whether the player is currently in an error state
|
|
14
|
+
* @param hasTrack - Whether a track is loaded (regardless of play/pause)
|
|
15
|
+
* @param isPlaying - Whether playback is actively running
|
|
16
|
+
* @param panelMode - Currently active side panel
|
|
17
|
+
*/
|
|
18
|
+
export declare function AnimatedSubtitle({ hasError, hasTrack, isPlaying, panelMode }: AnimatedSubtitleProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animated-subtitle.d.ts","sourceRoot":"","sources":["../../src/components/animated-subtitle.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AA8EnE,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,qBAAqB,2CA8CnG"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from 'ink';
|
|
3
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
4
|
+
const ROTATE_INTERVAL_MS = 6000;
|
|
5
|
+
/**
|
|
6
|
+
* Returns the pool of funny hint lines that fit the current context.
|
|
7
|
+
* The first array entry doubles as the default if rotation is disabled.
|
|
8
|
+
*/
|
|
9
|
+
function hintsFor({ hasError, hasTrack, isPlaying, panelMode }) {
|
|
10
|
+
if (hasError) {
|
|
11
|
+
return [
|
|
12
|
+
'something broke. probably the vibes.',
|
|
13
|
+
'spotify said no. try again, gently.',
|
|
14
|
+
'the music gods are unamused.',
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
if (!hasTrack) {
|
|
18
|
+
return [
|
|
19
|
+
'silence is golden, but tunes are gold-plated. open spotify somewhere.',
|
|
20
|
+
'no device detected. point one at me with `space`.',
|
|
21
|
+
'the void hums quietly. give it something to drown out.',
|
|
22
|
+
'press play in any spotify app to wake me up.',
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
if (panelMode === 'search') {
|
|
26
|
+
return [
|
|
27
|
+
'hunt good. type words. find bops.',
|
|
28
|
+
'the catalogue awaits. enter the void.',
|
|
29
|
+
'left/right to switch the haystack.',
|
|
30
|
+
'enter on a track to commit. esc to retreat.',
|
|
31
|
+
];
|
|
32
|
+
}
|
|
33
|
+
if (panelMode === 'queue') {
|
|
34
|
+
return [
|
|
35
|
+
'the lineup. judge it ruthlessly.',
|
|
36
|
+
'up next, then up next, then up next. enter to skip ahead.',
|
|
37
|
+
'↑/↓ to scroll the future. enter to fast-forward time.',
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
if (panelMode === 'lyrics') {
|
|
41
|
+
return [
|
|
42
|
+
'sing along. nobody can hear you in the terminal.',
|
|
43
|
+
"+/- if it's drifting. you're not imagining it.",
|
|
44
|
+
'karaoke mode engaged. hairbrush optional.',
|
|
45
|
+
'feel the words. or just read them. whatever.',
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
if (!isPlaying) {
|
|
49
|
+
return [
|
|
50
|
+
'frozen mid-vibe. press space to thaw.',
|
|
51
|
+
'paused. the universe holds its breath.',
|
|
52
|
+
'the silence is dramatic. press space to ruin it.',
|
|
53
|
+
'currently doing nothing. respectfully.',
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
return [
|
|
57
|
+
'currently jamming. do not disturb.',
|
|
58
|
+
'the vibes are immaculate.',
|
|
59
|
+
'music intensifies.',
|
|
60
|
+
"press '/' to find more, 'd' for what's next, 'l' for the words.",
|
|
61
|
+
'this slaps. according to my code.',
|
|
62
|
+
'in the zone. or pretending to be.',
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Renders a dim, context-aware funny hint line under the title.
|
|
67
|
+
* The hint pool changes whenever the context (playback / panel / error)
|
|
68
|
+
* changes; within a stable context the hint rotates every few seconds.
|
|
69
|
+
* Rotation pauses when nothing is playing so a frozen player has a stable line.
|
|
70
|
+
* @param hasError - Whether the player is currently in an error state
|
|
71
|
+
* @param hasTrack - Whether a track is loaded (regardless of play/pause)
|
|
72
|
+
* @param isPlaying - Whether playback is actively running
|
|
73
|
+
* @param panelMode - Currently active side panel
|
|
74
|
+
*/
|
|
75
|
+
export function AnimatedSubtitle({ hasError, hasTrack, isPlaying, panelMode }) {
|
|
76
|
+
const pool = useMemo(() => hintsFor({
|
|
77
|
+
hasError,
|
|
78
|
+
hasTrack,
|
|
79
|
+
isPlaying,
|
|
80
|
+
panelMode,
|
|
81
|
+
}), [
|
|
82
|
+
hasError,
|
|
83
|
+
hasTrack,
|
|
84
|
+
isPlaying,
|
|
85
|
+
panelMode,
|
|
86
|
+
]);
|
|
87
|
+
const [index, setIndex] = useState(0);
|
|
88
|
+
// Reset to a random starting hint whenever the pool changes so the user
|
|
89
|
+
// doesn't see the same first line every time they switch panels.
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
setIndex(Math.floor(Math.random() * pool.length));
|
|
92
|
+
}, [
|
|
93
|
+
pool,
|
|
94
|
+
]);
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
if (!isPlaying || pool.length <= 1)
|
|
97
|
+
return;
|
|
98
|
+
const id = setInterval(() => {
|
|
99
|
+
setIndex((i) => (i + 1) % pool.length);
|
|
100
|
+
}, ROTATE_INTERVAL_MS);
|
|
101
|
+
return () => clearInterval(id);
|
|
102
|
+
}, [
|
|
103
|
+
isPlaying,
|
|
104
|
+
pool,
|
|
105
|
+
]);
|
|
106
|
+
const safeIndex = index % pool.length;
|
|
107
|
+
const hint = pool[safeIndex] ?? pool[0];
|
|
108
|
+
return (_jsx(Text, { color: "blackBright", dimColor: true, italic: true, children: hint }));
|
|
109
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animated-subtitle.js","sourceRoot":"","sources":["../../src/components/animated-subtitle.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type AnimatedTitleProps = {
|
|
2
|
+
text: string;
|
|
3
|
+
isPlaying: boolean;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Renders the stylized header one-liner: `♪ ── <text> ── ♪ <tagline>`.
|
|
7
|
+
* Only the `<text>` segment animates — each letter cycles through a green
|
|
8
|
+
* gradient offset by its position so the brightest spot ripples left-to-right.
|
|
9
|
+
* The animation is paused (and re-renders stop) when `isPlaying` is false.
|
|
10
|
+
* On narrow terminals (< 60 columns) the trailing tagline is dropped so the
|
|
11
|
+
* decorated title still fits.
|
|
12
|
+
* @param text - The title string to animate (the ripple segment)
|
|
13
|
+
* @param isPlaying - Whether playback is active; the animation runs only when true
|
|
14
|
+
*/
|
|
15
|
+
export declare function AnimatedTitle({ text, isPlaying }: AnimatedTitleProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animated-title.d.ts","sourceRoot":"","sources":["../../src/components/animated-title.tsx"],"names":[],"mappings":"AAoBA,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CAgCpE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text, useWindowSize } from 'ink';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
const FRAME_INTERVAL_MS = 120;
|
|
5
|
+
const TAGLINE = 'a spotify cli for nerds';
|
|
6
|
+
const MIN_WIDE_COLUMNS = 60;
|
|
7
|
+
// Green gradient (bright → dark) used to animate the title. The brightness
|
|
8
|
+
// range matches the karaoke palette in animated-line.tsx (`#0cb80c` → `#0f570f`)
|
|
9
|
+
// for visual consistency across the app and to keep the contrast subtle.
|
|
10
|
+
const COLORS = [
|
|
11
|
+
'#0cb80c',
|
|
12
|
+
'#0ca80c',
|
|
13
|
+
'#0c980c',
|
|
14
|
+
'#0c880c',
|
|
15
|
+
'#0c780c',
|
|
16
|
+
'#0c680c',
|
|
17
|
+
'#0c570c',
|
|
18
|
+
];
|
|
19
|
+
/**
|
|
20
|
+
* Renders the stylized header one-liner: `♪ ── <text> ── ♪ <tagline>`.
|
|
21
|
+
* Only the `<text>` segment animates — each letter cycles through a green
|
|
22
|
+
* gradient offset by its position so the brightest spot ripples left-to-right.
|
|
23
|
+
* The animation is paused (and re-renders stop) when `isPlaying` is false.
|
|
24
|
+
* On narrow terminals (< 60 columns) the trailing tagline is dropped so the
|
|
25
|
+
* decorated title still fits.
|
|
26
|
+
* @param text - The title string to animate (the ripple segment)
|
|
27
|
+
* @param isPlaying - Whether playback is active; the animation runs only when true
|
|
28
|
+
*/
|
|
29
|
+
export function AnimatedTitle({ text, isPlaying }) {
|
|
30
|
+
const [tick, setTick] = useState(0);
|
|
31
|
+
const { columns } = useWindowSize();
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!isPlaying)
|
|
34
|
+
return;
|
|
35
|
+
const id = setInterval(() => setTick((t) => t + 1), FRAME_INTERVAL_MS * 4);
|
|
36
|
+
return () => clearInterval(id);
|
|
37
|
+
}, [
|
|
38
|
+
isPlaying,
|
|
39
|
+
]);
|
|
40
|
+
const showTagline = columns >= MIN_WIDE_COLUMNS;
|
|
41
|
+
return (_jsxs(Text, { bold: true, children: [_jsx(Text, { dimColor: true, children: "\u266A \u2500\u2500 " }), text.split('').map((char, idx) => {
|
|
42
|
+
const colorIndex = (((tick - idx) % COLORS.length) + COLORS.length) % COLORS.length;
|
|
43
|
+
// Modulo math guarantees a valid index, so the lookup is always defined.
|
|
44
|
+
const color = COLORS[colorIndex];
|
|
45
|
+
return (_jsx(Text, { color: color, children: char }, idx));
|
|
46
|
+
}), _jsx(Text, { dimColor: true, children: " \u2500\u2500 \u266A" }), showTagline && _jsx(Text, { dimColor: true, children: ` ${TAGLINE}` })] }));
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animated-title.js","sourceRoot":"","sources":["../../src/components/animated-title.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,OAAO,GAAG,yBAAyB,CAAC;AAC1C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,2EAA2E;AAC3E,iFAAiF;AACjF,yEAAyE;AACzE,MAAM,MAAM,GAAG;IACb,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AAOF;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAsB;IACnE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,CAAC;QAC3E,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE;QACD,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAO,IAAI,gBAAgB,CAAC;IAEhD,OAAO,CACL,MAAC,IAAI,IAAC,IAAI,mBACR,KAAC,IAAI,IAAC,QAAQ,2CAAa,EAC1B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAChC,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;gBACpF,yEAAyE;gBACzE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAE,CAAC;gBAClC,OAAO,CAEL,KAAC,IAAI,IAAW,KAAK,EAAE,KAAK,YACzB,IAAI,IADI,GAAG,CAEP,CACR,CAAC;YACJ,CAAC,CAAC,EACF,KAAC,IAAI,IAAC,QAAQ,2CAAa,EAC1B,WAAW,IAAI,KAAC,IAAI,IAAC,QAAQ,kBAAE,MAAM,OAAO,EAAE,GAAQ,IAClD,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browse-detail-view.d.ts","sourceRoot":"","sources":["../../src/components/browse-detail-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,qBAAqB,2CA0DvG"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
|
+
import { ICON_LIST_GUTTER, ICON_LIST_PLAYING, ICON_LIST_SELECTED } from '../icons.js';
|
|
3
4
|
/**
|
|
4
5
|
* Renders album or playlist track lists with a scrolling selection window.
|
|
5
6
|
* Reuses the windowing pattern from queue-view for consistent navigation.
|
|
@@ -22,7 +23,7 @@ export function BrowseDetailView({ data, selectedIndex, currentTrackUri, height
|
|
|
22
23
|
const label = `${item.artist} - ${item.name}`;
|
|
23
24
|
const isSelected = idx === selectedIndex;
|
|
24
25
|
const isPlaying = currentTrackUri !== null && item.uri === currentTrackUri;
|
|
25
|
-
const icon = isPlaying ?
|
|
26
|
+
const icon = isPlaying ? ICON_LIST_PLAYING : isSelected ? ICON_LIST_SELECTED : ICON_LIST_GUTTER;
|
|
26
27
|
if (isPlaying) {
|
|
27
28
|
return (_jsxs(Text, { bold: true, color: "green", inverse: isSelected, children: [icon, label] }, item.uri + idx));
|
|
28
29
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browse-detail-view.js","sourceRoot":"","sources":["../../src/components/browse-detail-view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAStF;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAyB;IACtG,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAChG,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAExD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAC,QAAQ,aAC3D,MAAC,GAAG,IACF,GAAG,EAAE,CAAC,EACN,WAAW,EAAC,MAAM,EAClB,WAAW,EAAC,QAAQ,EACpB,YAAY,QACZ,UAAU,EAAE,KAAK,EACjB,WAAW,EAAE,KAAK,EAClB,SAAS,EAAE,KAAK,aAEhB,KAAC,IAAI,IAAC,IAAI,kBAAE,IAAI,CAAC,KAAK,GAAQ,EAC7B,IAAI,CAAC,QAAQ,IAAI,MAAC,IAAI,IAAC,QAAQ,yBAAI,IAAI,CAAC,QAAQ,IAAQ,IACrD,EAEL,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAC,IAAI,IAAC,QAAQ,sCAAuB,EAE3D,KAAK,CAAC,IAAI,CACT;gBACE,MAAM,EAAE,YAAY;aACrB,EACD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACP,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,CAAC;gBAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,IAAI;oBAAE,OAAO,KAAC,IAAI,qBAAM,GAAG,CAAU,CAAC;gBAC3C,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC9C,MAAM,UAAU,GAAG,GAAG,KAAK,aAAa,CAAC;gBACzC,MAAM,SAAS,GAAG,eAAe,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,eAAe,CAAC;gBAC3E,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBAEhG,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,CACL,MAAC,IAAI,IAAsB,IAAI,QAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAE,UAAU,aAC9D,IAAI,EACJ,KAAK,KAFG,IAAI,CAAC,GAAG,GAAG,GAAG,CAGlB,CACR,CAAC;gBACJ,CAAC;gBAED,OAAO,CACL,MAAC,IAAI,IAAsB,OAAO,EAAE,UAAU,aAC3C,IAAI,EACJ,KAAK,KAFG,IAAI,CAAC,GAAG,GAAG,GAAG,CAGlB,CACR,CAAC;YACJ,CAAC,CACF,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lyrics-panel.d.ts","sourceRoot":"","sources":["../../src/components/lyrics-panel.tsx"],"names":[],"mappings":"AAIA,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA0BF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,gBAAgB,2CAgBnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lyrics-view.d.ts","sourceRoot":"","sources":["../../src/components/lyrics-view.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAItD,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AA0BF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA2CnF"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
|
+
import { ICON_INSTRUMENTAL } from '../icons.js';
|
|
3
4
|
import { getCurrentLineIndex } from '../spotify/lyrics.js';
|
|
4
5
|
import { AnimatedLine } from './animated-line.js';
|
|
5
6
|
function LyricSlot({ line, isCurrent, isPast, lineProgress }) {
|
|
6
7
|
if (isCurrent) {
|
|
7
|
-
return _jsx(AnimatedLine, { text: line.text ||
|
|
8
|
+
return _jsx(AnimatedLine, { text: line.text || ICON_INSTRUMENTAL, progress: lineProgress });
|
|
8
9
|
}
|
|
9
10
|
if (isPast) {
|
|
10
11
|
return _jsx(Text, { dimColor: true, children: line.text || ' ' });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lyrics-view.js","sourceRoot":"","sources":["../../src/components/lyrics-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel-content.d.ts","sourceRoot":"","sources":["../../src/components/panel-content.tsx"],"names":[],"mappings":"AAKA,KAAK,iBAAiB,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,iBAAiB,kDAgBrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playback-status.d.ts","sourceRoot":"","sources":["../../src/components/playback-status.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,KAAK,mBAAmB,GAAG;IACzB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,mBAAmB,2CAuBrG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../../src/components/player.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../../src/components/player.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAqB1D,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAmLF;;GAEG;AACH,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,2CAM7C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Spacer,
|
|
2
|
+
import { Box, Spacer, useWindowSize } from 'ink';
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
4
|
import { LYRICS_WIDE_COLUMNS } from '../config.js';
|
|
5
5
|
import { LyricsProvider, useLyricsContext } from '../contexts/lyrics-context.js';
|
|
@@ -9,10 +9,14 @@ import { SearchProvider } from '../contexts/search-context.js';
|
|
|
9
9
|
import { useAlbumArt } from '../hooks/use-album-art.js';
|
|
10
10
|
import { usePlayback } from '../hooks/use-playback.js';
|
|
11
11
|
import { usePlayerInput } from '../hooks/use-player-input.js';
|
|
12
|
+
import { ICON_ARROW_HORIZONTAL, ICON_ARROW_VERTICAL } from '../icons.js';
|
|
13
|
+
import { AnimatedSubtitle } from './animated-subtitle.js';
|
|
14
|
+
import { AnimatedTitle } from './animated-title.js';
|
|
12
15
|
import { KeyboardHints } from './keyboard-hints.js';
|
|
13
16
|
import { PanelContent } from './panel-content.js';
|
|
14
17
|
import { PlaybackStatus } from './playback-status.js';
|
|
15
18
|
import { SidePanel } from './side-panel.js';
|
|
19
|
+
import { TrackFacts } from './track-facts.js';
|
|
16
20
|
const MIN_WIDE_COLUMNS = 60;
|
|
17
21
|
const ART_WIDTH = 20;
|
|
18
22
|
const TIME_LABEL_WIDTH = 15;
|
|
@@ -58,11 +62,11 @@ function buildHints(panelMode, lyricsOffset, isPlainText, isInputMode) {
|
|
|
58
62
|
if (panelMode === 'search') {
|
|
59
63
|
return [
|
|
60
64
|
{
|
|
61
|
-
key:
|
|
65
|
+
key: ICON_ARROW_VERTICAL,
|
|
62
66
|
label: 'navigate',
|
|
63
67
|
},
|
|
64
68
|
{
|
|
65
|
-
key:
|
|
69
|
+
key: ICON_ARROW_HORIZONTAL,
|
|
66
70
|
label: 'category',
|
|
67
71
|
},
|
|
68
72
|
{
|
|
@@ -82,7 +86,7 @@ function buildHints(panelMode, lyricsOffset, isPlainText, isInputMode) {
|
|
|
82
86
|
if (panelMode === 'queue') {
|
|
83
87
|
return [
|
|
84
88
|
{
|
|
85
|
-
key:
|
|
89
|
+
key: ICON_ARROW_VERTICAL,
|
|
86
90
|
label: 'navigate',
|
|
87
91
|
},
|
|
88
92
|
{
|
|
@@ -107,7 +111,7 @@ function buildHints(panelMode, lyricsOffset, isPlainText, isInputMode) {
|
|
|
107
111
|
const hints = [];
|
|
108
112
|
if (isPlainText) {
|
|
109
113
|
hints.push({
|
|
110
|
-
key:
|
|
114
|
+
key: ICON_ARROW_VERTICAL,
|
|
111
115
|
label: 'scroll',
|
|
112
116
|
});
|
|
113
117
|
}
|
|
@@ -140,11 +144,11 @@ function buildHints(panelMode, lyricsOffset, isPlainText, isInputMode) {
|
|
|
140
144
|
label: 'prev',
|
|
141
145
|
},
|
|
142
146
|
{
|
|
143
|
-
key:
|
|
147
|
+
key: ICON_ARROW_HORIZONTAL,
|
|
144
148
|
label: 'seek',
|
|
145
149
|
},
|
|
146
150
|
{
|
|
147
|
-
key:
|
|
151
|
+
key: ICON_ARROW_VERTICAL,
|
|
148
152
|
label: 'vol',
|
|
149
153
|
},
|
|
150
154
|
{
|
|
@@ -211,5 +215,5 @@ function PlayerUI({ playback, track, isLoading, error, columns, rows, panelMode,
|
|
|
211
215
|
]);
|
|
212
216
|
const showPanelWide = finalLayout.isPanelWide && hasPanel && !!track;
|
|
213
217
|
const showPanelNarrow = !finalLayout.isPanelWide && hasPanel && !!track;
|
|
214
|
-
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, height: "100%", borderColor: "black", borderStyle: "single", children: [_jsx(
|
|
218
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, height: "100%", borderColor: "black", borderStyle: "single", children: [_jsx(AnimatedTitle, { text: "morille", isPlaying: track?.isPlaying ?? false }), _jsx(AnimatedSubtitle, { hasError: !!error, hasTrack: !!track, isPlaying: track?.isPlaying ?? false, panelMode: panelMode }), _jsxs(Box, { marginTop: 1, flexDirection: showPanelWide ? 'row' : 'column', flexGrow: 1, children: [_jsx(Box, { flexDirection: "column", width: showPanelWide ? finalLayout.leftWidth : undefined, flexGrow: showPanelWide ? 0 : 1, children: _jsx(PlaybackStatus, { track: track, isLoading: isLoading, error: error, art: art, progressBarWidth: finalLayout.progressBarWidth }) }), showPanelWide && track && (_jsx(SidePanel, { width: finalLayout.panelColumnWidth || undefined, isWideLayout: true, children: _jsx(PanelContent, { progressMs: track.progressMs, height: finalLayout.panelHeight }) }))] }), showPanelNarrow && track && (_jsx(SidePanel, { width: undefined, isWideLayout: false, children: _jsx(PanelContent, { progressMs: track.progressMs, height: finalLayout.panelHeight }) })), _jsx(Spacer, {}), _jsx(KeyboardHints, { hints: hints }), _jsx(TrackFacts, { track: track })] }));
|
|
215
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.js","sourceRoot":"","sources":["../../src/components/player.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"player.js","sourceRoot":"","sources":["../../src/components/player.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-bar.d.ts","sourceRoot":"","sources":["../../src/components/progress-bar.tsx"],"names":[],"mappings":"AAGA,KAAK,gBAAgB,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CAO1E"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Text } from 'ink';
|
|
3
|
+
import { ICON_BAR_EMPTY, ICON_BAR_FILLED } from '../icons.js';
|
|
3
4
|
/**
|
|
4
5
|
* Renders a visual progress bar using Unicode block characters.
|
|
5
6
|
* Width adapts to the available terminal space.
|
|
@@ -8,6 +9,6 @@ export function ProgressBar({ progress, duration, width }) {
|
|
|
8
9
|
const barWidth = Math.max(width, 5);
|
|
9
10
|
const ratio = duration > 0 ? Math.min(progress / duration, 1) : 0;
|
|
10
11
|
const filled = Math.round(ratio * barWidth);
|
|
11
|
-
const bar =
|
|
12
|
+
const bar = ICON_BAR_FILLED.repeat(filled) + ICON_BAR_EMPTY.repeat(barWidth - filled);
|
|
12
13
|
return _jsx(Text, { dimColor: true, children: bar });
|
|
13
14
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-bar.js","sourceRoot":"","sources":["../../src/components/progress-bar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ9D;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAoB;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;IAEtF,OAAO,KAAC,IAAI,IAAC,QAAQ,kBAAE,GAAG,GAAQ,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-view.d.ts","sourceRoot":"","sources":["../../src/components/queue-view.tsx"],"names":[],"mappings":"AAKA,KAAK,cAAc,GAAG;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAiDF;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,2CA8CnD"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
3
|
import { useQueueContext } from '../contexts/queue-context.js';
|
|
4
|
+
import { ICON_LIST_PLAYING } from '../icons.js';
|
|
4
5
|
function QueueSlot({ item, isSelected }) {
|
|
5
6
|
const label = `${item.artist} - ${item.name}`;
|
|
6
7
|
if (item.isCurrent) {
|
|
7
|
-
return (_jsxs(Text, { bold: true, color: "green", inverse: isSelected, children: [
|
|
8
|
+
return (_jsxs(Text, { bold: true, color: "green", inverse: isSelected, children: [ICON_LIST_PLAYING, label] }));
|
|
8
9
|
}
|
|
9
10
|
if (item.isPrevious) {
|
|
10
11
|
return (_jsx(Text, { dimColor: true, inverse: isSelected, children: label }));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-view.js","sourceRoot":"","sources":["../../src/components/queue-view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAMhD,SAAS,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAA4C;IAC/E,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAE9C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CACL,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAE,UAAU,aACzC,iBAAiB,EACjB,KAAK,IACD,CACR,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,CACL,KAAC,IAAI,IAAC,QAAQ,QAAC,OAAO,EAAE,UAAU,YAC/B,KAAK,GACD,CACR,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,KAAC,IAAI,IAAC,OAAO,kBAAE,KAAK,GAAQ,CAAC;IACtC,CAAC;IAED,OAAO,KAAC,IAAI,cAAE,KAAK,GAAQ,CAAC;AAC9B,CAAC;AAED,SAAS,UAAU,CAAC,KAAkB,EAAE,aAAqB,EAAE,MAAc,EAAE,MAAc;IAC3F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,GAAG,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACrG,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAEpD,OAAO,KAAK,CAAC,IAAI,CACf;QACE,MAAM,EAAE,YAAY;KACrB,EACD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACP,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI;YAAE,OAAO,KAAC,IAAI,qBAAM,GAAG,CAAU,CAAC;QAC3C,OAAO,KAAC,SAAS,IAAsB,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,GAAG,MAAM,KAAK,aAAa,IAAtE,IAAI,CAAC,GAAG,GAAG,GAAG,CAA4D,CAAC;IACpG,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAkB;IAClD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAAC;IAE5F,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAC,IAAI,IAAC,QAAQ,uCAAwB,CAAC;IAChD,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAC,IAAI,IAAC,QAAQ,qCAAsB,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAElF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAC,QAAQ,aAC1D,WAAW,IAAI,CACd,MAAC,GAAG,IACF,GAAG,EAAE,CAAC,EACN,WAAW,EAAC,MAAM,EAClB,WAAW,EAAC,QAAQ,EACpB,YAAY,QACZ,UAAU,EAAE,KAAK,EACjB,WAAW,EAAE,KAAK,EAClB,SAAS,EAAE,KAAK,aAEhB,KAAC,IAAI,IAAC,IAAI,kBAAE,WAAW,GAAQ,EAC9B,eAAe,IAAI,KAAC,IAAI,oBAAS,EACjC,eAAe,IAAI,KAAC,IAAI,IAAC,QAAQ,kBAAE,eAAe,GAAQ,IACvD,CACP,EAEA,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,CAAC,EAEpD,OAAO,IAAI,KAAC,SAAS,IAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,KAAK,aAAa,GAAI,EAEnF,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,IACpF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-panel.d.ts","sourceRoot":"","sources":["../../src/components/search-panel.tsx"],"names":[],"mappings":"AAQA,KAAK,gBAAgB,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,gBAAgB,2CAYvD"}
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
3
|
import { usePanelMode } from '../contexts/panel-mode-context.js';
|
|
4
4
|
import { useSearchContext } from '../contexts/search-context.js';
|
|
5
|
+
import { ICON_LIST_GUTTER, ICON_LIST_PLAYING, ICON_LIST_SELECTED } from '../icons.js';
|
|
5
6
|
import { BrowseDetailView } from './browse-detail-view.js';
|
|
6
7
|
/**
|
|
7
8
|
* Routes between search sub-views based on the current navigation state.
|
|
@@ -76,7 +77,7 @@ function isItemPlaying(category, item, currentTrackUri, currentContextUri) {
|
|
|
76
77
|
function ResultItem({ category, item, isSelected, isPlaying, dimmed, }) {
|
|
77
78
|
const label = formatResultItem(category, item);
|
|
78
79
|
// No selection indicator while dimmed (input focused) — selection only matters in browse mode
|
|
79
|
-
const icon = isPlaying ?
|
|
80
|
+
const icon = isPlaying ? ICON_LIST_PLAYING : !dimmed && isSelected ? ICON_LIST_SELECTED : ICON_LIST_GUTTER;
|
|
80
81
|
if (isPlaying) {
|
|
81
82
|
return (_jsxs(Text, { bold: true, color: "green", inverse: !dimmed && isSelected, dimColor: dimmed, children: [icon, label] }));
|
|
82
83
|
}
|
|
@@ -143,7 +144,7 @@ function UserPlaylistsView({ height }) {
|
|
|
143
144
|
return _jsx(Text, { children: " " }, idx);
|
|
144
145
|
const isSelected = idx === selectedIndex;
|
|
145
146
|
const isPlaying = currentContextUri !== null && playlist.uri === currentContextUri;
|
|
146
|
-
const icon = isPlaying ?
|
|
147
|
+
const icon = isPlaying ? ICON_LIST_PLAYING : isSelected ? ICON_LIST_SELECTED : ICON_LIST_GUTTER;
|
|
147
148
|
if (isPlaying) {
|
|
148
149
|
return (_jsxs(Text, { bold: true, color: "green", inverse: isSelected, children: [icon, playlist.name, " (", playlist.totalTracks, " tracks)"] }, playlist.id));
|
|
149
150
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-panel.js","sourceRoot":"","sources":["../../src/components/search-panel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shimmer.d.ts","sourceRoot":"","sources":["../../src/components/shimmer.tsx"],"names":[],"mappings":"AAOA,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,MAAU,EAAE,EAAE,eAAe,2CAgChE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Text } from 'ink';
|
|
3
3
|
import { useEffect, useState } from 'react';
|
|
4
|
-
|
|
4
|
+
import { ICON_SHIMMER } from '../icons.js';
|
|
5
5
|
const ANIMATION_INTERVAL_MS = 80;
|
|
6
6
|
const SHIMMER_WIDTH = 3;
|
|
7
7
|
/**
|
|
@@ -23,7 +23,7 @@ export function ShimmerBar({ width, offset = 0 }) {
|
|
|
23
23
|
const position = (tick + offset) % cycle;
|
|
24
24
|
let line = '';
|
|
25
25
|
for (let i = 0; i < barWidth; i++) {
|
|
26
|
-
line +=
|
|
26
|
+
line += ICON_SHIMMER;
|
|
27
27
|
}
|
|
28
28
|
const highlightStart = Math.max(0, position - SHIMMER_WIDTH);
|
|
29
29
|
const highlightEnd = Math.min(barWidth, position);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shimmer.js","sourceRoot":"","sources":["../../src/components/shimmer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,aAAa,GAAG,CAAC,CAAC;AAOxB;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAmB;IAC/D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAC1B,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC1B,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,QAAQ,GAAG,aAAa,CAAC;IACvC,MAAM,QAAQ,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;IAEzC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,IAAI,YAAY,CAAC;IACvB,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvC,OAAO,CACL,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,QAAQ,kBAAE,MAAM,GAAQ,EAC9B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,SAAS,GAAQ,EACrC,KAAC,IAAI,IAAC,QAAQ,kBAAE,KAAK,GAAQ,IACxB,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TrackInfo } from '../spotify/playback.js';
|
|
2
|
+
type TrackFactsProps = {
|
|
3
|
+
track: TrackInfo | null;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Renders a dim, rotating trivia line derived from the currently playing
|
|
7
|
+
* track's metadata. The pool is rebuilt whenever the track changes and
|
|
8
|
+
* the displayed fact rotates on a slow cadence so the user has time to read.
|
|
9
|
+
* Hidden entirely when no track is active.
|
|
10
|
+
* @param track - The currently playing track, or `null`
|
|
11
|
+
*/
|
|
12
|
+
export declare function TrackFacts({ track }: TrackFactsProps): import("react/jsx-runtime").JSX.Element | null;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-facts.d.ts","sourceRoot":"","sources":["../../src/components/track-facts.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAUxD,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,eAAe,kDAyCpD"}
|