@k2b/ui 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/browser/actions/GestureMenu.js +2 -2
  2. package/dist/browser/actions/GestureMenu.js.map +1 -1
  3. package/dist/browser/chat/ChatComposer.js +811 -406
  4. package/dist/browser/chat/ChatComposer.js.map +1 -1
  5. package/dist/browser/chat/chat-behavior.js +4 -0
  6. package/dist/browser/chat/chat-behavior.js.map +1 -1
  7. package/dist/browser/chat/chat-messages.js +14 -0
  8. package/dist/browser/chat/chat-messages.js.map +1 -1
  9. package/dist/browser/chat/command-search.js +170 -0
  10. package/dist/browser/chat/command-search.js.map +1 -0
  11. package/dist/browser/chat/composer-document.js +1 -1
  12. package/dist/browser/chat/composer-document.js.map +1 -1
  13. package/dist/browser/chat/index.js.map +1 -1
  14. package/dist/browser/content/Calendar.js +8 -7
  15. package/dist/browser/content/Calendar.js.map +1 -1
  16. package/dist/browser/content/CalendarDayView.js +32 -6
  17. package/dist/browser/content/CalendarDayView.js.map +1 -1
  18. package/dist/browser/content/CalendarWeekView.js +4 -3
  19. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  20. package/dist/browser/content/Timeline.js +3 -3
  21. package/dist/browser/content/Timeline.js.map +1 -1
  22. package/dist/browser/content/calendar-time-view.js +0 -1
  23. package/dist/browser/content/calendar-time-view.js.map +1 -1
  24. package/dist/browser/index.js +1 -0
  25. package/dist/browser/index.js.map +1 -1
  26. package/dist/browser/inputs/Combobox.js +26 -5
  27. package/dist/browser/inputs/Combobox.js.map +1 -1
  28. package/dist/browser/inputs/QrScanner.js +2 -1
  29. package/dist/browser/inputs/QrScanner.js.map +1 -1
  30. package/dist/browser/inputs/SelectChip.js +43 -12
  31. package/dist/browser/inputs/SelectChip.js.map +1 -1
  32. package/dist/browser/layout/AppWorkspace.js +720 -528
  33. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  34. package/dist/browser/layout/BottomSheet.js +8 -0
  35. package/dist/browser/layout/BottomSheet.js.map +1 -1
  36. package/dist/browser/layout/app-workspace-controller.js +159 -27
  37. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  38. package/dist/browser/layout/app-workspace-state.js +5 -1
  39. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  40. package/dist/browser/layout/index.js +1 -1
  41. package/dist/browser/layout/index.js.map +1 -1
  42. package/dist/browser/layout/scroll-fade.js +14 -9
  43. package/dist/browser/layout/scroll-fade.js.map +1 -1
  44. package/dist/browser/layout/sidebar-scroll-memory.js +38 -0
  45. package/dist/browser/layout/sidebar-scroll-memory.js.map +1 -0
  46. package/dist/browser/motion.js +7 -0
  47. package/dist/browser/motion.js.map +1 -0
  48. package/dist/ssr/actions/GestureMenu.js +2 -2
  49. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  50. package/dist/ssr/chat/ChatComposer.js +410 -93
  51. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  52. package/dist/ssr/chat/chat-behavior.js +4 -0
  53. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  54. package/dist/ssr/chat/chat-messages.js +14 -0
  55. package/dist/ssr/chat/chat-messages.js.map +1 -1
  56. package/dist/ssr/chat/command-search.js +170 -0
  57. package/dist/ssr/chat/command-search.js.map +1 -0
  58. package/dist/ssr/chat/composer-document.js +1 -1
  59. package/dist/ssr/chat/composer-document.js.map +1 -1
  60. package/dist/ssr/chat/index.js.map +1 -1
  61. package/dist/ssr/content/Calendar.js +8 -7
  62. package/dist/ssr/content/Calendar.js.map +1 -1
  63. package/dist/ssr/content/CalendarDayView.js +32 -6
  64. package/dist/ssr/content/CalendarDayView.js.map +1 -1
  65. package/dist/ssr/content/CalendarWeekView.js +4 -3
  66. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  67. package/dist/ssr/content/Timeline.js +3 -3
  68. package/dist/ssr/content/Timeline.js.map +1 -1
  69. package/dist/ssr/content/calendar-time-view.js +0 -1
  70. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  71. package/dist/ssr/index.js +1 -0
  72. package/dist/ssr/index.js.map +1 -1
  73. package/dist/ssr/inputs/Combobox.js +22 -5
  74. package/dist/ssr/inputs/Combobox.js.map +1 -1
  75. package/dist/ssr/inputs/QrScanner.js +2 -1
  76. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  77. package/dist/ssr/inputs/SelectChip.js +35 -11
  78. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  79. package/dist/ssr/layout/AppWorkspace.js +254 -118
  80. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  81. package/dist/ssr/layout/BottomSheet.js +8 -0
  82. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  83. package/dist/ssr/layout/app-workspace-controller.js +159 -27
  84. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  85. package/dist/ssr/layout/app-workspace-state.js +5 -1
  86. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  87. package/dist/ssr/layout/index.js +1 -1
  88. package/dist/ssr/layout/index.js.map +1 -1
  89. package/dist/ssr/layout/scroll-fade.js +14 -9
  90. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  91. package/dist/ssr/layout/sidebar-scroll-memory.js +38 -0
  92. package/dist/ssr/layout/sidebar-scroll-memory.js.map +1 -0
  93. package/dist/ssr/motion.js +7 -0
  94. package/dist/ssr/motion.js.map +1 -0
  95. package/dist/styles.css +1 -1
  96. package/dist/types/chat/ChatComposer.d.ts +44 -2
  97. package/dist/types/chat/chat-behavior.d.ts +4 -0
  98. package/dist/types/chat/chat-messages.d.ts +7 -0
  99. package/dist/types/chat/command-search.d.ts +39 -0
  100. package/dist/types/chat/index.d.ts +1 -1
  101. package/dist/types/content/calendar-time-view.d.ts +0 -1
  102. package/dist/types/index.d.ts +1 -0
  103. package/dist/types/inputs/Combobox.d.ts +1 -0
  104. package/dist/types/inputs/SelectChip.d.ts +4 -0
  105. package/dist/types/layout/AppWorkspace.d.ts +13 -1
  106. package/dist/types/layout/BottomSheet.d.ts +8 -0
  107. package/dist/types/layout/index.d.ts +1 -1
  108. package/dist/types/layout/scroll-fade.d.ts +2 -0
  109. package/dist/types/layout/sidebar-scroll-memory.d.ts +6 -0
  110. package/dist/types/motion.d.ts +6 -0
  111. package/package.json +4 -4
@@ -8,62 +8,68 @@ import { ssrStyle as _$ssrStyle } from "solid-js/web";
8
8
  import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
9
9
  import { escape as _$escape } from "solid-js/web";
10
10
  var _tmpl$ = ["<button type=\"button\" class=\"k2b-app-workspace__resize\" role=\"separator\"", " style=\"", "\"><span aria-hidden=\"true\"></span></button>"],
