@plumile/ui 0.1.68 → 0.1.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/lib/esm/admin/organisms/admin_sidebar/AdminSidebar.js +62 -0
  2. package/lib/esm/admin/organisms/admin_sidebar/AdminSidebar.js.map +1 -0
  3. package/lib/esm/admin/organisms/admin_sidebar/adminSidebar.css.js +17 -0
  4. package/lib/esm/admin/organisms/admin_sidebar/adminSidebar.css.js.map +1 -0
  5. package/lib/esm/{backoffice/organisms/backoffice_topbar/BackofficeTopbar.js → admin/organisms/admin_topbar/AdminTopbar.js} +4 -4
  6. package/lib/esm/admin/organisms/admin_topbar/AdminTopbar.js.map +1 -0
  7. package/lib/esm/admin/organisms/admin_topbar/adminTopbar.css.js +8 -0
  8. package/lib/esm/admin/organisms/admin_topbar/adminTopbar.css.js.map +1 -0
  9. package/lib/esm/admin/templates/admin_shell_layout/AdminShellLayout.js +19 -0
  10. package/lib/esm/admin/templates/admin_shell_layout/AdminShellLayout.js.map +1 -0
  11. package/lib/esm/admin/theme/AdminThemeProvider.js +11 -0
  12. package/lib/esm/admin/theme/AdminThemeProvider.js.map +1 -0
  13. package/lib/esm/admin/theme/adminTheme.css.js +7 -0
  14. package/lib/esm/admin/theme/adminTheme.css.js.map +1 -0
  15. package/lib/esm/atomic/atoms/badge/Badge.js +3 -3
  16. package/lib/esm/atomic/atoms/button/Button.js +1 -1
  17. package/lib/esm/atomic/atoms/checkbox/Checkbox.js +1 -1
  18. package/lib/esm/atomic/atoms/error_message/ErrorMessage.js +1 -1
  19. package/lib/esm/atomic/atoms/formatted-date/FormattedDate.js +4 -4
  20. package/lib/esm/atomic/atoms/label/Label.js +1 -1
  21. package/lib/esm/atomic/atoms/modal/Modal.js +13 -13
  22. package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuDropdown.js +12 -12
  23. package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuPopover.js +20 -20
  24. package/lib/esm/atomic/molecules/breadcrumb_navigation/BreadcrumbNavigation.js +14 -14
  25. package/lib/esm/atomic/molecules/card/Card.js +6 -6
  26. package/lib/esm/atomic/molecules/checkbox_field/CheckboxField.js +1 -1
  27. package/lib/esm/atomic/molecules/dropdown/Dropdown.js +80 -80
  28. package/lib/esm/atomic/molecules/dropdown/Dropdown.js.map +1 -1
  29. package/lib/esm/atomic/molecules/form/Form.js +1 -1
  30. package/lib/esm/atomic/molecules/form_error/FormError.js +1 -1
  31. package/lib/esm/atomic/molecules/highlight/HighlightCode.js +25 -25
  32. package/lib/esm/atomic/molecules/markdown/LazyMarkdownRenderer.js +7 -7
  33. package/lib/esm/atomic/molecules/markdown/MarkdownRenderer.js +33 -33
  34. package/lib/esm/atomic/molecules/markdown/MarkdownRenderer.js.map +1 -1
  35. package/lib/esm/atomic/molecules/markdown/components/LazyMarkdownCodeBlock.js +9 -9
  36. package/lib/esm/atomic/molecules/markdown/components/MarkdownArticleContainer.css.js +0 -1
  37. package/lib/esm/atomic/molecules/markdown/components/MarkdownCodeBlock.js +7 -7
  38. package/lib/esm/atomic/molecules/markdown/components/MarkdownCodeCopyButton.js +9 -9
  39. package/lib/esm/atomic/molecules/markdown/components/MarkdownFootnotesSection.js +7 -7
  40. package/lib/esm/atomic/molecules/markdown/components/MarkdownMermaidBlock.js +34 -34
  41. package/lib/esm/atomic/molecules/markdown/components/MarkdownParagraph.css.js +1 -0
  42. package/lib/esm/atomic/molecules/markdown/components/MarkdownShikiCodeBlock.js +4 -4
  43. package/lib/esm/atomic/molecules/profile_dropdown/ProfileDropdown.js +25 -25
  44. package/lib/esm/atomic/molecules/toast/ToastProvider.js +15 -15
  45. package/lib/esm/atomic/molecules/toast/ToastViewport.js +15 -15
  46. package/lib/esm/atomic/organisms/login_form/LoginForm.js +1 -1
  47. package/lib/esm/atomic/organisms/sidebar/NavigationSidebar.js +34 -34
  48. package/lib/esm/atomic/organisms/sidebar/icons.js +13 -13
  49. package/lib/esm/atomic/templates/auth_layout/AuthLayout.js +1 -1
  50. package/lib/esm/atomic/templates/detail-page/DetailPage.js +49 -0
  51. package/lib/esm/atomic/templates/detail-page/DetailPage.js.map +1 -0
  52. package/lib/esm/atomic/templates/detail-page/detailPage.css.js +8 -0
  53. package/lib/esm/atomic/templates/detail-page/detailPage.css.js.map +1 -0
  54. package/lib/esm/atomic/templates/page-container/PageContainer.js +36 -0
  55. package/lib/esm/atomic/templates/page-container/PageContainer.js.map +1 -0
  56. package/lib/esm/atomic/templates/page-container/pageContainer.css.js +8 -0
  57. package/lib/esm/atomic/templates/page-container/pageContainer.css.js.map +1 -0
  58. package/lib/esm/backoffice/atoms/copyable_text/CopyableText.js +10 -10
  59. package/lib/esm/backoffice/atoms/shortcut_hint/ShortcutHint.js +6 -6
  60. package/lib/esm/backoffice/atoms/tag/Tag.js +7 -7
  61. package/lib/esm/backoffice/molecules/backoffice_filter_drawer/BackofficeFilterDrawer.js +22 -22
  62. package/lib/esm/backoffice/molecules/backoffice_json_viewer/BackofficeJsonViewer.js +12 -12
  63. package/lib/esm/backoffice/molecules/backoffice_json_viewer/LazyBackofficeJsonViewer.js +11 -11
  64. package/lib/esm/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js +27 -21
  65. package/lib/esm/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js.map +1 -1
  66. package/lib/esm/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.js +2 -2
  67. package/lib/esm/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.js.map +1 -1
  68. package/lib/esm/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js +12 -12
  69. package/lib/esm/backoffice/molecules/confirm_dialog/ConfirmDialog.js +9 -9
  70. package/lib/esm/backoffice/molecules/global_search_input/GlobalSearchInput.js +5 -5
  71. package/lib/esm/backoffice/molecules/sidebar_collapse_toggle/SidebarCollapseToggle.js +7 -7
  72. package/lib/esm/backoffice/molecules/sidebar_nav_item/SidebarNavItem.js +26 -26
  73. package/lib/esm/backoffice/molecules/sidebar_nav_item/SidebarNavItem.js.map +1 -1
  74. package/lib/esm/backoffice/molecules/sidebar_nav_section/SidebarNavSection.js +11 -11
  75. package/lib/esm/backoffice/organisms/backoffice_data_table/BackofficeDataTable.js +20 -20
  76. package/lib/esm/components/data-table/TableCell.js +17 -17
  77. package/lib/esm/components/data-table/VirtualizedConnectionTable.js +27 -27
  78. package/lib/esm/components/layout/AppShell.js +14 -0
  79. package/lib/esm/components/layout/AppShell.js.map +1 -0
  80. package/lib/esm/components/layout/PageShell.js +65 -65
  81. package/lib/esm/components/layout/PageShell.js.map +1 -1
  82. package/lib/esm/components/layout/SettingsLayout.css.js +8 -0
  83. package/lib/esm/components/layout/SettingsLayout.css.js.map +1 -0
  84. package/lib/esm/{backoffice/templates/settings_template/SettingsTemplate.js → components/layout/SettingsLayout.js} +5 -5
  85. package/lib/esm/components/layout/SettingsLayout.js.map +1 -0
  86. package/lib/esm/components/layout/SplitViewLayout.css.js +8 -0
  87. package/lib/esm/components/layout/SplitViewLayout.css.js.map +1 -0
  88. package/lib/esm/{backoffice/templates/split_view_template/SplitViewTemplate.js → components/layout/SplitViewLayout.js} +5 -5
  89. package/lib/esm/components/layout/SplitViewLayout.js.map +1 -0
  90. package/lib/esm/components/select/SimpleSelect.js +23 -23
  91. package/lib/esm/index.js +109 -106
  92. package/lib/esm/node_modules/react-shiki/dist/chunk-QPJZGYHO.js +23 -23
  93. package/lib/esm/node_modules/react-shiki/dist/chunk-QPJZGYHO.js.map +1 -1
  94. package/lib/esm/style.css +1 -1
  95. package/lib/esm/theme/ThemeProvider.js +11 -11
  96. package/lib/esm/theme/VisuallyHidden.js +3 -3
  97. package/lib/esm/theme/index.js +9 -9
  98. package/lib/types/{backoffice/organisms/backoffice_sidebar/BackofficeSidebar.d.ts → admin/organisms/admin_sidebar/AdminSidebar.d.ts} +7 -7
  99. package/lib/types/admin/organisms/admin_sidebar/AdminSidebar.d.ts.map +1 -0
  100. package/lib/types/{backoffice/organisms/backoffice_sidebar/backofficeSidebar.css.d.ts → admin/organisms/admin_sidebar/adminSidebar.css.d.ts} +1 -1
  101. package/lib/types/admin/organisms/admin_sidebar/adminSidebar.css.d.ts.map +1 -0
  102. package/lib/types/admin/organisms/admin_topbar/AdminTopbar.d.ts +10 -0
  103. package/lib/types/admin/organisms/admin_topbar/AdminTopbar.d.ts.map +1 -0
  104. package/lib/types/{backoffice/organisms/backoffice_topbar/backofficeTopbar.css.d.ts → admin/organisms/admin_topbar/adminTopbar.css.d.ts} +1 -1
  105. package/lib/types/admin/organisms/admin_topbar/adminTopbar.css.d.ts.map +1 -0
  106. package/lib/types/admin/templates/admin_shell_layout/AdminShellLayout.d.ts +14 -0
  107. package/lib/types/admin/templates/admin_shell_layout/AdminShellLayout.d.ts.map +1 -0
  108. package/lib/types/admin/theme/AdminThemeProvider.d.ts +7 -0
  109. package/lib/types/admin/theme/AdminThemeProvider.d.ts.map +1 -0
  110. package/lib/types/admin/theme/adminTheme.css.d.ts +2 -0
  111. package/lib/types/admin/theme/adminTheme.css.d.ts.map +1 -0
  112. package/lib/types/atomic/templates/detail-page/DetailPage.d.ts +19 -0
  113. package/lib/types/atomic/templates/detail-page/DetailPage.d.ts.map +1 -0
  114. package/lib/types/atomic/templates/detail-page/detailPage.css.d.ts +9 -0
  115. package/lib/types/atomic/templates/detail-page/detailPage.css.d.ts.map +1 -0
  116. package/lib/types/atomic/templates/page-container/PageContainer.d.ts +14 -0
  117. package/lib/types/atomic/templates/page-container/PageContainer.d.ts.map +1 -0
  118. package/lib/types/atomic/templates/page-container/pageContainer.css.d.ts +7 -0
  119. package/lib/types/atomic/templates/page-container/pageContainer.css.d.ts.map +1 -0
  120. package/lib/types/backoffice/molecules/backoffice_page_header/BackofficePageHeader.d.ts +2 -1
  121. package/lib/types/backoffice/molecules/backoffice_page_header/BackofficePageHeader.d.ts.map +1 -1
  122. package/lib/types/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.d.ts +2 -0
  123. package/lib/types/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.d.ts.map +1 -1
  124. package/lib/types/components/layout/AppShell.d.ts +12 -0
  125. package/lib/types/components/layout/AppShell.d.ts.map +1 -0
  126. package/lib/types/{backoffice/templates/settings_template/settingsTemplate.css.d.ts → components/layout/SettingsLayout.css.d.ts} +1 -1
  127. package/lib/types/components/layout/SettingsLayout.css.d.ts.map +1 -0
  128. package/lib/types/components/layout/SettingsLayout.d.ts +11 -0
  129. package/lib/types/components/layout/SettingsLayout.d.ts.map +1 -0
  130. package/lib/types/{backoffice/templates/split_view_template/splitViewTemplate.css.d.ts → components/layout/SplitViewLayout.css.d.ts} +1 -1
  131. package/lib/types/components/layout/SplitViewLayout.css.d.ts.map +1 -0
  132. package/lib/types/components/layout/SplitViewLayout.d.ts +11 -0
  133. package/lib/types/components/layout/SplitViewLayout.d.ts.map +1 -0
  134. package/lib/types/index.d.ts +11 -8
  135. package/lib/types/index.d.ts.map +1 -1
  136. package/package.json +10 -10
  137. package/lib/esm/backoffice/organisms/backoffice_app_shell/BackofficeAppShell.js +0 -14
  138. package/lib/esm/backoffice/organisms/backoffice_app_shell/BackofficeAppShell.js.map +0 -1
  139. package/lib/esm/backoffice/organisms/backoffice_sidebar/BackofficeSidebar.js +0 -62
  140. package/lib/esm/backoffice/organisms/backoffice_sidebar/BackofficeSidebar.js.map +0 -1
  141. package/lib/esm/backoffice/organisms/backoffice_sidebar/backofficeSidebar.css.js +0 -17
  142. package/lib/esm/backoffice/organisms/backoffice_sidebar/backofficeSidebar.css.js.map +0 -1
  143. package/lib/esm/backoffice/organisms/backoffice_topbar/BackofficeTopbar.js.map +0 -1
  144. package/lib/esm/backoffice/organisms/backoffice_topbar/backofficeTopbar.css.js +0 -8
  145. package/lib/esm/backoffice/organisms/backoffice_topbar/backofficeTopbar.css.js.map +0 -1
  146. package/lib/esm/backoffice/templates/backoffice_shell_template/BackofficeShellTemplate.js +0 -19
  147. package/lib/esm/backoffice/templates/backoffice_shell_template/BackofficeShellTemplate.js.map +0 -1
  148. package/lib/esm/backoffice/templates/settings_template/SettingsTemplate.js.map +0 -1
  149. package/lib/esm/backoffice/templates/settings_template/settingsTemplate.css.js +0 -8
  150. package/lib/esm/backoffice/templates/settings_template/settingsTemplate.css.js.map +0 -1
  151. package/lib/esm/backoffice/templates/split_view_template/SplitViewTemplate.js.map +0 -1
  152. package/lib/esm/backoffice/templates/split_view_template/splitViewTemplate.css.js +0 -8
  153. package/lib/esm/backoffice/templates/split_view_template/splitViewTemplate.css.js.map +0 -1
  154. package/lib/esm/backoffice/theme/BackofficeThemeProvider.js +0 -11
  155. package/lib/esm/backoffice/theme/BackofficeThemeProvider.js.map +0 -1
  156. package/lib/esm/backoffice/theme/backofficeTheme.css.js +0 -7
  157. package/lib/esm/backoffice/theme/backofficeTheme.css.js.map +0 -1
  158. package/lib/types/backoffice/organisms/backoffice_app_shell/BackofficeAppShell.d.ts +0 -12
  159. package/lib/types/backoffice/organisms/backoffice_app_shell/BackofficeAppShell.d.ts.map +0 -1
  160. package/lib/types/backoffice/organisms/backoffice_sidebar/BackofficeSidebar.d.ts.map +0 -1
  161. package/lib/types/backoffice/organisms/backoffice_sidebar/backofficeSidebar.css.d.ts.map +0 -1
  162. package/lib/types/backoffice/organisms/backoffice_topbar/BackofficeTopbar.d.ts +0 -10
  163. package/lib/types/backoffice/organisms/backoffice_topbar/BackofficeTopbar.d.ts.map +0 -1
  164. package/lib/types/backoffice/organisms/backoffice_topbar/backofficeTopbar.css.d.ts.map +0 -1
  165. package/lib/types/backoffice/templates/backoffice_shell_template/BackofficeShellTemplate.d.ts +0 -14
  166. package/lib/types/backoffice/templates/backoffice_shell_template/BackofficeShellTemplate.d.ts.map +0 -1
  167. package/lib/types/backoffice/templates/settings_template/SettingsTemplate.d.ts +0 -11
  168. package/lib/types/backoffice/templates/settings_template/SettingsTemplate.d.ts.map +0 -1
  169. package/lib/types/backoffice/templates/settings_template/settingsTemplate.css.d.ts.map +0 -1
  170. package/lib/types/backoffice/templates/split_view_template/SplitViewTemplate.d.ts +0 -11
  171. package/lib/types/backoffice/templates/split_view_template/SplitViewTemplate.d.ts.map +0 -1
  172. package/lib/types/backoffice/templates/split_view_template/splitViewTemplate.css.d.ts.map +0 -1
  173. package/lib/types/backoffice/theme/BackofficeThemeProvider.d.ts +0 -7
  174. package/lib/types/backoffice/theme/BackofficeThemeProvider.d.ts.map +0 -1
  175. package/lib/types/backoffice/theme/backofficeTheme.css.d.ts +0 -2
  176. package/lib/types/backoffice/theme/backofficeTheme.css.d.ts.map +0 -1
