@teja-app/ui 0.0.11 → 0.0.13

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 (246) hide show
  1. package/dist/hooks/index.d.ts +1 -1
  2. package/dist/hooks/index.d.ts.map +1 -1
  3. package/dist/hooks/useSidebar.d.ts +32 -1
  4. package/dist/hooks/useSidebar.d.ts.map +1 -1
  5. package/dist/index.cjs +0 -4879
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.ts +6 -3
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +0 -4863
  10. package/dist/index.js.map +1 -1
  11. package/dist/theme/components/Accordion.d.ts +75 -0
  12. package/dist/theme/components/Accordion.d.ts.map +1 -0
  13. package/dist/theme/components/Badge.d.ts +21 -1
  14. package/dist/theme/components/Badge.d.ts.map +1 -1
  15. package/dist/theme/components/Breadcrumbs.d.ts +53 -0
  16. package/dist/theme/components/Breadcrumbs.d.ts.map +1 -0
  17. package/dist/theme/components/Card.d.ts +37 -2
  18. package/dist/theme/components/Card.d.ts.map +1 -1
  19. package/dist/theme/components/Checkbox.d.ts +6 -1
  20. package/dist/theme/components/Checkbox.d.ts.map +1 -1
  21. package/dist/theme/components/DarkScope.d.ts +54 -0
  22. package/dist/theme/components/DarkScope.d.ts.map +1 -0
  23. package/dist/theme/components/Menu.d.ts +84 -0
  24. package/dist/theme/components/Menu.d.ts.map +1 -0
  25. package/dist/theme/components/OTPInput.d.ts +58 -0
  26. package/dist/theme/components/OTPInput.d.ts.map +1 -0
  27. package/dist/theme/components/PasswordInput.d.ts +48 -0
  28. package/dist/theme/components/PasswordInput.d.ts.map +1 -0
  29. package/dist/{components/PillSelector/PillSelector.types.d.ts → theme/components/PillSelector.d.ts} +21 -2
  30. package/dist/theme/components/PillSelector.d.ts.map +1 -0
  31. package/dist/theme/components/Radio.d.ts +89 -0
  32. package/dist/theme/components/Radio.d.ts.map +1 -0
  33. package/dist/theme/components/SegmentedControl.d.ts.map +1 -1
  34. package/dist/theme/components/SelectableCard.d.ts +34 -0
  35. package/dist/theme/components/SelectableCard.d.ts.map +1 -0
  36. package/dist/theme/components/SidebarNav/SidebarNav.d.ts +20 -0
  37. package/dist/theme/components/SidebarNav/SidebarNav.d.ts.map +1 -0
  38. package/dist/theme/components/SidebarNav/SidebarNavDivider.d.ts +8 -0
  39. package/dist/theme/components/SidebarNav/SidebarNavDivider.d.ts.map +1 -0
  40. package/dist/theme/components/SidebarNav/SidebarNavGroupRow.d.ts +8 -0
  41. package/dist/theme/components/SidebarNav/SidebarNavGroupRow.d.ts.map +1 -0
  42. package/dist/theme/components/SidebarNav/SidebarNavItemRow.d.ts +8 -0
  43. package/dist/theme/components/SidebarNav/SidebarNavItemRow.d.ts.map +1 -0
  44. package/dist/theme/components/SidebarNav/index.d.ts +12 -0
  45. package/dist/theme/components/SidebarNav/index.d.ts.map +1 -0
  46. package/dist/theme/components/SidebarNav/types.d.ts +157 -0
  47. package/dist/theme/components/SidebarNav/types.d.ts.map +1 -0
  48. package/dist/theme/components/Table.d.ts +70 -0
  49. package/dist/theme/components/Table.d.ts.map +1 -0
  50. package/dist/theme/components/Toast.d.ts +79 -0
  51. package/dist/theme/components/Toast.d.ts.map +1 -0
  52. package/dist/theme/components/ToggleChip.d.ts +38 -0
  53. package/dist/theme/components/ToggleChip.d.ts.map +1 -0
  54. package/dist/theme/components/Tooltip.d.ts +40 -0
  55. package/dist/theme/components/Tooltip.d.ts.map +1 -0
  56. package/dist/theme/components/index.d.ts +16 -1
  57. package/dist/theme/components/index.d.ts.map +1 -1
  58. package/dist/theme/index.cjs +15555 -2528
  59. package/dist/theme/index.cjs.map +1 -1
  60. package/dist/theme/index.js +17345 -4334
  61. package/dist/theme/index.js.map +1 -1
  62. package/dist/ui.css +159 -159
  63. package/dist/useSidebar-BWe09WbE.js.map +1 -1
  64. package/dist/useSidebar-d1VZFhxd.cjs.map +1 -1
  65. package/package.json +1 -1
  66. package/dist/components/Alert/Alert.d.ts +0 -13
  67. package/dist/components/Alert/Alert.d.ts.map +0 -1
  68. package/dist/components/Alert/Alert.types.d.ts +0 -17
  69. package/dist/components/Alert/Alert.types.d.ts.map +0 -1
  70. package/dist/components/Alert/index.d.ts +0 -3
  71. package/dist/components/Alert/index.d.ts.map +0 -1
  72. package/dist/components/Avatar/Avatar.d.ts +0 -13
  73. package/dist/components/Avatar/Avatar.d.ts.map +0 -1
  74. package/dist/components/Avatar/Avatar.types.d.ts +0 -18
  75. package/dist/components/Avatar/Avatar.types.d.ts.map +0 -1
  76. package/dist/components/Avatar/index.d.ts +0 -3
  77. package/dist/components/Avatar/index.d.ts.map +0 -1
  78. package/dist/components/Badge/Badge.d.ts +0 -13
  79. package/dist/components/Badge/Badge.d.ts.map +0 -1
  80. package/dist/components/Badge/Badge.types.d.ts +0 -14
  81. package/dist/components/Badge/Badge.types.d.ts.map +0 -1
  82. package/dist/components/Badge/index.d.ts +0 -3
  83. package/dist/components/Badge/index.d.ts.map +0 -1
  84. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +0 -18
  85. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts.map +0 -1
  86. package/dist/components/Breadcrumbs/Breadcrumbs.types.d.ts +0 -22
  87. package/dist/components/Breadcrumbs/Breadcrumbs.types.d.ts.map +0 -1
  88. package/dist/components/Breadcrumbs/index.d.ts +0 -3
  89. package/dist/components/Breadcrumbs/index.d.ts.map +0 -1
  90. package/dist/components/Button/Button.d.ts +0 -13
  91. package/dist/components/Button/Button.d.ts.map +0 -1
  92. package/dist/components/Button/Button.types.d.ts +0 -18
  93. package/dist/components/Button/Button.types.d.ts.map +0 -1
  94. package/dist/components/Button/index.d.ts +0 -3
  95. package/dist/components/Button/index.d.ts.map +0 -1
  96. package/dist/components/Card/Card.d.ts +0 -18
  97. package/dist/components/Card/Card.d.ts.map +0 -1
  98. package/dist/components/Card/Card.types.d.ts +0 -16
  99. package/dist/components/Card/Card.types.d.ts.map +0 -1
  100. package/dist/components/Card/index.d.ts +0 -3
  101. package/dist/components/Card/index.d.ts.map +0 -1
  102. package/dist/components/Checkbox/Checkbox.d.ts +0 -13
  103. package/dist/components/Checkbox/Checkbox.d.ts.map +0 -1
  104. package/dist/components/Checkbox/Checkbox.types.d.ts +0 -21
  105. package/dist/components/Checkbox/Checkbox.types.d.ts.map +0 -1
  106. package/dist/components/Checkbox/index.d.ts +0 -3
  107. package/dist/components/Checkbox/index.d.ts.map +0 -1
  108. package/dist/components/Combobox/Combobox.d.ts +0 -24
  109. package/dist/components/Combobox/Combobox.d.ts.map +0 -1
  110. package/dist/components/Combobox/Combobox.types.d.ts +0 -43
  111. package/dist/components/Combobox/Combobox.types.d.ts.map +0 -1
  112. package/dist/components/Combobox/index.d.ts +0 -3
  113. package/dist/components/Combobox/index.d.ts.map +0 -1
  114. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +0 -23
  115. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +0 -1
  116. package/dist/components/ConfirmDialog/ConfirmDialog.types.d.ts +0 -24
  117. package/dist/components/ConfirmDialog/ConfirmDialog.types.d.ts.map +0 -1
  118. package/dist/components/ConfirmDialog/index.d.ts +0 -3
  119. package/dist/components/ConfirmDialog/index.d.ts.map +0 -1
  120. package/dist/components/DateInput/DateInput.d.ts +0 -14
  121. package/dist/components/DateInput/DateInput.d.ts.map +0 -1
  122. package/dist/components/DateInput/DateInput.types.d.ts +0 -39
  123. package/dist/components/DateInput/DateInput.types.d.ts.map +0 -1
  124. package/dist/components/DateInput/index.d.ts +0 -3
  125. package/dist/components/DateInput/index.d.ts.map +0 -1
  126. package/dist/components/Drawer/Drawer.d.ts +0 -27
  127. package/dist/components/Drawer/Drawer.d.ts.map +0 -1
  128. package/dist/components/Drawer/Drawer.types.d.ts +0 -25
  129. package/dist/components/Drawer/Drawer.types.d.ts.map +0 -1
  130. package/dist/components/Drawer/index.d.ts +0 -3
  131. package/dist/components/Drawer/index.d.ts.map +0 -1
  132. package/dist/components/EmptyState/EmptyState.d.ts +0 -34
  133. package/dist/components/EmptyState/EmptyState.d.ts.map +0 -1
  134. package/dist/components/EmptyState/EmptyState.types.d.ts +0 -19
  135. package/dist/components/EmptyState/EmptyState.types.d.ts.map +0 -1
  136. package/dist/components/EmptyState/index.d.ts +0 -3
  137. package/dist/components/EmptyState/index.d.ts.map +0 -1
  138. package/dist/components/Input/Input.d.ts +0 -13
  139. package/dist/components/Input/Input.d.ts.map +0 -1
  140. package/dist/components/Input/Input.types.d.ts +0 -20
  141. package/dist/components/Input/Input.types.d.ts.map +0 -1
  142. package/dist/components/Input/index.d.ts +0 -3
  143. package/dist/components/Input/index.d.ts.map +0 -1
  144. package/dist/components/Modal/Modal.d.ts +0 -28
  145. package/dist/components/Modal/Modal.d.ts.map +0 -1
  146. package/dist/components/Modal/Modal.types.d.ts +0 -29
  147. package/dist/components/Modal/Modal.types.d.ts.map +0 -1
  148. package/dist/components/Modal/index.d.ts +0 -3
  149. package/dist/components/Modal/index.d.ts.map +0 -1
  150. package/dist/components/MultiSelect/MultiSelect.d.ts +0 -26
  151. package/dist/components/MultiSelect/MultiSelect.d.ts.map +0 -1
  152. package/dist/components/MultiSelect/MultiSelect.types.d.ts +0 -51
  153. package/dist/components/MultiSelect/MultiSelect.types.d.ts.map +0 -1
  154. package/dist/components/MultiSelect/index.d.ts +0 -3
  155. package/dist/components/MultiSelect/index.d.ts.map +0 -1
  156. package/dist/components/OTPInput/OTPInput.d.ts +0 -22
  157. package/dist/components/OTPInput/OTPInput.d.ts.map +0 -1
  158. package/dist/components/OTPInput/OTPInput.types.d.ts +0 -19
  159. package/dist/components/OTPInput/OTPInput.types.d.ts.map +0 -1
  160. package/dist/components/OTPInput/index.d.ts +0 -3
  161. package/dist/components/OTPInput/index.d.ts.map +0 -1
  162. package/dist/components/Pagination/Pagination.d.ts +0 -35
  163. package/dist/components/Pagination/Pagination.d.ts.map +0 -1
  164. package/dist/components/Pagination/Pagination.types.d.ts +0 -31
  165. package/dist/components/Pagination/Pagination.types.d.ts.map +0 -1
  166. package/dist/components/Pagination/index.d.ts +0 -3
  167. package/dist/components/Pagination/index.d.ts.map +0 -1
  168. package/dist/components/PasswordInput/PasswordInput.d.ts +0 -12
  169. package/dist/components/PasswordInput/PasswordInput.d.ts.map +0 -1
  170. package/dist/components/PasswordInput/PasswordInput.types.d.ts +0 -16
  171. package/dist/components/PasswordInput/PasswordInput.types.d.ts.map +0 -1
  172. package/dist/components/PasswordInput/index.d.ts +0 -3
  173. package/dist/components/PasswordInput/index.d.ts.map +0 -1
  174. package/dist/components/PillSelector/PillSelector.d.ts +0 -16
  175. package/dist/components/PillSelector/PillSelector.d.ts.map +0 -1
  176. package/dist/components/PillSelector/PillSelector.types.d.ts.map +0 -1
  177. package/dist/components/PillSelector/index.d.ts +0 -3
  178. package/dist/components/PillSelector/index.d.ts.map +0 -1
  179. package/dist/components/Radio/Radio.d.ts +0 -12
  180. package/dist/components/Radio/Radio.d.ts.map +0 -1
  181. package/dist/components/Radio/Radio.types.d.ts +0 -49
  182. package/dist/components/Radio/Radio.types.d.ts.map +0 -1
  183. package/dist/components/Radio/RadioGroup.d.ts +0 -23
  184. package/dist/components/Radio/RadioGroup.d.ts.map +0 -1
  185. package/dist/components/Radio/index.d.ts +0 -4
  186. package/dist/components/Radio/index.d.ts.map +0 -1
  187. package/dist/components/Select/Select.d.ts +0 -22
  188. package/dist/components/Select/Select.d.ts.map +0 -1
  189. package/dist/components/Select/Select.types.d.ts +0 -42
  190. package/dist/components/Select/Select.types.d.ts.map +0 -1
  191. package/dist/components/Select/index.d.ts +0 -3
  192. package/dist/components/Select/index.d.ts.map +0 -1
  193. package/dist/components/Sidebar/Sidebar.d.ts +0 -36
  194. package/dist/components/Sidebar/Sidebar.d.ts.map +0 -1
  195. package/dist/components/Sidebar/Sidebar.types.d.ts +0 -200
  196. package/dist/components/Sidebar/Sidebar.types.d.ts.map +0 -1
  197. package/dist/components/Sidebar/SidebarDivider.d.ts +0 -12
  198. package/dist/components/Sidebar/SidebarDivider.d.ts.map +0 -1
  199. package/dist/components/Sidebar/SidebarGroup.d.ts +0 -26
  200. package/dist/components/Sidebar/SidebarGroup.d.ts.map +0 -1
  201. package/dist/components/Sidebar/SidebarItem.d.ts +0 -23
  202. package/dist/components/Sidebar/SidebarItem.d.ts.map +0 -1
  203. package/dist/components/Sidebar/index.d.ts +0 -9
  204. package/dist/components/Sidebar/index.d.ts.map +0 -1
  205. package/dist/components/Skeleton/Skeleton.d.ts +0 -22
  206. package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
  207. package/dist/components/Skeleton/Skeleton.types.d.ts +0 -19
  208. package/dist/components/Skeleton/Skeleton.types.d.ts.map +0 -1
  209. package/dist/components/Skeleton/index.d.ts +0 -3
  210. package/dist/components/Skeleton/index.d.ts.map +0 -1
  211. package/dist/components/Spinner/Spinner.d.ts +0 -13
  212. package/dist/components/Spinner/Spinner.d.ts.map +0 -1
  213. package/dist/components/Spinner/Spinner.types.d.ts +0 -14
  214. package/dist/components/Spinner/Spinner.types.d.ts.map +0 -1
  215. package/dist/components/Spinner/index.d.ts +0 -3
  216. package/dist/components/Spinner/index.d.ts.map +0 -1
  217. package/dist/components/Table/Table.d.ts +0 -44
  218. package/dist/components/Table/Table.d.ts.map +0 -1
  219. package/dist/components/Table/Table.types.d.ts +0 -33
  220. package/dist/components/Table/Table.types.d.ts.map +0 -1
  221. package/dist/components/Table/index.d.ts +0 -3
  222. package/dist/components/Table/index.d.ts.map +0 -1
  223. package/dist/components/Tabs/Tabs.d.ts +0 -43
  224. package/dist/components/Tabs/Tabs.d.ts.map +0 -1
  225. package/dist/components/Tabs/Tabs.types.d.ts +0 -42
  226. package/dist/components/Tabs/Tabs.types.d.ts.map +0 -1
  227. package/dist/components/Tabs/index.d.ts +0 -3
  228. package/dist/components/Tabs/index.d.ts.map +0 -1
  229. package/dist/components/Textarea/Textarea.d.ts +0 -13
  230. package/dist/components/Textarea/Textarea.d.ts.map +0 -1
  231. package/dist/components/Textarea/Textarea.types.d.ts +0 -22
  232. package/dist/components/Textarea/Textarea.types.d.ts.map +0 -1
  233. package/dist/components/Textarea/index.d.ts +0 -3
  234. package/dist/components/Textarea/index.d.ts.map +0 -1
  235. package/dist/components/Toggle/Toggle.d.ts +0 -20
  236. package/dist/components/Toggle/Toggle.d.ts.map +0 -1
  237. package/dist/components/Toggle/Toggle.types.d.ts +0 -22
  238. package/dist/components/Toggle/Toggle.types.d.ts.map +0 -1
  239. package/dist/components/Toggle/index.d.ts +0 -3
  240. package/dist/components/Toggle/index.d.ts.map +0 -1
  241. package/dist/components/index.d.ts +0 -32
  242. package/dist/components/index.d.ts.map +0 -1
  243. package/dist/style-D6av97Pw.cjs +0 -10406
  244. package/dist/style-D6av97Pw.cjs.map +0 -1
  245. package/dist/style-DyXPy-7b.js +0 -10392
  246. package/dist/style-DyXPy-7b.js.map +0 -1