11
- _tmpl$2 = ["<div class=\"k2b-app-workspace__main-primary\" data-workspace-main-region=\"main\"", ">", "</div>"],
12
- _tmpl$3 = ["<section", " class=\"", "\"", " style=\"", "\">", "</section>"],
13
- _tmpl$4 = ["<style>", "</style>"],
14
- _tmpl$5 = ["<aside", " class=\"", "\"", "", " style=\"", "\"><button type=\"button\" class=\"k2b-app-workspace__detail-grabber\"", " aria-pressed=\"false\"><span aria-hidden=\"true\"></span></button>", "</aside>"],
15
- _tmpl$6 = ["<aside", " class=\"", "\"", "", " style=\"", "\">", "</aside>"],
16
- _tmpl$7 = ["<div class=\"k2b-app-workspace__sidebar-desktop\">", "</div>"],
17
- _tmpl$8 = ["<aside", " class=\"", "\"", "", ">", "</aside>"],
18
- _tmpl$9 = ["<script>", "</script>"],
19
- _tmpl$0 = ["<span aria-hidden=\"true\"><i", "></i></span>"],
20
- _tmpl$1 = ["<span class=\"k2b-app-workspace__sidebar-section-count\">", "</span>"],
21
- _tmpl$10 = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-section-toggle\"", ">", "<i", " aria-hidden=\"true\"></i></button>"],
22
- _tmpl$11 = ["<div class=\"k2b-app-workspace__sidebar-section-actions\">", "</div>"],
23
- _tmpl$12 = ["<header class=\"k2b-app-workspace__sidebar-section-header\">", "", "</header>"],
24
- _tmpl$13 = ["<div", "", " class=\"k2b-app-workspace__sidebar-section-content\">", "</div>"],
25
- _tmpl$14 = ["<h2>", "</h2>"],
26
- _tmpl$15 = ["<div class=\"k2b-app-workspace__sidebar-item-actions\"", ">", "</div>"],
27
- _tmpl$16 = "<span class=\"k2b-app-workspace__sidebar-status-mention\" aria-hidden=\"true\">@</span>",
28
- _tmpl$17 = "<span class=\"k2b-app-workspace__sidebar-status-muted\" aria-hidden=\"true\"><i class=\"ti ti-bell-off\"></i></span>",
29
- _tmpl$18 = ["<span class=\"k2b-app-workspace__sidebar-status-count\"", ">", "</span>"],
30
- _tmpl$19 = ["<span class=\"k2b-app-workspace__sidebar-status-unread\" aria-hidden=\"true\">", "</span>"],
31
- _tmpl$20 = ["<span class=\"k2b-sr-only\">, ", "</span>"],
32
- _tmpl$21 = ["<span class=\"k2b-app-workspace__sidebar-status\"", ">", "</span>"],
33
- _tmpl$22 = "<span class=\"k2b-app-workspace__sidebar-status-dot\"></span>",
34
- _tmpl$23 = ["<span class=\"k2b-app-workspace__sidebar-item-icon\" aria-hidden=\"true\">", "</span>"],
35
- _tmpl$24 = ["<span class=\"k2b-app-workspace__sidebar-item-context-meta\">", "</span>"],
36
- _tmpl$25 = ["<span class=\"k2b-app-workspace__sidebar-item-context\"><span class=\"k2b-app-workspace__sidebar-item-context-label\">", "</span>", "</span>"],
37
- _tmpl$26 = ["<span class=\"k2b-app-workspace__sidebar-item-description\">", "</span>"],
38
- _tmpl$27 = ["<span class=\"k2b-app-workspace__sidebar-item-copy\">", "<span class=\"k2b-app-workspace__sidebar-item-label\"", "><span class=\"k2b-app-workspace__sidebar-item-label-text\">", "</span></span>", "</span>"],
39
- _tmpl$28 = ["<span class=\"k2b-app-workspace__sidebar-item-meta\"", ">", "</span>"],
40
- _tmpl$29 = ["<i", "></i>"],
41
- _tmpl$30 = ["<a", " class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</a>"],
42
- _tmpl$31 = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</button>"],
43
- _tmpl$32 = ["<span class=\"k2b-app-workspace__sidebar-item-copy\"><span class=\"k2b-app-workspace__sidebar-item-label\"", "><span class=\"k2b-app-workspace__sidebar-item-label-text\">", "</span></span><span class=\"k2b-app-workspace__sidebar-item-description\">", "</span></span>"],
44
- _tmpl$33 = ["<span class=\"", "\"", ">", "</span>"],
45
- _tmpl$34 = ["<span class=\"k2b-app-workspace__nav-tree-toggle\" data-k2b-nav-tree-toggle aria-hidden=\"true\"><i class=\"", "\"></i></span>"],
46
- _tmpl$35 = ["<span class=\"k2b-app-workspace__sidebar-item-label\"", "><span class=\"k2b-app-workspace__sidebar-item-label-text\">", "</span></span>"],
47
- _tmpl$36 = ["<div class=\"k2b-app-workspace__nav-tree-group\" role=\"group\">", "</div>"],
48
- _tmpl$37 = ["<div class=\"k2b-app-workspace__nav-tree-node\" role=\"treeitem\"", " style=\"", "\">", "", "</div>"],
49
- _tmpl$38 = ["<div class=\"", "\" role=\"tree\"", ">", "</div>"],
50
- _tmpl$39 = ["<div class=\"k2b-app-workspace__sidebar-icon-grid\"", ">", "</div>"],
51
- _tmpl$40 = ["<i", " aria-hidden=\"true\"></i>"],
52
- _tmpl$41 = "<i class=\"ti ti-layout-sidebar\" aria-hidden=\"true\"></i>",
53
- _tmpl$42 = ["<div class=\"k2b-app-workspace__head\"", ">", "", "</div>"],
54
- _tmpl$43 = ["<h1 class=\"k2b-app-workspace__head-heading\" data-k2b-page-trail-title", ">", "</h1>"],
55
- _tmpl$44 = ["<div class=\"", "\" data-k2b-app-workspace", " style=\"", "\">", "", "</div>"],
56
- _tmpl$45 = ["<div class=\"", "\">", "</div>"];
11
+ _tmpl$2 = ["<p>", "</p>"],
12
+ _tmpl$3 = ["<div class=\"k2b-app-workspace__level-actions\">", "</div>"],
13
+ _tmpl$4 = ["<header class=\"k2b-app-workspace__level-head\">", "<div class=\"k2b-app-workspace__level-title\"><h2 tabindex=\"-1\">", "</h2>", "</div>", "</header>"],
14
+ _tmpl$5 = ["<div class=\"k2b-app-workspace__main-primary\" data-workspace-main-region=\"main\"", ">", "</div>"],
15
+ _tmpl$6 = ["<section", " class=\"", "\"", " style=\"", "\">", "</section>"],
16
+ _tmpl$7 = "<i class=\"ti ti-chevron-left\" aria-hidden=\"true\"></i>",
17
+ _tmpl$8 = ["<div class=\"k2b-app-workspace__level-body\"", ">", "</div>"],
18
+ _tmpl$9 = ["<style>", "</style>"],
19
+ _tmpl$0 = ["<aside", " class=\"", "\"", "", " style=\"", "\"><button type=\"button\" class=\"k2b-app-workspace__detail-grabber\"", " aria-pressed=\"false\"><span aria-hidden=\"true\"></span></button>", "</aside>"],
20
+ _tmpl$1 = ["<aside", " class=\"", "\"", "", " style=\"", "\">", "</aside>"],
21
+ _tmpl$10 = ["<div class=\"k2b-app-workspace__sidebar-desktop\">", "</div>"],
22
+ _tmpl$11 = ["<aside", " class=\"", "\"", "", ">", "</aside>"],
23
+ _tmpl$12 = ["<script>", "</script>"],
24
+ _tmpl$13 = ["<span aria-hidden=\"true\"><i", "></i></span>"],
25
+ _tmpl$14 = ["<span class=\"k2b-app-workspace__sidebar-section-count\">", "</span>"],
26
+ _tmpl$15 = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-section-toggle\"", ">", "<i", " aria-hidden=\"true\"></i></button>"],
27
+ _tmpl$16 = ["<div class=\"k2b-app-workspace__sidebar-section-actions\">", "</div>"],
28
+ _tmpl$17 = ["<header class=\"k2b-app-workspace__sidebar-section-header\">", "", "</header>"],
29
+ _tmpl$18 = ["<div", "", " class=\"k2b-app-workspace__sidebar-section-content\">", "</div>"],
30
+ _tmpl$19 = ["<h2>", "</h2>"],
31
+ _tmpl$20 = ["<div class=\"k2b-app-workspace__sidebar-item-actions\"", ">", "</div>"],
32
+ _tmpl$21 = "<span class=\"k2b-app-workspace__sidebar-status-mention\" aria-hidden=\"true\">@</span>",
33
+ _tmpl$22 = "<span class=\"k2b-app-workspace__sidebar-status-muted\" aria-hidden=\"true\"><i class=\"ti ti-bell-off\"></i></span>",
34
+ _tmpl$23 = ["<span class=\"k2b-app-workspace__sidebar-status-count\"", ">", "</span>"],
35
+ _tmpl$24 = ["<span class=\"k2b-app-workspace__sidebar-status-unread\" aria-hidden=\"true\">", "</span>"],
36
+ _tmpl$25 = ["<span class=\"k2b-sr-only\">, ", "</span>"],
37
+ _tmpl$26 = ["<span class=\"k2b-app-workspace__sidebar-status\"", ">", "</span>"],
38
+ _tmpl$27 = "<span class=\"k2b-app-workspace__sidebar-status-dot\"></span>",
39
+ _tmpl$28 = ["<span class=\"k2b-app-workspace__sidebar-item-icon\" aria-hidden=\"true\">", "</span>"],
40
+ _tmpl$29 = ["<span class=\"k2b-app-workspace__sidebar-item-context-meta\">", "</span>"],
41
+ _tmpl$30 = ["<span class=\"k2b-app-workspace__sidebar-item-context\"><span class=\"k2b-app-workspace__sidebar-item-context-label\">", "</span>", "</span>"],
42
+ _tmpl$31 = ["<span class=\"k2b-app-workspace__sidebar-item-description\">", "</span>"],
43
+ _tmpl$32 = ["<span class=\"k2b-app-workspace__sidebar-item-copy\">", "<span class=\"k2b-app-workspace__sidebar-item-label\"", "><span class=\"k2b-app-workspace__sidebar-item-label-text\">", "</span></span>", "</span>"],
44
+ _tmpl$33 = ["<span class=\"k2b-app-workspace__sidebar-item-meta\"", ">", "</span>"],
45
+ _tmpl$34 = ["<i", "></i>"],
46
+ _tmpl$35 = ["<a", " class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</a>"],
47
+ _tmpl$36 = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</button>"],
48
+ _tmpl$37 = ["<span class=\"k2b-app-workspace__sidebar-item-copy\"><span class=\"k2b-app-workspace__sidebar-item-label\"", "><span class=\"k2b-app-workspace__sidebar-item-label-text\">", "</span></span><span class=\"k2b-app-workspace__sidebar-item-description\">", "</span></span>"],
49
+ _tmpl$38 = ["<span class=\"", "\"", ">", "</span>"],
50
+ _tmpl$39 = ["<span class=\"k2b-app-workspace__nav-tree-toggle\" data-k2b-nav-tree-toggle aria-hidden=\"true\"><i class=\"", "\"></i></span>"],
51
+ _tmpl$40 = ["<span class=\"k2b-app-workspace__sidebar-item-label\"", "><span class=\"k2b-app-workspace__sidebar-item-label-text\">", "</span></span>"],
52
+ _tmpl$41 = ["<div class=\"k2b-app-workspace__nav-tree-group\" role=\"group\">", "</div>"],
53
+ _tmpl$42 = ["<div class=\"k2b-app-workspace__nav-tree-node\" role=\"treeitem\"", " style=\"", "\">", "", "</div>"],
54
+ _tmpl$43 = ["<div class=\"", "\" role=\"tree\"", ">", "</div>"],
55
+ _tmpl$44 = ["<div class=\"k2b-app-workspace__sidebar-icon-grid\"", ">", "</div>"],
56
+ _tmpl$45 = ["<i", " aria-hidden=\"true\"></i>"],
57
+ _tmpl$46 = "<i class=\"ti ti-layout-sidebar\" aria-hidden=\"true\"></i>",
58
+ _tmpl$47 = ["<div class=\"k2b-app-workspace__head\"", ">", "", "</div>"],
59
+ _tmpl$48 = ["<h1 class=\"k2b-app-workspace__head-heading\" data-k2b-page-trail-title", ">", "</h1>"],
60
+ _tmpl$49 = ["<div class=\"", "\" data-k2b-app-workspace", " style=\"", "\">", "", "</div>"],
61
+ _tmpl$50 = ["<div class=\"", "\">", "</div>"];
57
62
  import { Link } from "@k2b/ssr/nav";
