@k2b/ui 0.23.0 → 0.25.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 (161) hide show
  1. package/README.md +2 -2
  2. package/dist/browser/actions/Dropdown.js +67 -52
  3. package/dist/browser/actions/Dropdown.js.map +1 -1
  4. package/dist/browser/actions/GestureMenu.js +3 -3
  5. package/dist/browser/actions/GestureMenu.js.map +1 -1
  6. package/dist/browser/actions/SpotlightSearch.js +13 -6
  7. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  8. package/dist/browser/actions/Toolbar.js +75 -1
  9. package/dist/browser/actions/Toolbar.js.map +1 -1
  10. package/dist/browser/content/Calendar.js +1570 -923
  11. package/dist/browser/content/Calendar.js.map +1 -1
  12. package/dist/browser/content/CalendarDayView.js +2 -2
  13. package/dist/browser/content/CalendarDayView.js.map +1 -1
  14. package/dist/browser/content/CalendarWeekView.js +29 -7
  15. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  16. package/dist/browser/content/DataTable.js +45 -35
  17. package/dist/browser/content/DataTable.js.map +1 -1
  18. package/dist/browser/content/Kbd.js +51 -0
  19. package/dist/browser/content/Kbd.js.map +1 -0
  20. package/dist/browser/content/LabelChip.js +38 -0
  21. package/dist/browser/content/LabelChip.js.map +1 -0
  22. package/dist/browser/content/MarkdownView.js +2 -1
  23. package/dist/browser/content/MarkdownView.js.map +1 -1
  24. package/dist/browser/content/Steps.js +34 -0
  25. package/dist/browser/content/Steps.js.map +1 -0
  26. package/dist/browser/content/VirtualFeed.js +33 -1
  27. package/dist/browser/content/VirtualFeed.js.map +1 -1
  28. package/dist/browser/content/calendar-day-scroll.js +17 -4
  29. package/dist/browser/content/calendar-day-scroll.js.map +1 -1
  30. package/dist/browser/content/calendar-dialogs.js +32 -60
  31. package/dist/browser/content/calendar-dialogs.js.map +1 -1
  32. package/dist/browser/content/calendar-month-scroll.js +80 -0
  33. package/dist/browser/content/calendar-month-scroll.js.map +1 -0
  34. package/dist/browser/content/calendar-time-view.js +9 -4
  35. package/dist/browser/content/calendar-time-view.js.map +1 -1
  36. package/dist/browser/content/index.js +4 -1
  37. package/dist/browser/content/index.js.map +1 -1
  38. package/dist/browser/content/markdown-info-blocks.js +33 -5
  39. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  40. package/dist/browser/feedback/prompts.js +17 -3
  41. package/dist/browser/feedback/prompts.js.map +1 -1
  42. package/dist/browser/intl/index.js +1 -0
  43. package/dist/browser/intl/index.js.map +1 -1
  44. package/dist/browser/intl/shortcut-messages.js +77 -0
  45. package/dist/browser/intl/shortcut-messages.js.map +1 -0
  46. package/dist/browser/intl/shortcut.js +123 -0
  47. package/dist/browser/intl/shortcut.js.map +1 -0
  48. package/dist/browser/layout/AppWorkspace.js +345 -325
  49. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  50. package/dist/browser/layout/Navigation.js +18 -3
  51. package/dist/browser/layout/Navigation.js.map +1 -1
  52. package/dist/browser/layout/PageTitle.js +14 -0
  53. package/dist/browser/layout/PageTitle.js.map +1 -1
  54. package/dist/browser/layout/SidebarSwitcher.js +505 -0
  55. package/dist/browser/layout/SidebarSwitcher.js.map +1 -0
  56. package/dist/browser/layout/TableOfContents.js +115 -0
  57. package/dist/browser/layout/TableOfContents.js.map +1 -0
  58. package/dist/browser/layout/app-workspace-controller.js +15 -48
  59. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  60. package/dist/browser/layout/index.js +2 -0
  61. package/dist/browser/layout/index.js.map +1 -1
  62. package/dist/browser/layout/navigation-model.js +1 -0
  63. package/dist/browser/layout/navigation-model.js.map +1 -1
  64. package/dist/browser/layout/table-of-contents-messages.js +19 -0
  65. package/dist/browser/layout/table-of-contents-messages.js.map +1 -0
  66. package/dist/browser/surfaces/LinkCard.js +40 -24
  67. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  68. package/dist/ssr/actions/Dropdown.js +11 -5
  69. package/dist/ssr/actions/Dropdown.js.map +1 -1
  70. package/dist/ssr/actions/GestureMenu.js +3 -3
  71. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  72. package/dist/ssr/actions/SpotlightSearch.js +9 -3
  73. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  74. package/dist/ssr/actions/Toolbar.js +67 -1
  75. package/dist/ssr/actions/Toolbar.js.map +1 -1
  76. package/dist/ssr/content/Calendar.js +895 -321
  77. package/dist/ssr/content/Calendar.js.map +1 -1
  78. package/dist/ssr/content/CalendarDayView.js +2 -2
  79. package/dist/ssr/content/CalendarDayView.js.map +1 -1
  80. package/dist/ssr/content/CalendarWeekView.js +28 -7
  81. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  82. package/dist/ssr/content/DataTable.js +21 -17
  83. package/dist/ssr/content/DataTable.js.map +1 -1
  84. package/dist/ssr/content/Kbd.js +38 -0
  85. package/dist/ssr/content/Kbd.js.map +1 -0
  86. package/dist/ssr/content/LabelChip.js +21 -0
  87. package/dist/ssr/content/LabelChip.js.map +1 -0
  88. package/dist/ssr/content/MarkdownView.js +2 -1
  89. package/dist/ssr/content/MarkdownView.js.map +1 -1
  90. package/dist/ssr/content/Steps.js +14 -0
  91. package/dist/ssr/content/Steps.js.map +1 -0
  92. package/dist/ssr/content/VirtualFeed.js +33 -1
  93. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  94. package/dist/ssr/content/calendar-day-scroll.js +17 -4
  95. package/dist/ssr/content/calendar-day-scroll.js.map +1 -1
  96. package/dist/ssr/content/calendar-dialogs.js +12 -32
  97. package/dist/ssr/content/calendar-dialogs.js.map +1 -1
  98. package/dist/ssr/content/calendar-month-scroll.js +80 -0
  99. package/dist/ssr/content/calendar-month-scroll.js.map +1 -0
  100. package/dist/ssr/content/calendar-time-view.js +8 -3
  101. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  102. package/dist/ssr/content/index.js +4 -1
  103. package/dist/ssr/content/index.js.map +1 -1
  104. package/dist/ssr/content/markdown-info-blocks.js +33 -5
  105. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  106. package/dist/ssr/feedback/prompts.js +17 -3
  107. package/dist/ssr/feedback/prompts.js.map +1 -1
  108. package/dist/ssr/intl/index.js +1 -0
  109. package/dist/ssr/intl/index.js.map +1 -1
  110. package/dist/ssr/intl/shortcut-messages.js +77 -0
  111. package/dist/ssr/intl/shortcut-messages.js.map +1 -0
  112. package/dist/ssr/intl/shortcut.js +123 -0
  113. package/dist/ssr/intl/shortcut.js.map +1 -0
  114. package/dist/ssr/layout/AppWorkspace.js +67 -59
  115. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  116. package/dist/ssr/layout/Navigation.js +12 -2
  117. package/dist/ssr/layout/Navigation.js.map +1 -1
  118. package/dist/ssr/layout/PageTitle.js +14 -0
  119. package/dist/ssr/layout/PageTitle.js.map +1 -1
  120. package/dist/ssr/layout/SidebarSwitcher.js +271 -0
  121. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -0
  122. package/dist/ssr/layout/TableOfContents.js +79 -0
  123. package/dist/ssr/layout/TableOfContents.js.map +1 -0
  124. package/dist/ssr/layout/app-workspace-controller.js +15 -48
  125. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  126. package/dist/ssr/layout/index.js +2 -0
  127. package/dist/ssr/layout/index.js.map +1 -1
  128. package/dist/ssr/layout/navigation-model.js +1 -0
  129. package/dist/ssr/layout/navigation-model.js.map +1 -1
  130. package/dist/ssr/layout/table-of-contents-messages.js +19 -0
  131. package/dist/ssr/layout/table-of-contents-messages.js.map +1 -0
  132. package/dist/ssr/surfaces/LinkCard.js +26 -10
  133. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  134. package/dist/styles.css +1 -1
  135. package/dist/types/actions/Dropdown.d.ts +12 -0
  136. package/dist/types/actions/SpotlightSearch.d.ts +2 -0
  137. package/dist/types/content/Calendar.d.ts +20 -7
  138. package/dist/types/content/CalendarWeekView.d.ts +1 -1
  139. package/dist/types/content/DataTable.d.ts +9 -0
  140. package/dist/types/content/Kbd.d.ts +16 -0
  141. package/dist/types/content/LabelChip.d.ts +12 -0
  142. package/dist/types/content/MarkdownView.d.ts +2 -1
  143. package/dist/types/content/Steps.d.ts +12 -0
  144. package/dist/types/content/VirtualFeed.d.ts +8 -0
  145. package/dist/types/content/calendar-day-scroll.d.ts +9 -4
  146. package/dist/types/content/calendar-dialogs.d.ts +0 -2
  147. package/dist/types/content/calendar-month-scroll.d.ts +25 -0
  148. package/dist/types/content/index.d.ts +7 -1
  149. package/dist/types/content/markdown-info-blocks.d.ts +21 -4
  150. package/dist/types/feedback/prompts.d.ts +8 -2
  151. package/dist/types/intl/index.d.ts +2 -0
  152. package/dist/types/intl/shortcut-messages.d.ts +35 -0
  153. package/dist/types/intl/shortcut.d.ts +29 -0
  154. package/dist/types/layout/AppWorkspace.d.ts +5 -1
  155. package/dist/types/layout/SidebarSwitcher.d.ts +65 -0
  156. package/dist/types/layout/TableOfContents.d.ts +24 -0
  157. package/dist/types/layout/index.d.ts +3 -0
  158. package/dist/types/layout/navigation-model.d.ts +4 -0
  159. package/dist/types/layout/table-of-contents-messages.d.ts +4 -0
  160. package/dist/types/surfaces/LinkCard.d.ts +3 -0
  161. package/package.json +4 -4
