@plumile/ui 0.1.68 → 0.1.69
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/lib/esm/admin/organisms/admin_sidebar/AdminSidebar.js +62 -0
- package/lib/esm/admin/organisms/admin_sidebar/AdminSidebar.js.map +1 -0
- package/lib/esm/admin/organisms/admin_sidebar/adminSidebar.css.js +17 -0
- package/lib/esm/admin/organisms/admin_sidebar/adminSidebar.css.js.map +1 -0
- package/lib/esm/{backoffice/organisms/backoffice_topbar/BackofficeTopbar.js → admin/organisms/admin_topbar/AdminTopbar.js} +4 -4
- package/lib/esm/admin/organisms/admin_topbar/AdminTopbar.js.map +1 -0
- package/lib/esm/admin/organisms/admin_topbar/adminTopbar.css.js +8 -0
- package/lib/esm/admin/organisms/admin_topbar/adminTopbar.css.js.map +1 -0
- package/lib/esm/admin/templates/admin_shell_layout/AdminShellLayout.js +19 -0
- package/lib/esm/admin/templates/admin_shell_layout/AdminShellLayout.js.map +1 -0
- package/lib/esm/admin/theme/AdminThemeProvider.js +11 -0
- package/lib/esm/admin/theme/AdminThemeProvider.js.map +1 -0
- package/lib/esm/admin/theme/adminTheme.css.js +7 -0
- package/lib/esm/admin/theme/adminTheme.css.js.map +1 -0
- package/lib/esm/atomic/atoms/badge/Badge.js +3 -3
- package/lib/esm/atomic/atoms/button/Button.js +1 -1
- package/lib/esm/atomic/atoms/checkbox/Checkbox.js +1 -1
- package/lib/esm/atomic/atoms/error_message/ErrorMessage.js +1 -1
- package/lib/esm/atomic/atoms/formatted-date/FormattedDate.js +4 -4
- package/lib/esm/atomic/atoms/label/Label.js +1 -1
- package/lib/esm/atomic/atoms/modal/Modal.js +13 -13
- package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuDropdown.js +12 -12
- package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuPopover.js +20 -20
- package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbNavigation.js +14 -14
- package/lib/esm/atomic/molecules/card/Card.js +6 -6
- package/lib/esm/atomic/molecules/checkbox_field/CheckboxField.js +1 -1
- package/lib/esm/atomic/molecules/dropdown/Dropdown.js +80 -80
- package/lib/esm/atomic/molecules/dropdown/Dropdown.js.map +1 -1
- package/lib/esm/atomic/molecules/form/Form.js +1 -1
- package/lib/esm/atomic/molecules/form_error/FormError.js +1 -1
- package/lib/esm/atomic/molecules/highlight/HighlightCode.js +25 -25
- package/lib/esm/atomic/molecules/markdown/LazyMarkdownRenderer.js +7 -7
- package/lib/esm/atomic/molecules/markdown/MarkdownRenderer.js +33 -33
- package/lib/esm/atomic/molecules/markdown/MarkdownRenderer.js.map +1 -1
- package/lib/esm/atomic/molecules/markdown/components/LazyMarkdownCodeBlock.js +9 -9
- package/lib/esm/atomic/molecules/markdown/components/MarkdownCodeBlock.js +7 -7
- package/lib/esm/atomic/molecules/markdown/components/MarkdownCodeCopyButton.js +9 -9
- package/lib/esm/atomic/molecules/markdown/components/MarkdownFootnotesSection.js +7 -7
- package/lib/esm/atomic/molecules/markdown/components/MarkdownMermaidBlock.js +34 -34
- package/lib/esm/atomic/molecules/markdown/components/MarkdownShikiCodeBlock.js +4 -4
- package/lib/esm/atomic/molecules/profile_dropdown/ProfileDropdown.js +25 -25
- package/lib/esm/atomic/molecules/toast/ToastProvider.js +15 -15
- package/lib/esm/atomic/molecules/toast/ToastViewport.js +15 -15
- package/lib/esm/atomic/organisms/login_form/LoginForm.js +1 -1
- package/lib/esm/atomic/organisms/sidebar/NavigationSidebar.js +34 -34
- package/lib/esm/atomic/organisms/sidebar/icons.js +13 -13
- package/lib/esm/atomic/templates/auth_layout/AuthLayout.js +1 -1
- package/lib/esm/backoffice/atoms/copyable_text/CopyableText.js +10 -10
- package/lib/esm/backoffice/atoms/shortcut_hint/ShortcutHint.js +6 -6
- package/lib/esm/backoffice/atoms/tag/Tag.js +7 -7
- package/lib/esm/backoffice/molecules/backoffice_filter_drawer/BackofficeFilterDrawer.js +22 -22
- package/lib/esm/backoffice/molecules/backoffice_json_viewer/BackofficeJsonViewer.js +12 -12
- package/lib/esm/backoffice/molecules/backoffice_json_viewer/LazyBackofficeJsonViewer.js +11 -11
- package/lib/esm/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js +12 -12
- package/lib/esm/backoffice/molecules/confirm_dialog/ConfirmDialog.js +9 -9
- package/lib/esm/backoffice/molecules/global_search_input/GlobalSearchInput.js +5 -5
- package/lib/esm/backoffice/molecules/sidebar_collapse_toggle/SidebarCollapseToggle.js +7 -7
- package/lib/esm/backoffice/molecules/sidebar_nav_item/SidebarNavItem.js +26 -26
- package/lib/esm/backoffice/molecules/sidebar_nav_item/SidebarNavItem.js.map +1 -1
- package/lib/esm/backoffice/molecules/sidebar_nav_section/SidebarNavSection.js +11 -11
- package/lib/esm/backoffice/organisms/backoffice_data_table/BackofficeDataTable.js +20 -20
- package/lib/esm/components/data-table/TableCell.js +17 -17
- package/lib/esm/components/data-table/VirtualizedConnectionTable.js +27 -27
- package/lib/esm/components/layout/AppShell.js +14 -0
- package/lib/esm/components/layout/AppShell.js.map +1 -0
- package/lib/esm/components/layout/PageShell.js +65 -65
- package/lib/esm/components/layout/PageShell.js.map +1 -1
- package/lib/esm/components/layout/SettingsLayout.css.js +8 -0
- package/lib/esm/components/layout/SettingsLayout.css.js.map +1 -0
- package/lib/esm/{backoffice/templates/settings_template/SettingsTemplate.js → components/layout/SettingsLayout.js} +5 -5
- package/lib/esm/components/layout/SettingsLayout.js.map +1 -0
- package/lib/esm/components/layout/SplitViewLayout.css.js +8 -0
- package/lib/esm/components/layout/SplitViewLayout.css.js.map +1 -0
- package/lib/esm/{backoffice/templates/split_view_template/SplitViewTemplate.js → components/layout/SplitViewLayout.js} +5 -5
- package/lib/esm/components/layout/SplitViewLayout.js.map +1 -0
- package/lib/esm/components/select/SimpleSelect.js +23 -23
- package/lib/esm/index.js +105 -104
- package/lib/esm/node_modules/react-shiki/dist/chunk-QPJZGYHO.js +23 -23
- package/lib/esm/node_modules/react-shiki/dist/chunk-QPJZGYHO.js.map +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/esm/theme/ThemeProvider.js +11 -11
- package/lib/esm/theme/VisuallyHidden.js +3 -3
- package/lib/esm/theme/index.js +9 -9
- package/lib/types/{backoffice/organisms/backoffice_sidebar/BackofficeSidebar.d.ts → admin/organisms/admin_sidebar/AdminSidebar.d.ts} +7 -7
- package/lib/types/admin/organisms/admin_sidebar/AdminSidebar.d.ts.map +1 -0
- package/lib/types/{backoffice/organisms/backoffice_sidebar/backofficeSidebar.css.d.ts → admin/organisms/admin_sidebar/adminSidebar.css.d.ts} +1 -1
- package/lib/types/admin/organisms/admin_sidebar/adminSidebar.css.d.ts.map +1 -0
- package/lib/types/admin/organisms/admin_topbar/AdminTopbar.d.ts +10 -0
- package/lib/types/admin/organisms/admin_topbar/AdminTopbar.d.ts.map +1 -0
- package/lib/types/{backoffice/organisms/backoffice_topbar/backofficeTopbar.css.d.ts → admin/organisms/admin_topbar/adminTopbar.css.d.ts} +1 -1
- package/lib/types/admin/organisms/admin_topbar/adminTopbar.css.d.ts.map +1 -0
- package/lib/types/admin/templates/admin_shell_layout/AdminShellLayout.d.ts +14 -0
- package/lib/types/admin/templates/admin_shell_layout/AdminShellLayout.d.ts.map +1 -0
- package/lib/types/admin/theme/AdminThemeProvider.d.ts +7 -0
- package/lib/types/admin/theme/AdminThemeProvider.d.ts.map +1 -0
- package/lib/types/admin/theme/adminTheme.css.d.ts +2 -0
- package/lib/types/admin/theme/adminTheme.css.d.ts.map +1 -0
- package/lib/types/components/layout/AppShell.d.ts +12 -0
- package/lib/types/components/layout/AppShell.d.ts.map +1 -0
- package/lib/types/{backoffice/templates/settings_template/settingsTemplate.css.d.ts → components/layout/SettingsLayout.css.d.ts} +1 -1
- package/lib/types/components/layout/SettingsLayout.css.d.ts.map +1 -0
- package/lib/types/components/layout/SettingsLayout.d.ts +11 -0
- package/lib/types/components/layout/SettingsLayout.d.ts.map +1 -0
- package/lib/types/{backoffice/templates/split_view_template/splitViewTemplate.css.d.ts → components/layout/SplitViewLayout.css.d.ts} +1 -1
- package/lib/types/components/layout/SplitViewLayout.css.d.ts.map +1 -0
- package/lib/types/components/layout/SplitViewLayout.d.ts +11 -0
- package/lib/types/components/layout/SplitViewLayout.d.ts.map +1 -0
- package/lib/types/index.d.ts +9 -8
- package/lib/types/index.d.ts.map +1 -1
- package/package.json +10 -10
- package/lib/esm/backoffice/organisms/backoffice_app_shell/BackofficeAppShell.js +0 -14
- package/lib/esm/backoffice/organisms/backoffice_app_shell/BackofficeAppShell.js.map +0 -1
- package/lib/esm/backoffice/organisms/backoffice_sidebar/BackofficeSidebar.js +0 -62
- package/lib/esm/backoffice/organisms/backoffice_sidebar/BackofficeSidebar.js.map +0 -1
- package/lib/esm/backoffice/organisms/backoffice_sidebar/backofficeSidebar.css.js +0 -17
- package/lib/esm/backoffice/organisms/backoffice_sidebar/backofficeSidebar.css.js.map +0 -1
- package/lib/esm/backoffice/organisms/backoffice_topbar/BackofficeTopbar.js.map +0 -1
- package/lib/esm/backoffice/organisms/backoffice_topbar/backofficeTopbar.css.js +0 -8
- package/lib/esm/backoffice/organisms/backoffice_topbar/backofficeTopbar.css.js.map +0 -1
- package/lib/esm/backoffice/templates/backoffice_shell_template/BackofficeShellTemplate.js +0 -19
- package/lib/esm/backoffice/templates/backoffice_shell_template/BackofficeShellTemplate.js.map +0 -1
- package/lib/esm/backoffice/templates/settings_template/SettingsTemplate.js.map +0 -1
- package/lib/esm/backoffice/templates/settings_template/settingsTemplate.css.js +0 -8
- package/lib/esm/backoffice/templates/settings_template/settingsTemplate.css.js.map +0 -1
- package/lib/esm/backoffice/templates/split_view_template/SplitViewTemplate.js.map +0 -1
- package/lib/esm/backoffice/templates/split_view_template/splitViewTemplate.css.js +0 -8
- package/lib/esm/backoffice/templates/split_view_template/splitViewTemplate.css.js.map +0 -1
- package/lib/esm/backoffice/theme/BackofficeThemeProvider.js +0 -11
- package/lib/esm/backoffice/theme/BackofficeThemeProvider.js.map +0 -1
- package/lib/esm/backoffice/theme/backofficeTheme.css.js +0 -7
- package/lib/esm/backoffice/theme/backofficeTheme.css.js.map +0 -1
- package/lib/types/backoffice/organisms/backoffice_app_shell/BackofficeAppShell.d.ts +0 -12
- package/lib/types/backoffice/organisms/backoffice_app_shell/BackofficeAppShell.d.ts.map +0 -1
- package/lib/types/backoffice/organisms/backoffice_sidebar/BackofficeSidebar.d.ts.map +0 -1
- package/lib/types/backoffice/organisms/backoffice_sidebar/backofficeSidebar.css.d.ts.map +0 -1
- package/lib/types/backoffice/organisms/backoffice_topbar/BackofficeTopbar.d.ts +0 -10
- package/lib/types/backoffice/organisms/backoffice_topbar/BackofficeTopbar.d.ts.map +0 -1
- package/lib/types/backoffice/organisms/backoffice_topbar/backofficeTopbar.css.d.ts.map +0 -1
- package/lib/types/backoffice/templates/backoffice_shell_template/BackofficeShellTemplate.d.ts +0 -14
- package/lib/types/backoffice/templates/backoffice_shell_template/BackofficeShellTemplate.d.ts.map +0 -1
- package/lib/types/backoffice/templates/settings_template/SettingsTemplate.d.ts +0 -11
- package/lib/types/backoffice/templates/settings_template/SettingsTemplate.d.ts.map +0 -1
- package/lib/types/backoffice/templates/settings_template/settingsTemplate.css.d.ts.map +0 -1
- package/lib/types/backoffice/templates/split_view_template/SplitViewTemplate.d.ts +0 -11
- package/lib/types/backoffice/templates/split_view_template/SplitViewTemplate.d.ts.map +0 -1
- package/lib/types/backoffice/templates/split_view_template/splitViewTemplate.css.d.ts.map +0 -1
- package/lib/types/backoffice/theme/BackofficeThemeProvider.d.ts +0 -7
- package/lib/types/backoffice/theme/BackofficeThemeProvider.d.ts.map +0 -1
- package/lib/types/backoffice/theme/backofficeTheme.css.d.ts +0 -2
- package/lib/types/backoffice/theme/backofficeTheme.css.d.ts.map +0 -1
|
@@ -2,8 +2,8 @@ import { cx as e } from "../../theme/tools.js";
|
|
|
2
2
|
import { useUiTranslation as t } from "../../i18n/useUiTranslation.js";
|
|
3
3
|
import { body as n, cell as r, container as i, emptyRow as a, header as o, headerCell as s, headerRow as c, hideBelowRecipe as l, primaryCell as u, primaryHeaderCell as d, row as f, rowEven as p, rowOdd as m } from "./DataTable.css.js";
|
|
4
4
|
import { bodyViewport as ee, sentinel as te, singleLineCell as ne, spacer as h } from "./VirtualizedConnectionTable.css.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { useCallback as g, useEffect as _, useLayoutEffect as v, useMemo as y, useRef as b, useState as re } from "react";
|
|
6
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
7
7
|
//#region src/components/data-table/VirtualizedConnectionTable.tsx
|
|
8
8
|
var C = "minmax(0, 1fr)", ie = (e, t) => typeof t == "string" && t !== "" ? { gridTemplateColumns: t } : { gridTemplateColumns: `repeat(${e}, ${C})` }, w = (e) => e == null ? null : l({ minVisibleAt: e }), T = (e) => {
|
|
9
9
|
let t = e;
|
|
@@ -14,24 +14,24 @@ var C = "minmax(0, 1fr)", ie = (e, t) => typeof t == "string" && t !== "" ? { gr
|
|
|
14
14
|
}
|
|
15
15
|
return null;
|
|
16
16
|
}, E = (e, t, n) => Math.min(n, Math.max(t, e)), D = ({ columns: l, rows: C, getRowId: D, emptyState: ae, className: oe, gridTemplateColumns: O, kind: se, classes: k, virtualization: A, infiniteScroll: j, hasNextPage: ce = !1, isLoadingMore: le = !1, onLoadMore: M }) => {
|
|
17
|
-
let { t: ue } = t(), N = se ?? "default", P =
|
|
17
|
+
let { t: ue } = t(), N = se ?? "default", P = b(null), F = b(null), I = b(null), L = b(null), R = b(null), z = b(!1), B = A?.enabled === !0, V = y(() => {
|
|
18
18
|
if (!B) return null;
|
|
19
19
|
let e = A.rowHeightPx;
|
|
20
20
|
return typeof e == "number" && Number.isFinite(e) && e > 0 ? e : 56;
|
|
21
|
-
}, [B, A]), H =
|
|
21
|
+
}, [B, A]), H = y(() => {
|
|
22
22
|
if (!B) return 0;
|
|
23
23
|
let e = 10, t = A.overscan;
|
|
24
24
|
return typeof t == "number" && Number.isFinite(t) && (e = t), Math.max(0, e);
|
|
25
|
-
}, [B, A]), U = j?.thresholdPx ?? 800, W = j?.autoLoad ?? !0, G = j?.enabled === !0, K = G && ce && !le && M != null, q =
|
|
25
|
+
}, [B, A]), U = j?.thresholdPx ?? 800, W = j?.autoLoad ?? !0, G = j?.enabled === !0, K = G && ce && !le && M != null, q = g(() => {
|
|
26
26
|
M?.();
|
|
27
27
|
}, [M]), [de, fe] = re(() => ({
|
|
28
28
|
startIndex: 0,
|
|
29
29
|
endIndex: Math.min(C.length, 50)
|
|
30
|
-
})), J =
|
|
30
|
+
})), J = y(() => ie(l.length, O), [l.length, O]), Y = g((t, n, i) => {
|
|
31
31
|
let a = D(t, n), o = [f({ kind: N }), k?.row];
|
|
32
32
|
n % 2 == 0 ? o.push(p({ kind: N }), k?.rowEven) : o.push(m({ kind: N }), k?.rowOdd);
|
|
33
33
|
let s = { ...J };
|
|
34
|
-
return typeof i == "number" && (s.height = i), /* @__PURE__ */
|
|
34
|
+
return typeof i == "number" && (s.height = i), /* @__PURE__ */ x("div", {
|
|
35
35
|
role: "row",
|
|
36
36
|
className: e(...o),
|
|
37
37
|
style: s,
|
|
@@ -41,7 +41,7 @@ var C = "minmax(0, 1fr)", ie = (e, t) => typeof t == "string" && t !== "" ? { gr
|
|
|
41
41
|
ne,
|
|
42
42
|
k?.cell
|
|
43
43
|
], a = w(n.minVisibleAt);
|
|
44
|
-
return a != null && i.push(a), n.className != null && i.push(n.className), n.isPrimary && i.push(u, k?.primaryCell), /* @__PURE__ */
|
|
44
|
+
return a != null && i.push(a), n.className != null && i.push(n.className), n.isPrimary && i.push(u, k?.primaryCell), /* @__PURE__ */ x("div", {
|
|
45
45
|
role: "cell",
|
|
46
46
|
className: e(...i),
|
|
47
47
|
children: n.cell(t)
|
|
@@ -54,7 +54,7 @@ var C = "minmax(0, 1fr)", ie = (e, t) => typeof t == "string" && t !== "" ? { gr
|
|
|
54
54
|
D,
|
|
55
55
|
J,
|
|
56
56
|
N
|
|
57
|
-
]), X =
|
|
57
|
+
]), X = g(() => {
|
|
58
58
|
if (!B) return;
|
|
59
59
|
let e = V;
|
|
60
60
|
if (e == null) return;
|
|
@@ -76,16 +76,16 @@ var C = "minmax(0, 1fr)", ie = (e, t) => typeof t == "string" && t !== "" ? { gr
|
|
|
76
76
|
C.length,
|
|
77
77
|
U,
|
|
78
78
|
q
|
|
79
|
-
]), Z =
|
|
79
|
+
]), Z = g(() => {
|
|
80
80
|
R.current ??= window.requestAnimationFrame(() => {
|
|
81
81
|
R.current = null, X();
|
|
82
82
|
});
|
|
83
83
|
}, [X]);
|
|
84
|
-
|
|
84
|
+
v(() => {
|
|
85
85
|
if (!B) return;
|
|
86
86
|
let e = P.current;
|
|
87
87
|
e != null && (L.current = T(e), Z());
|
|
88
|
-
}, [B, Z]),
|
|
88
|
+
}, [B, Z]), _(() => {
|
|
89
89
|
if (!B) return;
|
|
90
90
|
let e = L.current ?? window, t = () => {
|
|
91
91
|
Z();
|
|
@@ -93,7 +93,7 @@ var C = "minmax(0, 1fr)", ie = (e, t) => typeof t == "string" && t !== "" ? { gr
|
|
|
93
93
|
return e.addEventListener("scroll", t, { passive: !0 }), window.addEventListener("resize", t), () => {
|
|
94
94
|
e.removeEventListener("scroll", t), window.removeEventListener("resize", t);
|
|
95
95
|
};
|
|
96
|
-
}, [B, Z]),
|
|
96
|
+
}, [B, Z]), _(() => {
|
|
97
97
|
if (B || !G || !W || !K) return;
|
|
98
98
|
let e = I.current;
|
|
99
99
|
if (e == null) return;
|
|
@@ -116,21 +116,21 @@ var C = "minmax(0, 1fr)", ie = (e, t) => typeof t == "string" && t !== "" ? { gr
|
|
|
116
116
|
B,
|
|
117
117
|
U,
|
|
118
118
|
q
|
|
119
|
-
]),
|
|
119
|
+
]), v(() => {
|
|
120
120
|
if (B) return;
|
|
121
121
|
let e = P.current;
|
|
122
122
|
e != null && (L.current = T(e));
|
|
123
123
|
}, [B]);
|
|
124
|
-
let pe = /* @__PURE__ */
|
|
124
|
+
let pe = /* @__PURE__ */ x("div", {
|
|
125
125
|
className: e(o({ kind: N }), k?.header),
|
|
126
126
|
role: "rowgroup",
|
|
127
|
-
children: /* @__PURE__ */
|
|
127
|
+
children: /* @__PURE__ */ x("div", {
|
|
128
128
|
className: e(c, k?.headerRow),
|
|
129
129
|
role: "row",
|
|
130
130
|
style: J,
|
|
131
131
|
children: l.map((t) => {
|
|
132
132
|
let n = [s({ kind: N }), k?.headerCell], r = w(t.minVisibleAt);
|
|
133
|
-
return r != null && n.push(r), t.className != null && n.push(t.className), t.isPrimary && n.push(d, k?.primaryHeaderCell), /* @__PURE__ */
|
|
133
|
+
return r != null && n.push(r), t.className != null && n.push(t.className), t.isPrimary && n.push(d, k?.primaryHeaderCell), /* @__PURE__ */ x("div", {
|
|
134
134
|
role: "columnheader",
|
|
135
135
|
className: e(...n),
|
|
136
136
|
children: t.header
|
|
@@ -138,12 +138,12 @@ var C = "minmax(0, 1fr)", ie = (e, t) => typeof t == "string" && t !== "" ? { gr
|
|
|
138
138
|
})
|
|
139
139
|
})
|
|
140
140
|
}), Q;
|
|
141
|
-
if (C.length === 0) Q = /* @__PURE__ */
|
|
141
|
+
if (C.length === 0) Q = /* @__PURE__ */ x("div", {
|
|
142
142
|
className: e(a, k?.emptyRow),
|
|
143
143
|
role: "row",
|
|
144
|
-
children: /* @__PURE__ */
|
|
144
|
+
children: /* @__PURE__ */ x("div", {
|
|
145
145
|
role: "cell",
|
|
146
|
-
children: ae ?? /* @__PURE__ */
|
|
146
|
+
children: ae ?? /* @__PURE__ */ x("div", {
|
|
147
147
|
className: e("ysn8461j txvbqb96 txvbqbv8r txvbqbt5x", k?.emptyCell),
|
|
148
148
|
children: ue("common.table.empty")
|
|
149
149
|
})
|
|
@@ -151,34 +151,34 @@ var C = "minmax(0, 1fr)", ie = (e, t) => typeof t == "string" && t !== "" ? { gr
|
|
|
151
151
|
});
|
|
152
152
|
else if (B && V != null) {
|
|
153
153
|
let { startIndex: e, endIndex: t } = de, n = e * V, r = (C.length - t) * V, i = C.slice(e, t);
|
|
154
|
-
Q = /* @__PURE__ */
|
|
154
|
+
Q = /* @__PURE__ */ S("div", {
|
|
155
155
|
className: ee,
|
|
156
156
|
ref: F,
|
|
157
157
|
children: [
|
|
158
|
-
/* @__PURE__ */
|
|
158
|
+
/* @__PURE__ */ x("div", {
|
|
159
159
|
className: h,
|
|
160
160
|
style: { height: n }
|
|
161
161
|
}),
|
|
162
162
|
i.map((t, n) => Y(t, e + n, V)),
|
|
163
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ x("div", {
|
|
164
164
|
className: h,
|
|
165
165
|
style: { height: r }
|
|
166
166
|
})
|
|
167
167
|
]
|
|
168
168
|
});
|
|
169
|
-
} else Q = /* @__PURE__ */
|
|
169
|
+
} else Q = /* @__PURE__ */ x("div", {
|
|
170
170
|
ref: F,
|
|
171
171
|
children: C.map((e, t) => Y(e, t, null))
|
|
172
172
|
});
|
|
173
173
|
let $ = null;
|
|
174
|
-
return !B && G && W && ($ = /* @__PURE__ */
|
|
174
|
+
return !B && G && W && ($ = /* @__PURE__ */ x("div", {
|
|
175
175
|
ref: I,
|
|
176
176
|
className: te
|
|
177
|
-
})), /* @__PURE__ */
|
|
177
|
+
})), /* @__PURE__ */ S("div", {
|
|
178
178
|
ref: P,
|
|
179
179
|
className: e(i({ kind: N }), k?.container, oe),
|
|
180
180
|
role: "table",
|
|
181
|
-
children: [pe, /* @__PURE__ */
|
|
181
|
+
children: [pe, /* @__PURE__ */ S("div", {
|
|
182
182
|
className: e(n({ kind: N }), k?.body),
|
|
183
183
|
role: "rowgroup",
|
|
184
184
|
children: [Q, $]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PageShell as e } from "./PageShell.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/layout/AppShell.tsx
|
|
4
|
+
var n = ({ sidebar: n, children: r, breadcrumbSlot: i, actions: a, tabs: o }) => /* @__PURE__ */ t(e, {
|
|
5
|
+
sidebar: n,
|
|
6
|
+
breadcrumbSlot: i,
|
|
7
|
+
actions: a,
|
|
8
|
+
tabs: o,
|
|
9
|
+
children: r
|
|
10
|
+
});
|
|
11
|
+
//#endregion
|
|
12
|
+
export { n as AppShell, n as default };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=AppShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppShell.js","names":[],"sources":["../../../../src/components/layout/AppShell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport {\n PageShell,\n type PageShellActions,\n type PageShellTab,\n} from './PageShell.js';\n\nexport type AppShellProps = {\n sidebar: ReactNode;\n children: ReactNode;\n breadcrumbSlot?: ReactNode;\n actions?: PageShellActions;\n tabs?: PageShellTab[];\n};\n\nexport const AppShell = ({\n sidebar,\n children,\n breadcrumbSlot,\n actions,\n tabs,\n}: AppShellProps): JSX.Element => {\n return (\n <PageShell\n sidebar={sidebar}\n breadcrumbSlot={breadcrumbSlot}\n actions={actions}\n tabs={tabs}\n >\n {children}\n </PageShell>\n );\n};\n\nexport default AppShell;\n"],"mappings":";;;AAgBA,IAAa,KAAY,EACvB,YACA,aACA,mBACA,YACA,cAGE,kBAAC,GAAD;CACW;CACO;CACP;CACH;CAEL;CACS,CAAA"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { cx as e } from "../../theme/tools.js";
|
|
2
2
|
import { useUiTranslation as t } from "../../i18n/useUiTranslation.js";
|
|
3
|
-
import { actionGroup as n, breadcrumbCurrent as r, breadcrumbItem as i, breadcrumbLink as a, breadcrumbList as o, breadcrumbNav as s, breadcrumbSeparator as c, content as l, header as ee, headerRow as te, mainColumn as ne, mainColumnWithSidePanel as re, mobileSidebarBackdrop as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { actionGroup as n, breadcrumbCurrent as r, breadcrumbItem as i, breadcrumbLink as a, breadcrumbList as o, breadcrumbNav as s, breadcrumbSeparator as c, content as l, header as ee, headerRow as te, mainColumn as ne, mainColumnWithSidePanel as re, mobileSidebarBackdrop as u, mobileSidebarBackdropOpen as ie, mobileSidebarClose as d, page as f, pageWithSidePanel as p, secondaryAction as m, shell as ae, sidePanel as oe, sidePanelResizer as se, sidePanelResizerHiddenOnMobile as h, sidePanelSurface as g, sidebarColumn as ce, sidebarColumnMobile as le, sidebarColumnMobileOpen as ue, sidebarInner as de, tabRecipe as fe, tabsRow as pe } from "./PageShell.css.js";
|
|
4
|
+
import { useCallback as _, useEffect as v, useRef as y, useState as b } from "react";
|
|
5
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
6
6
|
import { Link as C } from "@plumile/router";
|
|
7
7
|
//#region src/components/layout/PageShell.tsx
|
|
8
|
-
var
|
|
8
|
+
var w = 520, T = 360, E = .5, D = 480, me = 1024, O = "plumile:page-shell:side-panel-width", he = () => {
|
|
9
9
|
if (typeof window > "u") return null;
|
|
10
10
|
try {
|
|
11
|
-
let e = window.localStorage.getItem(
|
|
11
|
+
let e = window.localStorage.getItem(O);
|
|
12
12
|
if (e == null) return null;
|
|
13
13
|
let t = Number(e);
|
|
14
14
|
return !Number.isFinite(t) || t <= 0 ? null : t;
|
|
@@ -17,20 +17,20 @@ var me = 520, w = 360, T = .5, E = 480, he = 1024, D = "kronex:initiative:chatWi
|
|
|
17
17
|
}
|
|
18
18
|
}, k = (e) => {
|
|
19
19
|
if (!(typeof window > "u")) try {
|
|
20
|
-
window.localStorage.setItem(
|
|
20
|
+
window.localStorage.setItem(O, String(e));
|
|
21
21
|
} catch {}
|
|
22
22
|
}, A = (e) => {
|
|
23
23
|
let t = e;
|
|
24
|
-
return typeof window < "u" && (t = window.innerWidth), t *
|
|
25
|
-
}, j = (e, t) => typeof e.isActive == "boolean" ? e.isActive : e.href != null && t != null ? t === e.href : !1, M = ({ actions:
|
|
26
|
-
let { t: R } = t(), z = I != null, B =
|
|
24
|
+
return typeof window < "u" && (t = window.innerWidth), t * E;
|
|
25
|
+
}, j = (e, t) => typeof e.isActive == "boolean" ? e.isActive : e.href != null && t != null ? t === e.href : !1, M = ({ actions: E, breadcrumb: O, breadcrumbSlot: M, children: N, contentClassName: P, sidebar: F, sidePanel: I, tabs: L }) => {
|
|
26
|
+
let { t: R } = t(), z = I != null, B = y(null), V = y(null), [H, U] = b(() => he() ?? w), W = y(H), [ge, G] = b(!1), [K, _e] = b(!1), [q, J] = b(!1), Y = _((e) => {
|
|
27
27
|
let t = B.current;
|
|
28
28
|
if (t == null) return;
|
|
29
|
-
let { width: n } = t.getBoundingClientRect(), r = Math.max(0, Math.min(A(n), n -
|
|
29
|
+
let { width: n } = t.getBoundingClientRect(), r = Math.max(0, Math.min(A(n), n - D)), i = Math.min(T, r);
|
|
30
30
|
r <= 0 && (i = 0);
|
|
31
31
|
let a = Math.max(i, r), o = Math.max(i, Math.min(e, a));
|
|
32
32
|
W.current = o, U(o);
|
|
33
|
-
}, []), X =
|
|
33
|
+
}, []), X = _((e) => {
|
|
34
34
|
if (typeof window > "u" || !z || K) return;
|
|
35
35
|
let t = B.current;
|
|
36
36
|
if (t == null) return;
|
|
@@ -43,7 +43,7 @@ var me = 520, w = 360, T = .5, E = 480, he = 1024, D = "kronex:initiative:chatWi
|
|
|
43
43
|
if (e == null) return;
|
|
44
44
|
i = e.clientX;
|
|
45
45
|
} else i = t.clientX;
|
|
46
|
-
let a = r + (e - i), o = Math.max(0, Math.min(A(n.width), n.width -
|
|
46
|
+
let a = r + (e - i), o = Math.max(0, Math.min(A(n.width), n.width - D)), s = Math.min(T, o);
|
|
47
47
|
o <= 0 && (s = 0);
|
|
48
48
|
let c = Math.max(s, o), l = Math.max(s, Math.min(a, c));
|
|
49
49
|
W.current = l, U(l);
|
|
@@ -61,25 +61,25 @@ var me = 520, w = 360, T = .5, E = 480, he = 1024, D = "kronex:initiative:chatWi
|
|
|
61
61
|
K,
|
|
62
62
|
H
|
|
63
63
|
]);
|
|
64
|
-
|
|
64
|
+
v(() => {
|
|
65
65
|
W.current = H;
|
|
66
|
-
}, [H]),
|
|
66
|
+
}, [H]), v(() => {
|
|
67
67
|
if (typeof window > "u") return () => {};
|
|
68
|
-
let e = window.matchMedia(`(max-width: ${
|
|
68
|
+
let e = window.matchMedia(`(max-width: ${me - 1}px)`), t = () => {
|
|
69
69
|
_e(e.matches);
|
|
70
70
|
};
|
|
71
71
|
return t(), e.addEventListener("change", t), () => {
|
|
72
72
|
e.removeEventListener("change", t);
|
|
73
73
|
};
|
|
74
|
-
}, []),
|
|
74
|
+
}, []), v(() => {
|
|
75
75
|
z && Y(H);
|
|
76
76
|
}, [
|
|
77
77
|
z,
|
|
78
78
|
H,
|
|
79
79
|
Y
|
|
80
|
-
]),
|
|
80
|
+
]), v(() => {
|
|
81
81
|
!K && q && J(!1);
|
|
82
|
-
}, [q, K]),
|
|
82
|
+
}, [q, K]), v(() => {
|
|
83
83
|
if (!q) return () => {};
|
|
84
84
|
let e = (e) => {
|
|
85
85
|
e.key === "Escape" && J(!1);
|
|
@@ -87,85 +87,85 @@ var me = 520, w = 360, T = .5, E = 480, he = 1024, D = "kronex:initiative:chatWi
|
|
|
87
87
|
return window.addEventListener("keydown", e), () => {
|
|
88
88
|
window.removeEventListener("keydown", e);
|
|
89
89
|
};
|
|
90
|
-
}, [q]),
|
|
90
|
+
}, [q]), v(() => () => {
|
|
91
91
|
let e = V.current;
|
|
92
92
|
e?.move != null && (window.removeEventListener("mousemove", e.move), window.removeEventListener("touchmove", e.move)), e?.up != null && (window.removeEventListener("mouseup", e.up), window.removeEventListener("touchend", e.up), window.removeEventListener("touchcancel", e.up));
|
|
93
93
|
}, []);
|
|
94
94
|
let Z;
|
|
95
95
|
typeof window < "u" && (Z = window.location.pathname);
|
|
96
96
|
let ve = () => {
|
|
97
|
-
if (M != null) return /* @__PURE__ */
|
|
97
|
+
if (M != null) return /* @__PURE__ */ x("div", {
|
|
98
98
|
className: s,
|
|
99
99
|
children: M
|
|
100
100
|
});
|
|
101
|
-
if (
|
|
102
|
-
let e =
|
|
103
|
-
let n = t ===
|
|
104
|
-
if (e.href != null && !n) s = /* @__PURE__ */
|
|
101
|
+
if (O == null || O.length === 0) return null;
|
|
102
|
+
let e = O.flatMap((e, t) => {
|
|
103
|
+
let n = t === O.length - 1, o = `${e.href ?? "crumb"}-${t}`, s;
|
|
104
|
+
if (e.href != null && !n) s = /* @__PURE__ */ x(C, {
|
|
105
105
|
to: e.href,
|
|
106
106
|
className: a,
|
|
107
107
|
children: e.label
|
|
108
108
|
});
|
|
109
109
|
else {
|
|
110
110
|
let t = a;
|
|
111
|
-
n && (t = r), s = /* @__PURE__ */
|
|
111
|
+
n && (t = r), s = /* @__PURE__ */ x("span", {
|
|
112
112
|
className: t,
|
|
113
113
|
children: e.label
|
|
114
114
|
});
|
|
115
115
|
}
|
|
116
|
-
let l = /* @__PURE__ */
|
|
116
|
+
let l = /* @__PURE__ */ x("li", {
|
|
117
117
|
className: i,
|
|
118
118
|
children: s
|
|
119
119
|
}, o);
|
|
120
|
-
return n ? [l] : [l, /* @__PURE__ */
|
|
120
|
+
return n ? [l] : [l, /* @__PURE__ */ x("li", {
|
|
121
121
|
className: c,
|
|
122
122
|
"aria-hidden": "true",
|
|
123
123
|
children: "/"
|
|
124
124
|
}, `${o}-sep`)];
|
|
125
125
|
});
|
|
126
|
-
return /* @__PURE__ */
|
|
126
|
+
return /* @__PURE__ */ x("nav", {
|
|
127
127
|
className: s,
|
|
128
128
|
"aria-label": "Breadcrumb",
|
|
129
|
-
children: /* @__PURE__ */
|
|
129
|
+
children: /* @__PURE__ */ x("ol", {
|
|
130
130
|
className: o,
|
|
131
131
|
children: e
|
|
132
132
|
})
|
|
133
133
|
});
|
|
134
134
|
}, ye = () => {
|
|
135
|
-
if (
|
|
136
|
-
let e =
|
|
137
|
-
return
|
|
138
|
-
className:
|
|
139
|
-
children:
|
|
140
|
-
})), /* @__PURE__ */
|
|
135
|
+
if (E == null || E.main == null && (E.secondary ?? []).length === 0) return null;
|
|
136
|
+
let e = E.secondary ?? [], t = null;
|
|
137
|
+
return E.main != null && (t = /* @__PURE__ */ x("div", {
|
|
138
|
+
className: m,
|
|
139
|
+
children: E.main
|
|
140
|
+
})), /* @__PURE__ */ S("div", {
|
|
141
141
|
className: n,
|
|
142
|
-
children: [e.map((e, t) => /* @__PURE__ */
|
|
143
|
-
className:
|
|
142
|
+
children: [e.map((e, t) => /* @__PURE__ */ x("div", {
|
|
143
|
+
className: m,
|
|
144
144
|
children: e
|
|
145
145
|
}, `secondary-${t}`)), t]
|
|
146
146
|
});
|
|
147
|
-
}, be = () => L == null || L.length === 0 ? null : /* @__PURE__ */
|
|
148
|
-
className:
|
|
147
|
+
}, be = () => L == null || L.length === 0 ? null : /* @__PURE__ */ x("div", {
|
|
148
|
+
className: pe,
|
|
149
149
|
children: L.map((e) => {
|
|
150
150
|
let t = j(e, Z), n = "default";
|
|
151
151
|
t && (n = "active");
|
|
152
152
|
let r = "link";
|
|
153
153
|
e.href ?? (r = "static");
|
|
154
|
-
let i =
|
|
154
|
+
let i = fe({
|
|
155
155
|
state: n,
|
|
156
156
|
mode: r
|
|
157
157
|
}), a = e.id;
|
|
158
|
-
return e.href == null ? /* @__PURE__ */
|
|
158
|
+
return e.href == null ? /* @__PURE__ */ x("span", {
|
|
159
159
|
className: i,
|
|
160
160
|
"aria-current": t,
|
|
161
161
|
children: e.label
|
|
162
|
-
}, a) : /* @__PURE__ */
|
|
162
|
+
}, a) : /* @__PURE__ */ x(C, {
|
|
163
163
|
to: e.href,
|
|
164
164
|
className: i,
|
|
165
165
|
children: e.label
|
|
166
166
|
}, a);
|
|
167
167
|
})
|
|
168
|
-
}), xe =
|
|
168
|
+
}), xe = _((e) => {
|
|
169
169
|
if (!K && (e.key === "ArrowLeft" || e.key === "ArrowRight")) {
|
|
170
170
|
e.preventDefault();
|
|
171
171
|
let t = 16;
|
|
@@ -180,10 +180,10 @@ var me = 520, w = 360, T = .5, E = 480, he = 1024, D = "kronex:initiative:chatWi
|
|
|
180
180
|
let t;
|
|
181
181
|
K || (t = {
|
|
182
182
|
width: `${H}px`,
|
|
183
|
-
minWidth: `${
|
|
183
|
+
minWidth: `${T}px`,
|
|
184
184
|
maxWidth: "50vw"
|
|
185
|
-
}), Q = /* @__PURE__ */
|
|
186
|
-
className: e(
|
|
185
|
+
}), Q = /* @__PURE__ */ x("aside", {
|
|
186
|
+
className: e(oe, g),
|
|
187
187
|
style: t,
|
|
188
188
|
children: I
|
|
189
189
|
});
|
|
@@ -191,8 +191,8 @@ var me = 520, w = 360, T = .5, E = 480, he = 1024, D = "kronex:initiative:chatWi
|
|
|
191
191
|
let $ = null;
|
|
192
192
|
if (z) {
|
|
193
193
|
let t = "false";
|
|
194
|
-
ge && (t = "true"), $ = /* @__PURE__ */
|
|
195
|
-
className: e(
|
|
194
|
+
ge && (t = "true"), $ = /* @__PURE__ */ x("div", {
|
|
195
|
+
className: e(se, h),
|
|
196
196
|
role: "separator",
|
|
197
197
|
"aria-orientation": "vertical",
|
|
198
198
|
"aria-label": "Resize side panel",
|
|
@@ -208,45 +208,45 @@ var me = 520, w = 360, T = .5, E = 480, he = 1024, D = "kronex:initiative:chatWi
|
|
|
208
208
|
onKeyDown: xe
|
|
209
209
|
});
|
|
210
210
|
}
|
|
211
|
-
return /* @__PURE__ */
|
|
212
|
-
className:
|
|
211
|
+
return /* @__PURE__ */ S("div", {
|
|
212
|
+
className: ae,
|
|
213
213
|
children: [
|
|
214
|
-
/* @__PURE__ */
|
|
215
|
-
className: e(
|
|
214
|
+
/* @__PURE__ */ x("div", {
|
|
215
|
+
className: e(u, { [ie]: K && q }),
|
|
216
216
|
"aria-hidden": "true",
|
|
217
217
|
onClick: () => {
|
|
218
218
|
J(!1);
|
|
219
219
|
}
|
|
220
220
|
}),
|
|
221
|
-
/* @__PURE__ */
|
|
222
|
-
className: e(
|
|
221
|
+
/* @__PURE__ */ S("div", {
|
|
222
|
+
className: e(ce, le, { [ue]: K && q }),
|
|
223
223
|
"aria-hidden": K && !q,
|
|
224
224
|
inert: K && !q,
|
|
225
|
-
children: [/* @__PURE__ */
|
|
225
|
+
children: [/* @__PURE__ */ x("button", {
|
|
226
226
|
type: "button",
|
|
227
|
-
className:
|
|
227
|
+
className: d,
|
|
228
228
|
onClick: () => {
|
|
229
229
|
J(!1);
|
|
230
230
|
},
|
|
231
231
|
"aria-label": R("navigation.pageShell.closeNavigation"),
|
|
232
232
|
children: R("navigation.pageShell.close")
|
|
233
|
-
}), /* @__PURE__ */
|
|
234
|
-
className:
|
|
233
|
+
}), /* @__PURE__ */ x("div", {
|
|
234
|
+
className: de,
|
|
235
235
|
children: F
|
|
236
236
|
})]
|
|
237
237
|
}),
|
|
238
|
-
/* @__PURE__ */
|
|
238
|
+
/* @__PURE__ */ S("div", {
|
|
239
239
|
ref: B,
|
|
240
|
-
className: e(
|
|
240
|
+
className: e(f, { [p]: z }),
|
|
241
241
|
children: [
|
|
242
|
-
/* @__PURE__ */
|
|
242
|
+
/* @__PURE__ */ S("div", {
|
|
243
243
|
className: e(ne, { [re]: z }),
|
|
244
|
-
children: [/* @__PURE__ */
|
|
244
|
+
children: [/* @__PURE__ */ S("div", {
|
|
245
245
|
className: ee,
|
|
246
|
-
children: [/* @__PURE__ */
|
|
246
|
+
children: [/* @__PURE__ */ S("div", {
|
|
247
247
|
className: te,
|
|
248
248
|
children: [
|
|
249
|
-
K && /* @__PURE__ */
|
|
249
|
+
K && /* @__PURE__ */ x("button", {
|
|
250
250
|
type: "button",
|
|
251
251
|
className: "_1kley2da _1kley2d9 txvbqbnv6 txvbqboif txvbqbp5f txvbqblx6 txvbqb9hx txvbqbco txvbqbdnx txvbqb8x txvbqbamo txvbqb1rf txvbqb1qf txvbqb1co txvbqbwf txvbqbv2r txvbqbv8p txvbqbv",
|
|
252
252
|
onClick: () => {
|
|
@@ -260,7 +260,7 @@ var me = 520, w = 360, T = .5, E = 480, he = 1024, D = "kronex:initiative:chatWi
|
|
|
260
260
|
ye()
|
|
261
261
|
]
|
|
262
262
|
}), be()]
|
|
263
|
-
}), /* @__PURE__ */
|
|
263
|
+
}), /* @__PURE__ */ x("div", {
|
|
264
264
|
className: e(l, P),
|
|
265
265
|
children: N
|
|
266
266
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageShell.js","names":[],"sources":["../../../../src/components/layout/PageShell.tsx"],"sourcesContent":["import { Link } from '@plumile/router';\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type JSX,\n type ReactNode,\n type KeyboardEvent,\n type CSSProperties,\n} from 'react';\n\nimport * as styles from './PageShell.css.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\n\nexport type BreadcrumbItem = {\n label: ReactNode;\n href?: string;\n};\n\nexport type PageShellTab = {\n id: string;\n label: ReactNode;\n href?: string;\n isActive?: boolean;\n};\n\nexport type PageShellActions = {\n main?: ReactNode;\n secondary?: ReactNode[];\n};\n\nconst DEFAULT_SIDE_PANEL_WIDTH = 520;\nconst MIN_SIDE_PANEL_WIDTH = 360;\nconst MAX_SIDE_PANEL_RATIO = 0.5;\nconst MIN_MAIN_WIDTH = 480;\nconst SPLIT_BREAKPOINT = 1024;\nconst SIDE_PANEL_WIDTH_STORAGE_KEY = 'kronex:initiative:chatWidth';\n\nconst readStoredSidePanelWidth = (): number | null => {\n if (typeof window === 'undefined') {\n return null;\n }\n\n try {\n const stored = window.localStorage.getItem(SIDE_PANEL_WIDTH_STORAGE_KEY);\n if (stored == null) {\n return null;\n }\n const parsed = Number(stored);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst persistSidePanelWidth = (width: number): void => {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n window.localStorage.setItem(SIDE_PANEL_WIDTH_STORAGE_KEY, String(width));\n } catch {\n // ignore quota / permission errors\n }\n};\n\nconst resolveMaxSidePanelWidth = (containerWidth: number): number => {\n let viewWidth = containerWidth;\n if (typeof window !== 'undefined') {\n viewWidth = window.innerWidth;\n }\n return viewWidth * MAX_SIDE_PANEL_RATIO;\n};\n\ntype ResizeMoveHandler = (event: MouseEvent | TouchEvent) => void;\ntype ResizeUpHandler = () => void;\ntype ActiveResizeHandlers = {\n move?: ResizeMoveHandler | null;\n up?: ResizeUpHandler | null;\n};\n\ntype Props = {\n sidebar: ReactNode;\n children: ReactNode;\n breadcrumb?: BreadcrumbItem[];\n breadcrumbSlot?: ReactNode;\n tabs?: PageShellTab[];\n actions?: PageShellActions;\n sidePanel?: ReactNode;\n contentClassName?: string;\n};\n\nconst resolveIsActive = (tab: PageShellTab, pathname?: string): boolean => {\n if (typeof tab.isActive === 'boolean') {\n return tab.isActive;\n }\n\n if (tab.href != null && pathname != null) {\n return pathname === tab.href;\n }\n\n return false;\n};\n\nexport const PageShell = ({\n actions,\n breadcrumb,\n breadcrumbSlot,\n children,\n contentClassName,\n sidebar,\n sidePanel,\n tabs,\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const hasSidePanel = sidePanel != null;\n const pageRef = useRef<HTMLDivElement | null>(null);\n const activeResizeHandlersRef = useRef<ActiveResizeHandlers | null>(null);\n const [sidePanelWidth, setSidePanelWidth] = useState(() => {\n const stored = readStoredSidePanelWidth();\n return stored ?? DEFAULT_SIDE_PANEL_WIDTH;\n });\n const sidePanelWidthSnapshotRef = useRef(sidePanelWidth);\n const [isResizingPanel, setIsResizingPanel] = useState(false);\n const [isStackedLayout, setIsStackedLayout] = useState(false);\n const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState(false);\n\n const clampSidePanelWidth = useCallback((candidateWidth: number): void => {\n const container = pageRef.current;\n if (container == null) {\n return;\n }\n\n const { width } = container.getBoundingClientRect();\n const maxWidth = Math.max(\n 0,\n Math.min(resolveMaxSidePanelWidth(width), width - MIN_MAIN_WIDTH),\n );\n const minWidth = Math.min(MIN_SIDE_PANEL_WIDTH, maxWidth);\n let safeMin = minWidth;\n if (maxWidth <= 0) {\n safeMin = 0;\n }\n const safeMax = Math.max(safeMin, maxWidth);\n const clampedWidth = Math.max(safeMin, Math.min(candidateWidth, safeMax));\n sidePanelWidthSnapshotRef.current = clampedWidth;\n setSidePanelWidth(clampedWidth);\n }, []);\n\n const startResizing = useCallback(\n (startClientX: number): void => {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (!hasSidePanel || isStackedLayout) {\n return;\n }\n\n const container = pageRef.current;\n if (container == null) {\n return;\n }\n\n const rect = container.getBoundingClientRect();\n const currentWidth = sidePanelWidth;\n setIsResizingPanel(true);\n\n const moveHandler: ResizeMoveHandler = (event) => {\n let clientX = 0;\n if ('touches' in event) {\n const touch = event.touches[0];\n if (touch == null) {\n return;\n }\n clientX = touch.clientX;\n } else {\n clientX = event.clientX;\n }\n\n const deltaX = startClientX - clientX;\n const nextWidth = currentWidth + deltaX;\n\n const maxWidth = Math.max(\n 0,\n Math.min(\n resolveMaxSidePanelWidth(rect.width),\n rect.width - MIN_MAIN_WIDTH,\n ),\n );\n const minWidth = Math.min(MIN_SIDE_PANEL_WIDTH, maxWidth);\n let safeMin = minWidth;\n if (maxWidth <= 0) {\n safeMin = 0;\n }\n const safeMax = Math.max(safeMin, maxWidth);\n\n const clampedWidth = Math.max(safeMin, Math.min(nextWidth, safeMax));\n sidePanelWidthSnapshotRef.current = clampedWidth;\n setSidePanelWidth(clampedWidth);\n };\n\n const upHandler: ResizeUpHandler = () => {\n setIsResizingPanel(false);\n persistSidePanelWidth(sidePanelWidthSnapshotRef.current);\n const handlers = activeResizeHandlersRef.current;\n if (handlers?.move != null) {\n window.removeEventListener('mousemove', handlers.move);\n window.removeEventListener('touchmove', handlers.move);\n }\n if (handlers?.up != null) {\n window.removeEventListener('mouseup', handlers.up);\n window.removeEventListener('touchend', handlers.up);\n window.removeEventListener('touchcancel', handlers.up);\n }\n activeResizeHandlersRef.current = null;\n };\n\n activeResizeHandlersRef.current = { move: moveHandler, up: upHandler };\n\n window.addEventListener('mousemove', moveHandler);\n window.addEventListener('touchmove', moveHandler, { passive: false });\n window.addEventListener('mouseup', upHandler);\n window.addEventListener('touchend', upHandler);\n window.addEventListener('touchcancel', upHandler);\n },\n [hasSidePanel, isStackedLayout, sidePanelWidth],\n );\n\n useEffect(() => {\n sidePanelWidthSnapshotRef.current = sidePanelWidth;\n }, [sidePanelWidth]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return () => {};\n }\n const mediaQuery = window.matchMedia(\n `(max-width: ${SPLIT_BREAKPOINT - 1}px)`,\n );\n const handleMediaChange = () => {\n setIsStackedLayout(mediaQuery.matches);\n };\n\n handleMediaChange();\n mediaQuery.addEventListener('change', handleMediaChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleMediaChange);\n };\n }, []);\n\n useEffect(() => {\n if (hasSidePanel) {\n clampSidePanelWidth(sidePanelWidth);\n }\n }, [hasSidePanel, sidePanelWidth, clampSidePanelWidth]);\n\n useEffect(() => {\n if (!isStackedLayout && isMobileSidebarOpen) {\n setIsMobileSidebarOpen(false);\n }\n }, [isMobileSidebarOpen, isStackedLayout]);\n\n useEffect(() => {\n if (!isMobileSidebarOpen) {\n return () => {};\n }\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsMobileSidebarOpen(false);\n }\n };\n\n window.addEventListener('keydown', handleEscape);\n return () => {\n window.removeEventListener('keydown', handleEscape);\n };\n }, [isMobileSidebarOpen]);\n\n useEffect(() => {\n return () => {\n const handlers = activeResizeHandlersRef.current;\n if (handlers?.move != null) {\n window.removeEventListener('mousemove', handlers.move);\n window.removeEventListener('touchmove', handlers.move);\n }\n if (handlers?.up != null) {\n window.removeEventListener('mouseup', handlers.up);\n window.removeEventListener('touchend', handlers.up);\n window.removeEventListener('touchcancel', handlers.up);\n }\n };\n }, []);\n\n let currentPath: string | undefined;\n if (typeof window !== 'undefined') {\n currentPath = window.location.pathname;\n }\n\n const renderBreadcrumb = (): JSX.Element | null => {\n if (breadcrumbSlot != null) {\n return <div className={styles.breadcrumbNav}>{breadcrumbSlot}</div>;\n }\n\n if (breadcrumb == null || breadcrumb.length === 0) {\n return null;\n }\n\n const items = breadcrumb.flatMap((item, index) => {\n const isLast = index === breadcrumb.length - 1;\n const key = `${item.href ?? 'crumb'}-${index}`;\n let content: JSX.Element;\n if (item.href != null && !isLast) {\n content = (\n <Link to={item.href} className={styles.breadcrumbLink}>\n {item.label}\n </Link>\n );\n } else {\n let breadcrumbClass = styles.breadcrumbLink;\n if (isLast) {\n breadcrumbClass = styles.breadcrumbCurrent;\n }\n content = <span className={breadcrumbClass}>{item.label}</span>;\n }\n\n const renderedItem = (\n <li key={key} className={styles.breadcrumbItem}>\n {content}\n </li>\n );\n\n if (isLast) {\n return [renderedItem];\n }\n\n return [\n renderedItem,\n <li\n key={`${key}-sep`}\n className={styles.breadcrumbSeparator}\n aria-hidden=\"true\"\n >\n /\n </li>,\n ];\n });\n\n return (\n <nav className={styles.breadcrumbNav} aria-label=\"Breadcrumb\">\n <ol className={styles.breadcrumbList}>{items}</ol>\n </nav>\n );\n };\n\n const renderActions = (): JSX.Element | null => {\n if (\n actions == null ||\n (actions.main == null && (actions.secondary ?? []).length === 0)\n ) {\n return null;\n }\n\n const secondaryNodes = actions.secondary ?? [];\n\n let mainActionNode: JSX.Element | null = null;\n if (actions.main != null) {\n mainActionNode = (\n <div className={styles.secondaryAction}>{actions.main}</div>\n );\n }\n\n return (\n <div className={styles.actionGroup}>\n {secondaryNodes.map((node, index) => {\n return (\n <div key={`secondary-${index}`} className={styles.secondaryAction}>\n {node}\n </div>\n );\n })}\n {mainActionNode}\n </div>\n );\n };\n\n const renderTabs = (): JSX.Element | null => {\n if (tabs == null || tabs.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.tabsRow}>\n {tabs.map((tab) => {\n const isActive = resolveIsActive(tab, currentPath);\n let tabState: 'default' | 'active' = 'default';\n if (isActive) {\n tabState = 'active';\n }\n let tabMode: 'static' | 'link' = 'link';\n if (tab.href == null) {\n tabMode = 'static';\n }\n const className = styles.tabRecipe({\n state: tabState,\n mode: tabMode,\n });\n const key = tab.id;\n\n if (tab.href != null) {\n return (\n <Link key={key} to={tab.href} className={className}>\n {tab.label}\n </Link>\n );\n }\n\n return (\n <span key={key} className={className} aria-current={isActive}>\n {tab.label}\n </span>\n );\n })}\n </div>\n );\n };\n\n const handleResizerKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (isStackedLayout) {\n return;\n }\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.preventDefault();\n let delta = 16;\n if (event.key === 'ArrowRight') {\n delta = -16;\n }\n clampSidePanelWidth(sidePanelWidth + delta);\n persistSidePanelWidth(sidePanelWidthSnapshotRef.current);\n }\n },\n [clampSidePanelWidth, isStackedLayout, sidePanelWidth],\n );\n\n let sidePanelNode: JSX.Element | null = null;\n if (hasSidePanel) {\n let sidePanelStyle: CSSProperties | undefined;\n if (!isStackedLayout) {\n sidePanelStyle = {\n width: `${sidePanelWidth}px`,\n minWidth: `${MIN_SIDE_PANEL_WIDTH}px`,\n maxWidth: '50vw',\n };\n }\n sidePanelNode = (\n <aside\n className={cx(styles.sidePanel, styles.sidePanelSurface)}\n style={sidePanelStyle}\n >\n {sidePanel}\n </aside>\n );\n }\n\n let resizerNode: JSX.Element | null = null;\n if (hasSidePanel) {\n let resizerActive = 'false';\n if (isResizingPanel) {\n resizerActive = 'true';\n }\n resizerNode = (\n <div\n className={cx(\n styles.sidePanelResizer,\n styles.sidePanelResizerHiddenOnMobile,\n )}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize side panel\"\n tabIndex={0}\n data-active={resizerActive}\n onMouseDown={(event) => {\n event.preventDefault();\n startResizing(event.clientX);\n }}\n onTouchStart={(event) => {\n const touch = event.touches[0];\n if (touch != null) {\n startResizing(touch.clientX);\n }\n }}\n onKeyDown={handleResizerKeyDown}\n />\n );\n }\n\n return (\n <div className={styles.shell}>\n <div\n className={cx(styles.mobileSidebarBackdrop, {\n [styles.mobileSidebarBackdropOpen]:\n isStackedLayout && isMobileSidebarOpen,\n })}\n aria-hidden=\"true\"\n onClick={() => {\n setIsMobileSidebarOpen(false);\n }}\n />\n <div\n className={cx(styles.sidebarColumn, styles.sidebarColumnMobile, {\n [styles.sidebarColumnMobileOpen]:\n isStackedLayout && isMobileSidebarOpen,\n })}\n aria-hidden={isStackedLayout && !isMobileSidebarOpen}\n inert={isStackedLayout && !isMobileSidebarOpen}\n >\n <button\n type=\"button\"\n className={styles.mobileSidebarClose}\n onClick={() => {\n setIsMobileSidebarOpen(false);\n }}\n aria-label={t('navigation.pageShell.closeNavigation')}\n >\n {t('navigation.pageShell.close')}\n </button>\n <div className={styles.sidebarInner}>{sidebar}</div>\n </div>\n <div\n ref={pageRef}\n className={cx(styles.page, {\n [styles.pageWithSidePanel]: hasSidePanel,\n })}\n >\n <div\n className={cx(styles.mainColumn, {\n [styles.mainColumnWithSidePanel]: hasSidePanel,\n })}\n >\n <div className={styles.header}>\n <div className={styles.headerRow}>\n {isStackedLayout && (\n <button\n type=\"button\"\n className={styles.mobileSidebarToggle}\n onClick={() => {\n setIsMobileSidebarOpen(true);\n }}\n aria-expanded={isMobileSidebarOpen}\n aria-label={t('navigation.pageShell.openNavigation')}\n >\n {t('navigation.pageShell.menu')}\n </button>\n )}\n {renderBreadcrumb()}\n {renderActions()}\n </div>\n {renderTabs()}\n </div>\n <div className={cx(styles.content, contentClassName)}>{children}</div>\n </div>\n {resizerNode}\n {sidePanelNode}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PageShell.js","names":[],"sources":["../../../../src/components/layout/PageShell.tsx"],"sourcesContent":["import { Link } from '@plumile/router';\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type JSX,\n type ReactNode,\n type KeyboardEvent,\n type CSSProperties,\n} from 'react';\n\nimport * as styles from './PageShell.css.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\n\nexport type BreadcrumbItem = {\n label: ReactNode;\n href?: string;\n};\n\nexport type PageShellTab = {\n id: string;\n label: ReactNode;\n href?: string;\n isActive?: boolean;\n};\n\nexport type PageShellActions = {\n main?: ReactNode;\n secondary?: ReactNode[];\n};\n\nconst DEFAULT_SIDE_PANEL_WIDTH = 520;\nconst MIN_SIDE_PANEL_WIDTH = 360;\nconst MAX_SIDE_PANEL_RATIO = 0.5;\nconst MIN_MAIN_WIDTH = 480;\nconst SPLIT_BREAKPOINT = 1024;\nconst SIDE_PANEL_WIDTH_STORAGE_KEY = 'plumile:page-shell:side-panel-width';\n\nconst readStoredSidePanelWidth = (): number | null => {\n if (typeof window === 'undefined') {\n return null;\n }\n\n try {\n const stored = window.localStorage.getItem(SIDE_PANEL_WIDTH_STORAGE_KEY);\n if (stored == null) {\n return null;\n }\n const parsed = Number(stored);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst persistSidePanelWidth = (width: number): void => {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n window.localStorage.setItem(SIDE_PANEL_WIDTH_STORAGE_KEY, String(width));\n } catch {\n // ignore quota / permission errors\n }\n};\n\nconst resolveMaxSidePanelWidth = (containerWidth: number): number => {\n let viewWidth = containerWidth;\n if (typeof window !== 'undefined') {\n viewWidth = window.innerWidth;\n }\n return viewWidth * MAX_SIDE_PANEL_RATIO;\n};\n\ntype ResizeMoveHandler = (event: MouseEvent | TouchEvent) => void;\ntype ResizeUpHandler = () => void;\ntype ActiveResizeHandlers = {\n move?: ResizeMoveHandler | null;\n up?: ResizeUpHandler | null;\n};\n\ntype Props = {\n sidebar: ReactNode;\n children: ReactNode;\n breadcrumb?: BreadcrumbItem[];\n breadcrumbSlot?: ReactNode;\n tabs?: PageShellTab[];\n actions?: PageShellActions;\n sidePanel?: ReactNode;\n contentClassName?: string;\n};\n\nconst resolveIsActive = (tab: PageShellTab, pathname?: string): boolean => {\n if (typeof tab.isActive === 'boolean') {\n return tab.isActive;\n }\n\n if (tab.href != null && pathname != null) {\n return pathname === tab.href;\n }\n\n return false;\n};\n\nexport const PageShell = ({\n actions,\n breadcrumb,\n breadcrumbSlot,\n children,\n contentClassName,\n sidebar,\n sidePanel,\n tabs,\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const hasSidePanel = sidePanel != null;\n const pageRef = useRef<HTMLDivElement | null>(null);\n const activeResizeHandlersRef = useRef<ActiveResizeHandlers | null>(null);\n const [sidePanelWidth, setSidePanelWidth] = useState(() => {\n const stored = readStoredSidePanelWidth();\n return stored ?? DEFAULT_SIDE_PANEL_WIDTH;\n });\n const sidePanelWidthSnapshotRef = useRef(sidePanelWidth);\n const [isResizingPanel, setIsResizingPanel] = useState(false);\n const [isStackedLayout, setIsStackedLayout] = useState(false);\n const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState(false);\n\n const clampSidePanelWidth = useCallback((candidateWidth: number): void => {\n const container = pageRef.current;\n if (container == null) {\n return;\n }\n\n const { width } = container.getBoundingClientRect();\n const maxWidth = Math.max(\n 0,\n Math.min(resolveMaxSidePanelWidth(width), width - MIN_MAIN_WIDTH),\n );\n const minWidth = Math.min(MIN_SIDE_PANEL_WIDTH, maxWidth);\n let safeMin = minWidth;\n if (maxWidth <= 0) {\n safeMin = 0;\n }\n const safeMax = Math.max(safeMin, maxWidth);\n const clampedWidth = Math.max(safeMin, Math.min(candidateWidth, safeMax));\n sidePanelWidthSnapshotRef.current = clampedWidth;\n setSidePanelWidth(clampedWidth);\n }, []);\n\n const startResizing = useCallback(\n (startClientX: number): void => {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (!hasSidePanel || isStackedLayout) {\n return;\n }\n\n const container = pageRef.current;\n if (container == null) {\n return;\n }\n\n const rect = container.getBoundingClientRect();\n const currentWidth = sidePanelWidth;\n setIsResizingPanel(true);\n\n const moveHandler: ResizeMoveHandler = (event) => {\n let clientX = 0;\n if ('touches' in event) {\n const touch = event.touches[0];\n if (touch == null) {\n return;\n }\n clientX = touch.clientX;\n } else {\n clientX = event.clientX;\n }\n\n const deltaX = startClientX - clientX;\n const nextWidth = currentWidth + deltaX;\n\n const maxWidth = Math.max(\n 0,\n Math.min(\n resolveMaxSidePanelWidth(rect.width),\n rect.width - MIN_MAIN_WIDTH,\n ),\n );\n const minWidth = Math.min(MIN_SIDE_PANEL_WIDTH, maxWidth);\n let safeMin = minWidth;\n if (maxWidth <= 0) {\n safeMin = 0;\n }\n const safeMax = Math.max(safeMin, maxWidth);\n\n const clampedWidth = Math.max(safeMin, Math.min(nextWidth, safeMax));\n sidePanelWidthSnapshotRef.current = clampedWidth;\n setSidePanelWidth(clampedWidth);\n };\n\n const upHandler: ResizeUpHandler = () => {\n setIsResizingPanel(false);\n persistSidePanelWidth(sidePanelWidthSnapshotRef.current);\n const handlers = activeResizeHandlersRef.current;\n if (handlers?.move != null) {\n window.removeEventListener('mousemove', handlers.move);\n window.removeEventListener('touchmove', handlers.move);\n }\n if (handlers?.up != null) {\n window.removeEventListener('mouseup', handlers.up);\n window.removeEventListener('touchend', handlers.up);\n window.removeEventListener('touchcancel', handlers.up);\n }\n activeResizeHandlersRef.current = null;\n };\n\n activeResizeHandlersRef.current = { move: moveHandler, up: upHandler };\n\n window.addEventListener('mousemove', moveHandler);\n window.addEventListener('touchmove', moveHandler, { passive: false });\n window.addEventListener('mouseup', upHandler);\n window.addEventListener('touchend', upHandler);\n window.addEventListener('touchcancel', upHandler);\n },\n [hasSidePanel, isStackedLayout, sidePanelWidth],\n );\n\n useEffect(() => {\n sidePanelWidthSnapshotRef.current = sidePanelWidth;\n }, [sidePanelWidth]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return () => {};\n }\n const mediaQuery = window.matchMedia(\n `(max-width: ${SPLIT_BREAKPOINT - 1}px)`,\n );\n const handleMediaChange = () => {\n setIsStackedLayout(mediaQuery.matches);\n };\n\n handleMediaChange();\n mediaQuery.addEventListener('change', handleMediaChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleMediaChange);\n };\n }, []);\n\n useEffect(() => {\n if (hasSidePanel) {\n clampSidePanelWidth(sidePanelWidth);\n }\n }, [hasSidePanel, sidePanelWidth, clampSidePanelWidth]);\n\n useEffect(() => {\n if (!isStackedLayout && isMobileSidebarOpen) {\n setIsMobileSidebarOpen(false);\n }\n }, [isMobileSidebarOpen, isStackedLayout]);\n\n useEffect(() => {\n if (!isMobileSidebarOpen) {\n return () => {};\n }\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsMobileSidebarOpen(false);\n }\n };\n\n window.addEventListener('keydown', handleEscape);\n return () => {\n window.removeEventListener('keydown', handleEscape);\n };\n }, [isMobileSidebarOpen]);\n\n useEffect(() => {\n return () => {\n const handlers = activeResizeHandlersRef.current;\n if (handlers?.move != null) {\n window.removeEventListener('mousemove', handlers.move);\n window.removeEventListener('touchmove', handlers.move);\n }\n if (handlers?.up != null) {\n window.removeEventListener('mouseup', handlers.up);\n window.removeEventListener('touchend', handlers.up);\n window.removeEventListener('touchcancel', handlers.up);\n }\n };\n }, []);\n\n let currentPath: string | undefined;\n if (typeof window !== 'undefined') {\n currentPath = window.location.pathname;\n }\n\n const renderBreadcrumb = (): JSX.Element | null => {\n if (breadcrumbSlot != null) {\n return <div className={styles.breadcrumbNav}>{breadcrumbSlot}</div>;\n }\n\n if (breadcrumb == null || breadcrumb.length === 0) {\n return null;\n }\n\n const items = breadcrumb.flatMap((item, index) => {\n const isLast = index === breadcrumb.length - 1;\n const key = `${item.href ?? 'crumb'}-${index}`;\n let content: JSX.Element;\n if (item.href != null && !isLast) {\n content = (\n <Link to={item.href} className={styles.breadcrumbLink}>\n {item.label}\n </Link>\n );\n } else {\n let breadcrumbClass = styles.breadcrumbLink;\n if (isLast) {\n breadcrumbClass = styles.breadcrumbCurrent;\n }\n content = <span className={breadcrumbClass}>{item.label}</span>;\n }\n\n const renderedItem = (\n <li key={key} className={styles.breadcrumbItem}>\n {content}\n </li>\n );\n\n if (isLast) {\n return [renderedItem];\n }\n\n return [\n renderedItem,\n <li\n key={`${key}-sep`}\n className={styles.breadcrumbSeparator}\n aria-hidden=\"true\"\n >\n /\n </li>,\n ];\n });\n\n return (\n <nav className={styles.breadcrumbNav} aria-label=\"Breadcrumb\">\n <ol className={styles.breadcrumbList}>{items}</ol>\n </nav>\n );\n };\n\n const renderActions = (): JSX.Element | null => {\n if (\n actions == null ||\n (actions.main == null && (actions.secondary ?? []).length === 0)\n ) {\n return null;\n }\n\n const secondaryNodes = actions.secondary ?? [];\n\n let mainActionNode: JSX.Element | null = null;\n if (actions.main != null) {\n mainActionNode = (\n <div className={styles.secondaryAction}>{actions.main}</div>\n );\n }\n\n return (\n <div className={styles.actionGroup}>\n {secondaryNodes.map((node, index) => {\n return (\n <div key={`secondary-${index}`} className={styles.secondaryAction}>\n {node}\n </div>\n );\n })}\n {mainActionNode}\n </div>\n );\n };\n\n const renderTabs = (): JSX.Element | null => {\n if (tabs == null || tabs.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.tabsRow}>\n {tabs.map((tab) => {\n const isActive = resolveIsActive(tab, currentPath);\n let tabState: 'default' | 'active' = 'default';\n if (isActive) {\n tabState = 'active';\n }\n let tabMode: 'static' | 'link' = 'link';\n if (tab.href == null) {\n tabMode = 'static';\n }\n const className = styles.tabRecipe({\n state: tabState,\n mode: tabMode,\n });\n const key = tab.id;\n\n if (tab.href != null) {\n return (\n <Link key={key} to={tab.href} className={className}>\n {tab.label}\n </Link>\n );\n }\n\n return (\n <span key={key} className={className} aria-current={isActive}>\n {tab.label}\n </span>\n );\n })}\n </div>\n );\n };\n\n const handleResizerKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (isStackedLayout) {\n return;\n }\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.preventDefault();\n let delta = 16;\n if (event.key === 'ArrowRight') {\n delta = -16;\n }\n clampSidePanelWidth(sidePanelWidth + delta);\n persistSidePanelWidth(sidePanelWidthSnapshotRef.current);\n }\n },\n [clampSidePanelWidth, isStackedLayout, sidePanelWidth],\n );\n\n let sidePanelNode: JSX.Element | null = null;\n if (hasSidePanel) {\n let sidePanelStyle: CSSProperties | undefined;\n if (!isStackedLayout) {\n sidePanelStyle = {\n width: `${sidePanelWidth}px`,\n minWidth: `${MIN_SIDE_PANEL_WIDTH}px`,\n maxWidth: '50vw',\n };\n }\n sidePanelNode = (\n <aside\n className={cx(styles.sidePanel, styles.sidePanelSurface)}\n style={sidePanelStyle}\n >\n {sidePanel}\n </aside>\n );\n }\n\n let resizerNode: JSX.Element | null = null;\n if (hasSidePanel) {\n let resizerActive = 'false';\n if (isResizingPanel) {\n resizerActive = 'true';\n }\n resizerNode = (\n <div\n className={cx(\n styles.sidePanelResizer,\n styles.sidePanelResizerHiddenOnMobile,\n )}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize side panel\"\n tabIndex={0}\n data-active={resizerActive}\n onMouseDown={(event) => {\n event.preventDefault();\n startResizing(event.clientX);\n }}\n onTouchStart={(event) => {\n const touch = event.touches[0];\n if (touch != null) {\n startResizing(touch.clientX);\n }\n }}\n onKeyDown={handleResizerKeyDown}\n />\n );\n }\n\n return (\n <div className={styles.shell}>\n <div\n className={cx(styles.mobileSidebarBackdrop, {\n [styles.mobileSidebarBackdropOpen]:\n isStackedLayout && isMobileSidebarOpen,\n })}\n aria-hidden=\"true\"\n onClick={() => {\n setIsMobileSidebarOpen(false);\n }}\n />\n <div\n className={cx(styles.sidebarColumn, styles.sidebarColumnMobile, {\n [styles.sidebarColumnMobileOpen]:\n isStackedLayout && isMobileSidebarOpen,\n })}\n aria-hidden={isStackedLayout && !isMobileSidebarOpen}\n inert={isStackedLayout && !isMobileSidebarOpen}\n >\n <button\n type=\"button\"\n className={styles.mobileSidebarClose}\n onClick={() => {\n setIsMobileSidebarOpen(false);\n }}\n aria-label={t('navigation.pageShell.closeNavigation')}\n >\n {t('navigation.pageShell.close')}\n </button>\n <div className={styles.sidebarInner}>{sidebar}</div>\n </div>\n <div\n ref={pageRef}\n className={cx(styles.page, {\n [styles.pageWithSidePanel]: hasSidePanel,\n })}\n >\n <div\n className={cx(styles.mainColumn, {\n [styles.mainColumnWithSidePanel]: hasSidePanel,\n })}\n >\n <div className={styles.header}>\n <div className={styles.headerRow}>\n {isStackedLayout && (\n <button\n type=\"button\"\n className={styles.mobileSidebarToggle}\n onClick={() => {\n setIsMobileSidebarOpen(true);\n }}\n aria-expanded={isMobileSidebarOpen}\n aria-label={t('navigation.pageShell.openNavigation')}\n >\n {t('navigation.pageShell.menu')}\n </button>\n )}\n {renderBreadcrumb()}\n {renderActions()}\n </div>\n {renderTabs()}\n </div>\n <div className={cx(styles.content, contentClassName)}>{children}</div>\n </div>\n {resizerNode}\n {sidePanelNode}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/* empty css */
|
|
2
|
+
/* empty css */
|
|
3
|
+
//#region src/components/layout/SettingsLayout.css.ts
|
|
4
|
+
var e = "j42upe0 txvbqb9ix txvbqbaoo txvbqblax txvbqbbxf txvbqbbwr", t = "j42upe1 txvbqb1ro txvbqbv2z txvbqb1co txvbqb1qf txvbqbwf txvbqbl6f", n = "j42upe2 txvbqb1ro txvbqbv2z txvbqb1co txvbqb1qf txvbqbwf txvbqbl6f";
|
|
5
|
+
//#endregion
|
|
6
|
+
export { e as container, n as content, t as sidebar };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=SettingsLayout.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsLayout.css.js","names":[],"sources":["../../../../src/components/layout/SettingsLayout.css.ts"],"sourcesContent":["import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'grid',\n gap: 4,\n padding: 6,\n gridTemplateColumns: {\n base: 'settingsSplit',\n lg: 'detailSingle',\n },\n});\n\nexport const sidebar = sprinkles({\n borderRadius: 'lg',\n backgroundColor: 'background',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n overflow: 'hidden',\n});\n\nexport const content = sprinkles({\n borderRadius: 'lg',\n backgroundColor: 'background',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n overflow: 'hidden',\n});\n"],"mappings":""}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { cx as e } from "
|
|
2
|
-
import { container as t, content as n, sidebar as r } from "./
|
|
1
|
+
import { cx as e } from "../../theme/tools.js";
|
|
2
|
+
import { container as t, content as n, sidebar as r } from "./SettingsLayout.css.js";
|
|
3
3
|
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
4
|
-
//#region src/
|
|
4
|
+
//#region src/components/layout/SettingsLayout.tsx
|
|
5
5
|
var o = ({ nav: o, children: s, className: c, navClassName: l, contentClassName: u }) => /* @__PURE__ */ a("div", {
|
|
6
6
|
className: e(t, c),
|
|
7
7
|
children: [/* @__PURE__ */ i("aside", {
|
|
@@ -13,6 +13,6 @@ var o = ({ nav: o, children: s, className: c, navClassName: l, contentClassName:
|
|
|
13
13
|
})]
|
|
14
14
|
});
|
|
15
15
|
//#endregion
|
|
16
|
-
export { o as
|
|
16
|
+
export { o as SettingsLayout, o as default };
|
|
17
17
|
|
|
18
|
-
//# sourceMappingURL=
|
|
18
|
+
//# sourceMappingURL=SettingsLayout.js.map
|