even-toolkit 1.4.1 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,7 +30,7 @@ import { Button, Card, NavBar, ListItem, Toggle, AppShell } from 'even-toolkit/w
30
30
 
31
31
  **Primitives:** Button, Card, Badge, Input, Textarea, Select, Checkbox, RadioGroup, Slider, InputGroup, Skeleton, Progress, StatusDot, Pill, Toggle, SegmentedControl, Table, Kbd, Divider
32
32
 
33
- **Layout:** AppShell, Page, NavBar, NavHeader, ScreenHeader, SectionHeader, SettingsGroup, CategoryFilter, ListItem (swipe-to-delete), SearchBar, Tag, TagCarousel, TagCard, SliderIndicator, PageIndicator, StepIndicator, Timeline, StatGrid, StatusProgress
33
+ **Layout:** AppShell, Page, NavBar, NavHeader, SideDrawer, DrawerShell, DrawerTrigger, ScreenHeader, SectionHeader, SettingsGroup, CategoryFilter, ListItem (swipe-to-delete), SearchBar, Tag, TagCarousel, TagCard, SliderIndicator, PageIndicator, StepIndicator, Timeline, StatGrid, StatusProgress
34
34
 
35
35
  **Feedback:** TimerRing, Dialog, ConfirmDialog, Toast, EmptyState, Loading, BottomSheet, CTAGroup, ScrollPicker, DatePicker, TimePicker, SelectionPicker
36
36
 
@@ -316,7 +316,53 @@ Light theme following Even Realities 2025 guidelines:
316
316
  | Normal Subtitle | 13px | 400 | -0.13px |
317
317
  | Normal Detail | 11px | 400 | -0.11px |
318
318
 
319
- ## Quick Start
319
+ ## Navigation Patterns
320
+
321
+ ### DrawerShell (recommended)
322
+
323
+ Side drawer navigation with automatic hamburger/back-button detection, header context for nested screens, and `bottomItems` for pinned items like Settings.
324
+
325
+ ```tsx
326
+ import { DrawerShell, useDrawerHeader } from 'even-toolkit/web';
327
+ import type { SideDrawerItem } from 'even-toolkit/web';
328
+
329
+ // In your shell/layout:
330
+ const MENU_ITEMS: SideDrawerItem[] = [
331
+ { id: '/', label: 'Home', section: 'App' },
332
+ ];
333
+ const BOTTOM_ITEMS: SideDrawerItem[] = [
334
+ { id: '/settings', label: 'Settings', section: 'App' },
335
+ ];
336
+
337
+ function Shell() {
338
+ return (
339
+ <DrawerShell
340
+ items={MENU_ITEMS}
341
+ bottomItems={BOTTOM_ITEMS}
342
+ title="MyApp"
343
+ getPageTitle={(p) => p === '/' ? 'MyApp' : 'Page'}
344
+ deriveActiveId={(p) => p}
345
+ />
346
+ );
347
+ }
348
+
349
+ // In nested screens — customize the header:
350
+ function DetailScreen() {
351
+ useDrawerHeader({
352
+ title: 'Detail',
353
+ backTo: '/', // shows back button instead of hamburger
354
+ right: <Button size="sm">Save</Button>,
355
+ below: <Progress value={50} />, // below header (progress bars)
356
+ footer: <StepIndicator ... />, // fixed bottom area
357
+ hidden: true, // hide header entirely
358
+ });
359
+ return <div>...</div>;
360
+ }
361
+ ```
362
+
363
+ ### NavBar + AppShell (tab bar)
364
+
365
+ Horizontal tab bar for simpler apps.
320
366
 