@@ -0,0 +1,77 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ const shortcutMessages = i18n.define({
3
+ baseLocale: "en",
4
+ messages: {
5
+ en: {
6
+ ctrlLabel: "Ctrl",
7
+ altLabel: "Alt",
8
+ shiftLabel: "Shift",
9
+ metaLabel: "Meta",
10
+ control: "Control",
11
+ appleControl: "Control",
12
+ option: "Option",
13
+ shift: "Shift",
14
+ command: "Command",
15
+ alt: "Alt",
16
+ meta: "Meta",
17
+ arrowup: "Up arrow",
18
+ arrowdown: "Down arrow",
19
+ arrowleft: "Left arrow",
20
+ arrowright: "Right arrow",
21
+ enter: "Enter",
22
+ escape: "Escape",
23
+ tab: "Tab",
24
+ space: "Space",
25
+ backspace: "Backspace",
26
+ delete: "Delete",
27
+ home: "Home",
28
+ end: "End",
29
+ pageup: "Page up",
30
+ pagedown: "Page down",
31
+ spaceLabel: "Space",
32
+ deleteLabel: "Del",
33
+ homeLabel: "Home",
34
+ endLabel: "End",
35
+ pageupLabel: "PgUp",
36
+ pagedownLabel: "PgDn"
37
+ },
38
+ de: {
39
+ ctrlLabel: "Strg",
40
+ altLabel: "Alt",
41
+ shiftLabel: "Umschalt",
42
+ metaLabel: "Meta",
43
+ control: "Steuerung",
44
+ appleControl: "Control",
45
+ option: "Wahltaste",
46
+ shift: "Umschalttaste",
47
+ command: "Befehlstaste",
48
+ alt: "Alt",
49
+ meta: "Meta",
50
+ arrowup: "Pfeil nach oben",
51
+ arrowdown: "Pfeil nach unten",
52
+ arrowleft: "Pfeil nach links",
53
+ arrowright: "Pfeil nach rechts",
54
+ enter: "Eingabetaste",
55
+ escape: "Escape",
56
+ tab: "Tabulatortaste",
57
+ space: "Leertaste",
58
+ backspace: "Rücktaste",
59
+ delete: "Entfernen",
60
+ home: "Pos 1",
61
+ end: "Ende",
62
+ pageup: "Bild auf",
63
+ pagedown: "Bild ab",
64
+ spaceLabel: "Leertaste",
65
+ deleteLabel: "Entf",
66
+ homeLabel: "Pos1",
67
+ endLabel: "Ende",
68
+ pageupLabel: "Bild↑",
69
+ pagedownLabel: "Bild↓"
70
+ }
71
+ }
72
+ });
73
+
74
+ /** Imperative UI inherits the document locale when no locale is supplied. */
75
+ export const resolveShortcutMessages = locale => shortcutMessages.resolve([locale ?? (typeof document === "undefined" ? shortcutMessages.baseLocale : document.documentElement.lang)]).t;
76
+ export const checkShortcutMessages = () => shortcutMessages.check();
77
+ //# sourceMappingURL=shortcut-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["intl/shortcut-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\n\nconst shortcutMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n ctrlLabel: \"Ctrl\",\n altLabel: \"Alt\",\n shiftLabel: \"Shift\",\n metaLabel: \"Meta\",\n control: \"Control\",\n appleControl: \"Control\",\n option: \"Option\",\n shift: \"Shift\",\n command: \"Command\",\n alt: \"Alt\",\n meta: \"Meta\",\n arrowup: \"Up arrow\",\n arrowdown: \"Down arrow\",\n arrowleft: \"Left arrow\",\n arrowright: \"Right arrow\",\n enter: \"Enter\",\n escape: \"Escape\",\n tab: \"Tab\",\n space: \"Space\",\n backspace: \"Backspace\",\n delete: \"Delete\",\n home: \"Home\",\n end: \"End\",\n pageup: \"Page up\",\n pagedown: \"Page down\",\n spaceLabel: \"Space\",\n deleteLabel: \"Del\",\n homeLabel: \"Home\",\n endLabel: \"End\",\n pageupLabel: \"PgUp\",\n pagedownLabel: \"PgDn\",\n },\n de: {\n ctrlLabel: \"Strg\",\n altLabel: \"Alt\",\n shiftLabel: \"Umschalt\",\n metaLabel: \"Meta\",\n control: \"Steuerung\",\n appleControl: \"Control\",\n option: \"Wahltaste\",\n shift: \"Umschalttaste\",\n command: \"Befehlstaste\",\n alt: \"Alt\",\n meta: \"Meta\",\n arrowup: \"Pfeil nach oben\",\n arrowdown: \"Pfeil nach unten\",\n arrowleft: \"Pfeil nach links\",\n arrowright: \"Pfeil nach rechts\",\n enter: \"Eingabetaste\",\n escape: \"Escape\",\n tab: \"Tabulatortaste\",\n space: \"Leertaste\",\n backspace: \"Rücktaste\",\n delete: \"Entfernen\",\n home: \"Pos 1\",\n end: \"Ende\",\n pageup: \"Bild auf\",\n pagedown: \"Bild ab\",\n spaceLabel: \"Leertaste\",\n deleteLabel: \"Entf\",\n homeLabel: \"Pos1\",\n endLabel: \"Ende\",\n pageupLabel: \"Bild↑\",\n pagedownLabel: \"Bild↓\",\n },\n },\n});\n\n/** Imperative UI inherits the document locale when no locale is supplied. */\nexport const resolveShortcutMessages = (locale?: string) =>\n shortcutMessages.resolve([locale ?? (typeof document === \"undefined\" ? shortcutMessages.baseLocale : document.documentElement.lang)]).t;\nexport const checkShortcutMessages = () => shortcutMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAElC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;EACnC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,SAAS,EAAE,MAAM;MACjB,QAAQ,EAAE,KAAK;MACf,UAAU,EAAE,OAAO;MACnB,SAAS,EAAE,MAAM;MACjB,OAAO,EAAE,SAAS;MAClB,YAAY,EAAE,SAAS;MACvB,MAAM,EAAE,QAAQ;MAChB,KAAK,EAAE,OAAO;MACd,OAAO,EAAE,SAAS;MAClB,GAAG,EAAE,KAAK;MACV,IAAI,EAAE,MAAM;MACZ,OAAO,EAAE,UAAU;MACnB,SAAS,EAAE,YAAY;MACvB,SAAS,EAAE,YAAY;MACvB,UAAU,EAAE,aAAa;MACzB,KAAK,EAAE,OAAO;MACd,MAAM,EAAE,QAAQ;MAChB,GAAG,EAAE,KAAK;MACV,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,WAAW;MACtB,MAAM,EAAE,QAAQ;MAChB,IAAI,EAAE,MAAM;MACZ,GAAG,EAAE,KAAK;MACV,MAAM,EAAE,SAAS;MACjB,QAAQ,EAAE,WAAW;MACrB,UAAU,EAAE,OAAO;MACnB,WAAW,EAAE,KAAK;MAClB,SAAS,EAAE,MAAM;MACjB,QAAQ,EAAE,KAAK;MACf,WAAW,EAAE,MAAM;MACnB,aAAa,EAAE;IACjB,CAAC;IACD,EAAE,EAAE;MACF,SAAS,EAAE,MAAM;MACjB,QAAQ,EAAE,KAAK;MACf,UAAU,EAAE,UAAU;MACtB,SAAS,EAAE,MAAM;MACjB,OAAO,EAAE,WAAW;MACpB,YAAY,EAAE,SAAS;MACvB,MAAM,EAAE,WAAW;MACnB,KAAK,EAAE,eAAe;MACtB,OAAO,EAAE,cAAc;MACvB,GAAG,EAAE,KAAK;MACV,IAAI,EAAE,MAAM;MACZ,OAAO,EAAE,iBAAiB;MAC1B,SAAS,EAAE,kBAAkB;MAC7B,SAAS,EAAE,kBAAkB;MAC7B,UAAU,EAAE,mBAAmB;MAC/B,KAAK,EAAE,cAAc;MACrB,MAAM,EAAE,QAAQ;MAChB,GAAG,EAAE,gBAAgB;MACrB,KAAK,EAAE,WAAW;MAClB,SAAS,EAAE,WAAW;MACtB,MAAM,EAAE,WAAW;MACnB,IAAI,EAAE,OAAO;MACb,GAAG,EAAE,MAAM;MACX,MAAM,EAAE,UAAU;MAClB,QAAQ,EAAE,SAAS;MACnB,UAAU,EAAE,WAAW;MACvB,WAAW,EAAE,MAAM;MACnB,SAAS,EAAE,MAAM;MACjB,QAAQ,EAAE,MAAM;MAChB,WAAW,EAAE,OAAO;MACpB,aAAa,EAAE;IACjB;EACF;AACF,CAAC,CAAC;;AAEF;AACA,OAAO,MAAM,uBAAuB,GAAI,MAAe,IACrD,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,QAAQ,KAAK,WAAW,GAAG,gBAAgB,CAAC,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACzI,OAAO,MAAM,qBAAqB,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,123 @@
1
+ import { resolveShortcutMessages } from "./shortcut-messages";
2
+ /**
3
+ * Apple keyboards name the platform modifier Command. `source` is a User-Agent or `navigator.platform` string.
4
+ * Without `source`, reads the runtime's navigator; server callers pass the request's User-Agent.
5
+ * @example keyboardPlatform("MacIntel") // "apple"
6
+ */
7
+ export const keyboardPlatform = source => /Mac|iPhone|iPad|iPod/.test(source ?? (typeof navigator === "undefined" ? "" : navigator.platform || navigator.userAgent)) ? "apple" : "other";
8
+ const modifiers = ["ctrl", "alt", "shift", "meta"];
9
+
10
+ /**
11
+ * Formats one plus-separated shortcut in canonical modifier order.
12
+ * @example formatShortcut("mod+alt+n", { platform: "apple" }).label // "⌥⌘N"
13
+ */
14
+ export const formatShortcut = (shortcut, options = {}) => {
15
+ const empty = {
16
+ keys: [],
17
+ label: "",
18
+ name: ""
19
+ };
20
+ const input = shortcut.trim().toLowerCase();
21
+ const plus = input === "+" || input.endsWith("++");
22
+ const parts = (plus ? input.slice(0, -1) : input).split("+");
23
+ const key = plus ? "+" : parts.pop() || (shortcut === " " || shortcut.endsWith("+ ") ? "space" : undefined);
24
+ if (plus) parts.pop();
25
+ if (!key || modifiers.some(modifier => key === modifier) || key === "mod" || parts.some(part => part !== "mod" && !modifiers.some(modifier => part === modifier))) return empty;
26
+ const apple = (options.platform ?? keyboardPlatform()) === "apple";
27
+ const t = resolveShortcutMessages(options.locale);
28
+ const selected = new Set(parts.map(part => part === "mod" ? apple ? "meta" : "ctrl" : part));
29
+ const labels = apple ? {
30
+ ctrl: "⌃",
31
+ alt: "⌥",
32
+ shift: "⇧",
33
+ meta: "⌘"
34
+ } : {
35
+ ctrl: t.ctrlLabel,
36
+ alt: t.altLabel,
37
+ shift: t.shiftLabel,
38
+ meta: t.metaLabel
39
+ };
40
+ const names = {
41
+ ctrl: apple ? t.appleControl : t.control,
42
+ alt: apple ? t.option : t.alt,
43
+ shift: t.shift,
44
+ meta: apple ? t.command : t.meta
45
+ };
46
+ const named = {
47
+ arrowup: {
48
+ label: "↑",
49
+ name: t.arrowup
50
+ },
51
+ arrowdown: {
52
+ label: "↓",
53
+ name: t.arrowdown
54
+ },
55
+ arrowleft: {
56
+ label: "←",
57
+ name: t.arrowleft
58
+ },
59
+ arrowright: {
60
+ label: "→",
61
+ name: t.arrowright
62
+ },
63
+ enter: {
64
+ label: "↵",
65
+ name: t.enter
66
+ },
67
+ escape: {
68
+ label: "Esc",
69
+ name: t.escape
70
+ },
71
+ esc: {
72
+ label: "Esc",
73
+ name: t.escape
74
+ },
75
+ tab: {
76
+ label: "Tab",
77
+ name: t.tab
78
+ },
79
+ space: {
80
+ label: t.spaceLabel,
81
+ name: t.space
82
+ },
83
+ backspace: {
84
+ label: "⌫",
85
+ name: t.backspace
86
+ },
87
+ delete: {
88
+ label: apple ? "⌦" : t.deleteLabel,
89
+ name: t.delete
90
+ },
91
+ home: {
92
+ label: t.homeLabel,
93
+ name: t.home
94
+ },
95
+ end: {
96
+ label: t.endLabel,
97
+ name: t.end
98
+ },
99
+ pageup: {
100
+ label: t.pageupLabel,
101
+ name: t.pageup
102
+ },
103
+ pagedown: {
104
+ label: t.pagedownLabel,
105
+ name: t.pagedown
106
+ }
107
+ };
108
+ const label = key.length === 1 || /^f(?:[1-9]|1[0-2])$/.test(key) ? key.toUpperCase() : key[0].toUpperCase() + key.slice(1);
109
+ const namedKey = Object.hasOwn(named, key) ? named[key] : undefined;
110
+ const keys = [...modifiers.filter(modifier => selected.has(modifier)).map(modifier => ({
111
+ label: labels[modifier],
112
+ name: names[modifier]
113
+ })), namedKey ?? {
114
+ label,
115
+ name: label
116
+ }];
117
+ return {
118
+ keys,
119
+ label: keys.map(key => key.label).join(apple ? "" : "+"),
120
+ name: keys.map(key => key.name).join(" ")
121
+ };
122
+ };
123
+ //# sourceMappingURL=shortcut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["intl/shortcut.ts"],"sourcesContent":["import { resolveShortcutMessages } from \"./shortcut-messages\";\n\nexport type KeyboardPlatform = \"apple\" | \"other\";\n/**\n * Apple keyboards name the platform modifier Command. `source` is a User-Agent or `navigator.platform` string.\n * Without `source`, reads the runtime's navigator; server callers pass the request's User-Agent.\n * @example keyboardPlatform(\"MacIntel\") // \"apple\"\n */\nexport const keyboardPlatform = (source?: string): KeyboardPlatform =>\n /Mac|iPhone|iPad|iPod/.test(source ?? (typeof navigator === \"undefined\" ? \"\" : navigator.platform || navigator.userAgent))\n ? \"apple\"\n : \"other\";\n\nexport type ShortcutKey = {\n /** What the cap shows: \"⌘\", \"Strg\", \"K\", \"↵\". */\n label: string;\n /** What a screen reader says: \"Command\", \"Steuerung\", \"K\", \"Enter\". */\n name: string;\n};\nexport type FormattedShortcut = {\n keys: ShortcutKey[];\n /** \"⌘K\" on Apple, \"Ctrl+K\" / \"Strg+K\" elsewhere. */\n label: string;\n /** \"Command K\", \"Steuerung K\". */\n name: string;\n};\nexport type ShortcutFormatOptions = { platform?: KeyboardPlatform; locale?: string };\nconst modifiers = [\"ctrl\", \"alt\", \"shift\", \"meta\"] as const;\n\n/**\n * Formats one plus-separated shortcut in canonical modifier order.\n * @example formatShortcut(\"mod+alt+n\", { platform: \"apple\" }).label // \"⌥⌘N\"\n */\nexport const formatShortcut = (shortcut: string, options: ShortcutFormatOptions = {}): FormattedShortcut => {\n const empty = { keys: [], label: \"\", name: \"\" };\n const input = shortcut.trim().toLowerCase();\n const plus = input === \"+\" || input.endsWith(\"++\");\n const parts = (plus ? input.slice(0, -1) : input).split(\"+\");\n const key = plus ? \"+\" : parts.pop() || (shortcut === \" \" || shortcut.endsWith(\"+ \") ? \"space\" : undefined);\n if (plus) parts.pop();\n if (\n !key ||\n modifiers.some((modifier) => key === modifier) ||\n key === \"mod\" ||\n parts.some((part) => part !== \"mod\" && !modifiers.some((modifier) => part === modifier))\n )\n return empty;\n const apple = (options.platform ?? keyboardPlatform()) === \"apple\";\n const t = resolveShortcutMessages(options.locale);\n const selected = new Set(parts.map((part) => (part === \"mod\" ? (apple ? \"meta\" : \"ctrl\") : part)));\n const labels = apple\n ? { ctrl: \"⌃\", alt: \"⌥\", shift: \"⇧\", meta: \"⌘\" }\n : { ctrl: t.ctrlLabel, alt: t.altLabel, shift: t.shiftLabel, meta: t.metaLabel };\n const names = {\n ctrl: apple ? t.appleControl : t.control,\n alt: apple ? t.option : t.alt,\n shift: t.shift,\n meta: apple ? t.command : t.meta,\n };\n const named: Record<string, ShortcutKey> = {\n arrowup: { label: \"↑\", name: t.arrowup },\n arrowdown: { label: \"↓\", name: t.arrowdown },\n arrowleft: { label: \"←\", name: t.arrowleft },\n arrowright: { label: \"→\", name: t.arrowright },\n enter: { label: \"↵\", name: t.enter },\n escape: { label: \"Esc\", name: t.escape },\n esc: { label: \"Esc\", name: t.escape },\n tab: { label: \"Tab\", name: t.tab },\n space: { label: t.spaceLabel, name: t.space },\n backspace: { label: \"⌫\", name: t.backspace },\n delete: { label: apple ? \"⌦\" : t.deleteLabel, name: t.delete },\n home: { label: t.homeLabel, name: t.home },\n end: { label: t.endLabel, name: t.end },\n pageup: { label: t.pageupLabel, name: t.pageup },\n pagedown: { label: t.pagedownLabel, name: t.pagedown },\n };\n const label = key.length === 1 || /^f(?:[1-9]|1[0-2])$/.test(key) ? key.toUpperCase() : key[0]!.toUpperCase() + key.slice(1);\n const namedKey = Object.hasOwn(named, key) ? named[key] : undefined;\n const keys = [\n ...modifiers.filter((modifier) => selected.has(modifier)).map((modifier) => ({ label: labels[modifier], name: names[modifier] })),\n namedKey ?? { label, name: label },\n ];\n return { keys, label: keys.map((key) => key.label).join(apple ? \"\" : \"+\"), name: keys.map((key) => key.name).join(\" \") };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -27,31 +27,33 @@ var _tmpl$ = ["<button type=\"button\" class=\"k2b-app-workspace__resize\" role=
27
27
  _tmpl$16 = "<span class=\"k2b-app-workspace__sidebar-status-mention\" aria-hidden=\"true\">@</span>",
