@fluid-app/rep-sdk 0.1.1 → 0.1.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 (73) hide show
  1. package/dist/ContactsScreen-33AJ5XUB.js +5 -0
  2. package/dist/{ContactsScreen-BYXF74BO.js.map → ContactsScreen-33AJ5XUB.js.map} +1 -1
  3. package/dist/ContactsScreen-ATASCZO2.cjs +18 -0
  4. package/dist/{ContactsScreen-XZOQJVFE.cjs.map → ContactsScreen-ATASCZO2.cjs.map} +1 -1
  5. package/dist/CustomersScreen-E4HXBKV7.js +5 -0
  6. package/dist/{CustomersScreen-VS6LGULO.js.map → CustomersScreen-E4HXBKV7.js.map} +1 -1
  7. package/dist/CustomersScreen-XMPMKSQA.cjs +18 -0
  8. package/dist/{CustomersScreen-53SXRDDK.cjs.map → CustomersScreen-XMPMKSQA.cjs.map} +1 -1
  9. package/dist/MessagingScreen-4H7ZBO3V.js +4 -0
  10. package/dist/{MessagingScreen-O42JEJMW.js.map → MessagingScreen-4H7ZBO3V.js.map} +1 -1
  11. package/dist/MessagingScreen-UPFXQZV3.cjs +17 -0
  12. package/dist/{MessagingScreen-UCVLYWZB.cjs.map → MessagingScreen-UPFXQZV3.cjs.map} +1 -1
  13. package/dist/OrdersScreen-IPPZLEYF.js +5 -0
  14. package/dist/{OrdersScreen-QQJFTTSS.js.map → OrdersScreen-IPPZLEYF.js.map} +1 -1
  15. package/dist/OrdersScreen-X7FYUROL.cjs +18 -0
  16. package/dist/{OrdersScreen-WNT2WDLI.cjs.map → OrdersScreen-X7FYUROL.cjs.map} +1 -1
  17. package/dist/ProductsScreen-4ZIUQNUU.cjs +18 -0
  18. package/dist/{ProductsScreen-CTIAKS3Z.cjs.map → ProductsScreen-4ZIUQNUU.cjs.map} +1 -1
  19. package/dist/ProductsScreen-YTSOZW7B.js +5 -0
  20. package/dist/{ProductsScreen-TRIT2FE3.js.map → ProductsScreen-YTSOZW7B.js.map} +1 -1
  21. package/dist/chunk-424PT5DM.js +21 -0
  22. package/dist/chunk-424PT5DM.js.map +1 -0
  23. package/dist/{chunk-QUVJ3R4T.cjs → chunk-5UBEM3AX.cjs} +4 -4
  24. package/dist/{chunk-QUVJ3R4T.cjs.map → chunk-5UBEM3AX.cjs.map} +1 -1
  25. package/dist/chunk-7JMNKWPN.js +1868 -0
  26. package/dist/chunk-7JMNKWPN.js.map +1 -0
  27. package/dist/chunk-B6S6BEPL.cjs +16 -0
  28. package/dist/chunk-B6S6BEPL.cjs.map +1 -0
  29. package/dist/{chunk-WH7WZXT6.js → chunk-CMF2FYTD.js} +3 -3
  30. package/dist/{chunk-WH7WZXT6.js.map → chunk-CMF2FYTD.js.map} +1 -1
  31. package/dist/{chunk-MEOOAMH2.cjs → chunk-EOXYOOWS.cjs} +4 -4
  32. package/dist/{chunk-MEOOAMH2.cjs.map → chunk-EOXYOOWS.cjs.map} +1 -1
  33. package/dist/{chunk-YII3IXF4.cjs → chunk-FG2CI6HA.cjs} +4 -4
  34. package/dist/{chunk-YII3IXF4.cjs.map → chunk-FG2CI6HA.cjs.map} +1 -1
  35. package/dist/chunk-HDQ2JUQT.cjs +24 -0
  36. package/dist/chunk-HDQ2JUQT.cjs.map +1 -0
  37. package/dist/{chunk-MBUCXIUN.cjs → chunk-MHPK7YQ2.cjs} +4 -4
  38. package/dist/{chunk-MBUCXIUN.cjs.map → chunk-MHPK7YQ2.cjs.map} +1 -1
  39. package/dist/{chunk-2AWTZV3T.js → chunk-QZMWG7EM.js} +3 -3
  40. package/dist/{chunk-2AWTZV3T.js.map → chunk-QZMWG7EM.js.map} +1 -1
  41. package/dist/chunk-RS4OSTES.js +14 -0
  42. package/dist/chunk-RS4OSTES.js.map +1 -0
  43. package/dist/chunk-V3IMQZIG.cjs +1942 -0
  44. package/dist/chunk-V3IMQZIG.cjs.map +1 -0
  45. package/dist/{chunk-PZIHCYDD.js → chunk-WFPYEYC7.js} +3 -3
  46. package/dist/{chunk-PZIHCYDD.js.map → chunk-WFPYEYC7.js.map} +1 -1
  47. package/dist/{chunk-CXRJSGO6.js → chunk-WMBD65GH.js} +3 -3
  48. package/dist/{chunk-CXRJSGO6.js.map → chunk-WMBD65GH.js.map} +1 -1
  49. package/dist/index.cjs +1470 -1055
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.cts +2596 -0
  52. package/dist/index.d.ts +2596 -0
  53. package/dist/index.js +1269 -993
  54. package/dist/index.js.map +1 -1
  55. package/package.json +27 -8
  56. package/dist/ContactsScreen-BYXF74BO.js +0 -4
  57. package/dist/ContactsScreen-XZOQJVFE.cjs +0 -17
  58. package/dist/CustomersScreen-53SXRDDK.cjs +0 -17
  59. package/dist/CustomersScreen-VS6LGULO.js +0 -4
  60. package/dist/MessagingScreen-O42JEJMW.js +0 -4
  61. package/dist/MessagingScreen-UCVLYWZB.cjs +0 -17
  62. package/dist/OrdersScreen-QQJFTTSS.js +0 -4
  63. package/dist/OrdersScreen-WNT2WDLI.cjs +0 -17
  64. package/dist/ProductsScreen-CTIAKS3Z.cjs +0 -17
  65. package/dist/ProductsScreen-TRIT2FE3.js +0 -4
  66. package/dist/chunk-DEQ3PBVX.cjs +0 -29
  67. package/dist/chunk-DEQ3PBVX.cjs.map +0 -1
  68. package/dist/chunk-JZRNKSKT.cjs +0 -19
  69. package/dist/chunk-JZRNKSKT.cjs.map +0 -1
  70. package/dist/chunk-LO2HDG6C.js +0 -26
  71. package/dist/chunk-LO2HDG6C.js.map +0 -1
  72. package/dist/chunk-PJWPO4BJ.js +0 -16
  73. package/dist/chunk-PJWPO4BJ.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,943 +1,32 @@
1
1
  'use strict';
2
2
 
3
- var chunkJZRNKSKT_cjs = require('./chunk-JZRNKSKT.cjs');
4
- var chunkMEOOAMH2_cjs = require('./chunk-MEOOAMH2.cjs');
5
- var chunkYII3IXF4_cjs = require('./chunk-YII3IXF4.cjs');
6
- var chunkMBUCXIUN_cjs = require('./chunk-MBUCXIUN.cjs');
7
- var chunkQUVJ3R4T_cjs = require('./chunk-QUVJ3R4T.cjs');
8
- var chunkDEQ3PBVX_cjs = require('./chunk-DEQ3PBVX.cjs');
3
+ var chunkV3IMQZIG_cjs = require('./chunk-V3IMQZIG.cjs');
4
+ var chunkEOXYOOWS_cjs = require('./chunk-EOXYOOWS.cjs');
5
+ var chunkFG2CI6HA_cjs = require('./chunk-FG2CI6HA.cjs');
6
+ var chunkMHPK7YQ2_cjs = require('./chunk-MHPK7YQ2.cjs');
7
+ var chunk5UBEM3AX_cjs = require('./chunk-5UBEM3AX.cjs');
8
+ var chunkB6S6BEPL_cjs = require('./chunk-B6S6BEPL.cjs');
9
+ require('./chunk-HDQ2JUQT.cjs');
9
10
  var react = require('react');
10
- var reactQuery = require('@tanstack/react-query');
11
11
  var jsxRuntime = require('react/jsx-runtime');
12
- var jose = require('jose');
12
+ var reactQuery = require('@tanstack/react-query');
13
13
  var types = require('@fluid-app/rep-core/types');
14
- var theme_star = require('@fluid-app/rep-core/theme');
15
14
  var widgets = require('@fluid-app/rep-widgets/widgets');
16
15
  var widgetUtils = require('@fluid-app/rep-core/widget-utils');
17
16
  var registries = require('@fluid-app/rep-core/registries');