58
- import { children, createContext, createEffect, createMemo, createSignal, createUniqueId, For, mergeProps, onCleanup, onMount, Show, useContext } from "solid-js";
63
+ import { children, createContext, createEffect, createMemo, createSignal, createUniqueId, For, mergeProps, on, onCleanup, onMount, Show, useContext } from "solid-js";
59
64
  import { isServer } from "solid-js/web";
60
- import { IconButton } from "../actions/Button";
65
+ import { IconButton, IconButtonLink } from "../actions/Button";
61
66
  import { APP_WORKSPACE_DETAIL_CLOSE_EVENT, APP_WORKSPACE_DETAIL_STEP_EVENT, APP_WORKSPACE_SIDEBAR_HIDE_EVENT, installAppWorkspaceController } from "./app-workspace-controller";
62
67
  import { APP_WORKSPACE_DETAIL_DEFAULT, APP_WORKSPACE_DETAIL_MAX, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DRAWER_DEFAULT, APP_WORKSPACE_DRAWER_MAX, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_PANE_DEFAULT, APP_WORKSPACE_PANE_MAX, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_SIDEBAR_COLLAPSED, APP_WORKSPACE_SIDEBAR_DEFAULT, APP_WORKSPACE_SIDEBAR_MAX, APP_WORKSPACE_SIDEBAR_MIN, appWorkspaceLayoutStyle, appWorkspacePanelVariable } from "./app-workspace-state";
63
68
  import { PageTitle, usePageTrail } from "./PageTitle";
64
69
  import { SidebarItemPreview } from "./SidebarItemPreview";
65
70
  import { AppWorkspaceSidebarSwitcher } from "./SidebarSwitcher";
66
- import { createScrollFade } from "./scroll-fade";
71
+ import { createScrollFade, scrollFadeEdges } from "./scroll-fade";
72
+ import { rememberSidebarScroll } from "./sidebar-scroll-memory";
67
73
  import { assertStableUiId, assertUniqueStableUiIds } from "./stable-id";
68
74
  import { useWorkspaceMessages } from "./workspace-messages";
69
75
  const ResizeContext = createContext(true);
