@voyant-travel/admin 0.111.5 → 0.113.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/app/extension-routes.d.ts +14 -0
  2. package/dist/app/extension-routes.d.ts.map +1 -1
  3. package/dist/app/extension-routes.js +27 -0
  4. package/dist/app/index.d.ts +1 -1
  5. package/dist/app/index.d.ts.map +1 -1
  6. package/dist/app/index.js +1 -1
  7. package/dist/components/brand/voyant-mark.d.ts +8 -0
  8. package/dist/components/brand/voyant-mark.d.ts.map +1 -1
  9. package/dist/components/brand/voyant-mark.js +9 -1
  10. package/dist/components/brand/voyant-wordmark.d.ts +4 -0
  11. package/dist/components/brand/voyant-wordmark.d.ts.map +1 -1
  12. package/dist/components/brand/voyant-wordmark.js +6 -2
  13. package/dist/components/operator-admin-sidebar.d.ts +1 -1
  14. package/dist/components/operator-admin-sidebar.d.ts.map +1 -1
  15. package/dist/components/operator-admin-sidebar.js +3 -3
  16. package/dist/components/operator-admin-user-menu.d.ts.map +1 -1
  17. package/dist/components/operator-admin-user-menu.js +1 -1
  18. package/dist/dashboard/dashboard-kpi-card.d.ts.map +1 -1
  19. package/dist/dashboard/dashboard-kpi-card.js +1 -3
  20. package/dist/dashboard/dashboard-page.js +9 -9
  21. package/dist/dashboard/dashboard-query-options.js +12 -12
  22. package/dist/extensions.d.ts +20 -0
  23. package/dist/extensions.d.ts.map +1 -1
  24. package/dist/extensions.js +31 -0
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -2
  28. package/dist/navigation/operator-navigation.d.ts +8 -0
  29. package/dist/navigation/operator-navigation.d.ts.map +1 -1
  30. package/dist/navigation/operator-navigation.js +25 -0
  31. package/package.json +4 -4
