@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.
Files changed (108) hide show
  1. package/dist/components/ActionBar.d.ts +112 -0
  2. package/dist/components/ActionBar.d.ts.map +1 -0
  3. package/dist/components/BottomNavigation.d.ts +98 -0
  4. package/dist/components/BottomNavigation.d.ts.map +1 -0
  5. package/dist/components/Checkbox.d.ts +2 -0
  6. package/dist/components/Checkbox.d.ts.map +1 -1
  7. package/dist/components/CheckboxList.d.ts +81 -0
  8. package/dist/components/CheckboxList.d.ts.map +1 -0
  9. package/dist/components/Chip.d.ts +92 -1
  10. package/dist/components/Chip.d.ts.map +1 -1
  11. package/dist/components/ConfirmDialog.d.ts +43 -1
  12. package/dist/components/ConfirmDialog.d.ts.map +1 -1
  13. package/dist/components/DataTable.d.ts +10 -1
  14. package/dist/components/DataTable.d.ts.map +1 -1
  15. package/dist/components/DataTableCardView.d.ts +99 -0
  16. package/dist/components/DataTableCardView.d.ts.map +1 -0
  17. package/dist/components/ExpandablePanel.d.ts +142 -0
  18. package/dist/components/ExpandablePanel.d.ts.map +1 -0
  19. package/dist/components/FloatingActionButton.d.ts +98 -0
  20. package/dist/components/FloatingActionButton.d.ts.map +1 -0
  21. package/dist/components/Input.d.ts +45 -1
  22. package/dist/components/Input.d.ts.map +1 -1
  23. package/dist/components/MobileHeader.d.ts +98 -0
  24. package/dist/components/MobileHeader.d.ts.map +1 -0
  25. package/dist/components/MobileLayout.d.ts +121 -0
  26. package/dist/components/MobileLayout.d.ts.map +1 -0
  27. package/dist/components/Modal.d.ts +78 -1
  28. package/dist/components/Modal.d.ts.map +1 -1
  29. package/dist/components/PageHeader.d.ts +86 -0
  30. package/dist/components/PageHeader.d.ts.map +1 -0
  31. package/dist/components/PullToRefresh.d.ts +87 -0
  32. package/dist/components/PullToRefresh.d.ts.map +1 -0
  33. package/dist/components/QueryTransparency.d.ts +1 -1
  34. package/dist/components/QueryTransparency.d.ts.map +1 -1
  35. package/dist/components/SearchableList.d.ts +83 -0
  36. package/dist/components/SearchableList.d.ts.map +1 -0
  37. package/dist/components/Select.d.ts +16 -2
  38. package/dist/components/Select.d.ts.map +1 -1
  39. package/dist/components/Sidebar.d.ts +40 -1
  40. package/dist/components/Sidebar.d.ts.map +1 -1
  41. package/dist/components/SwipeActions.d.ts +93 -0
  42. package/dist/components/SwipeActions.d.ts.map +1 -0
  43. package/dist/components/Switch.d.ts +1 -0
  44. package/dist/components/Switch.d.ts.map +1 -1
  45. package/dist/components/Textarea.d.ts +13 -0
  46. package/dist/components/Textarea.d.ts.map +1 -1
  47. package/dist/components/index.d.ts +31 -3
  48. package/dist/components/index.d.ts.map +1 -1
  49. package/dist/context/MobileContext.d.ts +168 -0
  50. package/dist/context/MobileContext.d.ts.map +1 -0
  51. package/dist/hooks/useResponsive.d.ts +158 -0
  52. package/dist/hooks/useResponsive.d.ts.map +1 -0
  53. package/dist/index.d.ts +1871 -51
  54. package/dist/index.esm.js +3025 -196
  55. package/dist/index.esm.js.map +1 -1
  56. package/dist/index.js +3063 -194
  57. package/dist/index.js.map +1 -1
  58. package/dist/styles.css +434 -1
  59. package/dist/types/index.d.ts +2 -0
  60. package/dist/types/index.d.ts.map +1 -1
  61. package/package.json +1 -1
  62. package/src/components/ActionBar.stories.tsx +246 -0
  63. package/src/components/ActionBar.tsx +242 -0
  64. package/src/components/BottomNavigation.stories.tsx +142 -0
  65. package/src/components/BottomNavigation.tsx +225 -0
  66. package/src/components/Checkbox.stories.tsx +162 -0
  67. package/src/components/Checkbox.tsx +22 -6
  68. package/src/components/CheckboxList.stories.tsx +311 -0
  69. package/src/components/CheckboxList.tsx +433 -0
  70. package/src/components/Chip.stories.tsx +389 -0
  71. package/src/components/Chip.tsx +182 -3
  72. package/src/components/ConfirmDialog.tsx +56 -4
  73. package/src/components/DataTable.tsx +60 -1
  74. package/src/components/DataTableCardView.stories.tsx +307 -0
  75. package/src/components/DataTableCardView.tsx +419 -0
  76. package/src/components/ExpandablePanel.stories.tsx +620 -0
  77. package/src/components/ExpandablePanel.tsx +383 -0
  78. package/src/components/FloatingActionButton.stories.tsx +197 -0
  79. package/src/components/FloatingActionButton.tsx +301 -0
  80. package/src/components/Grid.stories.tsx +16 -16
  81. package/src/components/Input.stories.tsx +214 -0
  82. package/src/components/Input.tsx +81 -4
  83. package/src/components/MobileHeader.stories.tsx +205 -0
  84. package/src/components/MobileHeader.tsx +233 -0
  85. package/src/components/MobileLayout.stories.tsx +338 -0
  86. package/src/components/MobileLayout.tsx +313 -0
  87. package/src/components/Modal.stories.tsx +388 -0
  88. package/src/components/Modal.tsx +122 -4
  89. package/src/components/PageHeader.stories.tsx +198 -0
  90. package/src/components/PageHeader.tsx +217 -0
  91. package/src/components/PullToRefresh.stories.tsx +321 -0
  92. package/src/components/PullToRefresh.tsx +294 -0
  93. package/src/components/QueryTransparency.tsx +1 -1
  94. package/src/components/SearchableList.stories.tsx +437 -0
  95. package/src/components/SearchableList.tsx +326 -0
  96. package/src/components/Select.stories.tsx +190 -0
  97. package/src/components/Select.tsx +353 -137
  98. package/src/components/Sidebar.tsx +193 -10
  99. package/src/components/SwipeActions.stories.tsx +327 -0
  100. package/src/components/SwipeActions.tsx +387 -0
  101. package/src/components/Switch.stories.tsx +158 -0
  102. package/src/components/Switch.tsx +12 -3
  103. package/src/components/Textarea.tsx +31 -1
  104. package/src/components/index.ts +69 -3
  105. package/src/context/MobileContext.tsx +296 -0
  106. package/src/hooks/useResponsive.ts +360 -0
  107. package/src/types/index.ts +4 -0
  108. 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"}
