diff --git a/build.ts b/build.ts
index 2e0eaa8..53bcd6a 100644
--- a/build.ts
+++ b/build.ts
@@ -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)) {
diff --git a/package.json b/package.json
index 3f232cb..e7331cb 100644
--- a/package.json
+++ b/package.json
@@ -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"
}
diff --git a/src/App.tsx b/src/App.tsx
index 9e49145..c985d55 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -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={}
>
- {renderContent()}
+
+ (
+
+
+ Error rendering tab: {err?.message ?? String(err)}{"\n"}
+ Press a number key (1-5) to switch tabs.
+
+
+ )}>
+ {renderContent()}
+
+
);
}
diff --git a/src/components/PodcastCard.tsx b/src/components/PodcastCard.tsx
index 678501e..ee82b33 100644
--- a/src/components/PodcastCard.tsx
+++ b/src/components/PodcastCard.tsx
@@ -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) {
0}>
- {(props.podcast.categories ?? []).slice(0, 2).map((cat) => (
- [{cat}]
- ))}
+
+ {(cat) => [{cat}]}
+
diff --git a/src/components/SettingsScreen.tsx b/src/components/SettingsScreen.tsx
index 3a0e8c7..969df48 100644
--- a/src/components/SettingsScreen.tsx
+++ b/src/components/SettingsScreen.tsx
@@ -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,18 +56,20 @@ export function SettingsScreen(props: SettingsScreenProps) {
- {SECTIONS.map((section, index) => (
- setActiveSection(section.id)}
- >
-
- [{index + 1}] {section.label}
-
-
- ))}
+
+ {(section, index) => (
+ setActiveSection(section.id)}
+ >
+
+ [{index() + 1}] {section.label}
+
+
+ )}
+
diff --git a/src/components/TrendingShows.tsx b/src/components/TrendingShows.tsx
index 367ce7d..06ca81e 100644
--- a/src/components/TrendingShows.tsx
+++ b/src/components/TrendingShows.tsx
@@ -31,7 +31,7 @@ export function TrendingShows(props: TrendingShowsProps) {
0}>
-
+
{(podcast, index) => (
diff --git a/src/index.tsx b/src/index.tsx
index 654fe92..428e4a9 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -33,4 +33,4 @@ render(() => (
-))
+), { useThread: false })
diff --git a/tasks/podcast-tui-app/README.md b/tasks/podcast-tui-app/README.md
index 0eb514b..7fd7ee0 100644
--- a/tasks/podcast-tui-app/README.md
+++ b/tasks/podcast-tui-app/README.md
@@ -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