18
-
19
- function _interopNamespace(e) {
20
- if (e && e.__esModule) return e;
21
- var n = Object.create(null);
22
- if (e) {
23
- Object.keys(e).forEach(function (k) {
24
- if (k !== 'default') {
25
- var d = Object.getOwnPropertyDescriptor(e, k);
26
- Object.defineProperty(n, k, d.get ? d : {
27
- enumerable: true,
28
- get: function () { return e[k]; }
29
- });
30
- }
31
- });
32
- }
33
- n.default = e;
34
- return Object.freeze(n);
35
- }
36
-
37
- var theme_star__namespace = /*#__PURE__*/_interopNamespace(theme_star);
38
-
39
- // src/client/types.ts
40
- var HTTP_METHODS = {
41
- GET: "GET",
42
- POST: "POST",
43
- PUT: "PUT",
44
- PATCH: "PATCH",
45
- DELETE: "DELETE"
46
- };
47
-
48
- // src/auth/auth-redirect.ts
49
- var DEFAULT_AUTH_URL = "https://auth.fluid.app";
50
- var AUTH_REDIRECT_TOKEN_KEY = "jwt";
51
- var REDIRECT_TIMESTAMP_KEY = "__fluid_auth_redirect_ts";
52
- var REDIRECT_COOLDOWN_S = 10;
53
- function isRedirectLoop() {
54
- try {
55
- const ts = sessionStorage.getItem(REDIRECT_TIMESTAMP_KEY);
56
- if (!ts) return false;
57
- const elapsed = (Date.now() - Number(ts)) / 1e3;
58
- return elapsed < REDIRECT_COOLDOWN_S;
59
- } catch {
60
- return false;
61
- }
62
- }
63
- function markRedirect() {
64
- try {
65
- sessionStorage.setItem(REDIRECT_TIMESTAMP_KEY, String(Date.now()));
66
- } catch {
67
- }
68
- }
69
- function createDefaultAuthRedirect(authUrl) {
70
- return () => {
71
- if (isRedirectLoop()) {
72
- console.warn(
73
- "[FluidAuth] Auth redirect suppressed \u2014 possible redirect loop. Check that your auth server returns a token accepted by the API."
74
- );
75
- return;
76
- }
77
- markRedirect();
78
- const base = authUrl ?? DEFAULT_AUTH_URL;
79
- const currentUrl = encodeURIComponent(window.location.href);
80
- window.location.href = `${base}/?redirect_url=${currentUrl}`;
81
- };
82
- }
83
- function resolveAuthFailureHandler(onAuthFailure, authUrl) {
84
- return onAuthFailure ?? createDefaultAuthRedirect(authUrl);
85
- }
86
-
87
- // src/client/fluid-client.ts
88
- var ApiError = class _ApiError extends Error {
89
- status;
90
- data;
91
- constructor(message, status, data) {
92
- super(message);
93
- this.name = "ApiError";
94
- this.status = status;
95
- this.data = data;
96
- const errorWithCapture = Error;
97
- if (errorWithCapture.captureStackTrace) {
98
- errorWithCapture.captureStackTrace(this, _ApiError);
99
- }
100
- }
101
- toJSON() {
102
- return {
103
- name: this.name,
104
- message: this.message,
105
- status: this.status,
106
- data: this.data
107
- };
108
- }
109
- };
110
- function isApiError(error) {
111
- return error instanceof ApiError;
112
- }
113
- function isString(value) {
114
- return typeof value === "string";
115
- }
116
- function extractErrorMessage(data, fallback) {
117
- if ("message" in data && isString(data.message)) {
118
- return data.message;
119
- }
120
- if ("error_message" in data && isString(data.error_message)) {
121
- return data.error_message;
122
- }
123
- if ("error" in data && isString(data.error)) {
124
- return data.error;
125
- }
126
- return fallback;
127
- }
128
- function createFluidClient(config) {
129
- const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;
130
- const effectiveOnAuthError = onAuthError ?? createDefaultAuthRedirect();
131
- async function buildHeaders(customHeaders) {
132
- const headers = {
133
- "Content-Type": "application/json",
134
- ...defaultHeaders,
135
- ...customHeaders
136
- };
137
- if (getAuthToken) {
138
- const token = await getAuthToken();
139
- if (token) {
140
- headers.Authorization = `Bearer ${token}`;
141
- }
142
- }
143
- return headers;
144
- }
145
- function buildUrl(endpoint, params) {
146
- const normalizedBase = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
147
- const normalizedEndpoint = endpoint.startsWith("/") ? endpoint : `/${endpoint}`;
148
- const url = new URL(normalizedBase + normalizedEndpoint);
149
- if (params) {
150
- for (const [key, value] of Object.entries(params)) {
151
- if (value === void 0 || value === null) {
152
- continue;
153
- }
154
- if (Array.isArray(value)) {
155
- for (const item of value) {
156
- url.searchParams.append(`${key}[]`, String(item));
157
- }
158
- } else if (typeof value === "object") {
159
- for (const [subKey, subValue] of Object.entries(
160
- value
161
- )) {
162
- if (subValue === void 0 || subValue === null) {
163
- continue;
164
- }
165
- if (Array.isArray(subValue)) {
166
- for (const item of subValue) {
167
- url.searchParams.append(`${key}[${subKey}][]`, String(item));
168
- }
169
- } else {
170
- url.searchParams.append(`${key}[${subKey}]`, String(subValue));
171
- }
172
- }
173
- } else {
174
- url.searchParams.append(key, String(value));
175
- }
176
- }
177
- }
178
- return url.toString();
179
- }
180
- const defaultRequestOptions = {
181
- method: HTTP_METHODS.GET
182
- };
183
- async function request(endpoint, options = {}) {
184
- const {
185
- method = defaultRequestOptions.method,
186
- headers: customHeaders,
187
- params,
188
- body,
189
- signal
190
- } = options;
191
- const url = buildUrl(
192
- endpoint,
193
- method === HTTP_METHODS.GET ? params : void 0
194
- );
195
- const headers = await buildHeaders(customHeaders);
196
- let response;
197
- try {
198
- const fetchOptions = {
199
- method,
200
- headers
201
- };
202
- if (signal !== void 0) {
203
- fetchOptions.signal = signal;
204
- }
205
- if (body && method !== HTTP_METHODS.GET) {
206
- fetchOptions.body = JSON.stringify(body);
207
- }
208
- response = await fetch(url, fetchOptions);
209
- } catch (networkError) {
210
- throw new ApiError(
211
- `Network error: ${networkError instanceof Error ? networkError.message : "Unknown network error"}`,
212
- 0,
213
- null
214
- );
215
- }
216
- if (response.status === 401) {
217
- effectiveOnAuthError();
218
- }
219
- if (!response.ok) {
220
- try {
221
- const contentType = response.headers.get("content-type");
222
- if (contentType?.includes("application/json")) {
223
- const data = await response.json();
224
- const errorMessage = extractErrorMessage(
225
- data,
226
- `${method} request failed`
227
- );
228
- throw new ApiError(
229
- errorMessage,
230
- response.status,
231
- "errors" in data ? data.errors : data
232
- );
233
- } else {
234
- throw new ApiError(
235
- `${method} request failed with status ${response.status}`,
236
- response.status,
237
- null
238
- );
239
- }
240
- } catch (error) {
241
- if (isApiError(error)) {
242
- throw error;
243
- }
244
- throw new ApiError(
245
- `${method} request failed with status ${response.status}`,
246
- response.status,
247
- null
248
- );
249
- }
250
- }
251
- if (response.status === 204 || response.headers.get("content-length") === "0") {
252
- return null;
253
- }
254
- try {
255
- const data = await response.json();
256
- if (data === null || data === void 0) {
257
- throw new ApiError(
258
- "Unexpected null/undefined in JSON response",
259
- response.status,
260
- null
261
- );
262
- }
263
- return data;
264
- } catch (parseError) {
265
- if (isApiError(parseError)) {
266
- throw parseError;
267
- }
268
- throw new ApiError(
269
- "Failed to parse response as JSON",
270
- response.status,
271
- null
272
- );
273
- }
274
- }
275
- async function requestNullable(endpoint, options = {}) {
276
- return request(endpoint, options);
277
- }
278
- async function safeRequest(endpoint, options = {}) {
279
- try {
280
- const data = await request(endpoint, options);
281
- return { success: true, data };
282
- } catch (error) {
283
- if (isApiError(error)) {
284
- return { success: false, error };
285
- }
286
- return {
287
- success: false,
288
- error: new ApiError(
289
- error instanceof Error ? error.message : "Unknown error",
290
- 0,
291
- null
292
- )
293
- };
294
- }
295
- }
296
- function toParams(params) {
297
- return params;
298
- }
299
- const get = (endpoint, params, options) => {
300
- const baseOptions = {
301
- ...options,
302
- method: HTTP_METHODS.GET
303
- };
304
- const convertedParams = toParams(params);
305
- const requestOptions = convertedParams !== void 0 ? { ...baseOptions, params: convertedParams } : baseOptions;
306
- return request(endpoint, requestOptions);
307
- };
308
- const post = (endpoint, body, options) => request(endpoint, {
309
- ...options,
310
- method: HTTP_METHODS.POST,
311
- body
312
- });
313
- const put = (endpoint, body, options) => request(endpoint, {
314
- ...options,
315
- method: HTTP_METHODS.PUT,
316
- body
317
- });
318
- const patch = (endpoint, body, options) => request(endpoint, {
319
- ...options,
320
- method: HTTP_METHODS.PATCH,
321
- body
322
- });
323
- const del = (endpoint, options) => request(endpoint, {
324
- ...options,
325
- method: HTTP_METHODS.DELETE
326
- });
327
- return {
328
- // Low-level methods for custom endpoints
329
- request,
330
- requestNullable,
331
- safeRequest,
332
- get,
333
- post,
334
- put,
335
- patch,
336
- delete: del,
337
- // Products API - matches fluid-admin's /company/v1/products
338
- products: {
339
- list: (params) => get(
340
- "/company/v1/products",
341
- params
342
- ),
343
- get: (id) => get(`/company/v1/products/${id}`),
344
- search: (query, params) => get("/company/v1/products", {
345
- search_query: query,
346
- ...params
347
- })
348
- },
349
- // Orders API
350
- orders: {
351
- list: (params) => get("/orders", params),
352
- get: (id) => get(`/orders/${id}`),
353
- create: (data) => post("/orders", data)
354
- },
355
- // Reps API
356
- reps: {
357
- current: () => get("/reps/me"),
358
- updateProfile: (data) => patch("/reps/me", data)
359
- },
360
- // Profile API (themes, navigation, screens)
361
- profile: {
362
- get: () => get("/rep_app/manifest")
363
- },
364
- // Permissions API
365
- permissions: {
366
- get: () => get("/company/roles/my_permissions")
367
- },
368
- // Analytics API
369
- analytics: {
370
- dashboard: () => get("/analytics/dashboard"),
371
- sales: (params) => get("/analytics/sales", params)
372
- }
373
- };
374
- }
375
- var ThemeContext = react.createContext(null);
376
- function applyThemeVariables(theme, container) {
377
- const target = container ?? document.documentElement;
378
- for (const [key, value] of Object.entries(theme.config)) {
379
- target.style.setProperty(`--fluid-${key}`, value);
380
- }
381
- if (theme.mode) {
382
- target.dataset.fluidThemeMode = theme.mode;
383
- }
384
- }
385
- function FluidThemeProvider({
386
- children,
387
- initialTheme,
388
- container
389
- }) {
390
- const [currentTheme, setCurrentTheme] = react.useState(
391
- initialTheme ?? null
392
- );
393
- react.useEffect(() => {
394
- if (currentTheme) {
395
- applyThemeVariables(currentTheme, container ?? null);
396
- }
397
- }, [currentTheme, container]);
398
- const setTheme = react.useCallback((theme) => {
399
- setCurrentTheme(theme);
400
- }, []);
401
- const setThemeMode = react.useCallback((mode) => {
402
- setCurrentTheme((prev) => prev ? { ...prev, mode } : null);
403
- }, []);
404
- const value = react.useMemo(
405
- () => ({
406
- currentTheme,
407
- setTheme,
408
- setThemeMode
409
- }),
410
- [currentTheme, setTheme, setThemeMode]
411
- );
412
- return /* @__PURE__ */ jsxRuntime.jsx(ThemeContext.Provider, { value, children });
413
- }
414
- function useThemeContext() {
415
- const context = react.useContext(ThemeContext);
416
- if (!context) {
417
- throw new Error("useThemeContext must be used within a FluidThemeProvider");
418
- }
419
- return context;
420
- }
421
- var FluidContext = react.createContext(null);
422
- function FluidProvider({
423
- config,
424
- children,
425
- queryClient,
426
- initialTheme,
427
- themeContainer
428
- }) {
429
- const defaultQueryClient = react.useMemo(
430
- () => new reactQuery.QueryClient({
431
- defaultOptions: {
432
- queries: {
433
- staleTime: 1e3 * 60,
434
- // 1 minute
435
- retry: 1
436
- }
437
- }
438
- }),
439
- []
440
- );
441
- const configRef = react.useRef(config);
442
- configRef.current = config;
443
- const client = react.useMemo(
444
- () => createFluidClient(configRef.current),
445
- // eslint-disable-next-line react-hooks/exhaustive-deps
446
- [config.baseUrl]
447
- );
448
- const contextValue = react.useMemo(
449
- () => ({ client, config: configRef.current }),
450
- [client]
451
- );
452
- const themeProviderProps = {
453
- ...initialTheme !== void 0 && { initialTheme },
454
- ...themeContainer !== void 0 && { container: themeContainer }
455
- };
456
- return /* @__PURE__ */ jsxRuntime.jsx(reactQuery.QueryClientProvider, { client: queryClient ?? defaultQueryClient, children: /* @__PURE__ */ jsxRuntime.jsx(FluidContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(FluidThemeProvider, { ...themeProviderProps, children }) }) });
457
- }
458
- function useFluidContext() {
459
- const context = react.useContext(FluidContext);
460
- if (!context) {
461
- throw new Error("useFluidContext must be used within a FluidProvider");
462
- }
463
- return context;
464
- }
465
-
466
- // src/auth/constants.ts
467
- var AUTH_CONSTANTS = {
468
- /**
469
- * Grace period in milliseconds to account for clock skew
470
- * when checking token expiration. Tokens are considered valid
471
- * if they expire within this period.
472
- */
473
- TOKEN_GRACE_PERIOD_MS: 30 * 1e3,
474
- // 30 seconds
475
- /**
476
- * Default cookie max age in seconds (9 days).
477
- * This matches the typical JWT token lifetime from the Fluid API.
478
- */
479
- COOKIE_MAX_AGE: 9 * 24 * 60 * 60
480
- // 9 days = 777600 seconds
481
- };
482
- var STORAGE_KEYS = {
483
- /** localStorage key for user token */
484
- USER_TOKEN: "fluidUserToken",
485
- /** localStorage key for company token (legacy) */
486
- COMPANY_TOKEN: "fluidCompanyToken",
487
- /** Cookie name for auth token */
488
- AUTH_COOKIE: "auth_token"
489
- };
490
- var URL_PARAMS = {
491
- /** URL parameter name for user token */
492
- USER_TOKEN: "fluidUserToken",
493
- /** URL parameter name for company token (legacy) */
494
- COMPANY_TOKEN: "fluidCompanyToken"
495
- };
496
-
497
- // src/auth/url-token.ts
498
- function isBrowser() {
499
- return typeof window !== "undefined";
500
- }
501
- function extractTokenFromUrl(tokenKey = URL_PARAMS.USER_TOKEN) {
502
- if (!isBrowser()) {
503
- return null;
504
- }
505
- try {
506
- const searchParams = new URLSearchParams(window.location.search);
507
- return searchParams.get(tokenKey);
508
- } catch {
509
- return null;
510
- }
511
- }
512
- function extractCompanyTokenFromUrl(tokenKey = URL_PARAMS.COMPANY_TOKEN) {
513
- if (!isBrowser()) {
514
- return null;
515
- }
516
- try {
517
- const searchParams = new URLSearchParams(window.location.search);
518
- return searchParams.get(tokenKey);
519
- } catch {
520
- return null;
521
- }
522
- }
523
- function cleanTokenFromUrl(tokenKey = URL_PARAMS.USER_TOKEN) {
524
- if (!isBrowser()) {
525
- return;
526
- }
527
- try {
528
- const url = new URL(window.location.href);
529
- const hadToken = url.searchParams.has(tokenKey);
530
- const hadCompanyToken = url.searchParams.has(URL_PARAMS.COMPANY_TOKEN);
531
- url.searchParams.delete(tokenKey);
532
- url.searchParams.delete(URL_PARAMS.COMPANY_TOKEN);
533
- if (hadToken || hadCompanyToken) {
534
- window.history.replaceState(
535
- window.history.state,
536
- document.title,
537
- url.toString()
538
- );
539
- }
540
- } catch (error) {
541
- console.warn("[FluidAuth] Failed to clean token from URL:", error);
542
- }
543
- }
544
- function hasTokenInUrl(tokenKey = URL_PARAMS.USER_TOKEN) {
545
- if (!isBrowser()) {
546
- return false;
547
- }
548
- try {
549
- const searchParams = new URLSearchParams(window.location.search);
550
- return searchParams.has(tokenKey);
551
- } catch {
552
- return false;
553
- }
554
- }
555
- function extractAllTokensFromUrl(userTokenKey = URL_PARAMS.USER_TOKEN, companyTokenKey = URL_PARAMS.COMPANY_TOKEN) {
556
- if (!isBrowser()) {
557
- return { userToken: null, companyToken: null };
558
- }
559
- try {
560
- const searchParams = new URLSearchParams(window.location.search);
561
- return {
562
- userToken: searchParams.get(userTokenKey),
563
- companyToken: searchParams.get(companyTokenKey)
564
- };
565
- } catch {
566
- return { userToken: null, companyToken: null };
567
- }
568
- }
569
-
570
- // src/auth/token-storage.ts
571
- function isBrowser2() {
572
- return typeof window !== "undefined" && typeof document !== "undefined";
573
- }
574
- function parseCookies() {
575
- if (!isBrowser2()) {
576
- return {};
577
- }
578
- const cookies = {};
579
- const cookieString = document.cookie;
580
- if (!cookieString) {
581
- return cookies;
582
- }
583
- cookieString.split(";").forEach((cookie) => {
584
- const [name, ...valueParts] = cookie.trim().split("=");
585
- if (name) {
586
- cookies[name] = decodeURIComponent(valueParts.join("="));
587
- }
588
- });
589
- return cookies;
590
- }
591
- function setCookie(name, value, options = {}) {
592
- if (!isBrowser2()) {
593
- return;
594
- }
595
- const {
596
- maxAge = AUTH_CONSTANTS.COOKIE_MAX_AGE,
597
- path = "/",
598
- sameSite = "lax",
599
- secure = window.location.protocol === "https:"
600
- } = options;
601
- let cookieString = `${name}=${encodeURIComponent(value)}`;
602
- cookieString += `; path=${path}`;
603
- cookieString += `; max-age=${maxAge}`;
604
- cookieString += `; samesite=${sameSite}`;
605
- if (secure) {
606
- cookieString += "; secure";
607
- }
608
- document.cookie = cookieString;
609
- }
610
- function deleteCookie(name, path = "/") {
611
- if (!isBrowser2()) {
612
- return;
613
- }
614
- document.cookie = `${name}=; path=${path}; max-age=0`;
615
- }
616
- function getStoredToken(config) {
617
- if (!isBrowser2()) {
618
- return null;
619
- }
620
- const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;
621
- const localStorageKey = STORAGE_KEYS.USER_TOKEN;
622
- const cookies = parseCookies();
623
- const cookieToken = cookies[cookieKey];
624
- if (cookieToken) {
625
- return cookieToken;
626
- }
627
- try {
628
- return localStorage.getItem(localStorageKey);
629
- } catch {
630
- return null;
631
- }
632
- }
633
- function storeToken(token, config) {
634
- if (!isBrowser2()) {
635
- return;
636
- }
637
- const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;
638
- const maxAge = config?.cookieMaxAge ?? AUTH_CONSTANTS.COOKIE_MAX_AGE;
639
- try {
640
- setCookie(cookieKey, token, {
641
- maxAge,
642
- path: "/",
643
- // Use 'none' with secure for cross-origin iframe scenarios
644
- sameSite: window.self !== window.top ? "none" : "lax",
645
- secure: window.location.protocol === "https:"
646
- });
647
- } catch (error) {
648
- console.warn("[FluidAuth] Failed to store token in cookie:", error);
649
- }
650
- try {
651
- localStorage.setItem(STORAGE_KEYS.USER_TOKEN, token);
652
- } catch (error) {
653
- console.warn("[FluidAuth] Failed to store token in localStorage:", error);
654
- }
655
- }
656
- function clearTokens(config) {
657
- if (!isBrowser2()) {
658
- return;
659
- }
660
- const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;
661
- try {
662
- deleteCookie(cookieKey);
663
- } catch {
664
- }
665
- try {
666
- localStorage.removeItem(STORAGE_KEYS.USER_TOKEN);
667
- localStorage.removeItem(STORAGE_KEYS.COMPANY_TOKEN);
668
- } catch {
669
- }
670
- }
671
- function hasStoredToken(config) {
672
- return getStoredToken(config) !== null;
673
- }
674
- function extractPayloadFromJose(decoded) {
675
- return {
676
- id: decoded.id,
677
- email: decoded.email,
678
- full_name: decoded.full_name,
679
- user_type: decoded.user_type ?? "rep",
680
- og_user_type: decoded.og_user_type,
681
- company_id: decoded.company_id,
682
- exp: decoded.exp,
683
- auth_type: decoded.auth_type
684
- };
685
- }
686
- function decodeToken(token) {
687
- try {
688
- const decoded = jose.decodeJwt(token);
689
- return extractPayloadFromJose(decoded);
690
- } catch (error) {
691
- console.error("[FluidAuth] Failed to decode JWT token:", error);
692
- return null;
693
- }
694
- }
695
- function isTokenExpired(token, gracePeriodMs = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS) {
696
- try {
697
- const decoded = jose.decodeJwt(token);
698
- if (!decoded.exp) {
699
- return false;
700
- }
701
- const expirationTime = decoded.exp * 1e3;
702
- const currentTime = Date.now();
703
- return currentTime > expirationTime + gracePeriodMs;
704
- } catch {
705
- return true;
706
- }
707
- }
708
- function validateToken(token, gracePeriodMs = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS) {
709
- if (!token || token.trim() === "") {
710
- return {
711
- isValid: false,
712
- error: "Token is empty or not provided"
713
- };
714
- }
715
- const payload = decodeToken(token);
716
- if (!payload) {
717
- return {
718
- isValid: false,
719
- error: "Token has invalid format"
720
- };
721
- }
722
- if (isTokenExpired(token, gracePeriodMs)) {
723
- return {
724
- isValid: false,
725
- payload,
726
- error: "Token has expired"
727
- };
728
- }
729
- return {
730
- isValid: true,
731
- payload
732
- };
733
- }
734
- function isValidToken(result) {
735
- return result.isValid === true;
736
- }
737
- function getTokenExpiration(token) {
738
- try {
739
- const decoded = jose.decodeJwt(token);
740
- if (!decoded.exp) {
741
- return null;
742
- }
743
- return new Date(decoded.exp * 1e3);
744
- } catch {
745
- return null;
746
- }
747
- }
748
- function getTokenTimeRemaining(token) {
749
- try {
750
- const decoded = jose.decodeJwt(token);
751
- if (!decoded.exp) {
752
- return Infinity;
753
- }
754
- const expirationTime = decoded.exp * 1e3;
755
- const remaining = expirationTime - Date.now();
756
- return Math.max(0, remaining);
757
- } catch {
758
- return 0;
759
- }
760
- }
761
- async function verifyToken(token, jwksUrl) {
762
- try {
763
- const JWKS = jose.createRemoteJWKSet(new URL(jwksUrl));
764
- const { payload } = await jose.jwtVerify(token, JWKS);
765
- const decoded = payload;
766
- return extractPayloadFromJose(decoded);
767
- } catch (error) {
768
- console.error("[FluidAuth] JWT signature verification failed:", error);
769
- return null;
770
- }
771
- }
772
-
773
- // src/auth/types.ts
774
- var USER_TYPES = {
775
- admin: "admin",
776
- rep: "rep",
777
- root_admin: "root_admin",
778
- customer: "customer"
779
- };
780
- function isUserType(value) {
781
- return Object.values(USER_TYPES).includes(value);
782
- }
783
-
784
- // src/auth/dev-utils.ts
785
- function isDevBypassActive(devBypass) {
786
- if (!devBypass) return false;
787
- try {
788
- return undefined.DEV === true;
789
- } catch {
790
- return false;
791
- }
792
- }
793
- function createDevUser() {
794
- return {
795
- id: 0,
796
- email: "dev@localhost",
797
- full_name: "Dev User",
798
- user_type: USER_TYPES.rep,
799
- og_user_type: void 0,
800
- company_id: 0,
801
- exp: void 0,
802
- // Never expires
803
- auth_type: "dev_bypass"
804
- };
805
- }
806
- var FluidAuthContext = react.createContext(null);
807
- function FluidAuthProvider({
808
- children,
809
- config
810
- }) {
811
- const configRef = react.useRef(config);
812
- configRef.current = config;
813
- const [isLoading2, setIsLoading] = react.useState(true);
814
- const [token, setToken] = react.useState(null);
815
- const [user, setUser] = react.useState(null);
816
- const [error, setError] = react.useState(null);
817
- react.useEffect(() => {
818
- const initializeAuth = async () => {
819
- const handleAuthFailure = resolveAuthFailureHandler(config?.onAuthFailure, config?.authUrl);
820
- try {
821
- if (isDevBypassActive(config?.devBypass)) {
822
- const envToken = undefined.VITE_DEV_TOKEN;
823
- if (envToken) {
824
- const validation = validateToken(envToken, config?.gracePeriodMs);
825
- if (validation.isValid && validation.payload) {
826
- storeToken(envToken, config);
827
- setToken(envToken);
828
- setUser(validation.payload);
829
- setError(null);
830
- return;
831
- }
832
- console.warn(
833
- "[FluidAuth] VITE_DEV_TOKEN is invalid or expired, falling back to mock user"
834
- );
835
- }
836
- console.warn(
837
- "[FluidAuth] Dev bypass active - using mock user. API calls will fail without a real token."
838
- );
839
- const devUser = createDevUser();
840
- setToken(null);
841
- setUser(devUser);
842
- setError(null);
843
- return;
844
- }
845
- const tokenKey = config?.tokenKey ?? "fluidUserToken";
846
- let candidateToken = extractTokenFromUrl(tokenKey);
847
- if (!candidateToken && tokenKey !== AUTH_REDIRECT_TOKEN_KEY) {
848
- candidateToken = extractTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);
849
- }
850
- cleanTokenFromUrl(tokenKey);
851
- cleanTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);
852
- if (!candidateToken) {
853
- candidateToken = getStoredToken(config);
854
- }
855
- if (candidateToken) {
856
- let payload = null;
857
- if (config?.jwksUrl) {
858
- payload = await verifyToken(candidateToken, config.jwksUrl);
859
- if (!payload) {
860
- clearTokens(config);
861
- setToken(null);
862
- setUser(null);
863
- setError(new Error("JWT signature verification failed"));
864
- handleAuthFailure();
865
- return;
866
- }
867
- if (isTokenExpired(candidateToken, config?.gracePeriodMs)) {
868
- clearTokens(config);
869
- setToken(null);
870
- setUser(null);
871
- setError(new Error("Token has expired"));
872
- handleAuthFailure();
873
- return;
874
- }
875
- } else {
876
- const validation = validateToken(
877
- candidateToken,
878
- config?.gracePeriodMs
879
- );
880
- if (validation.isValid && validation.payload) {
881
- payload = validation.payload;
882
- } else {
883
- clearTokens(config);
884
- setToken(null);
885
- setUser(null);
886
- setError(new Error(validation.error ?? "Invalid token"));
887
- handleAuthFailure();
888
- return;
889
- }
890
- }
891
- storeToken(candidateToken, config);
892
- setToken(candidateToken);
893
- setUser(payload);
894
- setError(null);
895
- } else {
896
- setToken(null);
897
- setUser(null);
898
- setError(new Error("No authentication token found"));
899
- handleAuthFailure();
900
- }
901
- } catch (err) {
902
- const error2 = err instanceof Error ? err : new Error("Authentication error");
903
- setError(error2);
904
- setToken(null);
905
- setUser(null);
906
- handleAuthFailure();
907
- } finally {
908
- setIsLoading(false);
909
- }
910
- };
911
- void initializeAuth();
912
- }, []);
913
- const clearAuth = react.useCallback(() => {
914
- clearTokens(configRef.current);
915
- setToken(null);
916
- setUser(null);
917
- setError(null);
918
- }, []);
919
- const contextValue = react.useMemo(
920
- () => ({
921
- isAuthenticated: user !== null,
922
- isLoading: isLoading2,
923
- user,
924
- token,
925
- clearAuth,
926
- error
927
- }),
928
- [token, isLoading2, user, clearAuth, error]
929
- );
930
- return /* @__PURE__ */ jsxRuntime.jsx(FluidAuthContext.Provider, { value: contextValue, children });
931
- }
932
- function useFluidAuthContext() {
933
- const context = react.useContext(FluidAuthContext);
934
- if (!context) {
935
- throw new Error(
936
- "useFluidAuthContext must be used within a FluidAuthProvider. Wrap your app with <FluidAuthProvider> to use authentication features."
937
- );
938
- }
939
- return context;
940
- }
17
+ var AppShellLayout = require('@fluid-app/rep-core/shell/AppShellLayout');
18
+ var ThemeModeContext = require('@fluid-app/rep-core/shell/ThemeModeContext');
19
+ var systemNavigationItems = require('@fluid-app/rep-core/navigation/system-navigation-items');
20
+ var theme = require('@fluid-app/rep-core/theme');
21
+ var sidebar = require('@fluid-app/rep-core/shell/sidebar');
22
+ var RepIcon = require('@fluid-app/rep-core/components/RepIcon');
23
+ var reactFontawesome = require('@fortawesome/react-fontawesome');
24
+ var faBars = require('@fortawesome/pro-regular-svg-icons/faBars');
25
+ var faSun = require('@fortawesome/pro-regular-svg-icons/faSun');
26
+ var faMoon = require('@fortawesome/pro-regular-svg-icons/faMoon');
27
+ var faTableCellsLarge = require('@fortawesome/pro-regular-svg-icons/faTableCellsLarge');
28
+ var DataAwareWidget = require('@fluid-app/rep-core/data-sources/DataAwareWidget');
29
+ var contexts = require('@fluid-app/rep-widgets/contexts');
941
30
 