@@ -87,6 +87,20 @@ export interface AdminExtensionChildRoutesOptions {
87
87
  * reachable via plain string navigation only.
88
88
  */
89
89
  export declare function adminExtensionChildRoutes(extension: AdminExtension, parentRouteId: string, getParentRoute: () => AnyRoute, runtime: AdminExtensionRouteRuntime, options?: AdminExtensionChildRoutesOptions): Array<AnyRoute>;
90
+ /**
91
+ * Build code-based TOP-LEVEL routes for a set of admin extensions' route
92
+ * contributions, at runtime — for DISCOVERED (`src/admin/*`) deployment-local
93
+ * extensions the host's `voyant admin generate` never scanned. Mirrors the
94
+ * generated `admin.routes.generated.tsx` `createRoute` loop, then hand the
95
+ * result to {@link attachAdminExtensionRoutes} alongside the generated routes.
96
+ *
97
+ * Runtime-built routes carry NO typed-link contract (they are invisible to the
98
+ * host's generated typed-link maps), so they are reachable via plain string
99
+ * navigation only — the same trade-off as {@link adminExtensionChildRoutes}.
100
+ * Nested `children` are not built here (top-level pages only); a contribution
101
+ * needs a `page`, `component`, or `redirectTo` to count as implemented.
102
+ */
103
+ export declare function buildAdminExtensionRoutes(extensions: ReadonlyArray<AdminExtension>, getParentRoute: () => AnyRoute, runtime: AdminExtensionRouteRuntime): Array<AnyRoute>;
90
104
  /**
91
105
  * Graft code-built extension routes under a file-based parent route
92
106
  * (typically the workspace layout) and return the tree for `_addFileTypes`
@@ -1 +1 @@
1
- {"version":3,"file":"extension-routes.d.ts","sourceRoot":"","sources":["../../src/app/extension-routes.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAOd,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,iBAAiB,EAKvB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD;;;;;;;;;;;;;;;;;GAiBG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,0BAA0B,GAAG,iBAAiB,GAAG,CAAC,MAAM,iBAAiB,CAAC,CAAA;AAMtF;;;;;GAKG;AACH,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,kBAAkB,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED,KAAK,oBAAoB,GAAG,KAAK,CAAC,iBAAiB,GAAG;IACpD,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B,CAAA;AAED,MAAM,WAAW,0BAA0B;IACzC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,oBAAoB,CAAA;IAChC,MAAM,EAAE,CAAC,IAAI,EAAE,6BAA6B,KAAK,OAAO,CAAA;IACxD;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAA;IAC1C,cAAc,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAA;CAC9E;AA4ED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,0BAA0B,GAClC,0BAA0B,CAG5B;AAkCD,MAAM,WAAW,gCAAgC;IAC/C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,cAAc,EACzB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,QAAQ,EAC9B,OAAO,EAAE,0BAA0B,EACnC,OAAO,GAAE,gCAAqC,GAC7C,KAAK,CAAC,QAAQ,CAAC,CAsBjB;AAgBD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,SAAS,QAAQ,EACpE,SAAS,EAAE,UAAU,EACrB,WAAW,EAAE,QAAQ,EACrB,eAAe,EAAE,aAAa,CAAC,QAAQ,CAAC,GACvC,UAAU,CAaZ"}
1
+ {"version":3,"file":"extension-routes.d.ts","sourceRoot":"","sources":["../../src/app/extension-routes.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAOd,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,iBAAiB,EAKvB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD;;;;;;;;;;;;;;;;;GAiBG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,0BAA0B,GAAG,iBAAiB,GAAG,CAAC,MAAM,iBAAiB,CAAC,CAAA;AAMtF;;;;;GAKG;AACH,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,kBAAkB,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED,KAAK,oBAAoB,GAAG,KAAK,CAAC,iBAAiB,GAAG;IACpD,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B,CAAA;AAED,MAAM,WAAW,0BAA0B;IACzC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,oBAAoB,CAAA;IAChC,MAAM,EAAE,CAAC,IAAI,EAAE,6BAA6B,KAAK,OAAO,CAAA;IACxD;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAA;IAC1C,cAAc,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAA;CAC9E;AA4ED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,0BAA0B,GAClC,0BAA0B,CAG5B;AAkCD,MAAM,WAAW,gCAAgC;IAC/C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,cAAc,EACzB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,QAAQ,EAC9B,OAAO,EAAE,0BAA0B,EACnC,OAAO,GAAE,gCAAqC,GAC7C,KAAK,CAAC,QAAQ,CAAC,CAsBjB;AAgBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,EACzC,cAAc,EAAE,MAAM,QAAQ,EAC9B,OAAO,EAAE,0BAA0B,GAClC,KAAK,CAAC,QAAQ,CAAC,CAejB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,SAAS,QAAQ,EACpE,SAAS,EAAE,UAAU,EACrB,WAAW,EAAE,QAAQ,EACrB,eAAe,EAAE,aAAa,CAAC,QAAQ,CAAC,GACvC,UAAU,CAaZ"}
@@ -132,6 +132,33 @@ function requireChildImplementation(extension, child) {
132
132
  }
133
133
  return child;
134
134
  }
135
+ /**
136
+ * Build code-based TOP-LEVEL routes for a set of admin extensions' route
137
+ * contributions, at runtime — for DISCOVERED (`src/admin/*`) deployment-local
138
+ * extensions the host's `voyant admin generate` never scanned. Mirrors the
139
+ * generated `admin.routes.generated.tsx` `createRoute` loop, then hand the
140
+ * result to {@link attachAdminExtensionRoutes} alongside the generated routes.
141
+ *
142
+ * Runtime-built routes carry NO typed-link contract (they are invisible to the
143
+ * host's generated typed-link maps), so they are reachable via plain string
144
+ * navigation only — the same trade-off as {@link adminExtensionChildRoutes}.
145
+ * Nested `children` are not built here (top-level pages only); a contribution
146
+ * needs a `page`, `component`, or `redirectTo` to count as implemented.
147
+ */
148
+ export function buildAdminExtensionRoutes(extensions, getParentRoute, runtime) {
149
+ const routes = [];
150
+ for (const extension of extensions) {
151
+ for (const contribution of extension.routes ?? []) {
152
+ routes.push(createRoute({
153
+ getParentRoute,
154
+ path: contribution.path,
155
+ validateSearch: contribution.validateSearch,
156
+ ...adminExtensionRouteOptions(extension, contribution.id, runtime),
157
+ }));
158
+ }
159
+ }
160
+ return routes;
161
+ }
135
162
  /**
136
163
  * Graft code-built extension routes under a file-based parent route
137
164
  * (typically the workspace layout) and return the tree for `_addFileTypes`
@@ -1,5 +1,5 @@
1
1
  export type { AdminExtensionChildRoutesOptions, AdminExtensionRouteLoaderArgs, AdminExtensionRouteOptions, AdminExtensionRouteRuntime, } from "./extension-routes.js";
2
- export { adminExtensionChildRoutes, adminExtensionRouteOptions, attachAdminExtensionRoutes, } from "./extension-routes.js";
2
+ export { adminExtensionChildRoutes, adminExtensionRouteOptions, attachAdminExtensionRoutes, buildAdminExtensionRoutes, } from "./extension-routes.js";
3
3
  export type { AdminRootErrorBoundaryProps, AdminRootHeadOptions } from "./root.js";
4
4
  export { AdminRootErrorBoundary, AdminRootShell, adminRootHead } from "./root.js";
5
5
  export type { AdminRouterContext, CreateAdminRouterOptions } from "./router.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gCAAgC,EAChC,6BAA6B,EAC7B,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAClF,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACjF,YAAY,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAC/E,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,wBAAwB,EACxB,uBAAuB,EACvB,qCAAqC,GACtC,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,mBAAmB,EACnB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gCAAgC,EAChC,6BAA6B,EAC7B,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAClF,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACjF,YAAY,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAC/E,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,wBAAwB,EACxB,uBAAuB,EACvB,qCAAqC,GACtC,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,mBAAmB,EACnB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,gBAAgB,CAAA"}
package/dist/app/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { adminExtensionChildRoutes, adminExtensionRouteOptions, attachAdminExtensionRoutes, } from "./extension-routes.js";
1
+ export { adminExtensionChildRoutes, adminExtensionRouteOptions, attachAdminExtensionRoutes, buildAdminExtensionRoutes, } from "./extension-routes.js";
2
2
  export { AdminRootErrorBoundary, AdminRootShell, adminRootHead } from "./root.js";
3
3
  export { AdminNotFound, AdminPendingFallback, createAdminQueryClient, createAdminRouter, } from "./router.js";
4
4
  export { AdminRouterLink, AdminWorkspacePendingFallback, AdminWorkspaceShell, createAdminWorkspaceBeforeLoad, defaultAdminWorkspaceUser, } from "./workspace.js";
@@ -1,3 +1,11 @@
1
1
  import type * as React from "react";
2
+ /**
3
+ * Voyant 1.0 brand symbol (the pure mark, no container).
4
+ *
5
+ * Uses `currentColor` so it inherits its color from the surrounding
6
+ * element. To render the app-icon badge, wrap it in a rounded container
7
+ * (see the sidebar brand lockup): a `bg-foreground text-background` box
8
+ * with a ~6px radius gives the dark badge + paper-colored mark.
9
+ */
2
10
  export declare function VoyantMark({ className, ...props }: React.ComponentProps<"svg">): import("react/jsx-runtime").JSX.Element;
3
11
  //# sourceMappingURL=voyant-mark.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"voyant-mark.d.ts","sourceRoot":"","sources":["../../../src/components/brand/voyant-mark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAe9E"}
1
+ {"version":3,"file":"voyant-mark.d.ts","sourceRoot":"","sources":["../../../src/components/brand/voyant-mark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAkB9E"}
@@ -1,4 +1,12 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Voyant 1.0 brand symbol (the pure mark, no container).
4
+ *
5
+ * Uses `currentColor` so it inherits its color from the surrounding
6
+ * element. To render the app-icon badge, wrap it in a rounded container
7
+ * (see the sidebar brand lockup): a `bg-foreground text-background` box
8
+ * with a ~6px radius gives the dark badge + paper-colored mark.
9
+ */
2
10
  export function VoyantMark({ className, ...props }) {
3
- return (_jsx("svg", { viewBox: "0 0 834 834", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", "aria-label": "Voyant", role: "img", "data-slot": "voyant-mark", className: className, ...props, children: _jsx("path", { d: "M323.896 798.828L14 35H177.677L369.725 519.485C393.731 580.591 401.37 620.965 401.37 688.618V695.165H436.288V689.709C436.288 624.238 443.926 583.865 469.023 521.667L664.345 35H819.293L514.853 798.828H323.896Z" }) }));
11
+ return (_jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", "aria-label": "Voyant", role: "img", "data-slot": "voyant-mark", className: className, ...props, children: _jsx("path", { d: "M13.7139 0.0351562C16.0237 -0.117801 18.3496 0.166234 19.7334 2.2793C20.0424 2.7512 20.3056 3.32978 20.6221 3.77246C21.0861 4.42135 21.7679 4.98613 22.2383 5.64453C23.7262 7.57957 23.877 9.56376 23.749 11.9424C23.7635 12.5773 23.603 13.5473 23.6816 14.1436C24.0347 16.8223 24.5922 18.1924 22.1729 20.0762C18.4804 22.9515 15.6009 24.5012 10.7988 23.8545C8.38523 23.5239 5.04028 22.821 3.13477 21.2568C1.51051 19.9227 0.212005 17.5639 0.0322266 15.4375C-0.151416 13.266 0.490818 11.0531 0.785156 8.91113C0.982777 7.4218 0.89953 4.95644 1.99512 3.8291C4.67641 1.07088 10.0881 0.336621 13.7139 0.0351562ZM12.043 0.886719C9.28834 1.12143 6.46823 1.95743 4.68359 4.2334C2.37309 7.18044 0.318512 11.0904 0.646484 14.9648C0.987112 18.9875 4.08836 22.7471 8.30273 22.2617C9.39044 22.1364 10.2007 21.8607 11.2334 21.6416C12.8453 21.2297 14.4318 20.8261 16.042 20.5283C18.1156 20.146 21.6713 20.6066 22.915 18.4258C24.1535 16.2535 22.3754 12.8405 21.5596 10.7627C20.9307 9.19252 20.4908 7.56611 20.3359 5.87598C20.2919 5.39492 20.202 4.63515 20.0059 4.20898C19.4542 3.01091 17.9566 2.51429 16.8613 2.04395C15.2949 1.37134 13.7637 0.810511 12.043 0.886719Z", stroke: "currentColor" }) }));
4
12
  }
@@ -1,3 +1,7 @@
1
1
  import type * as React from "react";
2
+ /**
3
+ * Voyant 1.0 wordmark. Uses `currentColor` so it inherits the surrounding
4
+ * text color (near-black on light surfaces, near-white on dark).
5
+ */
2
6
  export declare function VoyantWordmark({ className, ...props }: React.ComponentProps<"svg">): import("react/jsx-runtime").JSX.Element;
3
7
  //# sourceMappingURL=voyant-wordmark.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"voyant-wordmark.d.ts","sourceRoot":"","sources":["../../../src/components/brand/voyant-wordmark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAoBlF"}
1
+ {"version":3,"file":"voyant-wordmark.d.ts","sourceRoot":"","sources":["../../../src/components/brand/voyant-wordmark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAelF"}
@@ -1,4 +1,8 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Voyant 1.0 wordmark. Uses `currentColor` so it inherits the surrounding
4
+ * text color (near-black on light surfaces, near-white on dark).
5
+ */
2
6
  export function VoyantWordmark({ className, ...props }) {
3
- return (_jsxs("svg", { viewBox: "0 0 89 25", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", "aria-label": "Voyant", role: "img", "data-slot": "voyant-wordmark", className: className, ...props, children: [_jsx("path", { d: "M6.99067 18.5567L-0.0361328 1.23711H3.67521L8.02985 12.2227C8.57418 13.6082 8.74737 14.5237 8.74737 16.0577V16.2062H9.53912V16.0825C9.53912 14.5979 9.71232 13.6825 10.2814 12.2722L14.7103 1.23711H18.2237L11.3206 18.5567H6.99067Z" }), _jsx("path", { d: "M24.2608 18.9278C20.0793 18.9278 17.135 16.2557 16.9618 12.2969H20.0298C20.203 14.7464 21.9103 16.4289 24.2608 16.4289C26.6113 16.4289 28.2938 14.7464 28.467 12.2969H31.535C31.3618 16.2557 28.4422 18.9278 24.2608 18.9278ZM16.9618 11.5299C17.1597 7.64536 20.1041 4.9732 24.2608 4.9732C28.4175 4.9732 31.3371 7.64536 31.535 11.5299H28.4422C28.2938 9.1299 26.6113 7.47217 24.2608 7.47217C21.9103 7.47217 20.203 9.1299 20.0546 11.5299H16.9618Z" }), _jsx("path", { d: "M33.2257 24V21.501H35.3288C36.7144 21.501 37.5061 20.7588 37.5061 19.2247V18.3835L31.667 5.36907H35.1061L37.8773 11.6289C38.4711 12.9897 38.669 13.8804 38.669 15.4144V15.934H39.4855V15.4144C39.4855 13.9299 39.6587 13.0144 40.2773 11.6289L43.0237 5.36907H46.4628L40.6237 18.3588V19.2247C40.6237 22.7876 38.57 24 35.9969 24H33.2257Z" }), _jsx("path", { d: "M52.2855 18.8783C49.5391 18.8783 47.7577 16.8742 47.7577 14.4495C47.7577 12.6186 48.6979 11.2825 49.6133 10.466C51.5432 8.73402 52.0381 8.63505 53.9432 8.63505H55.6999V7.86804H47.9309V5.36907H60.8216V18.5567H57.6793V14.9196H57.036C56.7144 17.5175 54.7845 18.8783 52.2855 18.8783ZM53.8195 16.4536C56.1206 16.4536 57.6793 14.499 57.6793 10.8124V7.81856L53.1515 10.9361C51.6422 11.9753 51.0979 12.8412 51.0979 13.9794C51.0979 15.5134 52.2113 16.4536 53.8195 16.4536Z" }), _jsx("path", { d: "M63.2133 18.5567V5.36907H66.3556V8.9567H66.9989C67.1969 6.43299 69.102 5.04742 71.5267 5.04742C74.3474 5.04742 76.0546 6.80412 76.0546 9.94639V18.5567H72.9371V10.5402C72.9371 8.56083 71.7742 7.49691 70.1412 7.49691C67.8402 7.49691 66.3556 9.57526 66.3556 13.2124V18.5567H63.2133Z" }), _jsx("path", { d: "M85.6958 18.5567C82.4793 18.5567 80.6979 16.7753 80.6979 13.4598V7.86804H77.135V5.36907H80.8216V1.60825L83.8154 0V5.36907H89.036V7.86804H81.935V8.61031H82.3556C83.3453 8.63505 83.8154 9.25361 83.8154 10.1443V13.1876C83.8154 15.068 84.7309 16.0577 86.4876 16.0577H89.036V18.5567H85.6958Z" })] }));
7
+ return (_jsx("svg", { viewBox: "0 0 52 14", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", "aria-label": "Voyant", role: "img", "data-slot": "voyant-wordmark", className: className, ...props, children: _jsx("path", { d: "M3.97596 10.5L-3.70964e-05 0.699999H2.09996L4.56396 6.916C4.87196 7.7 4.96996 8.218 4.96996 9.086V9.17H5.41796V9.1C5.41796 8.26 5.51596 7.742 5.83796 6.944L8.34396 0.699999H10.332L6.42596 10.5H3.97596ZM14.1417 10.71C11.7057 10.71 10.0257 9.1 10.0257 6.748C10.0257 4.424 11.7057 2.814 14.1417 2.814C16.5917 2.814 18.2717 4.424 18.2717 6.748C18.2717 9.1 16.5917 10.71 14.1417 10.71ZM14.1417 9.296C15.5417 9.296 16.5357 8.246 16.5357 6.748C16.5357 5.264 15.5417 4.228 14.1417 4.228C12.7417 4.228 11.7617 5.264 11.7617 6.748C11.7617 8.246 12.7417 9.296 14.1417 9.296ZM19.2426 13.58V12.166H20.4326C21.2166 12.166 21.6646 11.746 21.6646 10.878V10.402L18.3606 3.038H20.3066L21.8746 6.58C22.2106 7.35 22.3226 7.854 22.3226 8.722V9.016H22.7846V8.722C22.7846 7.882 22.8826 7.364 23.2326 6.58L24.7866 3.038H26.7326L23.4286 10.388V10.878C23.4286 12.894 22.2666 13.58 20.8106 13.58H19.2426ZM29.8559 10.682C28.3019 10.682 27.2939 9.548 27.2939 8.176C27.2939 7.14 27.8259 6.384 28.3439 5.922C29.4359 4.942 29.7159 4.886 30.7939 4.886H31.7879V4.452H27.3919V3.038H34.6859V10.5H32.9079V8.442H32.5439C32.3619 9.912 31.2699 10.682 29.8559 10.682ZM30.7239 9.31C32.0259 9.31 32.9079 8.204 32.9079 6.118V4.424L30.3459 6.188C29.4919 6.776 29.1839 7.266 29.1839 7.91C29.1839 8.778 29.8139 9.31 30.7239 9.31ZM36.4513 10.5V3.038H38.2293V5.068H38.5933C38.7053 3.64 39.7833 2.856 41.1553 2.856C42.7513 2.856 43.7173 3.85 43.7173 5.628V10.5H41.9533V5.964C41.9533 4.844 41.2953 4.242 40.3713 4.242C39.0693 4.242 38.2293 5.418 38.2293 7.476V10.5H36.4513ZM49.1252 10.5C47.3052 10.5 46.2972 9.492 46.2972 7.616V4.452H44.2812V3.038H46.3672V0.909999L48.0612 -8.34465e-07V3.038H51.0152V4.452H46.9972V4.872H47.2352C47.7952 4.886 48.0612 5.236 48.0612 5.74V7.462C48.0612 8.526 48.5792 9.086 49.5732 9.086H51.0152V10.5H49.1252Z" }) }));
4
8
  }
@@ -21,7 +21,7 @@ export interface DefaultOperatorAdminBrandProps {
21
21
  linkComponent?: AdminNavLinkComponent;
22
22
  }
23
23
  export declare function DefaultOperatorAdminBrand({ href, linkComponent: LinkComponent, }: DefaultOperatorAdminBrandProps): import("react/jsx-runtime").JSX.Element;
24
- export declare function OperatorAdminSidebar({ accountHref, brand, currentPath, extensions, icons, linkComponent, navItems, onSignOut, user, ...props }: OperatorAdminSidebarProps): import("react/jsx-runtime").JSX.Element;
24
+ export declare function OperatorAdminSidebar({ accountHref, brand, currentPath, extensions, icons, linkComponent, navItems, onSignOut, user, variant, ...props }: OperatorAdminSidebarProps): import("react/jsx-runtime").JSX.Element;
25
25
  export interface OperatorAdminWorkspaceLayoutProps {
26
26
  accountHref?: string;
27
27
  brand?: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"operator-admin-sidebar.d.ts","sourceRoot":"","sources":["../../src/components/operator-admin-sidebar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator-admin-sidebar.d.ts","sourceRoot":"","sources":["../../src/components/operator-admin-sidebar.tsx"],"names":[],"mappings":"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"}
@@ -14,9 +14,9 @@ import { VoyantMark } from "./brand/voyant-mark.js";
14
14
  import { VoyantWordmark } from "./brand/voyant-wordmark.js";
15
15
  import { OperatorAdminUserMenu } from "./operator-admin-user-menu.js";
16
16
  export function DefaultOperatorAdminBrand({ href = "/", linkComponent: LinkComponent = DefaultAdminNavLink, }) {
17
- return (_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, tooltip: "Voyant", size: "lg", className: "group-data-[collapsible=icon]:justify-center", children: _jsxs(LinkComponent, { href: href, target: "_self", "aria-label": "Voyant", children: [_jsx(VoyantMark, { "aria-hidden": "true", className: "hidden! size-5! shrink-0 group-data-[collapsible=icon]:block!" }), _jsx(VoyantWordmark, { "aria-hidden": "true", className: "h-6! w-auto! group-data-[collapsible=icon]:hidden!" })] }) }) }) }));
17
+ return (_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, tooltip: "Voyant", size: "lg", className: "gap-2 text-foreground group-data-[collapsible=icon]:justify-center", children: _jsxs(LinkComponent, { href: href, target: "_self", "aria-label": "Voyant", children: [_jsx("span", { className: "flex size-6 shrink-0 items-center justify-center rounded-md bg-foreground text-background", children: _jsx(VoyantMark, { "aria-hidden": "true", className: "size-4!" }) }), _jsx(VoyantWordmark, { "aria-hidden": "true", className: "h-[1.125rem]! w-auto! group-data-[collapsible=icon]:hidden!" })] }) }) }) }));
18
18
  }
19
- export function OperatorAdminSidebar({ accountHref, brand, currentPath, extensions, icons, linkComponent, navItems, onSignOut, user, ...props }) {
19
+ export function OperatorAdminSidebar({ accountHref, brand, currentPath, extensions, icons, linkComponent, navItems, onSignOut, user, variant = "inset", ...props }) {
20
20
  const messages = useOperatorAdminMessages();
21
21
  const baseItems = navItems ?? createOperatorAdminNavigation({ icons, messages: messages.nav });
22
22
  const resolvedItems = resolveAdminNavigation({ baseItems, extensions });
@@ -24,7 +24,7 @@ export function OperatorAdminSidebar({ accountHref, brand, currentPath, extensio
24
24
  const LinkComponent = linkComponent ?? DefaultAdminNavLink;
25
25
  const SettingsIcon = icons?.settings ?? DefaultSettingsIcon;
26
26
  const settingsActive = navUrlMatchesPath("/settings", currentPath);
27
- return (_jsxs(Sidebar, { collapsible: "icon", ...props, children: [_jsx(SidebarHeader, { children: resolvedBrand }), _jsx(SidebarContent, { children: _jsx(AdminNavGroup, { currentPath: currentPath, items: resolvedItems, linkComponent: linkComponent }) }), _jsxs(SidebarFooter, { children: [_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: settingsActive, tooltip: messages.nav.settings, children: _jsxs(LinkComponent, { href: "/settings", children: [_jsx(SettingsIcon, {}), _jsx("span", { children: messages.nav.settings })] }) }) }) }), user && (_jsx(OperatorAdminUserMenu, { accountHref: accountHref, linkComponent: linkComponent, onSignOut: onSignOut, user: user }))] }), _jsx(SidebarRail, {})] }));
27
+ return (_jsxs(Sidebar, { collapsible: "icon", variant: variant, ...props, children: [_jsx(SidebarHeader, { children: resolvedBrand }), _jsx(SidebarContent, { children: _jsx(AdminNavGroup, { currentPath: currentPath, items: resolvedItems, linkComponent: linkComponent }) }), _jsxs(SidebarFooter, { children: [_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: settingsActive, tooltip: messages.nav.settings, children: _jsxs(LinkComponent, { href: "/settings", children: [_jsx(SettingsIcon, {}), _jsx("span", { children: messages.nav.settings })] }) }) }) }), user && (_jsx(OperatorAdminUserMenu, { accountHref: accountHref, linkComponent: linkComponent, onSignOut: onSignOut, user: user }))] }), _jsx(SidebarRail, {})] }));
28
28
  }
