@k2b/ui 0.17.0 → 0.19.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 (228) hide show
  1. package/README.md +3 -2
  2. package/dist/browser/actions/ContextMenu.js +3 -1
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/Dropdown.js +91 -46
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js +4 -1
  7. package/dist/browser/actions/FilterChip.js.map +1 -1
  8. package/dist/browser/chat/ChatComposer.js +1311 -565
  9. package/dist/browser/chat/ChatComposer.js.map +1 -1
  10. package/dist/browser/chat/ChatPrimitives.js +9 -6
  11. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  12. package/dist/browser/chat/chat-behavior.js +9 -0
  13. package/dist/browser/chat/chat-behavior.js.map +1 -1
  14. package/dist/browser/chat/index.js.map +1 -1
  15. package/dist/browser/chat/types.js.map +1 -1
  16. package/dist/browser/content/Calendar.js +579 -533
  17. package/dist/browser/content/Calendar.js.map +1 -1
  18. package/dist/browser/content/FileView.js +62 -36
  19. package/dist/browser/content/FileView.js.map +1 -1
  20. package/dist/browser/content/Lightbox.js +76 -40
  21. package/dist/browser/content/Lightbox.js.map +1 -1
  22. package/dist/browser/content/MarkdownView.js +9 -3
  23. package/dist/browser/content/MarkdownView.js.map +1 -1
  24. package/dist/browser/content/PdfPreview.js +146 -79
  25. package/dist/browser/content/PdfPreview.js.map +1 -1
  26. package/dist/browser/content/Timeline.js +1038 -0
  27. package/dist/browser/content/Timeline.js.map +1 -0
  28. package/dist/browser/content/VideoPlayer.js +299 -0
  29. package/dist/browser/content/VideoPlayer.js.map +1 -0
  30. package/dist/browser/content/chart-inspection.js +7 -2
  31. package/dist/browser/content/chart-inspection.js.map +1 -1
  32. package/dist/browser/content/file-view-preview.js +2 -2
  33. package/dist/browser/content/file-view-preview.js.map +1 -1
  34. package/dist/browser/content/index.js +3 -0
  35. package/dist/browser/content/index.js.map +1 -1
  36. package/dist/browser/content/markdown-links.js +178 -0
  37. package/dist/browser/content/markdown-links.js.map +1 -0
  38. package/dist/browser/content/timeline-model.js +579 -0
  39. package/dist/browser/content/timeline-model.js.map +1 -0
  40. package/dist/browser/feedback/dialog-core.js +26 -14
  41. package/dist/browser/feedback/dialog-core.js.map +1 -1
  42. package/dist/browser/inputs/ChoiceChips.js +66 -0
  43. package/dist/browser/inputs/ChoiceChips.js.map +1 -0
  44. package/dist/browser/inputs/ChoiceGroups.js +53 -12
  45. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  46. package/dist/browser/inputs/FileDropTarget.js +129 -0
  47. package/dist/browser/inputs/FileDropTarget.js.map +1 -0
  48. package/dist/browser/inputs/FileInputs.js +84 -43
  49. package/dist/browser/inputs/FileInputs.js.map +1 -1
  50. package/dist/browser/inputs/SignatureInput.js +558 -0
  51. package/dist/browser/inputs/SignatureInput.js.map +1 -0
  52. package/dist/browser/inputs/emoji/EmojiPicker.js +841 -0
  53. package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -0
  54. package/dist/browser/inputs/emoji/emoji-data.js +1903 -0
  55. package/dist/browser/inputs/emoji/emoji-data.js.map +1 -0
  56. package/dist/browser/inputs/emoji/emoji-index.js +209 -0
  57. package/dist/browser/inputs/emoji/emoji-index.js.map +1 -0
  58. package/dist/browser/inputs/emoji/emoji-messages.js +64 -0
  59. package/dist/browser/inputs/emoji/emoji-messages.js.map +1 -0
  60. package/dist/browser/inputs/file-drop.js +338 -0
  61. package/dist/browser/inputs/file-drop.js.map +1 -0
  62. package/dist/browser/inputs/index.js +6 -0
  63. package/dist/browser/inputs/index.js.map +1 -1
  64. package/dist/browser/inputs/markdown/MarkdownEditor.js +72 -78
  65. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  66. package/dist/browser/inputs/markdown/actions.js +48 -2
  67. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  68. package/dist/browser/inputs/markdown/code-zone.js +38 -2
  69. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  70. package/dist/browser/inputs/signature-messages.js +39 -0
  71. package/dist/browser/inputs/signature-messages.js.map +1 -0
  72. package/dist/browser/inputs/signature.js +208 -0
  73. package/dist/browser/inputs/signature.js.map +1 -0
  74. package/dist/browser/internal/render-error.js +49 -0
  75. package/dist/browser/internal/render-error.js.map +1 -0
  76. package/dist/browser/intl/messages.js +205 -4
  77. package/dist/browser/intl/messages.js.map +1 -1
  78. package/dist/browser/layout/AppWorkspace.js +483 -218
  79. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  80. package/dist/browser/layout/FloatingWindow.js +4 -1
  81. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  82. package/dist/browser/layout/Navigation.js +274 -197
  83. package/dist/browser/layout/Navigation.js.map +1 -1
  84. package/dist/browser/layout/SidebarItemPreview.js +5 -1
  85. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  86. package/dist/browser/layout/index.js.map +1 -1
  87. package/dist/browser/layout/navigation-model.js +2 -0
  88. package/dist/browser/layout/navigation-model.js.map +1 -1
  89. package/dist/browser/surfaces/NoticeCard.js +47 -44
  90. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  91. package/dist/browser/surfaces/ResourceCard.js +212 -0
  92. package/dist/browser/surfaces/ResourceCard.js.map +1 -0
  93. package/dist/browser/surfaces/index.js +1 -0
  94. package/dist/browser/surfaces/index.js.map +1 -1
  95. package/dist/licenses/emojibase-data.txt +21 -0
  96. package/dist/ssr/actions/ContextMenu.js +3 -1
  97. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  98. package/dist/ssr/actions/Dropdown.js +49 -12
  99. package/dist/ssr/actions/Dropdown.js.map +1 -1
  100. package/dist/ssr/actions/FilterChip.js +4 -1
  101. package/dist/ssr/actions/FilterChip.js.map +1 -1
  102. package/dist/ssr/chat/ChatComposer.js +823 -221
  103. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  104. package/dist/ssr/chat/ChatPrimitives.js +9 -6
  105. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  106. package/dist/ssr/chat/chat-behavior.js +9 -0
  107. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  108. package/dist/ssr/chat/index.js.map +1 -1
  109. package/dist/ssr/chat/types.js.map +1 -1
  110. package/dist/ssr/content/Calendar.js +183 -142
  111. package/dist/ssr/content/Calendar.js.map +1 -1
  112. package/dist/ssr/content/FileView.js +30 -6
  113. package/dist/ssr/content/FileView.js.map +1 -1
  114. package/dist/ssr/content/Lightbox.js +19 -5
  115. package/dist/ssr/content/Lightbox.js.map +1 -1
  116. package/dist/ssr/content/MarkdownView.js +9 -3
  117. package/dist/ssr/content/MarkdownView.js.map +1 -1
  118. package/dist/ssr/content/PdfPreview.js +77 -36
  119. package/dist/ssr/content/PdfPreview.js.map +1 -1
  120. package/dist/ssr/content/Timeline.js +804 -0
  121. package/dist/ssr/content/Timeline.js.map +1 -0
  122. package/dist/ssr/content/VideoPlayer.js +228 -0
  123. package/dist/ssr/content/VideoPlayer.js.map +1 -0
  124. package/dist/ssr/content/chart-inspection.js +7 -2
  125. package/dist/ssr/content/chart-inspection.js.map +1 -1
  126. package/dist/ssr/content/file-view-preview.js +2 -2
  127. package/dist/ssr/content/file-view-preview.js.map +1 -1
  128. package/dist/ssr/content/index.js +3 -0
  129. package/dist/ssr/content/index.js.map +1 -1
  130. package/dist/ssr/content/markdown-links.js +178 -0
  131. package/dist/ssr/content/markdown-links.js.map +1 -0
  132. package/dist/ssr/content/timeline-model.js +579 -0
  133. package/dist/ssr/content/timeline-model.js.map +1 -0
  134. package/dist/ssr/feedback/dialog-core.js +26 -14
  135. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  136. package/dist/ssr/inputs/ChoiceChips.js +66 -0
  137. package/dist/ssr/inputs/ChoiceChips.js.map +1 -0
  138. package/dist/ssr/inputs/ChoiceGroups.js +12 -4
  139. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  140. package/dist/ssr/inputs/FileDropTarget.js +103 -0
  141. package/dist/ssr/inputs/FileDropTarget.js.map +1 -0
  142. package/dist/ssr/inputs/FileInputs.js +49 -12
  143. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  144. package/dist/ssr/inputs/SignatureInput.js +404 -0
  145. package/dist/ssr/inputs/SignatureInput.js.map +1 -0
  146. package/dist/ssr/inputs/emoji/EmojiPicker.js +551 -0
  147. package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -0
  148. package/dist/ssr/inputs/emoji/emoji-data.js +1903 -0
  149. package/dist/ssr/inputs/emoji/emoji-data.js.map +1 -0
  150. package/dist/ssr/inputs/emoji/emoji-index.js +209 -0
  151. package/dist/ssr/inputs/emoji/emoji-index.js.map +1 -0
  152. package/dist/ssr/inputs/emoji/emoji-messages.js +64 -0
  153. package/dist/ssr/inputs/emoji/emoji-messages.js.map +1 -0
  154. package/dist/ssr/inputs/file-drop.js +338 -0
  155. package/dist/ssr/inputs/file-drop.js.map +1 -0
  156. package/dist/ssr/inputs/index.js +6 -0
  157. package/dist/ssr/inputs/index.js.map +1 -1
  158. package/dist/ssr/inputs/markdown/MarkdownEditor.js +14 -2
  159. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  160. package/dist/ssr/inputs/markdown/actions.js +48 -2
  161. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  162. package/dist/ssr/inputs/markdown/code-zone.js +38 -2
  163. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  164. package/dist/ssr/inputs/signature-messages.js +39 -0
  165. package/dist/ssr/inputs/signature-messages.js.map +1 -0
  166. package/dist/ssr/inputs/signature.js +208 -0
  167. package/dist/ssr/inputs/signature.js.map +1 -0
  168. package/dist/ssr/internal/render-error.js +49 -0
  169. package/dist/ssr/internal/render-error.js.map +1 -0
  170. package/dist/ssr/intl/messages.js +205 -4
  171. package/dist/ssr/intl/messages.js.map +1 -1
  172. package/dist/ssr/layout/AppWorkspace.js +264 -47
  173. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  174. package/dist/ssr/layout/FloatingWindow.js +4 -1
  175. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  176. package/dist/ssr/layout/Navigation.js +169 -122
  177. package/dist/ssr/layout/Navigation.js.map +1 -1
  178. package/dist/ssr/layout/SidebarItemPreview.js +5 -1
  179. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  180. package/dist/ssr/layout/index.js.map +1 -1
  181. package/dist/ssr/layout/navigation-model.js +2 -0
  182. package/dist/ssr/layout/navigation-model.js.map +1 -1
  183. package/dist/ssr/surfaces/NoticeCard.js +17 -12
  184. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  185. package/dist/ssr/surfaces/ResourceCard.js +115 -0
  186. package/dist/ssr/surfaces/ResourceCard.js.map +1 -0
  187. package/dist/ssr/surfaces/index.js +1 -0
  188. package/dist/ssr/surfaces/index.js.map +1 -1
  189. package/dist/styles.css +1 -1
  190. package/dist/types/actions/Dropdown.d.ts +13 -1
  191. package/dist/types/actions/FilterChip.d.ts +5 -0
  192. package/dist/types/chat/ChatComposer.d.ts +24 -1
  193. package/dist/types/chat/ChatPrimitives.d.ts +1 -1
  194. package/dist/types/chat/chat-behavior.d.ts +15 -0
  195. package/dist/types/chat/index.d.ts +1 -1
  196. package/dist/types/chat/types.d.ts +34 -0
  197. package/dist/types/content/Calendar.d.ts +28 -8
  198. package/dist/types/content/Lightbox.d.ts +8 -0
  199. package/dist/types/content/Timeline.d.ts +49 -0
  200. package/dist/types/content/VideoPlayer.d.ts +41 -0
  201. package/dist/types/content/index.d.ts +6 -2
  202. package/dist/types/content/markdown-links.d.ts +66 -0
  203. package/dist/types/content/timeline-model.d.ts +148 -0
  204. package/dist/types/feedback/dialog-core.d.ts +1 -1
  205. package/dist/types/inputs/ChoiceChips.d.ts +20 -0
  206. package/dist/types/inputs/ChoiceGroups.d.ts +11 -2
  207. package/dist/types/inputs/FileDropTarget.d.ts +23 -0
  208. package/dist/types/inputs/FileInputs.d.ts +8 -0
  209. package/dist/types/inputs/SignatureInput.d.ts +22 -0
  210. package/dist/types/inputs/emoji/EmojiPicker.d.ts +42 -0
  211. package/dist/types/inputs/emoji/emoji-data.d.ts +2 -0
  212. package/dist/types/inputs/emoji/emoji-index.d.ts +109 -0
  213. package/dist/types/inputs/emoji/emoji-messages.d.ts +30 -0
  214. package/dist/types/inputs/file-drop.d.ts +80 -0
  215. package/dist/types/inputs/index.d.ts +12 -0
  216. package/dist/types/inputs/markdown/actions.d.ts +4 -0
  217. package/dist/types/inputs/markdown/code-zone.d.ts +7 -0
  218. package/dist/types/inputs/signature-messages.d.ts +11 -0
  219. package/dist/types/inputs/signature.d.ts +72 -0
  220. package/dist/types/internal/render-error.d.ts +13 -0
  221. package/dist/types/intl/messages.d.ts +101 -0
  222. package/dist/types/layout/AppWorkspace.d.ts +38 -0
  223. package/dist/types/layout/SidebarItemPreview.d.ts +2 -0
  224. package/dist/types/layout/index.d.ts +2 -2
  225. package/dist/types/layout/navigation-model.d.ts +18 -0
  226. package/dist/types/surfaces/ResourceCard.d.ts +31 -0
  227. package/dist/types/surfaces/index.d.ts +2 -0
  228. package/package.json +5 -4
