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.
Files changed (93) hide show
  1. package/dist/app.d.ts.map +1 -0
  2. package/dist/app.js +1 -0
  3. package/dist/app.js.map +1 -0
  4. package/dist/components/animated-subtitle.d.ts +19 -0
  5. package/dist/components/animated-subtitle.d.ts.map +1 -0
  6. package/dist/components/animated-subtitle.js +109 -0
  7. package/dist/components/animated-subtitle.js.map +1 -0
  8. package/dist/components/animated-title.d.ts +16 -0
  9. package/dist/components/animated-title.d.ts.map +1 -0
  10. package/dist/components/animated-title.js +47 -0
  11. package/dist/components/animated-title.js.map +1 -0
  12. package/dist/components/browse-detail-view.d.ts.map +1 -0
  13. package/dist/components/browse-detail-view.js +2 -1
  14. package/dist/components/browse-detail-view.js.map +1 -0
  15. package/dist/components/lyrics-panel.d.ts.map +1 -0
  16. package/dist/components/lyrics-view.d.ts.map +1 -0
  17. package/dist/components/lyrics-view.js +2 -1
  18. package/dist/components/lyrics-view.js.map +1 -0
  19. package/dist/components/panel-content.d.ts.map +1 -0
  20. package/dist/components/playback-status.d.ts.map +1 -0
  21. package/dist/components/player.d.ts.map +1 -1
  22. package/dist/components/player.js +12 -8
  23. package/dist/components/player.js.map +1 -1
  24. package/dist/components/progress-bar.d.ts.map +1 -0
  25. package/dist/components/progress-bar.js +2 -1
  26. package/dist/components/progress-bar.js.map +1 -0
  27. package/dist/components/queue-view.d.ts.map +1 -0
  28. package/dist/components/queue-view.js +2 -1
  29. package/dist/components/queue-view.js.map +1 -0
  30. package/dist/components/search-panel.d.ts.map +1 -0
  31. package/dist/components/search-panel.js +3 -2
  32. package/dist/components/search-panel.js.map +1 -0
  33. package/dist/components/shimmer.d.ts.map +1 -0
  34. package/dist/components/shimmer.js +2 -2
  35. package/dist/components/shimmer.js.map +1 -0
  36. package/dist/components/track-facts.d.ts +13 -0
  37. package/dist/components/track-facts.d.ts.map +1 -0
  38. package/dist/components/track-facts.js +52 -0
  39. package/dist/components/track-facts.js.map +1 -0
  40. package/dist/components/track-info-skeleton.d.ts.map +1 -0
  41. package/dist/components/track-info.d.ts.map +1 -0
  42. package/dist/components/track-info.js +2 -1
  43. package/dist/components/track-info.js.map +1 -0
  44. package/dist/config.d.ts +3 -4
  45. package/dist/config.d.ts.map +1 -1
  46. package/dist/config.js +3 -4
  47. package/dist/config.js.map +1 -1
  48. package/dist/contexts/lyrics-context.d.ts.map +1 -0
  49. package/dist/contexts/queue-context.d.ts.map +1 -0
  50. package/dist/contexts/search-context.d.ts.map +1 -0
  51. package/dist/hooks/use-album-art.d.ts.map +1 -0
  52. package/dist/hooks/use-album-art.js +2 -1
  53. package/dist/hooks/use-album-art.js.map +1 -0
  54. package/dist/hooks/use-browse.d.ts.map +1 -0
  55. package/dist/hooks/use-browse.js +6 -3
  56. package/dist/hooks/use-browse.js.map +1 -0
  57. package/dist/hooks/use-lyrics.d.ts.map +1 -0
  58. package/dist/hooks/use-playback.d.ts.map +1 -0
  59. package/dist/hooks/use-playback.js +30 -11
  60. package/dist/hooks/use-playback.js.map +1 -0
  61. package/dist/hooks/use-player-input.d.ts.map +1 -0
  62. package/dist/hooks/use-queue.d.ts.map +1 -0
  63. package/dist/hooks/use-queue.js +7 -3
  64. package/dist/hooks/use-queue.js.map +1 -0
  65. package/dist/hooks/use-search.d.ts.map +1 -0
  66. package/dist/icons.d.ts +22 -0
  67. package/dist/icons.d.ts.map +1 -0
  68. package/dist/icons.js +35 -0
  69. package/dist/icons.js.map +1 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/main.d.ts.map +1 -0
  72. package/dist/spotify/auth.d.ts.map +1 -0
  73. package/dist/spotify/auth.js +2 -1
  74. package/dist/spotify/auth.js.map +1 -0
  75. package/dist/spotify/client.d.ts.map +1 -0
  76. package/dist/spotify/client.js +2 -1
  77. package/dist/spotify/client.js.map +1 -0
  78. package/dist/spotify/fetch-with-retry.d.ts.map +1 -0
  79. package/dist/spotify/lyrics.d.ts.map +1 -0
  80. package/dist/spotify/lyrics.js +4 -2
  81. package/dist/spotify/lyrics.js.map +1 -0
  82. package/dist/spotify/playback.d.ts +6 -0
  83. package/dist/spotify/playback.d.ts.map +1 -0
  84. package/dist/spotify/playback.js +14 -0
  85. package/dist/spotify/playback.js.map +1 -0
  86. package/dist/spotify/search.d.ts.map +1 -0
  87. package/dist/spotify/search.js +4 -4
  88. package/dist/spotify/search.js.map +1 -0
  89. package/dist/spotify/track-facts.d.ts +9 -0
  90. package/dist/spotify/track-facts.d.ts.map +1 -0
  91. package/dist/spotify/track-facts.js +95 -0
  92. package/dist/spotify/track-facts.js.map +1 -0
  93. 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
