@k2b/ui 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +3 -2
  2. package/dist/browser/actions/ContextMenu.js +3 -1
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/Dropdown.js +91 -46
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js +4 -1
  7. package/dist/browser/actions/FilterChip.js.map +1 -1
  8. package/dist/browser/chat/ChatComposer.js +1293 -534
  9. package/dist/browser/chat/ChatComposer.js.map +1 -1
  10. package/dist/browser/chat/chat-behavior.js +9 -0
  11. package/dist/browser/chat/chat-behavior.js.map +1 -1
  12. package/dist/browser/chat/index.js.map +1 -1
  13. package/dist/browser/chat/types.js.map +1 -1
  14. package/dist/browser/content/Calendar.js +579 -533
  15. package/dist/browser/content/Calendar.js.map +1 -1
  16. package/dist/browser/content/Lightbox.js +76 -40
  17. package/dist/browser/content/Lightbox.js.map +1 -1
  18. package/dist/browser/content/PdfPreview.js +146 -79
  19. package/dist/browser/content/PdfPreview.js.map +1 -1
  20. package/dist/browser/content/Timeline.js +1038 -0
  21. package/dist/browser/content/Timeline.js.map +1 -0
  22. package/dist/browser/content/VideoPlayer.js +29 -9
  23. package/dist/browser/content/VideoPlayer.js.map +1 -1
  24. package/dist/browser/content/chart-inspection.js +7 -2
  25. package/dist/browser/content/chart-inspection.js.map +1 -1
  26. package/dist/browser/content/index.js +1 -0
  27. package/dist/browser/content/index.js.map +1 -1
  28. package/dist/browser/content/timeline-model.js +579 -0
  29. package/dist/browser/content/timeline-model.js.map +1 -0
  30. package/dist/browser/feedback/dialog-core.js +26 -14
  31. package/dist/browser/feedback/dialog-core.js.map +1 -1
  32. package/dist/browser/inputs/ChoiceChips.js +66 -0
  33. package/dist/browser/inputs/ChoiceChips.js.map +1 -0
  34. package/dist/browser/inputs/ChoiceGroups.js +53 -12
  35. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  36. package/dist/browser/inputs/FileInputs.js +48 -33
  37. package/dist/browser/inputs/FileInputs.js.map +1 -1
  38. package/dist/browser/inputs/SignatureInput.js +558 -0
  39. package/dist/browser/inputs/SignatureInput.js.map +1 -0
  40. package/dist/browser/inputs/emoji/EmojiPicker.js +841 -0
  41. package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -0
  42. package/dist/browser/inputs/emoji/emoji-data.js +1903 -0
  43. package/dist/browser/inputs/emoji/emoji-data.js.map +1 -0
  44. package/dist/browser/inputs/emoji/emoji-index.js +209 -0
  45. package/dist/browser/inputs/emoji/emoji-index.js.map +1 -0
  46. package/dist/browser/inputs/emoji/emoji-messages.js +64 -0
  47. package/dist/browser/inputs/emoji/emoji-messages.js.map +1 -0
  48. package/dist/browser/inputs/index.js +5 -0
  49. package/dist/browser/inputs/index.js.map +1 -1
  50. package/dist/browser/inputs/markdown/actions.js +48 -2
  51. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  52. package/dist/browser/inputs/markdown/code-zone.js +38 -2
  53. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  54. package/dist/browser/inputs/signature-messages.js +39 -0
  55. package/dist/browser/inputs/signature-messages.js.map +1 -0
  56. package/dist/browser/inputs/signature.js +208 -0
  57. package/dist/browser/inputs/signature.js.map +1 -0
  58. package/dist/browser/internal/render-error.js +49 -0
  59. package/dist/browser/internal/render-error.js.map +1 -0
  60. package/dist/browser/intl/messages.js +108 -0
  61. package/dist/browser/intl/messages.js.map +1 -1
  62. package/dist/browser/layout/AppWorkspace.js +321 -222
  63. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  64. package/dist/browser/layout/FloatingWindow.js +4 -1
  65. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  66. package/dist/browser/layout/SidebarItemPreview.js +5 -1
  67. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  68. package/dist/browser/layout/index.js.map +1 -1
  69. package/dist/browser/surfaces/ResourceCard.js +212 -0
  70. package/dist/browser/surfaces/ResourceCard.js.map +1 -0
  71. package/dist/browser/surfaces/index.js +1 -0
  72. package/dist/browser/surfaces/index.js.map +1 -1
  73. package/dist/licenses/emojibase-data.txt +21 -0
  74. package/dist/ssr/actions/ContextMenu.js +3 -1
  75. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  76. package/dist/ssr/actions/Dropdown.js +49 -12
  77. package/dist/ssr/actions/Dropdown.js.map +1 -1
  78. package/dist/ssr/actions/FilterChip.js +4 -1
  79. package/dist/ssr/actions/FilterChip.js.map +1 -1
  80. package/dist/ssr/chat/ChatComposer.js +805 -214
  81. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  82. package/dist/ssr/chat/chat-behavior.js +9 -0
  83. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  84. package/dist/ssr/chat/index.js.map +1 -1
  85. package/dist/ssr/chat/types.js.map +1 -1
  86. package/dist/ssr/content/Calendar.js +183 -142
  87. package/dist/ssr/content/Calendar.js.map +1 -1
  88. package/dist/ssr/content/Lightbox.js +19 -5
  89. package/dist/ssr/content/Lightbox.js.map +1 -1
  90. package/dist/ssr/content/PdfPreview.js +77 -36
  91. package/dist/ssr/content/PdfPreview.js.map +1 -1
  92. package/dist/ssr/content/Timeline.js +804 -0
  93. package/dist/ssr/content/Timeline.js.map +1 -0
  94. package/dist/ssr/content/VideoPlayer.js +29 -9
  95. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  96. package/dist/ssr/content/chart-inspection.js +7 -2
  97. package/dist/ssr/content/chart-inspection.js.map +1 -1
  98. package/dist/ssr/content/index.js +1 -0
  99. package/dist/ssr/content/index.js.map +1 -1
  100. package/dist/ssr/content/timeline-model.js +579 -0
  101. package/dist/ssr/content/timeline-model.js.map +1 -0
  102. package/dist/ssr/feedback/dialog-core.js +26 -14
  103. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  104. package/dist/ssr/inputs/ChoiceChips.js +66 -0
  105. package/dist/ssr/inputs/ChoiceChips.js.map +1 -0
  106. package/dist/ssr/inputs/ChoiceGroups.js +12 -4
  107. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  108. package/dist/ssr/inputs/FileInputs.js +19 -4
  109. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  110. package/dist/ssr/inputs/SignatureInput.js +404 -0
  111. package/dist/ssr/inputs/SignatureInput.js.map +1 -0
  112. package/dist/ssr/inputs/emoji/EmojiPicker.js +551 -0
  113. package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -0
  114. package/dist/ssr/inputs/emoji/emoji-data.js +1903 -0
  115. package/dist/ssr/inputs/emoji/emoji-data.js.map +1 -0
  116. package/dist/ssr/inputs/emoji/emoji-index.js +209 -0
  117. package/dist/ssr/inputs/emoji/emoji-index.js.map +1 -0
  118. package/dist/ssr/inputs/emoji/emoji-messages.js +64 -0
  119. package/dist/ssr/inputs/emoji/emoji-messages.js.map +1 -0
  120. package/dist/ssr/inputs/index.js +5 -0
  121. package/dist/ssr/inputs/index.js.map +1 -1
  122. package/dist/ssr/inputs/markdown/actions.js +48 -2
  123. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  124. package/dist/ssr/inputs/markdown/code-zone.js +38 -2
  125. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  126. package/dist/ssr/inputs/signature-messages.js +39 -0
  127. package/dist/ssr/inputs/signature-messages.js.map +1 -0
  128. package/dist/ssr/inputs/signature.js +208 -0
  129. package/dist/ssr/inputs/signature.js.map +1 -0
  130. package/dist/ssr/internal/render-error.js +49 -0
  131. package/dist/ssr/internal/render-error.js.map +1 -0
  132. package/dist/ssr/intl/messages.js +108 -0
  133. package/dist/ssr/intl/messages.js.map +1 -1
  134. package/dist/ssr/layout/AppWorkspace.js +112 -41
  135. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  136. package/dist/ssr/layout/FloatingWindow.js +4 -1
  137. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  138. package/dist/ssr/layout/SidebarItemPreview.js +5 -1
  139. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  140. package/dist/ssr/layout/index.js.map +1 -1
  141. package/dist/ssr/surfaces/ResourceCard.js +115 -0
  142. package/dist/ssr/surfaces/ResourceCard.js.map +1 -0
  143. package/dist/ssr/surfaces/index.js +1 -0
  144. package/dist/ssr/surfaces/index.js.map +1 -1
  145. package/dist/styles.css +1 -1
  146. package/dist/types/actions/Dropdown.d.ts +13 -1
  147. package/dist/types/actions/FilterChip.d.ts +5 -0
  148. package/dist/types/chat/ChatComposer.d.ts +24 -1
  149. package/dist/types/chat/chat-behavior.d.ts +15 -0
  150. package/dist/types/chat/index.d.ts +1 -1
  151. package/dist/types/chat/types.d.ts +34 -0
  152. package/dist/types/content/Calendar.d.ts +28 -8
  153. package/dist/types/content/Lightbox.d.ts +8 -0
  154. package/dist/types/content/Timeline.d.ts +49 -0
  155. package/dist/types/content/index.d.ts +4 -2
  156. package/dist/types/content/timeline-model.d.ts +148 -0
  157. package/dist/types/feedback/dialog-core.d.ts +1 -1
  158. package/dist/types/inputs/ChoiceChips.d.ts +20 -0
  159. package/dist/types/inputs/ChoiceGroups.d.ts +11 -2
  160. package/dist/types/inputs/FileInputs.d.ts +6 -0
  161. package/dist/types/inputs/SignatureInput.d.ts +22 -0
  162. package/dist/types/inputs/emoji/EmojiPicker.d.ts +42 -0
  163. package/dist/types/inputs/emoji/emoji-data.d.ts +2 -0
  164. package/dist/types/inputs/emoji/emoji-index.d.ts +109 -0
  165. package/dist/types/inputs/emoji/emoji-messages.d.ts +30 -0
  166. package/dist/types/inputs/index.d.ts +10 -0
  167. package/dist/types/inputs/markdown/actions.d.ts +4 -0
  168. package/dist/types/inputs/markdown/code-zone.d.ts +7 -0
  169. package/dist/types/inputs/signature-messages.d.ts +11 -0
  170. package/dist/types/inputs/signature.d.ts +72 -0
  171. package/dist/types/internal/render-error.d.ts +13 -0
  172. package/dist/types/intl/messages.d.ts +54 -0
  173. package/dist/types/layout/AppWorkspace.d.ts +17 -0
  174. package/dist/types/layout/SidebarItemPreview.d.ts +2 -0
  175. package/dist/types/layout/index.d.ts +1 -1
  176. package/dist/types/surfaces/ResourceCard.d.ts +31 -0
  177. package/dist/types/surfaces/index.d.ts +2 -0
  178. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/FloatingWindow.tsx"],"sourcesContent":["import { createSignal, createUniqueId, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Portal, render } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { getK2bPortalRoot } from \"../internal/portal\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { FLOATING_WINDOW_VIEWPORT_GAP, type FloatingWindowRect, fitFloatingWindowRect } from \"./floating-window-geometry\";\n\nexport { type FloatingWindowRect, fitFloatingWindowRect } from \"./floating-window-geometry\";\n\ntype ResizeEdge = \"left\" | \"right\" | \"top\" | \"bottom\" | \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport type FloatingWindowProps = {\n title: string;\n icon?: string;\n children: JSX.Element;\n onClose: () => void;\n initialWidth?: number;\n initialHeight?: number;\n minWidth?: number;\n minHeight?: number;\n accent?: string;\n class?: string;\n resolveScope?: () => HTMLElement | null | undefined;\n};\nexport type OpenFloatingWindowOptions = Omit<FloatingWindowProps, \"children\" | \"onClose\">;\nexport type FloatingWindowClose = () => void;\n\nconst MOBILE_BREAKPOINT = 640;\nconst FLOATING_WINDOW_LAYER_BASE = 80;\ntype LayerOwner = { setLayer: (layer: number) => void };\nconst activeLayers: LayerOwner[] = [];\nconst syncLayers = () => {\n activeLayers.forEach((owner, index) => owner.setLayer(FLOATING_WINDOW_LAYER_BASE + index));\n};\nconst registerLayer = (owner: LayerOwner) => {\n activeLayers.push(owner);\n syncLayers();\n};\nconst releaseLayer = (owner: LayerOwner) => {\n const index = activeLayers.indexOf(owner);\n if (index < 0) return;\n activeLayers.splice(index, 1);\n syncLayers();\n};\nconst bringLayerToFront = (owner: LayerOwner) => {\n const index = activeLayers.indexOf(owner);\n if (index < 0 || index === activeLayers.length - 1) return;\n activeLayers.splice(index, 1);\n activeLayers.push(owner);\n syncLayers();\n};\nconst isTopLayer = (owner: LayerOwner) => activeLayers.at(-1) === owner;\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), Math.max(min, max));\n\nexport default function FloatingWindow(props: FloatingWindowProps): JSX.Element {\n const messages = useUiMessages();\n const minWidth = () => props.minWidth ?? 360;\n const minHeight = () => props.minHeight ?? 320;\n const [mobile, setMobile] = createSignal(false);\n const [layer, setLayer] = createSignal(FLOATING_WINDOW_LAYER_BASE);\n const layerOwner: LayerOwner = { setLayer };\n const [rect, setRect] = createSignal<FloatingWindowRect>({\n x: FLOATING_WINDOW_VIEWPORT_GAP,\n y: FLOATING_WINDOW_VIEWPORT_GAP,\n width: props.initialWidth ?? 720,\n height: props.initialHeight ?? 640,\n });\n const titleId = `k2b-floating-window-${createUniqueId()}`;\n let frame: HTMLElement | undefined;\n let stopPointerInteraction: (() => void) | undefined;\n const fit = (value: FloatingWindowRect) =>\n fitFloatingWindowRect(value, minWidth(), minHeight(), { width: window.innerWidth, height: window.innerHeight });\n const front = () => bringLayerToFront(layerOwner);\n const stopActivePointerInteraction = () => stopPointerInteraction?.();\n const close = () => {\n stopActivePointerInteraction();\n props.onClose();\n };\n const trackPointerInteraction = (start: PointerEvent, move: (event: PointerEvent) => void) => {\n stopActivePointerInteraction();\n const pointerId = start.pointerId;\n const captureTarget = start.currentTarget as HTMLElement;\n captureTarget.setPointerCapture?.(pointerId);\n const stop = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n if (captureTarget.hasPointerCapture?.(pointerId)) captureTarget.releasePointerCapture(pointerId);\n if (stopPointerInteraction === stop) stopPointerInteraction = undefined;\n };\n const onMove = (event: PointerEvent) => {\n if (event.pointerId === pointerId) move(event);\n };\n const onEnd = (event: PointerEvent) => {\n if (event.pointerId === pointerId) stop();\n };\n stopPointerInteraction = stop;\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n };\n\n onMount(() => {\n registerLayer(layerOwner);\n const viewport = () => {\n const compact = window.innerWidth < MOBILE_BREAKPOINT;\n setMobile(compact);\n if (!compact) setRect((current) => fit(current));\n };\n setRect((current) => fit({ ...current, x: (window.innerWidth - current.width) / 2, y: (window.innerHeight - current.height) / 2 }));\n viewport();\n const escape = (event: KeyboardEvent) => {\n if (event.defaultPrevented || event.key !== \"Escape\" || !isTopLayer(layerOwner)) return;\n event.preventDefault();\n close();\n };\n window.addEventListener(\"resize\", viewport);\n window.addEventListener(\"keydown\", escape);\n const focus = requestAnimationFrame(() => frame?.focus());\n onCleanup(() => {\n stopActivePointerInteraction();\n releaseLayer(layerOwner);\n cancelAnimationFrame(focus);\n window.removeEventListener(\"resize\", viewport);\n window.removeEventListener(\"keydown\", escape);\n });\n });\n\n const moveBy = (deltaX: number, deltaY: number) =>\n setRect((current) => fit({ ...current, x: current.x + deltaX, y: current.y + deltaY }));\n const beginMove = (event: PointerEvent) => {\n if (mobile() || event.button !== 0 || (event.target as Element).closest(\"button:not([data-window-move])\")) return;\n const origin = rect();\n const start = { x: event.clientX, y: event.clientY };\n front();\n const move = (next: PointerEvent) =>\n setRect(fit({ ...origin, x: origin.x + next.clientX - start.x, y: origin.y + next.clientY - start.y }));\n trackPointerInteraction(event, move);\n event.preventDefault();\n };\n const resizeBy = (edge: ResizeEdge, deltaX: number, deltaY: number) => {\n const current = rect();\n let { x, y, width, height } = current;\n if (edge.includes(\"left\")) {\n const next = clamp(width - deltaX, minWidth(), window.innerWidth - FLOATING_WINDOW_VIEWPORT_GAP - x);\n x += width - next;\n width = next;\n }\n if (edge.includes(\"right\")) width += deltaX;\n if (edge.includes(\"top\")) {\n const next = clamp(height - deltaY, minHeight(), window.innerHeight - FLOATING_WINDOW_VIEWPORT_GAP - y);\n y += height - next;\n height = next;\n }\n if (edge.includes(\"bottom\")) height += deltaY;\n setRect(fit({ x, y, width, height }));\n };\n const beginResize = (edge: ResizeEdge, event: PointerEvent) => {\n if (mobile() || event.button !== 0) return;\n let previous = { x: event.clientX, y: event.clientY };\n front();\n const move = (next: PointerEvent) => {\n resizeBy(edge, next.clientX - previous.x, next.clientY - previous.y);\n previous = { x: next.clientX, y: next.clientY };\n };\n trackPointerInteraction(event, move);\n event.preventDefault();\n };\n const arrows = (event: KeyboardEvent, action: (x: number, y: number) => void) => {\n const step = event.shiftKey ? 24 : 8;\n const delta =\n event.key === \"ArrowLeft\"\n ? [-step, 0]\n : event.key === \"ArrowRight\"\n ? [step, 0]\n : event.key === \"ArrowUp\"\n ? [0, -step]\n : event.key === \"ArrowDown\"\n ? [0, step]\n : undefined;\n if (!delta) return;\n action(delta[0]!, delta[1]!);\n event.preventDefault();\n };\n const handles: readonly [ResizeEdge, string][] = [\n [\"left\", \"ew-resize\"],\n [\"right\", \"ew-resize\"],\n [\"top\", \"ns-resize\"],\n [\"bottom\", \"ns-resize\"],\n [\"top-left\", \"nwse-resize\"],\n [\"top-right\", \"nesw-resize\"],\n [\"bottom-left\", \"nesw-resize\"],\n [\"bottom-right\", \"nwse-resize\"],\n ];\n\n const view = (\n <section\n ref={frame}\n class={`k2b-floating-window ${props.class ?? \"\"}`}\n data-mobile={mobile() ? \"true\" : undefined}\n style={\n mobile()\n ? {\n \"--k2b-window-accent\": props.accent,\n inset: \"0.5rem\",\n width: \"auto\",\n height: \"auto\",\n \"z-index\": layer(),\n }\n : {\n \"--k2b-window-accent\": props.accent,\n left: `${rect().x}px`,\n top: `${rect().y}px`,\n width: `${rect().width}px`,\n height: `${rect().height}px`,\n \"z-index\": layer(),\n }\n }\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={titleId}\n tabIndex={-1}\n onPointerDown={front}\n >\n <header onPointerDown={beginMove}>\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <button\n type=\"button\"\n data-window-move\n class=\"k2b-floating-window__title\"\n aria-label={messages().moveWindow({ title: props.title })}\n onKeyDown={(event) => arrows(event, moveBy)}\n >\n <span id={titleId}>{props.title}</span>\n </button>\n <button type=\"button\" class=\"k2b-icon-button\" aria-label={messages().closeWindow} onClick={close}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </header>\n <div class=\"k2b-floating-window__body\">{props.children}</div>\n <Show when={!mobile()}>\n {handles.map(([edge, cursor]) =>\n edge === \"bottom-right\" ? (\n <button\n type=\"button\"\n class=\"k2b-floating-window__resize\"\n data-edge={edge}\n style={{ cursor }}\n aria-label={messages().resizeWindow}\n onPointerDown={(event) => beginResize(edge, event)}\n onKeyDown={(event) => arrows(event, (x, y) => resizeBy(edge, x, y))}\n />\n ) : (\n // Cloud exposes a single keyboard-resizable corner; the remaining\n // edges stay pointer-only so the window adds one tab stop, not eight.\n <div\n class=\"k2b-floating-window__resize\"\n data-edge={edge}\n style={{ cursor }}\n aria-hidden=\"true\"\n onPointerDown={(event) => beginResize(edge, event)}\n />\n ),\n )}\n </Show>\n </section>\n );\n return <Portal mount={typeof document === \"undefined\" ? undefined : getK2bPortalRoot(props.resolveScope?.())}>{view}</Portal>;\n}\n\nexport const openFloatingWindow = (\n view: (close: FloatingWindowClose) => JSX.Element,\n options: OpenFloatingWindowOptions,\n): FloatingWindowClose => {\n if (typeof document === \"undefined\") throw new Error(\"Floating windows are browser-only\");\n const previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n const previousRing = ringOnReturn(previousFocus);\n const owner = document.createElement(\"div\");\n owner.className = \"k2b-ui\";\n document.body.appendChild(owner);\n let dispose: (() => void) | undefined;\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n dispose?.();\n owner.remove();\n returnFocus(previousFocus, previousRing);\n };\n dispose = render(\n () => (\n <FloatingWindow {...options} resolveScope={options.resolveScope ?? (() => owner)} onClose={close}>\n {view(close)}\n </FloatingWindow>\n ),\n owner,\n );\n return close;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/FloatingWindow.tsx"],"sourcesContent":["import { createSignal, createUniqueId, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Portal, render } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { getK2bPortalRoot } from \"../internal/portal\";\nimport { RenderErrorBoundary } from \"../internal/render-error\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { FLOATING_WINDOW_VIEWPORT_GAP, type FloatingWindowRect, fitFloatingWindowRect } from \"./floating-window-geometry\";\n\nexport { type FloatingWindowRect, fitFloatingWindowRect } from \"./floating-window-geometry\";\n\ntype ResizeEdge = \"left\" | \"right\" | \"top\" | \"bottom\" | \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport type FloatingWindowProps = {\n title: string;\n icon?: string;\n children: JSX.Element;\n onClose: () => void;\n initialWidth?: number;\n initialHeight?: number;\n minWidth?: number;\n minHeight?: number;\n accent?: string;\n class?: string;\n resolveScope?: () => HTMLElement | null | undefined;\n};\nexport type OpenFloatingWindowOptions = Omit<FloatingWindowProps, \"children\" | \"onClose\">;\nexport type FloatingWindowClose = () => void;\n\nconst MOBILE_BREAKPOINT = 640;\nconst FLOATING_WINDOW_LAYER_BASE = 80;\ntype LayerOwner = { setLayer: (layer: number) => void };\nconst activeLayers: LayerOwner[] = [];\nconst syncLayers = () => {\n activeLayers.forEach((owner, index) => owner.setLayer(FLOATING_WINDOW_LAYER_BASE + index));\n};\nconst registerLayer = (owner: LayerOwner) => {\n activeLayers.push(owner);\n syncLayers();\n};\nconst releaseLayer = (owner: LayerOwner) => {\n const index = activeLayers.indexOf(owner);\n if (index < 0) return;\n activeLayers.splice(index, 1);\n syncLayers();\n};\nconst bringLayerToFront = (owner: LayerOwner) => {\n const index = activeLayers.indexOf(owner);\n if (index < 0 || index === activeLayers.length - 1) return;\n activeLayers.splice(index, 1);\n activeLayers.push(owner);\n syncLayers();\n};\nconst isTopLayer = (owner: LayerOwner) => activeLayers.at(-1) === owner;\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), Math.max(min, max));\n\nexport default function FloatingWindow(props: FloatingWindowProps): JSX.Element {\n const messages = useUiMessages();\n const minWidth = () => props.minWidth ?? 360;\n const minHeight = () => props.minHeight ?? 320;\n const [mobile, setMobile] = createSignal(false);\n const [layer, setLayer] = createSignal(FLOATING_WINDOW_LAYER_BASE);\n const layerOwner: LayerOwner = { setLayer };\n const [rect, setRect] = createSignal<FloatingWindowRect>({\n x: FLOATING_WINDOW_VIEWPORT_GAP,\n y: FLOATING_WINDOW_VIEWPORT_GAP,\n width: props.initialWidth ?? 720,\n height: props.initialHeight ?? 640,\n });\n const titleId = `k2b-floating-window-${createUniqueId()}`;\n let frame: HTMLElement | undefined;\n let stopPointerInteraction: (() => void) | undefined;\n const fit = (value: FloatingWindowRect) =>\n fitFloatingWindowRect(value, minWidth(), minHeight(), { width: window.innerWidth, height: window.innerHeight });\n const front = () => bringLayerToFront(layerOwner);\n const stopActivePointerInteraction = () => stopPointerInteraction?.();\n const close = () => {\n stopActivePointerInteraction();\n props.onClose();\n };\n const trackPointerInteraction = (start: PointerEvent, move: (event: PointerEvent) => void) => {\n stopActivePointerInteraction();\n const pointerId = start.pointerId;\n const captureTarget = start.currentTarget as HTMLElement;\n captureTarget.setPointerCapture?.(pointerId);\n const stop = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n if (captureTarget.hasPointerCapture?.(pointerId)) captureTarget.releasePointerCapture(pointerId);\n if (stopPointerInteraction === stop) stopPointerInteraction = undefined;\n };\n const onMove = (event: PointerEvent) => {\n if (event.pointerId === pointerId) move(event);\n };\n const onEnd = (event: PointerEvent) => {\n if (event.pointerId === pointerId) stop();\n };\n stopPointerInteraction = stop;\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n };\n\n onMount(() => {\n registerLayer(layerOwner);\n const viewport = () => {\n const compact = window.innerWidth < MOBILE_BREAKPOINT;\n setMobile(compact);\n if (!compact) setRect((current) => fit(current));\n };\n setRect((current) => fit({ ...current, x: (window.innerWidth - current.width) / 2, y: (window.innerHeight - current.height) / 2 }));\n viewport();\n const escape = (event: KeyboardEvent) => {\n if (event.defaultPrevented || event.key !== \"Escape\" || !isTopLayer(layerOwner)) return;\n event.preventDefault();\n close();\n };\n window.addEventListener(\"resize\", viewport);\n window.addEventListener(\"keydown\", escape);\n const focus = requestAnimationFrame(() => frame?.focus());\n onCleanup(() => {\n stopActivePointerInteraction();\n releaseLayer(layerOwner);\n cancelAnimationFrame(focus);\n window.removeEventListener(\"resize\", viewport);\n window.removeEventListener(\"keydown\", escape);\n });\n });\n\n const moveBy = (deltaX: number, deltaY: number) =>\n setRect((current) => fit({ ...current, x: current.x + deltaX, y: current.y + deltaY }));\n const beginMove = (event: PointerEvent) => {\n if (mobile() || event.button !== 0 || (event.target as Element).closest(\"button:not([data-window-move])\")) return;\n const origin = rect();\n const start = { x: event.clientX, y: event.clientY };\n front();\n const move = (next: PointerEvent) =>\n setRect(fit({ ...origin, x: origin.x + next.clientX - start.x, y: origin.y + next.clientY - start.y }));\n trackPointerInteraction(event, move);\n event.preventDefault();\n };\n const resizeBy = (edge: ResizeEdge, deltaX: number, deltaY: number) => {\n const current = rect();\n let { x, y, width, height } = current;\n if (edge.includes(\"left\")) {\n const next = clamp(width - deltaX, minWidth(), window.innerWidth - FLOATING_WINDOW_VIEWPORT_GAP - x);\n x += width - next;\n width = next;\n }\n if (edge.includes(\"right\")) width += deltaX;\n if (edge.includes(\"top\")) {\n const next = clamp(height - deltaY, minHeight(), window.innerHeight - FLOATING_WINDOW_VIEWPORT_GAP - y);\n y += height - next;\n height = next;\n }\n if (edge.includes(\"bottom\")) height += deltaY;\n setRect(fit({ x, y, width, height }));\n };\n const beginResize = (edge: ResizeEdge, event: PointerEvent) => {\n if (mobile() || event.button !== 0) return;\n let previous = { x: event.clientX, y: event.clientY };\n front();\n const move = (next: PointerEvent) => {\n resizeBy(edge, next.clientX - previous.x, next.clientY - previous.y);\n previous = { x: next.clientX, y: next.clientY };\n };\n trackPointerInteraction(event, move);\n event.preventDefault();\n };\n const arrows = (event: KeyboardEvent, action: (x: number, y: number) => void) => {\n const step = event.shiftKey ? 24 : 8;\n const delta =\n event.key === \"ArrowLeft\"\n ? [-step, 0]\n : event.key === \"ArrowRight\"\n ? [step, 0]\n : event.key === \"ArrowUp\"\n ? [0, -step]\n : event.key === \"ArrowDown\"\n ? [0, step]\n : undefined;\n if (!delta) return;\n action(delta[0]!, delta[1]!);\n event.preventDefault();\n };\n const handles: readonly [ResizeEdge, string][] = [\n [\"left\", \"ew-resize\"],\n [\"right\", \"ew-resize\"],\n [\"top\", \"ns-resize\"],\n [\"bottom\", \"ns-resize\"],\n [\"top-left\", \"nwse-resize\"],\n [\"top-right\", \"nesw-resize\"],\n [\"bottom-left\", \"nesw-resize\"],\n [\"bottom-right\", \"nwse-resize\"],\n ];\n\n const view = (\n <section\n ref={frame}\n class={`k2b-floating-window ${props.class ?? \"\"}`}\n data-mobile={mobile() ? \"true\" : undefined}\n style={\n mobile()\n ? {\n \"--k2b-window-accent\": props.accent,\n inset: \"0.5rem\",\n width: \"auto\",\n height: \"auto\",\n \"z-index\": layer(),\n }\n : {\n \"--k2b-window-accent\": props.accent,\n left: `${rect().x}px`,\n top: `${rect().y}px`,\n width: `${rect().width}px`,\n height: `${rect().height}px`,\n \"z-index\": layer(),\n }\n }\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={titleId}\n tabIndex={-1}\n onPointerDown={front}\n >\n <header onPointerDown={beginMove}>\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <button\n type=\"button\"\n data-window-move\n class=\"k2b-floating-window__title\"\n aria-label={messages().moveWindow({ title: props.title })}\n onKeyDown={(event) => arrows(event, moveBy)}\n >\n <span id={titleId}>{props.title}</span>\n </button>\n <button type=\"button\" class=\"k2b-icon-button\" aria-label={messages().closeWindow} onClick={close}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </header>\n <div class=\"k2b-floating-window__body\">{props.children}</div>\n <Show when={!mobile()}>\n {handles.map(([edge, cursor]) =>\n edge === \"bottom-right\" ? (\n <button\n type=\"button\"\n class=\"k2b-floating-window__resize\"\n data-edge={edge}\n style={{ cursor }}\n aria-label={messages().resizeWindow}\n onPointerDown={(event) => beginResize(edge, event)}\n onKeyDown={(event) => arrows(event, (x, y) => resizeBy(edge, x, y))}\n />\n ) : (\n // Cloud exposes a single keyboard-resizable corner; the remaining\n // edges stay pointer-only so the window adds one tab stop, not eight.\n <div\n class=\"k2b-floating-window__resize\"\n data-edge={edge}\n style={{ cursor }}\n aria-hidden=\"true\"\n onPointerDown={(event) => beginResize(edge, event)}\n />\n ),\n )}\n </Show>\n </section>\n );\n return <Portal mount={typeof document === \"undefined\" ? undefined : getK2bPortalRoot(props.resolveScope?.())}>{view}</Portal>;\n}\n\nexport const openFloatingWindow = (\n view: (close: FloatingWindowClose) => JSX.Element,\n options: OpenFloatingWindowOptions,\n): FloatingWindowClose => {\n if (typeof document === \"undefined\") throw new Error(\"Floating windows are browser-only\");\n const previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n const previousRing = ringOnReturn(previousFocus);\n const owner = document.createElement(\"div\");\n owner.className = \"k2b-ui\";\n document.body.appendChild(owner);\n let dispose: (() => void) | undefined;\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n dispose?.();\n owner.remove();\n returnFocus(previousFocus, previousRing);\n };\n dispose = render(\n () => (\n <FloatingWindow {...options} resolveScope={options.resolveScope ?? (() => owner)} onClose={close}>\n <RenderErrorBoundary content={() => view(close)} />\n </FloatingWindow>\n ),\n owner,\n );\n return close;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -9,7 +9,7 @@ import { getNextElement as _$getNextElement } from "solid-js/web";
9
9
  import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
10
10
  import { use as _$use } from "solid-js/web";
11
11
  var _tmpl$ = /*#__PURE__*/_$template(`<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>`);
12
- import { createSignal, onCleanup, onMount } from "solid-js";
12
+ import { createEffect, createSignal, onCleanup, onMount } from "solid-js";
13
13
  import { createHoverPreview, HoverPreview } from "../feedback/HoverPreview";
14
14
  import { ScrollArea } from "./ScrollArea";
15
15
 
@@ -45,6 +45,10 @@ export function SidebarItemPreview(props) {
45
45
  preview.anchor(true, () => main ?? button)(row ?? button);
46
46
  onCleanup(() => main?.removeEventListener("click", toggle));
47
47
  });