321
367
  ```tsx
322
368
  import { AppShell, NavBar, ScreenHeader, Button, Card } from 'even-toolkit/web';
@@ -0,0 +1,19 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { SideDrawerItem } from './side-drawer';
3
+ interface DrawerShellProps {
4
+ items: SideDrawerItem[];
5
+ bottomItems?: SideDrawerItem[];
6
+ title?: string;
7
+ footer?: ReactNode;
8
+ width?: number;
9
+ getPageTitle: (pathname: string) => string;
10
+ deriveActiveId: (pathname: string) => string;
11
+ isNestedRoute?: (pathname: string) => boolean;
12
+ getBackPath?: (pathname: string) => string;
13
+ backIcon?: ReactNode;
14
+ className?: string;
15
+ }
16
+ declare function DrawerShell({ items, bottomItems, title, footer, width, getPageTitle, deriveActiveId, isNestedRoute, getBackPath, backIcon, className, }: DrawerShellProps): import("react/jsx-runtime").JSX.Element;
17
+ export { DrawerShell };
18
+ export type { DrawerShellProps };
19
+ //# sourceMappingURL=drawer-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-shell.d.ts","sourceRoot":"","sources":["../../../web/components/drawer-shell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvE,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,eAAe,CAAC;AAIxE,UAAU,gBAAgB;IACxB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,WAAW,EACX,KAAK,EACL,MAAM,EACN,KAAK,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,WAAW,EACX,QAA4B,EAC5B,SAAS,GACV,EAAE,gBAAgB,2CAgGlB;AAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useCallback, useMemo } from 'react';
3
+ import { Outlet, useLocation, useNavigate } from 'react-router';
4
+ import { SideDrawer, DrawerTrigger, DrawerHeaderContext } from './side-drawer';
5
+ import { NavHeader } from './nav-header';
6
+ import { Button } from './button';
7
+ const DEFAULT_BACK_ICON = (_jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M12.5 15L7.5 10L12.5 5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
8
+ function DrawerShell({ items, bottomItems, title, footer, width, getPageTitle, deriveActiveId, isNestedRoute, getBackPath, backIcon = DEFAULT_BACK_ICON, className, }) {
9
+ const location = useLocation();
10
+ const navigate = useNavigate();
11
+ const [drawerOpen, setDrawerOpen] = useState(false);
12
+ const [headerOverride, setHeaderOverride] = useState(null);
13
+ const handleNavigate = useCallback((id) => {
14
+ navigate(id);
15
+ setDrawerOpen(false);
16
+ }, [navigate]);
17
+ const allItemIds = useMemo(() => {
18
+ const ids = new Set(items.map((i) => i.id));
19
+ if (bottomItems)
20
+ bottomItems.forEach((i) => ids.add(i.id));
21
+ return ids;
22
+ }, [items, bottomItems]);
23
+ const pathname = location.pathname;
24
+ const activeId = deriveActiveId(pathname);
25
+ // Determine if nested: either explicit function or check if path matches any item id
26
+ const nested = isNestedRoute
27
+ ? isNestedRoute(pathname)
28
+ : !allItemIds.has(pathname);
29
+ // Resolve header values (screen overrides > defaults)
30
+ const headerTitle = headerOverride?.title ?? getPageTitle(pathname);
31
+ const headerHidden = headerOverride?.hidden ?? false;
32
+ const defaultLeft = nested
33
+ ? (_jsx(Button, { variant: "ghost", size: "icon", onClick: () => navigate(headerOverride?.backTo ?? getBackPath?.(pathname) ?? '/'), children: backIcon }))
34
+ : _jsx(DrawerTrigger, { onClick: () => setDrawerOpen(true) });
35
+ const headerLeft = headerOverride?.left ?? (headerOverride?.backTo
36
+ ? (_jsx(Button, { variant: "ghost", size: "icon", onClick: () => navigate(headerOverride.backTo), children: backIcon }))
37
+ : defaultLeft);
38
+ const headerRight = headerOverride?.right ?? undefined;
39
+ const headerBelow = headerOverride?.below ?? undefined;
40
+ const headerFooter = headerOverride?.footer ?? undefined;
41
+ // Context value
42
+ const ctxValue = useMemo(() => ({
43
+ setHeader: (config) => setHeaderOverride(config),
44
+ resetHeader: () => setHeaderOverride(null),
45
+ }), []);
46
+ return (_jsx(SideDrawer, { open: drawerOpen, onClose: () => setDrawerOpen(false), onNavigate: handleNavigate, activeId: activeId, items: items, bottomItems: bottomItems, title: title, footer: footer, width: width, className: className, children: _jsx(DrawerHeaderContext.Provider, { value: ctxValue, children: _jsxs("div", { className: "flex flex-col h-full", children: [!headerHidden && (_jsxs("div", { className: "shrink-0", children: [_jsx(NavHeader, { title: headerTitle, left: headerLeft, right: headerRight }), headerBelow] })), _jsx("div", { className: "flex-1 overflow-y-auto min-h-0", children: _jsx(Outlet, {}) }), headerFooter && (_jsx("div", { className: "shrink-0", children: headerFooter }))] }) }) }));
47
+ }
48
+ export { DrawerShell };
49
+ //# sourceMappingURL=drawer-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-shell.js","sourceRoot":"","sources":["../../../web/components/drawer-shell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type ReactNode } from 'react';
2
+ interface SideDrawerItem {
3
+ id: string;
4
+ label: string;
5
+ icon?: ReactNode;
6
+ section?: string;
7
+ }
8
+ interface SideDrawerProps {
9
+ open: boolean;
10
+ onClose: () => void;
11
+ onNavigate: (id: string) => void;
12
+ activeId: string;
13
+ items: SideDrawerItem[];
14
+ bottomItems?: SideDrawerItem[];
15
+ title?: string;
16
+ footer?: ReactNode;
17
+ children: ReactNode;
18
+ width?: number;
19
+ className?: string;
20
+ }
21
+ declare function SideDrawer({ open, onClose, onNavigate, activeId, items, bottomItems, title, footer, children, width, className, }: SideDrawerProps): import("react/jsx-runtime").JSX.Element;
22
+ declare function DrawerTrigger({ onClick, className }: {
23
+ onClick: () => void;
24
+ className?: string;
25
+ }): import("react/jsx-runtime").JSX.Element;
26
+ interface DrawerHeaderConfig {
27
+ title?: string;
28
+ left?: ReactNode;
29
+ right?: ReactNode;
30
+ below?: ReactNode;
31
+ footer?: ReactNode;
32
+ backTo?: string;
33
+ hidden?: boolean;
34
+ }
35
+ interface DrawerHeaderContextValue {
36
+ setHeader: (config: DrawerHeaderConfig) => void;
37
+ resetHeader: () => void;
38
+ }
39
+ declare const DrawerHeaderContext: import("react").Context<DrawerHeaderContextValue | null>;
40
+ declare function useDrawerHeader(config: DrawerHeaderConfig): void;
41
+ export { SideDrawer, DrawerTrigger, DrawerHeaderContext, useDrawerHeader };
42
+ export type { SideDrawerProps, SideDrawerItem, DrawerHeaderConfig, DrawerHeaderContextValue };
43
+ //# sourceMappingURL=side-drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"side-drawer.d.ts","sourceRoot":"","sources":["../../../web/components/side-drawer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK9H,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8DD,iBAAS,UAAU,CAAC,EAClB,IAAI,EACJ,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,WAAW,EACX,KAAK,EACL,MAAM,EACN,QAAQ,EACR,KAAqB,EACrB,SAAS,GACV,EAAE,eAAe,2CAsFjB;AAID,iBAAS,aAAa,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAgBzF;AAID,UAAU,kBAAkB;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,wBAAwB;IAChC,SAAS,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAChD,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,QAAA,MAAM,mBAAmB,0DAAuD,CAAC;AAEjF,iBAAS,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAiBzD;AAED,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAC3E,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useLayoutEffect, useMemo } from 'react';
3
+ import { cn } from '../utils/cn';
4
+ /* ── Constants ── */
5
+ const DEFAULT_WIDTH = 280;
6
+ const SHIFT_EXTRA = 20;
7
+ const MAIN_SCALE = 0.985;
8
+ const TRANSITION = 'transform 300ms cubic-bezier(0.4, 0, 0.2, 1), border-radius 300ms ease';
9
+ const SIDEBAR_TRANSITION = 'transform 300ms cubic-bezier(0.4, 0, 0.2, 1), opacity 300ms ease';
10
+ /* ── Shared item renderer ── */
11
+ function renderItemSection(sectionName, sectionItems, activeId, onNavigate) {
12
+ return (_jsxs("div", { children: [sectionName && (_jsx("div", { className: "px-3 pt-4 pb-1.5", children: _jsx("span", { className: "text-[11px] tracking-[-0.11px] text-text-dim font-normal uppercase", children: sectionName }) })), sectionItems.map((item) => {
13
+ const isActive = activeId === item.id || (item.id !== '/' && activeId.startsWith(item.id));
14
+ return (_jsxs("button", { onClick: () => onNavigate(item.id), className: cn('w-full flex items-center gap-3 px-3 h-11 rounded-[6px] mb-0.5 text-left cursor-pointer border-none', 'transition-colors', isActive
15
+ ? 'bg-surface-light text-accent'
16
+ : 'text-text hover:bg-surface-light/50'), children: [item.icon && _jsx("span", { className: "shrink-0 w-5 flex items-center justify-center", children: item.icon }), _jsx("span", { className: "text-[15px] tracking-[-0.15px] font-normal", children: item.label })] }, item.id));
17
+ })] }, sectionName || '__default'));
18
+ }
19
+ function groupBySection(items) {
20
+ const sections = new Map();
21
+ for (const item of items) {
22
+ const key = item.section ?? '';
23
+ if (!sections.has(key))
24
+ sections.set(key, []);
25
+ sections.get(key).push(item);
26
+ }
27
+ return sections;
28
+ }
29
+ /* ── SideDrawer ── */
30
+ function SideDrawer({ open, onClose, onNavigate, activeId, items, bottomItems, title, footer, children, width = DEFAULT_WIDTH, className, }) {
31
+ // Close on Escape key
32
+ useEffect(() => {
33
+ if (!open)
34
+ return;
35
+ const handler = (e) => {
36
+ if (e.key === 'Escape')
37
+ onClose();
38
+ };
39
+ document.addEventListener('keydown', handler);
40
+ return () => document.removeEventListener('keydown', handler);
41
+ }, [open, onClose]);
42
+ const shift = width + SHIFT_EXTRA;
43
+ const sections = groupBySection(items);
44
+ const bottomSections = bottomItems ? groupBySection(bottomItems) : null;
45
+ return (_jsxs("div", { className: cn('relative h-dvh w-full overflow-hidden bg-bg', className), children: [_jsxs("div", { className: "absolute top-0 left-0 bottom-0 flex flex-col bg-bg z-0", style: {
46
+ width: `${width}px`,
47
+ transform: open ? 'translateX(0)' : `translateX(-${width * 0.3}px)`,
48
+ opacity: open ? 1 : 0,
49
+ transition: SIDEBAR_TRANSITION,
50
+ pointerEvents: open ? 'auto' : 'none',
51
+ }, children: [title && (_jsx("div", { className: "shrink-0 px-4 pt-4 pb-3", children: _jsx("span", { className: "text-[20px] tracking-[-0.6px] font-normal text-text", children: title }) })), _jsx("div", { className: "flex-1 overflow-y-auto px-2 py-1", children: [...sections.entries()].map(([name, items]) => renderItemSection(name, items, activeId, onNavigate)) }), bottomSections && (_jsx("div", { className: "shrink-0 border-t border-border px-2 py-1", children: [...bottomSections.entries()].map(([name, items]) => renderItemSection(name, items, activeId, onNavigate)) })), footer && (_jsx("div", { className: cn('shrink-0 px-2 py-2', !bottomSections && 'border-t border-border'), children: footer }))] }), _jsxs("div", { className: "relative h-full w-full z-[1] bg-bg overflow-hidden", style: {
52
+ transform: open
53
+ ? `translateX(${shift}px) scale(${MAIN_SCALE})`
54
+ : 'translateX(0) scale(1)',
55
+ borderRadius: open ? '16px' : '0px',
56
+ transition: TRANSITION,
57
+ transformOrigin: 'left center',
58
+ }, children: [children, _jsx("div", { onClick: onClose, className: "absolute inset-0 bg-black cursor-pointer z-[2]", style: {
59
+ opacity: open ? 0.45 : 0,
60
+ pointerEvents: open ? 'auto' : 'none',
61
+ transition: 'opacity 300ms ease',
62
+ } })] })] }));
63
+ }
64
+ /* ── DrawerTrigger (hamburger button) ── */
65
+ function DrawerTrigger({ onClick, className }) {
66
+ return (_jsx("button", { onClick: onClick, className: cn('flex items-center justify-center w-9 h-9 rounded-[6px] cursor-pointer border-none bg-transparent', 'text-text hover:bg-surface-light transition-colors', className), "aria-label": "Open menu", children: _jsx("svg", { width: "18", height: "14", viewBox: "0 0 18 14", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M1 1h16M1 7h16M1 13h16", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) }));
67
+ }
68
+ const DrawerHeaderContext = createContext(null);
69
+ function useDrawerHeader(config) {
70
+ const ctx = useContext(DrawerHeaderContext);
71
+ const configRef = useMemo(() => config, [
72
+ config.title,
73
+ config.left,
74
+ config.right,
75
+ config.below,
76
+ config.footer,
77
+ config.backTo,
78
+ config.hidden,
79
+ ]);
80
+ useLayoutEffect(() => {
81
+ if (!ctx)
82
+ return;
83
+ ctx.setHeader(configRef);
84
+ return () => ctx.resetHeader();
85
+ }, [ctx, configRef]);
86
+ }
87
+ export { SideDrawer, DrawerTrigger, DrawerHeaderContext, useDrawerHeader };
88
+ //# sourceMappingURL=side-drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"side-drawer.js","sourceRoot":"","sources":["../../../web/components/side-drawer.tsx"],"names":[],"mappings":"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"}
@@ -102,6 +102,10 @@ export { AudioPlayer } from './components/audio-player';
102
102
  export type { AudioPlayerProps } from './components/audio-player';
103
103
  export { AppShell } from './components/app-shell';
104
104
  export type { AppShellProps } from './components/app-shell';
105
+ export { SideDrawer, DrawerTrigger, DrawerHeaderContext, useDrawerHeader } from './components/side-drawer';
106
+ export type { SideDrawerProps, SideDrawerItem, DrawerHeaderConfig, DrawerHeaderContextValue } from './components/side-drawer';
107
+ export { DrawerShell } from './components/drawer-shell';
108
+ export type { DrawerShellProps } from './components/drawer-shell';
105
109
  export { ScrollPicker, DatePicker, TimePicker, SelectionPicker } from './components/scroll-picker';
106
110
  export type { ScrollPickerProps, ScrollColumn, DatePickerProps, TimePickerProps, SelectionPickerProps } from './components/scroll-picker';
107
111
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../web/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../web/index.ts"],"names":[],"mappings":"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"}
package/dist/web/index.js CHANGED
@@ -64,6 +64,8 @@ export { ImageGrid, ImageViewer } from './components/image-viewer';
64
64
  export { AudioPlayer } from './components/audio-player';
65
65
  // App Shell
66
66
  export { AppShell } from './components/app-shell';
67
+ export { SideDrawer, DrawerTrigger, DrawerHeaderContext, useDrawerHeader } from './components/side-drawer';
68
+ export { DrawerShell } from './components/drawer-shell';
67
69
  // Scroll Picker
68
70
  export { ScrollPicker, DatePicker, TimePicker, SelectionPicker } from './components/scroll-picker';
69
71
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../web/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../web/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,QAAQ;AACR,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAEhC,QAAQ;AACR,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7E,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGlE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEnG,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAGvC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGhE,sBAAsB;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,qBAAqB;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,8CAA8C;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGxE,oCAAoC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,+BAA+B;AAC/B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGtJ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGxF,+BAA+B;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG1E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3G,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "even-toolkit",
3
- "version": "1.4.1",
3
+ "version": "1.4.2",
4
4
  "description": "Design system & component library for Even Realities G2 smart glasses apps — 55+ web components, 191 pixel-art icons, glasses SDK bridge, and design tokens.",
5
5
  "type": "module",
6
6
  "main": "./dist/glasses/index.js",
@@ -0,0 +1,139 @@
1
+ import { useState, useCallback, useMemo, type ReactNode } from 'react';
2
+ import { Outlet, useLocation, useNavigate } from 'react-router';
3
+ import { SideDrawer, DrawerTrigger, DrawerHeaderContext } from './side-drawer';
4
+ import type { SideDrawerItem, DrawerHeaderConfig } from './side-drawer';
5
+ import { NavHeader } from './nav-header';
6
+ import { Button } from './button';
7
+
8
+ interface DrawerShellProps {
9
+ items: SideDrawerItem[];
10
+ bottomItems?: SideDrawerItem[];
11
+ title?: string;
12
+ footer?: ReactNode;
13
+ width?: number;
14
+ getPageTitle: (pathname: string) => string;
15
+ deriveActiveId: (pathname: string) => string;
16
+ isNestedRoute?: (pathname: string) => boolean;
17
+ getBackPath?: (pathname: string) => string;
18
+ backIcon?: ReactNode;
19
+ className?: string;
20
+ }
21
+
22
+ const DEFAULT_BACK_ICON = (
23
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
24
+ <path d="M12.5 15L7.5 10L12.5 5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
25
+ </svg>
26
+ );
27
+
28
+ function DrawerShell({
29
+ items,
30
+ bottomItems,
31
+ title,
32
+ footer,
33
+ width,
34
+ getPageTitle,
35
+ deriveActiveId,
36
+ isNestedRoute,
37
+ getBackPath,
38
+ backIcon = DEFAULT_BACK_ICON,
39
+ className,
40
+ }: DrawerShellProps) {
41
+ const location = useLocation();
42
+ const navigate = useNavigate();
43
+ const [drawerOpen, setDrawerOpen] = useState(false);
44
+ const [headerOverride, setHeaderOverride] = useState<DrawerHeaderConfig | null>(null);
45
+
46
+ const handleNavigate = useCallback((id: string) => {
47
+ navigate(id);
48
+ setDrawerOpen(false);
49
+ }, [navigate]);
50
+
51
+ const allItemIds = useMemo(() => {
52
+ const ids = new Set(items.map((i) => i.id));
53
+ if (bottomItems) bottomItems.forEach((i) => ids.add(i.id));
54
+ return ids;
55
+ }, [items, bottomItems]);
56
+
57
+ const pathname = location.pathname;
58
+ const activeId = deriveActiveId(pathname);
59
+
60
+ // Determine if nested: either explicit function or check if path matches any item id
61
+ const nested = isNestedRoute
62
+ ? isNestedRoute(pathname)
63
+ : !allItemIds.has(pathname);
64
+
65
+ // Resolve header values (screen overrides > defaults)
66
+ const headerTitle = headerOverride?.title ?? getPageTitle(pathname);
67
+ const headerHidden = headerOverride?.hidden ?? false;
68
+
69
+ const defaultLeft = nested
70
+ ? (
71
+ <Button
72
+ variant="ghost"
73
+ size="icon"
74
+ onClick={() => navigate(headerOverride?.backTo ?? getBackPath?.(pathname) ?? '/')}
75
+ >
76
+ {backIcon}
77
+ </Button>
78
+ )
79
+ : <DrawerTrigger onClick={() => setDrawerOpen(true)} />;
80
+
81
+ const headerLeft = headerOverride?.left ?? (headerOverride?.backTo
82
+ ? (
83
+ <Button
84
+ variant="ghost"
85
+ size="icon"
86
+ onClick={() => navigate(headerOverride.backTo!)}
87
+ >
88
+ {backIcon}
89
+ </Button>
90
+ )
91
+ : defaultLeft);
92
+
93
+ const headerRight = headerOverride?.right ?? undefined;
94
+ const headerBelow = headerOverride?.below ?? undefined;
95
+ const headerFooter = headerOverride?.footer ?? undefined;
96
+
97
+ // Context value
98
+ const ctxValue = useMemo(() => ({
99
+ setHeader: (config: DrawerHeaderConfig) => setHeaderOverride(config),
100
+ resetHeader: () => setHeaderOverride(null),
101
+ }), []);
102
+
103
+ return (
104
+ <SideDrawer
105
+ open={drawerOpen}
106
+ onClose={() => setDrawerOpen(false)}
107
+ onNavigate={handleNavigate}
108
+ activeId={activeId}
109
+ items={items}
110
+ bottomItems={bottomItems}
111
+ title={title}
112
+ footer={footer}
113
+ width={width}
114
+ className={className}
115
+ >
116
+ <DrawerHeaderContext.Provider value={ctxValue}>
117
+ <div className="flex flex-col h-full">
118
+ {!headerHidden && (
119
+ <div className="shrink-0">
120
+ <NavHeader title={headerTitle} left={headerLeft} right={headerRight} />
121
+ {headerBelow}
122
+ </div>
123
+ )}
124
+ <div className="flex-1 overflow-y-auto min-h-0">
125
+ <Outlet />
126
+ </div>
127
+ {headerFooter && (
128
+ <div className="shrink-0">
129
+ {headerFooter}
130
+ </div>
131
+ )}
132
+ </div>
133
+ </DrawerHeaderContext.Provider>
134
+ </SideDrawer>
135
+ );
136
+ }
137
+
138
+ export { DrawerShell };
139
+ export type { DrawerShellProps };
@@ -0,0 +1,246 @@
1
+ import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useState, type ReactNode } from 'react';
2
+ import { cn } from '../utils/cn';
3
+
4
+ /* ── Types ── */
5
+
6
+ interface SideDrawerItem {
7
+ id: string;
8
+ label: string;
9
+ icon?: ReactNode;
10
+ section?: string;
11
+ }
12
+
13
+ interface SideDrawerProps {
14
+ open: boolean;
15
+ onClose: () => void;
16
+ onNavigate: (id: string) => void;
17
+ activeId: string;
18
+ items: SideDrawerItem[];
19
+ bottomItems?: SideDrawerItem[];
20
+ title?: string;
21
+ footer?: ReactNode;
22
+ children: ReactNode;
23
+ width?: number;
24
+ className?: string;
25
+ }
26
+
27
+ /* ── Constants ── */
28
+
29
+ const DEFAULT_WIDTH = 280;
30
+ const SHIFT_EXTRA = 20;
31
+ const MAIN_SCALE = 0.985;
32
+ const TRANSITION = 'transform 300ms cubic-bezier(0.4, 0, 0.2, 1), border-radius 300ms ease';
33
+ const SIDEBAR_TRANSITION = 'transform 300ms cubic-bezier(0.4, 0, 0.2, 1), opacity 300ms ease';
34
+
35
+ /* ── Shared item renderer ── */
36
+
37
+ function renderItemSection(
38
+ sectionName: string,
39
+ sectionItems: SideDrawerItem[],
40
+ activeId: string,
41
+ onNavigate: (id: string) => void,
42
+ ) {
43
+ return (
44
+ <div key={sectionName || '__default'}>
45
+ {sectionName && (
46
+ <div className="px-3 pt-4 pb-1.5">
47
+ <span className="text-[11px] tracking-[-0.11px] text-text-dim font-normal uppercase">
48
+ {sectionName}
49
+ </span>
50
+ </div>
51
+ )}
52
+ {sectionItems.map((item) => {
53
+ const isActive = activeId === item.id || (item.id !== '/' && activeId.startsWith(item.id));
54
+ return (
55
+ <button
56
+ key={item.id}
57
+ onClick={() => onNavigate(item.id)}
58
+ className={cn(
59
+ 'w-full flex items-center gap-3 px-3 h-11 rounded-[6px] mb-0.5 text-left cursor-pointer border-none',
60
+ 'transition-colors',
61
+ isActive
62
+ ? 'bg-surface-light text-accent'
63
+ : 'text-text hover:bg-surface-light/50',
64
+ )}
65
+ >
66
+ {item.icon && <span className="shrink-0 w-5 flex items-center justify-center">{item.icon}</span>}
67
+ <span className="text-[15px] tracking-[-0.15px] font-normal">{item.label}</span>
68
+ </button>
69
+ );
70
+ })}
71
+ </div>
72
+ );
73
+ }
74
+
75
+ function groupBySection(items: SideDrawerItem[]): Map<string, SideDrawerItem[]> {
76
+ const sections = new Map<string, SideDrawerItem[]>();
77
+ for (const item of items) {
78
+ const key = item.section ?? '';
79
+ if (!sections.has(key)) sections.set(key, []);
80
+ sections.get(key)!.push(item);
81
+ }
82
+ return sections;
83
+ }
84
+
85
+ /* ── SideDrawer ── */
86
+
87
+ function SideDrawer({
88
+ open,
89
+ onClose,
90
+ onNavigate,
91
+ activeId,
92
+ items,
93
+ bottomItems,
94
+ title,
95
+ footer,
96
+ children,
97
+ width = DEFAULT_WIDTH,
98
+ className,
99
+ }: SideDrawerProps) {
100
+ // Close on Escape key
101
+ useEffect(() => {
102
+ if (!open) return;
103
+ const handler = (e: KeyboardEvent) => {
104
+ if (e.key === 'Escape') onClose();
105
+ };
106
+ document.addEventListener('keydown', handler);
107
+ return () => document.removeEventListener('keydown', handler);
108
+ }, [open, onClose]);
109
+
110
+ const shift = width + SHIFT_EXTRA;
111
+ const sections = groupBySection(items);
112
+ const bottomSections = bottomItems ? groupBySection(bottomItems) : null;
113
+
114
+ return (
115
+ <div className={cn('relative h-dvh w-full overflow-hidden bg-bg', className)}>
116
+ {/* Sidebar panel */}
117
+ <div
118
+ className="absolute top-0 left-0 bottom-0 flex flex-col bg-bg z-0"
119
+ style={{
120
+ width: `${width}px`,
121
+ transform: open ? 'translateX(0)' : `translateX(-${width * 0.3}px)`,
122
+ opacity: open ? 1 : 0,
123
+ transition: SIDEBAR_TRANSITION,
124
+ pointerEvents: open ? 'auto' : 'none',
125
+ }}
126
+ >
127
+ {/* Header */}
128
+ {title && (
129
+ <div className="shrink-0 px-4 pt-4 pb-3">
130
+ <span className="text-[20px] tracking-[-0.6px] font-normal text-text">{title}</span>
131
+ </div>
132
+ )}
133
+
134
+ {/* Menu items */}
135
+ <div className="flex-1 overflow-y-auto px-2 py-1">
136
+ {[...sections.entries()].map(([name, items]) =>
137
+ renderItemSection(name, items, activeId, onNavigate),
138
+ )}
139
+ </div>
140
+
141
+ {/* Bottom items */}
142
+ {bottomSections && (
143
+ <div className="shrink-0 border-t border-border px-2 py-1">
144
+ {[...bottomSections.entries()].map(([name, items]) =>
145
+ renderItemSection(name, items, activeId, onNavigate),
146
+ )}
147
+ </div>
148
+ )}
149
+
150
+ {/* Footer */}
151
+ {footer && (
152
+ <div className={cn('shrink-0 px-2 py-2', !bottomSections && 'border-t border-border')}>
153
+ {footer}
154
+ </div>
155
+ )}
156
+ </div>
157
+
158
+ {/* Main content */}
159
+ <div
160
+ className="relative h-full w-full z-[1] bg-bg overflow-hidden"
161
+ style={{
162
+ transform: open
163
+ ? `translateX(${shift}px) scale(${MAIN_SCALE})`
164
+ : 'translateX(0) scale(1)',
165
+ borderRadius: open ? '16px' : '0px',
166
+ transition: TRANSITION,
167
+ transformOrigin: 'left center',
168
+ }}
169
+ >
170
+ {children}
171
+
172
+ {/* Dark overlay */}
173
+ <div
174
+ onClick={onClose}
175
+ className="absolute inset-0 bg-black cursor-pointer z-[2]"
176
+ style={{
177
+ opacity: open ? 0.45 : 0,
178
+ pointerEvents: open ? 'auto' : 'none',
179
+ transition: 'opacity 300ms ease',
180
+ }}
181
+ />
182
+ </div>
183
+ </div>
184
+ );
185
+ }
186
+
187
+ /* ── DrawerTrigger (hamburger button) ── */
188
+
189
+ function DrawerTrigger({ onClick, className }: { onClick: () => void; className?: string }) {
190
+ return (
191
+ <button
192
+ onClick={onClick}
193
+ className={cn(
194
+ 'flex items-center justify-center w-9 h-9 rounded-[6px] cursor-pointer border-none bg-transparent',
195
+ 'text-text hover:bg-surface-light transition-colors',
196
+ className,
197
+ )}
198
+ aria-label="Open menu"
199
+ >
200
+ <svg width="18" height="14" viewBox="0 0 18 14" fill="none" xmlns="http://www.w3.org/2000/svg">
201
+ <path d="M1 1h16M1 7h16M1 13h16" stroke="currentColor" strokeWidth="2" strokeLinecap="round" />
202
+ </svg>
203
+ </button>
204
+ );
205
+ }
206
+
207
+ /* ── Drawer Header Context ── */
208
+
209
+ interface DrawerHeaderConfig {
210
+ title?: string;
211
+ left?: ReactNode;
212
+ right?: ReactNode;
213
+ below?: ReactNode;
214
+ footer?: ReactNode;
215
+ backTo?: string;
216
+ hidden?: boolean;
217
+ }
218
+
219
+ interface DrawerHeaderContextValue {
220
+ setHeader: (config: DrawerHeaderConfig) => void;
221
+ resetHeader: () => void;
222
+ }
223
+
224
+ const DrawerHeaderContext = createContext<DrawerHeaderContextValue | null>(null);
225
+
226
+ function useDrawerHeader(config: DrawerHeaderConfig): void {
227
+ const ctx = useContext(DrawerHeaderContext);
228
+ const configRef = useMemo(() => config, [
229
+ config.title,
230
+ config.left,
231
+ config.right,
232
+ config.below,
233
+ config.footer,
234
+ config.backTo,
235
+ config.hidden,
236
+ ]);
237
+
238
+ useLayoutEffect(() => {
239
+ if (!ctx) return;
240
+ ctx.setHeader(configRef);
241
+ return () => ctx.resetHeader();
242
+ }, [ctx, configRef]);
243
+ }
244
+
245
+ export { SideDrawer, DrawerTrigger, DrawerHeaderContext, useDrawerHeader };
246
+ export type { SideDrawerProps, SideDrawerItem, DrawerHeaderConfig, DrawerHeaderContextValue };
package/web/index.ts CHANGED
@@ -167,6 +167,12 @@ export type { AudioPlayerProps } from './components/audio-player';
167
167
  export { AppShell } from './components/app-shell';
168
168
  export type { AppShellProps } from './components/app-shell';
169
169
 
170
+ export { SideDrawer, DrawerTrigger, DrawerHeaderContext, useDrawerHeader } from './components/side-drawer';
171
+ export type { SideDrawerProps, SideDrawerItem, DrawerHeaderConfig, DrawerHeaderContextValue } from './components/side-drawer';
172
+
173
+ export { DrawerShell } from './components/drawer-shell';
174
+ export type { DrawerShellProps } from './components/drawer-shell';
175
+
170
176
  // Scroll Picker
171
177
  export { ScrollPicker, DatePicker, TimePicker, SelectionPicker } from './components/scroll-picker';
172
178
  export type { ScrollPickerProps, ScrollColumn, DatePickerProps, TimePickerProps, SelectionPickerProps } from './components/scroll-picker';