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]
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)
if (existsSync(srcPath)) {

View File

@@ -29,7 +29,7 @@
"@opentui/solid": "^0.1.77",
"babel-preset-solid": "1.9.9",
"date-fns": "^4.1.0",
"solid-js": "^1.9.11",
"solid-js": "^1.9.9",
"uuid": "^13.0.0",
"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 { Navigation } from "./components/Navigation";
import { TabNavigation } from "./components/TabNavigation";
@@ -191,7 +191,18 @@ export function App() {
}
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>
);
}

View File

@@ -2,7 +2,7 @@
* 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"
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" gap={1}>
<Show when={(props.podcast.categories ?? []).length > 0}>
{(props.podcast.categories ?? []).slice(0, 2).map((cat) => (
<text fg="yellow">[{cat}]</text>
))}
<For each={(props.podcast.categories ?? []).slice(0, 2)}>
{(cat) => <text fg="yellow">[{cat}]</text>}
</For>
</Show>
</box>

View File

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

View File

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

View File

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

View File

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