@teja-app/ui 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/components/Badge/Badge.d.ts +13 -0
  2. package/dist/components/Badge/Badge.d.ts.map +1 -0
  3. package/dist/components/Badge/Badge.types.d.ts +12 -0
  4. package/dist/components/Badge/Badge.types.d.ts.map +1 -0
  5. package/dist/components/Badge/index.d.ts +3 -0
  6. package/dist/components/Badge/index.d.ts.map +1 -0
  7. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +18 -0
  8. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  9. package/dist/components/Breadcrumbs/Breadcrumbs.types.d.ts +20 -0
  10. package/dist/components/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -0
  11. package/dist/components/Breadcrumbs/index.d.ts +3 -0
  12. package/dist/components/Breadcrumbs/index.d.ts.map +1 -0
  13. package/dist/components/Button/Button.d.ts.map +1 -1
  14. package/dist/components/Card/Card.d.ts +18 -0
  15. package/dist/components/Card/Card.d.ts.map +1 -0
  16. package/dist/components/Card/Card.types.d.ts +14 -0
  17. package/dist/components/Card/Card.types.d.ts.map +1 -0
  18. package/dist/components/Card/index.d.ts +3 -0
  19. package/dist/components/Card/index.d.ts.map +1 -0
  20. package/dist/components/Checkbox/Checkbox.d.ts +13 -0
  21. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  22. package/dist/components/Checkbox/Checkbox.types.d.ts +19 -0
  23. package/dist/components/Checkbox/Checkbox.types.d.ts.map +1 -0
  24. package/dist/components/Checkbox/index.d.ts +3 -0
  25. package/dist/components/Checkbox/index.d.ts.map +1 -0
  26. package/dist/components/Combobox/Combobox.d.ts +24 -0
  27. package/dist/components/Combobox/Combobox.d.ts.map +1 -0
  28. package/dist/components/Combobox/Combobox.types.d.ts +41 -0
  29. package/dist/components/Combobox/Combobox.types.d.ts.map +1 -0
  30. package/dist/components/Combobox/index.d.ts +3 -0
  31. package/dist/components/Combobox/index.d.ts.map +1 -0
  32. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +23 -0
  33. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -0
  34. package/dist/components/ConfirmDialog/ConfirmDialog.types.d.ts +22 -0
  35. package/dist/components/ConfirmDialog/ConfirmDialog.types.d.ts.map +1 -0
  36. package/dist/components/ConfirmDialog/index.d.ts +3 -0
  37. package/dist/components/ConfirmDialog/index.d.ts.map +1 -0
  38. package/dist/components/Drawer/Drawer.d.ts +27 -0
  39. package/dist/components/Drawer/Drawer.d.ts.map +1 -0
  40. package/dist/components/Drawer/Drawer.types.d.ts +23 -0
  41. package/dist/components/Drawer/Drawer.types.d.ts.map +1 -0
  42. package/dist/components/Drawer/index.d.ts +3 -0
  43. package/dist/components/Drawer/index.d.ts.map +1 -0
  44. package/dist/components/EmptyState/EmptyState.d.ts +34 -0
  45. package/dist/components/EmptyState/EmptyState.d.ts.map +1 -0
  46. package/dist/components/EmptyState/EmptyState.types.d.ts +17 -0
  47. package/dist/components/EmptyState/EmptyState.types.d.ts.map +1 -0
  48. package/dist/components/EmptyState/index.d.ts +3 -0
  49. package/dist/components/EmptyState/index.d.ts.map +1 -0
  50. package/dist/components/Input/Input.d.ts +13 -0
  51. package/dist/components/Input/Input.d.ts.map +1 -0
  52. package/dist/components/Input/Input.types.d.ts +18 -0
  53. package/dist/components/Input/Input.types.d.ts.map +1 -0
  54. package/dist/components/Input/index.d.ts +3 -0
  55. package/dist/components/Input/index.d.ts.map +1 -0
  56. package/dist/components/Modal/Modal.d.ts +28 -0
  57. package/dist/components/Modal/Modal.d.ts.map +1 -0
  58. package/dist/components/Modal/Modal.types.d.ts +27 -0
  59. package/dist/components/Modal/Modal.types.d.ts.map +1 -0
  60. package/dist/components/Modal/index.d.ts +3 -0
  61. package/dist/components/Modal/index.d.ts.map +1 -0
  62. package/dist/components/MultiSelect/MultiSelect.d.ts +26 -0
  63. package/dist/components/MultiSelect/MultiSelect.d.ts.map +1 -0
  64. package/dist/components/MultiSelect/MultiSelect.types.d.ts +49 -0
  65. package/dist/components/MultiSelect/MultiSelect.types.d.ts.map +1 -0
  66. package/dist/components/MultiSelect/index.d.ts +3 -0
  67. package/dist/components/MultiSelect/index.d.ts.map +1 -0
  68. package/dist/components/Pagination/Pagination.d.ts +35 -0
  69. package/dist/components/Pagination/Pagination.d.ts.map +1 -0
  70. package/dist/components/Pagination/Pagination.types.d.ts +29 -0
  71. package/dist/components/Pagination/Pagination.types.d.ts.map +1 -0
  72. package/dist/components/Pagination/index.d.ts +3 -0
  73. package/dist/components/Pagination/index.d.ts.map +1 -0
  74. package/dist/components/PasswordInput/PasswordInput.d.ts +12 -0
  75. package/dist/components/PasswordInput/PasswordInput.d.ts.map +1 -0
  76. package/dist/components/PasswordInput/PasswordInput.types.d.ts +14 -0
  77. package/dist/components/PasswordInput/PasswordInput.types.d.ts.map +1 -0
  78. package/dist/components/PasswordInput/index.d.ts +3 -0
  79. package/dist/components/PasswordInput/index.d.ts.map +1 -0
  80. package/dist/components/Radio/Radio.d.ts +12 -0
  81. package/dist/components/Radio/Radio.d.ts.map +1 -0
  82. package/dist/components/Radio/Radio.types.d.ts +45 -0
  83. package/dist/components/Radio/Radio.types.d.ts.map +1 -0
  84. package/dist/components/Radio/RadioGroup.d.ts +23 -0
  85. package/dist/components/Radio/RadioGroup.d.ts.map +1 -0
  86. package/dist/components/Radio/index.d.ts +4 -0
  87. package/dist/components/Radio/index.d.ts.map +1 -0
  88. package/dist/components/Select/Select.d.ts +22 -0
  89. package/dist/components/Select/Select.d.ts.map +1 -0
  90. package/dist/components/Select/Select.types.d.ts +37 -0
  91. package/dist/components/Select/Select.types.d.ts.map +1 -0
  92. package/dist/components/Select/index.d.ts +3 -0
  93. package/dist/components/Select/index.d.ts.map +1 -0
  94. package/dist/components/Skeleton/Skeleton.d.ts +22 -0
  95. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
  96. package/dist/components/Skeleton/Skeleton.types.d.ts +17 -0
  97. package/dist/components/Skeleton/Skeleton.types.d.ts.map +1 -0
  98. package/dist/components/Skeleton/index.d.ts +3 -0
  99. package/dist/components/Skeleton/index.d.ts.map +1 -0
  100. package/dist/components/Spinner/Spinner.d.ts +13 -0
  101. package/dist/components/Spinner/Spinner.d.ts.map +1 -0
  102. package/dist/components/Spinner/Spinner.types.d.ts +12 -0
  103. package/dist/components/Spinner/Spinner.types.d.ts.map +1 -0
  104. package/dist/components/Spinner/index.d.ts +3 -0
  105. package/dist/components/Spinner/index.d.ts.map +1 -0
  106. package/dist/components/Table/Table.d.ts +44 -0
  107. package/dist/components/Table/Table.d.ts.map +1 -0
  108. package/dist/components/Table/Table.types.d.ts +33 -0
  109. package/dist/components/Table/Table.types.d.ts.map +1 -0
  110. package/dist/components/Table/index.d.ts +3 -0
  111. package/dist/components/Table/index.d.ts.map +1 -0
  112. package/dist/components/Tabs/Tabs.d.ts +43 -0
  113. package/dist/components/Tabs/Tabs.d.ts.map +1 -0
  114. package/dist/components/Tabs/Tabs.types.d.ts +38 -0
  115. package/dist/components/Tabs/Tabs.types.d.ts.map +1 -0
  116. package/dist/components/Tabs/index.d.ts +3 -0
  117. package/dist/components/Tabs/index.d.ts.map +1 -0
  118. package/dist/components/Textarea/Textarea.d.ts +13 -0
  119. package/dist/components/Textarea/Textarea.d.ts.map +1 -0
  120. package/dist/components/Textarea/Textarea.types.d.ts +20 -0
  121. package/dist/components/Textarea/Textarea.types.d.ts.map +1 -0
  122. package/dist/components/Textarea/index.d.ts +3 -0
  123. package/dist/components/Textarea/index.d.ts.map +1 -0
  124. package/dist/components/Toggle/Toggle.d.ts +20 -0
  125. package/dist/components/Toggle/Toggle.d.ts.map +1 -0
  126. package/dist/components/Toggle/Toggle.types.d.ts +20 -0
  127. package/dist/components/Toggle/Toggle.types.d.ts.map +1 -0
  128. package/dist/components/Toggle/index.d.ts +3 -0
  129. package/dist/components/Toggle/index.d.ts.map +1 -0
  130. package/dist/components/index.d.ts +21 -0
  131. package/dist/components/index.d.ts.map +1 -1
  132. package/dist/hooks/index.cjs +7 -0
  133. package/dist/hooks/index.cjs.map +1 -1
  134. package/dist/hooks/index.d.ts +6 -9
  135. package/dist/hooks/index.d.ts.map +1 -1
  136. package/dist/hooks/index.js +8 -1
  137. package/dist/hooks/index.js.map +1 -1
  138. package/dist/hooks/useDebounce.d.ts +65 -0
  139. package/dist/hooks/useDebounce.d.ts.map +1 -0
  140. package/dist/hooks/useDebounce.test.d.ts +2 -0
  141. package/dist/hooks/useDebounce.test.d.ts.map +1 -0
  142. package/dist/hooks/useSelection.d.ts +84 -0
  143. package/dist/hooks/useSelection.d.ts.map +1 -0
  144. package/dist/hooks/useSelection.test.d.ts +2 -0
  145. package/dist/hooks/useSelection.test.d.ts.map +1 -0
  146. package/dist/hooks/useTable.d.ts +91 -0
  147. package/dist/hooks/useTable.d.ts.map +1 -0
  148. package/dist/hooks/useTable.test.d.ts +2 -0
  149. package/dist/hooks/useTable.test.d.ts.map +1 -0
  150. package/dist/index.cjs +9451 -11
  151. package/dist/index.cjs.map +1 -1
  152. package/dist/index.d.ts +1 -0
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.js +9435 -11
  155. package/dist/index.js.map +1 -1
  156. package/dist/tailwind/colors.d.ts +28 -2
  157. package/dist/tailwind/colors.d.ts.map +1 -1
  158. package/dist/tailwind/index.cjs +33 -3
  159. package/dist/tailwind/index.cjs.map +1 -1
  160. package/dist/tailwind/index.js +33 -3
  161. package/dist/tailwind/index.js.map +1 -1
  162. package/dist/useSelection-BK6u5Ezx.js +359 -0
  163. package/dist/useSelection-BK6u5Ezx.js.map +1 -0
  164. package/dist/useSelection-DyXUWnGK.cjs +358 -0
  165. package/dist/useSelection-DyXUWnGK.cjs.map +1 -0
  166. package/package.json +4 -1