28
28
  _tmpl$17 = "<span class=\"k2b-app-workspace__sidebar-status-muted\" aria-hidden=\"true\"><i class=\"ti ti-bell-off\"></i></span>",
29
29
  _tmpl$18 = ["<span class=\"k2b-app-workspace__sidebar-status-count\"", ">", "</span>"],
30
- _tmpl$19 = ["<span class=\"k2b-app-workspace__sidebar-status\"", ">", "", "<span class=\"k2b-app-workspace__sidebar-status-unread\" aria-hidden=\"true\">", "</span><span class=\"k2b-sr-only\">, ", "</span></span>"],
31
- _tmpl$20 = "<span class=\"k2b-app-workspace__sidebar-status-dot\"></span>",
32
- _tmpl$21 = ["<span class=\"k2b-app-workspace__sidebar-item-icon\" aria-hidden=\"true\">", "</span>"],
33
- _tmpl$22 = ["<span class=\"k2b-app-workspace__sidebar-item-context-meta\">", "</span>"],
34
- _tmpl$23 = ["<span class=\"k2b-app-workspace__sidebar-item-context\"><span class=\"k2b-app-workspace__sidebar-item-context-label\">", "</span>", "</span>"],
35
- _tmpl$24 = ["<span class=\"k2b-app-workspace__sidebar-item-description\">", "</span>"],
36
- _tmpl$25 = ["<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>"],
37
- _tmpl$26 = ["<span class=\"k2b-app-workspace__sidebar-item-meta\"", ">", "</span>"],
38
- _tmpl$27 = ["<i", "></i>"],
39
- _tmpl$28 = ["<a", " class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</a>"],
40
- _tmpl$29 = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</button>"],
41
- _tmpl$30 = ["<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>"],
42
- _tmpl$31 = ["<span class=\"", "\"", ">", "</span>"],
43
- _tmpl$32 = ["<span class=\"k2b-app-workspace__nav-tree-toggle\" data-k2b-nav-tree-toggle aria-hidden=\"true\"><i class=\"", "\"></i></span>"],
44
- _tmpl$33 = ["<span class=\"k2b-app-workspace__sidebar-item-label\"><span class=\"k2b-app-workspace__sidebar-item-label-text\">", "</span></span>"],
45
- _tmpl$34 = ["<div class=\"k2b-app-workspace__nav-tree-group\" role=\"group\">", "</div>"],
46
- _tmpl$35 = ["<div class=\"k2b-app-workspace__nav-tree-node\" role=\"treeitem\"", " style=\"", "\">", "", "</div>"],
47
- _tmpl$36 = ["<div class=\"", "\" role=\"tree\"", ">", "</div>"],
48
- _tmpl$37 = ["<div class=\"k2b-app-workspace__sidebar-icon-grid\"", ">", "</div>"],
49
- _tmpl$38 = ["<i", " aria-hidden=\"true\"></i>"],
50
- _tmpl$39 = "<i class=\"ti ti-layout-sidebar\" aria-hidden=\"true\"></i>",
51
- _tmpl$40 = ["<div class=\"k2b-app-workspace__head\"", ">", "", "</div>"],
52
- _tmpl$41 = ["<h1 class=\"k2b-app-workspace__head-heading\" data-k2b-page-trail-title", ">", "</h1>"],
53
- _tmpl$42 = ["<div class=\"", "\" data-k2b-app-workspace", " style=\"", "\">", "", "</div>"],
54
- _tmpl$43 = ["<div class=\"", "\">", "</div>"];
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>"];
55
57
  import { Link } from "@k2b/ssr/nav";