package/dist/ui.css CHANGED
@@ -1,3 +1,162 @@
1
+ /* ============================================================
2
+ Teja Design Tokens — "Clinical Calm"
3
+ Canonical CSS variable layer for the entire @teja-app/ui system.
4
+
5
+ These are sensible LIGHT defaults. ThemeProvider injects per-preset
6
+ overrides (primary/ai/surface/radius/font/density) on top, and writes
7
+ dark-mode overrides when `[data-theme="dark"]` is set on <html>.
8
+ ============================================================ */
9
+
10
+ :root {
11
+ /* ── Surfaces ─────────────────────────────────────────── */
12
+ --bg: oklch(0.985 0.003 250);
13
+ --surface-0: #ffffff;
14
+ --surface-1: oklch(0.978 0.004 250);
15
+ --surface-2: oklch(0.955 0.006 250);
16
+ --surface-3: oklch(0.925 0.008 250);
17
+ --sidebar: oklch(0.975 0.004 250);
18
+
19
+ /* ── Borders ──────────────────────────────────────────── */
20
+ --border: oklch(0.925 0.006 250);
21
+ --border-strong:oklch(0.86 0.008 250);
22
+ --divider: oklch(0.94 0.005 250);
23
+
24
+ /* ── Ink ──────────────────────────────────────────────── */
25
+ --ink-1: oklch(0.20 0.02 250);
26
+ --ink-2: oklch(0.42 0.018 250);
27
+ --ink-3: oklch(0.58 0.014 250);
28
+ --ink-4: oklch(0.72 0.010 250);
29
+ --ink-5: oklch(0.86 0.008 250);
30
+ --ink-on-primary: #ffffff;
31
+
32
+ /* ── Brand (default = clinical blue) ──────────────────── */
33
+ --primary: oklch(0.50 0.13 235);
34
+ --primary-hover:oklch(0.45 0.13 235);
35
+ --primary-soft: oklch(0.95 0.035 235);
36
+ --primary-ring: oklch(0.50 0.13 235 / 0.18);
37
+
38
+ /* ── Semantic ─────────────────────────────────────────── */
39
+ --success: oklch(0.56 0.11 162);
40
+ --success-soft: oklch(0.94 0.04 162);
41
+ --warning: oklch(0.66 0.13 75);
42
+ --warning-soft: oklch(0.95 0.05 75);
43
+ --danger: oklch(0.56 0.17 25);
44
+ --danger-soft: oklch(0.95 0.04 25);
45
+ --info: oklch(0.55 0.13 285);
46
+ --info-soft: oklch(0.95 0.04 285);
47
+
48
+ --neutral: var(--ink-2);
49
+ --neutral-soft: var(--surface-2);
50
+
51
+ /* ── AI accent (default = warm violet) ────────────────── */
52
+ --ai: oklch(0.55 0.18 305);
53
+ --ai-2: oklch(0.62 0.15 260);
54
+ --ai-soft: oklch(0.96 0.035 305);
55
+ --ai-tint: oklch(0.985 0.012 305);
56
+ --ai-ring: oklch(0.55 0.18 305 / 0.20);
57
+ --ai-gradient: linear-gradient(135deg, oklch(0.55 0.18 305), oklch(0.62 0.15 250));
58
+ --ai-gradient-soft: linear-gradient(135deg, oklch(0.965 0.04 305), oklch(0.97 0.03 250));
59
+ --ai-border: linear-gradient(135deg, oklch(0.55 0.18 305 / 0.35), oklch(0.62 0.15 250 / 0.35));
60
+
61
+ /* ── Radii ────────────────────────────────────────────── */
62
+ --r-xs: 4px;
63
+ --r-sm: 6px;
64
+ --r-md: 8px;
65
+ --r-lg: 12px;
66
+ --r-xl: 16px;
67
+ --r-2xl: 20px;
68
+ --r-pill: 999px;
69
+
70
+ /* ── Shadows (light) ──────────────────────────────────── */
71
+ --shadow-xs: 0 1px 0 rgba(16, 24, 40, 0.04);
72
+ --shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.06), 0 1px 3px rgba(16, 24, 40, 0.04);
73
+ --shadow-md: 0 4px 6px -1px rgba(16, 24, 40, 0.06), 0 2px 4px -2px rgba(16, 24, 40, 0.05);
74
+ --shadow-lg: 0 12px 20px -6px rgba(16, 24, 40, 0.08), 0 4px 8px -3px rgba(16, 24, 40, 0.05);
75
+ --shadow-pop:0 10px 30px -8px rgba(16, 24, 40, 0.14), 0 4px 8px -3px rgba(16, 24, 40, 0.06);
76
+
77
+ /* ── Type ─────────────────────────────────────────────── */
78
+ --font-sans: 'Geist', ui-sans-serif, -apple-system, sans-serif;
79
+ --font-mono: 'Geist Mono', ui-monospace, 'SF Mono', monospace;
80
+ --font-display: 'Geist', ui-sans-serif, sans-serif;
81
+ --track-heading: -0.02em;
82
+
83
+ --t-xs: 11px;
84
+ --t-sm: 12px;
85
+ --t-base: 13px;
86
+ --t-md: 14px;
87
+ --t-lg: 15px;
88
+ --t-xl: 18px;
89
+ --t-2xl: 22px;
90
+ --t-3xl: 28px;
91
+ --t-4xl: 36px;
92
+
93
+ /* ── Spacing (4px base) ───────────────────────────────── */
94
+ --s-1: 4px;
95
+ --s-2: 8px;
96
+ --s-3: 12px;
97
+ --s-4: 16px;
98
+ --s-5: 20px;
99
+ --s-6: 24px;
100
+ --s-8: 32px;
101
+ --s-10:40px;
102
+ --s-12:48px;
103
+
104
+ /* ── Z-index layers (preserved from legacy preset) ────── */
105
+ --z-sticky: 20;
106
+ --z-drawer: 30;
107
+ --z-modal: 40;
108
+ --z-toast: 50;
109
+ --z-tooltip: 60;
110
+ --z-dropdown: 100;
111
+
112
+ color-scheme: light;
113
+ }
114
+
115
+ /* ────────────────────────────────────────────────────────
116
+ Dark mode — applied when <html data-theme="dark">.
117
+ Inverted elevation (surfaces lift LIGHTER on hover/selected,
118
+ like macOS). Semantic colors lift for AA contrast.
119
+ ──────────────────────────────────────────────────────── */
120
+ [data-theme="dark"] {
121
+ --bg: oklch(0.205 0.008 250);
122
+ --surface-0: oklch(0.165 0.010 250);
123
+ --surface-1: oklch(0.185 0.009 250);
124
+ --surface-2: oklch(0.255 0.011 250);
125
+ --surface-3: oklch(0.300 0.013 250);
126
+ --sidebar: oklch(0.175 0.009 250);
127
+
128
+ --border: oklch(0.305 0.012 250);
129
+ --border-strong:oklch(0.430 0.014 250);
130
+ --divider: oklch(0.255 0.010 250);
131
+
132
+ --ink-1: oklch(0.965 0.005 250);
133
+ --ink-2: oklch(0.780 0.010 250);
134
+ --ink-3: oklch(0.620 0.012 250);
135
+ --ink-4: oklch(0.470 0.010 250);
136
+ --ink-5: oklch(0.350 0.012 250);
137
+
138
+ --primary-soft: oklch(0.30 0.07 235);
139
+
140
+ --success: oklch(0.70 0.13 162);
141
+ --success-soft: oklch(0.30 0.06 162);
142
+ --warning: oklch(0.78 0.13 75);
143
+ --warning-soft: oklch(0.32 0.07 75);
144
+ --danger: oklch(0.70 0.17 25);
145
+ --danger-soft: oklch(0.32 0.08 25);
146
+ --info: oklch(0.70 0.13 285);
147
+ --info-soft: oklch(0.30 0.07 285);
148
+
149
+ --ai-soft: oklch(0.30 0.08 305);
150
+ --ai-tint: oklch(0.22 0.04 305);
151
+
152
+ --shadow-xs: 0 1px 0 rgba(0, 0, 0, 0.35);
153
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.45), 0 1px 3px rgba(0, 0, 0, 0.30);
154
+ --shadow-md: 0 4px 8px -1px rgba(0, 0, 0, 0.55), 0 2px 4px -2px rgba(0, 0, 0, 0.40);
155
+ --shadow-lg: 0 12px 24px -6px rgba(0, 0, 0, 0.60), 0 4px 10px -3px rgba(0, 0, 0, 0.45);
156
+ --shadow-pop: 0 14px 34px -8px rgba(0, 0, 0, 0.70), 0 4px 10px -3px rgba(0, 0, 0, 0.50);
157
+
158
+ color-scheme: dark;
159
+ }
1
160
  /* Variables declaration */
