@papernote/ui 1.3.1 → 1.6.0
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/dist/components/ActionBar.d.ts +112 -0
- package/dist/components/ActionBar.d.ts.map +1 -0
- package/dist/components/BottomNavigation.d.ts +98 -0
- package/dist/components/BottomNavigation.d.ts.map +1 -0
- package/dist/components/Checkbox.d.ts +2 -0
- package/dist/components/Checkbox.d.ts.map +1 -1
- package/dist/components/CheckboxList.d.ts +81 -0
- package/dist/components/CheckboxList.d.ts.map +1 -0
- package/dist/components/Chip.d.ts +92 -1
- package/dist/components/Chip.d.ts.map +1 -1
- package/dist/components/ConfirmDialog.d.ts +43 -1
- package/dist/components/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/DataTable.d.ts +10 -1
- package/dist/components/DataTable.d.ts.map +1 -1
- package/dist/components/DataTableCardView.d.ts +99 -0
- package/dist/components/DataTableCardView.d.ts.map +1 -0
- package/dist/components/ExpandablePanel.d.ts +142 -0
- package/dist/components/ExpandablePanel.d.ts.map +1 -0
- package/dist/components/FloatingActionButton.d.ts +98 -0
- package/dist/components/FloatingActionButton.d.ts.map +1 -0
- package/dist/components/Input.d.ts +45 -1
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/MobileHeader.d.ts +98 -0
- package/dist/components/MobileHeader.d.ts.map +1 -0
- package/dist/components/MobileLayout.d.ts +121 -0
- package/dist/components/MobileLayout.d.ts.map +1 -0
- package/dist/components/Modal.d.ts +78 -1
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/PageHeader.d.ts +86 -0
- package/dist/components/PageHeader.d.ts.map +1 -0
- package/dist/components/PullToRefresh.d.ts +87 -0
- package/dist/components/PullToRefresh.d.ts.map +1 -0
- package/dist/components/QueryTransparency.d.ts +1 -1
- package/dist/components/QueryTransparency.d.ts.map +1 -1
- package/dist/components/SearchableList.d.ts +83 -0
- package/dist/components/SearchableList.d.ts.map +1 -0
- package/dist/components/Select.d.ts +16 -2
- package/dist/components/Select.d.ts.map +1 -1
- package/dist/components/Sidebar.d.ts +40 -1
- package/dist/components/Sidebar.d.ts.map +1 -1
- package/dist/components/SwipeActions.d.ts +93 -0
- package/dist/components/SwipeActions.d.ts.map +1 -0
- package/dist/components/Switch.d.ts +1 -0
- package/dist/components/Switch.d.ts.map +1 -1
- package/dist/components/Textarea.d.ts +13 -0
- package/dist/components/Textarea.d.ts.map +1 -1
- package/dist/components/index.d.ts +31 -3
- package/dist/components/index.d.ts.map +1 -1
- package/dist/context/MobileContext.d.ts +168 -0
- package/dist/context/MobileContext.d.ts.map +1 -0
- package/dist/hooks/useResponsive.d.ts +158 -0
- package/dist/hooks/useResponsive.d.ts.map +1 -0
- package/dist/index.d.ts +1871 -51
- package/dist/index.esm.js +3025 -196
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +3063 -194
- package/dist/index.js.map +1 -1
- package/dist/styles.css +434 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/ActionBar.stories.tsx +246 -0
- package/src/components/ActionBar.tsx +242 -0
- package/src/components/BottomNavigation.stories.tsx +142 -0
- package/src/components/BottomNavigation.tsx +225 -0
- package/src/components/Checkbox.stories.tsx +162 -0
- package/src/components/Checkbox.tsx +22 -6
- package/src/components/CheckboxList.stories.tsx +311 -0
- package/src/components/CheckboxList.tsx +433 -0
- package/src/components/Chip.stories.tsx +389 -0
- package/src/components/Chip.tsx +182 -3
- package/src/components/ConfirmDialog.tsx +56 -4
- package/src/components/DataTable.tsx +60 -1
- package/src/components/DataTableCardView.stories.tsx +307 -0
- package/src/components/DataTableCardView.tsx +419 -0
- package/src/components/ExpandablePanel.stories.tsx +620 -0
- package/src/components/ExpandablePanel.tsx +383 -0
- package/src/components/FloatingActionButton.stories.tsx +197 -0
- package/src/components/FloatingActionButton.tsx +301 -0
- package/src/components/Grid.stories.tsx +16 -16
- package/src/components/Input.stories.tsx +214 -0
- package/src/components/Input.tsx +81 -4
- package/src/components/MobileHeader.stories.tsx +205 -0
- package/src/components/MobileHeader.tsx +233 -0
- package/src/components/MobileLayout.stories.tsx +338 -0
- package/src/components/MobileLayout.tsx +313 -0
- package/src/components/Modal.stories.tsx +388 -0
- package/src/components/Modal.tsx +122 -4
- package/src/components/PageHeader.stories.tsx +198 -0
- package/src/components/PageHeader.tsx +217 -0
- package/src/components/PullToRefresh.stories.tsx +321 -0
- package/src/components/PullToRefresh.tsx +294 -0
- package/src/components/QueryTransparency.tsx +1 -1
- package/src/components/SearchableList.stories.tsx +437 -0
- package/src/components/SearchableList.tsx +326 -0
- package/src/components/Select.stories.tsx +190 -0
- package/src/components/Select.tsx +353 -137
- package/src/components/Sidebar.tsx +193 -10
- package/src/components/SwipeActions.stories.tsx +327 -0
- package/src/components/SwipeActions.tsx +387 -0
- package/src/components/Switch.stories.tsx +158 -0
- package/src/components/Switch.tsx +12 -3
- package/src/components/Textarea.tsx +31 -1
- package/src/components/index.ts +69 -3
- package/src/context/MobileContext.tsx +296 -0
- package/src/hooks/useResponsive.ts +360 -0
- package/src/types/index.ts +4 -0
- package/tailwind.config.js +56 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { BreadcrumbItem } from './Breadcrumbs';
|
|
3
|
+
export interface PageHeaderAction {
|
|
4
|
+
/** Unique identifier for the action */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Button label text */
|
|
7
|
+
label: string;
|
|
8
|
+
/** Icon to display (from lucide-react) */
|
|
9
|
+
icon?: ReactNode;
|
|
10
|
+
/** Click handler */
|
|
11
|
+
onClick: () => void;
|
|
12
|
+
/** Button variant */
|
|
13
|
+
variant?: 'primary' | 'secondary' | 'ghost' | 'danger' | 'outline';
|
|
14
|
+
/** Disabled state */
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/** Loading state */
|
|
17
|
+
loading?: boolean;
|
|
18
|
+
/** Hide on mobile */
|
|
19
|
+
hideOnMobile?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface PageHeaderProps {
|
|
22
|
+
/** Page title */
|
|
23
|
+
title: string;
|
|
24
|
+
/** Optional subtitle/description */
|
|
25
|
+
subtitle?: string;
|
|
26
|
+
/** Breadcrumb navigation items */
|
|
27
|
+
breadcrumbs?: BreadcrumbItem[];
|
|
28
|
+
/** Show home icon in breadcrumbs (default: true) */
|
|
29
|
+
showHomeBreadcrumb?: boolean;
|
|
30
|
+
/** Action buttons to display on the right */
|
|
31
|
+
actions?: PageHeaderAction[];
|
|
32
|
+
/** Custom content to render on the right (instead of actions) */
|
|
33
|
+
rightContent?: ReactNode;
|
|
34
|
+
/** Custom content to render below title */
|
|
35
|
+
belowTitle?: ReactNode;
|
|
36
|
+
/** Additional CSS classes */
|
|
37
|
+
className?: string;
|
|
38
|
+
/** Make header sticky at top */
|
|
39
|
+
sticky?: boolean;
|
|
40
|
+
/** Back button configuration */
|
|
41
|
+
backButton?: {
|
|
42
|
+
label?: string;
|
|
43
|
+
onClick: () => void;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* PageHeader - Standard page header with title, breadcrumbs, and actions
|
|
48
|
+
*
|
|
49
|
+
* A consistent header component for pages that provides:
|
|
50
|
+
* - Page title and optional subtitle
|
|
51
|
+
* - Breadcrumb navigation
|
|
52
|
+
* - Action buttons (Create, Export, etc.)
|
|
53
|
+
* - Optional back button
|
|
54
|
+
* - Sticky positioning option
|
|
55
|
+
*
|
|
56
|
+
* @example Basic usage
|
|
57
|
+
* ```tsx
|
|
58
|
+
* <PageHeader
|
|
59
|
+
* title="Products"
|
|
60
|
+
* subtitle="Manage your product catalog"
|
|
61
|
+
* breadcrumbs={[{ label: 'Inventory' }, { label: 'Products' }]}
|
|
62
|
+
* actions={[
|
|
63
|
+
* { id: 'export', label: 'Export', icon: <Download />, onClick: handleExport, variant: 'ghost' },
|
|
64
|
+
* { id: 'add', label: 'Add Product', icon: <Plus />, onClick: handleAdd, variant: 'primary' },
|
|
65
|
+
* ]}
|
|
66
|
+
* />
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* @example With back button
|
|
70
|
+
* ```tsx
|
|
71
|
+
* <PageHeader
|
|
72
|
+
* title="Edit Product"
|
|
73
|
+
* backButton={{ label: 'Back to Products', onClick: () => navigate('/products') }}
|
|
74
|
+
* />
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @example With custom right content
|
|
78
|
+
* ```tsx
|
|
79
|
+
* <PageHeader
|
|
80
|
+
* title="Dashboard"
|
|
81
|
+
* rightContent={<DateRangePicker value={range} onChange={setRange} />}
|
|
82
|
+
* />
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export default function PageHeader({ title, subtitle, breadcrumbs, showHomeBreadcrumb, actions, rightContent, belowTitle, className, sticky, backButton, }: PageHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
86
|
+
//# sourceMappingURL=PageHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageHeader.d.ts","sourceRoot":"","sources":["../../src/components/PageHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oBAAoB;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qBAAqB;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnE,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qBAAqB;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,UAAU,CAAC,EAAE;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,WAAW,EACX,kBAAyB,EACzB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,SAAc,EACd,MAAc,EACd,UAAU,GACX,EAAE,eAAe,2CAsHjB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* PullToRefresh component props
|
|
4
|
+
*/
|
|
5
|
+
export interface PullToRefreshProps {
|
|
6
|
+
/** Content to wrap */
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** Async refresh handler - should return a Promise */
|
|
9
|
+
onRefresh: () => Promise<void>;
|
|
10
|
+
/** Disable pull-to-refresh */
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
/** Pull distance required to trigger refresh (default: 80) */
|
|
13
|
+
pullThreshold?: number;
|
|
14
|
+
/** Maximum pull distance (default: 120) */
|
|
15
|
+
maxPull?: number;
|
|
16
|
+
/** Custom loading indicator */
|
|
17
|
+
loadingIndicator?: React.ReactNode;
|
|
18
|
+
/** Custom pull indicator */
|
|
19
|
+
pullIndicator?: React.ReactNode;
|
|
20
|
+
/** Additional class names for container */
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* PullToRefresh - Mobile pull-to-refresh gesture handler
|
|
25
|
+
*
|
|
26
|
+
* Wraps content and provides native-feeling pull-to-refresh functionality.
|
|
27
|
+
* Only activates when scrolled to top of content.
|
|
28
|
+
*
|
|
29
|
+
* @example Basic usage
|
|
30
|
+
* ```tsx
|
|
31
|
+
* <PullToRefresh onRefresh={async () => {
|
|
32
|
+
* await fetchLatestData();
|
|
33
|
+
* }}>
|
|
34
|
+
* <div className="min-h-screen">
|
|
35
|
+
* {content}
|
|
36
|
+
* </div>
|
|
37
|
+
* </PullToRefresh>
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example With custom threshold
|
|
41
|
+
* ```tsx
|
|
42
|
+
* <PullToRefresh
|
|
43
|
+
* onRefresh={handleRefresh}
|
|
44
|
+
* pullThreshold={100}
|
|
45
|
+
* maxPull={150}
|
|
46
|
+
* >
|
|
47
|
+
* {content}
|
|
48
|
+
* </PullToRefresh>
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export default function PullToRefresh({ children, onRefresh, disabled, pullThreshold, maxPull, loadingIndicator, pullIndicator, className, }: PullToRefreshProps): import("react/jsx-runtime").JSX.Element;
|
|
52
|
+
/**
|
|
53
|
+
* usePullToRefresh - Hook for custom pull-to-refresh implementations
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```tsx
|
|
57
|
+
* const { pullDistance, isRefreshing, bind } = usePullToRefresh({
|
|
58
|
+
* onRefresh: async () => {
|
|
59
|
+
* await fetchData();
|
|
60
|
+
* }
|
|
61
|
+
* });
|
|
62
|
+
*
|
|
63
|
+
* return (
|
|
64
|
+
* <div {...bind}>
|
|
65
|
+
* {isRefreshing && <Spinner />}
|
|
66
|
+
* {content}
|
|
67
|
+
* </div>
|
|
68
|
+
* );
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare function usePullToRefresh({ onRefresh, pullThreshold, maxPull, disabled, }: {
|
|
72
|
+
onRefresh: () => Promise<void>;
|
|
73
|
+
pullThreshold?: number;
|
|
74
|
+
maxPull?: number;
|
|
75
|
+
disabled?: boolean;
|
|
76
|
+
}): {
|
|
77
|
+
pullDistance: number;
|
|
78
|
+
isRefreshing: boolean;
|
|
79
|
+
isReady: boolean;
|
|
80
|
+
progress: number;
|
|
81
|
+
bind: {
|
|
82
|
+
onTouchStart: (e: React.TouchEvent) => void;
|
|
83
|
+
onTouchMove: (e: React.TouchEvent) => void;
|
|
84
|
+
onTouchEnd: () => Promise<void>;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=PullToRefresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PullToRefresh.d.ts","sourceRoot":"","sources":["../../src/components/PullToRefresh.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAGxE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,sDAAsD;IACtD,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,4BAA4B;IAC5B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,QAAQ,EACR,SAAS,EACT,QAAgB,EAChB,aAAkB,EAClB,OAAa,EACb,gBAAgB,EAChB,aAAa,EACb,SAAc,GACf,EAAE,kBAAkB,2CAuJpB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,aAAkB,EAClB,OAAa,EACb,QAAgB,GACjB,EAAE;IACD,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;;;;;;0BAK0C,KAAK,CAAC,UAAU;yBAKjB,KAAK,CAAC,UAAU;;;EAqCzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryTransparency.d.ts","sourceRoot":"","sources":["../../src/components/QueryTransparency.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,KAAK,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,GAAG,CAAC;QACX,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;KACpE,CAAC,CAAC;IACH,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"QueryTransparency.d.ts","sourceRoot":"","sources":["../../src/components/QueryTransparency.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,KAAK,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,GAAG,CAAC;QACX,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;KACpE,CAAC,CAAC;IACH,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;KACjD,CAAC,CAAC;IAEH,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,QAAQ,CAAC;QACxD,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,SAAS,EACT,SAAc,EACd,SAAS,EAAE,gBAAuB,EAClC,YAAoB,EACpB,iBAAwB,EACxB,gBAAgB,GACjB,EAAE,sBAAsB,kDAqMxB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface SearchableListItem<T = unknown> {
|
|
3
|
+
key: string;
|
|
4
|
+
data: T;
|
|
5
|
+
}
|
|
6
|
+
export interface SearchableListProps<T = unknown> {
|
|
7
|
+
/** Array of items to display */
|
|
8
|
+
items: SearchableListItem<T>[];
|
|
9
|
+
/** Search input placeholder */
|
|
10
|
+
searchPlaceholder?: string;
|
|
11
|
+
/** Controlled search value */
|
|
12
|
+
searchValue?: string;
|
|
13
|
+
/** Callback when search changes */
|
|
14
|
+
onSearchChange?: (value: string) => void;
|
|
15
|
+
/** Custom filter function */
|
|
16
|
+
filterFn?: (item: SearchableListItem<T>, searchTerm: string) => boolean;
|
|
17
|
+
/** Debounce delay for search in ms */
|
|
18
|
+
debounceMs?: number;
|
|
19
|
+
/** Render function for each item */
|
|
20
|
+
renderItem: (item: SearchableListItem<T>, index: number, isSelected: boolean, isHighlighted: boolean) => ReactNode;
|
|
21
|
+
/** Currently selected item key */
|
|
22
|
+
selectedKey?: string;
|
|
23
|
+
/** Callback when item is selected */
|
|
24
|
+
onSelect?: (item: SearchableListItem<T>) => void;
|
|
25
|
+
/** Maximum height with overflow scroll */
|
|
26
|
+
maxHeight?: string | number;
|
|
27
|
+
/** Show result count */
|
|
28
|
+
showResultCount?: boolean;
|
|
29
|
+
/** Result count format function */
|
|
30
|
+
formatResultCount?: (count: number, total: number) => string;
|
|
31
|
+
/** Message when no items available */
|
|
32
|
+
emptyMessage?: string | ReactNode;
|
|
33
|
+
/** Message when search has no results */
|
|
34
|
+
noResultsMessage?: string | ReactNode;
|
|
35
|
+
/** Loading state */
|
|
36
|
+
loading?: boolean;
|
|
37
|
+
/** Loading message */
|
|
38
|
+
loadingMessage?: string | ReactNode;
|
|
39
|
+
/** Size variant */
|
|
40
|
+
size?: 'sm' | 'md' | 'lg';
|
|
41
|
+
/** Visual variant */
|
|
42
|
+
variant?: 'default' | 'bordered' | 'card';
|
|
43
|
+
/** Additional CSS classes */
|
|
44
|
+
className?: string;
|
|
45
|
+
/** Enable keyboard navigation (arrow keys, enter) */
|
|
46
|
+
enableKeyboardNavigation?: boolean;
|
|
47
|
+
/** Auto-focus search input */
|
|
48
|
+
autoFocus?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* SearchableList - List component with integrated search/filter functionality
|
|
52
|
+
*
|
|
53
|
+
* @example Basic usage
|
|
54
|
+
* ```tsx
|
|
55
|
+
* <SearchableList
|
|
56
|
+
* items={users.map(u => ({ key: u.id, data: u }))}
|
|
57
|
+
* renderItem={(item) => <div>{item.data.name}</div>}
|
|
58
|
+
* onSelect={(item) => setSelectedUser(item.data)}
|
|
59
|
+
* searchable
|
|
60
|
+
* searchPlaceholder="Search users..."
|
|
61
|
+
* />
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* @example With custom filter and loading
|
|
65
|
+
* ```tsx
|
|
66
|
+
* <SearchableList
|
|
67
|
+
* items={products}
|
|
68
|
+
* renderItem={(item, index, isSelected) => (
|
|
69
|
+
* <div className={isSelected ? 'bg-accent-50' : ''}>
|
|
70
|
+
* {item.data.name} - ${item.data.price}
|
|
71
|
+
* </div>
|
|
72
|
+
* )}
|
|
73
|
+
* filterFn={(item, term) =>
|
|
74
|
+
* item.data.name.toLowerCase().includes(term.toLowerCase())
|
|
75
|
+
* }
|
|
76
|
+
* loading={isLoading}
|
|
77
|
+
* loadingMessage="Fetching products..."
|
|
78
|
+
* maxHeight="400px"
|
|
79
|
+
* />
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export default function SearchableList<T = unknown>({ items, searchPlaceholder, searchValue: controlledSearchValue, onSearchChange, filterFn, debounceMs, renderItem, selectedKey, onSelect, maxHeight, showResultCount, formatResultCount, emptyMessage, noResultsMessage, loading, loadingMessage, size, variant, className, enableKeyboardNavigation, autoFocus, }: SearchableListProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
83
|
+
//# sourceMappingURL=SearchableList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchableList.d.ts","sourceRoot":"","sources":["../../src/components/SearchableList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqD,SAAS,EAAE,MAAM,OAAO,CAAC;AAKrF,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,gCAAgC;IAChC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAG/B,+BAA+B;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IACxE,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,oCAAoC;IACpC,UAAU,EAAE,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,KAAK,SAAS,CAAC;IAGnH,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAGjD,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,wBAAwB;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAG7D,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sBAAsB;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAGpC,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,qBAAqB;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;IAC1C,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,qDAAqD;IACrD,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AA6BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,EAClD,KAAK,EACL,iBAA+B,EAC/B,WAAW,EAAE,qBAAqB,EAClC,cAAc,EACd,QAAQ,EACR,UAAgB,EAChB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,eAAuB,EACvB,iBAAiB,EACjB,YAAmC,EACnC,gBAA+C,EAC/C,OAAe,EACf,cAA6B,EAC7B,IAAW,EACX,OAAmB,EACnB,SAAc,EACd,wBAA+B,EAC/B,SAAiB,GAClB,EAAE,mBAAmB,CAAC,CAAC,CAAC,2CA+KxB"}
|
|
@@ -72,12 +72,16 @@ export interface SelectProps {
|
|
|
72
72
|
virtualHeight?: string;
|
|
73
73
|
/** Height of each option row in pixels (default: 42) */
|
|
74
74
|
virtualItemHeight?: number;
|
|
75
|
+
/** Size of the select trigger - 'lg' provides 44px touch-friendly target */
|
|
76
|
+
size?: 'sm' | 'md' | 'lg';
|
|
77
|
+
/** Mobile display mode - 'auto' uses BottomSheet on mobile, 'dropdown' always uses dropdown, 'native' uses native select on mobile */
|
|
78
|
+
mobileMode?: 'auto' | 'dropdown' | 'native';
|
|
75
79
|
}
|
|
76
80
|
/**
|
|
77
|
-
* Select - Dropdown select component with search, groups, and
|
|
81
|
+
* Select - Dropdown select component with search, groups, virtual scrolling, and mobile support
|
|
78
82
|
*
|
|
79
83
|
* A feature-rich select component supporting flat or grouped options, search/filter,
|
|
80
|
-
* option creation, virtual scrolling for large lists, and
|
|
84
|
+
* option creation, virtual scrolling for large lists, and mobile-optimized BottomSheet display.
|
|
81
85
|
*
|
|
82
86
|
* @example Basic select
|
|
83
87
|
* ```tsx
|
|
@@ -95,6 +99,16 @@ export interface SelectProps {
|
|
|
95
99
|
* />
|
|
96
100
|
* ```
|
|
97
101
|
*
|
|
102
|
+
* @example Mobile-optimized with large touch targets
|
|
103
|
+
* ```tsx
|
|
104
|
+
* <Select
|
|
105
|
+
* options={options}
|
|
106
|
+
* size="lg"
|
|
107
|
+
* mobileMode="auto"
|
|
108
|
+
* placeholder="Select..."
|
|
109
|
+
* />
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
98
112
|
* @example Searchable with groups
|
|
99
113
|
* ```tsx
|
|
100
114
|
* const groups = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../src/components/Select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8E,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../src/components/Select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8E,MAAM,OAAO,CAAC;AAKnG;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,wBAAwB;IACxB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,yBAAyB;IACzB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,mEAAmE;IACnE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,sIAAsI;IACtI,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;CAC7C;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,QAAA,MAAM,MAAM,kFAqkBV,CAAC;AAGH,eAAe,MAAM,CAAC"}
|
|
@@ -18,6 +18,12 @@ export interface SidebarProps {
|
|
|
18
18
|
header?: React.ReactNode;
|
|
19
19
|
footer?: React.ReactNode;
|
|
20
20
|
currentPath?: string;
|
|
21
|
+
/** Whether sidebar is open on mobile (drawer mode) */
|
|
22
|
+
mobileOpen?: boolean;
|
|
23
|
+
/** Callback when mobile drawer should close */
|
|
24
|
+
onMobileClose?: () => void;
|
|
25
|
+
/** Width of the sidebar (default: 256px / w-64) */
|
|
26
|
+
width?: string;
|
|
21
27
|
}
|
|
22
28
|
export interface SidebarGroupProps {
|
|
23
29
|
title?: string;
|
|
@@ -27,5 +33,38 @@ export interface SidebarGroupProps {
|
|
|
27
33
|
currentPath?: string;
|
|
28
34
|
}
|
|
29
35
|
export declare function SidebarGroup({ title, items, onNavigate, defaultExpanded, currentPath }: SidebarGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Sidebar - Navigation sidebar with mobile drawer support
|
|
38
|
+
*
|
|
39
|
+
* On desktop: Renders as a fixed-width sidebar
|
|
40
|
+
* On mobile: Renders as a drawer overlay when mobileOpen is true
|
|
41
|
+
*
|
|
42
|
+
* @example Desktop usage (no mobile props)
|
|
43
|
+
* ```tsx
|
|
44
|
+
* <Sidebar
|
|
45
|
+
* items={navItems}
|
|
46
|
+
* header={<Logo />}
|
|
47
|
+
* footer={<UserProfile />}
|
|
48
|
+
* currentPath={location.pathname}
|
|
49
|
+
* onNavigate={(href) => navigate(href)}
|
|
50
|
+
* />
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @example With mobile drawer support
|
|
54
|
+
* ```tsx
|
|
55
|
+
* const [mobileOpen, setMobileOpen] = useState(false);
|
|
56
|
+
*
|
|
57
|
+
* <Sidebar
|
|
58
|
+
* items={navItems}
|
|
59
|
+
* header={<Logo />}
|
|
60
|
+
* mobileOpen={mobileOpen}
|
|
61
|
+
* onMobileClose={() => setMobileOpen(false)}
|
|
62
|
+
* onNavigate={(href) => {
|
|
63
|
+
* navigate(href);
|
|
64
|
+
* setMobileOpen(false); // Close drawer on navigation
|
|
65
|
+
* }}
|
|
66
|
+
* />
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export default function Sidebar({ items, onNavigate, className, header, footer, currentPath, mobileOpen, onMobileClose, width, }: SidebarProps): import("react/jsx-runtime").JSX.Element | null;
|
|
31
70
|
//# sourceMappingURL=Sidebar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../src/components/Sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../src/components/Sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAI3D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqGD,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,eAAsB,EAAE,WAAW,EAAE,EAAE,iBAAiB,2CAoChH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,SAAc,EACd,MAAM,EACN,MAAM,EACN,WAAW,EACX,UAAU,EACV,aAAa,EACb,KAAc,GACf,EAAE,YAAY,kDAyKd"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Single swipe action configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface SwipeAction {
|
|
6
|
+
/** Unique identifier */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Action label (shown on the button) */
|
|
9
|
+
label: string;
|
|
10
|
+
/** Icon to display */
|
|
11
|
+
icon?: React.ReactNode;
|
|
12
|
+
/** Background color class (Tailwind) */
|
|
13
|
+
color?: 'primary' | 'success' | 'warning' | 'error' | 'default';
|
|
14
|
+
/** Click handler */
|
|
15
|
+
onClick: () => void;
|
|
16
|
+
/** Whether this is the primary action (full swipe triggers it) */
|
|
17
|
+
primary?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* SwipeActions component props
|
|
21
|
+
*/
|
|
22
|
+
export interface SwipeActionsProps {
|
|
23
|
+
/** Content to wrap with swipe actions */
|
|
24
|
+
children: React.ReactNode;
|
|
25
|
+
/** Actions shown when swiping left (appears on right side) */
|
|
26
|
+
leftActions?: SwipeAction[];
|
|
27
|
+
/** Actions shown when swiping right (appears on left side) */
|
|
28
|
+
rightActions?: SwipeAction[];
|
|
29
|
+
/** Swipe threshold in pixels to reveal actions (default: 80) */
|
|
30
|
+
threshold?: number;
|
|
31
|
+
/** Full swipe threshold percentage to trigger primary action (default: 0.5) */
|
|
32
|
+
fullSwipeThreshold?: number;
|
|
33
|
+
/** Enable full swipe to trigger primary action */
|
|
34
|
+
fullSwipe?: boolean;
|
|
35
|
+
/** Disable swipe gestures */
|
|
36
|
+
disabled?: boolean;
|
|
37
|
+
/** Callback when actions are revealed/hidden */
|
|
38
|
+
onSwipeChange?: (direction: 'left' | 'right' | null) => void;
|
|
39
|
+
/** Additional CSS classes */
|
|
40
|
+
className?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* SwipeActions - Touch-based swipe actions for list items
|
|
44
|
+
*
|
|
45
|
+
* Wraps any content with swipe-to-reveal actions, commonly used in mobile
|
|
46
|
+
* list items for quick actions like delete, archive, edit, etc.
|
|
47
|
+
*
|
|
48
|
+
* Features:
|
|
49
|
+
* - Left and right swipe actions
|
|
50
|
+
* - Full swipe to trigger primary action
|
|
51
|
+
* - Spring-back animation
|
|
52
|
+
* - Touch and mouse support
|
|
53
|
+
* - Customizable thresholds
|
|
54
|
+
*
|
|
55
|
+
* @example Basic delete action
|
|
56
|
+
* ```tsx
|
|
57
|
+
* <SwipeActions
|
|
58
|
+
* leftActions={[
|
|
59
|
+
* {
|
|
60
|
+
* id: 'delete',
|
|
61
|
+
* label: 'Delete',
|
|
62
|
+
* icon: <Trash className="h-5 w-5" />,
|
|
63
|
+
* color: 'error',
|
|
64
|
+
* onClick: () => handleDelete(item),
|
|
65
|
+
* primary: true,
|
|
66
|
+
* },
|
|
67
|
+
* ]}
|
|
68
|
+
* >
|
|
69
|
+
* <div className="p-4 bg-white">
|
|
70
|
+
* List item content
|
|
71
|
+
* </div>
|
|
72
|
+
* </SwipeActions>
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @example Multiple actions on both sides
|
|
76
|
+
* ```tsx
|
|
77
|
+
* <SwipeActions
|
|
78
|
+
* leftActions={[
|
|
79
|
+
* { id: 'delete', label: 'Delete', icon: <Trash />, color: 'error', onClick: handleDelete },
|
|
80
|
+
* { id: 'archive', label: 'Archive', icon: <Archive />, color: 'warning', onClick: handleArchive },
|
|
81
|
+
* ]}
|
|
82
|
+
* rightActions={[
|
|
83
|
+
* { id: 'edit', label: 'Edit', icon: <Edit />, color: 'primary', onClick: handleEdit },
|
|
84
|
+
* ]}
|
|
85
|
+
* fullSwipe
|
|
86
|
+
* >
|
|
87
|
+
* <ListItem />
|
|
88
|
+
* </SwipeActions>
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function SwipeActions({ children, leftActions, rightActions, threshold, fullSwipeThreshold, fullSwipe, disabled, onSwipeChange, className, }: SwipeActionsProps): import("react/jsx-runtime").JSX.Element;
|
|
92
|
+
export default SwipeActions;
|
|
93
|
+
//# sourceMappingURL=SwipeActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwipeActions.d.ts","sourceRoot":"","sources":["../../src/components/SwipeActions.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,wCAAwC;IACxC,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAChE,oBAAoB;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;IAC5B,8DAA8D;IAC9D,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAgB,EAChB,YAAiB,EACjB,SAAc,EACd,kBAAwB,EACxB,SAAiB,EACjB,QAAgB,EAChB,aAAa,EACb,SAAc,GACf,EAAE,iBAAiB,2CA6QnB;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -4,6 +4,7 @@ export interface SwitchProps {
|
|
|
4
4
|
label?: string;
|
|
5
5
|
description?: string;
|
|
6
6
|
disabled?: boolean;
|
|
7
|
+
/** Size variant - 'lg' provides better touch targets. On mobile, 'md' auto-upgrades to 'lg'. */
|
|
7
8
|
size?: 'sm' | 'md' | 'lg';
|
|
8
9
|
/** Show loading spinner (disables interaction) */
|
|
9
10
|
loading?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../src/components/Switch.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../src/components/Switch.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gGAAgG;IAChG,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,QAAA,MAAM,MAAM,0GAmGV,CAAC;AAGH,eAAe,MAAM,CAAC"}
|
|
@@ -16,6 +16,19 @@ export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextArea
|
|
|
16
16
|
resize?: 'none' | 'vertical' | 'horizontal' | 'both';
|
|
17
17
|
/** Show loading spinner (for async operations like auto-save) */
|
|
18
18
|
loading?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Size variant - 'md' is default, 'lg' provides larger touch-friendly text and padding.
|
|
21
|
+
* On mobile, 'md' is automatically upgraded to 'lg' for better touch targets.
|
|
22
|
+
*/
|
|
23
|
+
size?: 'sm' | 'md' | 'lg';
|
|
24
|
+
/**
|
|
25
|
+
* Enter key hint for mobile keyboards.
|
|
26
|
+
* 'enter' - Standard enter key (newline)
|
|
27
|
+
* 'done' - Done action
|
|
28
|
+
* 'go' - Go/navigate action
|
|
29
|
+
* 'send' - Send action
|
|
30
|
+
*/
|
|
31
|
+
enterKeyHint?: 'enter' | 'done' | 'go' | 'send';
|
|
19
32
|
}
|
|
20
33
|
declare const Textarea: import("react").ForwardRefExoticComponent<TextareaProps & import("react").RefAttributes<HTMLTextAreaElement>>;
|
|
21
34
|
export default Textarea;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../../src/components/Textarea.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../../src/components/Textarea.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;AAErE,MAAM,WAAW,aAAc,SAAQ,KAAK,CAAC,sBAAsB,CAAC,mBAAmB,CAAC;IACtF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mDAAmD;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IACrD,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB;;;OAGG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;CACjD;AASD,QAAA,MAAM,QAAQ,+GA0Lb,CAAC;AAIF,eAAe,QAAQ,CAAC"}
|
|
@@ -106,8 +106,12 @@ export { default as MarkdownEditor } from './MarkdownEditor';
|
|
|
106
106
|
export type { MarkdownEditorProps } from './MarkdownEditor';
|
|
107
107
|
export { default as Menu, MenuDivider } from './Menu';
|
|
108
108
|
export type { MenuProps, MenuItem } from './Menu';
|
|
109
|
-
export { default as Chip } from './Chip';
|
|
110
|
-
export type { ChipProps } from './Chip';
|
|
109
|
+
export { default as Chip, ChipGroup } from './Chip';
|
|
110
|
+
export type { ChipProps, ChipGroupProps } from './Chip';
|
|
111
|
+
export { default as CheckboxList } from './CheckboxList';
|
|
112
|
+
export type { CheckboxListProps, CheckboxListItem } from './CheckboxList';
|
|
113
|
+
export { default as SearchableList } from './SearchableList';
|
|
114
|
+
export type { SearchableListProps, SearchableListItem } from './SearchableList';
|
|
111
115
|
export { default as NumberInput } from './NumberInput';
|
|
112
116
|
export type { NumberInputProps } from './NumberInput';
|
|
113
117
|
export { default as AlertDialog } from './AlertDialog';
|
|
@@ -122,7 +126,9 @@ export { default as BottomSheet } from './BottomSheet';
|
|
|
122
126
|
export type { BottomSheetProps } from './BottomSheet';
|
|
123
127
|
export { default as Collapsible } from './Collapsible';
|
|
124
128
|
export type { CollapsibleProps } from './Collapsible';
|
|
125
|
-
export {
|
|
129
|
+
export { default as ExpandablePanel, ExpandablePanelSpacer, ExpandablePanelContainer } from './ExpandablePanel';
|
|
130
|
+
export type { ExpandablePanelProps } from './ExpandablePanel';
|
|
131
|
+
export { Show, Hide } from './ResponsiveUtilities';
|
|
126
132
|
export { default as Breadcrumbs } from './Breadcrumbs';
|
|
127
133
|
export type { BreadcrumbsProps, BreadcrumbItem } from './Breadcrumbs';
|
|
128
134
|
export { default as Tabs } from './Tabs';
|
|
@@ -153,12 +159,22 @@ export { PageNavigation } from './PageNavigation';
|
|
|
153
159
|
export type { PageNavigationProps } from './PageNavigation';
|
|
154
160
|
export { default as Sidebar, SidebarGroup } from './Sidebar';
|
|
155
161
|
export type { SidebarProps, SidebarItem, SidebarGroupProps } from './Sidebar';
|
|
162
|
+
export { default as BottomNavigation, BottomNavigationSpacer } from './BottomNavigation';
|
|
163
|
+
export type { BottomNavigationProps, BottomNavItem } from './BottomNavigation';
|
|
164
|
+
export { default as MobileHeader, MobileHeaderSpacer } from './MobileHeader';
|
|
165
|
+
export type { MobileHeaderProps } from './MobileHeader';
|
|
166
|
+
export { default as FloatingActionButton, useFABScroll } from './FloatingActionButton';
|
|
167
|
+
export type { FloatingActionButtonProps, FABAction } from './FloatingActionButton';
|
|
168
|
+
export { default as PullToRefresh, usePullToRefresh } from './PullToRefresh';
|
|
169
|
+
export type { PullToRefreshProps } from './PullToRefresh';
|
|
156
170
|
export { default as Logo } from './Logo';
|
|
157
171
|
export type { LogoProps } from './Logo';
|
|
158
172
|
export { default as UserProfileButton } from './UserProfileButton';
|
|
159
173
|
export type { UserProfileButtonProps } from './UserProfileButton';
|
|
160
174
|
export { default as Layout } from './Layout';
|
|
161
175
|
export type { LayoutProps } from './Layout';
|
|
176
|
+
export { default as MobileLayout } from './MobileLayout';
|
|
177
|
+
export type { MobileLayoutProps } from './MobileLayout';
|
|
162
178
|
export { default as TwoColumnContent } from './TwoColumnContent';
|
|
163
179
|
export type { TwoColumnContentProps } from './TwoColumnContent';
|
|
164
180
|
export { default as Page } from './Page';
|
|
@@ -175,6 +191,10 @@ export { default as NotificationIndicator } from './NotificationIndicator';
|
|
|
175
191
|
export type { NotificationIndicatorProps } from './NotificationIndicator';
|
|
176
192
|
export { default as DataTable } from './DataTable';
|
|
177
193
|
export type { DataTableColumn, DataTableAction, ExpandedRowConfig, ExpansionMode } from './DataTable';
|
|
194
|
+
export { default as DataTableCardView } from './DataTableCardView';
|
|
195
|
+
export type { CardViewConfig, DataTableCardViewProps } from './DataTableCardView';
|
|
196
|
+
export { default as SwipeActions } from './SwipeActions';
|
|
197
|
+
export type { SwipeActionsProps, SwipeAction } from './SwipeActions';
|
|
178
198
|
export { Spreadsheet, SpreadsheetReport } from './Spreadsheet';
|
|
179
199
|
export type { SpreadsheetProps, SpreadsheetCell, Matrix, CellBase } from './Spreadsheet';
|
|
180
200
|
export { default as ExpandedRowEditForm } from './ExpandedRowEditForm';
|
|
@@ -198,6 +218,10 @@ export type { QueryTransparencyProps, QueryTransparencyInfo } from './QueryTrans
|
|
|
198
218
|
export { AppLayout } from './AppLayout';
|
|
199
219
|
export type { AppLayoutProps } from './AppLayout';
|
|
200
220
|
export { PageLayout } from './PageLayout';
|
|
221
|
+
export { default as PageHeader } from './PageHeader';
|
|
222
|
+
export type { PageHeaderProps, PageHeaderAction } from './PageHeader';
|
|
223
|
+
export { default as ActionBar, ActionBarLeft, ActionBarCenter, ActionBarRight } from './ActionBar';
|
|
224
|
+
export type { ActionBarProps, ActionBarAction } from './ActionBar';
|
|
201
225
|
export { AdminModal } from './AdminModal';
|
|
202
226
|
export type { AdminModalProps, AdminModalTab } from './AdminModal';
|
|
203
227
|
export { StatsCardGrid } from './StatsCardGrid';
|
|
@@ -223,4 +247,8 @@ export { exportToExcel, exportDataTableToExcel, createMultiSheetExcel } from '..
|
|
|
223
247
|
export type { ExcelColumn, ExportToExcelOptions, DataTableExportOptions, MultiSheetExcelOptions } from '../utils/excelExport';
|
|
224
248
|
export { useColumnResize, useColumnReorder } from '../hooks/useTableEnhancements';
|
|
225
249
|
export type { UseColumnResizeOptions, UseColumnReorderOptions } from '../hooks/useTableEnhancements';
|
|
250
|
+
export { useViewportSize, useBreakpoint, useMediaQuery, useIsMobile, useIsTablet, useIsDesktop, useIsTouchDevice, useOrientation, useBreakpointValue, useResponsiveCallback, useSafeAreaInsets, usePrefersMobile, BREAKPOINTS, } from '../hooks/useResponsive';
|
|
251
|
+
export type { Breakpoint, ViewportSize, Orientation } from '../hooks/useResponsive';
|
|
252
|
+
export { MobileProvider, useMobileContext, withMobileContext, MobileOnly, DesktopOnly, Responsive, } from '../context/MobileContext';
|
|
253
|
+
export type { MobileContextValue, MobileProviderProps } from '../context/MobileContext';
|
|
226
254
|
//# sourceMappingURL=index.d.ts.map
|