56
58
  import { children, createContext, createEffect, createMemo, createSignal, createUniqueId, For, mergeProps, onCleanup, onMount, Show, useContext } from "solid-js";
57
59
  import { isServer } from "solid-js/web";
@@ -60,6 +62,7 @@ import { APP_WORKSPACE_DETAIL_CLOSE_EVENT, APP_WORKSPACE_DETAIL_STEP_EVENT, APP_
60
62
  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";
61
63
  import { PageTitle, usePageTrail } from "./PageTitle";
62
64
  import { SidebarItemPreview } from "./SidebarItemPreview";
65
+ import { AppWorkspaceSidebarSwitcher } from "./SidebarSwitcher";
63
66
  import { createScrollFade } from "./scroll-fade";
64
67
  import { assertStableUiId, assertUniqueStableUiIds } from "./stable-id";
65
68
  import { useWorkspaceMessages } from "./workspace-messages";
@@ -566,26 +569,29 @@ const AppWorkspaceSidebarItemStatus = props => {
566
569
  }) : dot() ? workspaceMessages().sidebarNewActivity : "", props.mention ? workspaceMessages().sidebarMentioned : "", props.muted ? workspaceMessages().sidebarMuted : ""].filter(Boolean).join(", ");
567
570
  // The unread slot stays reserved at the end, and the marks that change most