2
161
  .rdp-root {
3
162
  --rdp-accent-color: blue; /* The accent color used for selected days and UI elements. */
@@ -455,162 +614,3 @@
455
614
  animation: rdp-fade_out var(--rdp-animation_duration)
456
615
  var(--rdp-animation_timing) forwards;
457
616
  }
458
- /* ============================================================
459
- Teja Design Tokens — "Clinical Calm"
460
- Canonical CSS variable layer for the entire @teja-app/ui system.
461
-
462
- These are sensible LIGHT defaults. ThemeProvider injects per-preset
463
- overrides (primary/ai/surface/radius/font/density) on top, and writes
464
- dark-mode overrides when `[data-theme="dark"]` is set on <html>.
465
- ============================================================ */
466
-
467
- :root {
468
- /* ── Surfaces ─────────────────────────────────────────── */
469
- --bg: oklch(0.985 0.003 250);
470
- --surface-0: #ffffff;
471
- --surface-1: oklch(0.978 0.004 250);
472
- --surface-2: oklch(0.955 0.006 250);
473
- --surface-3: oklch(0.925 0.008 250);
474
- --sidebar: oklch(0.975 0.004 250);
475
-
476
- /* ── Borders ──────────────────────────────────────────── */
477
- --border: oklch(0.925 0.006 250);
478
- --border-strong:oklch(0.86 0.008 250);
479
- --divider: oklch(0.94 0.005 250);
480
-
481
- /* ── Ink ──────────────────────────────────────────────── */
482
- --ink-1: oklch(0.20 0.02 250);
483
- --ink-2: oklch(0.42 0.018 250);
484
- --ink-3: oklch(0.58 0.014 250);
485
- --ink-4: oklch(0.72 0.010 250);
486
- --ink-5: oklch(0.86 0.008 250);
487
- --ink-on-primary: #ffffff;
488
-
489
- /* ── Brand (default = clinical blue) ──────────────────── */
490
- --primary: oklch(0.50 0.13 235);
491
- --primary-hover:oklch(0.45 0.13 235);
492
- --primary-soft: oklch(0.95 0.035 235);
493
- --primary-ring: oklch(0.50 0.13 235 / 0.18);
494
-
495
- /* ── Semantic ─────────────────────────────────────────── */
496
- --success: oklch(0.56 0.11 162);
497
- --success-soft: oklch(0.94 0.04 162);
498
- --warning: oklch(0.66 0.13 75);
499
- --warning-soft: oklch(0.95 0.05 75);
500
- --danger: oklch(0.56 0.17 25);
501
- --danger-soft: oklch(0.95 0.04 25);
502
- --info: oklch(0.55 0.13 285);
503
- --info-soft: oklch(0.95 0.04 285);
504
-
505
- --neutral: var(--ink-2);
506
- --neutral-soft: var(--surface-2);
507
-
508
- /* ── AI accent (default = warm violet) ────────────────── */
509
- --ai: oklch(0.55 0.18 305);
510
- --ai-2: oklch(0.62 0.15 260);
511
- --ai-soft: oklch(0.96 0.035 305);
512
- --ai-tint: oklch(0.985 0.012 305);
513
- --ai-ring: oklch(0.55 0.18 305 / 0.20);
514
- --ai-gradient: linear-gradient(135deg, oklch(0.55 0.18 305), oklch(0.62 0.15 250));
515
- --ai-gradient-soft: linear-gradient(135deg, oklch(0.965 0.04 305), oklch(0.97 0.03 250));
516
- --ai-border: linear-gradient(135deg, oklch(0.55 0.18 305 / 0.35), oklch(0.62 0.15 250 / 0.35));
517
-
518
- /* ── Radii ────────────────────────────────────────────── */
519
- --r-xs: 4px;
520
- --r-sm: 6px;
521
- --r-md: 8px;
522
- --r-lg: 12px;
523
- --r-xl: 16px;
524
- --r-2xl: 20px;
525
- --r-pill: 999px;
526
-
527
- /* ── Shadows (light) ──────────────────────────────────── */
528
- --shadow-xs: 0 1px 0 rgba(16, 24, 40, 0.04);
529
- --shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.06), 0 1px 3px rgba(16, 24, 40, 0.04);
530
- --shadow-md: 0 4px 6px -1px rgba(16, 24, 40, 0.06), 0 2px 4px -2px rgba(16, 24, 40, 0.05);
531
- --shadow-lg: 0 12px 20px -6px rgba(16, 24, 40, 0.08), 0 4px 8px -3px rgba(16, 24, 40, 0.05);
532
- --shadow-pop:0 10px 30px -8px rgba(16, 24, 40, 0.14), 0 4px 8px -3px rgba(16, 24, 40, 0.06);
533
-
534
- /* ── Type ─────────────────────────────────────────────── */
535
- --font-sans: 'Geist', ui-sans-serif, -apple-system, sans-serif;
536
- --font-mono: 'Geist Mono', ui-monospace, 'SF Mono', monospace;
537
- --font-display: 'Geist', ui-sans-serif, sans-serif;
538
- --track-heading: -0.02em;
539
-
540
- --t-xs: 11px;
541
- --t-sm: 12px;
542
- --t-base: 13px;
543
- --t-md: 14px;
544
- --t-lg: 15px;
545
- --t-xl: 18px;
546
- --t-2xl: 22px;
547
- --t-3xl: 28px;
548
- --t-4xl: 36px;
549
-
550
- /* ── Spacing (4px base) ───────────────────────────────── */
551
- --s-1: 4px;
552
- --s-2: 8px;
553
- --s-3: 12px;
554
- --s-4: 16px;
555
- --s-5: 20px;
556
- --s-6: 24px;
557
- --s-8: 32px;
558
- --s-10:40px;
559
- --s-12:48px;
560
-
561
- /* ── Z-index layers (preserved from legacy preset) ────── */
562
- --z-sticky: 20;
563
- --z-drawer: 30;
564
- --z-modal: 40;
565
- --z-toast: 50;
566
- --z-tooltip: 60;
567
- --z-dropdown: 100;
568
-
569
- color-scheme: light;
570
- }
571
-
572
- /* ────────────────────────────────────────────────────────
573
- Dark mode — applied when <html data-theme="dark">.
574
- Inverted elevation (surfaces lift LIGHTER on hover/selected,
575
- like macOS). Semantic colors lift for AA contrast.
576
- ──────────────────────────────────────────────────────── */
577
- [data-theme="dark"] {
578
- --bg: oklch(0.205 0.008 250);
579
- --surface-0: oklch(0.165 0.010 250);
580
- --surface-1: oklch(0.185 0.009 250);
581
- --surface-2: oklch(0.255 0.011 250);
582
- --surface-3: oklch(0.300 0.013 250);
583
- --sidebar: oklch(0.175 0.009 250);
584
-
585
- --border: oklch(0.305 0.012 250);
586
- --border-strong:oklch(0.430 0.014 250);
587
- --divider: oklch(0.255 0.010 250);
588
-
589
- --ink-1: oklch(0.965 0.005 250);
590
- --ink-2: oklch(0.780 0.010 250);
591
- --ink-3: oklch(0.620 0.012 250);
592
- --ink-4: oklch(0.470 0.010 250);
593
- --ink-5: oklch(0.350 0.012 250);
594
-
595
- --primary-soft: oklch(0.30 0.07 235);
596
-
597
- --success: oklch(0.70 0.13 162);
598
- --success-soft: oklch(0.30 0.06 162);
599
- --warning: oklch(0.78 0.13 75);
600
- --warning-soft: oklch(0.32 0.07 75);
601
- --danger: oklch(0.70 0.17 25);
602
- --danger-soft: oklch(0.32 0.08 25);
603
- --info: oklch(0.70 0.13 285);
604
- --info-soft: oklch(0.30 0.07 285);
605
-
606
- --ai-soft: oklch(0.30 0.08 305);
607
- --ai-tint: oklch(0.22 0.04 305);
608
-
609
- --shadow-xs: 0 1px 0 rgba(0, 0, 0, 0.35);
610
- --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.45), 0 1px 3px rgba(0, 0, 0, 0.30);
611
- --shadow-md: 0 4px 8px -1px rgba(0, 0, 0, 0.55), 0 2px 4px -2px rgba(0, 0, 0, 0.40);
612
- --shadow-lg: 0 12px 24px -6px rgba(0, 0, 0, 0.60), 0 4px 10px -3px rgba(0, 0, 0, 0.45);
613
- --shadow-pop: 0 14px 34px -8px rgba(0, 0, 0, 0.70), 0 4px 10px -3px rgba(0, 0, 0, 0.50);
614
-
615
- color-scheme: dark;
616
- }
@@ -1 +1 @@
1
- {"version":3,"file":"useSidebar-BWe09WbE.js","sources":["../src/hooks/useDebounce.ts","../src/hooks/useTable.ts","../src/hooks/useSelection.ts","../src/hooks/useSidebar.ts"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\n\n/**\n * Debounces a value, returning the debounced value after the specified delay.\n *\n * @param value - The value to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns The debounced value\n *\n * @example\n * ```tsx\n * const [searchTerm, setSearchTerm] = useState('');\n * const debouncedSearch = useDebounce(searchTerm, 300);\n *\n * useEffect(() => {\n * // This will only run after the user stops typing for 300ms\n * fetchResults(debouncedSearch);\n * }, [debouncedSearch]);\n * ```\n */\nexport function useDebounce<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n/**\n * Returns a debounced version of the provided callback function.\n *\n * @param callback - The function to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns A debounced version of the callback\n *\n * @example\n * ```tsx\n * const handleSearch = useDebouncedCallback((query: string) => {\n * fetchSearchResults(query);\n * }, 300);\n *\n * // In your component:\n * <input onChange={(e) => handleSearch(e.target.value)} />\n * ```\n */\nexport function useDebouncedCallback<T extends (...args: Parameters<T>) => ReturnType<T>>(\n callback: T,\n delay: number = 300\n): (...args: Parameters<T>) => void {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const callbackRef = useRef(callback);\n\n // Update callback ref on each render to always use latest callback\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n const debouncedCallback = useCallback(\n (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callbackRef.current(...args);\n }, delay);\n },\n [delay]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return debouncedCallback;\n}\n\n/**\n * Returns a debounced callback with cancel functionality.\n *\n * @param callback - The function to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns An object with the debounced callback and cancel/flush methods\n *\n * @example\n * ```tsx\n * const { debouncedFn, cancel, flush } = useDebouncedCallbackWithControl(\n * (query: string) => fetchResults(query),\n * 300\n * );\n *\n * // Cancel pending execution\n * cancel();\n *\n * // Execute immediately\n * flush();\n * ```\n */\nexport function useDebouncedCallbackWithControl<T extends (...args: Parameters<T>) => ReturnType<T>>(\n callback: T,\n delay: number = 300\n): {\n debouncedFn: (...args: Parameters<T>) => void;\n cancel: () => void;\n flush: () => void;\n isPending: () => boolean;\n} {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const callbackRef = useRef(callback);\n const argsRef = useRef<Parameters<T> | null>(null);\n\n // Update callback ref on each render\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n const cancel = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n argsRef.current = null;\n }\n }, []);\n\n const flush = useCallback(() => {\n if (timeoutRef.current && argsRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n const args = argsRef.current;\n argsRef.current = null;\n callbackRef.current(...(args as Parameters<T>));\n }\n }, []);\n\n const isPending = useCallback(() => {\n return timeoutRef.current !== null;\n }, []);\n\n const debouncedFn = useCallback(\n (...args: Parameters<T>) => {\n argsRef.current = args;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = null;\n argsRef.current = null;\n callbackRef.current(...args);\n }, delay);\n },\n [delay]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cancel();\n };\n }, [cancel]);\n\n return { debouncedFn, cancel, flush, isPending };\n}\n","import { useState, useMemo, useCallback } from 'react';\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface SortState {\n column: string | null;\n direction: SortDirection;\n}\n\nexport interface UseTableOptions<T> {\n /** The data array to manage */\n data: T[];\n\n /** Initial sort column */\n initialSortColumn?: string;\n\n /** Initial sort direction */\n initialSortDirection?: SortDirection;\n\n /** Initial page (1-based) */\n initialPage?: number;\n\n /** Initial page size */\n initialPageSize?: number;\n\n /** Enable server-side mode (disables client-side sorting/pagination) */\n serverSide?: boolean;\n\n /** Callback when sort changes (server-side mode) */\n onSort?: (column: string, direction: SortDirection) => void;\n\n /** Callback when page changes (server-side mode) */\n onPageChange?: (page: number) => void;\n\n /** Callback when page size changes (server-side mode) */\n onPageSizeChange?: (pageSize: number) => void;\n\n /** Custom sort function for client-side sorting */\n sortFn?: (data: T[], column: string, direction: SortDirection) => T[];\n\n /** Key extractor for getting sortable value from item */\n getValueByColumn?: (item: T, column: string) => unknown;\n\n /** Total items count (for server-side pagination) */\n totalItems?: number;\n}\n\nexport interface UseTableReturn<T> {\n /** Current page data (paginated if not server-side) */\n pageData: T[];\n\n /** All sorted data (before pagination) */\n sortedData: T[];\n\n /** Current sort column */\n sortColumn: string | null;\n\n /** Current sort direction */\n sortDirection: SortDirection;\n\n /** Handle sort - toggles direction if same column, resets to asc if different */\n handleSort: (column: string) => void;\n\n /** Set sort directly */\n setSort: (column: string | null, direction: SortDirection) => void;\n\n /** Current page (1-based) */\n currentPage: number;\n\n /** Current page size */\n pageSize: number;\n\n /** Total number of pages */\n totalPages: number;\n\n /** Total items count */\n totalItems: number;\n\n /** Go to specific page */\n goToPage: (page: number) => void;\n\n /** Go to next page */\n nextPage: () => void;\n\n /** Go to previous page */\n previousPage: () => void;\n\n /** Set page size */\n setPageSize: (size: number) => void;\n\n /** Reset to initial state */\n reset: () => void;\n\n /** Whether currently on first page */\n isFirstPage: boolean;\n\n /** Whether currently on last page */\n isLastPage: boolean;\n}\n\n/**\n * Hook for managing table state including sorting and pagination.\n * Supports both client-side and server-side modes.\n *\n * @example\n * ```tsx\n * // Client-side (default)\n * const { pageData, sortColumn, sortDirection, handleSort, currentPage, goToPage } = useTable({\n * data: users,\n * initialPageSize: 10,\n * });\n *\n * // Server-side\n * const { handleSort, goToPage } = useTable({\n * data: users,\n * serverSide: true,\n * totalItems: 1000,\n * onSort: (col, dir) => fetchUsers({ sort: col, order: dir }),\n * onPageChange: (page) => fetchUsers({ page }),\n * });\n * ```\n */\nexport function useTable<T>({\n data,\n initialSortColumn,\n initialSortDirection = 'asc',\n initialPage = 1,\n initialPageSize = 10,\n serverSide = false,\n onSort,\n onPageChange,\n onPageSizeChange,\n sortFn,\n getValueByColumn,\n totalItems: totalItemsProp,\n}: UseTableOptions<T>): UseTableReturn<T> {\n // Sort state\n const [sortState, setSortState] = useState<SortState>({\n column: initialSortColumn ?? null,\n direction: initialSortDirection,\n });\n\n // Pagination state\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [pageSize, setPageSizeState] = useState(initialPageSize);\n\n // Default value extractor\n const defaultGetValue = useCallback((item: T, column: string): unknown => {\n return (item as Record<string, unknown>)[column];\n }, []);\n\n const getValue = getValueByColumn ?? defaultGetValue;\n\n // Default sort function\n const defaultSortFn = useCallback(\n (items: T[], column: string, direction: SortDirection): T[] => {\n return [...items].sort((a, b) => {\n const aVal = getValue(a, column);\n const bVal = getValue(b, column);\n\n // Handle null/undefined\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return direction === 'asc' ? 1 : -1;\n if (bVal == null) return direction === 'asc' ? -1 : 1;\n\n // String comparison\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n const comparison = aVal.localeCompare(bVal);\n return direction === 'asc' ? comparison : -comparison;\n }\n\n // Number comparison\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return direction === 'asc' ? aVal - bVal : bVal - aVal;\n }\n\n // Date comparison\n if (aVal instanceof Date && bVal instanceof Date) {\n return direction === 'asc'\n ? aVal.getTime() - bVal.getTime()\n : bVal.getTime() - aVal.getTime();\n }\n\n // Boolean comparison\n if (typeof aVal === 'boolean' && typeof bVal === 'boolean') {\n const comparison = aVal === bVal ? 0 : aVal ? -1 : 1;\n return direction === 'asc' ? comparison : -comparison;\n }\n\n // Fallback to string comparison\n const aStr = String(aVal);\n const bStr = String(bVal);\n const comparison = aStr.localeCompare(bStr);\n return direction === 'asc' ? comparison : -comparison;\n });\n },\n [getValue]\n );\n\n const sort = sortFn ?? defaultSortFn;\n\n // Sorted data (client-side only)\n const sortedData = useMemo(() => {\n if (serverSide || !sortState.column) {\n return data;\n }\n return sort(data, sortState.column, sortState.direction);\n }, [data, serverSide, sortState.column, sortState.direction, sort]);\n\n // Total items\n const totalItems = serverSide ? (totalItemsProp ?? data.length) : data.length;\n\n // Total pages\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));\n\n // Paginated data (client-side only)\n const pageData = useMemo(() => {\n if (serverSide) {\n return data;\n }\n const startIndex = (currentPage - 1) * pageSize;\n return sortedData.slice(startIndex, startIndex + pageSize);\n }, [serverSide, sortedData, currentPage, pageSize, data]);\n\n // Handle sort\n const handleSort = useCallback(\n (column: string) => {\n const newDirection: SortDirection =\n sortState.column === column && sortState.direction === 'asc' ? 'desc' : 'asc';\n\n setSortState({ column, direction: newDirection });\n\n if (serverSide && onSort) {\n onSort(column, newDirection);\n }\n\n // Reset to first page on sort change\n if (!serverSide) {\n setCurrentPage(1);\n }\n },\n [sortState.column, sortState.direction, serverSide, onSort]\n );\n\n // Set sort directly\n const setSort = useCallback(\n (column: string | null, direction: SortDirection) => {\n setSortState({ column, direction });\n if (serverSide && onSort && column) {\n onSort(column, direction);\n }\n },\n [serverSide, onSort]\n );\n\n // Go to specific page\n const goToPage = useCallback(\n (page: number) => {\n const validPage = Math.max(1, Math.min(page, totalPages));\n setCurrentPage(validPage);\n if (serverSide && onPageChange) {\n onPageChange(validPage);\n }\n },\n [totalPages, serverSide, onPageChange]\n );\n\n // Next page\n const nextPage = useCallback(() => {\n if (currentPage < totalPages) {\n goToPage(currentPage + 1);\n }\n }, [currentPage, totalPages, goToPage]);\n\n // Previous page\n const previousPage = useCallback(() => {\n if (currentPage > 1) {\n goToPage(currentPage - 1);\n }\n }, [currentPage, goToPage]);\n\n // Set page size\n const setPageSize = useCallback(\n (size: number) => {\n setPageSizeState(size);\n setCurrentPage(1); // Reset to first page\n if (serverSide && onPageSizeChange) {\n onPageSizeChange(size);\n }\n },\n [serverSide, onPageSizeChange]\n );\n\n // Reset to initial state\n const reset = useCallback(() => {\n setSortState({\n column: initialSortColumn ?? null,\n direction: initialSortDirection,\n });\n setCurrentPage(initialPage);\n setPageSizeState(initialPageSize);\n }, [initialSortColumn, initialSortDirection, initialPage, initialPageSize]);\n\n return {\n pageData,\n sortedData,\n sortColumn: sortState.column,\n sortDirection: sortState.direction,\n handleSort,\n setSort,\n currentPage,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n previousPage,\n setPageSize,\n reset,\n isFirstPage: currentPage === 1,\n isLastPage: currentPage >= totalPages,\n };\n}\n","import { useState, useMemo, useCallback } from 'react';\n\nexport interface UseSelectionOptions<T, K extends string | number = string> {\n /** Array of items to select from */\n items: T[];\n\n /** Function to get the unique identifier from an item */\n getItemId: (item: T) => K;\n\n /** Initial selected IDs */\n initialSelected?: K[];\n\n /** Callback when selection changes */\n onSelectionChange?: (selectedIds: K[]) => void;\n\n /** Optional filter for selectable items (e.g., exclude disabled items) */\n isSelectable?: (item: T) => boolean;\n}\n\nexport interface UseSelectionReturn<K extends string | number = string> {\n /** Currently selected IDs */\n selectedIds: K[];\n\n /** Set of selected IDs for O(1) lookup */\n selectedSet: Set<K>;\n\n /** Number of selected items */\n selectedCount: number;\n\n /** Whether all selectable items are selected */\n allSelected: boolean;\n\n /** Whether some (but not all) items are selected */\n someSelected: boolean;\n\n /** Whether no items are selected */\n noneSelected: boolean;\n\n /** Check if a specific item is selected */\n isSelected: (id: K) => boolean;\n\n /** Toggle selection for a single item */\n toggle: (id: K) => void;\n\n /** Select a single item */\n select: (id: K) => void;\n\n /** Deselect a single item */\n deselect: (id: K) => void;\n\n /** Select all selectable items */\n selectAll: () => void;\n\n /** Clear all selections */\n clearSelection: () => void;\n\n /** Toggle between select all and clear all */\n toggleAll: () => void;\n\n /** Select multiple items */\n selectMany: (ids: K[]) => void;\n\n /** Deselect multiple items */\n deselectMany: (ids: K[]) => void;\n\n /** Replace selection with new IDs */\n setSelection: (ids: K[]) => void;\n\n /** Get selected items from the original array */\n getSelectedItems: () => unknown[];\n}\n\n/**\n * Hook for managing batch selection in tables and lists.\n *\n * @example\n * ```tsx\n * const {\n * selectedIds,\n * allSelected,\n * someSelected,\n * isSelected,\n * toggle,\n * selectAll,\n * clearSelection,\n * toggleAll,\n * } = useSelection({\n * items: users,\n * getItemId: (user) => user.id,\n * isSelectable: (user) => !user.disabled,\n * });\n *\n * // In table header:\n * <Checkbox\n * checked={allSelected}\n * indeterminate={someSelected && !allSelected}\n * onChange={toggleAll}\n * />\n *\n * // In table row:\n * <Checkbox\n * checked={isSelected(user.id)}\n * onChange={() => toggle(user.id)}\n * />\n * ```\n */\nexport function useSelection<T, K extends string | number = string>({\n items,\n getItemId,\n initialSelected = [],\n onSelectionChange,\n isSelectable = () => true,\n}: UseSelectionOptions<T, K>): UseSelectionReturn<K> {\n const [selectedIds, setSelectedIds] = useState<K[]>(initialSelected);\n\n // Selected set for O(1) lookup\n const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\n // Get selectable items\n const selectableItems = useMemo(\n () => items.filter(isSelectable),\n [items, isSelectable]\n );\n\n // Get selectable IDs\n const selectableIds = useMemo(\n () => selectableItems.map(getItemId),\n [selectableItems, getItemId]\n );\n\n // Computed states\n const selectedCount = selectedIds.length;\n const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selectedSet.has(id));\n const someSelected = selectedIds.length > 0;\n const noneSelected = selectedIds.length === 0;\n\n // Update selection and call callback\n const updateSelection = useCallback(\n (newIds: K[]) => {\n setSelectedIds(newIds);\n onSelectionChange?.(newIds);\n },\n [onSelectionChange]\n );\n\n // Check if item is selected\n const isSelected = useCallback((id: K) => selectedSet.has(id), [selectedSet]);\n\n // Toggle single item\n const toggle = useCallback(\n (id: K) => {\n if (selectedSet.has(id)) {\n updateSelection(selectedIds.filter((selectedId) => selectedId !== id));\n } else {\n updateSelection([...selectedIds, id]);\n }\n },\n [selectedIds, selectedSet, updateSelection]\n );\n\n // Select single item\n const select = useCallback(\n (id: K) => {\n if (!selectedSet.has(id)) {\n updateSelection([...selectedIds, id]);\n }\n },\n [selectedIds, selectedSet, updateSelection]\n );\n\n // Deselect single item\n const deselect = useCallback(\n (id: K) => {\n if (selectedSet.has(id)) {\n updateSelection(selectedIds.filter((selectedId) => selectedId !== id));\n }\n },\n [selectedIds, selectedSet, updateSelection]\n );\n\n // Select all selectable items\n const selectAll = useCallback(() => {\n const newSelectedSet = new Set(selectedIds);\n selectableIds.forEach((id) => newSelectedSet.add(id));\n updateSelection(Array.from(newSelectedSet));\n }, [selectedIds, selectableIds, updateSelection]);\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n updateSelection([]);\n }, [updateSelection]);\n\n // Toggle all\n const toggleAll = useCallback(() => {\n if (allSelected) {\n // Deselect all selectable items (keep non-selectable items selected if any)\n const selectableIdSet = new Set(selectableIds);\n updateSelection(selectedIds.filter((id) => !selectableIdSet.has(id)));\n } else {\n selectAll();\n }\n }, [allSelected, selectAll, selectedIds, selectableIds, updateSelection]);\n\n // Select multiple items\n const selectMany = useCallback(\n (ids: K[]) => {\n const newSelectedSet = new Set(selectedIds);\n ids.forEach((id) => newSelectedSet.add(id));\n updateSelection(Array.from(newSelectedSet));\n },\n [selectedIds, updateSelection]\n );\n\n // Deselect multiple items\n const deselectMany = useCallback(\n (ids: K[]) => {\n const idsToRemove = new Set(ids);\n updateSelection(selectedIds.filter((id) => !idsToRemove.has(id)));\n },\n [selectedIds, updateSelection]\n );\n\n // Replace selection\n const setSelection = useCallback(\n (ids: K[]) => {\n updateSelection(ids);\n },\n [updateSelection]\n );\n\n // Get selected items\n const getSelectedItems = useCallback(() => {\n return items.filter((item) => selectedSet.has(getItemId(item)));\n }, [items, selectedSet, getItemId]);\n\n return {\n selectedIds,\n selectedSet,\n selectedCount,\n allSelected,\n someSelected,\n noneSelected,\n isSelected,\n toggle,\n select,\n deselect,\n selectAll,\n clearSelection,\n toggleAll,\n selectMany,\n deselectMany,\n setSelection,\n getSelectedItems,\n };\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\nimport type { UseSidebarOptions, UseSidebarReturn } from '../components/Sidebar/Sidebar.types';\n\n/**\n * Check if we're running in a browser environment\n */\nconst isBrowser = typeof window !== 'undefined';\n\n/**\n * Get initial collapsed state from localStorage\n */\nfunction getInitialCollapsed(storageKey: string, defaultValue: boolean): boolean {\n if (!isBrowser) return defaultValue;\n\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored !== null) {\n return JSON.parse(stored);\n }\n } catch {\n // Ignore localStorage errors\n }\n\n return defaultValue;\n}\n\n/**\n * useSidebar hook manages sidebar state including open/collapsed states,\n * localStorage persistence, and responsive behavior.\n *\n * @example\n * ```tsx\n * function Layout() {\n * const {\n * isOpen,\n * toggle,\n * close,\n * collapsed,\n * toggleCollapsed,\n * isMobile,\n * handleNavigate,\n * } = useSidebar({\n * storageKey: 'sidebar-collapsed',\n * autoCloseOnMobile: true,\n * });\n *\n * return (\n * <>\n * <button onClick={toggle}>Toggle Menu</button>\n * <Sidebar\n * isOpen={isOpen}\n * onClose={close}\n * collapsed={collapsed}\n * onCollapsedChange={setCollapsed}\n * onNavigate={handleNavigate}\n * // ...\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function useSidebar(options: UseSidebarOptions = {}): UseSidebarReturn {\n const {\n defaultOpen = false,\n defaultCollapsed = false,\n storageKey = 'teja-sidebar-collapsed',\n mobileBreakpoint = 1024,\n autoCloseOnMobile = true,\n } = options;\n\n // Open state (for mobile drawer)\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n // Collapsed state (for desktop)\n const [collapsed, setCollapsedState] = useState(() =>\n getInitialCollapsed(storageKey, defaultCollapsed)\n );\n\n // Mobile detection\n const [isMobile, setIsMobile] = useState(() => {\n if (!isBrowser) return false;\n return window.innerWidth < mobileBreakpoint;\n });\n\n // Persist collapsed state to localStorage\n useEffect(() => {\n if (!isBrowser) return;\n\n try {\n localStorage.setItem(storageKey, JSON.stringify(collapsed));\n } catch {\n // Ignore localStorage errors\n }\n }, [collapsed, storageKey]);\n\n // Listen for window resize to detect mobile/desktop\n useEffect(() => {\n if (!isBrowser) return;\n\n const handleResize = () => {\n const mobile = window.innerWidth < mobileBreakpoint;\n setIsMobile(mobile);\n\n // Close mobile sidebar when switching to desktop\n if (!mobile && isOpen) {\n setIsOpen(false);\n }\n };\n\n // Use matchMedia for better performance\n const mediaQuery = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`);\n\n const handleChange = (event: MediaQueryListEvent) => {\n setIsMobile(event.matches);\n if (!event.matches && isOpen) {\n setIsOpen(false);\n }\n };\n\n // Modern browsers\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }\n\n // Fallback for older browsers\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [mobileBreakpoint, isOpen]);\n\n // Actions\n const toggle = useCallback(() => {\n setIsOpen((prev) => !prev);\n }, []);\n\n const open = useCallback(() => {\n setIsOpen(true);\n }, []);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggleCollapsed = useCallback(() => {\n setCollapsedState((prev) => !prev);\n }, []);\n\n const setCollapsed = useCallback((value: boolean) => {\n setCollapsedState(value);\n }, []);\n\n // Navigation handler that auto-closes on mobile\n const handleNavigate = useCallback(\n (_href: string) => {\n if (autoCloseOnMobile && isMobile) {\n setIsOpen(false);\n }\n },\n [autoCloseOnMobile, isMobile]\n );\n\n return useMemo(\n () => ({\n isOpen,\n toggle,\n open,\n close,\n collapsed,\n toggleCollapsed,\n setCollapsed,\n isMobile,\n handleNavigate,\n }),\n [\n isOpen,\n toggle,\n open,\n close,\n collapsed,\n toggleCollapsed,\n setCollapsed,\n isMobile,\n handleNavigate,\n ]\n );\n}\n"],"names":["comparison"],"mappings":"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"}
1
+ {"version":3,"file":"useSidebar-BWe09WbE.js","sources":["../src/hooks/useDebounce.ts","../src/hooks/useTable.ts","../src/hooks/useSelection.ts","../src/hooks/useSidebar.ts"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\n\n/**\n * Debounces a value, returning the debounced value after the specified delay.\n *\n * @param value - The value to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns The debounced value\n *\n * @example\n * ```tsx\n * const [searchTerm, setSearchTerm] = useState('');\n * const debouncedSearch = useDebounce(searchTerm, 300);\n *\n * useEffect(() => {\n * // This will only run after the user stops typing for 300ms\n * fetchResults(debouncedSearch);\n * }, [debouncedSearch]);\n * ```\n */\nexport function useDebounce<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n/**\n * Returns a debounced version of the provided callback function.\n *\n * @param callback - The function to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns A debounced version of the callback\n *\n * @example\n * ```tsx\n * const handleSearch = useDebouncedCallback((query: string) => {\n * fetchSearchResults(query);\n * }, 300);\n *\n * // In your component:\n * <input onChange={(e) => handleSearch(e.target.value)} />\n * ```\n */\nexport function useDebouncedCallback<T extends (...args: Parameters<T>) => ReturnType<T>>(\n callback: T,\n delay: number = 300\n): (...args: Parameters<T>) => void {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const callbackRef = useRef(callback);\n\n // Update callback ref on each render to always use latest callback\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n const debouncedCallback = useCallback(\n (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callbackRef.current(...args);\n }, delay);\n },\n [delay]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return debouncedCallback;\n}\n\n/**\n * Returns a debounced callback with cancel functionality.\n *\n * @param callback - The function to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns An object with the debounced callback and cancel/flush methods\n *\n * @example\n * ```tsx\n * const { debouncedFn, cancel, flush } = useDebouncedCallbackWithControl(\n * (query: string) => fetchResults(query),\n * 300\n * );\n *\n * // Cancel pending execution\n * cancel();\n *\n * // Execute immediately\n * flush();\n * ```\n */\nexport function useDebouncedCallbackWithControl<T extends (...args: Parameters<T>) => ReturnType<T>>(\n callback: T,\n delay: number = 300\n): {\n debouncedFn: (...args: Parameters<T>) => void;\n cancel: () => void;\n flush: () => void;\n isPending: () => boolean;\n} {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const callbackRef = useRef(callback);\n const argsRef = useRef<Parameters<T> | null>(null);\n\n // Update callback ref on each render\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n const cancel = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n argsRef.current = null;\n }\n }, []);\n\n const flush = useCallback(() => {\n if (timeoutRef.current && argsRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n const args = argsRef.current;\n argsRef.current = null;\n callbackRef.current(...(args as Parameters<T>));\n }\n }, []);\n\n const isPending = useCallback(() => {\n return timeoutRef.current !== null;\n }, []);\n\n const debouncedFn = useCallback(\n (...args: Parameters<T>) => {\n argsRef.current = args;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = null;\n argsRef.current = null;\n callbackRef.current(...args);\n }, delay);\n },\n [delay]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cancel();\n };\n }, [cancel]);\n\n return { debouncedFn, cancel, flush, isPending };\n}\n","import { useState, useMemo, useCallback } from 'react';\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface SortState {\n column: string | null;\n direction: SortDirection;\n}\n\nexport interface UseTableOptions<T> {\n /** The data array to manage */\n data: T[];\n\n /** Initial sort column */\n initialSortColumn?: string;\n\n /** Initial sort direction */\n initialSortDirection?: SortDirection;\n\n /** Initial page (1-based) */\n initialPage?: number;\n\n /** Initial page size */\n initialPageSize?: number;\n\n /** Enable server-side mode (disables client-side sorting/pagination) */\n serverSide?: boolean;\n\n /** Callback when sort changes (server-side mode) */\n onSort?: (column: string, direction: SortDirection) => void;\n\n /** Callback when page changes (server-side mode) */\n onPageChange?: (page: number) => void;\n\n /** Callback when page size changes (server-side mode) */\n onPageSizeChange?: (pageSize: number) => void;\n\n /** Custom sort function for client-side sorting */\n sortFn?: (data: T[], column: string, direction: SortDirection) => T[];\n\n /** Key extractor for getting sortable value from item */\n getValueByColumn?: (item: T, column: string) => unknown;\n\n /** Total items count (for server-side pagination) */\n totalItems?: number;\n}\n\nexport interface UseTableReturn<T> {\n /** Current page data (paginated if not server-side) */\n pageData: T[];\n\n /** All sorted data (before pagination) */\n sortedData: T[];\n\n /** Current sort column */\n sortColumn: string | null;\n\n /** Current sort direction */\n sortDirection: SortDirection;\n\n /** Handle sort - toggles direction if same column, resets to asc if different */\n handleSort: (column: string) => void;\n\n /** Set sort directly */\n setSort: (column: string | null, direction: SortDirection) => void;\n\n /** Current page (1-based) */\n currentPage: number;\n\n /** Current page size */\n pageSize: number;\n\n /** Total number of pages */\n totalPages: number;\n\n /** Total items count */\n totalItems: number;\n\n /** Go to specific page */\n goToPage: (page: number) => void;\n\n /** Go to next page */\n nextPage: () => void;\n\n /** Go to previous page */\n previousPage: () => void;\n\n /** Set page size */\n setPageSize: (size: number) => void;\n\n /** Reset to initial state */\n reset: () => void;\n\n /** Whether currently on first page */\n isFirstPage: boolean;\n\n /** Whether currently on last page */\n isLastPage: boolean;\n}\n\n/**\n * Hook for managing table state including sorting and pagination.\n * Supports both client-side and server-side modes.\n *\n * @example\n * ```tsx\n * // Client-side (default)\n * const { pageData, sortColumn, sortDirection, handleSort, currentPage, goToPage } = useTable({\n * data: users,\n * initialPageSize: 10,\n * });\n *\n * // Server-side\n * const { handleSort, goToPage } = useTable({\n * data: users,\n * serverSide: true,\n * totalItems: 1000,\n * onSort: (col, dir) => fetchUsers({ sort: col, order: dir }),\n * onPageChange: (page) => fetchUsers({ page }),\n * });\n * ```\n */\nexport function useTable<T>({\n data,\n initialSortColumn,\n initialSortDirection = 'asc',\n initialPage = 1,\n initialPageSize = 10,\n serverSide = false,\n onSort,\n onPageChange,\n onPageSizeChange,\n sortFn,\n getValueByColumn,\n totalItems: totalItemsProp,\n}: UseTableOptions<T>): UseTableReturn<T> {\n // Sort state\n const [sortState, setSortState] = useState<SortState>({\n column: initialSortColumn ?? null,\n direction: initialSortDirection,\n });\n\n // Pagination state\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [pageSize, setPageSizeState] = useState(initialPageSize);\n\n // Default value extractor\n const defaultGetValue = useCallback((item: T, column: string): unknown => {\n return (item as Record<string, unknown>)[column];\n }, []);\n\n const getValue = getValueByColumn ?? defaultGetValue;\n\n // Default sort function\n const defaultSortFn = useCallback(\n (items: T[], column: string, direction: SortDirection): T[] => {\n return [...items].sort((a, b) => {\n const aVal = getValue(a, column);\n const bVal = getValue(b, column);\n\n // Handle null/undefined\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return direction === 'asc' ? 1 : -1;\n if (bVal == null) return direction === 'asc' ? -1 : 1;\n\n // String comparison\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n const comparison = aVal.localeCompare(bVal);\n return direction === 'asc' ? comparison : -comparison;\n }\n\n // Number comparison\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return direction === 'asc' ? aVal - bVal : bVal - aVal;\n }\n\n // Date comparison\n if (aVal instanceof Date && bVal instanceof Date) {\n return direction === 'asc'\n ? aVal.getTime() - bVal.getTime()\n : bVal.getTime() - aVal.getTime();\n }\n\n // Boolean comparison\n if (typeof aVal === 'boolean' && typeof bVal === 'boolean') {\n const comparison = aVal === bVal ? 0 : aVal ? -1 : 1;\n return direction === 'asc' ? comparison : -comparison;\n }\n\n // Fallback to string comparison\n const aStr = String(aVal);\n const bStr = String(bVal);\n const comparison = aStr.localeCompare(bStr);\n return direction === 'asc' ? comparison : -comparison;\n });\n },\n [getValue]\n );\n\n const sort = sortFn ?? defaultSortFn;\n\n // Sorted data (client-side only)\n const sortedData = useMemo(() => {\n if (serverSide || !sortState.column) {\n return data;\n }\n return sort(data, sortState.column, sortState.direction);\n }, [data, serverSide, sortState.column, sortState.direction, sort]);\n\n // Total items\n const totalItems = serverSide ? (totalItemsProp ?? data.length) : data.length;\n\n // Total pages\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));\n\n // Paginated data (client-side only)\n const pageData = useMemo(() => {\n if (serverSide) {\n return data;\n }\n const startIndex = (currentPage - 1) * pageSize;\n return sortedData.slice(startIndex, startIndex + pageSize);\n }, [serverSide, sortedData, currentPage, pageSize, data]);\n\n // Handle sort\n const handleSort = useCallback(\n (column: string) => {\n const newDirection: SortDirection =\n sortState.column === column && sortState.direction === 'asc' ? 'desc' : 'asc';\n\n setSortState({ column, direction: newDirection });\n\n if (serverSide && onSort) {\n onSort(column, newDirection);\n }\n\n // Reset to first page on sort change\n if (!serverSide) {\n setCurrentPage(1);\n }\n },\n [sortState.column, sortState.direction, serverSide, onSort]\n );\n\n // Set sort directly\n const setSort = useCallback(\n (column: string | null, direction: SortDirection) => {\n setSortState({ column, direction });\n if (serverSide && onSort && column) {\n onSort(column, direction);\n }\n },\n [serverSide, onSort]\n );\n\n // Go to specific page\n const goToPage = useCallback(\n (page: number) => {\n const validPage = Math.max(1, Math.min(page, totalPages));\n setCurrentPage(validPage);\n if (serverSide && onPageChange) {\n onPageChange(validPage);\n }\n },\n [totalPages, serverSide, onPageChange]\n );\n\n // Next page\n const nextPage = useCallback(() => {\n if (currentPage < totalPages) {\n goToPage(currentPage + 1);\n }\n }, [currentPage, totalPages, goToPage]);\n\n // Previous page\n const previousPage = useCallback(() => {\n if (currentPage > 1) {\n goToPage(currentPage - 1);\n }\n }, [currentPage, goToPage]);\n\n // Set page size\n const setPageSize = useCallback(\n (size: number) => {\n setPageSizeState(size);\n setCurrentPage(1); // Reset to first page\n if (serverSide && onPageSizeChange) {\n onPageSizeChange(size);\n }\n },\n [serverSide, onPageSizeChange]\n );\n\n // Reset to initial state\n const reset = useCallback(() => {\n setSortState({\n column: initialSortColumn ?? null,\n direction: initialSortDirection,\n });\n setCurrentPage(initialPage);\n setPageSizeState(initialPageSize);\n }, [initialSortColumn, initialSortDirection, initialPage, initialPageSize]);\n\n return {\n pageData,\n sortedData,\n sortColumn: sortState.column,\n sortDirection: sortState.direction,\n handleSort,\n setSort,\n currentPage,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n previousPage,\n setPageSize,\n reset,\n isFirstPage: currentPage === 1,\n isLastPage: currentPage >= totalPages,\n };\n}\n","import { useState, useMemo, useCallback } from 'react';\n\nexport interface UseSelectionOptions<T, K extends string | number = string> {\n /** Array of items to select from */\n items: T[];\n\n /** Function to get the unique identifier from an item */\n getItemId: (item: T) => K;\n\n /** Initial selected IDs */\n initialSelected?: K[];\n\n /** Callback when selection changes */\n onSelectionChange?: (selectedIds: K[]) => void;\n\n /** Optional filter for selectable items (e.g., exclude disabled items) */\n isSelectable?: (item: T) => boolean;\n}\n\nexport interface UseSelectionReturn<K extends string | number = string> {\n /** Currently selected IDs */\n selectedIds: K[];\n\n /** Set of selected IDs for O(1) lookup */\n selectedSet: Set<K>;\n\n /** Number of selected items */\n selectedCount: number;\n\n /** Whether all selectable items are selected */\n allSelected: boolean;\n\n /** Whether some (but not all) items are selected */\n someSelected: boolean;\n\n /** Whether no items are selected */\n noneSelected: boolean;\n\n /** Check if a specific item is selected */\n isSelected: (id: K) => boolean;\n\n /** Toggle selection for a single item */\n toggle: (id: K) => void;\n\n /** Select a single item */\n select: (id: K) => void;\n\n /** Deselect a single item */\n deselect: (id: K) => void;\n\n /** Select all selectable items */\n selectAll: () => void;\n\n /** Clear all selections */\n clearSelection: () => void;\n\n /** Toggle between select all and clear all */\n toggleAll: () => void;\n\n /** Select multiple items */\n selectMany: (ids: K[]) => void;\n\n /** Deselect multiple items */\n deselectMany: (ids: K[]) => void;\n\n /** Replace selection with new IDs */\n setSelection: (ids: K[]) => void;\n\n /** Get selected items from the original array */\n getSelectedItems: () => unknown[];\n}\n\n/**\n * Hook for managing batch selection in tables and lists.\n *\n * @example\n * ```tsx\n * const {\n * selectedIds,\n * allSelected,\n * someSelected,\n * isSelected,\n * toggle,\n * selectAll,\n * clearSelection,\n * toggleAll,\n * } = useSelection({\n * items: users,\n * getItemId: (user) => user.id,\n * isSelectable: (user) => !user.disabled,\n * });\n *\n * // In table header:\n * <Checkbox\n * checked={allSelected}\n * indeterminate={someSelected && !allSelected}\n * onChange={toggleAll}\n * />\n *\n * // In table row:\n * <Checkbox\n * checked={isSelected(user.id)}\n * onChange={() => toggle(user.id)}\n * />\n * ```\n */\nexport function useSelection<T, K extends string | number = string>({\n items,\n getItemId,\n initialSelected = [],\n onSelectionChange,\n isSelectable = () => true,\n}: UseSelectionOptions<T, K>): UseSelectionReturn<K> {\n const [selectedIds, setSelectedIds] = useState<K[]>(initialSelected);\n\n // Selected set for O(1) lookup\n const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\n // Get selectable items\n const selectableItems = useMemo(\n () => items.filter(isSelectable),\n [items, isSelectable]\n );\n\n // Get selectable IDs\n const selectableIds = useMemo(\n () => selectableItems.map(getItemId),\n [selectableItems, getItemId]\n );\n\n // Computed states\n const selectedCount = selectedIds.length;\n const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selectedSet.has(id));\n const someSelected = selectedIds.length > 0;\n const noneSelected = selectedIds.length === 0;\n\n // Update selection and call callback\n const updateSelection = useCallback(\n (newIds: K[]) => {\n setSelectedIds(newIds);\n onSelectionChange?.(newIds);\n },\n [onSelectionChange]\n );\n\n // Check if item is selected\n const isSelected = useCallback((id: K) => selectedSet.has(id), [selectedSet]);\n\n // Toggle single item\n const toggle = useCallback(\n (id: K) => {\n if (selectedSet.has(id)) {\n updateSelection(selectedIds.filter((selectedId) => selectedId !== id));\n } else {\n updateSelection([...selectedIds, id]);\n }\n },\n [selectedIds, selectedSet, updateSelection]\n );\n\n // Select single item\n const select = useCallback(\n (id: K) => {\n if (!selectedSet.has(id)) {\n updateSelection([...selectedIds, id]);\n }\n },\n [selectedIds, selectedSet, updateSelection]\n );\n\n // Deselect single item\n const deselect = useCallback(\n (id: K) => {\n if (selectedSet.has(id)) {\n updateSelection(selectedIds.filter((selectedId) => selectedId !== id));\n }\n },\n [selectedIds, selectedSet, updateSelection]\n );\n\n // Select all selectable items\n const selectAll = useCallback(() => {\n const newSelectedSet = new Set(selectedIds);\n selectableIds.forEach((id) => newSelectedSet.add(id));\n updateSelection(Array.from(newSelectedSet));\n }, [selectedIds, selectableIds, updateSelection]);\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n updateSelection([]);\n }, [updateSelection]);\n\n // Toggle all\n const toggleAll = useCallback(() => {\n if (allSelected) {\n // Deselect all selectable items (keep non-selectable items selected if any)\n const selectableIdSet = new Set(selectableIds);\n updateSelection(selectedIds.filter((id) => !selectableIdSet.has(id)));\n } else {\n selectAll();\n }\n }, [allSelected, selectAll, selectedIds, selectableIds, updateSelection]);\n\n // Select multiple items\n const selectMany = useCallback(\n (ids: K[]) => {\n const newSelectedSet = new Set(selectedIds);\n ids.forEach((id) => newSelectedSet.add(id));\n updateSelection(Array.from(newSelectedSet));\n },\n [selectedIds, updateSelection]\n );\n\n // Deselect multiple items\n const deselectMany = useCallback(\n (ids: K[]) => {\n const idsToRemove = new Set(ids);\n updateSelection(selectedIds.filter((id) => !idsToRemove.has(id)));\n },\n [selectedIds, updateSelection]\n );\n\n // Replace selection\n const setSelection = useCallback(\n (ids: K[]) => {\n updateSelection(ids);\n },\n [updateSelection]\n );\n\n // Get selected items\n const getSelectedItems = useCallback(() => {\n return items.filter((item) => selectedSet.has(getItemId(item)));\n }, [items, selectedSet, getItemId]);\n\n return {\n selectedIds,\n selectedSet,\n selectedCount,\n allSelected,\n someSelected,\n noneSelected,\n isSelected,\n toggle,\n select,\n deselect,\n selectAll,\n clearSelection,\n toggleAll,\n selectMany,\n deselectMany,\n setSelection,\n getSelectedItems,\n };\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\n\nexport interface UseSidebarOptions {\n /** Initial open state (mobile) */\n defaultOpen?: boolean;\n /** Initial collapsed state (desktop) */\n defaultCollapsed?: boolean;\n /** localStorage key for persisting collapsed state */\n storageKey?: string;\n /** Breakpoint for mobile/desktop switch in pixels (default: 1024) */\n mobileBreakpoint?: number;\n /** Auto-close on mobile navigation */\n autoCloseOnMobile?: boolean;\n}\n\nexport interface UseSidebarReturn {\n /** Whether sidebar is open (mobile) */\n isOpen: boolean;\n /** Toggle open state */\n toggle: () => void;\n /** Open sidebar */\n open: () => void;\n /** Close sidebar */\n close: () => void;\n /** Whether sidebar is collapsed (desktop) */\n collapsed: boolean;\n /** Toggle collapsed state */\n toggleCollapsed: () => void;\n /** Set collapsed state */\n setCollapsed: (collapsed: boolean) => void;\n /** Whether currently in mobile view */\n isMobile: boolean;\n /** Handler for navigation (auto-closes on mobile) */\n handleNavigate: (href: string) => void;\n}\n\n/**\n * Check if we're running in a browser environment\n */\nconst isBrowser = typeof window !== 'undefined';\n\n/**\n * Get initial collapsed state from localStorage\n */\nfunction getInitialCollapsed(storageKey: string, defaultValue: boolean): boolean {\n if (!isBrowser) return defaultValue;\n\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored !== null) {\n return JSON.parse(stored);\n }\n } catch {\n // Ignore localStorage errors\n }\n\n return defaultValue;\n}\n\n/**\n * useSidebar hook manages sidebar state including open/collapsed states,\n * localStorage persistence, and responsive behavior.\n *\n * @example\n * ```tsx\n * function Layout() {\n * const {\n * isOpen,\n * toggle,\n * close,\n * collapsed,\n * toggleCollapsed,\n * isMobile,\n * handleNavigate,\n * } = useSidebar({\n * storageKey: 'sidebar-collapsed',\n * autoCloseOnMobile: true,\n * });\n *\n * return (\n * <>\n * <button onClick={toggle}>Toggle Menu</button>\n * <Sidebar\n * isOpen={isOpen}\n * onClose={close}\n * collapsed={collapsed}\n * onCollapsedChange={setCollapsed}\n * onNavigate={handleNavigate}\n * // ...\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function useSidebar(options: UseSidebarOptions = {}): UseSidebarReturn {\n const {\n defaultOpen = false,\n defaultCollapsed = false,\n storageKey = 'teja-sidebar-collapsed',\n mobileBreakpoint = 1024,\n autoCloseOnMobile = true,\n } = options;\n\n // Open state (for mobile drawer)\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n // Collapsed state (for desktop)\n const [collapsed, setCollapsedState] = useState(() =>\n getInitialCollapsed(storageKey, defaultCollapsed)\n );\n\n // Mobile detection\n const [isMobile, setIsMobile] = useState(() => {\n if (!isBrowser) return false;\n return window.innerWidth < mobileBreakpoint;\n });\n\n // Persist collapsed state to localStorage\n useEffect(() => {\n if (!isBrowser) return;\n\n try {\n localStorage.setItem(storageKey, JSON.stringify(collapsed));\n } catch {\n // Ignore localStorage errors\n }\n }, [collapsed, storageKey]);\n\n // Listen for window resize to detect mobile/desktop\n useEffect(() => {\n if (!isBrowser) return;\n\n const handleResize = () => {\n const mobile = window.innerWidth < mobileBreakpoint;\n setIsMobile(mobile);\n\n // Close mobile sidebar when switching to desktop\n if (!mobile && isOpen) {\n setIsOpen(false);\n }\n };\n\n // Use matchMedia for better performance\n const mediaQuery = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`);\n\n const handleChange = (event: MediaQueryListEvent) => {\n setIsMobile(event.matches);\n if (!event.matches && isOpen) {\n setIsOpen(false);\n }\n };\n\n // Modern browsers\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }\n\n // Fallback for older browsers\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [mobileBreakpoint, isOpen]);\n\n // Actions\n const toggle = useCallback(() => {\n setIsOpen((prev) => !prev);\n }, []);\n\n const open = useCallback(() => {\n setIsOpen(true);\n }, []);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggleCollapsed = useCallback(() => {\n setCollapsedState((prev) => !prev);\n }, []);\n\n const setCollapsed = useCallback((value: boolean) => {\n setCollapsedState(value);\n }, []);\n\n // Navigation handler that auto-closes on mobile\n const handleNavigate = useCallback(\n (_href: string) => {\n if (autoCloseOnMobile && isMobile) {\n setIsOpen(false);\n }\n },\n [autoCloseOnMobile, isMobile]\n );\n\n return useMemo(\n () => ({\n isOpen,\n toggle,\n open,\n close,\n collapsed,\n toggleCollapsed,\n setCollapsed,\n isMobile,\n handleNavigate,\n }),\n [\n isOpen,\n toggle,\n open,\n close,\n collapsed,\n toggleCollapsed,\n setCollapsed,\n isMobile,\n handleNavigate,\n ]\n );\n}\n"],"names":["comparison"],"mappings":"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"}