@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.
- package/README.md +336 -0
- package/dist/adapters/nav-shell.d.ts +54 -0
- package/dist/adapters/nav-shell.d.ts.map +1 -0
- package/dist/adapters/nav-shell.js +112 -0
- package/dist/adapters/nav-shell.js.map +1 -0
- package/dist/brand.d.ts +64 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +59 -0
- package/dist/brand.js.map +1 -0
- package/dist/core-nav.d.ts +17 -0
- package/dist/core-nav.d.ts.map +1 -0
- package/dist/core-nav.js +40 -0
- package/dist/core-nav.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-scopes.d.ts +24 -0
- package/dist/lib/api-scopes.d.ts.map +1 -0
- package/dist/lib/api-scopes.js +78 -0
- package/dist/lib/api-scopes.js.map +1 -0
- package/dist/lib/catalog-suspense-key.d.ts +3 -0
- package/dist/lib/catalog-suspense-key.d.ts.map +1 -0
- package/dist/lib/catalog-suspense-key.js +12 -0
- package/dist/lib/catalog-suspense-key.js.map +1 -0
- package/dist/lib/data-changed.d.ts +51 -0
- package/dist/lib/data-changed.d.ts.map +1 -0
- package/dist/lib/data-changed.js +227 -0
- package/dist/lib/data-changed.js.map +1 -0
- package/dist/lib/desktop-home-path.d.ts +14 -0
- package/dist/lib/desktop-home-path.d.ts.map +1 -0
- package/dist/lib/desktop-home-path.js +29 -0
- package/dist/lib/desktop-home-path.js.map +1 -0
- package/dist/lib/geo-distance.d.ts +6 -0
- package/dist/lib/geo-distance.d.ts.map +1 -0
- package/dist/lib/geo-distance.js +27 -0
- package/dist/lib/geo-distance.js.map +1 -0
- package/dist/lib/img.d.ts +2 -0
- package/dist/lib/img.d.ts.map +1 -0
- package/dist/lib/img.js +40 -0
- package/dist/lib/img.js.map +1 -0
- package/dist/lib/keepalive-eviction.d.ts +14 -0
- package/dist/lib/keepalive-eviction.d.ts.map +1 -0
- package/dist/lib/keepalive-eviction.js +44 -0
- package/dist/lib/keepalive-eviction.js.map +1 -0
- package/dist/lib/ops-track.d.ts +29 -0
- package/dist/lib/ops-track.d.ts.map +1 -0
- package/dist/lib/ops-track.js +37 -0
- package/dist/lib/ops-track.js.map +1 -0
- package/dist/lib/optimize-cover-url.d.ts +10 -0
- package/dist/lib/optimize-cover-url.d.ts.map +1 -0
- package/dist/lib/optimize-cover-url.js +80 -0
- package/dist/lib/optimize-cover-url.js.map +1 -0
- package/dist/lib/page-trails.d.ts +9 -0
- package/dist/lib/page-trails.d.ts.map +1 -0
- package/dist/lib/page-trails.js +20 -0
- package/dist/lib/page-trails.js.map +1 -0
- package/dist/lib/public-origin.d.ts +32 -0
- package/dist/lib/public-origin.d.ts.map +1 -0
- package/dist/lib/public-origin.js +125 -0
- package/dist/lib/public-origin.js.map +1 -0
- package/dist/lib/server-incident.d.ts +12 -0
- package/dist/lib/server-incident.d.ts.map +1 -0
- package/dist/lib/server-incident.js +72 -0
- package/dist/lib/server-incident.js.map +1 -0
- package/dist/lib/tab-document-url.d.ts +13 -0
- package/dist/lib/tab-document-url.d.ts.map +1 -0
- package/dist/lib/tab-document-url.js +60 -0
- package/dist/lib/tab-document-url.js.map +1 -0
- package/dist/lib/utils.d.ts +20 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +87 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/nav-catalog.d.ts +97 -0
- package/dist/nav-catalog.d.ts.map +1 -0
- package/dist/nav-catalog.js +282 -0
- package/dist/nav-catalog.js.map +1 -0
- package/dist/registry.d.ts +11 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +60 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist-cjs/adapters/nav-shell.js +115 -0
- package/dist-cjs/adapters/nav-shell.js.map +1 -0
- package/dist-cjs/brand.js +66 -0
- package/dist-cjs/brand.js.map +1 -0
- package/dist-cjs/core-nav.js +43 -0
- package/dist-cjs/core-nav.js.map +1 -0
- package/dist-cjs/index.js +95 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/lib/api-scopes.js +86 -0
- package/dist-cjs/lib/api-scopes.js.map +1 -0
- package/dist-cjs/lib/catalog-suspense-key.js +15 -0
- package/dist-cjs/lib/catalog-suspense-key.js.map +1 -0
- package/dist-cjs/lib/data-changed.js +236 -0
- package/dist-cjs/lib/data-changed.js.map +1 -0
- package/dist-cjs/lib/desktop-home-path.js +34 -0
- package/dist-cjs/lib/desktop-home-path.js.map +1 -0
- package/dist-cjs/lib/geo-distance.js +30 -0
- package/dist-cjs/lib/geo-distance.js.map +1 -0
- package/dist-cjs/lib/img.js +43 -0
- package/dist-cjs/lib/img.js.map +1 -0
- package/dist-cjs/lib/keepalive-eviction.js +49 -0
- package/dist-cjs/lib/keepalive-eviction.js.map +1 -0
- package/dist-cjs/lib/ops-track.js +41 -0
- package/dist-cjs/lib/ops-track.js.map +1 -0
- package/dist-cjs/lib/optimize-cover-url.js +83 -0
- package/dist-cjs/lib/optimize-cover-url.js.map +1 -0
- package/dist-cjs/lib/page-trails.js +25 -0
- package/dist-cjs/lib/page-trails.js.map +1 -0
- package/dist-cjs/lib/public-origin.js +130 -0
- package/dist-cjs/lib/public-origin.js.map +1 -0
- package/dist-cjs/lib/server-incident.js +75 -0
- package/dist-cjs/lib/server-incident.js.map +1 -0
- package/dist-cjs/lib/tab-document-url.js +65 -0
- package/dist-cjs/lib/tab-document-url.js.map +1 -0
- package/dist-cjs/lib/utils.js +97 -0
- package/dist-cjs/lib/utils.js.map +1 -0
- package/dist-cjs/nav-catalog.js +293 -0
- package/dist-cjs/nav-catalog.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/registry.js +64 -0
- package/dist-cjs/registry.js.map +1 -0
- package/dist-cjs/types.js +3 -0
- package/dist-cjs/types.js.map +1 -0
- package/package.json +163 -0
- package/ui/app-error-boundary.tsx +59 -0
- package/ui/data-table.tsx +121 -0
- package/ui/desktop/auth-window-chrome.tsx +51 -0
- package/ui/desktop/desktop-bridge.tsx +87 -0
- package/ui/desktop/external-site-slot.tsx +313 -0
- package/ui/desktop/external-site-surface.ts +58 -0
- package/ui/desktop/site-link.tsx +105 -0
- package/ui/desktop/window-chrome-controls.tsx +5 -0
- package/ui/desktop-types.ts +30 -0
- package/ui/faceted-filters.tsx +119 -0
- package/ui/global-search-host.ts +20 -0
- package/ui/global-search.tsx +66 -0
- package/ui/index.ts +178 -0
- package/ui/kit.ts +30 -0
- package/ui/layout/app-shell.tsx +58 -0
- package/ui/layout/desktop-update-banner.tsx +100 -0
- package/ui/layout/entity-header.tsx +44 -0
- package/ui/layout/native-os-nav.ts +104 -0
- package/ui/layout/nav-catalog-loader.tsx +98 -0
- package/ui/layout/nav-icons.ts +67 -0
- package/ui/layout/page-chrome.tsx +90 -0
- package/ui/layout/page-toolbar-context.tsx +82 -0
- package/ui/layout/sandbox-banner.tsx +38 -0
- package/ui/layout/section-view-shell.tsx +73 -0
- package/ui/layout/sidebar-host.ts +144 -0
- package/ui/layout/sidebar.tsx +1150 -0
- package/ui/lib/ai-screencast-hub.ts +127 -0
- package/ui/lib/ai-workspace-client.ts +46 -0
- package/ui/lib/aid.ts +22 -0
- package/ui/lib/desktop-host.ts +114 -0
- package/ui/lib/fleet-tracker-client.ts +237 -0
- package/ui/lib/hermes-ui.ts +114 -0
- package/ui/lib/n8n-ui.ts +115 -0
- package/ui/lib/use-creezio-resource.tsx +121 -0
- package/ui/lib/use-shell-ui-brand.ts +22 -0
- package/ui/list-toolbar.tsx +309 -0
- package/ui/os-pages/desktop-settings-page.tsx +158 -0
- package/ui/os-pages/index.ts +8 -0
- package/ui/page-loading/entity-page-loading.tsx +59 -0
- package/ui/page-loading/list-page-loading.tsx +61 -0
- package/ui/pagination.tsx +56 -0
- package/ui/primitives/avatar.tsx +33 -0
- package/ui/primitives/badge.tsx +36 -0
- package/ui/primitives/breadcrumb.tsx +93 -0
- package/ui/primitives/button.tsx +44 -0
- package/ui/primitives/card.tsx +44 -0
- package/ui/primitives/chart.tsx +317 -0
- package/ui/primitives/command.tsx +111 -0
- package/ui/primitives/dialog.tsx +100 -0
- package/ui/primitives/dropdown-menu.tsx +187 -0
- package/ui/primitives/input.tsx +19 -0
- package/ui/primitives/label.tsx +17 -0
- package/ui/primitives/resizable.tsx +45 -0
- package/ui/primitives/scroll-area.tsx +41 -0
- package/ui/primitives/select.tsx +73 -0
- package/ui/primitives/separator.tsx +26 -0
- package/ui/primitives/sheet.tsx +90 -0
- package/ui/primitives/skeleton.tsx +7 -0
- package/ui/primitives/sonner.tsx +22 -0
- package/ui/primitives/tabs.tsx +51 -0
- package/ui/primitives/textarea.tsx +22 -0
- package/ui/primitives/tooltip.tsx +31 -0
- package/ui/pwa/client-error-reporter.tsx +62 -0
- package/ui/pwa/register-sw.tsx +50 -0
- package/ui/range-filters.tsx +174 -0
- package/ui/search/global-search-config.ts +32 -0
- package/ui/search/global-search-provider.tsx +528 -0
- package/ui/search/search-history.ts +74 -0
- package/ui/search-input.tsx +146 -0
- package/ui/settings/account-settings.tsx +140 -0
- package/ui/settings/agent-profile-settings.tsx +184 -0
- package/ui/settings/api-keys-settings.tsx +349 -0
- package/ui/settings/desktop-background-settings.tsx +128 -0
- package/ui/settings/desktop-connection-settings.tsx +251 -0
- package/ui/settings/desktop-embed-env-panel.tsx +257 -0
- package/ui/settings/desktop-fleet-telemetry-settings.tsx +269 -0
- package/ui/settings/desktop-hermes-settings.tsx +341 -0
- package/ui/settings/desktop-llm-keys.tsx +192 -0
- package/ui/settings/desktop-n8n-settings.tsx +306 -0
- package/ui/settings/desktop-tunnel.tsx +264 -0
- package/ui/settings/desktop-update-settings.tsx +175 -0
- package/ui/settings/factory-reset-settings.tsx +89 -0
- package/ui/settings/host-only-settings.tsx +62 -0
- package/ui/settings/locked-config-field.tsx +30 -0
- package/ui/settings/ops-diagnostic-settings.tsx +242 -0
- package/ui/settings/search-reindex-settings.tsx +158 -0
- package/ui/settings/server-mode-cards.tsx +801 -0
- package/ui/theme/tailwind-preset.cjs +82 -0
- package/ui/theme/theme.css +328 -0
- package/ui/workspace/ai-activity-panel-host.tsx +19 -0
- package/ui/workspace/ai-workspace-agent-host.tsx +54 -0
- package/ui/workspace/ai-workspace-banner.tsx +168 -0
- package/ui/workspace/impersonation-banner.tsx +39 -0
- package/ui/workspace/keep-alive.tsx +220 -0
- package/ui/workspace/tab-workspace-context.tsx +1172 -0
- package/ui/workspace/tab-workspace-host.ts +89 -0
- package/ui/workspace/types.ts +500 -0
- package/ui/workspace/use-location-search.tsx +50 -0
- package/ui/workspace/window-chrome-controls.tsx +116 -0
- package/ui/workspace/workspace-config.ts +47 -0
- package/ui/workspace/workspace-root.tsx +147 -0
- package/ui/workspace/workspace-shell.tsx +292 -0
- 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,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 @@
|
|
|
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'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'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'application
|
|
53
|
+
</button>
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return this.props.children;
|
|
58
|
+
}
|
|
59
|
+
}
|