@@ -91,7 +97,15 @@ const sidebarItemSlot = value => Boolean(value && typeof value === "object" && "
91
97
  const navTreeItemSlot = value => Boolean(value && typeof value === "object" && "kind" in value && value.kind === NAV_TREE_ITEM);
92
98
  function ResizeHandle(props) {
93
99
  const workspaceMessages = useWorkspaceMessages();
94
- return _$ssr(_tmpl$, _$ssrAttribute("aria-label", _$escape(props.label ?? (props.kind === "sidebar" ? workspaceMessages().resizeNavigation : props.kind === "pane" ? workspaceMessages().resizeWorkspacePane : props.kind === "detail" ? workspaceMessages().resizeDetailPanel : workspaceMessages().resizeBottomDrawer), true), false) + _$ssrAttribute("aria-controls", _$escape(props.controls, true), false) + _$ssrAttribute("aria-orientation", props.kind === "drawer" ? "horizontal" : "vertical", false) + _$ssrAttribute("aria-valuemin", _$escape(props.minSize, true), false) + _$ssrAttribute("aria-valuemax", _$escape(props.maxSize, true), false) + _$ssrAttribute("aria-valuenow", _$escape(props.defaultSize, true), false) + _$ssrAttribute("data-app-workspace-resize", _$escape(props.kind, true), false) + _$ssrAttribute("data-workspace-panel-id", _$escape(props.panelId, true), false) + _$ssrAttribute("data-workspace-resize-edge", _$escape(props.edge, true), false) + _$ssrAttribute("data-workspace-resize-shadow", props.shadow ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-workspace-default-size", _$escape(props.defaultSize, true), false) + _$ssrAttribute("data-workspace-min-size", _$escape(props.minSize, true), false) + _$ssrAttribute("data-workspace-max-size", _$escape(props.maxSize, true), false), _$ssrStyle(props.style));
100
+ const workspace = useContext(WorkspaceContext);
101
+ const providerState = useContext(LayoutStateContext);
102
+ const initialSize = () => {
103
+ const state = workspace?.initialLayoutState() ?? providerState;
104
+ const id = props.panelId ?? "primary";
105
+ const size = props.kind === "sidebar" ? state?.sidebarCollapsed ? APP_WORKSPACE_SIDEBAR_COLLAPSED : state?.sidebarWidth : props.kind === "pane" ? state?.paneWidths?.[id] : props.kind === "detail" ? state?.detailWidths?.[id] : state?.drawerHeights?.[id];
106
+ return Math.min(props.maxSize, Math.max(props.minSize, size ?? props.defaultSize));
107
+ };
108
+ return _$ssr(_tmpl$, _$ssrAttribute("aria-label", _$escape(props.label ?? (props.kind === "sidebar" ? workspaceMessages().resizeNavigation : props.kind === "pane" ? workspaceMessages().resizeWorkspacePane : props.kind === "detail" ? workspaceMessages().resizeDetailPanel : workspaceMessages().resizeBottomDrawer), true), false) + _$ssrAttribute("aria-controls", _$escape(props.controls, true), false) + _$ssrAttribute("aria-orientation", props.kind === "drawer" ? "horizontal" : "vertical", false) + _$ssrAttribute("aria-valuemin", _$escape(props.minSize, true), false) + _$ssrAttribute("aria-valuemax", _$escape(props.maxSize, true), false) + _$ssrAttribute("aria-valuenow", _$escape(initialSize(), true), false) + _$ssrAttribute("data-workspace-level-shown", _$escape(props.levelShown, true), false) + _$ssrAttribute("data-app-workspace-resize", _$escape(props.kind, true), false) + _$ssrAttribute("data-workspace-panel-id", _$escape(props.panelId, true), false) + _$ssrAttribute("data-workspace-resize-edge", _$escape(props.edge, true), false) + _$ssrAttribute("data-workspace-resize-shadow", props.shadow ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-workspace-default-size", _$escape(props.defaultSize, true), false) + _$ssrAttribute("data-workspace-min-size", _$escape(props.minSize, true), false) + _$ssrAttribute("data-workspace-max-size", _$escape(props.maxSize, true), false), _$ssrStyle(props.style));
95
109
  }
96
110
 
97
111
  /**
@@ -126,10 +140,41 @@ function AppWorkspaceMainPane(props) {
126
140
  domId: `k2b-workspace-pane-${createUniqueId()}`
127
141
  };
128
142
  }
143
+
144
+ /** A level's head; `children` is its back step. It mounts and cleans up with its open pane. */
145
+ function LevelHead(props) {
146
+ // Read each slot once: every read of a JSX prop builds it again, and the
147
+ // server and the client would then disagree on hydration keys.
148
+ const description = children(() => props.description);
149
+ const actions = children(() => props.actions);
150
+ return _$ssr(_tmpl$4, _$escape(props.children), _$escape(props.label), _$escape(_$createComponent(Show, {
151
+ get when() {
152
+ return description();
153
+ },
154
+ get children() {
155
+ return _$ssr(_tmpl$2, _$escape(description()));
156
+ }
157
+ })), _$escape(_$createComponent(Show, {
158
+ get when() {
159
+ return actions();
160
+ },
161
+ get children() {
162
+ return _$ssr(_tmpl$3, _$escape(actions()));
163
+ }
164
+ })));
165
+ }
129
166
  function AppWorkspaceMain(props) {
130
167
  const rootResizable = useContext(ResizeContext);
168
+ const workspaceMessages = useWorkspaceMessages();
169
+ const levelsMode = createMemo(() => props.level !== undefined);
131
170
  const resolved = children(() => props.children);
132
- const values = createMemo(() => flatten(resolved()));
171
+ const values = createMemo(() => {
172
+ const all = flatten(resolved());
173
+ if (levelsMode() && all.some(value => !mainPaneSlot(value))) {
174
+ throw new Error("AppWorkspace.Main level requires only AppWorkspace.MainPane children.");
175
+ }
176
+ return all;
177
+ });
133
178
  const paneIds = createMemo(() => {
134
179
  const ids = values().filter(mainPaneSlot).map(slot => slot.props.id);
135
180
  assertUniqueStableUiIds(ids, "AppWorkspace.MainPane id");
@@ -159,7 +204,48 @@ function AppWorkspaceMain(props) {
159
204
  });
160
205
  return result;
161
206
  });
162
- const anchorRegion = createMemo(() => regions().find(candidate => candidate.type === "primary") ?? regions().find(candidate => candidate.type === "pane" && candidate.slot.props.open !== false));
207
+ const levels = createMemo(() => {
208
+ const open = values().filter(mainPaneSlot).filter(slot => slot.props.open !== false);
209
+ if (levelsMode()) {
210
+ for (const pane of open.slice(0, -1)) {
211
+ if (!pane.props.href) throw new Error(`AppWorkspace.MainPane "${pane.props.id}" requires href before the last level.`);
212
+ }
213
+ }
214
+ return open;
215
+ });
216
+ const depth = () => Math.max(1, levels().findIndex(pane => pane.props.id === props.level) + 1);
217
+ const levelClasses = (index, kind) => [1, 2, 3].filter(widthClass => {
218
+ const count = Math.min(widthClass, levels().length);
219
+ const end = Math.max(depth(), count);
220
+ const start = end - count + 1;
221
+ return kind === "first" ? index === start && index > 1 : kind === "last" ? index === end : kind === "handle" ? index >= start && index + 1 <= end : index >= start && index <= end;
222
+ }).join(" ");
223
+ const anchorRegion = createMemo(() => (levelsMode() ? regions().find(candidate => candidate.type === "pane" && candidate.slot === levels().at(-1)) : undefined) ?? regions().find(candidate => candidate.type === "primary") ?? regions().find(candidate => candidate.type === "pane" && candidate.slot.props.open !== false));
224
+ // A level change can hide the control that made it: the back step, or a row
225
+ // of a list that a phone no longer shows. Focus then moves to the title of
226
+ // the selected level, so keyboard and screen reader users keep their place.
227
+ // The back step to the first level unmounts, and focus has left with it by
228
+ // the time the level changes, so pressing it is remembered.
229
+ let mainElement;
230
+ let backStepFocused = false;
231
+ const navigateBack = event => {
232
+ backStepFocused = Boolean(mainElement?.contains(document.activeElement));
233
+ return props.onLevelNavigate?.(event);
234
+ };
235
+ createEffect(on(() => levelsMode() ? depth() : 0, current => {
236
+ const pressedBack = backStepFocused;
237
+ backStepFocused = false;
238
+ const focused = document.activeElement;
239
+ if (!current || !mainElement) return;
240
+ const lost = pressedBack && (!focused || focused === document.body);
241
+ const hidden = focused instanceof HTMLElement && mainElement.contains(focused) && focused.getClientRects().length === 0;
242
+ if (!lost && !hidden) return;
243
+ mainElement.querySelector(`:scope > [data-workspace-level="${current}"] > .k2b-app-workspace__level-head h2`)?.focus({
244
+ preventScroll: true
245
+ });
246
+ }, {
247
+ defer: true
248
+ }));
163
249
  // Presence of a MainPane slot — not of an *open* one — decides the split
164
250
  // layout. Deriving it from `regions()` made a workspace whose panes are all
165
251
  // closed fall back to `resolved()`, which renders the raw slot objects.
@@ -168,8 +254,14 @@ function AppWorkspaceMain(props) {
168
254
  get ["class"]() {
169
255
  return `k2b-app-workspace__main ${hasPanes() ? "has-panes" : ""} ${props.class ?? ""}`;
170
256
  },
257
+ get ["data-workspace-levels"]() {
258
+ return levelsMode() ? "" : undefined;
259
+ },
260
+ get ["data-workspace-level-count"]() {
261
+ return levelsMode() ? levels().length : undefined;
262
+ },
171
263
  get ["data-mobile-pane"]() {
172
- return props.mobilePane;
264
+ return levelsMode() ? undefined : props.mobilePane;
173
265
  },
174
266
  get ["data-width"]() {
175
267
  return props.width === "content" ? "content" : undefined;
@@ -201,9 +293,11 @@ function AppWorkspaceMain(props) {
201
293
  return props.mobilePane ?? (anchor?.type === "pane" ? anchor.slot.props.id : "main");
202
294
  };
203
295
  if (region.type === "primary") {
204
- return _$ssr(_tmpl$2, _$ssrAttribute("data-workspace-mobile-active", activeMobilePane() === "main" ? "true" : "false", false), _$escape(region.children));
296
+ return _$ssr(_tmpl$5, _$ssrAttribute("data-workspace-mobile-active", activeMobilePane() === "main" ? "true" : "false", false), _$escape(region.children));
205
297
  }
206
298
  const pane = region.slot;
299
+ const levelIndex = () => levels().indexOf(pane) + 1;
300
+ const levelAttr = kind => levelsMode() ? levelClasses(levelIndex(), kind) : undefined;
207
301
  const panelId = assertStableUiId(pane.props.id, "AppWorkspace.MainPane id");
208
302
  const variable = appWorkspacePanelVariable("pane", panelId);
209
303
  const isAnchor = () => region === anchorRegion();
@@ -211,9 +305,12 @@ function AppWorkspaceMain(props) {
211
305
  const defaultSize = () => pane.props.defaultSize ?? APP_WORKSPACE_PANE_DEFAULT;
212
306
  const minSize = () => pane.props.minSize ?? APP_WORKSPACE_PANE_MIN;
213
307
  const maxSize = () => Math.max(minSize(), pane.props.maxSize ?? APP_WORKSPACE_PANE_MAX);
214
- const before = () => region.index < (anchorRegion()?.index ?? 0);
308
+ const before = () => levelsMode() || region.index < (anchorRegion()?.index ?? 0);
215
309
  const handle = () => _$createComponent(ResizeHandle, {
216
310
  kind: "pane",
311
+ get levelShown() {
312
+ return levelAttr("handle");
313
+ },
217
314
  get edge() {
218
315
  return before() ? "end" : "start";
219
316
  },
@@ -249,10 +346,50 @@ function AppWorkspaceMain(props) {
249
346
  get children() {
250
347
  return handle();
251
348
  }
252
- }), _$ssr(_tmpl$3, _$ssrAttribute("id", _$escape(pane.domId, true), false), `k2b-app-workspace__main-pane ${isAnchor() ? "is-primary" : ""} ${_$escape(pane.props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(pane.props.label, true), false) + _$ssrAttribute("data-workspace-main-region", _$escape(pane.props.id, true), false) + _$ssrAttribute("data-workspace-mobile-active", activeMobilePane() === pane.props.id ? "true" : "false", false) + _$ssrAttribute("data-workspace-panel-id", _$escape(panelId, true), false) + _$ssrAttribute("data-workspace-resizable", resizable() ? "true" : "false", false) + _$ssrAttribute("data-surface", pane.props.surface === "navigation" ? "navigation" : _$escape(undefined, true), false) + _$ssrAttribute("data-scroll", pane.props.scroll === false ? "false" : _$escape(undefined, true), false) + _$ssrAttribute("data-scroll-fade-mode", pane.props.scroll !== false && pane.props.scrollFade !== false ? "both" : _$escape(undefined, true), false), _$ssrStyle(isAnchor() ? undefined : {
253
- "--k2b-workspace-panel-size": `var(${variable}, ${defaultSize()}px)`,
349
+ }), _$ssr(_tmpl$6, _$ssrAttribute("id", _$escape(pane.domId, true), false), `k2b-app-workspace__main-pane ${isAnchor() ? "is-primary" : ""} ${_$escape(pane.props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(pane.props.label, true), false) + _$ssrAttribute("data-workspace-level", levelsMode() ? _$escape(levelIndex(), true) : _$escape(undefined, true), false) + _$ssrAttribute("data-workspace-level-shown", _$escape(levelAttr("shown"), true), false) + _$ssrAttribute("data-workspace-level-first", _$escape(levelAttr("first"), true), false) + _$ssrAttribute("data-workspace-level-last", _$escape(levelAttr("last"), true), false) + _$ssrAttribute("data-workspace-main-region", _$escape(pane.props.id, true), false) + _$ssrAttribute("data-workspace-mobile-active", (levelsMode() ? levelClasses(levelIndex(), "shown").split(" ").includes("1") : activeMobilePane() === pane.props.id) ? "true" : "false", false) + _$ssrAttribute("data-workspace-panel-id", _$escape(panelId, true), false) + _$ssrAttribute("data-workspace-resizable", resizable() ? "true" : "false", false) + _$ssrAttribute("data-surface", pane.props.surface === "navigation" ? "navigation" : _$escape(undefined, true), false) + _$ssrAttribute("data-scroll", !levelsMode() && pane.props.scroll === false ? "false" : _$escape(undefined, true), false) + _$ssrAttribute("data-scroll-fade-mode", !levelsMode() && pane.props.scroll !== false && pane.props.scrollFade !== false ? "both" : _$escape(undefined, true), false), _$ssrStyle(isAnchor() ? undefined : {
350
+ // A stored width keeps to this pane's limits before the controller attaches.
351
+ "--k2b-workspace-panel-size": `clamp(${minSize()}px, var(${variable}, ${defaultSize()}px), ${maxSize()}px)`,
254
352
  "--k2b-workspace-panel-min": `${minSize()}px`
255
- }), _$escape(pane.props.children)), _$createComponent(Show, {
353
+ }), levelsMode() ? _$escape([_$createComponent(LevelHead, {
354
+ get label() {
355
+ return pane.props.label;
356
+ },
357
+ get description() {
358
+ return pane.props.description;
359
+ },
360
+ get actions() {
361
+ return pane.props.actions;
362
+ },
363
+ get children() {
364
+ return _$createComponent(Show, {
365
+ get when() {
366
+ return _$memo(() => levelIndex() > 1)() && depth() > 1;
367
+ },
368
+ get children() {
369
+ return _$createComponent(IconButtonLink, {
370
+ "class": "k2b-app-workspace__level-back",
371
+ get href() {
372
+ return levels()[depth() - 2]?.props.href;
373
+ },
374
+ get label() {
375
+ return workspaceMessages().backTo({
376
+ page: levels()[levelIndex() - 2]?.props.label ?? ""
377
+ });
378
+ },
379
+ get navigation() {
380
+ return props.onLevelNavigate ? "enhanced" : "document";
381
+ },
382
+ get onNavigate() {
383
+ return props.onLevelNavigate ? navigateBack : undefined;
384
+ },
385
+ get children() {
386
+ return _$ssr(_tmpl$7);
387
+ }
388
+ });
389
+ }
390
+ });
391
+ }
392
+ }), _$ssr(_tmpl$8, _$ssrAttribute("data-scroll", pane.props.scroll === false ? "false" : _$escape(undefined, true), false) + _$ssrAttribute("data-scroll-fade-mode", pane.props.scroll !== false && pane.props.scrollFade !== false ? "both" : _$escape(undefined, true), false), _$escape(pane.props.children))]) : _$escape(pane.props.children)), _$createComponent(Show, {
256
393
  get when() {
257
394
  return _$memo(() => !!resizable())() && before();
258
395
  },
@@ -315,7 +452,7 @@ function AppWorkspaceDetail(props) {
315
452
  aside?.removeEventListener(APP_WORKSPACE_DETAIL_STEP_EVENT, step);
316
453
  });
317
454
  });
318
- return [_$ssr(_tmpl$4, workspaceRule()), _$createComponent(Show, {
455
+ return [_$ssr(_tmpl$9, workspaceRule()), _$createComponent(Show, {
319
456
  get when() {
320
457
  return resizable();
321
458
  },
@@ -343,7 +480,7 @@ function AppWorkspaceDetail(props) {
343
480
  }
344
481
  });
345
482
  }
346
- }), _$ssr(_tmpl$5, _$ssrAttribute("id", _$escape(domId(), true), false), `k2b-app-workspace__detail ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-width", _$escape(props.width ?? "md", true), false) + _$ssrAttribute("data-workspace-panel-id", _$escape(panelId(), true), false) + _$ssrAttribute("data-workspace-resizable", resizable() ? "true" : "false", false) + _$ssrAttribute("data-workspace-detail-closable", props.onClose ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-workspace-detail-steppable", props.onStep ? "true" : _$escape(undefined, true), false), _$ssrAttribute("hidden", !props.open, true), _$ssrStyle({
483
+ }), _$ssr(_tmpl$0, _$ssrAttribute("id", _$escape(domId(), true), false), `k2b-app-workspace__detail ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-width", _$escape(props.width ?? "md", true), false) + _$ssrAttribute("data-workspace-detail-phone", props.phone === "page" ? "page" : _$escape(undefined, true), false) + _$ssrAttribute("data-workspace-panel-id", _$escape(panelId(), true), false) + _$ssrAttribute("data-workspace-resizable", resizable() ? "true" : "false", false) + _$ssrAttribute("data-workspace-detail-closable", props.onClose ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-workspace-detail-steppable", props.onStep ? "true" : _$escape(undefined, true), false), _$ssrAttribute("hidden", !props.open, true), _$ssrStyle({
347
484
  ...sizeStyle(),
348
485
  "view-transition-name": props.viewTransitionName
349
486
  }), _$ssrAttribute("aria-label", _$escape(workspaceMessages().detailFullHeight, true), false), _$escape(props.children))];
@@ -394,7 +531,7 @@ function AppWorkspaceBottomDrawer(props) {
394
531
  }
395
532
  });
396
533
  }
397
- }), _$ssr(_tmpl$6, _$ssrAttribute("id", _$escape(domId(), true), false), `k2b-app-workspace__drawer ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-height", _$escape(props.height ?? "md", true), false) + _$ssrAttribute("data-workspace-panel-id", _$escape(panelId(), true), false) + _$ssrAttribute("data-workspace-resizable", resizable() ? "true" : "false", false), _$ssrAttribute("hidden", !props.open, true), _$ssrStyleProperty("--k2b-workspace-panel-size:", `var(${_$escape(variable(), true)}, ${_$escape(defaultHeight(), true)}px)`) + _$ssrStyleProperty(";view-transition-name:", _$escape(props.viewTransitionName, true)), _$escape(props.children))];
534
+ }), _$ssr(_tmpl$1, _$ssrAttribute("id", _$escape(domId(), true), false), `k2b-app-workspace__drawer ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-height", _$escape(props.height ?? "md", true), false) + _$ssrAttribute("data-workspace-panel-id", _$escape(panelId(), true), false) + _$ssrAttribute("data-workspace-resizable", resizable() ? "true" : "false", false), _$ssrAttribute("hidden", !props.open, true), _$ssrStyleProperty("--k2b-workspace-panel-size:", `var(${_$escape(variable(), true)}, ${_$escape(defaultHeight(), true)}px)`) + _$ssrStyleProperty(";view-transition-name:", _$escape(props.viewTransitionName, true)), _$escape(props.children))];
398
535
  }
399
536
  function AppWorkspaceSidebar(props) {
400
537
  const rootResizable = useContext(ResizeContext);
@@ -418,12 +555,12 @@ function AppWorkspaceSidebar(props) {
418
555
  aside?.addEventListener(APP_WORKSPACE_SIDEBAR_HIDE_EVENT, requestHide);
419
556
  onCleanup(() => aside?.removeEventListener(APP_WORKSPACE_SIDEBAR_HIDE_EVENT, requestHide));
420
557
  });
421
- return [_$ssr(_tmpl$8, _$ssrAttribute("id", _$escape(domId(), true), false), `k2b-app-workspace__sidebar ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$ssrAttribute("hidden", props.hidden || undefined, true) + _$ssrAttribute("data-mobile", props.mobile === "stacked" ? "stacked" : _$escape(undefined, true), false) + _$ssrAttribute("data-workspace-resizable", resizable() ? "true" : "false", false) + _$ssrAttribute("data-workspace-collapsible", props.collapsible ? "true" : "false", false) + _$ssrAttribute("data-workspace-hideable", props.onHiddenChange ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
558
+ return [_$ssr(_tmpl$11, _$ssrAttribute("id", _$escape(domId(), true), false), `k2b-app-workspace__sidebar ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$ssrAttribute("hidden", props.hidden || undefined, true) + _$ssrAttribute("data-mobile", props.mobile === "stacked" ? "stacked" : _$escape(undefined, true), false) + _$ssrAttribute("data-workspace-resizable", resizable() ? "true" : "false", false) + _$ssrAttribute("data-workspace-collapsible", props.collapsible ? "true" : "false", false) + _$ssrAttribute("data-workspace-hideable", props.onHiddenChange ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
422
559
  get when() {
423
560
  return !props.hidden;
424
561
  },
425
562
  get children() {
426
- return _$ssr(_tmpl$7, _$escape(desktop()?.children));
563
+ return _$ssr(_tmpl$10, _$escape(desktop()?.children));
427
564
  }
428
565
  }))), _$createComponent(Show, {
429
566
  get when() {
@@ -456,20 +593,18 @@ const AppWorkspaceSidebarDesktop = props => ({
456
593
  kind: SIDEBAR_DESKTOP,
457
594
  children: props.children
458
595
  });
459
- // Document navigations rebuild the sidebar from the server, so this inline
460
- // script restores its offset while the document is still parsing: before the
461
- // first paint, before a view transition can snapshot it, and before any island
462
- // hydrates. Islands load asynchronously and server-only sidebars never mount,
463
- // so `onMount` would be too late or never run. The memory is one
464
- // `sessionStorage` entry per path segment and sidebar position and ends with
465
- // the tab. A stored offset is applied first; the current item, or on a deeper
466
- // page the item that contains it, is then kept in view, which is a no-op when
467
- // the offset already shows it. The frame callback
468
- // repeats the restore once the whole document is parsed, because content that
469
- // follows the sidebar can still change its height before the first paint.
470
- const SIDEBAR_SCROLL_MEMORY_SCRIPT = ["(function(){", "var body=document.currentScript&&document.currentScript.previousElementSibling;if(!body)return;", "var storage;try{storage=window.sessionStorage}catch(_){return}", 'var key="k2b-sidebar-scroll:"+location.pathname.split("/")[1]+":"+document.querySelectorAll(".k2b-app-workspace__sidebar-body").length;', "var restore=function(){", "var stored=storage.getItem(key);if(stored!==null)body.scrollTop=Number(stored);", 'var current=body.querySelector(\'[aria-current="page"]\')||body.querySelector(\'[aria-current="true"]\');if(current)current.scrollIntoView({block:"nearest"});', "};", "restore();requestAnimationFrame(restore);", "var frame=0;", 'body.addEventListener("scroll",function(){if(frame)return;frame=requestAnimationFrame(function(){frame=0;try{storage.setItem(key,String(body.scrollTop))}catch(_){}})},{passive:true});', "})();"].join("");
596
+ // The inline script restores server markup while parsing; onMount restores a
597
+ // client-rendered sidebar when an island replaces it. Both paths keep the
598
+ // current item in view and set the fade before paint, repeating the restore
599
+ // in the first frame when the whole document has its final layout. Only
600
+ // pagehide stores the offset: restores before final layout can be clamped,
601
+ // and remembering those programmatic scrolls would shrink the stored offset.
602
+ // Memory is per scroll-preserve key (or page path) and sidebar position and
603
+ // ends with the tab.
604
+ const SIDEBAR_SCROLL_MEMORY_SCRIPT = `(${rememberSidebarScroll})(document.currentScript&&document.currentScript.previousElementSibling,${scrollFadeEdges})`;
471
605
  const AppWorkspaceSidebarBody = props => {
472
606
  let body;
607
+ onMount(() => onCleanup(rememberSidebarScroll(body, scrollFadeEdges)));
473
608
  createScrollFade(() => body, () => props.scrollFade !== false);
474
609
  return [_$ssrElement("div", _$mergeProps({
475
610
  get ["class"]() {
@@ -478,7 +613,7 @@ const AppWorkspaceSidebarBody = props => {
478
613
  get ["data-scroll-fade-mode"]() {
479
614
  return props.scrollFade !== false ? "both" : undefined;
480
615
  }
481
- }, () => scrollAttrs(props.scrollPreserveKey), () => modeAttrs(props.sidebarMode)), _$escape(props.children), false), _$ssr(_tmpl$9, SIDEBAR_SCROLL_MEMORY_SCRIPT)];
616
+ }, () => scrollAttrs(props.scrollPreserveKey), () => modeAttrs(props.sidebarMode)), _$escape(props.children), false), _$ssr(_tmpl$12, SIDEBAR_SCROLL_MEMORY_SCRIPT)];
482
617
  };
483
618
  const AppWorkspaceSidebarFooter = props => _$ssrElement("footer", _$mergeProps({
484
619
  get ["class"]() {
@@ -494,14 +629,14 @@ const AppWorkspaceSidebarSection = props => {
494
629
  return props.icon;
495
630
  },
496
631
  get children() {
497
- return _$ssr(_tmpl$0, _$ssrAttribute("class", _$escape(iconClass(props.icon), true), false));
632
+ return _$ssr(_tmpl$13, _$ssrAttribute("class", _$escape(iconClass(props.icon), true), false));
498
633
  }
499
634
  }), props.title, _$createComponent(Show, {
500
635
  get when() {
501
636
  return props.count !== undefined;
502
637
  },
503
638
  get children() {
504
- return _$ssr(_tmpl$1, _$escape(props.count));
639
+ return _$ssr(_tmpl$14, _$escape(props.count));
505
640
  }
506
641
  })];
507
642
  return _$ssrElement("section", _$mergeProps({
@@ -516,7 +651,7 @@ const AppWorkspaceSidebarSection = props => {
516
651
  return props.title || props.actions;
517
652
  },
518
653
  get children() {
519
- return _$ssr(_tmpl$12, _$escape(_$createComponent(Show, {
654
+ return _$ssr(_tmpl$17, _$escape(_$createComponent(Show, {
520
655
  get when() {
521
656
  return props.collapsible;
522
657
  },
@@ -526,23 +661,23 @@ const AppWorkspaceSidebarSection = props => {
526
661
  return props.title;
527
662
  },
528
663
  get children() {
529
- return _$ssr(_tmpl$14, _$escape(title()));
664
+ return _$ssr(_tmpl$19, _$escape(title()));
530
665
  }
531
666
  });
532
667
  },
533
668
  get children() {
534
- return _$ssr(_tmpl$10, _$ssrAttribute("aria-expanded", _$escape(open(), true), false) + _$ssrAttribute("aria-controls", _$escape(id, true), false), _$escape(title()), _$ssrAttribute("class", open() ? "ti ti-chevron-down" : "ti ti-chevron-right", false));
669
+ return _$ssr(_tmpl$15, _$ssrAttribute("aria-expanded", _$escape(open(), true), false) + _$ssrAttribute("aria-controls", _$escape(id, true), false), _$escape(title()), _$ssrAttribute("class", open() ? "ti ti-chevron-down" : "ti ti-chevron-right", false));
535
670
  }
536
671
  })), _$escape(_$createComponent(Show, {
537
672
  get when() {
538
673
  return props.actions;
539
674
  },
540
675
  get children() {
541
- return _$ssr(_tmpl$11, _$escape(props.actions));
676
+ return _$ssr(_tmpl$16, _$escape(props.actions));
542
677
  }
543
678
  })));
544
679
  }
545
- })), _$ssr(_tmpl$13, _$ssrAttribute("id", _$escape(id, true), false), _$ssrAttribute("hidden", !open(), true), _$escape(props.children))], false);
680
+ })), _$ssr(_tmpl$18, _$ssrAttribute("id", _$escape(id, true), false), _$ssrAttribute("hidden", !open(), true), _$escape(props.children))], false);
546
681
  };