568
571
  // often sit outermost, so new activity or a mention never moves another mark.
569
- return _$createComponent(Show, {
572
+ // The element itself stays when there is nothing to show: empty, it takes no
573
+ // space, and it still keeps the row's label on one line, so the first count
574
+ // 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, {
570
576
  get when() {
571
577
  return description();
572
578
  },
573
579
  get children() {
574
- return _$ssr(_tmpl$19, _$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, {
580
+ return [_$createComponent(Show, {
575
581
  get when() {
576
582
  return props.mention;
577
583
  },
578
584
  get children() {
579
585
  return _$ssr(_tmpl$16);
580
586
  }
581
- })), _$escape(_$createComponent(Show, {
587
+ }), _$createComponent(Show, {
582
588
  get when() {
583
589
  return props.muted;
584
590
  },
585
591
  get children() {
586
592
  return _$ssr(_tmpl$17);
587
593
  }
588
- })), _$escape(_$createComponent(Show, {
594
+ }), _$ssr(_tmpl$19, _$escape(_$createComponent(Show, {
589
595
  get when() {
590
596
  return count() || waiting() === 0;
591
597
  },
@@ -595,16 +601,16 @@ const AppWorkspaceSidebarItemStatus = props => {
595
601
  return dot();
596
602
  },
597
603
  get children() {
598
- return _$ssr(_tmpl$20);
604
+ return _$ssr(_tmpl$22);
599
605
  }
600
606
  });
601
607
  },
602
608
  get children() {
603
609
  return _$ssr(_tmpl$18, _$ssrAttribute("data-mention", props.mention ? "true" : _$escape(undefined, true), false), count() > 99 ? "99+" : _$escape(count()));
604
610
  }
605
- })), _$escape(description()));
611
+ }))), _$ssr(_tmpl$20, _$escape(description()))];
606
612
  }
