@teja-app/ui 0.0.1 → 0.0.3

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 (180) 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/Sidebar/Sidebar.d.ts +36 -0
  95. package/dist/components/Sidebar/Sidebar.d.ts.map +1 -0
  96. package/dist/components/Sidebar/Sidebar.types.d.ts +196 -0
  97. package/dist/components/Sidebar/Sidebar.types.d.ts.map +1 -0
  98. package/dist/components/Sidebar/SidebarDivider.d.ts +12 -0
  99. package/dist/components/Sidebar/SidebarDivider.d.ts.map +1 -0
  100. package/dist/components/Sidebar/SidebarGroup.d.ts +26 -0
  101. package/dist/components/Sidebar/SidebarGroup.d.ts.map +1 -0
  102. package/dist/components/Sidebar/SidebarItem.d.ts +23 -0
  103. package/dist/components/Sidebar/SidebarItem.d.ts.map +1 -0
  104. package/dist/components/Sidebar/index.d.ts +9 -0
  105. package/dist/components/Sidebar/index.d.ts.map +1 -0
  106. package/dist/components/Skeleton/Skeleton.d.ts +22 -0
  107. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
  108. package/dist/components/Skeleton/Skeleton.types.d.ts +17 -0
  109. package/dist/components/Skeleton/Skeleton.types.d.ts.map +1 -0
  110. package/dist/components/Skeleton/index.d.ts +3 -0
  111. package/dist/components/Skeleton/index.d.ts.map +1 -0
  112. package/dist/components/Spinner/Spinner.d.ts +13 -0
  113. package/dist/components/Spinner/Spinner.d.ts.map +1 -0
  114. package/dist/components/Spinner/Spinner.types.d.ts +12 -0
  115. package/dist/components/Spinner/Spinner.types.d.ts.map +1 -0
  116. package/dist/components/Spinner/index.d.ts +3 -0
  117. package/dist/components/Spinner/index.d.ts.map +1 -0
  118. package/dist/components/Table/Table.d.ts +44 -0
  119. package/dist/components/Table/Table.d.ts.map +1 -0
  120. package/dist/components/Table/Table.types.d.ts +33 -0
  121. package/dist/components/Table/Table.types.d.ts.map +1 -0
  122. package/dist/components/Table/index.d.ts +3 -0
  123. package/dist/components/Table/index.d.ts.map +1 -0
  124. package/dist/components/Tabs/Tabs.d.ts +43 -0
  125. package/dist/components/Tabs/Tabs.d.ts.map +1 -0
  126. package/dist/components/Tabs/Tabs.types.d.ts +38 -0
  127. package/dist/components/Tabs/Tabs.types.d.ts.map +1 -0
  128. package/dist/components/Tabs/index.d.ts +3 -0
  129. package/dist/components/Tabs/index.d.ts.map +1 -0
  130. package/dist/components/Textarea/Textarea.d.ts +13 -0
  131. package/dist/components/Textarea/Textarea.d.ts.map +1 -0
  132. package/dist/components/Textarea/Textarea.types.d.ts +20 -0
  133. package/dist/components/Textarea/Textarea.types.d.ts.map +1 -0
  134. package/dist/components/Textarea/index.d.ts +3 -0
  135. package/dist/components/Textarea/index.d.ts.map +1 -0
  136. package/dist/components/Toggle/Toggle.d.ts +20 -0
  137. package/dist/components/Toggle/Toggle.d.ts.map +1 -0
  138. package/dist/components/Toggle/Toggle.types.d.ts +20 -0
  139. package/dist/components/Toggle/Toggle.types.d.ts.map +1 -0
  140. package/dist/components/Toggle/index.d.ts +3 -0
  141. package/dist/components/Toggle/index.d.ts.map +1 -0
  142. package/dist/components/index.d.ts +22 -0
  143. package/dist/components/index.d.ts.map +1 -1
  144. package/dist/hooks/index.cjs +8 -0
  145. package/dist/hooks/index.cjs.map +1 -1
  146. package/dist/hooks/index.d.ts +8 -9
  147. package/dist/hooks/index.d.ts.map +1 -1
  148. package/dist/hooks/index.js +9 -1
  149. package/dist/hooks/index.js.map +1 -1
  150. package/dist/hooks/useDebounce.d.ts +65 -0
  151. package/dist/hooks/useDebounce.d.ts.map +1 -0
  152. package/dist/hooks/useDebounce.test.d.ts +2 -0
  153. package/dist/hooks/useDebounce.test.d.ts.map +1 -0
  154. package/dist/hooks/useSelection.d.ts +84 -0
  155. package/dist/hooks/useSelection.d.ts.map +1 -0
  156. package/dist/hooks/useSelection.test.d.ts +2 -0
  157. package/dist/hooks/useSelection.test.d.ts.map +1 -0
  158. package/dist/hooks/useSidebar.d.ts +39 -0
  159. package/dist/hooks/useSidebar.d.ts.map +1 -0
  160. package/dist/hooks/useTable.d.ts +91 -0
  161. package/dist/hooks/useTable.d.ts.map +1 -0
  162. package/dist/hooks/useTable.test.d.ts +2 -0
  163. package/dist/hooks/useTable.test.d.ts.map +1 -0
  164. package/dist/index.cjs +9896 -11
  165. package/dist/index.cjs.map +1 -1
  166. package/dist/index.d.ts +1 -0
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +9880 -11
  169. package/dist/index.js.map +1 -1
  170. package/dist/tailwind/colors.d.ts +28 -2
  171. package/dist/tailwind/colors.d.ts.map +1 -1
  172. package/dist/tailwind/index.cjs +33 -3
  173. package/dist/tailwind/index.cjs.map +1 -1
  174. package/dist/tailwind/index.js +33 -3
  175. package/dist/tailwind/index.js.map +1 -1
  176. package/dist/useSidebar-BWe09WbE.js +466 -0
  177. package/dist/useSidebar-BWe09WbE.js.map +1 -0
  178. package/dist/useSidebar-d1VZFhxd.cjs +465 -0
  179. package/dist/useSidebar-d1VZFhxd.cjs.map +1 -0
  180. 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,466 @@
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
+ const isBrowser = typeof window !== "undefined";
353
+ function getInitialCollapsed(storageKey, defaultValue) {
354
+ if (!isBrowser) return defaultValue;
355
+ try {
356
+ const stored = localStorage.getItem(storageKey);
357
+ if (stored !== null) {
358
+ return JSON.parse(stored);
359
+ }
360
+ } catch {
361
+ }
362
+ return defaultValue;
363
+ }
364
+ function useSidebar(options = {}) {
365
+ const {
366
+ defaultOpen = false,
367
+ defaultCollapsed = false,
368
+ storageKey = "teja-sidebar-collapsed",
369
+ mobileBreakpoint = 1024,
370
+ autoCloseOnMobile = true
371
+ } = options;
372
+ const [isOpen, setIsOpen] = useState(defaultOpen);
373
+ const [collapsed, setCollapsedState] = useState(
374
+ () => getInitialCollapsed(storageKey, defaultCollapsed)
375
+ );
376
+ const [isMobile, setIsMobile] = useState(() => {
377
+ if (!isBrowser) return false;
378
+ return window.innerWidth < mobileBreakpoint;
379
+ });
380
+ useEffect(() => {
381
+ if (!isBrowser) return;
382
+ try {
383
+ localStorage.setItem(storageKey, JSON.stringify(collapsed));
384
+ } catch {
385
+ }
386
+ }, [collapsed, storageKey]);
387
+ useEffect(() => {
388
+ if (!isBrowser) return;
389
+ const handleResize = () => {
390
+ const mobile = window.innerWidth < mobileBreakpoint;
391
+ setIsMobile(mobile);
392
+ if (!mobile && isOpen) {
393
+ setIsOpen(false);
394
+ }
395
+ };
396
+ const mediaQuery = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`);
397
+ const handleChange = (event) => {
398
+ setIsMobile(event.matches);
399
+ if (!event.matches && isOpen) {
400
+ setIsOpen(false);
401
+ }
402
+ };
403
+ if (mediaQuery.addEventListener) {
404
+ mediaQuery.addEventListener("change", handleChange);
405
+ return () => mediaQuery.removeEventListener("change", handleChange);
406
+ }
407
+ window.addEventListener("resize", handleResize);
408
+ return () => window.removeEventListener("resize", handleResize);
409
+ }, [mobileBreakpoint, isOpen]);
410
+ const toggle = useCallback(() => {
411
+ setIsOpen((prev) => !prev);
412
+ }, []);
413
+ const open = useCallback(() => {
414
+ setIsOpen(true);
415
+ }, []);
416
+ const close = useCallback(() => {
417
+ setIsOpen(false);
418
+ }, []);
419
+ const toggleCollapsed = useCallback(() => {
420
+ setCollapsedState((prev) => !prev);
421
+ }, []);
422
+ const setCollapsed = useCallback((value) => {
423
+ setCollapsedState(value);
424
+ }, []);
425
+ const handleNavigate = useCallback(
426
+ (_href) => {
427
+ if (autoCloseOnMobile && isMobile) {
428
+ setIsOpen(false);
429
+ }
430
+ },
431
+ [autoCloseOnMobile, isMobile]
432
+ );
433
+ return useMemo(
434
+ () => ({
435
+ isOpen,
436
+ toggle,
437
+ open,
438
+ close,
439
+ collapsed,
440
+ toggleCollapsed,
441
+ setCollapsed,
442
+ isMobile,
443
+ handleNavigate
444
+ }),
445
+ [
446
+ isOpen,
447
+ toggle,
448
+ open,
449
+ close,
450
+ collapsed,
451
+ toggleCollapsed,
452
+ setCollapsed,
453
+ isMobile,
454
+ handleNavigate
455
+ ]
456
+ );
457
+ }
458
+ export {
459
+ useDebouncedCallback as a,
460
+ useDebouncedCallbackWithControl as b,
461
+ useSelection as c,
462
+ useSidebar as d,
463
+ useTable as e,
464
+ useDebounce as u
465
+ };
466
+ //# sourceMappingURL=useSidebar-BWe09WbE.js.map