@@ -31,6 +31,7 @@ export function App() {
31
31
  }
32
32
  }
33
33
  catch (err) {
34
+ console.error('Spotify authentication failed:', err);
34
35
  if (!cancelled) {
35
36
  setAuthError(err instanceof Error ? err.message : 'Authentication failed');
36
37
  }
@@ -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 ? '\u25B6 ' : isSelected ? '> ' : ' ';
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 || '\u266A', progress: lineProgress });
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":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAgBlD,SAAS,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAkB;IAC1E,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,iBAAiB,EAAE,QAAQ,EAAE,YAAY,GAAI,CAAC;IACxF,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,CAAC,IAAI,IAAI,GAAG,GAAQ,CAAC;IAClD,CAAC;IACD,OAAO,KAAC,IAAI,cAAE,IAAI,CAAC,IAAI,IAAI,GAAG,GAAQ,CAAC;AACzC,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAmB,EAAE,KAAa,EAAE,UAAkB,EAAE,QAAgB;IACnG,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC;IAC1C,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,OAAO,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAmB;IAClF,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;IAE7C,MAAM,KAAK,GAGN,EAAE,CAAC;IACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,MAAM,CAAC,GAAG,CAAE;aACnB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAC,QAAQ,YAC1D,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,KAAC,IAAI,qBAAM,IAAI,CAAC,KAAK,CAAU,CAAC;YACzC,CAAC;YACD,OAAO,CACL,KAAC,SAAS,IAER,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,SAAS,EAAE,IAAI,CAAC,KAAK,KAAK,YAAY,EACtC,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,YAAY,EACjC,YAAY,EACV,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAL5F,IAAI,CAAC,KAAK,CAOf,CACH,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -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;AAiB1D,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAmLF;;GAEG;AACH,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,2CAM7C"}
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, Text, useWindowSize } from 'ink';
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: '\u2191/\u2193',
65
+ key: ICON_ARROW_VERTICAL,
62
66
  label: 'navigate',
63
67
  },
64
68
  {
65
- key: '\u2190/\u2192',
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: '\u2191/\u2193',
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: '\u2191/\u2193',
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: '\u2190/\u2192',
147
+ key: ICON_ARROW_HORIZONTAL,
144
148
  label: 'seek',
145
149
  },
146
150
  {
147
- key: '\u2191/\u2193',
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(Text, { bold: true, color: "green", children: "morille" }), _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 })] }));
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":"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"}
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 = '\u2588'.repeat(filled) + '\u2591'.repeat(barWidth - filled);
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: ['\u25B6', " ", label] }));
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":"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"}
@@ -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 ? '\u25B6 ' : !dimmed && isSelected ? '> ' : ' ';
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 ? '\u25B6 ' : isSelected ? '> ' : ' ';
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
- const SHIMMER_CHAR = '\u2591'; // light shade block
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 += SHIMMER_CHAR;
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"}