29
29
  function normalizePath(path) {
30
30
  const withoutHash = path.split("#")[0] ?? "";
@@ -1 +1 @@
1
- {"version":3,"file":"operator-admin-user-menu.d.ts","sourceRoot":"","sources":["../../src/components/operator-admin-user-menu.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,KAAK,qBAAqB,EAAuB,MAAM,qBAAqB,CAAA;AAErF,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,qBAAqB,CAAA;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,WAAwB,EACxB,aAAa,EAAE,aAAmC,EAClD,SAAS,EACT,IAAI,GACL,EAAE,0BAA0B,2CA2F5B"}
1
+ {"version":3,"file":"operator-admin-user-menu.d.ts","sourceRoot":"","sources":["../../src/components/operator-admin-user-menu.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,KAAK,qBAAqB,EAAuB,MAAM,qBAAqB,CAAA;AAErF,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,qBAAqB,CAAA;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,WAAwB,EACxB,aAAa,EAAE,aAAmC,EAClD,SAAS,EACT,IAAI,GACL,EAAE,0BAA0B,2CAmG5B"}
@@ -15,5 +15,5 @@ export function OperatorAdminUserMenu({ accountHref = "/account", linkComponent:
15
15
  const displayName = getDisplayName(user);
16
16
  const initials = getInitials(user.firstName, user.lastName, user.email);
17
17
  const showEmailSeparately = Boolean(user.email && displayName !== user.email);
18
- return (_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { size: "lg", className: "data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground", children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-lg", children: [_jsx(AvatarImage, { src: user.avatar ?? undefined, alt: displayName }), _jsx(AvatarFallback, { className: "rounded-lg", children: initials })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-medium", children: displayName }), showEmailSeparately && _jsx("span", { className: "truncate text-xs", children: user.email })] }), _jsx(ChevronsUpDown, { className: "ml-auto size-4" })] }) }), _jsxs(DropdownMenuContent, { className: "w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg", side: isMobile ? "bottom" : "right", align: "end", sideOffset: 4, children: [_jsx("div", { className: "p-0 font-normal", children: _jsxs("div", { className: "flex items-center gap-2 px-1 py-1.5 text-left text-sm", children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-lg", children: [_jsx(AvatarImage, { src: user.avatar ?? undefined, alt: displayName }), _jsx(AvatarFallback, { className: "rounded-lg", children: initials })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-medium", children: displayName }), showEmailSeparately && _jsx("span", { className: "truncate text-xs", children: user.email })] })] }) }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuGroup, { children: [_jsx(DropdownMenuItem, { asChild: true, children: _jsxs(LinkComponent, { href: accountHref, children: [_jsx(BadgeCheck, {}), messages.account] }) }), _jsxs(DropdownMenuItem, { onClick: () => setTheme("light"), children: [_jsx(Sun, { className: "h-4 w-4" }), messages.light, (theme === "light" || (theme === "system" && resolvedTheme === "light")) && (_jsx(Check, { className: "ml-auto h-4 w-4" }))] }), _jsxs(DropdownMenuItem, { onClick: () => setTheme("dark"), children: [_jsx(Moon, { className: "h-4 w-4" }), messages.dark, (theme === "dark" || (theme === "system" && resolvedTheme === "dark")) && (_jsx(Check, { className: "ml-auto h-4 w-4" }))] }), _jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuItem, { disabled: true, children: messages.language }), _jsxs(DropdownMenuItem, { onClick: () => setLocale("en"), children: [messages.english, resolvedLocale === "en" && _jsx(Check, { className: "ml-auto h-4 w-4" })] }), _jsxs(DropdownMenuItem, { onClick: () => setLocale("ro"), children: [messages.romanian, resolvedLocale === "ro" && _jsx(Check, { className: "ml-auto h-4 w-4" })] })] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onClick: () => void onSignOut?.(), children: [_jsx(LogOut, {}), messages.logOut] })] })] }) }) }));
18
+ return (_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { size: "lg", className: "border border-transparent aria-expanded:border-sidebar-border aria-expanded:bg-sidebar-accent aria-expanded:text-sidebar-accent-foreground", children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-sm after:rounded-sm", children: [_jsx(AvatarImage, { src: user.avatar ?? undefined, alt: displayName, className: "rounded-sm" }), _jsx(AvatarFallback, { className: "rounded-sm", children: initials })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-medium", children: displayName }), showEmailSeparately && _jsx("span", { className: "truncate text-xs", children: user.email })] }), _jsx(ChevronsUpDown, { className: "ml-auto size-4" })] }) }), _jsxs(DropdownMenuContent, { className: "w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-sm", side: isMobile ? "bottom" : "right", align: "end", sideOffset: 4, children: [_jsx("div", { className: "p-0 font-normal", children: _jsxs("div", { className: "flex items-center gap-2 px-1 py-1.5 text-left text-sm", children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-sm after:rounded-sm", children: [_jsx(AvatarImage, { src: user.avatar ?? undefined, alt: displayName, className: "rounded-sm" }), _jsx(AvatarFallback, { className: "rounded-sm", children: initials })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-medium", children: displayName }), showEmailSeparately && _jsx("span", { className: "truncate text-xs", children: user.email })] })] }) }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuGroup, { children: [_jsx(DropdownMenuItem, { asChild: true, children: _jsxs(LinkComponent, { href: accountHref, children: [_jsx(BadgeCheck, {}), messages.account] }) }), _jsxs(DropdownMenuItem, { onClick: () => setTheme("light"), children: [_jsx(Sun, { className: "h-4 w-4" }), messages.light, (theme === "light" || (theme === "system" && resolvedTheme === "light")) && (_jsx(Check, { className: "ml-auto h-4 w-4" }))] }), _jsxs(DropdownMenuItem, { onClick: () => setTheme("dark"), children: [_jsx(Moon, { className: "h-4 w-4" }), messages.dark, (theme === "dark" || (theme === "system" && resolvedTheme === "dark")) && (_jsx(Check, { className: "ml-auto h-4 w-4" }))] }), _jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuItem, { disabled: true, children: messages.language }), _jsxs(DropdownMenuItem, { onClick: () => setLocale("en"), children: [messages.english, resolvedLocale === "en" && _jsx(Check, { className: "ml-auto h-4 w-4" })] }), _jsxs(DropdownMenuItem, { onClick: () => setLocale("ro"), children: [messages.romanian, resolvedLocale === "ro" && _jsx(Check, { className: "ml-auto h-4 w-4" })] })] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onClick: () => void onSignOut?.(), children: [_jsx(LogOut, {}), messages.logOut] })] })] }) }) }));
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-kpi-card.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-kpi-card.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,KAAK,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,UAAU,EACV,KAAK,EACL,UAAU,EACV,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,2CA0DA"}
1
+ {"version":3,"file":"dashboard-kpi-card.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-kpi-card.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,KAAK,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,UAAU,EACV,KAAK,EACL,UAAU,EACV,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,2CAyDA"}
@@ -6,7 +6,5 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@voya
6
6
  import { ArrowDownRight, ArrowUpRight } from "lucide-react";
