@k2b/ui 0.22.0 → 0.23.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 (98) hide show
  1. package/dist/browser/content/Calendar.js +1086 -1049
  2. package/dist/browser/content/Calendar.js.map +1 -1
  3. package/dist/browser/content/CalendarDayView.js +1187 -0
  4. package/dist/browser/content/CalendarDayView.js.map +1 -0
  5. package/dist/browser/content/CalendarWeekView.js +1571 -0
  6. package/dist/browser/content/CalendarWeekView.js.map +1 -0
  7. package/dist/browser/content/ChartExplorer.js +174 -82
  8. package/dist/browser/content/ChartExplorer.js.map +1 -1
  9. package/dist/browser/content/ChartFilterControls.js +90 -33
  10. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  11. package/dist/browser/content/DataTable.js +199 -171
  12. package/dist/browser/content/DataTable.js.map +1 -1
  13. package/dist/browser/content/calendar-day-scroll.js +98 -0
  14. package/dist/browser/content/calendar-day-scroll.js.map +1 -0
  15. package/dist/browser/content/calendar-days.js +408 -0
  16. package/dist/browser/content/calendar-days.js.map +1 -0
  17. package/dist/browser/content/calendar-dialogs.js +236 -0
  18. package/dist/browser/content/calendar-dialogs.js.map +1 -0
  19. package/dist/browser/content/calendar-messages.js +210 -2
  20. package/dist/browser/content/calendar-messages.js.map +1 -1
  21. package/dist/browser/content/calendar-pointer.js +15 -3
  22. package/dist/browser/content/calendar-pointer.js.map +1 -1
  23. package/dist/browser/content/calendar-shared.js +328 -0
  24. package/dist/browser/content/calendar-shared.js.map +1 -0
  25. package/dist/browser/content/calendar-time-view.js +1649 -0
  26. package/dist/browser/content/calendar-time-view.js.map +1 -0
  27. package/dist/browser/content/chart-messages.js +10 -0
  28. package/dist/browser/content/chart-messages.js.map +1 -1
  29. package/dist/browser/content/index.js.map +1 -1
  30. package/dist/browser/inputs/Combobox.js +0 -1
  31. package/dist/browser/inputs/Combobox.js.map +1 -1
  32. package/dist/browser/layout/AppWorkspace.js +123 -97
  33. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  34. package/dist/browser/layout/PageTitle.js +4 -1
  35. package/dist/browser/layout/PageTitle.js.map +1 -1
  36. package/dist/browser/layout/app-workspace-controller.js +164 -86
  37. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  38. package/dist/browser/surfaces/StatCell.js +18 -6
  39. package/dist/browser/surfaces/StatCell.js.map +1 -1
  40. package/dist/ssr/content/Calendar.js +524 -335
  41. package/dist/ssr/content/Calendar.js.map +1 -1
  42. package/dist/ssr/content/CalendarDayView.js +800 -0
  43. package/dist/ssr/content/CalendarDayView.js.map +1 -0
  44. package/dist/ssr/content/CalendarWeekView.js +1069 -0
  45. package/dist/ssr/content/CalendarWeekView.js.map +1 -0
  46. package/dist/ssr/content/ChartExplorer.js +93 -34
  47. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  48. package/dist/ssr/content/ChartFilterControls.js +49 -7
  49. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  50. package/dist/ssr/content/DataTable.js +69 -51
  51. package/dist/ssr/content/DataTable.js.map +1 -1
  52. package/dist/ssr/content/calendar-day-scroll.js +98 -0
  53. package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
  54. package/dist/ssr/content/calendar-days.js +408 -0
  55. package/dist/ssr/content/calendar-days.js.map +1 -0
  56. package/dist/ssr/content/calendar-dialogs.js +159 -0
  57. package/dist/ssr/content/calendar-dialogs.js.map +1 -0
  58. package/dist/ssr/content/calendar-messages.js +210 -2
  59. package/dist/ssr/content/calendar-messages.js.map +1 -1
  60. package/dist/ssr/content/calendar-pointer.js +15 -3
  61. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  62. package/dist/ssr/content/calendar-shared.js +261 -0
  63. package/dist/ssr/content/calendar-shared.js.map +1 -0
  64. package/dist/ssr/content/calendar-time-view.js +1306 -0
  65. package/dist/ssr/content/calendar-time-view.js.map +1 -0
  66. package/dist/ssr/content/chart-messages.js +10 -0
  67. package/dist/ssr/content/chart-messages.js.map +1 -1
  68. package/dist/ssr/content/index.js.map +1 -1
  69. package/dist/ssr/inputs/Combobox.js.map +1 -1
  70. package/dist/ssr/layout/AppWorkspace.js +38 -29
  71. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  72. package/dist/ssr/layout/PageTitle.js +4 -1
  73. package/dist/ssr/layout/PageTitle.js.map +1 -1
  74. package/dist/ssr/layout/app-workspace-controller.js +164 -86
  75. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  76. package/dist/ssr/surfaces/StatCell.js +2 -2
  77. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  78. package/dist/styles.css +1 -1
  79. package/dist/types/content/Calendar.d.ts +91 -0
  80. package/dist/types/content/CalendarDayView.d.ts +7 -0
  81. package/dist/types/content/CalendarWeekView.d.ts +7 -0
  82. package/dist/types/content/ChartExplorer.d.ts +36 -1
  83. package/dist/types/content/ChartFilterControls.d.ts +6 -1
  84. package/dist/types/content/DataTable.d.ts +5 -0
  85. package/dist/types/content/calendar-day-scroll.d.ts +42 -0
  86. package/dist/types/content/calendar-days.d.ts +192 -0
  87. package/dist/types/content/calendar-dialogs.d.ts +22 -0
  88. package/dist/types/content/calendar-messages.d.ts +99 -0
  89. package/dist/types/content/calendar-pointer.d.ts +9 -0
  90. package/dist/types/content/calendar-shared.d.ts +69 -0
  91. package/dist/types/content/calendar-time-view.d.ts +252 -0
  92. package/dist/types/content/chart-messages.d.ts +5 -0
  93. package/dist/types/content/index.d.ts +2 -2
  94. package/dist/types/layout/AppWorkspace.d.ts +25 -3
  95. package/dist/types/layout/PageTitle.d.ts +2 -1
  96. package/dist/types/layout/app-workspace-controller.d.ts +9 -1
  97. package/dist/types/surfaces/StatCell.d.ts +5 -0
  98. package/package.json +1 -1
