@k2b/ui 0.28.0 → 0.29.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 (176) hide show
  1. package/dist/browser/actions/ContextMenu.js +5 -0
  2. package/dist/browser/actions/ContextMenu.js.map +1 -1
  3. package/dist/browser/actions/DragAndDrop.js +89 -0
  4. package/dist/browser/actions/DragAndDrop.js.map +1 -0
  5. package/dist/browser/actions/GestureMenu.js +26 -3
  6. package/dist/browser/actions/GestureMenu.js.map +1 -1
  7. package/dist/browser/actions/drag-and-drop-messages.js +75 -0
  8. package/dist/browser/actions/drag-and-drop-messages.js.map +1 -0
  9. package/dist/browser/actions/drag-and-drop.js +692 -0
  10. package/dist/browser/actions/drag-and-drop.js.map +1 -0
  11. package/dist/browser/actions/index.js +1 -0
  12. package/dist/browser/actions/index.js.map +1 -1
  13. package/dist/browser/chat/ChatComposer.js +385 -265
  14. package/dist/browser/chat/ChatComposer.js.map +1 -1
  15. package/dist/browser/chat/ChatDecision.js +778 -0
  16. package/dist/browser/chat/ChatDecision.js.map +1 -0
  17. package/dist/browser/chat/ChatPrimitives.js +34 -28
  18. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  19. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  20. package/dist/browser/chat/chat-messages.js +6 -0
  21. package/dist/browser/chat/chat-messages.js.map +1 -1
  22. package/dist/browser/chat/command-search.js +10 -3
  23. package/dist/browser/chat/command-search.js.map +1 -1
  24. package/dist/browser/chat/index.js +6 -1
  25. package/dist/browser/chat/index.js.map +1 -1
  26. package/dist/browser/chat/types.js.map +1 -1
  27. package/dist/browser/content/Calendar.js +3 -3
  28. package/dist/browser/content/Calendar.js.map +1 -1
  29. package/dist/browser/content/Chart.js +54 -71
  30. package/dist/browser/content/Chart.js.map +1 -1
  31. package/dist/browser/content/FileBrowser.js +2 -2
  32. package/dist/browser/content/FileBrowser.js.map +1 -1
  33. package/dist/browser/content/FileTree.js +42 -36
  34. package/dist/browser/content/FileTree.js.map +1 -1
  35. package/dist/browser/content/FileTypeIcon.js +72 -0
  36. package/dist/browser/content/FileTypeIcon.js.map +1 -0
  37. package/dist/browser/content/FileView.js +2 -2
  38. package/dist/browser/content/FileView.js.map +1 -1
  39. package/dist/browser/content/ReferenceChip.js +162 -0
  40. package/dist/browser/content/ReferenceChip.js.map +1 -0
  41. package/dist/browser/content/calendar-pointer.js +9 -0
  42. package/dist/browser/content/calendar-pointer.js.map +1 -1
  43. package/dist/browser/content/calendar-time-view.js +6 -3
  44. package/dist/browser/content/calendar-time-view.js.map +1 -1
  45. package/dist/browser/content/index.js +2 -0
  46. package/dist/browser/content/index.js.map +1 -1
  47. package/dist/browser/layout/AppOverview.js +1 -1
  48. package/dist/browser/layout/AppOverview.js.map +1 -1
  49. package/dist/browser/layout/AppWorkspace.js +644 -445
  50. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  51. package/dist/browser/layout/PanelDialog.js +88 -86
  52. package/dist/browser/layout/PanelDialog.js.map +1 -1
  53. package/dist/browser/layout/ResizeSeparator.js +81 -0
  54. package/dist/browser/layout/ResizeSeparator.js.map +1 -0
  55. package/dist/browser/layout/SidebarSwitcher.js +9 -2
  56. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  57. package/dist/browser/layout/TabBar.js +15 -12
  58. package/dist/browser/layout/TabBar.js.map +1 -1
  59. package/dist/browser/layout/app-workspace-controller.js +130 -17
  60. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  61. package/dist/browser/layout/index.js +3 -1
  62. package/dist/browser/layout/index.js.map +1 -1
  63. package/dist/browser/layout/resize-separator.js +90 -0
  64. package/dist/browser/layout/resize-separator.js.map +1 -0
  65. package/dist/browser/layout/workspace-messages.js +12 -2
  66. package/dist/browser/layout/workspace-messages.js.map +1 -1
  67. package/dist/browser/surfaces/LinkCard.js +1 -1
  68. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  69. package/dist/browser/surfaces/Placeholder.js +14 -3
  70. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  71. package/dist/browser/surfaces/StatCell.js +23 -0
  72. package/dist/browser/surfaces/StatCell.js.map +1 -1
  73. package/dist/browser/widgets/Widget.js +1 -1
  74. package/dist/browser/widgets/Widget.js.map +1 -1
  75. package/dist/ssr/actions/ContextMenu.js +5 -0
  76. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  77. package/dist/ssr/actions/DragAndDrop.js +63 -0
  78. package/dist/ssr/actions/DragAndDrop.js.map +1 -0
  79. package/dist/ssr/actions/GestureMenu.js +26 -3
  80. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  81. package/dist/ssr/actions/drag-and-drop-messages.js +75 -0
  82. package/dist/ssr/actions/drag-and-drop-messages.js.map +1 -0
  83. package/dist/ssr/actions/drag-and-drop.js +692 -0
  84. package/dist/ssr/actions/drag-and-drop.js.map +1 -0
  85. package/dist/ssr/actions/index.js +1 -0
  86. package/dist/ssr/actions/index.js.map +1 -1
  87. package/dist/ssr/chat/ChatComposer.js +131 -14
  88. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  89. package/dist/ssr/chat/ChatDecision.js +465 -0
  90. package/dist/ssr/chat/ChatDecision.js.map +1 -0
  91. package/dist/ssr/chat/ChatPrimitives.js +2 -2
  92. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  93. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  94. package/dist/ssr/chat/chat-messages.js +6 -0
  95. package/dist/ssr/chat/chat-messages.js.map +1 -1
  96. package/dist/ssr/chat/command-search.js +10 -3
  97. package/dist/ssr/chat/command-search.js.map +1 -1
  98. package/dist/ssr/chat/index.js +6 -1
  99. package/dist/ssr/chat/index.js.map +1 -1
  100. package/dist/ssr/chat/types.js.map +1 -1
  101. package/dist/ssr/content/Calendar.js +3 -3
  102. package/dist/ssr/content/Calendar.js.map +1 -1
  103. package/dist/ssr/content/Chart.js +19 -23
  104. package/dist/ssr/content/Chart.js.map +1 -1
  105. package/dist/ssr/content/FileBrowser.js +2 -2
  106. package/dist/ssr/content/FileBrowser.js.map +1 -1
  107. package/dist/ssr/content/FileTree.js +21 -14
  108. package/dist/ssr/content/FileTree.js.map +1 -1
  109. package/dist/ssr/content/FileTypeIcon.js +50 -0
  110. package/dist/ssr/content/FileTypeIcon.js.map +1 -0
  111. package/dist/ssr/content/FileView.js +2 -2
  112. package/dist/ssr/content/FileView.js.map +1 -1
  113. package/dist/ssr/content/ReferenceChip.js +121 -0
  114. package/dist/ssr/content/ReferenceChip.js.map +1 -0
  115. package/dist/ssr/content/calendar-pointer.js +9 -0
  116. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  117. package/dist/ssr/content/calendar-time-view.js +6 -3
  118. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  119. package/dist/ssr/content/index.js +2 -0
  120. package/dist/ssr/content/index.js.map +1 -1
  121. package/dist/ssr/layout/AppOverview.js +1 -1
  122. package/dist/ssr/layout/AppOverview.js.map +1 -1
  123. package/dist/ssr/layout/AppWorkspace.js +272 -95
  124. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  125. package/dist/ssr/layout/PanelDialog.js +7 -6
  126. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  127. package/dist/ssr/layout/ResizeSeparator.js +45 -0
  128. package/dist/ssr/layout/ResizeSeparator.js.map +1 -0
  129. package/dist/ssr/layout/SidebarSwitcher.js +9 -2
  130. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  131. package/dist/ssr/layout/TabBar.js +1 -1
  132. package/dist/ssr/layout/TabBar.js.map +1 -1
  133. package/dist/ssr/layout/app-workspace-controller.js +130 -17
  134. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  135. package/dist/ssr/layout/index.js +3 -1
  136. package/dist/ssr/layout/index.js.map +1 -1
  137. package/dist/ssr/layout/resize-separator.js +90 -0
  138. package/dist/ssr/layout/resize-separator.js.map +1 -0
  139. package/dist/ssr/layout/workspace-messages.js +12 -2
  140. package/dist/ssr/layout/workspace-messages.js.map +1 -1
  141. package/dist/ssr/surfaces/LinkCard.js +1 -1
  142. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  143. package/dist/ssr/surfaces/Placeholder.js +4 -2
  144. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  145. package/dist/ssr/surfaces/StatCell.js +23 -0
  146. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  147. package/dist/ssr/widgets/Widget.js +1 -1
  148. package/dist/ssr/widgets/Widget.js.map +1 -1
  149. package/dist/styles.css +1 -1
  150. package/dist/types/actions/ContextMenu.d.ts +1 -0
  151. package/dist/types/actions/DragAndDrop.d.ts +29 -0
  152. package/dist/types/actions/drag-and-drop-messages.d.ts +35 -0
  153. package/dist/types/actions/drag-and-drop.d.ts +36 -0
  154. package/dist/types/actions/index.d.ts +2 -0
  155. package/dist/types/chat/ChatComposer.d.ts +19 -1
  156. package/dist/types/chat/ChatDecision.d.ts +133 -0
  157. package/dist/types/chat/ChatPrimitives.d.ts +4 -1
  158. package/dist/types/chat/ChatTimeline.d.ts +2 -1
  159. package/dist/types/chat/chat-messages.d.ts +3 -0
  160. package/dist/types/chat/command-search.d.ts +3 -0
  161. package/dist/types/chat/index.d.ts +23 -1
  162. package/dist/types/chat/types.d.ts +54 -1
  163. package/dist/types/content/Chart.d.ts +9 -3
  164. package/dist/types/content/FileTypeIcon.d.ts +27 -0
  165. package/dist/types/content/ReferenceChip.d.ts +49 -0
  166. package/dist/types/content/calendar-pointer.d.ts +6 -0
  167. package/dist/types/content/index.d.ts +3 -0
  168. package/dist/types/layout/AppWorkspace.d.ts +5 -3
  169. package/dist/types/layout/ResizeSeparator.d.ts +9 -0
  170. package/dist/types/layout/TabBar.d.ts +7 -0
  171. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  172. package/dist/types/layout/index.d.ts +3 -1
  173. package/dist/types/layout/resize-separator.d.ts +18 -0
  174. package/dist/types/layout/workspace-messages.d.ts +5 -0
  175. package/dist/types/surfaces/StatCell.d.ts +6 -0
  176. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["actions/drag-and-drop.ts"],"sourcesContent":["import { createSignal } from \"solid-js\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport type { DragAndDropMessages } from \"./drag-and-drop-messages\";\n\nexport type DragPayload<Type extends string = string> = {\n /** What is dragged, such as \"mail.message\"; targets accept by this. */\n type: Type;\n /** Opaque to @k2b/ui: the application's reference, such as an ID or a ref string. */\n value: string;\n /** Names the item in the preview and in announcements. */\n label: string;\n /** Tabler class for the preview, such as \"ti ti-mail\". */\n icon?: string;\n /** More than one item is dragged: shown as a count on the preview. */\n count?: number;\n};\n\nconst SLOP = 10;\nconst IGNORE = \"input, textarea, select, [contenteditable]:not([contenteditable='false']), [data-drag-ignore]\";\nconst HOLD_MS = 500;\nconst AUTOSCROLL_EDGE = 32;\nconst [readActiveDrag, setActiveDrag] = createSignal<DragPayload>();\n/** Reactive payload of the drag in progress, or undefined. */\nexport const activeDrag = (): DragPayload | undefined => readActiveDrag();\nconst dragStartListeners = new Set<(pointerId: number) => void>();\n/** Internal hand-over to the gesture menu that owns this press. */\nexport const onPointerDragStart = (listener: (pointerId: number) => void): (() => void) => {\n dragStartListeners.add(listener);\n return () => dragStartListeners.delete(listener);\n};\n\ntype Target = {\n element: HTMLElement;\n accept: readonly string[];\n label: string;\n messages: DragAndDropMessages;\n disabled?: boolean;\n drop: (payload: DragPayload) => void;\n};\ntype Session = {\n payload: DragPayload;\n origin: HTMLElement;\n cancel: () => void;\n targetsChanged?: () => void;\n};\ntype Engine = {\n targets: Set<Target>;\n byElement: WeakMap<Element, Target>;\n session?: Session;\n abandonPress?: () => void;\n};\nconst engines = new WeakMap<Document, Engine>();\nconst engineFor = (doc: Document): Engine => {\n let engine = engines.get(doc);\n if (!engine) {\n engine = { targets: new Set(), byElement: new WeakMap() };\n engines.set(doc, engine);\n }\n return engine;\n};\nconst accepts = (target: Target, payload: DragPayload) =>\n target.element.isConnected && !target.disabled && target.accept.includes(payload.type);\nconst isModal = (dialog: Element) => {\n try {\n return dialog.matches(\":modal\");\n } catch {\n return dialog.matches(\"dialog[open]\");\n }\n};\n/** The modal dialog around an element; while one is open, everything outside of it is inert. */\nconst modalOf = (element: Element): Element | undefined => {\n for (let dialog = element.closest(\"dialog\"); dialog; dialog = dialog.parentElement?.closest(\"dialog\") ?? null)\n if (isModal(dialog)) return dialog;\n return undefined;\n};\nconst visible = (element: Element) =>\n typeof element.checkVisibility === \"function\"\n ? element.checkVisibility({ checkVisibilityCSS: true })\n : element.getClientRects().length > 0 && getComputedStyle(element).visibility !== \"hidden\";\n/**\n * A keyboard destination must be one a pointer could reach from where the pickup started: shown and visible, not\n * inert, and in the same modal dialog as the origin.\n */\nconst reachable = (target: Target, origin: HTMLElement) => {\n const element = target.element;\n if (element.closest(\"[inert]\") || modalOf(element) !== modalOf(origin)) return false;\n return visible(element);\n};\nconst mark = (target: Target, payload?: DragPayload) => {\n if (payload && accepts(target, payload)) target.element.dataset.drop = \"ok\";\n else delete target.element.dataset.drop;\n};\nconst containerFor = (origin: HTMLElement): HTMLElement => {\n try {\n return origin.closest<HTMLDialogElement>(\"dialog[open]:modal\") ?? origin.ownerDocument.body;\n } catch {\n return origin.closest<HTMLDialogElement>(\"dialog[open]\") ?? origin.ownerDocument.body;\n }\n};\n/** A live region needs a moment between being inserted and being written to, or its first text goes unread. */\nconst ANNOUNCE_DELAY_MS = 100;\ntype Announcer = { region: HTMLElement; ready: number; queue: string[] };\n/** One live region per container: the body, or the modal dialog the drag happens in, as outside of it is inert. */\nconst announcers = new WeakMap<Element, Announcer>();\nconst announcerFor = (origin: HTMLElement): Announcer => {\n const parent = containerFor(origin);\n let announcer = announcers.get(parent);\n if (!announcer || announcer.region.parentElement !== parent) {\n const region = origin.ownerDocument.createElement(\"div\");\n region.className = \"k2b-drag-announcer\";\n region.setAttribute(\"role\", \"status\");\n region.setAttribute(\"aria-live\", \"polite\");\n region.setAttribute(\"aria-atomic\", \"true\");\n Object.assign(region.style, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n clip: \"rect(0, 0, 0, 0)\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n });\n // First in a dialog: a dialog stack keeps its top level as the dialog's last child, and finds it there.\n if (parent === origin.ownerDocument.body) parent.append(region);\n else parent.prepend(region);\n announcer = { region, ready: performance.now() + ANNOUNCE_DELAY_MS, queue: [] };\n announcers.set(parent, announcer);\n }\n return announcer;\n};\nconst announce = (origin: HTMLElement, text: string) => {\n const announcer = announcerFor(origin);\n const write = (next: string) => {\n announcer.region.textContent = announcer.region.textContent === next ? `${next}\\u00a0` : next;\n };\n const wait = announcer.ready - performance.now();\n if (wait <= 0 && !announcer.queue.length) {\n write(text);\n return;\n }\n // Texts that come before the region is ready are read together once it is, so none replaces another unread.\n if (announcer.queue.push(text) > 1) return;\n origin.ownerDocument.defaultView!.setTimeout(() => write(announcer.queue.splice(0).join(\" \")), Math.max(0, wait));\n};\n\nexport const registerDropTarget = (element: HTMLElement, initial: Omit<Target, \"element\">) => {\n const engine = engineFor(element.ownerDocument);\n const entry: Target = { element, ...initial };\n // The live region exists long before the first drag, so its first announcement is read.\n announcerFor(element);\n engine.targets.add(entry);\n engine.byElement.set(element, entry);\n mark(entry, engine.session?.payload);\n engine.session?.targetsChanged?.();\n return {\n update(next: Omit<Target, \"element\">) {\n Object.assign(entry, next);\n mark(entry, engine.session?.payload);\n engine.session?.targetsChanged?.();\n },\n dispose() {\n engine.targets.delete(entry);\n engine.byElement.delete(element);\n delete element.dataset.drop;\n engine.session?.targetsChanged?.();\n },\n };\n};\n\nconst clearSession = (engine: Engine, session: Session, source?: HTMLElement) => {\n if (engine.session !== session) return;\n engine.session = undefined;\n if (source) delete source.dataset.dragging;\n for (const target of engine.targets) mark(target);\n setActiveDrag(undefined);\n};\n\n/**\n * Suppresses the click and touchend that follow the release of a drag or a hold. A drag cancelled while the button is\n * still down waits for that pointer's release; a new press or a cancelled pointer drops the wait.\n */\nconst swallowRelease = (doc: Document, pointerId?: number) => {\n const win = doc.defaultView!;\n if (pointerId !== undefined) {\n const stop = () => {\n win.removeEventListener(\"pointerup\", released, true);\n win.removeEventListener(\"pointercancel\", gone, true);\n win.removeEventListener(\"pointerdown\", gone, true);\n };\n const released = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) return;\n stop();\n swallowRelease(doc);\n };\n const gone = (event: PointerEvent) => {\n if (event.type === \"pointerdown\" || event.pointerId === pointerId) stop();\n };\n win.addEventListener(\"pointerup\", released, true);\n win.addEventListener(\"pointercancel\", gone, true);\n win.addEventListener(\"pointerdown\", gone, true);\n return;\n }\n const click = (event: Event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n win.removeEventListener(\"click\", click, true);\n };\n const touchEnd = (event: Event) => event.preventDefault();\n win.addEventListener(\"click\", click, true);\n win.addEventListener(\"touchend\", touchEnd, { capture: true, passive: false });\n win.setTimeout(() => {\n win.removeEventListener(\"click\", click, true);\n win.removeEventListener(\"touchend\", touchEnd, true);\n }, 0);\n};\n\n/** Walks ancestors only; neither hit testing nor scrolling scans the target registry. */\nconst SCROLLS = /^(auto|scroll|overlay)$/;\nconst LOCKED = /^(hidden|clip)$/;\n/**\n * Scrolls the first container under the pointer that can still scroll toward the edge the pointer rests near. The\n * walk stops at a dialog, so the page behind a modal never scrolls, and the viewport scrolls only while the page is\n * not locked, as `dialogCore` locks it with `overflow: hidden`.\n */\nconst scrollAt = (doc: Document, hit: Element | null, x: number, y: number, cache: WeakMap<Element, { x: string; y: string }>) => {\n const win = doc.defaultView!;\n const root = doc.scrollingElement;\n const overflowOf = (element: Element) => {\n let overflow = cache.get(element);\n if (!overflow) {\n const style = win.getComputedStyle(element);\n overflow = { x: style.overflowX, y: style.overflowY };\n cache.set(element, overflow);\n }\n return overflow;\n };\n for (let element = hit; element; element = element.parentElement) {\n const viewport = element === root;\n let canX: boolean;\n let canY: boolean;\n if (viewport) {\n // The body's overflow applies to the viewport while the root's is visible.\n const own = overflowOf(element);\n const body = doc.body ? overflowOf(doc.body) : own;\n canX = !LOCKED.test(own.x) && !(own.x === \"visible\" && LOCKED.test(body.x));\n canY = !LOCKED.test(own.y) && !(own.y === \"visible\" && LOCKED.test(body.y));\n } else {\n const own = overflowOf(element);\n canX = SCROLLS.test(own.x);\n canY = SCROLLS.test(own.y);\n }\n const rect = viewport ? { left: 0, top: 0, right: win.innerWidth, bottom: win.innerHeight } : element.getBoundingClientRect();\n const step = (point: number, start: number, end: number, position: number, max: number) => {\n if (point < start || point > end) return 0;\n const before = point - start;\n const after = end - point;\n if (before < AUTOSCROLL_EDGE && position > 0) return -Math.max(1, Math.ceil(12 * (1 - before / AUTOSCROLL_EDGE)));\n if (after < AUTOSCROLL_EDGE && position < max) return Math.max(1, Math.ceil(12 * (1 - after / AUTOSCROLL_EDGE)));\n return 0;\n };\n const dx = canX\n ? step(x, rect.left, rect.right, element.scrollLeft, element.scrollWidth - (viewport ? win.innerWidth : element.clientWidth))\n : 0;\n const dy = canY\n ? step(y, rect.top, rect.bottom, element.scrollTop, element.scrollHeight - (viewport ? win.innerHeight : element.clientHeight))\n : 0;\n if (dx || dy) {\n const beforeX = element.scrollLeft;\n const beforeY = element.scrollTop;\n element.scrollLeft += dx;\n element.scrollTop += dy;\n if (element.scrollLeft !== beforeX || element.scrollTop !== beforeY) return true;\n }\n if (element instanceof HTMLDialogElement) return false;\n }\n return false;\n};\n\nexport const bindDragSource = (\n source: HTMLElement,\n read: () => { payload: DragPayload; disabled?: boolean; messages: DragAndDropMessages },\n): (() => void) => {\n const doc = source.ownerDocument;\n const win = doc.defaultView!;\n const engine = engineFor(doc);\n let abandon: (() => void) | undefined;\n /** Set while a held finger or a drag owns the touch, so the page must not scroll. */\n let blockTouch = false;\n /**\n * Bound for the source's whole life: WebKit decides at touchstart whether a touch can still be kept from scrolling,\n * and only a non-passive listener present by then lets the later hold do so.\n */\n const preventScroll = (event: TouchEvent) => {\n if (blockTouch && event.cancelable) event.preventDefault();\n };\n /**\n * Fields, editable text, and marked regions inside the source keep their own press and native drag, and so does a\n * whole source inside editable content, such as a paragraph in an editor.\n */\n const ignored = (target: EventTarget | null) => {\n // An SVG part has no editable state of its own; its nearest HTML ancestor tells.\n let html = target instanceof Element ? target : null;\n while (html && !(html instanceof HTMLElement)) html = html.parentElement;\n if (html instanceof HTMLElement && html.isContentEditable) return true;\n const found = target instanceof Element ? target.closest(IGNORE) : null;\n return found !== null && source.contains(found);\n };\n const nativeDrag = (event: Event) => {\n if (!ignored(event.target)) event.preventDefault();\n };\n const down = (event: PointerEvent) => {\n if (!event.isPrimary || event.button !== 0 || engine.session || read().disabled) return;\n if (!(event.target instanceof Element) || event.target.closest(\".k2b-drag-source\") !== source) return;\n if (ignored(event.target)) return;\n engine.abandonPress?.();\n // Ready before the drag starts, so its first announcement is read.\n announcerFor(source);\n const id = event.pointerId;\n const mouse = event.pointerType === \"mouse\";\n const start = { x: event.clientX, y: event.clientY };\n let point = start;\n let held = false;\n let finished = false;\n /** The pointer went up or away, so no click of this press is still to come. */\n let released = false;\n let session: Session | undefined;\n let messages: DragAndDropMessages;\n let preview: HTMLElement | undefined;\n let releaseSelection: (() => void) | undefined;\n let frame = 0;\n let timer: number | undefined;\n let over: Target | undefined;\n let refused: Target | undefined;\n const overflowCache = new WeakMap<Element, { x: string; y: string }>();\n const hold = () => {\n if (held || finished) return;\n win.clearTimeout(timer);\n if (read().disabled) {\n cancel();\n return;\n }\n held = true;\n blockTouch = true;\n source.dataset.held = \"\";\n win.addEventListener(\"keydown\", key, true);\n };\n // Android reports a long press as a context-menu event, which may come before the timer and opens a GestureMenu\n // around the source then. It counts as the hold, so the following move drags.\n const preventContext = (event: Event) => {\n event.preventDefault();\n if (!session) hold();\n };\n const clean = () => {\n if (finished) return;\n finished = true;\n win.clearTimeout(timer);\n win.cancelAnimationFrame(frame);\n win.removeEventListener(\"pointermove\", move, true);\n win.removeEventListener(\"pointerup\", up, true);\n win.removeEventListener(\"pointercancel\", cancelPointer, true);\n win.removeEventListener(\"pointerdown\", other, true);\n win.removeEventListener(\"blur\", cancel);\n win.removeEventListener(\"keydown\", key, true);\n win.removeEventListener(\"contextmenu\", preventContext, true);\n blockTouch = false;\n source.removeEventListener(\"lostpointercapture\", lostCapture);\n if (source.hasPointerCapture?.(id)) source.releasePointerCapture(id);\n delete source.dataset.held;\n delete source.dataset.pressing;\n preview?.remove();\n releaseSelection?.();\n if (engine.abandonPress === cancel) engine.abandonPress = undefined;\n if (abandon === cancel) abandon = undefined;\n if (session) {\n clearSession(engine, session, source);\n swallowRelease(doc, released ? undefined : id);\n } else if (held) swallowRelease(doc, released ? undefined : id);\n };\n const cancel = () => {\n if (finished) return;\n const payload = session?.payload;\n clean();\n if (payload) announce(source, messages.cancelled(payload));\n };\n const hitTest = () => {\n const payload = session!.payload;\n const hit = doc.elementFromPoint(point.x, point.y);\n let inner: Target | undefined;\n let next: Target | undefined;\n for (let element = hit; element; element = element.parentElement) {\n const target = engine.byElement.get(element);\n // A dialog is a boundary: a target around it lies behind it.\n if (!target && element instanceof HTMLDialogElement) break;\n if (!target) continue;\n inner ??= target;\n if (accepts(target, payload)) {\n next = target;\n break;\n }\n }\n const rejected = next ? undefined : inner;\n if (next !== over || rejected !== refused) {\n if (over) mark(over, engine.targets.has(over) ? payload : undefined);\n if (refused) mark(refused, engine.targets.has(refused) ? payload : undefined);\n over = next;\n refused = rejected;\n if (over) {\n over.element.dataset.drop = \"over\";\n announce(source, over.messages.over({ target: over.label }));\n } else if (refused) {\n refused.element.dataset.drop = \"refused\";\n announce(source, refused.messages.refused({ target: refused.label, label: payload.label }));\n }\n }\n if (over) over.element.dataset.drop = \"over\";\n if (refused) refused.element.dataset.drop = \"refused\";\n return hit;\n };\n const renderFrame = () => {\n frame = 0;\n if (finished || !session) return;\n preview!.style.transform = `translate3d(${point.x}px, ${point.y}px, 0)`;\n const hit = hitTest();\n if (scrollAt(doc, hit, point.x, point.y, overflowCache)) frame = win.requestAnimationFrame(renderFrame);\n };\n const begin = () => {\n const current = read();\n if (current.disabled || engine.session) {\n cancel();\n return;\n }\n const payload = { ...current.payload };\n messages = current.messages;\n session = {\n payload,\n origin: source,\n cancel,\n targetsChanged: () => {\n if (!frame) frame = win.requestAnimationFrame(renderFrame);\n },\n };\n engine.session = session;\n for (const listener of dragStartListeners) listener(id);\n if (finished) return;\n delete source.dataset.held;\n source.dataset.dragging = \"\";\n win.addEventListener(\"contextmenu\", preventContext, true);\n releaseSelection = suppressTextSelection(id);\n // Captured, the mouse's moves and release reach this drag also over an iframe, such as a PDF preview. A finger\n // or pen is captured by the browser already.\n if (mouse)\n try {\n source.setPointerCapture(id);\n source.addEventListener(\"lostpointercapture\", lostCapture);\n } catch {\n // The pointer is already gone; its pointerup or pointercancel ends the drag.\n }\n preview = doc.createElement(\"div\");\n // Inside the source's own .k2b-ui scope the preview inherits its theme, also a scoped dark one; a second\n // .k2b-ui would reset the tokens to light.\n const scope = source.parentElement?.closest<HTMLElement>(\".k2b-ui\");\n preview.className = scope ? \"k2b-drag-preview\" : \"k2b-ui k2b-drag-preview\";\n preview.setAttribute(\"aria-hidden\", \"true\");\n const icon = doc.createElement(\"i\");\n icon.className = payload.icon ?? \"ti ti-file\";\n const label = doc.createElement(\"span\");\n label.className = \"k2b-drag-preview__label\";\n label.textContent = payload.label;\n preview.append(icon, label);\n if (payload.count && payload.count > 1) {\n const count = doc.createElement(\"span\");\n count.className = \"k2b-drag-preview__count\";\n count.textContent = String(payload.count);\n preview.append(count);\n }\n // In the top layer the preview is placed against the viewport, also inside a transformed dialog, and stays above it.\n preview.setAttribute(\"popover\", \"manual\");\n (scope ?? doc.body).append(preview);\n preview.showPopover?.();\n preview.style.transform = `translate3d(${point.x}px, ${point.y}px, 0)`;\n for (const target of engine.targets) mark(target, payload);\n setActiveDrag(payload);\n if (finished) return;\n announce(source, messages.pickedUp(payload));\n win.addEventListener(\"keydown\", key, true);\n };\n const move = (event: PointerEvent) => {\n if (event.pointerId !== id || finished) return;\n point = { x: event.clientX, y: event.clientY };\n if (!session && Math.hypot(point.x - start.x, point.y - start.y) >= SLOP) {\n if (event.pointerType !== \"mouse\" && !held) {\n cancel();\n return;\n }\n begin();\n }\n if (session && !finished && !frame) frame = win.requestAnimationFrame(renderFrame);\n };\n const up = (event: PointerEvent) => {\n if (event.pointerId !== id || finished) return;\n released = true;\n if (!session) {\n clean();\n return;\n }\n point = { x: event.clientX, y: event.clientY };\n hitTest();\n const target = over;\n const payload = session.payload;\n const result = target ? target.messages.dropped({ label: payload.label, target: target.label }) : messages.cancelled(payload);\n const drop = target?.drop;\n clean();\n announce(source, result);\n drop?.(payload);\n };\n // Capture ends without a release only when the browser takes the pointer away.\n const lostCapture = (event: PointerEvent) => {\n if (event.pointerId === id) cancel();\n };\n const cancelPointer = (event: PointerEvent) => {\n if (event.pointerId !== id) return;\n released = true;\n cancel();\n };\n const other = (event: PointerEvent) => {\n if (event.pointerId !== id) cancel();\n };\n const key = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n // A hold is not a drag yet: Escape ends it and still reaches the menu the hold opened.\n if (!session) {\n cancel();\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n cancel();\n };\n abandon = cancel;\n engine.abandonPress = cancel;\n win.addEventListener(\"pointermove\", move, true);\n win.addEventListener(\"pointerup\", up, true);\n win.addEventListener(\"pointercancel\", cancelPointer, true);\n win.addEventListener(\"pointerdown\", other, true);\n win.addEventListener(\"blur\", cancel);\n if (event.pointerType !== \"mouse\") {\n // A held finger drags: it selects no text, and Android's long-press menu does not open, also before the hold fires.\n source.dataset.pressing = \"\";\n win.addEventListener(\"contextmenu\", preventContext, true);\n timer = win.setTimeout(hold, HOLD_MS);\n }\n };\n announcerFor(source);\n source.addEventListener(\"pointerdown\", down);\n source.addEventListener(\"dragstart\", nativeDrag);\n source.addEventListener(\"touchmove\", preventScroll, { passive: false });\n return () => {\n abandon?.();\n if (engine.session && source.contains(engine.session.origin)) engine.session.cancel();\n source.removeEventListener(\"pointerdown\", down);\n source.removeEventListener(\"dragstart\", nativeDrag);\n source.removeEventListener(\"touchmove\", preventScroll);\n };\n};\n\nconst FOCUSABLE = \"a[href], button, input, select, textarea, [tabindex]\";\n/** The origin itself when it takes focus, else the nearest ancestor that does, such as a menu's group. */\nconst focusTarget = (origin: HTMLElement): HTMLElement =>\n (origin.matches(FOCUSABLE) ? origin : origin.closest<HTMLElement>(FOCUSABLE)) ?? origin;\n\nexport const startKeyboardDrag = (input: DragPayload, origin: HTMLElement, messages: DragAndDropMessages): (() => void) => {\n const doc = origin.ownerDocument;\n const win = doc.defaultView!;\n const engine = engineFor(doc);\n engine.session?.cancel();\n engine.abandonPress?.();\n const payload = { ...input };\n const choices = () =>\n [...engine.targets]\n .filter((target) => accepts(target, payload) && reachable(target, origin))\n .sort((a, b) => (a.element.compareDocumentPosition(b.element) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1));\n let targets: Target[] = [];\n let current: Target | undefined;\n /** Listening for keys: the first destination is chosen. */\n let ready = false;\n let finished = false;\n let frame = 0;\n const source = origin.closest<HTMLElement>(\".k2b-drag-source\") ?? undefined;\n const end = (target?: Target, text?: string) => {\n if (finished) return;\n finished = true;\n win.cancelAnimationFrame(frame);\n doc.removeEventListener(\"keydown\", key, true);\n doc.removeEventListener(\"pointerdown\", cancel, true);\n win.removeEventListener(\"blur\", cancel);\n const result = text ?? (target ? target.messages.dropped({ label: payload.label, target: target.label }) : messages.cancelled(payload));\n const drop = target?.drop;\n clearSession(engine, session, source);\n announce(origin, result);\n // Focus scrolls the origin back into view when choosing a destination scrolled it away.\n if (origin.isConnected) focusTarget(origin).focus();\n drop?.(payload);\n };\n const cancel = () => end();\n const pickupModal = modalOf(origin);\n /**\n * Whether a modal dialog opened over the pickup, leaving the origin inert: the key comes from inside another modal,\n * or a modal opened over a pickup that started outside of every modal.\n */\n const behindModal = (event: KeyboardEvent) => {\n const keyModal = event.target instanceof Element ? modalOf(event.target) : undefined;\n if (keyModal && keyModal !== pickupModal && !keyModal.contains(origin)) return true;\n // A dialog stack that shares one native dialog hides the level below, the origin's, when the next one opens.\n if (pickupModal && (!origin.isConnected || !visible(origin))) return true;\n return !pickupModal && Array.from(doc.querySelectorAll(\"dialog[open]\")).some(isModal);\n };\n const describe = (target: Target) =>\n target.messages.choice({ target: target.label, index: targets.indexOf(target) + 1, count: targets.length });\n const choose = (target: Target, text = describe(target)) => {\n if (current) mark(current, engine.targets.has(current) ? payload : undefined);\n current = target;\n current.element.dataset.drop = \"over\";\n current.element.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n announce(origin, text);\n };\n const key = (event: KeyboardEvent) => {\n const backward = event.key === \"ArrowUp\" || event.key === \"ArrowLeft\" || (event.key === \"Tab\" && event.shiftKey);\n const forward = !backward && (event.key === \"ArrowDown\" || event.key === \"ArrowRight\" || event.key === \"Tab\");\n if (!backward && !forward && ![\"Home\", \"End\", \"Enter\", \" \", \"Escape\"].includes(event.key)) return;\n // A modal dialog opened since the pickup: its keys are its own, and the pickup behind it ends.\n if (behindModal(event)) {\n cancel();\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n if (event.key === \"Escape\") {\n cancel();\n return;\n }\n // Destinations may have been hidden or shown since the last key, for example by a layout change.\n targets = choices();\n if (!targets.length) {\n end(undefined, messages.noTarget(payload));\n return;\n }\n const index = current ? targets.indexOf(current) : -1;\n const count = targets.length;\n if (forward) choose(targets[index < 0 ? 0 : (index + 1) % count]!);\n else if (backward) choose(targets[index < 0 ? count - 1 : (index - 1 + count) % count]!);\n else if (event.key === \"Home\") choose(targets[0]!);\n else if (event.key === \"End\") choose(targets[count - 1]!);\n else end(index >= 0 ? current : undefined);\n };\n /** Chooses the first destination and starts listening; without one, the sequence ends at once. */\n const settle = () => {\n targets = choices();\n if (!targets.length) {\n end(undefined, messages.noTarget(payload));\n return;\n }\n ready = true;\n // One announcement, so a screen reader does not drop the instructions for the first choice.\n choose(targets[0]!, `${messages.pickedUpKeyboard({ label: payload.label, count: targets.length })} ${describe(targets[0]!)}`);\n // A menu's activating key has already traversed capture. Defer the listener until that dispatch has ended.\n queueMicrotask(() => {\n if (finished) return;\n doc.addEventListener(\"keydown\", key, true);\n doc.addEventListener(\"pointerdown\", cancel, true);\n win.addEventListener(\"blur\", cancel);\n });\n };\n const session: Session = {\n payload,\n origin,\n cancel,\n // Settled a frame later, so a target that a re-render replaces has registered again before none counts as left.\n targetsChanged() {\n if (!ready || finished || frame) return;\n frame = win.requestAnimationFrame(() => {\n frame = 0;\n if (finished) return;\n targets = choices();\n if (!targets.length) cancel();\n else choose(current && targets.includes(current) ? current : targets[0]!);\n });\n },\n };\n // The drag is active before destinations are counted, so a host can mount the ones it shows only while dragging.\n engine.session = session;\n for (const target of engine.targets) mark(target, payload);\n if (source) source.dataset.dragging = \"\";\n setActiveDrag(payload);\n if (finished) return cancel;\n if (choices().length) settle();\n else\n frame = win.requestAnimationFrame(() => {\n frame = 0;\n if (!finished) settle();\n });\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,7 @@ export { Button, ButtonLink, IconButton, IconButtonLink } from "./Button";
2
2
  export { ContextMenu } from "./ContextMenu";
3
3
  export { CopyButton } from "./CopyButton";
4
4
  export { Disclosure } from "./Disclosure";
5
+ export { activeDrag, DragSource, DropTarget, useKeyboardDrag } from "./DragAndDrop";
5
6
  export { Dropdown, DropdownItem, dropdownPosition } from "./Dropdown";
6
7
  export { FilterChip } from "./FilterChip";
7
8
  export { GestureMenu } from "./GestureMenu";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["actions/index.ts"],"sourcesContent":["export type { ButtonAlign, ButtonLinkProps, ButtonProps, ButtonSize, ButtonVariant, IconButtonLinkProps, IconButtonProps } from \"./Button\";\nexport { Button, ButtonLink, IconButton, IconButtonLink } from \"./Button\";\nexport type { ContextMenuProps } from \"./ContextMenu\";\nexport { ContextMenu } from \"./ContextMenu\";\nexport type { CopyButtonProps, CopyButtonValue } from \"./CopyButton\";\nexport { CopyButton } from \"./CopyButton\";\nexport type { DisclosureProps } from \"./Disclosure\";\nexport { Disclosure } from \"./Disclosure\";\nexport type {\n DropdownAction,\n DropdownActionBase,\n DropdownChoice,\n DropdownItemProps,\n DropdownPosition,\n DropdownProps,\n DropdownSection,\n DropdownTriggerProps,\n} from \"./Dropdown\";\nexport { Dropdown, DropdownItem, dropdownPosition } from \"./Dropdown\";\nexport type { FilterChipOption, FilterChipProps, FilterChipSection } from \"./FilterChip\";\nexport { FilterChip } from \"./FilterChip\";\nexport type { GestureKind, GestureMenuAction, GestureMenuItem, GestureMenuProps, GestureMenuSection } from \"./GestureMenu\";\nexport { GestureMenu } from \"./GestureMenu\";\nexport type { RemoveButtonProps } from \"./RemoveButton\";\nexport { RemoveButton } from \"./RemoveButton\";\nexport type { SegmentedControlProps, SegmentOption } from \"./SegmentedControl\";\nexport { SegmentedControl } from \"./SegmentedControl\";\nexport type { SplitButtonProps } from \"./SplitButton\";\nexport { SplitButton } from \"./SplitButton\";\nexport type {\n SpotlightButtonProps,\n SpotlightButtonVariant,\n SpotlightSearchOptions,\n SpotlightSearchResolver,\n} from \"./SpotlightSearch\";\nexport {\n openSpotlightSearch,\n SpotlightButton,\n} from \"./SpotlightSearch\";\nexport type { TabOption, TabsItemProps, TabsProps } from \"./Tabs\";\nexport { Tabs } from \"./Tabs\";\nexport type { ToolbarActionProps, ToolbarGroupProps, ToolbarLabelProps, ToolbarProps, ToolbarSeparatorProps } from \"./Toolbar\";\nexport { Toolbar } from \"./Toolbar\";\n"],"mappings":"AACA,SAAS,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,QAAQ,UAAU;AAEzE,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,UAAU,QAAQ,cAAc;AAWzC,SAAS,QAAQ,EAAE,YAAY,EAAE,gBAAgB,QAAQ,YAAY;AAErE,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,gBAAgB,QAAQ,oBAAoB;AAErD,SAAS,WAAW,QAAQ,eAAe;AAO3C,SACE,mBAAmB,EACnB,eAAe,QACV,mBAAmB;AAE1B,SAAS,IAAI,QAAQ,QAAQ;AAE7B,SAAS,OAAO,QAAQ,WAAW","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["actions/index.ts"],"sourcesContent":["export type { ButtonAlign, ButtonLinkProps, ButtonProps, ButtonSize, ButtonVariant, IconButtonLinkProps, IconButtonProps } from \"./Button\";\nexport { Button, ButtonLink, IconButton, IconButtonLink } from \"./Button\";\nexport type { ContextMenuProps } from \"./ContextMenu\";\nexport { ContextMenu } from \"./ContextMenu\";\nexport type { CopyButtonProps, CopyButtonValue } from \"./CopyButton\";\nexport { CopyButton } from \"./CopyButton\";\nexport type { DisclosureProps } from \"./Disclosure\";\nexport { Disclosure } from \"./Disclosure\";\nexport type { DragPayload, DragSourceProps, DropTargetProps } from \"./DragAndDrop\";\nexport { activeDrag, DragSource, DropTarget, useKeyboardDrag } from \"./DragAndDrop\";\nexport type {\n DropdownAction,\n DropdownActionBase,\n DropdownChoice,\n DropdownItemProps,\n DropdownPosition,\n DropdownProps,\n DropdownSection,\n DropdownTriggerProps,\n} from \"./Dropdown\";\nexport { Dropdown, DropdownItem, dropdownPosition } from \"./Dropdown\";\nexport type { FilterChipOption, FilterChipProps, FilterChipSection } from \"./FilterChip\";\nexport { FilterChip } from \"./FilterChip\";\nexport type { GestureKind, GestureMenuAction, GestureMenuItem, GestureMenuProps, GestureMenuSection } from \"./GestureMenu\";\nexport { GestureMenu } from \"./GestureMenu\";\nexport type { RemoveButtonProps } from \"./RemoveButton\";\nexport { RemoveButton } from \"./RemoveButton\";\nexport type { SegmentedControlProps, SegmentOption } from \"./SegmentedControl\";\nexport { SegmentedControl } from \"./SegmentedControl\";\nexport type { SplitButtonProps } from \"./SplitButton\";\nexport { SplitButton } from \"./SplitButton\";\nexport type {\n SpotlightButtonProps,\n SpotlightButtonVariant,\n SpotlightSearchOptions,\n SpotlightSearchResolver,\n} from \"./SpotlightSearch\";\nexport {\n openSpotlightSearch,\n SpotlightButton,\n} from \"./SpotlightSearch\";\nexport type { TabOption, TabsItemProps, TabsProps } from \"./Tabs\";\nexport { Tabs } from \"./Tabs\";\nexport type { ToolbarActionProps, ToolbarGroupProps, ToolbarLabelProps, ToolbarProps, ToolbarSeparatorProps } from \"./Toolbar\";\nexport { Toolbar } from \"./Toolbar\";\n"],"mappings":"AACA,SAAS,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,QAAQ,UAAU;AAEzE,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,QAAQ,eAAe;AAWnF,SAAS,QAAQ,EAAE,YAAY,EAAE,gBAAgB,QAAQ,YAAY;AAErE,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,gBAAgB,QAAQ,oBAAoB;AAErD,SAAS,WAAW,QAAQ,eAAe;AAO3C,SACE,mBAAmB,EACnB,eAAe,QACV,mBAAmB;AAE1B,SAAS,IAAI,QAAQ,QAAQ;AAE7B,SAAS,OAAO,QAAQ,WAAW","ignoreList":[]}
