@k2b/ui 0.1.0-rc.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 (548) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +343 -0
  3. package/dist/.build-complete +0 -0
  4. package/dist/browser/actions/Button.js +236 -0
  5. package/dist/browser/actions/Button.js.map +1 -0
  6. package/dist/browser/actions/ContextMenu.js +199 -0
  7. package/dist/browser/actions/ContextMenu.js.map +1 -0
  8. package/dist/browser/actions/CopyButton.js +97 -0
  9. package/dist/browser/actions/CopyButton.js.map +1 -0
  10. package/dist/browser/actions/Disclosure.js +83 -0
  11. package/dist/browser/actions/Disclosure.js.map +1 -0
  12. package/dist/browser/actions/Dropdown.js +669 -0
  13. package/dist/browser/actions/Dropdown.js.map +1 -0
  14. package/dist/browser/actions/FilterChip.js +149 -0
  15. package/dist/browser/actions/FilterChip.js.map +1 -0
  16. package/dist/browser/actions/RemoveButton.js +47 -0
  17. package/dist/browser/actions/RemoveButton.js.map +1 -0
  18. package/dist/browser/actions/SegmentedControl.js +138 -0
  19. package/dist/browser/actions/SegmentedControl.js.map +1 -0
  20. package/dist/browser/actions/SplitButton.js +76 -0
  21. package/dist/browser/actions/SplitButton.js.map +1 -0
  22. package/dist/browser/actions/SpotlightSearch.js +87 -0
  23. package/dist/browser/actions/SpotlightSearch.js.map +1 -0
  24. package/dist/browser/actions/Tabs.js +185 -0
  25. package/dist/browser/actions/Tabs.js.map +1 -0
  26. package/dist/browser/actions/Toolbar.js +87 -0
  27. package/dist/browser/actions/Toolbar.js.map +1 -0
  28. package/dist/browser/actions/index.js +13 -0
  29. package/dist/browser/actions/index.js.map +1 -0
  30. package/dist/browser/chat/ChatComposer.js +760 -0
  31. package/dist/browser/chat/ChatComposer.js.map +1 -0
  32. package/dist/browser/chat/ChatPrimitives.js +688 -0
  33. package/dist/browser/chat/ChatPrimitives.js.map +1 -0
  34. package/dist/browser/chat/ChatRoot.js +27 -0
  35. package/dist/browser/chat/ChatRoot.js.map +1 -0
  36. package/dist/browser/chat/ChatTimeline.js +404 -0
  37. package/dist/browser/chat/ChatTimeline.js.map +1 -0
  38. package/dist/browser/chat/chat-behavior.js +53 -0
  39. package/dist/browser/chat/chat-behavior.js.map +1 -0
  40. package/dist/browser/chat/index.js +17 -0
  41. package/dist/browser/chat/index.js.map +1 -0
  42. package/dist/browser/chat/types.js +2 -0
  43. package/dist/browser/chat/types.js.map +1 -0
  44. package/dist/browser/content/Calendar.js +2168 -0
  45. package/dist/browser/content/Calendar.js.map +1 -0
  46. package/dist/browser/content/Chart.js +680 -0
  47. package/dist/browser/content/Chart.js.map +1 -0
  48. package/dist/browser/content/CodeDisplay.js +104 -0
  49. package/dist/browser/content/CodeDisplay.js.map +1 -0
  50. package/dist/browser/content/DataTable.js +724 -0
  51. package/dist/browser/content/DataTable.js.map +1 -0
  52. package/dist/browser/content/Docs.js +227 -0
  53. package/dist/browser/content/Docs.js.map +1 -0
  54. package/dist/browser/content/FileBrowser.js +462 -0
  55. package/dist/browser/content/FileBrowser.js.map +1 -0
  56. package/dist/browser/content/FileTree.js +453 -0
  57. package/dist/browser/content/FileTree.js.map +1 -0
  58. package/dist/browser/content/FileView.js +842 -0
  59. package/dist/browser/content/FileView.js.map +1 -0
  60. package/dist/browser/content/Lightbox.js +285 -0
  61. package/dist/browser/content/Lightbox.js.map +1 -0
  62. package/dist/browser/content/LogEntriesTable.js +139 -0
  63. package/dist/browser/content/LogEntriesTable.js.map +1 -0
  64. package/dist/browser/content/MarkdownView.js +138 -0
  65. package/dist/browser/content/MarkdownView.js.map +1 -0
  66. package/dist/browser/content/Pagination.js +182 -0
  67. package/dist/browser/content/Pagination.js.map +1 -0
  68. package/dist/browser/content/PdfPreview.js +204 -0
  69. package/dist/browser/content/PdfPreview.js.map +1 -0
  70. package/dist/browser/content/RangePicker.js +83 -0
  71. package/dist/browser/content/RangePicker.js.map +1 -0
  72. package/dist/browser/content/StructuredDataPreview.js +194 -0
  73. package/dist/browser/content/StructuredDataPreview.js.map +1 -0
  74. package/dist/browser/content/calendar-event-layout.js +92 -0
  75. package/dist/browser/content/calendar-event-layout.js.map +1 -0
  76. package/dist/browser/content/calendar-pointer.js +114 -0
  77. package/dist/browser/content/calendar-pointer.js.map +1 -0
  78. package/dist/browser/content/chart-map-viewport.js +33 -0
  79. package/dist/browser/content/chart-map-viewport.js.map +1 -0
  80. package/dist/browser/content/chart-state-timeline.js +124 -0
  81. package/dist/browser/content/chart-state-timeline.js.map +1 -0
  82. package/dist/browser/content/code-highlight.js +144 -0
  83. package/dist/browser/content/code-highlight.js.map +1 -0
  84. package/dist/browser/content/file-tree.js +93 -0
  85. package/dist/browser/content/file-tree.js.map +1 -0
  86. package/dist/browser/content/file-view-preview.js +112 -0
  87. package/dist/browser/content/file-view-preview.js.map +1 -0
  88. package/dist/browser/content/index.js +16 -0
  89. package/dist/browser/content/index.js.map +1 -0
  90. package/dist/browser/feedback/InlineGuidance.js +46 -0
  91. package/dist/browser/feedback/InlineGuidance.js.map +1 -0
  92. package/dist/browser/feedback/Tooltip.js +189 -0
  93. package/dist/browser/feedback/Tooltip.js.map +1 -0
  94. package/dist/browser/feedback/dialog-core.js +207 -0
  95. package/dist/browser/feedback/dialog-core.js.map +1 -0
  96. package/dist/browser/feedback/index.js +6 -0
  97. package/dist/browser/feedback/index.js.map +1 -0
  98. package/dist/browser/feedback/prompts.js +991 -0
  99. package/dist/browser/feedback/prompts.js.map +1 -0
  100. package/dist/browser/feedback/toast.js +271 -0
  101. package/dist/browser/feedback/toast.js.map +1 -0
  102. package/dist/browser/feedback/tooltip-position.js +25 -0
  103. package/dist/browser/feedback/tooltip-position.js.map +1 -0
  104. package/dist/browser/index.js +11 -0
  105. package/dist/browser/index.js.map +1 -0
  106. package/dist/browser/inputs/AutocompleteEditor.js +610 -0
  107. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -0
  108. package/dist/browser/inputs/AutocompleteSelect.js +632 -0
  109. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -0
  110. package/dist/browser/inputs/Checkbox.js +137 -0
  111. package/dist/browser/inputs/Checkbox.js.map +1 -0
  112. package/dist/browser/inputs/CheckboxCard.js +130 -0
  113. package/dist/browser/inputs/CheckboxCard.js.map +1 -0
  114. package/dist/browser/inputs/ChoiceGroups.js +174 -0
  115. package/dist/browser/inputs/ChoiceGroups.js.map +1 -0
  116. package/dist/browser/inputs/ChoiceInputs.js +400 -0
  117. package/dist/browser/inputs/ChoiceInputs.js.map +1 -0
  118. package/dist/browser/inputs/Combobox.js +274 -0
  119. package/dist/browser/inputs/Combobox.js.map +1 -0
  120. package/dist/browser/inputs/DatePicker.js +923 -0
  121. package/dist/browser/inputs/DatePicker.js.map +1 -0
  122. package/dist/browser/inputs/FileInputs.js +736 -0
  123. package/dist/browser/inputs/FileInputs.js.map +1 -0
  124. package/dist/browser/inputs/MultiSelectInput.js +565 -0
  125. package/dist/browser/inputs/MultiSelectInput.js.map +1 -0
  126. package/dist/browser/inputs/NumberInput.js +288 -0
  127. package/dist/browser/inputs/NumberInput.js.map +1 -0
  128. package/dist/browser/inputs/Select.js +507 -0
  129. package/dist/browser/inputs/Select.js.map +1 -0
  130. package/dist/browser/inputs/SelectChip.js +151 -0
  131. package/dist/browser/inputs/SelectChip.js.map +1 -0
  132. package/dist/browser/inputs/SpecialInputs.js +117 -0
  133. package/dist/browser/inputs/SpecialInputs.js.map +1 -0
  134. package/dist/browser/inputs/Switch.js +117 -0
  135. package/dist/browser/inputs/Switch.js.map +1 -0
  136. package/dist/browser/inputs/TagEditor.js +358 -0
  137. package/dist/browser/inputs/TagEditor.js.map +1 -0
  138. package/dist/browser/inputs/TagsInput.js +195 -0
  139. package/dist/browser/inputs/TagsInput.js.map +1 -0
  140. package/dist/browser/inputs/TemplateEditor.js +190 -0
  141. package/dist/browser/inputs/TemplateEditor.js.map +1 -0
  142. package/dist/browser/inputs/TextInput.js +318 -0
  143. package/dist/browser/inputs/TextInput.js.map +1 -0
  144. package/dist/browser/inputs/choice.js +188 -0
  145. package/dist/browser/inputs/choice.js.map +1 -0
  146. package/dist/browser/inputs/completion/behaviors.js +108 -0
  147. package/dist/browser/inputs/completion/behaviors.js.map +1 -0
  148. package/dist/browser/inputs/completion/engine.js +103 -0
  149. package/dist/browser/inputs/completion/engine.js.map +1 -0
  150. package/dist/browser/inputs/completion/index.js +4 -0
  151. package/dist/browser/inputs/completion/index.js.map +1 -0
  152. package/dist/browser/inputs/completion/overlay.js +25 -0
  153. package/dist/browser/inputs/completion/overlay.js.map +1 -0
  154. package/dist/browser/inputs/date-picker.js +123 -0
  155. package/dist/browser/inputs/date-picker.js.map +1 -0
  156. package/dist/browser/inputs/editor-dom.js +26 -0
  157. package/dist/browser/inputs/editor-dom.js.map +1 -0
  158. package/dist/browser/inputs/field-contract.js +9 -0
  159. package/dist/browser/inputs/field-contract.js.map +1 -0
  160. package/dist/browser/inputs/icon-options.js +46 -0
  161. package/dist/browser/inputs/icon-options.js.map +1 -0
  162. package/dist/browser/inputs/image-crop.js +145 -0
  163. package/dist/browser/inputs/image-crop.js.map +1 -0
  164. package/dist/browser/inputs/index.js +23 -0
  165. package/dist/browser/inputs/index.js.map +1 -0
  166. package/dist/browser/inputs/markdown/MarkdownEditor.js +725 -0
  167. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -0
  168. package/dist/browser/inputs/markdown/Toolbar.js +172 -0
  169. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -0
  170. package/dist/browser/inputs/markdown/actions.js +140 -0
  171. package/dist/browser/inputs/markdown/actions.js.map +1 -0
  172. package/dist/browser/inputs/markdown/active-formats.js +36 -0
  173. package/dist/browser/inputs/markdown/active-formats.js.map +1 -0
  174. package/dist/browser/inputs/markdown/behaviors.js +63 -0
  175. package/dist/browser/inputs/markdown/behaviors.js.map +1 -0
  176. package/dist/browser/inputs/markdown/code-zone.js +8 -0
  177. package/dist/browser/inputs/markdown/code-zone.js.map +1 -0
  178. package/dist/browser/internal/color.js +18 -0
  179. package/dist/browser/internal/color.js.map +1 -0
  180. package/dist/browser/internal/field.js +158 -0
  181. package/dist/browser/internal/field.js.map +1 -0
  182. package/dist/browser/internal/portal.js +17 -0
  183. package/dist/browser/internal/portal.js.map +1 -0
  184. package/dist/browser/intl/Format.js +273 -0
  185. package/dist/browser/intl/Format.js.map +1 -0
  186. package/dist/browser/intl/index.js +3 -0
  187. package/dist/browser/intl/index.js.map +1 -0
  188. package/dist/browser/intl/locale.js +63 -0
  189. package/dist/browser/intl/locale.js.map +1 -0
  190. package/dist/browser/intl/messages.js +753 -0
  191. package/dist/browser/intl/messages.js.map +1 -0
  192. package/dist/browser/layout/AppOverview.js +151 -0
  193. package/dist/browser/layout/AppOverview.js.map +1 -0
  194. package/dist/browser/layout/AppWorkspace.js +1502 -0
  195. package/dist/browser/layout/AppWorkspace.js.map +1 -0
  196. package/dist/browser/layout/DataPanel.js +122 -0
  197. package/dist/browser/layout/DataPanel.js.map +1 -0
  198. package/dist/browser/layout/DetailPanel.js +484 -0
  199. package/dist/browser/layout/DetailPanel.js.map +1 -0
  200. package/dist/browser/layout/Discussion.js +511 -0
  201. package/dist/browser/layout/Discussion.js.map +1 -0
  202. package/dist/browser/layout/FloatingWindow.js +332 -0
  203. package/dist/browser/layout/FloatingWindow.js.map +1 -0
  204. package/dist/browser/layout/PanelDialog.js +236 -0
  205. package/dist/browser/layout/PanelDialog.js.map +1 -0
  206. package/dist/browser/layout/PanelHeader.js +91 -0
  207. package/dist/browser/layout/PanelHeader.js.map +1 -0
  208. package/dist/browser/layout/Panes.js +978 -0
  209. package/dist/browser/layout/Panes.js.map +1 -0
  210. package/dist/browser/layout/ScrollArea.js +29 -0
  211. package/dist/browser/layout/ScrollArea.js.map +1 -0
  212. package/dist/browser/layout/Settings.js +381 -0
  213. package/dist/browser/layout/Settings.js.map +1 -0
  214. package/dist/browser/layout/SettingsCollection.js +212 -0
  215. package/dist/browser/layout/SettingsCollection.js.map +1 -0
  216. package/dist/browser/layout/SettingsModal.js +281 -0
  217. package/dist/browser/layout/SettingsModal.js.map +1 -0
  218. package/dist/browser/layout/app-workspace-controller.js +419 -0
  219. package/dist/browser/layout/app-workspace-controller.js.map +1 -0
  220. package/dist/browser/layout/app-workspace-state.js +125 -0
  221. package/dist/browser/layout/app-workspace-state.js.map +1 -0
  222. package/dist/browser/layout/floating-window-geometry.js +15 -0
  223. package/dist/browser/layout/floating-window-geometry.js.map +1 -0
  224. package/dist/browser/layout/index.js +17 -0
  225. package/dist/browser/layout/index.js.map +1 -0
  226. package/dist/browser/layout/panes-layout.js +436 -0
  227. package/dist/browser/layout/panes-layout.js.map +1 -0
  228. package/dist/browser/layout/stable-id.js +17 -0
  229. package/dist/browser/layout/stable-id.js.map +1 -0
  230. package/dist/browser/semantics.js +2 -0
  231. package/dist/browser/semantics.js.map +1 -0
  232. package/dist/browser/surfaces/Avatar.js +97 -0
  233. package/dist/browser/surfaces/Avatar.js.map +1 -0
  234. package/dist/browser/surfaces/DescriptionList.js +66 -0
  235. package/dist/browser/surfaces/DescriptionList.js.map +1 -0
  236. package/dist/browser/surfaces/LinkCard.js +40 -0
  237. package/dist/browser/surfaces/LinkCard.js.map +1 -0
  238. package/dist/browser/surfaces/NotFoundState.js +85 -0
  239. package/dist/browser/surfaces/NotFoundState.js.map +1 -0
  240. package/dist/browser/surfaces/NoticeCard.js +145 -0
  241. package/dist/browser/surfaces/NoticeCard.js.map +1 -0
  242. package/dist/browser/surfaces/Paper.js +33 -0
  243. package/dist/browser/surfaces/Paper.js.map +1 -0
  244. package/dist/browser/surfaces/Placeholder.js +90 -0
  245. package/dist/browser/surfaces/Placeholder.js.map +1 -0
  246. package/dist/browser/surfaces/ProgressBar.js +58 -0
  247. package/dist/browser/surfaces/ProgressBar.js.map +1 -0
  248. package/dist/browser/surfaces/StatCell.js +172 -0
  249. package/dist/browser/surfaces/StatCell.js.map +1 -0
  250. package/dist/browser/surfaces/StatGrid.js +80 -0
  251. package/dist/browser/surfaces/StatGrid.js.map +1 -0
  252. package/dist/browser/surfaces/StatusBadge.js +70 -0
  253. package/dist/browser/surfaces/StatusBadge.js.map +1 -0
  254. package/dist/browser/surfaces/Tag.js +94 -0
  255. package/dist/browser/surfaces/Tag.js.map +1 -0
  256. package/dist/browser/surfaces/index.js +13 -0
  257. package/dist/browser/surfaces/index.js.map +1 -0
  258. package/dist/browser/widgets/Widget.js +89 -0
  259. package/dist/browser/widgets/Widget.js.map +1 -0
  260. package/dist/browser/widgets/WidgetHero.js +47 -0
  261. package/dist/browser/widgets/WidgetHero.js.map +1 -0
  262. package/dist/browser/widgets/WidgetList.js +125 -0
  263. package/dist/browser/widgets/WidgetList.js.map +1 -0
  264. package/dist/browser/widgets/WidgetPills.js +78 -0
  265. package/dist/browser/widgets/WidgetPills.js.map +1 -0
  266. package/dist/browser/widgets/WidgetStat.js +114 -0
  267. package/dist/browser/widgets/WidgetStat.js.map +1 -0
  268. package/dist/browser/widgets/WidgetStatus.js +54 -0
  269. package/dist/browser/widgets/WidgetStatus.js.map +1 -0
  270. package/dist/browser/widgets/index.js +7 -0
  271. package/dist/browser/widgets/index.js.map +1 -0
  272. package/dist/global.css +3 -0
  273. package/dist/licenses/ibm-plex-mono.txt +93 -0
  274. package/dist/licenses/ibm-plex-sans.txt +93 -0
  275. package/dist/licenses/tabler-icons.txt +21 -0
  276. package/dist/plex.css +1 -0
  277. package/dist/ssr/actions/Button.js +203 -0
  278. package/dist/ssr/actions/Button.js.map +1 -0
  279. package/dist/ssr/actions/ContextMenu.js +128 -0
  280. package/dist/ssr/actions/ContextMenu.js.map +1 -0
  281. package/dist/ssr/actions/CopyButton.js +79 -0
  282. package/dist/ssr/actions/CopyButton.js.map +1 -0
  283. package/dist/ssr/actions/Disclosure.js +26 -0
  284. package/dist/ssr/actions/Disclosure.js.map +1 -0
  285. package/dist/ssr/actions/Dropdown.js +443 -0
  286. package/dist/ssr/actions/Dropdown.js.map +1 -0
  287. package/dist/ssr/actions/FilterChip.js +132 -0
  288. package/dist/ssr/actions/FilterChip.js.map +1 -0
  289. package/dist/ssr/actions/RemoveButton.js +45 -0
  290. package/dist/ssr/actions/RemoveButton.js.map +1 -0
  291. package/dist/ssr/actions/SegmentedControl.js +57 -0
  292. package/dist/ssr/actions/SegmentedControl.js.map +1 -0
  293. package/dist/ssr/actions/SplitButton.js +74 -0
  294. package/dist/ssr/actions/SplitButton.js.map +1 -0
  295. package/dist/ssr/actions/SpotlightSearch.js +38 -0
  296. package/dist/ssr/actions/SpotlightSearch.js.map +1 -0
  297. package/dist/ssr/actions/Tabs.js +91 -0
  298. package/dist/ssr/actions/Tabs.js.map +1 -0
  299. package/dist/ssr/actions/Toolbar.js +33 -0
  300. package/dist/ssr/actions/Toolbar.js.map +1 -0
  301. package/dist/ssr/actions/index.js +13 -0
  302. package/dist/ssr/actions/index.js.map +1 -0
  303. package/dist/ssr/chat/ChatComposer.js +392 -0
  304. package/dist/ssr/chat/ChatComposer.js.map +1 -0
  305. package/dist/ssr/chat/ChatPrimitives.js +377 -0
  306. package/dist/ssr/chat/ChatPrimitives.js.map +1 -0
  307. package/dist/ssr/chat/ChatRoot.js +10 -0
  308. package/dist/ssr/chat/ChatRoot.js.map +1 -0
  309. package/dist/ssr/chat/ChatTimeline.js +301 -0
  310. package/dist/ssr/chat/ChatTimeline.js.map +1 -0
  311. package/dist/ssr/chat/chat-behavior.js +53 -0
  312. package/dist/ssr/chat/chat-behavior.js.map +1 -0
  313. package/dist/ssr/chat/index.js +17 -0
  314. package/dist/ssr/chat/index.js.map +1 -0
  315. package/dist/ssr/chat/types.js +2 -0
  316. package/dist/ssr/chat/types.js.map +1 -0
  317. package/dist/ssr/content/Calendar.js +1542 -0
  318. package/dist/ssr/content/Calendar.js.map +1 -0
  319. package/dist/ssr/content/Chart.js +552 -0
  320. package/dist/ssr/content/Chart.js.map +1 -0
  321. package/dist/ssr/content/CodeDisplay.js +55 -0
  322. package/dist/ssr/content/CodeDisplay.js.map +1 -0
  323. package/dist/ssr/content/DataTable.js +470 -0
  324. package/dist/ssr/content/DataTable.js.map +1 -0
  325. package/dist/ssr/content/Docs.js +108 -0
  326. package/dist/ssr/content/Docs.js.map +1 -0
  327. package/dist/ssr/content/FileBrowser.js +422 -0
  328. package/dist/ssr/content/FileBrowser.js.map +1 -0
  329. package/dist/ssr/content/FileTree.js +299 -0
  330. package/dist/ssr/content/FileTree.js.map +1 -0
  331. package/dist/ssr/content/FileView.js +612 -0
  332. package/dist/ssr/content/FileView.js.map +1 -0
  333. package/dist/ssr/content/Lightbox.js +164 -0
  334. package/dist/ssr/content/Lightbox.js.map +1 -0
  335. package/dist/ssr/content/LogEntriesTable.js +106 -0
  336. package/dist/ssr/content/LogEntriesTable.js.map +1 -0
  337. package/dist/ssr/content/MarkdownView.js +119 -0
  338. package/dist/ssr/content/MarkdownView.js.map +1 -0
  339. package/dist/ssr/content/Pagination.js +141 -0
  340. package/dist/ssr/content/Pagination.js.map +1 -0
  341. package/dist/ssr/content/PdfPreview.js +126 -0
  342. package/dist/ssr/content/PdfPreview.js.map +1 -0
  343. package/dist/ssr/content/RangePicker.js +35 -0
  344. package/dist/ssr/content/RangePicker.js.map +1 -0
  345. package/dist/ssr/content/StructuredDataPreview.js +127 -0
  346. package/dist/ssr/content/StructuredDataPreview.js.map +1 -0
  347. package/dist/ssr/content/calendar-event-layout.js +92 -0
  348. package/dist/ssr/content/calendar-event-layout.js.map +1 -0
  349. package/dist/ssr/content/calendar-pointer.js +114 -0
  350. package/dist/ssr/content/calendar-pointer.js.map +1 -0
  351. package/dist/ssr/content/chart-map-viewport.js +33 -0
  352. package/dist/ssr/content/chart-map-viewport.js.map +1 -0
  353. package/dist/ssr/content/chart-state-timeline.js +124 -0
  354. package/dist/ssr/content/chart-state-timeline.js.map +1 -0
  355. package/dist/ssr/content/code-highlight.js +144 -0
  356. package/dist/ssr/content/code-highlight.js.map +1 -0
  357. package/dist/ssr/content/file-tree.js +93 -0
  358. package/dist/ssr/content/file-tree.js.map +1 -0
  359. package/dist/ssr/content/file-view-preview.js +112 -0
  360. package/dist/ssr/content/file-view-preview.js.map +1 -0
  361. package/dist/ssr/content/index.js +16 -0
  362. package/dist/ssr/content/index.js.map +1 -0
  363. package/dist/ssr/feedback/InlineGuidance.js +26 -0
  364. package/dist/ssr/feedback/InlineGuidance.js.map +1 -0
  365. package/dist/ssr/feedback/Tooltip.js +156 -0
  366. package/dist/ssr/feedback/Tooltip.js.map +1 -0
  367. package/dist/ssr/feedback/dialog-core.js +207 -0
  368. package/dist/ssr/feedback/dialog-core.js.map +1 -0
  369. package/dist/ssr/feedback/index.js +6 -0
  370. package/dist/ssr/feedback/index.js.map +1 -0
  371. package/dist/ssr/feedback/prompts.js +703 -0
  372. package/dist/ssr/feedback/prompts.js.map +1 -0
  373. package/dist/ssr/feedback/toast.js +271 -0
  374. package/dist/ssr/feedback/toast.js.map +1 -0
  375. package/dist/ssr/feedback/tooltip-position.js +25 -0
  376. package/dist/ssr/feedback/tooltip-position.js.map +1 -0
  377. package/dist/ssr/index.js +11 -0
  378. package/dist/ssr/index.js.map +1 -0
  379. package/dist/ssr/inputs/AutocompleteEditor.js +463 -0
  380. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -0
  381. package/dist/ssr/inputs/AutocompleteSelect.js +420 -0
  382. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -0
  383. package/dist/ssr/inputs/Checkbox.js +75 -0
  384. package/dist/ssr/inputs/Checkbox.js.map +1 -0
  385. package/dist/ssr/inputs/CheckboxCard.js +69 -0
  386. package/dist/ssr/inputs/CheckboxCard.js.map +1 -0
  387. package/dist/ssr/inputs/ChoiceGroups.js +101 -0
  388. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -0
  389. package/dist/ssr/inputs/ChoiceInputs.js +250 -0
  390. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -0
  391. package/dist/ssr/inputs/Combobox.js +177 -0
  392. package/dist/ssr/inputs/Combobox.js.map +1 -0
  393. package/dist/ssr/inputs/DatePicker.js +629 -0
  394. package/dist/ssr/inputs/DatePicker.js.map +1 -0
  395. package/dist/ssr/inputs/FileInputs.js +543 -0
  396. package/dist/ssr/inputs/FileInputs.js.map +1 -0
  397. package/dist/ssr/inputs/MultiSelectInput.js +347 -0
  398. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -0
  399. package/dist/ssr/inputs/NumberInput.js +177 -0
  400. package/dist/ssr/inputs/NumberInput.js.map +1 -0
  401. package/dist/ssr/inputs/Select.js +308 -0
  402. package/dist/ssr/inputs/Select.js.map +1 -0
  403. package/dist/ssr/inputs/SelectChip.js +129 -0
  404. package/dist/ssr/inputs/SelectChip.js.map +1 -0
  405. package/dist/ssr/inputs/SpecialInputs.js +116 -0
  406. package/dist/ssr/inputs/SpecialInputs.js.map +1 -0
  407. package/dist/ssr/inputs/Switch.js +62 -0
  408. package/dist/ssr/inputs/Switch.js.map +1 -0
  409. package/dist/ssr/inputs/TagEditor.js +280 -0
  410. package/dist/ssr/inputs/TagEditor.js.map +1 -0
  411. package/dist/ssr/inputs/TagsInput.js +122 -0
  412. package/dist/ssr/inputs/TagsInput.js.map +1 -0
  413. package/dist/ssr/inputs/TemplateEditor.js +164 -0
  414. package/dist/ssr/inputs/TemplateEditor.js.map +1 -0
  415. package/dist/ssr/inputs/TextInput.js +211 -0
  416. package/dist/ssr/inputs/TextInput.js.map +1 -0
  417. package/dist/ssr/inputs/choice.js +188 -0
  418. package/dist/ssr/inputs/choice.js.map +1 -0
  419. package/dist/ssr/inputs/completion/behaviors.js +108 -0
  420. package/dist/ssr/inputs/completion/behaviors.js.map +1 -0
  421. package/dist/ssr/inputs/completion/engine.js +103 -0
  422. package/dist/ssr/inputs/completion/engine.js.map +1 -0
  423. package/dist/ssr/inputs/completion/index.js +4 -0
  424. package/dist/ssr/inputs/completion/index.js.map +1 -0
  425. package/dist/ssr/inputs/completion/overlay.js +25 -0
  426. package/dist/ssr/inputs/completion/overlay.js.map +1 -0
  427. package/dist/ssr/inputs/date-picker.js +123 -0
  428. package/dist/ssr/inputs/date-picker.js.map +1 -0
  429. package/dist/ssr/inputs/editor-dom.js +26 -0
  430. package/dist/ssr/inputs/editor-dom.js.map +1 -0
  431. package/dist/ssr/inputs/field-contract.js +9 -0
  432. package/dist/ssr/inputs/field-contract.js.map +1 -0
  433. package/dist/ssr/inputs/icon-options.js +46 -0
  434. package/dist/ssr/inputs/icon-options.js.map +1 -0
  435. package/dist/ssr/inputs/image-crop.js +145 -0
  436. package/dist/ssr/inputs/image-crop.js.map +1 -0
  437. package/dist/ssr/inputs/index.js +23 -0
  438. package/dist/ssr/inputs/index.js.map +1 -0
  439. package/dist/ssr/inputs/markdown/MarkdownEditor.js +516 -0
  440. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -0
  441. package/dist/ssr/inputs/markdown/Toolbar.js +115 -0
  442. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -0
  443. package/dist/ssr/inputs/markdown/actions.js +140 -0
  444. package/dist/ssr/inputs/markdown/actions.js.map +1 -0
  445. package/dist/ssr/inputs/markdown/active-formats.js +36 -0
  446. package/dist/ssr/inputs/markdown/active-formats.js.map +1 -0
  447. package/dist/ssr/inputs/markdown/behaviors.js +63 -0
  448. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -0
  449. package/dist/ssr/inputs/markdown/code-zone.js +8 -0
  450. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -0
  451. package/dist/ssr/internal/color.js +18 -0
  452. package/dist/ssr/internal/color.js.map +1 -0
  453. package/dist/ssr/internal/field.js +90 -0
  454. package/dist/ssr/internal/field.js.map +1 -0
  455. package/dist/ssr/internal/portal.js +17 -0
  456. package/dist/ssr/internal/portal.js.map +1 -0
  457. package/dist/ssr/intl/Format.js +192 -0
  458. package/dist/ssr/intl/Format.js.map +1 -0
  459. package/dist/ssr/intl/index.js +3 -0
  460. package/dist/ssr/intl/index.js.map +1 -0
  461. package/dist/ssr/intl/locale.js +63 -0
  462. package/dist/ssr/intl/locale.js.map +1 -0
  463. package/dist/ssr/intl/messages.js +753 -0
  464. package/dist/ssr/intl/messages.js.map +1 -0
  465. package/dist/ssr/layout/AppOverview.js +85 -0
  466. package/dist/ssr/layout/AppOverview.js.map +1 -0
  467. package/dist/ssr/layout/AppWorkspace.js +976 -0
  468. package/dist/ssr/layout/AppWorkspace.js.map +1 -0
  469. package/dist/ssr/layout/DataPanel.js +101 -0
  470. package/dist/ssr/layout/DataPanel.js.map +1 -0
  471. package/dist/ssr/layout/DetailPanel.js +284 -0
  472. package/dist/ssr/layout/DetailPanel.js.map +1 -0
  473. package/dist/ssr/layout/Discussion.js +319 -0
  474. package/dist/ssr/layout/Discussion.js.map +1 -0
  475. package/dist/ssr/layout/FloatingWindow.js +259 -0
  476. package/dist/ssr/layout/FloatingWindow.js.map +1 -0
  477. package/dist/ssr/layout/PanelDialog.js +136 -0
  478. package/dist/ssr/layout/PanelDialog.js.map +1 -0
  479. package/dist/ssr/layout/PanelHeader.js +45 -0
  480. package/dist/ssr/layout/PanelHeader.js.map +1 -0
  481. package/dist/ssr/layout/Panes.js +678 -0
  482. package/dist/ssr/layout/Panes.js.map +1 -0
  483. package/dist/ssr/layout/ScrollArea.js +18 -0
  484. package/dist/ssr/layout/ScrollArea.js.map +1 -0
  485. package/dist/ssr/layout/Settings.js +219 -0
  486. package/dist/ssr/layout/Settings.js.map +1 -0
  487. package/dist/ssr/layout/SettingsCollection.js +150 -0
  488. package/dist/ssr/layout/SettingsCollection.js.map +1 -0
  489. package/dist/ssr/layout/SettingsModal.js +156 -0
  490. package/dist/ssr/layout/SettingsModal.js.map +1 -0
  491. package/dist/ssr/layout/app-workspace-controller.js +419 -0
  492. package/dist/ssr/layout/app-workspace-controller.js.map +1 -0
  493. package/dist/ssr/layout/app-workspace-state.js +125 -0
  494. package/dist/ssr/layout/app-workspace-state.js.map +1 -0
  495. package/dist/ssr/layout/floating-window-geometry.js +15 -0
  496. package/dist/ssr/layout/floating-window-geometry.js.map +1 -0
  497. package/dist/ssr/layout/index.js +17 -0
  498. package/dist/ssr/layout/index.js.map +1 -0
  499. package/dist/ssr/layout/panes-layout.js +436 -0
  500. package/dist/ssr/layout/panes-layout.js.map +1 -0
  501. package/dist/ssr/layout/stable-id.js +17 -0
  502. package/dist/ssr/layout/stable-id.js.map +1 -0
  503. package/dist/ssr/semantics.js +2 -0
  504. package/dist/ssr/semantics.js.map +1 -0
  505. package/dist/ssr/surfaces/Avatar.js +43 -0
  506. package/dist/ssr/surfaces/Avatar.js.map +1 -0
  507. package/dist/ssr/surfaces/DescriptionList.js +25 -0
  508. package/dist/ssr/surfaces/DescriptionList.js.map +1 -0
  509. package/dist/ssr/surfaces/LinkCard.js +25 -0
  510. package/dist/ssr/surfaces/LinkCard.js.map +1 -0
  511. package/dist/ssr/surfaces/NotFoundState.js +38 -0
  512. package/dist/ssr/surfaces/NotFoundState.js.map +1 -0
  513. package/dist/ssr/surfaces/NoticeCard.js +83 -0
  514. package/dist/ssr/surfaces/NoticeCard.js.map +1 -0
  515. package/dist/ssr/surfaces/Paper.js +32 -0
  516. package/dist/ssr/surfaces/Paper.js.map +1 -0
  517. package/dist/ssr/surfaces/Placeholder.js +76 -0
  518. package/dist/ssr/surfaces/Placeholder.js.map +1 -0
  519. package/dist/ssr/surfaces/ProgressBar.js +13 -0
  520. package/dist/ssr/surfaces/ProgressBar.js.map +1 -0
  521. package/dist/ssr/surfaces/StatCell.js +80 -0
  522. package/dist/ssr/surfaces/StatCell.js.map +1 -0
  523. package/dist/ssr/surfaces/StatGrid.js +62 -0
  524. package/dist/ssr/surfaces/StatGrid.js.map +1 -0
  525. package/dist/ssr/surfaces/StatusBadge.js +38 -0
  526. package/dist/ssr/surfaces/StatusBadge.js.map +1 -0
  527. package/dist/ssr/surfaces/Tag.js +32 -0
  528. package/dist/ssr/surfaces/Tag.js.map +1 -0
  529. package/dist/ssr/surfaces/index.js +13 -0
  530. package/dist/ssr/surfaces/index.js.map +1 -0
  531. package/dist/ssr/widgets/Widget.js +54 -0
  532. package/dist/ssr/widgets/Widget.js.map +1 -0
  533. package/dist/ssr/widgets/WidgetHero.js +23 -0
  534. package/dist/ssr/widgets/WidgetHero.js.map +1 -0
  535. package/dist/ssr/widgets/WidgetList.js +73 -0
  536. package/dist/ssr/widgets/WidgetList.js.map +1 -0
  537. package/dist/ssr/widgets/WidgetPills.js +40 -0
  538. package/dist/ssr/widgets/WidgetPills.js.map +1 -0
  539. package/dist/ssr/widgets/WidgetStat.js +45 -0
  540. package/dist/ssr/widgets/WidgetStat.js.map +1 -0
  541. package/dist/ssr/widgets/WidgetStatus.js +23 -0
  542. package/dist/ssr/widgets/WidgetStatus.js.map +1 -0
  543. package/dist/ssr/widgets/index.js +7 -0
  544. package/dist/ssr/widgets/index.js.map +1 -0
  545. package/dist/styles.css +1 -0
  546. package/dist/tabler-icons-q30jt7jk.woff2 +0 -0
  547. package/dist/tabler.css +4 -0
  548. package/package.json +77 -0
