This commit is contained in:
2026-02-05 18:29:05 -05:00
parent 91de49be0d
commit 03e69d04dc
8 changed files with 74 additions and 57 deletions

View File

@@ -30,7 +30,11 @@ const platformKey = `${platform}-${arch}`
const platformPkg = platformMap[platformKey] const platformPkg = platformMap[platformKey]
if (platformPkg) { if (platformPkg) {
const libName = platform === "win32" ? "opentui.dll" : "libopentui.dylib" const libName = platform === "win32"
? "opentui.dll"
: platform === "darwin"
? "libopentui.dylib"
: "libopentui.so"
const srcPath = join("node_modules", `@opentui/core-${platformPkg}`, libName) const srcPath = join("node_modules", `@opentui/core-${platformPkg}`, libName)
if (existsSync(srcPath)) { if (existsSync(srcPath)) {

View File

@@ -29,7 +29,7 @@
"@opentui/solid": "^0.1.77", "@opentui/solid": "^0.1.77",
"babel-preset-solid": "1.9.9", "babel-preset-solid": "1.9.9",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"solid-js": "^1.9.11", "solid-js": "^1.9.9",
"uuid": "^13.0.0", "uuid": "^13.0.0",
"zustand": "^5.0.11" "zustand": "^5.0.11"
} }

View File

@@ -1,4 +1,4 @@
import { createSignal } from "solid-js"; import { createSignal, ErrorBoundary } from "solid-js";
import { Layout } from "./components/Layout"; import { Layout } from "./components/Layout";
import { Navigation } from "./components/Navigation"; import { Navigation } from "./components/Navigation";
import { TabNavigation } from "./components/TabNavigation"; import { TabNavigation } from "./components/TabNavigation";
@@ -191,7 +191,18 @@ export function App() {
} }
footer={<Navigation activeTab={activeTab()} onTabSelect={setActiveTab} />} footer={<Navigation activeTab={activeTab()} onTabSelect={setActiveTab} />}
> >
<box style={{ padding: 1 }}>{renderContent()}</box> <box style={{ padding: 1 }}>
<ErrorBoundary fallback={(err) => (
<box border padding={2}>
<text fg="red">
Error rendering tab: {err?.message ?? String(err)}{"\n"}
Press a number key (1-5) to switch tabs.
</text>
</box>
)}>
{renderContent()}
</ErrorBoundary>
</box>
</Layout> </Layout>
); );
} }

View File