@@ -25,7 +25,7 @@ var _tmpl$ = ["<span><strong", ">", "</strong></span>"],
25
25
  _tmpl$16 = ["<div role=\"status\" class=\"k2b-chat-composer__loading\"><i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\"></i><strong>", "</strong></div>"],
26
26
  _tmpl$17 = ["<div role=\"status\"><i class=\"ti ti-alert-circle\"></i> ", "</div>"],
27
27
  _tmpl$18 = ["<div role=\"status\">", "</div>"],
28
- _tmpl$19 = ["<div class=\"k2b-chat-composer-accessory\" data-commands><div", " class=\"k2b-chat-composer__commands\" role=\"listbox\"", ">", "", "", "", "</div></div>"],
28
+ _tmpl$19 = ["<div class=\"k2b-chat-composer-accessory\" data-commands><div", " class=\"k2b-chat-composer__commands\" role=\"listbox\"", ">", "", "", "", "", "</div></div>"],
29
29
  _tmpl$20 = ["<div class=\"k2b-chat-composer-slot\"", "><div style=\"", "\"", ">", "</div>", "", "</div>"],
30
30
  _tmpl$21 = ["<div class=\"k2b-chat-composer__hint\" aria-live=\"polite\">", "</div>"],
31
31
  _tmpl$22 = ["<div class=\"k2b-chat-composer__attachments\" role=\"list\"", " tabindex=\"0\">", "</div>"],