607
- });
613
+ })));
608
614
  };
609
615
  /** Shared visual and semantic row frame for flat sidebar items and tree items. */
610
616
  function AppWorkspaceSidebarRow(props) {
@@ -725,10 +731,11 @@ function AppWorkspaceSidebarItem(props) {
725
731
  const actionSlot = createMemo(() => slots().find(slot => slot.kind === SIDEBAR_ITEM_ACTION));
726
732
  const legacy = createMemo(() => values().filter(value => !sidebarItemSlot(value)));
727
733
  const label = () => labelSlot()?.children ?? (legacy().length === 1 ? legacy()[0] : legacy());
734
+ const oneLine = () => !(labelSlot()?.marquee ?? (props.variant ?? "row") === "row");
728
735
  const icon = () => iconSlot()?.icon ?? props.icon;
729
736
  const iconContent = () => iconSlot()?.children;
730
- // Resolved first, so a component that renders nothing, such as a status with
731
- // nothing to show, leaves no empty slot in the browser either.
737
+ // Resolved first, so metadata that renders nothing leaves no empty slot. An
738
+ // empty status still renders its element; the stylesheet hides that slot.
732
739
  const meta = children(() => metaSlot()?.children ?? props.meta);
733
740
  const hasMeta = () => meta.toArray().some(Boolean);
734
741
  const metaId = createUniqueId();
@@ -741,35 +748,35 @@ function AppWorkspaceSidebarItem(props) {
741
748
  return iconContent() || icon();
742
749
  },
743
750
  get children() {
744
- return _$ssr(_tmpl$21, _$escape(iconContent() ?? _$ssr(_tmpl$27, _$ssrAttribute("class", _$escape(iconClass(icon()), true), false))));
751
+ return _$ssr(_tmpl$23, _$escape(iconContent() ?? _$ssr(_tmpl$29, _$ssrAttribute("class", _$escape(iconClass(icon()), true), false))));
745
752
  }
746
- }), _$ssr(_tmpl$25, _$escape(_$createComponent(Show, {
753
+ }), _$ssr(_tmpl$27, _$escape(_$createComponent(Show, {
747
754
  get when() {
748
755
  return props.context || props.contextMeta;
749
756
  },
750
757
  get children() {
751
- return _$ssr(_tmpl$23, _$escape(props.context), _$escape(_$createComponent(Show, {
758
+ return _$ssr(_tmpl$25, _$escape(props.context), _$escape(_$createComponent(Show, {
752
759
  get when() {
753
760
  return props.contextMeta;
754
761
  },
755
762
  get children() {
756
- return _$ssr(_tmpl$22, _$escape(props.contextMeta));
763
+ return _$ssr(_tmpl$24, _$escape(props.contextMeta));
757
764
  }
758
765
  })));
759
766
  }
760
- })), _$ssrAttribute("data-marquee", labelSlot()?.marquee ?? (props.variant ?? "row") === "row" ? "true" : "false", false), _$escape(label()), _$escape(_$createComponent(Show, {
767
+ })), _$ssrAttribute("data-lines", oneLine() ? "1" : _$escape(undefined, true), false) + _$ssrAttribute("data-label", !oneLine() && typeof label() === "string" ? _$escape(label(), true) : _$escape(undefined, true), false), _$escape(label()), _$escape(_$createComponent(Show, {
761
768
  get when() {
762
769
  return props.description;
763
770
  },
764
771
  get children() {
765
- return _$ssr(_tmpl$24, _$escape(props.description));
772
+ return _$ssr(_tmpl$26, _$escape(props.description));
766
773
  }
767
774
  }))), _$createComponent(Show, {
768
775
  get when() {
769
776
  return hasMeta();
770
777
  },
771
778
  get children() {
772
- return _$ssr(_tmpl$26, _$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()));
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()));
773
780
  }
774
781
  })];
775
782
  const singleAction = () => {
@@ -784,7 +791,7 @@ function AppWorkspaceSidebarItem(props) {
784
791
  actionSlot()?.onSelect?.(event);
785
792
  props.onActionClick?.(event);
786
793
  };
787
- const content = () => actionSlot()?.children ?? _$ssr(_tmpl$27, _$ssrAttribute("class", _$escape(iconClass(actionSlot()?.icon ?? props.actionIcon, "ti-dots"), true), false));
794
+ const content = () => actionSlot()?.children ?? _$ssr(_tmpl$29, _$ssrAttribute("class", _$escape(iconClass(actionSlot()?.icon ?? props.actionIcon, "ti-dots"), true), false));
788
795
  return _$createComponent(Show, {
789
796
  get when() {
790
797
  return Boolean(actionSlot() || props.actionIcon);
@@ -795,10 +802,10 @@ function AppWorkspaceSidebarItem(props) {
795
802
  return _$memo(() => !!actionSlot()?.href)() && !actionSlot()?.disabled;
796
803
  },
797
804
  get fallback() {
798
- return _$ssr(_tmpl$29, _$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()));
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()));
799
806
  },
800
807
  get children() {
801
- return _$ssr(_tmpl$28, _$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()));
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()));
802
809
  }