547
682
  const AppWorkspaceSidebarItemIcon = props => mergeProps({
548
683
  kind: SIDEBAR_ITEM_ICON
@@ -556,7 +691,7 @@ const AppWorkspaceSidebarItemMeta = props => mergeProps({
556
691
  const AppWorkspaceSidebarItemAction = props => mergeProps({
557
692
  kind: SIDEBAR_ITEM_ACTION
558
693
  }, props);
559
- const AppWorkspaceSidebarItemActions = props => _$ssr(_tmpl$15, _$ssrAttribute("data-visibility", props.visibility === "hover" ? "hover" : _$escape(undefined, true), false), _$escape(props.children));
694
+ const AppWorkspaceSidebarItemActions = props => _$ssr(_tmpl$20, _$ssrAttribute("data-visibility", props.visibility === "hover" ? "hover" : _$escape(undefined, true), false), _$escape(props.children));
560
695
  const AppWorkspaceSidebarItemStatus = props => {
561
696
  const workspaceMessages = useWorkspaceMessages();
562
697
  const waiting = () => props.waiting && Number.isFinite(props.waiting.count) ? Math.max(0, Math.floor(props.waiting.count)) : null;
@@ -572,7 +707,7 @@ const AppWorkspaceSidebarItemStatus = props => {
572
707
  // The element itself stays when there is nothing to show: empty, it takes no
573
708
  // space, and it still keeps the row's label on one line, so the first count
574
709
  // never re-wraps the label and moves the rows below.
575
- return _$ssr(_tmpl$21, _$ssrAttribute("data-unread", waiting() !== null ? _$escape(undefined, true) : count() ? "count" : dot() ? "dot" : _$escape(undefined, true), false) + _$ssrAttribute("data-waiting", waiting() === null ? _$escape(undefined, true) : waiting() ? "count" : "zero", false), _$escape(_$createComponent(Show, {
710
+ return _$ssr(_tmpl$26, _$ssrAttribute("data-unread", waiting() !== null ? _$escape(undefined, true) : count() ? "count" : dot() ? "dot" : _$escape(undefined, true), false) + _$ssrAttribute("data-waiting", waiting() === null ? _$escape(undefined, true) : waiting() ? "count" : "zero", false), _$escape(_$createComponent(Show, {
576
711
  get when() {
577
712
  return description();
578
713
  },
@@ -582,16 +717,16 @@ const AppWorkspaceSidebarItemStatus = props => {
582
717
  return props.mention;
583
718
  },
584
719
  get children() {
585
- return _$ssr(_tmpl$16);
720
+ return _$ssr(_tmpl$21);
586
721
  }
587
722
  }), _$createComponent(Show, {
588
723
  get when() {
589
724
  return props.muted;
590
725
  },
591
726
  get children() {
592
- return _$ssr(_tmpl$17);
727
+ return _$ssr(_tmpl$22);
593
728
  }
594
- }), _$ssr(_tmpl$19, _$escape(_$createComponent(Show, {
729
+ }), _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
595
730
  get when() {
596
731
  return count() || waiting() === 0;
597
732
  },
@@ -601,14 +736,14 @@ const AppWorkspaceSidebarItemStatus = props => {
601
736
  return dot();
602
737
  },
603
738
  get children() {
604
- return _$ssr(_tmpl$22);
739
+ return _$ssr(_tmpl$27);
605
740
  }
606
741
  });
607
742
  },
608
743
  get children() {
609
- return _$ssr(_tmpl$18, _$ssrAttribute("data-mention", props.mention ? "true" : _$escape(undefined, true), false), count() > 99 ? "99+" : _$escape(count()));
744
+ return _$ssr(_tmpl$23, _$ssrAttribute("data-mention", props.mention ? "true" : _$escape(undefined, true), false), count() > 99 ? "99+" : _$escape(count()));
610
745
  }
611
- }))), _$ssr(_tmpl$20, _$escape(description()))];
746
+ }))), _$ssr(_tmpl$25, _$escape(description()))];
612
747
  }