942
31
  // src/types/page-template.ts
943
32
  var PAGE_CATEGORIES = {
@@ -1211,23 +300,573 @@ function useResolvedPages(navigation) {
1211
300
  const { resolvePages } = usePageTemplates();
1212
301
  return react.useMemo(() => resolvePages(navigation), [resolvePages, navigation]);
1213
302
  }
1214
-
1215
- // src/hooks/use-fluid-api.ts
1216
- function useFluidApi() {
1217
- const { client } = useFluidContext();
1218
- return client;
1219
- }
1220
303
  var PROFILE_QUERY_KEY = ["fluid", "profile"];
1221
304
  function useFluidProfile() {
1222
- const api = useFluidApi();
305
+ const api = chunkV3IMQZIG_cjs.useFluidApi();
1223
306
  return reactQuery.useQuery({
1224
307
  queryKey: PROFILE_QUERY_KEY,
1225
308
  queryFn: () => api.profile.get()
1226
309
  });
1227
310
  }
311
+ function systemSetTimeoutZero(callback) {
312
+ setTimeout(callback, 0);
313
+ }
314
+ function matchQuery(filters, query) {
315
+ const {
316
+ type = "all",
317
+ exact,
318
+ fetchStatus,
319
+ predicate,
320
+ queryKey,
321
+ stale
322
+ } = filters;
323
+ if (queryKey) {
324
+ if (exact) {
325
+ if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {
326
+ return false;
327
+ }
328
+ } else if (!partialMatchKey(query.queryKey, queryKey)) {
329
+ return false;
330
+ }
331
+ }
332
+ if (type !== "all") {
333
+ const isActive = query.isActive();
334
+ if (type === "active" && !isActive) {
335
+ return false;
336
+ }
337
+ if (type === "inactive" && isActive) {
338
+ return false;
339
+ }
340
+ }
341
+ if (typeof stale === "boolean" && query.isStale() !== stale) {
342
+ return false;
343
+ }
344
+ if (fetchStatus && fetchStatus !== query.state.fetchStatus) {
345
+ return false;
346
+ }
347
+ if (predicate && !predicate(query)) {
348
+ return false;
349
+ }
350
+ return true;
351
+ }
352
+ function hashQueryKeyByOptions(queryKey, options) {
353
+ const hashFn = options?.queryKeyHashFn || hashKey;
354
+ return hashFn(queryKey);
355
+ }
356
+ function hashKey(queryKey) {
357
+ return JSON.stringify(
358
+ queryKey,
359
+ (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {
360
+ result[key] = val[key];
361
+ return result;
362
+ }, {}) : val
363
+ );
364
+ }
365
+ function partialMatchKey(a, b) {
366
+ if (a === b) {
367
+ return true;
368
+ }
369
+ if (typeof a !== typeof b) {
370
+ return false;
371
+ }
372
+ if (a && b && typeof a === "object" && typeof b === "object") {
373
+ return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]));
374
+ }
375
+ return false;
376
+ }
377
+ function isPlainObject(o) {
378
+ if (!hasObjectPrototype(o)) {
379
+ return false;
380
+ }
381
+ const ctor = o.constructor;
382
+ if (ctor === void 0) {
383
+ return true;
384
+ }
385
+ const prot = ctor.prototype;
386
+ if (!hasObjectPrototype(prot)) {
387
+ return false;
388
+ }
389
+ if (!prot.hasOwnProperty("isPrototypeOf")) {
390
+ return false;
391
+ }
392
+ if (Object.getPrototypeOf(o) !== Object.prototype) {
393
+ return false;
394
+ }
395
+ return true;
396
+ }
397
+ function hasObjectPrototype(o) {
398
+ return Object.prototype.toString.call(o) === "[object Object]";
399
+ }
400
+
401
+ // ../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/notifyManager.js
402
+ var defaultScheduler = systemSetTimeoutZero;
403
+ function createNotifyManager() {
404
+ let queue = [];
405
+ let transactions = 0;
406
+ let notifyFn = (callback) => {
407
+ callback();
408
+ };
409
+ let batchNotifyFn = (callback) => {
410
+ callback();
411
+ };
412
+ let scheduleFn = defaultScheduler;
413
+ const schedule = (callback) => {
414
+ if (transactions) {
415
+ queue.push(callback);
416
+ } else {
417
+ scheduleFn(() => {
418
+ notifyFn(callback);
419
+ });
420
+ }
421
+ };
422
+ const flush = () => {
423
+ const originalQueue = queue;
424
+ queue = [];
425
+ if (originalQueue.length) {
426
+ scheduleFn(() => {
427
+ batchNotifyFn(() => {
428
+ originalQueue.forEach((callback) => {
429
+ notifyFn(callback);
430
+ });
431
+ });
432
+ });
433
+ }
434
+ };
435
+ return {
436
+ batch: (callback) => {
437
+ let result;
438
+ transactions++;
439
+ try {
440
+ result = callback();
441
+ } finally {
442
+ transactions--;
443
+ if (!transactions) {
444
+ flush();
445
+ }
446
+ }
447
+ return result;
448
+ },
449
+ /**
450
+ * All calls to the wrapped function will be batched.
451
+ */
452
+ batchCalls: (callback) => {
453
+ return (...args) => {
454
+ schedule(() => {
455
+ callback(...args);
456
+ });
457
+ };
458
+ },
459
+ schedule,
460
+ /**
461
+ * Use this method to set a custom notify function.
462
+ * This can be used to for example wrap notifications with `React.act` while running tests.
463
+ */
464
+ setNotifyFunction: (fn) => {
465
+ notifyFn = fn;
466
+ },
467
+ /**
468
+ * Use this method to set a custom function to batch notifications together into a single tick.
469
+ * By default React Query will use the batch function provided by ReactDOM or React Native.
470
+ */
471
+ setBatchNotifyFunction: (fn) => {
472
+ batchNotifyFn = fn;
473
+ },
474
+ setScheduler: (fn) => {
475
+ scheduleFn = fn;
476
+ }
477
+ };
478
+ }
479
+ var notifyManager = createNotifyManager();
480
+
481
+ // ../../../node_modules/.pnpm/@tanstack+query-persist-client-core@5.91.11/node_modules/@tanstack/query-persist-client-core/build/modern/createPersister.js
482
+ var PERSISTER_KEY_PREFIX = "tanstack-query";
483
+ function experimental_createQueryPersister({
484
+ storage: storage2,
485
+ buster = "",
486
+ maxAge = 1e3 * 60 * 60 * 24,
487
+ serialize = JSON.stringify,
488
+ deserialize = JSON.parse,
489
+ prefix = PERSISTER_KEY_PREFIX,
490
+ refetchOnRestore = true,
491
+ filters
492
+ }) {
493
+ function isExpiredOrBusted(persistedQuery) {
494
+ if (persistedQuery.state.dataUpdatedAt) {
495
+ const queryAge = Date.now() - persistedQuery.state.dataUpdatedAt;
496
+ const expired = queryAge > maxAge;
497
+ const busted = persistedQuery.buster !== buster;
498
+ if (expired || busted) {
499
+ return true;
500
+ }
501
+ return false;
502
+ }
503
+ return true;
504
+ }
505
+ async function retrieveQuery(queryHash, afterRestoreMacroTask) {
506
+ if (storage2 != null) {
507
+ const storageKey = `${prefix}-${queryHash}`;
508
+ try {
509
+ const storedData = await storage2.getItem(storageKey);
510
+ if (storedData) {
511
+ const persistedQuery = await deserialize(storedData);
512
+ if (isExpiredOrBusted(persistedQuery)) {
513
+ await storage2.removeItem(storageKey);
514
+ } else {
515
+ if (afterRestoreMacroTask) {
516
+ notifyManager.schedule(
517
+ () => afterRestoreMacroTask(persistedQuery)
518
+ );
519
+ }
520
+ return persistedQuery.state.data;
521
+ }
522
+ }
523
+ } catch (err) {
524
+ if (process.env.NODE_ENV === "development") {
525
+ console.error(err);
526
+ console.warn(
527
+ "Encountered an error attempting to restore query cache from persisted location."
528
+ );
529
+ }
530
+ await storage2.removeItem(storageKey);
531
+ }
532
+ }
533
+ return;
534
+ }
535
+ async function persistQueryByKey(queryKey, queryClient) {
536
+ if (storage2 != null) {
537
+ const query = queryClient.getQueryCache().find({ queryKey });
538
+ if (query) {
539
+ await persistQuery(query);
540
+ } else {
541
+ if (process.env.NODE_ENV === "development") {
542
+ console.warn(
543
+ "Could not find query to be persisted. QueryKey:",
544
+ JSON.stringify(queryKey)
545
+ );
546
+ }
547
+ }
548
+ }
549
+ }
550
+ async function persistQuery(query) {
551
+ if (storage2 != null) {
552
+ const storageKey = `${prefix}-${query.queryHash}`;
553
+ storage2.setItem(
554
+ storageKey,
555
+ await serialize({
556
+ state: query.state,
557
+ queryKey: query.queryKey,
558
+ queryHash: query.queryHash,
559
+ buster
560
+ })
561
+ );
562
+ }
563
+ }
564
+ async function persisterFn(queryFn, ctx, query) {
565
+ const matchesFilter = filters ? matchQuery(filters, query) : true;
566
+ if (matchesFilter && query.state.data === void 0 && storage2 != null) {
567
+ const restoredData = await retrieveQuery(
568
+ query.queryHash,
569
+ (persistedQuery) => {
570
+ query.setState({
571
+ dataUpdatedAt: persistedQuery.state.dataUpdatedAt,
572
+ errorUpdatedAt: persistedQuery.state.errorUpdatedAt
573
+ });
574
+ if (refetchOnRestore === "always" || refetchOnRestore === true && query.isStale()) {
575
+ query.fetch();
576
+ }
577
+ }
578
+ );
579
+ if (restoredData !== void 0) {
580
+ return Promise.resolve(restoredData);
581
+ }
582
+ }
583
+ const queryFnResult = await queryFn(ctx);
584
+ if (matchesFilter && storage2 != null) {
585
+ notifyManager.schedule(() => {
586
+ persistQuery(query);
587
+ });
588
+ }
589
+ return Promise.resolve(queryFnResult);
590
+ }
591
+ async function persisterGc() {
592
+ if (storage2?.entries) {
593
+ const entries = await storage2.entries();
594
+ for (const [key, value] of entries) {
595
+ if (key.startsWith(prefix)) {
596
+ const persistedQuery = await deserialize(value);
597
+ if (isExpiredOrBusted(persistedQuery)) {
598
+ await storage2.removeItem(key);
599
+ }
600
+ }
601
+ }
602
+ } else if (process.env.NODE_ENV === "development") {
603
+ throw new Error(
604
+ "Provided storage does not implement `entries` method. Garbage collection is not possible without ability to iterate over storage items."
605
+ );
606
+ }
607
+ }
608
+ async function restoreQueries(queryClient, filters2 = {}) {
609
+ const { exact, queryKey } = filters2;
610
+ if (storage2?.entries) {
611
+ const entries = await storage2.entries();
612
+ for (const [key, value] of entries) {
613
+ if (key.startsWith(prefix)) {
614
+ const persistedQuery = await deserialize(value);
615
+ if (isExpiredOrBusted(persistedQuery)) {
616
+ await storage2.removeItem(key);
617
+ continue;
618
+ }
619
+ if (queryKey) {
620
+ if (exact) {
621
+ if (persistedQuery.queryHash !== hashKey(queryKey)) {
622
+ continue;
623
+ }
624
+ } else if (!partialMatchKey(persistedQuery.queryKey, queryKey)) {
625
+ continue;
626
+ }
627
+ }
628
+ queryClient.setQueryData(
629
+ persistedQuery.queryKey,
630
+ persistedQuery.state.data,
631
+ {
632
+ updatedAt: persistedQuery.state.dataUpdatedAt
633
+ }
634
+ );
635
+ }
636
+ }
637
+ } else if (process.env.NODE_ENV === "development") {
638
+ throw new Error(
639
+ "Provided storage does not implement `entries` method. Restoration of all stored entries is not possible without ability to iterate over storage items."
640
+ );
641
+ }
642
+ }
643
+ return {
644
+ persisterFn,
645
+ persistQuery,
646
+ persistQueryByKey,
647
+ retrieveQuery,
648
+ persisterGc,
649
+ restoreQueries
650
+ };
651
+ }
652
+
653
+ // ../../platform/query-persister/src/persister.ts
654
+ var DB_NAME = "fluid_tanstack_query_cache";
655
+ var STORE_NAME = "fluid_queries";
656
+ var VERSION = 1;
657
+ var dbPromise = null;
658
+ async function deleteDatabase() {
659
+ return new Promise((resolve, reject) => {
660
+ console.warn("[IDB] Deleting database due to error");
661
+ const req = indexedDB.deleteDatabase(DB_NAME);
662
+ req.onsuccess = () => {
663
+ console.log("[IDB] Database deleted successfully");
664
+ resolve();
665
+ };
666
+ req.onerror = () => {
667
+ console.error("[IDB] Failed to delete database:", req.error);
668
+ reject(req.error ?? new Error("deleteDatabase failed"));
669
+ };
670
+ req.onblocked = () => {
671
+ console.warn("[IDB] Delete blocked: close all tabs using this database");
672
+ };
673
+ });
674
+ }
675
+ function openDatabase() {
676
+ return new Promise((resolve, reject) => {
677
+ const req = indexedDB.open(DB_NAME, VERSION);
678
+ req.onupgradeneeded = () => {
679
+ const upgradeDb = req.result;
680
+ if (!upgradeDb.objectStoreNames.contains(STORE_NAME)) {
681
+ upgradeDb.createObjectStore(STORE_NAME);
682
+ }
683
+ };
684
+ req.onsuccess = () => {
685
+ const conn = req.result;
686
+ conn.onversionchange = () => {
687
+ console.trace("[IDB] version change \u2013 closing connection");
688
+ conn.close();
689
+ dbPromise = null;
690
+ };
691
+ resolve(conn);
692
+ };
693
+ req.onblocked = () => {
694
+ console.warn("[IDB] open blocked: another connection is holding the DB");
695
+ };
696
+ req.onerror = () => {
697
+ reject(
698
+ req.error instanceof Error ? req.error : new Error(`IndexedDB open failed: ${String(req.error)}`)
699
+ );
700
+ };
701
+ });
702
+ }
703
+ async function getDbWithRecovery() {
704
+ try {
705
+ return await openDatabase();
706
+ } catch (err) {
707
+ console.warn("[IDB] Initial open failed, attempting recovery:", err);
708
+ try {
709
+ await deleteDatabase();
710
+ console.log("[IDB] Retrying database open after deletion");
711
+ return await openDatabase();
712
+ } catch (retryErr) {
713
+ console.error("[IDB] Recovery failed:", retryErr);
714
+ throw retryErr;
715
+ }
716
+ }
717
+ }
718
+ function getDb() {
719
+ if (dbPromise) return dbPromise;
720
+ dbPromise = getDbWithRecovery().catch((err) => {
721
+ dbPromise = null;
722
+ throw err;
723
+ });
724
+ return dbPromise;
725
+ }
726
+ var storage = {
727
+ async getItem(key) {
728
+ try {
729
+ const db = await getDb();
730
+ return new Promise((res) => {
731
+ try {
732
+ const r = db.transaction(STORE_NAME, "readonly").objectStore(STORE_NAME).get(key);
733
+ r.onsuccess = () => res(r.result);
734
+ r.onerror = () => {
735
+ console.trace("[IDB] getItem error:", r.error);
736
+ res(void 0);
737
+ };
738
+ } catch (txErr) {
739
+ console.trace("[IDB] getItem transaction error:", txErr);
740
+ res(void 0);
741
+ }
742
+ });
743
+ } catch (err) {
744
+ console.trace("[IDB] getItem getDb error:", err);
745
+ try {
746
+ const db = await getDb();
747
+ return new Promise((res) => {
748
+ try {
749
+ const r = db.transaction(STORE_NAME, "readonly").objectStore(STORE_NAME).get(key);
750
+ r.onsuccess = () => res(r.result);
751
+ r.onerror = () => {
752
+ console.trace("[IDB] getItem retry error:", r.error);
753
+ res(void 0);
754
+ };
755
+ } catch (txErr) {
756
+ console.trace("[IDB] getItem retry transaction error:", txErr);
757
+ res(void 0);
758
+ }
759
+ });
760
+ } catch (recoveryErr) {
761
+ console.trace("[IDB] getItem recovery failed:", recoveryErr);
762
+ }
763
+ return void 0;
764
+ }
765
+ },
766
+ async setItem(key, value) {
767
+ const cloneableValue = JSON.parse(JSON.stringify(value));
768
+ try {
769
+ const db = await getDb();
770
+ if (!db) return;
771
+ await new Promise((resolve) => {
772
+ try {
773
+ const req = db.transaction(STORE_NAME, "readwrite").objectStore(STORE_NAME).put(cloneableValue, key);
774
+ req.onsuccess = () => resolve();
775
+ req.onerror = () => {
776
+ console.trace("[IDB] setItem error:", req.error);
777
+ resolve();
778
+ };
779
+ } catch (txErr) {
780
+ console.trace("[IDB] setItem transaction error:", txErr);
781
+ resolve();
782
+ }
783
+ });
784
+ } catch (err) {
785
+ console.trace("[IDB] setItem getDb error:", err);
786
+ try {
787
+ const db = await getDb();
788
+ await new Promise((resolve) => {
789
+ try {
790
+ const req = db.transaction(STORE_NAME, "readwrite").objectStore(STORE_NAME).put(cloneableValue, key);
791
+ req.onsuccess = () => resolve();
792
+ req.onerror = () => {
793
+ console.trace("[IDB] setItem retry error:", req.error);
794
+ resolve();
795
+ };
796
+ } catch (txErr) {
797
+ console.trace("[IDB] setItem retry transaction error:", txErr);
798
+ resolve();
799
+ }
800
+ });
801
+ } catch (recoveryErr) {
802
+ console.trace("[IDB] setItem recovery failed:", recoveryErr);
803
+ }
804
+ }
805
+ },
806
+ async removeItem(key) {
807
+ try {
808
+ const db = await getDb();
809
+ if (!db) return;
810
+ await new Promise((resolve) => {
811
+ try {
812
+ const req = db.transaction(STORE_NAME, "readwrite").objectStore(STORE_NAME).delete(key);
813
+ req.onsuccess = () => resolve();
814
+ req.onerror = () => {
815
+ console.trace("[IDB] removeItem error:", req.error);
816
+ resolve();
817
+ };
818
+ } catch (txErr) {
819
+ console.trace("[IDB] removeItem transaction error:", txErr);
820
+ resolve();
821
+ }
822
+ });
823
+ } catch (err) {
824
+ console.trace("[IDB] removeItem getDb error:", err);
825
+ try {
826
+ const db = await getDb();
827
+ await new Promise((resolve) => {
828
+ try {
829
+ const req = db.transaction(STORE_NAME, "readwrite").objectStore(STORE_NAME).delete(key);
830
+ req.onsuccess = () => resolve();
831
+ req.onerror = () => {
832
+ console.trace("[IDB] removeItem retry error:", req.error);
833
+ resolve();
834
+ };
835
+ } catch (txErr) {
836
+ console.trace("[IDB] removeItem retry transaction error:", txErr);
837
+ resolve();
838
+ }
839
+ });
840
+ } catch (recoveryErr) {
841
+ console.trace("[IDB] removeItem recovery failed:", recoveryErr);
842
+ }
843
+ }
844
+ }
845
+ };
846
+ function createPersister() {
847
+ return experimental_createQueryPersister({
848
+ storage,
849
+ serialize: (persistedQuery) => persistedQuery,
850
+ deserialize: (cached) => cached
851
+ });
852
+ }
853
+
854
+ // src/hooks/use-fluid-app.ts
855
+ var APP_DATA_QUERY_KEY = ["fluid", "app"];
856
+ var appDataPersister = typeof window !== "undefined" ? createPersister() : void 0;
857
+ function useFluidApp(options) {
858
+ const api = chunkV3IMQZIG_cjs.useFluidApi();
859
+ return reactQuery.useQuery({
860
+ queryKey: APP_DATA_QUERY_KEY,
861
+ queryFn: () => api.app.getRaw(),
862
+ select: chunkV3IMQZIG_cjs.transformManifestToRepAppData,
863
+ ...appDataPersister && { persister: appDataPersister.persisterFn },
864
+ ...options?.enabled !== void 0 && { enabled: options.enabled }
865
+ });
866
+ }
1228
867
  var PERMISSIONS_QUERY_KEY = ["fluid", "permissions"];