7
7
  export function KpiCard({ title, value, description, icon, trend, trendLabel, empty, emptyLabel, isLoading, }) {
8
8
  const isPositive = (trend ?? 0) >= 0;
9
- return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [_jsx(CardTitle, { className: "text-sm font-medium", children: title }), icon] }), _jsx(CardContent, { children: isLoading ? (_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-7 w-28" }), _jsx(Skeleton, { className: "h-3 w-40" }), trendLabel ? _jsx(Skeleton, { className: "mt-3 h-5 w-28 rounded-full" }) : null] })) : (_jsxs(_Fragment, { children: [empty ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { className: "text-2xl font-semibold tracking-tight text-muted-foreground", "aria-label": emptyLabel ?? description, children: "-" }), _jsx(TooltipContent, { children: emptyLabel ?? description })] }) })) : (_jsx("div", { className: "text-2xl font-semibold tracking-tight", children: value })), _jsx("p", { className: "text-xs text-muted-foreground", children: description }), !empty && trend != null && trendLabel ? (_jsxs("div", { className: "mt-3 flex items-center gap-1 text-xs text-muted-foreground", children: [_jsxs("span", { className: `inline-flex items-center gap-1 rounded-full px-2 py-0.5 ${isPositive
10
- ? "bg-emerald-500/10 text-emerald-600"
11
- : "bg-rose-500/10 text-rose-600"}`, children: [isPositive ? (_jsx(ArrowUpRight, { className: "h-3 w-3" })) : (_jsx(ArrowDownRight, { className: "h-3 w-3" })), Math.abs(trend).toFixed(1), "%"] }), _jsx("span", { children: trendLabel })] })) : null] })) })] }));
9
+ return (_jsxs(Card, { className: "gap-0", children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between space-y-0", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(CardTitle, { className: "text-base font-medium", children: title }), _jsx("p", { className: "text-sm text-muted-foreground", children: description })] }), _jsx("span", { className: "text-muted-foreground [&_svg]:size-4", children: icon })] }), _jsx(CardContent, { className: "mt-4", children: isLoading ? (_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-8 w-32" }), trendLabel ? _jsx(Skeleton, { className: "mt-3 h-5 w-28 rounded-sm" }) : null] })) : (_jsxs(_Fragment, { children: [empty ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { className: "font-data text-3xl font-semibold tracking-tight text-muted-foreground", "aria-label": emptyLabel ?? description, children: "-" }), _jsx(TooltipContent, { children: emptyLabel ?? description })] }) })) : (_jsx("div", { className: "font-data text-3xl font-semibold tracking-tight", children: value })), !empty && trend != null && trendLabel ? (_jsxs("div", { className: "mt-3 flex items-center gap-1.5 text-xs text-muted-foreground", children: [_jsxs("span", { className: `inline-flex items-center gap-1 rounded-sm px-1.5 py-0.5 font-medium ${isPositive ? "bg-success/12 text-success" : "bg-destructive/12 text-destructive"}`, children: [isPositive ? (_jsx(ArrowUpRight, { className: "h-3 w-3" })) : (_jsx(ArrowDownRight, { className: "h-3 w-3" })), Math.abs(trend).toFixed(1), "%"] }), _jsx("span", { children: trendLabel })] })) : null] })) })] }));
12
10
  }
@@ -63,18 +63,18 @@ export function DashboardPage({ emptyStates = {} } = {}) {
63
63
  ? ((currentMonthBookings - prevMonthBookings) / prevMonthBookings) * 100
64
64
  : 0;
65
65
  const revenueChartConfig = {
66
- revenue: { label: messages.dashboard.chartRevenueLabel, color: "hsl(221 83% 53%)" },
67
- bookings: { label: messages.dashboard.chartBookingsLabel, color: "hsl(142 71% 45%)" },
66
+ revenue: { label: messages.dashboard.chartRevenueLabel, color: "var(--chart-1)" },
67
+ bookings: { label: messages.dashboard.chartBookingsLabel, color: "#86cb3c" },
68
68
  };
69
69
  const bookingStatusConfig = {
70
- confirmed: { label: messages.dashboard.statusConfirmedLabel, color: "hsl(142 71% 45%)" },
71
- completed: { label: messages.dashboard.statusCompletedLabel, color: "hsl(221 83% 53%)" },
70
+ confirmed: { label: messages.dashboard.statusConfirmedLabel, color: "#86cb3c" },
71
+ completed: { label: messages.dashboard.statusCompletedLabel, color: "#6172f3" },
72
72
  in_progress: { label: messages.dashboard.statusInProgressLabel, color: "hsl(47 96% 53%)" },
73
- draft: { label: messages.dashboard.statusDraftLabel, color: "hsl(215 14% 55%)" },
74
- cancelled: { label: messages.dashboard.statusCancelledLabel, color: "hsl(0 84% 60%)" },
73
+ draft: { label: messages.dashboard.statusDraftLabel, color: "#efefeb" },
74
+ cancelled: { label: messages.dashboard.statusCancelledLabel, color: "#ff4405" },
75
75
  };
76
76
  const monthlyBookingsConfig = {
77
- count: { label: messages.dashboard.chartBookingsLabel, color: "hsl(221 83% 53%)" },
77
+ count: { label: messages.dashboard.chartBookingsLabel, color: "var(--chart-1)" },
78
78
  };
79
79
  const localizedStatusBreakdown = (bookings?.countsByStatus ?? [])
80
80
  .filter((entry) => entry.count > 0)
@@ -120,9 +120,9 @@ export function DashboardPage({ emptyStates = {} } = {}) {
120
120
  }), icon: _jsx(CalendarCheck, { className: "h-4 w-4 text-muted-foreground" }), trend: bookingTrend, trendLabel: messages.dashboard.trendVsLastMonth, empty: (bookings?.total ?? 0) === 0, emptyLabel: messages.dashboard.metricUnavailable, isLoading: bookingsPending }), _jsx(KpiCard, { title: messages.dashboard.totalTravelersTitle, value: totalPax.toLocaleString(), description: messages.dashboard.totalTravelersDescription, icon: _jsx(Users, { className: "h-4 w-4 text-muted-foreground" }), empty: totalPax === 0 && (bookings?.total ?? 0) === 0, emptyLabel: messages.dashboard.metricUnavailable, isLoading: bookingsPending }), _jsx(KpiCard, { title: messages.dashboard.activeProductsTitle, value: activeProducts.toString(), description: formatMessage(messages.dashboard.activeProductsDescription, {
121
121
  products: totalProducts,
122
122
  suppliers: totalSuppliers,
123
- }), icon: _jsx(Package, { className: "h-4 w-4 text-muted-foreground" }), empty: activeProducts === 0 && totalProducts === 0, emptyLabel: messages.dashboard.metricUnavailable, isLoading: productsPending || suppliersPending })] }), _jsx(AdminWidgetSlotRenderer, { slot: "dashboard.after-kpis", props: widgetProps }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: messages.dashboard.revenueTrendTitle }), _jsx(CardDescription, { children: messages.dashboard.revenueTrendDescription })] }), _jsx(CardContent, { children: bookingsPending ? (_jsx(DashboardAreaChartSkeleton, {})) : !hasRevenueData ? (_jsx(DashboardEmptyState, { emptyState: resolvedEmptyStates.revenueTrend })) : (_jsx(ChartContainer, { config: revenueChartConfig, className: "h-[300px] w-full", children: _jsxs(AreaChart, { data: monthlyRevenue, margin: { top: 10, right: 10, left: 0, bottom: 0 }, children: [_jsx("defs", { children: _jsxs("linearGradient", { id: "fillRevenue", x1: "0", y1: "0", x2: "0", y2: "1", children: [_jsx("stop", { offset: "5%", stopColor: "hsl(221 83% 53%)", stopOpacity: 0.3 }), _jsx("stop", { offset: "95%", stopColor: "hsl(221 83% 53%)", stopOpacity: 0 })] }) }), _jsx(CartesianGrid, { vertical: false }), _jsx(XAxis, { dataKey: "month", tickLine: false, axisLine: false, tickMargin: 8 }), _jsx(YAxis, { tickLine: false, axisLine: false, tickMargin: 8, tickFormatter: (value) => `$${(value / 1000).toFixed(0)}k` }), _jsx(ChartTooltip, { content: _jsx(ChartTooltipContent, { formatter: (value) => typeof value === "number"
123
+ }), icon: _jsx(Package, { className: "h-4 w-4 text-muted-foreground" }), empty: activeProducts === 0 && totalProducts === 0, emptyLabel: messages.dashboard.metricUnavailable, isLoading: productsPending || suppliersPending })] }), _jsx(AdminWidgetSlotRenderer, { slot: "dashboard.after-kpis", props: widgetProps }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: messages.dashboard.revenueTrendTitle }), _jsx(CardDescription, { children: messages.dashboard.revenueTrendDescription })] }), _jsx(CardContent, { children: bookingsPending ? (_jsx(DashboardAreaChartSkeleton, {})) : !hasRevenueData ? (_jsx(DashboardEmptyState, { emptyState: resolvedEmptyStates.revenueTrend })) : (_jsx(ChartContainer, { config: revenueChartConfig, className: "h-[300px] w-full", children: _jsxs(AreaChart, { data: monthlyRevenue, margin: { top: 10, right: 10, left: 0, bottom: 0 }, children: [_jsx("defs", { children: _jsxs("linearGradient", { id: "fillRevenue", x1: "0", y1: "0", x2: "0", y2: "1", children: [_jsx("stop", { offset: "5%", stopColor: "var(--chart-1)", stopOpacity: 0.3 }), _jsx("stop", { offset: "95%", stopColor: "var(--chart-1)", stopOpacity: 0 })] }) }), _jsx(CartesianGrid, { vertical: false }), _jsx(XAxis, { dataKey: "month", tickLine: false, axisLine: false, tickMargin: 8 }), _jsx(YAxis, { tickLine: false, axisLine: false, tickMargin: 8, tickFormatter: (value) => `$${(value / 1000).toFixed(0)}k` }), _jsx(ChartTooltip, { content: _jsx(ChartTooltipContent, { formatter: (value) => typeof value === "number"
124
124
  ? formatCurrency(value * 100, defaultCurrency)
125
- : String(value) }) }), _jsx(Area, { type: "monotone", dataKey: "revenue", stroke: "hsl(221 83% 53%)", fill: "url(#fillRevenue)", strokeWidth: 2 })] }) })) })] }), _jsxs("div", { className: "grid gap-4 lg:grid-cols-2", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: messages.dashboard.monthlyBookingsTitle }), _jsx(CardDescription, { children: messages.dashboard.monthlyBookingsDescription })] }), _jsx(CardContent, { children: bookingsPending ? (_jsx(DashboardBarChartSkeleton, {})) : !hasMonthlyBookingsData ? (_jsx(DashboardEmptyState, { emptyState: resolvedEmptyStates.monthlyBookings, compact: true })) : (_jsx(ChartContainer, { config: monthlyBookingsConfig, className: "h-[250px] w-full", children: _jsxs(BarChart, { data: monthlyBookings, margin: { top: 10, right: 10, left: 0, bottom: 0 }, children: [_jsx(CartesianGrid, { vertical: false }), _jsx(XAxis, { dataKey: "month", tickLine: false, axisLine: false, tickMargin: 8 }), _jsx(YAxis, { tickLine: false, axisLine: false, tickMargin: 8, allowDecimals: false }), _jsx(ChartTooltip, { content: _jsx(ChartTooltipContent, {}) }), _jsx(Bar, { dataKey: "count", fill: "hsl(221 83% 53%)", radius: [4, 4, 0, 0] })] }) })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: messages.dashboard.bookingStatusTitle }), _jsx(CardDescription, { children: messages.dashboard.bookingStatusDescription })] }), _jsx(CardContent, { children: bookingsPending ? (_jsx(DashboardPieChartSkeleton, {})) : !hasBookingStatusData ? (_jsx(DashboardEmptyState, { emptyState: resolvedEmptyStates.bookingStatus })) : (_jsx(ChartContainer, { config: bookingStatusConfig, className: "mx-auto h-[300px] w-full", children: _jsxs(PieChart, { children: [_jsx(ChartTooltip, { content: _jsx(ChartTooltipContent, { nameKey: "status", hideLabel: true }) }), _jsx(Pie, { data: localizedStatusBreakdown, dataKey: "count", nameKey: "status", cx: "50%", cy: "50%", innerRadius: 60, outerRadius: 100, paddingAngle: 2, children: localizedStatusBreakdown.map((entry) => (_jsx(Cell, { fill: entry.fill }, entry.status))) }), _jsx(ChartLegend, { content: _jsx(ChartLegendContent, { nameKey: "status" }) })] }) })) })] })] }), _jsxs("div", { className: "grid gap-4 lg:grid-cols-2", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsxs("div", { children: [_jsx(CardTitle, { children: messages.dashboard.upcomingDeparturesTitle }), _jsx(CardDescription, { children: messages.dashboard.upcomingDeparturesDescription })] }), _jsx(Link, { to: "/bookings", className: "text-sm text-primary hover:underline", children: messages.dashboard.viewAll })] }), _jsx(CardContent, { children: bookingsPending ? (_jsx(DashboardUpcomingListSkeleton, {})) : upcoming.length === 0 ? (_jsx(DashboardEmptyState, { emptyState: resolvedEmptyStates.upcomingDepartures, compact: true })) : (_jsx("div", { className: "space-y-3", children: upcoming.map((booking) => (_jsxs(Link, { to: "/bookings/$id", params: { id: booking.id }, className: "flex items-center justify-between rounded-lg border p-3 transition-colors hover:bg-muted/50", children: [_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-sm font-medium", children: booking.bookingNumber ?? booking.id.slice(0, 8) }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [booking.startDate
125
+ : String(value) }) }), _jsx(Area, { type: "monotone", dataKey: "revenue", stroke: "var(--chart-1)", fill: "url(#fillRevenue)", strokeWidth: 2 })] }) })) })] }), _jsxs("div", { className: "grid gap-4 lg:grid-cols-2", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: messages.dashboard.monthlyBookingsTitle }), _jsx(CardDescription, { children: messages.dashboard.monthlyBookingsDescription })] }), _jsx(CardContent, { children: bookingsPending ? (_jsx(DashboardBarChartSkeleton, {})) : !hasMonthlyBookingsData ? (_jsx(DashboardEmptyState, { emptyState: resolvedEmptyStates.monthlyBookings, compact: true })) : (_jsx(ChartContainer, { config: monthlyBookingsConfig, className: "h-[250px] w-full", children: _jsxs(BarChart, { data: monthlyBookings, margin: { top: 10, right: 10, left: 0, bottom: 0 }, children: [_jsx(CartesianGrid, { vertical: false }), _jsx(XAxis, { dataKey: "month", tickLine: false, axisLine: false, tickMargin: 8 }), _jsx(YAxis, { tickLine: false, axisLine: false, tickMargin: 8, allowDecimals: false }), _jsx(ChartTooltip, { content: _jsx(ChartTooltipContent, {}) }), _jsx(Bar, { dataKey: "count", fill: "var(--chart-1)", radius: [4, 4, 0, 0] })] }) })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: messages.dashboard.bookingStatusTitle }), _jsx(CardDescription, { children: messages.dashboard.bookingStatusDescription })] }), _jsx(CardContent, { children: bookingsPending ? (_jsx(DashboardPieChartSkeleton, {})) : !hasBookingStatusData ? (_jsx(DashboardEmptyState, { emptyState: resolvedEmptyStates.bookingStatus })) : (_jsx(ChartContainer, { config: bookingStatusConfig, className: "mx-auto h-[300px] w-full", children: _jsxs(PieChart, { children: [_jsx(ChartTooltip, { content: _jsx(ChartTooltipContent, { nameKey: "status", hideLabel: true }) }), _jsx(Pie, { data: localizedStatusBreakdown, dataKey: "count", nameKey: "status", cx: "50%", cy: "50%", innerRadius: 60, outerRadius: 100, paddingAngle: 2, children: localizedStatusBreakdown.map((entry) => (_jsx(Cell, { fill: entry.fill }, entry.status))) }), _jsx(ChartLegend, { content: _jsx(ChartLegendContent, { nameKey: "status" }) })] }) })) })] })] }), _jsxs("div", { className: "grid gap-4 lg:grid-cols-2", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsxs("div", { children: [_jsx(CardTitle, { children: messages.dashboard.upcomingDeparturesTitle }), _jsx(CardDescription, { children: messages.dashboard.upcomingDeparturesDescription })] }), _jsx(Link, { to: "/bookings", className: "text-sm text-primary hover:underline", children: messages.dashboard.viewAll })] }), _jsx(CardContent, { children: bookingsPending ? (_jsx(DashboardUpcomingListSkeleton, {})) : upcoming.length === 0 ? (_jsx(DashboardEmptyState, { emptyState: resolvedEmptyStates.upcomingDepartures, compact: true })) : (_jsx("div", { className: "space-y-3", children: upcoming.map((booking) => (_jsxs(Link, { to: "/bookings/$id", params: { id: booking.id }, className: "flex items-center justify-between rounded-lg border p-3 transition-colors hover:bg-muted/50", children: [_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-sm font-medium", children: booking.bookingNumber ?? booking.id.slice(0, 8) }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [booking.startDate
126
126
  ? new Date(booking.startDate).toLocaleDateString(resolvedLocale, {
127
127
  month: "short",
128
128
  day: "numeric",
@@ -101,27 +101,27 @@ export function getStatusColor(status) {
101
101
  // with theme palette tokens like --chart-1..5, which are general
102
102
  // chart palette slots and may be set to a monochromatic series.
103
103
  const map = {
104
- confirmed: "hsl(142 71% 45%)",
105
- completed: "hsl(221 83% 53%)",
104
+ confirmed: "#86cb3c",
105
+ completed: "#6172f3",
106
106
  in_progress: "hsl(47 96% 53%)",
107
- draft: "hsl(215 14% 55%)",
108
- cancelled: "hsl(0 84% 60%)",
107
+ draft: "#efefeb",
108
+ cancelled: "#ff4405",
109
109
  };
110
- return map[status] ?? "hsl(215 14% 55%)";
110
+ return map[status] ?? "#efefeb";
111
111
  }
112
112
  export const revenueChartConfig = {
113
- revenue: { label: "Revenue", color: "hsl(221 83% 53%)" },
114
- bookings: { label: "Bookings", color: "hsl(142 71% 45%)" },
113
+ revenue: { label: "Revenue", color: "#ff4405" },
114
+ bookings: { label: "Bookings", color: "#86cb3c" },
115
115
  };
116
116
  export const bookingStatusConfig = {
117
- confirmed: { label: "Confirmed", color: "hsl(142 71% 45%)" },
118
- completed: { label: "Completed", color: "hsl(221 83% 53%)" },
117
+ confirmed: { label: "Confirmed", color: "#86cb3c" },
118
+ completed: { label: "Completed", color: "#6172f3" },
119
119
  in_progress: { label: "In Progress", color: "hsl(47 96% 53%)" },
120
- draft: { label: "Draft", color: "hsl(215 14% 55%)" },
121
- cancelled: { label: "Cancelled", color: "hsl(0 84% 60%)" },
120
+ draft: { label: "Draft", color: "#efefeb" },
121
+ cancelled: { label: "Cancelled", color: "#ff4405" },
122
122
  };
123
123
  export const monthlyBookingsConfig = {
124
- count: { label: "Bookings", color: "hsl(221 83% 53%)" },
124
+ count: { label: "Bookings", color: "#ff4405" },
125
125
  };
126
126
  export function buildMonthSeries() {
127
127
  const now = new Date();
@@ -201,6 +201,26 @@ export interface AdminExtension {
201
201
  widgets?: ReadonlyArray<AdminWidgetContribution>;
202
202
  }
203
203
  export declare function defineAdminExtension<T extends AdminExtension>(extension: T): T;
204
+ /**
205
+ * Discover deployment-local admin extensions from a Vite `import.meta.glob`
206
+ * (eager) of `src/admin/<name>/index.tsx` files — the admin-UI half of the
207
+ * "extend without forking" seam (mirrors `modulesFromGlob`/`extensionsFromGlob`
208
+ * on the API side). Each file's `default` export is an {@link AdminExtension}
209
+ * (wrap it with {@link defineAdminExtension}); append the result to the shell's
210
+ * extension registry so its nav, widgets, and routes auto-compose. Returns the
211
+ * extensions in stable (path-sorted) order; empty until a deployment adds one.
212
+ *
213
+ * Vite compiles `import.meta.glob` to static imports at build time, so this is
214
+ * Cloudflare-Workers-safe (no runtime module resolution).
215
+ *
216
+ * // src/lib/admin-extensions.tsx
217
+ * export const discoveredAdminExtensions = adminExtensionsFromGlob(
218
+ * import.meta.glob("../admin/*\/index.tsx", { eager: true }),
219
+ * )
220
+ *
221
+ * @throws if a matched file has no default export.
222
+ */
223
+ export declare function adminExtensionsFromGlob(glob: Record<string, unknown>): AdminExtension[];
204
224
  /**
205
225
  * A route contribution whose `component` is guaranteed present, typed as a
206
226
  * function component so it attaches directly to router `component:` options
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,37 @@ export const adminWorkspaceHeaderActionsSlot = "workspace.header.actions";
13
13
  export function defineAdminExtension(extension) {
14
14
  return extension;
15
15
  }
16
+ /**
17
+ * Discover deployment-local admin extensions from a Vite `import.meta.glob`
18
+ * (eager) of `src/admin/<name>/index.tsx` files — the admin-UI half of the
19
+ * "extend without forking" seam (mirrors `modulesFromGlob`/`extensionsFromGlob`
20
+ * on the API side). Each file's `default` export is an {@link AdminExtension}
21
+ * (wrap it with {@link defineAdminExtension}); append the result to the shell's
22
+ * extension registry so its nav, widgets, and routes auto-compose. Returns the
23
+ * extensions in stable (path-sorted) order; empty until a deployment adds one.
24
+ *
25
+ * Vite compiles `import.meta.glob` to static imports at build time, so this is
26
+ * Cloudflare-Workers-safe (no runtime module resolution).
27
+ *
28
+ * // src/lib/admin-extensions.tsx
29
+ * export const discoveredAdminExtensions = adminExtensionsFromGlob(
30
+ * import.meta.glob("../admin/*\/index.tsx", { eager: true }),
31
+ * )
32
+ *
33
+ * @throws if a matched file has no default export.
34
+ */
35
+ export function adminExtensionsFromGlob(glob) {
36
+ return Object.entries(glob)
37
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
38
+ .map(([path, namespace]) => {
39
+ const declaration = namespace.default;
40
+ if (declaration == null) {
41
+ throw new Error(`[voyant-admin] deployment admin extension "${path}" has no default export — ` +
42
+ "add `export default defineAdminExtension(...)` to its index.tsx");
43
+ }
44
+ return declaration;
45
+ });
46
+ }
16
47
  /**
17
48
  * Look up a route contribution by id and assert it carries a component.
18
49
  *
package/dist/index.d.ts CHANGED
@@ -34,11 +34,11 @@ export { TeamSettingsPage, type TeamSettingsPageApi, type TeamSettingsPageProps,
34
34
  export type { DashboardEmptyAction, DashboardEmptyStateConfig, DashboardEmptyStateKey, DashboardPageProps, } from "./dashboard/dashboard-page.js";
35
35
  export { type BookingsAggregates, bookingStatusConfig, buildDashboardSixMonthWindow, buildMonthSeries, DashboardApiError, type DashboardQueryClient, dashboardQueryKeys, type FinanceAggregates, formatCurrency, getDashboardBookingsAggregatesQueryOptions, getDashboardFinanceAggregatesQueryOptions, getDashboardProductsAggregatesQueryOptions, getDashboardSuppliersAggregatesQueryOptions, getStatusColor, monthlyBookingsConfig, type ProductsAggregates, pickPrimaryCurrency, revenueChartConfig, type SuppliersAggregates, } from "./dashboard/dashboard-query-options.js";
36
36
  export { DashboardAreaChartSkeleton, DashboardBarChartSkeleton, DashboardKpiRowSkeleton, DashboardKpiSkeleton, DashboardOutstandingInvoicesSkeleton, DashboardPieChartSkeleton, DashboardSkeleton, DashboardUpcomingListSkeleton, } from "./dashboard/dashboard-skeleton.js";
37
- export { type AdminExtension, type AdminNavigationContribution, type AdminRouteLoaderContext, type AdminRouteMessagesProvider, type AdminRouteMessagesProviderModule, type AdminRouteMessagesProviderProps, type AdminRoutePageComponent, type AdminRoutePageModule, type AdminRoutePageProps, type AdminRouteRuntime, type AdminUiRouteContribution, type AdminWidgetContribution, type AdminWidgetSlot, adminRoutePageModule, adminWorkspaceHeaderActionsSlot, type BindableAdminRoute, createAdminExtensionRegistry, defineAdminExtension, findAdminRouteContribution, type ImplementedAdminRoute, type ResolveAdminNavigationOptions, type ResolveAdminWidgetsOptions, requireAdminRoute, requireImplementedAdminRoute, resolveAdminNavigation, resolveAdminWidgets, } from "./extensions.js";
37
+ export { type AdminExtension, type AdminNavigationContribution, type AdminRouteLoaderContext, type AdminRouteMessagesProvider, type AdminRouteMessagesProviderModule, type AdminRouteMessagesProviderProps, type AdminRoutePageComponent, type AdminRoutePageModule, type AdminRoutePageProps, type AdminRouteRuntime, type AdminUiRouteContribution, type AdminWidgetContribution, type AdminWidgetSlot, adminExtensionsFromGlob, adminRoutePageModule, adminWorkspaceHeaderActionsSlot, type BindableAdminRoute, createAdminExtensionRegistry, defineAdminExtension, findAdminRouteContribution, type ImplementedAdminRoute, type ResolveAdminNavigationOptions, type ResolveAdminWidgetsOptions, requireAdminRoute, requireImplementedAdminRoute, resolveAdminNavigation, resolveAdminWidgets, } from "./extensions.js";
38
38
  export { composeLocaleMessageDefinitions, type DeepPartial, formatMessage, type LocaleMessageDefinitions, type LocaleMessageOverrides, MessagesProvider, resolveLocaleMessages, useMessages, } from "./lib/i18n.js";
39
39
  export { getDisplayName, getInitials } from "./lib/initials.js";
40
40
  export { type AdminDestinationKey, type AdminDestinationNavigator, type AdminDestinationResolvers, type AdminDestinations, type AdminHrefResolver, type AdminNavigateOptions, AdminNavigationProvider, type AdminNavigationProviderProps, useAdminHref, useAdminNavigate, } from "./navigation/destinations.js";
41
- export { type CreateOperatorAdminNavigationOptions, createOperatorAdminNavigation, type OperatorAdminNavigationIconName, type OperatorAdminNavigationIcons, } from "./navigation/operator-navigation.js";
41
+ export { type CreateOperatorAdminNavigationOptions, createOperatorAdminNavigation, defaultOperatorNavIcons, type OperatorAdminNavigationIconName, type OperatorAdminNavigationIcons, } from "./navigation/operator-navigation.js";
42
42
  export { AdminExtensionsProvider, type AdminExtensionsProviderProps, useAdminExtensions, } from "./providers/admin-extensions.js";
43
43
  export { AdminProvider, type AdminProviderProps } from "./providers/admin-provider.js";
44
44
  export { DEFAULT_ADMIN_LOCALE, DEFAULT_ADMIN_LOCALES, type LocaleContextValue, LocaleProvider, type LocaleProviderProps, resolveAdminLocale, useLocale, } from "./providers/locale.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -37,11 +37,11 @@ export { TeamSettingsPage, } from "./components/team-settings-page.js";
37
37
  // directly from "@voyant-travel/admin/dashboard/dashboard-page" instead.
38
38
  export { bookingStatusConfig, buildDashboardSixMonthWindow, buildMonthSeries, DashboardApiError, dashboardQueryKeys, formatCurrency, getDashboardBookingsAggregatesQueryOptions, getDashboardFinanceAggregatesQueryOptions, getDashboardProductsAggregatesQueryOptions, getDashboardSuppliersAggregatesQueryOptions, getStatusColor, monthlyBookingsConfig, pickPrimaryCurrency, revenueChartConfig, } from "./dashboard/dashboard-query-options.js";
39
39
  export { DashboardAreaChartSkeleton, DashboardBarChartSkeleton, DashboardKpiRowSkeleton, DashboardKpiSkeleton, DashboardOutstandingInvoicesSkeleton, DashboardPieChartSkeleton, DashboardSkeleton, DashboardUpcomingListSkeleton, } from "./dashboard/dashboard-skeleton.js";
40
- export { adminRoutePageModule, adminWorkspaceHeaderActionsSlot, createAdminExtensionRegistry, defineAdminExtension, findAdminRouteContribution, requireAdminRoute, requireImplementedAdminRoute, resolveAdminNavigation, resolveAdminWidgets, } from "./extensions.js";
40
+ export { adminExtensionsFromGlob, adminRoutePageModule, adminWorkspaceHeaderActionsSlot, createAdminExtensionRegistry, defineAdminExtension, findAdminRouteContribution, requireAdminRoute, requireImplementedAdminRoute, resolveAdminNavigation, resolveAdminWidgets, } from "./extensions.js";
41
41
  export { composeLocaleMessageDefinitions, formatMessage, MessagesProvider, resolveLocaleMessages, useMessages, } from "./lib/i18n.js";
42
42
  export { getDisplayName, getInitials } from "./lib/initials.js";
43
43
  export { AdminNavigationProvider, useAdminHref, useAdminNavigate, } from "./navigation/destinations.js";
44
- export { createOperatorAdminNavigation, } from "./navigation/operator-navigation.js";
44
+ export { createOperatorAdminNavigation, defaultOperatorNavIcons, } from "./navigation/operator-navigation.js";
45
45
  export { AdminExtensionsProvider, useAdminExtensions, } from "./providers/admin-extensions.js";
46
46
  export { AdminProvider } from "./providers/admin-provider.js";
47
47
  export { DEFAULT_ADMIN_LOCALE, DEFAULT_ADMIN_LOCALES, LocaleProvider, resolveAdminLocale, useLocale, } from "./providers/locale.js";
@@ -2,6 +2,14 @@ import type { OperatorAdminMessages } from "../providers/operator-admin-messages
2
2
  import type { NavItem } from "../types.js";
3
3
  export type OperatorAdminNavigationIconName = "availability" | "bookings" | "catalog" | "channelSync" | "dashboard" | "finance" | "flights" | "legal" | "notifications" | "organizations" | "people" | "products" | "resources" | "settings" | "suppliers";
4
4
  export type OperatorAdminNavigationIcons = Partial<Record<OperatorAdminNavigationIconName, NavItem["icon"]>>;
5
+ /**
6
+ * The standard operator nav icon set, shipped by the framework so deployments
7
+ * don't hand-wire lucide imports. Use directly (`icons={defaultOperatorNavIcons}`)
8
+ * or spread to override a single entry
9
+ * (`icons={{ ...defaultOperatorNavIcons, finance: MyIcon }}`). A custom domain
10
+ * supplies its own icon via the override; the standard 15 come from here.
11
+ */
12
+ export declare const defaultOperatorNavIcons: Record<OperatorAdminNavigationIconName, NavItem["icon"]>;
5
13
  export interface CreateOperatorAdminNavigationOptions {
6
14
  messages: OperatorAdminMessages["nav"];
7
15
  icons?: OperatorAdminNavigationIcons;
@@ -1 +1 @@
1
- {"version":3,"file":"operator-navigation.d.ts","sourceRoot":"","sources":["../../src/navigation/operator-navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AACpF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,+BAA+B,GACvC,cAAc,GACd,UAAU,GACV,SAAS,GACT,aAAa,GACb,WAAW,GACX,SAAS,GACT,SAAS,GACT,OAAO,GACP,eAAe,GACf,eAAe,GACf,QAAQ,GACR,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,CAAA;AAEf,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAChD,MAAM,CAAC,+BAA+B,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CACzD,CAAA;AAED,MAAM,WAAW,oCAAoC;IACnD,QAAQ,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAA;IACtC,KAAK,CAAC,EAAE,4BAA4B,CAAA;CACrC;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,KAAU,EACV,QAAQ,GACT,EAAE,oCAAoC,GAAG,OAAO,EAAE,CA8LlD"}
1
+ {"version":3,"file":"operator-navigation.d.ts","sourceRoot":"","sources":["../../src/navigation/operator-navigation.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AACpF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,+BAA+B,GACvC,cAAc,GACd,UAAU,GACV,SAAS,GACT,aAAa,GACb,WAAW,GACX,SAAS,GACT,SAAS,GACT,OAAO,GACP,eAAe,GACf,eAAe,GACf,QAAQ,GACR,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,CAAA;AAEf,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAChD,MAAM,CAAC,+BAA+B,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CACzD,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,+BAA+B,EAAE,OAAO,CAAC,MAAM,CAAC,CAgB5F,CAAA;AAED,MAAM,WAAW,oCAAoC;IACnD,QAAQ,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAA;IACtC,KAAK,CAAC,EAAE,4BAA4B,CAAA;CACrC;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,KAAU,EACV,QAAQ,GACT,EAAE,oCAAoC,GAAG,OAAO,EAAE,CA8LlD"}
@@ -1,3 +1,28 @@
1
+ import { Building, Building2, CalendarCheck, CalendarDays, DollarSign, LayoutDashboard, Library, Mail, Package, Plane, Radio, Scale, Settings, Users, Wrench, } from "lucide-react";
2
+ /**
3
+ * The standard operator nav icon set, shipped by the framework so deployments
4
+ * don't hand-wire lucide imports. Use directly (`icons={defaultOperatorNavIcons}`)
5
+ * or spread to override a single entry
6
+ * (`icons={{ ...defaultOperatorNavIcons, finance: MyIcon }}`). A custom domain
7
+ * supplies its own icon via the override; the standard 15 come from here.
8
+ */
9
+ export const defaultOperatorNavIcons = {
10
+ availability: CalendarDays,
11
+ bookings: CalendarCheck,
12
+ catalog: Library,
13
+ channelSync: Radio,
14
+ dashboard: LayoutDashboard,
15
+ finance: DollarSign,
16
+ flights: Plane,
17
+ legal: Scale,
18
+ notifications: Mail,
19
+ organizations: Building,
20
+ people: Users,
21
+ products: Package,
22
+ resources: Wrench,
23
+ settings: Settings,
24
+ suppliers: Building2,
25
+ };
1
26
  export function createOperatorAdminNavigation({ icons = {}, messages, }) {
2
27
  return [
3
28
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyant-travel/admin",
3
- "version": "0.111.5",
3
+ "version": "0.113.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -181,7 +181,7 @@
181
181
  "react": "^19.0.0",
182
182
  "react-dom": "^19.0.0",
183
183
  "recharts": "^3.0.0",
184
- "@voyant-travel/ui": "^0.106.2"
184
+ "@voyant-travel/ui": "^0.107.0"
185
185
  },
186
186
  "dependencies": {
187
187
  "@voyant-travel/i18n": "^0.106.1",
@@ -200,8 +200,8 @@
200
200
  "recharts": "3.8.1",
201
201
  "typescript": "^6.0.2",
202
202
  "vitest": "^4.1.2",
203
- "@voyant-travel/voyant-typescript-config": "^0.1.0",
204
- "@voyant-travel/ui": "^0.106.2"
203
+ "@voyant-travel/ui": "^0.107.0",
204
+ "@voyant-travel/voyant-typescript-config": "^0.1.0"
205
205
  },
206
206
  "files": [
207
207
  "dist",