@@ -30,7 +30,7 @@ export interface QueryTransparencyInfo {
30
30
  relatedData?: Array<{
31
31
  entity: string;
32
32
  description: string;
33
- type: 'join' | 'include' | 'lookup';
33
+ type: 'primary' | 'join' | 'include' | 'lookup';
34
34
  }>;
35
35
  calculations?: Array<{
36
36
  field: string;
@@ -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;KACrC,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"}
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 virtual scrolling
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 clear functionality.
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;AAGnG;;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;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,QAAA,MAAM,MAAM,kFA2YV,CAAC;AAGH,eAAe,MAAM,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
- export default function Sidebar({ items, onNavigate, className, header, footer, currentPath }: SidebarProps): import("react/jsx-runtime").JSX.Element;
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,KAAmB,MAAM,OAAO,CAAC;AAGxC,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;CACtB;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,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAc,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,YAAY,2CAsC/G"}
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":"AAGA,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,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,QAAA,MAAM,MAAM,0GA4FV,CAAC;AAGH,eAAe,MAAM,CAAC"}
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":"AAGA,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;CACnB;AAED,QAAA,MAAM,QAAQ,+GAmLb,CAAC;AAIF,eAAe,QAAQ,CAAC"}
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 { Show, Hide, useMediaQuery } from './ResponsiveUtilities';
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