1229
868
  function useFluidPermissions() {
1230
- const api = useFluidApi();
869
+ const api = chunkV3IMQZIG_cjs.useFluidApi();
1231
870
  const query = reactQuery.useQuery({
1232
871
  queryKey: PERMISSIONS_QUERY_KEY,
1233
872
  queryFn: () => api.permissions.get()
@@ -1259,17 +898,17 @@ function useFluidPermissions() {
1259
898
 
1260
899
  // src/hooks/use-fluid-theme.ts
1261
900
  function useFluidTheme() {
1262
- const { currentTheme, setTheme, setThemeMode } = useThemeContext();
901
+ const { currentTheme, setTheme, setThemeMode, mode } = chunkV3IMQZIG_cjs.useThemeContext();
1263
902
  return {
1264
903
  currentTheme,
1265
904
  setTheme,
1266
905
  setThemeMode,
1267
- mode: currentTheme?.mode
906
+ mode
1268
907
  };
1269
908
  }
1270
909
  var CURRENT_REP_QUERY_KEY = ["fluid", "currentRep"];
1271
910
  function useCurrentRep() {
1272
- const api = useFluidApi();
911
+ const api = chunkV3IMQZIG_cjs.useFluidApi();
1273
912
  return reactQuery.useQuery({
1274
913
  queryKey: CURRENT_REP_QUERY_KEY,
1275
914
  queryFn: () => api.reps.current()
@@ -1278,7 +917,7 @@ function useCurrentRep() {
1278
917
 
1279
918
  // src/hooks/use-fluid-auth.ts
1280
919
  function useFluidAuth() {
1281
- return useFluidAuthContext();
920
+ return chunkV3IMQZIG_cjs.useFluidAuthContext();
1282
921
  }
1283
922
 
1284
923
  // src/hooks/demo-data/calendar-events.ts
@@ -1939,7 +1578,19 @@ function AuthError({
1939
1578
  }
1940
1579
  );
1941
1580
  }
1581
+ var SPIN_STYLE_ID = "fluid-auth-loading-spin";
1582
+ function ensureSpinStyle() {
1583
+ if (typeof document === "undefined") return;
1584
+ if (document.getElementById(SPIN_STYLE_ID)) return;
1585
+ const style = document.createElement("style");
1586
+ style.id = SPIN_STYLE_ID;
1587
+ style.textContent = `@keyframes spin { to { transform: rotate(360deg); } }`;
1588
+ document.head.appendChild(style);
1589
+ }
1942
1590
  function AuthLoading() {
1591
+ react.useEffect(() => {
1592
+ ensureSpinStyle();
1593
+ }, []);
1943
1594
  return /* @__PURE__ */ jsxRuntime.jsxs(
1944
1595
  "div",
1945
1596
  {
@@ -1976,12 +1627,7 @@ function AuthLoading() {
1976
1627
  },
1977
1628
  children: "Authenticating..."
1978
1629
  }
1979
- ),
1980
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
1981
- @keyframes spin {
1982
- to { transform: rotate(360deg); }
1983
- }
1984
- ` })
1630
+ )
1985
1631
  ]
1986
1632
  }
1987
1633
  );
@@ -2001,17 +1647,13 @@ function RequireAuth({
2001
1647
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
2002
1648
  }
2003
1649
 
2004
- // src/themes/index.ts
2005
- var themes_exports = {};
2006
- chunkDEQ3PBVX_cjs.__reExport(themes_exports, theme_star__namespace);
2007
-
2008
1650
  // src/screens/index.ts
2009
1651
  var screenPropertySchemas = {
2010
- MessagingScreen: () => import('./MessagingScreen-UCVLYWZB.cjs').then((m) => m.messagingScreenPropertySchema),
2011
- ContactsScreen: () => import('./ContactsScreen-XZOQJVFE.cjs').then((m) => m.contactsScreenPropertySchema),
2012
- OrdersScreen: () => import('./OrdersScreen-WNT2WDLI.cjs').then((m) => m.ordersScreenPropertySchema),
2013
- CustomersScreen: () => import('./CustomersScreen-53SXRDDK.cjs').then((m) => m.customersScreenPropertySchema),
2014
- ProductsScreen: () => import('./ProductsScreen-CTIAKS3Z.cjs').then((m) => m.productsScreenPropertySchema)
1652
+ MessagingScreen: () => import('./MessagingScreen-UPFXQZV3.cjs').then((m) => m.messagingScreenPropertySchema),
1653
+ ContactsScreen: () => import('./ContactsScreen-ATASCZO2.cjs').then((m) => m.contactsScreenPropertySchema),
1654
+ OrdersScreen: () => import('./OrdersScreen-X7FYUROL.cjs').then((m) => m.ordersScreenPropertySchema),
1655
+ CustomersScreen: () => import('./CustomersScreen-XMPMKSQA.cjs').then((m) => m.customersScreenPropertySchema),
1656
+ ProductsScreen: () => import('./ProductsScreen-4ZIUQNUU.cjs').then((m) => m.productsScreenPropertySchema)
2015
1657
  };
2016
1658
  var CORE_PAGE_IDS = {
2017
1659
  MESSAGING: "core-messaging",
@@ -2113,73 +1755,853 @@ function registerCorePageTemplates() {
2113
1755
  });
2114
1756
  }
2115
1757
  registerCorePageTemplates();
2116
- var export_BUILT_IN_THEMES = themes_exports.BUILT_IN_THEMES;
2117
- var export_CORE_COLOR_KEYS = themes_exports.CORE_COLOR_KEYS;
2118
- var export_DEFAULT_CORE_COLORS = themes_exports.DEFAULT_CORE_COLORS;
2119
- var export_catppuccinMocha = themes_exports.catppuccinMocha;
2120
- var export_clampChroma = themes_exports.clampChroma;
2121
- var export_defaultTheme = themes_exports.defaultTheme;
2122
- var export_detectThemeMode = themes_exports.detectThemeMode;
2123
- var export_dracula = themes_exports.dracula;
2124
- var export_everforest = themes_exports.everforest;
2125
- var export_generateColorSwatches = themes_exports.generateColorSwatches;
2126
- var export_generateDualTheme = themes_exports.generateDualTheme;
2127
- var export_generateSmartDualTheme = themes_exports.generateSmartDualTheme;
2128
- var export_generateTheme = themes_exports.generateTheme;
2129
- var export_generateThemeCssVars = themes_exports.generateThemeCssVars;
2130
- var export_gruvbox = themes_exports.gruvbox;
2131
- var export_mod = themes_exports.mod;
2132
- var export_monokai = themes_exports.monokai;
2133
- var export_nord = themes_exports.nord;
2134
- var export_oklchString = themes_exports.oklchString;
2135
- var export_parseOklch = themes_exports.parseOklch;
2136
- var export_rosePine = themes_exports.rosePine;
2137
- var export_rotateHue = themes_exports.rotateHue;
2138
- var export_rotateSoft = themes_exports.rotateSoft;
2139
- var export_solarized = themes_exports.solarized;
2140
- var export_toDarkMode = themes_exports.toDarkMode;
2141
- var export_toLightMode = themes_exports.toLightMode;
2142
- var export_tokyoNight = themes_exports.tokyoNight;
1758
+ var SPIN_STYLE_ID2 = "fluid-app-shell-loading-spin";
1759
+ function ensureSpinStyle2() {
1760
+ if (typeof document === "undefined") return;
1761
+ if (document.getElementById(SPIN_STYLE_ID2)) return;
1762
+ const style = document.createElement("style");
1763
+ style.id = SPIN_STYLE_ID2;
1764
+ style.textContent = `@keyframes spin { to { transform: rotate(360deg); } }`;
1765
+ document.head.appendChild(style);
1766
+ }
1767
+ function AppShellLoading() {
1768
+ react.useEffect(() => {
1769
+ ensureSpinStyle2();
1770
+ }, []);
1771
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1772
+ "div",
1773
+ {
1774
+ style: {
1775
+ display: "flex",
1776
+ flexDirection: "column",
1777
+ alignItems: "center",
1778
+ justifyContent: "center",
1779
+ minHeight: "100vh",
1780
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
1781
+ backgroundColor: "#f9fafb"
1782
+ },
1783
+ children: [
1784
+ /* @__PURE__ */ jsxRuntime.jsx(
1785
+ "div",
1786
+ {
1787
+ style: {
1788
+ width: "40px",
1789
+ height: "40px",
1790
+ border: "3px solid #e5e7eb",
1791
+ borderTopColor: "#3b82f6",
1792
+ borderRadius: "50%",
1793
+ animation: "spin 1s linear infinite"
1794
+ }
1795
+ }
1796
+ ),
1797
+ /* @__PURE__ */ jsxRuntime.jsx(
1798
+ "p",
1799
+ {
1800
+ style: {
1801
+ marginTop: "1rem",
1802
+ color: "#6b7280",
1803
+ fontSize: "0.875rem"
1804
+ },
1805
+ children: "Loading..."
1806
+ }
1807
+ )
1808
+ ]
1809
+ }
1810
+ );
1811
+ }
1812
+ function collectNavSlugs(items) {
1813
+ const slugs = [];
1814
+ for (const item of items) {
1815
+ if (item.slug) slugs.push(systemNavigationItems.normalizeSlug(item.slug));
1816
+ for (const child of item.children ?? []) {
1817
+ if (child.slug) slugs.push(systemNavigationItems.normalizeSlug(child.slug));
1818
+ }
1819
+ }
1820
+ return [...slugs].sort((a, b) => b.split("/").length - a.split("/").length);
1821
+ }
1822
+ function matchSlugPrefix(fullSlug, navSlugs) {
1823
+ const normalized = systemNavigationItems.normalizeSlug(fullSlug);
1824
+ if (!normalized) return void 0;
1825
+ for (const navSlug of navSlugs) {
1826
+ if (normalized === navSlug) {
1827
+ return { matchedSlug: navSlug, rest: "" };
1828
+ }
1829
+ if (normalized.startsWith(navSlug + "/")) {
1830
+ return {
1831
+ matchedSlug: navSlug,
1832
+ rest: normalized.slice(navSlug.length + 1)
1833
+ };
1834
+ }
1835
+ }
1836
+ return void 0;
1837
+ }
1838
+ function extractSlugFromPathname(pathname, basePath) {
1839
+ if (basePath === "/") {
1840
+ return pathname.replace(/^\//, "");
1841
+ }
1842
+ if (pathname.startsWith(basePath)) {
1843
+ return pathname.slice(basePath.length).replace(/^\//, "");
1844
+ }
1845
+ return pathname.replace(/^\//, "");
1846
+ }
1847
+ function isSlugInSection(item, currentSlug, navSlugs) {
1848
+ const match = matchSlugPrefix(currentSlug, navSlugs);
1849
+ const baseSlug = match?.matchedSlug ?? systemNavigationItems.normalizeSlug(currentSlug);
1850
+ if (systemNavigationItems.normalizeSlug(item.slug) === baseSlug) return true;
1851
+ return item.children?.some((child) => systemNavigationItems.normalizeSlug(child.slug) === baseSlug) ?? false;
1852
+ }
1853
+ function SdkNavigation({
1854
+ navItems,
1855
+ currentSlug,
1856
+ onNavigate,
1857
+ navSlugs
1858
+ }) {
1859
+ return /* @__PURE__ */ jsxRuntime.jsx(sidebar.SidebarMenu, { children: navItems.map((item, index) => {
1860
+ if (!item.slug && !item.label) return null;
1861
+ if (!item.slug) {
1862
+ return /* @__PURE__ */ jsxRuntime.jsx(sidebar.SidebarGroupLabel, { children: item.label }, item.id ?? `section-${index}`);
1863
+ }
1864
+ const itemSlug = systemNavigationItems.normalizeSlug(item.slug);
1865
+ const isActive = isSlugInSection(item, currentSlug, navSlugs);
1866
+ return /* @__PURE__ */ jsxRuntime.jsx(sidebar.SidebarMenuItem, { children: /* @__PURE__ */ jsxRuntime.jsxs(
1867
+ sidebar.SidebarMenuButton,
1868
+ {
1869
+ isActive,
1870
+ onClick: () => onNavigate(itemSlug),
1871
+ children: [
1872
+ item.icon && /* @__PURE__ */ jsxRuntime.jsx(RepIcon.RepIcon, { name: item.icon }),
1873
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: item.label })
1874
+ ]
1875
+ }
1876
+ ) }, item.id ?? itemSlug);
1877
+ }) });
1878
+ }
1879
+ function QuickLinksDropdown({ onNavigate }) {
1880
+ const [open, setOpen] = react.useState(false);
1881
+ const panelRef = react.useRef(null);
1882
+ const buttonRef = react.useRef(null);
1883
+ const close = react.useCallback(() => setOpen(false), []);
1884
+ react.useEffect(() => {
1885
+ if (!open) return;
1886
+ const handleMouseDown = (e) => {
1887
+ if (panelRef.current && !panelRef.current.contains(e.target) && buttonRef.current && !buttonRef.current.contains(e.target)) {
1888
+ close();
1889
+ }
1890
+ };
1891
+ const handleKeyDown = (e) => {
1892
+ if (e.key === "Escape") close();
1893
+ };
1894
+ document.addEventListener("mousedown", handleMouseDown);
1895
+ document.addEventListener("keydown", handleKeyDown);
1896
+ return () => {
1897
+ document.removeEventListener("mousedown", handleMouseDown);
1898
+ document.removeEventListener("keydown", handleKeyDown);
1899
+ };
1900
+ }, [open, close]);
1901
+ const sections = systemNavigationItems.getSystemNavigationBySection();
1902
+ const handleItemClick = (slug) => {
1903
+ onNavigate(slug);
1904
+ close();
1905
+ };
1906
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
1907
+ /* @__PURE__ */ jsxRuntime.jsx(
1908
+ "button",
1909
+ {
1910
+ ref: buttonRef,
1911
+ type: "button",
1912
+ onClick: () => setOpen((prev) => !prev),
1913
+ className: "flex shrink-0 items-center justify-center rounded-md p-2 text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
1914
+ "aria-label": "Quick links",
1915
+ "aria-expanded": open,
1916
+ children: /* @__PURE__ */ jsxRuntime.jsx(reactFontawesome.FontAwesomeIcon, { icon: faTableCellsLarge.faTableCellsLarge, className: "h-4 w-4" })
1917
+ }
1918
+ ),
1919
+ open && /* @__PURE__ */ jsxRuntime.jsx(
1920
+ "div",
1921
+ {
1922
+ ref: panelRef,
1923
+ className: "absolute top-full right-0 z-50 mt-1 w-[700px] max-w-[90vw] overflow-hidden rounded-lg border border-border bg-background shadow-lg",
1924
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
1925
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 border-b bg-background p-4", children: [
1926
+ /* @__PURE__ */ jsxRuntime.jsx(
1927
+ reactFontawesome.FontAwesomeIcon,
1928
+ {
1929
+ icon: faTableCellsLarge.faTableCellsLarge,
1930
+ className: "h-5 w-5 text-muted-foreground"
1931
+ }
1932
+ ),
1933
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold text-foreground", children: "Shortcuts" })
1934
+ ] }),
1935
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-6 bg-muted p-6", children: Object.entries(sections).map(([sectionName, items]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
1936
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold text-foreground", children: sectionName }),
1937
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-4 gap-2", children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
1938
+ "button",
1939
+ {
1940
+ type: "button",
1941
+ onClick: () => handleItemClick(item.slug),
1942
+ className: "flex items-center gap-2 rounded-lg px-3 py-2 text-sm text-sidebar-foreground transition-colors hover:bg-sidebar-primary hover:text-sidebar-primary-foreground",
1943
+ children: [
1944
+ item.icon && /* @__PURE__ */ jsxRuntime.jsx(
1945
+ RepIcon.RepIcon,
1946
+ {
1947
+ name: item.icon,
1948
+ className: "h-4 w-4 shrink-0 text-muted-foreground"
1949
+ }
1950
+ ),
1951
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: item.label })
1952
+ ]
1953
+ },
1954
+ item.slug
1955
+ )) })
1956
+ ] }, sectionName)) })
1957
+ ] })
1958
+ }
1959
+ )
1960
+ ] });
1961
+ }
1962
+ function SdkHeader({
1963
+ tabs,
1964
+ currentSlug,
1965
+ onNavigate,
1966
+ navSlugs
1967
+ }) {
1968
+ const sidebar$1 = sidebar.useSidebar();
1969
+ const themeMode = ThemeModeContext.useThemeMode();
1970
+ const match = matchSlugPrefix(currentSlug, navSlugs);
1971
+ const baseSlug = match?.matchedSlug ?? systemNavigationItems.normalizeSlug(currentSlug);
1972
+ const themeIcon = themeMode.mode === "dark" ? faMoon.faMoon : faSun.faSun;
1973
+ return /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex h-[52px] shrink-0 items-center gap-2 bg-sidebar px-6", children: [
1974
+ sidebar$1.isMobile && /* @__PURE__ */ jsxRuntime.jsx(
1975
+ "button",
1976
+ {
1977
+ type: "button",
1978
+ onClick: sidebar$1.toggleSidebar,
1979
+ className: "mr-2 flex shrink-0 items-center justify-center rounded-md p-2 text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
1980
+ "aria-label": "Toggle sidebar",
1981
+ children: /* @__PURE__ */ jsxRuntime.jsx(reactFontawesome.FontAwesomeIcon, { icon: faBars.faBars, className: "size-5" })
1982
+ }
1983
+ ),
1984
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "scrollbar-none flex flex-1 items-center gap-1 overflow-x-auto", children: tabs.map((tab) => {
1985
+ const tabSlug = systemNavigationItems.normalizeSlug(tab.slug);
1986
+ if (!tabSlug) return null;
1987
+ const isActive = tabSlug === baseSlug;
1988
+ return /* @__PURE__ */ jsxRuntime.jsx(
1989
+ "button",
1990
+ {
1991
+ type: "button",
1992
+ onClick: () => onNavigate(tabSlug),
1993
+ className: `border-b-2 px-4 py-3 text-sm font-medium whitespace-nowrap transition-colors ${isActive ? "border-primary text-foreground" : "border-transparent text-muted-foreground hover:border-border hover:text-foreground"}`,
1994
+ children: tab.label
1995
+ },
1996
+ tab.id ?? tabSlug
1997
+ );
1998
+ }) }),
1999
+ /* @__PURE__ */ jsxRuntime.jsx(QuickLinksDropdown, { onNavigate }),
2000
+ /* @__PURE__ */ jsxRuntime.jsx(
2001
+ "button",
2002
+ {
2003
+ type: "button",
2004
+ onClick: themeMode.cycleMode,
2005
+ className: "ml-2 flex shrink-0 items-center justify-center rounded-md p-2 text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
2006
+ "aria-label": `Switch theme (current: ${themeMode.mode})`,
2007
+ children: /* @__PURE__ */ jsxRuntime.jsx(reactFontawesome.FontAwesomeIcon, { icon: themeIcon, className: "size-3" })
2008
+ }
2009
+ )
2010
+ ] });
2011
+ }
2012
+ function WidgetRenderer({ widget, index }) {
2013
+ const registry = contexts.useRegistry();
2014
+ const Component = registry[widget.type];
2015
+ if (!Component) {
2016
+ console.warn(
2017
+ `[BuilderScreenView] Widget type "${String(widget.type)}" not found in registry`
2018
+ );
2019
+ return null;
2020
+ }
2021
+ if (widget.dataSource) {
2022
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full w-full overflow-x-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(DataAwareWidget.DataAwareWidget, { widget, Component }) }, widget.id ?? index);
2023
+ }
2024
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full w-full overflow-x-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(Component, { ...widget.props }) }, widget.id ?? index);
2025
+ }
2026
+ function BuilderScreenViewImpl({ screen, className }) {
2027
+ const widgets = screen.component_tree;
2028
+ if (!widgets || widgets.length === 0) {
2029
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: className ?? "h-full w-full", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: "This screen has no content yet." }) }) });
2030
+ }
2031
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: className ?? "h-full w-full", children: widgets.map((widget, index) => {
2032
+ if (!widget) return null;
2033
+ return /* @__PURE__ */ jsxRuntime.jsx(
2034
+ WidgetRenderer,
2035
+ {
2036
+ widget,
2037
+ index
2038
+ },
2039
+ widget.id ?? index
2040
+ );
2041
+ }) });
2042
+ }
2043
+ var BuilderScreenView = react.memo(BuilderScreenViewImpl);
2044
+ var SYSTEM_SLUG_SCREEN_MAP = {
2045
+ messages: chunkV3IMQZIG_cjs.MessagingScreen,
2046
+ contacts: chunkEOXYOOWS_cjs.ContactsScreen,
2047
+ shop: chunkFG2CI6HA_cjs.OrdersScreen,
2048
+ customers: chunkMHPK7YQ2_cjs.CustomersScreen,
2049
+ products: chunk5UBEM3AX_cjs.ProductsScreen
2050
+ };
2051
+ function PageRouter({
2052
+ currentSlug,
2053
+ currentNavItem,
2054
+ customPages,
2055
+ screens,
2056
+ baseSlug,
2057
+ restParams
2058
+ }) {
2059
+ const screenById = react.useMemo(() => {
2060
+ if (!screens || screens.length === 0) return void 0;
2061
+ return new Map(screens.map((s) => [s.id, s]));
2062
+ }, [screens]);
2063
+ const screenBySlug = react.useMemo(() => {
2064
+ if (!screens || screens.length === 0) return void 0;
2065
+ return new Map(screens.filter((s) => s.slug).map((s) => [s.slug, s]));
2066
+ }, [screens]);
2067
+ const builderScreen = react.useMemo(() => {
2068
+ if (currentNavItem?.screen_id && screenById) {
2069
+ const byId = screenById.get(currentNavItem.screen_id);
2070
+ if (byId) return byId;
2071
+ }
2072
+ if (screenBySlug) {
2073
+ return screenBySlug.get(currentSlug) ?? screenBySlug.get(baseSlug) ?? void 0;
2074
+ }
2075
+ return void 0;
2076
+ }, [
2077
+ currentNavItem?.screen_id,
2078
+ screenById,
2079
+ screenBySlug,
2080
+ currentSlug,
2081
+ baseSlug
2082
+ ]);
2083
+ const SystemScreen = SYSTEM_SLUG_SCREEN_MAP[baseSlug];
2084
+ if (SystemScreen) {
2085
+ return /* @__PURE__ */ jsxRuntime.jsx(SystemScreen, {});
2086
+ }
2087
+ if (systemNavigationItems.isSystemNavigationItem(baseSlug)) {
2088
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkB6S6BEPL_cjs.CoreScreenPlaceholder, { name: currentNavItem?.label ?? baseSlug });
2089
+ }
2090
+ const ExactCustomPage = customPages?.[currentSlug];
2091
+ if (ExactCustomPage) {
2092
+ return /* @__PURE__ */ jsxRuntime.jsx(ExactCustomPage, { slug: currentSlug, params: restParams });
2093
+ }
2094
+ if (baseSlug !== currentSlug) {
2095
+ const PrefixCustomPage = customPages?.[baseSlug];
2096
+ if (PrefixCustomPage) {
2097
+ return /* @__PURE__ */ jsxRuntime.jsx(PrefixCustomPage, { slug: currentSlug, params: restParams });
2098
+ }
2099
+ }
2100
+ if (builderScreen) {
2101
+ return /* @__PURE__ */ jsxRuntime.jsx(BuilderScreenView, { screen: builderScreen });
2102
+ }
2103
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkB6S6BEPL_cjs.CoreScreenPlaceholder, { name: currentNavItem?.label ?? currentSlug });
2104
+ }
2105
+ var AppNavigationContext = react.createContext(
2106
+ null
2107
+ );
2108
+ function AppNavigationProvider({
2109
+ currentSlug,
2110
+ basePath,
2111
+ navigate,
2112
+ children
2113
+ }) {
2114
+ const buildHref = react.useMemo(() => {
2115
+ return (slug) => {
2116
+ if (basePath === "/") return `/${slug}`;
2117
+ return `${basePath}/${slug}`;
2118
+ };
2119
+ }, [basePath]);
2120
+ const value = react.useMemo(
2121
+ () => ({ currentSlug, basePath, navigate, buildHref }),
2122
+ [currentSlug, basePath, navigate, buildHref]
2123
+ );
2124
+ return /* @__PURE__ */ jsxRuntime.jsx(AppNavigationContext.Provider, { value, children });
2125
+ }
2126
+ function useAppNavigation() {
2127
+ const ctx = react.useContext(AppNavigationContext);
2128
+ if (!ctx) {
2129
+ throw new Error(
2130
+ "useAppNavigation must be used within an <AppShell> or <AppNavigationProvider>"
2131
+ );
2132
+ }
2133
+ return ctx;
2134
+ }
2135
+ var THEME_STORAGE_KEY = "rep-theme-mode";
2136
+ var DEFAULT_NAVIGATION = [
2137
+ { label: "We Commerce", children: [] },
2138
+ { slug: "shop", label: "Shop", icon: "store", children: [] },
2139
+ { slug: "account", label: "Account", icon: "user-gear", children: [] },
2140
+ { slug: "messages", label: "Messaging", icon: "comment", children: [] },
2141
+ { label: "Marketing Assets", children: [] },
2142
+ {
2143
+ slug: "share/products",
2144
+ label: "Products",
2145
+ icon: "boxes-stacked",
2146
+ children: []
2147
+ }
2148
+ ];
2149
+ function getInitialThemeMode() {
2150
+ if (typeof window === "undefined") return "light";
2151
+ const stored = localStorage.getItem(THEME_STORAGE_KEY);
2152
+ if (stored === "light" || stored === "dark") return stored;
2153
+ return "light";
2154
+ }
2155
+ function findFirstNavigableSlug(items) {
2156
+ for (const item of items) {
2157
+ if (item.slug) return systemNavigationItems.normalizeSlug(item.slug);
2158
+ for (const child of item.children ?? []) {
2159
+ if (child.slug) return systemNavigationItems.normalizeSlug(child.slug);
2160
+ }
2161
+ }
2162
+ return "";
2163
+ }
2164
+ function findCurrentSection(items, slug) {
2165
+ const normalized = systemNavigationItems.normalizeSlug(slug);
2166
+ for (const item of items) {
2167
+ if (systemNavigationItems.normalizeSlug(item.slug) === normalized) return item;
2168
+ if (item.children?.some((child) => systemNavigationItems.normalizeSlug(child.slug) === normalized)) {
2169
+ return item;
2170
+ }
2171
+ }
2172
+ return void 0;
2173
+ }
2174
+ function findNavItem(items, slug) {
2175
+ const normalized = systemNavigationItems.normalizeSlug(slug);
2176
+ for (const item of items) {
2177
+ if (systemNavigationItems.normalizeSlug(item.slug) === normalized) return item;
2178
+ for (const child of item.children ?? []) {
2179
+ if (systemNavigationItems.normalizeSlug(child.slug) === normalized) return child;
2180
+ }
2181
+ }
2182
+ return void 0;
2183
+ }
2184
+ function AppShell({
2185
+ appData: appDataProp,
2186
+ navigation: navigationProp,
2187
+ customPages,
2188
+ basePath = "/",
2189
+ currentSlug: controlledSlug,
2190
+ onNavigate: onNavigateProp,
2191
+ sidebarHeader,
2192
+ sidebarFooter,
2193
+ children
2194
+ }) {
2195
+ const normalizedBasePath = react.useMemo(() => {
2196
+ const stripped = basePath.replace(/^\/|\/$/g, "");
2197
+ return stripped ? `/${stripped}` : "/";
2198
+ }, [basePath]);
2199
+ const { data: fetchedAppData, isLoading: isLoading2 } = useFluidApp({
2200
+ enabled: !appDataProp
2201
+ });
2202
+ const appData = appDataProp ?? fetchedAppData;
2203
+ const activeTheme = react.useMemo(() => {
2204
+ if (!appData?.profile?.themes?.length) return void 0;
2205
+ const themes = appData.profile.themes;
2206
+ const activeId = appData.profile.activeThemeId;
2207
+ return activeId ? themes.find((t) => t.id === activeId) ?? themes[0] : themes[0];
2208
+ }, [appData?.profile?.themes, appData?.profile?.activeThemeId]);
2209
+ react.useEffect(() => {
2210
+ if (!activeTheme) return;
2211
+ const resolved = theme.resolveTheme(activeTheme);
2212
+ theme.applyTheme(resolved);
2213
+ return () => {
2214
+ theme.removeAllThemes();
2215
+ };
2216
+ }, [activeTheme]);
2217
+ const navItems = react.useMemo(() => {
2218
+ if (navigationProp) return navigationProp;
2219
+ const profileNav = appData?.profile?.navigation?.navigation_items;
2220
+ if (profileNav && profileNav.length > 0) return profileNav;
2221
+ return DEFAULT_NAVIGATION;
2222
+ }, [navigationProp, appData?.profile?.navigation?.navigation_items]);
2223
+ const screens = appData?.screens;
2224
+ const navSlugs = react.useMemo(() => collectNavSlugs(navItems), [navItems]);
2225
+ const [themeMode, setThemeMode] = react.useState(getInitialThemeMode);
2226
+ const handleThemeModeChange = react.useCallback((mode) => {
2227
+ setThemeMode(mode);
2228
+ if (typeof window !== "undefined") {
2229
+ localStorage.setItem(THEME_STORAGE_KEY, mode);
2230
+ }
2231
+ }, []);
2232
+ const [pathSlug, setPathSlug] = react.useState(() => {
2233
+ if (typeof window === "undefined") return "";
2234
+ return extractSlugFromPathname(
2235
+ window.location.pathname,
2236
+ normalizedBasePath
2237
+ );
2238
+ });
2239
+ react.useEffect(() => {
2240
+ if (controlledSlug !== void 0) return;
2241
+ if (typeof window === "undefined") return;
2242
+ const currentPath = extractSlugFromPathname(
2243
+ window.location.pathname,
2244
+ normalizedBasePath
2245
+ );
2246
+ if (!currentPath) {
2247
+ const firstSlug = findFirstNavigableSlug(navItems);
2248
+ if (firstSlug) {
2249
+ const targetPath = normalizedBasePath === "/" ? `/${firstSlug}` : `${normalizedBasePath}/${firstSlug}`;
2250
+ history.replaceState(null, "", targetPath);
2251
+ setPathSlug(firstSlug);
2252
+ }
2253
+ }
2254
+ }, [navItems, controlledSlug, normalizedBasePath]);
2255
+ react.useEffect(() => {
2256
+ if (controlledSlug !== void 0) return;
2257
+ const handlePopState = () => {
2258
+ const slug = extractSlugFromPathname(
2259
+ window.location.pathname,
2260
+ normalizedBasePath
2261
+ );
2262
+ setPathSlug(slug);
2263
+ };
2264
+ window.addEventListener("popstate", handlePopState);
2265
+ return () => window.removeEventListener("popstate", handlePopState);
2266
+ }, [controlledSlug, normalizedBasePath]);
2267
+ const activeSlug = controlledSlug ?? pathSlug;
2268
+ const handleNavigate = react.useCallback(
2269
+ (slug) => {
2270
+ if (onNavigateProp) {
2271
+ onNavigateProp(slug);
2272
+ return;
2273
+ }
2274
+ const targetPath = normalizedBasePath === "/" ? `/${slug}` : `${normalizedBasePath}/${slug}`;
2275
+ history.pushState(null, "", targetPath);
2276
+ setPathSlug(slug);
2277
+ },
2278
+ [onNavigateProp, normalizedBasePath]
2279
+ );
2280
+ const slugMatch = react.useMemo(
2281
+ () => matchSlugPrefix(activeSlug, navSlugs),
2282
+ [activeSlug, navSlugs]
2283
+ );
2284
+ const baseSlug = slugMatch?.matchedSlug ?? systemNavigationItems.normalizeSlug(activeSlug);
2285
+ const restParams = slugMatch?.rest ?? "";
2286
+ const currentSection = findCurrentSection(navItems, baseSlug);
2287
+ const secondLevelTabs = currentSection?.children ?? [];
2288
+ const currentNavItem = findNavItem(navItems, baseSlug);
2289
+ const content = typeof children === "function" ? children({ currentSlug: activeSlug, currentNavItem }) : children ?? /* @__PURE__ */ jsxRuntime.jsx(
2290
+ PageRouter,
2291
+ {
2292
+ currentSlug: activeSlug,
2293
+ currentNavItem,
2294
+ customPages,
2295
+ screens,
2296
+ baseSlug,
2297
+ restParams
2298
+ }
2299
+ );
2300
+ if (isLoading2 && !appData) {
2301
+ return /* @__PURE__ */ jsxRuntime.jsx(AppShellLoading, {});
2302
+ }
2303
+ return /* @__PURE__ */ jsxRuntime.jsx(
2304
+ ThemeModeContext.ThemeModeProvider,
2305
+ {
2306
+ mode: themeMode,
2307
+ onModeChange: handleThemeModeChange,
2308
+ autoModeEnabled: false,
2309
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2310
+ AppNavigationProvider,
2311
+ {
2312
+ currentSlug: activeSlug,
2313
+ basePath: normalizedBasePath,
2314
+ navigate: handleNavigate,
2315
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2316
+ "div",
2317
+ {
2318
+ "data-theme": activeTheme?.id,
2319
+ "data-theme-mode": themeMode === "auto" ? void 0 : themeMode,
2320
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2321
+ AppShellLayout.AppShellLayout,
2322
+ {
2323
+ sidebarContent: /* @__PURE__ */ jsxRuntime.jsx(
2324
+ SdkNavigation,
2325
+ {
2326
+ navItems,
2327
+ currentSlug: activeSlug,
2328
+ onNavigate: handleNavigate,
2329
+ navSlugs
2330
+ }
2331
+ ),
2332
+ headerContent: /* @__PURE__ */ jsxRuntime.jsx(
2333
+ SdkHeader,
2334
+ {
2335
+ tabs: secondLevelTabs,
2336
+ currentSlug: activeSlug,
2337
+ onNavigate: handleNavigate,
2338
+ navSlugs
2339
+ }
2340
+ ),
2341
+ sidebarHeader,
2342
+ sidebarFooter,
2343
+ children: content
2344
+ }
2345
+ )
2346
+ }
2347
+ )
2348
+ }
2349
+ )
2350
+ }
2351
+ );
2352
+ }
2353
+ var AppLink = react.forwardRef(
2354
+ function AppLink2({ to, onClick, children, ...rest }, ref) {
2355
+ const { navigate, buildHref } = useAppNavigation();
2356
+ const handleClick = (e) => {
2357
+ onClick?.(e);
2358
+ if (e.defaultPrevented) return;
2359
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
2360
+ if (e.button !== 0) return;
2361
+ if (rest.target && rest.target !== "_self") return;
2362
+ e.preventDefault();
2363
+ navigate(to);
2364
+ };
2365
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { ref, href: buildHref(to), onClick: handleClick, ...rest, children });
2366
+ }
2367
+ );
2368
+ var export_DEFAULT_COLORS = chunkV3IMQZIG_cjs.themes_exports.DEFAULT_COLORS;
2369
+ var export_DEFAULT_FONT_FAMILIES = chunkV3IMQZIG_cjs.themes_exports.DEFAULT_FONT_FAMILIES;
2370
+ var export_DEFAULT_FONT_SIZES = chunkV3IMQZIG_cjs.themes_exports.DEFAULT_FONT_SIZES;
2371
+ var export_DEFAULT_RADII = chunkV3IMQZIG_cjs.themes_exports.DEFAULT_RADII;
2372
+ var export_DEFAULT_SPACING = chunkV3IMQZIG_cjs.themes_exports.DEFAULT_SPACING;
2373
+ var export_DEFAULT_THEME_ID = chunkV3IMQZIG_cjs.themes_exports.DEFAULT_THEME_ID;
2374
+ var export_DEFAULT_THEME_NAME = chunkV3IMQZIG_cjs.themes_exports.DEFAULT_THEME_NAME;
2375
+ var export_FONT_FAMILY_KEYS = chunkV3IMQZIG_cjs.themes_exports.FONT_FAMILY_KEYS;
2376
+ var export_FONT_SIZE_KEYS = chunkV3IMQZIG_cjs.themes_exports.FONT_SIZE_KEYS;
2377
+ var export_RADIUS_KEYS = chunkV3IMQZIG_cjs.themes_exports.RADIUS_KEYS;
2378
+ var export_SEMANTIC_COLOR_NAMES = chunkV3IMQZIG_cjs.themes_exports.SEMANTIC_COLOR_NAMES;
2379
+ var export_SHADE_STEPS = chunkV3IMQZIG_cjs.themes_exports.SHADE_STEPS;
2380
+ var export_applyTheme = chunkV3IMQZIG_cjs.themes_exports.applyTheme;
2381
+ var export_deriveDarkVariant = chunkV3IMQZIG_cjs.themes_exports.deriveDarkVariant;
2382
+ var export_deserialiseTheme = chunkV3IMQZIG_cjs.themes_exports.deserialiseTheme;
2383
+ var export_generateShades = chunkV3IMQZIG_cjs.themes_exports.generateShades;
2384
+ var export_generateThemeCSS = chunkV3IMQZIG_cjs.themes_exports.generateThemeCSS;
2385
+ var export_getDefaultThemeDefinition = chunkV3IMQZIG_cjs.themes_exports.getDefaultThemeDefinition;
2386
+ var export_getForegroundColor = chunkV3IMQZIG_cjs.themes_exports.getForegroundColor;
2387
+ var export_mergeDarkOverrides = chunkV3IMQZIG_cjs.themes_exports.mergeDarkOverrides;
2388
+ var export_parseColor = chunkV3IMQZIG_cjs.themes_exports.parseColor;
2389
+ var export_removeAllThemes = chunkV3IMQZIG_cjs.themes_exports.removeAllThemes;
2390
+ var export_removeTheme = chunkV3IMQZIG_cjs.themes_exports.removeTheme;
2391
+ var export_resolveTheme = chunkV3IMQZIG_cjs.themes_exports.resolveTheme;
2392
+ var export_serialiseTheme = chunkV3IMQZIG_cjs.themes_exports.serialiseTheme;
2143
2393
 
2394
+ Object.defineProperty(exports, "AUTH_CONSTANTS", {
2395
+ enumerable: true,
2396
+ get: function () { return chunkV3IMQZIG_cjs.AUTH_CONSTANTS; }
2397
+ });
2398
+ Object.defineProperty(exports, "ApiError", {
2399
+ enumerable: true,
2400
+ get: function () { return chunkV3IMQZIG_cjs.ApiError; }
2401
+ });
2402
+ Object.defineProperty(exports, "DEFAULT_AUTH_URL", {
2403
+ enumerable: true,
2404
+ get: function () { return chunkV3IMQZIG_cjs.DEFAULT_AUTH_URL; }
2405
+ });
2406
+ Object.defineProperty(exports, "DEFAULT_SDK_WIDGET_REGISTRY", {
2407
+ enumerable: true,
2408
+ get: function () { return chunkV3IMQZIG_cjs.DEFAULT_SDK_WIDGET_REGISTRY; }
2409
+ });
2410
+ Object.defineProperty(exports, "FluidAuthProvider", {
2411
+ enumerable: true,
2412
+ get: function () { return chunkV3IMQZIG_cjs.FluidAuthProvider; }
2413
+ });
2414
+ Object.defineProperty(exports, "FluidProvider", {
2415
+ enumerable: true,
2416
+ get: function () { return chunkV3IMQZIG_cjs.FluidProvider; }
2417
+ });
2418
+ Object.defineProperty(exports, "FluidThemeProvider", {
2419
+ enumerable: true,
2420
+ get: function () { return chunkV3IMQZIG_cjs.FluidThemeProvider; }
2421
+ });
2144
2422
  Object.defineProperty(exports, "MessagingScreen", {
2145
2423
  enumerable: true,
2146
- get: function () { return chunkJZRNKSKT_cjs.MessagingScreen; }
2424
+ get: function () { return chunkV3IMQZIG_cjs.MessagingScreen; }
2425
+ });
2426
+ Object.defineProperty(exports, "STORAGE_KEYS", {
2427
+ enumerable: true,
2428
+ get: function () { return chunkV3IMQZIG_cjs.STORAGE_KEYS; }
2429
+ });
2430
+ Object.defineProperty(exports, "URL_PARAMS", {
2431
+ enumerable: true,
2432
+ get: function () { return chunkV3IMQZIG_cjs.URL_PARAMS; }
2433
+ });
2434
+ Object.defineProperty(exports, "USER_TYPES", {
2435
+ enumerable: true,
2436
+ get: function () { return chunkV3IMQZIG_cjs.USER_TYPES; }
2437
+ });
2438
+ Object.defineProperty(exports, "buildThemeDefinition", {
2439
+ enumerable: true,
2440
+ get: function () { return chunkV3IMQZIG_cjs.buildThemeDefinition; }
2441
+ });
2442
+ Object.defineProperty(exports, "cleanTokenFromUrl", {
2443
+ enumerable: true,
2444
+ get: function () { return chunkV3IMQZIG_cjs.cleanTokenFromUrl; }
2445
+ });
2446
+ Object.defineProperty(exports, "clearTokens", {
2447
+ enumerable: true,
2448
+ get: function () { return chunkV3IMQZIG_cjs.clearTokens; }
2449
+ });
2450
+ Object.defineProperty(exports, "createDefaultAuthRedirect", {
2451
+ enumerable: true,
2452
+ get: function () { return chunkV3IMQZIG_cjs.createDefaultAuthRedirect; }
2453
+ });
2454
+ Object.defineProperty(exports, "createFluidClient", {
2455
+ enumerable: true,
2456
+ get: function () { return chunkV3IMQZIG_cjs.createFluidClient; }
2457
+ });
2458
+ Object.defineProperty(exports, "createFluidFileUploader", {
2459
+ enumerable: true,
2460
+ get: function () { return chunkV3IMQZIG_cjs.createFluidFileUploader; }
2461
+ });
2462
+ Object.defineProperty(exports, "decodeToken", {
2463
+ enumerable: true,
2464
+ get: function () { return chunkV3IMQZIG_cjs.decodeToken; }
2465
+ });
2466
+ Object.defineProperty(exports, "extractAllTokensFromUrl", {
2467
+ enumerable: true,
2468
+ get: function () { return chunkV3IMQZIG_cjs.extractAllTokensFromUrl; }
2469
+ });
2470
+ Object.defineProperty(exports, "extractCompanyTokenFromUrl", {
2471
+ enumerable: true,
2472
+ get: function () { return chunkV3IMQZIG_cjs.extractCompanyTokenFromUrl; }
2473
+ });
2474
+ Object.defineProperty(exports, "extractTokenFromUrl", {
2475
+ enumerable: true,
2476
+ get: function () { return chunkV3IMQZIG_cjs.extractTokenFromUrl; }
2477
+ });
2478
+ Object.defineProperty(exports, "getActiveThemeId", {
2479
+ enumerable: true,
2480
+ get: function () { return chunkV3IMQZIG_cjs.getActiveThemeId; }
2481
+ });
2482
+ Object.defineProperty(exports, "getStoredToken", {
2483
+ enumerable: true,
2484
+ get: function () { return chunkV3IMQZIG_cjs.getStoredToken; }
2485
+ });
2486
+ Object.defineProperty(exports, "getTokenExpiration", {
2487
+ enumerable: true,
2488
+ get: function () { return chunkV3IMQZIG_cjs.getTokenExpiration; }
2489
+ });
2490
+ Object.defineProperty(exports, "getTokenTimeRemaining", {
2491
+ enumerable: true,
2492
+ get: function () { return chunkV3IMQZIG_cjs.getTokenTimeRemaining; }
2493
+ });
2494
+ Object.defineProperty(exports, "hasStoredToken", {
2495
+ enumerable: true,
2496
+ get: function () { return chunkV3IMQZIG_cjs.hasStoredToken; }
2497
+ });
2498
+ Object.defineProperty(exports, "hasTokenInUrl", {
2499
+ enumerable: true,
2500
+ get: function () { return chunkV3IMQZIG_cjs.hasTokenInUrl; }
2501
+ });
2502
+ Object.defineProperty(exports, "isApiError", {
2503
+ enumerable: true,
2504
+ get: function () { return chunkV3IMQZIG_cjs.isApiError; }
2505
+ });
2506
+ Object.defineProperty(exports, "isTokenExpired", {
2507
+ enumerable: true,
2508
+ get: function () { return chunkV3IMQZIG_cjs.isTokenExpired; }
2509
+ });
2510
+ Object.defineProperty(exports, "isUserType", {
2511
+ enumerable: true,
2512
+ get: function () { return chunkV3IMQZIG_cjs.isUserType; }
2513
+ });
2514
+ Object.defineProperty(exports, "isValidToken", {
2515
+ enumerable: true,
2516
+ get: function () { return chunkV3IMQZIG_cjs.isValidToken; }
2147
2517
  });
2148
2518
  Object.defineProperty(exports, "messagingScreenPropertySchema", {
2149
2519
  enumerable: true,
2150
- get: function () { return chunkJZRNKSKT_cjs.messagingScreenPropertySchema; }
2520
+ get: function () { return chunkV3IMQZIG_cjs.messagingScreenPropertySchema; }
2521
+ });
2522
+ Object.defineProperty(exports, "normalizeComponentTree", {
2523
+ enumerable: true,
2524
+ get: function () { return chunkV3IMQZIG_cjs.normalizeComponentTree; }
2525
+ });
2526
+ Object.defineProperty(exports, "storeToken", {
2527
+ enumerable: true,
2528
+ get: function () { return chunkV3IMQZIG_cjs.storeToken; }
2529
+ });
2530
+ Object.defineProperty(exports, "toNavigationItem", {
2531
+ enumerable: true,
2532
+ get: function () { return chunkV3IMQZIG_cjs.toNavigationItem; }
2533
+ });
2534
+ Object.defineProperty(exports, "toScreenDefinition", {
2535
+ enumerable: true,
2536
+ get: function () { return chunkV3IMQZIG_cjs.toScreenDefinition; }
2537
+ });
2538
+ Object.defineProperty(exports, "transformManifestToRepAppData", {
2539
+ enumerable: true,
2540
+ get: function () { return chunkV3IMQZIG_cjs.transformManifestToRepAppData; }
2541
+ });
2542
+ Object.defineProperty(exports, "transformThemes", {
2543
+ enumerable: true,
2544
+ get: function () { return chunkV3IMQZIG_cjs.transformThemes; }
2545
+ });
2546
+ Object.defineProperty(exports, "useFluidApi", {
2547
+ enumerable: true,
2548
+ get: function () { return chunkV3IMQZIG_cjs.useFluidApi; }
2549
+ });
2550
+ Object.defineProperty(exports, "useFluidAuthContext", {
2551
+ enumerable: true,
2552
+ get: function () { return chunkV3IMQZIG_cjs.useFluidAuthContext; }
2553
+ });
2554
+ Object.defineProperty(exports, "useFluidContext", {
2555
+ enumerable: true,
2556
+ get: function () { return chunkV3IMQZIG_cjs.useFluidContext; }
2557
+ });
2558
+ Object.defineProperty(exports, "useMessagingAuth", {
2559
+ enumerable: true,
2560
+ get: function () { return chunkV3IMQZIG_cjs.useMessagingAuth; }
2561
+ });
2562
+ Object.defineProperty(exports, "useMessagingConfig", {
2563
+ enumerable: true,
2564
+ get: function () { return chunkV3IMQZIG_cjs.useMessagingConfig; }
2565
+ });
2566
+ Object.defineProperty(exports, "useThemeContext", {
2567
+ enumerable: true,
2568
+ get: function () { return chunkV3IMQZIG_cjs.useThemeContext; }
2569
+ });
2570
+ Object.defineProperty(exports, "validateToken", {
2571
+ enumerable: true,
2572
+ get: function () { return chunkV3IMQZIG_cjs.validateToken; }
2151
2573
  });
2152
2574
  Object.defineProperty(exports, "ContactsScreen", {
2153
2575
  enumerable: true,
2154
- get: function () { return chunkMEOOAMH2_cjs.ContactsScreen; }
2576
+ get: function () { return chunkEOXYOOWS_cjs.ContactsScreen; }
2155
2577
  });
2156
2578
  Object.defineProperty(exports, "contactsScreenPropertySchema", {
2157
2579
  enumerable: true,
2158
- get: function () { return chunkMEOOAMH2_cjs.contactsScreenPropertySchema; }
2580
+ get: function () { return chunkEOXYOOWS_cjs.contactsScreenPropertySchema; }
2159
2581
  });
2160
2582
  Object.defineProperty(exports, "OrdersScreen", {
2161
2583
  enumerable: true,
2162
- get: function () { return chunkYII3IXF4_cjs.OrdersScreen; }
2584
+ get: function () { return chunkFG2CI6HA_cjs.OrdersScreen; }
2163
2585
  });
2164
2586
  Object.defineProperty(exports, "ordersScreenPropertySchema", {
2165
2587
  enumerable: true,
2166
- get: function () { return chunkYII3IXF4_cjs.ordersScreenPropertySchema; }
2588
+ get: function () { return chunkFG2CI6HA_cjs.ordersScreenPropertySchema; }
2167
2589
  });
2168
2590
  Object.defineProperty(exports, "CustomersScreen", {
2169
2591
  enumerable: true,
2170
- get: function () { return chunkMBUCXIUN_cjs.CustomersScreen; }
2592
+ get: function () { return chunkMHPK7YQ2_cjs.CustomersScreen; }
2171
2593
  });
2172
2594
  Object.defineProperty(exports, "customersScreenPropertySchema", {
2173
2595
  enumerable: true,
2174
- get: function () { return chunkMBUCXIUN_cjs.customersScreenPropertySchema; }
2596
+ get: function () { return chunkMHPK7YQ2_cjs.customersScreenPropertySchema; }
2175
2597
  });
2176
2598
  Object.defineProperty(exports, "ProductsScreen", {
2177
2599
  enumerable: true,
2178
- get: function () { return chunkQUVJ3R4T_cjs.ProductsScreen; }
2600
+ get: function () { return chunk5UBEM3AX_cjs.ProductsScreen; }
2179
2601
  });
2180
2602
  Object.defineProperty(exports, "productsScreenPropertySchema", {
2181
2603
  enumerable: true,
2182
- get: function () { return chunkQUVJ3R4T_cjs.productsScreenPropertySchema; }
2604
+ get: function () { return chunk5UBEM3AX_cjs.productsScreenPropertySchema; }
2183
2605
  });
2184
2606
  Object.defineProperty(exports, "WIDGET_TYPE_NAMES", {
2185
2607
  enumerable: true,
@@ -2389,85 +2811,82 @@ Object.defineProperty(exports, "isPropertyFieldType", {
2389
2811
  enumerable: true,
2390
2812
  get: function () { return registries.isPropertyFieldType; }
2391
2813
  });
2814
+ Object.defineProperty(exports, "ThemeModeProvider", {
2815
+ enumerable: true,
2816
+ get: function () { return ThemeModeContext.ThemeModeProvider; }
2817
+ });
2818
+ Object.defineProperty(exports, "getThemeModeAttribute", {
2819
+ enumerable: true,
2820
+ get: function () { return ThemeModeContext.getThemeModeAttribute; }
2821
+ });
2822
+ Object.defineProperty(exports, "useThemeMode", {
2823
+ enumerable: true,
2824
+ get: function () { return ThemeModeContext.useThemeMode; }
2825
+ });
2392
2826
  exports.ACTIVITY_SLUGS = ACTIVITY_SLUGS;
2393
- exports.AUTH_CONSTANTS = AUTH_CONSTANTS;
2394
- exports.ApiError = ApiError;
2827
+ exports.APP_DATA_QUERY_KEY = APP_DATA_QUERY_KEY;
2828
+ exports.AppLink = AppLink;
2829
+ exports.AppNavigationProvider = AppNavigationProvider;
2830
+ exports.AppShell = AppShell;
2395
2831
  exports.AuthError = AuthError;
2396
2832
  exports.AuthLoading = AuthLoading;
2397
- exports.BUILT_IN_THEMES = export_BUILT_IN_THEMES;
2398
- exports.CORE_COLOR_KEYS = export_CORE_COLOR_KEYS;
2833
+ exports.BuilderScreenView = BuilderScreenView;
2399
2834
  exports.CORE_PAGE_IDS = CORE_PAGE_IDS;
2400
2835
  exports.CURRENT_REP_QUERY_KEY = CURRENT_REP_QUERY_KEY;
2401
- exports.DEFAULT_AUTH_URL = DEFAULT_AUTH_URL;
2402
- exports.DEFAULT_CORE_COLORS = export_DEFAULT_CORE_COLORS;
2403
- exports.FluidAuthProvider = FluidAuthProvider;
2404
- exports.FluidProvider = FluidProvider;
2405
- exports.FluidThemeProvider = FluidThemeProvider;
2836
+ exports.DEFAULT_COLORS = export_DEFAULT_COLORS;
2837
+ exports.DEFAULT_FONT_FAMILIES = export_DEFAULT_FONT_FAMILIES;
2838
+ exports.DEFAULT_FONT_SIZES = export_DEFAULT_FONT_SIZES;
2839
+ exports.DEFAULT_RADII = export_DEFAULT_RADII;
2840
+ exports.DEFAULT_SPACING = export_DEFAULT_SPACING;
2841
+ exports.DEFAULT_THEME_ID = export_DEFAULT_THEME_ID;
2842
+ exports.DEFAULT_THEME_NAME = export_DEFAULT_THEME_NAME;
2843
+ exports.FONT_FAMILY_KEYS = export_FONT_FAMILY_KEYS;
2844
+ exports.FONT_SIZE_KEYS = export_FONT_SIZE_KEYS;
2406
2845
  exports.PAGE_CATEGORIES = PAGE_CATEGORIES;
2407
2846
  exports.PERMISSIONS_QUERY_KEY = PERMISSIONS_QUERY_KEY;
2408
2847
  exports.PROFILE_QUERY_KEY = PROFILE_QUERY_KEY;
2848
+ exports.PageRouter = PageRouter;
2409
2849
  exports.PageTemplateProvider = PageTemplateProvider;
2410
2850
  exports.PageTemplateRegistry = PageTemplateRegistry;
2851
+ exports.QuickLinksDropdown = QuickLinksDropdown;
2852
+ exports.RADIUS_KEYS = export_RADIUS_KEYS;
2411
2853
  exports.RequireAuth = RequireAuth;
2412
- exports.STORAGE_KEYS = STORAGE_KEYS;
2413
- exports.URL_PARAMS = URL_PARAMS;
2414
- exports.USER_TYPES = USER_TYPES;
2415
- exports.catppuccinMocha = export_catppuccinMocha;
2416
- exports.clampChroma = export_clampChroma;
2417
- exports.cleanTokenFromUrl = cleanTokenFromUrl;
2418
- exports.clearTokens = clearTokens;
2419
- exports.createDefaultAuthRedirect = createDefaultAuthRedirect;
2420
- exports.createFluidClient = createFluidClient;
2421
- exports.decodeToken = decodeToken;
2422
- exports.defaultTheme = export_defaultTheme;
2423
- exports.detectThemeMode = export_detectThemeMode;
2424
- exports.dracula = export_dracula;
2425
- exports.everforest = export_everforest;
2426
- exports.extractAllTokensFromUrl = extractAllTokensFromUrl;
2427
- exports.extractCompanyTokenFromUrl = extractCompanyTokenFromUrl;
2428
- exports.extractTokenFromUrl = extractTokenFromUrl;
2429
- exports.generateColorSwatches = export_generateColorSwatches;
2430
- exports.generateDualTheme = export_generateDualTheme;
2431
- exports.generateSmartDualTheme = export_generateSmartDualTheme;
2432
- exports.generateTheme = export_generateTheme;
2433
- exports.generateThemeCssVars = export_generateThemeCssVars;
2854
+ exports.SEMANTIC_COLOR_NAMES = export_SEMANTIC_COLOR_NAMES;
2855
+ exports.SHADE_STEPS = export_SHADE_STEPS;
2856
+ exports.SdkHeader = SdkHeader;
2857
+ exports.SdkNavigation = SdkNavigation;
2858
+ exports.applyTheme = export_applyTheme;
2859
+ exports.collectNavSlugs = collectNavSlugs;
2860
+ exports.deriveDarkVariant = export_deriveDarkVariant;
2861
+ exports.deserialiseTheme = export_deserialiseTheme;
2862
+ exports.extractSlugFromPathname = extractSlugFromPathname;
2863
+ exports.generateShades = export_generateShades;
2864
+ exports.generateThemeCSS = export_generateThemeCSS;
2434
2865
  exports.getAvailablePageTemplates = getAvailablePageTemplates;
2435
2866
  exports.getCorePageTemplates = getCorePageTemplates;
2867
+ exports.getDefaultThemeDefinition = export_getDefaultThemeDefinition;
2868
+ exports.getForegroundColor = export_getForegroundColor;
2436
2869
  exports.getOptionalPageTemplates = getOptionalPageTemplates;
2437
2870
  exports.getProperty = getProperty;
2438
- exports.getStoredToken = getStoredToken;
2439
- exports.getTokenExpiration = getTokenExpiration;
2440
- exports.getTokenTimeRemaining = getTokenTimeRemaining;
2441
- exports.gruvbox = export_gruvbox;
2442
2871
  exports.hasData = hasData;
2443
- exports.hasStoredToken = hasStoredToken;
2444
- exports.hasTokenInUrl = hasTokenInUrl;
2445
2872
  exports.isActivitySlug = isActivitySlug;
2446
- exports.isApiError = isApiError;
2447
2873
  exports.isContactStatus = isContactStatus;
2448
2874
  exports.isErrorResult = isErrorResult;
2449
2875
  exports.isIdle = isIdle;
2450
2876
  exports.isLoading = isLoading;
2451
- exports.isTokenExpired = isTokenExpired;
2452
- exports.isUserType = isUserType;
2453
- exports.isValidToken = isValidToken;
2454
- exports.mod = export_mod;
2455
- exports.monokai = export_monokai;
2456
- exports.nord = export_nord;
2457
- exports.oklchString = export_oklchString;
2458
- exports.parseOklch = export_parseOklch;
2877
+ exports.isSlugInSection = isSlugInSection;
2878
+ exports.matchSlugPrefix = matchSlugPrefix;
2879
+ exports.mergeDarkOverrides = export_mergeDarkOverrides;
2880
+ exports.parseColor = export_parseColor;
2881
+ exports.removeAllThemes = export_removeAllThemes;
2882
+ exports.removeTheme = export_removeTheme;
2459
2883
  exports.resolveNavigationPages = resolveNavigationPages;
2460
- exports.rosePine = export_rosePine;
2461
- exports.rotateHue = export_rotateHue;
2462
- exports.rotateSoft = export_rotateSoft;
2884
+ exports.resolveTheme = export_resolveTheme;
2463
2885
  exports.screenPropertySchemas = screenPropertySchemas;
2464
2886
  exports.selectProperty = selectProperty;
2465
- exports.solarized = export_solarized;
2466
- exports.storeToken = storeToken;
2467
- exports.toDarkMode = export_toDarkMode;
2468
- exports.toLightMode = export_toLightMode;
2469
- exports.tokyoNight = export_tokyoNight;
2887
+ exports.serialiseTheme = export_serialiseTheme;
2470
2888
  exports.useActivities = useActivities;
2889
+ exports.useAppNavigation = useAppNavigation;
2471
2890
  exports.useCalendarEvents = useCalendarEvents;
2472
2891
  exports.useCatchUps = useCatchUps;
2473
2892
  exports.useContact = useContact;
@@ -2475,19 +2894,15 @@ exports.useContacts = useContacts;
2475
2894
  exports.useConversationMessages = useConversationMessages;
2476
2895
  exports.useConversations = useConversations;
2477
2896
  exports.useCurrentRep = useCurrentRep;
2478
- exports.useFluidApi = useFluidApi;
2897
+ exports.useFluidApp = useFluidApp;
2479
2898
  exports.useFluidAuth = useFluidAuth;
2480
- exports.useFluidAuthContext = useFluidAuthContext;
2481
- exports.useFluidContext = useFluidContext;
2482
2899
  exports.useFluidPermissions = useFluidPermissions;
2483
2900
  exports.useFluidProfile = useFluidProfile;
2484
2901
  exports.useFluidTheme = useFluidTheme;
2485
2902
  exports.useMySite = useMySite;
2486
2903
  exports.usePageTemplates = usePageTemplates;
2487
2904
  exports.useResolvedPages = useResolvedPages;
2488
- exports.useThemeContext = useThemeContext;
2489
2905
  exports.useTodos = useTodos;
2490
2906
  exports.validateNavigationPages = validateNavigationPages;
2491
- exports.validateToken = validateToken;
2492
2907
  //# sourceMappingURL=index.cjs.map
2493
2908
  //# sourceMappingURL=index.cjs.map