@@ -78,7 +78,10 @@ const emojiSuggestionLimit = 8;
78
78
  // Keep editor undo text within approximately 2 MiB, plus the current edit.
79
79
  const composerUndoBudgetChars = 1_000_000;
80
80
 
81
- /** An action can cancel and restore its token, or report a short completion message. */
81
+ /**
82
+ * An action can cancel and restore its token, report a short completion message, or hand back a reference chosen in a
83
+ * dialog: `mention` takes the token's place exactly as a `mention` row does, and Ctrl/⌘+Z brings the token back.
84
+ */
82
85
 
83
86
  /** A fixed place in the slash list. Sections keep the given order, also while searching. */
84
87
 
@@ -296,6 +299,14 @@ export function ChatComposer(props) {
296
299
  if (start !== undefined) setCommandOpening(opening => opening + 1);
297
300
  });
298
301
  const parsedCommandQuery = createMemo(() => parseChatCommandQuery(commandQuery()?.query ?? "", props.commandScopes ?? []));
302
+ const commandFallbackRow = createMemo(() => {
303
+ const parsed = parsedCommandQuery();
304
+ const query = parsed.query.trim();
305
+ return commandQuery() && (query || parsed.scope) ? props.commandFallback?.({
306
+ query,
307
+ scope: parsed.scope?.id
308
+ }) : undefined;
309
+ });
299
310
  const currentCommandScope = createMemo(() => parsedCommandQuery().scope?.id);