@@ -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 ie, mobileSidebarBackdropOpen as ae, mobileSidebarClose as oe, page as u, pageWithSidePanel as d, secondaryAction as f, shell as p, sidePanel as se, sidePanelResizer as ce, sidePanelResizerHiddenOnMobile as le, sidePanelSurface as ue, sidebarColumn as de, sidebarColumnMobile as fe, sidebarColumnMobileOpen as pe, sidebarInner as m, tabRecipe as h, tabsRow as g } from "./PageShell.css.js";
4
- import { jsx as _, jsxs as v } from "react/jsx-runtime";
5
- import { useCallback as y, useEffect as b, useRef as x, useState as S } from "react";
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 me = 520, w = 360, T = .5, E = 480, he = 1024, D = "kronex:initiative:chatWidth", O = () => {
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(D);
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(D, String(e));
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 * T;
25
- }, j = (e, t) => typeof e.isActive == "boolean" ? e.isActive : e.href != null && t != null ? t === e.href : !1, M = ({ actions: T, breadcrumb: D, breadcrumbSlot: M, children: N, contentClassName: P, sidebar: F, sidePanel: I, tabs: L }) => {
26
- let { t: R } = t(), z = I != null, B = x(null), V = x(null), [H, U] = S(() => O() ?? me), W = x(H), [ge, G] = S(!1), [K, _e] = S(!1), [q, J] = S(!1), Y = y((e) => {
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 - E)), i = Math.min(w, r);
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 = y((e) => {
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 - E)), s = Math.min(w, o);
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
- b(() => {
64
+ v(() => {
65
65
  W.current = H;
66
- }, [H]), b(() => {
66
+ }, [H]), v(() => {
67
67
  if (typeof window > "u") return () => {};
68
- let e = window.matchMedia(`(max-width: ${he - 1}px)`), t = () => {
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
- }, []), b(() => {
74
+ }, []), v(() => {
75
75
  z && Y(H);
76
76
  }, [
77
77
  z,
78
78
  H,
79
79
  Y
80
- ]), b(() => {
80
+ ]), v(() => {
81
81
  !K && q && J(!1);
82
- }, [q, K]), b(() => {
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]), b(() => () => {
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__ */ _("div", {
97
+ if (M != null) return /* @__PURE__ */ x("div", {
98
98
  className: s,
99
99
  children: M
100
100
  });
101
- if (D == null || D.length === 0) return null;
102
- let e = D.flatMap((e, t) => {
103
- let n = t === D.length - 1, o = `${e.href ?? "crumb"}-${t}`, s;
104
- if (e.href != null && !n) s = /* @__PURE__ */ _(C, {
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__ */ _("span", {
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__ */ _("li", {
116
+ let l = /* @__PURE__ */ x("li", {
117
117
  className: i,
118
118
  children: s
119
119
  }, o);
120
- return n ? [l] : [l, /* @__PURE__ */ _("li", {
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__ */ _("nav", {
126
+ return /* @__PURE__ */ x("nav", {
127
127
  className: s,
128
128
  "aria-label": "Breadcrumb",
129
- children: /* @__PURE__ */ _("ol", {
129
+ children: /* @__PURE__ */ x("ol", {
130
130
  className: o,
131
131
  children: e
132
132
  })
133
133
  });
134
134
  }, ye = () => {
135
- if (T == null || T.main == null && (T.secondary ?? []).length === 0) return null;
136
- let e = T.secondary ?? [], t = null;
137
- return T.main != null && (t = /* @__PURE__ */ _("div", {
138
- className: f,
139
- children: T.main
140
- })), /* @__PURE__ */ v("div", {
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__ */ _("div", {
143
- className: f,
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__ */ _("div", {
148
- className: g,
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 = h({
154
+ let i = fe({
155
155
  state: n,
156
156
  mode: r
157
157
  }), a = e.id;
158
- return e.href == null ? /* @__PURE__ */ _("span", {
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__ */ _(C, {
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 = y((e) => {
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: `${w}px`,
183
+ minWidth: `${T}px`,
184
184
  maxWidth: "50vw"
185
- }), Q = /* @__PURE__ */ _("aside", {
186
- className: e(se, ue),
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__ */ _("div", {
195
- className: e(ce, le),
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__ */ v("div", {
212
- className: p,
211
+ return /* @__PURE__ */ S("div", {
212
+ className: ae,
213
213
  children: [
214
- /* @__PURE__ */ _("div", {
215
- className: e(ie, { [ae]: K && q }),
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__ */ v("div", {
222
- className: e(de, fe, { [pe]: K && q }),
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__ */ _("button", {
225
+ children: [/* @__PURE__ */ x("button", {
226
226
  type: "button",
227
- className: oe,
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__ */ _("div", {
234
- className: m,
233
+ }), /* @__PURE__ */ x("div", {
234
+ className: de,
235
235
  children: F
236
236
  })]
237
237
  }),
238
- /* @__PURE__ */ v("div", {
238
+ /* @__PURE__ */ S("div", {
239
239
  ref: B,
240
- className: e(u, { [d]: z }),
240
+ className: e(f, { [p]: z }),
241
241
  children: [
242
- /* @__PURE__ */ v("div", {
242
+ /* @__PURE__ */ S("div", {
243
243
  className: e(ne, { [re]: z }),
244
- children: [/* @__PURE__ */ v("div", {
244
+ children: [/* @__PURE__ */ S("div", {
245
245
  className: ee,
246
- children: [/* @__PURE__ */ v("div", {
246
+ children: [/* @__PURE__ */ S("div", {
247
247
  className: te,
248
248
  children: [
249
- K && /* @__PURE__ */ _("button", {
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__ */ _("div", {
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 "../../../theme/tools.js";
2
- import { container as t, content as n, sidebar as r } from "./settingsTemplate.css.js";
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/backoffice/templates/settings_template/SettingsTemplate.tsx
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 SettingsTemplate, o as default };
16
+ export { o as SettingsLayout, o as default };
17
17
 
18
- //# sourceMappingURL=SettingsTemplate.js.map
18
+ //# sourceMappingURL=SettingsLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsLayout.js","names":[],"sources":["../../../../src/components/layout/SettingsLayout.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './SettingsLayout.css.js';\n\nexport type SettingsLayoutProps = {\n nav: ReactNode;\n children: ReactNode;\n className?: string;\n navClassName?: string;\n contentClassName?: string;\n};\n\nexport const SettingsLayout = ({\n nav,\n children,\n className,\n navClassName,\n contentClassName,\n}: SettingsLayoutProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <aside className={cx(styles.sidebar, navClassName)}>{nav}</aside>\n <section className={cx(styles.content, contentClassName)}>\n {children}\n </section>\n </div>\n );\n};\n\nexport default SettingsLayout;\n"],"mappings":";;;;AAaA,IAAa,KAAkB,EAC7B,QACA,aACA,cACA,iBACA,0BAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,GAAkB,EAAU;WAA/C,CACE,kBAAC,SAAD;EAAO,WAAW,EAAG,GAAgB,EAAa;YAAG;EAAY,CAAA,EACjE,kBAAC,WAAD;EAAS,WAAW,EAAG,GAAgB,EAAiB;EACrD;EACO,CAAA,CACN"}
@@ -0,0 +1,8 @@
1
+ /* empty css */
2
+ /* empty css */
3
+ //#region src/components/layout/SplitViewLayout.css.ts
4
+ var e = "_1dcntij0 txvbqb9ix txvbqbaoo txvbqblax txvbqbbxo txvbqbbwr", t = "_1dcntij1 txvbqb1ro txvbqbv2z txvbqb1co txvbqb1qf txvbqbwf txvbqbl6f";
5
+ //#endregion
6
+ export { e as container, t as panel };
7
+
8
+ //# sourceMappingURL=SplitViewLayout.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitViewLayout.css.js","names":[],"sources":["../../../../src/components/layout/SplitViewLayout.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: 'splitViewSplit',\n lg: 'detailSingle',\n },\n});\n\nexport const panel = 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 "../../../theme/tools.js";
2
- import { container as t, panel as n } from "./splitViewTemplate.css.js";
1
+ import { cx as e } from "../../theme/tools.js";
2
+ import { container as t, panel as n } from "./SplitViewLayout.css.js";
3
3
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
- //#region src/backoffice/templates/split_view_template/SplitViewTemplate.tsx
4
+ //#region src/components/layout/SplitViewLayout.tsx
5
5
  var a = ({ list: a, detail: o, className: s, listClassName: c, detailClassName: l }) => /* @__PURE__ */ i("div", {
6
6
  className: e(t, s),
7
7
  children: [/* @__PURE__ */ r("div", {
@@ -13,6 +13,6 @@ var a = ({ list: a, detail: o, className: s, listClassName: c, detailClassName:
13
13
  })]
14
14
  });
15
15
  //#endregion
16
- export { a as SplitViewTemplate, a as default };
16
+ export { a as SplitViewLayout, a as default };
17
17
 
18
- //# sourceMappingURL=SplitViewTemplate.js.map
18
+ //# sourceMappingURL=SplitViewLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitViewLayout.js","names":[],"sources":["../../../../src/components/layout/SplitViewLayout.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './SplitViewLayout.css.js';\n\nexport type SplitViewLayoutProps = {\n list: ReactNode;\n detail: ReactNode;\n className?: string;\n listClassName?: string;\n detailClassName?: string;\n};\n\nexport const SplitViewLayout = ({\n list,\n detail,\n className,\n listClassName,\n detailClassName,\n}: SplitViewLayoutProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <div className={cx(styles.panel, listClassName)}>{list}</div>\n <div className={cx(styles.panel, detailClassName)}>{detail}</div>\n </div>\n );\n};\n\nexport default SplitViewLayout;\n"],"mappings":";;;;AAaA,IAAa,KAAmB,EAC9B,SACA,WACA,cACA,kBACA,yBAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,GAAkB,EAAU;WAA/C,CACE,kBAAC,OAAD;EAAK,WAAW,EAAG,GAAc,EAAc;YAAG;EAAW,CAAA,EAC7D,kBAAC,OAAD;EAAK,WAAW,EAAG,GAAc,EAAgB;YAAG;EAAa,CAAA,CAC7D"}
@@ -2,12 +2,12 @@ import { cx as e } from "../../theme/tools.js";
2
2
  import { useUiTranslation as t } from "../../i18n/useUiTranslation.js";
3
3
  import { ChevronDownSvg as n } from "../../icons/ChevronDownSvg.js";
4
4
  import { actionsContainer as r, container as i, label as a, menu as o, menuOpen as s, menuSeparator as c, optionButton as l, optionDescription as u, optionSelected as d, trigger as f, triggerIcon as ee, triggerIconBrand as te, triggerIconOpen as ne, triggerOpen as re, valueText as ie } from "./SimpleSelect.css.js";
5
- import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
6
- import { useCallback as g, useEffect as _, useId as v, useMemo as y, useRef as b, useState as x } from "react";
5
+ import { useCallback as p, useEffect as m, useId as h, useMemo as g, useRef as _, useState as v } from "react";
6
+ import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
7
7
  //#region src/components/select/SimpleSelect.tsx
8
8
  var S = ({ actionsSlot: S, className: C, isDisabled: w = !1, label: T, onChange: ae, options: E, placeholder: oe, value: D, variant: O = "default" }) => {
9
- let { t: k } = t(), [A, j] = x(!1), M = oe ?? k("common.select.placeholder"), [N, P] = x(-1), F = b(null), I = b(null), L = b(/* @__PURE__ */ new Map()), R = v(), z = y(() => E.find((e) => e.value === D) ?? null, [E, D]);
10
- _(() => {
9
+ let { t: k } = t(), [A, j] = v(!1), M = oe ?? k("common.select.placeholder"), [N, P] = v(-1), F = _(null), I = _(null), L = _(/* @__PURE__ */ new Map()), R = h(), z = g(() => E.find((e) => e.value === D) ?? null, [E, D]);
10
+ m(() => {
11
11
  if (!A) return;
12
12
  let e = E.findIndex((e) => e.value === D), t = 0;
13
13
  e >= 0 && (t = e), P(t);
@@ -15,7 +15,7 @@ var S = ({ actionsSlot: S, className: C, isDisabled: w = !1, label: T, onChange:
15
15
  A,
16
16
  E,
17
17
  D
18
- ]), _(() => {
18
+ ]), m(() => {
19
19
  if (!A || N < 0 || N >= E.length) return;
20
20
  let e = E[N];
21
21
  e != null && L.current.get(e.id)?.focus();
@@ -23,7 +23,7 @@ var S = ({ actionsSlot: S, className: C, isDisabled: w = !1, label: T, onChange:
23
23
  N,
24
24
  A,
25
25
  E
26
- ]), _(() => {
26
+ ]), m(() => {
27
27
  if (!A) return () => {};
28
28
  let e = (e) => {
29
29
  F.current?.contains(e.target) || j(!1);
@@ -33,10 +33,10 @@ var S = ({ actionsSlot: S, className: C, isDisabled: w = !1, label: T, onChange:
33
33
  return document.addEventListener("mousedown", e), window.addEventListener("keydown", t), () => {
34
34
  document.removeEventListener("mousedown", e), window.removeEventListener("keydown", t);
35
35
  };
36
- }, [A]), _(() => {
36
+ }, [A]), m(() => {
37
37
  L.current.clear();
38
38
  }, [E]);
39
- let B = g(() => {
39
+ let B = p(() => {
40
40
  j(!1), requestAnimationFrame(() => {
41
41
  I.current?.focus();
42
42
  });
@@ -88,12 +88,12 @@ var S = ({ actionsSlot: S, className: C, isDisabled: w = !1, label: T, onChange:
88
88
  let r = t.value === D, i = e(l, { [d]: r }), a = -1;
89
89
  N === n && (a = 0);
90
90
  let o = null;
91
- return t.description != null && t.description !== "" && (o = /* @__PURE__ */ m("span", {
91
+ return t.description != null && t.description !== "" && (o = /* @__PURE__ */ b("span", {
92
92
  className: u,
93
93
  children: t.description
94
- })), /* @__PURE__ */ m("li", {
94
+ })), /* @__PURE__ */ b("li", {
95
95
  role: "presentation",
96
- children: /* @__PURE__ */ h("button", {
96
+ children: /* @__PURE__ */ x("button", {
97
97
  ref: K(t.id),
98
98
  type: "button",
99
99
  role: "option",
@@ -106,13 +106,13 @@ var S = ({ actionsSlot: S, className: C, isDisabled: w = !1, label: T, onChange:
106
106
  onMouseEnter: () => {
107
107
  P(n);
108
108
  },
109
- children: [/* @__PURE__ */ m("span", { children: t.label }), o]
109
+ children: [/* @__PURE__ */ b("span", { children: t.label }), o]
110
110
  })
111
111
  }, t.id);
112
112
  }), J;
113
113
  N >= 0 && N < E.length && (J = E[N]?.id);
114
114
  let Y = null;
115
- T != null && (Y = /* @__PURE__ */ m("span", {
115
+ T != null && (Y = /* @__PURE__ */ b("span", {
116
116
  id: q,
117
117
  className: a,
118
118
  children: T
@@ -120,21 +120,21 @@ var S = ({ actionsSlot: S, className: C, isDisabled: w = !1, label: T, onChange:
120
120
  let X;
121
121
  A && (X = R);
122
122
  let Z = null;
123
- S != null && (Z = /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("li", {
123
+ S != null && (Z = /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b("li", {
124
124
  role: "presentation",
125
- children: /* @__PURE__ */ m("div", {
125
+ children: /* @__PURE__ */ b("div", {
126
126
  className: c,
127
127
  role: "separator"
128
128
  })
129
- }), /* @__PURE__ */ m("li", {
129
+ }), /* @__PURE__ */ b("li", {
130
130
  role: "presentation",
131
- children: /* @__PURE__ */ m("div", {
131
+ children: /* @__PURE__ */ b("div", {
132
132
  className: r,
133
133
  children: se()
134
134
  })
135
135
  })] }));
136
136
  let Q = null;
137
- A && (Q = /* @__PURE__ */ h("ul", {
137
+ A && (Q = /* @__PURE__ */ x("ul", {
138
138
  id: R,
139
139
  className: e(o, s),
140
140
  role: "listbox",
@@ -147,12 +147,12 @@ var S = ({ actionsSlot: S, className: C, isDisabled: w = !1, label: T, onChange:
147
147
  [ne]: A,
148
148
  [te]: O === "brand"
149
149
  });
150
- return /* @__PURE__ */ h("div", {
150
+ return /* @__PURE__ */ x("div", {
151
151
  className: e(i, C),
152
152
  ref: F,
153
153
  children: [
154
154
  Y,
155
- /* @__PURE__ */ h("button", {
155
+ /* @__PURE__ */ x("button", {
156
156
  ref: I,
157
157
  type: "button",
158
158
  className: le,
@@ -163,12 +163,12 @@ var S = ({ actionsSlot: S, className: C, isDisabled: w = !1, label: T, onChange:
163
163
  onClick: V,
164
164
  onKeyDown: U,
165
165
  disabled: w,
166
- children: [/* @__PURE__ */ m("span", {
166
+ children: [/* @__PURE__ */ b("span", {
167
167
  className: ie,
168
168
  children: z?.label ?? M
169
- }), /* @__PURE__ */ m("span", {
169
+ }), /* @__PURE__ */ b("span", {
170
170
  className: $,
171
- children: /* @__PURE__ */ m(n, {
171
+ children: /* @__PURE__ */ b(n, {
172
172
  width: 16,
173
173
  height: 16,
174
174
  "aria-hidden": "true"