From cacbd61fe4ed8a3a154b5ee19aa807b0a0bf69d7 Mon Sep 17 00:00:00 2001 From: Till-JS <101404291+Till-JS@users.noreply.github.com> Date: Tue, 25 Nov 2025 00:42:46 +0100 Subject: [PATCH] feat: add sidebar enhancement components (Tier 7) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New components: - KeyboardShortcutsPanel: Collapsible panel for displaying keyboard shortcuts with support for categories and compact mode - SidebarSection: Grouped navigation section with optional collapse behavior New types: - KeyboardShortcut: Interface for shortcut definitions (keys, label, category) These components enable building feature-rich sidebars like Memoro's while keeping the shared-ui Sidebar flexible and data-driven. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- packages/shared-ui/src/index.ts | 6 +- .../molecules/KeyboardShortcutsPanel.svelte | 181 ++++++++++++++++++ packages/shared-ui/src/molecules/index.ts | 1 + .../src/navigation/SidebarSection.svelte | 110 +++++++++++ packages/shared-ui/src/navigation/index.ts | 3 +- packages/shared-ui/src/navigation/types.ts | 9 + 6 files changed, 306 insertions(+), 4 deletions(-) create mode 100644 packages/shared-ui/src/molecules/KeyboardShortcutsPanel.svelte create mode 100644 packages/shared-ui/src/navigation/SidebarSection.svelte diff --git a/packages/shared-ui/src/index.ts b/packages/shared-ui/src/index.ts index 1eacc976c..05949bbf6 100644 --- a/packages/shared-ui/src/index.ts +++ b/packages/shared-ui/src/index.ts @@ -21,12 +21,12 @@ export { SkeletonBox, SkeletonText } from './molecules'; export { EmptyState } from './molecules'; // Layout -export { ModalFooter, DataCard, PageHeader } from './molecules'; +export { ModalFooter, DataCard, PageHeader, KeyboardShortcutsPanel } from './molecules'; // Organisms export { Modal, ConfirmationModal, FormModal, AppSlider } from './organisms'; export type { AppItem } from './organisms'; // Navigation -export { NavLink, Navbar, Sidebar } from './navigation'; -export type { NavItem, NavbarProps, SidebarProps, NavLinkProps } from './navigation'; +export { NavLink, Navbar, Sidebar, SidebarSection } from './navigation'; +export type { NavItem, NavbarProps, SidebarProps, NavLinkProps, KeyboardShortcut } from './navigation'; diff --git a/packages/shared-ui/src/molecules/KeyboardShortcutsPanel.svelte b/packages/shared-ui/src/molecules/KeyboardShortcutsPanel.svelte new file mode 100644 index 000000000..da53cb3c4 --- /dev/null +++ b/packages/shared-ui/src/molecules/KeyboardShortcutsPanel.svelte @@ -0,0 +1,181 @@ + + +{#if !compact} +
+ + + + + {#if expanded || !collapsible} +
+ {#each Object.entries(groupedShortcuts()) as [category, categoryShortcuts]} +
+ {#if Object.keys(groupedShortcuts()).length > 1} + + {category} + + {/if} +
+ {#each categoryShortcuts as shortcut} +
+ + {shortcut.label} + +
+ {#each shortcut.keys as key, i} + + {key} + + {#if i < shortcut.keys.length - 1} + + + {/if} + {/each} +
+
+ {/each} +
+
+ {/each} +
+ {/if} +
+{:else} + + +{/if} diff --git a/packages/shared-ui/src/molecules/index.ts b/packages/shared-ui/src/molecules/index.ts index 0c10faf53..6766ee887 100644 --- a/packages/shared-ui/src/molecules/index.ts +++ b/packages/shared-ui/src/molecules/index.ts @@ -24,3 +24,4 @@ export { EmptyState } from './feedback'; export { default as ModalFooter } from './ModalFooter.svelte'; export { default as DataCard } from './DataCard.svelte'; export { default as PageHeader } from './PageHeader.svelte'; +export { default as KeyboardShortcutsPanel } from './KeyboardShortcutsPanel.svelte'; diff --git a/packages/shared-ui/src/navigation/SidebarSection.svelte b/packages/shared-ui/src/navigation/SidebarSection.svelte new file mode 100644 index 000000000..8289f1f88 --- /dev/null +++ b/packages/shared-ui/src/navigation/SidebarSection.svelte @@ -0,0 +1,110 @@ + + + diff --git a/packages/shared-ui/src/navigation/index.ts b/packages/shared-ui/src/navigation/index.ts index 5dbbc3ea3..7571956e0 100644 --- a/packages/shared-ui/src/navigation/index.ts +++ b/packages/shared-ui/src/navigation/index.ts @@ -1,4 +1,5 @@ export { default as NavLink } from './NavLink.svelte'; export { default as Navbar } from './Navbar.svelte'; export { default as Sidebar } from './Sidebar.svelte'; -export type { NavItem, NavbarProps, SidebarProps, NavLinkProps } from './types'; +export { default as SidebarSection } from './SidebarSection.svelte'; +export type { NavItem, NavbarProps, SidebarProps, NavLinkProps, KeyboardShortcut } from './types'; diff --git a/packages/shared-ui/src/navigation/types.ts b/packages/shared-ui/src/navigation/types.ts index 9ba9d0bb5..0bb1e0f72 100644 --- a/packages/shared-ui/src/navigation/types.ts +++ b/packages/shared-ui/src/navigation/types.ts @@ -1,5 +1,14 @@ import type { Snippet } from 'svelte'; +export interface KeyboardShortcut { + /** Key combination (e.g., ['Ctrl', 'S'] or ['Cmd', 'Shift', 'P']) */ + keys: string[]; + /** Description of what the shortcut does */ + label: string; + /** Category for grouping (optional) */ + category?: string; +} + export interface NavItem { /** Display label for the navigation item */ label: string;