300
311
  createEffect(() => {
301
312
  currentCommandScope();
@@ -311,9 +322,12 @@ export function ChatComposer(props) {
311
322
  searchResults: searchResultsScope() === parsedCommandQuery().scope?.id ? searchResults() : [],
312
323
  searchResultsFresh: searchResultsQuery() === commandQuery()?.query && searchResultsScope() === parsedCommandQuery().scope?.id,
313
324
  searchSettled: searchResultsQuery() !== undefined && searchResultsScope() === parsedCommandQuery().scope?.id,
314
- searching: searching()
325
+ searching: searching(),
326
+ fallback: commandFallbackRow()
315
327
  }));
316
328
  const commandMatches = createMemo(() => commandQuery() ? commandModel().rows.map(row => row.command) : []);
329
+ /** Rows that matched; an unscoped fallback row only follows them. */
330
+ const foundCommandCount = () => commandMatches().length - (commandModel().fallback ? 1 : 0);
317
331
  const currentCommandQuery = createMemo(() => caretCommandToken()?.query);
318
332
  // Arrow marking belongs to one token in one draft; another draft or `/` starts at the top row again.
319
333
  createEffect(() => {
@@ -322,7 +336,7 @@ export function ChatComposer(props) {
322
336
  currentCommandQuery();
323
337
  setCommandMoved(false);
324
338
  });
325
- const commandsOpen = () => Boolean(!emojiOpen() && commandQuery() && (localCommands().length || props.searchCommands));
339
+ const commandsOpen = () => Boolean(!emojiOpen() && commandQuery() && (localCommands().length || props.searchCommands || commandFallbackRow()));
326
340
  const commandSheetHeld = createMemo(() => commandsOpen() && isTouchOnly());
327
341
  createEffect(() => {
328
342
  if (!commandSheetHeld()) return;
@@ -666,12 +680,78 @@ export function ChatComposer(props) {
666
680
  });
667
681
  const setAttachments = next => props.onAttachmentsChange?.(next);
668
682
  const renderAttachmentCopy = attachment => _$ssr(_tmpl$, _$ssrAttribute("title", _$escape(attachment.name, true), false), _$escape(attachment.name));
669
- const chooseFiles = () => {
683
+
684
+ /** `onNothing` runs when the person closes the selection without a file. */
685
+ const chooseFiles = onNothing => {
670
686
  const selection = props.fileSelection;
671
- if (!selection?.choose) return fileInputRef?.click();
672
- selection.choose().then(
687
+ if (!selection?.choose) {
688
+ const input = fileInputRef;
689
+ if (input && onNothing) {
690
+ const done = new AbortController();
691
+ input.addEventListener("cancel", () => {
692
+ done.abort();
693
+ onNothing();
694
+ }, {
695
+ signal: done.signal
696
+ });
697
+ input.addEventListener("change", () => done.abort(), {
698
+ signal: done.signal
699
+ });
700
+ }
701
+ return input?.click();
702
+ }
703
+ const failed = error => {
704
+ onNothing?.();
705
+ (props.fileSelection?.onError ?? props.onError)?.(error);
706
+ };
707
+ let chosen;
708
+ try {
709
+ chosen = selection.choose();
710
+ } catch (error) {
711
+ failed(error);
712
+ return;
713
+ }
714
+ chosen.then(
673
715
  // A single-file composer keeps the first chosen file, as its file dialog and drops do.
674
- files => void runFiles(selection.multiple === false ? files.slice(0, 1) : files), error => (props.fileSelection?.onError ?? props.onError)?.(error));
716
+ files => {
717
+ if (files.length === 0) onNothing?.();else void runFiles(selection.multiple === false ? files.slice(0, 1) : files);
718
+ }, failed);
719
+ };
720
+
721
+ /**
722
+ * "Attach files" from the slash list: the token leaves as one edit, and the selection opens synchronously, inside the
723
+ * key or click that chose the row, because the device's file dialog needs that activation. Closing the selection
724
+ * without a file brings the token back, unless the draft changed meanwhile.
725
+ */
726
+ const attachFilesFromCommand = token => {
727
+ if (!canSelectFiles()) return;
728
+ const key = props.draftKey;
729
+ const previous = snapshot();
730
+ const previousHistory = {
731
+ entries: [...history],
732
+ index: historyIndex
733
+ };
734
+ const nextValue = props.value.slice(0, token.start) + props.value.slice(token.end);
735
+ edit(nextValue, reconcileChatMentions(props.value, nextValue, mentions()));
736
+ setDismissed(true);
737
+ chooseFiles(() => {
738
+ if (props.draftKey !== key || props.value !== nextValue) return;
739
+ setDismissed(true);
740
+ props.onValueChange(previous.value);
741
+ props.onMentionsChange?.(previous.mentions);
742
+ history.splice(0, history.length, ...previousHistory.entries);
743
+ historyIndex = previousHistory.index;
744
+ queueMicrotask(() => {
745
+ textareaRef?.setSelectionRange(token.end, token.end);
746
+ syncCaret();
747
+ focus();
748
+ });
749
+ });
750
+ queueMicrotask(() => {
751
+ if (props.draftKey !== key || props.value !== nextValue) return;
752
+ textareaRef?.setSelectionRange(token.start, token.start);
753
+ syncCaret();
754
+ });
675
755
  };
676
756
  const runFiles = async files => {
677
757
  if (!canSelectFiles()) return;
@@ -766,7 +846,11 @@ export function ChatComposer(props) {
766
846
  setCommandOpening(opening => opening + 1);
767
847
  return;
768
848
  }
769
- if (command.scope && (tab || !command.action && !command.mention) && narrowCommand(command)) return;
849
+ if (command.scope && (tab || !command.action && !command.mention && !command.attachFiles) && narrowCommand(command)) return;
850
+ if (command.attachFiles) {
851
+ attachFilesFromCommand(token);
852
+ return;
853
+ }
770
854
  const previous = snapshot();
771
855
  const key = props.draftKey;
772
856
  const replacement = command.mention ? command.mention.name + " " : "";
@@ -787,6 +871,7 @@ export function ChatComposer(props) {
787
871
  setExecuting(true);
788
872
  let submitRequested = false;
789
873
  let restored = false;
874
+ let mentioned;
790
875
  const restore = () => {
791
876
  if (props.draftKey !== key || props.value !== nextValue) return;
792
877
  setDismissed(true);
@@ -819,6 +904,32 @@ export function ChatComposer(props) {
819
904
  submitRequested = false;
820
905
  restore();
821
906
  showCommandStatus();
907
+ } else if (result && "mention" in result) {
908
+ // One undo step from the token to the reference, as if the row had been a reference itself.
909
+ if (props.draftKey === key && props.value === nextValue) {
910
+ restore();
911
+ restored = false;
912
+ const name = result.mention.name;
913
+ const withMention = previous.value.slice(0, token.start) + name + " " + previous.value.slice(token.end);
914
+ edit(withMention, [...reconcileChatMentions(previous.value, withMention, previous.mentions), {
915
+ start: token.start,
916
+ end: token.start + name.length,
917
+ attachment: result.mention
918
+ }]);
919
+ setDismissed(true);
920
+ mentioned = {
921
+ value: withMention,
922
+ caret: token.start + name.length + 1
923
+ };
924
+ showCommandStatus();
925
+ } else {
926
+ // The pick is lost; say so, also when the draft moved to another key meanwhile (such as a new chat saved
927
+ // while the dialog was open), so it never ends in silence.
928
+ showCommandStatus({
929
+ tone: "error",
930
+ text: chatMessages().commandDraftChanged
931
+ });
932
+ }
822
933
  } else if (result) {
823
934
  showCommandStatus({
824
935
  tone: "done",
@@ -840,8 +951,8 @@ export function ChatComposer(props) {
840
951
  if (submitRequested && props.draftKey === key) await submit();
841
952
  queueMicrotask(() => {
842
953
  if (props.draftKey !== key) return;
843
- if (restored || props.value === nextValue) {
844
- const position = restored ? token.end : token.start + replacement.length;
954
+ if (restored || props.value === nextValue || mentioned && props.value === mentioned.value) {
955
+ const position = restored ? token.end : mentioned?.caret ?? token.start + replacement.length;
845
956
  textareaRef?.setSelectionRange(position, position);
846
957
  }
847
958
  syncCaret();
@@ -1093,7 +1204,7 @@ export function ChatComposer(props) {
1093
1204
  get disabled() {
1094
1205
  return !canSelectFiles();
1095
1206
  },
1096
- onClick: chooseFiles,
1207
+ onClick: () => chooseFiles(),
1097
1208
  get children() {
1098
1209
  return _$ssr(_tmpl$3, _$ssrAttribute("class", addingFiles() ? "ti ti-loader-2 k2b-spin" : "ti ti-plus", false));
1099
1210
  }
@@ -1464,7 +1575,7 @@ export function ChatComposer(props) {
1464
1575
  }
1465
1576
  })), _$escape(_$createComponent(Show, {
1466
1577
  get when() {
1467
- return _$memo(() => !!(searching() && commandMatches().length === 0))() && !commandModel().groups.some(group => group.section || group.scopeTitle);
1578
+ return _$memo(() => !!(searching() && foundCommandCount() === 0))() && !commandModel().groups.some(group => group.section || group.scopeTitle);
1468
1579
  },
1469
1580
  get children() {
1470
1581
  return _$ssr(_tmpl$16, _$escape(messages().loading));
@@ -1478,13 +1589,19 @@ export function ChatComposer(props) {
1478
1589
  }
1479
1590
  })), _$escape(_$createComponent(Show, {
1480
1591
  get when() {
1481
- return _$memo(() => !!(!searching() && !searchError()))() && commandMatches().length === 0;
1592
+ return _$memo(() => !!(!searching() && !searchError()))() && foundCommandCount() === 0;
1482
1593
  },
1483
1594
  get children() {
1484
1595
  return _$ssr(_tmpl$18, !parsedCommandQuery().query.trim() ? _$escape(messages().noResults) : _$escape(chatMessages().commandsNothingFound({
1485
1596
  query: parsedCommandQuery().query.trim()
1486
1597
  })));
1487
1598
  }
1599
+ })), _$escape(_$createComponent(Show, {
1600
+ get when() {
1601
+ return commandModel().fallback?.command;
1602
+ },
1603
+ keyed: true,
1604
+ children: command => renderCommandRow(command)
1488
1605
  })));
1489
1606
  }
1490
1607
  })));