From 10325026f98d96259bd8ff2cbc289b95c3f757ae Mon Sep 17 00:00:00 2001 From: Till-JS <101404291+Till-JS@users.noreply.github.com> Date: Mon, 24 Nov 2025 22:39:15 +0100 Subject: [PATCH] feat: add Tier 2 shared components (stats, tags, media) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New shared-ui components: - GlassCard: Glassmorphism container for cards - StatRow: Generic stat row with snippet-based icons - TagBadge: Reusable tag badge component - AudioPlayer: Full-featured audio player with customizable icons Updated Memoro to use shared components as wrappers while maintaining app-specific features (icons, styling). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../web/src/lib/components/AudioPlayer.svelte | 269 ++-------------- .../web/src/lib/components/TagBadge.svelte | 48 +-- .../components/statistics/GlassCard.svelte | 22 +- .../lib/components/statistics/StatRow.svelte | 5 + packages/shared-ui/src/index.ts | 9 + packages/shared-ui/src/molecules/index.ts | 9 + .../src/molecules/media/AudioPlayer.svelte | 296 ++++++++++++++++++ .../shared-ui/src/molecules/media/index.ts | 1 + .../src/molecules/stats/GlassCard.svelte | 25 ++ .../src/molecules/stats/StatRow.svelte | 39 +++ .../shared-ui/src/molecules/stats/index.ts | 2 + .../src/molecules/tags/TagBadge.svelte | 91 ++++++ .../shared-ui/src/molecules/tags/index.ts | 1 + 13 files changed, 513 insertions(+), 304 deletions(-) create mode 100644 packages/shared-ui/src/molecules/media/AudioPlayer.svelte create mode 100644 packages/shared-ui/src/molecules/media/index.ts create mode 100644 packages/shared-ui/src/molecules/stats/GlassCard.svelte create mode 100644 packages/shared-ui/src/molecules/stats/StatRow.svelte create mode 100644 packages/shared-ui/src/molecules/stats/index.ts create mode 100644 packages/shared-ui/src/molecules/tags/TagBadge.svelte create mode 100644 packages/shared-ui/src/molecules/tags/index.ts diff --git a/memoro/apps/web/src/lib/components/AudioPlayer.svelte b/memoro/apps/web/src/lib/components/AudioPlayer.svelte index 366f36d49..6194be78d 100644 --- a/memoro/apps/web/src/lib/components/AudioPlayer.svelte +++ b/memoro/apps/web/src/lib/components/AudioPlayer.svelte @@ -1,256 +1,25 @@ -
- - - -
- -
- {formatTime(currentTime)} - {formatTime(audioDuration)} -
-
- - -
- - - - - - - - - - - -
-
- - + + {#snippet playIcon()} + + {/snippet} + {#snippet pauseIcon()} + + {/snippet} + {#snippet skipBackIcon()} + + {/snippet} + {#snippet skipForwardIcon()} + + {/snippet} + diff --git a/memoro/apps/web/src/lib/components/TagBadge.svelte b/memoro/apps/web/src/lib/components/TagBadge.svelte index 748cedaa6..af6b180f5 100644 --- a/memoro/apps/web/src/lib/components/TagBadge.svelte +++ b/memoro/apps/web/src/lib/components/TagBadge.svelte @@ -1,4 +1,9 @@ - - -
- - {tag.name || tag.text} - {#if removable} - - {/if} -
+ diff --git a/memoro/apps/web/src/lib/components/statistics/GlassCard.svelte b/memoro/apps/web/src/lib/components/statistics/GlassCard.svelte index 42e77ef64..dd4d73dd5 100644 --- a/memoro/apps/web/src/lib/components/statistics/GlassCard.svelte +++ b/memoro/apps/web/src/lib/components/statistics/GlassCard.svelte @@ -1,21 +1,19 @@ -
+ {@render children()} -
- - + diff --git a/memoro/apps/web/src/lib/components/statistics/StatRow.svelte b/memoro/apps/web/src/lib/components/statistics/StatRow.svelte index 87822f0e2..c49416a12 100644 --- a/memoro/apps/web/src/lib/components/statistics/StatRow.svelte +++ b/memoro/apps/web/src/lib/components/statistics/StatRow.svelte @@ -1,4 +1,9 @@ + +
+ + + +
+ +
+ {formatTime(currentTime)} + {formatTime(audioDuration)} +
+
+ + +
+ + + + + + + + + + + +
+
+ + diff --git a/packages/shared-ui/src/molecules/media/index.ts b/packages/shared-ui/src/molecules/media/index.ts new file mode 100644 index 000000000..03a982768 --- /dev/null +++ b/packages/shared-ui/src/molecules/media/index.ts @@ -0,0 +1 @@ +export { default as AudioPlayer } from './AudioPlayer.svelte'; diff --git a/packages/shared-ui/src/molecules/stats/GlassCard.svelte b/packages/shared-ui/src/molecules/stats/GlassCard.svelte new file mode 100644 index 000000000..021676d0f --- /dev/null +++ b/packages/shared-ui/src/molecules/stats/GlassCard.svelte @@ -0,0 +1,25 @@ + + +
+ {@render children()} +
+ + diff --git a/packages/shared-ui/src/molecules/stats/StatRow.svelte b/packages/shared-ui/src/molecules/stats/StatRow.svelte new file mode 100644 index 000000000..381af6d14 --- /dev/null +++ b/packages/shared-ui/src/molecules/stats/StatRow.svelte @@ -0,0 +1,39 @@ + + +
+ + {#if icon} +
+ {@render icon()} +
+ {/if} + + +
+ {title} + {#if subtitle} + {subtitle} + {/if} +
+ + + {value} +
diff --git a/packages/shared-ui/src/molecules/stats/index.ts b/packages/shared-ui/src/molecules/stats/index.ts new file mode 100644 index 000000000..f09dd7ae1 --- /dev/null +++ b/packages/shared-ui/src/molecules/stats/index.ts @@ -0,0 +1,2 @@ +export { default as GlassCard } from './GlassCard.svelte'; +export { default as StatRow } from './StatRow.svelte'; diff --git a/packages/shared-ui/src/molecules/tags/TagBadge.svelte b/packages/shared-ui/src/molecules/tags/TagBadge.svelte new file mode 100644 index 000000000..4409d3e56 --- /dev/null +++ b/packages/shared-ui/src/molecules/tags/TagBadge.svelte @@ -0,0 +1,91 @@ + + + + +
+ + {tagName} + + {#if removable} + + {/if} +
diff --git a/packages/shared-ui/src/molecules/tags/index.ts b/packages/shared-ui/src/molecules/tags/index.ts new file mode 100644 index 000000000..4272c0fb8 --- /dev/null +++ b/packages/shared-ui/src/molecules/tags/index.ts @@ -0,0 +1 @@ +export { default as TagBadge } from './TagBadge.svelte';