@@ -63,9 +63,11 @@ var _tmpl$ = /*#__PURE__*/_$template(`<button type=button class=k2b-app-workspac
63
63
  _tmpl$43 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
64
64
  _tmpl$44 = /*#__PURE__*/_$template(`<i class="ti ti-layout-sidebar"aria-hidden=true>`),
65
65
  _tmpl$45 = /*#__PURE__*/_$template(`<div class=k2b-app-workspace__head><!$><!/><!$><!/>`),
66
- _tmpl$46 = /*#__PURE__*/_$template(`<div data-k2b-app-workspace><!$><!/><!$><!/>`);
66
+ _tmpl$46 = /*#__PURE__*/_$template(`<h1 class=k2b-app-workspace__head-heading data-k2b-page-trail-title>`),
67
+ _tmpl$47 = /*#__PURE__*/_$template(`<div data-k2b-app-workspace><!$><!/><!$><!/>`);
67
68
  import { Link } from "@k2b/ssr/nav";
68
69
  import { children, createContext, createEffect, createMemo, createSignal, createUniqueId, For, mergeProps, onCleanup, onMount, Show, useContext } from "solid-js";
70
+ import { isServer } from "solid-js/web";
69
71
  import { IconButton } from "../actions/Button";
70
72
  import { APP_WORKSPACE_DETAIL_CLOSE_EVENT, APP_WORKSPACE_DETAIL_STEP_EVENT, APP_WORKSPACE_SIDEBAR_HIDE_EVENT, installAppWorkspaceController } from "./app-workspace-controller";
71
73
  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";
@@ -398,20 +400,22 @@ function AppWorkspaceDetail(props) {
398
400
  "--k2b-workspace-panel-min": `${minWidth()}px`,
399
401
  "--k2b-workspace-panel-max": `${maxWidth()}px`
400
402
  });
401
- // The panel floats over the content area, and `Main` beside it makes room
402
- // in CSS alone, so a server-rendered page arrives in its final geometry. A
403
- // sibling cannot read the panel's own variables, so this rule hands the
404
- // open panel's size to the content area around it.
405
- const contentRule = () => {
403
+ // An open panel takes a column at the workspace's end, sized in CSS alone,
404
+ // so a server-rendered page arrives in its final geometry. The workspace
405
+ // cannot read the panel's own variables, so this rule hands the open
406
+ // panel's size to its workspace.
407
+ const workspaceRule = () => {
406
408
  const open = `#${domId()}:not([hidden])`;
407
- return `.k2b-app-workspace__content:has(> ${open}, > :is(solid-island, solid-client) > ${open}){--k2b-detail-size:${size()};--k2b-detail-min:${minWidth()}px;--k2b-detail-max:${maxWidth()}px}`;
409
+ return `.k2b-app-workspace:has(> .k2b-app-workspace__content > ${open}, > .k2b-app-workspace__content > :is(solid-island, solid-client) > ${open}){--k2b-detail-size:${size()};--k2b-detail-min:${minWidth()}px;--k2b-detail-max:${maxWidth()}px}`;
408
410
  };