48
+ createEffect(() => {
49
+ const id = props.describedBy;
50
+ if (id) main?.setAttribute("aria-describedby", id);else main?.removeAttribute("aria-describedby");
51
+ });
48
52
  return [(() => {
49
53
  var _el$ = _$getNextElement(_tmpl$),
50
54
  _el$2 = _el$.firstChild;
@@ -1 +1 @@
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;IAAA;MAAA;IAAA,eAYe,MAAM;IAAA,YATV,MAAM;IAAA,mDAAN,MAAM;IAAA;MAAA,UAIC,KAAK,CAAC,KAAK;QAAA,OAER,IAAI,CAAC,CAAC;QAAA,OACN,OAAO,CAAC,EAAE;QAAA,OACP,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,MAAM,GAAG,SAAS;QAAA,OAGpD,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,qBAAqB,GAAG,mBAAmB;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;IAAA;IAAA;EAAA,wBAEhF,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,oBAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,MAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ;QAAA;MAAA;IAAA;EAAA;AAKhG;AAAC","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/SidebarItemPreview.tsx"],"sourcesContent":["import { createEffect, 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 /** The row's metadata; a row trigger, named by `label`, keeps it as its description. */\n describedBy?: string;\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 createEffect(() => {\n const id = props.describedBy;\n if (id) main?.setAttribute(\"aria-describedby\", id);\n else main?.removeAttribute(\"aria-describedby\");\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":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/index.ts"],"sourcesContent":["export type {\n AppOverviewCardsProps,\n AppOverviewEmptyStateProps,\n AppOverviewPanelProps,\n AppOverviewProps,\n} from \"./AppOverview\";\nexport { default as AppOverview } from \"./AppOverview\";\nexport type {\n AppWorkspaceBottomDrawerHeight,\n AppWorkspaceBottomDrawerProps,\n AppWorkspaceContentProps,\n AppWorkspaceDetailProps,\n AppWorkspaceDetailWidth,\n AppWorkspaceMainPaneProps,\n AppWorkspaceMainProps,\n AppWorkspaceNavTreeItemProps,\n AppWorkspaceNavTreeMove,\n AppWorkspaceNavTreeProps,\n AppWorkspaceProps,\n AppWorkspaceSidebarAccessoryVisibility,\n AppWorkspaceSidebarBodyProps,\n AppWorkspaceSidebarIconActionProps,\n AppWorkspaceSidebarIconActionTone,\n AppWorkspaceSidebarIconGridProps,\n AppWorkspaceSidebarItemActionProps,\n AppWorkspaceSidebarItemActionsProps,\n AppWorkspaceSidebarItemIconProps,\n AppWorkspaceSidebarItemLabelProps,\n AppWorkspaceSidebarItemMetaProps,\n AppWorkspaceSidebarItemProps,\n AppWorkspaceSidebarItemTone,\n AppWorkspaceSidebarProps,\n AppWorkspaceSidebarSectionProps,\n AppWorkspaceSidebarVisibility,\n} from \"./AppWorkspace\";\nexport { default as AppWorkspace } from \"./AppWorkspace\";\nexport type { AppWorkspaceControllerOptions } from \"./app-workspace-controller\";\nexport { installAppWorkspaceController } from \"./app-workspace-controller\";\nexport type {\n AppWorkspaceLayoutState,\n AppWorkspaceResizeKind,\n} from \"./app-workspace-state\";\nexport {\n APP_WORKSPACE_DETAIL_DEFAULT,\n APP_WORKSPACE_DETAIL_MAX,\n APP_WORKSPACE_DETAIL_MIN,\n APP_WORKSPACE_DRAWER_DEFAULT,\n APP_WORKSPACE_DRAWER_MAX,\n APP_WORKSPACE_DRAWER_MIN,\n APP_WORKSPACE_MAIN_MIN,\n APP_WORKSPACE_MAIN_MIN_HEIGHT,\n APP_WORKSPACE_PANE_DEFAULT,\n APP_WORKSPACE_PANE_MAX,\n APP_WORKSPACE_PANE_MIN,\n APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD,\n APP_WORKSPACE_SIDEBAR_COLLAPSED,\n APP_WORKSPACE_SIDEBAR_DEFAULT,\n APP_WORKSPACE_SIDEBAR_MAX,\n APP_WORKSPACE_SIDEBAR_MIN,\n appWorkspaceLayoutStyle,\n appWorkspacePanelVariable,\n appWorkspaceResizeLimits,\n normalizeAppWorkspaceLayoutState,\n parseAppWorkspaceLayoutState,\n resolveAppWorkspaceSidebarWidth,\n safeAppWorkspacePanelId,\n serializeAppWorkspaceLayoutState,\n shouldCollapseAppWorkspaceSidebar,\n} from \"./app-workspace-state\";\nexport { type BottomSheetProps, bottomSheetOptions, default as BottomSheet } from \"./BottomSheet\";\nexport type { DataPanelProps } from \"./DataPanel\";\nexport { DataPanel } from \"./DataPanel\";\nexport type {\n DetailPanelActionButtonProps,\n DetailPanelActionLinkProps,\n DetailPanelActionProps,\n DetailPanelActionSecondary,\n DetailPanelBodyProps,\n DetailPanelGroupProps,\n DetailPanelHeaderProps,\n DetailPanelProps,\n DetailPanelSectionProps,\n DetailPanelSummaryProps,\n DetailPanelTone,\n} from \"./DetailPanel\";\nexport { default as DetailPanel } from \"./DetailPanel\";\nexport type { DiscussionComposerProps, DiscussionItemProps, DiscussionListProps, DiscussionProps } from \"./Discussion\";\nexport { default as Discussion } from \"./Discussion\";\nexport type {\n FloatingWindowClose,\n FloatingWindowProps,\n OpenFloatingWindowOptions,\n} from \"./FloatingWindow\";\nexport {\n default as FloatingWindow,\n type FloatingWindowRect,\n fitFloatingWindowRect,\n openFloatingWindow,\n} from \"./FloatingWindow\";\nexport type { MobileShellHeaderProps, MobileShellProps } from \"./MobileShell\";\nexport { default as MobileShell, observeMobileShell } from \"./MobileShell\";\nexport { default as Navigation, type NavigationProps } from \"./Navigation\";\nexport {\n createNavigation,\n findNavigationItem,\n type NavigationController,\n type NavigationItem,\n type NavigationOptions,\n type NavigationStatus,\n} from \"./navigation-model\";\nexport type {\n PanelDialogBodyProps,\n PanelDialogFooterProps,\n PanelDialogHeaderProps,\n PanelDialogProps,\n PanelDialogSectionProps,\n PanelDialogSurface,\n PanelDialogTabOption,\n PanelDialogTabsProps,\n} from \"./PanelDialog\";\nexport {\n confirmDiscardIfDirty,\n default as PanelDialog,\n panelDialogFixedOptions,\n panelDialogFixedPanelClass,\n panelDialogOptions,\n panelDialogPanelClass,\n panelDialogWideOptions,\n panelDialogWidePanelClass,\n panelDialogWorkspaceOptions,\n panelDialogWorkspacePanelClass,\n} from \"./PanelDialog\";\nexport type { PanelHeaderProps } from \"./PanelHeader\";\nexport { PanelHeader } from \"./PanelHeader\";\nexport type { PanesItem, PanesProps } from \"./Panes\";\nexport { default as Panes } from \"./Panes\";\nexport type { PullToRefreshProps, PullToRefreshState } from \"./PullToRefresh\";\nexport { default as PullToRefresh } from \"./PullToRefresh\";\nexport type {\n AddPanesItemOptions,\n PanesDirection,\n PanesGroup,\n PanesIntent,\n PanesLayout,\n PanesNode,\n PanesPath,\n PanesPathSegment,\n PanesSide,\n PanesSplit,\n} from \"./panes-layout\";\nexport {\n activatePanesItem,\n addPanesItem,\n applyPanesIntent,\n createPanesLayout,\n isPanesItemVisible,\n PANES_LAYOUT_VERSION,\n parsePanesLayout,\n reconcilePanesLayout,\n removePanesItem,\n resizePanesSplit,\n} from \"./panes-layout\";\nexport type { ScrollAreaProps } from \"./ScrollArea\";\nexport { default as ScrollArea } from \"./ScrollArea\";\nexport type {\n SettingsFieldControlProps,\n SettingsFieldProps,\n SettingsGroupActionProps,\n SettingsGroupProps,\n SettingsPageProps,\n SettingsPanelFooterProps,\n SettingsSaveBarProps,\n SettingsSectionProps,\n} from \"./Settings\";\nexport {\n readSettingsError,\n SettingsField,\n SettingsGroup,\n SettingsPage,\n SettingsPanelFooter,\n SettingsSaveBar,\n SettingsSection,\n sameSettingValue,\n} from \"./Settings\";\nexport type {\n SettingsCollectionActionProps,\n SettingsCollectionItemActionsProps,\n SettingsCollectionItemProps,\n SettingsCollectionItemReorderProps,\n SettingsCollectionItemStatusProps,\n SettingsCollectionProps,\n} from \"./SettingsCollection\";\nexport { default as SettingsCollection } from \"./SettingsCollection\";\nexport type {\n SettingsModalFooterProps,\n SettingsModalGroupProps,\n SettingsModalProps,\n SettingsModalTabProps,\n SettingsModalTabTone,\n} from \"./SettingsModal\";\nexport { default as SettingsModal } from \"./SettingsModal\";\nexport type { TabBarItem, TabBarProps } from \"./TabBar\";\nexport { default as TabBar } from \"./TabBar\";\n"],"mappings":"AAMA,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AA6BtD,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,6BAA6B,QAAQ,4BAA4B;AAK1E,SACE,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wCAAwC,EACxC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,QAC5B,uBAAuB;AAC9B,SAAgC,kBAAkB,EAAE,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEjG,SAAS,SAAS,QAAQ,aAAa;AAcvC,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAMpD,SACE,OAAO,IAAI,cAAc,EAEzB,qBAAqB,EACrB,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,OAAO,IAAI,WAAW,EAAE,kBAAkB,QAAQ,eAAe;AAC1E,SAAS,OAAO,IAAI,UAAU,QAA8B,cAAc;AAC1E,SACE,gBAAgB,EAChB,kBAAkB,QAKb,oBAAoB;AAW3B,SACE,qBAAqB,EACrB,OAAO,IAAI,WAAW,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,QACzB,eAAe;AAEtB,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAa1D,SACE,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,QACX,gBAAgB;AAEvB,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAWpD,SACE,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,QACX,YAAY;AASnB,SAAS,OAAO,IAAI,kBAAkB,QAAQ,sBAAsB;AAQpE,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAE1D,SAAS,OAAO,IAAI,MAAM,QAAQ,UAAU","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/index.ts"],"sourcesContent":["export type {\n AppOverviewCardsProps,\n AppOverviewEmptyStateProps,\n AppOverviewPanelProps,\n AppOverviewProps,\n} from \"./AppOverview\";\nexport { default as AppOverview } from \"./AppOverview\";\nexport type {\n AppWorkspaceBottomDrawerHeight,\n AppWorkspaceBottomDrawerProps,\n AppWorkspaceContentProps,\n AppWorkspaceDetailProps,\n AppWorkspaceDetailWidth,\n AppWorkspaceMainPaneProps,\n AppWorkspaceMainProps,\n AppWorkspaceNavTreeItemProps,\n AppWorkspaceNavTreeMove,\n AppWorkspaceNavTreeProps,\n AppWorkspaceProps,\n AppWorkspaceSidebarAccessoryVisibility,\n AppWorkspaceSidebarBodyProps,\n AppWorkspaceSidebarIconActionProps,\n AppWorkspaceSidebarIconActionTone,\n AppWorkspaceSidebarIconGridProps,\n AppWorkspaceSidebarItemActionProps,\n AppWorkspaceSidebarItemActionsProps,\n AppWorkspaceSidebarItemIconProps,\n AppWorkspaceSidebarItemLabelProps,\n AppWorkspaceSidebarItemMetaProps,\n AppWorkspaceSidebarItemProps,\n AppWorkspaceSidebarItemStatusProps,\n AppWorkspaceSidebarItemTone,\n AppWorkspaceSidebarProps,\n AppWorkspaceSidebarSectionProps,\n AppWorkspaceSidebarVisibility,\n} from \"./AppWorkspace\";\nexport { default as AppWorkspace } from \"./AppWorkspace\";\nexport type { AppWorkspaceControllerOptions } from \"./app-workspace-controller\";\nexport { installAppWorkspaceController } from \"./app-workspace-controller\";\nexport type {\n AppWorkspaceLayoutState,\n AppWorkspaceResizeKind,\n} from \"./app-workspace-state\";\nexport {\n APP_WORKSPACE_DETAIL_DEFAULT,\n APP_WORKSPACE_DETAIL_MAX,\n APP_WORKSPACE_DETAIL_MIN,\n APP_WORKSPACE_DRAWER_DEFAULT,\n APP_WORKSPACE_DRAWER_MAX,\n APP_WORKSPACE_DRAWER_MIN,\n APP_WORKSPACE_MAIN_MIN,\n APP_WORKSPACE_MAIN_MIN_HEIGHT,\n APP_WORKSPACE_PANE_DEFAULT,\n APP_WORKSPACE_PANE_MAX,\n APP_WORKSPACE_PANE_MIN,\n APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD,\n APP_WORKSPACE_SIDEBAR_COLLAPSED,\n APP_WORKSPACE_SIDEBAR_DEFAULT,\n APP_WORKSPACE_SIDEBAR_MAX,\n APP_WORKSPACE_SIDEBAR_MIN,\n appWorkspaceLayoutStyle,\n appWorkspacePanelVariable,\n appWorkspaceResizeLimits,\n normalizeAppWorkspaceLayoutState,\n parseAppWorkspaceLayoutState,\n resolveAppWorkspaceSidebarWidth,\n safeAppWorkspacePanelId,\n serializeAppWorkspaceLayoutState,\n shouldCollapseAppWorkspaceSidebar,\n} from \"./app-workspace-state\";\nexport { type BottomSheetProps, bottomSheetOptions, default as BottomSheet } from \"./BottomSheet\";\nexport type { DataPanelProps } from \"./DataPanel\";\nexport { DataPanel } from \"./DataPanel\";\nexport type {\n DetailPanelActionButtonProps,\n DetailPanelActionLinkProps,\n DetailPanelActionProps,\n DetailPanelActionSecondary,\n DetailPanelBodyProps,\n DetailPanelGroupProps,\n DetailPanelHeaderProps,\n DetailPanelProps,\n DetailPanelSectionProps,\n DetailPanelSummaryProps,\n DetailPanelTone,\n} from \"./DetailPanel\";\nexport { default as DetailPanel } from \"./DetailPanel\";\nexport type { DiscussionComposerProps, DiscussionItemProps, DiscussionListProps, DiscussionProps } from \"./Discussion\";\nexport { default as Discussion } from \"./Discussion\";\nexport type {\n FloatingWindowClose,\n FloatingWindowProps,\n OpenFloatingWindowOptions,\n} from \"./FloatingWindow\";\nexport {\n default as FloatingWindow,\n type FloatingWindowRect,\n fitFloatingWindowRect,\n openFloatingWindow,\n} from \"./FloatingWindow\";\nexport type { MobileShellHeaderProps, MobileShellProps } from \"./MobileShell\";\nexport { default as MobileShell, observeMobileShell } from \"./MobileShell\";\nexport { default as Navigation, type NavigationProps } from \"./Navigation\";\nexport {\n createNavigation,\n findNavigationItem,\n type NavigationController,\n type NavigationItem,\n type NavigationOptions,\n type NavigationStatus,\n} from \"./navigation-model\";\nexport type {\n PanelDialogBodyProps,\n PanelDialogFooterProps,\n PanelDialogHeaderProps,\n PanelDialogProps,\n PanelDialogSectionProps,\n PanelDialogSurface,\n PanelDialogTabOption,\n PanelDialogTabsProps,\n} from \"./PanelDialog\";\nexport {\n confirmDiscardIfDirty,\n default as PanelDialog,\n panelDialogFixedOptions,\n panelDialogFixedPanelClass,\n panelDialogOptions,\n panelDialogPanelClass,\n panelDialogWideOptions,\n panelDialogWidePanelClass,\n panelDialogWorkspaceOptions,\n panelDialogWorkspacePanelClass,\n} from \"./PanelDialog\";\nexport type { PanelHeaderProps } from \"./PanelHeader\";\nexport { PanelHeader } from \"./PanelHeader\";\nexport type { PanesItem, PanesProps } from \"./Panes\";\nexport { default as Panes } from \"./Panes\";\nexport type { PullToRefreshProps, PullToRefreshState } from \"./PullToRefresh\";\nexport { default as PullToRefresh } from \"./PullToRefresh\";\nexport type {\n AddPanesItemOptions,\n PanesDirection,\n PanesGroup,\n PanesIntent,\n PanesLayout,\n PanesNode,\n PanesPath,\n PanesPathSegment,\n PanesSide,\n PanesSplit,\n} from \"./panes-layout\";\nexport {\n activatePanesItem,\n addPanesItem,\n applyPanesIntent,\n createPanesLayout,\n isPanesItemVisible,\n PANES_LAYOUT_VERSION,\n parsePanesLayout,\n reconcilePanesLayout,\n removePanesItem,\n resizePanesSplit,\n} from \"./panes-layout\";\nexport type { ScrollAreaProps } from \"./ScrollArea\";\nexport { default as ScrollArea } from \"./ScrollArea\";\nexport type {\n SettingsFieldControlProps,\n SettingsFieldProps,\n SettingsGroupActionProps,\n SettingsGroupProps,\n SettingsPageProps,\n SettingsPanelFooterProps,\n SettingsSaveBarProps,\n SettingsSectionProps,\n} from \"./Settings\";\nexport {\n readSettingsError,\n SettingsField,\n SettingsGroup,\n SettingsPage,\n SettingsPanelFooter,\n SettingsSaveBar,\n SettingsSection,\n sameSettingValue,\n} from \"./Settings\";\nexport type {\n SettingsCollectionActionProps,\n SettingsCollectionItemActionsProps,\n SettingsCollectionItemProps,\n SettingsCollectionItemReorderProps,\n SettingsCollectionItemStatusProps,\n SettingsCollectionProps,\n} from \"./SettingsCollection\";\nexport { default as SettingsCollection } from \"./SettingsCollection\";\nexport type {\n SettingsModalFooterProps,\n SettingsModalGroupProps,\n SettingsModalProps,\n SettingsModalTabProps,\n SettingsModalTabTone,\n} from \"./SettingsModal\";\nexport { default as SettingsModal } from \"./SettingsModal\";\nexport type { TabBarItem, TabBarProps } from \"./TabBar\";\nexport { default as TabBar } from \"./TabBar\";\n"],"mappings":"AAMA,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AA8BtD,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,6BAA6B,QAAQ,4BAA4B;AAK1E,SACE,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wCAAwC,EACxC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,QAC5B,uBAAuB;AAC9B,SAAgC,kBAAkB,EAAE,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEjG,SAAS,SAAS,QAAQ,aAAa;AAcvC,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAMpD,SACE,OAAO,IAAI,cAAc,EAEzB,qBAAqB,EACrB,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,OAAO,IAAI,WAAW,EAAE,kBAAkB,QAAQ,eAAe;AAC1E,SAAS,OAAO,IAAI,UAAU,QAA8B,cAAc;AAC1E,SACE,gBAAgB,EAChB,kBAAkB,QAKb,oBAAoB;AAW3B,SACE,qBAAqB,EACrB,OAAO,IAAI,WAAW,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,QACzB,eAAe;AAEtB,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAa1D,SACE,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,QACX,gBAAgB;AAEvB,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAWpD,SACE,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,QACX,YAAY;AASnB,SAAS,OAAO,IAAI,kBAAkB,QAAQ,sBAAsB;AAQpE,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAE1D,SAAS,OAAO,IAAI,MAAM,QAAQ,UAAU","ignoreList":[]}
@@ -0,0 +1,212 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
4
+ import { setAttribute as _$setAttribute } from "solid-js/web";
5
+ import { memo as _$memo } from "solid-js/web";
6
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
7
+ import { createComponent as _$createComponent } from "solid-js/web";
8
+ import { insert as _$insert } from "solid-js/web";
9
+ import { className as _$className } from "solid-js/web";
10
+ import { effect as _$effect } from "solid-js/web";
11
+ import { getNextElement as _$getNextElement } from "solid-js/web";
12
+ var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-resource-card__icon aria-hidden=true><i>`),
13
+ _tmpl$2 = /*#__PURE__*/_$template(`<span class=k2b-resource-card__meta>`),
14
+ _tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-resource-card__preview>`),
15
+ _tmpl$4 = /*#__PURE__*/_$template(`<span class=k2b-resource-card__copy><span class=k2b-resource-card__title></span><!$><!/><!$><!/>`),
16
+ _tmpl$5 = /*#__PURE__*/_$template(`<span class=k2b-resource-card__icon aria-hidden=true>`),
17
+ _tmpl$6 = /*#__PURE__*/_$template(`<span class=k2b-resource-card__copy><span class=k2b-resource-card__bar aria-hidden=true></span><span class=k2b-resource-card__bar aria-hidden=true></span><span class=k2b-sr-only>`),
18
+ _tmpl$7 = /*#__PURE__*/_$template(`<span class=k2b-resource-card__copy><span class=k2b-resource-card__label>`),
19
+ _tmpl$8 = /*#__PURE__*/_$template(`<div>`),
20
+ _tmpl$9 = /*#__PURE__*/_$template(`<a>`),
21
+ _tmpl$0 = /*#__PURE__*/_$template(`<button type=button>`);
22
+ import { Match, Show, Switch } from "solid-js";
23
+ import { useUiMessages } from "../intl/messages";
24
+
25
+ /**
26
+ * What a card can show of the element it stands for: the element itself, a placeholder while it is being looked up, or
27
+ * why it cannot be shown.
28
+ */
29
+
30
+ const DEFAULT_ICON = "ti ti-file";
31
+ const LINK_PROTOCOLS = new Set(["https:", "http:"]);
32
+ const STATE_ICONS = {
33
+ no_access: "ti ti-lock",
34
+ deleted: "ti ti-trash",
35
+ unavailable: "ti ti-cloud-off"
36
+ };
37
+
38
+ /** A link the card may open: absolute with an allowed scheme, or relative to the page. */
39
+ const linkUrl = href => {
40
+ if (!href) return undefined;
41
+ try {
42
+ return LINK_PROTOCOLS.has(new URL(href, "https://relative.invalid/").protocol) ? href : undefined;
43
+ } catch {
44
+ return undefined;
45
+ }
46
+ };
47
+
48
+ /**
49
+ * A card for an element that something refers to, such as a task or a document, with the same size in every state.
50
+ * Outside state `"ok"`, it shows none of the element's fields and opens nothing, whatever the caller passes.
51
+ */
52
+ export function ResourceCard(props) {
53
+ const messages = useUiMessages();
54
+ const state = () => props.state ?? "ok";
55
+ const ok = () => state() === "ok";
56
+ const title = () => props.title?.trim() ? props.title : messages().resourceUntitled;
57
+ const meta = () => [props.source, props.location].filter(part => part?.trim()).join(" · ");
58
+ /** Why the element cannot be shown, outside `"ok"` and `"loading"`. */
59
+ const reason = () => {
60
+ const current = state();
61
+ return current === "ok" || current === "loading" ? undefined : current;
62
+ };
63
+ const className = () => `k2b-resource-card${props.class ? ` ${props.class}` : ""}`;
64
+ const content = () => _$createComponent(Switch, {
65
+ get children() {
66
+ return [_$createComponent(Match, {
67
+ get when() {
68
+ return ok();
69
+ },
70
+ get children() {
71
+ return [(() => {
72
+ var _el$ = _$getNextElement(_tmpl$),
73
+ _el$2 = _el$.firstChild;
74
+ _$effect(() => _$className(_el$2, props.icon ?? DEFAULT_ICON));
75
+ return _el$;
76
+ })(), (() => {
77
+ var _el$3 = _$getNextElement(_tmpl$4),
78
+ _el$4 = _el$3.firstChild,
79
+ _el$7 = _el$4.nextSibling,
80
+ [_el$8, _co$] = _$getNextMarker(_el$7.nextSibling),
81
+ _el$9 = _el$8.nextSibling,
82
+ [_el$0, _co$2] = _$getNextMarker(_el$9.nextSibling);
83
+ _$insert(_el$4, title);
84
+ _$insert(_el$3, _$createComponent(Show, {
85
+ get when() {
86
+ return meta();
87
+ },
88
+ get children() {
89
+ var _el$5 = _$getNextElement(_tmpl$2);
90
+ _$insert(_el$5, meta);
91
+ return _el$5;
92
+ }
93
+ }), _el$8, _co$);
94
+ _$insert(_el$3, _$createComponent(Show, {
95
+ get when() {
96
+ return props.preview?.trim();
97
+ },
98
+ get children() {
99
+ var _el$6 = _$getNextElement(_tmpl$3);
100
+ _$insert(_el$6, () => props.preview);
101
+ return _el$6;
102
+ }
103
+ }), _el$0, _co$2);
104
+ return _el$3;
105
+ })()];
106
+ }
107
+ }), _$createComponent(Match, {
108
+ get when() {
109
+ return state() === "loading";
110
+ },
111
+ get children() {
112
+ return [_$getNextElement(_tmpl$5), (() => {
113
+ var _el$10 = _$getNextElement(_tmpl$6),
114
+ _el$11 = _el$10.firstChild,
115
+ _el$12 = _el$11.nextSibling,
116
+ _el$13 = _el$12.nextSibling;
117
+ _$insert(_el$13, () => messages().loading);
118
+ return _el$10;
119
+ })()];
120
+ }
121
+ }), _$createComponent(Match, {
122
+ get when() {
123
+ return reason();
124
+ },
125
+ children: reason => [(() => {
126
+ var _el$14 = _$getNextElement(_tmpl$),
127
+ _el$15 = _el$14.firstChild;
128
+ _$effect(() => _$className(_el$15, STATE_ICONS[reason()]));
129
+ return _el$14;
130
+ })(), (() => {
131
+ var _el$16 = _$getNextElement(_tmpl$7),
132
+ _el$17 = _el$16.firstChild;
133
+ _$insert(_el$17, (() => {
134
+ var _c$ = _$memo(() => reason() === "no_access");
135
+ return () => _c$() ? messages().resourceNoAccess : _$memo(() => reason() === "deleted")() ? messages().resourceDeleted : messages().resourceUnavailable;
136
+ })());
137
+ return _el$16;
138
+ })()]
139
+ })];
140
+ }
141
+ });
142
+ return _$createComponent(Show, {
143
+ get when() {
144
+ return _$memo(() => !!ok())() && props.onOpen;
145
+ },
146
+ get fallback() {
147
+ return _$createComponent(Show, {
148
+ get when() {
149
+ return _$memo(() => !!ok())() && linkUrl(props.href);
150
+ },
151
+ get fallback() {
152
+ return (() => {
153
+ var _el$18 = _$getNextElement(_tmpl$8);
154
+ _$insert(_el$18, content);
155
+ _$effect(_p$ => {
156
+ var _v$ = className(),
157
+ _v$2 = state(),
158
+ _v$3 = state() === "loading" ? "true" : undefined;
159
+ _v$ !== _p$.e && _$className(_el$18, _p$.e = _v$);
160
+ _v$2 !== _p$.t && _$setAttribute(_el$18, "data-state", _p$.t = _v$2);
161
+ _v$3 !== _p$.a && _$setAttribute(_el$18, "aria-busy", _p$.a = _v$3);
162
+ return _p$;
163
+ }, {
164
+ e: undefined,
165
+ t: undefined,
166
+ a: undefined
167
+ });
168
+ return _el$18;
169
+ })();
170
+ },
171
+ children: href => (() => {
172
+ var _el$19 = _$getNextElement(_tmpl$9);
173
+ _$insert(_el$19, content);
174
+ _$effect(_p$ => {
175
+ var _v$4 = className(),
176
+ _v$5 = state(),
177
+ _v$6 = href();
178
+ _v$4 !== _p$.e && _$className(_el$19, _p$.e = _v$4);
179
+ _v$5 !== _p$.t && _$setAttribute(_el$19, "data-state", _p$.t = _v$5);
180
+ _v$6 !== _p$.a && _$setAttribute(_el$19, "href", _p$.a = _v$6);
181
+ return _p$;
182
+ }, {
183
+ e: undefined,
184
+ t: undefined,
185
+ a: undefined
186
+ });
187
+ return _el$19;
188
+ })()
189
+ });
190
+ },
191
+ children: open => (() => {
192
+ var _el$20 = _$getNextElement(_tmpl$0);
193
+ _el$20.$$click = () => open()();
194
+ _$insert(_el$20, content);
195
+ _$effect(_p$ => {
196
+ var _v$7 = className(),
197
+ _v$8 = state();
198
+ _v$7 !== _p$.e && _$className(_el$20, _p$.e = _v$7);
199
+ _v$8 !== _p$.t && _$setAttribute(_el$20, "data-state", _p$.t = _v$8);
200
+ return _p$;
201
+ }, {
202
+ e: undefined,
203
+ t: undefined
204
+ });
205
+ _$runHydrationEvents();
206
+ return _el$20;
207
+ })()
208
+ });
209
+ }
210
+ export default ResourceCard;
211
+ _$delegateEvents(["click"]);
212
+ //# sourceMappingURL=ResourceCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["surfaces/ResourceCard.tsx"],"sourcesContent":["import { type JSX, Match, Show, Switch } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\n/**\n * What a card can show of the element it stands for: the element itself, a placeholder while it is being looked up, or\n * why it cannot be shown.\n */\nexport type ResourceCardState = \"ok\" | \"loading\" | \"no_access\" | \"deleted\" | \"unavailable\";\n\nexport type ResourceCardProps = {\n /** Defaults to `\"ok\"`. Every state has the same size, so a card that changes state moves nothing around it. */\n state?: ResourceCardState;\n /** The element's name. Shown only in state `\"ok\"`, as \"Untitled\" when blank, so a card that opens always has a name. */\n title?: string;\n /** Icon class of the element's kind, for example `ti ti-notebook`. Shown only in state `\"ok\"`. */\n icon?: string;\n /** What the element belongs to, for example the application or service. Shown only in state `\"ok\"`. */\n source?: string;\n /** Where the element lives within its source, for example a folder or a project. Shown only in state `\"ok\"`. */\n location?: string;\n /** One line of plain text from the element. Shown only in state `\"ok\"`. */\n preview?: string;\n /** Opens the element, for example in a panel. Takes precedence over `href`. Only in state `\"ok\"`. */\n onOpen?: () => void;\n /** Opens the element. Absolute `https` or `http`, or relative. Only in state `\"ok\"`. */\n href?: string;\n class?: string;\n};\n\nconst DEFAULT_ICON = \"ti ti-file\";\nconst LINK_PROTOCOLS = new Set([\"https:\", \"http:\"]);\nconst STATE_ICONS = { no_access: \"ti ti-lock\", deleted: \"ti ti-trash\", unavailable: \"ti ti-cloud-off\" } as const;\n\n/** A link the card may open: absolute with an allowed scheme, or relative to the page. */\nconst linkUrl = (href: string | undefined): string | undefined => {\n if (!href) return undefined;\n try {\n return LINK_PROTOCOLS.has(new URL(href, \"https://relative.invalid/\").protocol) ? href : undefined;\n } catch {\n return undefined;\n }\n};\n\n/**\n * A card for an element that something refers to, such as a task or a document, with the same size in every state.\n * Outside state `\"ok\"`, it shows none of the element's fields and opens nothing, whatever the caller passes.\n */\nexport function ResourceCard(props: ResourceCardProps): JSX.Element {\n const messages = useUiMessages();\n const state = () => props.state ?? \"ok\";\n const ok = () => state() === \"ok\";\n const title = () => (props.title?.trim() ? props.title : messages().resourceUntitled);\n const meta = () => [props.source, props.location].filter((part) => part?.trim()).join(\" · \");\n /** Why the element cannot be shown, outside `\"ok\"` and `\"loading\"`. */\n const reason = (): Exclude<ResourceCardState, \"ok\" | \"loading\"> | undefined => {\n const current = state();\n return current === \"ok\" || current === \"loading\" ? undefined : current;\n };\n const className = () => `k2b-resource-card${props.class ? ` ${props.class}` : \"\"}`;\n\n const content = () => (\n <Switch>\n <Match when={ok()}>\n <span class=\"k2b-resource-card__icon\" aria-hidden=\"true\">\n <i class={props.icon ?? DEFAULT_ICON} />\n </span>\n <span class=\"k2b-resource-card__copy\">\n <span class=\"k2b-resource-card__title\">{title()}</span>\n <Show when={meta()}>\n <span class=\"k2b-resource-card__meta\">{meta()}</span>\n </Show>\n <Show when={props.preview?.trim()}>\n <span class=\"k2b-resource-card__preview\">{props.preview}</span>\n </Show>\n </span>\n </Match>\n <Match when={state() === \"loading\"}>\n <span class=\"k2b-resource-card__icon\" aria-hidden=\"true\" />\n <span class=\"k2b-resource-card__copy\">\n <span class=\"k2b-resource-card__bar\" aria-hidden=\"true\" />\n <span class=\"k2b-resource-card__bar\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{messages().loading}</span>\n </span>\n </Match>\n <Match when={reason()}>\n {(reason) => (\n <>\n <span class=\"k2b-resource-card__icon\" aria-hidden=\"true\">\n <i class={STATE_ICONS[reason()]} />\n </span>\n <span class=\"k2b-resource-card__copy\">\n <span class=\"k2b-resource-card__label\">\n {reason() === \"no_access\"\n ? messages().resourceNoAccess\n : reason() === \"deleted\"\n ? messages().resourceDeleted\n : messages().resourceUnavailable}\n </span>\n </span>\n </>\n )}\n </Match>\n </Switch>\n );\n\n return (\n <Show\n when={ok() && props.onOpen}\n fallback={\n <Show\n when={ok() && linkUrl(props.href)}\n fallback={\n <div class={className()} data-state={state()} aria-busy={state() === \"loading\" ? \"true\" : undefined}>\n {content()}\n </div>\n }\n >\n {(href) => (\n <a class={className()} data-state={state()} href={href()}>\n {content()}\n </a>\n )}\n </Show>\n }\n >\n {(open) => (\n <button type=\"button\" class={className()} data-state={state()} onClick={() => open()()}>\n {content()}\n </button>\n )}\n </Show>\n );\n}\n\nexport default ResourceCard;\n"],"mappings":"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","ignoreList":[]}
@@ -7,6 +7,7 @@ export { Paper } from "./Paper";
7
7
  export { default as Placeholder } from "./Placeholder";
8
8
  export { ProgressBar } from "./ProgressBar";
9
9
  export { ProgressRing } from "./ProgressRing";
10
+ export { ResourceCard } from "./ResourceCard";
10
11
  export { StatCell } from "./StatCell";
11
12
  export { StatGrid } from "./StatGrid";
12
13
  export { StatusBadge } from "./StatusBadge";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["surfaces/index.ts"],"sourcesContent":["export type { AvatarProps, AvatarSize } from \"./Avatar\";\nexport { Avatar } from \"./Avatar\";\nexport type { DescriptionListItem, DescriptionListProps } from \"./DescriptionList\";\nexport { DescriptionList } from \"./DescriptionList\";\nexport type { LinkCardColor, LinkCardProps } from \"./LinkCard\";\nexport { LinkCard } from \"./LinkCard\";\nexport type { NotFoundStateAction, NotFoundStateProps } from \"./NotFoundState\";\nexport { NotFoundState } from \"./NotFoundState\";\nexport type { NoticeCardProps, NoticeGridProps, NoticeTone } from \"./NoticeCard\";\nexport { NOTICE_CARD_CLASSES, NoticeCard } from \"./NoticeCard\";\nexport type { PaperProps, PaperTag } from \"./Paper\";\nexport { Paper } from \"./Paper\";\nexport type {\n PlaceholderAlign,\n PlaceholderProps,\n PlaceholderState,\n PlaceholderSurface,\n PlaceholderVariant,\n} from \"./Placeholder\";\nexport { default as Placeholder } from \"./Placeholder\";\nexport type { ProgressBarProps, ProgressBarTone } from \"./ProgressBar\";\nexport { ProgressBar } from \"./ProgressBar\";\nexport type { ProgressRingProps, ProgressRingTone } from \"./ProgressRing\";\nexport { ProgressRing } from \"./ProgressRing\";\nexport type { StatCellAccent, StatCellProps, StatCellTone } from \"./StatCell\";\nexport { StatCell } from \"./StatCell\";\nexport type {\n StatGridAction,\n StatGridColumns,\n StatGridProps,\n StatGridSize,\n StatGridSurface,\n} from \"./StatGrid\";\nexport { StatGrid } from \"./StatGrid\";\nexport type { StatusBadgeProps, StatusTone } from \"./StatusBadge\";\nexport { StatusBadge } from \"./StatusBadge\";\nexport type { TagProps, TagSize } from \"./Tag\";\nexport { Tag } from \"./Tag\";\n"],"mappings":"AACA,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,eAAe,QAAQ,mBAAmB;AAEnD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,mBAAmB,EAAE,UAAU,QAAQ,cAAc;AAE9D,SAAS,KAAK,QAAQ,SAAS;AAQ/B,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,GAAG,QAAQ,OAAO","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["surfaces/index.ts"],"sourcesContent":["export type { AvatarProps, AvatarSize } from \"./Avatar\";\nexport { Avatar } from \"./Avatar\";\nexport type { DescriptionListItem, DescriptionListProps } from \"./DescriptionList\";\nexport { DescriptionList } from \"./DescriptionList\";\nexport type { LinkCardColor, LinkCardProps } from \"./LinkCard\";\nexport { LinkCard } from \"./LinkCard\";\nexport type { NotFoundStateAction, NotFoundStateProps } from \"./NotFoundState\";\nexport { NotFoundState } from \"./NotFoundState\";\nexport type { NoticeCardProps, NoticeGridProps, NoticeTone } from \"./NoticeCard\";\nexport { NOTICE_CARD_CLASSES, NoticeCard } from \"./NoticeCard\";\nexport type { PaperProps, PaperTag } from \"./Paper\";\nexport { Paper } from \"./Paper\";\nexport type {\n PlaceholderAlign,\n PlaceholderProps,\n PlaceholderState,\n PlaceholderSurface,\n PlaceholderVariant,\n} from \"./Placeholder\";\nexport { default as Placeholder } from \"./Placeholder\";\nexport type { ProgressBarProps, ProgressBarTone } from \"./ProgressBar\";\nexport { ProgressBar } from \"./ProgressBar\";\nexport type { ProgressRingProps, ProgressRingTone } from \"./ProgressRing\";\nexport { ProgressRing } from \"./ProgressRing\";\nexport type { ResourceCardProps, ResourceCardState } from \"./ResourceCard\";\nexport { ResourceCard } from \"./ResourceCard\";\nexport type { StatCellAccent, StatCellProps, StatCellTone } from \"./StatCell\";\nexport { StatCell } from \"./StatCell\";\nexport type {\n StatGridAction,\n StatGridColumns,\n StatGridProps,\n StatGridSize,\n StatGridSurface,\n} from \"./StatGrid\";\nexport { StatGrid } from \"./StatGrid\";\nexport type { StatusBadgeProps, StatusTone } from \"./StatusBadge\";\nexport { StatusBadge } from \"./StatusBadge\";\nexport type { TagProps, TagSize } from \"./Tag\";\nexport { Tag } from \"./Tag\";\n"],"mappings":"AACA,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,eAAe,QAAQ,mBAAmB;AAEnD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,mBAAmB,EAAE,UAAU,QAAQ,cAAc;AAE9D,SAAS,KAAK,QAAQ,SAAS;AAQ/B,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,GAAG,QAAQ,OAAO","ignoreList":[]}
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017-2019 Miles Johnson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -9,7 +9,7 @@ import { createMemo, createSignal, createUniqueId, onCleanup, onMount, Show } fr
9
9
  import { Portal } from "solid-js/web";
10
10
  import { returnFocus, ringOnReturn } from "../internal/focus-return";
11
11
  import { useUiMessages } from "../intl/messages";
12
- import { DropdownItems, dropdownPosition } from "./Dropdown";
12
+ import { DropdownItems, dropdownPosition, focusRowSegment } from "./Dropdown";
13
13
  let closeActiveContextMenu;
14
14
  const focusableItems = menu => menu ? Array.from(menu.querySelectorAll(["[role='menuitem']:not([aria-disabled='true'])", "[role='menuitemcheckbox']:not([aria-disabled='true'])", "[role='menuitemradio']:not([aria-disabled='true'])"].join(", "))) : [];
15
15
 
@@ -131,6 +131,8 @@ export function ContextMenu(props) {
131
131
  if (event.key === "ArrowDown" || event.key === "ArrowUp") {
132
132
  event.preventDefault();
133
133
  focusItem(current + (event.key === "ArrowDown" ? 1 : -1));
134
+ } else if (focusRowSegment(items, event.key)) {
135
+ event.preventDefault();
134
136
  } else if (event.key === "Home" || event.key === "End") {
135
137
  event.preventDefault();
136
138
  focusItem(event.key === "Home" ? 0 : -1);
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["actions/ContextMenu.tsx"],"sourcesContent":["import { createMemo, createSignal, createUniqueId, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { type DropdownItem, DropdownItems, type DropdownPosition, dropdownPosition } from \"./Dropdown\";\n\nexport type ContextMenuProps = {\n items: readonly DropdownItem[];\n children: JSX.Element;\n class?: string | ((isOpen: boolean) => string);\n /** Tab order of the context-menu host. Descendant-focused composite widgets use -1. */\n tabIndex?: number;\n disabled?: boolean;\n onClose?: () => void;\n onOpen?: () => void;\n id?: string;\n label?: string;\n};\n\nlet closeActiveContextMenu: (() => void) | undefined;\n\nconst focusableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\n/** Right-click menu with keyboard invocation, one-open-at-a-time behavior, and viewport clamping. */\nexport function ContextMenu(props: ContextMenuProps): JSX.Element {\n const messages = useUiMessages();\n const generatedId = `k2b-context-${createUniqueId()}`;\n const menuId = `${generatedId}-menu`;\n const [position, setPosition] = createSignal<{ x: number; y: number }>();\n let host: HTMLDivElement | undefined;\n let menu: HTMLDivElement | undefined;\n let listenersAttached = false;\n let hostRing = true;\n let anchor = { x: 0, y: 0 };\n let viewport = { width: 0, height: 0 };\n let resizeObserver: ResizeObserver | undefined;\n\n const isOpen = () => position() !== undefined;\n const hostClass = createMemo(() => (typeof props.class === \"function\" ? props.class(isOpen()) : props.class));\n const items = createMemo<readonly DropdownItem[]>(() => props.items);\n\n const dismiss = (event: PointerEvent) => {\n if (menu?.contains(event.target as Node)) return;\n close();\n };\n const closeOnScroll = (event: Event) => {\n const target = event.target;\n if (target instanceof Node && menu?.contains(target)) return;\n close();\n };\n // A resize event may leave the viewport's size unchanged; headless Chromium\n // was seen to fire one on a fresh page. The clamped menu is still in place.\n const closeOnResize = () => {\n if (window.innerWidth === viewport.width && window.innerHeight === viewport.height) return;\n close();\n };\n const attachOpenListeners = () => {\n if (listenersAttached) return;\n listenersAttached = true;\n document.addEventListener(\"pointerdown\", dismiss);\n document.addEventListener(\"keydown\", keyDown);\n window.addEventListener(\"resize\", closeOnResize);\n window.addEventListener(\"scroll\", closeOnScroll, true);\n };\n const detachOpenListeners = () => {\n if (!listenersAttached) return;\n listenersAttached = false;\n document.removeEventListener(\"pointerdown\", dismiss);\n document.removeEventListener(\"keydown\", keyDown);\n window.removeEventListener(\"resize\", closeOnResize);\n window.removeEventListener(\"scroll\", closeOnScroll, true);\n resizeObserver?.disconnect();\n };\n /** Clamps the rendered menu into the viewport beside the point that opened it. */\n const place = () => {\n if (!isOpen() || !menu?.isConnected) return;\n const point = dropdownPosition(\n new DOMRect(anchor.x, anchor.y, 0, 0),\n menu.getBoundingClientRect(),\n \"bottom-right\" satisfies DropdownPosition,\n { width: window.innerWidth, height: window.innerHeight },\n 0,\n );\n setPosition({ x: point.left, y: point.top });\n };\n const close = () => {\n detachOpenListeners();\n if (!isOpen()) return;\n setPosition();\n if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;\n props.onClose?.();\n };\n const focusItem = (index: number) => {\n const items = focusableItems(menu);\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n };\n const open = (x: number, y: number) => {\n if (props.disabled) return;\n closeActiveContextMenu?.();\n // Focus may sit on a descendant of the host, as in composite widgets.\n hostRing = ringOnReturn(document.activeElement);\n anchor = { x, y };\n viewport = { width: window.innerWidth, height: window.innerHeight };\n setPosition({ x, y });\n closeActiveContextMenu = close;\n attachOpenListeners();\n props.onOpen?.();\n // The menu sizes to its entries, so it is measured once rendered and\n // clamped into the viewport before the next paint, and again whenever its\n // entries change its size while it is open.\n queueMicrotask(() => {\n if (!isOpen() || !menu?.isConnected) return;\n place();\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver ??= new ResizeObserver(place);\n resizeObserver.observe(menu);\n }\n focusItem(0);\n });\n };\n const keyDown = (event: KeyboardEvent) => {\n if (!isOpen()) return;\n const items = focusableItems(menu);\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n focusItem(current + (event.key === \"ArrowDown\" ? 1 : -1));\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusItem(event.key === \"Home\" ? 0 : -1);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n returnFocus(host, hostRing);\n } else if (event.key === \"Tab\") {\n close();\n }\n };\n\n onMount(() => {\n onCleanup(() => {\n detachOpenListeners();\n if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;\n });\n });\n\n return (\n <>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: the named group owns the context-menu relationship without pretending arbitrary children form one button. */}\n <div\n ref={host}\n id={props.id ?? generatedId}\n class={hostClass()}\n role=\"group\"\n tabIndex={props.disabled ? undefined : (props.tabIndex ?? 0)}\n aria-label={props.label ?? messages().contextMenu}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen()}\n aria-controls={isOpen() ? menuId : undefined}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onContextMenu={(event) => {\n if (props.disabled) return;\n event.preventDefault();\n event.stopPropagation();\n open(event.clientX, event.clientY);\n }}\n onKeyDown={(event) => {\n if (props.disabled || (event.key !== \"ContextMenu\" && !(event.shiftKey && event.key === \"F10\"))) return;\n event.preventDefault();\n const rect = host?.getBoundingClientRect();\n if (rect) open(rect.left + 12, rect.top + 12);\n }}\n >\n {props.children}\n </div>\n <Show when={position()}>\n {(point) => (\n <Portal>\n <div\n ref={menu}\n id={menuId}\n class=\"k2b-ui k2b-context-menu\"\n role=\"menu\"\n aria-label={props.label ?? messages().contextMenu}\n style={{ left: `${point().x}px`, top: `${point().y}px` }}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <DropdownItems items={items()} close={close} />\n </div>\n </Portal>\n )}\n </Show>\n </>\n );\n}\n\nexport default ContextMenu;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["actions/ContextMenu.tsx"],"sourcesContent":["import { createMemo, createSignal, createUniqueId, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { type DropdownItem, DropdownItems, type DropdownPosition, dropdownPosition, focusRowSegment } from \"./Dropdown\";\n\nexport type ContextMenuProps = {\n items: readonly DropdownItem[];\n children: JSX.Element;\n class?: string | ((isOpen: boolean) => string);\n /** Tab order of the context-menu host. Descendant-focused composite widgets use -1. */\n tabIndex?: number;\n disabled?: boolean;\n onClose?: () => void;\n onOpen?: () => void;\n id?: string;\n label?: string;\n};\n\nlet closeActiveContextMenu: (() => void) | undefined;\n\nconst focusableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\n/** Right-click menu with keyboard invocation, one-open-at-a-time behavior, and viewport clamping. */\nexport function ContextMenu(props: ContextMenuProps): JSX.Element {\n const messages = useUiMessages();\n const generatedId = `k2b-context-${createUniqueId()}`;\n const menuId = `${generatedId}-menu`;\n const [position, setPosition] = createSignal<{ x: number; y: number }>();\n let host: HTMLDivElement | undefined;\n let menu: HTMLDivElement | undefined;\n let listenersAttached = false;\n let hostRing = true;\n let anchor = { x: 0, y: 0 };\n let viewport = { width: 0, height: 0 };\n let resizeObserver: ResizeObserver | undefined;\n\n const isOpen = () => position() !== undefined;\n const hostClass = createMemo(() => (typeof props.class === \"function\" ? props.class(isOpen()) : props.class));\n const items = createMemo<readonly DropdownItem[]>(() => props.items);\n\n const dismiss = (event: PointerEvent) => {\n if (menu?.contains(event.target as Node)) return;\n close();\n };\n const closeOnScroll = (event: Event) => {\n const target = event.target;\n if (target instanceof Node && menu?.contains(target)) return;\n close();\n };\n // A resize event may leave the viewport's size unchanged; headless Chromium\n // was seen to fire one on a fresh page. The clamped menu is still in place.\n const closeOnResize = () => {\n if (window.innerWidth === viewport.width && window.innerHeight === viewport.height) return;\n close();\n };\n const attachOpenListeners = () => {\n if (listenersAttached) return;\n listenersAttached = true;\n document.addEventListener(\"pointerdown\", dismiss);\n document.addEventListener(\"keydown\", keyDown);\n window.addEventListener(\"resize\", closeOnResize);\n window.addEventListener(\"scroll\", closeOnScroll, true);\n };\n const detachOpenListeners = () => {\n if (!listenersAttached) return;\n listenersAttached = false;\n document.removeEventListener(\"pointerdown\", dismiss);\n document.removeEventListener(\"keydown\", keyDown);\n window.removeEventListener(\"resize\", closeOnResize);\n window.removeEventListener(\"scroll\", closeOnScroll, true);\n resizeObserver?.disconnect();\n };\n /** Clamps the rendered menu into the viewport beside the point that opened it. */\n const place = () => {\n if (!isOpen() || !menu?.isConnected) return;\n const point = dropdownPosition(\n new DOMRect(anchor.x, anchor.y, 0, 0),\n menu.getBoundingClientRect(),\n \"bottom-right\" satisfies DropdownPosition,\n { width: window.innerWidth, height: window.innerHeight },\n 0,\n );\n setPosition({ x: point.left, y: point.top });\n };\n const close = () => {\n detachOpenListeners();\n if (!isOpen()) return;\n setPosition();\n if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;\n props.onClose?.();\n };\n const focusItem = (index: number) => {\n const items = focusableItems(menu);\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n };\n const open = (x: number, y: number) => {\n if (props.disabled) return;\n closeActiveContextMenu?.();\n // Focus may sit on a descendant of the host, as in composite widgets.\n hostRing = ringOnReturn(document.activeElement);\n anchor = { x, y };\n viewport = { width: window.innerWidth, height: window.innerHeight };\n setPosition({ x, y });\n closeActiveContextMenu = close;\n attachOpenListeners();\n props.onOpen?.();\n // The menu sizes to its entries, so it is measured once rendered and\n // clamped into the viewport before the next paint, and again whenever its\n // entries change its size while it is open.\n queueMicrotask(() => {\n if (!isOpen() || !menu?.isConnected) return;\n place();\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver ??= new ResizeObserver(place);\n resizeObserver.observe(menu);\n }\n focusItem(0);\n });\n };\n const keyDown = (event: KeyboardEvent) => {\n if (!isOpen()) return;\n const items = focusableItems(menu);\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n focusItem(current + (event.key === \"ArrowDown\" ? 1 : -1));\n } else if (focusRowSegment(items, event.key)) {\n event.preventDefault();\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusItem(event.key === \"Home\" ? 0 : -1);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n returnFocus(host, hostRing);\n } else if (event.key === \"Tab\") {\n close();\n }\n };\n\n onMount(() => {\n onCleanup(() => {\n detachOpenListeners();\n if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;\n });\n });\n\n return (\n <>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: the named group owns the context-menu relationship without pretending arbitrary children form one button. */}\n <div\n ref={host}\n id={props.id ?? generatedId}\n class={hostClass()}\n role=\"group\"\n tabIndex={props.disabled ? undefined : (props.tabIndex ?? 0)}\n aria-label={props.label ?? messages().contextMenu}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen()}\n aria-controls={isOpen() ? menuId : undefined}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onContextMenu={(event) => {\n if (props.disabled) return;\n event.preventDefault();\n event.stopPropagation();\n open(event.clientX, event.clientY);\n }}\n onKeyDown={(event) => {\n if (props.disabled || (event.key !== \"ContextMenu\" && !(event.shiftKey && event.key === \"F10\"))) return;\n event.preventDefault();\n const rect = host?.getBoundingClientRect();\n if (rect) open(rect.left + 12, rect.top + 12);\n }}\n >\n {props.children}\n </div>\n <Show when={position()}>\n {(point) => (\n <Portal>\n <div\n ref={menu}\n id={menuId}\n class=\"k2b-ui k2b-context-menu\"\n role=\"menu\"\n aria-label={props.label ?? messages().contextMenu}\n style={{ left: `${point().x}px`, top: `${point().y}px` }}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <DropdownItems items={items()} close={close} />\n </div>\n </Portal>\n )}\n </Show>\n </>\n );\n}\n\nexport default ContextMenu;\n"],"mappings":"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","ignoreList":[]}