803
810
  });
804
811
  }
@@ -1104,31 +1111,31 @@ const AppWorkspaceNavTree = props => {
1104
1111
  get ["data-k2b-nav-tree-toggle"]() {
1105
1112
  return usesIconDisclosure() ? "" : undefined;
1106
1113
  }
1107
- }, () => iconAccessibility(item.iconLabel)), _$ssr(_tmpl$27, _$ssrAttribute("class", _$escape(iconClass(rowIcon()), true), false)), false);
1114
+ }, () => iconAccessibility(item.iconLabel)), _$ssr(_tmpl$29, _$ssrAttribute("class", _$escape(iconClass(rowIcon()), true), false)), false);
1108
1115
  }
1109
1116
  }), _$createComponent(Show, {
1110
1117
  get when() {
1111
1118
  return item.description !== undefined;
1112
1119
  },
1113
1120
  get fallback() {
1114
- return _$ssr(_tmpl$33, _$escape(item.label));
1121
+ return _$ssr(_tmpl$35, _$ssrAttribute("data-label", typeof item.label === "string" ? _$escape(item.label, true) : _$escape(undefined, true), false), _$escape(item.label));
1115
1122
  },
1116
1123
  get children() {
1117
- return _$ssr(_tmpl$30, _$escape(item.label), _$escape(item.description));
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));
1118
1125
  }
1119
1126
  }), _$createComponent(Show, {
1120
1127
  get when() {
1121
1128
  return item.meta !== undefined;
1122
1129
  },
1123
1130
  get children() {
1124
- return _$ssr(_tmpl$31, `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));
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));
1125
1132
  }
1126
1133
  }), _$createComponent(Show, {
1127
1134
  get when() {
1128
1135
  return _$memo(() => !!hasChildren())() && !usesIconDisclosure();
1129
1136
  },
1130
1137
  get children() {
1131
- return _$ssr(_tmpl$32, `ti ${isExpanded(item.id) ? "ti-chevron-down" : "ti-chevron-right"}`);
1138
+ return _$ssr(_tmpl$34, `ti ${isExpanded(item.id) ? "ti-chevron-down" : "ti-chevron-right"}`);
1132
1139
  }
1133
1140
  })];
1134
1141
  const row = () => _$createComponent(AppWorkspaceSidebarRow, {
@@ -1235,12 +1242,12 @@ const AppWorkspaceNavTree = props => {
1235
1242
  endDrag();
1236
1243
  requestMove(target.move, false);
1237
1244
  };
1238
- return _$ssr(_tmpl$35, _$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, {
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, {
1239
1246
  get when() {
1240
1247
  return _$memo(() => !!hasChildren())() && isExpanded(item.id);
1241
1248
  },
1242
1249
  get children() {
1243
- return _$ssr(_tmpl$34, _$escape(renderItems(nested, depth + 1, item.id)));
1250
+ return _$ssr(_tmpl$36, _$escape(renderItems(nested, depth + 1, item.id)));
1244
1251
  }
1245
1252
  })));
1246
1253
  }
@@ -1265,7 +1272,7 @@ const AppWorkspaceNavTree = props => {
1265
1272
  doc?.removeEventListener("pointermove", forgetDrag, true);
1266
1273
  });
1267
1274
  });
1268
- return _$ssr(_tmpl$36, `k2b-app-workspace__nav-tree ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.ariaLabel, true), false), _$escape(renderItems(roots, 0)));
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)));
1269
1276
  };
