@betterportal/theme-bootstrap1 0.0.1

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.
@@ -0,0 +1,1942 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
2
+ /** @jsxImportSource jsx-htmx */
3
+ import { css } from "jsx-htmx";
4
+ import { createPluginManifest } from "@betterportal/framework";
5
+ export const Bootstrap1Manifest = createPluginManifest({
6
+ pluginId: "theme.betterportal.bootstrap1",
7
+ title: "BetterPortal Bootstrap1 Theme",
8
+ description: "Custom Bootstrap 5 plus HTMX shell for BetterPortal v10.",
9
+ version: "1.0.0",
10
+ category: "theme",
11
+ deploymentModes: ["bp-hosted", "customer-hosted", "self-hosted"],
12
+ capabilities: [
13
+ "theme.shell",
14
+ "theme.bootstrap5",
15
+ "theme.htmx",
16
+ "theme.light-dark",
17
+ "theme.whitelabel"
18
+ ],
19
+ supportedThemes: ["bootstrap1"],
20
+ supportedRenderModes: ["page", "fragment", "embed"],
21
+ views: [],
22
+ configSchemas: [],
23
+ permissions: [],
24
+ adminApis: [],
25
+ cacheHints: {
26
+ metadataTtlSeconds: 1800
27
+ }
28
+ });
29
+ function normalizeRoutePath(path) {
30
+ const normalized = path.replace(/\/+$/, "");
31
+ return normalized === "" ? "/" : normalized;
32
+ }
33
+ function routeSegments(path) {
34
+ return normalizeRoutePath(path).split("/").filter(Boolean);
35
+ }
36
+ function titleFromSegment(segment) {
37
+ const words = segment
38
+ .split(/[-_]/)
39
+ .map((part) => part.trim())
40
+ .filter(Boolean);
41
+ if (words.length === 0) {
42
+ return "Section";
43
+ }
44
+ return words
45
+ .map((word) => word.slice(0, 1).toUpperCase() + word.slice(1))
46
+ .join(" ");
47
+ }
48
+ function routeIconText(title) {
49
+ const words = title.split(/\s+/).filter(Boolean).slice(0, 2);
50
+ const initials = words.map((word) => word.slice(0, 1).toUpperCase()).join("");
51
+ return initials || title.slice(0, 2).toUpperCase();
52
+ }
53
+ function routeBreadcrumb(groupTitle, route) {
54
+ if (!groupTitle || groupTitle === route.title) {
55
+ return "";
56
+ }
57
+ return `${groupTitle} / ${route.title}`;
58
+ }
59
+ function buildNavItems(routeLinks) {
60
+ const nestedPrefixes = new Set();
61
+ const topLevelRoutes = new Map();
62
+ routeLinks.forEach((route) => {
63
+ const segments = routeSegments(route.href);
64
+ if (segments.length > 1) {
65
+ nestedPrefixes.add(segments[0] ?? "");
66
+ }
67
+ if (segments.length === 1) {
68
+ topLevelRoutes.set(normalizeRoutePath(route.href), route);
69
+ }
70
+ });
71
+ const consumed = new Set();
72
+ const items = [];
73
+ for (const route of routeLinks) {
74
+ const normalizedPath = normalizeRoutePath(route.href);
75
+ if (consumed.has(normalizedPath)) {
76
+ continue;
77
+ }
78
+ const segments = routeSegments(route.href);
79
+ const prefix = segments[0];
80
+ if (segments.length === 1 && prefix && nestedPrefixes.has(prefix)) {
81
+ const groupTitle = route.title;
82
+ const groupedRoutes = routeLinks.filter((candidate) => {
83
+ const candidatePath = normalizeRoutePath(candidate.href);
84
+ return !consumed.has(candidatePath) && routeSegments(candidate.href)[0] === prefix;
85
+ });
86
+ const childRoutes = groupedRoutes.filter((candidate) => normalizeRoutePath(candidate.href) !== normalizedPath);
87
+ groupedRoutes.forEach((candidate) => consumed.add(normalizeRoutePath(candidate.href)));
88
+ items.push({
89
+ kind: "group",
90
+ id: `group-${prefix}`,
91
+ title: groupTitle,
92
+ items: [
93
+ {
94
+ kind: "route",
95
+ route,
96
+ breadcrumb: "",
97
+ label: "Overview"
98
+ },
99
+ ...childRoutes.map((candidate) => ({
100
+ kind: "route",
101
+ route: candidate,
102
+ breadcrumb: routeBreadcrumb(groupTitle, candidate)
103
+ }))
104
+ ],
105
+ active: groupedRoutes.some((candidate) => candidate.active)
106
+ });
107
+ continue;
108
+ }
109
+ if (segments.length > 1 && prefix) {
110
+ const baseRoute = topLevelRoutes.get(`/${prefix}`);
111
+ const groupTitle = baseRoute?.title ?? titleFromSegment(prefix);
112
+ const groupedRoutes = routeLinks.filter((candidate) => {
113
+ const candidatePath = normalizeRoutePath(candidate.href);
114
+ return !consumed.has(candidatePath) && routeSegments(candidate.href)[0] === prefix;
115
+ });
116
+ groupedRoutes.forEach((candidate) => consumed.add(normalizeRoutePath(candidate.href)));
117
+ items.push({
118
+ kind: "group",
119
+ id: `group-${prefix}`,
120
+ title: groupTitle,
121
+ items: groupedRoutes.map((candidate) => ({
122
+ kind: "route",
123
+ route: candidate,
124
+ breadcrumb: routeBreadcrumb(groupTitle, candidate)
125
+ })),
126
+ active: groupedRoutes.some((candidate) => candidate.active)
127
+ });
128
+ continue;
129
+ }
130
+ consumed.add(normalizedPath);
131
+ items.push({
132
+ kind: "route",
133
+ route,
134
+ breadcrumb: ""
135
+ });
136
+ }
137
+ return items;
138
+ }
139
+ function activeBreadcrumb(navItems) {
140
+ for (const item of navItems) {
141
+ if (item.kind === "route" && item.route.active) {
142
+ return item.breadcrumb;
143
+ }
144
+ if (item.kind === "group") {
145
+ const activeItem = item.items.find((child) => child.route.active);
146
+ if (activeItem) {
147
+ return activeItem.breadcrumb;
148
+ }
149
+ }
150
+ }
151
+ return "";
152
+ }
153
+ function renderRouteLink(item, dismissMobileMenu = false) {
154
+ const route = item.route;
155
+ const displayTitle = item.label ?? route.title;
156
+ const isChild = Boolean(item.breadcrumb || item.label);
157
+ const routeAttrs = route.requestUrl
158
+ ? {
159
+ "data-bp-route-request": route.requestUrl,
160
+ "hx-get": route.requestUrl,
161
+ "hx-target": "#bp-main",
162
+ "hx-swap": "innerHTML",
163
+ "hx-push-url": route.href,
164
+ "hx-preload": "mouseover"
165
+ }
166
+ : {
167
+ "data-bp-route-error": route.error ?? "Route cannot be loaded."
168
+ };
169
+ return (_jsx("a", { class: `bp-admin__route${route.active ? " active" : ""}${isChild ? " bp-admin__route--child" : ""}`, href: route.href, "data-bp-route-link": "", "data-bp-route-title": route.title, "data-bp-route-breadcrumb": item.breadcrumb, "data-bp-service": route.serviceId, "data-bs-dismiss": dismissMobileMenu ? "offcanvas" : undefined, ...routeAttrs, children: displayTitle }));
170
+ }
171
+ export function renderNavItems(navItems, dismissMobileMenu = false) {
172
+ return navItems.map((item) => {
173
+ if (item.kind === "route") {
174
+ return renderRouteLink(item, dismissMobileMenu);
175
+ }
176
+ return (_jsxs("details", { class: "bp-admin__nav-group", "data-bp-nav-group": "", open: (item.active || item.defaultExpanded) ? true : undefined, children: [_jsxs("summary", { class: "bp-admin__nav-group-toggle", children: [_jsx("span", { class: "bp-admin__nav-group-title", children: item.title }), _jsx("span", { class: "bp-admin__nav-group-chevron" })] }), _jsx("div", { class: "bp-admin__nav-group-items", children: item.items.map((child) => renderRouteLink(child, dismissMobileMenu)) })] }));
177
+ });
178
+ }
179
+ export function shellStyles(mode, themeConfig) {
180
+ const surfaceConfig = mode === "dark" ? themeConfig.dark : themeConfig.light;
181
+ /* -- Neumorphic shadow tokens -- */
182
+ const neu = mode === "dark" ? {
183
+ bg: "#2c2c2e",
184
+ surface: "#2c2c2e",
185
+ surfaceAlt: "#242426",
186
+ shadowDark: "rgba(0,0,0,0.35)",
187
+ shadowLight: "rgba(255,255,255,0.04)",
188
+ raised: "6px 6px 14px rgba(0,0,0,0.35), -6px -6px 14px rgba(255,255,255,0.04)",
189
+ raisedSoft: "4px 4px 10px rgba(0,0,0,0.30), -4px -4px 10px rgba(255,255,255,0.03)",
190
+ inset: "inset 3px 3px 7px rgba(0,0,0,0.40), inset -3px -3px 7px rgba(255,255,255,0.05)",
191
+ insetSoft: "inset 2px 2px 5px rgba(0,0,0,0.30), inset -2px -2px 5px rgba(255,255,255,0.04)"
192
+ } : {
193
+ bg: "#e3e7ed",
194
+ surface: "#e3e7ed",
195
+ surfaceAlt: "#d9dde3",
196
+ shadowDark: "rgba(163,170,182,0.5)",
197
+ shadowLight: "rgba(255,255,255,0.8)",
198
+ raised: "6px 6px 14px rgba(163,170,182,0.5), -6px -6px 14px rgba(255,255,255,0.8)",
199
+ raisedSoft: "4px 4px 10px rgba(163,170,182,0.4), -4px -4px 10px rgba(255,255,255,0.7)",
200
+ inset: "inset 3px 3px 7px rgba(163,170,182,0.55), inset -3px -3px 7px rgba(255,255,255,0.85)",
201
+ insetSoft: "inset 2px 2px 5px rgba(163,170,182,0.40), inset -2px -2px 5px rgba(255,255,255,0.75)"
202
+ };
203
+ return css({
204
+ ":root": {
205
+ colorScheme: mode === "dark" ? "dark" : "light",
206
+ "--bp-bg": surfaceConfig.background ?? neu.bg,
207
+ "--bp-surface": surfaceConfig.surface ?? neu.surface,
208
+ "--bp-surface-alt": surfaceConfig.surfaceAlt ?? neu.surfaceAlt,
209
+ "--bp-text": surfaceConfig.text ?? (mode === "dark" ? "#f5f5f7" : "#1d1d1f"),
210
+ "--bp-text-soft": surfaceConfig.textSoft ?? (mode === "dark" ? "#86868b" : "#6e6e73"),
211
+ "--bp-border": surfaceConfig.border ?? (mode === "dark" ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.04)"),
212
+ "--bp-accent": themeConfig.bootstrap.primary ?? "#007aff",
213
+ "--bp-accent-secondary": themeConfig.bootstrap.secondary ?? "#8e8e93",
214
+ "--bp-accent-success": themeConfig.bootstrap.success ?? "#30d158",
215
+ "--bp-accent-info": themeConfig.bootstrap.info ?? "#64d2ff",
216
+ "--bp-accent-warning": themeConfig.bootstrap.warning ?? "#ffd60a",
217
+ "--bp-accent-danger": themeConfig.bootstrap.danger ?? "#ff453a",
218
+ "--bp-accent-soft": surfaceConfig.accentSoft ?? (mode === "dark" ? "rgba(0,122,255,0.15)" : "rgba(0,122,255,0.08)"),
219
+ "--bp-shadow": neu.raised,
220
+ "--bp-shadow-soft": neu.raisedSoft,
221
+ "--bp-shadow-inset": neu.inset,
222
+ "--bp-shadow-inset-soft": neu.insetSoft,
223
+ "--bs-primary": themeConfig.bootstrap.primary ?? "#007aff",
224
+ "--bs-secondary": themeConfig.bootstrap.secondary ?? "#8e8e93",
225
+ "--bs-success": themeConfig.bootstrap.success ?? "#30d158",
226
+ "--bs-info": themeConfig.bootstrap.info ?? "#64d2ff",
227
+ "--bs-warning": themeConfig.bootstrap.warning ?? "#ffd60a",
228
+ "--bs-danger": themeConfig.bootstrap.danger ?? "#ff453a",
229
+ "--bs-light": themeConfig.bootstrap.light ?? "#f2f2f7",
230
+ "--bs-dark": themeConfig.bootstrap.dark ?? "#1d1d1f"
231
+ },
232
+ "html, body": {
233
+ margin: 0,
234
+ minHeight: "100%",
235
+ background: "radial-gradient(ellipse at 15% 10%, color-mix(in srgb, var(--bp-accent) 14%, transparent), transparent 50%), radial-gradient(ellipse at 85% 80%, color-mix(in srgb, var(--bp-accent-secondary) 10%, transparent), transparent 40%), radial-gradient(ellipse at 50% 50%, color-mix(in srgb, var(--bp-accent) 5%, transparent), transparent 60%), var(--bp-bg)",
236
+ backgroundAttachment: "fixed",
237
+ color: "var(--bp-text)"
238
+ },
239
+ body: {
240
+ fontFamily: '-apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text", "Helvetica Neue", "Segoe UI", Roboto, sans-serif',
241
+ "-webkit-font-smoothing": "antialiased",
242
+ "-moz-osx-font-smoothing": "grayscale"
243
+ },
244
+ ".bp-shell": {
245
+ minHeight: "100vh",
246
+ padding: "0.85rem"
247
+ },
248
+ ".bp-shell--auth": {
249
+ display: "grid",
250
+ placeItems: "center",
251
+ padding: "1.5rem"
252
+ },
253
+ ".bp-shell[data-bp-chrome-full-screen='true']": {
254
+ padding: "0"
255
+ },
256
+ ".bp-shell[data-bp-chrome-full-screen='true'] .bp-admin": {
257
+ maxWidth: "none",
258
+ display: "block"
259
+ },
260
+ ".bp-shell[data-bp-chrome-full-screen='true'] .bp-admin__sidebar, .bp-shell[data-bp-chrome-full-screen='true'] .bp-admin__topbar, .bp-shell[data-bp-chrome-full-screen='true'] .bp-admin__footer": {
261
+ display: "none"
262
+ },
263
+ ".bp-shell[data-bp-chrome-full-screen='true'] .bp-admin__workspace": {
264
+ minHeight: "100vh",
265
+ borderRadius: 0,
266
+ background: "transparent",
267
+ border: "none",
268
+ boxShadow: "none",
269
+ display: "block",
270
+ overflow: "visible"
271
+ },
272
+ ".bp-shell[data-bp-chrome-full-screen='true'] .bp-admin__content-frame, .bp-shell[data-bp-chrome-full-screen='true'] .bp-shell__main, .bp-shell[data-bp-chrome-full-screen='true'] #bp-main": {
273
+ minHeight: "100vh"
274
+ },
275
+ ".bp-shell[data-bp-chrome-full-screen='true'] .bp-shell__main": {
276
+ padding: 0
277
+ },
278
+ ".bp-admin": {
279
+ maxWidth: 1540,
280
+ margin: "0 auto",
281
+ display: "grid",
282
+ gridTemplateColumns: "272px minmax(0, 1fr)",
283
+ gap: "1rem",
284
+ alignItems: "start"
285
+ },
286
+ /* -- Sidebar: lives ON the background, no card -- */
287
+ ".bp-admin__sidebar": {
288
+ position: "sticky",
289
+ top: "1rem",
290
+ minHeight: "calc(100vh - 2rem)",
291
+ borderRadius: 0,
292
+ padding: "0.5rem 0.5rem 0.5rem 0.2rem",
293
+ background: "transparent",
294
+ border: "none",
295
+ boxShadow: "none",
296
+ display: "grid",
297
+ gridTemplateRows: "auto 1fr",
298
+ gap: "0.75rem",
299
+ overflow: "visible"
300
+ },
301
+ /* -- Workspace: raised glass card (topbar + content) -- */
302
+ ".bp-admin__workspace": {
303
+ minHeight: "calc(100vh - 1.7rem)",
304
+ borderRadius: "1.5rem",
305
+ background: mode === "dark"
306
+ ? "rgba(50,50,52,0.72)"
307
+ : "rgba(255,255,255,0.65)",
308
+ backdropFilter: "blur(24px)",
309
+ "-webkit-backdrop-filter": "blur(24px)",
310
+ border: mode === "dark"
311
+ ? "1px solid rgba(255,255,255,0.08)"
312
+ : "1px solid rgba(255,255,255,0.55)",
313
+ boxShadow: "var(--bp-shadow)",
314
+ overflow: "hidden",
315
+ display: "grid",
316
+ gridTemplateRows: "auto 1fr",
317
+ gap: 0
318
+ },
319
+ /* -- Brand: text on background -- */
320
+ ".bp-admin__brand-row": {
321
+ position: "relative",
322
+ display: "flex",
323
+ alignItems: "center",
324
+ gap: "0.9rem",
325
+ padding: "0.4rem 0.5rem",
326
+ zIndex: 1
327
+ },
328
+ ".bp-admin__brand-name": {
329
+ fontSize: "1.1rem",
330
+ fontWeight: 700,
331
+ letterSpacing: "-0.03em",
332
+ color: "var(--bp-text)"
333
+ },
334
+ ".bp-admin__brand-logo": {
335
+ width: 32,
336
+ height: 32,
337
+ objectFit: "contain",
338
+ flex: "0 0 32px"
339
+ },
340
+ ".bp-admin__sidebar-nav": {
341
+ position: "relative",
342
+ zIndex: 1
343
+ },
344
+ ".bp-admin__menu-button": {
345
+ display: "none"
346
+ },
347
+ /* -- Nav: clean text on background -- */
348
+ ".bp-admin__nav": {
349
+ display: "grid",
350
+ gap: "0.15rem"
351
+ },
352
+ ".bp-admin__nav-group": {
353
+ display: "grid",
354
+ gap: "0.1rem"
355
+ },
356
+ ".bp-admin__nav-group-toggle": {
357
+ listStyle: "none",
358
+ display: "flex",
359
+ alignItems: "center",
360
+ justifyContent: "space-between",
361
+ gap: "0.75rem",
362
+ padding: "0.65rem 0.55rem 0.25rem",
363
+ color: "var(--bp-text)",
364
+ cursor: "pointer",
365
+ letterSpacing: "0.06em",
366
+ fontSize: "0.68rem",
367
+ fontWeight: 600,
368
+ textTransform: "uppercase",
369
+ opacity: 0.45
370
+ },
371
+ ".bp-admin__nav-group:hover .bp-admin__nav-group-toggle": {
372
+ opacity: 0.7
373
+ },
374
+ ".bp-admin__nav-group-toggle::-webkit-details-marker": {
375
+ display: "none"
376
+ },
377
+ ".bp-admin__nav-group-title": {
378
+ minWidth: 0
379
+ },
380
+ ".bp-admin__nav-group-chevron": {
381
+ fontSize: "0.65rem",
382
+ opacity: 0.5,
383
+ transition: "transform 180ms ease"
384
+ },
385
+ ".bp-admin__nav-group[open] .bp-admin__nav-group-chevron": {
386
+ transform: "rotate(180deg)"
387
+ },
388
+ ".bp-admin__nav-group-items": {
389
+ display: "grid",
390
+ gap: "0.05rem",
391
+ marginLeft: "0",
392
+ paddingLeft: "0",
393
+ borderLeft: "none"
394
+ },
395
+ /* -- Routes: uniform text, on background -- */
396
+ ".bp-admin__route": {
397
+ display: "block",
398
+ borderRadius: "0.6rem",
399
+ padding: "0.5rem 0.55rem",
400
+ color: "var(--bp-text)",
401
+ textDecoration: "none",
402
+ border: "none",
403
+ background: "transparent",
404
+ transition: "all 160ms ease",
405
+ fontSize: "0.88rem",
406
+ fontWeight: 500,
407
+ opacity: 0.7
408
+ },
409
+ ".bp-admin__route:hover": {
410
+ opacity: 1,
411
+ background: mode === "dark"
412
+ ? "rgba(255,255,255,0.08)"
413
+ : "rgba(0,0,0,0.06)"
414
+ },
415
+ ".bp-admin__route.active": {
416
+ color: "var(--bp-accent)",
417
+ background: "var(--bp-accent-soft)",
418
+ boxShadow: "none",
419
+ fontWeight: 600,
420
+ opacity: 1
421
+ },
422
+ ".bp-admin__route--child": {
423
+ paddingLeft: "0.55rem",
424
+ fontSize: "0.86rem"
425
+ },
426
+ ".bp-admin__route--child:hover": {
427
+ transform: "none"
428
+ },
429
+ ".bp-admin__route--child.active": {
430
+ boxShadow: "none"
431
+ },
432
+ /* P14: service health degraded - clickable but visibly disabled */
433
+ ".bp-service-down": {
434
+ opacity: 0.4,
435
+ cursor: "not-allowed",
436
+ filter: "grayscale(0.7)",
437
+ position: "relative"
438
+ },
439
+ ".bp-service-down::after": {
440
+ content: '""',
441
+ color: "var(--bp-accent-danger)",
442
+ position: "absolute",
443
+ top: "0.2rem",
444
+ right: "0.3rem",
445
+ fontSize: "0.5rem",
446
+ lineHeight: 1
447
+ },
448
+ /* -- Topbar: inside glass card, no own card -- */
449
+ ".bp-admin__topbar": {
450
+ position: "relative",
451
+ borderRadius: 0,
452
+ border: "none",
453
+ borderBottom: mode === "dark"
454
+ ? "1px solid rgba(255,255,255,0.06)"
455
+ : "1px solid rgba(0,0,0,0.05)",
456
+ padding: "0.85rem 1.25rem",
457
+ background: "transparent",
458
+ boxShadow: "none",
459
+ display: "flex",
460
+ alignItems: "center",
461
+ justifyContent: "space-between",
462
+ gap: "1rem",
463
+ flexWrap: "wrap"
464
+ },
465
+ ".bp-admin__topbar-main": {
466
+ display: "flex",
467
+ alignItems: "center",
468
+ gap: "0.8rem",
469
+ flexWrap: "wrap"
470
+ },
471
+ ".bp-admin__topbar-context": {
472
+ display: "grid",
473
+ gap: "0.15rem",
474
+ minWidth: 0
475
+ },
476
+ ".bp-admin__topbar-label": {
477
+ color: "var(--bp-text-soft)",
478
+ textTransform: "uppercase",
479
+ letterSpacing: "0.12em",
480
+ fontSize: "0.68rem",
481
+ fontWeight: 600
482
+ },
483
+ ".bp-admin__topbar-title": {
484
+ fontSize: "clamp(1.05rem, 1.8vw, 1.35rem)",
485
+ fontWeight: 700,
486
+ letterSpacing: 0,
487
+ lineHeight: 1.1
488
+ },
489
+ ".bp-admin__profile-shell": {
490
+ display: "flex",
491
+ flexDirection: "row",
492
+ alignItems: "center",
493
+ gap: "0.75rem",
494
+ minWidth: 180
495
+ },
496
+ ".bp-admin__profile-shell > [data-bp-fragment]": {
497
+ display: "inline-flex",
498
+ alignItems: "center"
499
+ },
500
+ ".bp-admin__title": {
501
+ margin: 0,
502
+ fontSize: "clamp(1.3rem, 2.4vw, 1.85rem)",
503
+ lineHeight: 1.05,
504
+ fontWeight: 700,
505
+ letterSpacing: "-0.04em"
506
+ },
507
+ ".bp-admin__breadcrumb": {
508
+ marginBottom: "0.3rem",
509
+ color: "var(--bp-text-soft)",
510
+ textTransform: "uppercase",
511
+ letterSpacing: "0.12em",
512
+ fontSize: "0.68rem",
513
+ fontWeight: 600
514
+ },
515
+ ".bp-admin__breadcrumb:empty": {
516
+ display: "none"
517
+ },
518
+ /* -- Content: inside glass card, fills remaining height -- */
519
+ ".bp-admin__content-frame": {
520
+ position: "relative",
521
+ overflow: "hidden",
522
+ borderRadius: 0,
523
+ border: "none",
524
+ background: "transparent",
525
+ boxShadow: "none",
526
+ minHeight: 0
527
+ },
528
+ ".bp-admin__content-frame.is-loading .bp-admin__content-overlay": {
529
+ opacity: 1,
530
+ pointerEvents: "auto"
531
+ },
532
+ ".bp-admin__content-head": {
533
+ display: "none"
534
+ },
535
+ ".bp-admin__content-status": {
536
+ position: "relative",
537
+ zIndex: 1,
538
+ padding: "0.75rem 1.25rem 0"
539
+ },
540
+ ".bp-admin__error": {
541
+ display: "none"
542
+ },
543
+ ".bp-admin__error.is-visible": {
544
+ display: "block"
545
+ },
546
+ ".bp-admin__content-overlay": {
547
+ position: "absolute",
548
+ inset: 0,
549
+ zIndex: 2,
550
+ display: "grid",
551
+ placeItems: "center",
552
+ background: mode === "dark"
553
+ ? "rgba(50,50,52,0.60)"
554
+ : "rgba(255,255,255,0.55)",
555
+ backdropFilter: "blur(16px)",
556
+ "-webkit-backdrop-filter": "blur(16px)",
557
+ opacity: 0,
558
+ pointerEvents: "none",
559
+ transition: "opacity 180ms ease"
560
+ },
561
+ ".bp-admin__content-overlay-card": {
562
+ display: "inline-flex",
563
+ alignItems: "center",
564
+ gap: "0.75rem",
565
+ padding: "0.85rem 1.1rem",
566
+ borderRadius: "1rem",
567
+ border: mode === "dark"
568
+ ? "1px solid rgba(255,255,255,0.08)"
569
+ : "1px solid rgba(0,0,0,0.06)",
570
+ background: mode === "dark"
571
+ ? "rgba(50,50,52,0.80)"
572
+ : "rgba(255,255,255,0.80)",
573
+ backdropFilter: "blur(12px)",
574
+ "-webkit-backdrop-filter": "blur(12px)",
575
+ boxShadow: "var(--bp-shadow-soft)",
576
+ color: "var(--bp-text-soft)",
577
+ fontWeight: 600
578
+ },
579
+ ".bp-shell__main": {
580
+ minHeight: 0,
581
+ position: "relative",
582
+ zIndex: 1,
583
+ padding: "0.85rem 1.25rem 1.25rem"
584
+ },
585
+ ".bp-shell__main--auth": {
586
+ width: "100%",
587
+ maxWidth: 520,
588
+ padding: 0
589
+ },
590
+ ".bp-shell__loading": {
591
+ minHeight: 320,
592
+ display: "flex",
593
+ flexDirection: "column",
594
+ alignItems: "center",
595
+ justifyContent: "center",
596
+ gap: "0.75rem",
597
+ color: "var(--bp-text-soft)"
598
+ },
599
+ ".bp-shell__empty-state": {
600
+ minHeight: 320,
601
+ display: "grid",
602
+ placeItems: "center"
603
+ },
604
+ ".bp-shell__empty-card": {
605
+ maxWidth: 420,
606
+ padding: "1.5rem",
607
+ borderRadius: "1.25rem",
608
+ border: mode === "dark"
609
+ ? "1px solid rgba(255,255,255,0.06)"
610
+ : "1px solid rgba(0,0,0,0.04)",
611
+ background: mode === "dark"
612
+ ? "rgba(50,50,52,0.60)"
613
+ : "rgba(255,255,255,0.60)",
614
+ textAlign: "center",
615
+ backdropFilter: "blur(12px)",
616
+ "-webkit-backdrop-filter": "blur(12px)"
617
+ },
618
+ ".bp-shell__empty-title": {
619
+ fontSize: "1.1rem",
620
+ fontWeight: 700,
621
+ letterSpacing: "-0.02em"
622
+ },
623
+ ".bp-shell__empty-copy": {
624
+ marginTop: "0.45rem",
625
+ color: "var(--bp-text-soft)",
626
+ lineHeight: 1.6
627
+ },
628
+ ".bp-shell__empty-actions": {
629
+ marginTop: "1rem",
630
+ display: "flex",
631
+ justifyContent: "center"
632
+ },
633
+ /* -- Mobile menu -- */
634
+ ".bp-admin__mobile-menu": {
635
+ background: mode === "dark"
636
+ ? "rgba(44,44,46,0.92)"
637
+ : "rgba(255,255,255,0.88)",
638
+ backdropFilter: "blur(20px)",
639
+ "-webkit-backdrop-filter": "blur(20px)",
640
+ color: "var(--bp-text)",
641
+ boxShadow: "var(--bp-shadow)",
642
+ border: "none"
643
+ },
644
+ ".bp-admin__mobile-menu .offcanvas-header": {
645
+ borderBottom: mode === "dark"
646
+ ? "1px solid rgba(255,255,255,0.06)"
647
+ : "1px solid rgba(0,0,0,0.06)"
648
+ },
649
+ ".bp-admin__mobile-menu .offcanvas-body": {
650
+ display: "grid",
651
+ gap: "1rem",
652
+ alignContent: "start"
653
+ },
654
+ /*
655
+ Bootstrap Component Defaults (glass neumorphic)
656
+ Scoped to content area so services/plugins
657
+ use vanilla Bootstrap and get styled automatically
658
+ */
659
+ /* -- Cards -- */
660
+ ".bp-shell__main .card": {
661
+ border: "none",
662
+ borderRadius: "1rem",
663
+ background: mode === "dark"
664
+ ? "rgba(255,255,255,0.04)"
665
+ : "rgba(255,255,255,0.55)",
666
+ backdropFilter: "blur(8px)",
667
+ "-webkit-backdrop-filter": "blur(8px)",
668
+ boxShadow: mode === "dark"
669
+ ? "0 2px 12px rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.04)"
670
+ : "0 2px 12px rgba(0,0,0,0.04), inset 0 1px 0 rgba(255,255,255,0.6)",
671
+ color: "var(--bp-text)",
672
+ transition: "box-shadow 180ms ease, transform 180ms ease"
673
+ },
674
+ ".bp-shell__main .card:hover": {
675
+ boxShadow: mode === "dark"
676
+ ? "0 4px 20px rgba(0,0,0,0.28), inset 0 1px 0 rgba(255,255,255,0.05)"
677
+ : "0 4px 20px rgba(0,0,0,0.07), inset 0 1px 0 rgba(255,255,255,0.7)"
678
+ },
679
+ ".bp-shell__main .card-header": {
680
+ background: "transparent",
681
+ borderBottom: mode === "dark"
682
+ ? "1px solid rgba(255,255,255,0.06)"
683
+ : "1px solid rgba(0,0,0,0.05)",
684
+ fontWeight: 600
685
+ },
686
+ ".bp-shell__main .card-footer": {
687
+ background: "transparent",
688
+ borderTop: mode === "dark"
689
+ ? "1px solid rgba(255,255,255,0.06)"
690
+ : "1px solid rgba(0,0,0,0.05)"
691
+ },
692
+ /* -- Buttons -- */
693
+ /* Neumorphic feel: inner glow, soft shadow, no heavy transparency */
694
+ ".bp-shell__main .btn": {
695
+ borderRadius: "0.6rem",
696
+ fontWeight: 600,
697
+ fontSize: "0.88rem",
698
+ letterSpacing: "-0.01em",
699
+ transition: "all 160ms ease",
700
+ border: "none"
701
+ },
702
+ ".bp-shell__main .btn:active": {
703
+ transform: "translateY(0.5px)",
704
+ boxShadow: "var(--bp-shadow-inset-soft)"
705
+ },
706
+ ".bp-shell__main .btn:disabled, .bp-shell__main .btn.disabled": {
707
+ opacity: 0.45,
708
+ transform: "none",
709
+ boxShadow: "none",
710
+ pointerEvents: "none"
711
+ },
712
+ /* -- Primary: opaque accent + inner glow -- */
713
+ ".bp-shell__main .btn-primary": {
714
+ background: "var(--bp-accent)",
715
+ color: "#ffffff",
716
+ boxShadow: mode === "dark"
717
+ ? "0 2px 10px color-mix(in srgb, var(--bp-accent) 25%, transparent), inset 0 1px 0 rgba(255,255,255,0.15)"
718
+ : "0 2px 10px color-mix(in srgb, var(--bp-accent) 18%, transparent), inset 0 1px 0 rgba(255,255,255,0.25)"
719
+ },
720
+ ".bp-shell__main .btn-primary:hover": {
721
+ boxShadow: mode === "dark"
722
+ ? "0 4px 18px color-mix(in srgb, var(--bp-accent) 35%, transparent), inset 0 1px 0 rgba(255,255,255,0.20)"
723
+ : "0 4px 18px color-mix(in srgb, var(--bp-accent) 25%, transparent), inset 0 1px 0 rgba(255,255,255,0.30)",
724
+ transform: "translateY(-1px)"
725
+ },
726
+ /* -- Secondary: soft neutral surface -- */
727
+ ".bp-shell__main .btn-secondary": {
728
+ background: mode === "dark"
729
+ ? "rgba(255,255,255,0.10)"
730
+ : "rgba(0,0,0,0.06)",
731
+ color: "var(--bp-text)",
732
+ boxShadow: mode === "dark"
733
+ ? "0 1px 6px rgba(0,0,0,0.18), inset 0 1px 0 rgba(255,255,255,0.06)"
734
+ : "0 1px 6px rgba(0,0,0,0.04), inset 0 1px 0 rgba(255,255,255,0.5)"
735
+ },
736
+ ".bp-shell__main .btn-secondary:hover": {
737
+ background: mode === "dark"
738
+ ? "rgba(255,255,255,0.15)"
739
+ : "rgba(0,0,0,0.09)",
740
+ boxShadow: mode === "dark"
741
+ ? "0 3px 12px rgba(0,0,0,0.24), inset 0 1px 0 rgba(255,255,255,0.08)"
742
+ : "0 3px 12px rgba(0,0,0,0.06), inset 0 1px 0 rgba(255,255,255,0.6)",
743
+ transform: "translateY(-1px)"
744
+ },
745
+ /* -- Success -- */
746
+ ".bp-shell__main .btn-success": {
747
+ background: "var(--bp-accent-success)",
748
+ color: "#ffffff",
749
+ boxShadow: mode === "dark"
750
+ ? "0 2px 10px rgba(48,209,88,0.22), inset 0 1px 0 rgba(255,255,255,0.15)"
751
+ : "0 2px 10px rgba(48,209,88,0.15), inset 0 1px 0 rgba(255,255,255,0.25)"
752
+ },
753
+ ".bp-shell__main .btn-success:hover": {
754
+ boxShadow: mode === "dark"
755
+ ? "0 4px 18px rgba(48,209,88,0.32), inset 0 1px 0 rgba(255,255,255,0.20)"
756
+ : "0 4px 18px rgba(48,209,88,0.22), inset 0 1px 0 rgba(255,255,255,0.30)",
757
+ transform: "translateY(-1px)"
758
+ },
759
+ /* -- Danger -- */
760
+ ".bp-shell__main .btn-danger": {
761
+ background: "var(--bp-accent-danger)",
762
+ color: "#ffffff",
763
+ boxShadow: mode === "dark"
764
+ ? "0 2px 10px rgba(255,69,58,0.22), inset 0 1px 0 rgba(255,255,255,0.15)"
765
+ : "0 2px 10px rgba(255,69,58,0.15), inset 0 1px 0 rgba(255,255,255,0.25)"
766
+ },
767
+ ".bp-shell__main .btn-danger:hover": {
768
+ boxShadow: mode === "dark"
769
+ ? "0 4px 18px rgba(255,69,58,0.32), inset 0 1px 0 rgba(255,255,255,0.20)"
770
+ : "0 4px 18px rgba(255,69,58,0.22), inset 0 1px 0 rgba(255,255,255,0.30)",
771
+ transform: "translateY(-1px)"
772
+ },
773
+ /* -- Warning -- */
774
+ ".bp-shell__main .btn-warning": {
775
+ background: "var(--bp-accent-warning)",
776
+ color: "#1a1a1c",
777
+ boxShadow: mode === "dark"
778
+ ? "0 2px 10px rgba(255,214,10,0.18), inset 0 1px 0 rgba(255,255,255,0.15)"
779
+ : "0 2px 10px rgba(255,214,10,0.12), inset 0 1px 0 rgba(255,255,255,0.30)"
780
+ },
781
+ ".bp-shell__main .btn-warning:hover": {
782
+ boxShadow: mode === "dark"
783
+ ? "0 4px 18px rgba(255,214,10,0.28), inset 0 1px 0 rgba(255,255,255,0.20)"
784
+ : "0 4px 18px rgba(255,214,10,0.18), inset 0 1px 0 rgba(255,255,255,0.35)",
785
+ transform: "translateY(-1px)"
786
+ },
787
+ /* -- Info -- */
788
+ ".bp-shell__main .btn-info": {
789
+ background: "var(--bp-accent-info)",
790
+ color: "#ffffff",
791
+ boxShadow: mode === "dark"
792
+ ? "0 2px 10px rgba(100,210,255,0.18), inset 0 1px 0 rgba(255,255,255,0.15)"
793
+ : "0 2px 10px rgba(100,210,255,0.12), inset 0 1px 0 rgba(255,255,255,0.25)"
794
+ },
795
+ ".bp-shell__main .btn-info:hover": {
796
+ boxShadow: mode === "dark"
797
+ ? "0 4px 18px rgba(100,210,255,0.28), inset 0 1px 0 rgba(255,255,255,0.20)"
798
+ : "0 4px 18px rgba(100,210,255,0.18), inset 0 1px 0 rgba(255,255,255,0.30)",
799
+ transform: "translateY(-1px)"
800
+ },
801
+ /* -- Light: soft raised surface -- */
802
+ ".bp-shell__main .btn-light": {
803
+ background: mode === "dark"
804
+ ? "rgba(255,255,255,0.10)"
805
+ : "rgba(255,255,255,0.75)",
806
+ color: "var(--bp-text)",
807
+ boxShadow: mode === "dark"
808
+ ? "0 1px 6px rgba(0,0,0,0.18), inset 0 1px 0 rgba(255,255,255,0.06)"
809
+ : "0 1px 6px rgba(0,0,0,0.03), inset 0 1px 0 rgba(255,255,255,0.7)"
810
+ },
811
+ ".bp-shell__main .btn-light:hover": {
812
+ background: mode === "dark"
813
+ ? "rgba(255,255,255,0.14)"
814
+ : "rgba(255,255,255,0.90)",
815
+ boxShadow: mode === "dark"
816
+ ? "0 3px 12px rgba(0,0,0,0.22), inset 0 1px 0 rgba(255,255,255,0.08)"
817
+ : "0 3px 12px rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8)",
818
+ transform: "translateY(-1px)"
819
+ },
820
+ /* -- Dark: high-contrast inverted -- */
821
+ ".bp-shell__main .btn-dark": {
822
+ background: mode === "dark"
823
+ ? "rgba(255,255,255,0.85)"
824
+ : "rgba(0,0,0,0.82)",
825
+ color: mode === "dark" ? "#1a1a1c" : "#ffffff",
826
+ boxShadow: mode === "dark"
827
+ ? "0 2px 10px rgba(0,0,0,0.15), inset 0 1px 0 rgba(255,255,255,0.10)"
828
+ : "0 2px 10px rgba(0,0,0,0.12), inset 0 -1px 0 rgba(255,255,255,0.06)"
829
+ },
830
+ ".bp-shell__main .btn-dark:hover": {
831
+ background: mode === "dark"
832
+ ? "rgba(255,255,255,0.92)"
833
+ : "rgba(0,0,0,0.90)",
834
+ boxShadow: mode === "dark"
835
+ ? "0 4px 18px rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.15)"
836
+ : "0 4px 18px rgba(0,0,0,0.18), inset 0 -1px 0 rgba(255,255,255,0.08)",
837
+ transform: "translateY(-1px)"
838
+ },
839
+ /* -- Outline variants: frosted glass shell, color text -- */
840
+ ".bp-shell__main .btn-outline-primary": {
841
+ color: "var(--bp-accent)",
842
+ background: mode === "dark"
843
+ ? "rgba(255,255,255,0.03)"
844
+ : "rgba(255,255,255,0.45)",
845
+ border: mode === "dark"
846
+ ? "1px solid rgba(255,255,255,0.08)"
847
+ : "1px solid rgba(0,0,0,0.06)",
848
+ boxShadow: mode === "dark"
849
+ ? "0 1px 4px rgba(0,0,0,0.12), inset 0 1px 0 rgba(255,255,255,0.04)"
850
+ : "0 1px 4px rgba(0,0,0,0.03), inset 0 1px 0 rgba(255,255,255,0.5)"
851
+ },
852
+ ".bp-shell__main .btn-outline-primary:hover": {
853
+ background: mode === "dark"
854
+ ? "color-mix(in srgb, var(--bp-accent) 20%, transparent)"
855
+ : "color-mix(in srgb, var(--bp-accent) 12%, transparent)",
856
+ borderColor: "color-mix(in srgb, var(--bp-accent) 40%, transparent)",
857
+ color: "var(--bp-accent)",
858
+ boxShadow: mode === "dark"
859
+ ? "0 3px 14px color-mix(in srgb, var(--bp-accent) 18%, transparent), inset 0 1px 0 rgba(255,255,255,0.06)"
860
+ : "0 3px 14px color-mix(in srgb, var(--bp-accent) 12%, transparent), inset 0 1px 0 rgba(255,255,255,0.5)",
861
+ transform: "translateY(-1px)"
862
+ },
863
+ ".bp-shell__main .btn-outline-secondary": {
864
+ color: "var(--bp-text-soft)",
865
+ background: mode === "dark"
866
+ ? "rgba(255,255,255,0.03)"
867
+ : "rgba(255,255,255,0.45)",
868
+ border: mode === "dark"
869
+ ? "1px solid rgba(255,255,255,0.08)"
870
+ : "1px solid rgba(0,0,0,0.06)",
871
+ boxShadow: mode === "dark"
872
+ ? "0 1px 4px rgba(0,0,0,0.12), inset 0 1px 0 rgba(255,255,255,0.04)"
873
+ : "0 1px 4px rgba(0,0,0,0.03), inset 0 1px 0 rgba(255,255,255,0.5)"
874
+ },
875
+ ".bp-shell__main .btn-outline-secondary:hover": {
876
+ background: mode === "dark"
877
+ ? "rgba(255,255,255,0.08)"
878
+ : "rgba(0,0,0,0.04)",
879
+ borderColor: mode === "dark"
880
+ ? "rgba(255,255,255,0.12)"
881
+ : "rgba(0,0,0,0.08)",
882
+ color: "var(--bp-text)",
883
+ boxShadow: mode === "dark"
884
+ ? "0 3px 12px rgba(0,0,0,0.18), inset 0 1px 0 rgba(255,255,255,0.06)"
885
+ : "0 3px 12px rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.55)",
886
+ transform: "translateY(-1px)"
887
+ },
888
+ ".bp-shell__main .btn-outline-success": {
889
+ color: "var(--bp-accent-success)",
890
+ background: mode === "dark"
891
+ ? "rgba(255,255,255,0.03)"
892
+ : "rgba(255,255,255,0.45)",
893
+ border: mode === "dark"
894
+ ? "1px solid rgba(255,255,255,0.08)"
895
+ : "1px solid rgba(0,0,0,0.06)",
896
+ boxShadow: mode === "dark"
897
+ ? "0 1px 4px rgba(0,0,0,0.12), inset 0 1px 0 rgba(255,255,255,0.04)"
898
+ : "0 1px 4px rgba(0,0,0,0.03), inset 0 1px 0 rgba(255,255,255,0.5)"
899
+ },
900
+ ".bp-shell__main .btn-outline-success:hover": {
901
+ background: mode === "dark"
902
+ ? "rgba(48,209,88,0.15)"
903
+ : "rgba(48,209,88,0.08)",
904
+ borderColor: mode === "dark"
905
+ ? "rgba(48,209,88,0.30)"
906
+ : "rgba(48,209,88,0.25)",
907
+ color: "var(--bp-accent-success)",
908
+ boxShadow: mode === "dark"
909
+ ? "0 3px 14px rgba(48,209,88,0.15), inset 0 1px 0 rgba(255,255,255,0.06)"
910
+ : "0 3px 14px rgba(48,209,88,0.10), inset 0 1px 0 rgba(255,255,255,0.5)",
911
+ transform: "translateY(-1px)"
912
+ },
913
+ ".bp-shell__main .btn-outline-danger": {
914
+ color: "var(--bp-accent-danger)",
915
+ background: mode === "dark"
916
+ ? "rgba(255,255,255,0.03)"
917
+ : "rgba(255,255,255,0.45)",
918
+ border: mode === "dark"
919
+ ? "1px solid rgba(255,255,255,0.08)"
920
+ : "1px solid rgba(0,0,0,0.06)",
921
+ boxShadow: mode === "dark"
922
+ ? "0 1px 4px rgba(0,0,0,0.12), inset 0 1px 0 rgba(255,255,255,0.04)"
923
+ : "0 1px 4px rgba(0,0,0,0.03), inset 0 1px 0 rgba(255,255,255,0.5)"
924
+ },
925
+ ".bp-shell__main .btn-outline-danger:hover": {
926
+ background: mode === "dark"
927
+ ? "rgba(255,69,58,0.15)"
928
+ : "rgba(255,69,58,0.08)",
929
+ borderColor: mode === "dark"
930
+ ? "rgba(255,69,58,0.30)"
931
+ : "rgba(255,69,58,0.25)",
932
+ color: "var(--bp-accent-danger)",
933
+ boxShadow: mode === "dark"
934
+ ? "0 3px 14px rgba(255,69,58,0.15), inset 0 1px 0 rgba(255,255,255,0.06)"
935
+ : "0 3px 14px rgba(255,69,58,0.10), inset 0 1px 0 rgba(255,255,255,0.5)",
936
+ transform: "translateY(-1px)"
937
+ },
938
+ ".bp-shell__main .btn-outline-warning": {
939
+ color: mode === "dark" ? "var(--bp-accent-warning)" : "#7a6400",
940
+ background: mode === "dark"
941
+ ? "rgba(255,255,255,0.03)"
942
+ : "rgba(255,255,255,0.45)",
943
+ border: mode === "dark"
944
+ ? "1px solid rgba(255,255,255,0.08)"
945
+ : "1px solid rgba(0,0,0,0.06)",
946
+ boxShadow: mode === "dark"
947
+ ? "0 1px 4px rgba(0,0,0,0.12), inset 0 1px 0 rgba(255,255,255,0.04)"
948
+ : "0 1px 4px rgba(0,0,0,0.03), inset 0 1px 0 rgba(255,255,255,0.5)"
949
+ },
950
+ ".bp-shell__main .btn-outline-warning:hover": {
951
+ background: mode === "dark"
952
+ ? "rgba(255,214,10,0.15)"
953
+ : "rgba(255,214,10,0.10)",
954
+ borderColor: mode === "dark"
955
+ ? "rgba(255,214,10,0.30)"
956
+ : "rgba(255,214,10,0.25)",
957
+ boxShadow: mode === "dark"
958
+ ? "0 3px 14px rgba(255,214,10,0.12), inset 0 1px 0 rgba(255,255,255,0.06)"
959
+ : "0 3px 14px rgba(255,214,10,0.08), inset 0 1px 0 rgba(255,255,255,0.5)",
960
+ transform: "translateY(-1px)"
961
+ },
962
+ ".bp-shell__main .btn-outline-info": {
963
+ color: "var(--bp-accent-info)",
964
+ background: mode === "dark"
965
+ ? "rgba(255,255,255,0.03)"
966
+ : "rgba(255,255,255,0.45)",
967
+ border: mode === "dark"
968
+ ? "1px solid rgba(255,255,255,0.08)"
969
+ : "1px solid rgba(0,0,0,0.06)",
970
+ boxShadow: mode === "dark"
971
+ ? "0 1px 4px rgba(0,0,0,0.12), inset 0 1px 0 rgba(255,255,255,0.04)"
972
+ : "0 1px 4px rgba(0,0,0,0.03), inset 0 1px 0 rgba(255,255,255,0.5)"
973
+ },
974
+ ".bp-shell__main .btn-outline-info:hover": {
975
+ background: mode === "dark"
976
+ ? "rgba(100,210,255,0.15)"
977
+ : "rgba(100,210,255,0.08)",
978
+ borderColor: mode === "dark"
979
+ ? "rgba(100,210,255,0.30)"
980
+ : "rgba(100,210,255,0.25)",
981
+ color: "var(--bp-accent-info)",
982
+ boxShadow: mode === "dark"
983
+ ? "0 3px 14px rgba(100,210,255,0.12), inset 0 1px 0 rgba(255,255,255,0.06)"
984
+ : "0 3px 14px rgba(100,210,255,0.10), inset 0 1px 0 rgba(255,255,255,0.5)",
985
+ transform: "translateY(-1px)"
986
+ },
987
+ ".bp-shell__main .btn-outline-dark": {
988
+ color: "var(--bp-text)",
989
+ background: mode === "dark"
990
+ ? "rgba(255,255,255,0.03)"
991
+ : "rgba(255,255,255,0.45)",
992
+ border: mode === "dark"
993
+ ? "1px solid rgba(255,255,255,0.12)"
994
+ : "1px solid rgba(0,0,0,0.10)",
995
+ boxShadow: mode === "dark"
996
+ ? "0 1px 4px rgba(0,0,0,0.12), inset 0 1px 0 rgba(255,255,255,0.04)"
997
+ : "0 1px 4px rgba(0,0,0,0.03), inset 0 1px 0 rgba(255,255,255,0.5)"
998
+ },
999
+ ".bp-shell__main .btn-outline-dark:hover": {
1000
+ background: mode === "dark"
1001
+ ? "rgba(255,255,255,0.10)"
1002
+ : "rgba(0,0,0,0.06)",
1003
+ borderColor: mode === "dark"
1004
+ ? "rgba(255,255,255,0.18)"
1005
+ : "rgba(0,0,0,0.14)",
1006
+ boxShadow: mode === "dark"
1007
+ ? "0 3px 12px rgba(0,0,0,0.18), inset 0 1px 0 rgba(255,255,255,0.06)"
1008
+ : "0 3px 12px rgba(0,0,0,0.06), inset 0 1px 0 rgba(255,255,255,0.55)",
1009
+ transform: "translateY(-1px)"
1010
+ },
1011
+ ".bp-shell__main .btn-outline-light": {
1012
+ color: "var(--bp-text)",
1013
+ background: "transparent",
1014
+ border: mode === "dark"
1015
+ ? "1px solid rgba(255,255,255,0.08)"
1016
+ : "1px solid rgba(0,0,0,0.06)",
1017
+ boxShadow: mode === "dark"
1018
+ ? "inset 0 1px 0 rgba(255,255,255,0.04)"
1019
+ : "inset 0 1px 0 rgba(255,255,255,0.5)"
1020
+ },
1021
+ ".bp-shell__main .btn-outline-light:hover": {
1022
+ background: mode === "dark"
1023
+ ? "rgba(255,255,255,0.06)"
1024
+ : "rgba(255,255,255,0.55)",
1025
+ boxShadow: mode === "dark"
1026
+ ? "0 2px 8px rgba(0,0,0,0.14), inset 0 1px 0 rgba(255,255,255,0.06)"
1027
+ : "0 2px 8px rgba(0,0,0,0.03), inset 0 1px 0 rgba(255,255,255,0.6)",
1028
+ transform: "translateY(-1px)"
1029
+ },
1030
+ /* -- Tables -- */
1031
+ ".bp-shell__main .table": {
1032
+ "--bs-table-bg": "transparent",
1033
+ "--bs-table-hover-bg": mode === "dark"
1034
+ ? "rgba(255,255,255,0.03)"
1035
+ : "rgba(0,0,0,0.015)",
1036
+ color: "var(--bp-text)",
1037
+ fontSize: "0.88rem"
1038
+ },
1039
+ ".bp-shell__main .table th": {
1040
+ fontWeight: 600,
1041
+ fontSize: "0.78rem",
1042
+ letterSpacing: "0.02em",
1043
+ textTransform: "uppercase",
1044
+ color: "var(--bp-text-soft)",
1045
+ borderBottomWidth: "1px",
1046
+ borderColor: mode === "dark"
1047
+ ? "rgba(255,255,255,0.06)"
1048
+ : "rgba(0,0,0,0.06)"
1049
+ },
1050
+ ".bp-shell__main .table td": {
1051
+ borderColor: mode === "dark"
1052
+ ? "rgba(255,255,255,0.04)"
1053
+ : "rgba(0,0,0,0.04)",
1054
+ verticalAlign: "middle"
1055
+ },
1056
+ /* -- Badges -- */
1057
+ ".bp-shell__main .badge": {
1058
+ fontWeight: 600,
1059
+ fontSize: "0.74rem",
1060
+ letterSpacing: "0.01em",
1061
+ borderRadius: "0.45rem",
1062
+ padding: "0.35em 0.65em"
1063
+ },
1064
+ ".bp-shell__main .badge.text-bg-light": {
1065
+ background: mode === "dark"
1066
+ ? "rgba(255,255,255,0.08) !important"
1067
+ : "rgba(0,0,0,0.04) !important",
1068
+ color: "var(--bp-text) !important"
1069
+ },
1070
+ ".bp-shell__main .badge.rounded-pill": {
1071
+ borderRadius: "999px"
1072
+ },
1073
+ ".bp-shell__main .badge.text-bg-primary": {
1074
+ background: "var(--bp-accent) !important",
1075
+ color: "#ffffff !important"
1076
+ },
1077
+ ".bp-shell__main .badge.text-bg-secondary": {
1078
+ background: mode === "dark"
1079
+ ? "rgba(255,255,255,0.10) !important"
1080
+ : "rgba(0,0,0,0.06) !important",
1081
+ color: "var(--bp-text) !important"
1082
+ },
1083
+ ".bp-shell__main .badge.text-bg-success": {
1084
+ background: mode === "dark"
1085
+ ? "rgba(48,209,88,0.20) !important"
1086
+ : "rgba(48,209,88,0.12) !important",
1087
+ color: "var(--bp-accent-success) !important"
1088
+ },
1089
+ ".bp-shell__main .badge.text-bg-danger": {
1090
+ background: mode === "dark"
1091
+ ? "rgba(255,69,58,0.20) !important"
1092
+ : "rgba(255,69,58,0.12) !important",
1093
+ color: "var(--bp-accent-danger) !important"
1094
+ },
1095
+ ".bp-shell__main .badge.text-bg-warning": {
1096
+ background: mode === "dark"
1097
+ ? "rgba(255,214,10,0.20) !important"
1098
+ : "rgba(255,214,10,0.15) !important",
1099
+ color: mode === "dark" ? "#ffd60a !important" : "#7a6400 !important"
1100
+ },
1101
+ ".bp-shell__main .badge.text-bg-info": {
1102
+ background: mode === "dark"
1103
+ ? "rgba(100,210,255,0.18) !important"
1104
+ : "rgba(100,210,255,0.12) !important",
1105
+ color: mode === "dark" ? "#64d2ff !important" : "#0077b6 !important"
1106
+ },
1107
+ ".bp-shell__main .badge.text-bg-dark": {
1108
+ background: mode === "dark"
1109
+ ? "rgba(255,255,255,0.80) !important"
1110
+ : "rgba(0,0,0,0.80) !important",
1111
+ color: mode === "dark" ? "#1a1a1c !important" : "#ffffff !important"
1112
+ },
1113
+ /* -- Form controls -- */
1114
+ ".bp-shell__main .form-control, .bp-shell__main .form-select": {
1115
+ borderRadius: "0.6rem",
1116
+ border: mode === "dark"
1117
+ ? "1px solid rgba(255,255,255,0.1)"
1118
+ : "1px solid rgba(0,0,0,0.08)",
1119
+ background: mode === "dark"
1120
+ ? "rgba(255,255,255,0.04)"
1121
+ : "rgba(255,255,255,0.6)",
1122
+ color: "var(--bp-text)",
1123
+ fontSize: "0.9rem",
1124
+ transition: "border-color 160ms ease, box-shadow 160ms ease"
1125
+ },
1126
+ ".bp-shell__main .form-control:focus, .bp-shell__main .form-select:focus": {
1127
+ borderColor: "var(--bp-accent)",
1128
+ boxShadow: "0 0 0 3px var(--bp-accent-soft)",
1129
+ background: mode === "dark"
1130
+ ? "rgba(255,255,255,0.06)"
1131
+ : "rgba(255,255,255,0.85)"
1132
+ },
1133
+ ".bp-shell__main .form-control::placeholder": {
1134
+ color: "var(--bp-text-soft)",
1135
+ opacity: 0.6
1136
+ },
1137
+ ".bp-shell__main .form-label": {
1138
+ fontWeight: 600,
1139
+ fontSize: "0.84rem",
1140
+ marginBottom: "0.35rem",
1141
+ color: "var(--bp-text)"
1142
+ },
1143
+ ".bp-shell__main .form-text": {
1144
+ color: "var(--bp-text-soft)",
1145
+ fontSize: "0.78rem"
1146
+ },
1147
+ ".bp-shell__main .form-check-input": {
1148
+ borderColor: mode === "dark"
1149
+ ? "rgba(255,255,255,0.15)"
1150
+ : "rgba(0,0,0,0.12)"
1151
+ },
1152
+ ".bp-shell__main .form-check-input:checked": {
1153
+ backgroundColor: "var(--bp-accent)",
1154
+ borderColor: "var(--bp-accent)"
1155
+ },
1156
+ /* -- Alerts -- */
1157
+ ".bp-shell__main .alert": {
1158
+ borderRadius: "0.8rem",
1159
+ border: "none",
1160
+ backdropFilter: "blur(6px)",
1161
+ "-webkit-backdrop-filter": "blur(6px)",
1162
+ fontSize: "0.88rem"
1163
+ },
1164
+ ".bp-shell__main .alert-primary": {
1165
+ background: "color-mix(in srgb, var(--bp-accent) 12%, transparent)",
1166
+ color: "var(--bp-accent)"
1167
+ },
1168
+ ".bp-shell__main .alert-danger": {
1169
+ background: mode === "dark"
1170
+ ? "rgba(255,69,58,0.15)"
1171
+ : "rgba(255,69,58,0.08)",
1172
+ color: "var(--bp-accent-danger)"
1173
+ },
1174
+ ".bp-shell__main .alert-success": {
1175
+ background: mode === "dark"
1176
+ ? "rgba(48,209,88,0.15)"
1177
+ : "rgba(48,209,88,0.08)",
1178
+ color: "var(--bp-accent-success)"
1179
+ },
1180
+ ".bp-shell__main .alert-warning": {
1181
+ background: mode === "dark"
1182
+ ? "rgba(255,214,10,0.15)"
1183
+ : "rgba(255,214,10,0.10)",
1184
+ color: mode === "dark" ? "#ffd60a" : "#7a6400"
1185
+ },
1186
+ ".bp-shell__main .alert-info": {
1187
+ background: mode === "dark"
1188
+ ? "rgba(100,210,255,0.12)"
1189
+ : "rgba(100,210,255,0.08)",
1190
+ color: mode === "dark" ? "#64d2ff" : "#0077b6"
1191
+ },
1192
+ /* -- Dropdowns -- */
1193
+ ".bp-shell__main .dropdown-menu": {
1194
+ borderRadius: "0.8rem",
1195
+ border: mode === "dark"
1196
+ ? "1px solid rgba(255,255,255,0.08)"
1197
+ : "1px solid rgba(0,0,0,0.06)",
1198
+ background: mode === "dark"
1199
+ ? "rgba(50,50,52,0.88)"
1200
+ : "rgba(255,255,255,0.88)",
1201
+ backdropFilter: "blur(20px)",
1202
+ "-webkit-backdrop-filter": "blur(20px)",
1203
+ boxShadow: "0 8px 32px rgba(0,0,0,0.12)",
1204
+ padding: "0.4rem",
1205
+ fontSize: "0.88rem"
1206
+ },
1207
+ ".bp-shell__main .dropdown-item": {
1208
+ borderRadius: "0.45rem",
1209
+ padding: "0.45rem 0.75rem",
1210
+ color: "var(--bp-text)",
1211
+ transition: "background 120ms ease"
1212
+ },
1213
+ ".bp-shell__main .dropdown-item:hover, .bp-shell__main .dropdown-item:focus": {
1214
+ background: mode === "dark"
1215
+ ? "rgba(255,255,255,0.08)"
1216
+ : "rgba(0,0,0,0.04)",
1217
+ color: "var(--bp-text)"
1218
+ },
1219
+ ".bp-shell__main .dropdown-item.active, .bp-shell__main .dropdown-item:active": {
1220
+ background: "var(--bp-accent)",
1221
+ color: "#ffffff"
1222
+ },
1223
+ ".bp-shell__main .dropdown-divider": {
1224
+ borderColor: mode === "dark"
1225
+ ? "rgba(255,255,255,0.06)"
1226
+ : "rgba(0,0,0,0.05)",
1227
+ margin: "0.3rem 0"
1228
+ },
1229
+ /* -- List groups -- */
1230
+ ".bp-shell__main .list-group": {
1231
+ borderRadius: "0.8rem",
1232
+ overflow: "hidden"
1233
+ },
1234
+ ".bp-shell__main .list-group-item": {
1235
+ border: "none",
1236
+ borderBottom: mode === "dark"
1237
+ ? "1px solid rgba(255,255,255,0.04)"
1238
+ : "1px solid rgba(0,0,0,0.04)",
1239
+ background: "transparent",
1240
+ color: "var(--bp-text)",
1241
+ padding: "0.7rem 1rem",
1242
+ transition: "background 120ms ease"
1243
+ },
1244
+ ".bp-shell__main .list-group-item:last-child": {
1245
+ borderBottom: "none"
1246
+ },
1247
+ ".bp-shell__main .list-group-item-action:hover": {
1248
+ background: mode === "dark"
1249
+ ? "rgba(255,255,255,0.04)"
1250
+ : "rgba(0,0,0,0.02)"
1251
+ },
1252
+ ".bp-shell__main .list-group-item.active": {
1253
+ background: "var(--bp-accent-soft)",
1254
+ color: "var(--bp-accent)",
1255
+ fontWeight: 600
1256
+ },
1257
+ /* -- Navs & tabs -- */
1258
+ ".bp-shell__main .nav-tabs": {
1259
+ borderBottomColor: mode === "dark"
1260
+ ? "rgba(255,255,255,0.06)"
1261
+ : "rgba(0,0,0,0.06)"
1262
+ },
1263
+ ".bp-shell__main .nav-tabs .nav-link": {
1264
+ borderRadius: "0.5rem 0.5rem 0 0",
1265
+ color: "var(--bp-text-soft)",
1266
+ fontWeight: 600,
1267
+ fontSize: "0.88rem",
1268
+ border: "none",
1269
+ borderBottom: "2px solid transparent",
1270
+ transition: "all 160ms ease"
1271
+ },
1272
+ ".bp-shell__main .nav-tabs .nav-link:hover": {
1273
+ color: "var(--bp-text)",
1274
+ borderBottomColor: "var(--bp-border)"
1275
+ },
1276
+ ".bp-shell__main .nav-tabs .nav-link.active": {
1277
+ color: "var(--bp-accent)",
1278
+ background: "transparent",
1279
+ borderBottomColor: "var(--bp-accent)"
1280
+ },
1281
+ ".bp-shell__main .nav-pills .nav-link": {
1282
+ borderRadius: "0.6rem",
1283
+ color: "var(--bp-text-soft)",
1284
+ fontWeight: 600,
1285
+ fontSize: "0.88rem"
1286
+ },
1287
+ ".bp-shell__main .nav-pills .nav-link.active": {
1288
+ background: "var(--bp-accent)",
1289
+ color: "#ffffff"
1290
+ },
1291
+ /* -- Pagination -- */
1292
+ ".bp-shell__main .pagination": {
1293
+ gap: "0.2rem"
1294
+ },
1295
+ ".bp-shell__main .page-link": {
1296
+ borderRadius: "0.5rem",
1297
+ border: "none",
1298
+ background: mode === "dark"
1299
+ ? "rgba(255,255,255,0.04)"
1300
+ : "rgba(0,0,0,0.03)",
1301
+ color: "var(--bp-text-soft)",
1302
+ fontSize: "0.85rem",
1303
+ fontWeight: 600,
1304
+ padding: "0.4rem 0.7rem",
1305
+ transition: "all 140ms ease"
1306
+ },
1307
+ ".bp-shell__main .page-link:hover": {
1308
+ background: mode === "dark"
1309
+ ? "rgba(255,255,255,0.08)"
1310
+ : "rgba(0,0,0,0.06)",
1311
+ color: "var(--bp-text)"
1312
+ },
1313
+ ".bp-shell__main .page-item.active .page-link": {
1314
+ background: "var(--bp-accent)",
1315
+ color: "#ffffff"
1316
+ },
1317
+ /* -- Progress bars -- */
1318
+ ".bp-shell__main .progress": {
1319
+ borderRadius: "999px",
1320
+ background: mode === "dark"
1321
+ ? "rgba(255,255,255,0.06)"
1322
+ : "rgba(0,0,0,0.04)",
1323
+ height: "0.5rem",
1324
+ overflow: "hidden"
1325
+ },
1326
+ ".bp-shell__main .progress-bar": {
1327
+ borderRadius: "999px",
1328
+ background: "var(--bp-accent)"
1329
+ },
1330
+ /* -- Modals -- */
1331
+ ".modal-content": {
1332
+ borderRadius: "1.2rem",
1333
+ border: mode === "dark"
1334
+ ? "1px solid rgba(255,255,255,0.08)"
1335
+ : "1px solid rgba(0,0,0,0.06)",
1336
+ background: mode === "dark"
1337
+ ? "rgba(50,50,52,0.92)"
1338
+ : "rgba(255,255,255,0.92)",
1339
+ backdropFilter: "blur(24px)",
1340
+ "-webkit-backdrop-filter": "blur(24px)",
1341
+ boxShadow: "0 16px 48px rgba(0,0,0,0.16)"
1342
+ },
1343
+ ".modal-header": {
1344
+ borderBottom: mode === "dark"
1345
+ ? "1px solid rgba(255,255,255,0.06)"
1346
+ : "1px solid rgba(0,0,0,0.05)",
1347
+ padding: "1rem 1.25rem",
1348
+ color: "var(--bp-text)"
1349
+ },
1350
+ ".modal-header .btn-close": {
1351
+ filter: mode === "dark" ? "invert(1) grayscale(100%) brightness(200%)" : "none",
1352
+ opacity: 0.5
1353
+ },
1354
+ ".modal-header .btn-close:hover": {
1355
+ opacity: 1
1356
+ },
1357
+ ".modal-title": {
1358
+ fontWeight: 600,
1359
+ fontSize: "1rem",
1360
+ letterSpacing: "-0.01em"
1361
+ },
1362
+ ".modal-body": {
1363
+ color: "var(--bp-text)",
1364
+ fontSize: "0.9rem",
1365
+ padding: "1.25rem"
1366
+ },
1367
+ ".modal-footer": {
1368
+ borderTop: mode === "dark"
1369
+ ? "1px solid rgba(255,255,255,0.06)"
1370
+ : "1px solid rgba(0,0,0,0.05)",
1371
+ padding: "1rem 1.25rem"
1372
+ },
1373
+ ".modal-backdrop, .offcanvas-backdrop": {
1374
+ backgroundColor: mode === "dark" ? "rgba(0,0,0,0.62)" : "rgba(15,23,42,0.38)",
1375
+ backdropFilter: "blur(4px)",
1376
+ "-webkit-backdrop-filter": "blur(4px)"
1377
+ },
1378
+ /* -- Toasts -- */
1379
+ ".toast": {
1380
+ borderRadius: "0.8rem",
1381
+ border: mode === "dark"
1382
+ ? "1px solid rgba(255,255,255,0.06)"
1383
+ : "1px solid rgba(0,0,0,0.04)",
1384
+ background: mode === "dark"
1385
+ ? "rgba(50,50,52,0.90)"
1386
+ : "rgba(255,255,255,0.90)",
1387
+ backdropFilter: "blur(16px)",
1388
+ "-webkit-backdrop-filter": "blur(16px)",
1389
+ boxShadow: "0 8px 24px rgba(0,0,0,0.12)",
1390
+ color: "var(--bp-text)",
1391
+ fontSize: "0.88rem"
1392
+ },
1393
+ ".toast-header": {
1394
+ background: "transparent",
1395
+ borderBottom: mode === "dark"
1396
+ ? "1px solid rgba(255,255,255,0.06)"
1397
+ : "1px solid rgba(0,0,0,0.05)",
1398
+ color: "var(--bp-text)",
1399
+ fontWeight: 600,
1400
+ fontSize: "0.85rem",
1401
+ padding: "0.6rem 0.85rem"
1402
+ },
1403
+ ".toast-header .btn-close": {
1404
+ filter: mode === "dark" ? "invert(1) grayscale(100%) brightness(200%)" : "none",
1405
+ opacity: 0.5
1406
+ },
1407
+ ".toast-header .btn-close:hover": {
1408
+ opacity: 1
1409
+ },
1410
+ ".toast-header small, .toast-header .text-body-secondary": {
1411
+ color: "var(--bp-text-soft) !important"
1412
+ },
1413
+ ".toast-body": {
1414
+ padding: "0.6rem 0.85rem",
1415
+ color: "var(--bp-text-soft)"
1416
+ },
1417
+ /* -- Accordion -- */
1418
+ ".bp-shell__main .accordion": {
1419
+ "--bs-accordion-bg": "transparent",
1420
+ "--bs-accordion-border-color": mode === "dark"
1421
+ ? "rgba(255,255,255,0.06)"
1422
+ : "rgba(0,0,0,0.05)",
1423
+ "--bs-accordion-btn-bg": "transparent",
1424
+ "--bs-accordion-active-bg": mode === "dark"
1425
+ ? "rgba(255,255,255,0.03)"
1426
+ : "rgba(0,0,0,0.015)",
1427
+ "--bs-accordion-active-color": "var(--bp-text)",
1428
+ borderRadius: "0.8rem",
1429
+ overflow: "hidden"
1430
+ },
1431
+ ".bp-shell__main .accordion-button": {
1432
+ fontWeight: 600,
1433
+ fontSize: "0.9rem"
1434
+ },
1435
+ ".bp-shell__main .accordion-button:focus": {
1436
+ boxShadow: "none",
1437
+ borderColor: "var(--bp-accent)"
1438
+ },
1439
+ /* -- Offcanvas (content area) -- */
1440
+ ".bp-shell__main .offcanvas, .offcanvas": {
1441
+ background: mode === "dark"
1442
+ ? "rgba(44,44,46,0.92)"
1443
+ : "rgba(255,255,255,0.92)",
1444
+ backdropFilter: "blur(24px)",
1445
+ "-webkit-backdrop-filter": "blur(24px)",
1446
+ border: "none",
1447
+ boxShadow: "0 0 48px rgba(0,0,0,0.12)",
1448
+ display: "flex",
1449
+ flexDirection: "column"
1450
+ },
1451
+ ".offcanvas-header": {
1452
+ flexShrink: 0
1453
+ },
1454
+ ".offcanvas-body": {
1455
+ overflowY: "auto",
1456
+ flex: "1 1 auto",
1457
+ minHeight: 0
1458
+ },
1459
+ /* -- bp-sidebar (HTML-first sidebar wrapper) -- */
1460
+ "[data-bp-sidebar]": {
1461
+ display: "none"
1462
+ },
1463
+ "[data-bp-sidebar][data-bp-fallback]": {
1464
+ display: "block"
1465
+ },
1466
+ /* -- Tooltips -- */
1467
+ ".tooltip-inner": {
1468
+ borderRadius: "0.45rem",
1469
+ fontSize: "0.78rem",
1470
+ fontWeight: 500,
1471
+ padding: "0.35rem 0.65rem"
1472
+ },
1473
+ /* -- Popovers -- */
1474
+ ".popover": {
1475
+ borderRadius: "0.8rem",
1476
+ border: mode === "dark"
1477
+ ? "1px solid rgba(255,255,255,0.08)"
1478
+ : "1px solid rgba(0,0,0,0.06)",
1479
+ background: mode === "dark"
1480
+ ? "rgba(50,50,52,0.92)"
1481
+ : "rgba(255,255,255,0.92)",
1482
+ backdropFilter: "blur(20px)",
1483
+ "-webkit-backdrop-filter": "blur(20px)",
1484
+ boxShadow: "0 8px 32px rgba(0,0,0,0.12)",
1485
+ fontSize: "0.88rem"
1486
+ },
1487
+ ".popover-header": {
1488
+ background: "transparent",
1489
+ borderBottom: mode === "dark"
1490
+ ? "1px solid rgba(255,255,255,0.06)"
1491
+ : "1px solid rgba(0,0,0,0.05)",
1492
+ fontWeight: 600,
1493
+ fontSize: "0.88rem"
1494
+ },
1495
+ ".popover-body": {
1496
+ color: "var(--bp-text-soft)"
1497
+ },
1498
+ /* -- Input groups -- */
1499
+ ".bp-shell__main .input-group-text": {
1500
+ border: mode === "dark"
1501
+ ? "1px solid rgba(255,255,255,0.1)"
1502
+ : "1px solid rgba(0,0,0,0.08)",
1503
+ background: mode === "dark"
1504
+ ? "rgba(255,255,255,0.04)"
1505
+ : "rgba(0,0,0,0.02)",
1506
+ color: "var(--bp-text-soft)",
1507
+ fontSize: "0.88rem",
1508
+ borderRadius: "0.6rem"
1509
+ },
1510
+ /* -- Breadcrumbs -- */
1511
+ ".bp-shell__main .breadcrumb": {
1512
+ fontSize: "0.85rem",
1513
+ marginBottom: 0
1514
+ },
1515
+ ".bp-shell__main .breadcrumb-item a": {
1516
+ color: "var(--bp-accent)",
1517
+ textDecoration: "none"
1518
+ },
1519
+ ".bp-shell__main .breadcrumb-item a:hover": {
1520
+ textDecoration: "underline"
1521
+ },
1522
+ ".bp-shell__main .breadcrumb-item.active": {
1523
+ color: "var(--bp-text-soft)"
1524
+ },
1525
+ /* -- Kbd -- */
1526
+ ".bp-shell__main kbd": {
1527
+ background: mode === "dark"
1528
+ ? "rgba(255,255,255,0.08)"
1529
+ : "rgba(0,0,0,0.04)",
1530
+ color: "var(--bp-text)",
1531
+ border: mode === "dark"
1532
+ ? "1px solid rgba(255,255,255,0.1)"
1533
+ : "1px solid rgba(0,0,0,0.08)",
1534
+ borderRadius: "0.35rem",
1535
+ padding: "0.15rem 0.45rem",
1536
+ fontSize: "0.78rem",
1537
+ fontWeight: 600,
1538
+ boxShadow: mode === "dark"
1539
+ ? "0 1px 2px rgba(0,0,0,0.3)"
1540
+ : "0 1px 2px rgba(0,0,0,0.06)"
1541
+ },
1542
+ /* -- Split-pane detail panel -- */
1543
+ ".bp-split-pane": {
1544
+ display: "grid",
1545
+ gridTemplateColumns: "1fr",
1546
+ gap: "1rem",
1547
+ transition: "grid-template-columns 280ms ease",
1548
+ minHeight: 0
1549
+ },
1550
+ ".bp-split-pane[data-bp-detail-open='true']": {
1551
+ gridTemplateColumns: "1fr 380px"
1552
+ },
1553
+ ".bp-split-pane__content": {
1554
+ minWidth: 0,
1555
+ overflow: "hidden"
1556
+ },
1557
+ ".bp-split-pane__detail": {
1558
+ display: "none",
1559
+ overflow: "auto",
1560
+ borderRadius: "1rem",
1561
+ background: mode === "dark"
1562
+ ? "rgba(255,255,255,0.04)"
1563
+ : "rgba(255,255,255,0.55)",
1564
+ border: mode === "dark"
1565
+ ? "1px solid rgba(255,255,255,0.06)"
1566
+ : "1px solid rgba(0,0,0,0.04)",
1567
+ padding: "1rem",
1568
+ backdropFilter: "blur(8px)",
1569
+ "-webkit-backdrop-filter": "blur(8px)"
1570
+ },
1571
+ ".bp-split-pane[data-bp-detail-open='true'] .bp-split-pane__detail": {
1572
+ display: "block"
1573
+ },
1574
+ /* -- Misc utilities -- */
1575
+ ".bp-shell__main .text-body-secondary": {
1576
+ color: "var(--bp-text-soft) !important"
1577
+ },
1578
+ ".bp-shell__main .border": {
1579
+ borderColor: mode === "dark"
1580
+ ? "rgba(255,255,255,0.08) !important"
1581
+ : "rgba(0,0,0,0.06) !important"
1582
+ },
1583
+ ".bp-shell__main hr, .bp-shell__main .dropdown-divider": {
1584
+ borderColor: mode === "dark"
1585
+ ? "rgba(255,255,255,0.06)"
1586
+ : "rgba(0,0,0,0.05)"
1587
+ },
1588
+ ".bp-shell__main .shadow-sm": {
1589
+ boxShadow: mode === "dark"
1590
+ ? "0 2px 8px rgba(0,0,0,0.18) !important"
1591
+ : "0 2px 8px rgba(0,0,0,0.04) !important"
1592
+ },
1593
+ /* -- Close buttons -- */
1594
+ ".bp-shell__main .btn-close": {
1595
+ filter: mode === "dark" ? "invert(1) grayscale(100%) brightness(200%)" : "none",
1596
+ opacity: 0.5,
1597
+ transition: "opacity 140ms ease"
1598
+ },
1599
+ ".bp-shell__main .btn-close:hover": {
1600
+ opacity: 1
1601
+ },
1602
+ /* -- Form range -- */
1603
+ ".bp-shell__main .form-range::-webkit-slider-thumb": {
1604
+ background: "var(--bp-accent)",
1605
+ border: "none",
1606
+ boxShadow: "0 1px 4px color-mix(in srgb, var(--bp-accent) 30%, transparent)"
1607
+ },
1608
+ ".bp-shell__main .form-range::-moz-range-thumb": {
1609
+ background: "var(--bp-accent)",
1610
+ border: "none",
1611
+ boxShadow: "0 1px 4px color-mix(in srgb, var(--bp-accent) 30%, transparent)"
1612
+ },
1613
+ ".bp-shell__main .form-range::-webkit-slider-runnable-track": {
1614
+ background: mode === "dark"
1615
+ ? "rgba(255,255,255,0.08)"
1616
+ : "rgba(0,0,0,0.06)",
1617
+ borderRadius: "999px"
1618
+ },
1619
+ ".bp-shell__main .form-range::-moz-range-track": {
1620
+ background: mode === "dark"
1621
+ ? "rgba(255,255,255,0.08)"
1622
+ : "rgba(0,0,0,0.06)",
1623
+ borderRadius: "999px"
1624
+ },
1625
+ /* -- Placeholders / Skeletons -- */
1626
+ ".bp-shell__main .placeholder": {
1627
+ background: mode === "dark"
1628
+ ? "rgba(255,255,255,0.08)"
1629
+ : "rgba(0,0,0,0.06)",
1630
+ borderRadius: "0.35rem"
1631
+ },
1632
+ /* -- Spinner colors -- */
1633
+ ".bp-shell__main .spinner-border.text-primary, .bp-shell__main .spinner-grow.text-primary": {
1634
+ color: "var(--bp-accent) !important"
1635
+ },
1636
+ /* -- Mark / highlight -- */
1637
+ ".bp-shell__main mark": {
1638
+ background: mode === "dark"
1639
+ ? "rgba(255,214,10,0.20)"
1640
+ : "rgba(255,214,10,0.25)",
1641
+ color: "var(--bp-text)",
1642
+ borderRadius: "0.15rem",
1643
+ padding: "0.05em 0.25em"
1644
+ },
1645
+ /* -- Fragment loading overlay -- */
1646
+ ".bp-fragment-loading": {
1647
+ position: "relative",
1648
+ pointerEvents: "none"
1649
+ },
1650
+ ".bp-fragment-loading::after": {
1651
+ content: '""',
1652
+ position: "absolute",
1653
+ inset: 0,
1654
+ zIndex: 10,
1655
+ borderRadius: "inherit",
1656
+ background: mode === "dark"
1657
+ ? "rgba(44,44,46,0.55)"
1658
+ : "rgba(255,255,255,0.50)",
1659
+ backdropFilter: "blur(6px)",
1660
+ "-webkit-backdrop-filter": "blur(6px)",
1661
+ animation: "bp-skeleton-pulse 1.8s ease infinite"
1662
+ },
1663
+ ".bp-fragment-loading::before": {
1664
+ content: '""',
1665
+ position: "absolute",
1666
+ top: "50%",
1667
+ left: "50%",
1668
+ width: "1.25rem",
1669
+ height: "1.25rem",
1670
+ margin: "-0.625rem 0 0 -0.625rem",
1671
+ border: "2px solid var(--bp-accent)",
1672
+ borderTopColor: "transparent",
1673
+ borderRadius: "50%",
1674
+ zIndex: 11,
1675
+ animation: "bp-spinner 0.65s linear infinite"
1676
+ },
1677
+ /* -- Keyframes -- */
1678
+ "@keyframes bp-shimmer": {
1679
+ "0%": { transform: "translateX(-100%)" },
1680
+ "100%": { transform: "translateX(100%)" }
1681
+ },
1682
+ "@keyframes bp-progress-slide": {
1683
+ "0%": { transform: "translateX(-100%)", opacity: "0.6" },
1684
+ "50%": { opacity: "1" },
1685
+ "100%": { transform: "translateX(100%)", opacity: "0.6" }
1686
+ },
1687
+ "@keyframes bp-skeleton-pulse": {
1688
+ "0%, 100%": { opacity: "0.3" },
1689
+ "50%": { opacity: "0.7" }
1690
+ },
1691
+ "@keyframes bp-spinner": {
1692
+ "to": { transform: "rotate(360deg)" }
1693
+ },
1694
+ /* -- Nav loading: shimmer on clicked route -- */
1695
+ ".bp-admin__route.htmx-request": {
1696
+ position: "relative",
1697
+ overflow: "hidden",
1698
+ pointerEvents: "none"
1699
+ },
1700
+ ".bp-admin__route.htmx-request::after": {
1701
+ content: "\"\"",
1702
+ position: "absolute",
1703
+ inset: 0,
1704
+ background: "linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--bp-accent) 15%, transparent) 50%, transparent 100%)",
1705
+ animation: "bp-shimmer 1.4s ease infinite",
1706
+ borderRadius: "inherit",
1707
+ pointerEvents: "none"
1708
+ },
1709
+ ".bp-admin__route.active.htmx-request::after": {
1710
+ background: "linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--bp-accent) 12%, transparent) 50%, transparent 100%)"
1711
+ },
1712
+ /* -- Topbar progress bar -- */
1713
+ ".bp-admin__topbar-progress": {
1714
+ position: "absolute",
1715
+ bottom: 0,
1716
+ left: "1.5rem",
1717
+ right: "1.5rem",
1718
+ height: "2px",
1719
+ borderRadius: "2px",
1720
+ overflow: "hidden",
1721
+ opacity: 0,
1722
+ transition: "opacity 200ms ease"
1723
+ },
1724
+ ".bp-admin__topbar-progress.is-active": {
1725
+ opacity: 1
1726
+ },
1727
+ ".bp-admin__topbar-progress::after": {
1728
+ content: "\"\"",
1729
+ position: "absolute",
1730
+ inset: 0,
1731
+ background: "linear-gradient(90deg, transparent, var(--bp-accent), color-mix(in srgb, var(--bp-accent) 60%, var(--bp-accent-secondary)), transparent)",
1732
+ transform: "translateX(-100%)",
1733
+ borderRadius: "inherit"
1734
+ },
1735
+ ".bp-admin__topbar-progress.is-active::after": {
1736
+ animation: "bp-progress-slide 1.6s ease infinite"
1737
+ },
1738
+ /* -- Content skeleton loader -- */
1739
+ ".bp-shell__loading-skeleton": {
1740
+ display: "grid",
1741
+ gap: "0.75rem",
1742
+ padding: "0.5rem 0",
1743
+ maxWidth: 640
1744
+ },
1745
+ ".bp-shell__skeleton-heading": {
1746
+ height: "1.2rem",
1747
+ width: "45%",
1748
+ borderRadius: "0.5rem",
1749
+ background: mode === "dark"
1750
+ ? "rgba(255,255,255,0.06)"
1751
+ : "rgba(0,0,0,0.06)",
1752
+ animation: "bp-skeleton-pulse 2s ease infinite"
1753
+ },
1754
+ ".bp-shell__skeleton-row": {
1755
+ height: "0.65rem",
1756
+ borderRadius: "0.4rem",
1757
+ background: mode === "dark"
1758
+ ? "rgba(255,255,255,0.05)"
1759
+ : "rgba(0,0,0,0.05)",
1760
+ animation: "bp-skeleton-pulse 2s ease infinite"
1761
+ },
1762
+ ".bp-shell__skeleton-row:nth-child(2)": {
1763
+ width: "92%",
1764
+ animationDelay: "0.08s"
1765
+ },
1766
+ ".bp-shell__skeleton-row:nth-child(3)": {
1767
+ width: "78%",
1768
+ animationDelay: "0.16s"
1769
+ },
1770
+ ".bp-shell__skeleton-row:nth-child(4)": {
1771
+ width: "88%",
1772
+ animationDelay: "0.24s"
1773
+ },
1774
+ ".bp-shell__skeleton-row:nth-child(5)": {
1775
+ width: "64%",
1776
+ animationDelay: "0.32s"
1777
+ },
1778
+ ".bp-shell__skeleton-row:nth-child(6)": {
1779
+ width: "70%",
1780
+ animationDelay: "0.40s"
1781
+ },
1782
+ ".bp-shell__skeleton-spacer": {
1783
+ height: "0.5rem"
1784
+ },
1785
+ /* -- Content overlay: top progress bar -- */
1786
+ ".bp-admin__content-overlay-bar": {
1787
+ position: "absolute",
1788
+ top: 0,
1789
+ left: 0,
1790
+ right: 0,
1791
+ height: "2px",
1792
+ overflow: "hidden"
1793
+ },
1794
+ ".bp-admin__content-overlay-bar::after": {
1795
+ content: "\"\"",
1796
+ position: "absolute",
1797
+ inset: 0,
1798
+ background: "linear-gradient(90deg, transparent, var(--bp-accent), color-mix(in srgb, var(--bp-accent) 60%, var(--bp-accent-secondary)), transparent)",
1799
+ animation: "bp-progress-slide 1.4s ease infinite",
1800
+ borderRadius: "inherit"
1801
+ },
1802
+ /* -- Profile mirror (mobile offcanvas) -- */
1803
+ ".bp-admin__profile-mirror": {
1804
+ display: "none"
1805
+ },
1806
+ ".bp-admin__profile-mirror:not(:empty)": {
1807
+ padding: "0.5rem 0",
1808
+ borderBottom: mode === "dark"
1809
+ ? "1px solid rgba(255,255,255,0.06)"
1810
+ : "1px solid rgba(0,0,0,0.06)"
1811
+ },
1812
+ ".bp-admin__profile-mirror .dropdown-menu": {
1813
+ position: "absolute"
1814
+ },
1815
+ ".bp-admin__profile-mirror .d-none": {
1816
+ display: "flex !important"
1817
+ },
1818
+ "@media (max-width: 992px)": {
1819
+ ".bp-shell": {
1820
+ padding: "0.5rem"
1821
+ },
1822
+ ".bp-admin__menu-button": {
1823
+ display: "inline-flex"
1824
+ },
1825
+ ".bp-admin__profile-shell": {
1826
+ display: "none"
1827
+ },
1828
+ ".bp-admin__profile-mirror": {
1829
+ display: "block"
1830
+ },
1831
+ ".bp-admin": {
1832
+ gridTemplateColumns: "1fr"
1833
+ },
1834
+ ".bp-admin__sidebar": {
1835
+ display: "none"
1836
+ },
1837
+ ".bp-admin__workspace": {
1838
+ borderRadius: "1.2rem"
1839
+ },
1840
+ ".bp-admin__topbar-main": {
1841
+ width: "100%"
1842
+ },
1843
+ ".bp-split-pane[data-bp-detail-open='true']": {
1844
+ gridTemplateColumns: "1fr"
1845
+ },
1846
+ ".bp-split-pane__detail": {
1847
+ position: "fixed",
1848
+ top: 0,
1849
+ right: 0,
1850
+ bottom: 0,
1851
+ width: "min(85vw, 380px)",
1852
+ zIndex: 1055,
1853
+ borderRadius: 0,
1854
+ transform: "translateX(100%)",
1855
+ transition: "transform 280ms ease",
1856
+ background: mode === "dark"
1857
+ ? "rgba(44,44,46,0.95)"
1858
+ : "rgba(255,255,255,0.95)",
1859
+ backdropFilter: "blur(24px)",
1860
+ "-webkit-backdrop-filter": "blur(24px)",
1861
+ boxShadow: "-8px 0 32px rgba(0,0,0,0.12)"
1862
+ },
1863
+ ".bp-split-pane[data-bp-detail-open='true'] .bp-split-pane__detail": {
1864
+ display: "block",
1865
+ transform: "translateX(0)"
1866
+ }
1867
+ },
1868
+ "@media (max-width: 768px)": {
1869
+ ".bp-admin__topbar": {
1870
+ padding: "0.75rem 0.9rem"
1871
+ },
1872
+ ".bp-admin__workspace": {
1873
+ borderRadius: "1rem"
1874
+ }
1875
+ }
1876
+ });
1877
+ }
1878
+ function Bootstrap1Document(context) {
1879
+ return (_jsxs("html", { lang: "en", "data-bs-theme": context.themeMode, children: [_jsxs("head", { children: [_jsx("meta", { charset: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsx("meta", { name: "htmx-config", content: '{"selfRequestsOnly":false,"historyCacheSize":20,"mode":"cors","timeout":15000,"extensions":"bp-shell, sse"}' }), _jsx("link", { rel: "llms", href: "/llms.txt" }), _jsx("link", { rel: "alternate", type: "application/json", title: "BetterPortal AI Manifest", href: context.aiManifestUrl ?? "/.well-known/bp/ai.json" }), _jsx("meta", { name: "betterportal:ai-manifest", content: context.aiManifestUrl ?? "/.well-known/bp/ai.json" }), context.automationCatalogUrl ? _jsx("meta", { name: "betterportal:automation-catalog", content: context.automationCatalogUrl }) : "", context.managementDiscoveryUrl ? _jsx("meta", { name: "betterportal:management-discovery", content: context.managementDiscoveryUrl }) : "", _jsx("title", { children: context.title }), _jsx("link", { href: `${context.assetBaseUrl}/bootstrap.min.css`, rel: "stylesheet" }), _jsx("script", { src: `${context.assetBaseUrl}/bootstrap1-core.js`, defer: true }), _jsx("script", { src: `${context.assetBaseUrl}/bootstrap.bundle.min.js`, defer: true }), _jsx("style", { id: "bp-theme-style", "hx-get": "/.well-known/bp/theme/style", "hx-trigger": "bp:theme-changed from:body", "hx-swap": "outerHTML", "data-bp-no-route": "", children: shellStyles(context.themeMode, context.themeConfig) })] }), _jsx("body", { "hx-history-elt": "", children: context.bodyHtml })] }));
1880
+ }
1881
+ function buildServiceMap(routeLinks) {
1882
+ const map = {};
1883
+ for (const route of routeLinks) {
1884
+ if (route.serviceId && !map[route.serviceId]) {
1885
+ try {
1886
+ if (!route.requestUrl)
1887
+ continue;
1888
+ const parsed = new URL(route.requestUrl);
1889
+ map[route.serviceId] = parsed.origin;
1890
+ }
1891
+ catch { /* skip invalid URLs */ }
1892
+ }
1893
+ }
1894
+ return map;
1895
+ }
1896
+ function appendFragmentKey(url, fragmentKey) {
1897
+ return `${url}${url.includes("?") ? "&" : "?"}_f=${fragmentKey}`;
1898
+ }
1899
+ // Mirrors fragmentTriggerSpec in ../index.ts - fragments listen for
1900
+ // conventional reload events (fired via HX-Trigger, e.g. auth login/logout).
1901
+ function fragmentTriggerSpec(fragmentKey, pluginId) {
1902
+ const triggers = ["load", `bp:fragment:${fragmentKey} from:body`];
1903
+ if (pluginId)
1904
+ triggers.push(`bp:fragments:${pluginId} from:body`);
1905
+ return triggers.join(", ");
1906
+ }
1907
+ export function renderBrand(brandName, logoUrl, id) {
1908
+ return (_jsxs("div", { class: "bp-admin__brand-row", id: id, "hx-get": "/.well-known/bp/theme/brand", "hx-trigger": "bp:theme-changed from:body", "hx-swap": "outerHTML", "data-bp-no-route": "", children: [logoUrl ? _jsx("img", { class: "bp-admin__brand-logo", src: logoUrl, alt: "", width: "32", height: "32", loading: "eager", decoding: "async" }) : null, _jsx("div", { class: "bp-admin__brand-name", children: brandName })] }));
1909
+ }
1910
+ function Bootstrap1LandingBody(context) {
1911
+ const navItems = context.navItems ?? buildNavItems(context.routeLinks);
1912
+ const activeRoute = context.routeLinks.find((route) => route.active);
1913
+ const currentBreadcrumb = activeBreadcrumb(navItems);
1914
+ const serviceMap = buildServiceMap(context.routeLinks);
1915
+ const hasInitialRouteError = Boolean(context.initialRouteError);
1916
+ const initialRouteErrorTitle = context.initialRouteStatus === 404 ? "Route Not Found" : "Route Configuration Error";
1917
+ return (_jsxs("div", { class: "bp-shell", "data-bp-shell-root": "", "data-bp-services": JSON.stringify(serviceMap), "data-bp-routes": JSON.stringify(context.routeLinks), "data-bp-dev-reload": "auto", "data-bp-login-url": context.loginUrl, "data-bp-logout-url": context.logoutUrl, "data-bp-chrome-full-screen": context.fullScreen ? "true" : "false", children: [_jsxs("div", { class: "offcanvas offcanvas-start bp-admin__mobile-menu", tabindex: -1, id: "bp-mobile-menu", "aria-labelledby": "bp-mobile-menu-title", children: [_jsxs("div", { class: "offcanvas-header", children: [renderBrand(context.brandName, context.logoUrl, "bp-mobile-menu-title"), _jsx("button", { type: "button", class: "btn-close", "data-bs-dismiss": "offcanvas", "aria-label": "Close" })] }), _jsxs("div", { class: "offcanvas-body", children: [_jsx("div", { "data-bp-profile-mirror": "", class: "bp-admin__profile-mirror" }), _jsx("div", { class: "bp-admin__sidebar-nav", children: _jsx("nav", { class: "bp-admin__nav", id: "bp-nav-mobile", "hx-get": "/.well-known/bp/theme/nav?mobile=1", "hx-trigger": "bp:menu-changed from:body", "hx-swap": "innerHTML", "data-bp-no-route": "", children: renderNavItems(navItems, true) }) })] })] }), _jsx("div", { "data-bp-background-fragments": "", hidden: true }), _jsxs("div", { class: "bp-admin", children: [_jsxs("aside", { class: "bp-admin__sidebar", children: [renderBrand(context.brandName, context.logoUrl), _jsx("section", { class: "bp-admin__sidebar-nav", children: _jsx("nav", { class: "bp-admin__nav", id: "bp-nav-desktop", "hx-get": "/.well-known/bp/theme/nav", "hx-trigger": "bp:menu-changed from:body", "hx-swap": "innerHTML", "data-bp-no-route": "", children: renderNavItems(navItems) }) })] }), _jsxs("section", { class: "bp-admin__workspace", children: [_jsxs("header", { class: "bp-admin__topbar", children: [_jsxs("div", { class: "bp-admin__topbar-main", children: [_jsx("button", { class: "btn btn-outline-secondary bp-admin__menu-button", type: "button", "data-bs-toggle": "offcanvas", "data-bs-target": "#bp-mobile-menu", "aria-controls": "bp-mobile-menu", children: "Menu" }), _jsxs("div", { class: "bp-admin__topbar-context", children: [_jsx("div", { class: "bp-admin__topbar-label bp-admin__breadcrumb", "data-bp-current-breadcrumb": "", children: currentBreadcrumb }), _jsx("div", { class: "bp-admin__topbar-title", "data-bp-current-title": "", children: activeRoute?.title ?? context.title })] })] }), _jsx("div", { class: "bp-admin__profile-shell", id: "bp-frag-nav", "hx-get": "/.well-known/bp/theme/fragments?location=nav", "hx-trigger": "bp:fragments-changed from:body", "hx-swap": "innerHTML", "data-bp-no-route": "", children: (context.resolvedFragments["nav"] ?? []).map((frag) => (_jsx("div", { "data-bp-fragment": frag.fragmentId, "data-bp-fragment-location": "nav", "data-bp-service": frag.serviceId, "hx-get": appendFragmentKey(frag.url, frag.fragmentKey), "hx-trigger": fragmentTriggerSpec(frag.fragmentKey, frag.pluginId), "hx-target": "this", "hx-swap": "innerHTML", children: _jsx("span", { class: "placeholder-glow", children: _jsx("span", { class: "placeholder col-12 rounded-pill" }) }) }))) }), _jsx("div", { class: "bp-admin__topbar-progress", id: "bp-topbar-progress" })] }), _jsxs("section", { class: "bp-admin__content-frame", children: [_jsx("div", { class: "bp-admin__content-status", children: _jsx("div", { id: "bp-content-error", class: "alert alert-danger bp-admin__error mb-0", role: "alert" }) }), _jsxs("div", { class: "bp-admin__content-overlay", "aria-hidden": "true", children: [_jsx("div", { class: "bp-admin__content-overlay-bar" }), _jsxs("div", { class: "bp-admin__content-overlay-card", children: [_jsx("div", { class: "spinner-border spinner-border-sm text-primary", role: "status" }), _jsx("span", { children: "Loading" })] })] }), _jsx("main", { class: "bp-shell__main", children: _jsx("div", { id: "bp-main", "data-bp-main-outlet": "", "data-bp-service": context.initialServiceId, "hx-get": context.initialRouteUrl ?? "", "hx-trigger": context.initialRouteUrl && !hasInitialRouteError ? "load" : undefined, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: hasInitialRouteError ? (_jsx("div", { class: "bp-shell__empty-state", children: _jsxs("div", { class: "bp-shell__empty-card", children: [_jsx("div", { class: "bp-shell__empty-title", children: initialRouteErrorTitle }), _jsx("div", { class: "bp-shell__empty-copy", children: context.initialRouteError })] }) })) : (_jsx("div", { class: "bp-shell__loading", children: _jsxs("div", { class: "bp-shell__loading-skeleton", children: [_jsx("div", { class: "bp-shell__skeleton-heading" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-spacer" }), _jsx("div", { class: "bp-shell__skeleton-heading", style: "width: 35%" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-row" })] }) })) }) }), _jsx("footer", { class: "bp-admin__footer", id: "bp-frag-footer", "hx-get": "/.well-known/bp/theme/fragments?location=footer", "hx-trigger": "bp:fragments-changed from:body", "hx-swap": "innerHTML", "data-bp-no-route": "", children: (context.resolvedFragments["footer"] ?? []).map((frag) => (_jsx("div", { "data-bp-fragment": frag.fragmentId, "data-bp-fragment-location": "footer", "data-bp-service": frag.serviceId, "hx-get": appendFragmentKey(frag.url, frag.fragmentKey), "hx-trigger": fragmentTriggerSpec(frag.fragmentKey, frag.pluginId), "hx-target": "this", "hx-swap": "innerHTML", children: _jsx("span", { class: "placeholder-glow", children: _jsx("span", { class: "placeholder col-12 rounded-pill" }) }) }))) })] })] })] })] }));
1918
+ }
1919
+ function Bootstrap1AuthBody(context) {
1920
+ const hasInitialRouteError = Boolean(context.initialRouteError);
1921
+ const initialRouteErrorTitle = context.initialRouteStatus === 404 ? "Route Not Found" : "Route Configuration Error";
1922
+ const serviceMap = buildServiceMap(context.routeLinks);
1923
+ return (_jsxs("div", { class: "bp-shell bp-shell--auth", "data-bp-shell-root": "", "data-bp-services": JSON.stringify(serviceMap), "data-bp-routes": JSON.stringify(context.routeLinks), "data-bp-dev-reload": "auto", "data-bp-login-url": context.loginUrl, "data-bp-logout-url": context.logoutUrl, "data-bp-auth-mode": "true", "data-bp-chrome-full-screen": "true", children: [_jsx("div", { "data-bp-background-fragments": "", hidden: true }), _jsx("main", { class: "bp-shell__main bp-shell__main--auth", children: _jsx("div", { id: "bp-main", "data-bp-main-outlet": "", "data-bp-service": context.initialServiceId, "hx-get": context.initialRouteUrl ?? "", "hx-trigger": context.initialRouteUrl && !hasInitialRouteError ? "load" : undefined, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: hasInitialRouteError ? (_jsx("div", { class: "bp-shell__empty-state", children: _jsxs("div", { class: "bp-shell__empty-card", children: [_jsx("div", { class: "bp-shell__empty-title", children: initialRouteErrorTitle }), _jsx("div", { class: "bp-shell__empty-copy", children: context.initialRouteError })] }) })) : (_jsx("div", { class: "bp-shell__loading", children: _jsxs("div", { class: "bp-shell__loading-skeleton", children: [_jsx("div", { class: "bp-shell__skeleton-heading" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-row" }), _jsx("div", { class: "bp-shell__skeleton-row" })] }) })) }) })] }));
1924
+ }
1925
+ export function renderBootstrap1Shell(context) {
1926
+ return `<!DOCTYPE html>${Bootstrap1Document(context)}`;
1927
+ }
1928
+ export function renderBootstrap1HostPage(context) {
1929
+ return renderBootstrap1Shell({
1930
+ title: context.title,
1931
+ brandName: context.brandName,
1932
+ logoUrl: context.logoUrl,
1933
+ themeMode: context.themeMode,
1934
+ themeConfig: context.themeConfig,
1935
+ assetBaseUrl: context.assetBaseUrl,
1936
+ aiManifestUrl: context.aiManifestUrl,
1937
+ automationCatalogUrl: context.automationCatalogUrl,
1938
+ managementDiscoveryUrl: context.managementDiscoveryUrl,
1939
+ bodyHtml: context.fullScreen ? Bootstrap1AuthBody(context) : Bootstrap1LandingBody(context)
1940
+ });
1941
+ }
1942
+ //# sourceMappingURL=index.js.map