@@ -0,0 +1,141 @@
1
+ import { ssr as _$ssr } from "solid-js/web";
2
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
3
+ import { escape as _$escape } from "solid-js/web";
4
+ import { createComponent as _$createComponent } from "solid-js/web";
5
+ var _tmpl$ = ["<a", " class=\"", "\"", ">", "</a>"],
6
+ _tmpl$2 = "<i class=\"ti ti-chevron-left\" aria-hidden=\"true\"></i>",
7
+ _tmpl$3 = "<i class=\"ti ti-chevron-right\" aria-hidden=\"true\"></i>",
8
+ _tmpl$4 = ["<nav class=\"k2b-pagination\"", "><span class=\"k2b-sr-only\">", "</span><div class=\"k2b-pagination__pages\">", "", "", "</div></nav>"],
9
+ _tmpl$5 = "<span class=\"k2b-pagination__ellipsis\" aria-hidden=\"true\">\u2026</span>",
10
+ _tmpl$6 = ["<span class=\"k2b-pagination__page is-current\" aria-current=\"page\">", "</span>"];
11
+ import { Link } from "@k2b/ssr/nav";
12
+ import { createMemo, For, Show } from "solid-js";
13
+ import { useUiMessages } from "../intl/messages";
14
+ const PaginationLink = props => props.onNavigate ? _$createComponent(Link, {
15
+ get href() {
16
+ return props.href;
17
+ },
18
+ get rel() {
19
+ return props.rel;
20
+ },
21
+ scroll: "top",
22
+ get onNavigate() {
23
+ return props.onNavigate;
24
+ },
25
+ get ["class"]() {
26
+ return `k2b-pagination__page ${props.class ?? ""}`;
27
+ },
28
+ get ["aria-label"]() {
29
+ return props.label;
30
+ },
31
+ get children() {
32
+ return props.children;
33
+ }
34
+ }) : _$ssr(_tmpl$, _$ssrAttribute("href", _$escape(props.href, true), false) + _$ssrAttribute("rel", _$escape(props.rel, true), false), `k2b-pagination__page ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$escape(props.children));
35
+
36
+ /** Link-based pagination with directional navigation and compact mobile disclosure. */
37
+ export const Pagination = props => {
38
+ const messages = useUiMessages();
39
+ const totalPages = createMemo(() => Math.max(1, Math.floor(Number.isFinite(props.totalPages) ? props.totalPages : 1)));
40
+ const currentPage = createMemo(() => Math.min(totalPages(), Math.max(1, Math.floor(Number.isFinite(props.currentPage) ? props.currentPage : 1))));
41
+ const href = page => `${props.baseUrl}${page}`;
42
+ const visiblePages = createMemo(() => [...new Set([1, currentPage() - 1, currentPage(), currentPage() + 1, totalPages()])].filter(page => page >= 1 && page <= totalPages()).sort((left, right) => left - right));
43
+ return _$createComponent(Show, {
44
+ get when() {
45
+ return totalPages() > 1;
46
+ },
47
+ get children() {
48
+ return _$ssr(_tmpl$4, _$ssrAttribute("aria-label", _$escape(messages().pagination, true), false), _$escape(messages().pageOf({
49
+ page: currentPage(),
50
+ total: totalPages()
51
+ })), _$escape(_$createComponent(Show, {
52
+ get when() {
53
+ return currentPage() > 1;
54
+ },
55
+ get children() {
56
+ return _$createComponent(PaginationLink, {
57
+ get href() {
58
+ return href(currentPage() - 1);
59
+ },
60
+ rel: "prev",
61
+ get label() {
62
+ return messages().previousPage;
63
+ },
64
+ get onNavigate() {
65
+ return props.onNavigate;
66
+ },
67
+ get children() {
68
+ return _$ssr(_tmpl$2);
69
+ }
70
+ });
71
+ }
72
+ })), _$escape(_$createComponent(For, {
73
+ get each() {
74
+ return visiblePages();
75
+ },
76
+ children: (page, index) => {
77
+ const previousPage = () => visiblePages()[index() - 1];
78
+ const hasGap = () => previousPage() !== undefined && page - previousPage() > 1;
79
+ const isCurrent = () => page === currentPage();
80
+ const mobileVisible = () => page === 1 || page === totalPages() || isCurrent();
81
+ return [_$createComponent(Show, {
82
+ get when() {
83
+ return hasGap();
84
+ },
85
+ get children() {
86
+ return _$ssr(_tmpl$5);
87
+ }
88
+ }), _$createComponent(Show, {
89
+ get when() {
90
+ return isCurrent();
91
+ },
92
+ get fallback() {
93
+ return _$createComponent(PaginationLink, {
94
+ get href() {
95
+ return href(page);
96
+ },
97
+ get label() {
98
+ return messages().goToPage({
99
+ page
100
+ });
101
+ },
102
+ get ["class"]() {
103
+ return mobileVisible() ? "" : "k2b-pagination__page--wide-only";
104
+ },
105
+ get onNavigate() {
106
+ return props.onNavigate;
107
+ },
108
+ children: page
109
+ });
110
+ },
111
+ get children() {
112
+ return _$ssr(_tmpl$6, _$escape(page));
113
+ }
114
+ })];
115
+ }
116
+ })), _$escape(_$createComponent(Show, {
117
+ get when() {
118
+ return currentPage() < totalPages();
119
+ },
120
+ get children() {
121
+ return _$createComponent(PaginationLink, {
122
+ get href() {
123
+ return href(currentPage() + 1);
124
+ },
125
+ rel: "next",
126
+ get label() {
127
+ return messages().nextPage;
128
+ },
129
+ get onNavigate() {
130
+ return props.onNavigate;
131
+ },
132
+ get children() {
133
+ return _$ssr(_tmpl$3);
134
+ }
135
+ });
136
+ }
137
+ })));
138
+ }
139
+ });
140
+ };
141
+ //# sourceMappingURL=Pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Link","createMemo","For","Show","useUiMessages","PaginationLink","props","onNavigate","_$createComponent","href","rel","scroll","class","aria-label","label","children","_$ssr","_tmpl$","_$ssrAttribute","_$escape","Pagination","messages","totalPages","Math","max","floor","Number","isFinite","currentPage","min","page","baseUrl","visiblePages","Set","filter","sort","left","right","when","_tmpl$4","pagination","pageOf","total","previousPage","_tmpl$2","each","index","hasGap","undefined","isCurrent","mobileVisible","_tmpl$5","fallback","goToPage","_tmpl$6","nextPage","_tmpl$3"],"sources":["content/Pagination.tsx"],"sourcesContent":["import { Link, type LinkNavigateEvent } from \"@k2b/ssr/nav\";\nimport { createMemo, For, type JSX, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n baseUrl: string;\n onNavigate?: (event: LinkNavigateEvent) => void | Promise<void>;\n};\n\ntype PaginationLinkProps = {\n href: string;\n label: string;\n rel?: \"prev\" | \"next\";\n class?: string;\n onNavigate?: PaginationProps[\"onNavigate\"];\n children: JSX.Element;\n};\n\nconst PaginationLink = (props: PaginationLinkProps) =>\n props.onNavigate ? (\n <Link\n href={props.href}\n rel={props.rel}\n scroll=\"top\"\n onNavigate={props.onNavigate}\n class={`k2b-pagination__page ${props.class ?? \"\"}`}\n aria-label={props.label}\n >\n {props.children}\n </Link>\n ) : (\n <a href={props.href} rel={props.rel} class={`k2b-pagination__page ${props.class ?? \"\"}`} aria-label={props.label}>\n {props.children}\n </a>\n );\n\n/** Link-based pagination with directional navigation and compact mobile disclosure. */\nexport const Pagination = (props: PaginationProps): JSX.Element => {\n const messages = useUiMessages();\n const totalPages = createMemo(() => Math.max(1, Math.floor(Number.isFinite(props.totalPages) ? props.totalPages : 1)));\n const currentPage = createMemo(() =>\n Math.min(totalPages(), Math.max(1, Math.floor(Number.isFinite(props.currentPage) ? props.currentPage : 1))),\n );\n const href = (page: number) => `${props.baseUrl}${page}`;\n const visiblePages = createMemo(() =>\n [...new Set([1, currentPage() - 1, currentPage(), currentPage() + 1, totalPages()])]\n .filter((page) => page >= 1 && page <= totalPages())\n .sort((left, right) => left - right),\n );\n\n return (\n <Show when={totalPages() > 1}>\n <nav class=\"k2b-pagination\" aria-label={messages().pagination}>\n <span class=\"k2b-sr-only\">\n {messages().pageOf({ page: currentPage(), total: totalPages() })}\n </span>\n <div class=\"k2b-pagination__pages\">\n <Show when={currentPage() > 1}>\n <PaginationLink href={href(currentPage() - 1)} rel=\"prev\" label={messages().previousPage} onNavigate={props.onNavigate}>\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </PaginationLink>\n </Show>\n\n <For each={visiblePages()}>\n {(page, index) => {\n const previousPage = () => visiblePages()[index() - 1];\n const hasGap = () => previousPage() !== undefined && page - previousPage()! > 1;\n const isCurrent = () => page === currentPage();\n const mobileVisible = () => page === 1 || page === totalPages() || isCurrent();\n\n return (\n <>\n <Show when={hasGap()}>\n <span class=\"k2b-pagination__ellipsis\" aria-hidden=\"true\">\n …\n </span>\n </Show>\n <Show\n when={isCurrent()}\n fallback={\n <PaginationLink\n href={href(page)}\n label={messages().goToPage({ page })}\n class={mobileVisible() ? \"\" : \"k2b-pagination__page--wide-only\"}\n onNavigate={props.onNavigate}\n >\n {page}\n </PaginationLink>\n }\n >\n <span class=\"k2b-pagination__page is-current\" aria-current=\"page\">\n {page}\n </span>\n </Show>\n </>\n );\n }}\n </For>\n\n <Show when={currentPage() < totalPages()}>\n <PaginationLink href={href(currentPage() + 1)} rel=\"next\" label={messages().nextPage} onNavigate={props.onNavigate}>\n <i class=\"ti ti-chevron-right\" aria-hidden=\"true\" />\n </PaginationLink>\n </Show>\n </div>\n </nav>\n </Show>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,126 @@
1
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
2
+ import { createComponent as _$createComponent } from "solid-js/web";
3
+ import { ssr as _$ssr } from "solid-js/web";
4
+ import { escape as _$escape } from "solid-js/web";
5
+ var _tmpl$ = ["<h2 class=\"k2b-content-pdf-preview__title\">", "</h2>"],
6
+ _tmpl$2 = ["<section class=\"", "\"><div class=\"k2b-content-pdf-preview__toolbar\"><div class=\"k2b-content-pdf-preview__heading\">", "</div><div class=\"k2b-content-pdf-preview__actions\"><button type=\"button\" class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\"", "><i", " aria-hidden=\"true\"></i>", "</button><button type=\"button\" class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\"", "><i", " aria-hidden=\"true\"></i>", "</button></div></div>", "</section>"],
7
+ _tmpl$3 = ["<div class=\"k2b-content-pdf-preview__empty\">", "</div>"],
8
+ _tmpl$4 = ["<span>", "</span>"],
9
+ _tmpl$5 = ["<div class=\"k2b-content-pdf-preview__error\">", "</div>"],
10
+ _tmpl$6 = ["<iframe class=\"k2b-content-pdf-preview__frame\"", "></iframe>"];
11
+ import { createSignal, onCleanup, Show } from "solid-js";
12
+ import { resolveUiMessages, useUiMessages } from "../intl/messages";
13
+ const readErrorMessage = async response => {
14
+ try {
15
+ const data = await response.json();
16
+ if (data && typeof data === "object" && "message" in data && typeof data.message === "string") return data.message;
17
+ } catch {
18
+ // Fall through to the HTTP status fallback.
19
+ }
20
+ return resolveUiMessages().pdfPreviewHttpError({
21
+ status: response.status
22
+ });
23
+ };
24
+ export default function PdfPreview(props) {
25
+ const messages = useUiMessages();
26
+ const [url, setUrl] = createSignal(null);
27
+ const [loading, setLoading] = createSignal(false);
28
+ const [opening, setOpening] = createSignal(false);
29
+ const [error, setError] = createSignal(null);
30
+ let disposed = false;
31
+ let loadGeneration = 0;
32
+ let openGeneration = 0;
33
+ const revokeCurrent = () => {
34
+ const current = url();
35
+ if (current) URL.revokeObjectURL(current);
36
+ setUrl(null);
37
+ };
38
+ onCleanup(() => {
39
+ disposed = true;
40
+ loadGeneration += 1;
41
+ openGeneration += 1;
42
+ revokeCurrent();
43
+ });
44
+ const readPdfBlob = async () => {
45
+ const response = await props.request();
46
+ const blob = response instanceof Response ? response.ok ? await response.blob() : null : response;
47
+ if (!blob) throw new Error(await readErrorMessage(response));
48
+ if (blob.type && blob.type !== "application/pdf") throw new Error(`PDF preview returned ${blob.type} instead of application/pdf`);
49
+ return blob;
50
+ };
51
+ const load = async () => {
52
+ if (loading() || opening() || props.disabled?.()) return;
53
+ const generation = ++loadGeneration;
54
+ setLoading(true);
55
+ setError(null);
56
+ try {
57
+ const blob = await readPdfBlob();
58
+ const nextUrl = URL.createObjectURL(blob);
59
+ if (disposed || generation !== loadGeneration) {
60
+ URL.revokeObjectURL(nextUrl);
61
+ return;
62
+ }
63
+ const previousUrl = url();
64
+ setUrl(nextUrl);
65
+ if (previousUrl) URL.revokeObjectURL(previousUrl);
66
+ } catch (e) {
67
+ if (!disposed && generation === loadGeneration) setError(e instanceof Error ? e.message : "PDF preview failed");
68
+ } finally {
69
+ if (!disposed && generation === loadGeneration) setLoading(false);
70
+ }
71
+ };
72
+ const openInNewTab = async () => {
73
+ if (loading() || opening() || props.disabled?.()) return;
74
+ const generation = ++openGeneration;
75
+ const tab = window.open("", "_blank");
76
+ if (!tab) {
77
+ setError("Browser blocked the preview tab");
78
+ return;
79
+ }
80
+ tab.opener = null;
81
+ tab.document.title = props.title ?? messages().pdfPreview;
82
+ tab.document.body.textContent = "Rendering PDF preview...";
83
+ setOpening(true);
84
+ setError(null);
85
+ try {
86
+ const blob = await readPdfBlob();
87
+ if (disposed || generation !== openGeneration) {
88
+ tab.close();
89
+ return;
90
+ }
91
+ const objectUrl = URL.createObjectURL(blob);
92
+ tab.location.href = objectUrl;
93
+ window.setTimeout(() => URL.revokeObjectURL(objectUrl), 60_000);
94
+ } catch (e) {
95
+ tab.close();
96
+ if (!disposed && generation === openGeneration) setError(e instanceof Error ? e.message : "PDF preview failed");
97
+ } finally {
98
+ if (!disposed && generation === openGeneration) setOpening(false);
99
+ }
100
+ };
101
+ return _$ssr(_tmpl$2, `k2b-content-pdf-preview ${_$escape(props.class ?? "", true)}`, _$escape(_$createComponent(Show, {
102
+ get when() {
103
+ return props.title;
104
+ },
105
+ get children() {
106
+ return _$ssr(_tmpl$, _$escape(props.title));
107
+ }
108
+ })), _$ssrAttribute("disabled", loading() || opening() || props.disabled?.(), true), _$ssrAttribute("class", opening() ? "ti ti-loader-2 k2b-spin" : "ti ti-external-link", false), _$escape(props.openButtonLabel ?? messages().openPreview), _$ssrAttribute("disabled", loading() || opening() || props.disabled?.(), true), _$ssrAttribute("class", loading() ? "ti ti-loader-2 k2b-spin" : "ti ti-file-type-pdf", false), _$escape(props.buttonLabel ?? messages().previewPdf), _$escape(_$createComponent(Show, {
109
+ get when() {
110
+ return url();
111
+ },
112
+ get fallback() {
113
+ return _$ssr(_tmpl$3, _$escape(_$createComponent(Show, {
114
+ get when() {
115
+ return error();
116
+ },
117
+ get fallback() {
118
+ return _$ssr(_tmpl$4, _$escape(props.emptyText ?? messages().renderPdfPreview));
119
+ },
120
+ children: message => _$ssr(_tmpl$5, _$escape(message()))
121
+ })));
122
+ },
123
+ children: currentUrl => _$ssr(_tmpl$6, _$ssrAttribute("src", _$escape(currentUrl(), true), false) + _$ssrAttribute("title", _$escape(props.title ?? messages().pdfPreview, true), false))
124
+ })));
125
+ }
126
+ //# sourceMappingURL=PdfPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createSignal","onCleanup","Show","resolveUiMessages","useUiMessages","readErrorMessage","response","data","json","message","pdfPreviewHttpError","status","PdfPreview","props","messages","url","setUrl","loading","setLoading","opening","setOpening","error","setError","disposed","loadGeneration","openGeneration","revokeCurrent","current","URL","revokeObjectURL","readPdfBlob","request","blob","Response","ok","Error","type","load","disabled","generation","nextUrl","createObjectURL","previousUrl","e","openInNewTab","tab","window","open","opener","document","title","pdfPreview","body","textContent","close","objectUrl","location","href","setTimeout","_$ssr","_tmpl$2","_$escape","class","_$createComponent","when","children","_tmpl$","_$ssrAttribute","openButtonLabel","openPreview","buttonLabel","previewPdf","fallback","_tmpl$3","_tmpl$4","emptyText","renderPdfPreview","_tmpl$5","currentUrl","_tmpl$6"],"sources":["content/PdfPreview.tsx"],"sourcesContent":["import { createSignal, onCleanup, Show } from \"solid-js\";\nimport { resolveUiMessages, useUiMessages } from \"../intl/messages\";\n\nexport type PdfPreviewRequest = () => Promise<Response | Blob>;\n\nexport type PdfPreviewProps = {\n request: PdfPreviewRequest;\n disabled?: () => boolean;\n title?: string;\n buttonLabel?: string;\n openButtonLabel?: string;\n emptyText?: string;\n class?: string;\n};\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n try {\n const data = (await response.json()) as unknown;\n if (data && typeof data === \"object\" && \"message\" in data && typeof data.message === \"string\") return data.message;\n } catch {\n // Fall through to the HTTP status fallback.\n }\n return resolveUiMessages().pdfPreviewHttpError({ status: response.status });\n};\n\nexport default function PdfPreview(props: PdfPreviewProps) {\n const messages = useUiMessages();\n const [url, setUrl] = createSignal<string | null>(null);\n const [loading, setLoading] = createSignal(false);\n const [opening, setOpening] = createSignal(false);\n const [error, setError] = createSignal<string | null>(null);\n let disposed = false;\n let loadGeneration = 0;\n let openGeneration = 0;\n\n const revokeCurrent = () => {\n const current = url();\n if (current) URL.revokeObjectURL(current);\n setUrl(null);\n };\n\n onCleanup(() => {\n disposed = true;\n loadGeneration += 1;\n openGeneration += 1;\n revokeCurrent();\n });\n\n const readPdfBlob = async () => {\n const response = await props.request();\n const blob = response instanceof Response ? (response.ok ? await response.blob() : null) : response;\n if (!blob) throw new Error(await readErrorMessage(response as Response));\n if (blob.type && blob.type !== \"application/pdf\") throw new Error(`PDF preview returned ${blob.type} instead of application/pdf`);\n return blob;\n };\n\n const load = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++loadGeneration;\n setLoading(true);\n setError(null);\n try {\n const blob = await readPdfBlob();\n const nextUrl = URL.createObjectURL(blob);\n if (disposed || generation !== loadGeneration) {\n URL.revokeObjectURL(nextUrl);\n return;\n }\n const previousUrl = url();\n setUrl(nextUrl);\n if (previousUrl) URL.revokeObjectURL(previousUrl);\n } catch (e) {\n if (!disposed && generation === loadGeneration) setError(e instanceof Error ? e.message : \"PDF preview failed\");\n } finally {\n if (!disposed && generation === loadGeneration) setLoading(false);\n }\n };\n\n const openInNewTab = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++openGeneration;\n const tab = window.open(\"\", \"_blank\");\n if (!tab) {\n setError(\"Browser blocked the preview tab\");\n return;\n }\n tab.opener = null;\n tab.document.title = props.title ?? messages().pdfPreview;\n tab.document.body.textContent = \"Rendering PDF preview...\";\n setOpening(true);\n setError(null);\n try {\n const blob = await readPdfBlob();\n if (disposed || generation !== openGeneration) {\n tab.close();\n return;\n }\n const objectUrl = URL.createObjectURL(blob);\n tab.location.href = objectUrl;\n window.setTimeout(() => URL.revokeObjectURL(objectUrl), 60_000);\n } catch (e) {\n tab.close();\n if (!disposed && generation === openGeneration) setError(e instanceof Error ? e.message : \"PDF preview failed\");\n } finally {\n if (!disposed && generation === openGeneration) setOpening(false);\n }\n };\n\n return (\n <section class={`k2b-content-pdf-preview ${props.class ?? \"\"}`}>\n <div class=\"k2b-content-pdf-preview__toolbar\">\n <div class=\"k2b-content-pdf-preview__heading\">\n <Show when={props.title}>\n <h2 class=\"k2b-content-pdf-preview__title\">{props.title}</h2>\n </Show>\n </div>\n <div class=\"k2b-content-pdf-preview__actions\">\n <button\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void openInNewTab()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={opening() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-external-link\"} aria-hidden=\"true\" />\n {props.openButtonLabel ?? messages().openPreview}\n </button>\n <button\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void load()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={loading() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-file-type-pdf\"} aria-hidden=\"true\" />\n {props.buttonLabel ?? messages().previewPdf}\n </button>\n </div>\n </div>\n\n <Show\n when={url()}\n fallback={\n <div class=\"k2b-content-pdf-preview__empty\">\n <Show when={error()} fallback={<span>{props.emptyText ?? messages().renderPdfPreview}</span>}>\n {(message) => <div class=\"k2b-content-pdf-preview__error\">{message()}</div>}\n </Show>\n </div>\n }\n >\n {(currentUrl) => <iframe class=\"k2b-content-pdf-preview__frame\" src={currentUrl()} title={props.title ?? messages().pdfPreview} />}\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,35 @@
1
+ import { ssr as _$ssr } from "solid-js/web";
2
+ import { createComponent as _$createComponent } from "solid-js/web";
3
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
+ import { escape as _$escape } from "solid-js/web";
5
+ var _tmpl$ = ["<nav class=\"", "\"", ">", "", "</nav>"],
6
+ _tmpl$2 = ["<span class=\"k2b-range-picker__caption\">", "</span>"],
7
+ _tmpl$3 = ["<a", " class=\"k2b-range-picker__option\"", ">", "</a>"];
8
+ import { For } from "solid-js";
9
+ import { useUiMessages } from "../intl/messages";
10
+
11
+ /**
12
+ * RangePicker — the time window every observability surface needs.
13
+ *
14
+ * Rendered as links rather than buttons on purpose: window selection is a
15
+ * server concern (the query, not the rendering), so it belongs in the URL and
16
+ * works without hydration. Callers supply the href per option, which is what
17
+ * lets each page keep its own other params intact — the hand-rolled copies
18
+ * differed exactly there, with one silently dropping every unrelated filter.
19
+ *
20
+ * The vocabulary stays with the caller too. Traces think in `10m…30d`, request
21
+ * telemetry in `1h…30d`, audit in days; a single hardcoded list would be wrong
22
+ * for most of them.
23
+ */
24
+
25
+ export default function RangePicker(props) {
26
+ const messages = useUiMessages();
27
+ const caption = () => props.label === null ? null : props.label ?? messages().window;
28
+ return _$ssr(_tmpl$, `k2b-range-picker ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.ariaLabel ?? caption() ?? messages().range, true), false), caption() ? _$ssr(_tmpl$2, _$escape(caption())) : _$escape(null), _$escape(_$createComponent(For, {
29
+ get each() {
30
+ return props.options;
31
+ },
32
+ children: option => _$ssr(_tmpl$3, _$ssrAttribute("href", _$escape(option.href, true), false), _$ssrAttribute("data-selected", option.value === props.value ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("aria-current", option.value === props.value ? "true" : _$escape(undefined, true), false), _$escape(option.label ?? option.value))
33
+ })));
34
+ }
35
+ //# sourceMappingURL=RangePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["For","useUiMessages","RangePicker","props","messages","caption","label","window","_$ssr","_tmpl$","_$escape","class","_$ssrAttribute","ariaLabel","range","_tmpl$2","_$createComponent","each","options","children","option","_tmpl$3","href","value","undefined"],"sources":["content/RangePicker.tsx"],"sourcesContent":["import { For } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\n/**\n * RangePicker — the time window every observability surface needs.\n *\n * Rendered as links rather than buttons on purpose: window selection is a\n * server concern (the query, not the rendering), so it belongs in the URL and\n * works without hydration. Callers supply the href per option, which is what\n * lets each page keep its own other params intact — the hand-rolled copies\n * differed exactly there, with one silently dropping every unrelated filter.\n *\n * The vocabulary stays with the caller too. Traces think in `10m…30d`, request\n * telemetry in `1h…30d`, audit in days; a single hardcoded list would be wrong\n * for most of them.\n */\nexport type RangeOption<T extends string> = {\n value: T;\n /** Defaults to the value, which is already short by convention (`24h`). */\n label?: string;\n href: string;\n};\n\nexport type RangePickerProps<T extends string> = {\n options: readonly RangeOption<T>[];\n value: T;\n /** Leading caption. Pass `null` to omit it in tight toolbars. */\n label?: string | null;\n /** Names the control for assistive tech; defaults to the visible label. */\n ariaLabel?: string;\n class?: string;\n};\n\nexport default function RangePicker<T extends string>(props: RangePickerProps<T>) {\n const messages = useUiMessages();\n const caption = () => (props.label === null ? null : (props.label ?? messages().window));\n return (\n <nav class={`k2b-range-picker ${props.class ?? \"\"}`} aria-label={props.ariaLabel ?? caption() ?? messages().range}>\n {caption() ? <span class=\"k2b-range-picker__caption\">{caption()}</span> : null}\n <For each={props.options}>\n {(option) => (\n <a\n href={option.href}\n class=\"k2b-range-picker__option\"\n data-selected={option.value === props.value ? \"true\" : undefined}\n aria-current={option.value === props.value ? \"true\" : undefined}\n >\n {option.label ?? option.value}\n </a>\n )}\n </For>\n </nav>\n );\n}\n"],"mappings":";;;;;;;AAAA,SAASA,GAAG,QAAQ,UAAU;AAC9B,SAASC,aAAa,QAAQ,kBAAkB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAkBA,eAAe,SAASC,WAAWA,CAAmBC,KAA0B,EAAE;EAChF,MAAMC,QAAQ,GAAGH,aAAa,CAAC,CAAC;EAChC,MAAMI,OAAO,GAAGA,CAAA,KAAOF,KAAK,CAACG,KAAK,KAAK,IAAI,GAAG,IAAI,GAAIH,KAAK,CAACG,KAAK,IAAIF,QAAQ,CAAC,CAAC,CAACG,MAAQ;EACxF,OAAAC,KAAA,CAAAC,MAAA,EACc,oBAAAC,QAAA,CAAoBP,KAAK,CAACQ,KAAK,IAAI,EAAE,SAAE,EAAAC,cAAA,eAAAF,QAAA,CAAcP,KAAK,CAACU,SAAS,IAAIR,OAAO,CAAC,CAAC,IAAID,QAAQ,CAAC,CAAC,CAACU,KAAK,iBAC9GT,OAAO,CAAC,CAAC,GAAAG,KAAA,CAAAO,OAAA,EAAAL,QAAA,CAA4CL,OAAO,CAAC,CAAC,KAAAK,QAAA,CAAW,IAAI,GAAAA,QAAA,CAAAM,iBAAA,CAC7EhB,GAAG;IAAA,IAACiB,IAAIA,CAAA;MAAA,OAAEd,KAAK,CAACe,OAAO;IAAA;IAAAC,QAAA,EACpBC,MAAM,IAAAZ,KAAA,CAAAa,OAAA,EAAAT,cAAA,SAAAF,QAAA,CAEEU,MAAM,CAACE,IAAI,iBAAAV,cAAA,kBAEFQ,MAAM,CAACG,KAAK,KAAKpB,KAAK,CAACoB,KAAK,GAAG,MAAM,GAAAb,QAAA,CAAGc,SAAS,kBAAAZ,cAAA,iBAClDQ,MAAM,CAACG,KAAK,KAAKpB,KAAK,CAACoB,KAAK,GAAG,MAAM,GAAAb,QAAA,CAAGc,SAAS,iBAAAd,QAAA,CAE9DU,MAAM,CAACd,KAAK,IAAIc,MAAM,CAACG,KAAK;EAEhC;AAIT","ignoreList":[]}
@@ -0,0 +1,127 @@
1
+ import { ssr as _$ssr } from "solid-js/web";
2
+ import { createComponent as _$createComponent } from "solid-js/web";
3
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
+ import { escape as _$escape } from "solid-js/web";
5
+ var _tmpl$ = ["<div class=\"k2b-content-structured-data__rows\">", "</div>"],
6
+ _tmpl$2 = ["<p class=\"k2b-content-structured-data__hidden\">", " more row", " hidden.</p>"],
7
+ _tmpl$3 = ["<div class=\"k2b-content-structured-data__surface\">", "</div>"],
8
+ _tmpl$4 = ["<button type=\"button\" class=\"k2b-content-structured-data__action\">", "</button>"],
9
+ _tmpl$5 = ["<div", ">", "", "<div class=\"k2b-content-structured-data__footer\">", "</div></div>"],
10
+ _tmpl$6 = ["<h2 class=\"k2b-content-structured-data__title\">", "</h2>"],
11
+ _tmpl$7 = ["<div class=\"k2b-content-structured-data__copy\">", "</div>"],
12
+ _tmpl$8 = ["<div class=\"k2b-content-structured-data__surface\" data-mode=\"raw\"><pre>", "</pre>", "</div>"],
13
+ _tmpl$9 = ["<p class=\"k2b-content-structured-data__empty\">", "</p>"],
14
+ _tmpl$0 = ["<span class=\"k2b-content-structured-data__key\"", ">", "</span>"],
15
+ _tmpl$1 = ["<span class=\"k2b-content-structured-data__value\"", ">", "</span>"];
16
+ import { createMemo, createSignal, For, Show } from "solid-js";
17
+ import CopyButton from "../actions/CopyButton";
18
+ import { resolveMaybeAccessor } from "../inputs/field-contract";
19
+ import { useUiMessages } from "../intl/messages";
20
+ export const isStructuredDataValue = (value, seen = new WeakSet()) => {
21
+ if (value === null || typeof value === "string" || typeof value === "boolean") return true;
22
+ if (typeof value === "number") return Number.isFinite(value);
23
+ if (typeof value !== "object" || seen.has(value)) return false;
24
+ const prototype = Object.getPrototypeOf(value);
25
+ if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) return false;
26
+ seen.add(value);
27
+ const valid = Array.isArray(value) ? value.every(item => isStructuredDataValue(item, seen)) : Object.values(value).every(item => isStructuredDataValue(item, seen));
28
+ seen.delete(value);
29
+ return valid;
30
+ };
31
+ const toRows = data => {
32
+ if (Array.isArray(data)) return data.map((value, index) => ({
33
+ key: String(index),
34
+ value
35
+ }));
36
+ if (data && typeof data === "object") return Object.entries(data).map(([key, value]) => ({
37
+ key,
38
+ value
39
+ }));
40
+ if (data === null) return [];
41
+ return [{
42
+ key: "value",
43
+ value: data
44
+ }];
45
+ };
46
+ const formatInlineValue = value => {
47
+ if (value === null) return "null";
48
+ if (typeof value === "string") return value;
49
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
50
+ return JSON.stringify(value);
51
+ };
52
+ const formatJson = data => JSON.stringify(data, null, 2);
53
+ export default function StructuredDataPreview(props) {
54
+ const messages = useUiMessages();
55
+ const [internalMode, setInternalMode] = createSignal(props.defaultMode ?? "formatted");
56
+ const mode = () => props.mode === undefined ? internalMode() : resolveMaybeAccessor(props.mode);
57
+ const setMode = next => {
58
+ if (props.mode === undefined) setInternalMode(next);
59
+ props.onModeChange?.(next);
60
+ };
61
+ const rows = createMemo(() => toRows(props.data));
62
+ const visibleRows = createMemo(() => rows().slice(0, props.maxRows ?? rows().length));
63
+ const hiddenCount = createMemo(() => Math.max(0, rows().length - visibleRows().length));
64
+ const raw = createMemo(() => formatJson(props.data));
65
+ const hasData = createMemo(() => rows().length > 0);
66
+ const showRaw = createMemo(() => mode() === "raw");
67
+ return _$ssr(_tmpl$5, _$ssrAttribute("class", _$escape(["k2b-content-structured-data", props.class].filter(Boolean).join(" "), true), false), _$escape(_$createComponent(Show, {
68
+ get when() {
69
+ return props.title;
70
+ },
71
+ children: title => _$ssr(_tmpl$6, _$escape(title()))
72
+ })), _$escape(_$createComponent(Show, {
73
+ get when() {
74
+ return !showRaw();
75
+ },
76
+ get fallback() {
77
+ return _$ssr(_tmpl$8, _$escape(raw()), _$escape(_$createComponent(Show, {
78
+ get when() {
79
+ return props.copy !== false;
80
+ },
81
+ get children() {
82
+ return _$ssr(_tmpl$7, _$escape(_$createComponent(CopyButton, {
83
+ get text() {
84
+ return raw();
85
+ }
86
+ })));
87
+ }
88
+ })));
89
+ },
90
+ get children() {
91
+ return _$ssr(_tmpl$3, _$escape(_$createComponent(Show, {
92
+ get when() {
93
+ return hasData();
94
+ },
95
+ get fallback() {
96
+ return _$ssr(_tmpl$9, _$escape(props.empty ?? messages().noData));
97
+ },
98
+ get children() {
99
+ return [_$ssr(_tmpl$, _$escape(_$createComponent(For, {
100
+ get each() {
101
+ return visibleRows();
102
+ },
103
+ children: row => {
104
+ const complex = typeof row.value === "object" && row.value !== null;
105
+ return [_$ssr(_tmpl$0, _$ssrAttribute("title", _$escape(row.key, true), false), _$escape(row.key)), _$ssr(_tmpl$1, _$ssrAttribute("data-complex", complex ? "true" : _$escape(undefined, true), false), _$escape(formatInlineValue(row.value)))];
106
+ }
107
+ }))), _$createComponent(Show, {
108
+ get when() {
109
+ return hiddenCount() > 0;
110
+ },
111
+ get children() {
112
+ return _$ssr(_tmpl$2, _$escape(hiddenCount()), hiddenCount() === 1 ? "" : "s");
113
+ }
114
+ })];
115
+ }
116
+ })));
117
+ }
118
+ })), _$escape(_$createComponent(Show, {
119
+ get when() {
120
+ return hasData();
121
+ },
122
+ get children() {
123
+ return _$ssr(_tmpl$4, showRaw() ? "View formatted" : "View raw");
124
+ }
125
+ })));
126
+ }
127
+ //# sourceMappingURL=StructuredDataPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createMemo","createSignal","For","Show","CopyButton","resolveMaybeAccessor","useUiMessages","isStructuredDataValue","value","seen","WeakSet","Number","isFinite","has","prototype","Object","getPrototypeOf","Array","isArray","add","valid","every","item","values","delete","toRows","data","map","index","key","String","entries","formatInlineValue","JSON","stringify","formatJson","StructuredDataPreview","props","messages","internalMode","setInternalMode","defaultMode","mode","undefined","setMode","next","onModeChange","rows","visibleRows","slice","maxRows","length","hiddenCount","Math","max","raw","hasData","showRaw","_$ssr","_tmpl$5","_$ssrAttribute","_$escape","class","filter","Boolean","join","_$createComponent","when","title","children","_tmpl$6","fallback","_tmpl$8","copy","_tmpl$7","text","_tmpl$3","_tmpl$9","empty","noData","_tmpl$","each","row","complex","_tmpl$0","_tmpl$1","_tmpl$2","_tmpl$4"],"sources":["content/StructuredDataPreview.tsx"],"sourcesContent":["import { createMemo, createSignal, For, Show } from \"solid-js\";\nimport CopyButton from \"../actions/CopyButton\";\nimport { type MaybeAccessor, resolveMaybeAccessor } from \"../inputs/field-contract\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type StructuredDataPreviewMode = \"formatted\" | \"raw\";\nexport type StructuredDataValue =\n | null\n | boolean\n | number\n | string\n | readonly StructuredDataValue[]\n | { readonly [key: string]: StructuredDataValue };\n\nexport const isStructuredDataValue = (value: unknown, seen = new WeakSet<object>()): value is StructuredDataValue => {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || seen.has(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) return false;\n\n seen.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isStructuredDataValue(item, seen))\n : Object.values(value).every((item) => isStructuredDataValue(item, seen));\n seen.delete(value);\n return valid;\n};\n\nexport type StructuredDataPreviewProps = {\n title?: string;\n data: StructuredDataValue;\n /** Controlled display mode. */\n mode?: MaybeAccessor<StructuredDataPreviewMode>;\n onModeChange?: (mode: StructuredDataPreviewMode) => void;\n /** Initial mode for an uncontrolled preview. */\n defaultMode?: StructuredDataPreviewMode;\n copy?: boolean;\n empty?: string;\n maxRows?: number;\n class?: string;\n};\n\ntype Row = {\n key: string;\n value: StructuredDataValue;\n};\n\nconst toRows = (data: StructuredDataValue): Row[] => {\n if (Array.isArray(data)) return data.map((value, index) => ({ key: String(index), value }));\n if (data && typeof data === \"object\") return Object.entries(data).map(([key, value]) => ({ key, value }));\n if (data === null) return [];\n return [{ key: \"value\", value: data }];\n};\n\nconst formatInlineValue = (value: StructuredDataValue): string => {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n};\n\nconst formatJson = (data: StructuredDataValue): string => JSON.stringify(data, null, 2);\n\nexport default function StructuredDataPreview(props: StructuredDataPreviewProps) {\n const messages = useUiMessages();\n const [internalMode, setInternalMode] = createSignal<StructuredDataPreviewMode>(props.defaultMode ?? \"formatted\");\n const mode = () => (props.mode === undefined ? internalMode() : resolveMaybeAccessor(props.mode));\n const setMode = (next: StructuredDataPreviewMode) => {\n if (props.mode === undefined) setInternalMode(next);\n props.onModeChange?.(next);\n };\n const rows = createMemo(() => toRows(props.data));\n const visibleRows = createMemo(() => rows().slice(0, props.maxRows ?? rows().length));\n const hiddenCount = createMemo(() => Math.max(0, rows().length - visibleRows().length));\n const raw = createMemo(() => formatJson(props.data));\n const hasData = createMemo(() => rows().length > 0);\n const showRaw = createMemo(() => mode() === \"raw\");\n\n return (\n <div class={[\"k2b-content-structured-data\", props.class].filter(Boolean).join(\" \")}>\n <Show when={props.title}>{(title) => <h2 class=\"k2b-content-structured-data__title\">{title()}</h2>}</Show>\n\n <Show\n when={!showRaw()}\n fallback={\n <div class=\"k2b-content-structured-data__surface\" data-mode=\"raw\">\n <pre>{raw()}</pre>\n <Show when={props.copy !== false}>\n <div class=\"k2b-content-structured-data__copy\">\n <CopyButton text={raw()} />\n </div>\n </Show>\n </div>\n }\n >\n <div class=\"k2b-content-structured-data__surface\">\n <Show when={hasData()} fallback={<p class=\"k2b-content-structured-data__empty\">{props.empty ?? messages().noData}</p>}>\n <div class=\"k2b-content-structured-data__rows\">\n <For each={visibleRows()}>\n {(row) => {\n const complex = typeof row.value === \"object\" && row.value !== null;\n return (\n <>\n <span class=\"k2b-content-structured-data__key\" title={row.key}>\n {row.key}\n </span>\n <span class=\"k2b-content-structured-data__value\" data-complex={complex ? \"true\" : undefined}>\n {formatInlineValue(row.value)}\n </span>\n </>\n );\n }}\n </For>\n </div>\n <Show when={hiddenCount() > 0}>\n <p class=\"k2b-content-structured-data__hidden\">\n {hiddenCount()} more row{hiddenCount() === 1 ? \"\" : \"s\"} hidden.\n </p>\n </Show>\n </Show>\n </div>\n </Show>\n\n <div class=\"k2b-content-structured-data__footer\">\n <Show when={hasData()}>\n <button type=\"button\" class=\"k2b-content-structured-data__action\" onClick={() => setMode(showRaw() ? \"formatted\" : \"raw\")}>\n {showRaw() ? \"View formatted\" : \"View raw\"}\n </button>\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,92 @@
1
+ const heapPush = (heap, value, before) => {
2
+ heap.push(value);
3
+ let index = heap.length - 1;
4
+ while (index > 0) {
5
+ const parent = Math.floor((index - 1) / 2);
6
+ if (!before(heap[index], heap[parent])) break;
7
+ [heap[parent], heap[index]] = [heap[index], heap[parent]];
8
+ index = parent;
9
+ }
10
+ };
11
+ const heapPop = (heap, before) => {
12
+ const first = heap[0];
13
+ const last = heap.pop();
14
+ if (heap.length === 0 || last === undefined) return first;
15
+ heap[0] = last;
16
+ let index = 0;
17
+ while (true) {
18
+ const left = index * 2 + 1;
19
+ const right = left + 1;
20
+ let next = index;
21
+ if (left < heap.length && before(heap[left], heap[next])) next = left;
22
+ if (right < heap.length && before(heap[right], heap[next])) next = right;
23
+ if (next === index) return first;
24
+ [heap[index], heap[next]] = [heap[next], heap[index]];
25
+ index = next;
26
+ }
27
+ };
28
+ const layoutGroup = (group, groupId) => {
29
+ const active = [];
30
+ const freeLanes = [];
31
+ const assigned = [];
32
+ let laneCount = 0;
33
+ for (const entry of group) {
34
+ while (active[0] && active[0].end <= entry.start) {
35
+ const released = heapPop(active, (left, right) => left.end < right.end || left.end === right.end && left.lane < right.lane);
36
+ if (released) heapPush(freeLanes, released.lane, (left, right) => left < right);
37
+ }
38
+ const lane = heapPop(freeLanes, (left, right) => left < right) ?? laneCount++;
39
+ heapPush(active, {
40
+ end: entry.end,
41
+ lane
42
+ }, (left, right) => left.end < right.end || left.end === right.end && left.lane < right.lane);
43
+ assigned.push({
44
+ item: entry.item,
45
+ lane
46
+ });
47
+ }
48
+ const groupStart = group[0]?.start ?? 0;
49
+ const groupEnd = group.reduce((latest, entry) => Math.max(latest, entry.end), groupStart);
50
+ return assigned.map(({
51
+ item,
52
+ lane
53
+ }) => ({
54
+ item,
55
+ lane,
56
+ lanes: Math.max(1, laneCount),
57
+ groupId,
58
+ groupStart,
59
+ groupEnd
60
+ }));
61
+ };
62
+
63
+ /**
64
+ * Assigns the lowest available visual lane to overlapping intervals.
65
+ * Sorting plus two binary heaps keeps large overlap groups at O(n log n).
66
+ */
67
+ export const layoutCalendarIntervals = (items, bounds) => {
68
+ const sorted = items.map(item => {
69
+ const interval = bounds(item);
70
+ return {
71
+ item,
72
+ start: interval.start,
73
+ end: Math.max(interval.start, interval.end)
74
+ };
75
+ }).sort((left, right) => left.start - right.start || right.end - left.end);
76
+ const groups = [];
77
+ let group = [];
78
+ let groupEnd = Number.NEGATIVE_INFINITY;
79
+ for (const entry of sorted) {
80
+ if (group.length === 0 || entry.start < groupEnd) {
81
+ group.push(entry);
82
+ groupEnd = Math.max(groupEnd, entry.end);
83
+ continue;
84
+ }
85
+ groups.push(group);
86
+ group = [entry];
87
+ groupEnd = entry.end;
88
+ }
89
+ if (group.length > 0) groups.push(group);
90
+ return groups.flatMap((entries, groupId) => layoutGroup(entries, groupId));
91
+ };
92
+ //# sourceMappingURL=calendar-event-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["heapPush","heap","value","before","push","index","length","parent","Math","floor","heapPop","first","last","pop","undefined","left","right","next","layoutGroup","group","groupId","active","freeLanes","assigned","laneCount","entry","end","start","released","lane","item","groupStart","groupEnd","reduce","latest","max","map","lanes","layoutCalendarIntervals","items","bounds","sorted","interval","sort","groups","Number","NEGATIVE_INFINITY","flatMap","entries"],"sources":["content/calendar-event-layout.ts"],"sourcesContent":["export type CalendarIntervalLayout<T> = {\n item: T;\n lane: number;\n lanes: number;\n groupId: number;\n groupStart: number;\n groupEnd: number;\n};\n\ntype BoundedItem<T> = {\n item: T;\n start: number;\n end: number;\n};\n\ntype ActiveLane = {\n end: number;\n lane: number;\n};\n\nconst heapPush = <T>(heap: T[], value: T, before: (left: T, right: T) => boolean): void => {\n heap.push(value);\n let index = heap.length - 1;\n while (index > 0) {\n const parent = Math.floor((index - 1) / 2);\n if (!before(heap[index]!, heap[parent]!)) break;\n [heap[parent], heap[index]] = [heap[index]!, heap[parent]!];\n index = parent;\n }\n};\n\nconst heapPop = <T>(heap: T[], before: (left: T, right: T) => boolean): T | undefined => {\n const first = heap[0];\n const last = heap.pop();\n if (heap.length === 0 || last === undefined) return first;\n heap[0] = last;\n let index = 0;\n while (true) {\n const left = index * 2 + 1;\n const right = left + 1;\n let next = index;\n if (left < heap.length && before(heap[left]!, heap[next]!)) next = left;\n if (right < heap.length && before(heap[right]!, heap[next]!)) next = right;\n if (next === index) return first;\n [heap[index], heap[next]] = [heap[next]!, heap[index]!];\n index = next;\n }\n};\n\nconst layoutGroup = <T>(group: readonly BoundedItem<T>[], groupId: number): CalendarIntervalLayout<T>[] => {\n const active: ActiveLane[] = [];\n const freeLanes: number[] = [];\n const assigned: Array<{ item: T; lane: number }> = [];\n let laneCount = 0;\n\n for (const entry of group) {\n while (active[0] && active[0].end <= entry.start) {\n const released = heapPop(active, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n if (released) heapPush(freeLanes, released.lane, (left, right) => left < right);\n }\n const lane = heapPop(freeLanes, (left, right) => left < right) ?? laneCount++;\n heapPush(active, { end: entry.end, lane }, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n assigned.push({ item: entry.item, lane });\n }\n\n const groupStart = group[0]?.start ?? 0;\n const groupEnd = group.reduce((latest, entry) => Math.max(latest, entry.end), groupStart);\n return assigned.map(({ item, lane }) => ({ item, lane, lanes: Math.max(1, laneCount), groupId, groupStart, groupEnd }));\n};\n\n/**\n * Assigns the lowest available visual lane to overlapping intervals.\n * Sorting plus two binary heaps keeps large overlap groups at O(n log n).\n */\nexport const layoutCalendarIntervals = <T>(\n items: readonly T[],\n bounds: (item: T) => { start: number; end: number },\n): CalendarIntervalLayout<T>[] => {\n const sorted = items\n .map((item) => {\n const interval = bounds(item);\n return { item, start: interval.start, end: Math.max(interval.start, interval.end) };\n })\n .sort((left, right) => left.start - right.start || right.end - left.end);\n const groups: Array<Array<BoundedItem<T>>> = [];\n let group: Array<BoundedItem<T>> = [];\n let groupEnd = Number.NEGATIVE_INFINITY;\n\n for (const entry of sorted) {\n if (group.length === 0 || entry.start < groupEnd) {\n group.push(entry);\n groupEnd = Math.max(groupEnd, entry.end);\n continue;\n }\n groups.push(group);\n group = [entry];\n groupEnd = entry.end;\n }\n if (group.length > 0) groups.push(group);\n\n return groups.flatMap((entries, groupId) => layoutGroup(entries, groupId));\n};\n"],"mappings":"AAoBA,MAAMA,QAAQ,GAAGA,CAAIC,IAAS,EAAEC,KAAQ,EAAEC,MAAsC,KAAW;EACzFF,IAAI,CAACG,IAAI,CAACF,KAAK,CAAC;EAChB,IAAIG,KAAK,GAAGJ,IAAI,CAACK,MAAM,GAAG,CAAC;EAC3B,OAAOD,KAAK,GAAG,CAAC,EAAE;IAChB,MAAME,MAAM,GAAGC,IAAI,CAACC,KAAK,CAAC,CAACJ,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAACF,MAAM,CAACF,IAAI,CAACI,KAAK,CAAC,EAAGJ,IAAI,CAACM,MAAM,CAAE,CAAC,EAAE;IAC1C,CAACN,IAAI,CAACM,MAAM,CAAC,EAAEN,IAAI,CAACI,KAAK,CAAC,CAAC,GAAG,CAACJ,IAAI,CAACI,KAAK,CAAC,EAAGJ,IAAI,CAACM,MAAM,CAAC,CAAE;IAC3DF,KAAK,GAAGE,MAAM;EAChB;AACF,CAAC;AAED,MAAMG,OAAO,GAAGA,CAAIT,IAAS,EAAEE,MAAsC,KAAoB;EACvF,MAAMQ,KAAK,GAAGV,IAAI,CAAC,CAAC,CAAC;EACrB,MAAMW,IAAI,GAAGX,IAAI,CAACY,GAAG,CAAC,CAAC;EACvB,IAAIZ,IAAI,CAACK,MAAM,KAAK,CAAC,IAAIM,IAAI,KAAKE,SAAS,EAAE,OAAOH,KAAK;EACzDV,IAAI,CAAC,CAAC,CAAC,GAAGW,IAAI;EACd,IAAIP,KAAK,GAAG,CAAC;EACb,OAAO,IAAI,EAAE;IACX,MAAMU,IAAI,GAAGV,KAAK,GAAG,CAAC,GAAG,CAAC;IAC1B,MAAMW,KAAK,GAAGD,IAAI,GAAG,CAAC;IACtB,IAAIE,IAAI,GAAGZ,KAAK;IAChB,IAAIU,IAAI,GAAGd,IAAI,CAACK,MAAM,IAAIH,MAAM,CAACF,IAAI,CAACc,IAAI,CAAC,EAAGd,IAAI,CAACgB,IAAI,CAAE,CAAC,EAAEA,IAAI,GAAGF,IAAI;IACvE,IAAIC,KAAK,GAAGf,IAAI,CAACK,MAAM,IAAIH,MAAM,CAACF,IAAI,CAACe,KAAK,CAAC,EAAGf,IAAI,CAACgB,IAAI,CAAE,CAAC,EAAEA,IAAI,GAAGD,KAAK;IAC1E,IAAIC,IAAI,KAAKZ,KAAK,EAAE,OAAOM,KAAK;IAChC,CAACV,IAAI,CAACI,KAAK,CAAC,EAAEJ,IAAI,CAACgB,IAAI,CAAC,CAAC,GAAG,CAAChB,IAAI,CAACgB,IAAI,CAAC,EAAGhB,IAAI,CAACI,KAAK,CAAC,CAAE;IACvDA,KAAK,GAAGY,IAAI;EACd;AACF,CAAC;AAED,MAAMC,WAAW,GAAGA,CAAIC,KAAgC,EAAEC,OAAe,KAAkC;EACzG,MAAMC,MAAoB,GAAG,EAAE;EAC/B,MAAMC,SAAmB,GAAG,EAAE;EAC9B,MAAMC,QAA0C,GAAG,EAAE;EACrD,IAAIC,SAAS,GAAG,CAAC;EAEjB,KAAK,MAAMC,KAAK,IAAIN,KAAK,EAAE;IACzB,OAAOE,MAAM,CAAC,CAAC,CAAC,IAAIA,MAAM,CAAC,CAAC,CAAC,CAACK,GAAG,IAAID,KAAK,CAACE,KAAK,EAAE;MAChD,MAAMC,QAAQ,GAAGlB,OAAO,CAACW,MAAM,EAAE,CAACN,IAAI,EAAEC,KAAK,KAAKD,IAAI,CAACW,GAAG,GAAGV,KAAK,CAACU,GAAG,IAAKX,IAAI,CAACW,GAAG,KAAKV,KAAK,CAACU,GAAG,IAAIX,IAAI,CAACc,IAAI,GAAGb,KAAK,CAACa,IAAK,CAAC;MAC7H,IAAID,QAAQ,EAAE5B,QAAQ,CAACsB,SAAS,EAAEM,QAAQ,CAACC,IAAI,EAAE,CAACd,IAAI,EAAEC,KAAK,KAAKD,IAAI,GAAGC,KAAK,CAAC;IACjF;IACA,MAAMa,IAAI,GAAGnB,OAAO,CAACY,SAAS,EAAE,CAACP,IAAI,EAAEC,KAAK,KAAKD,IAAI,GAAGC,KAAK,CAAC,IAAIQ,SAAS,EAAE;IAC7ExB,QAAQ,CAACqB,MAAM,EAAE;MAAEK,GAAG,EAAED,KAAK,CAACC,GAAG;MAAEG;IAAK,CAAC,EAAE,CAACd,IAAI,EAAEC,KAAK,KAAKD,IAAI,CAACW,GAAG,GAAGV,KAAK,CAACU,GAAG,IAAKX,IAAI,CAACW,GAAG,KAAKV,KAAK,CAACU,GAAG,IAAIX,IAAI,CAACc,IAAI,GAAGb,KAAK,CAACa,IAAK,CAAC;IACvIN,QAAQ,CAACnB,IAAI,CAAC;MAAE0B,IAAI,EAAEL,KAAK,CAACK,IAAI;MAAED;IAAK,CAAC,CAAC;EAC3C;EAEA,MAAME,UAAU,GAAGZ,KAAK,CAAC,CAAC,CAAC,EAAEQ,KAAK,IAAI,CAAC;EACvC,MAAMK,QAAQ,GAAGb,KAAK,CAACc,MAAM,CAAC,CAACC,MAAM,EAAET,KAAK,KAAKjB,IAAI,CAAC2B,GAAG,CAACD,MAAM,EAAET,KAAK,CAACC,GAAG,CAAC,EAAEK,UAAU,CAAC;EACzF,OAAOR,QAAQ,CAACa,GAAG,CAAC,CAAC;IAAEN,IAAI;IAAED;EAAK,CAAC,MAAM;IAAEC,IAAI;IAAED,IAAI;IAAEQ,KAAK,EAAE7B,IAAI,CAAC2B,GAAG,CAAC,CAAC,EAAEX,SAAS,CAAC;IAAEJ,OAAO;IAAEW,UAAU;IAAEC;EAAS,CAAC,CAAC,CAAC;AACzH,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMM,uBAAuB,GAAGA,CACrCC,KAAmB,EACnBC,MAAmD,KACnB;EAChC,MAAMC,MAAM,GAAGF,KAAK,CACjBH,GAAG,CAAEN,IAAI,IAAK;IACb,MAAMY,QAAQ,GAAGF,MAAM,CAACV,IAAI,CAAC;IAC7B,OAAO;MAAEA,IAAI;MAAEH,KAAK,EAAEe,QAAQ,CAACf,KAAK;MAAED,GAAG,EAAElB,IAAI,CAAC2B,GAAG,CAACO,QAAQ,CAACf,KAAK,EAAEe,QAAQ,CAAChB,GAAG;IAAE,CAAC;EACrF,CAAC,CAAC,CACDiB,IAAI,CAAC,CAAC5B,IAAI,EAAEC,KAAK,KAAKD,IAAI,CAACY,KAAK,GAAGX,KAAK,CAACW,KAAK,IAAIX,KAAK,CAACU,GAAG,GAAGX,IAAI,CAACW,GAAG,CAAC;EAC1E,MAAMkB,MAAoC,GAAG,EAAE;EAC/C,IAAIzB,KAA4B,GAAG,EAAE;EACrC,IAAIa,QAAQ,GAAGa,MAAM,CAACC,iBAAiB;EAEvC,KAAK,MAAMrB,KAAK,IAAIgB,MAAM,EAAE;IAC1B,IAAItB,KAAK,CAACb,MAAM,KAAK,CAAC,IAAImB,KAAK,CAACE,KAAK,GAAGK,QAAQ,EAAE;MAChDb,KAAK,CAACf,IAAI,CAACqB,KAAK,CAAC;MACjBO,QAAQ,GAAGxB,IAAI,CAAC2B,GAAG,CAACH,QAAQ,EAAEP,KAAK,CAACC,GAAG,CAAC;MACxC;IACF;IACAkB,MAAM,CAACxC,IAAI,CAACe,KAAK,CAAC;IAClBA,KAAK,GAAG,CAACM,KAAK,CAAC;IACfO,QAAQ,GAAGP,KAAK,CAACC,GAAG;EACtB;EACA,IAAIP,KAAK,CAACb,MAAM,GAAG,CAAC,EAAEsC,MAAM,CAACxC,IAAI,CAACe,KAAK,CAAC;EAExC,OAAOyB,MAAM,CAACG,OAAO,CAAC,CAACC,OAAO,EAAE5B,OAAO,KAAKF,WAAW,CAAC8B,OAAO,EAAE5B,OAAO,CAAC,CAAC;AAC5E,CAAC","ignoreList":[]}