@@ -1,13 +1,39 @@
1
1
  /**
2
2
  * Design token colors for the Teja UI component library.
3
3
  * Based on /business/ux/Patterns/Design-Tokens.md
4
+ * Theme: Gold accent (matching frontend/browser-extension)
4
5
  */
5
6
  export declare const colors: {
6
7
  readonly brand: {
7
- readonly primary: "#2563EB";
8
- readonly 'primary-hover': "#1D4ED8";
8
+ readonly primary: "#1f2937";
9
+ readonly 'primary-hover': "#111827";
9
10
  readonly secondary: "#64748B";
10
11
  };
12
+ readonly gold: {
13
+ readonly 50: "#fefce8";
14
+ readonly 100: "#fef9c3";
15
+ readonly 200: "#fef08a";
16
+ readonly 300: "#fde047";
17
+ readonly 400: "#fbbf24";
18
+ readonly 500: "#f59e0b";
19
+ readonly 600: "#d97706";
20
+ readonly 700: "#a16207";
21
+ readonly 800: "#854d0e";
22
+ readonly 900: "#713f12";
23
+ };
24
+ readonly primary: {
25
+ readonly 50: "#f9fafb";
26
+ readonly 100: "#f3f4f6";
27
+ readonly 200: "#e5e7eb";
28
+ readonly 300: "#d1d5db";
29
+ readonly 400: "#9ca3af";
30
+ readonly 500: "#6b7280";
31
+ readonly 600: "#4b5563";
32
+ readonly 700: "#374151";
33
+ readonly 800: "#1f2937";
34
+ readonly 900: "#111827";
35
+ readonly 950: "#030712";
36
+ };
11
37
  readonly success: {
12
38
  readonly DEFAULT: "#16A34A";
13
39
  readonly light: "#DCFCE7";
@@ -1 +1 @@
1
- {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/tailwind/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CT,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC"}
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/tailwind/colors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ET,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC"}
@@ -1,12 +1,42 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const colors = {
4
- // Brand colors
4
+ // Brand colors (dark gray primary with gold accent)
5
5
  brand: {
6
- primary: "#2563EB",
7
- "primary-hover": "#1D4ED8",
6
+ primary: "#1f2937",
7
+ // primary-800 - dark gray for primary buttons
8
+ "primary-hover": "#111827",
9
+ // primary-900
8
10
  secondary: "#64748B"
9
11
  },
12
+ // Gold accent palette (for borders, highlights, CTAs)
13
+ gold: {
14
+ 50: "#fefce8",
15
+ 100: "#fef9c3",
16
+ 200: "#fef08a",
17
+ 300: "#fde047",
18
+ 400: "#fbbf24",
19
+ 500: "#f59e0b",
20
+ // primary accent
21
+ 600: "#d97706",
22
+ 700: "#a16207",
23
+ 800: "#854d0e",
24
+ 900: "#713f12"
25
+ },
26
+ // Primary grayscale (for UI structure, text, backgrounds)
27
+ primary: {
28
+ 50: "#f9fafb",
29
+ 100: "#f3f4f6",
30
+ 200: "#e5e7eb",
31
+ 300: "#d1d5db",
32
+ 400: "#9ca3af",
33
+ 500: "#6b7280",
34
+ 600: "#4b5563",
35
+ 700: "#374151",
36
+ 800: "#1f2937",
37
+ 900: "#111827",
38
+ 950: "#030712"
39
+ },
10
40
  // Semantic colors
11
41
  success: {
12
42
  DEFAULT: "#16A34A",
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/tailwind/colors.ts","../../src/tailwind/typography.ts","../../src/tailwind/spacing.ts","../../src/tailwind/preset.ts"],"sourcesContent":["/**\n * Design token colors for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const colors = {\n // Brand colors\n brand: {\n primary: '#2563EB',\n 'primary-hover': '#1D4ED8',\n secondary: '#64748B',\n },\n\n // Semantic colors\n success: {\n DEFAULT: '#16A34A',\n light: '#DCFCE7',\n },\n warning: {\n DEFAULT: '#CA8A04',\n light: '#FEF9C3',\n },\n error: {\n DEFAULT: '#DC2626',\n light: '#FEE2E2',\n },\n info: {\n DEFAULT: '#2563EB',\n light: '#DBEAFE',\n },\n\n // Neutral colors\n neutral: {\n 50: '#F8FAFC',\n 100: '#F1F5F9',\n 200: '#E2E8F0',\n 300: '#CBD5E1',\n 500: '#64748B',\n 700: '#334155',\n 900: '#0F172A',\n },\n\n // Status colors (for sessions/notes)\n status: {\n scheduled: '#3B82F6',\n completed: '#16A34A',\n cancelled: '#6B7280',\n 'no-show': '#EF4444',\n draft: '#F59E0B',\n signed: '#16A34A',\n },\n} as const;\n\nexport type Colors = typeof colors;\n","/**\n * Typography design tokens for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const fontFamily = {\n sans: ['Inter', 'system-ui', 'sans-serif'],\n mono: ['JetBrains Mono', 'monospace'],\n} as const;\n\nexport const fontSize = {\n xs: ['0.75rem', { lineHeight: '1rem' }],\n sm: ['0.875rem', { lineHeight: '1.25rem' }],\n base: ['1rem', { lineHeight: '1.5rem' }],\n lg: ['1.125rem', { lineHeight: '1.75rem' }],\n xl: ['1.25rem', { lineHeight: '1.75rem' }],\n '2xl': ['1.5rem', { lineHeight: '2rem' }],\n '3xl': ['2rem', { lineHeight: '2.5rem' }],\n} as const;\n\nexport const fontWeight = {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n} as const;\n\nexport type FontFamily = typeof fontFamily;\nexport type FontSize = typeof fontSize;\nexport type FontWeight = typeof fontWeight;\n","/**\n * Spacing and layout design tokens for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const spacing = {\n 0: '0',\n 1: '0.25rem',\n 2: '0.5rem',\n 3: '0.75rem',\n 4: '1rem',\n 5: '1.25rem',\n 6: '1.5rem',\n 8: '2rem',\n 10: '2.5rem',\n 12: '3rem',\n} as const;\n\nexport const borderRadius = {\n none: '0',\n sm: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n} as const;\n\nexport const boxShadow = {\n sm: '0 1px 2px rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px rgba(0, 0, 0, 0.1)',\n lg: '0 10px 15px rgba(0, 0, 0, 0.1)',\n xl: '0 20px 25px rgba(0, 0, 0, 0.15)',\n} as const;\n\nexport const zIndex = {\n base: '0',\n dropdown: '10',\n sticky: '20',\n drawer: '30',\n modal: '40',\n toast: '50',\n tooltip: '60',\n} as const;\n\nexport const transitionDuration = {\n fast: '100ms',\n normal: '150ms',\n slow: '300ms',\n} as const;\n\nexport const transitionTimingFunction = {\n default: 'ease-out',\n bounce: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n} as const;\n\nexport type Spacing = typeof spacing;\nexport type BorderRadius = typeof borderRadius;\nexport type BoxShadow = typeof boxShadow;\nexport type ZIndex = typeof zIndex;\n","/**\n * Tailwind CSS preset for the Teja UI component library.\n *\n * Usage in consumer apps:\n * ```ts\n * import tejaPreset from '@teja-app/ui/tailwind';\n *\n * export default {\n * presets: [tejaPreset],\n * content: [\n * \"./src/**\\/*.{js,ts,jsx,tsx}\",\n * \"./node_modules/@teja-app/ui/dist/**\\/*.{js,mjs}\",\n * ],\n * };\n * ```\n */\n\nimport type { Config } from 'tailwindcss';\nimport { colors } from './colors';\nimport { fontFamily, fontSize, fontWeight } from './typography';\nimport {\n spacing,\n borderRadius,\n boxShadow,\n zIndex,\n transitionDuration,\n transitionTimingFunction,\n} from './spacing';\n\nconst preset: Partial<Config> = {\n theme: {\n extend: {\n colors,\n fontFamily,\n fontSize,\n fontWeight,\n spacing,\n borderRadius,\n boxShadow,\n zIndex,\n transitionDuration,\n transitionTimingFunction,\n },\n },\n};\n\nexport default preset;\n"],"names":[],"mappings":";;AAKO,MAAM,SAAS;AAAA;AAAA,EAEpB,OAAO;AAAA,IACL,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,WAAW;AAAA,EAAA;AAAA;AAAA,EAIb,SAAS;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAAA,EAET,SAAS;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAAA,EAET,OAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAAA,EAET,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAAA;AAAA,EAIT,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EAAA;AAAA;AAAA,EAIP,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAEZ;AC9CO,MAAM,aAAa;AAAA,EACxB,MAAM,CAAC,SAAS,aAAa,YAAY;AAAA,EACzC,MAAM,CAAC,kBAAkB,WAAW;AACtC;AAEO,MAAM,WAAW;AAAA,EACtB,IAAI,CAAC,WAAW,EAAE,YAAY,QAAQ;AAAA,EACtC,IAAI,CAAC,YAAY,EAAE,YAAY,WAAW;AAAA,EAC1C,MAAM,CAAC,QAAQ,EAAE,YAAY,UAAU;AAAA,EACvC,IAAI,CAAC,YAAY,EAAE,YAAY,WAAW;AAAA,EAC1C,IAAI,CAAC,WAAW,EAAE,YAAY,WAAW;AAAA,EACzC,OAAO,CAAC,UAAU,EAAE,YAAY,QAAQ;AAAA,EACxC,OAAO,CAAC,QAAQ,EAAE,YAAY,UAAU;AAC1C;AAEO,MAAM,aAAa;AAAA,EACxB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AACR;ACpBO,MAAM,UAAU;AAAA,EACrB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,MAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AACR;AAEO,MAAM,YAAY;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,MAAM,SAAS;AAAA,EACpB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;AAEO,MAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACR;AAEO,MAAM,2BAA2B;AAAA,EACtC,SAAS;AAAA,EACT,QAAQ;AACV;ACxBA,MAAM,SAA0B;AAAA,EAC9B,OAAO;AAAA,IACL,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAEJ;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/tailwind/colors.ts","../../src/tailwind/typography.ts","../../src/tailwind/spacing.ts","../../src/tailwind/preset.ts"],"sourcesContent":["/**\n * Design token colors for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n * Theme: Gold accent (matching frontend/browser-extension)\n */\n\nexport const colors = {\n // Brand colors (dark gray primary with gold accent)\n brand: {\n primary: '#1f2937', // primary-800 - dark gray for primary buttons\n 'primary-hover': '#111827', // primary-900\n secondary: '#64748B',\n },\n\n // Gold accent palette (for borders, highlights, CTAs)\n gold: {\n 50: '#fefce8',\n 100: '#fef9c3',\n 200: '#fef08a',\n 300: '#fde047',\n 400: '#fbbf24',\n 500: '#f59e0b', // primary accent\n 600: '#d97706',\n 700: '#a16207',\n 800: '#854d0e',\n 900: '#713f12',\n },\n\n // Primary grayscale (for UI structure, text, backgrounds)\n primary: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n\n // Semantic colors\n success: {\n DEFAULT: '#16A34A',\n light: '#DCFCE7',\n },\n warning: {\n DEFAULT: '#CA8A04',\n light: '#FEF9C3',\n },\n error: {\n DEFAULT: '#DC2626',\n light: '#FEE2E2',\n },\n info: {\n DEFAULT: '#2563EB',\n light: '#DBEAFE',\n },\n\n // Neutral colors\n neutral: {\n 50: '#F8FAFC',\n 100: '#F1F5F9',\n 200: '#E2E8F0',\n 300: '#CBD5E1',\n 500: '#64748B',\n 700: '#334155',\n 900: '#0F172A',\n },\n\n // Status colors (for sessions/notes)\n status: {\n scheduled: '#3B82F6',\n completed: '#16A34A',\n cancelled: '#6B7280',\n 'no-show': '#EF4444',\n draft: '#F59E0B',\n signed: '#16A34A',\n },\n} as const;\n\nexport type Colors = typeof colors;\n","/**\n * Typography design tokens for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const fontFamily = {\n sans: ['Inter', 'system-ui', 'sans-serif'],\n mono: ['JetBrains Mono', 'monospace'],\n} as const;\n\nexport const fontSize = {\n xs: ['0.75rem', { lineHeight: '1rem' }],\n sm: ['0.875rem', { lineHeight: '1.25rem' }],\n base: ['1rem', { lineHeight: '1.5rem' }],\n lg: ['1.125rem', { lineHeight: '1.75rem' }],\n xl: ['1.25rem', { lineHeight: '1.75rem' }],\n '2xl': ['1.5rem', { lineHeight: '2rem' }],\n '3xl': ['2rem', { lineHeight: '2.5rem' }],\n} as const;\n\nexport const fontWeight = {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n} as const;\n\nexport type FontFamily = typeof fontFamily;\nexport type FontSize = typeof fontSize;\nexport type FontWeight = typeof fontWeight;\n","/**\n * Spacing and layout design tokens for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const spacing = {\n 0: '0',\n 1: '0.25rem',\n 2: '0.5rem',\n 3: '0.75rem',\n 4: '1rem',\n 5: '1.25rem',\n 6: '1.5rem',\n 8: '2rem',\n 10: '2.5rem',\n 12: '3rem',\n} as const;\n\nexport const borderRadius = {\n none: '0',\n sm: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n} as const;\n\nexport const boxShadow = {\n sm: '0 1px 2px rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px rgba(0, 0, 0, 0.1)',\n lg: '0 10px 15px rgba(0, 0, 0, 0.1)',\n xl: '0 20px 25px rgba(0, 0, 0, 0.15)',\n} as const;\n\nexport const zIndex = {\n base: '0',\n dropdown: '10',\n sticky: '20',\n drawer: '30',\n modal: '40',\n toast: '50',\n tooltip: '60',\n} as const;\n\nexport const transitionDuration = {\n fast: '100ms',\n normal: '150ms',\n slow: '300ms',\n} as const;\n\nexport const transitionTimingFunction = {\n default: 'ease-out',\n bounce: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n} as const;\n\nexport type Spacing = typeof spacing;\nexport type BorderRadius = typeof borderRadius;\nexport type BoxShadow = typeof boxShadow;\nexport type ZIndex = typeof zIndex;\n","/**\n * Tailwind CSS preset for the Teja UI component library.\n *\n * Usage in consumer apps:\n * ```ts\n * import tejaPreset from '@teja-app/ui/tailwind';\n *\n * export default {\n * presets: [tejaPreset],\n * content: [\n * \"./src/**\\/*.{js,ts,jsx,tsx}\",\n * \"./node_modules/@teja-app/ui/dist/**\\/*.{js,mjs}\",\n * ],\n * };\n * ```\n */\n\nimport type { Config } from 'tailwindcss';\nimport { colors } from './colors';\nimport { fontFamily, fontSize, fontWeight } from './typography';\nimport {\n spacing,\n borderRadius,\n boxShadow,\n zIndex,\n transitionDuration,\n transitionTimingFunction,\n} from './spacing';\n\nconst preset: Partial<Config> = {\n theme: {\n extend: {\n colors,\n fontFamily,\n fontSize,\n fontWeight,\n spacing,\n borderRadius,\n boxShadow,\n zIndex,\n transitionDuration,\n transitionTimingFunction,\n },\n },\n};\n\nexport default preset;\n"],"names":[],"mappings":"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"}
@@ -1,10 +1,40 @@
1
1
  const colors = {
2
- // Brand colors
2
+ // Brand colors (dark gray primary with gold accent)
3
3
  brand: {
4
- primary: "#2563EB",
5
- "primary-hover": "#1D4ED8",
4
+ primary: "#1f2937",
5
+ // primary-800 - dark gray for primary buttons
6
+ "primary-hover": "#111827",
7
+ // primary-900
6
8
  secondary: "#64748B"
7
9
  },
10
+ // Gold accent palette (for borders, highlights, CTAs)
11
+ gold: {
12
+ 50: "#fefce8",
13
+ 100: "#fef9c3",
14
+ 200: "#fef08a",
15
+ 300: "#fde047",
16
+ 400: "#fbbf24",
17
+ 500: "#f59e0b",
18
+ // primary accent
19
+ 600: "#d97706",
20
+ 700: "#a16207",
21
+ 800: "#854d0e",
22
+ 900: "#713f12"
23
+ },
24
+ // Primary grayscale (for UI structure, text, backgrounds)
25
+ primary: {
26
+ 50: "#f9fafb",
27
+ 100: "#f3f4f6",
28
+ 200: "#e5e7eb",
29
+ 300: "#d1d5db",
30
+ 400: "#9ca3af",
31
+ 500: "#6b7280",
32
+ 600: "#4b5563",
33
+ 700: "#374151",
34
+ 800: "#1f2937",
35
+ 900: "#111827",
36
+ 950: "#030712"
37
+ },
8
38
  // Semantic colors
9
39
  success: {
10
40
  DEFAULT: "#16A34A",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/tailwind/colors.ts","../../src/tailwind/typography.ts","../../src/tailwind/spacing.ts","../../src/tailwind/preset.ts"],"sourcesContent":["/**\n * Design token colors for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const colors = {\n // Brand colors\n brand: {\n primary: '#2563EB',\n 'primary-hover': '#1D4ED8',\n secondary: '#64748B',\n },\n\n // Semantic colors\n success: {\n DEFAULT: '#16A34A',\n light: '#DCFCE7',\n },\n warning: {\n DEFAULT: '#CA8A04',\n light: '#FEF9C3',\n },\n error: {\n DEFAULT: '#DC2626',\n light: '#FEE2E2',\n },\n info: {\n DEFAULT: '#2563EB',\n light: '#DBEAFE',\n },\n\n // Neutral colors\n neutral: {\n 50: '#F8FAFC',\n 100: '#F1F5F9',\n 200: '#E2E8F0',\n 300: '#CBD5E1',\n 500: '#64748B',\n 700: '#334155',\n 900: '#0F172A',\n },\n\n // Status colors (for sessions/notes)\n status: {\n scheduled: '#3B82F6',\n completed: '#16A34A',\n cancelled: '#6B7280',\n 'no-show': '#EF4444',\n draft: '#F59E0B',\n signed: '#16A34A',\n },\n} as const;\n\nexport type Colors = typeof colors;\n","/**\n * Typography design tokens for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const fontFamily = {\n sans: ['Inter', 'system-ui', 'sans-serif'],\n mono: ['JetBrains Mono', 'monospace'],\n} as const;\n\nexport const fontSize = {\n xs: ['0.75rem', { lineHeight: '1rem' }],\n sm: ['0.875rem', { lineHeight: '1.25rem' }],\n base: ['1rem', { lineHeight: '1.5rem' }],\n lg: ['1.125rem', { lineHeight: '1.75rem' }],\n xl: ['1.25rem', { lineHeight: '1.75rem' }],\n '2xl': ['1.5rem', { lineHeight: '2rem' }],\n '3xl': ['2rem', { lineHeight: '2.5rem' }],\n} as const;\n\nexport const fontWeight = {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n} as const;\n\nexport type FontFamily = typeof fontFamily;\nexport type FontSize = typeof fontSize;\nexport type FontWeight = typeof fontWeight;\n","/**\n * Spacing and layout design tokens for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const spacing = {\n 0: '0',\n 1: '0.25rem',\n 2: '0.5rem',\n 3: '0.75rem',\n 4: '1rem',\n 5: '1.25rem',\n 6: '1.5rem',\n 8: '2rem',\n 10: '2.5rem',\n 12: '3rem',\n} as const;\n\nexport const borderRadius = {\n none: '0',\n sm: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n} as const;\n\nexport const boxShadow = {\n sm: '0 1px 2px rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px rgba(0, 0, 0, 0.1)',\n lg: '0 10px 15px rgba(0, 0, 0, 0.1)',\n xl: '0 20px 25px rgba(0, 0, 0, 0.15)',\n} as const;\n\nexport const zIndex = {\n base: '0',\n dropdown: '10',\n sticky: '20',\n drawer: '30',\n modal: '40',\n toast: '50',\n tooltip: '60',\n} as const;\n\nexport const transitionDuration = {\n fast: '100ms',\n normal: '150ms',\n slow: '300ms',\n} as const;\n\nexport const transitionTimingFunction = {\n default: 'ease-out',\n bounce: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n} as const;\n\nexport type Spacing = typeof spacing;\nexport type BorderRadius = typeof borderRadius;\nexport type BoxShadow = typeof boxShadow;\nexport type ZIndex = typeof zIndex;\n","/**\n * Tailwind CSS preset for the Teja UI component library.\n *\n * Usage in consumer apps:\n * ```ts\n * import tejaPreset from '@teja-app/ui/tailwind';\n *\n * export default {\n * presets: [tejaPreset],\n * content: [\n * \"./src/**\\/*.{js,ts,jsx,tsx}\",\n * \"./node_modules/@teja-app/ui/dist/**\\/*.{js,mjs}\",\n * ],\n * };\n * ```\n */\n\nimport type { Config } from 'tailwindcss';\nimport { colors } from './colors';\nimport { fontFamily, fontSize, fontWeight } from './typography';\nimport {\n spacing,\n borderRadius,\n boxShadow,\n zIndex,\n transitionDuration,\n transitionTimingFunction,\n} from './spacing';\n\nconst preset: Partial<Config> = {\n theme: {\n extend: {\n colors,\n fontFamily,\n fontSize,\n fontWeight,\n spacing,\n borderRadius,\n boxShadow,\n zIndex,\n transitionDuration,\n transitionTimingFunction,\n },\n },\n};\n\nexport default preset;\n"],"names":[],"mappings":"AAKO,MAAM,SAAS;AAAA;AAAA,EAEpB,OAAO;AAAA,IACL,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,WAAW;AAAA,EAAA;AAAA;AAAA,EAIb,SAAS;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAAA,EAET,SAAS;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAAA,EAET,OAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAAA,EAET,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAAA;AAAA,EAIT,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EAAA;AAAA;AAAA,EAIP,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAEZ;AC9CO,MAAM,aAAa;AAAA,EACxB,MAAM,CAAC,SAAS,aAAa,YAAY;AAAA,EACzC,MAAM,CAAC,kBAAkB,WAAW;AACtC;AAEO,MAAM,WAAW;AAAA,EACtB,IAAI,CAAC,WAAW,EAAE,YAAY,QAAQ;AAAA,EACtC,IAAI,CAAC,YAAY,EAAE,YAAY,WAAW;AAAA,EAC1C,MAAM,CAAC,QAAQ,EAAE,YAAY,UAAU;AAAA,EACvC,IAAI,CAAC,YAAY,EAAE,YAAY,WAAW;AAAA,EAC1C,IAAI,CAAC,WAAW,EAAE,YAAY,WAAW;AAAA,EACzC,OAAO,CAAC,UAAU,EAAE,YAAY,QAAQ;AAAA,EACxC,OAAO,CAAC,QAAQ,EAAE,YAAY,UAAU;AAC1C;AAEO,MAAM,aAAa;AAAA,EACxB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AACR;ACpBO,MAAM,UAAU;AAAA,EACrB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,MAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AACR;AAEO,MAAM,YAAY;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,MAAM,SAAS;AAAA,EACpB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;AAEO,MAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACR;AAEO,MAAM,2BAA2B;AAAA,EACtC,SAAS;AAAA,EACT,QAAQ;AACV;ACxBA,MAAM,SAA0B;AAAA,EAC9B,OAAO;AAAA,IACL,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/tailwind/colors.ts","../../src/tailwind/typography.ts","../../src/tailwind/spacing.ts","../../src/tailwind/preset.ts"],"sourcesContent":["/**\n * Design token colors for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n * Theme: Gold accent (matching frontend/browser-extension)\n */\n\nexport const colors = {\n // Brand colors (dark gray primary with gold accent)\n brand: {\n primary: '#1f2937', // primary-800 - dark gray for primary buttons\n 'primary-hover': '#111827', // primary-900\n secondary: '#64748B',\n },\n\n // Gold accent palette (for borders, highlights, CTAs)\n gold: {\n 50: '#fefce8',\n 100: '#fef9c3',\n 200: '#fef08a',\n 300: '#fde047',\n 400: '#fbbf24',\n 500: '#f59e0b', // primary accent\n 600: '#d97706',\n 700: '#a16207',\n 800: '#854d0e',\n 900: '#713f12',\n },\n\n // Primary grayscale (for UI structure, text, backgrounds)\n primary: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n\n // Semantic colors\n success: {\n DEFAULT: '#16A34A',\n light: '#DCFCE7',\n },\n warning: {\n DEFAULT: '#CA8A04',\n light: '#FEF9C3',\n },\n error: {\n DEFAULT: '#DC2626',\n light: '#FEE2E2',\n },\n info: {\n DEFAULT: '#2563EB',\n light: '#DBEAFE',\n },\n\n // Neutral colors\n neutral: {\n 50: '#F8FAFC',\n 100: '#F1F5F9',\n 200: '#E2E8F0',\n 300: '#CBD5E1',\n 500: '#64748B',\n 700: '#334155',\n 900: '#0F172A',\n },\n\n // Status colors (for sessions/notes)\n status: {\n scheduled: '#3B82F6',\n completed: '#16A34A',\n cancelled: '#6B7280',\n 'no-show': '#EF4444',\n draft: '#F59E0B',\n signed: '#16A34A',\n },\n} as const;\n\nexport type Colors = typeof colors;\n","/**\n * Typography design tokens for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const fontFamily = {\n sans: ['Inter', 'system-ui', 'sans-serif'],\n mono: ['JetBrains Mono', 'monospace'],\n} as const;\n\nexport const fontSize = {\n xs: ['0.75rem', { lineHeight: '1rem' }],\n sm: ['0.875rem', { lineHeight: '1.25rem' }],\n base: ['1rem', { lineHeight: '1.5rem' }],\n lg: ['1.125rem', { lineHeight: '1.75rem' }],\n xl: ['1.25rem', { lineHeight: '1.75rem' }],\n '2xl': ['1.5rem', { lineHeight: '2rem' }],\n '3xl': ['2rem', { lineHeight: '2.5rem' }],\n} as const;\n\nexport const fontWeight = {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n} as const;\n\nexport type FontFamily = typeof fontFamily;\nexport type FontSize = typeof fontSize;\nexport type FontWeight = typeof fontWeight;\n","/**\n * Spacing and layout design tokens for the Teja UI component library.\n * Based on /business/ux/Patterns/Design-Tokens.md\n */\n\nexport const spacing = {\n 0: '0',\n 1: '0.25rem',\n 2: '0.5rem',\n 3: '0.75rem',\n 4: '1rem',\n 5: '1.25rem',\n 6: '1.5rem',\n 8: '2rem',\n 10: '2.5rem',\n 12: '3rem',\n} as const;\n\nexport const borderRadius = {\n none: '0',\n sm: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n} as const;\n\nexport const boxShadow = {\n sm: '0 1px 2px rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px rgba(0, 0, 0, 0.1)',\n lg: '0 10px 15px rgba(0, 0, 0, 0.1)',\n xl: '0 20px 25px rgba(0, 0, 0, 0.15)',\n} as const;\n\nexport const zIndex = {\n base: '0',\n dropdown: '10',\n sticky: '20',\n drawer: '30',\n modal: '40',\n toast: '50',\n tooltip: '60',\n} as const;\n\nexport const transitionDuration = {\n fast: '100ms',\n normal: '150ms',\n slow: '300ms',\n} as const;\n\nexport const transitionTimingFunction = {\n default: 'ease-out',\n bounce: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n} as const;\n\nexport type Spacing = typeof spacing;\nexport type BorderRadius = typeof borderRadius;\nexport type BoxShadow = typeof boxShadow;\nexport type ZIndex = typeof zIndex;\n","/**\n * Tailwind CSS preset for the Teja UI component library.\n *\n * Usage in consumer apps:\n * ```ts\n * import tejaPreset from '@teja-app/ui/tailwind';\n *\n * export default {\n * presets: [tejaPreset],\n * content: [\n * \"./src/**\\/*.{js,ts,jsx,tsx}\",\n * \"./node_modules/@teja-app/ui/dist/**\\/*.{js,mjs}\",\n * ],\n * };\n * ```\n */\n\nimport type { Config } from 'tailwindcss';\nimport { colors } from './colors';\nimport { fontFamily, fontSize, fontWeight } from './typography';\nimport {\n spacing,\n borderRadius,\n boxShadow,\n zIndex,\n transitionDuration,\n transitionTimingFunction,\n} from './spacing';\n\nconst preset: Partial<Config> = {\n theme: {\n extend: {\n colors,\n fontFamily,\n fontSize,\n fontWeight,\n spacing,\n borderRadius,\n boxShadow,\n zIndex,\n transitionDuration,\n transitionTimingFunction,\n },\n },\n};\n\nexport default preset;\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,359 @@
1
+ import { useState, useEffect, useRef, useCallback, useMemo } from "react";
2
+ function useDebounce(value, delay = 300) {
3
+ const [debouncedValue, setDebouncedValue] = useState(value);
4
+ useEffect(() => {
5
+ const timer = setTimeout(() => {
6
+ setDebouncedValue(value);
7
+ }, delay);
8
+ return () => {
9
+ clearTimeout(timer);
10
+ };
11
+ }, [value, delay]);
12
+ return debouncedValue;
13
+ }
14
+ function useDebouncedCallback(callback, delay = 300) {
15
+ const timeoutRef = useRef(null);
16
+ const callbackRef = useRef(callback);
17
+ useEffect(() => {
18
+ callbackRef.current = callback;
19
+ }, [callback]);
20
+ const debouncedCallback = useCallback(
21
+ (...args) => {
22
+ if (timeoutRef.current) {
23
+ clearTimeout(timeoutRef.current);
24
+ }
25
+ timeoutRef.current = setTimeout(() => {
26
+ callbackRef.current(...args);
27
+ }, delay);
28
+ },
29
+ [delay]
30
+ );
31
+ useEffect(() => {
32
+ return () => {
33
+ if (timeoutRef.current) {
34
+ clearTimeout(timeoutRef.current);
35
+ }
36
+ };
37
+ }, []);
38
+ return debouncedCallback;
39
+ }
40
+ function useDebouncedCallbackWithControl(callback, delay = 300) {
41
+ const timeoutRef = useRef(null);
42
+ const callbackRef = useRef(callback);
43
+ const argsRef = useRef(null);
44
+ useEffect(() => {
45
+ callbackRef.current = callback;
46
+ }, [callback]);
47
+ const cancel = useCallback(() => {
48
+ if (timeoutRef.current) {
49
+ clearTimeout(timeoutRef.current);
50
+ timeoutRef.current = null;
51
+ argsRef.current = null;
52
+ }
53
+ }, []);
54
+ const flush = useCallback(() => {
55
+ if (timeoutRef.current && argsRef.current) {
56
+ clearTimeout(timeoutRef.current);
57
+ timeoutRef.current = null;
58
+ const args = argsRef.current;
59
+ argsRef.current = null;
60
+ callbackRef.current(...args);
61
+ }
62
+ }, []);
63
+ const isPending = useCallback(() => {
64
+ return timeoutRef.current !== null;
65
+ }, []);
66
+ const debouncedFn = useCallback(
67
+ (...args) => {
68
+ argsRef.current = args;
69
+ if (timeoutRef.current) {
70
+ clearTimeout(timeoutRef.current);
71
+ }
72
+ timeoutRef.current = setTimeout(() => {
73
+ timeoutRef.current = null;
74
+ argsRef.current = null;
75
+ callbackRef.current(...args);
76
+ }, delay);
77
+ },
78
+ [delay]
79
+ );
80
+ useEffect(() => {
81
+ return () => {
82
+ cancel();
83
+ };
84
+ }, [cancel]);
85
+ return { debouncedFn, cancel, flush, isPending };
86
+ }
87
+ function useTable({
88
+ data,
89
+ initialSortColumn,
90
+ initialSortDirection = "asc",
91
+ initialPage = 1,
92
+ initialPageSize = 10,
93
+ serverSide = false,
94
+ onSort,
95
+ onPageChange,
96
+ onPageSizeChange,
97
+ sortFn,
98
+ getValueByColumn,
99
+ totalItems: totalItemsProp
100
+ }) {
101
+ const [sortState, setSortState] = useState({
102
+ column: initialSortColumn ?? null,
103
+ direction: initialSortDirection
104
+ });
105
+ const [currentPage, setCurrentPage] = useState(initialPage);
106
+ const [pageSize, setPageSizeState] = useState(initialPageSize);
107
+ const defaultGetValue = useCallback((item, column) => {
108
+ return item[column];
109
+ }, []);
110
+ const getValue = getValueByColumn ?? defaultGetValue;
111
+ const defaultSortFn = useCallback(
112
+ (items, column, direction) => {
113
+ return [...items].sort((a, b) => {
114
+ const aVal = getValue(a, column);
115
+ const bVal = getValue(b, column);
116
+ if (aVal == null && bVal == null) return 0;
117
+ if (aVal == null) return direction === "asc" ? 1 : -1;
118
+ if (bVal == null) return direction === "asc" ? -1 : 1;
119
+ if (typeof aVal === "string" && typeof bVal === "string") {
120
+ const comparison2 = aVal.localeCompare(bVal);
121
+ return direction === "asc" ? comparison2 : -comparison2;
122
+ }
123
+ if (typeof aVal === "number" && typeof bVal === "number") {
124
+ return direction === "asc" ? aVal - bVal : bVal - aVal;
125
+ }
126
+ if (aVal instanceof Date && bVal instanceof Date) {
127
+ return direction === "asc" ? aVal.getTime() - bVal.getTime() : bVal.getTime() - aVal.getTime();
128
+ }
129
+ if (typeof aVal === "boolean" && typeof bVal === "boolean") {
130
+ const comparison2 = aVal === bVal ? 0 : aVal ? -1 : 1;
131
+ return direction === "asc" ? comparison2 : -comparison2;
132
+ }
133
+ const aStr = String(aVal);
134
+ const bStr = String(bVal);
135
+ const comparison = aStr.localeCompare(bStr);
136
+ return direction === "asc" ? comparison : -comparison;
137
+ });
138
+ },
139
+ [getValue]
140
+ );
141
+ const sort = sortFn ?? defaultSortFn;
142
+ const sortedData = useMemo(() => {
143
+ if (serverSide || !sortState.column) {
144
+ return data;
145
+ }
146
+ return sort(data, sortState.column, sortState.direction);
147
+ }, [data, serverSide, sortState.column, sortState.direction, sort]);
148
+ const totalItems = serverSide ? totalItemsProp ?? data.length : data.length;
149
+ const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));
150
+ const pageData = useMemo(() => {
151
+ if (serverSide) {
152
+ return data;
153
+ }
154
+ const startIndex = (currentPage - 1) * pageSize;
155
+ return sortedData.slice(startIndex, startIndex + pageSize);
156
+ }, [serverSide, sortedData, currentPage, pageSize, data]);
157
+ const handleSort = useCallback(
158
+ (column) => {
159
+ const newDirection = sortState.column === column && sortState.direction === "asc" ? "desc" : "asc";
160
+ setSortState({ column, direction: newDirection });
161
+ if (serverSide && onSort) {
162
+ onSort(column, newDirection);
163
+ }
164
+ if (!serverSide) {
165
+ setCurrentPage(1);
166
+ }
167
+ },
168
+ [sortState.column, sortState.direction, serverSide, onSort]
169
+ );
170
+ const setSort = useCallback(
171
+ (column, direction) => {
172
+ setSortState({ column, direction });
173
+ if (serverSide && onSort && column) {
174
+ onSort(column, direction);
175
+ }
176
+ },
177
+ [serverSide, onSort]
178
+ );
179
+ const goToPage = useCallback(
180
+ (page) => {
181
+ const validPage = Math.max(1, Math.min(page, totalPages));
182
+ setCurrentPage(validPage);
183
+ if (serverSide && onPageChange) {
184
+ onPageChange(validPage);
185
+ }
186
+ },
187
+ [totalPages, serverSide, onPageChange]
188
+ );
189
+ const nextPage = useCallback(() => {
190
+ if (currentPage < totalPages) {
191
+ goToPage(currentPage + 1);
192
+ }
193
+ }, [currentPage, totalPages, goToPage]);
194
+ const previousPage = useCallback(() => {
195
+ if (currentPage > 1) {
196
+ goToPage(currentPage - 1);
197
+ }
198
+ }, [currentPage, goToPage]);
199
+ const setPageSize = useCallback(
200
+ (size) => {
201
+ setPageSizeState(size);
202
+ setCurrentPage(1);
203
+ if (serverSide && onPageSizeChange) {
204
+ onPageSizeChange(size);
205
+ }
206
+ },
207
+ [serverSide, onPageSizeChange]
208
+ );
209
+ const reset = useCallback(() => {
210
+ setSortState({
211
+ column: initialSortColumn ?? null,
212
+ direction: initialSortDirection
213
+ });
214
+ setCurrentPage(initialPage);
215
+ setPageSizeState(initialPageSize);
216
+ }, [initialSortColumn, initialSortDirection, initialPage, initialPageSize]);
217
+ return {
218
+ pageData,
219
+ sortedData,
220
+ sortColumn: sortState.column,
221
+ sortDirection: sortState.direction,
222
+ handleSort,
223
+ setSort,
224
+ currentPage,
225
+ pageSize,
226
+ totalPages,
227
+ totalItems,
228
+ goToPage,
229
+ nextPage,
230
+ previousPage,
231
+ setPageSize,
232
+ reset,
233
+ isFirstPage: currentPage === 1,
234
+ isLastPage: currentPage >= totalPages
235
+ };
236
+ }
237
+ function useSelection({
238
+ items,
239
+ getItemId,
240
+ initialSelected = [],
241
+ onSelectionChange,
242
+ isSelectable = () => true
243
+ }) {
244
+ const [selectedIds, setSelectedIds] = useState(initialSelected);
245
+ const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);
246
+ const selectableItems = useMemo(
247
+ () => items.filter(isSelectable),
248
+ [items, isSelectable]
249
+ );
250
+ const selectableIds = useMemo(
251
+ () => selectableItems.map(getItemId),
252
+ [selectableItems, getItemId]
253
+ );
254
+ const selectedCount = selectedIds.length;
255
+ const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selectedSet.has(id));
256
+ const someSelected = selectedIds.length > 0;
257
+ const noneSelected = selectedIds.length === 0;
258
+ const updateSelection = useCallback(
259
+ (newIds) => {
260
+ setSelectedIds(newIds);
261
+ onSelectionChange?.(newIds);
262
+ },
263
+ [onSelectionChange]
264
+ );
265
+ const isSelected = useCallback((id) => selectedSet.has(id), [selectedSet]);
266
+ const toggle = useCallback(
267
+ (id) => {
268
+ if (selectedSet.has(id)) {
269
+ updateSelection(selectedIds.filter((selectedId) => selectedId !== id));
270
+ } else {
271
+ updateSelection([...selectedIds, id]);
272
+ }
273
+ },
274
+ [selectedIds, selectedSet, updateSelection]
275
+ );
276
+ const select = useCallback(
277
+ (id) => {
278
+ if (!selectedSet.has(id)) {
279
+ updateSelection([...selectedIds, id]);
280
+ }
281
+ },
282
+ [selectedIds, selectedSet, updateSelection]
283
+ );
284
+ const deselect = useCallback(
285
+ (id) => {
286
+ if (selectedSet.has(id)) {
287
+ updateSelection(selectedIds.filter((selectedId) => selectedId !== id));
288
+ }
289
+ },
290
+ [selectedIds, selectedSet, updateSelection]
291
+ );
292
+ const selectAll = useCallback(() => {
293
+ const newSelectedSet = new Set(selectedIds);
294
+ selectableIds.forEach((id) => newSelectedSet.add(id));
295
+ updateSelection(Array.from(newSelectedSet));
296
+ }, [selectedIds, selectableIds, updateSelection]);
297
+ const clearSelection = useCallback(() => {
298
+ updateSelection([]);
299
+ }, [updateSelection]);
300
+ const toggleAll = useCallback(() => {
301
+ if (allSelected) {
302
+ const selectableIdSet = new Set(selectableIds);
303
+ updateSelection(selectedIds.filter((id) => !selectableIdSet.has(id)));
304
+ } else {
305
+ selectAll();
306
+ }
307
+ }, [allSelected, selectAll, selectedIds, selectableIds, updateSelection]);
308
+ const selectMany = useCallback(
309
+ (ids) => {
310
+ const newSelectedSet = new Set(selectedIds);
311
+ ids.forEach((id) => newSelectedSet.add(id));
312
+ updateSelection(Array.from(newSelectedSet));
313
+ },
314
+ [selectedIds, updateSelection]
315
+ );
316
+ const deselectMany = useCallback(
317
+ (ids) => {
318
+ const idsToRemove = new Set(ids);
319
+ updateSelection(selectedIds.filter((id) => !idsToRemove.has(id)));
320
+ },
321
+ [selectedIds, updateSelection]
322
+ );
323
+ const setSelection = useCallback(
324
+ (ids) => {
325
+ updateSelection(ids);
326
+ },
327
+ [updateSelection]
328
+ );
329
+ const getSelectedItems = useCallback(() => {
330
+ return items.filter((item) => selectedSet.has(getItemId(item)));
331
+ }, [items, selectedSet, getItemId]);
332
+ return {
333
+ selectedIds,
334
+ selectedSet,
335
+ selectedCount,
336
+ allSelected,
337
+ someSelected,
338
+ noneSelected,
339
+ isSelected,
340
+ toggle,
341
+ select,
342
+ deselect,
343
+ selectAll,
344
+ clearSelection,
345
+ toggleAll,
346
+ selectMany,
347
+ deselectMany,
348
+ setSelection,
349
+ getSelectedItems
350
+ };
351
+ }
352
+ export {
353
+ useDebouncedCallback as a,
354
+ useDebouncedCallbackWithControl as b,
355
+ useSelection as c,
356
+ useTable as d,
357
+ useDebounce as u
358
+ };
359
+ //# sourceMappingURL=useSelection-BK6u5Ezx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSelection-BK6u5Ezx.js","sources":["../src/hooks/useDebounce.ts","../src/hooks/useTable.ts","../src/hooks/useSelection.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"],"names":["comparison"],"mappings":"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"}