@creezio/shell-ui 0.22.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 (232) hide show
  1. package/README.md +336 -0
  2. package/dist/adapters/nav-shell.d.ts +54 -0
  3. package/dist/adapters/nav-shell.d.ts.map +1 -0
  4. package/dist/adapters/nav-shell.js +112 -0
  5. package/dist/adapters/nav-shell.js.map +1 -0
  6. package/dist/brand.d.ts +64 -0
  7. package/dist/brand.d.ts.map +1 -0
  8. package/dist/brand.js +59 -0
  9. package/dist/brand.js.map +1 -0
  10. package/dist/core-nav.d.ts +17 -0
  11. package/dist/core-nav.d.ts.map +1 -0
  12. package/dist/core-nav.js +40 -0
  13. package/dist/core-nav.js.map +1 -0
  14. package/dist/index.d.ts +29 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +24 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/lib/api-scopes.d.ts +24 -0
  19. package/dist/lib/api-scopes.d.ts.map +1 -0
  20. package/dist/lib/api-scopes.js +78 -0
  21. package/dist/lib/api-scopes.js.map +1 -0
  22. package/dist/lib/catalog-suspense-key.d.ts +3 -0
  23. package/dist/lib/catalog-suspense-key.d.ts.map +1 -0
  24. package/dist/lib/catalog-suspense-key.js +12 -0
  25. package/dist/lib/catalog-suspense-key.js.map +1 -0
  26. package/dist/lib/data-changed.d.ts +51 -0
  27. package/dist/lib/data-changed.d.ts.map +1 -0
  28. package/dist/lib/data-changed.js +227 -0
  29. package/dist/lib/data-changed.js.map +1 -0
  30. package/dist/lib/desktop-home-path.d.ts +14 -0
  31. package/dist/lib/desktop-home-path.d.ts.map +1 -0
  32. package/dist/lib/desktop-home-path.js +29 -0
  33. package/dist/lib/desktop-home-path.js.map +1 -0
  34. package/dist/lib/geo-distance.d.ts +6 -0
  35. package/dist/lib/geo-distance.d.ts.map +1 -0
  36. package/dist/lib/geo-distance.js +27 -0
  37. package/dist/lib/geo-distance.js.map +1 -0
  38. package/dist/lib/img.d.ts +2 -0
  39. package/dist/lib/img.d.ts.map +1 -0
  40. package/dist/lib/img.js +40 -0
  41. package/dist/lib/img.js.map +1 -0
  42. package/dist/lib/keepalive-eviction.d.ts +14 -0
  43. package/dist/lib/keepalive-eviction.d.ts.map +1 -0
  44. package/dist/lib/keepalive-eviction.js +44 -0
  45. package/dist/lib/keepalive-eviction.js.map +1 -0
  46. package/dist/lib/ops-track.d.ts +29 -0
  47. package/dist/lib/ops-track.d.ts.map +1 -0
  48. package/dist/lib/ops-track.js +37 -0
  49. package/dist/lib/ops-track.js.map +1 -0
  50. package/dist/lib/optimize-cover-url.d.ts +10 -0
  51. package/dist/lib/optimize-cover-url.d.ts.map +1 -0
  52. package/dist/lib/optimize-cover-url.js +80 -0
  53. package/dist/lib/optimize-cover-url.js.map +1 -0
  54. package/dist/lib/page-trails.d.ts +9 -0
  55. package/dist/lib/page-trails.d.ts.map +1 -0
  56. package/dist/lib/page-trails.js +20 -0
  57. package/dist/lib/page-trails.js.map +1 -0
  58. package/dist/lib/public-origin.d.ts +32 -0
  59. package/dist/lib/public-origin.d.ts.map +1 -0
  60. package/dist/lib/public-origin.js +125 -0
  61. package/dist/lib/public-origin.js.map +1 -0
  62. package/dist/lib/server-incident.d.ts +12 -0
  63. package/dist/lib/server-incident.d.ts.map +1 -0
  64. package/dist/lib/server-incident.js +72 -0
  65. package/dist/lib/server-incident.js.map +1 -0
  66. package/dist/lib/tab-document-url.d.ts +13 -0
  67. package/dist/lib/tab-document-url.d.ts.map +1 -0
  68. package/dist/lib/tab-document-url.js +60 -0
  69. package/dist/lib/tab-document-url.js.map +1 -0
  70. package/dist/lib/utils.d.ts +20 -0
  71. package/dist/lib/utils.d.ts.map +1 -0
  72. package/dist/lib/utils.js +87 -0
  73. package/dist/lib/utils.js.map +1 -0
  74. package/dist/nav-catalog.d.ts +97 -0
  75. package/dist/nav-catalog.d.ts.map +1 -0
  76. package/dist/nav-catalog.js +282 -0
  77. package/dist/nav-catalog.js.map +1 -0
  78. package/dist/registry.d.ts +11 -0
  79. package/dist/registry.d.ts.map +1 -0
  80. package/dist/registry.js +60 -0
  81. package/dist/registry.js.map +1 -0
  82. package/dist/types.d.ts +22 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +2 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist-cjs/adapters/nav-shell.js +115 -0
  87. package/dist-cjs/adapters/nav-shell.js.map +1 -0
  88. package/dist-cjs/brand.js +66 -0
  89. package/dist-cjs/brand.js.map +1 -0
  90. package/dist-cjs/core-nav.js +43 -0
  91. package/dist-cjs/core-nav.js.map +1 -0
  92. package/dist-cjs/index.js +95 -0
  93. package/dist-cjs/index.js.map +1 -0
  94. package/dist-cjs/lib/api-scopes.js +86 -0
  95. package/dist-cjs/lib/api-scopes.js.map +1 -0
  96. package/dist-cjs/lib/catalog-suspense-key.js +15 -0
  97. package/dist-cjs/lib/catalog-suspense-key.js.map +1 -0
  98. package/dist-cjs/lib/data-changed.js +236 -0
  99. package/dist-cjs/lib/data-changed.js.map +1 -0
  100. package/dist-cjs/lib/desktop-home-path.js +34 -0
  101. package/dist-cjs/lib/desktop-home-path.js.map +1 -0
  102. package/dist-cjs/lib/geo-distance.js +30 -0
  103. package/dist-cjs/lib/geo-distance.js.map +1 -0
  104. package/dist-cjs/lib/img.js +43 -0
  105. package/dist-cjs/lib/img.js.map +1 -0
  106. package/dist-cjs/lib/keepalive-eviction.js +49 -0
  107. package/dist-cjs/lib/keepalive-eviction.js.map +1 -0
  108. package/dist-cjs/lib/ops-track.js +41 -0
  109. package/dist-cjs/lib/ops-track.js.map +1 -0
  110. package/dist-cjs/lib/optimize-cover-url.js +83 -0
  111. package/dist-cjs/lib/optimize-cover-url.js.map +1 -0
  112. package/dist-cjs/lib/page-trails.js +25 -0
  113. package/dist-cjs/lib/page-trails.js.map +1 -0
  114. package/dist-cjs/lib/public-origin.js +130 -0
  115. package/dist-cjs/lib/public-origin.js.map +1 -0
  116. package/dist-cjs/lib/server-incident.js +75 -0
  117. package/dist-cjs/lib/server-incident.js.map +1 -0
  118. package/dist-cjs/lib/tab-document-url.js +65 -0
  119. package/dist-cjs/lib/tab-document-url.js.map +1 -0
  120. package/dist-cjs/lib/utils.js +97 -0
  121. package/dist-cjs/lib/utils.js.map +1 -0
  122. package/dist-cjs/nav-catalog.js +293 -0
  123. package/dist-cjs/nav-catalog.js.map +1 -0
  124. package/dist-cjs/package.json +3 -0
  125. package/dist-cjs/registry.js +64 -0
  126. package/dist-cjs/registry.js.map +1 -0
  127. package/dist-cjs/types.js +3 -0
  128. package/dist-cjs/types.js.map +1 -0
  129. package/package.json +163 -0
  130. package/ui/app-error-boundary.tsx +59 -0
  131. package/ui/data-table.tsx +121 -0
  132. package/ui/desktop/auth-window-chrome.tsx +51 -0
  133. package/ui/desktop/desktop-bridge.tsx +87 -0
  134. package/ui/desktop/external-site-slot.tsx +313 -0
  135. package/ui/desktop/external-site-surface.ts +58 -0
  136. package/ui/desktop/site-link.tsx +105 -0
  137. package/ui/desktop/window-chrome-controls.tsx +5 -0
  138. package/ui/desktop-types.ts +30 -0
  139. package/ui/faceted-filters.tsx +119 -0
  140. package/ui/global-search-host.ts +20 -0
  141. package/ui/global-search.tsx +66 -0
  142. package/ui/index.ts +178 -0
  143. package/ui/kit.ts +30 -0
  144. package/ui/layout/app-shell.tsx +58 -0
  145. package/ui/layout/desktop-update-banner.tsx +100 -0
  146. package/ui/layout/entity-header.tsx +44 -0
  147. package/ui/layout/native-os-nav.ts +104 -0
  148. package/ui/layout/nav-catalog-loader.tsx +98 -0
  149. package/ui/layout/nav-icons.ts +67 -0
  150. package/ui/layout/page-chrome.tsx +90 -0
  151. package/ui/layout/page-toolbar-context.tsx +82 -0
  152. package/ui/layout/sandbox-banner.tsx +38 -0
  153. package/ui/layout/section-view-shell.tsx +73 -0
  154. package/ui/layout/sidebar-host.ts +144 -0
  155. package/ui/layout/sidebar.tsx +1150 -0
  156. package/ui/lib/ai-screencast-hub.ts +127 -0
  157. package/ui/lib/ai-workspace-client.ts +46 -0
  158. package/ui/lib/aid.ts +22 -0
  159. package/ui/lib/desktop-host.ts +114 -0
  160. package/ui/lib/fleet-tracker-client.ts +237 -0
  161. package/ui/lib/hermes-ui.ts +114 -0
  162. package/ui/lib/n8n-ui.ts +115 -0
  163. package/ui/lib/use-creezio-resource.tsx +121 -0
  164. package/ui/lib/use-shell-ui-brand.ts +22 -0
  165. package/ui/list-toolbar.tsx +309 -0
  166. package/ui/os-pages/desktop-settings-page.tsx +158 -0
  167. package/ui/os-pages/index.ts +8 -0
  168. package/ui/page-loading/entity-page-loading.tsx +59 -0
  169. package/ui/page-loading/list-page-loading.tsx +61 -0
  170. package/ui/pagination.tsx +56 -0
  171. package/ui/primitives/avatar.tsx +33 -0
  172. package/ui/primitives/badge.tsx +36 -0
  173. package/ui/primitives/breadcrumb.tsx +93 -0
  174. package/ui/primitives/button.tsx +44 -0
  175. package/ui/primitives/card.tsx +44 -0
  176. package/ui/primitives/chart.tsx +317 -0
  177. package/ui/primitives/command.tsx +111 -0
  178. package/ui/primitives/dialog.tsx +100 -0
  179. package/ui/primitives/dropdown-menu.tsx +187 -0
  180. package/ui/primitives/input.tsx +19 -0
  181. package/ui/primitives/label.tsx +17 -0
  182. package/ui/primitives/resizable.tsx +45 -0
  183. package/ui/primitives/scroll-area.tsx +41 -0
  184. package/ui/primitives/select.tsx +73 -0
  185. package/ui/primitives/separator.tsx +26 -0
  186. package/ui/primitives/sheet.tsx +90 -0
  187. package/ui/primitives/skeleton.tsx +7 -0
  188. package/ui/primitives/sonner.tsx +22 -0
  189. package/ui/primitives/tabs.tsx +51 -0
  190. package/ui/primitives/textarea.tsx +22 -0
  191. package/ui/primitives/tooltip.tsx +31 -0
  192. package/ui/pwa/client-error-reporter.tsx +62 -0
  193. package/ui/pwa/register-sw.tsx +50 -0
  194. package/ui/range-filters.tsx +174 -0
  195. package/ui/search/global-search-config.ts +32 -0
  196. package/ui/search/global-search-provider.tsx +528 -0
  197. package/ui/search/search-history.ts +74 -0
  198. package/ui/search-input.tsx +146 -0
  199. package/ui/settings/account-settings.tsx +140 -0
  200. package/ui/settings/agent-profile-settings.tsx +184 -0
  201. package/ui/settings/api-keys-settings.tsx +349 -0
  202. package/ui/settings/desktop-background-settings.tsx +128 -0
  203. package/ui/settings/desktop-connection-settings.tsx +251 -0
  204. package/ui/settings/desktop-embed-env-panel.tsx +257 -0
  205. package/ui/settings/desktop-fleet-telemetry-settings.tsx +269 -0
  206. package/ui/settings/desktop-hermes-settings.tsx +341 -0
  207. package/ui/settings/desktop-llm-keys.tsx +192 -0
  208. package/ui/settings/desktop-n8n-settings.tsx +306 -0
  209. package/ui/settings/desktop-tunnel.tsx +264 -0
  210. package/ui/settings/desktop-update-settings.tsx +175 -0
  211. package/ui/settings/factory-reset-settings.tsx +89 -0
  212. package/ui/settings/host-only-settings.tsx +62 -0
  213. package/ui/settings/locked-config-field.tsx +30 -0
  214. package/ui/settings/ops-diagnostic-settings.tsx +242 -0
  215. package/ui/settings/search-reindex-settings.tsx +158 -0
  216. package/ui/settings/server-mode-cards.tsx +801 -0
  217. package/ui/theme/tailwind-preset.cjs +82 -0
  218. package/ui/theme/theme.css +328 -0
  219. package/ui/workspace/ai-activity-panel-host.tsx +19 -0
  220. package/ui/workspace/ai-workspace-agent-host.tsx +54 -0
  221. package/ui/workspace/ai-workspace-banner.tsx +168 -0
  222. package/ui/workspace/impersonation-banner.tsx +39 -0
  223. package/ui/workspace/keep-alive.tsx +220 -0
  224. package/ui/workspace/tab-workspace-context.tsx +1172 -0
  225. package/ui/workspace/tab-workspace-host.ts +89 -0
  226. package/ui/workspace/types.ts +500 -0
  227. package/ui/workspace/use-location-search.tsx +50 -0
  228. package/ui/workspace/window-chrome-controls.tsx +116 -0
  229. package/ui/workspace/workspace-config.ts +47 -0
  230. package/ui/workspace/workspace-root.tsx +147 -0
  231. package/ui/workspace/workspace-shell.tsx +292 -0
  232. package/ui/workspace/workspace-tab-bar.tsx +572 -0
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ /**
3
+ * Catalogue de nav OS — SoT unique des entrées primaires (Phase A).
4
+ *
5
+ * Types + merge pur + registre runtime. Zéro React, zéro lucide, zéro DB.
6
+ * Cible produit : docs/plans/PLAN-NAV-CATALOG.md (§3.1–3.2).
7
+ *
8
+ * Overrides persistés + mount HTTP + écran admin = Phase B (`@creezio/nav`).
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.NAV_ICON_ALLOWLIST = void 0;
12
+ exports.isKnownNavIcon = isKnownNavIcon;
13
+ exports.resolveNavCatalog = resolveNavCatalog;
14
+ exports.registerOsNavEntry = registerOsNavEntry;
15
+ exports.listOsNavEntries = listOsNavEntries;
16
+ exports.registerDefaultOsNavEntries = registerDefaultOsNavEntries;
17
+ exports.defaultOsCatalogEntries = defaultOsCatalogEntries;
18
+ exports.resetOsNavRegistryForTests = resetOsNavRegistryForTests;
19
+ exports.parseNavCatalogSessionItems = parseNavCatalogSessionItems;
20
+ /** Noms lucide autorisés (résolus côté `shell-ui/ui` par `resolveNavIcon`). */
21
+ exports.NAV_ICON_ALLOWLIST = [
22
+ "Activity",
23
+ "Bot",
24
+ "Braces",
25
+ "Cable",
26
+ "Circle",
27
+ "Database",
28
+ "FileText",
29
+ "KeyRound",
30
+ "LayoutDashboard",
31
+ "List",
32
+ "ListTodo",
33
+ "Mail",
34
+ "NotebookPen",
35
+ "Package",
36
+ "ScrollText",
37
+ "Settings",
38
+ "Shield",
39
+ "ShieldCheck",
40
+ "SlidersHorizontal",
41
+ "SquarePen",
42
+ "Workflow",
43
+ ];
44
+ const NAV_ICON_ALLOWLIST_SET = new Set(exports.NAV_ICON_ALLOWLIST);
45
+ function isKnownNavIcon(name) {
46
+ return NAV_ICON_ALLOWLIST_SET.has(name);
47
+ }
48
+ const SOURCE_RANK = {
49
+ os: 0,
50
+ plugin: 1,
51
+ extra: 2,
52
+ module: 3,
53
+ };
54
+ function cloneEntry(entry) {
55
+ return { ...entry };
56
+ }
57
+ function isPluginFeatureEntry(entry) {
58
+ return (entry.source === "plugin" ||
59
+ entry.group === "plugin" ||
60
+ entry.href === "/admin/plugins");
61
+ }
62
+ function isFleetFeatureEntry(entry) {
63
+ return (entry.id === "os.fleet" ||
64
+ entry.id.startsWith("os.fleet.") ||
65
+ entry.href === "/admin/fleet");
66
+ }
67
+ function applyFeatures(entry, features) {
68
+ if (features?.plugins === false && isPluginFeatureEntry(entry)) {
69
+ return false;
70
+ }
71
+ if (features?.fleet === false && isFleetFeatureEntry(entry)) {
72
+ return false;
73
+ }
74
+ return entry.available;
75
+ }
76
+ /**
77
+ * Merge déterministe os + modules + extras + plugins + overrides + features.
78
+ * Collision d'`id` = erreur (throw si `throwOnIdCollision`). Collision
79
+ * d'`href` = warning, le provider le plus spécifique gagne (`module` > `os`).
80
+ */
81
+ function resolveNavCatalog(input) {
82
+ const errors = [];
83
+ const warnings = [];
84
+ const byId = new Map();
85
+ const byHref = new Map();
86
+ const buckets = [
87
+ { source: "os", items: input.os ?? [] },
88
+ { source: "plugin", items: input.plugins ?? [] },
89
+ { source: "extra", items: input.extras ?? [] },
90
+ { source: "module", items: input.modules ?? [] },
91
+ ];
92
+ for (const bucket of buckets) {
93
+ for (const raw of bucket.items) {
94
+ const entry = cloneEntry(raw);
95
+ if (!entry.source)
96
+ entry.source = bucket.source;
97
+ const existingId = byId.get(entry.id);
98
+ if (existingId) {
99
+ const err = {
100
+ code: "id_collision",
101
+ message: `Nav catalog: collision d'id "${entry.id}" (${existingId.source} vs ${entry.source})`,
102
+ id: entry.id,
103
+ };
104
+ errors.push(err);
105
+ if (input.throwOnIdCollision) {
106
+ throw new Error(err.message);
107
+ }
108
+ continue;
109
+ }
110
+ const hrefOwnerId = byHref.get(entry.href);
111
+ if (hrefOwnerId) {
112
+ const owner = byId.get(hrefOwnerId);
113
+ const ownerRank = owner ? SOURCE_RANK[owner.source] : -1;
114
+ const nextRank = SOURCE_RANK[entry.source];
115
+ warnings.push({
116
+ code: "href_collision",
117
+ message: `Nav catalog: collision d'href "${entry.href}" (${hrefOwnerId} vs ${entry.id}) — le plus spécifique gagne`,
118
+ href: entry.href,
119
+ id: entry.id,
120
+ });
121
+ if (nextRank > ownerRank) {
122
+ byId.delete(hrefOwnerId);
123
+ byId.set(entry.id, entry);
124
+ byHref.set(entry.href, entry.id);
125
+ }
126
+ continue;
127
+ }
128
+ byId.set(entry.id, entry);
129
+ byHref.set(entry.href, entry.id);
130
+ }
131
+ }
132
+ const overrideById = new Map((input.overrides ?? []).map((o) => [o.entryId, o]));
133
+ const entries = [];
134
+ for (const entry of byId.values()) {
135
+ const available = applyFeatures(entry, input.features);
136
+ const override = overrideById.get(entry.id);
137
+ if (override?.hidden && !input.includeHidden) {
138
+ continue;
139
+ }
140
+ entries.push({
141
+ ...entry,
142
+ available,
143
+ label: override?.label ?? entry.label,
144
+ order: override?.order ?? entry.order,
145
+ group: override?.group ?? entry.group,
146
+ permission: override?.permission ?? entry.permission,
147
+ });
148
+ }
149
+ entries.sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
150
+ return { entries, errors, warnings };
151
+ }
152
+ /* ── Registre runtime OS (Node-safe) ── */
153
+ const osNavEntries = new Map();
154
+ let defaultsRegistered = false;
155
+ function registerOsNavEntry(entry) {
156
+ const prev = osNavEntries.get(entry.id);
157
+ if (prev) {
158
+ if (prev.href === entry.href && prev.label === entry.label) {
159
+ return () => {
160
+ osNavEntries.delete(entry.id);
161
+ };
162
+ }
163
+ throw new Error(`Nav catalog: collision d'id "${entry.id}" (déjà enregistré: ${prev.href})`);
164
+ }
165
+ osNavEntries.set(entry.id, {
166
+ ...entry,
167
+ source: entry.source || "os",
168
+ });
169
+ return () => {
170
+ osNavEntries.delete(entry.id);
171
+ };
172
+ }
173
+ function listOsNavEntries() {
174
+ return [...osNavEntries.values()].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
175
+ }
176
+ /** Seed des entrées OS primaires actuelles. Idempotent. */
177
+ function registerDefaultOsNavEntries() {
178
+ if (defaultsRegistered)
179
+ return;
180
+ defaultsRegistered = true;
181
+ for (const entry of DEFAULT_OS_NAV_ENTRIES) {
182
+ if (!osNavEntries.has(entry.id)) {
183
+ registerOsNavEntry(entry);
184
+ }
185
+ }
186
+ }
187
+ function defaultOsCatalogEntries() {
188
+ registerDefaultOsNavEntries();
189
+ return listOsNavEntries();
190
+ }
191
+ /** Tests uniquement — vide le registre et autorise un re-seed. */
192
+ function resetOsNavRegistryForTests() {
193
+ osNavEntries.clear();
194
+ defaultsRegistered = false;
195
+ }
196
+ const DEFAULT_OS_NAV_ENTRIES = [
197
+ {
198
+ id: "os.taches",
199
+ href: "/taches",
200
+ label: "Tâches",
201
+ icon: "ListTodo",
202
+ group: "core",
203
+ order: 10,
204
+ defaultVisible: true,
205
+ source: "os",
206
+ available: true,
207
+ },
208
+ {
209
+ id: "os.mails",
210
+ href: "/mails",
211
+ label: "Mails",
212
+ icon: "Mail",
213
+ group: "core",
214
+ order: 20,
215
+ defaultVisible: true,
216
+ source: "os",
217
+ available: true,
218
+ },
219
+ {
220
+ id: "os.granola",
221
+ href: "/granola",
222
+ label: "Granola",
223
+ icon: "NotebookPen",
224
+ group: "core",
225
+ order: 30,
226
+ defaultVisible: true,
227
+ source: "os",
228
+ available: true,
229
+ },
230
+ {
231
+ id: "os.grokbot",
232
+ href: "/grokbot",
233
+ label: "GrokBot",
234
+ icon: "Bot",
235
+ group: "core",
236
+ order: 40,
237
+ defaultVisible: true,
238
+ source: "os",
239
+ available: true,
240
+ },
241
+ {
242
+ id: "os.parametres",
243
+ href: "/parametres",
244
+ label: "Préférences",
245
+ icon: "SlidersHorizontal",
246
+ group: "core",
247
+ order: 50,
248
+ defaultVisible: true,
249
+ source: "os",
250
+ available: true,
251
+ },
252
+ {
253
+ id: "os.collaborateurs",
254
+ href: "/collaborateurs",
255
+ label: "Collaborateurs",
256
+ icon: "Shield",
257
+ group: "core",
258
+ order: 60,
259
+ defaultVisible: true,
260
+ source: "os",
261
+ available: true,
262
+ },
263
+ ];
264
+ /** Parse le body JSON du mount nav (tolérant : items manquants → []). */
265
+ function parseNavCatalogSessionItems(body) {
266
+ if (!body || typeof body !== "object" || Array.isArray(body))
267
+ return [];
268
+ const raw = body.items;
269
+ if (!Array.isArray(raw))
270
+ return [];
271
+ const out = [];
272
+ for (const row of raw) {
273
+ if (!row || typeof row !== "object" || Array.isArray(row))
274
+ continue;
275
+ const r = row;
276
+ const id = typeof r.id === "string" ? r.id.trim() : "";
277
+ const href = typeof r.href === "string" ? r.href.trim() : "";
278
+ const label = typeof r.label === "string" ? r.label.trim() : "";
279
+ const icon = typeof r.icon === "string" && r.icon.trim() ? r.icon.trim() : "Circle";
280
+ const order = typeof r.order === "number" && Number.isFinite(r.order) ? r.order : 0;
281
+ if (!id || !href || !label)
282
+ continue;
283
+ const item = { id, href, label, order, icon };
284
+ if (typeof r.group === "string" && r.group)
285
+ item.group = r.group;
286
+ if (typeof r.permission === "string" && r.permission) {
287
+ item.permission = r.permission;
288
+ }
289
+ out.push(item);
290
+ }
291
+ return out;
292
+ }
293
+ //# sourceMappingURL=nav-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-catalog.js","sourceRoot":"","sources":["../src/nav-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNavRegistry = createNavRegistry;
4
+ exports.mergeNav = mergeNav;
5
+ const FORBIDDEN_BRAND_IDS = new Set([
6
+ "panier",
7
+ "cart",
8
+ "dispatch",
9
+ "optimiser",
10
+ "catalog",
11
+ "catalogue",
12
+ ]);
13
+ function assertBrandItem(item) {
14
+ const id = item.id.toLowerCase();
15
+ const href = item.href.toLowerCase();
16
+ // H3 : les slots marque peuvent pointer vers les vraies routes produit
17
+ // (`/panier`, `/optimiser`…) si l'id est préfixé `brand.*`.
18
+ // Interdit : id métier nu (ex. `panier`) = confusion avec nav native.
19
+ for (const bad of FORBIDDEN_BRAND_IDS) {
20
+ if (id === bad) {
21
+ throw new Error(`Nav brand refusée: id réservé métier (${bad}). Utiliser brand.${bad}.`);
22
+ }
23
+ }
24
+ if (!id.startsWith("brand.") && FORBIDDEN_BRAND_IDS.has(href.replace(/^\//, ""))) {
25
+ throw new Error(`Nav brand refusée: href métier (${href}) sans id brand.*.`);
26
+ }
27
+ }
28
+ function createNavRegistry() {
29
+ const slots = new Map([
30
+ ["brand-primary", []],
31
+ ["brand-secondary", []],
32
+ ["plugins", []],
33
+ ]);
34
+ return {
35
+ registerBrandNav(items, slot = "brand-primary") {
36
+ for (const item of items)
37
+ assertBrandItem(item);
38
+ const tagged = items.map((i) => ({
39
+ ...i,
40
+ group: i.group || "brand",
41
+ }));
42
+ slots.set(slot, tagged);
43
+ },
44
+ getBrandNav(slot = "brand-primary") {
45
+ return [...(slots.get(slot) || [])];
46
+ },
47
+ getSlots() {
48
+ return [...slots.entries()].map(([id, items]) => ({ id, items: [...items] }));
49
+ },
50
+ clearBrandNav(slot) {
51
+ if (slot) {
52
+ slots.set(slot, []);
53
+ return;
54
+ }
55
+ for (const id of slots.keys())
56
+ slots.set(id, []);
57
+ },
58
+ };
59
+ }
60
+ /** Fusion nav cœur + items brand (slot primary par défaut). */
61
+ function mergeNav(core, brand) {
62
+ return [...core.map((i) => ({ ...i })), ...brand.map((i) => ({ ...i }))];
63
+ }
64
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,163 @@
1
+ {
2
+ "name": "@creezio/shell-ui",
3
+ "version": "0.22.0",
4
+ "description": "Nav + slots + shell CRM UI / libs plateforme (O9)",
5
+ "type": "module",
6
+ "main": "./dist-cjs/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist-cjs/index.js",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./ui": {
16
+ "types": "./ui/index.ts",
17
+ "import": "./ui/index.ts",
18
+ "default": "./ui/index.ts"
19
+ },
20
+ "./ui/kit": {
21
+ "types": "./ui/kit.ts",
22
+ "import": "./ui/kit.ts",
23
+ "default": "./ui/kit.ts"
24
+ },
25
+ "./ui/os-pages": {
26
+ "types": "./ui/os-pages/index.ts",
27
+ "import": "./ui/os-pages/index.ts",
28
+ "default": "./ui/os-pages/index.ts"
29
+ },
30
+ "./ui/settings/*": {
31
+ "types": "./ui/settings/*.tsx",
32
+ "import": "./ui/settings/*.tsx",
33
+ "default": "./ui/settings/*.tsx"
34
+ },
35
+ "./ui/primitives/*": {
36
+ "types": "./ui/primitives/*.tsx",
37
+ "import": "./ui/primitives/*.tsx",
38
+ "default": "./ui/primitives/*.tsx"
39
+ },
40
+ "./theme.css": "./ui/theme/theme.css",
41
+ "./tailwind-preset": "./ui/theme/tailwind-preset.cjs"
42
+ },
43
+ "files": [
44
+ "dist",
45
+ "dist-cjs",
46
+ "ui"
47
+ ],
48
+ "scripts": {
49
+ "build": "tsc -p tsconfig.json",
50
+ "typecheck": "tsc -p tsconfig.json --noEmit"
51
+ },
52
+ "dependencies": {
53
+ "@creezio/brand-config": "^0.22.0",
54
+ "@creezio/shell": "^0.22.0",
55
+ "clsx": "^2.0.0",
56
+ "tailwind-merge": "^2.0.0"
57
+ },
58
+ "devDependencies": {
59
+ "@types/node": "^22.15.3",
60
+ "@types/react": "^18.3.12",
61
+ "typescript": "^5.8.3"
62
+ },
63
+ "peerDependencies": {
64
+ "@creezio/assistant": ">=0.4.0",
65
+ "@creezio/auth": ">=0.4.0",
66
+ "@radix-ui/react-avatar": "^1.0.0",
67
+ "@radix-ui/react-dialog": "^1.0.0",
68
+ "@radix-ui/react-dropdown-menu": "^2.0.0",
69
+ "@radix-ui/react-label": "^2.0.0",
70
+ "@radix-ui/react-scroll-area": "^1.0.0",
71
+ "@radix-ui/react-select": "^2.0.0",
72
+ "@radix-ui/react-separator": "^1.0.0",
73
+ "@radix-ui/react-slot": "^1.1.0",
74
+ "@radix-ui/react-tabs": "^1.1.0",
75
+ "@radix-ui/react-tooltip": "^1.1.0",
76
+ "react-resizable-panels": "^2.1.0 || ^3.0.0",
77
+ "class-variance-authority": "^0.7.0",
78
+ "clsx": "^2.1.1",
79
+ "cmdk": ">=1.0.0",
80
+ "lucide-react": ">=0.400.0",
81
+ "next": ">=14.0.0",
82
+ "react": "^18.0.0 || ^19.0.0",
83
+ "recharts": ">=2.0.0",
84
+ "sonner": ">=1.0.0",
85
+ "tailwind-merge": "^3.6.0"
86
+ },
87
+ "peerDependenciesMeta": {
88
+ "@creezio/assistant": {
89
+ "optional": true
90
+ },
91
+ "@creezio/auth": {
92
+ "optional": true
93
+ },
94
+ "@radix-ui/react-avatar": {
95
+ "optional": true
96
+ },
97
+ "@radix-ui/react-dialog": {
98
+ "optional": true
99
+ },
100
+ "@radix-ui/react-dropdown-menu": {
101
+ "optional": true
102
+ },
103
+ "@radix-ui/react-label": {
104
+ "optional": true
105
+ },
106
+ "@radix-ui/react-scroll-area": {
107
+ "optional": true
108
+ },
109
+ "@radix-ui/react-select": {
110
+ "optional": true
111
+ },
112
+ "@radix-ui/react-separator": {
113
+ "optional": true
114
+ },
115
+ "@radix-ui/react-slot": {
116
+ "optional": true
117
+ },
118
+ "@radix-ui/react-tabs": {
119
+ "optional": true
120
+ },
121
+ "class-variance-authority": {
122
+ "optional": true
123
+ },
124
+ "clsx": {
125
+ "optional": true
126
+ },
127
+ "cmdk": {
128
+ "optional": true
129
+ },
130
+ "lucide-react": {
131
+ "optional": true
132
+ },
133
+ "next": {
134
+ "optional": true
135
+ },
136
+ "react": {
137
+ "optional": true
138
+ },
139
+ "recharts": {
140
+ "optional": true
141
+ },
142
+ "sonner": {
143
+ "optional": true
144
+ },
145
+ "tailwind-merge": {
146
+ "optional": true
147
+ }
148
+ },
149
+ "license": "UNLICENSED",
150
+ "module": "./dist/index.js",
151
+ "publishConfig": {
152
+ "registry": "https://registry.npmjs.org",
153
+ "access": "public"
154
+ },
155
+ "repository": {
156
+ "type": "git",
157
+ "url": "https://github.com/creezio/creezio.git",
158
+ "directory": "packages/shell-ui"
159
+ },
160
+ "engines": {
161
+ "node": ">=22.5"
162
+ }
163
+ }
@@ -0,0 +1,59 @@
1
+ "use client";
2
+
3
+ /**
4
+ * Error Boundary racine de l'UI CRM.
5
+ *
6
+ * Sans lui, toute exception d'un composant client remonte au boundary interne
7
+ * de Next → écran générique « Application error: a client-side exception has
8
+ * occurred » (blanc, sans aucune info). Ici :
9
+ * - on logge l'erreur AVEC le componentStack via console.error → capté par la
10
+ * télémétrie desktop (console-message + window.onerror → collecteur) ;
11
+ * - on affiche un écran d'erreur exploitable (message + bouton recharger).
12
+ */
13
+
14
+ import { Component, type ErrorInfo, type ReactNode } from "react";
15
+
16
+ type State = { error: Error | null };
17
+
18
+ export class AppErrorBoundary extends Component<{ children: ReactNode }, State> {
19
+ state: State = { error: null };
20
+
21
+ static getDerivedStateFromError(error: Error): State {
22
+ return { error };
23
+ }
24
+
25
+ componentDidCatch(error: Error, info: ErrorInfo): void {
26
+ // console.error → console-message "error" → log main + rapport collecteur.
27
+ // Le componentStack identifie le composant fautif même en prod minifiée.
28
+ console.error(
29
+ `[tf2-error-boundary] ${error.message}\ncomponentStack:${info.componentStack ?? "(inconnu)"}\nstack:${error.stack ?? ""}`,
30
+ );
31
+ }
32
+
33
+ render() {
34
+ if (this.state.error) {
35
+ return (
36
+ <div className="flex min-h-dvh flex-col items-center justify-center gap-3 bg-slate-50 p-8 text-center">
37
+ <div className="text-4xl">⚠️</div>
38
+ <h1 className="text-lg font-semibold text-slate-900">
39
+ Une erreur est survenue dans l&apos;interface
40
+ </h1>
41
+ <p className="max-w-md break-words text-sm text-slate-500">
42
+ {this.state.error.message}
43
+ </p>
44
+ <p className="max-w-md text-xs text-slate-400">
45
+ L&apos;incident a été enregistré et transmis automatiquement.
46
+ </p>
47
+ <button
48
+ type="button"
49
+ onClick={() => window.location.reload()}
50
+ className="mt-2 rounded-md bg-slate-900 px-4 py-2 text-sm font-medium text-white hover:bg-slate-700"
51
+ >
52
+ Recharger l&apos;application
53
+ </button>
54
+ </div>
55
+ );
56
+ }
57
+ return this.props.children;
58
+ }
59
+ }