409
411
  let aside;
410
412
  onMount(() => {
411
413
  const close = () => props.onClose?.();
414
+ const isStep = detail => typeof detail === "object" && detail !== null && "direction" in detail && (detail.direction === 1 || detail.direction === -1);
412
415
  const step = event => {
413
- const direction = event instanceof CustomEvent ? event.detail?.direction : undefined;
414
- if (direction === 1 || direction === -1) props.onStep?.(direction);
416
+ if (!(event instanceof CustomEvent) || !isStep(event.detail)) return;
417
+ const item = props.onStep?.(event.detail.direction);
418
+ if (item instanceof HTMLElement) event.detail.item = item;
415
419
  };
416
420
  aside?.addEventListener(APP_WORKSPACE_DETAIL_CLOSE_EVENT, close);
417
421
  aside?.addEventListener(APP_WORKSPACE_DETAIL_STEP_EVENT, step);
@@ -422,7 +426,7 @@ function AppWorkspaceDetail(props) {
422
426
  });
423
427
  return [(() => {
424
428
  var _el$5 = _$getNextElement(_tmpl$5);
425
- _$effect(() => _$setProperty(_el$5, "innerHTML", contentRule()));
429
+ _$effect(() => _$setProperty(_el$5, "innerHTML", workspaceRule()));
426
430
  return _el$5;
427
431
  })(), _$createComponent(Show, {
428
432
  get when() {
@@ -682,11 +686,12 @@ const AppWorkspaceSidebarDesktop = props => ({
682
686
  // hydrates. Islands load asynchronously and server-only sidebars never mount,
683
687
  // so `onMount` would be too late or never run. The memory is one
684
688
  // `sessionStorage` entry per path segment and sidebar position and ends with
685
- // the tab. A stored offset is applied first; the current item is then kept in
686
- // view, which is a no-op when the offset already shows it. The frame callback
689
+ // the tab. A stored offset is applied first; the current item, or on a deeper
690
+ // page the item that contains it, is then kept in view, which is a no-op when
691
+ // the offset already shows it. The frame callback
687
692
  // repeats the restore once the whole document is parsed, because content that
688
693
  // follows the sidebar can still change its height before the first paint.
689
- 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"]\');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("");
694
+ 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("");
690
695
  const AppWorkspaceSidebarBody = props => {
691
696
  let body;
692
697
  createScrollFade(() => body, () => props.scrollFade !== false);
@@ -851,11 +856,12 @@ const AppWorkspaceSidebarItemActions = props => (() => {
851
856
  })();
852
857
  const AppWorkspaceSidebarItemStatus = props => {
853
858
  const workspaceMessages = useWorkspaceMessages();
854
- const count = () => typeof props.unread === "number" && props.unread >= 1 ? Math.floor(props.unread) : 0;
855
- const dot = () => props.unread === true;
859
+ const waiting = () => props.waiting && Number.isFinite(props.waiting.count) ? Math.max(0, Math.floor(props.waiting.count)) : null;
860
+ const count = () => waiting() ?? (typeof props.unread === "number" && props.unread >= 1 ? Math.floor(props.unread) : 0);
861
+ const dot = () => waiting() === null && props.unread === true;
856
862
  // The marks are decorative; the row's accessible name gets one phrase instead,
857
863
  // which says no more than the "99+" a capped count shows.
858
- const description = () => [count() > 99 ? workspaceMessages().sidebarUnreadMany : count() ? workspaceMessages().sidebarUnread({
864
+ const description = () => [waiting() !== null ? props.waiting?.label ?? "" : count() > 99 ? workspaceMessages().sidebarUnreadMany : count() ? workspaceMessages().sidebarUnread({
859
865
  count: count()
860
866
  }) : dot() ? workspaceMessages().sidebarNewActivity : "", props.mention ? workspaceMessages().sidebarMentioned : "", props.muted ? workspaceMessages().sidebarMuted : ""].filter(Boolean).join(", ");
861
867
  // The unread slot stays reserved at the end, and the marks that change most
@@ -893,7 +899,7 @@ const AppWorkspaceSidebarItemStatus = props => {
893
899
  }), _el$45, _co$8);
894
900
  _$insert(_el$36, _$createComponent(Show, {
895
901
  get when() {
896
- return count();
902
+ return count() || waiting() === 0;
897
903
  },
898
904
  get fallback() {
899
905
  return _$createComponent(Show, {
@@ -916,7 +922,16 @@ const AppWorkspaceSidebarItemStatus = props => {
916
922
  }
917
923
  }));
918
924
  _$insert(_el$38, description, _el$41, _co$6);
919
- _$effect(() => _$setAttribute(_el$33, "data-unread", count() ? "count" : dot() ? "dot" : undefined));
925
+ _$effect(_p$ => {
926
+ var _v$51 = waiting() !== null ? undefined : count() ? "count" : dot() ? "dot" : undefined,
927
+ _v$52 = waiting() === null ? undefined : waiting() ? "count" : "zero";
928
+ _v$51 !== _p$.e && _$setAttribute(_el$33, "data-unread", _p$.e = _v$51);
929
+ _v$52 !== _p$.t && _$setAttribute(_el$33, "data-waiting", _p$.t = _v$52);
930
+ return _p$;
931
+ }, {
932
+ e: undefined,
933
+ t: undefined
934
+ });
920
935
  return _el$33;
921
936
  }
922
937
  });
@@ -935,7 +950,7 @@ function AppWorkspaceSidebarRow(props) {
935
950
  },
936
951
  ...data()
937
952
  });
938
- const current = () => props.active ? "page" : undefined;
953
+ const current = () => props.active === "ancestor" ? "true" : props.active ? "page" : undefined;
939
954
  const Control = control => {
940
955
  const attrs = () => control.grouped ? {
941
956
  class: "k2b-app-workspace__sidebar-item-main"
@@ -1141,10 +1156,10 @@ function AppWorkspaceSidebarItem(props) {
1141
1156
  var _el$68 = _$getNextElement(_tmpl$30);
1142
1157
  _$insert(_el$68, meta);
1143
1158
  _$effect(_p$ => {
1144
- var _v$51 = props.preview?.trigger === "row" ? metaId : undefined,
1145
- _v$52 = metaVisibility() === "hover" ? "hover" : undefined;
1146
- _v$51 !== _p$.e && _$setAttribute(_el$68, "id", _p$.e = _v$51);
1147
- _v$52 !== _p$.t && _$setAttribute(_el$68, "data-visibility", _p$.t = _v$52);
1159
+ var _v$53 = props.preview?.trigger === "row" ? metaId : undefined,
1160
+ _v$54 = metaVisibility() === "hover" ? "hover" : undefined;
1161
+ _v$53 !== _p$.e && _$setAttribute(_el$68, "id", _p$.e = _v$53);
1162
+ _v$54 !== _p$.t && _$setAttribute(_el$68, "data-visibility", _p$.t = _v$54);
1148
1163
  return _p$;
1149
1164
  }, {
1150
1165
  e: undefined,
@@ -1185,12 +1200,12 @@ function AppWorkspaceSidebarItem(props) {
1185
1200
  _el$72.$$click = select;
1186
1201
  _$insert(_el$72, content);
1187
1202
  _$effect(_p$ => {
1188
- var _v$56 = actionSlot()?.disabled,
1189
- _v$57 = actionSlot()?.visibility === "hover" ? "hover" : undefined,
1190
- _v$58 = label();
1191
- _v$56 !== _p$.e && _$setProperty(_el$72, "disabled", _p$.e = _v$56);
1192
- _v$57 !== _p$.t && _$setAttribute(_el$72, "data-visibility", _p$.t = _v$57);
1193
- _v$58 !== _p$.a && _$setAttribute(_el$72, "aria-label", _p$.a = _v$58);
1203
+ var _v$58 = actionSlot()?.disabled,
1204
+ _v$59 = actionSlot()?.visibility === "hover" ? "hover" : undefined,
1205
+ _v$60 = label();
1206
+ _v$58 !== _p$.e && _$setProperty(_el$72, "disabled", _p$.e = _v$58);
1207
+ _v$59 !== _p$.t && _$setAttribute(_el$72, "data-visibility", _p$.t = _v$59);
1208
+ _v$60 !== _p$.a && _$setAttribute(_el$72, "aria-label", _p$.a = _v$60);
1194
1209
  return _p$;
1195
1210
  }, {
1196
1211
  e: undefined,
@@ -1206,12 +1221,12 @@ function AppWorkspaceSidebarItem(props) {
1206
1221
  _el$71.$$click = select;
1207
1222
  _$insert(_el$71, content);
1208
1223
  _$effect(_p$ => {
1209
- var _v$53 = actionSlot()?.href,
1210
- _v$54 = actionSlot()?.visibility === "hover" ? "hover" : undefined,
1211
- _v$55 = label();
1212
- _v$53 !== _p$.e && _$setAttribute(_el$71, "href", _p$.e = _v$53);
1213
- _v$54 !== _p$.t && _$setAttribute(_el$71, "data-visibility", _p$.t = _v$54);
1214
- _v$55 !== _p$.a && _$setAttribute(_el$71, "aria-label", _p$.a = _v$55);
1224
+ var _v$55 = actionSlot()?.href,
1225
+ _v$56 = actionSlot()?.visibility === "hover" ? "hover" : undefined,
1226
+ _v$57 = label();
1227
+ _v$55 !== _p$.e && _$setAttribute(_el$71, "href", _p$.e = _v$55);
1228
+ _v$56 !== _p$.t && _$setAttribute(_el$71, "data-visibility", _p$.t = _v$56);
1229
+ _v$57 !== _p$.a && _$setAttribute(_el$71, "aria-label", _p$.a = _v$57);
1215
1230
  return _p$;
1216
1231
  }, {
1217
1232
  e: undefined,
@@ -1560,10 +1575,10 @@ const AppWorkspaceNavTree = props => {
1560
1575
  var _el$79 = _$getNextElement(_tmpl$36);
1561
1576
  _$insert(_el$79, () => item.meta);
1562
1577
  _$effect(_p$ => {
1563
- var _v$59 = `k2b-app-workspace__sidebar-item-meta ${hasChildren() ? "" : "k2b-app-workspace__nav-tree-leaf-meta"}`,
1564
- _v$60 = item.metaVisibility === "hover" ? "hover" : undefined;
1565
- _v$59 !== _p$.e && _$className(_el$79, _p$.e = _v$59);
1566
- _v$60 !== _p$.t && _$setAttribute(_el$79, "data-visibility", _p$.t = _v$60);
1578
+ var _v$61 = `k2b-app-workspace__sidebar-item-meta ${hasChildren() ? "" : "k2b-app-workspace__nav-tree-leaf-meta"}`,
1579
+ _v$62 = item.metaVisibility === "hover" ? "hover" : undefined;
1580
+ _v$61 !== _p$.e && _$className(_el$79, _p$.e = _v$61);
1581
+ _v$62 !== _p$.t && _$setAttribute(_el$79, "data-visibility", _p$.t = _v$62);
1567
1582
  return _p$;
1568
1583
  }, {
1569
1584
  e: undefined,
@@ -1715,28 +1730,28 @@ const AppWorkspaceNavTree = props => {
1715
1730
  }
1716
1731
  }), _el$89, _co$13);
1717
1732
  _$effect(_p$ => {
1718
- var _v$61 = siblings().length,
1719
- _v$62 = place() + 1,
1720
- _v$63 = selected(),
1721
- _v$64 = hasChildren() ? isExpanded(item.id) : undefined,
1722
- _v$65 = item.disabled ? "true" : undefined,
1723
- _v$66 = item.disabled ? -1 : tabStopId() === item.id ? 0 : -1,
1724
- _v$67 = movable() ? true : undefined,
1725
- _v$68 = item.id,
1726
- _v$69 = dragged()?.id === item.id ? "" : undefined,
1727
- _v$70 = dropTarget()?.id === item.id ? dropTarget().side : undefined,
1728
- _v$71 = String(props.indented === false ? 0 : depth);
1729
- _v$61 !== _p$.e && _$setAttribute(_el$84, "aria-setsize", _p$.e = _v$61);
1730
- _v$62 !== _p$.t && _$setAttribute(_el$84, "aria-posinset", _p$.t = _v$62);
1731
- _v$63 !== _p$.a && _$setAttribute(_el$84, "aria-selected", _p$.a = _v$63);
1732
- _v$64 !== _p$.o && _$setAttribute(_el$84, "aria-expanded", _p$.o = _v$64);
1733
- _v$65 !== _p$.i && _$setAttribute(_el$84, "aria-disabled", _p$.i = _v$65);
1734
- _v$66 !== _p$.n && _$setAttribute(_el$84, "tabindex", _p$.n = _v$66);
1735
- _v$67 !== _p$.s && _$setAttribute(_el$84, "draggable", _p$.s = _v$67);
1736
- _v$68 !== _p$.h && _$setAttribute(_el$84, "data-k2b-nav-tree-id", _p$.h = _v$68);
1737
- _v$69 !== _p$.r && _$setAttribute(_el$84, "data-k2b-nav-tree-dragging", _p$.r = _v$69);
1738
- _v$70 !== _p$.d && _$setAttribute(_el$84, "data-k2b-nav-tree-drop", _p$.d = _v$70);
1739
- _v$71 !== _p$.l && _$setStyleProperty(_el$84, "--k2b-nav-tree-depth", _p$.l = _v$71);
1733
+ var _v$63 = siblings().length,
1734
+ _v$64 = place() + 1,
1735
+ _v$65 = selected(),
1736
+ _v$66 = hasChildren() ? isExpanded(item.id) : undefined,
1737
+ _v$67 = item.disabled ? "true" : undefined,
1738
+ _v$68 = item.disabled ? -1 : tabStopId() === item.id ? 0 : -1,
1739
+ _v$69 = movable() ? true : undefined,
1740
+ _v$70 = item.id,
1741
+ _v$71 = dragged()?.id === item.id ? "" : undefined,
1742
+ _v$72 = dropTarget()?.id === item.id ? dropTarget().side : undefined,
1743
+ _v$73 = String(props.indented === false ? 0 : depth);
1744
+ _v$63 !== _p$.e && _$setAttribute(_el$84, "aria-setsize", _p$.e = _v$63);
1745
+ _v$64 !== _p$.t && _$setAttribute(_el$84, "aria-posinset", _p$.t = _v$64);
1746
+ _v$65 !== _p$.a && _$setAttribute(_el$84, "aria-selected", _p$.a = _v$65);
1747
+ _v$66 !== _p$.o && _$setAttribute(_el$84, "aria-expanded", _p$.o = _v$66);
1748
+ _v$67 !== _p$.i && _$setAttribute(_el$84, "aria-disabled", _p$.i = _v$67);
1749
+ _v$68 !== _p$.n && _$setAttribute(_el$84, "tabindex", _p$.n = _v$68);
1750
+ _v$69 !== _p$.s && _$setAttribute(_el$84, "draggable", _p$.s = _v$69);
1751
+ _v$70 !== _p$.h && _$setAttribute(_el$84, "data-k2b-nav-tree-id", _p$.h = _v$70);
1752
+ _v$71 !== _p$.r && _$setAttribute(_el$84, "data-k2b-nav-tree-dragging", _p$.r = _v$71);
1753
+ _v$72 !== _p$.d && _$setAttribute(_el$84, "data-k2b-nav-tree-drop", _p$.d = _v$72);
1754
+ _v$73 !== _p$.l && _$setStyleProperty(_el$84, "--k2b-nav-tree-depth", _p$.l = _v$73);
1740
1755
  return _p$;
1741
1756
  }, {
1742
1757
  e: undefined,
@@ -1790,10 +1805,10 @@ const AppWorkspaceNavTree = props => {
1790
1805
  typeof _ref$5 === "function" ? _$use(_ref$5, _el$90) : root = _el$90;
1791
1806
  _$insert(_el$90, () => renderItems(roots, 0));
1792
1807
  _$effect(_p$ => {
1793
- var _v$72 = `k2b-app-workspace__nav-tree ${props.class ?? ""}`,
1794
- _v$73 = props.ariaLabel;
1795
- _v$72 !== _p$.e && _$className(_el$90, _p$.e = _v$72);
1796
- _v$73 !== _p$.t && _$setAttribute(_el$90, "aria-label", _p$.t = _v$73);
1808
+ var _v$74 = `k2b-app-workspace__nav-tree ${props.class ?? ""}`,
1809
+ _v$75 = props.ariaLabel;
1810
+ _v$74 !== _p$.e && _$className(_el$90, _p$.e = _v$74);
1811
+ _v$75 !== _p$.t && _$setAttribute(_el$90, "aria-label", _p$.t = _v$75);
1797
1812
  return _p$;
1798
1813
  }, {
1799
1814
  e: undefined,
@@ -1895,11 +1910,14 @@ const AppWorkspaceSidebarIconAction = props => {
1895
1910
  };
1896
1911
  /**
1897
1912
  * The row above the work area. From 48 to 64 rem it holds the button that
1898
- * opens the overlay sidebar. On a page with a page above it, at every width,
1899
- * it shows the host's page title with the way up (see `PageTitle`); the
1900
- * page's own `PageTitle` takes its place. It is one fixed height and draws no
1901
- * line; CSS decides when it shows, so the server-rendered page already has
1902
- * its final geometry.
1913
+ * opens the overlay sidebar. On a page with a page above it, it shows the
1914
+ * host's page title with the way up (see `PageTitle`); the page's own
1915
+ * `PageTitle` takes its place. The visible title is no heading, because many
1916
+ * pages render their own `h1`. From 64 rem a sidebar that marks the current
1917
+ * page names it already: the row hides, and only on a page without its own
1918
+ * `h1` its heading stays for assistive technology. It is one fixed height
1919
+ * and draws no line; CSS decides when it shows, so the server-rendered page
1920
+ * already has its final geometry.
1903
1921
  */
1904
1922
  function AppWorkspaceHead(props) {
1905
1923
  const messages = useWorkspaceMessages();
@@ -1929,13 +1947,18 @@ function AppWorkspaceHead(props) {
1929
1947
  get when() {
1930
1948
  return trail();
1931
1949
  },
1932
- children: current => _$createComponent(PageTitle, {
1950
+ children: current => [_$createComponent(PageTitle, {
1933
1951
  get trail() {
1934
1952
  return current();
1935
1953
  },
1936
1954
  as: "p",
1937
1955
  fallback: true
1938
- })
1956
+ }), (() => {
1957
+ var _el$105 = _$getNextElement(_tmpl$46);
1958
+ _$setAttribute(_el$105, "data-k2b-server", isServer ? "" : undefined);
1959
+ _$insert(_el$105, () => current().title);
1960
+ return _el$105;
1961
+ })()]
1939
1962
  }), _el$104, _co$16);
1940
1963
  _$effect(() => _$setAttribute(_el$99, "data-trail", trail()?.ancestors.length ? "up" : trail() ? "title" : undefined));
1941
1964
  return _el$99;
@@ -1973,38 +1996,41 @@ const AppWorkspace = props => {
1973
1996
  return _$createComponent(WorkspaceContext.Provider, {
1974
1997
  value: workspace,
1975
1998
  get children() {
1976
- var _el$105 = _$getNextElement(_tmpl$46),
1977
- _el$106 = _el$105.firstChild,
1978
- [_el$107, _co$17] = _$getNextMarker(_el$106.nextSibling),
1979
- _el$108 = _el$107.nextSibling,
1980
- [_el$109, _co$18] = _$getNextMarker(_el$108.nextSibling);
1999
+ var _el$106 = _$getNextElement(_tmpl$47),
2000
+ _el$107 = _el$106.firstChild,
2001
+ [_el$108, _co$17] = _$getNextMarker(_el$107.nextSibling),
2002
+ _el$109 = _el$108.nextSibling,
2003
+ [_el$110, _co$18] = _$getNextMarker(_el$109.nextSibling);
1981
2004
  var _ref$6 = root;
1982
- typeof _ref$6 === "function" ? _$use(_ref$6, _el$105) : root = _el$105;
1983
- _$insert(_el$105, _$createComponent(AppWorkspaceHead, {
2005
+ typeof _ref$6 === "function" ? _$use(_ref$6, _el$106) : root = _el$106;
2006
+ _$insert(_el$106, _$createComponent(AppWorkspaceHead, {
1984
2007
  sidebarId: sidebarId,
1985
2008
  nested: nested
1986
- }), _el$107, _co$17);
1987
- _$insert(_el$105, () => props.children, _el$109, _co$18);
2009
+ }), _el$108, _co$17);
2010
+ _$insert(_el$106, () => props.children, _el$110, _co$18);
1988
2011
  _$effect(_p$ => {
1989
- var _v$74 = `k2b-app-workspace ${props.class ?? ""}`,
1990
- _v$75 = props.mobileSurface,
1991
- _v$76 = initialLayoutState()?.sidebarCollapsed === undefined ? undefined : String(initialLayoutState()?.sidebarCollapsed),
1992
- _v$77 = props.resizable === false ? "false" : "true",
1993
- _v$78 = appWorkspaceLayoutStyle(initialLayoutState());
1994
- _v$74 !== _p$.e && _$className(_el$105, _p$.e = _v$74);
1995
- _v$75 !== _p$.t && _$setAttribute(_el$105, "data-mobile-surface", _p$.t = _v$75);
1996
- _v$76 !== _p$.a && _$setAttribute(_el$105, "data-sidebar-collapsed", _p$.a = _v$76);
1997
- _v$77 !== _p$.o && _$setAttribute(_el$105, "data-workspace-resizable", _p$.o = _v$77);
1998
- _p$.i = _$style(_el$105, _v$78, _p$.i);
2012
+ var _v$76 = `k2b-app-workspace ${props.class ?? ""}`,
2013
+ _v$77 = props.mobileSurface,
2014
+ _v$78 = props.flat ? "true" : undefined,
2015
+ _v$79 = initialLayoutState()?.sidebarCollapsed === undefined ? undefined : String(initialLayoutState()?.sidebarCollapsed),
2016
+ _v$80 = props.resizable === false ? "false" : "true",
2017
+ _v$81 = appWorkspaceLayoutStyle(initialLayoutState());
2018
+ _v$76 !== _p$.e && _$className(_el$106, _p$.e = _v$76);
2019
+ _v$77 !== _p$.t && _$setAttribute(_el$106, "data-mobile-surface", _p$.t = _v$77);
2020
+ _v$78 !== _p$.a && _$setAttribute(_el$106, "data-flat", _p$.a = _v$78);
2021
+ _v$79 !== _p$.o && _$setAttribute(_el$106, "data-sidebar-collapsed", _p$.o = _v$79);
2022
+ _v$80 !== _p$.i && _$setAttribute(_el$106, "data-workspace-resizable", _p$.i = _v$80);
2023
+ _p$.n = _$style(_el$106, _v$81, _p$.n);
1999
2024
  return _p$;
2000
2025
  }, {
2001
2026
  e: undefined,
2002
2027
  t: undefined,
2003
2028
  a: undefined,
2004
2029
  o: undefined,
2005
- i: undefined
2030
+ i: undefined,
2031
+ n: undefined
2006
2032
  });
2007
- return _el$105;
2033
+ return _el$106;
2008
2034
  }
2009
2035
  });
2010
2036
  }
@@ -2019,10 +2045,10 @@ AppWorkspace.LayoutStateProvider = props => _$createComponent(LayoutStateContext
2019
2045
  }
2020
2046
  });
2021
2047
  AppWorkspace.Content = props => (() => {
2022
- var _el$110 = _$getNextElement(_tmpl$2);
2023
- _$insert(_el$110, () => props.children);
2024
- _$effect(() => _$className(_el$110, `k2b-app-workspace__content ${props.class ?? ""}`));
2025
- return _el$110;
2048
+ var _el$111 = _$getNextElement(_tmpl$2);
2049
+ _$insert(_el$111, () => props.children);
2050
+ _$effect(() => _$className(_el$111, `k2b-app-workspace__content ${props.class ?? ""}`));
2051
+ return _el$111;
2026
2052
  })();
2027
2053
  AppWorkspace.Main = AppWorkspaceMain;
2028
2054
  AppWorkspace.MainPane = AppWorkspaceMainPane;