@soulbatical/tetra-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/components/AutoCard.d.ts +41 -0
  2. package/dist/components/AutoCard.d.ts.map +1 -0
  3. package/dist/components/AutoCard.js +73 -0
  4. package/dist/components/AutoCard.js.map +1 -0
  5. package/dist/components/CookieConsent.d.ts +15 -0
  6. package/dist/components/CookieConsent.d.ts.map +1 -0
  7. package/dist/components/CookieConsent.js +27 -0
  8. package/dist/components/CookieConsent.js.map +1 -0
  9. package/dist/components/GenericListLayout.d.ts +48 -0
  10. package/dist/components/GenericListLayout.d.ts.map +1 -0
  11. package/dist/components/GenericListLayout.js +18 -0
  12. package/dist/components/GenericListLayout.js.map +1 -0
  13. package/dist/components/ListGenerator.d.ts +41 -0
  14. package/dist/components/ListGenerator.d.ts.map +1 -0
  15. package/dist/components/ListGenerator.js +40 -0
  16. package/dist/components/ListGenerator.js.map +1 -0
  17. package/dist/components/LoadingStates.d.ts +38 -0
  18. package/dist/components/LoadingStates.d.ts.map +1 -0
  19. package/dist/components/LoadingStates.js +51 -0
  20. package/dist/components/LoadingStates.js.map +1 -0
  21. package/dist/components/OrgSwitcher.d.ts +15 -0
  22. package/dist/components/OrgSwitcher.d.ts.map +1 -0
  23. package/dist/components/OrgSwitcher.js +36 -0
  24. package/dist/components/OrgSwitcher.js.map +1 -0
  25. package/dist/components/PageHeader.d.ts +16 -0
  26. package/dist/components/PageHeader.d.ts.map +1 -0
  27. package/dist/components/PageHeader.js +10 -0
  28. package/dist/components/PageHeader.js.map +1 -0
  29. package/dist/components/ProtectedRoute.d.ts +9 -0
  30. package/dist/components/ProtectedRoute.d.ts.map +1 -0
  31. package/dist/components/ProtectedRoute.js +30 -0
  32. package/dist/components/ProtectedRoute.js.map +1 -0
  33. package/dist/components/StatusBadge.d.ts +15 -0
  34. package/dist/components/StatusBadge.d.ts.map +1 -0
  35. package/dist/components/StatusBadge.js +79 -0
  36. package/dist/components/StatusBadge.js.map +1 -0
  37. package/dist/components/ThemeToggle.d.ts +14 -0
  38. package/dist/components/ThemeToggle.d.ts.map +1 -0
  39. package/dist/components/ThemeToggle.js +20 -0
  40. package/dist/components/ThemeToggle.js.map +1 -0
  41. package/dist/hooks/use-mobile.d.ts +2 -0
  42. package/dist/hooks/use-mobile.d.ts.map +1 -0
  43. package/dist/hooks/use-mobile.js +17 -0
  44. package/dist/hooks/use-mobile.js.map +1 -0
  45. package/dist/hooks/useAuth.d.ts +34 -0
  46. package/dist/hooks/useAuth.d.ts.map +1 -0
  47. package/dist/hooks/useAuth.js +156 -0
  48. package/dist/hooks/useAuth.js.map +1 -0
  49. package/dist/hooks/useCacheInvalidation.d.ts +25 -0
  50. package/dist/hooks/useCacheInvalidation.d.ts.map +1 -0
  51. package/dist/hooks/useCacheInvalidation.js +57 -0
  52. package/dist/hooks/useCacheInvalidation.js.map +1 -0
  53. package/dist/hooks/useDebounce.d.ts +2 -0
  54. package/dist/hooks/useDebounce.d.ts.map +1 -0
  55. package/dist/hooks/useDebounce.js +15 -0
  56. package/dist/hooks/useDebounce.js.map +1 -0
  57. package/dist/hooks/useDialog.d.ts +26 -0
  58. package/dist/hooks/useDialog.d.ts.map +1 -0
  59. package/dist/hooks/useDialog.js +37 -0
  60. package/dist/hooks/useDialog.js.map +1 -0
  61. package/dist/hooks/useFilterConfigs.d.ts +81 -0
  62. package/dist/hooks/useFilterConfigs.d.ts.map +1 -0
  63. package/dist/hooks/useFilterConfigs.js +68 -0
  64. package/dist/hooks/useFilterConfigs.js.map +1 -0
  65. package/dist/hooks/useFormSubmit.d.ts +79 -0
  66. package/dist/hooks/useFormSubmit.d.ts.map +1 -0
  67. package/dist/hooks/useFormSubmit.js +57 -0
  68. package/dist/hooks/useFormSubmit.js.map +1 -0
  69. package/dist/hooks/useGenericList.d.ts +62 -0
  70. package/dist/hooks/useGenericList.d.ts.map +1 -0
  71. package/dist/hooks/useGenericList.js +75 -0
  72. package/dist/hooks/useGenericList.js.map +1 -0
  73. package/dist/hooks/useGenericListWithConfig.d.ts +65 -0
  74. package/dist/hooks/useGenericListWithConfig.d.ts.map +1 -0
  75. package/dist/hooks/useGenericListWithConfig.js +98 -0
  76. package/dist/hooks/useGenericListWithConfig.js.map +1 -0
  77. package/dist/hooks/useInfiniteScroll.d.ts +11 -0
  78. package/dist/hooks/useInfiniteScroll.d.ts.map +1 -0
  79. package/dist/hooks/useInfiniteScroll.js +63 -0
  80. package/dist/hooks/useInfiniteScroll.js.map +1 -0
  81. package/dist/hooks/useOrganizations.d.ts +27 -0
  82. package/dist/hooks/useOrganizations.d.ts.map +1 -0
  83. package/dist/hooks/useOrganizations.js +56 -0
  84. package/dist/hooks/useOrganizations.js.map +1 -0
  85. package/dist/hooks/usePageContext.d.ts +29 -0
  86. package/dist/hooks/usePageContext.d.ts.map +1 -0
  87. package/dist/hooks/usePageContext.js +32 -0
  88. package/dist/hooks/usePageContext.js.map +1 -0
  89. package/dist/hooks/usePersistedQueryState.d.ts +35 -0
  90. package/dist/hooks/usePersistedQueryState.d.ts.map +1 -0
  91. package/dist/hooks/usePersistedQueryState.js +187 -0
  92. package/dist/hooks/usePersistedQueryState.js.map +1 -0
  93. package/dist/hooks/useQueryState.d.ts +40 -0
  94. package/dist/hooks/useQueryState.d.ts.map +1 -0
  95. package/dist/hooks/useQueryState.js +246 -0
  96. package/dist/hooks/useQueryState.js.map +1 -0
  97. package/dist/index.d.ts +30 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +43 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/lib/utils.d.ts +3 -0
  102. package/dist/lib/utils.d.ts.map +1 -0
  103. package/dist/lib/utils.js +6 -0
  104. package/dist/lib/utils.js.map +1 -0
  105. package/dist/providers/QueryProvider.d.ts +9 -0
  106. package/dist/providers/QueryProvider.d.ts.map +1 -0
  107. package/dist/providers/QueryProvider.js +20 -0
  108. package/dist/providers/QueryProvider.js.map +1 -0
  109. package/dist/providers/ThemeProvider.d.ts +15 -0
  110. package/dist/providers/ThemeProvider.d.ts.map +1 -0
  111. package/dist/providers/ThemeProvider.js +13 -0
  112. package/dist/providers/ThemeProvider.js.map +1 -0
  113. package/dist/services/apiClient.d.ts +20 -0
  114. package/dist/services/apiClient.d.ts.map +1 -0
  115. package/dist/services/apiClient.js +85 -0
  116. package/dist/services/apiClient.js.map +1 -0
  117. package/dist/types/index.d.ts +119 -0
  118. package/dist/types/index.d.ts.map +1 -0
  119. package/dist/types/index.js +5 -0
  120. package/dist/types/index.js.map +1 -0
  121. package/package.json +68 -0
  122. package/src/styles/dark-mode.css +135 -0
  123. package/src/styles/theme.css +105 -0