613
748
  })));
614
749
  };
@@ -748,19 +883,19 @@ function AppWorkspaceSidebarItem(props) {
748
883
  return iconContent() || icon();
749
884
  },
750
885
  get children() {
751
- return _$ssr(_tmpl$23, _$escape(iconContent() ?? _$ssr(_tmpl$29, _$ssrAttribute("class", _$escape(iconClass(icon()), true), false))));
886
+ return _$ssr(_tmpl$28, _$escape(iconContent() ?? _$ssr(_tmpl$34, _$ssrAttribute("class", _$escape(iconClass(icon()), true), false))));
752
887
  }
753
- }), _$ssr(_tmpl$27, _$escape(_$createComponent(Show, {
888
+ }), _$ssr(_tmpl$32, _$escape(_$createComponent(Show, {
754
889
  get when() {
755
890
  return props.context || props.contextMeta;
756
891
  },
757
892
  get children() {
758
- return _$ssr(_tmpl$25, _$escape(props.context), _$escape(_$createComponent(Show, {
893
+ return _$ssr(_tmpl$30, _$escape(props.context), _$escape(_$createComponent(Show, {
759
894
  get when() {
760
895
  return props.contextMeta;
761
896
  },
762
897
  get children() {
763
- return _$ssr(_tmpl$24, _$escape(props.contextMeta));
898
+ return _$ssr(_tmpl$29, _$escape(props.contextMeta));
764
899
  }
765
900
  })));
766
901
  }
@@ -769,14 +904,14 @@ function AppWorkspaceSidebarItem(props) {
769
904
  return props.description;
770
905
  },
771
906
  get children() {
772
- return _$ssr(_tmpl$26, _$escape(props.description));
907
+ return _$ssr(_tmpl$31, _$escape(props.description));
773
908
  }
774
909
  }))), _$createComponent(Show, {
775
910
  get when() {
776
911
  return hasMeta();
777
912
  },
778
913
  get children() {
779
- return _$ssr(_tmpl$28, _$ssrAttribute("id", props.preview?.trigger === "row" ? _$escape(metaId, true) : _$escape(undefined, true), false) + _$ssrAttribute("data-visibility", metaVisibility() === "hover" ? "hover" : _$escape(undefined, true), false), _$escape(meta()));
914
+ return _$ssr(_tmpl$33, _$ssrAttribute("id", props.preview?.trigger === "row" ? _$escape(metaId, true) : _$escape(undefined, true), false) + _$ssrAttribute("data-visibility", metaVisibility() === "hover" ? "hover" : _$escape(undefined, true), false), _$escape(meta()));
780
915
  }
781
916
  })];
782
917
  const singleAction = () => {
@@ -791,7 +926,7 @@ function AppWorkspaceSidebarItem(props) {
791
926
  actionSlot()?.onSelect?.(event);
792
927
  props.onActionClick?.(event);
793
928
  };
794
- const content = () => actionSlot()?.children ?? _$ssr(_tmpl$29, _$ssrAttribute("class", _$escape(iconClass(actionSlot()?.icon ?? props.actionIcon, "ti-dots"), true), false));
929
+ const content = () => actionSlot()?.children ?? _$ssr(_tmpl$34, _$ssrAttribute("class", _$escape(iconClass(actionSlot()?.icon ?? props.actionIcon, "ti-dots"), true), false));
795
930
  return _$createComponent(Show, {
796
931
  get when() {
797
932
  return Boolean(actionSlot() || props.actionIcon);
@@ -802,10 +937,10 @@ function AppWorkspaceSidebarItem(props) {
802
937
  return _$memo(() => !!actionSlot()?.href)() && !actionSlot()?.disabled;
803
938
  },
804
939
  get fallback() {
805
- return _$ssr(_tmpl$31, _$ssrAttribute("disabled", actionSlot()?.disabled, true) + _$ssrAttribute("data-visibility", actionSlot()?.visibility === "hover" ? "hover" : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", _$escape(label(), true), false), _$escape(content()));
940
+ return _$ssr(_tmpl$36, _$ssrAttribute("disabled", actionSlot()?.disabled, true) + _$ssrAttribute("data-visibility", actionSlot()?.visibility === "hover" ? "hover" : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", _$escape(label(), true), false), _$escape(content()));
806
941
  },
807
942
  get children() {
808
- return _$ssr(_tmpl$30, _$ssrAttribute("href", _$escape(actionSlot()?.href, true), false), _$ssrAttribute("data-visibility", actionSlot()?.visibility === "hover" ? "hover" : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", _$escape(label(), true), false), _$escape(content()));
943
+ return _$ssr(_tmpl$35, _$ssrAttribute("href", _$escape(actionSlot()?.href, true), false), _$ssrAttribute("data-visibility", actionSlot()?.visibility === "hover" ? "hover" : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", _$escape(label(), true), false), _$escape(content()));
809
944
  }
810
945
  });
811
946
  }
@@ -1111,31 +1246,31 @@ const AppWorkspaceNavTree = props => {
1111
1246
  get ["data-k2b-nav-tree-toggle"]() {
1112
1247
  return usesIconDisclosure() ? "" : undefined;
1113
1248
  }
1114
- }, () => iconAccessibility(item.iconLabel)), _$ssr(_tmpl$29, _$ssrAttribute("class", _$escape(iconClass(rowIcon()), true), false)), false);
1249
+ }, () => iconAccessibility(item.iconLabel)), _$ssr(_tmpl$34, _$ssrAttribute("class", _$escape(iconClass(rowIcon()), true), false)), false);
1115
1250
  }
1116
1251
  }), _$createComponent(Show, {
1117
1252
  get when() {
1118
1253
  return item.description !== undefined;
1119
1254
  },
1120
1255
  get fallback() {
1121
- return _$ssr(_tmpl$35, _$ssrAttribute("data-label", typeof item.label === "string" ? _$escape(item.label, true) : _$escape(undefined, true), false), _$escape(item.label));
1256
+ return _$ssr(_tmpl$40, _$ssrAttribute("data-label", typeof item.label === "string" ? _$escape(item.label, true) : _$escape(undefined, true), false), _$escape(item.label));
1122
1257
  },
1123
1258
  get children() {
1124
- return _$ssr(_tmpl$32, _$ssrAttribute("data-label", typeof item.label === "string" ? _$escape(item.label, true) : _$escape(undefined, true), false), _$escape(item.label), _$escape(item.description));
1259
+ return _$ssr(_tmpl$37, _$ssrAttribute("data-label", typeof item.label === "string" ? _$escape(item.label, true) : _$escape(undefined, true), false), _$escape(item.label), _$escape(item.description));
1125
1260
  }
1126
1261
  }), _$createComponent(Show, {
1127
1262
  get when() {
1128
1263
  return item.meta !== undefined;
1129
1264
  },
1130
1265
  get children() {
1131
- return _$ssr(_tmpl$33, `k2b-app-workspace__sidebar-item-meta ${hasChildren() ? "" : "k2b-app-workspace__nav-tree-leaf-meta"}`, _$ssrAttribute("data-visibility", item.metaVisibility === "hover" ? "hover" : _$escape(undefined, true), false), _$escape(item.meta));
1266
+ return _$ssr(_tmpl$38, `k2b-app-workspace__sidebar-item-meta ${hasChildren() ? "" : "k2b-app-workspace__nav-tree-leaf-meta"}`, _$ssrAttribute("data-visibility", item.metaVisibility === "hover" ? "hover" : _$escape(undefined, true), false), _$escape(item.meta));
1132
1267
  }
1133
1268
  }), _$createComponent(Show, {
1134
1269
  get when() {
1135
1270
  return _$memo(() => !!hasChildren())() && !usesIconDisclosure();
1136
1271
  },
1137
1272
  get children() {
1138
- return _$ssr(_tmpl$34, `ti ${isExpanded(item.id) ? "ti-chevron-down" : "ti-chevron-right"}`);
1273
+ return _$ssr(_tmpl$39, `ti ${isExpanded(item.id) ? "ti-chevron-down" : "ti-chevron-right"}`);
1139
1274
  }
1140
1275
  })];
1141
1276
  const row = () => _$createComponent(AppWorkspaceSidebarRow, {
@@ -1242,12 +1377,12 @@ const AppWorkspaceNavTree = props => {
1242
1377
  endDrag();
1243
1378
  requestMove(target.move, false);
1244
1379
  };
1245
- return _$ssr(_tmpl$37, _$ssrAttribute("aria-level", _$escape(depth, true) + 1, false) + _$ssrAttribute("aria-setsize", _$escape(siblings().length, true), false) + _$ssrAttribute("aria-posinset", _$escape(place(), true) + 1, false) + _$ssrAttribute("aria-selected", _$escape(selected(), true), false) + _$ssrAttribute("aria-expanded", hasChildren() ? _$escape(isExpanded(item.id), true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-disabled", item.disabled ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("tabindex", item.disabled ? -1 : tabStopId() === item.id ? 0 : -1, false) + _$ssrAttribute("draggable", movable() ? _$escape(true, true) : _$escape(undefined, true), false) + _$ssrAttribute("data-k2b-nav-tree-id", _$escape(item.id, true), false) + _$ssrAttribute("data-k2b-nav-tree-parent-id", _$escape(parentId, true), false) + _$ssrAttribute("data-k2b-nav-tree-dragging", dragged()?.id === item.id ? "" : _$escape(undefined, true), false) + _$ssrAttribute("data-k2b-nav-tree-drop", dropTarget()?.id === item.id ? _$escape(dropTarget().side, true) : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-nav-tree-depth:", _$escape(String(props.indented === false ? 0 : depth), true)), _$escape(row()), _$escape(_$createComponent(Show, {
1380
+ return _$ssr(_tmpl$42, _$ssrAttribute("aria-level", _$escape(depth, true) + 1, false) + _$ssrAttribute("aria-setsize", _$escape(siblings().length, true), false) + _$ssrAttribute("aria-posinset", _$escape(place(), true) + 1, false) + _$ssrAttribute("aria-selected", _$escape(selected(), true), false) + _$ssrAttribute("aria-expanded", hasChildren() ? _$escape(isExpanded(item.id), true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-disabled", item.disabled ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("tabindex", item.disabled ? -1 : tabStopId() === item.id ? 0 : -1, false) + _$ssrAttribute("draggable", movable() ? _$escape(true, true) : _$escape(undefined, true), false) + _$ssrAttribute("data-k2b-nav-tree-id", _$escape(item.id, true), false) + _$ssrAttribute("data-k2b-nav-tree-parent-id", _$escape(parentId, true), false) + _$ssrAttribute("data-k2b-nav-tree-dragging", dragged()?.id === item.id ? "" : _$escape(undefined, true), false) + _$ssrAttribute("data-k2b-nav-tree-drop", dropTarget()?.id === item.id ? _$escape(dropTarget().side, true) : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-nav-tree-depth:", _$escape(String(props.indented === false ? 0 : depth), true)), _$escape(row()), _$escape(_$createComponent(Show, {
1246
1381
  get when() {
1247
1382
  return _$memo(() => !!hasChildren())() && isExpanded(item.id);
1248
1383
  },
1249
1384
  get children() {
1250
- return _$ssr(_tmpl$36, _$escape(renderItems(nested, depth + 1, item.id)));
1385
+ return _$ssr(_tmpl$41, _$escape(renderItems(nested, depth + 1, item.id)));
1251
1386
  }
1252
1387
  })));
1253
1388
  }
@@ -1272,7 +1407,7 @@ const AppWorkspaceNavTree = props => {
1272
1407
  doc?.removeEventListener("pointermove", forgetDrag, true);
1273
1408
  });
1274
1409
  });
1275
- return _$ssr(_tmpl$38, `k2b-app-workspace__nav-tree ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.ariaLabel, true), false), _$escape(renderItems(roots, 0)));
1410
+ return _$ssr(_tmpl$43, `k2b-app-workspace__nav-tree ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.ariaLabel, true), false), _$escape(renderItems(roots, 0)));
1276
1411
  };
1277
1412
  AppWorkspaceNavTree.Item = AppWorkspaceNavTreeItem;
1278
1413
  const AppWorkspaceSidebarIconGrid = props => _$ssrElement("section", _$mergeProps({
@@ -1283,10 +1418,10 @@ const AppWorkspaceSidebarIconGrid = props => _$ssrElement("section", _$mergeProp
1283
1418
  get when() {
1284
1419
  return props.title;
1285
1420
  },
1286
- children: title => _$ssr(_tmpl$14, _$escape(title()))
1287
- })), _$ssr(_tmpl$39, _$ssrAttribute("data-columns", _$escape(props.columns ?? 2, true), false), _$escape(props.children))], false);
1421
+ children: title => _$ssr(_tmpl$19, _$escape(title()))
1422
+ })), _$ssr(_tmpl$44, _$ssrAttribute("data-columns", _$escape(props.columns ?? 2, true), false), _$escape(props.children))], false);
1288
1423
  const AppWorkspaceSidebarIconAction = props => {
1289
- const content = _$ssr(_tmpl$40, _$ssrAttribute("class", _$escape(iconClass(props.icon), true), false));
1424
+ const content = _$ssr(_tmpl$45, _$ssrAttribute("class", _$escape(iconClass(props.icon), true), false));
1290
1425
  const attrs = () => ({
1291
1426
  class: `k2b-app-workspace__sidebar-icon-action ${props.active ? "is-active" : ""}`,
1292
1427
  title: props.label,
@@ -1344,7 +1479,7 @@ function AppWorkspaceHead(props) {
1344
1479
  const messages = useWorkspaceMessages();
1345
1480
  // A nested workspace is part of a page that already shows its title.
1346
1481
  const trail = props.nested ? () => undefined : usePageTrail();
1347
- return _$ssr(_tmpl$42, _$ssrAttribute("data-trail", trail()?.ancestors.length ? "up" : trail() ? "title" : _$escape(undefined, true), false), _$escape(_$createComponent(IconButton, {
1482
+ return _$ssr(_tmpl$47, _$ssrAttribute("data-trail", trail()?.ancestors.length ? "up" : trail() ? "title" : _$escape(undefined, true), false), _$escape(_$createComponent(IconButton, {
1348
1483
  "class": "k2b-app-workspace__head-toggle",
1349
1484
  get label() {
1350
1485
  return messages().showNavigation;
@@ -1355,7 +1490,7 @@ function AppWorkspaceHead(props) {
1355
1490
  "aria-expanded": "false",
1356
1491
  "data-app-workspace-sidebar-toggle": "",
1357
1492
  get children() {
1358
- return _$ssr(_tmpl$41);
1493
+ return _$ssr(_tmpl$46);
1359
1494
  }
1360
1495
  })), _$escape(_$createComponent(Show, {
1361
1496
  get when() {
@@ -1367,7 +1502,7 @@ function AppWorkspaceHead(props) {
1367
1502
  },
1368
1503
  as: "p",
1369
1504
  fallback: true
1370
- }), _$ssr(_tmpl$43, _$ssrAttribute("data-k2b-server", isServer ? "" : _$escape(undefined, true), false), _$escape(current().title))]
1505
+ }), _$ssr(_tmpl$48, _$ssrAttribute("data-k2b-server", isServer ? "" : _$escape(undefined, true), false), _$escape(current().title))]
1371
1506
  })));
1372
1507
  }
1373
1508
  const AppWorkspace = props => {
@@ -1375,11 +1510,12 @@ const AppWorkspace = props => {
1375
1510
  const serverLayoutState = useContext(LayoutStateContext);
1376
1511
  const nested = Boolean(useContext(WorkspaceContext));
1377
1512
  const [sidebarId, setSidebarId] = createSignal(`k2b-workspace-sidebar-${createUniqueId()}`);
1513
+ const initialLayoutState = () => props.layoutState?.() ?? serverLayoutState;
1378
1514
  const workspace = {
1379
1515
  sidebarId: sidebarId(),
1380
- setSidebarId
1516
+ setSidebarId,
1517
+ initialLayoutState
1381
1518
  };
1382
- const initialLayoutState = () => props.layoutState?.() ?? serverLayoutState;
1383
1519
 
1384
1520
  // The resize handles are inert markup until the controller is attached, so
1385
1521
  // the workspace attaches it itself and scopes it to this root. `onMount`
@@ -1402,7 +1538,7 @@ const AppWorkspace = props => {
1402
1538
  return _$createComponent(WorkspaceContext.Provider, {
1403
1539
  value: workspace,
1404
1540
  get children() {
1405
- return _$ssr(_tmpl$44, `k2b-app-workspace ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-mobile-surface", _$escape(props.mobileSurface, true), false) + _$ssrAttribute("data-flat", props.flat ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-sidebar-collapsed", initialLayoutState()?.sidebarCollapsed === undefined ? _$escape(undefined, true) : _$escape(String(initialLayoutState()?.sidebarCollapsed), true), false) + _$ssrAttribute("data-workspace-resizable", props.resizable === false ? "false" : "true", false), _$ssrStyle(appWorkspaceLayoutStyle(initialLayoutState())), _$escape(_$createComponent(AppWorkspaceHead, {
1541
+ return _$ssr(_tmpl$49, `k2b-app-workspace ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-mobile-surface", _$escape(props.mobileSurface, true), false) + _$ssrAttribute("data-flat", props.flat ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-sidebar-collapsed", initialLayoutState()?.sidebarCollapsed === undefined ? _$escape(undefined, true) : _$escape(String(initialLayoutState()?.sidebarCollapsed), true), false) + _$ssrAttribute("data-workspace-resizable", props.resizable === false ? "false" : "true", false), _$ssrStyle(appWorkspaceLayoutStyle(initialLayoutState())), _$escape(_$createComponent(AppWorkspaceHead, {
1406
1542
  sidebarId: sidebarId,
1407
1543
  nested: nested
1408
1544
  })), _$escape(props.children));
@@ -1419,7 +1555,7 @@ AppWorkspace.LayoutStateProvider = props => _$createComponent(LayoutStateContext
1419
1555
  return props.children;
1420
1556
  }
1421
1557
  });
1422
- AppWorkspace.Content = props => _$ssr(_tmpl$45, `k2b-app-workspace__content ${_$escape(props.class ?? "", true)}`, _$escape(props.children));
1558
+ AppWorkspace.Content = props => _$ssr(_tmpl$50, `k2b-app-workspace__content ${_$escape(props.class ?? "", true)}`, _$escape(props.children));
1423
1559
  AppWorkspace.Main = AppWorkspaceMain;
1424
1560
  AppWorkspace.MainPane = AppWorkspaceMainPane;
1425
1561
  AppWorkspace.Detail = AppWorkspaceDetail;