1270
1277
  AppWorkspaceNavTree.Item = AppWorkspaceNavTreeItem;
1271
1278
  const AppWorkspaceSidebarIconGrid = props => _$ssrElement("section", _$mergeProps({
@@ -1277,9 +1284,9 @@ const AppWorkspaceSidebarIconGrid = props => _$ssrElement("section", _$mergeProp
1277
1284
  return props.title;
1278
1285
  },
1279
1286
  children: title => _$ssr(_tmpl$14, _$escape(title()))
1280
- })), _$ssr(_tmpl$37, _$ssrAttribute("data-columns", _$escape(props.columns ?? 2, true), false), _$escape(props.children))], false);
1287
+ })), _$ssr(_tmpl$39, _$ssrAttribute("data-columns", _$escape(props.columns ?? 2, true), false), _$escape(props.children))], false);
1281
1288
  const AppWorkspaceSidebarIconAction = props => {
1282
- const content = _$ssr(_tmpl$38, _$ssrAttribute("class", _$escape(iconClass(props.icon), true), false));
1289
+ const content = _$ssr(_tmpl$40, _$ssrAttribute("class", _$escape(iconClass(props.icon), true), false));
1283
1290
  const attrs = () => ({
1284
1291
  class: `k2b-app-workspace__sidebar-icon-action ${props.active ? "is-active" : ""}`,
1285
1292
  title: props.label,
@@ -1337,7 +1344,7 @@ function AppWorkspaceHead(props) {
1337
1344
  const messages = useWorkspaceMessages();
1338
1345
  // A nested workspace is part of a page that already shows its title.
1339
1346
  const trail = props.nested ? () => undefined : usePageTrail();
1340
- return _$ssr(_tmpl$40, _$ssrAttribute("data-trail", trail()?.ancestors.length ? "up" : trail() ? "title" : _$escape(undefined, true), false), _$escape(_$createComponent(IconButton, {
1347
+ return _$ssr(_tmpl$42, _$ssrAttribute("data-trail", trail()?.ancestors.length ? "up" : trail() ? "title" : _$escape(undefined, true), false), _$escape(_$createComponent(IconButton, {
1341
1348
  "class": "k2b-app-workspace__head-toggle",
1342
1349
  get label() {
1343
1350
  return messages().showNavigation;
@@ -1348,7 +1355,7 @@ function AppWorkspaceHead(props) {
1348
1355
  "aria-expanded": "false",
1349
1356
  "data-app-workspace-sidebar-toggle": "",
1350
1357
  get children() {
1351
- return _$ssr(_tmpl$39);
1358
+ return _$ssr(_tmpl$41);
1352
1359
  }
1353
1360
  })), _$escape(_$createComponent(Show, {
1354
1361
  get when() {
@@ -1360,7 +1367,7 @@ function AppWorkspaceHead(props) {
1360
1367
  },
1361
1368
  as: "p",
1362
1369
  fallback: true
1363
- }), _$ssr(_tmpl$41, _$ssrAttribute("data-k2b-server", isServer ? "" : _$escape(undefined, true), false), _$escape(current().title))]
1370
+ }), _$ssr(_tmpl$43, _$ssrAttribute("data-k2b-server", isServer ? "" : _$escape(undefined, true), false), _$escape(current().title))]
1364
1371
  })));
1365
1372
  }
1366
1373
  const AppWorkspace = props => {
@@ -1395,7 +1402,7 @@ const AppWorkspace = props => {
1395
1402
  return _$createComponent(WorkspaceContext.Provider, {
1396
1403
  value: workspace,
1397
1404
  get children() {
1398
- return _$ssr(_tmpl$42, `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, {
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, {
1399
1406
  sidebarId: sidebarId,
1400
1407
  nested: nested
1401
1408
  })), _$escape(props.children));
@@ -1412,13 +1419,14 @@ AppWorkspace.LayoutStateProvider = props => _$createComponent(LayoutStateContext
1412
1419
  return props.children;
1413
1420
  }
1414
1421
  });
1415
- AppWorkspace.Content = props => _$ssr(_tmpl$43, `k2b-app-workspace__content ${_$escape(props.class ?? "", true)}`, _$escape(props.children));
1422
+ AppWorkspace.Content = props => _$ssr(_tmpl$45, `k2b-app-workspace__content ${_$escape(props.class ?? "", true)}`, _$escape(props.children));
1416
1423
  AppWorkspace.Main = AppWorkspaceMain;
1417
1424
  AppWorkspace.MainPane = AppWorkspaceMainPane;
1418
1425
  AppWorkspace.Detail = AppWorkspaceDetail;
1419
1426
  AppWorkspace.BottomDrawer = AppWorkspaceBottomDrawer;
1420
1427
  AppWorkspace.Sidebar = AppWorkspaceSidebar;
1421
1428
  AppWorkspace.SidebarDesktop = AppWorkspaceSidebarDesktop;
1429
+ AppWorkspace.SidebarSwitcher = AppWorkspaceSidebarSwitcher;
1422
1430
  AppWorkspace.SidebarSection = AppWorkspaceSidebarSection;
1423
1431
  AppWorkspace.SidebarBody = AppWorkspaceSidebarBody;
1424
1432
  AppWorkspace.SidebarFooter = AppWorkspaceSidebarFooter;