@@ -0,0 +1,246 @@
1
+ "use client";
2
+ import { useSearchParams, useRouter, usePathname } from 'next/navigation.js';
3
+ import { useCallback, useMemo } from 'react';
4
+ /**
5
+ * Helper to update URL search params in Next.js App Router.
6
+ * Returns new URLSearchParams instance (immutable pattern).
7
+ */
8
+ function updateSearchParams(current, updater) {
9
+ const next = new URLSearchParams(current.toString());
10
+ return updater(next);
11
+ }
12
+ export function useQueryState(defaultValues) {
13
+ const searchParams = useSearchParams();
14
+ const router = useRouter();
15
+ const pathname = usePathname();
16
+ /** Push new search params to URL */
17
+ const pushParams = useCallback((next) => {
18
+ const qs = next.toString();
19
+ router.replace(`${pathname}${qs ? `?${qs}` : ''}`, { scroll: false });
20
+ }, [router, pathname]);
21
+ // Parse a single parameter with type coercion
22
+ const parseParam = useCallback((key) => {
23
+ const value = searchParams.get(String(key));
24
+ if (value === null)
25
+ return undefined;
26
+ // Try to parse as JSON first (for objects/arrays)
27
+ try {
28
+ return JSON.parse(value);
29
+ }
30
+ catch {
31
+ // If it's a number string, parse it
32
+ if (/^\d+$/.test(value)) {
33
+ return Number(value);
34
+ }
35
+ // Otherwise return as string
36
+ return value;
37
+ }
38
+ }, [searchParams]);
39
+ // Set a single parameter
40
+ const setParam = useCallback((key, value) => {
41
+ const next = new URLSearchParams(searchParams.toString());
42
+ if (value === undefined || value === '' || value === null) {
43
+ next.delete(String(key));
44
+ }
45
+ else if (typeof value === 'object') {
46
+ next.set(String(key), JSON.stringify(value));
47
+ }
48
+ else {
49
+ next.set(String(key), String(value));
50
+ }
51
+ pushParams(next);
52
+ }, [searchParams, pushParams]);
53
+ // Set multiple parameters at once
54
+ const setParams = useCallback((params) => {
55
+ const next = new URLSearchParams(searchParams.toString());
56
+ Object.entries(params).forEach(([key, value]) => {
57
+ if (value === undefined || value === '' || value === null) {
58
+ next.delete(key);
59
+ }
60
+ else if (typeof value === 'object') {
61
+ next.set(key, JSON.stringify(value));
62
+ }
63
+ else {
64
+ next.set(key, String(value));
65
+ }
66
+ });
67
+ pushParams(next);
68
+ }, [searchParams, pushParams]);
69
+ // Clear a single parameter
70
+ const clearParam = useCallback((key) => {
71
+ const next = new URLSearchParams(searchParams.toString());
72
+ next.delete(String(key));
73
+ pushParams(next);
74
+ }, [searchParams, pushParams]);
75
+ // Clear all parameters
76
+ const clearParams = useCallback(() => {
77
+ pushParams(new URLSearchParams());
78
+ }, [pushParams]);
79
+ // Pagination helpers
80
+ const pagination = useMemo(() => {
81
+ const page = Number(searchParams.get('page')) || 1;
82
+ const perPage = Number(searchParams.get('perPage')) || 20;
83
+ return {
84
+ page,
85
+ perPage,
86
+ setPage: (newPage) => setParam('page', newPage),
87
+ setPerPage: (newPerPage) => setParam('perPage', newPerPage),
88
+ };
89
+ }, [searchParams, setParam]);
90
+ // Sorting helpers
91
+ const sorting = useMemo(() => {
92
+ const sort = searchParams.get('sort') || undefined;
93
+ const order = (searchParams.get('order') || 'asc');
94
+ return {
95
+ sort,
96
+ order,
97
+ setSort: (field, newOrder = 'asc') => {
98
+ if (field) {
99
+ setParams({
100
+ sort: field,
101
+ order: newOrder,
102
+ });
103
+ }
104
+ else {
105
+ clearParam('sort');
106
+ clearParam('order');
107
+ }
108
+ },
109
+ };
110
+ }, [searchParams, setParams, clearParam]);
111
+ // Search helpers
112
+ const search = useMemo(() => {
113
+ const query = searchParams.get('search') || undefined;
114
+ return {
115
+ query,
116
+ setQuery: (newQuery) => setParam('search', newQuery),
117
+ };
118
+ }, [searchParams, setParam]);
119
+ // Parse all filters (excluding pagination, sorting, search)
120
+ const filters = useMemo(() => {
121
+ const result = {};
122
+ const excludeKeys = ['page', 'perPage', 'sort', 'order', 'search'];
123
+ searchParams.forEach((value, key) => {
124
+ if (!excludeKeys.includes(key)) {
125
+ try {
126
+ result[key] = JSON.parse(value);
127
+ }
128
+ catch {
129
+ result[key] = /^\d+$/.test(value) ? Number(value) : value;
130
+ }
131
+ }
132
+ });
133
+ return result;
134
+ }, [searchParams]);
135
+ // Set multiple filters at once
136
+ const setFilters = useCallback((newFilters) => {
137
+ const next = new URLSearchParams(searchParams.toString());
138
+ // Preserve pagination, sorting, search
139
+ const preserved = {
140
+ page: searchParams.get('page'),
141
+ perPage: searchParams.get('perPage'),
142
+ sort: searchParams.get('sort'),
143
+ order: searchParams.get('order'),
144
+ search: searchParams.get('search'),
145
+ };
146
+ // Clear all params
147
+ Array.from(next.keys()).forEach((key) => next.delete(key));
148
+ // Restore preserved params
149
+ Object.entries(preserved).forEach(([key, value]) => {
150
+ if (value)
151
+ next.set(key, value);
152
+ });
153
+ // Set new filters
154
+ Object.entries(newFilters).forEach(([key, value]) => {
155
+ if (value !== undefined && value !== '' && value !== null) {
156
+ if (typeof value === 'object') {
157
+ next.set(key, JSON.stringify(value));
158
+ }
159
+ else {
160
+ next.set(key, String(value));
161
+ }
162
+ }
163
+ });
164
+ pushParams(next);
165
+ }, [searchParams, pushParams]);
166
+ // Clear all filters (preserve pagination, sorting, search)
167
+ const clearFilters = useCallback(() => {
168
+ const next = new URLSearchParams();
169
+ // Preserve these params
170
+ ['page', 'perPage', 'sort', 'order', 'search'].forEach((key) => {
171
+ const value = searchParams.get(key);
172
+ if (value)
173
+ next.set(key, value);
174
+ });
175
+ pushParams(next);
176
+ }, [searchParams, pushParams]);
177
+ // Check if any filters are active
178
+ const hasFilters = useMemo(() => {
179
+ const excludeKeys = ['page', 'perPage', 'sort', 'order', 'search'];
180
+ return Array.from(searchParams.keys()).some((key) => !excludeKeys.includes(key));
181
+ }, [searchParams]);
182
+ // Build query string for API calls
183
+ const buildQueryString = useCallback(() => {
184
+ return searchParams.toString();
185
+ }, [searchParams]);
186
+ // Hooks for simplified interface (always called, conditionally used)
187
+ const currentFilters = useMemo(() => {
188
+ if (!defaultValues)
189
+ return {};
190
+ const result = { ...defaultValues };
191
+ Object.keys(defaultValues).forEach((key) => {
192
+ const value = searchParams.get(key);
193
+ if (value !== null) {
194
+ try {
195
+ result[key] = JSON.parse(value);
196
+ }
197
+ catch {
198
+ // Keep as string - don't convert to number
199
+ result[key] = value;
200
+ }
201
+ }
202
+ });
203
+ return result;
204
+ }, [searchParams, defaultValues]);
205
+ const setFilter = useCallback((key, value) => {
206
+ setParam(key, value);
207
+ }, [setParam]);
208
+ const resetFilters = useCallback(() => {
209
+ if (!defaultValues)
210
+ return;
211
+ const next = new URLSearchParams();
212
+ // Preserve non-filter params
213
+ searchParams.forEach((value, key) => {
214
+ if (!Object.keys(defaultValues).includes(key)) {
215
+ next.set(key, value);
216
+ }
217
+ });
218
+ pushParams(next);
219
+ }, [searchParams, pushParams, defaultValues]);
220
+ // If defaultValues are provided, return a simplified interface
221
+ if (defaultValues) {
222
+ return {
223
+ filters: currentFilters,
224
+ setFilter,
225
+ resetFilters,
226
+ };
227
+ }
228
+ // Original return for no defaultValues
229
+ return {
230
+ params: searchParams,
231
+ setParam,
232
+ setParams,
233
+ getParam: parseParam,
234
+ clearParam,
235
+ clearParams,
236
+ pagination,
237
+ sorting,
238
+ search,
239
+ filters,
240
+ setFilters,
241
+ clearFilters,
242
+ hasFilters,
243
+ buildQueryString,
244
+ };
245
+ }
246
+ //# sourceMappingURL=useQueryState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQueryState.js","sourceRoot":"","sources":["../../src/hooks/useQueryState.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AA+B7C;;;GAGG;AACH,SAAS,kBAAkB,CACzB,OAAwB,EACxB,OAAmD;IAEnD,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAgBD,MAAM,UAAU,aAAa,CAC3B,aAAiB;IAEjB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,oCAAoC;IACpC,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,IAAqB,EAAE,EAAE;QACxB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC,EACD,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAC;IAEF,8CAA8C;IAC9C,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAoB,GAAM,EAAoB,EAAE;QAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QAErC,kDAAkD;QAClD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;YACpC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,MAAM,CAAC,KAAK,CAAS,CAAC;YAC/B,CAAC;YACD,6BAA6B;YAC7B,OAAO,KAAa,CAAC;QACvB,CAAC;IACH,CAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,yBAAyB;IACzB,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAoB,GAAM,EAAE,KAAuB,EAAE,EAAE;QACrD,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE1D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,EACD,CAAC,YAAY,EAAE,UAAU,CAAC,CAC3B,CAAC;IAEF,kCAAkC;IAClC,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,MAAkB,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE1D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC9C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,EACD,CAAC,YAAY,EAAE,UAAU,CAAC,CAC3B,CAAC;IAEF,2BAA2B;IAC3B,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAoB,GAAM,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,EACD,CAAC,YAAY,EAAE,UAAU,CAAC,CAC3B,CAAC;IAEF,uBAAuB;IACvB,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,UAAU,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,qBAAqB;IACrB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1D,OAAO;YACL,IAAI;YACJ,OAAO;YACP,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAiB,EAAE,OAAqB,CAAC;YAChF,UAAU,EAAE,CAAC,UAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAoB,EAAE,UAAwB,CAAC;SAC7F,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE7B,kBAAkB;IAClB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;QACnD,MAAM,KAAK,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAmB,CAAC;QAErE,OAAO;YACL,IAAI;YACJ,KAAK;YACL,OAAO,EAAE,CAAC,KAAyB,EAAE,WAA2B,KAAK,EAAE,EAAE;gBACvE,IAAI,KAAK,EAAE,CAAC;oBACV,SAAS,CAAC;wBACR,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,QAAQ;qBACS,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,MAAiB,CAAC,CAAC;oBAC9B,UAAU,CAAC,OAAkB,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAE1C,iBAAiB;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;QAEtD,OAAO;YACL,KAAK;YACL,QAAQ,EAAE,CAAC,QAA4B,EAAE,EAAE,CACzC,QAAQ,CAAC,QAAmB,EAAE,QAAsB,CAAC;SACxD,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE7B,4DAA4D;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEnE,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAW,CAAC;IACrB,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,+BAA+B;IAC/B,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,UAAsB,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE1D,uCAAuC;QACvC,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;YAC9B,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YACpC,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;YAChC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;SACnC,CAAC;QAEF,mBAAmB;QACnB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3D,2BAA2B;QAC3B,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACjD,IAAI,KAAK;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,kBAAkB;QAClB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,EACD,CAAC,YAAY,EAAE,UAAU,CAAC,CAC3B,CAAC;IAEF,2DAA2D;IAC3D,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QAEnC,wBAAwB;QACxB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7D,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,KAAK;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAE/B,kCAAkC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,mCAAmC;IACnC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,qEAAqE;IACrE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,IAAI,CAAC,aAAa;YAAE,OAAO,EAAO,CAAC;QAEnC,MAAM,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QAEpC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACzC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC;oBACH,MAAM,CAAC,GAAc,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAe,CAAC;gBAC3D,CAAC;gBAAC,MAAM,CAAC;oBACP,2CAA2C;oBAC3C,MAAM,CAAC,GAAc,CAAC,GAAG,KAAmB,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAElC,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAoB,GAAM,EAAE,KAAW,EAAE,EAAE;QACzC,QAAQ,CAAC,GAAU,EAAE,KAAY,CAAC,CAAC;IACrC,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QAEnC,6BAA6B;QAC7B,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IAE9C,+DAA+D;IAC/D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO;YACL,OAAO,EAAE,cAAc;YACvB,SAAS;YACT,YAAY;SACb,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,OAAO;QACL,MAAM,EAAE,YAAY;QACpB,QAAQ;QACR,SAAS;QACT,QAAQ,EAAE,UAAU;QACpB,UAAU;QACV,WAAW;QACX,UAAU;QACV,OAAO;QACP,MAAM;QACN,OAAO;QACP,UAAU;QACV,YAAY;QACZ,UAAU;QACV,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ export type { TetraConfig, AuthUser as TetraAuthUser, Organization as TetraOrganization, FilterConfig, SortFieldConfig, FeatureDisplayConfig, PageDisplayConfig, ListDisplayConfig, CardDisplayConfig, ApiResponse, ListParams, } from "./types/index.js";
2
+ export { cn } from "./lib/utils.js";
3
+ export { ThemeProvider, useTheme } from "./providers/ThemeProvider.js";
4
+ export { QueryProvider } from "./providers/QueryProvider.js";
5
+ export { useAuth, getAccessToken, waitForAuthReady, configureAuth, } from "./hooks/useAuth.js";
6
+ export { useOrganizations, type Organization, } from "./hooks/useOrganizations.js";
7
+ export { apiClient, configureApiClient, type GetAccessTokenFn, } from "./services/apiClient.js";
8
+ export { ThemeToggle } from "./components/ThemeToggle.js";
9
+ export { OrgSwitcher } from "./components/OrgSwitcher.js";
10
+ export { ProtectedRoute } from "./components/ProtectedRoute.js";
11
+ export { PageHeader } from "./components/PageHeader.js";
12
+ export { GenericListLayout, type SortOption, type GenericListLayoutProps, } from "./components/GenericListLayout.js";
13
+ export { generateList, BaseGrid } from "./components/ListGenerator.js";
14
+ export { LoadingCard, LoadingSpinner, Skeleton, SkeletonCard, } from "./components/LoadingStates.js";
15
+ export { StatusBadge } from "./components/StatusBadge.js";
16
+ export { AutoCard, type CardConfig, type AutoCardProps, type LinkComponent } from "./components/AutoCard.js";
17
+ export { CookieConsent, type CookieConsentProps } from "./components/CookieConsent.js";
18
+ export { useDebounce } from "./hooks/useDebounce.js";
19
+ export { useDialog } from "./hooks/useDialog.js";
20
+ export { useIsMobile } from "./hooks/use-mobile.js";
21
+ export { useInfiniteScroll } from "./hooks/useInfiniteScroll.js";
22
+ export { useCacheInvalidation } from "./hooks/useCacheInvalidation.js";
23
+ export { useFormSubmit } from "./hooks/useFormSubmit.js";
24
+ export { useQueryState } from "./hooks/useQueryState.js";
25
+ export { usePersistedQueryState, clearAllPersistedFilters, getPersistedFilters, } from "./hooks/usePersistedQueryState.js";
26
+ export { useFilterConfigs, generateSortOptions, type FilterConfigsResponse, type PaginationConfig, } from "./hooks/useFilterConfigs.js";
27
+ export { usePageContext, PageContextProvider, type PageContext, } from "./hooks/usePageContext.js";
28
+ export { useGenericList } from "./hooks/useGenericList.js";
29
+ export { useGenericListWithConfig } from "./hooks/useGenericListWithConfig.js";
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,WAAW,EACX,QAAQ,IAAI,aAAa,EACzB,YAAY,IAAI,iBAAiB,EACjC,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,UAAU,GACX,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EACL,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,gBAAgB,EAChB,KAAK,YAAY,GAClB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,sBAAsB,GAC5B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EACL,WAAW,EACX,cAAc,EACd,QAAQ,EACR,YAAY,GACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGvF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,KAAK,WAAW,GACjB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ // ============================================
2
+ // @tetra/ui — Shared React frontend framework
3
+ // ============================================
4
+ // Utilities
5
+ export { cn } from "./lib/utils.js";
6
+ // Providers
7
+ export { ThemeProvider, useTheme } from "./providers/ThemeProvider.js";
8
+ export { QueryProvider } from "./providers/QueryProvider.js";
9
+ // Auth
10
+ export { useAuth, getAccessToken, waitForAuthReady, configureAuth, } from "./hooks/useAuth.js";
11
+ // Multi-tenant
12
+ export { useOrganizations, } from "./hooks/useOrganizations.js";
13
+ // Services
14
+ export { apiClient, configureApiClient, } from "./services/apiClient.js";
15
+ // Components
16
+ export { ThemeToggle } from "./components/ThemeToggle.js";
17
+ export { OrgSwitcher } from "./components/OrgSwitcher.js";
18
+ export { ProtectedRoute } from "./components/ProtectedRoute.js";
19
+ // Config-driven page components (ported from SparkBuddy)
20
+ export { PageHeader } from "./components/PageHeader.js";
21
+ export { GenericListLayout, } from "./components/GenericListLayout.js";
22
+ export { generateList, BaseGrid } from "./components/ListGenerator.js";
23
+ export { LoadingCard, LoadingSpinner, Skeleton, SkeletonCard, } from "./components/LoadingStates.js";
24
+ export { StatusBadge } from "./components/StatusBadge.js";
25
+ export { AutoCard } from "./components/AutoCard.js";
26
+ export { CookieConsent } from "./components/CookieConsent.js";
27
+ // Hooks — utility
28
+ export { useDebounce } from "./hooks/useDebounce.js";
29
+ export { useDialog } from "./hooks/useDialog.js";
30
+ export { useIsMobile } from "./hooks/use-mobile.js";
31
+ export { useInfiniteScroll } from "./hooks/useInfiniteScroll.js";
32
+ export { useCacheInvalidation } from "./hooks/useCacheInvalidation.js";
33
+ export { useFormSubmit } from "./hooks/useFormSubmit.js";
34
+ // Hooks — query state & filters
35
+ export { useQueryState } from "./hooks/useQueryState.js";
36
+ export { usePersistedQueryState, clearAllPersistedFilters, getPersistedFilters, } from "./hooks/usePersistedQueryState.js";
37
+ export { useFilterConfigs, generateSortOptions, } from "./hooks/useFilterConfigs.js";
38
+ // Page context (for sidebars that read page state)
39
+ export { usePageContext, PageContextProvider, } from "./hooks/usePageContext.js";
40
+ // Hooks — generic list
41
+ export { useGenericList } from "./hooks/useGenericList.js";
42
+ export { useGenericListWithConfig } from "./hooks/useGenericListWithConfig.js";
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,8CAA8C;AAC9C,+CAA+C;AAiB/C,YAAY;AACZ,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO;AACP,OAAO,EACL,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAE5B,eAAe;AACf,OAAO,EACL,gBAAgB,GAEjB,MAAM,6BAA6B,CAAC;AAErC,WAAW;AACX,OAAO,EACL,SAAS,EACT,kBAAkB,GAEnB,MAAM,yBAAyB,CAAC;AAEjC,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,yDAAyD;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EACL,iBAAiB,GAGlB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EACL,WAAW,EACX,cAAc,EACd,QAAQ,EACR,YAAY,GACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAA2D,MAAM,0BAA0B,CAAC;AAC7G,OAAO,EAAE,aAAa,EAA2B,MAAM,+BAA+B,CAAC;AAEvF,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,gCAAgC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GAGpB,MAAM,6BAA6B,CAAC;AAErC,mDAAmD;AACnD,OAAO,EACL,cAAc,EACd,mBAAmB,GAEpB,MAAM,2BAA2B,CAAC;AAEnC,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ClassValue } from "clsx";
2
+ export declare function cn(...inputs: ClassValue[]): string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
@@ -0,0 +1,6 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
6
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from "react";
2
+ /**
3
+ * Standard React Query provider for all VCA projects.
4
+ * Default: 60s staleTime, 1 retry.
5
+ */
6
+ export declare function QueryProvider({ children }: {
7
+ children: ReactNode;
8
+ }): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=QueryProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryProvider.d.ts","sourceRoot":"","sources":["../../src/providers/QueryProvider.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAgBlE"}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
5
+ /**
6
+ * Standard React Query provider for all VCA projects.
7
+ * Default: 60s staleTime, 1 retry.
8
+ */
9
+ export function QueryProvider({ children }) {
10
+ const [queryClient] = useState(() => new QueryClient({
11
+ defaultOptions: {
12
+ queries: {
13
+ staleTime: 60 * 1000,
14
+ retry: 1,
15
+ },
16
+ },
17
+ }));
18
+ return (_jsx(QueryClientProvider, { client: queryClient, children: children }));
19
+ }
20
+ //# sourceMappingURL=QueryProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryProvider.js","sourceRoot":"","sources":["../../src/providers/QueryProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAc,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEzE;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAA2B;IACjE,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAC5B,GAAG,EAAE,CACH,IAAI,WAAW,CAAC;QACd,cAAc,EAAE;YACd,OAAO,EAAE;gBACP,SAAS,EAAE,EAAE,GAAG,IAAI;gBACpB,KAAK,EAAE,CAAC;aACT;SACF;KACF,CAAC,CACL,CAAC;IAEF,OAAO,CACL,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YAAG,QAAQ,GAAuB,CAC3E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from "react";
2
+ interface ThemeProviderProps {
3
+ children: ReactNode;
4
+ /** Default theme (default: "dark") */
5
+ defaultTheme?: "light" | "dark" | "system";
6
+ }
7
+ /**
8
+ * Standard theme provider for all VCA projects.
9
+ * Uses next-themes. Sets .dark class on <html> for Tailwind.
10
+ */
11
+ export declare function ThemeProvider({ children, defaultTheme, }: ThemeProviderProps): import("react/jsx-runtime").JSX.Element;
12
+ /** Re-export next-themes useTheme — one import for consumers */
13
+ export declare const useTheme: () => import("next-themes").UseThemeProps;
14
+ export {};
15
+ //# sourceMappingURL=ThemeProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ThemeProvider.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAqB,GACtB,EAAE,kBAAkB,2CAMpB;AAED,gEAAgE;AAChE,eAAO,MAAM,QAAQ,2CAAe,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { ThemeProvider as NextThemesProvider, useTheme as useNextTheme } from "next-themes";
4
+ /**
5
+ * Standard theme provider for all VCA projects.
6
+ * Uses next-themes. Sets .dark class on <html> for Tailwind.
7
+ */
8
+ export function ThemeProvider({ children, defaultTheme = "dark", }) {
9
+ return (_jsx(NextThemesProvider, { attribute: "class", defaultTheme: defaultTheme, enableSystem: true, children: children }));
10
+ }
11
+ /** Re-export next-themes useTheme — one import for consumers */
12
+ export const useTheme = useNextTheme;
13
+ //# sourceMappingURL=ThemeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeProvider.js","sourceRoot":"","sources":["../../src/providers/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,aAAa,IAAI,kBAAkB,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ5F;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAY,GAAG,MAAM,GACF;IACnB,OAAO,CACL,KAAC,kBAAkB,IAAC,SAAS,EAAC,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,YAAY,kBAC3E,QAAQ,GACU,CACtB,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Standard API client for all VCA projects.
3
+ * Injects Bearer token from auth module.
4
+ * Configure with createApiClient(baseUrl, getAccessToken).
5
+ */
6
+ export type GetAccessTokenFn = () => string | null;
7
+ /**
8
+ * Initialize the API client. Call once at app startup.
9
+ * @param baseUrl - API base URL (e.g., from NEXT_PUBLIC_API_URL)
10
+ * @param getAccessToken - Function that returns the current access token
11
+ */
12
+ export declare function configureApiClient(baseUrl: string, getAccessToken: GetAccessTokenFn): void;
13
+ export declare const apiClient: {
14
+ get<T>(path: string): Promise<T>;
15
+ post<T>(path: string, body?: unknown): Promise<T>;
16
+ put<T>(path: string, body: unknown): Promise<T>;
17
+ patch<T>(path: string, body: unknown): Promise<T>;
18
+ delete<T>(path: string): Promise<T>;
19
+ };
20
+ //# sourceMappingURL=apiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/services/apiClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,gBAAgB,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAKnD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,gBAAgB,QAIjC;AA4BD,eAAO,MAAM,SAAS;QACV,CAAC,QAAQ,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;SAM3B,CAAC,QAAQ,MAAM,SAAS,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;QAU7C,CAAC,QAAQ,MAAM,QAAQ,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;UAUzC,CAAC,QAAQ,MAAM,QAAQ,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;WAU1C,CAAC,QAAQ,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAQ1C,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Standard API client for all VCA projects.
3
+ * Injects Bearer token from auth module.
4
+ * Configure with createApiClient(baseUrl, getAccessToken).
5
+ */
6
+ let _baseUrl = "";
7
+ let _getAccessToken = () => null;
8
+ /**
9
+ * Initialize the API client. Call once at app startup.
10
+ * @param baseUrl - API base URL (e.g., from NEXT_PUBLIC_API_URL)
11
+ * @param getAccessToken - Function that returns the current access token
12
+ */
13
+ export function configureApiClient(baseUrl, getAccessToken) {
14
+ _baseUrl = baseUrl;
15
+ _getAccessToken = getAccessToken;
16
+ }
17
+ async function throwIfError(res) {
18
+ if (res.ok)
19
+ return;
20
+ let detail = "";
21
+ try {
22
+ const body = await res.json();
23
+ detail = body.detail || body.error || body.message || "";
24
+ }
25
+ catch {
26
+ // no JSON body
27
+ }
28
+ const msg = detail
29
+ ? `API ${res.status}: ${detail}`
30
+ : `API error: ${res.status}`;
31
+ throw new Error(msg);
32
+ }
33
+ function getHeaders() {
34
+ const headers = {
35
+ "Content-Type": "application/json",
36
+ };
37
+ const token = _getAccessToken();
38
+ if (token) {
39
+ headers["Authorization"] = `Bearer ${token}`;
40
+ }
41
+ return headers;
42
+ }
43
+ export const apiClient = {
44
+ async get(path) {
45
+ const res = await fetch(`${_baseUrl}${path}`, { headers: getHeaders() });
46
+ await throwIfError(res);
47
+ return res.json();
48
+ },
49
+ async post(path, body) {
50
+ const res = await fetch(`${_baseUrl}${path}`, {
51
+ method: "POST",
52
+ headers: getHeaders(),
53
+ body: body != null ? JSON.stringify(body) : undefined,
54
+ });
55
+ await throwIfError(res);
56
+ return res.json();
57
+ },
58
+ async put(path, body) {
59
+ const res = await fetch(`${_baseUrl}${path}`, {
60
+ method: "PUT",
61
+ headers: getHeaders(),
62
+ body: JSON.stringify(body),
63
+ });
64
+ await throwIfError(res);
65
+ return res.json();
66
+ },
67
+ async patch(path, body) {
68
+ const res = await fetch(`${_baseUrl}${path}`, {
69
+ method: "PATCH",
70
+ headers: getHeaders(),
71
+ body: JSON.stringify(body),
72
+ });
73
+ await throwIfError(res);
74
+ return res.json();
75
+ },
76
+ async delete(path) {
77
+ const res = await fetch(`${_baseUrl}${path}`, {
78
+ method: "DELETE",
79
+ headers: getHeaders(),
80
+ });
81
+ await throwIfError(res);
82
+ return res.json();
83
+ },
84
+ };
85
+ //# sourceMappingURL=apiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../src/services/apiClient.ts"],"names":[],"mappings":"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"}