@k2b/ui 0.9.0 → 0.10.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 (181) hide show
  1. package/dist/browser/actions/Button.js +15 -7
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/ContextMenu.js +55 -15
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js +39 -15
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +1 -7
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js +0 -3
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/chat/ChatComposer.js +78 -91
  12. package/dist/browser/chat/ChatComposer.js.map +1 -1
  13. package/dist/browser/chat/ChatContextPopup.js +47 -21
  14. package/dist/browser/chat/ChatContextPopup.js.map +1 -1
  15. package/dist/browser/chat/ChatPrimitives.js +221 -232
  16. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  17. package/dist/browser/chat/index.js +3 -2
  18. package/dist/browser/chat/index.js.map +1 -1
  19. package/dist/browser/content/Chart.js +99 -106
  20. package/dist/browser/content/Chart.js.map +1 -1
  21. package/dist/browser/content/ChartExplorer.js +3 -6
  22. package/dist/browser/content/ChartExplorer.js.map +1 -1
  23. package/dist/browser/content/FileBrowser.js +1 -1
  24. package/dist/browser/content/FileBrowser.js.map +1 -1
  25. package/dist/browser/content/FileTree.js +1 -1
  26. package/dist/browser/content/FileTree.js.map +1 -1
  27. package/dist/browser/content/FileView.js +304 -287
  28. package/dist/browser/content/FileView.js.map +1 -1
  29. package/dist/browser/content/Lightbox.js +18 -0
  30. package/dist/browser/content/Lightbox.js.map +1 -1
  31. package/dist/browser/content/MarkdownView.js +8 -1
  32. package/dist/browser/content/MarkdownView.js.map +1 -1
  33. package/dist/browser/content/PdfPreview.js +68 -43
  34. package/dist/browser/content/PdfPreview.js.map +1 -1
  35. package/dist/browser/content/ZoomPanViewport.js +51 -52
  36. package/dist/browser/content/ZoomPanViewport.js.map +1 -1
  37. package/dist/browser/feedback/HoverPreview.js +391 -0
  38. package/dist/browser/feedback/HoverPreview.js.map +1 -0
  39. package/dist/browser/feedback/Tooltip.js +50 -8
  40. package/dist/browser/feedback/Tooltip.js.map +1 -1
  41. package/dist/browser/feedback/dialog-core.js +21 -3
  42. package/dist/browser/feedback/dialog-core.js.map +1 -1
  43. package/dist/browser/feedback/index.js +1 -0
  44. package/dist/browser/feedback/index.js.map +1 -1
  45. package/dist/browser/inputs/AutocompleteEditor.js +5 -4
  46. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  47. package/dist/browser/inputs/DatePicker.js +10 -0
  48. package/dist/browser/inputs/DatePicker.js.map +1 -1
  49. package/dist/browser/inputs/FileInputs.js +46 -36
  50. package/dist/browser/inputs/FileInputs.js.map +1 -1
  51. package/dist/browser/inputs/SelectChip.js +2 -1
  52. package/dist/browser/inputs/SelectChip.js.map +1 -1
  53. package/dist/browser/inputs/choice.js +5 -1
  54. package/dist/browser/inputs/choice.js.map +1 -1
  55. package/dist/browser/inputs/markdown/MarkdownEditor.js +173 -173
  56. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  57. package/dist/browser/inputs/markdown/Toolbar.js +31 -34
  58. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  59. package/dist/browser/internal/focus-return.js +61 -0
  60. package/dist/browser/internal/focus-return.js.map +1 -0
  61. package/dist/browser/layout/AppOverview.js +1 -1
  62. package/dist/browser/layout/AppOverview.js.map +1 -1
  63. package/dist/browser/layout/DetailPanel.js +16 -15
  64. package/dist/browser/layout/DetailPanel.js.map +1 -1
  65. package/dist/browser/layout/FloatingWindow.js +3 -1
  66. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  67. package/dist/browser/layout/PanelDialog.js +10 -9
  68. package/dist/browser/layout/PanelDialog.js.map +1 -1
  69. package/dist/browser/layout/Panes.js +82 -81
  70. package/dist/browser/layout/Panes.js.map +1 -1
  71. package/dist/browser/layout/SidebarItemPreview.js +48 -136
  72. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  73. package/dist/browser/layout/app-workspace-controller.js +5 -2
  74. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  75. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  76. package/dist/browser/surfaces/ProgressRing.js +72 -0
  77. package/dist/browser/surfaces/ProgressRing.js.map +1 -0
  78. package/dist/browser/surfaces/index.js +1 -0
  79. package/dist/browser/surfaces/index.js.map +1 -1
  80. package/dist/ssr/actions/Button.js +15 -7
  81. package/dist/ssr/actions/Button.js.map +1 -1
  82. package/dist/ssr/actions/ContextMenu.js +55 -15
  83. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  84. package/dist/ssr/actions/Dropdown.js +31 -12
  85. package/dist/ssr/actions/Dropdown.js.map +1 -1
  86. package/dist/ssr/actions/FilterChip.js +1 -7
  87. package/dist/ssr/actions/FilterChip.js.map +1 -1
  88. package/dist/ssr/actions/SplitButton.js +0 -3
  89. package/dist/ssr/actions/SplitButton.js.map +1 -1
  90. package/dist/ssr/chat/ChatComposer.js +61 -10
  91. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  92. package/dist/ssr/chat/ChatContextPopup.js +19 -5
  93. package/dist/ssr/chat/ChatContextPopup.js.map +1 -1
  94. package/dist/ssr/chat/ChatPrimitives.js +104 -74
  95. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  96. package/dist/ssr/chat/index.js +3 -2
  97. package/dist/ssr/chat/index.js.map +1 -1
  98. package/dist/ssr/content/Chart.js +22 -11
  99. package/dist/ssr/content/Chart.js.map +1 -1
  100. package/dist/ssr/content/ChartExplorer.js +3 -6
  101. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  102. package/dist/ssr/content/FileBrowser.js +1 -1
  103. package/dist/ssr/content/FileBrowser.js.map +1 -1
  104. package/dist/ssr/content/FileTree.js +1 -1
  105. package/dist/ssr/content/FileTree.js.map +1 -1
  106. package/dist/ssr/content/FileView.js +105 -33
  107. package/dist/ssr/content/FileView.js.map +1 -1
  108. package/dist/ssr/content/Lightbox.js +17 -0
  109. package/dist/ssr/content/Lightbox.js.map +1 -1
  110. package/dist/ssr/content/MarkdownView.js +8 -1
  111. package/dist/ssr/content/MarkdownView.js.map +1 -1
  112. package/dist/ssr/content/PdfPreview.js +44 -14
  113. package/dist/ssr/content/PdfPreview.js.map +1 -1
  114. package/dist/ssr/content/ZoomPanViewport.js +11 -3
  115. package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
  116. package/dist/ssr/feedback/HoverPreview.js +360 -0
  117. package/dist/ssr/feedback/HoverPreview.js.map +1 -0
  118. package/dist/ssr/feedback/Tooltip.js +50 -8
  119. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  120. package/dist/ssr/feedback/dialog-core.js +21 -3
  121. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  122. package/dist/ssr/feedback/index.js +1 -0
  123. package/dist/ssr/feedback/index.js.map +1 -1
  124. package/dist/ssr/inputs/AutocompleteEditor.js +5 -4
  125. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  126. package/dist/ssr/inputs/DatePicker.js +5 -0
  127. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  128. package/dist/ssr/inputs/FileInputs.js +29 -11
  129. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  130. package/dist/ssr/inputs/SelectChip.js +2 -1
  131. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  132. package/dist/ssr/inputs/choice.js +5 -1
  133. package/dist/ssr/inputs/choice.js.map +1 -1
  134. package/dist/ssr/inputs/markdown/MarkdownEditor.js +46 -10
  135. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  136. package/dist/ssr/inputs/markdown/Toolbar.js +30 -2
  137. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  138. package/dist/ssr/internal/focus-return.js +61 -0
  139. package/dist/ssr/internal/focus-return.js.map +1 -0
  140. package/dist/ssr/layout/AppOverview.js +1 -1
  141. package/dist/ssr/layout/AppOverview.js.map +1 -1
  142. package/dist/ssr/layout/DetailPanel.js +16 -15
  143. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  144. package/dist/ssr/layout/FloatingWindow.js +3 -1
  145. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  146. package/dist/ssr/layout/PanelDialog.js +10 -9
  147. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  148. package/dist/ssr/layout/Panes.js +39 -8
  149. package/dist/ssr/layout/Panes.js.map +1 -1
  150. package/dist/ssr/layout/SidebarItemPreview.js +36 -108
  151. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  152. package/dist/ssr/layout/app-workspace-controller.js +5 -2
  153. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  154. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  155. package/dist/ssr/surfaces/ProgressRing.js +31 -0
  156. package/dist/ssr/surfaces/ProgressRing.js.map +1 -0
  157. package/dist/ssr/surfaces/index.js +1 -0
  158. package/dist/ssr/surfaces/index.js.map +1 -1
  159. package/dist/styles.css +1 -1
  160. package/dist/tabler-icons-15sezdfp.woff2 +0 -0
  161. package/dist/tabler.css +2 -2
  162. package/dist/types/actions/Button.d.ts +5 -0
  163. package/dist/types/actions/Dropdown.d.ts +5 -1
  164. package/dist/types/actions/SplitButton.d.ts +1 -0
  165. package/dist/types/chat/ChatContextPopup.d.ts +8 -0
  166. package/dist/types/chat/index.d.ts +3 -2
  167. package/dist/types/feedback/HoverPreview.d.ts +83 -0
  168. package/dist/types/feedback/Tooltip.d.ts +6 -0
  169. package/dist/types/feedback/index.d.ts +2 -0
  170. package/dist/types/feedback/prompts.d.ts +9 -6
  171. package/dist/types/inputs/SelectChip.d.ts +1 -0
  172. package/dist/types/inputs/completion/overlay.d.ts +3 -1
  173. package/dist/types/internal/focus-return.d.ts +20 -0
  174. package/dist/types/intl/Format.d.ts +16 -8
  175. package/dist/types/layout/BottomSheet.d.ts +6 -1
  176. package/dist/types/layout/SidebarItemPreview.d.ts +1 -1
  177. package/dist/types/surfaces/ProgressBar.d.ts +1 -1
  178. package/dist/types/surfaces/ProgressRing.d.ts +13 -0
  179. package/dist/types/surfaces/index.d.ts +2 -0
  180. package/package.json +9 -8
  181. package/dist/tabler-icons-q30jt7jk.woff2 +0 -0
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/Panes.tsx"],"sourcesContent":["import { type DndCollisionContext, type DndController, type DndDroppableSnapshot, dnd } from \"@k2b/stdlib/solid\";\nimport { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n activatePanesItem,\n applyPanesIntent,\n getPanesDropTargets,\n PANES_MAX_ID_LENGTH,\n PANES_MIN_RATIO,\n type PanesDropTarget,\n type PanesGroup,\n type PanesIntent,\n type PanesLayout,\n type PanesNode,\n type PanesPath,\n type PanesSplit,\n parsePanesLayout,\n resizePanesSplit,\n samePanesIntent,\n} from \"./panes-layout\";\nimport { assertUniqueStableUiIds } from \"./stable-id\";\n\nexport type PanesItem = {\n id: string;\n title: string;\n icon?: string;\n render: () => JSX.Element;\n onClose?: () => void;\n};\n\nexport type PanesProps = {\n layout: PanesLayout;\n onLayoutChange: (layout: PanesLayout) => void;\n items: readonly PanesItem[];\n movable?: boolean;\n resizable?: boolean;\n split?: false | \"horizontal\" | \"vertical\" | \"both\";\n onAddItem?: (targetItemId: string | null) => void;\n ariaLabel?: string;\n class?: string;\n};\n\ntype DragMeta = { itemId: string; label: string };\ntype DropMeta = { target: PanesDropTarget; label: string };\ntype PaneDnd = DndController<DragMeta, DropMeta, PanesIntent>;\n\ntype IndexedPanesDropTargets = {\n tabs: ReadonlyMap<string | null, PanesDropTarget>;\n body: readonly PanesDropTarget[];\n};\n\ntype PanesSeparatorGeometry = {\n coordinate: number;\n crossStart: number;\n crossEnd: number;\n};\n\nconst PANES_RESIZE_SNAP_DISTANCE = 8;\nconst PANES_RESIZE_UNSNAP_DISTANCE = 12;\nconst PANES_RESIZE_NEIGHBOR_GAP = 16;\n\nconst intervalGap = (left: PanesSeparatorGeometry, right: PanesSeparatorGeometry): number =>\n left.crossEnd < right.crossStart\n ? right.crossStart - left.crossEnd\n : right.crossEnd < left.crossStart\n ? left.crossStart - right.crossEnd\n : 0;\n\nexport const resolvePanesResizeSnap = (\n coordinate: number,\n source: PanesSeparatorGeometry,\n candidates: readonly PanesSeparatorGeometry[],\n options: { activeCoordinate?: number | null; previousCoordinate?: number } = {},\n): { coordinate: number; snappedTo: number | null } => {\n const neighbors = candidates.filter((candidate) => {\n const gap = intervalGap(source, candidate);\n return gap > 0 && gap <= PANES_RESIZE_NEIGHBOR_GAP;\n });\n const activeCoordinate = options.activeCoordinate;\n const active =\n activeCoordinate === null || activeCoordinate === undefined\n ? null\n : neighbors.find((candidate) => Math.abs(candidate.coordinate - activeCoordinate) < 0.5);\n if (active && Math.abs(coordinate - active.coordinate) <= PANES_RESIZE_UNSNAP_DISTANCE) {\n return { coordinate: active.coordinate, snappedTo: active.coordinate };\n }\n\n const previous = options.previousCoordinate;\n let winner: PanesSeparatorGeometry | null = null;\n let winnerDistance = Number.POSITIVE_INFINITY;\n for (const candidate of neighbors) {\n if (previous !== undefined && Math.abs(candidate.coordinate - previous) < 0.5) continue;\n const distanceToRange =\n previous === undefined ||\n candidate.coordinate < Math.min(previous, coordinate) ||\n candidate.coordinate > Math.max(previous, coordinate)\n ? Math.abs(candidate.coordinate - coordinate)\n : 0;\n const distanceToCoordinate = Math.abs(candidate.coordinate - coordinate);\n if (distanceToRange <= PANES_RESIZE_SNAP_DISTANCE && distanceToCoordinate < winnerDistance) {\n winner = candidate;\n winnerDistance = distanceToCoordinate;\n }\n }\n return winner ? { coordinate: winner.coordinate, snappedTo: winner.coordinate } : { coordinate, snappedTo: null };\n};\n\nexport const indexPanesDropTargets = (targets: readonly PanesDropTarget[]): ReadonlyMap<string, IndexedPanesDropTargets> => {\n const mutable = new Map<string, { tabs: Map<string | null, PanesDropTarget>; body: PanesDropTarget[] }>();\n for (const target of targets) {\n let indexed = mutable.get(target.targetItemId);\n if (!indexed) {\n indexed = { tabs: new Map(), body: [] };\n mutable.set(target.targetItemId, indexed);\n }\n if (target.kind === \"tab\") indexed.tabs.set(target.beforeItemId ?? null, target);\n else indexed.body.push(target);\n }\n return mutable;\n};\n\nconst iconClass = (icon: string | undefined): string => {\n const value = icon?.trim() || \"ti-layout-sidebar-right\";\n return value.startsWith(\"ti \") ? value : `ti ${value}`;\n};\n\nconst collectLayoutItemIds = (node: PanesNode | null, ids: string[] = []): string[] => {\n if (!node) return ids;\n if (node.type === \"group\") ids.push(...node.items);\n else {\n collectLayoutItemIds(node.first, ids);\n collectLayoutItemIds(node.second, ids);\n }\n return ids;\n};\n\nconst nearestDroppable = (entries: DndDroppableSnapshot<DropMeta>[]): DndDroppableSnapshot<DropMeta> | null =>\n entries.reduce<DndDroppableSnapshot<DropMeta> | null>(\n (winner, entry) => (!winner || entry.distance < winner.distance ? entry : winner),\n null,\n );\n\nexport const pointerHitsPanesDropTarget = (\n entry: Pick<DndDroppableSnapshot<DropMeta>, \"containsPointer\" | \"meta\" | \"rect\"> &\n Partial<Pick<DndDroppableSnapshot<DropMeta>, \"element\">>,\n pointer: { x: number; y: number },\n hitElement?: Element | null,\n): boolean => {\n if (hitElement !== undefined && !entry.element?.contains(hitElement)) return false;\n const side = entry.meta.target.side;\n if (entry.meta.target.kind !== \"split\" || !side) return entry.containsPointer;\n if (!entry.containsPointer) return false;\n const x = pointer.x - entry.rect.left;\n const y = pointer.y - entry.rect.top;\n if (side === \"top\") return x >= y && x <= entry.rect.width - y;\n if (side === \"bottom\") {\n const corner = entry.rect.height - y;\n return x >= corner && x <= entry.rect.width - corner;\n }\n if (side === \"left\") return y >= x && y <= entry.rect.height - x;\n const corner = entry.rect.width - x;\n return y >= corner && y <= entry.rect.height - corner;\n};\n\nconst panesCollisionDetector = (\n context: DndCollisionContext<DragMeta, DropMeta, PanesIntent>,\n mode: \"pointer\" | \"keyboard\" | null,\n): string | null => {\n const document = mode === \"pointer\" ? context.droppables[0]?.element.ownerDocument : undefined;\n const hitElement = document?.elementFromPoint(context.pointer.x, context.pointer.y) ?? undefined;\n return nearestDroppable(context.droppables.filter((entry) => pointerHitsPanesDropTarget(entry, context.pointer, hitElement)))?.id ?? null;\n};\n\nconst createItemMap = (items: readonly PanesItem[]): Map<string, PanesItem> => {\n assertUniqueStableUiIds(\n items.map((item) => item.id),\n \"Panes item id\",\n PANES_MAX_ID_LENGTH,\n );\n return new Map(items.map((item) => [item.id, item]));\n};\n\nconst requireItem = (items: Map<string, PanesItem>, id: string): PanesItem => {\n const item = items.get(id);\n if (!item) throw new Error(`Panes layout references missing item \"${id}\".`);\n return item;\n};\n\nexport default function Panes(props: PanesProps): JSX.Element {\n const messages = useUiMessages();\n const instanceId = `k2b-panes-${createUniqueId()}`;\n const items = createMemo(() => createItemMap(props.items));\n const layout = createMemo(() => {\n if (!parsePanesLayout(props.layout)) throw new Error(\"Panes layout must be a valid version 2 layout.\");\n for (const id of collectLayoutItemIds(props.layout.root)) requireItem(items(), id);\n return props.layout;\n });\n const canMove = () => props.movable ?? true;\n const canResize = () => props.resizable ?? true;\n const split = () => props.split ?? \"both\";\n const [draggedItemId, setDraggedItemId] = createSignal<string | null>(null);\n const [dragMode, setDragMode] = createSignal<\"pointer\" | \"keyboard\" | null>(null);\n const dropTargets = createMemo(() => {\n const itemId = draggedItemId();\n return itemId ? getPanesDropTargets(layout(), itemId, { movable: canMove(), split: split() }) : [];\n });\n const dropTargetIndex = createMemo(() => indexPanesDropTargets(dropTargets()));\n const paneDnd = dnd.create<DragMeta, DropMeta, PanesIntent>({\n collisionDetector: (context) => panesCollisionDetector(context, dragMode()),\n buildIntent: ({ over }) => over?.meta.target.intent ?? null,\n isSameIntent: samePanesIntent,\n onDragStart: ({ active, mode }) => {\n setDragMode(mode);\n setDraggedItemId(active.meta.itemId);\n },\n announcements: {\n dragStart: (active) => `Picked up ${active.meta.label}.`,\n dragOver: (active, over) => (over ? `Move ${active.meta.label} to ${over.meta.label}.` : `${active.meta.label} is not over a pane.`),\n drop: (active, over) => (over ? `Moved ${active.meta.label} to ${over.meta.label}.` : `Did not move ${active.meta.label}.`),\n cancel: (active) => `Cancelled moving ${active.meta.label}.`,\n },\n onDrop: ({ intent, mode }) => {\n setDragMode(null);\n setDraggedItemId(null);\n if (!intent) return;\n const current = layout();\n const next = applyPanesIntent(current, intent);\n if (next === current) return;\n props.onLayoutChange(next);\n if (mode === \"keyboard\") queueMicrotask(() => document.getElementById(`${instanceId}-${intent.itemId}-tab`)?.focus());\n },\n onCancel: () => {\n setDragMode(null);\n setDraggedItemId(null);\n },\n });\n const activate = (itemId: string) => {\n const current = layout();\n const next = activatePanesItem(current, itemId);\n if (next !== current) props.onLayoutChange(next);\n };\n const requestAdd = (targetItemId: string | null) => props.onAddItem?.(targetItemId);\n\n return (\n <div class={`k2b-panes ${props.class ?? \"\"}`} data-k2b-panes role=\"group\" aria-label={props.ariaLabel ?? messages().paneWorkspace}>\n <Show\n when={layout().root}\n fallback={\n <div class=\"k2b-panes__empty\">\n <Show when={props.onAddItem !== undefined}>\n <button type=\"button\" class=\"k2b-panes__add\" onClick={() => requestAdd(null)} aria-label={messages().addPane}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span>{messages().addPane}</span>\n </button>\n </Show>\n </div>\n }\n >\n {(root) => (\n <PanesNodeRenderer\n node={root}\n path={[]}\n layout={layout}\n itemById={items}\n dnd={paneDnd}\n dropTargetIndex={dropTargetIndex}\n instanceId={instanceId}\n canMove={canMove}\n canResize={canResize}\n addItem={requestAdd}\n canAdd={() => props.onAddItem !== undefined}\n onActivate={activate}\n onLayoutChange={props.onLayoutChange}\n />\n )}\n </Show>\n </div>\n );\n}\n\ntype RendererProps = {\n node: () => PanesNode;\n path: PanesPath;\n layout: () => PanesLayout;\n itemById: () => Map<string, PanesItem>;\n dnd: PaneDnd;\n dropTargetIndex: () => ReadonlyMap<string, IndexedPanesDropTargets>;\n instanceId: string;\n canMove: () => boolean;\n canResize: () => boolean;\n addItem: (targetItemId: string | null) => void;\n canAdd: () => boolean;\n onActivate: (itemId: string) => void;\n onLayoutChange: (layout: PanesLayout) => void;\n};\n\nfunction PanesNodeRenderer(props: RendererProps): JSX.Element {\n const split = createMemo(() => {\n const node = props.node();\n return node.type === \"split\" ? node : null;\n });\n const group = createMemo(() => {\n const node = props.node();\n return node.type === \"group\" ? node : null;\n });\n return (\n <>\n <Show when={split()}>{(node) => <PanesSplitRenderer {...props} node={node} />}</Show>\n <Show when={group()}>{(node) => <PanesGroupRenderer {...props} node={node} />}</Show>\n </>\n );\n}\n\nfunction PanesSplitRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesSplit }): JSX.Element {\n const messages = useUiMessages();\n let container: HTMLDivElement | undefined;\n let separatorElement: HTMLButtonElement | undefined;\n let stopResize: (() => void) | undefined;\n let finishResize: (() => void) | undefined;\n const stopActiveResize = () => {\n stopResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n const finishActiveResize = () => {\n finishResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n onCleanup(stopActiveResize);\n const commitRatio = (ratio: number) => {\n const current = props.layout();\n const next = resizePanesSplit(current, props.path, ratio);\n if (next !== current) props.onLayoutChange(next);\n };\n const resizeGeometry = (separator: HTMLElement | undefined) => {\n if (!separator) return null;\n const direction = props.node().direction;\n const containerRect = container?.getBoundingClientRect();\n const separatorRect = separator.getBoundingClientRect();\n const extent = direction === \"horizontal\" ? (containerRect?.width ?? 0) : (containerRect?.height ?? 0);\n const separatorExtent = direction === \"horizontal\" ? separatorRect.width : separatorRect.height;\n const availableExtent = extent - separatorExtent;\n if (!containerRect || availableExtent <= 0 || separatorRect.width <= 0 || separatorRect.height <= 0) return null;\n const geometry = (rect: DOMRect): PanesSeparatorGeometry =>\n direction === \"horizontal\"\n ? { coordinate: rect.left + rect.width / 2, crossStart: rect.top, crossEnd: rect.bottom }\n : { coordinate: rect.top + rect.height / 2, crossStart: rect.left, crossEnd: rect.right };\n const panes = separator.closest<HTMLElement>(\"[data-k2b-panes]\");\n const candidates = panes\n ? Array.from(panes.querySelectorAll<HTMLElement>(`.k2b-panes__separator[data-direction=\"${direction}\"]`))\n .filter((candidate) => candidate !== separator && candidate.closest(\"[data-k2b-panes]\") === panes)\n .map((candidate) => candidate.getBoundingClientRect())\n .filter((rect) => rect.width > 0 && rect.height > 0)\n .map(geometry)\n : [];\n const origin = direction === \"horizontal\" ? containerRect.left + separatorExtent / 2 : containerRect.top + separatorExtent / 2;\n return {\n source: geometry(separatorRect),\n candidates,\n coordinateForRatio: (ratio: number) => origin + availableExtent * ratio,\n ratioForCoordinate: (coordinate: number) => (coordinate - origin) / availableExtent,\n };\n };\n const startResize = (event: PointerEvent) => {\n if (!props.canResize()) return;\n event.preventDefault();\n stopActiveResize();\n const pointerId = event.pointerId;\n const captureTarget = (event.currentTarget as HTMLElement | null) ?? separatorElement;\n if (!captureTarget) return;\n const start = props.node().direction === \"horizontal\" ? event.clientX : event.clientY;\n const geometry = resizeGeometry(captureTarget);\n const startRatio = props.node().ratio;\n const startCoordinate = geometry?.source.coordinate;\n const rect = container?.getBoundingClientRect();\n const extent = Math.max(1, props.node().direction === \"horizontal\" ? (rect?.width ?? 1) : (rect?.height ?? 1));\n let snappedTo: number | null = null;\n let frame: number | undefined;\n let pendingRatio: number | undefined;\n const flush = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n if (pendingRatio === undefined) return;\n const ratio = pendingRatio;\n pendingRatio = undefined;\n commitRatio(ratio);\n };\n const onMove = (move: PointerEvent) => {\n if (move.pointerId !== pointerId) return;\n const current = props.node().direction === \"horizontal\" ? move.clientX : move.clientY;\n if (geometry && startCoordinate !== undefined) {\n const snapped = resolvePanesResizeSnap(startCoordinate + current - start, geometry.source, geometry.candidates, {\n activeCoordinate: snappedTo,\n });\n snappedTo = snapped.snappedTo;\n pendingRatio = geometry.ratioForCoordinate(snapped.coordinate);\n } else {\n pendingRatio = startRatio + (current - start) / extent;\n }\n if (frame === undefined) frame = requestAnimationFrame(flush);\n };\n const onEnd = (end: PointerEvent) => {\n if (end.pointerId === pointerId) finishActiveResize();\n };\n stopResize = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pendingRatio = undefined;\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n window.removeEventListener(\"blur\", finishActiveResize);\n if (captureTarget.hasPointerCapture?.(pointerId)) captureTarget.releasePointerCapture(pointerId);\n };\n finishResize = () => {\n flush();\n stopResize?.();\n };\n captureTarget.setPointerCapture?.(pointerId);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n window.addEventListener(\"blur\", finishActiveResize);\n };\n const onResizeKeyDown = (event: KeyboardEvent) => {\n if (!props.canResize()) return;\n const step = event.shiftKey ? 0.08 : 0.02;\n let ratio: number | null = null;\n if (event.key === \"Home\") ratio = PANES_MIN_RATIO;\n if (event.key === \"End\") ratio = 1 - PANES_MIN_RATIO;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowLeft\") ratio = props.node().ratio - step;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowRight\") ratio = props.node().ratio + step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowUp\") ratio = props.node().ratio - step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowDown\") ratio = props.node().ratio + step;\n if (ratio === null) return;\n event.preventDefault();\n const geometry = resizeGeometry((event.currentTarget as HTMLElement | null) ?? separatorElement);\n if (geometry) {\n const snapped = resolvePanesResizeSnap(geometry.coordinateForRatio(ratio), geometry.source, geometry.candidates, {\n previousCoordinate: geometry.source.coordinate,\n });\n ratio = geometry.ratioForCoordinate(snapped.coordinate);\n }\n commitRatio(ratio);\n };\n return (\n <div ref={container} class=\"k2b-panes__split\" data-direction={props.node().direction}>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().first} path={[...props.path, \"first\"]} />\n </div>\n <button\n ref={separatorElement}\n type=\"button\"\n role=\"separator\"\n aria-orientation={props.node().direction === \"horizontal\" ? \"vertical\" : \"horizontal\"}\n aria-valuemin={Math.round(PANES_MIN_RATIO * 100)}\n aria-valuemax={Math.round((1 - PANES_MIN_RATIO) * 100)}\n aria-valuenow={Math.round(props.node().ratio * 100)}\n aria-disabled={!props.canResize()}\n tabIndex={props.canResize() ? 0 : -1}\n class=\"k2b-panes__separator\"\n data-direction={props.node().direction}\n aria-label={messages().resizePanes}\n onPointerDown={startResize}\n onKeyDown={onResizeKeyDown}\n >\n <span aria-hidden=\"true\" />\n </button>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${1 - props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().second} path={[...props.path, \"second\"]} />\n </div>\n </div>\n );\n}\n\nfunction ActivePane(props: { itemId: string; itemById: () => Map<string, PanesItem> }): JSX.Element {\n return requireItem(props.itemById(), props.itemId).render();\n}\n\nfunction PanesGroupRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesGroup }): JSX.Element {\n const messages = useUiMessages();\n let tabsElement: HTMLDivElement | undefined;\n let scrollbarDragOffset = 0;\n let stopTabPress: (() => void) | undefined;\n let suppressedPointerClick: string | null = null;\n let clearSuppressedPointerClick: number | undefined;\n const dndInstanceId = createUniqueId();\n const draggableId = (id: string) => `panes-item:${dndInstanceId}:${id}`;\n const itemIds = createMemo(() => props.node().items);\n const groupTargets = createMemo<IndexedPanesDropTargets | null>(() => {\n const index = props.dropTargetIndex();\n for (const itemId of itemIds()) {\n const indexed = index.get(itemId);\n if (indexed) return indexed;\n }\n return null;\n });\n const targetBefore = (itemId: string) => groupTargets()?.tabs.get(itemId);\n const targetAtEnd = () => groupTargets()?.tabs.get(null);\n const bodyTargets = () => groupTargets()?.body ?? [];\n const startTabPress = (event: PointerEvent & { currentTarget: HTMLButtonElement }, itemId: string) => {\n if (event.button !== 0 || event.isPrimary === false) return;\n stopTabPress?.();\n const pointerId = event.pointerId;\n const button = event.currentTarget;\n const ownerWindow = window;\n const stop = () => {\n ownerWindow.removeEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.removeEventListener(\"pointercancel\", onPointerCancel, true);\n if (stopTabPress === stop) stopTabPress = undefined;\n };\n const onPointerUp = (up: PointerEvent) => {\n if (up.pointerId !== pointerId) return;\n const rect = button.getBoundingClientRect();\n const releasedInside = up.clientX >= rect.left && up.clientX <= rect.right && up.clientY >= rect.top && up.clientY <= rect.bottom;\n const shouldActivate = releasedInside && !props.dnd.isDragging();\n stop();\n if (!shouldActivate) return;\n suppressedPointerClick = itemId;\n if (clearSuppressedPointerClick !== undefined) ownerWindow.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = ownerWindow.setTimeout(() => {\n if (suppressedPointerClick === itemId) suppressedPointerClick = null;\n clearSuppressedPointerClick = undefined;\n }, 0);\n props.onActivate(itemId);\n };\n const onPointerCancel = (cancel: PointerEvent) => {\n if (cancel.pointerId === pointerId) stop();\n };\n stopTabPress = stop;\n ownerWindow.addEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.addEventListener(\"pointercancel\", onPointerCancel, true);\n };\n onCleanup(() => {\n stopTabPress?.();\n if (clearSuppressedPointerClick !== undefined) window.clearTimeout(clearSuppressedPointerClick);\n });\n const [scrollbar, setScrollbar] = createSignal({ overflow: false, left: 0, width: 0 });\n const syncScrollbar = () => {\n if (!tabsElement) return;\n const { clientWidth, scrollLeft, scrollWidth } = tabsElement;\n if (scrollWidth <= clientWidth || clientWidth <= 0) {\n setScrollbar({ overflow: false, left: 0, width: 0 });\n return;\n }\n const width = Math.min(clientWidth, Math.max(24, (clientWidth * clientWidth) / scrollWidth));\n const left = (scrollLeft / (scrollWidth - clientWidth)) * (clientWidth - width);\n setScrollbar({ overflow: true, left, width });\n };\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n if (!tabsElement) return;\n const track = event.currentTarget;\n const { left, width } = scrollbar();\n const rect = track.getBoundingClientRect();\n const available = Math.max(1, rect.width - width);\n const thumbLeft = Math.min(available, Math.max(0, event.clientX - rect.left - scrollbarDragOffset));\n tabsElement.scrollLeft = (thumbLeft / available) * (tabsElement.scrollWidth - tabsElement.clientWidth);\n syncScrollbar();\n };\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n event.preventDefault();\n const track = event.currentTarget;\n const current = scrollbar();\n scrollbarDragOffset =\n event.target === track\n ? current.width / 2\n : Math.min(current.width, Math.max(0, event.clientX - track.getBoundingClientRect().left - current.left));\n track.setPointerCapture(event.pointerId);\n scrollFromPointer(event);\n };\n onMount(() => {\n syncScrollbar();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbar);\n if (tabsElement) observer?.observe(tabsElement);\n onCleanup(() => observer?.disconnect());\n });\n createEffect(() => {\n itemIds().length;\n props.itemById();\n groupTargets();\n props.canAdd();\n queueMicrotask(syncScrollbar);\n });\n const tabId = (itemId: string) => `${props.instanceId}-${itemId}-tab`;\n const panelId = (itemId: string) => `${props.instanceId}-${itemId}-panel`;\n const focusTab = (index: number) => {\n const itemId = itemIds()[index];\n if (!itemId) return;\n props.onActivate(itemId);\n queueMicrotask(() => document.getElementById(tabId(itemId))?.focus());\n };\n const onTabKeyDown = (event: KeyboardEvent, index: number, itemId: string) => {\n if (props.dnd.activeId() === draggableId(itemId)) return;\n const item = requireItem(props.itemById(), itemId);\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && item.onClose) {\n event.preventDefault();\n item.onClose();\n return;\n }\n const count = itemIds().length;\n let next: number | null = null;\n if (event.key === \"ArrowLeft\") next = (index - 1 + count) % count;\n if (event.key === \"ArrowRight\") next = (index + 1) % count;\n if (event.key === \"Home\") next = 0;\n if (event.key === \"End\") next = count - 1;\n if (next === null) return;\n event.preventDefault();\n focusTab(next);\n };\n const targetLabel = (target: PanesDropTarget): string => {\n const targetItem = requireItem(props.itemById(), target.targetItemId);\n if (target.kind === \"group\") return messages().addToNamed({ name: targetItem.title });\n if (target.kind === \"tab\") {\n const before = target.beforeItemId ? requireItem(props.itemById(), target.beforeItemId) : null;\n return before ? messages().insertBeforeNamed({ name: before.title }) : messages().insertAtEnd;\n }\n return target.side\n ? messages().addPaneSide({ side: target.side, name: targetItem.title })\n : messages().addToNamed({ name: targetItem.title });\n };\n return (\n <section class=\"k2b-panes__group\">\n <div\n ref={tabsElement}\n class=\"k2b-panes__tabs\"\n role=\"tablist\"\n aria-label={messages().paneTabs}\n aria-orientation=\"horizontal\"\n onScroll={syncScrollbar}\n >\n <For each={itemIds()}>\n {(itemId, index) => {\n const item = () => requireItem(props.itemById(), itemId);\n const active = () => props.node().active === itemId;\n return (\n <div\n ref={(surface) =>\n props.dnd.draggable(surface, () => ({\n id: draggableId(itemId),\n meta: { itemId, label: item().title },\n disabled: !props.canMove(),\n focusable: false,\n keyboard: true,\n handleSelector: \".k2b-panes__tab-button\",\n }))\n }\n class=\"k2b-panes__tab\"\n data-active={active() ? \"true\" : undefined}\n data-closable={item().onClose !== undefined ? \"true\" : undefined}\n data-movable={props.canMove() ? \"true\" : undefined}\n data-dnd-active={props.dnd.activeId() === draggableId(itemId) ? \"true\" : undefined}\n >\n <Show when={targetBefore(itemId)}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab\" />}\n </Show>\n <button\n id={tabId(itemId)}\n type=\"button\"\n class=\"k2b-panes__tab-button\"\n role=\"tab\"\n aria-label={item().title}\n aria-selected={active()}\n aria-controls={active() ? panelId(itemId) : undefined}\n aria-posinset={index() + 1}\n aria-setsize={itemIds().length}\n aria-keyshortcuts={item().onClose ? \"Delete Backspace\" : undefined}\n tabIndex={active() ? 0 : -1}\n title={item().title}\n onPointerDown={(event) => startTabPress(event, itemId)}\n onClick={(event) => {\n if (event?.detail > 0 && suppressedPointerClick === itemId) {\n suppressedPointerClick = null;\n if (clearSuppressedPointerClick !== undefined) {\n window.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = undefined;\n }\n return;\n }\n props.onActivate(itemId);\n }}\n onKeyDown={(event) => onTabKeyDown(event, index(), itemId)}\n >\n <span class=\"k2b-ui k2b-panes__drag-surface k2b-panes__drag-preview\" data-dnd-preview>\n <i class={`${iconClass(item().icon)} k2b-panes__icon`} aria-hidden=\"true\" />\n <span>{item().title}</span>\n </span>\n </button>\n <Show when={item().onClose !== undefined}>\n <button\n type=\"button\"\n class=\"k2b-panes__close\"\n title={messages().closeNamed({ name: item().title })}\n aria-label={messages().closeNamed({ name: item().title })}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n item().onClose?.();\n }}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n );\n }}\n </For>\n <Show when={targetAtEnd()}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab-end\" />}\n </Show>\n <Show when={props.canAdd()}>\n <button\n type=\"button\"\n class=\"k2b-panes__add k2b-panes__add--tab\"\n aria-label={messages().addPane}\n title={messages().addPane}\n onClick={() => props.addItem(props.node().active)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n <Show when={scrollbar().overflow}>\n <div\n class=\"k2b-panes__tabs-scrollbar\"\n aria-hidden=\"true\"\n onPointerDown={startScrollbarDrag}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-panes-scroll-left\": `${scrollbar().left}px`,\n \"--k2b-panes-scroll-width\": `${scrollbar().width}px`,\n }}\n />\n </div>\n </Show>\n <div class=\"k2b-panes__body\">\n <div id={panelId(props.node().active)} class=\"k2b-panes__panel\" role=\"tabpanel\" aria-labelledby={tabId(props.node().active)}>\n <Show when={props.node().active} keyed>\n {(itemId) => <ActivePane itemId={itemId} itemById={props.itemById} />}\n </Show>\n </div>\n </div>\n <Show when={bodyTargets().length > 0}>\n <div class=\"k2b-panes__drop-targets\" aria-hidden=\"true\">\n <For each={bodyTargets()}>\n {(target) => <PanesDropTargetView target={target} label={targetLabel(target)} dnd={props.dnd} placement=\"body\" />}\n </For>\n </div>\n </Show>\n </section>\n );\n}\n\nfunction PanesDropTargetView(props: {\n target: PanesDropTarget;\n label: string;\n dnd: PaneDnd;\n placement: \"tab\" | \"tab-end\" | \"body\";\n}): JSX.Element {\n const icon = () => {\n if (props.target.kind === \"group\") return \"ti ti-plus\";\n if (props.target.kind === \"tab\") return props.placement === \"tab\" ? \"ti ti-spacing-horizontal\" : null;\n if (props.target.side === \"top\") return \"ti ti-row-insert-top\";\n if (props.target.side === \"bottom\") return \"ti ti-row-insert-bottom\";\n if (props.target.side === \"left\") return \"ti ti-column-insert-left\";\n return \"ti ti-column-insert-right\";\n };\n return (\n <div\n ref={(element) =>\n props.dnd.droppable(element, () => ({\n id: `panes-target:${props.target.id}`,\n meta: { target: props.target, label: props.label },\n }))\n }\n class=\"k2b-panes__drop-target\"\n data-kind={props.target.kind}\n data-placement={props.placement}\n data-zone={props.target.side}\n data-active={props.dnd.overId() === `panes-target:${props.target.id}` ? \"true\" : undefined}\n title={props.label}\n aria-hidden=\"true\"\n >\n <Show when={icon()} keyed>\n {(iconClass) => <i class={iconClass} aria-hidden=\"true\" />}\n </Show>\n <Show when={props.target.kind === \"split\"}>\n <span>{props.label}</span>\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/Panes.tsx"],"sourcesContent":["import { type DndCollisionContext, type DndController, type DndDroppableSnapshot, dnd } from \"@k2b/stdlib/solid\";\nimport { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n activatePanesItem,\n applyPanesIntent,\n getPanesDropTargets,\n PANES_MAX_ID_LENGTH,\n PANES_MIN_RATIO,\n type PanesDropTarget,\n type PanesGroup,\n type PanesIntent,\n type PanesLayout,\n type PanesNode,\n type PanesPath,\n type PanesSplit,\n parsePanesLayout,\n resizePanesSplit,\n samePanesIntent,\n} from \"./panes-layout\";\nimport { assertUniqueStableUiIds } from \"./stable-id\";\n\nexport type PanesItem = {\n id: string;\n title: string;\n icon?: string;\n render: () => JSX.Element;\n onClose?: () => void;\n};\n\nexport type PanesProps = {\n layout: PanesLayout;\n onLayoutChange: (layout: PanesLayout) => void;\n items: readonly PanesItem[];\n movable?: boolean;\n resizable?: boolean;\n split?: false | \"horizontal\" | \"vertical\" | \"both\";\n onAddItem?: (targetItemId: string | null) => void;\n ariaLabel?: string;\n class?: string;\n};\n\ntype DragMeta = { itemId: string; label: string };\ntype DropMeta = { target: PanesDropTarget; label: string };\ntype PaneDnd = DndController<DragMeta, DropMeta, PanesIntent>;\n\ntype IndexedPanesDropTargets = {\n tabs: ReadonlyMap<string | null, PanesDropTarget>;\n body: readonly PanesDropTarget[];\n};\n\ntype PanesSeparatorGeometry = {\n coordinate: number;\n crossStart: number;\n crossEnd: number;\n};\n\nconst PANES_RESIZE_SNAP_DISTANCE = 8;\nconst PANES_RESIZE_UNSNAP_DISTANCE = 12;\nconst PANES_RESIZE_NEIGHBOR_GAP = 16;\n\nconst intervalGap = (left: PanesSeparatorGeometry, right: PanesSeparatorGeometry): number =>\n left.crossEnd < right.crossStart\n ? right.crossStart - left.crossEnd\n : right.crossEnd < left.crossStart\n ? left.crossStart - right.crossEnd\n : 0;\n\nexport const resolvePanesResizeSnap = (\n coordinate: number,\n source: PanesSeparatorGeometry,\n candidates: readonly PanesSeparatorGeometry[],\n options: { activeCoordinate?: number | null; previousCoordinate?: number } = {},\n): { coordinate: number; snappedTo: number | null } => {\n const neighbors = candidates.filter((candidate) => {\n const gap = intervalGap(source, candidate);\n return gap > 0 && gap <= PANES_RESIZE_NEIGHBOR_GAP;\n });\n const activeCoordinate = options.activeCoordinate;\n const active =\n activeCoordinate === null || activeCoordinate === undefined\n ? null\n : neighbors.find((candidate) => Math.abs(candidate.coordinate - activeCoordinate) < 0.5);\n if (active && Math.abs(coordinate - active.coordinate) <= PANES_RESIZE_UNSNAP_DISTANCE) {\n return { coordinate: active.coordinate, snappedTo: active.coordinate };\n }\n\n const previous = options.previousCoordinate;\n let winner: PanesSeparatorGeometry | null = null;\n let winnerDistance = Number.POSITIVE_INFINITY;\n for (const candidate of neighbors) {\n if (previous !== undefined && Math.abs(candidate.coordinate - previous) < 0.5) continue;\n const distanceToRange =\n previous === undefined ||\n candidate.coordinate < Math.min(previous, coordinate) ||\n candidate.coordinate > Math.max(previous, coordinate)\n ? Math.abs(candidate.coordinate - coordinate)\n : 0;\n const distanceToCoordinate = Math.abs(candidate.coordinate - coordinate);\n if (distanceToRange <= PANES_RESIZE_SNAP_DISTANCE && distanceToCoordinate < winnerDistance) {\n winner = candidate;\n winnerDistance = distanceToCoordinate;\n }\n }\n return winner ? { coordinate: winner.coordinate, snappedTo: winner.coordinate } : { coordinate, snappedTo: null };\n};\n\nexport const indexPanesDropTargets = (targets: readonly PanesDropTarget[]): ReadonlyMap<string, IndexedPanesDropTargets> => {\n const mutable = new Map<string, { tabs: Map<string | null, PanesDropTarget>; body: PanesDropTarget[] }>();\n for (const target of targets) {\n let indexed = mutable.get(target.targetItemId);\n if (!indexed) {\n indexed = { tabs: new Map(), body: [] };\n mutable.set(target.targetItemId, indexed);\n }\n if (target.kind === \"tab\") indexed.tabs.set(target.beforeItemId ?? null, target);\n else indexed.body.push(target);\n }\n return mutable;\n};\n\nconst iconClass = (icon: string | undefined): string => {\n const value = icon?.trim() || \"ti-layout-sidebar-right\";\n return value.startsWith(\"ti \") ? value : `ti ${value}`;\n};\n\nconst collectLayoutItemIds = (node: PanesNode | null, ids: string[] = []): string[] => {\n if (!node) return ids;\n if (node.type === \"group\") ids.push(...node.items);\n else {\n collectLayoutItemIds(node.first, ids);\n collectLayoutItemIds(node.second, ids);\n }\n return ids;\n};\n\nconst nearestDroppable = (entries: DndDroppableSnapshot<DropMeta>[]): DndDroppableSnapshot<DropMeta> | null =>\n entries.reduce<DndDroppableSnapshot<DropMeta> | null>(\n (winner, entry) => (!winner || entry.distance < winner.distance ? entry : winner),\n null,\n );\n\nexport const pointerHitsPanesDropTarget = (\n entry: Pick<DndDroppableSnapshot<DropMeta>, \"containsPointer\" | \"meta\" | \"rect\"> &\n Partial<Pick<DndDroppableSnapshot<DropMeta>, \"element\">>,\n pointer: { x: number; y: number },\n hitElement?: Element | null,\n): boolean => {\n if (hitElement !== undefined && !entry.element?.contains(hitElement)) return false;\n const side = entry.meta.target.side;\n if (entry.meta.target.kind !== \"split\" || !side) return entry.containsPointer;\n if (!entry.containsPointer) return false;\n const x = pointer.x - entry.rect.left;\n const y = pointer.y - entry.rect.top;\n if (side === \"top\") return x >= y && x <= entry.rect.width - y;\n if (side === \"bottom\") {\n const corner = entry.rect.height - y;\n return x >= corner && x <= entry.rect.width - corner;\n }\n if (side === \"left\") return y >= x && y <= entry.rect.height - x;\n const corner = entry.rect.width - x;\n return y >= corner && y <= entry.rect.height - corner;\n};\n\nconst panesCollisionDetector = (\n context: DndCollisionContext<DragMeta, DropMeta, PanesIntent>,\n mode: \"pointer\" | \"keyboard\" | null,\n): string | null => {\n const document = mode === \"pointer\" ? context.droppables[0]?.element.ownerDocument : undefined;\n const hitElement = document?.elementFromPoint(context.pointer.x, context.pointer.y) ?? undefined;\n return nearestDroppable(context.droppables.filter((entry) => pointerHitsPanesDropTarget(entry, context.pointer, hitElement)))?.id ?? null;\n};\n\nconst createItemMap = (items: readonly PanesItem[]): Map<string, PanesItem> => {\n assertUniqueStableUiIds(\n items.map((item) => item.id),\n \"Panes item id\",\n PANES_MAX_ID_LENGTH,\n );\n return new Map(items.map((item) => [item.id, item]));\n};\n\nconst requireItem = (items: Map<string, PanesItem>, id: string): PanesItem => {\n const item = items.get(id);\n if (!item) throw new Error(`Panes layout references missing item \"${id}\".`);\n return item;\n};\n\nexport default function Panes(props: PanesProps): JSX.Element {\n const messages = useUiMessages();\n const instanceId = `k2b-panes-${createUniqueId()}`;\n const items = createMemo(() => createItemMap(props.items));\n const layout = createMemo(() => {\n if (!parsePanesLayout(props.layout)) throw new Error(\"Panes layout must be a valid version 2 layout.\");\n for (const id of collectLayoutItemIds(props.layout.root)) requireItem(items(), id);\n return props.layout;\n });\n const canMove = () => props.movable ?? true;\n const canResize = () => props.resizable ?? true;\n const split = () => props.split ?? \"both\";\n const [draggedItemId, setDraggedItemId] = createSignal<string | null>(null);\n const [dragMode, setDragMode] = createSignal<\"pointer\" | \"keyboard\" | null>(null);\n const dropTargets = createMemo(() => {\n const itemId = draggedItemId();\n return itemId ? getPanesDropTargets(layout(), itemId, { movable: canMove(), split: split() }) : [];\n });\n const dropTargetIndex = createMemo(() => indexPanesDropTargets(dropTargets()));\n const paneDnd = dnd.create<DragMeta, DropMeta, PanesIntent>({\n collisionDetector: (context) => panesCollisionDetector(context, dragMode()),\n buildIntent: ({ over }) => over?.meta.target.intent ?? null,\n isSameIntent: samePanesIntent,\n onDragStart: ({ active, mode }) => {\n setDragMode(mode);\n setDraggedItemId(active.meta.itemId);\n },\n announcements: {\n dragStart: (active) => `Picked up ${active.meta.label}.`,\n dragOver: (active, over) => (over ? `Move ${active.meta.label} to ${over.meta.label}.` : `${active.meta.label} is not over a pane.`),\n drop: (active, over) => (over ? `Moved ${active.meta.label} to ${over.meta.label}.` : `Did not move ${active.meta.label}.`),\n cancel: (active) => `Cancelled moving ${active.meta.label}.`,\n },\n onDrop: ({ intent, mode }) => {\n setDragMode(null);\n setDraggedItemId(null);\n if (!intent) return;\n const current = layout();\n const next = applyPanesIntent(current, intent);\n if (next === current) return;\n props.onLayoutChange(next);\n if (mode === \"keyboard\") queueMicrotask(() => document.getElementById(`${instanceId}-${intent.itemId}-tab`)?.focus());\n },\n onCancel: () => {\n setDragMode(null);\n setDraggedItemId(null);\n },\n });\n const activate = (itemId: string) => {\n const current = layout();\n const next = activatePanesItem(current, itemId);\n if (next !== current) props.onLayoutChange(next);\n };\n const requestAdd = (targetItemId: string | null) => props.onAddItem?.(targetItemId);\n\n return (\n <div class={`k2b-panes ${props.class ?? \"\"}`} data-k2b-panes role=\"group\" aria-label={props.ariaLabel ?? messages().paneWorkspace}>\n <Show\n when={layout().root}\n fallback={\n <div class=\"k2b-panes__empty\">\n <Show when={props.onAddItem !== undefined}>\n <button type=\"button\" class=\"k2b-panes__add\" onClick={() => requestAdd(null)} aria-label={messages().addPane}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span>{messages().addPane}</span>\n </button>\n </Show>\n </div>\n }\n >\n {(root) => (\n <PanesNodeRenderer\n node={root}\n path={[]}\n layout={layout}\n itemById={items}\n dnd={paneDnd}\n dropTargetIndex={dropTargetIndex}\n instanceId={instanceId}\n canMove={canMove}\n canResize={canResize}\n addItem={requestAdd}\n canAdd={() => props.onAddItem !== undefined}\n onActivate={activate}\n onLayoutChange={props.onLayoutChange}\n />\n )}\n </Show>\n </div>\n );\n}\n\ntype RendererProps = {\n node: () => PanesNode;\n path: PanesPath;\n layout: () => PanesLayout;\n itemById: () => Map<string, PanesItem>;\n dnd: PaneDnd;\n dropTargetIndex: () => ReadonlyMap<string, IndexedPanesDropTargets>;\n instanceId: string;\n canMove: () => boolean;\n canResize: () => boolean;\n addItem: (targetItemId: string | null) => void;\n canAdd: () => boolean;\n onActivate: (itemId: string) => void;\n onLayoutChange: (layout: PanesLayout) => void;\n};\n\nfunction PanesNodeRenderer(props: RendererProps): JSX.Element {\n const split = createMemo(() => {\n const node = props.node();\n return node.type === \"split\" ? node : null;\n });\n const group = createMemo(() => {\n const node = props.node();\n return node.type === \"group\" ? node : null;\n });\n return (\n <>\n <Show when={split()}>{(node) => <PanesSplitRenderer {...props} node={node} />}</Show>\n <Show when={group()}>{(node) => <PanesGroupRenderer {...props} node={node} />}</Show>\n </>\n );\n}\n\nfunction PanesSplitRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesSplit }): JSX.Element {\n const messages = useUiMessages();\n let container: HTMLDivElement | undefined;\n let separatorElement: HTMLButtonElement | undefined;\n let stopResize: (() => void) | undefined;\n let finishResize: (() => void) | undefined;\n const stopActiveResize = () => {\n stopResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n const finishActiveResize = () => {\n finishResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n onCleanup(stopActiveResize);\n const commitRatio = (ratio: number) => {\n const current = props.layout();\n const next = resizePanesSplit(current, props.path, ratio);\n if (next !== current) props.onLayoutChange(next);\n };\n const resizeGeometry = (separator: HTMLElement | undefined) => {\n if (!separator) return null;\n const direction = props.node().direction;\n const containerRect = container?.getBoundingClientRect();\n const separatorRect = separator.getBoundingClientRect();\n const extent = direction === \"horizontal\" ? (containerRect?.width ?? 0) : (containerRect?.height ?? 0);\n const separatorExtent = direction === \"horizontal\" ? separatorRect.width : separatorRect.height;\n const availableExtent = extent - separatorExtent;\n if (!containerRect || availableExtent <= 0 || separatorRect.width <= 0 || separatorRect.height <= 0) return null;\n const geometry = (rect: DOMRect): PanesSeparatorGeometry =>\n direction === \"horizontal\"\n ? { coordinate: rect.left + rect.width / 2, crossStart: rect.top, crossEnd: rect.bottom }\n : { coordinate: rect.top + rect.height / 2, crossStart: rect.left, crossEnd: rect.right };\n const panes = separator.closest<HTMLElement>(\"[data-k2b-panes]\");\n const candidates = panes\n ? Array.from(panes.querySelectorAll<HTMLElement>(`.k2b-panes__separator[data-direction=\"${direction}\"]`))\n .filter((candidate) => candidate !== separator && candidate.closest(\"[data-k2b-panes]\") === panes)\n .map((candidate) => candidate.getBoundingClientRect())\n .filter((rect) => rect.width > 0 && rect.height > 0)\n .map(geometry)\n : [];\n const origin = direction === \"horizontal\" ? containerRect.left + separatorExtent / 2 : containerRect.top + separatorExtent / 2;\n return {\n source: geometry(separatorRect),\n candidates,\n coordinateForRatio: (ratio: number) => origin + availableExtent * ratio,\n ratioForCoordinate: (coordinate: number) => (coordinate - origin) / availableExtent,\n };\n };\n const startResize = (event: PointerEvent) => {\n if (!props.canResize()) return;\n event.preventDefault();\n stopActiveResize();\n const pointerId = event.pointerId;\n const captureTarget = (event.currentTarget as HTMLElement | null) ?? separatorElement;\n if (!captureTarget) return;\n const start = props.node().direction === \"horizontal\" ? event.clientX : event.clientY;\n const geometry = resizeGeometry(captureTarget);\n const startRatio = props.node().ratio;\n const startCoordinate = geometry?.source.coordinate;\n const rect = container?.getBoundingClientRect();\n const extent = Math.max(1, props.node().direction === \"horizontal\" ? (rect?.width ?? 1) : (rect?.height ?? 1));\n let snappedTo: number | null = null;\n let frame: number | undefined;\n let pendingRatio: number | undefined;\n const flush = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n if (pendingRatio === undefined) return;\n const ratio = pendingRatio;\n pendingRatio = undefined;\n commitRatio(ratio);\n };\n const onMove = (move: PointerEvent) => {\n if (move.pointerId !== pointerId) return;\n const current = props.node().direction === \"horizontal\" ? move.clientX : move.clientY;\n if (geometry && startCoordinate !== undefined) {\n const snapped = resolvePanesResizeSnap(startCoordinate + current - start, geometry.source, geometry.candidates, {\n activeCoordinate: snappedTo,\n });\n snappedTo = snapped.snappedTo;\n pendingRatio = geometry.ratioForCoordinate(snapped.coordinate);\n } else {\n pendingRatio = startRatio + (current - start) / extent;\n }\n if (frame === undefined) frame = requestAnimationFrame(flush);\n };\n const onEnd = (end: PointerEvent) => {\n if (end.pointerId === pointerId) finishActiveResize();\n };\n stopResize = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pendingRatio = undefined;\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n window.removeEventListener(\"blur\", finishActiveResize);\n if (captureTarget.hasPointerCapture?.(pointerId)) captureTarget.releasePointerCapture(pointerId);\n };\n finishResize = () => {\n flush();\n stopResize?.();\n };\n captureTarget.setPointerCapture?.(pointerId);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n window.addEventListener(\"blur\", finishActiveResize);\n };\n const onResizeKeyDown = (event: KeyboardEvent) => {\n if (!props.canResize()) return;\n const step = event.shiftKey ? 0.08 : 0.02;\n let ratio: number | null = null;\n if (event.key === \"Home\") ratio = PANES_MIN_RATIO;\n if (event.key === \"End\") ratio = 1 - PANES_MIN_RATIO;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowLeft\") ratio = props.node().ratio - step;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowRight\") ratio = props.node().ratio + step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowUp\") ratio = props.node().ratio - step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowDown\") ratio = props.node().ratio + step;\n if (ratio === null) return;\n event.preventDefault();\n const geometry = resizeGeometry((event.currentTarget as HTMLElement | null) ?? separatorElement);\n if (geometry) {\n const snapped = resolvePanesResizeSnap(geometry.coordinateForRatio(ratio), geometry.source, geometry.candidates, {\n previousCoordinate: geometry.source.coordinate,\n });\n ratio = geometry.ratioForCoordinate(snapped.coordinate);\n }\n commitRatio(ratio);\n };\n return (\n <div ref={container} class=\"k2b-panes__split\" data-direction={props.node().direction}>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().first} path={[...props.path, \"first\"]} />\n </div>\n <button\n ref={separatorElement}\n type=\"button\"\n role=\"separator\"\n aria-orientation={props.node().direction === \"horizontal\" ? \"vertical\" : \"horizontal\"}\n aria-valuemin={Math.round(PANES_MIN_RATIO * 100)}\n aria-valuemax={Math.round((1 - PANES_MIN_RATIO) * 100)}\n aria-valuenow={Math.round(props.node().ratio * 100)}\n aria-disabled={!props.canResize()}\n tabIndex={props.canResize() ? 0 : -1}\n class=\"k2b-panes__separator\"\n data-direction={props.node().direction}\n aria-label={messages().resizePanes}\n onPointerDown={startResize}\n onKeyDown={onResizeKeyDown}\n >\n <span aria-hidden=\"true\" />\n </button>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${1 - props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().second} path={[...props.path, \"second\"]} />\n </div>\n </div>\n );\n}\n\nfunction ActivePane(props: { itemId: string; itemById: () => Map<string, PanesItem> }): JSX.Element {\n return requireItem(props.itemById(), props.itemId).render();\n}\n\nfunction PanesGroupRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesGroup }): JSX.Element {\n const messages = useUiMessages();\n let tabsElement: HTMLDivElement | undefined;\n let scrollbarDragOffset = 0;\n let stopTabPress: (() => void) | undefined;\n let suppressedPointerClick: string | null = null;\n let clearSuppressedPointerClick: number | undefined;\n const dndInstanceId = createUniqueId();\n const draggableId = (id: string) => `panes-item:${dndInstanceId}:${id}`;\n const itemIds = createMemo(() => props.node().items);\n const groupTargets = createMemo<IndexedPanesDropTargets | null>(() => {\n const index = props.dropTargetIndex();\n for (const itemId of itemIds()) {\n const indexed = index.get(itemId);\n if (indexed) return indexed;\n }\n return null;\n });\n const targetBefore = (itemId: string) => groupTargets()?.tabs.get(itemId);\n const targetAtEnd = () => groupTargets()?.tabs.get(null);\n const bodyTargets = () => groupTargets()?.body ?? [];\n const startTabPress = (event: PointerEvent & { currentTarget: HTMLButtonElement }, itemId: string) => {\n if (event.button !== 0 || event.isPrimary === false) return;\n stopTabPress?.();\n const pointerId = event.pointerId;\n const button = event.currentTarget;\n const ownerWindow = window;\n const stop = () => {\n ownerWindow.removeEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.removeEventListener(\"pointercancel\", onPointerCancel, true);\n if (stopTabPress === stop) stopTabPress = undefined;\n };\n const onPointerUp = (up: PointerEvent) => {\n if (up.pointerId !== pointerId) return;\n const rect = button.getBoundingClientRect();\n const releasedInside = up.clientX >= rect.left && up.clientX <= rect.right && up.clientY >= rect.top && up.clientY <= rect.bottom;\n const shouldActivate = releasedInside && !props.dnd.isDragging();\n stop();\n if (!shouldActivate) return;\n suppressedPointerClick = itemId;\n if (clearSuppressedPointerClick !== undefined) ownerWindow.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = ownerWindow.setTimeout(() => {\n if (suppressedPointerClick === itemId) suppressedPointerClick = null;\n clearSuppressedPointerClick = undefined;\n }, 0);\n props.onActivate(itemId);\n };\n const onPointerCancel = (cancel: PointerEvent) => {\n if (cancel.pointerId === pointerId) stop();\n };\n stopTabPress = stop;\n ownerWindow.addEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.addEventListener(\"pointercancel\", onPointerCancel, true);\n };\n onCleanup(() => {\n stopTabPress?.();\n if (clearSuppressedPointerClick !== undefined) window.clearTimeout(clearSuppressedPointerClick);\n });\n const [scrollbar, setScrollbar] = createSignal({ overflow: false, left: 0, width: 0 });\n const syncScrollbar = () => {\n if (!tabsElement) return;\n const { clientWidth, scrollLeft, scrollWidth } = tabsElement;\n if (scrollWidth <= clientWidth || clientWidth <= 0) {\n setScrollbar({ overflow: false, left: 0, width: 0 });\n return;\n }\n const width = Math.min(clientWidth, Math.max(24, (clientWidth * clientWidth) / scrollWidth));\n const left = (scrollLeft / (scrollWidth - clientWidth)) * (clientWidth - width);\n setScrollbar({ overflow: true, left, width });\n };\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n if (!tabsElement) return;\n const track = event.currentTarget;\n const { left, width } = scrollbar();\n const rect = track.getBoundingClientRect();\n const available = Math.max(1, rect.width - width);\n const thumbLeft = Math.min(available, Math.max(0, event.clientX - rect.left - scrollbarDragOffset));\n tabsElement.scrollLeft = (thumbLeft / available) * (tabsElement.scrollWidth - tabsElement.clientWidth);\n syncScrollbar();\n };\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n event.preventDefault();\n const track = event.currentTarget;\n const current = scrollbar();\n scrollbarDragOffset =\n event.target === track\n ? current.width / 2\n : Math.min(current.width, Math.max(0, event.clientX - track.getBoundingClientRect().left - current.left));\n track.setPointerCapture(event.pointerId);\n scrollFromPointer(event);\n };\n onMount(() => {\n syncScrollbar();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbar);\n if (tabsElement) observer?.observe(tabsElement);\n onCleanup(() => observer?.disconnect());\n });\n createEffect(() => {\n itemIds().length;\n props.itemById();\n groupTargets();\n props.canAdd();\n queueMicrotask(syncScrollbar);\n });\n const tabId = (itemId: string) => `${props.instanceId}-${itemId}-tab`;\n const panelId = (itemId: string) => `${props.instanceId}-${itemId}-panel`;\n const focusTab = (index: number) => {\n const itemId = itemIds()[index];\n if (!itemId) return;\n props.onActivate(itemId);\n queueMicrotask(() => document.getElementById(tabId(itemId))?.focus());\n };\n const onTabKeyDown = (event: KeyboardEvent, index: number, itemId: string) => {\n if (props.dnd.activeId() === draggableId(itemId)) return;\n const item = requireItem(props.itemById(), itemId);\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && item.onClose) {\n event.preventDefault();\n item.onClose();\n return;\n }\n const count = itemIds().length;\n let next: number | null = null;\n if (event.key === \"ArrowLeft\") next = (index - 1 + count) % count;\n if (event.key === \"ArrowRight\") next = (index + 1) % count;\n if (event.key === \"Home\") next = 0;\n if (event.key === \"End\") next = count - 1;\n if (next === null) return;\n event.preventDefault();\n focusTab(next);\n };\n const targetLabel = (target: PanesDropTarget): string => {\n const targetItem = requireItem(props.itemById(), target.targetItemId);\n if (target.kind === \"group\") return messages().addToNamed({ name: targetItem.title });\n if (target.kind === \"tab\") {\n const before = target.beforeItemId ? requireItem(props.itemById(), target.beforeItemId) : null;\n return before ? messages().insertBeforeNamed({ name: before.title }) : messages().insertAtEnd;\n }\n return target.side\n ? messages().addPaneSide({ side: target.side, name: targetItem.title })\n : messages().addToNamed({ name: targetItem.title });\n };\n return (\n <section class=\"k2b-panes__group\">\n <div\n ref={tabsElement}\n class=\"k2b-panes__tabs\"\n role=\"tablist\"\n aria-label={messages().paneTabs}\n aria-orientation=\"horizontal\"\n onScroll={syncScrollbar}\n >\n <For each={itemIds()}>\n {(itemId, index) => {\n const item = () => requireItem(props.itemById(), itemId);\n const active = () => props.node().active === itemId;\n return (\n <div\n ref={(surface) =>\n props.dnd.draggable(surface, () => ({\n id: draggableId(itemId),\n meta: { itemId, label: item().title },\n disabled: !props.canMove(),\n focusable: false,\n keyboard: true,\n handleSelector: \".k2b-panes__tab-button\",\n }))\n }\n class=\"k2b-panes__tab\"\n data-active={active() ? \"true\" : undefined}\n data-closable={item().onClose !== undefined ? \"true\" : undefined}\n data-movable={props.canMove() ? \"true\" : undefined}\n data-dnd-active={props.dnd.activeId() === draggableId(itemId) ? \"true\" : undefined}\n >\n <Show when={targetBefore(itemId)}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab\" />}\n </Show>\n <button\n id={tabId(itemId)}\n type=\"button\"\n class=\"k2b-panes__tab-button\"\n role=\"tab\"\n aria-label={item().title}\n aria-selected={active()}\n aria-controls={active() ? panelId(itemId) : undefined}\n aria-posinset={index() + 1}\n aria-setsize={itemIds().length}\n aria-keyshortcuts={item().onClose ? \"Delete Backspace\" : undefined}\n tabIndex={active() ? 0 : -1}\n title={item().title}\n onPointerDown={(event) => startTabPress(event, itemId)}\n onClick={(event) => {\n if (event?.detail > 0 && suppressedPointerClick === itemId) {\n suppressedPointerClick = null;\n if (clearSuppressedPointerClick !== undefined) {\n window.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = undefined;\n }\n return;\n }\n props.onActivate(itemId);\n }}\n onKeyDown={(event) => onTabKeyDown(event, index(), itemId)}\n >\n <span class=\"k2b-ui k2b-panes__drag-surface k2b-panes__drag-preview\" data-dnd-preview>\n <i class={`${iconClass(item().icon)} k2b-panes__icon`} aria-hidden=\"true\" />\n <span>{item().title}</span>\n </span>\n </button>\n <Show when={item().onClose !== undefined}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-panes__close\"\n content={messages().closeNamed({ name: item().title })}\n aria-label={messages().closeNamed({ name: item().title })}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n item().onClose?.();\n }}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </div>\n );\n }}\n </For>\n <Show when={targetAtEnd()}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab-end\" />}\n </Show>\n <Show when={props.canAdd()}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-panes__add k2b-panes__add--tab\"\n aria-label={messages().addPane}\n content={messages().addPane}\n onClick={() => props.addItem(props.node().active)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </div>\n <Show when={scrollbar().overflow}>\n <div\n class=\"k2b-panes__tabs-scrollbar\"\n aria-hidden=\"true\"\n onPointerDown={startScrollbarDrag}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-panes-scroll-left\": `${scrollbar().left}px`,\n \"--k2b-panes-scroll-width\": `${scrollbar().width}px`,\n }}\n />\n </div>\n </Show>\n <div class=\"k2b-panes__body\">\n <div id={panelId(props.node().active)} class=\"k2b-panes__panel\" role=\"tabpanel\" aria-labelledby={tabId(props.node().active)}>\n <Show when={props.node().active} keyed>\n {(itemId) => <ActivePane itemId={itemId} itemById={props.itemById} />}\n </Show>\n </div>\n </div>\n <Show when={bodyTargets().length > 0}>\n <div class=\"k2b-panes__drop-targets\" aria-hidden=\"true\">\n <For each={bodyTargets()}>\n {(target) => <PanesDropTargetView target={target} label={targetLabel(target)} dnd={props.dnd} placement=\"body\" />}\n </For>\n </div>\n </Show>\n </section>\n );\n}\n\nfunction PanesDropTargetView(props: {\n target: PanesDropTarget;\n label: string;\n dnd: PaneDnd;\n placement: \"tab\" | \"tab-end\" | \"body\";\n}): JSX.Element {\n const icon = () => {\n if (props.target.kind === \"group\") return \"ti ti-plus\";\n if (props.target.kind === \"tab\") return props.placement === \"tab\" ? \"ti ti-spacing-horizontal\" : null;\n if (props.target.side === \"top\") return \"ti ti-row-insert-top\";\n if (props.target.side === \"bottom\") return \"ti ti-row-insert-bottom\";\n if (props.target.side === \"left\") return \"ti ti-column-insert-left\";\n return \"ti ti-column-insert-right\";\n };\n return (\n <div\n ref={(element) =>\n props.dnd.droppable(element, () => ({\n id: `panes-target:${props.target.id}`,\n meta: { target: props.target, label: props.label },\n }))\n }\n class=\"k2b-panes__drop-target\"\n data-kind={props.target.kind}\n data-placement={props.placement}\n data-zone={props.target.side}\n data-active={props.dnd.overId() === `panes-target:${props.target.id}` ? \"true\" : undefined}\n title={props.label}\n aria-hidden=\"true\"\n >\n <Show when={icon()} keyed>\n {(iconClass) => <i class={iconClass} aria-hidden=\"true\" />}\n </Show>\n <Show when={props.target.kind === \"split\"}>\n <span>{props.label}</span>\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -2,132 +2,60 @@ import { createComponent as _$createComponent } from "solid-js/web";
2
2
  import { ssr as _$ssr } from "solid-js/web";
3
3
  import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
4
  import { escape as _$escape } from "solid-js/web";
5
- var _tmpl$ = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-item-action k2b-app-workspace__sidebar-preview-trigger\" data-visibility=\"hover\"", " aria-haspopup=\"dialog\"", "><i", " aria-hidden=\"true\"></i></button>"],
6
- _tmpl$2 = ["<div", " popover=\"auto\" role=\"dialog\"", " tabindex=\"-1\" class=\"k2b-app-workspace__sidebar-preview\">", "</div>"];
7
- import { createSignal, createUniqueId, onCleanup, onMount } from "solid-js";
8
- import { positionTooltipSurface } from "../feedback/tooltip-position";
5
+ var _tmpl$ = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-item-action k2b-app-workspace__sidebar-preview-trigger\" data-visibility=\"hover\"", " aria-haspopup=\"dialog\"", "><i", " aria-hidden=\"true\"></i></button>"];
6
+ import { createSignal, onCleanup, onMount } from "solid-js";
7
+ import { createHoverPreview, HoverPreview } from "../feedback/HoverPreview";
9
8
  import { ScrollArea } from "./ScrollArea";
