From 3c457f9c188ac06faf2fad658765a3ff10662bd2 Mon Sep 17 00:00:00 2001 From: Till-JS <101404291+Till-JS@users.noreply.github.com> Date: Tue, 25 Nov 2025 00:28:52 +0100 Subject: [PATCH] feat: add layout components to shared-ui (Tier 6) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Button enhancements: - Add 'outline' and 'success' variants - Add 'xl' size option New skeleton/loading components: - SkeletonBox: Base skeleton with shimmer animation (theme-aware) - SkeletonText: Multi-line text skeleton New feedback components: - EmptyState: Standardized empty state display with icon, title, message, and optional action buttons New confirmation components: - ConfirmationModal: Pre-styled confirmation dialog for delete/warning actions with 'danger', 'warning', and 'info' variants These components reduce duplication across apps and provide consistent UX patterns. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- packages/shared-ui/src/atoms/Button.svelte | 11 +- packages/shared-ui/src/index.ts | 8 +- .../src/molecules/feedback/EmptyState.svelte | 131 ++++++++++++++++++ .../shared-ui/src/molecules/feedback/index.ts | 4 + packages/shared-ui/src/molecules/index.ts | 8 +- .../src/molecules/loaders/SkeletonBox.svelte | 79 +++++++++++ .../src/molecules/loaders/SkeletonText.svelte | 45 ++++++ .../shared-ui/src/molecules/loaders/index.ts | 5 + .../src/organisms/ConfirmationModal.svelte | 126 +++++++++++++++++ packages/shared-ui/src/organisms/index.ts | 3 +- 10 files changed, 413 insertions(+), 7 deletions(-) create mode 100644 packages/shared-ui/src/molecules/feedback/EmptyState.svelte create mode 100644 packages/shared-ui/src/molecules/feedback/index.ts create mode 100644 packages/shared-ui/src/molecules/loaders/SkeletonBox.svelte create mode 100644 packages/shared-ui/src/molecules/loaders/SkeletonText.svelte create mode 100644 packages/shared-ui/src/molecules/loaders/index.ts create mode 100644 packages/shared-ui/src/organisms/ConfirmationModal.svelte diff --git a/packages/shared-ui/src/atoms/Button.svelte b/packages/shared-ui/src/atoms/Button.svelte index 4f4de014c..5cc77e11d 100644 --- a/packages/shared-ui/src/atoms/Button.svelte +++ b/packages/shared-ui/src/atoms/Button.svelte @@ -1,8 +1,8 @@ + +
+ + {#if icon} +
+ {@render icon()} +
+ {:else} + +
+ + + +
+ {/if} + + + + {title} + + + + {#if message} + + {message} + + {/if} + + + {#if actionLabel || secondaryActionLabel} +
+ {#if secondaryActionLabel && onSecondaryAction} + + {/if} + {#if actionLabel && onAction} + + {/if} +
+ {/if} +
diff --git a/packages/shared-ui/src/molecules/feedback/index.ts b/packages/shared-ui/src/molecules/feedback/index.ts new file mode 100644 index 000000000..a23dd372d --- /dev/null +++ b/packages/shared-ui/src/molecules/feedback/index.ts @@ -0,0 +1,4 @@ +/** + * Feedback components for user states + */ +export { default as EmptyState } from './EmptyState.svelte'; diff --git a/packages/shared-ui/src/molecules/index.ts b/packages/shared-ui/src/molecules/index.ts index 2d3c5ec9a..dd03d9b1a 100644 --- a/packages/shared-ui/src/molecules/index.ts +++ b/packages/shared-ui/src/molecules/index.ts @@ -3,7 +3,7 @@ export { default as Input } from './Input.svelte'; export { default as Select } from './Select.svelte'; export { default as Textarea } from './Textarea.svelte'; export { default as Checkbox } from './Checkbox.svelte'; -export type { SelectOption } from './Select.svelte'; +export type { SelectOption } from './Select.types'; // Stats components export { GlassCard, StatRow } from './stats'; @@ -13,3 +13,9 @@ export { TagBadge } from './tags'; // Media components export { AudioPlayer } from './media'; + +// Loading components +export { SkeletonBox, SkeletonText } from './loaders'; + +// Feedback components +export { EmptyState } from './feedback'; diff --git a/packages/shared-ui/src/molecules/loaders/SkeletonBox.svelte b/packages/shared-ui/src/molecules/loaders/SkeletonBox.svelte new file mode 100644 index 000000000..40fdc46ea --- /dev/null +++ b/packages/shared-ui/src/molecules/loaders/SkeletonBox.svelte @@ -0,0 +1,79 @@ + + +
+ + diff --git a/packages/shared-ui/src/molecules/loaders/SkeletonText.svelte b/packages/shared-ui/src/molecules/loaders/SkeletonText.svelte new file mode 100644 index 000000000..c069e2309 --- /dev/null +++ b/packages/shared-ui/src/molecules/loaders/SkeletonText.svelte @@ -0,0 +1,45 @@ + + +
+ {#each Array(lines) as _, i} + + {/each} +
diff --git a/packages/shared-ui/src/molecules/loaders/index.ts b/packages/shared-ui/src/molecules/loaders/index.ts new file mode 100644 index 000000000..536a53011 --- /dev/null +++ b/packages/shared-ui/src/molecules/loaders/index.ts @@ -0,0 +1,5 @@ +/** + * Loading state components + */ +export { default as SkeletonBox } from './SkeletonBox.svelte'; +export { default as SkeletonText } from './SkeletonText.svelte'; diff --git a/packages/shared-ui/src/organisms/ConfirmationModal.svelte b/packages/shared-ui/src/organisms/ConfirmationModal.svelte new file mode 100644 index 000000000..d3b7e6deb --- /dev/null +++ b/packages/shared-ui/src/organisms/ConfirmationModal.svelte @@ -0,0 +1,126 @@ + + + + {#snippet icon()} +
+ +
+ {/snippet} + +
+ {#if message} + + {message} + + {/if} +
+ + {#snippet footer()} +
+ + +
+ {/snippet} +
diff --git a/packages/shared-ui/src/organisms/index.ts b/packages/shared-ui/src/organisms/index.ts index 1642e822c..2dc96f6c6 100644 --- a/packages/shared-ui/src/organisms/index.ts +++ b/packages/shared-ui/src/organisms/index.ts @@ -1,3 +1,4 @@ export { default as Modal } from './Modal.svelte'; +export { default as ConfirmationModal } from './ConfirmationModal.svelte'; export { default as AppSlider } from './AppSlider.svelte'; -export type { AppItem } from './AppSlider.svelte'; +export type { AppItem } from './AppSlider.types';