@@ -22,28 +22,32 @@ var _tmpl$ = ["<button type=\"button\" class=\"k2b-app-workspace__resize\" role=
22
22
  _tmpl$11 = ["<div", "", " class=\"k2b-app-workspace__sidebar-section-content\">", "</div>"],
23
23
  _tmpl$12 = ["<h2>", "</h2>"],
24
24
  _tmpl$13 = ["<div class=\"k2b-app-workspace__sidebar-item-actions\"", ">", "</div>"],
25
- _tmpl$14 = ["<span class=\"k2b-app-workspace__sidebar-item-icon\" aria-hidden=\"true\">", "</span>"],
26
- _tmpl$15 = ["<span class=\"k2b-app-workspace__sidebar-item-context-meta\">", "</span>"],
27
- _tmpl$16 = ["<span class=\"k2b-app-workspace__sidebar-item-context\"><span class=\"k2b-app-workspace__sidebar-item-context-label\">", "</span>", "</span>"],
28
- _tmpl$17 = ["<span class=\"k2b-app-workspace__sidebar-item-description\">", "</span>"],
29
- _tmpl$18 = ["<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>"],
30
- _tmpl$19 = ["<i", "></i>"],
31
- _tmpl$20 = ["<span class=\"k2b-app-workspace__sidebar-item-meta\"", ">", "</span>"],
32
- _tmpl$21 = ["<a", " class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</a>"],
33
- _tmpl$22 = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</button>"],
34
- _tmpl$23 = ["<span class=\"k2b-app-workspace__sidebar-item-icon\"", " aria-hidden=\"true\"><i", "></i></span>"],
35
- _tmpl$24 = ["<span class=\"k2b-app-workspace__sidebar-item-label\"><span class=\"k2b-app-workspace__sidebar-item-label-text\">", "</span></span>"],
36
- _tmpl$25 = ["<span class=\"", "\"", ">", "</span>"],
37
- _tmpl$26 = ["<span class=\"k2b-app-workspace__nav-tree-toggle\" data-k2b-nav-tree-toggle aria-hidden=\"true\"><i class=\"", "\"></i></span>"],
38
- _tmpl$27 = ["<div class=\"k2b-app-workspace__nav-tree-group\" role=\"group\">", "</div>"],
39
- _tmpl$28 = ["<div class=\"k2b-app-workspace__nav-tree-node\" role=\"treeitem\"", ">", "", "</div>"],
40
- _tmpl$29 = ["<div class=\"", "\" role=\"tree\"", ">", "</div>"],
41
- _tmpl$30 = ["<div class=\"k2b-app-workspace__sidebar-icon-grid\"", ">", "</div>"],
42
- _tmpl$31 = ["<i", " aria-hidden=\"true\"></i>"],
43
- _tmpl$32 = ["<div class=\"", "\" data-k2b-app-workspace", " style=\"", "\">", "</div>"],
44
- _tmpl$33 = ["<div class=\"", "\">", "</div>"];
25
+ _tmpl$14 = "<span class=\"k2b-app-workspace__sidebar-status-mention\" aria-hidden=\"true\">@</span>",
26
+ _tmpl$15 = "<span class=\"k2b-app-workspace__sidebar-status-muted\" aria-hidden=\"true\"><i class=\"ti ti-bell-off\"></i></span>",
27
+ _tmpl$16 = ["<span class=\"k2b-app-workspace__sidebar-status-count\"", ">", "</span>"],
28
+ _tmpl$17 = ["<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>"],
29
+ _tmpl$18 = "<span class=\"k2b-app-workspace__sidebar-status-dot\"></span>",
30
+ _tmpl$19 = ["<span class=\"k2b-app-workspace__sidebar-item-icon\" aria-hidden=\"true\">", "</span>"],
31
+ _tmpl$20 = ["<span class=\"k2b-app-workspace__sidebar-item-context-meta\">", "</span>"],
32
+ _tmpl$21 = ["<span class=\"k2b-app-workspace__sidebar-item-context\"><span class=\"k2b-app-workspace__sidebar-item-context-label\">", "</span>", "</span>"],
33
+ _tmpl$22 = ["<span class=\"k2b-app-workspace__sidebar-item-description\">", "</span>"],
34
+ _tmpl$23 = ["<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>"],
35
+ _tmpl$24 = ["<span class=\"k2b-app-workspace__sidebar-item-meta\"", ">", "</span>"],
36
+ _tmpl$25 = ["<i", "></i>"],
37
+ _tmpl$26 = ["<a", " class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</a>"],
38
+ _tmpl$27 = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-item-action\"", ">", "</button>"],
39
+ _tmpl$28 = ["<span class=\"k2b-app-workspace__sidebar-item-label\"><span class=\"k2b-app-workspace__sidebar-item-label-text\">", "</span></span>"],
40
+ _tmpl$29 = ["<span class=\"", "\"", ">", "</span>"],
41
+ _tmpl$30 = ["<span class=\"k2b-app-workspace__nav-tree-toggle\" data-k2b-nav-tree-toggle aria-hidden=\"true\"><i class=\"", "\"></i></span>"],
42
+ _tmpl$31 = ["<div class=\"k2b-app-workspace__nav-tree-group\" role=\"group\">", "</div>"],
43
+ _tmpl$32 = ["<div class=\"k2b-app-workspace__nav-tree-node\" role=\"treeitem\"", " style=\"", "\">", "", "</div>"],
44
+ _tmpl$33 = ["<div class=\"", "\" role=\"tree\"", ">", "</div>"],
45
+ _tmpl$34 = ["<div class=\"k2b-app-workspace__sidebar-icon-grid\"", ">", "</div>"],
46
+ _tmpl$35 = ["<i", " aria-hidden=\"true\"></i>"],
47
+ _tmpl$36 = ["<div class=\"", "\" data-k2b-app-workspace", " style=\"", "\">", "</div>"],
48
+ _tmpl$37 = ["<div class=\"", "\">", "</div>"];
45
49
  import { Link } from "@k2b/ssr/nav";