@@ -2,7 +2,7 @@
* PodcastCard component - Reusable card for displaying podcast info * PodcastCard component - Reusable card for displaying podcast info
*/ */
import { Show } from "solid-js" import { Show, For } from "solid-js"
import type { Podcast } from "../types/podcast" import type { Podcast } from "../types/podcast"
type PodcastCardProps = { type PodcastCardProps = {
@@ -54,9 +54,9 @@ export function PodcastCard(props: PodcastCardProps) {
<box flexDirection="row" justifyContent="space-between" marginTop={props.compact ? 0 : 1}> <box flexDirection="row" justifyContent="space-between" marginTop={props.compact ? 0 : 1}>
<box flexDirection="row" gap={1}> <box flexDirection="row" gap={1}>
<Show when={(props.podcast.categories ?? []).length > 0}> <Show when={(props.podcast.categories ?? []).length > 0}>
{(props.podcast.categories ?? []).slice(0, 2).map((cat) => ( <For each={(props.podcast.categories ?? []).slice(0, 2)}>
<text fg="yellow">[{cat}]</text> {(cat) => <text fg="yellow">[{cat}]</text>}
))} </For>
</Show> </Show>
</box> </box>

View File

@@ -1,4 +1,4 @@
import { createSignal } from "solid-js" import { createSignal, For } from "solid-js"
import { useKeyboard } from "@opentui/solid" import { useKeyboard } from "@opentui/solid"
import { SourceManager } from "./SourceManager" import { SourceManager } from "./SourceManager"
import { useTheme } from "../context/ThemeContext" import { useTheme } from "../context/ThemeContext"
@@ -56,18 +56,20 @@ export function SettingsScreen(props: SettingsScreenProps) {
</box> </box>
<box flexDirection="row" gap={1}> <box flexDirection="row" gap={1}>
{SECTIONS.map((section, index) => ( <For each={SECTIONS}>
<box {(section, index) => (
border <box
padding={0} border
backgroundColor={activeSection() === section.id ? theme.primary : undefined} padding={0}
onMouseDown={() => setActiveSection(section.id)} backgroundColor={activeSection() === section.id ? theme.primary : undefined}
> onMouseDown={() => setActiveSection(section.id)}
<text fg={activeSection() === section.id ? theme.text : theme.textMuted}> >
[{index + 1}] {section.label} <text fg={activeSection() === section.id ? theme.text : theme.textMuted}>
</text> [{index() + 1}] {section.label}
</box> </text>
))} </box>
)}
</For>
</box> </box>
<box border flexGrow={1} padding={1} flexDirection="column" gap={1}> <box border flexGrow={1} padding={1} flexDirection="column" gap={1}>

View File

@@ -31,7 +31,7 @@ export function TrendingShows(props: TrendingShowsProps) {
</Show> </Show>
<Show when={!props.isLoading && props.podcasts.length > 0}> <Show when={!props.isLoading && props.podcasts.length > 0}>
<scrollbox height="100%"> <scrollbox height={15}>
<box flexDirection="column"> <box flexDirection="column">
<For each={props.podcasts}> <For each={props.podcasts}>
{(podcast, index) => ( {(podcast, index) => (

View File

@@ -33,4 +33,4 @@ render(() => (
</ThemeProvider> </ThemeProvider>
</ToastProvider> </ToastProvider>
</RendererSetup> </RendererSetup>
)) ), { useThread: false })

View File

@@ -74,11 +74,11 @@ Status legend: [ ] todo, [~] in-progress, [x] done
## Phase 6: Search Functionality 🔍 ## Phase 6: Search Functionality 🔍
**Implement multi-source search interface** **Implement multi-source search interface**
- [ ] 06 — Implement multi-source search interface → `06-search.md` - [x] 06 — Implement multi-source search interface → `06-search.md`
- [ ] 33 — Create search interface → `33-search-interface.md` - [x] 33 — Create search interface → `33-search-interface.md`
- [ ] 34 — Implement multi-source search → `34-multi-source-search.md` - [x] 34 — Implement multi-source search → `34-multi-source-search.md`
- [ ] 35 — Add search results display → `35-search-results.md` - [x] 35 — Add search results display → `35-search-results.md`
- [ ] 36 — Build search history with persistent storage → `36-search-history.md` - [x] 36 — Build search history with persistent storage → `36-search-history.md`
**Dependencies:** 05 -> 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12 **Dependencies:** 05 -> 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12
@@ -87,11 +87,11 @@ Status legend: [ ] todo, [~] in-progress, [x] done
## Phase 7: Discover Feed 🌟 ## Phase 7: Discover Feed 🌟
**Build discover page with popular shows** **Build discover page with popular shows**
- [ ] 07 — Build discover feed with popular shows → `07-discover.md` - [x] 07 — Build discover feed with popular shows → `07-discover.md`
- [ ] 37 — Create popular shows data structure → `37-popular-shows.md` - [x] 37 — Create popular shows data structure → `37-popular-shows.md`
- [ ] 38 — Build discover page component → `38-discover-page.md` - [x] 38 — Build discover page component → `38-discover-page.md`
- [ ] 39 — Add trending shows display → `39-trending-shows.md` - [x] 39 — Add trending shows display → `39-trending-shows.md`
- [ ] 40 — Implement category filtering → `40-category-filtering.md` - [x] 40 — Implement category filtering → `40-category-filtering.md`
**Dependencies:** 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12 **Dependencies:** 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12
@@ -100,11 +100,11 @@ Status legend: [ ] todo, [~] in-progress, [x] done
## Phase 8: Player Component 🎵 ## Phase 8: Player Component 🎵
**Create player UI with waveform visualization** **Create player UI with waveform visualization**
- [ ] 08 — Create player UI with waveform visualization → `08-player.md` - [x] 08 — Create player UI with waveform visualization → `08-player.md`
- [ ] 41 — Create player UI layout → `41-player-layout.md` - [x] 41 — Create player UI layout → `41-player-layout.md`
- [ ] 42 — Implement playback controls → `42-playback-controls.md` - [x] 42 — Implement playback controls → `42-playback-controls.md`
- [ ] 43 — Build ASCII waveform visualization → `43-waveform-visualization.md` - [x] 43 — Build ASCII waveform visualization → `43-waveform-visualization.md`
- [ ] 44 — Add progress tracking and seek → `44-progress-tracking.md` - [x] 44 — Add progress tracking and seek → `44-progress-tracking.md`
- [ ] 45 — Implement audio integration (system/external player) → `45-audio-integration.md` - [ ] 45 — Implement audio integration (system/external player) → `45-audio-integration.md`
**Dependencies:** 07 -> 08 -> 09 -> 10 -> 11 -> 12 **Dependencies:** 07 -> 08 -> 09 -> 10 -> 11 -> 12
@@ -114,11 +114,11 @@ Status legend: [ ] todo, [~] in-progress, [x] done
## Phase 9: Settings & Configuration ⚙️ ## Phase 9: Settings & Configuration ⚙️
**Build settings screen and preferences** **Build settings screen and preferences**
- [ ] 09 — Build settings screen and preferences → `09-settings.md` - [x] 09 — Build settings screen and preferences → `09-settings.md`
- [ ] 46 — Create settings screen → `46-settings-screen.md` - [x] 46 — Create settings screen → `46-settings-screen.md`
- [ ] 47 — Add source management UI → `47-source-management-ui.md` - [x] 47 — Add source management UI → `47-source-management-ui.md`
- [ ] 48 — Build user preferences → `48-user-preferences.md` - [x] 48 — Build user preferences → `48-user-preferences.md`
- [ ] 49 — Implement data persistence (localStorage/file-based) → `49-data-persistence.md` - [x] 49 — Implement data persistence (localStorage/file-based) → `49-data-persistence.md`
**Dependencies:** 08 -> 09 -> 10 -> 11 -> 12 **Dependencies:** 08 -> 09 -> 10 -> 11 -> 12
@@ -127,14 +127,14 @@ Status legend: [ ] todo, [~] in-progress, [x] done
## Phase 10: Theme System 🎨 ## Phase 10: Theme System 🎨
**Implement theming with Catppuccin, Gruvbox, Tokyo, Nord, and custom themes** **Implement theming with Catppuccin, Gruvbox, Tokyo, Nord, and custom themes**
- [ ] 59 — Create theme system architecture → `59-theme-system.md` - [x] 59 — Create theme system architecture → `59-theme-system.md`
- [ ] 60 — Implement default theme (system terminal) → `60-default-theme.md` - [x] 60 — Implement default theme (system terminal) → `60-default-theme.md`
- [ ] 61 — Add Catppuccin theme → `61-catppuccin-theme.md` - [x] 61 — Add Catppuccin theme → `61-catppuccin-theme.md`
- [ ] 62 — Add Gruvbox theme → `62-gruvbox-theme.md` - [x] 62 — Add Gruvbox theme → `62-gruvbox-theme.md`
- [ ] 63 — Add Tokyo theme → `63-tokyo-theme.md` - [x] 63 — Add Tokyo theme → `63-tokyo-theme.md`
- [ ] 64 — Add Nord theme → `64-nord-theme.md` - [x] 64 — Add Nord theme → `64-nord-theme.md`
- [ ] 65 — Implement custom theme editor → `65-custom-theme.md` - [ ] 65 — Implement custom theme editor → `65-custom-theme.md`
- [ ] 66 — Add theme selector in settings → `66-theme-selector.md` - [x] 66 — Add theme selector in settings → `66-theme-selector.md`
**Dependencies:** 09 -> 59 -> 60 -> 61 -> 62 -> 63 -> 64 -> 65 -> 66 -> 10 **Dependencies:** 09 -> 59 -> 60 -> 61 -> 62 -> 63 -> 64 -> 65 -> 66 -> 10
@@ -143,11 +143,11 @@ Status legend: [ ] todo, [~] in-progress, [x] done
## Phase 11: State Management & Data Layer 🗄️ ## Phase 11: State Management & Data Layer 🗄️
**Create global state store and data layer** **Create global state store and data layer**
- [ ] 10 — Create global state store and data layer → `10-state-management.md` - [x] 10 — Create global state store and data layer → `10-state-management.md`
- [ ] 50 — Create global state store (Signals) → `50-global-state-store.md` - [x] 50 — Create global state store (Signals) → `50-global-state-store.md`
- [ ] 51 — Implement API client for podcast sources → `51-api-client.md` - [x] 51 — Implement API client for podcast sources → `51-api-client.md`
- [ ] 52 — Add data fetching and caching → `52-data-fetching-caching.md` - [x] 52 — Add data fetching and caching → `52-data-fetching-caching.md`
- [ ] 53 — Build file-based storage for sync → `53-file-based-storage.md` - [x] 53 — Build file-based storage for sync → `53-file-based-storage.md`
**Dependencies:** 66 -> 10 **Dependencies:** 66 -> 10
@@ -160,8 +160,8 @@ Status legend: [ ] todo, [~] in-progress, [x] done
- [ ] 54 — Set up testing framework (snapshot testing) → `54-testing-framework.md` - [ ] 54 — Set up testing framework (snapshot testing) → `54-testing-framework.md`
- [ ] 55 — Write component tests → `55-component-tests.md` - [ ] 55 — Write component tests → `55-component-tests.md`
- [ ] 56 — Add keyboard interaction tests → `56-keyboard-tests.md` - [ ] 56 — Add keyboard interaction tests → `56-keyboard-tests.md`
- [ ] 57 — Implement error handling → `57-error-handling.md` - [x] 57 — Implement error handling → `57-error-handling.md`
- [ ] 58 — Add loading states and transitions → `58-loading-states.md` - [x] 58 — Add loading states and transitions → `58-loading-states.md`
**Dependencies:** 10 -> 11 **Dependencies:** 10 -> 11