10
9
 
11
- /** A non-modal, interactive row preview. Native popover owns light dismissal. */
10
+ /** A non-modal, interactive row preview built on the shared hover preview card. */
12
11
  export function SidebarItemPreview(props) {
13
- const id = `sidebar-preview-${createUniqueId()}`;
14
12
  const [open, setOpen] = createSignal(false);
15
13
  let button;
16
- let panel;
17
- let row = null;
18
14
  let main = null;
19
- let timer;
20
- let pinned = false;
21
- let dismissed = false;
22
- const clear = () => {
23
- clearTimeout(timer);
24
- timer = undefined;
25
- };
26
- const close = () => {
27
- clear();
28
- panel.hidePopover();
29
- };
30
- const position = () => {
31
- const target = row ?? button;
32
- positionTooltipSurface(panel, target, "right");
33
- if (props.align === "end") {
34
- const height = panel.getBoundingClientRect().height;
35
- const bottom = target.getBoundingClientRect().bottom;
36
- panel.style.top = `${Math.round(Math.max(8, Math.min(bottom - height, window.innerHeight - height - 8)))}px`;
37
- }
38
- };
39
- const show = () => {
40
- clear();
41
- if (dismissed || open()) return;
42
- panel.showPopover();
43
- position();
44
- };
45
- const enter = () => {
46
- clear();
47
- if (!dismissed && !open()) timer = setTimeout(show, 250);
48
- };
49
- const leave = () => {
50
- clear();
51
- dismissed = false;
52
- if (!pinned) timer = setTimeout(() => {
53
- if (!panel.contains(document.activeElement) && !row?.contains(document.activeElement)) close();
54
- }, 180);
55
- };
56
- const dismiss = () => {
57
- const restore = panel.contains(document.activeElement);
58
- dismissed = true;
59
- close();
60
- if (restore) (main ?? button).focus();
61
- };
62
- const toggle = () => {
63
- clear();
64
- if (open() && pinned) {
65
- dismiss();
66
- return;
15
+ const preview = createHoverPreview({
16
+ keyboard: "focus",
17
+ placement: {
18
+ get align() {
19
+ return props.align;
20
+ }
21
+ },
22
+ onOpenChange: visible => {
23
+ setOpen(visible);
24
+ main?.setAttribute("aria-expanded", String(visible));
25
+ props.onOpenChange?.(visible);
67
26
  }
68
- dismissed = false;
69
- pinned = true;
70
- show();
71
- panel.focus();
72
- };
27
+ });
28
+ const toggle = () => preview.toggle(true);
73
29
  onMount(() => {
74
- row = button.closest(".k2b-app-workspace__sidebar-item");
30
+ const row = button.closest(".k2b-app-workspace__sidebar-item");
75
31
  if (props.trigger === "row") {
76
32
  main = row?.querySelector(":scope > button.k2b-app-workspace__sidebar-item-main") ?? null;
77
33
  main?.setAttribute("aria-label", props.label);
78
34
  main?.setAttribute("aria-haspopup", "dialog");
79
- main?.setAttribute("aria-controls", id);
35
+ main?.setAttribute("aria-controls", preview.id);
80
36
  main?.setAttribute("aria-expanded", "false");
81
37
  main?.addEventListener("click", toggle);
82
38
  }
83
- const pointerEnter = event => {
84
- if (event.pointerType === "mouse") enter();
85
- };
86
- const focusOut = event => {
87
- const next = event.relatedTarget;
88
- if (next instanceof Node && (panel.contains(next) || row?.contains(next))) return;
89
- pinned = false;
90
- leave();
91
- };
92
- const escape = event => {
93
- if (event.key !== "Escape" || !open()) return;
94
- dismiss();
95
- };
96
- const reposition = () => {
97
- if (open()) position();
98
- };
99
- row?.addEventListener("pointerenter", pointerEnter);
100
- row?.addEventListener("pointerleave", leave);
101
- row?.addEventListener("focusin", enter);
102
- row?.addEventListener("focusout", focusOut);
103
- panel.addEventListener("focusout", focusOut);
104
- document.addEventListener("keydown", escape);
105
- window.addEventListener("resize", reposition);
106
- window.addEventListener("scroll", reposition, true);
107
- const observer = new ResizeObserver(reposition);
108
- observer.observe(panel);
109
- onCleanup(() => {
110
- clear();
111
- observer.disconnect();
112
- main?.removeEventListener("click", toggle);
113
- row?.removeEventListener("pointerenter", pointerEnter);
114
- row?.removeEventListener("pointerleave", leave);
115
- row?.removeEventListener("focusin", enter);
116
- row?.removeEventListener("focusout", focusOut);
117
- panel.removeEventListener("focusout", focusOut);
118
- document.removeEventListener("keydown", escape);
119
- window.removeEventListener("resize", reposition);
120
- window.removeEventListener("scroll", reposition, true);
121
- });
39
+ preview.anchor(true, () => main ?? button)(row ?? button);
40
+ onCleanup(() => main?.removeEventListener("click", toggle));
122
41
  });
123
- return [_$ssr(_tmpl$, _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$ssrAttribute("aria-expanded", _$escape(open(), true), false) + _$ssrAttribute("aria-controls", _$escape(id, true), false) + _$ssrAttribute("data-row-trigger", props.trigger === "row" ? "true" : _$escape(undefined, true), false), _$ssrAttribute("class", props.trigger === "row" ? "ti ti-chevron-right" : "ti ti-info-circle", false)), _$ssr(_tmpl$2, _$ssrAttribute("id", _$escape(id, true), false), _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$escape(_$createComponent(ScrollArea, {
124
- get viewportSize() {
125
- return props.viewportSize;
42
+ return [_$ssr(_tmpl$, _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$ssrAttribute("aria-expanded", _$escape(open(), true), false) + _$ssrAttribute("aria-controls", _$escape(preview.id, true), false) + _$ssrAttribute("data-row-trigger", props.trigger === "row" ? "true" : _$escape(undefined, true), false), _$ssrAttribute("class", props.trigger === "row" ? "ti ti-chevron-right" : "ti ti-info-circle", false)), _$createComponent(HoverPreview, {
43
+ preview: preview,
44
+ get label() {
45
+ return props.label;
126
46
  },
127
- "class": "k2b-app-workspace__sidebar-preview-body",
47
+ "class": "k2b-app-workspace__sidebar-preview",
128
48
  get children() {
129
- return typeof props.children === "function" ? props.children(dismiss) : props.children;
49
+ return _$createComponent(ScrollArea, {
50
+ get viewportSize() {
51
+ return props.viewportSize;
52
+ },
53
+ "class": "k2b-app-workspace__sidebar-preview-body",
54
+ get children() {
55
+ return typeof props.children === "function" ? props.children(preview.close) : props.children;
56
+ }
57
+ });
130
58
  }
131
- })))];
59
+ })];
132
60
  }
133
61
  //# sourceMappingURL=SidebarItemPreview.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/SidebarItemPreview.tsx"],"sourcesContent":["import { createSignal, createUniqueId, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { positionTooltipSurface } from \"../feedback/tooltip-position\";\nimport { ScrollArea, type ScrollAreaProps } from \"./ScrollArea\";\n\n/** A non-modal, interactive row preview. Native popover owns light dismissal. */\nexport function SidebarItemPreview(props: {\n label: string;\n children: JSX.Element | ((close: () => void) => JSX.Element);\n trigger?: \"action\" | \"row\";\n align?: \"center\" | \"end\";\n viewportSize?: ScrollAreaProps[\"viewportSize\"];\n onOpenChange?: (open: boolean) => void;\n}) {\n const id = `sidebar-preview-${createUniqueId()}`;\n const [open, setOpen] = createSignal(false);\n let button!: HTMLButtonElement;\n let panel!: HTMLDivElement;\n let row: HTMLElement | null = null;\n let main: HTMLButtonElement | null = null;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let pinned = false;\n let dismissed = false;\n const clear = () => {\n clearTimeout(timer);\n timer = undefined;\n };\n const close = () => {\n clear();\n panel.hidePopover();\n };\n const position = () => {\n const target = row ?? button;\n positionTooltipSurface(panel, target, \"right\");\n if (props.align === \"end\") {\n const height = panel.getBoundingClientRect().height;\n const bottom = target.getBoundingClientRect().bottom;\n panel.style.top = `${Math.round(Math.max(8, Math.min(bottom - height, window.innerHeight - height - 8)))}px`;\n }\n };\n const show = () => {\n clear();\n if (dismissed || open()) return;\n panel.showPopover();\n position();\n };\n const enter = () => {\n clear();\n if (!dismissed && !open()) timer = setTimeout(show, 250);\n };\n const leave = () => {\n clear();\n dismissed = false;\n if (!pinned)\n timer = setTimeout(() => {\n if (!panel.contains(document.activeElement) && !row?.contains(document.activeElement)) close();\n }, 180);\n };\n const dismiss = () => {\n const restore = panel.contains(document.activeElement);\n dismissed = true;\n close();\n if (restore) (main ?? button).focus();\n };\n const toggle = () => {\n clear();\n if (open() && pinned) {\n dismiss();\n return;\n }\n dismissed = false;\n pinned = true;\n show();\n panel.focus();\n };\n onMount(() => {\n row = button.closest<HTMLElement>(\".k2b-app-workspace__sidebar-item\");\n if (props.trigger === \"row\") {\n main = row?.querySelector<HTMLButtonElement>(\":scope > button.k2b-app-workspace__sidebar-item-main\") ?? null;\n main?.setAttribute(\"aria-label\", props.label);\n main?.setAttribute(\"aria-haspopup\", \"dialog\");\n main?.setAttribute(\"aria-controls\", id);\n main?.setAttribute(\"aria-expanded\", \"false\");\n main?.addEventListener(\"click\", toggle);\n }\n const pointerEnter = (event: PointerEvent) => {\n if (event.pointerType === \"mouse\") enter();\n };\n const focusOut = (event: FocusEvent) => {\n const next = event.relatedTarget;\n if (next instanceof Node && (panel.contains(next) || row?.contains(next))) return;\n pinned = false;\n leave();\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !open()) return;\n dismiss();\n };\n const reposition = () => {\n if (open()) position();\n };\n row?.addEventListener(\"pointerenter\", pointerEnter);\n row?.addEventListener(\"pointerleave\", leave);\n row?.addEventListener(\"focusin\", enter);\n row?.addEventListener(\"focusout\", focusOut);\n panel.addEventListener(\"focusout\", focusOut);\n document.addEventListener(\"keydown\", escape);\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n const observer = new ResizeObserver(reposition);\n observer.observe(panel);\n onCleanup(() => {\n clear();\n observer.disconnect();\n main?.removeEventListener(\"click\", toggle);\n row?.removeEventListener(\"pointerenter\", pointerEnter);\n row?.removeEventListener(\"pointerleave\", leave);\n row?.removeEventListener(\"focusin\", enter);\n row?.removeEventListener(\"focusout\", focusOut);\n panel.removeEventListener(\"focusout\", focusOut);\n document.removeEventListener(\"keydown\", escape);\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n });\n });\n return (\n <>\n <button\n ref={button}\n type=\"button\"\n class=\"k2b-app-workspace__sidebar-item-action k2b-app-workspace__sidebar-preview-trigger\"\n data-visibility=\"hover\"\n aria-label={props.label}\n aria-haspopup=\"dialog\"\n aria-expanded={open()}\n aria-controls={id}\n data-row-trigger={props.trigger === \"row\" ? \"true\" : undefined}\n onClick={toggle}\n >\n <i class={props.trigger === \"row\" ? \"ti ti-chevron-right\" : \"ti ti-info-circle\"} aria-hidden=\"true\" />\n </button>\n <div\n ref={panel}\n id={id}\n popover=\"auto\"\n role=\"dialog\"\n aria-label={props.label}\n tabIndex={-1}\n class=\"k2b-app-workspace__sidebar-preview\"\n onPointerEnter={clear}\n onPointerLeave={leave}\n onToggle={(event) => {\n const visible = event.newState === \"open\";\n setOpen(visible);\n main?.setAttribute(\"aria-expanded\", String(visible));\n props.onOpenChange?.(visible);\n if (!visible) pinned = false;\n }}\n >\n <ScrollArea viewportSize={props.viewportSize} class=\"k2b-app-workspace__sidebar-preview-body\">\n {typeof props.children === \"function\" ? props.children(dismiss) : props.children}\n </ScrollArea>\n </div>\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/SidebarItemPreview.tsx"],"sourcesContent":["import { createSignal, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { createHoverPreview, HoverPreview } from \"../feedback/HoverPreview\";\nimport { ScrollArea, type ScrollAreaProps } from \"./ScrollArea\";\n\n/** A non-modal, interactive row preview built on the shared hover preview card. */\nexport function SidebarItemPreview(props: {\n label: string;\n children: JSX.Element | ((close: () => void) => JSX.Element);\n trigger?: \"action\" | \"row\";\n align?: \"center\" | \"end\";\n viewportSize?: ScrollAreaProps[\"viewportSize\"];\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = createSignal(false);\n let button!: HTMLButtonElement;\n let main: HTMLButtonElement | null = null;\n const preview = createHoverPreview<true>({\n keyboard: \"focus\",\n placement: {\n get align() {\n return props.align;\n },\n },\n onOpenChange: (visible) => {\n setOpen(visible);\n main?.setAttribute(\"aria-expanded\", String(visible));\n props.onOpenChange?.(visible);\n },\n });\n const toggle = () => preview.toggle(true);\n onMount(() => {\n const row = button.closest<HTMLElement>(\".k2b-app-workspace__sidebar-item\");\n if (props.trigger === \"row\") {\n main = row?.querySelector<HTMLButtonElement>(\":scope > button.k2b-app-workspace__sidebar-item-main\") ?? null;\n main?.setAttribute(\"aria-label\", props.label);\n main?.setAttribute(\"aria-haspopup\", \"dialog\");\n main?.setAttribute(\"aria-controls\", preview.id);\n main?.setAttribute(\"aria-expanded\", \"false\");\n main?.addEventListener(\"click\", toggle);\n }\n preview.anchor(true, () => main ?? button)(row ?? button);\n onCleanup(() => main?.removeEventListener(\"click\", toggle));\n });\n return (\n <>\n <button\n ref={button}\n type=\"button\"\n class=\"k2b-app-workspace__sidebar-item-action k2b-app-workspace__sidebar-preview-trigger\"\n data-visibility=\"hover\"\n aria-label={props.label}\n aria-haspopup=\"dialog\"\n aria-expanded={open()}\n aria-controls={preview.id}\n data-row-trigger={props.trigger === \"row\" ? \"true\" : undefined}\n onClick={toggle}\n >\n <i class={props.trigger === \"row\" ? \"ti ti-chevron-right\" : \"ti ti-info-circle\"} aria-hidden=\"true\" />\n </button>\n <HoverPreview preview={preview} label={props.label} class=\"k2b-app-workspace__sidebar-preview\">\n <ScrollArea viewportSize={props.viewportSize} class=\"k2b-app-workspace__sidebar-preview-body\">\n {typeof props.children === \"function\" ? props.children(preview.close) : props.children}\n </ScrollArea>\n </HoverPreview>\n </>\n );\n}\n"],"mappings":";;;;;AAAA,SAAS,YAAY,EAAY,SAAS,EAAE,OAAO,QAAQ,UAAU;AACrE,SAAS,kBAAkB,EAAE,YAAY,QAAQ,0BAA0B;AAC3E,SAAS,UAAU,QAA8B,cAAc;;AAE/D;AACA,OAAO,SAAS,kBAAkB,CAAC,KAOlC,EAAE;EACD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EAC3C,IAAI,MAA0B;EAC9B,IAAI,IAA8B,GAAG,IAAI;EACzC,MAAM,OAAO,GAAG,kBAAkB,CAAO;IACvC,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE;MACT,IAAI,KAAK,GAAG;QACV,OAAO,KAAK,CAAC,KAAK;MACpB;IACF,CAAC;IACD,YAAY,EAAG,OAAO,IAAK;MACzB,OAAO,CAAC,OAAO,CAAC;MAChB,IAAI,EAAE,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;MACpD,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC;IAC/B;EACF,CAAC,CAAC;EACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;EACzC,OAAO,CAAC,MAAM;IACZ,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAc,kCAAkC,CAAC;IAC3E,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE;MAC3B,IAAI,GAAG,GAAG,EAAE,aAAa,CAAoB,sDAAsD,CAAC,IAAI,IAAI;MAC5G,IAAI,EAAE,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC;MAC7C,IAAI,EAAE,YAAY,CAAC,eAAe,EAAE,QAAQ,CAAC;MAC7C,IAAI,EAAE,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE,CAAC;MAC/C,IAAI,EAAE,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC;MAC5C,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC;IACzC;IACA,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC;IACzD,SAAS,CAAC,MAAM,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAC7D,CAAC,CAAC;EACF,4DAOkB,KAAK,CAAC,KAAK,0DAER,IAAI,CAAC,CAAC,2DACN,OAAO,CAAC,EAAE,qDACP,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,MAAM,YAAG,SAAS,yCAGpD,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,qBAAqB,GAAG,mBAAmB,6BAEhF,YAAY;IAAC,OAAO,EAAE,OAAO;IAAA,IAAE,KAAK;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA;IAAA;MAAA,yBAC/C,UAAU;QAAA,IAAC,YAAY;UAAA,OAAE,KAAK,CAAC,YAAY;QAAA;QAAA;QAAA;UAAA,OACzC,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ;QAAA;MAAA;IAAA;EAAA;AAKhG","ignoreList":[]}
@@ -142,12 +142,15 @@ const reconcilePanes = (root, layoutState, active = null) => {
142
142
  * The animation needs to know how far to travel, and that is only knowable
143
143
  * once the label has been laid out — so it is measured lazily, on the same
144
144
  * hover/focus that triggers it, and published as a custom property. Labels
145
- * that fit get no `data-overflow`, so they never animate.
145
+ * that fit get no `data-overflow`, so they never animate. A revealed row action
146
+ * pads the label's fading end, so the text is measured against the content box.
146
147
  */
147
148
  const measureLabel = label => {
148
149
  const text = label.querySelector(LABEL_TEXT_SELECTOR);
149
150
  if (!text) return;
150
- const overflow = Math.max(0, text.scrollWidth - label.clientWidth);
151
+ const style = getComputedStyle(label);
152
+ const width = label.clientWidth - (Number.parseFloat(style.paddingLeft) || 0) - (Number.parseFloat(style.paddingRight) || 0);
153
+ const overflow = Math.max(0, text.scrollWidth - width);
151
154
  label.style.setProperty("--k2b-sidebar-label-overflow", `${overflow}px`);
152
155
  if (overflow > 2) label.dataset.overflow = "true";else delete label.dataset.overflow;
153
156
  };