46
- import { children, createContext, createMemo, createSignal, createUniqueId, For, mergeProps, onCleanup, onMount, Show, useContext } from "solid-js";
50
+ import { children, createContext, createEffect, createMemo, createSignal, createUniqueId, For, mergeProps, onCleanup, onMount, Show, useContext } from "solid-js";
47
51
  import { useUiMessages } from "../intl/messages";
48
52
  import { APP_WORKSPACE_SIDEBAR_HIDE_EVENT, installAppWorkspaceController } from "./app-workspace-controller";
49
53
  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";
@@ -72,8 +76,17 @@ const sidebarChildSlot = value => Boolean(value && typeof value === "object" &&
72
76
  const sidebarItemSlot = value => Boolean(value && typeof value === "object" && "kind" in value && [SIDEBAR_ITEM_ICON, SIDEBAR_ITEM_LABEL, SIDEBAR_ITEM_META, SIDEBAR_ITEM_ACTION].includes(value.kind));
73
77
  const navTreeItemSlot = value => Boolean(value && typeof value === "object" && "kind" in value && value.kind === NAV_TREE_ITEM);
74
78
  function ResizeHandle(props) {
75
- return _$ssr(_tmpl$, _$ssrAttribute("aria-label", _$escape(props.label ?? (props.kind === "sidebar" ? "Resize navigation" : props.kind === "pane" ? "Resize workspace pane" : props.kind === "detail" ? "Resize detail panel" : "Resize bottom drawer"), 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));
79
+ const messages = useUiMessages();
80
+ return _$ssr(_tmpl$, _$ssrAttribute("aria-label", _$escape(props.label ?? (props.kind === "sidebar" ? messages().resizeNavigation : props.kind === "pane" ? messages().resizeWorkspacePane : props.kind === "detail" ? messages().resizeDetailPanel : messages().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));
76
81
  }
82
+
83
+ /**
84
+ * Unread state for the trailing `meta` slot. Every mark keeps a fixed width,
85
+ * so the row keeps its height and the label its start in every state.
86
+ */
87
+
88
+ /** One requested place for an item among its unchanged siblings. */
89
+
77
90
  const modeAttrs = mode => mode && mode !== "always" ? {
78
91
  "data-sidebar-mode": mode
79
92
  } : {};
@@ -85,6 +98,13 @@ const scrollAttrs = key => key ? {
85
98
  "data-scroll-preserve": key
86
99
  } : {};
87
100
  const iconClass = (icon, fallback = "ti-circle") => icon?.startsWith("ti ") ? icon : `ti ${icon || fallback}`;
101
+ /** A named icon is an image screen readers announce; any other icon is decoration. */
102
+ const iconAccessibility = label => label ? {
103
+ role: "img",
104
+ "aria-label": label
105
+ } : {
106
+ "aria-hidden": true
107
+ };
88
108
  function AppWorkspaceMainPane(props) {
89
109
  return {
90
110
  kind: MAIN_PANE,
@@ -487,6 +507,57 @@ const AppWorkspaceSidebarItemAction = props => mergeProps({
487
507
  kind: SIDEBAR_ITEM_ACTION
488
508
  }, props);
489
509
  const AppWorkspaceSidebarItemActions = props => _$ssr(_tmpl$13, _$ssrAttribute("data-visibility", props.visibility === "hover" ? "hover" : _$escape(undefined, true), false), _$escape(props.children));
510
+ const AppWorkspaceSidebarItemStatus = props => {
511
+ const messages = useUiMessages();
512
+ const count = () => typeof props.unread === "number" && props.unread >= 1 ? Math.floor(props.unread) : 0;
513
+ const dot = () => props.unread === true;
514
+ // The marks are decorative; the row's accessible name gets one phrase instead,
515
+ // which says no more than the "99+" a capped count shows.
516
+ const description = () => [count() > 99 ? messages().sidebarUnreadMany : count() ? messages().sidebarUnread({
517
+ count: count()
518
+ }) : dot() ? messages().sidebarNewActivity : "", props.mention ? messages().sidebarMentioned : "", props.muted ? messages().sidebarMuted : ""].filter(Boolean).join(", ");
519
+ // The unread slot stays reserved at the end, and the marks that change most
520
+ // often sit outermost, so new activity or a mention never moves another mark.
521
+ return _$createComponent(Show, {
522
+ get when() {
523
+ return description();
524
+ },
525
+ get children() {
526
+ return _$ssr(_tmpl$17, _$ssrAttribute("data-unread", count() ? "count" : dot() ? "dot" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
527
+ get when() {
528
+ return props.mention;
529
+ },
530
+ get children() {
531
+ return _$ssr(_tmpl$14);
532
+ }
533
+ })), _$escape(_$createComponent(Show, {
534
+ get when() {
535
+ return props.muted;
536
+ },
537
+ get children() {
538
+ return _$ssr(_tmpl$15);
539
+ }
540
+ })), _$escape(_$createComponent(Show, {
541
+ get when() {
542
+ return count();
543
+ },
544
+ get fallback() {
545
+ return _$createComponent(Show, {
546
+ get when() {
547
+ return dot();
548
+ },
549
+ get children() {
550
+ return _$ssr(_tmpl$18);
551
+ }
552
+ });
553
+ },
554
+ get children() {
555
+ return _$ssr(_tmpl$16, _$ssrAttribute("data-mention", props.mention ? "true" : _$escape(undefined, true), false), count() > 99 ? "99+" : _$escape(count()));
556
+ }
557
+ })), _$escape(description()));
558
+ }
559
+ });
560
+ };
490
561
  /** Shared visual and semantic row frame for flat sidebar items and tree items. */
491
562
  function AppWorkspaceSidebarRow(props) {
492
563
  const className = () => `k2b-app-workspace__sidebar-item ${props.hasActions ? "has-action" : ""} ${props.active ? props.activeClass ?? "is-active" : ""} ${props.class ?? ""}`;
@@ -608,7 +679,11 @@ function AppWorkspaceSidebarItem(props) {
608
679
  const label = () => labelSlot()?.children ?? (legacy().length === 1 ? legacy()[0] : legacy());
609
680
  const icon = () => iconSlot()?.icon ?? props.icon;
610
681
  const iconContent = () => iconSlot()?.children;
611
- const meta = () => metaSlot()?.children ?? props.meta;
682
+ // Resolved first, so a component that renders nothing, such as a status with
683
+ // nothing to show, leaves no empty slot in the browser either.
684
+ const meta = children(() => metaSlot()?.children ?? props.meta);
685
+ const hasMeta = () => meta.toArray().some(Boolean);
686
+ const metaId = createUniqueId();
612
687
  const metaVisibility = () => metaSlot()?.visibility ?? props.metaVisibility;
613
688
  const customActions = () => resolvedActions();
614
689
  const hasCustomActions = () => Boolean(customActions());
@@ -618,19 +693,19 @@ function AppWorkspaceSidebarItem(props) {
618
693
  return iconContent() || icon();
619
694
  },
620
695
  get children() {
621
- return _$ssr(_tmpl$14, _$escape(iconContent() ?? _$ssr(_tmpl$19, _$ssrAttribute("class", _$escape(iconClass(icon()), true), false))));
696
+ return _$ssr(_tmpl$19, _$escape(iconContent() ?? _$ssr(_tmpl$25, _$ssrAttribute("class", _$escape(iconClass(icon()), true), false))));
622
697
  }
623
- }), _$ssr(_tmpl$18, _$escape(_$createComponent(Show, {
698
+ }), _$ssr(_tmpl$23, _$escape(_$createComponent(Show, {
624
699
  get when() {
625
700
  return props.context || props.contextMeta;
626
701
  },
627
702
  get children() {
628
- return _$ssr(_tmpl$16, _$escape(props.context), _$escape(_$createComponent(Show, {
703
+ return _$ssr(_tmpl$21, _$escape(props.context), _$escape(_$createComponent(Show, {
629
704
  get when() {
630
705
  return props.contextMeta;
631
706
  },
632
707
  get children() {
633
- return _$ssr(_tmpl$15, _$escape(props.contextMeta));
708
+ return _$ssr(_tmpl$20, _$escape(props.contextMeta));
634
709
  }
635
710
  })));
636
711
  }
@@ -639,13 +714,15 @@ function AppWorkspaceSidebarItem(props) {
639
714
  return props.description;
640
715
  },
641
716
  get children() {
642
- return _$ssr(_tmpl$17, _$escape(props.description));
717
+ return _$ssr(_tmpl$22, _$escape(props.description));
643
718
  }
644
719
  }))), _$createComponent(Show, {
645
720
  get when() {
646
- return meta();
721
+ return hasMeta();
647
722
  },
648
- children: value => _$ssr(_tmpl$20, _$ssrAttribute("data-visibility", metaVisibility() === "hover" ? "hover" : _$escape(undefined, true), false), _$escape(value()))
723
+ get children() {
724
+ return _$ssr(_tmpl$24, _$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()));
725
+ }
649
726
  })];
650
727
  const singleAction = () => {
651
728
  const label = () => actionSlot()?.label ?? props.actionLabel ?? messages().rowAction;
@@ -659,7 +736,7 @@ function AppWorkspaceSidebarItem(props) {
659
736
  actionSlot()?.onSelect?.(event);
660
737
  props.onActionClick?.(event);
661
738
  };
662
- const content = () => actionSlot()?.children ?? _$ssr(_tmpl$19, _$ssrAttribute("class", _$escape(iconClass(actionSlot()?.icon ?? props.actionIcon, "ti-dots"), true), false));
739
+ const content = () => actionSlot()?.children ?? _$ssr(_tmpl$25, _$ssrAttribute("class", _$escape(iconClass(actionSlot()?.icon ?? props.actionIcon, "ti-dots"), true), false));
663
740
  return _$createComponent(Show, {
664
741
  get when() {
665
742
  return Boolean(actionSlot() || props.actionIcon);
@@ -670,10 +747,10 @@ function AppWorkspaceSidebarItem(props) {
670
747
  return _$memo(() => !!actionSlot()?.href)() && !actionSlot()?.disabled;
671
748
  },
672
749
  get fallback() {
673
- return _$ssr(_tmpl$22, _$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()));
750
+ return _$ssr(_tmpl$27, _$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()));
674
751
  },
675
752
  get children() {
676
- return _$ssr(_tmpl$21, _$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()));
753
+ return _$ssr(_tmpl$26, _$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()));
677
754
  }
678
755
  });
679
756
  }
@@ -696,6 +773,9 @@ function AppWorkspaceSidebarItem(props) {
696
773
  get viewportSize() {
697
774
  return preview().viewportSize;
698
775
  },
776
+ get describedBy() {
777
+ return hasMeta() ? metaId : undefined;
778
+ },
699
779
  get onOpenChange() {
700
780
  return preview().onOpenChange;
701
781
  },
@@ -770,6 +850,27 @@ const AppWorkspaceNavTreeItem = props => ({
770
850
  kind: NAV_TREE_ITEM,
771
851
  ...props
772
852
  });
853
+ const NAV_TREE_DRAG_TYPE = "application/x-k2b-nav-tree-item";
854
+ const callDragHandler = (handler, event) => {
855
+ if (typeof handler === "function") handler(event);else handler?.[0](handler[1], event);
856
+ };
857
+
858
+ /**
859
+ * The move that puts the sibling at `from` into the gap before `slot`
860
+ * (`siblings.length` is the gap after the last one), or `null` when its place
861
+ * would not change or it would pass an item that is not movable.
862
+ */
863
+ const navTreeMove = (siblings, from, slot, parentId) => {
864
+ if (from < 0 || slot < 0 || slot > siblings.length || slot === from || slot === from + 1) return null;
865
+ const passed = slot < from ? siblings.slice(slot, from) : siblings.slice(from + 1, slot);
866
+ if (passed.some(sibling => !sibling.movable)) return null;
867
+ return {
868
+ id: siblings[from].id,
869
+ parentId,
870
+ beforeId: siblings[slot]?.id ?? null,
871
+ afterId: siblings[slot - 1]?.id ?? null
872
+ };
873
+ };
773
874
  const AppWorkspaceNavTree = props => {
774
875
  let root;
775
876
  const resolved = children(() => props.children);
@@ -814,16 +915,48 @@ const AppWorkspaceNavTree = props => {
814
915
  });
815
916
  };
816
917
 
918
+ // Reordering: the dragged item and the gap the pointer marks. The application renders the new
919
+ // order; the item moved by keyboard takes focus back when its row mounts or changes place.
920
+ const [dragged, setDragged] = createSignal(null);
921
+ const [dropTarget, setDropTarget] = createSignal(null);
922
+ let claimedDragOver = null;
923
+ let refocusId = null;
924
+ const endDrag = () => {
925
+ setDragged(null);
926
+ setDropTarget(null);
927
+ };
928
+ const requestMove = (move, keepFocus) => {
929
+ if (!move || !props.onMove) return;
930
+ refocusId = keepFocus ? move.id : null;
931
+ props.onMove(move);
932
+ };
933
+
817
934
  // Items arrive through an accessor so a changed nested list reconciles rows by identity instead of rebuilding the list.
818
- const renderItems = (value, depth, parentId) => _$createComponent(For, {
935
+ const renderItems = (siblings, depth, parentId) => _$createComponent(For, {
819
936
  get each() {
820
- return navTreeItems(value());
937
+ return siblings();
821
938
  },
822
- children: item => {
939
+ children: (item, place) => {
823
940
  const nested = createMemo(() => navTreeItems(item.children));
824
941
  const hasChildren = () => nested().length > 0;
825
942
  const selected = () => props.selectedId === item.id;
943
+ const siblingIndex = id => siblings().findIndex(sibling => sibling.id === id);
944
+ const movable = () => Boolean(props.onMove && item.movable && !item.disabled);
826
945
  let treeItem;
946
+ const ownRow = () => treeItem?.firstElementChild;
947
+
948
+ // A new row for the moved item, or the same row at its new place: moving a focused row drops its focus.
949
+ createEffect(() => {
950
+ place();
951
+ if (refocusId !== item.id) return;
952
+ queueMicrotask(() => {
953
+ if (refocusId !== item.id || !treeItem?.isConnected) return;
954
+ const active = treeItem.ownerDocument.activeElement;
955
+ if (!active || active === treeItem.ownerDocument.body) treeItem.focus({
956
+ preventScroll: true
957
+ });
958
+ });
959
+ });
827
960
  const activate = event => {
828
961
  if (item.disabled) return;
829
962
  treeItem?.focus({
@@ -856,6 +989,13 @@ const AppWorkspaceNavTree = props => {
856
989
  };
857
990
  const onKeyDown = event => {
858
991
  if (event.target !== event.currentTarget) return;
992
+ if (event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey && (event.key === "ArrowUp" || event.key === "ArrowDown")) {
993
+ if (!movable()) return;
994
+ event.preventDefault();
995
+ const from = siblingIndex(item.id);
996
+ requestMove(navTreeMove(siblings(), from, event.key === "ArrowUp" ? from - 1 : from + 2, parentId ?? null), true);
997
+ return;
998
+ }
859
999
  if (event.altKey || event.ctrlKey || event.metaKey) return;
860
1000
  const items = treeItemElements();
861
1001
  const index = items.indexOf(event.currentTarget);
@@ -909,21 +1049,26 @@ const AppWorkspaceNavTree = props => {
909
1049
  return rowIcon();
910
1050
  },
911
1051
  get children() {
912
- return _$ssr(_tmpl$23, _$ssrAttribute("data-k2b-nav-tree-toggle", usesIconDisclosure() ? "" : _$escape(undefined, true), false), _$ssrAttribute("class", _$escape(iconClass(rowIcon()), true), false));
1052
+ return _$ssrElement("span", _$mergeProps({
1053
+ "class": "k2b-app-workspace__sidebar-item-icon",
1054
+ get ["data-k2b-nav-tree-toggle"]() {
1055
+ return usesIconDisclosure() ? "" : undefined;
1056
+ }
1057
+ }, () => iconAccessibility(item.iconLabel)), _$ssr(_tmpl$25, _$ssrAttribute("class", _$escape(iconClass(rowIcon()), true), false)), false);
913
1058
  }
914
- }), _$ssr(_tmpl$24, _$escape(item.label)), _$createComponent(Show, {
1059
+ }), _$ssr(_tmpl$28, _$escape(item.label)), _$createComponent(Show, {
915
1060
  get when() {
916
1061
  return item.meta !== undefined;
917
1062
  },
918
1063
  get children() {
919
- return _$ssr(_tmpl$25, `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));
1064
+ return _$ssr(_tmpl$29, `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));
920
1065
  }
921
1066
  }), _$createComponent(Show, {
922
1067
  get when() {
923
1068
  return _$memo(() => !!hasChildren())() && !usesIconDisclosure();
924
1069
  },
925
1070
  get children() {
926
- return _$ssr(_tmpl$26, `ti ${isExpanded(item.id) ? "ti-chevron-down" : "ti-chevron-right"}`);
1071
+ return _$ssr(_tmpl$30, `ti ${isExpanded(item.id) ? "ti-chevron-down" : "ti-chevron-right"}`);
927
1072
  }
928
1073
  })];
929
1074
  const row = () => _$createComponent(AppWorkspaceSidebarRow, {
@@ -978,17 +1123,88 @@ const AppWorkspaceNavTree = props => {
978
1123
  },
979
1124
  children: rowContent
980
1125
  });
981
- return _$ssr(_tmpl$28, _$ssrAttribute("aria-level", _$escape(depth, 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("data-k2b-nav-tree-id", _$escape(item.id, true), false) + _$ssrAttribute("data-k2b-nav-tree-parent-id", _$escape(parentId, true), false), _$escape(row()), _$escape(_$createComponent(Show, {
1126
+
1127
+ // A gap is offered only next to a sibling's own row, never over its sub-items.
1128
+ const dropMove = event => {
1129
+ const drag = dragged();
1130
+ const row = ownRow();
1131
+ if (!drag || !event.dataTransfer?.types.includes(NAV_TREE_DRAG_TYPE)) return null;
1132
+ if (drag.parentId !== (parentId ?? null) || drag.id === item.id || !row?.contains(event.target)) return null;
1133
+ const rect = row.getBoundingClientRect();
1134
+ const side = event.clientY < rect.top + rect.height / 2 ? "before" : "after";
1135
+ const slot = siblingIndex(item.id) + (side === "after" ? 1 : 0);
1136
+ const move = navTreeMove(siblings(), siblingIndex(drag.id), slot, parentId ?? null);
1137
+ return move ? {
1138
+ side,
1139
+ move
1140
+ } : null;
1141
+ };
1142
+ const onDragStart = event => {
1143
+ const row = ownRow();
1144
+ if (!movable() || !row?.contains(event.target)) return;
1145
+ event.stopPropagation();
1146
+ setDragged({
1147
+ id: item.id,
1148
+ parentId: parentId ?? null
1149
+ });
1150
+ if (!event.dataTransfer) return;
1151
+ event.dataTransfer.effectAllowed = "move";
1152
+ event.dataTransfer.setData(NAV_TREE_DRAG_TYPE, item.id);
1153
+ const rect = row.getBoundingClientRect();
1154
+ event.dataTransfer.setDragImage(row, event.clientX - rect.left, event.clientY - rect.top);
1155
+ };
1156
+ const onDragOver = event => {
1157
+ callDragHandler(item.onDragOver, event);
1158
+ const target = dropMove(event);
1159
+ if (!target) return;
1160
+ event.preventDefault();
1161
+ if (event.dataTransfer) event.dataTransfer.dropEffect = "move";
1162
+ claimedDragOver = event;
1163
+ setDropTarget({
1164
+ id: item.id,
1165
+ side: target.side
1166
+ });
1167
+ };
1168
+ const onDrop = event => {
1169
+ callDragHandler(item.onDrop, event);
1170
+ const target = dropMove(event);
1171
+ if (!target) return;
1172
+ event.preventDefault();
1173
+ event.stopPropagation();
1174
+ endDrag();
1175
+ requestMove(target.move, false);
1176
+ };
1177
+ return _$ssr(_tmpl$32, _$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, {
982
1178
  get when() {
983
1179
  return _$memo(() => !!hasChildren())() && isExpanded(item.id);
984
1180
  },
985
1181
  get children() {
986
- return _$ssr(_tmpl$27, _$escape(renderItems(nested, depth + 1, item.id)));
1182
+ return _$ssr(_tmpl$31, _$escape(renderItems(nested, depth + 1, item.id)));
987
1183
  }
988
1184
  })));
989
1185
  }
990
1186
  });
991
- return _$ssr(_tmpl$29, `k2b-app-workspace__nav-tree ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.ariaLabel, true), false), _$escape(renderItems(roots, 0)));
1187
+
1188
+ // Any other click or focus is the person's choice; only the moved item itself keeps its claim.
1189
+ const forgetRefocus = event => {
1190
+ if (event.type === "pointerdown" || event.target?.dataset?.k2bNavTreeId !== refocusId) refocusId = null;
1191
+ };
1192
+ // A row replaced during a drag never receives its dragend; the next pointer movement means the drag is over.
1193
+ const forgetDrag = () => {
1194
+ if (dragged()) endDrag();
1195
+ };
1196
+ onMount(() => {
1197
+ const doc = root?.ownerDocument;
1198
+ doc?.addEventListener("pointerdown", forgetRefocus, true);
1199
+ doc?.addEventListener("focusin", forgetRefocus, true);
1200
+ doc?.addEventListener("pointermove", forgetDrag, true);
1201
+ onCleanup(() => {
1202
+ doc?.removeEventListener("pointerdown", forgetRefocus, true);
1203
+ doc?.removeEventListener("focusin", forgetRefocus, true);
1204
+ doc?.removeEventListener("pointermove", forgetDrag, true);
1205
+ });
1206
+ });
1207
+ return _$ssr(_tmpl$33, `k2b-app-workspace__nav-tree ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.ariaLabel, true), false), _$escape(renderItems(roots, 0)));
992
1208
  };
993
1209
  AppWorkspaceNavTree.Item = AppWorkspaceNavTreeItem;
994
1210
  const AppWorkspaceSidebarIconGrid = props => _$ssrElement("section", _$mergeProps({
@@ -1000,9 +1216,9 @@ const AppWorkspaceSidebarIconGrid = props => _$ssrElement("section", _$mergeProp
1000
1216
  return props.title;
1001
1217
  },
1002
1218
  children: title => _$ssr(_tmpl$12, _$escape(title()))
1003
- })), _$ssr(_tmpl$30, _$ssrAttribute("data-columns", _$escape(props.columns ?? 2, true), false), _$escape(props.children))], false);
1219
+ })), _$ssr(_tmpl$34, _$ssrAttribute("data-columns", _$escape(props.columns ?? 2, true), false), _$escape(props.children))], false);
1004
1220
  const AppWorkspaceSidebarIconAction = props => {
1005
- const content = _$ssr(_tmpl$31, _$ssrAttribute("class", _$escape(iconClass(props.icon), true), false));
1221
+ const content = _$ssr(_tmpl$35, _$ssrAttribute("class", _$escape(iconClass(props.icon), true), false));
1006
1222
  const attrs = () => ({
1007
1223
  class: `k2b-app-workspace__sidebar-icon-action ${props.active ? "is-active" : ""}`,
1008
1224
  title: props.label,
@@ -1068,7 +1284,7 @@ const AppWorkspace = props => {
1068
1284
  return props.resizable !== false;
1069
1285
  },
1070
1286
  get children() {
1071
- return _$ssr(_tmpl$32, `k2b-app-workspace ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-mobile-surface", _$escape(props.mobileSurface, 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(props.children));
1287
+ return _$ssr(_tmpl$36, `k2b-app-workspace ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-mobile-surface", _$escape(props.mobileSurface, 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(props.children));
1072
1288
  }
1073
1289
  });
1074
1290
  };
@@ -1080,7 +1296,7 @@ AppWorkspace.LayoutStateProvider = props => _$createComponent(LayoutStateContext
1080
1296
  return props.children;
1081
1297
  }
1082
1298
  });
1083
- AppWorkspace.Content = props => _$ssr(_tmpl$33, `k2b-app-workspace__content ${_$escape(props.class ?? "", true)}`, _$escape(props.children));
1299
+ AppWorkspace.Content = props => _$ssr(_tmpl$37, `k2b-app-workspace__content ${_$escape(props.class ?? "", true)}`, _$escape(props.children));
1084
1300
  AppWorkspace.Main = AppWorkspaceMain;
1085
1301
  AppWorkspace.MainPane = AppWorkspaceMainPane;
1086
1302
  AppWorkspace.Detail = AppWorkspaceDetail;
@@ -1096,6 +1312,7 @@ AppWorkspace.SidebarItemLabel = AppWorkspaceSidebarItemLabel;
1096
1312
  AppWorkspace.SidebarItemMeta = AppWorkspaceSidebarItemMeta;
1097
1313
  AppWorkspace.SidebarItemAction = AppWorkspaceSidebarItemAction;
1098
1314
  AppWorkspace.SidebarItemActions = AppWorkspaceSidebarItemActions;
1315
+ AppWorkspace.SidebarItemStatus = AppWorkspaceSidebarItemStatus;
1099
1316
  AppWorkspace.NavTree = AppWorkspaceNavTree;
1100
1317
  AppWorkspace.SidebarIconGrid = AppWorkspaceSidebarIconGrid;
1101
1318
  AppWorkspace.SidebarIconAction = AppWorkspaceSidebarIconAction;