@k2b/ui 0.50.0 → 0.52.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 (420) hide show
  1. package/dist/base.css +35 -1
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/CommandList.js +861 -0
  4. package/dist/browser/actions/CommandList.js.map +1 -0
  5. package/dist/browser/actions/CommandMenu.js +237 -0
  6. package/dist/browser/actions/CommandMenu.js.map +1 -0
  7. package/dist/browser/actions/Dropdown.js +43 -10
  8. package/dist/browser/actions/Dropdown.js.map +1 -1
  9. package/dist/browser/actions/Toolbar.js +8 -2
  10. package/dist/browser/actions/Toolbar.js.map +1 -1
  11. package/dist/browser/actions/command-dock.js +47 -0
  12. package/dist/browser/actions/command-dock.js.map +1 -0
  13. package/dist/browser/actions/command-items.js +84 -0
  14. package/dist/browser/actions/command-items.js.map +1 -0
  15. package/dist/browser/actions/command-messages.js +42 -0
  16. package/dist/browser/actions/command-messages.js.map +1 -0
  17. package/dist/browser/actions/index.js +1 -0
  18. package/dist/browser/actions/index.js.map +1 -1
  19. package/dist/browser/charts/core/area.js +3 -5
  20. package/dist/browser/charts/core/area.js.map +1 -1
  21. package/dist/browser/charts/core/bar-labels.js +5 -0
  22. package/dist/browser/charts/core/bar-labels.js.map +1 -0
  23. package/dist/browser/charts/core/bubble.js +166 -0
  24. package/dist/browser/charts/core/bubble.js.map +1 -0
  25. package/dist/browser/charts/core/calendar.js +1 -1
  26. package/dist/browser/charts/core/calendar.js.map +1 -1
  27. package/dist/browser/charts/core/chart-messages.js +17 -0
  28. package/dist/browser/charts/core/chart-messages.js.map +1 -0
  29. package/dist/browser/charts/core/default-styles.js +83 -0
  30. package/dist/browser/charts/core/default-styles.js.map +1 -0
  31. package/dist/browser/charts/core/funnel-layout.js +79 -0
  32. package/dist/browser/charts/core/funnel-layout.js.map +1 -0
  33. package/dist/browser/charts/core/funnel.js +27 -0
  34. package/dist/browser/charts/core/funnel.js.map +1 -0
  35. package/dist/browser/charts/core/hbar-layout.js +118 -0
  36. package/dist/browser/charts/core/hbar-layout.js.map +1 -0
  37. package/dist/browser/charts/core/hbar.js +39 -0
  38. package/dist/browser/charts/core/hbar.js.map +1 -0
  39. package/dist/browser/charts/core/index.js +12 -2
  40. package/dist/browser/charts/core/index.js.map +1 -1
  41. package/dist/browser/charts/core/map.js +116 -0
  42. package/dist/browser/charts/core/map.js.map +1 -0
  43. package/dist/browser/charts/core/pareto.js +120 -0
  44. package/dist/browser/charts/core/pareto.js.map +1 -0
  45. package/dist/browser/charts/core/radar.js +101 -0
  46. package/dist/browser/charts/core/radar.js.map +1 -0
  47. package/dist/browser/charts/core/registry.js +33 -16
  48. package/dist/browser/charts/core/registry.js.map +1 -1
  49. package/dist/browser/charts/core/render-size.js +15 -0
  50. package/dist/browser/charts/core/render-size.js.map +1 -0
  51. package/dist/browser/charts/core/render.js +39 -10
  52. package/dist/browser/charts/core/render.js.map +1 -1
  53. package/dist/browser/charts/core/snapshot.js +4 -4
  54. package/dist/browser/charts/core/snapshot.js.map +1 -1
  55. package/dist/browser/charts/core/svg-barGauge.js +67 -0
  56. package/dist/browser/charts/core/svg-barGauge.js.map +1 -0
  57. package/dist/browser/charts/core/svg-boxplot.js +127 -0
  58. package/dist/browser/charts/core/svg-boxplot.js.map +1 -0
  59. package/dist/browser/charts/core/svg-common.js +1065 -0
  60. package/dist/browser/charts/core/svg-common.js.map +1 -0
  61. package/dist/browser/charts/core/svg-gauge.js +185 -0
  62. package/dist/browser/charts/core/svg-gauge.js.map +1 -0
  63. package/dist/browser/charts/core/svg-heatmap.js +80 -0
  64. package/dist/browser/charts/core/svg-heatmap.js.map +1 -0
  65. package/dist/browser/charts/core/svg-histogram.js +73 -0
  66. package/dist/browser/charts/core/svg-histogram.js.map +1 -0
  67. package/dist/browser/charts/core/svg-renderers.js +638 -0
  68. package/dist/browser/charts/core/svg-renderers.js.map +1 -0
  69. package/dist/browser/charts/core/svg-scatter.js +114 -0
  70. package/dist/browser/charts/core/svg-scatter.js.map +1 -0
  71. package/dist/browser/charts/core/svg.js +4 -2525
  72. package/dist/browser/charts/core/svg.js.map +1 -1
  73. package/dist/browser/charts/core/treemap.js +138 -0
  74. package/dist/browser/charts/core/treemap.js.map +1 -0
  75. package/dist/browser/charts/core/types.js +0 -2
  76. package/dist/browser/charts/core/types.js.map +1 -1
  77. package/dist/browser/charts/core/waterfall.js +162 -0
  78. package/dist/browser/charts/core/waterfall.js.map +1 -0
  79. package/dist/browser/charts/description.js +2 -0
  80. package/dist/browser/charts/description.js.map +1 -0
  81. package/dist/browser/charts.js.map +1 -1
  82. package/dist/browser/content/Chart.js +14 -628
  83. package/dist/browser/content/Chart.js.map +1 -1
  84. package/dist/browser/content/ChartRoot.js +646 -0
  85. package/dist/browser/content/ChartRoot.js.map +1 -0
  86. package/dist/browser/content/ChartSnapshotView.js +4 -1
  87. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  88. package/dist/browser/content/ChartSparkline.js +24 -0
  89. package/dist/browser/content/ChartSparkline.js.map +1 -0
  90. package/dist/browser/content/DataTable.js +186 -193
  91. package/dist/browser/content/DataTable.js.map +1 -1
  92. package/dist/browser/content/FileView.js +111 -61
  93. package/dist/browser/content/FileView.js.map +1 -1
  94. package/dist/browser/content/Lightbox.js +62 -30
  95. package/dist/browser/content/Lightbox.js.map +1 -1
  96. package/dist/browser/content/MapView.js +30 -28
  97. package/dist/browser/content/MapView.js.map +1 -1
  98. package/dist/browser/content/PdfPreview.js +84 -52
  99. package/dist/browser/content/PdfPreview.js.map +1 -1
  100. package/dist/browser/content/PdfViewer.js +588 -0
  101. package/dist/browser/content/PdfViewer.js.map +1 -0
  102. package/dist/browser/content/ThumbnailStrip.js +174 -0
  103. package/dist/browser/content/ThumbnailStrip.js.map +1 -0
  104. package/dist/browser/content/chart-bar.js +344 -16
  105. package/dist/browser/content/chart-bar.js.map +1 -1
  106. package/dist/browser/content/chart-inspection-core.js +50 -29
  107. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  108. package/dist/browser/content/chart-line-gaps.js +1 -1
  109. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  110. package/dist/browser/content/chart-message-catalog.js +28 -0
  111. package/dist/browser/content/chart-message-catalog.js.map +1 -1
  112. package/dist/browser/content/chart-state-timeline.js +1 -1
  113. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  114. package/dist/browser/content/chart-svg.js +2 -1
  115. package/dist/browser/content/chart-svg.js.map +1 -1
  116. package/dist/browser/content/index.js +2 -0
  117. package/dist/browser/content/index.js.map +1 -1
  118. package/dist/browser/content/pdf-document.js +29 -0
  119. package/dist/browser/content/pdf-document.js.map +1 -0
  120. package/dist/browser/content/pdf-limits.js +31 -0
  121. package/dist/browser/content/pdf-limits.js.map +1 -0
  122. package/dist/browser/content/pdf-messages.js +34 -2
  123. package/dist/browser/content/pdf-messages.js.map +1 -1
  124. package/dist/browser/content/pdf-viewer-engine.js +57 -0
  125. package/dist/browser/content/pdf-viewer-worker.js +28 -0
  126. package/dist/browser/content/thumbnail-strip-messages.js +24 -0
  127. package/dist/browser/content/thumbnail-strip-messages.js.map +1 -0
  128. package/dist/browser/inputs/ChoiceInputs.js +150 -76
  129. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  130. package/dist/browser/inputs/ChoiceSlider.js +75 -58
  131. package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
  132. package/dist/browser/inputs/DatePicker.js +113 -98
  133. package/dist/browser/inputs/DatePicker.js.map +1 -1
  134. package/dist/browser/inputs/PeriodPicker.js +874 -0
  135. package/dist/browser/inputs/PeriodPicker.js.map +1 -0
  136. package/dist/browser/inputs/index.js +5 -1
  137. package/dist/browser/inputs/index.js.map +1 -1
  138. package/dist/browser/inputs/input-messages.js +8 -2
  139. package/dist/browser/inputs/input-messages.js.map +1 -1
  140. package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
  141. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  142. package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js +330 -0
  143. package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
  144. package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
  145. package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
  146. package/dist/browser/inputs/period-picker-messages.js +71 -0
  147. package/dist/browser/inputs/period-picker-messages.js.map +1 -0
  148. package/dist/browser/inputs/period.js +263 -0
  149. package/dist/browser/inputs/period.js.map +1 -0
  150. package/dist/browser/internal/field.js +96 -77
  151. package/dist/browser/internal/field.js.map +1 -1
  152. package/dist/browser/layout/AppWorkspace.js +7 -5
  153. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  154. package/dist/browser/layout/DetailPanel.js +147 -120
  155. package/dist/browser/layout/DetailPanel.js.map +1 -1
  156. package/dist/browser/layout/Discussion.js +101 -108
  157. package/dist/browser/layout/Discussion.js.map +1 -1
  158. package/dist/browser/layout/PanelDialog.js +92 -68
  159. package/dist/browser/layout/PanelDialog.js.map +1 -1
  160. package/dist/browser/layout/index.js.map +1 -1
  161. package/dist/browser/surfaces/DescriptionList.js +5 -2
  162. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  163. package/dist/browser/surfaces/StatCell.js +95 -78
  164. package/dist/browser/surfaces/StatCell.js.map +1 -1
  165. package/dist/browser/surfaces/delta-badge.js +16 -2
  166. package/dist/browser/surfaces/delta-badge.js.map +1 -1
  167. package/dist/browser/surfaces/stat-cell-messages.js +4 -2
  168. package/dist/browser/surfaces/stat-cell-messages.js.map +1 -1
  169. package/dist/browser/widgets/DashboardFrame.js +315 -0
  170. package/dist/browser/widgets/DashboardFrame.js.map +1 -0
  171. package/dist/browser/widgets/index.js +1 -0
  172. package/dist/browser/widgets/index.js.map +1 -1
  173. package/dist/licenses/pdfjs-dist.txt +177 -0
  174. package/dist/ssr/actions/Button.js.map +1 -1
  175. package/dist/ssr/actions/CommandList.js +638 -0
  176. package/dist/ssr/actions/CommandList.js.map +1 -0
  177. package/dist/ssr/actions/CommandMenu.js +197 -0
  178. package/dist/ssr/actions/CommandMenu.js.map +1 -0
  179. package/dist/ssr/actions/Dropdown.js +43 -10
  180. package/dist/ssr/actions/Dropdown.js.map +1 -1
  181. package/dist/ssr/actions/Toolbar.js +8 -2
  182. package/dist/ssr/actions/Toolbar.js.map +1 -1
  183. package/dist/ssr/actions/command-dock.js +47 -0
  184. package/dist/ssr/actions/command-dock.js.map +1 -0
  185. package/dist/ssr/actions/command-items.js +84 -0
  186. package/dist/ssr/actions/command-items.js.map +1 -0
  187. package/dist/ssr/actions/command-messages.js +42 -0
  188. package/dist/ssr/actions/command-messages.js.map +1 -0
  189. package/dist/ssr/actions/index.js +1 -0
  190. package/dist/ssr/actions/index.js.map +1 -1
  191. package/dist/ssr/charts/core/area.js +3 -5
  192. package/dist/ssr/charts/core/area.js.map +1 -1
  193. package/dist/ssr/charts/core/bar-labels.js +5 -0
  194. package/dist/ssr/charts/core/bar-labels.js.map +1 -0
  195. package/dist/ssr/charts/core/bubble.js +166 -0
  196. package/dist/ssr/charts/core/bubble.js.map +1 -0
  197. package/dist/ssr/charts/core/calendar.js +1 -1
  198. package/dist/ssr/charts/core/calendar.js.map +1 -1
  199. package/dist/ssr/charts/core/chart-messages.js +17 -0
  200. package/dist/ssr/charts/core/chart-messages.js.map +1 -0
  201. package/dist/ssr/charts/core/default-styles.js +83 -0
  202. package/dist/ssr/charts/core/default-styles.js.map +1 -0
  203. package/dist/ssr/charts/core/funnel-layout.js +79 -0
  204. package/dist/ssr/charts/core/funnel-layout.js.map +1 -0
  205. package/dist/ssr/charts/core/funnel.js +27 -0
  206. package/dist/ssr/charts/core/funnel.js.map +1 -0
  207. package/dist/ssr/charts/core/hbar-layout.js +118 -0
  208. package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
  209. package/dist/ssr/charts/core/hbar.js +39 -0
  210. package/dist/ssr/charts/core/hbar.js.map +1 -0
  211. package/dist/ssr/charts/core/index.js +12 -2
  212. package/dist/ssr/charts/core/index.js.map +1 -1
  213. package/dist/ssr/charts/core/map.js +116 -0
  214. package/dist/ssr/charts/core/map.js.map +1 -0
  215. package/dist/ssr/charts/core/pareto.js +120 -0
  216. package/dist/ssr/charts/core/pareto.js.map +1 -0
  217. package/dist/ssr/charts/core/radar.js +101 -0
  218. package/dist/ssr/charts/core/radar.js.map +1 -0
  219. package/dist/ssr/charts/core/registry.js +33 -16
  220. package/dist/ssr/charts/core/registry.js.map +1 -1
  221. package/dist/ssr/charts/core/render-size.js +15 -0
  222. package/dist/ssr/charts/core/render-size.js.map +1 -0
  223. package/dist/ssr/charts/core/render.js +39 -10
  224. package/dist/ssr/charts/core/render.js.map +1 -1
  225. package/dist/ssr/charts/core/snapshot.js +4 -4
  226. package/dist/ssr/charts/core/snapshot.js.map +1 -1
  227. package/dist/ssr/charts/core/svg-barGauge.js +67 -0
  228. package/dist/ssr/charts/core/svg-barGauge.js.map +1 -0
  229. package/dist/ssr/charts/core/svg-boxplot.js +127 -0
  230. package/dist/ssr/charts/core/svg-boxplot.js.map +1 -0
  231. package/dist/ssr/charts/core/svg-common.js +1065 -0
  232. package/dist/ssr/charts/core/svg-common.js.map +1 -0
  233. package/dist/ssr/charts/core/svg-gauge.js +185 -0
  234. package/dist/ssr/charts/core/svg-gauge.js.map +1 -0
  235. package/dist/ssr/charts/core/svg-heatmap.js +80 -0
  236. package/dist/ssr/charts/core/svg-heatmap.js.map +1 -0
  237. package/dist/ssr/charts/core/svg-histogram.js +73 -0
  238. package/dist/ssr/charts/core/svg-histogram.js.map +1 -0
  239. package/dist/ssr/charts/core/svg-renderers.js +638 -0
  240. package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
  241. package/dist/ssr/charts/core/svg-scatter.js +114 -0
  242. package/dist/ssr/charts/core/svg-scatter.js.map +1 -0
  243. package/dist/ssr/charts/core/svg.js +4 -2525
  244. package/dist/ssr/charts/core/svg.js.map +1 -1
  245. package/dist/ssr/charts/core/treemap.js +138 -0
  246. package/dist/ssr/charts/core/treemap.js.map +1 -0
  247. package/dist/ssr/charts/core/types.js +0 -2
  248. package/dist/ssr/charts/core/types.js.map +1 -1
  249. package/dist/ssr/charts/core/waterfall.js +162 -0
  250. package/dist/ssr/charts/core/waterfall.js.map +1 -0
  251. package/dist/ssr/charts/description.js +2 -0
  252. package/dist/ssr/charts/description.js.map +1 -0
  253. package/dist/ssr/charts.js.map +1 -1
  254. package/dist/ssr/content/Chart.js +14 -471
  255. package/dist/ssr/content/Chart.js.map +1 -1
  256. package/dist/ssr/content/ChartRoot.js +489 -0
  257. package/dist/ssr/content/ChartRoot.js.map +1 -0
  258. package/dist/ssr/content/ChartSnapshotView.js +1 -0
  259. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  260. package/dist/ssr/content/ChartSparkline.js +24 -0
  261. package/dist/ssr/content/ChartSparkline.js.map +1 -0
  262. package/dist/ssr/content/DataTable.js +12 -16
  263. package/dist/ssr/content/DataTable.js.map +1 -1
  264. package/dist/ssr/content/FileView.js +56 -7
  265. package/dist/ssr/content/FileView.js.map +1 -1
  266. package/dist/ssr/content/Lightbox.js +39 -10
  267. package/dist/ssr/content/Lightbox.js.map +1 -1
  268. package/dist/ssr/content/MapView.js +9 -9
  269. package/dist/ssr/content/MapView.js.map +1 -1
  270. package/dist/ssr/content/PdfPreview.js +49 -20
  271. package/dist/ssr/content/PdfPreview.js.map +1 -1
  272. package/dist/ssr/content/PdfViewer.js +484 -0
  273. package/dist/ssr/content/PdfViewer.js.map +1 -0
  274. package/dist/ssr/content/ThumbnailStrip.js +103 -0
  275. package/dist/ssr/content/ThumbnailStrip.js.map +1 -0
  276. package/dist/ssr/content/chart-bar.js +344 -16
  277. package/dist/ssr/content/chart-bar.js.map +1 -1
  278. package/dist/ssr/content/chart-inspection-core.js +50 -29
  279. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  280. package/dist/ssr/content/chart-line-gaps.js +1 -1
  281. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  282. package/dist/ssr/content/chart-message-catalog.js +28 -0
  283. package/dist/ssr/content/chart-message-catalog.js.map +1 -1
  284. package/dist/ssr/content/chart-state-timeline.js +1 -1
  285. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  286. package/dist/ssr/content/chart-svg.js +2 -1
  287. package/dist/ssr/content/chart-svg.js.map +1 -1
  288. package/dist/ssr/content/index.js +2 -0
  289. package/dist/ssr/content/index.js.map +1 -1
  290. package/dist/ssr/content/pdf-document.js +29 -0
  291. package/dist/ssr/content/pdf-document.js.map +1 -0
  292. package/dist/ssr/content/pdf-limits.js +31 -0
  293. package/dist/ssr/content/pdf-limits.js.map +1 -0
  294. package/dist/ssr/content/pdf-messages.js +34 -2
  295. package/dist/ssr/content/pdf-messages.js.map +1 -1
  296. package/dist/ssr/content/thumbnail-strip-messages.js +24 -0
  297. package/dist/ssr/content/thumbnail-strip-messages.js.map +1 -0
  298. package/dist/ssr/inputs/ChoiceInputs.js +69 -17
  299. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  300. package/dist/ssr/inputs/ChoiceSlider.js +17 -12
  301. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
  302. package/dist/ssr/inputs/DatePicker.js +14 -9
  303. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  304. package/dist/ssr/inputs/PeriodPicker.js +598 -0
  305. package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
  306. package/dist/ssr/inputs/index.js +5 -1
  307. package/dist/ssr/inputs/index.js.map +1 -1
  308. package/dist/ssr/inputs/input-messages.js +8 -2
  309. package/dist/ssr/inputs/input-messages.js.map +1 -1
  310. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  311. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  312. package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js +293 -0
  313. package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
  314. package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
  315. package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
  316. package/dist/ssr/inputs/period-picker-messages.js +71 -0
  317. package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
  318. package/dist/ssr/inputs/period.js +263 -0
  319. package/dist/ssr/inputs/period.js.map +1 -0
  320. package/dist/ssr/internal/field.js +36 -24
  321. package/dist/ssr/internal/field.js.map +1 -1
  322. package/dist/ssr/layout/AppWorkspace.js +5 -1
  323. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  324. package/dist/ssr/layout/DetailPanel.js +27 -4
  325. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  326. package/dist/ssr/layout/Discussion.js +16 -2
  327. package/dist/ssr/layout/Discussion.js.map +1 -1
  328. package/dist/ssr/layout/PanelDialog.js +40 -26
  329. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  330. package/dist/ssr/layout/index.js.map +1 -1
  331. package/dist/ssr/surfaces/DescriptionList.js +1 -1
  332. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  333. package/dist/ssr/surfaces/StatCell.js +31 -21
  334. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  335. package/dist/ssr/surfaces/delta-badge.js +16 -2
  336. package/dist/ssr/surfaces/delta-badge.js.map +1 -1
  337. package/dist/ssr/surfaces/stat-cell-messages.js +4 -2
  338. package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -1
  339. package/dist/ssr/widgets/DashboardFrame.js +195 -0
  340. package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
  341. package/dist/ssr/widgets/index.js +1 -0
  342. package/dist/ssr/widgets/index.js.map +1 -1
  343. package/dist/styles.css +1 -1
  344. package/dist/types/actions/Button.d.ts +1 -1
  345. package/dist/types/actions/CommandList.d.ts +120 -0
  346. package/dist/types/actions/CommandMenu.d.ts +39 -0
  347. package/dist/types/actions/Dropdown.d.ts +17 -0
  348. package/dist/types/actions/Toolbar.d.ts +2 -0
  349. package/dist/types/actions/command-dock.d.ts +8 -0
  350. package/dist/types/actions/command-items.d.ts +134 -0
  351. package/dist/types/actions/command-messages.d.ts +19 -0
  352. package/dist/types/actions/index.d.ts +3 -0
  353. package/dist/types/charts/core/bar-labels.d.ts +1 -0
  354. package/dist/types/charts/core/bubble.d.ts +66 -0
  355. package/dist/types/charts/core/calendar.d.ts +1 -1
  356. package/dist/types/charts/core/chart-messages.d.ts +5 -0
  357. package/dist/types/charts/core/default-styles.d.ts +1 -0
  358. package/dist/types/charts/core/funnel-layout.d.ts +43 -0
  359. package/dist/types/charts/core/funnel.d.ts +13 -0
  360. package/dist/types/charts/core/hbar-layout.d.ts +74 -0
  361. package/dist/types/charts/core/hbar.d.ts +13 -0
  362. package/dist/types/charts/core/index.d.ts +12 -2
  363. package/dist/types/charts/core/map.d.ts +3 -0
  364. package/dist/types/charts/core/pareto.d.ts +40 -0
  365. package/dist/types/charts/core/radar.d.ts +47 -0
  366. package/dist/types/charts/core/registry.d.ts +27 -11
  367. package/dist/types/charts/core/render-size.d.ts +7 -0
  368. package/dist/types/charts/core/render.d.ts +1 -4
  369. package/dist/types/charts/core/snapshot.d.ts +2 -2
  370. package/dist/types/charts/core/svg-barGauge.d.ts +3 -0
  371. package/dist/types/charts/core/svg-boxplot.d.ts +18 -0
  372. package/dist/types/charts/core/svg-common.d.ts +612 -0
  373. package/dist/types/charts/core/svg-gauge.d.ts +6 -0
  374. package/dist/types/charts/core/svg-heatmap.d.ts +6 -0
  375. package/dist/types/charts/core/svg-histogram.d.ts +16 -0
  376. package/dist/types/charts/core/svg-renderers.d.ts +118 -0
  377. package/dist/types/charts/core/svg-scatter.d.ts +23 -0
  378. package/dist/types/charts/core/svg.d.ts +4 -698
  379. package/dist/types/charts/core/treemap.d.ts +45 -0
  380. package/dist/types/charts/core/types.d.ts +1 -12
  381. package/dist/types/charts/core/waterfall.d.ts +68 -0
  382. package/dist/types/charts/description.d.ts +289 -0
  383. package/dist/types/charts.d.ts +1 -0
  384. package/dist/types/content/Chart.d.ts +3 -91
  385. package/dist/types/content/ChartRoot.d.ts +92 -0
  386. package/dist/types/content/ChartSparkline.d.ts +5 -0
  387. package/dist/types/content/Lightbox.d.ts +2 -0
  388. package/dist/types/content/PdfViewer.d.ts +32 -0
  389. package/dist/types/content/ThumbnailStrip.d.ts +29 -0
  390. package/dist/types/content/chart-bar.d.ts +131 -2
  391. package/dist/types/content/chart-inspection-core.d.ts +7 -0
  392. package/dist/types/content/chart-inspection.d.ts +1 -0
  393. package/dist/types/content/chart-message-catalog.d.ts +8 -0
  394. package/dist/types/content/index.d.ts +3 -0
  395. package/dist/types/content/pdf-document.d.ts +5 -0
  396. package/dist/types/content/pdf-engine.d.ts +9 -0
  397. package/dist/types/content/pdf-limits.d.ts +43 -0
  398. package/dist/types/content/pdf-messages.d.ts +16 -0
  399. package/dist/types/content/thumbnail-strip-messages.d.ts +10 -0
  400. package/dist/types/inputs/ChoiceInputs.d.ts +6 -0
  401. package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
  402. package/dist/types/inputs/DatePicker.d.ts +22 -0
  403. package/dist/types/inputs/PeriodPicker.d.ts +24 -0
  404. package/dist/types/inputs/index.d.ts +10 -2
  405. package/dist/types/inputs/input-messages.d.ts +3 -0
  406. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
  407. package/dist/types/inputs/markdown/MarkdownSelectionToolbar.d.ts +19 -0
  408. package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
  409. package/dist/types/inputs/period-picker-messages.d.ts +34 -0
  410. package/dist/types/inputs/period.d.ts +134 -0
  411. package/dist/types/internal/field.d.ts +2 -0
  412. package/dist/types/layout/DetailPanel.d.ts +12 -0
  413. package/dist/types/layout/PanelDialog.d.ts +5 -0
  414. package/dist/types/layout/index.d.ts +1 -1
  415. package/dist/types/surfaces/DescriptionList.d.ts +5 -0
  416. package/dist/types/surfaces/StatCell.d.ts +6 -1
  417. package/dist/types/surfaces/stat-cell-messages.d.ts +1 -0
  418. package/dist/types/widgets/DashboardFrame.d.ts +61 -0
  419. package/dist/types/widgets/index.d.ts +1 -0
  420. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/FileView.tsx"],"sourcesContent":["import { useMarkdownEditorMessages } from \"../inputs/markdown/editor-messages\";\nimport { useDataTableMessages } from \"./data-table-messages\";\nimport { useFileViewMessages } from \"./file-view-messages\";\n/**\n * FileView — renders one file through a small renderer registry keyed by\n * media type / path. Editing is enabled purely by the presence of `save`;\n * without it every renderer is read-only. IDE-style chrome: editors reuse\n * the markdown editor's surface (toolbar with an in-toolbar save, Ctrl/Cmd+S),\n * previews are quiet paper panels with icon-only actions overlaid top-right.\n * A plain preview drops the panel and sits on its host's surface instead.\n * Custom renderers are passed per instance, which keeps SSR requests and\n * independently mounted applications isolated.\n */\n\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport {\n type Component,\n createContext,\n createEffect,\n createMemo,\n createResource,\n createSignal,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { prompts } from \"../feedback/prompts\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { toast } from \"../feedback/toast\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { Select } from \"../inputs/Select\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport CodeDisplay, { type CodeDisplayLanguage } from \"./CodeDisplay\";\nimport { type DelimitedPreferences, decodeDelimitedContent, readDelimitedPreferences } from \"./delimited-preferences\";\nimport { type FileViewFile, fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from \"./file-view-preview\";\nimport MarkdownView from \"./MarkdownView\";\nimport { leadingMarkdownTitle } from \"./markdown-title\";\nimport PdfPreview from \"./PdfPreview\";\nimport StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\nimport VideoPlayer from \"./VideoPlayer\";\n\nexport type { FileViewFile, FileViewPreviewKind } from \"./file-view-preview\";\nexport { canPreviewFile, getFileViewPreviewKind } from \"./file-view-preview\";\nexport type FileViewContent = { encoding: \"utf8\" | \"base64\"; content: string; mediaType: string };\n\nexport type FileViewProps = {\n /**\n * Plain previews inherit the surrounding surface without a frame or inset padding. They keep their natural height,\n * so the host scrolls them and owns the actions around them; a host that stretches one gets its scrolling back.\n */\n variant?: \"default\" | \"plain\";\n /**\n * Lifts a leading Markdown level-one heading into the host, for example a dialog title. Reports its plain text and\n * leaves that heading out of the preview, or reports null when the shown file has none, the heading holds a link or\n * image or is the whole document, or the file fails to load.\n */\n onDocumentTitle?: (title: string | null) => void;\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n load: () => Promise<FileViewContent>;\n /** Refetch the current path when this host-owned revision changes. */\n revision?: unknown;\n /** Register an awaitable refresh for the currently visible preview. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n /** Presence enables editing for text-based renderers. */\n save?: (content: string) => Promise<void>;\n /** Authenticated inline URL used by browser-native image, PDF, audio, and video previews. */\n previewHref?: string | null;\n /** CORS mode for native image/audio/video previews. Omit to preserve browser defaults. */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n /** Native media failed to load; the host can renew a signed URL and offer retry. */\n onPreviewError?: () => void;\n /** Download actions only; never a preview source, because an attachment response does not render inline. */\n downloadHref?: string | null;\n /** App-specific renderers matched before the built-ins for this instance. */\n renderers?: readonly FileViewRenderer[];\n /** Reports local edit state so a parent browser can guard navigation. */\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\nexport type FileViewRendererProps = {\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n content: FileViewContent;\n previewHref: string | null;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n onPreviewError?: () => void;\n downloadHref: string | null;\n /** Null when the file is read-only. */\n editor: {\n draft: () => string;\n setDraft: (value: string) => void;\n dirty: () => boolean;\n saving: () => boolean;\n save: () => Promise<void>;\n } | null;\n};\n\nexport type FileViewRenderer = {\n id: string;\n match: (file: FileViewFile, content: FileViewContent) => boolean;\n component: Component<FileViewRendererProps>;\n /** Text renderers that support the edit affordance when `save` is present. */\n editable?: boolean;\n};\n\n/** Instance options that reach the built-in renderers without widening the public renderer props. */\nconst FileViewHost = createContext({ plain: false, liftTitle: false });\n\nconst codeLanguage = (path: string): CodeDisplayLanguage => {\n const extension = fileViewExtension(path);\n if (extension === \"ts\" || extension === \"mts\" || extension === \"cts\") return \"ts\";\n if (extension === \"tsx\") return \"tsx\";\n if (extension === \"js\" || extension === \"mjs\" || extension === \"cjs\") return \"js\";\n if (extension === \"jsx\") return \"jsx\";\n if (extension === \"md\" || extension === \"markdown\") return \"md\";\n return \"text\";\n};\n\nconst isMarkdown = (file: FileViewFile, content: FileViewContent) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"markdown\";\n\n/** Rendered previews hide a leading YAML frontmatter block — it's metadata, not content. */\nconst stripFrontmatter = (text: string): string => {\n const match = /^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/.exec(text.trimStart());\n return match ? text.trimStart().slice(match[0].length) : text;\n};\n\n/** Icon-only download link with the shared tooltip, for toolbars that style their own controls. */\nfunction DownloadLink(props: { class: string; href: string; download: string; label: string; icon: string }) {\n let link: HTMLAnchorElement | undefined;\n return (\n <>\n <a ref={link} class={props.class} href={props.href} download={props.download} aria-label={props.label}>\n <i class={props.icon} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.label}</span>\n </a>\n <Tooltip content={props.label} target={() => link} />\n </>\n );\n}\n\n/** Icon-only action, IDE style — sits in the floating top-right cluster of previews. */\nfunction OverlayAction(props: { icon: string; title: string; onClick?: () => void; href?: string; download?: string }) {\n const classes = \"k2b-content-file-view__action\";\n return (\n <Show\n when={props.href}\n fallback={\n <Tooltip.Trigger type=\"button\" class={classes} content={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n {(href) => (\n <DownloadLink class={classes} href={href()} download={props.download ?? \"\"} label={props.title} icon={`ti ${props.icon}`} />\n )}\n </Show>\n );\n}\n\n/** Scrollable preview panel with the floating action cluster overlaid top-right. */\nfunction OverlayPanel(props: { actions?: JSX.Element; children: JSX.Element }) {\n return (\n <div class=\"k2b-content-file-view__panel\">\n <div class=\"k2b-content-file-view__preview\">{props.children}</div>\n <Show when={props.actions}>\n <div class=\"k2b-content-file-view__overlay\">{props.actions}</div>\n </Show>\n </div>\n );\n}\n\nconst DownloadAction = (props: FileViewRendererProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Show when={props.downloadHref}>\n {(href) => (\n <OverlayAction\n icon=\"ti-download\"\n title={messages().download}\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n />\n )}\n </Show>\n );\n};\n\n/** Toolbar-styled icon button — reuses the package markdown-editor tool primitive. */\nfunction EditorToolButton(props: { icon: string; title: string; onClick: () => void; disabled?: boolean }) {\n return (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={props.title}\n aria-label={props.title}\n tabIndex={-1}\n disabled={props.disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={props.onClick}\n >\n <i class={props.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MoreLines(props: { count: number; onClick?: () => void }) {\n const fileViewMessages = useFileViewMessages();\n return (\n <Show when={props.count > 0}>\n <div class=\"k2b-content-file-view__truncated\">\n <Show when={props.onClick} fallback={<span>{fileViewMessages().previewMoreLines(props.count)}</span>}>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onClick}>\n {fileViewMessages().previewMoreLines(props.count)}\n </Button>\n </Show>\n </div>\n </Show>\n );\n}\nfunction TextExcerpt(props: { renderer: FileViewRendererProps; text: string; markdown?: boolean }) {\n const lines = createMemo(() => props.text.replace(/\\r\\n?/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\"));\n const limit = () => (props.renderer.previewLines === undefined ? lines().length : Math.max(1, props.renderer.previewLines));\n const text = () => lines().slice(0, limit()).join(\"\\n\");\n const host = useContext(FileViewHost);\n // A plain preview has no code box: the host frames the file and owns its copy action.\n const content = () => (\n <Show\n when={props.markdown}\n fallback={<CodeDisplay code={text()} language={codeLanguage(props.renderer.file.path)} copy={host.plain ? false : undefined} />}\n >\n <MarkdownView markdown={text()} headingScale={props.renderer.headingScale ?? \"compact\"} />\n </Show>\n );\n // Only an excerpt needs a clipping box; a complete preview keeps its content\n // a direct child of the preview frame, which the frame's styles expect.\n return (\n <>\n <Show when={props.renderer.previewLines !== undefined} fallback={content()}>\n <div class=\"k2b-content-file-view__excerpt\">{content()}</div>\n </Show>\n <MoreLines count={lines().length - limit()} onClick={props.renderer.onExpandPreview} />\n </>\n );\n}\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const host = useContext(FileViewHost);\n const [editing, setEditing] = createSignal(false);\n const markdown = () => {\n const text = stripFrontmatter(props.editor?.draft() ?? props.content.content);\n return host.liftTitle ? (leadingMarkdownTitle(text)?.body ?? text) : text;\n };\n return (\n <Show\n when={props.editor && editing()}\n fallback={\n <OverlayPanel\n actions={\n <>\n <Show when={props.editor}>\n <OverlayAction icon=\"ti-pencil\" title={messages().edit} onClick={() => setEditing(true)} />\n </Show>\n <DownloadAction {...props} />\n </>\n }\n >\n <div class=\"k2b-content-file-view__document\">\n <TextExcerpt renderer={props} text={markdown()} markdown />\n </div>\n </OverlayPanel>\n }\n >\n {(_) => {\n const editor = props.editor!;\n return (\n <div class=\"k2b-content-file-view__editor\">\n <MarkdownEditor\n class=\"k2b-content-file-view__markdown-field\"\n aria-label={`Edit ${props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}`}\n fill\n value={editor.draft()}\n onValueChange={editor.setDraft}\n showStats={false}\n onSave={() => void editor.save()}\n saveDisabled={!editor.dirty()}\n saving={editor.saving()}\n toolbarTrailing={<EditorToolButton icon=\"ti ti-eye\" title={messages().preview} onClick={() => setEditing(false)} />}\n />\n </div>\n );\n }}\n </Show>\n );\n}\n\nfunction TextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const markdownEditorMessages = useMarkdownEditorMessages();\n return (\n <Show\n when={props.editor}\n fallback={\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <TextExcerpt renderer={props} text={props.content.content} />\n </OverlayPanel>\n }\n >\n {(editor) => (\n // Same chrome as the markdown editor — literally the same classes, so\n // border, radius, focus ring, toolbar height and text metrics cannot drift.\n <div class=\"k2b-content-file-view__editor\">\n <div\n class=\"k2b-markdown-editor\"\n data-fill=\"true\"\n role=\"group\"\n aria-label={fileViewMessages().textEditor}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (editor().dirty() && !editor().saving()) void editor().save();\n }\n }}\n >\n {/* No formatting tools here — the divider under an actions-only bar reads lost. */}\n <div class=\"k2b-markdown-editor__toolbar k2b-content-file-view__code-toolbar\">\n <span class=\"k2b-content-file-view__code-language\">{codeLanguage(props.file.path)}</span>\n <span class=\"k2b-markdown-editor__trailing\">\n <Show when={props.downloadHref}>\n {(href) => (\n <DownloadLink\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n label={messages().download}\n icon=\"ti ti-download\"\n />\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={markdownEditorMessages().saveShortcut}\n disabled={!editor().dirty() || editor().saving()}\n onClick={() => void editor().save()}\n />\n </span>\n </div>\n <div class=\"k2b-markdown-editor__surface\">\n <textarea\n class=\"k2b-content-file-view__code-input\"\n value={editor().draft()}\n spellcheck={false}\n onInput={(event) => editor().setDraft(event.currentTarget.value)}\n />\n </div>\n </div>\n </div>\n )}\n </Show>\n );\n}\n\nfunction JsonRenderer(props: FileViewRendererProps) {\n const parsed = createMemo(() => {\n try {\n return { ok: true as const, value: JSON.parse(props.content.content) as StructuredDataValue };\n } catch {\n return { ok: false as const };\n }\n });\n const parsedValue = (): StructuredDataValue => {\n const result = parsed();\n return result.ok ? result.value : null;\n };\n\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__document\">\n <Show when={parsed().ok} fallback={<TextExcerpt renderer={props} text={props.content.content} />}>\n <Show\n when={props.previewLines === undefined}\n fallback={<TextExcerpt renderer={props} text={JSON.stringify(parsedValue(), null, 2)} />}\n >\n <StructuredDataPreview data={parsedValue()} maxRows={200} />\n </Show>\n </Show>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction DelimitedTextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const dataTableMessages = useDataTableMessages();\n const [preferences, setPreferences] = createSignal<DelimitedPreferences>({ encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" });\n onMount(() => {\n if (!props.previewPreferencesKey) return;\n try {\n setPreferences(readDelimitedPreferences(localStorage.getItem(props.previewPreferencesKey)));\n } catch {\n /* Storage may be disabled. */\n }\n });\n const update = (patch: Partial<DelimitedPreferences>) => {\n const next = { ...preferences(), ...patch };\n setPreferences(next);\n if (props.previewPreferencesKey) {\n try {\n localStorage.setItem(props.previewPreferencesKey, JSON.stringify(next));\n } catch {\n /* Keep the local selection. */\n }\n }\n };\n const text = createMemo(() => decodeDelimitedContent(props.content, preferences().encoding));\n const delimiter = () =>\n preferences().delimiter === \"auto\"\n ? fileViewExtension(props.file.path) === \"tsv\" || props.content.mediaType === \"text/tab-separated-values\"\n ? \"\\t\"\n : \",\"\n : preferences().delimiter;\n const [page, setPage] = createSignal(0);\n createEffect(() => {\n text();\n delimiter();\n props.previewLines;\n setPage(0);\n });\n const pageSize = () => (props.previewLines === undefined ? 200 : Math.max(1, props.previewLines));\n const preview = createMemo(() => parseDelimitedText(text(), delimiter(), { rows: pageSize() + 1, offset: page() * pageSize() }));\n const settings = () =>\n prompts.dialog(\n () => (\n <div class=\"k2b-content-file-view__settings\">\n <Select\n label={fileViewMessages().csvEncoding}\n value={preferences().encoding}\n disabled={props.content.encoding !== \"base64\"}\n options={[\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"]}\n onValueChange={(value) => {\n if (value) update({ encoding: value });\n }}\n />\n <Select\n label={fileViewMessages().csvSeparator}\n value={preferences().delimiter}\n options={[\n { value: \"auto\", label: fileViewMessages().csvDefaultSeparator },\n { value: \",\", label: fileViewMessages().csvComma },\n { value: \";\", label: fileViewMessages().csvSemicolon },\n { value: \"\\t\", label: fileViewMessages().csvTab },\n { value: \"|\", label: \"|\" },\n ]}\n onValueChange={(value) => {\n if (value) update({ delimiter: value });\n }}\n />\n <Select\n label={fileViewMessages().csvView}\n value={preferences().view}\n options={[\n { value: \"table\", label: dataTableMessages().dataTable },\n { value: \"raw\", label: fileViewMessages().csvRaw },\n ]}\n onValueChange={(value) => {\n if (value === \"table\" || value === \"raw\") update({ view: value });\n }}\n />\n </div>\n ),\n { title: fileViewMessages().csvSettings },\n );\n const headers = createMemo(() => preview().rows[0] ?? []);\n const rows = createMemo(() => preview().rows.slice(1));\n\n return (\n <OverlayPanel\n actions={\n <>\n <OverlayAction icon=\"ti-adjustments-horizontal\" title={fileViewMessages().csvSettings} onClick={() => void settings()} />\n <DownloadAction {...props} />\n </>\n }\n >\n <Show when={preferences().view === \"table\"} fallback={<TextExcerpt renderer={props} text={text()} />}>\n <Show\n when={headers().length > 0}\n fallback={\n <Placeholder icon=\"ti ti-table\" title={fileViewMessages().emptyFile} description={fileViewMessages().delimitedFileEmpty} />\n }\n >\n <div class=\"k2b-content-file-view__sheet\">\n <table class=\"k2b-content-file-view__table\">\n <thead>\n <tr>\n <For each={headers()}>\n {(header, index) => (\n <th scope=\"col\">\n <span>{header || fileViewMessages().column({ number: index() + 1 })}</span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={rows()}>\n {(row) => (\n <tr>\n <For each={headers()}>{(_, index) => <td>{row[index()] ?? \"\"}</td>}</For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n <Show when={preview().columnsTruncated}>\n <div class=\"k2b-content-file-view__truncated\">{fileViewMessages().previewColumnsLimited}</div>\n </Show>\n <Show\n when={props.previewLines !== undefined}\n fallback={\n <Show when={preview().totalRows > 201}>\n <div class=\"k2b-content-file-view__pagination\">\n <Button size=\"sm\" variant=\"ghost\" disabled={page() === 0} onClick={() => setPage(page() - 1)}>\n {messages().previous}\n </Button>\n <span>\n {page() * pageSize() + 1}–{Math.min((page() + 1) * pageSize(), preview().totalRows - 1)} / {preview().totalRows - 1}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={(page() + 1) * pageSize() >= preview().totalRows - 1}\n onClick={() => setPage(page() + 1)}\n >\n {messages().next}\n </Button>\n </div>\n </Show>\n }\n >\n <MoreLines count={preview().totalRows - rows().length - 1} onClick={props.onExpandPreview} />\n </Show>\n </div>\n </Show>\n </Show>\n </OverlayPanel>\n );\n}\n\nconst mediaSource = (props: FileViewRendererProps): string =>\n props.previewHref ?? `data:${props.content.mediaType};base64,${props.content.content}`;\n\nfunction ImageRenderer(props: FileViewRendererProps) {\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\">\n <img crossOrigin={props.crossOrigin} onError={props.onPreviewError} src={mediaSource(props)} alt={props.file.path} />\n </div>\n </OverlayPanel>\n );\n}\n\nconst pdfBlob = (content: FileViewContent): Blob => {\n if (content.encoding === \"utf8\") return new Blob([content.content], { type: \"application/pdf\" });\n const binary = atob(content.content);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return new Blob([bytes], { type: \"application/pdf\" });\n};\n\n/**\n * A host inline URL goes to the browser's native viewer. Without one, the\n * loaded bytes become a local PDF Blob: a download URL is an attachment and\n * would leave a native viewer empty.\n */\nfunction PdfRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n // A new Blob remounts the preview, so changed bytes show the new file. A revision refetch\n // often returns the same bytes (the Assistant refetches on every tool step); keeping the\n // Blob then keeps the reader's page instead of reloading the viewer.\n const bytes = createMemo(() => props.content, undefined, {\n equals: (previous, next) => previous.encoding === next.encoding && previous.content === next.content,\n });\n const blob = createMemo(() => (props.previewHref || !bytes().content ? null : pdfBlob(bytes())));\n return (\n <Show\n when={props.previewHref}\n fallback={\n <Show\n keyed\n when={blob()}\n fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={fileViewMessages().noInlinePreview} />}\n >\n {(pdf) => (\n // Composed without the standalone heading: the host already names the file, and the frame keeps the\n // file name as its accessible title.\n <PdfPreview autoLoad title={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)} request={async () => pdf}>\n {(parts) => (\n <div class=\"k2b-content-file-view__pdf-viewer\">\n {parts.actions}\n {parts.content}\n </div>\n )}\n </PdfPreview>\n )}\n </Show>\n }\n >\n {(href) => <object data={href()} type=\"application/pdf\" class=\"k2b-content-file-view__pdf\" aria-label={props.file.path} />}\n </Show>\n );\n}\n\nfunction AudioRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"audio\">\n <audio\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {fileViewMessages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const name = () => props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1);\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <VideoPlayer\n src={mediaSource(props)}\n label={name()}\n crossOrigin={props.crossOrigin}\n onFallback={props.onPreviewError}\n fallbackAction={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download={name()}>\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={fileViewMessages().noPreview}\n description={props.content.mediaType || fileViewMessages().binaryFile}\n action={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download=\"\">\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n );\n}\n\nconst BUILTIN_RENDERERS: FileViewRenderer[] = [\n { id: \"markdown\", match: isMarkdown, component: MarkdownRenderer, editable: true },\n {\n id: \"image\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"image\",\n component: ImageRenderer,\n },\n {\n id: \"pdf\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"pdf\",\n component: PdfRenderer,\n },\n {\n id: \"json\",\n match: (file, content) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"json\",\n component: JsonRenderer,\n },\n {\n id: \"delimited-text\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"delimited-text\",\n component: DelimitedTextRenderer,\n },\n {\n id: \"audio\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"audio\",\n component: AudioRenderer,\n },\n {\n id: \"video\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"video\",\n component: VideoRenderer,\n },\n { id: \"text\", match: (_file, content) => content.encoding === \"utf8\", component: TextRenderer, editable: true },\n { id: \"binary\", match: () => true, component: BinaryRenderer },\n];\n\n// ── Component ───────────────────────────────────────────────────────────────\n\n/**\n * A file size such as \"4.2 MB\". With `locale`, the number follows that language (\"4,2 MB\") and drops a trailing\n * zero (\"64 KB\"); without it, the output stays as before.\n */\nexport const formatFileViewSize = (bytes: number, locale?: string): string => {\n const [value, unit] = bytes < 1024 ? [bytes, \"B\"] : bytes < 1024 * 1024 ? [bytes / 1024, \"KB\"] : [bytes / (1024 * 1024), \"MB\"];\n if (unit === \"B\") return `${bytes} B`;\n if (!locale) return `${value.toFixed(1)} ${unit}`;\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value)} ${unit}`;\n};\n\nexport default function FileView(props: FileViewProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const [draft, setDraft] = createSignal(\"\");\n const [savedDraft, setSavedDraft] = createSignal(\"\");\n const [nativeRevision, setNativeRevision] = createSignal(0);\n const dirty = createMemo(() => draft() !== savedDraft());\n const instanceRenderers = () => props.renderers ?? [];\n const saveMutation = mutation.create<{ path: string; content: string }, { path: string; content: string }>({\n mutation: async (input) => {\n await props.save!(input.content);\n return input;\n },\n onSuccess: (saved) => {\n if (props.file.path === saved.path) setSavedDraft(saved.content);\n toast.success(fileViewMessages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const href = props.previewHref;\n if (!href) return null;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n return `${href}${separator}preview-revision=${nativeRevision()}`;\n });\n const browserPreviewContent = createMemo<FileViewContent | null>(() => {\n const kind = getFileViewPreviewKind(props.file);\n if (kind !== \"image\" && kind !== \"pdf\" && kind !== \"audio\" && kind !== \"video\") return null;\n const href = nativePreviewHref();\n if (!href) return null;\n\n const candidate: FileViewContent = {\n encoding: \"base64\",\n content: \"\",\n mediaType: props.file.mediaType ?? \"application/octet-stream\",\n };\n return instanceRenderers().some((renderer) => renderer.match(props.file, candidate)) ? null : candidate;\n });\n const [content, { refetch }] = createResource(\n () => (browserPreviewContent() ? null : { path: props.file.path, revision: props.revision }),\n async () => {\n saveMutation.abort();\n // `load` is an imperative source adapter. Host signal reads inside it\n // must not turn this resource into a hidden reactive feedback loop.\n const loaded = await untrack(() => props.load());\n const loadedDraft = loaded.encoding === \"utf8\" ? loaded.content : \"\";\n setDraft(loadedDraft);\n setSavedDraft(loadedDraft);\n return loaded;\n },\n );\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n if (browserPreviewContent()) setNativeRevision((value) => value + 1);\n else await refetch();\n });\n if (unregister) onCleanup(unregister);\n });\n // An errored resource throws when read; the error state below shows it instead.\n const resolvedContent = createMemo(() => browserPreviewContent() ?? (content.error ? undefined : content()));\n\n const renderer = createMemo(() => {\n const loaded = resolvedContent();\n if (!loaded) return null;\n return [...instanceRenderers(), ...BUILTIN_RENDERERS].find((candidate) => candidate.match(props.file, loaded)) ?? null;\n });\n\n createEffect(() => {\n props.onDirtyChange?.(dirty());\n });\n\n const save = async () => {\n if (!props.save || saveMutation.loading()) return;\n await saveMutation.mutate({ path: props.file.path, content: draft() });\n };\n\n const editor = () =>\n props.save && renderer()?.editable && resolvedContent()?.encoding === \"utf8\"\n ? {\n draft,\n setDraft,\n dirty,\n saving: saveMutation.loading,\n save,\n }\n : null;\n\n // Undefined while loading; the host keeps its own placeholder until the shown file decides.\n const documentTitle = createMemo<string | null | undefined>(() => {\n if (!props.onDocumentTitle) return undefined;\n if (content.error) return null;\n const loaded = resolvedContent();\n if (!loaded) return undefined;\n if (renderer()?.component !== MarkdownRenderer) return null;\n return leadingMarkdownTitle(stripFrontmatter(editor()?.draft() ?? loaded.content))?.title ?? null;\n });\n createEffect(() => {\n const title = documentTitle();\n if (title !== undefined) props.onDocumentTitle?.(title);\n });\n\n return (\n <div\n class={`k2b-content-file-view ${props.class ?? \"\"}`}\n data-variant={props.variant}\n data-excerpt={props.previewLines !== undefined ? \"true\" : undefined}\n >\n <FileViewHost.Provider\n value={{\n get plain() {\n return props.variant === \"plain\";\n },\n get liftTitle() {\n return Boolean(props.onDocumentTitle);\n },\n }}\n >\n <Switch>\n <Match when={content.loading && content() === undefined}>\n <Placeholder state=\"loading\" title={messages().loading} />\n </Match>\n <Match when={content.error}>\n <Placeholder state=\"error\" title={fileViewMessages().failedLoadFile} description={String(content.error?.message ?? \"\")} />\n </Match>\n <Match when={resolvedContent() && renderer()}>\n {(active) => {\n const Renderer = active().component;\n return (\n <Renderer\n previewLines={props.previewLines}\n onExpandPreview={props.onExpandPreview}\n headingScale={props.headingScale}\n previewPreferencesKey={props.previewPreferencesKey}\n file={props.file}\n content={resolvedContent()!}\n previewHref={nativePreviewHref()}\n crossOrigin={props.crossOrigin}\n onPreviewError={props.onPreviewError}\n downloadHref={props.downloadHref ?? null}\n editor={editor()}\n />\n );\n }}\n </Match>\n </Switch>\n </FileViewHost.Provider>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/FileView.tsx"],"sourcesContent":["import { useMarkdownEditorMessages } from \"../inputs/markdown/editor-messages\";\nimport { useDataTableMessages } from \"./data-table-messages\";\nimport { useFileViewMessages } from \"./file-view-messages\";\n/**\n * FileView — renders one file through a small renderer registry keyed by\n * media type / path. Editing is enabled purely by the presence of `save`;\n * without it every renderer is read-only. IDE-style chrome: editors reuse\n * the markdown editor's surface (toolbar with an in-toolbar save, Ctrl/Cmd+S),\n * previews are quiet paper panels with icon-only actions overlaid top-right.\n * A plain preview drops the panel and sits on its host's surface instead.\n * Custom renderers are passed per instance, which keeps SSR requests and\n * independently mounted applications isolated.\n */\n\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport {\n type Component,\n createContext,\n createEffect,\n createMemo,\n createResource,\n createSignal,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { prompts } from \"../feedback/prompts\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { toast } from \"../feedback/toast\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { Select } from \"../inputs/Select\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport CodeDisplay, { type CodeDisplayLanguage } from \"./CodeDisplay\";\nimport { type DelimitedPreferences, decodeDelimitedContent, readDelimitedPreferences } from \"./delimited-preferences\";\nimport { type FileViewFile, fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from \"./file-view-preview\";\nimport MarkdownView from \"./MarkdownView\";\nimport { leadingMarkdownTitle } from \"./markdown-title\";\nimport PdfPreview from \"./PdfPreview\";\nimport StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\nimport VideoPlayer from \"./VideoPlayer\";\n\nexport type { FileViewFile, FileViewPreviewKind } from \"./file-view-preview\";\nexport { canPreviewFile, getFileViewPreviewKind } from \"./file-view-preview\";\nexport type FileViewContent = { encoding: \"utf8\" | \"base64\"; content: string; mediaType: string };\n\nexport type FileViewProps = {\n /**\n * Plain previews inherit the surrounding surface without a frame or inset padding. They keep their natural height,\n * so the host scrolls them and owns the actions around them; a host that stretches one gets its scrolling back.\n */\n variant?: \"default\" | \"plain\";\n /**\n * Lifts a leading Markdown level-one heading into the host, for example a dialog title. Reports its plain text and\n * leaves that heading out of the preview, or reports null when the shown file has none, the heading holds a link or\n * image or is the whole document, or the file fails to load.\n */\n onDocumentTitle?: (title: string | null) => void;\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n load: () => Promise<FileViewContent>;\n /** Refetch the current path when this host-owned revision changes. */\n revision?: unknown;\n /** Register an awaitable refresh for the currently visible preview. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n /** Presence enables editing for text-based renderers. */\n save?: (content: string) => Promise<void>;\n /** Authenticated inline URL used by browser-native image, PDF, audio, and video previews. */\n previewHref?: string | null;\n /** CORS mode for native image/audio/video previews. Omit to preserve browser defaults. */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n /** Native media failed to load; the host can renew a signed URL and offer retry. */\n onPreviewError?: () => void;\n /** Download actions only; never a preview source, because an attachment response does not render inline. */\n downloadHref?: string | null;\n /** App-specific renderers matched before the built-ins for this instance. */\n renderers?: readonly FileViewRenderer[];\n /** Reports local edit state so a parent browser can guard navigation. */\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\nexport type FileViewRendererProps = {\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n content: FileViewContent;\n previewHref: string | null;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n onPreviewError?: () => void;\n downloadHref: string | null;\n /** Null when the file is read-only. */\n editor: {\n draft: () => string;\n setDraft: (value: string) => void;\n dirty: () => boolean;\n saving: () => boolean;\n save: () => Promise<void>;\n } | null;\n};\n\nexport type FileViewRenderer = {\n id: string;\n match: (file: FileViewFile, content: FileViewContent) => boolean;\n component: Component<FileViewRendererProps>;\n /** Text renderers that support the edit affordance when `save` is present. */\n editable?: boolean;\n};\n\n/** Instance options that reach the built-in renderers without widening the public renderer props. */\nconst FileViewHost = createContext({ plain: false, liftTitle: false });\n\nconst codeLanguage = (path: string): CodeDisplayLanguage => {\n const extension = fileViewExtension(path);\n if (extension === \"ts\" || extension === \"mts\" || extension === \"cts\") return \"ts\";\n if (extension === \"tsx\") return \"tsx\";\n if (extension === \"js\" || extension === \"mjs\" || extension === \"cjs\") return \"js\";\n if (extension === \"jsx\") return \"jsx\";\n if (extension === \"md\" || extension === \"markdown\") return \"md\";\n return \"text\";\n};\n\nconst isMarkdown = (file: FileViewFile, content: FileViewContent) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"markdown\";\n\n/** Rendered previews hide a leading YAML frontmatter block — it's metadata, not content. */\nconst stripFrontmatter = (text: string): string => {\n const match = /^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/.exec(text.trimStart());\n return match ? text.trimStart().slice(match[0].length) : text;\n};\n\n/** Icon-only download link with the shared tooltip, for toolbars that style their own controls. */\nfunction DownloadLink(props: { class: string; href: string; download: string; label: string; icon: string }) {\n let link: HTMLAnchorElement | undefined;\n return (\n <>\n <a ref={link} class={props.class} href={props.href} download={props.download} aria-label={props.label}>\n <i class={props.icon} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.label}</span>\n </a>\n <Tooltip content={props.label} target={() => link} />\n </>\n );\n}\n\n/** Icon-only action, IDE style — sits in the floating top-right cluster of previews. */\nfunction OverlayAction(props: { icon: string; title: string; onClick?: () => void; href?: string; download?: string }) {\n const classes = \"k2b-content-file-view__action\";\n return (\n <Show\n when={props.href}\n fallback={\n <Tooltip.Trigger type=\"button\" class={classes} content={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n {(href) => (\n <DownloadLink class={classes} href={href()} download={props.download ?? \"\"} label={props.title} icon={`ti ${props.icon}`} />\n )}\n </Show>\n );\n}\n\n/**\n * Scrollable preview panel with the floating action cluster overlaid top-right. Over a picture or a video the\n * cluster is glass; over text, tables, and documents it stays solid, because blurred text reads as a fault.\n */\nfunction OverlayPanel(props: { actions?: JSX.Element; overMedia?: boolean; children: JSX.Element }) {\n return (\n <div class=\"k2b-content-file-view__panel\">\n <div class=\"k2b-content-file-view__preview\">{props.children}</div>\n <Show when={props.actions}>\n <div class={`k2b-content-file-view__overlay${props.overMedia ? \" k2b-overlay-surface\" : \"\"}`}>{props.actions}</div>\n </Show>\n </div>\n );\n}\n\nconst DownloadAction = (props: FileViewRendererProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Show when={props.downloadHref}>\n {(href) => (\n <OverlayAction\n icon=\"ti-download\"\n title={messages().download}\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n />\n )}\n </Show>\n );\n};\n\n/** Toolbar-styled icon button — reuses the package markdown-editor tool primitive. */\nfunction EditorToolButton(props: { icon: string; title: string; onClick: () => void; disabled?: boolean }) {\n return (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={props.title}\n aria-label={props.title}\n tabIndex={-1}\n disabled={props.disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={props.onClick}\n >\n <i class={props.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MoreLines(props: { count: number; onClick?: () => void }) {\n const fileViewMessages = useFileViewMessages();\n return (\n <Show when={props.count > 0}>\n <div class=\"k2b-content-file-view__truncated\">\n <Show when={props.onClick} fallback={<span>{fileViewMessages().previewMoreLines(props.count)}</span>}>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onClick}>\n {fileViewMessages().previewMoreLines(props.count)}\n </Button>\n </Show>\n </div>\n </Show>\n );\n}\nfunction TextExcerpt(props: { renderer: FileViewRendererProps; text: string; markdown?: boolean }) {\n const lines = createMemo(() => props.text.replace(/\\r\\n?/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\"));\n const limit = () => (props.renderer.previewLines === undefined ? lines().length : Math.max(1, props.renderer.previewLines));\n const text = () => lines().slice(0, limit()).join(\"\\n\");\n const host = useContext(FileViewHost);\n // A plain preview has no code box: the host frames the file and owns its copy action.\n const content = () => (\n <Show\n when={props.markdown}\n fallback={<CodeDisplay code={text()} language={codeLanguage(props.renderer.file.path)} copy={host.plain ? false : undefined} />}\n >\n <MarkdownView markdown={text()} headingScale={props.renderer.headingScale ?? \"compact\"} />\n </Show>\n );\n // Only an excerpt needs a clipping box; a complete preview keeps its content\n // a direct child of the preview frame, which the frame's styles expect.\n return (\n <>\n <Show when={props.renderer.previewLines !== undefined} fallback={content()}>\n <div class=\"k2b-content-file-view__excerpt\">{content()}</div>\n </Show>\n <MoreLines count={lines().length - limit()} onClick={props.renderer.onExpandPreview} />\n </>\n );\n}\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const host = useContext(FileViewHost);\n const [editing, setEditing] = createSignal(false);\n const markdown = () => {\n const text = stripFrontmatter(props.editor?.draft() ?? props.content.content);\n return host.liftTitle ? (leadingMarkdownTitle(text)?.body ?? text) : text;\n };\n return (\n <Show\n when={props.editor && editing()}\n fallback={\n <OverlayPanel\n actions={\n <>\n <Show when={props.editor}>\n <OverlayAction icon=\"ti-pencil\" title={messages().edit} onClick={() => setEditing(true)} />\n </Show>\n <DownloadAction {...props} />\n </>\n }\n >\n <div class=\"k2b-content-file-view__document\">\n <TextExcerpt renderer={props} text={markdown()} markdown />\n </div>\n </OverlayPanel>\n }\n >\n {(_) => {\n const editor = props.editor!;\n return (\n <div class=\"k2b-content-file-view__editor\">\n <MarkdownEditor\n class=\"k2b-content-file-view__markdown-field\"\n aria-label={`Edit ${props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}`}\n fill\n value={editor.draft()}\n onValueChange={editor.setDraft}\n showStats={false}\n onSave={() => void editor.save()}\n saveDisabled={!editor.dirty()}\n saving={editor.saving()}\n toolbarTrailing={<EditorToolButton icon=\"ti ti-eye\" title={messages().preview} onClick={() => setEditing(false)} />}\n />\n </div>\n );\n }}\n </Show>\n );\n}\n\nfunction TextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const markdownEditorMessages = useMarkdownEditorMessages();\n return (\n <Show\n when={props.editor}\n fallback={\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <TextExcerpt renderer={props} text={props.content.content} />\n </OverlayPanel>\n }\n >\n {(editor) => (\n // Same chrome as the markdown editor — literally the same classes, so\n // border, radius, focus ring, toolbar height and text metrics cannot drift.\n <div class=\"k2b-content-file-view__editor\">\n <div\n class=\"k2b-markdown-editor\"\n data-fill=\"true\"\n role=\"group\"\n aria-label={fileViewMessages().textEditor}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (editor().dirty() && !editor().saving()) void editor().save();\n }\n }}\n >\n {/* No formatting tools here — the divider under an actions-only bar reads lost. */}\n <div class=\"k2b-markdown-editor__toolbar k2b-content-file-view__code-toolbar\">\n <span class=\"k2b-content-file-view__code-language\">{codeLanguage(props.file.path)}</span>\n <span class=\"k2b-markdown-editor__trailing\">\n <Show when={props.downloadHref}>\n {(href) => (\n <DownloadLink\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n label={messages().download}\n icon=\"ti ti-download\"\n />\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={markdownEditorMessages().saveShortcut}\n disabled={!editor().dirty() || editor().saving()}\n onClick={() => void editor().save()}\n />\n </span>\n </div>\n <div class=\"k2b-markdown-editor__surface\">\n <textarea\n class=\"k2b-content-file-view__code-input\"\n value={editor().draft()}\n spellcheck={false}\n onInput={(event) => editor().setDraft(event.currentTarget.value)}\n />\n </div>\n </div>\n </div>\n )}\n </Show>\n );\n}\n\nfunction JsonRenderer(props: FileViewRendererProps) {\n const parsed = createMemo(() => {\n try {\n return { ok: true as const, value: JSON.parse(props.content.content) as StructuredDataValue };\n } catch {\n return { ok: false as const };\n }\n });\n const parsedValue = (): StructuredDataValue => {\n const result = parsed();\n return result.ok ? result.value : null;\n };\n\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__document\">\n <Show when={parsed().ok} fallback={<TextExcerpt renderer={props} text={props.content.content} />}>\n <Show\n when={props.previewLines === undefined}\n fallback={<TextExcerpt renderer={props} text={JSON.stringify(parsedValue(), null, 2)} />}\n >\n <StructuredDataPreview data={parsedValue()} maxRows={200} />\n </Show>\n </Show>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction DelimitedTextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const dataTableMessages = useDataTableMessages();\n const [preferences, setPreferences] = createSignal<DelimitedPreferences>({ encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" });\n onMount(() => {\n if (!props.previewPreferencesKey) return;\n try {\n setPreferences(readDelimitedPreferences(localStorage.getItem(props.previewPreferencesKey)));\n } catch {\n /* Storage may be disabled. */\n }\n });\n const update = (patch: Partial<DelimitedPreferences>) => {\n const next = { ...preferences(), ...patch };\n setPreferences(next);\n if (props.previewPreferencesKey) {\n try {\n localStorage.setItem(props.previewPreferencesKey, JSON.stringify(next));\n } catch {\n /* Keep the local selection. */\n }\n }\n };\n const text = createMemo(() => decodeDelimitedContent(props.content, preferences().encoding));\n const delimiter = () =>\n preferences().delimiter === \"auto\"\n ? fileViewExtension(props.file.path) === \"tsv\" || props.content.mediaType === \"text/tab-separated-values\"\n ? \"\\t\"\n : \",\"\n : preferences().delimiter;\n const [page, setPage] = createSignal(0);\n createEffect(() => {\n text();\n delimiter();\n props.previewLines;\n setPage(0);\n });\n const pageSize = () => (props.previewLines === undefined ? 200 : Math.max(1, props.previewLines));\n const preview = createMemo(() => parseDelimitedText(text(), delimiter(), { rows: pageSize() + 1, offset: page() * pageSize() }));\n const settings = () =>\n prompts.dialog(\n () => (\n <div class=\"k2b-content-file-view__settings\">\n <Select\n label={fileViewMessages().csvEncoding}\n value={preferences().encoding}\n disabled={props.content.encoding !== \"base64\"}\n options={[\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"]}\n onValueChange={(value) => {\n if (value) update({ encoding: value });\n }}\n />\n <Select\n label={fileViewMessages().csvSeparator}\n value={preferences().delimiter}\n options={[\n { value: \"auto\", label: fileViewMessages().csvDefaultSeparator },\n { value: \",\", label: fileViewMessages().csvComma },\n { value: \";\", label: fileViewMessages().csvSemicolon },\n { value: \"\\t\", label: fileViewMessages().csvTab },\n { value: \"|\", label: \"|\" },\n ]}\n onValueChange={(value) => {\n if (value) update({ delimiter: value });\n }}\n />\n <Select\n label={fileViewMessages().csvView}\n value={preferences().view}\n options={[\n { value: \"table\", label: dataTableMessages().dataTable },\n { value: \"raw\", label: fileViewMessages().csvRaw },\n ]}\n onValueChange={(value) => {\n if (value === \"table\" || value === \"raw\") update({ view: value });\n }}\n />\n </div>\n ),\n { title: fileViewMessages().csvSettings },\n );\n const headers = createMemo(() => preview().rows[0] ?? []);\n const rows = createMemo(() => preview().rows.slice(1));\n\n return (\n <OverlayPanel\n actions={\n <>\n <OverlayAction icon=\"ti-adjustments-horizontal\" title={fileViewMessages().csvSettings} onClick={() => void settings()} />\n <DownloadAction {...props} />\n </>\n }\n >\n <Show when={preferences().view === \"table\"} fallback={<TextExcerpt renderer={props} text={text()} />}>\n <Show\n when={headers().length > 0}\n fallback={\n <Placeholder icon=\"ti ti-table\" title={fileViewMessages().emptyFile} description={fileViewMessages().delimitedFileEmpty} />\n }\n >\n <div class=\"k2b-content-file-view__sheet\">\n <table class=\"k2b-content-file-view__table\">\n <thead>\n <tr>\n <For each={headers()}>\n {(header, index) => (\n <th scope=\"col\">\n <span>{header || fileViewMessages().column({ number: index() + 1 })}</span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={rows()}>\n {(row) => (\n <tr>\n <For each={headers()}>{(_, index) => <td>{row[index()] ?? \"\"}</td>}</For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n <Show when={preview().columnsTruncated}>\n <div class=\"k2b-content-file-view__truncated\">{fileViewMessages().previewColumnsLimited}</div>\n </Show>\n <Show\n when={props.previewLines !== undefined}\n fallback={\n <Show when={preview().totalRows > 201}>\n <div class=\"k2b-content-file-view__pagination\">\n <Button size=\"sm\" variant=\"ghost\" disabled={page() === 0} onClick={() => setPage(page() - 1)}>\n {messages().previous}\n </Button>\n <span>\n {page() * pageSize() + 1}–{Math.min((page() + 1) * pageSize(), preview().totalRows - 1)} / {preview().totalRows - 1}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={(page() + 1) * pageSize() >= preview().totalRows - 1}\n onClick={() => setPage(page() + 1)}\n >\n {messages().next}\n </Button>\n </div>\n </Show>\n }\n >\n <MoreLines count={preview().totalRows - rows().length - 1} onClick={props.onExpandPreview} />\n </Show>\n </div>\n </Show>\n </Show>\n </OverlayPanel>\n );\n}\n\nconst mediaSource = (props: FileViewRendererProps): string =>\n props.previewHref ?? `data:${props.content.mediaType};base64,${props.content.content}`;\n\nfunction ImageRenderer(props: FileViewRendererProps) {\n return (\n <OverlayPanel overMedia actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\">\n <img crossOrigin={props.crossOrigin} onError={props.onPreviewError} src={mediaSource(props)} alt={props.file.path} />\n </div>\n </OverlayPanel>\n );\n}\n\nconst pdfBlob = (content: FileViewContent): Blob => {\n if (content.encoding === \"utf8\") return new Blob([content.content], { type: \"application/pdf\" });\n const binary = atob(content.content);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return new Blob([bytes], { type: \"application/pdf\" });\n};\n\n/**\n * Both ways end in `PdfPreview`, which draws with pdf.js and falls back to the browser's viewer. A host inline URL is\n * fetched from there and stays the address the open action shows. Without one, the loaded bytes become a local PDF\n * Blob: a download URL is an attachment and would leave a viewer empty.\n */\nconst sameOrigin = (href: string): boolean => {\n if (typeof location === \"undefined\") return true;\n try {\n return new URL(href, location.href).origin === location.origin;\n } catch {\n return false;\n }\n};\n\nfunction PdfRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n // A new Blob remounts the preview, so changed bytes show the new file. A revision refetch\n // often returns the same bytes (the Assistant refetches on every tool step); keeping the\n // Blob then keeps the reader's page instead of reloading the viewer.\n const bytes = createMemo(() => props.content, undefined, {\n equals: (previous, next) => previous.encoding === next.encoding && previous.content === next.content,\n });\n const blob = createMemo(() => (props.previewHref || !bytes().content ? null : pdfBlob(bytes())));\n return (\n <Show\n when={props.previewHref}\n fallback={\n <Show\n keyed\n when={blob()}\n fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={fileViewMessages().noInlinePreview} />}\n >\n {(pdf) => (\n // Composed without the standalone heading: the host already names the file, and the frame keeps the\n // file name as its accessible title.\n <PdfPreview autoLoad title={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)} request={async () => pdf}>\n {(parts) => (\n <div class=\"k2b-content-file-view__pdf-viewer\">\n {parts.actions}\n {parts.content}\n </div>\n )}\n </PdfPreview>\n )}\n </Show>\n }\n >\n {(href) => (\n // Keyed by the address: a new revision of the file loads the new document.\n <Show keyed when={href()}>\n {(current) => {\n // Closing the preview or a new revision stops a running download.\n const abort = new AbortController();\n onCleanup(() => abort.abort());\n return (\n // A page may fetch only its own origin's PDFs without CORS; another origin's address stays with the\n // browser's viewer, which embeds it as before.\n <Show\n when={sameOrigin(current)}\n fallback={<object data={current} type=\"application/pdf\" class=\"k2b-content-file-view__pdf\" aria-label={props.file.path} />}\n >\n <PdfPreview\n autoLoad\n title={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n openHref={current}\n request={() => fetch(current, { credentials: \"same-origin\", signal: abort.signal })}\n >\n {(parts) => (\n <div class=\"k2b-content-file-view__pdf-viewer\">\n {parts.actions}\n {parts.content}\n </div>\n )}\n </PdfPreview>\n </Show>\n );\n }}\n </Show>\n )}\n </Show>\n );\n}\n\nfunction AudioRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"audio\">\n <audio\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {fileViewMessages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const name = () => props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1);\n return (\n <OverlayPanel overMedia actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <VideoPlayer\n src={mediaSource(props)}\n label={name()}\n crossOrigin={props.crossOrigin}\n onFallback={props.onPreviewError}\n fallbackAction={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download={name()}>\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={fileViewMessages().noPreview}\n description={props.content.mediaType || fileViewMessages().binaryFile}\n action={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download=\"\">\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n );\n}\n\nconst BUILTIN_RENDERERS: FileViewRenderer[] = [\n { id: \"markdown\", match: isMarkdown, component: MarkdownRenderer, editable: true },\n {\n id: \"image\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"image\",\n component: ImageRenderer,\n },\n {\n id: \"pdf\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"pdf\",\n component: PdfRenderer,\n },\n {\n id: \"json\",\n match: (file, content) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"json\",\n component: JsonRenderer,\n },\n {\n id: \"delimited-text\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"delimited-text\",\n component: DelimitedTextRenderer,\n },\n {\n id: \"audio\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"audio\",\n component: AudioRenderer,\n },\n {\n id: \"video\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"video\",\n component: VideoRenderer,\n },\n { id: \"text\", match: (_file, content) => content.encoding === \"utf8\", component: TextRenderer, editable: true },\n { id: \"binary\", match: () => true, component: BinaryRenderer },\n];\n\n// ── Component ───────────────────────────────────────────────────────────────\n\n/**\n * A file size such as \"4.2 MB\". With `locale`, the number follows that language (\"4,2 MB\") and drops a trailing\n * zero (\"64 KB\"); without it, the output stays as before.\n */\nexport const formatFileViewSize = (bytes: number, locale?: string): string => {\n const [value, unit] = bytes < 1024 ? [bytes, \"B\"] : bytes < 1024 * 1024 ? [bytes / 1024, \"KB\"] : [bytes / (1024 * 1024), \"MB\"];\n if (unit === \"B\") return `${bytes} B`;\n if (!locale) return `${value.toFixed(1)} ${unit}`;\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value)} ${unit}`;\n};\n\nexport default function FileView(props: FileViewProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const [draft, setDraft] = createSignal(\"\");\n const [savedDraft, setSavedDraft] = createSignal(\"\");\n const [nativeRevision, setNativeRevision] = createSignal(0);\n const dirty = createMemo(() => draft() !== savedDraft());\n const instanceRenderers = () => props.renderers ?? [];\n const saveMutation = mutation.create<{ path: string; content: string }, { path: string; content: string }>({\n mutation: async (input) => {\n await props.save!(input.content);\n return input;\n },\n onSuccess: (saved) => {\n if (props.file.path === saved.path) setSavedDraft(saved.content);\n toast.success(fileViewMessages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const href = props.previewHref;\n if (!href) return null;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n return `${href}${separator}preview-revision=${nativeRevision()}`;\n });\n const browserPreviewContent = createMemo<FileViewContent | null>(() => {\n const kind = getFileViewPreviewKind(props.file);\n if (kind !== \"image\" && kind !== \"pdf\" && kind !== \"audio\" && kind !== \"video\") return null;\n const href = nativePreviewHref();\n if (!href) return null;\n\n const candidate: FileViewContent = {\n encoding: \"base64\",\n content: \"\",\n mediaType: props.file.mediaType ?? \"application/octet-stream\",\n };\n return instanceRenderers().some((renderer) => renderer.match(props.file, candidate)) ? null : candidate;\n });\n const [content, { refetch }] = createResource(\n () => (browserPreviewContent() ? null : { path: props.file.path, revision: props.revision }),\n async () => {\n saveMutation.abort();\n // `load` is an imperative source adapter. Host signal reads inside it\n // must not turn this resource into a hidden reactive feedback loop.\n const loaded = await untrack(() => props.load());\n const loadedDraft = loaded.encoding === \"utf8\" ? loaded.content : \"\";\n setDraft(loadedDraft);\n setSavedDraft(loadedDraft);\n return loaded;\n },\n );\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n if (browserPreviewContent()) setNativeRevision((value) => value + 1);\n else await refetch();\n });\n if (unregister) onCleanup(unregister);\n });\n // An errored resource throws when read; the error state below shows it instead.\n const resolvedContent = createMemo(() => browserPreviewContent() ?? (content.error ? undefined : content()));\n\n const renderer = createMemo(() => {\n const loaded = resolvedContent();\n if (!loaded) return null;\n return [...instanceRenderers(), ...BUILTIN_RENDERERS].find((candidate) => candidate.match(props.file, loaded)) ?? null;\n });\n\n createEffect(() => {\n props.onDirtyChange?.(dirty());\n });\n\n const save = async () => {\n if (!props.save || saveMutation.loading()) return;\n await saveMutation.mutate({ path: props.file.path, content: draft() });\n };\n\n const editor = () =>\n props.save && renderer()?.editable && resolvedContent()?.encoding === \"utf8\"\n ? {\n draft,\n setDraft,\n dirty,\n saving: saveMutation.loading,\n save,\n }\n : null;\n\n // Undefined while loading; the host keeps its own placeholder until the shown file decides.\n const documentTitle = createMemo<string | null | undefined>(() => {\n if (!props.onDocumentTitle) return undefined;\n if (content.error) return null;\n const loaded = resolvedContent();\n if (!loaded) return undefined;\n if (renderer()?.component !== MarkdownRenderer) return null;\n return leadingMarkdownTitle(stripFrontmatter(editor()?.draft() ?? loaded.content))?.title ?? null;\n });\n createEffect(() => {\n const title = documentTitle();\n if (title !== undefined) props.onDocumentTitle?.(title);\n });\n\n return (\n <div\n class={`k2b-content-file-view ${props.class ?? \"\"}`}\n data-variant={props.variant}\n data-excerpt={props.previewLines !== undefined ? \"true\" : undefined}\n >\n <FileViewHost.Provider\n value={{\n get plain() {\n return props.variant === \"plain\";\n },\n get liftTitle() {\n return Boolean(props.onDocumentTitle);\n },\n }}\n >\n <Switch>\n <Match when={content.loading && content() === undefined}>\n <Placeholder state=\"loading\" title={messages().loading} />\n </Match>\n <Match when={content.error}>\n <Placeholder state=\"error\" title={fileViewMessages().failedLoadFile} description={String(content.error?.message ?? \"\")} />\n </Match>\n <Match when={resolvedContent() && renderer()}>\n {(active) => {\n const Renderer = active().component;\n return (\n <Renderer\n previewLines={props.previewLines}\n onExpandPreview={props.onExpandPreview}\n headingScale={props.headingScale}\n previewPreferencesKey={props.previewPreferencesKey}\n file={props.file}\n content={resolvedContent()!}\n previewHref={nativePreviewHref()}\n crossOrigin={props.crossOrigin}\n onPreviewError={props.onPreviewError}\n downloadHref={props.downloadHref ?? null}\n editor={editor()}\n />\n );\n }}\n </Match>\n </Switch>\n </FileViewHost.Provider>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,23 +3,26 @@ import { createComponent as _$createComponent } from "solid-js/web";
3
3
  import { ssr as _$ssr } from "solid-js/web";
4
4
  import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
5
5
  import { escape as _$escape } from "solid-js/web";
6
- var _tmpl$ = ["<span class=\"k2b-content-lightbox__counter\" aria-live=\"polite\">", " / ", "</span>"],
7
- _tmpl$2 = ["<div class=\"k2b-content-lightbox__caption\"><div class=\"k2b-content-lightbox__caption-text\">", "</div></div>"],
8
- _tmpl$3 = ["<a", " download class=\"k2b-content-lightbox__button\"", "><i class=\"ti ti-download\" aria-hidden=\"true\"></i><span class=\"k2b-content-lightbox__button-label\">", "</span></a>"],
9
- _tmpl$4 = ["<button type=\"button\" class=\"k2b-content-lightbox__nav\" data-direction=\"previous\"", "><i class=\"ti ti-chevron-left\" aria-hidden=\"true\"></i></button>"],
10
- _tmpl$5 = ["<button type=\"button\" class=\"k2b-content-lightbox__nav\" data-direction=\"next\"", "><i class=\"ti ti-chevron-right\" aria-hidden=\"true\"></i></button>"],
11
- _tmpl$6 = ["<div class=\"k2b-content-lightbox__dots\" role=\"group\"", ">", "</div>"],
12
- _tmpl$7 = ["<dialog class=\"k2b-content-lightbox\"", "><div class=\"k2b-content-lightbox__bar\"><div class=\"k2b-content-lightbox__meta\">", "", "</div><div class=\"k2b-content-lightbox__actions\">", "", "<button type=\"button\" class=\"k2b-content-lightbox__button\"", "><i class=\"ti ti-x\" aria-hidden=\"true\"></i><span class=\"k2b-content-lightbox__button-label\">", "</span></button></div></div><div class=\"k2b-content-lightbox__stage\">", "</div>", "", "</dialog>"],
13
- _tmpl$8 = ["<button type=\"button\" class=\"k2b-content-lightbox__button\"", "><i", " aria-hidden=\"true\"></i><span class=\"k2b-content-lightbox__button-label\">", "</span></button>"],
6
+ var _tmpl$ = ["<span class=\"k2b-content-lightbox__counter k2b-overlay-surface\" aria-live=\"polite\">", " / ", "</span>"],
7
+ _tmpl$2 = ["<div class=\"k2b-content-lightbox__caption k2b-overlay-surface\"><div class=\"k2b-content-lightbox__caption-text\">", "</div></div>"],
8
+ _tmpl$3 = ["<a", " download class=\"k2b-content-lightbox__button k2b-overlay-surface\"", "><i class=\"ti ti-download\" aria-hidden=\"true\"></i><span class=\"k2b-content-lightbox__button-label\">", "</span></a>"],
9
+ _tmpl$4 = ["<button type=\"button\" class=\"k2b-content-lightbox__nav k2b-overlay-surface\" data-direction=\"previous\"", "><i class=\"ti ti-chevron-left\" aria-hidden=\"true\"></i></button>"],
10
+ _tmpl$5 = ["<button type=\"button\" class=\"k2b-content-lightbox__nav k2b-overlay-surface\" data-direction=\"next\"", "><i class=\"ti ti-chevron-right\" aria-hidden=\"true\"></i></button>"],
11
+ _tmpl$6 = ["<div class=\"k2b-content-lightbox__dots k2b-overlay-surface\" role=\"group\"", ">", "</div>"],
12
+ _tmpl$7 = ["<dialog class=\"k2b-content-lightbox\"", "><div class=\"k2b-content-lightbox__bar\"><div class=\"k2b-content-lightbox__meta\">", "", "</div><div class=\"k2b-content-lightbox__actions\">", "", "<button type=\"button\" class=\"k2b-content-lightbox__button k2b-overlay-surface\"", "><i class=\"ti ti-x\" aria-hidden=\"true\"></i><span class=\"k2b-content-lightbox__button-label\">", "</span></button></div></div><div class=\"k2b-content-lightbox__stage\">", "</div>", "", "", "</dialog>"],
13
+ _tmpl$8 = ["<button type=\"button\" class=\"k2b-content-lightbox__button k2b-overlay-surface\"", "><i", " aria-hidden=\"true\"></i><span class=\"k2b-content-lightbox__button-label\">", "</span></button>"],
14
14
  _tmpl$9 = ["<img", " class=\"k2b-content-lightbox__image\" draggable=\"false\">"],
15
15
  _tmpl$0 = ["<button type=\"button\" class=\"k2b-content-lightbox__dot\"", "></button>"];
16
16
  import { createEffect, createSignal, For, onCleanup, onMount, Show } from "solid-js";
17
17
  import { returnFocus, ringOnReturn } from "../internal/focus-return";
18
18
  import { useUiMessages } from "../intl/messages";
19
19
  import { useLightboxMessages } from "./lightbox-messages";
20
+ import { ThumbnailStrip } from "./ThumbnailStrip";
20
21
 
21
22
  /** One more thing to do with the shown image, beside Download: a short label, its icon class, and what it does. */
22
23
 
24
+ /** From this many images the gallery shows a thumbnail strip instead of dots. */
25
+ const STRIP_FROM = 4;
23
26
  /**
24
27
  * Minimal, accessible lightbox using native <dialog>.
25
28
  * Supports keyboard navigation, touch swipe gestures, and screen readers.
@@ -76,7 +79,8 @@ export default function Lightbox(props) {
76
79
 
77
80
  // Keyboard navigation
78
81
  const handleKeyDown = e => {
79
- if (!ownsKey(e.target)) return;
82
+ // A part that handled the key itself, such as the thumbnail strip moving its focus, keeps it.
83
+ if (e.defaultPrevented || !ownsKey(e.target)) return;
80
84
  switch (e.key) {
81
85
  case "Escape":
82
86
  // Handled here, so WebKit does not light the returned focus for this key.
@@ -181,7 +185,32 @@ export default function Lightbox(props) {
181
185
  }
182
186
  })), _$escape(_$createComponent(Show, {
183
187
  get when() {
184
- return _$memo(() => !!isMultiple())() && props.images.length <= 10;
188
+ return props.images.length >= STRIP_FROM;
189
+ },
190
+ get children() {
191
+ return _$createComponent(ThumbnailStrip, {
192
+ "class": "k2b-content-lightbox__strip k2b-overlay-surface",
193
+ get label() {
194
+ return lightboxMessages().imageNavigation;
195
+ },
196
+ get items() {
197
+ return props.images.map((image, i) => ({
198
+ id: String(i),
199
+ name: image.alt || lightboxMessages().goToImage({
200
+ index: i + 1
201
+ }),
202
+ thumbnail: image.thumbnail ?? image.src
203
+ }));
204
+ },
205
+ get currentItem() {
206
+ return String(index());
207
+ },
208
+ onSelectItem: id => setIndex(Number(id))
209
+ });
210
+ }
211
+ })), _$escape(_$createComponent(Show, {
212
+ get when() {
213
+ return _$memo(() => !!isMultiple())() && props.images.length < STRIP_FROM;
185
214
  },
186
215
  get children() {
187
216
  return _$ssr(_tmpl$6, _$ssrAttribute("aria-label", _$escape(lightboxMessages().imageNavigation, true), false), _$escape(_$createComponent(For, {
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/Lightbox.tsx"],"sourcesContent":["import { createEffect, createSignal, For, onCleanup, onMount, Show } from \"solid-js\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { useLightboxMessages } from \"./lightbox-messages\";\n\n/** One more thing to do with the shown image, beside Download: a short label, its icon class, and what it does. */\nexport type LightboxAction = {\n label: string;\n icon: string;\n onClick: () => void;\n};\n\nexport type LightboxImage = {\n src: string;\n alt?: string;\n downloadUrl?: string;\n /** Actions for this image, shown before Download in the same style. */\n actions?: readonly LightboxAction[];\n};\n\ntype LightboxProps = {\n images: LightboxImage[];\n initialIndex?: number;\n onClose: () => void;\n};\n\n/**\n * Minimal, accessible lightbox using native <dialog>.\n * Supports keyboard navigation, touch swipe gestures, and screen readers.\n */\nexport default function Lightbox(props: LightboxProps) {\n const messages = useUiMessages();\n const lightboxMessages = useLightboxMessages();\n const clampIndex = (value: number, images = props.images): number =>\n images.length === 0 ? 0 : Math.max(0, Math.min(value, images.length - 1));\n const [index, setIndex] = createSignal(clampIndex(props.initialIndex ?? 0));\n let dialogRef!: HTMLDialogElement;\n let opener: HTMLElement | null = null;\n let openerRing = true;\n\n createEffect(\n (previous: { images: LightboxImage[]; initialIndex: number | undefined }) => {\n const images = props.images;\n const initialIndex = props.initialIndex;\n setIndex((currentIndex) => {\n if (initialIndex !== previous.initialIndex) return clampIndex(initialIndex ?? 0, images);\n const previousImage = previous.images[currentIndex];\n const retained = previousImage ? images.findIndex((image) => image === previousImage || image.src === previousImage.src) : -1;\n return retained >= 0 ? retained : clampIndex(currentIndex, images);\n });\n return { images, initialIndex };\n },\n { images: props.images, initialIndex: props.initialIndex },\n );\n\n // Touch gesture tracking\n let touchStartX = 0;\n let touchStartY = 0;\n const SWIPE_THRESHOLD = 50;\n\n const current = () => props.images[index()];\n const isMultiple = () => props.images.length > 1;\n const prev = () => {\n if (!isMultiple()) return;\n setIndex((i) => (i - 1 + props.images.length) % props.images.length);\n };\n const next = () => {\n if (!isMultiple()) return;\n setIndex((i) => (i + 1) % props.images.length);\n };\n\n const close = () => {\n dialogRef.close();\n returnFocus(opener, openerRing);\n props.onClose();\n };\n\n // A key belongs to the Lightbox while focus is inside it, or on the page with no other dialog open. A dialog opened\n // from one of its actions keeps its own keys: Escape closes that dialog, and arrows stay in its fields.\n const ownsKey = (target: EventTarget | null) =>\n target instanceof Node &&\n (dialogRef.contains(target) ||\n (target === document.body && Array.from(document.querySelectorAll(\"dialog[open]\")).every((dialog) => dialog === dialogRef)));\n\n // Keyboard navigation\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!ownsKey(e.target)) return;\n switch (e.key) {\n case \"Escape\":\n // Handled here, so WebKit does not light the returned focus for this key.\n e.preventDefault();\n close();\n break;\n case \"ArrowLeft\":\n prev();\n break;\n case \"ArrowRight\":\n next();\n break;\n }\n };\n\n // Touch handlers for swipe gestures\n const handleTouchStart = (e: TouchEvent) => {\n const touch = e.touches[0];\n if (touch) {\n touchStartX = touch.clientX;\n touchStartY = touch.clientY;\n }\n };\n\n const handleTouchEnd = (e: TouchEvent) => {\n const touch = e.changedTouches[0];\n if (!touch) return;\n\n const deltaX = touch.clientX - touchStartX;\n const deltaY = touch.clientY - touchStartY;\n\n // Only trigger swipe if horizontal movement is dominant\n if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > SWIPE_THRESHOLD) {\n if (deltaX > 0) {\n prev();\n } else {\n next();\n }\n }\n };\n\n // Click on backdrop closes lightbox\n const handleBackdropClick = (e: MouseEvent) => {\n if (e.target === dialogRef) {\n close();\n }\n };\n\n // The browser cancels the dialog itself, as on the Android back gesture;\n // closing here still returns focus and tells the owner.\n const handleCancel = (e: Event) => {\n e.preventDefault();\n close();\n };\n\n // Registration and teardown both live in onMount: onCleanup also runs when an\n // SSR render is disposed, where `document` does not exist.\n onMount(() => {\n opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n openerRing = ringOnReturn(opener);\n // The native dialog would return focus with a ring of the browser's choosing.\n opener?.blur();\n dialogRef.showModal();\n document.addEventListener(\"keydown\", handleKeyDown);\n onCleanup(() => document.removeEventListener(\"keydown\", handleKeyDown));\n });\n\n return (\n <dialog\n ref={dialogRef}\n class=\"k2b-content-lightbox\"\n onMouseDown={handleBackdropClick}\n onCancel={handleCancel}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n aria-label={lightboxMessages().imageLightbox}\n >\n {/* Top bar */}\n <div class=\"k2b-content-lightbox__bar\">\n <div class=\"k2b-content-lightbox__meta\">\n <Show when={isMultiple()}>\n <span class=\"k2b-content-lightbox__counter\" aria-live=\"polite\">\n {index() + 1} / {props.images.length}\n </span>\n </Show>\n <Show when={current()?.alt}>\n <div class=\"k2b-content-lightbox__caption\">\n <div class=\"k2b-content-lightbox__caption-text\">{current()?.alt}</div>\n </div>\n </Show>\n </div>\n\n <div class=\"k2b-content-lightbox__actions\">\n <For each={current()?.actions ?? []}>\n {(action) => (\n <button type=\"button\" onClick={() => action.onClick()} class=\"k2b-content-lightbox__button\" aria-label={action.label}>\n <i class={action.icon} aria-hidden=\"true\" />\n <span class=\"k2b-content-lightbox__button-label\">{action.label}</span>\n </button>\n )}\n </For>\n <Show when={current()?.downloadUrl}>\n <a href={current()!.downloadUrl} download=\"\" class=\"k2b-content-lightbox__button\" aria-label={lightboxMessages().downloadImage}>\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n <span class=\"k2b-content-lightbox__button-label\">{messages().download}</span>\n </a>\n </Show>\n <button type=\"button\" onClick={close} class=\"k2b-content-lightbox__button\" aria-label={lightboxMessages().closeLightbox}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n <span class=\"k2b-content-lightbox__button-label\">{messages().close}</span>\n </button>\n </div>\n </div>\n\n <div class=\"k2b-content-lightbox__stage\">\n <Show when={current()}>\n {(image) => <img src={image().src} alt={image().alt ?? \"\"} class=\"k2b-content-lightbox__image\" draggable={false} />}\n </Show>\n </div>\n\n <Show when={isMultiple()}>\n <button\n type=\"button\"\n onClick={prev}\n class=\"k2b-content-lightbox__nav\"\n data-direction=\"previous\"\n aria-label={lightboxMessages().previousImage}\n >\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n onClick={next}\n class=\"k2b-content-lightbox__nav\"\n data-direction=\"next\"\n aria-label={lightboxMessages().nextImage}\n >\n <i class=\"ti ti-chevron-right\" aria-hidden=\"true\" />\n </button>\n </Show>\n\n <Show when={isMultiple() && props.images.length <= 10}>\n <div class=\"k2b-content-lightbox__dots\" role=\"group\" aria-label={lightboxMessages().imageNavigation}>\n <For each={props.images}>\n {(_, i) => (\n <button\n type=\"button\"\n onClick={() => setIndex(i())}\n class=\"k2b-content-lightbox__dot\"\n aria-current={index() === i() ? \"true\" : undefined}\n aria-label={lightboxMessages().goToImage({ index: i() + 1 })}\n />\n )}\n </For>\n </div>\n </Show>\n </dialog>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/Lightbox.tsx"],"sourcesContent":["import { createEffect, createSignal, For, onCleanup, onMount, Show } from \"solid-js\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { useLightboxMessages } from \"./lightbox-messages\";\nimport { ThumbnailStrip } from \"./ThumbnailStrip\";\n\n/** One more thing to do with the shown image, beside Download: a short label, its icon class, and what it does. */\nexport type LightboxAction = {\n label: string;\n icon: string;\n onClick: () => void;\n};\n\nexport type LightboxImage = {\n src: string;\n alt?: string;\n downloadUrl?: string;\n /** Actions for this image, shown before Download in the same style. */\n actions?: readonly LightboxAction[];\n /** A small version for the thumbnail strip, shown from four images on; without it the strip loads `src`. */\n thumbnail?: string;\n};\n\n/** From this many images the gallery shows a thumbnail strip instead of dots. */\nconst STRIP_FROM = 4;\n\ntype LightboxProps = {\n images: LightboxImage[];\n initialIndex?: number;\n onClose: () => void;\n};\n\n/**\n * Minimal, accessible lightbox using native <dialog>.\n * Supports keyboard navigation, touch swipe gestures, and screen readers.\n */\nexport default function Lightbox(props: LightboxProps) {\n const messages = useUiMessages();\n const lightboxMessages = useLightboxMessages();\n const clampIndex = (value: number, images = props.images): number =>\n images.length === 0 ? 0 : Math.max(0, Math.min(value, images.length - 1));\n const [index, setIndex] = createSignal(clampIndex(props.initialIndex ?? 0));\n let dialogRef!: HTMLDialogElement;\n let opener: HTMLElement | null = null;\n let openerRing = true;\n\n createEffect(\n (previous: { images: LightboxImage[]; initialIndex: number | undefined }) => {\n const images = props.images;\n const initialIndex = props.initialIndex;\n setIndex((currentIndex) => {\n if (initialIndex !== previous.initialIndex) return clampIndex(initialIndex ?? 0, images);\n const previousImage = previous.images[currentIndex];\n const retained = previousImage ? images.findIndex((image) => image === previousImage || image.src === previousImage.src) : -1;\n return retained >= 0 ? retained : clampIndex(currentIndex, images);\n });\n return { images, initialIndex };\n },\n { images: props.images, initialIndex: props.initialIndex },\n );\n\n // Touch gesture tracking\n let touchStartX = 0;\n let touchStartY = 0;\n const SWIPE_THRESHOLD = 50;\n\n const current = () => props.images[index()];\n const isMultiple = () => props.images.length > 1;\n const prev = () => {\n if (!isMultiple()) return;\n setIndex((i) => (i - 1 + props.images.length) % props.images.length);\n };\n const next = () => {\n if (!isMultiple()) return;\n setIndex((i) => (i + 1) % props.images.length);\n };\n\n const close = () => {\n dialogRef.close();\n returnFocus(opener, openerRing);\n props.onClose();\n };\n\n // A key belongs to the Lightbox while focus is inside it, or on the page with no other dialog open. A dialog opened\n // from one of its actions keeps its own keys: Escape closes that dialog, and arrows stay in its fields.\n const ownsKey = (target: EventTarget | null) =>\n target instanceof Node &&\n (dialogRef.contains(target) ||\n (target === document.body && Array.from(document.querySelectorAll(\"dialog[open]\")).every((dialog) => dialog === dialogRef)));\n\n // Keyboard navigation\n const handleKeyDown = (e: KeyboardEvent) => {\n // A part that handled the key itself, such as the thumbnail strip moving its focus, keeps it.\n if (e.defaultPrevented || !ownsKey(e.target)) return;\n switch (e.key) {\n case \"Escape\":\n // Handled here, so WebKit does not light the returned focus for this key.\n e.preventDefault();\n close();\n break;\n case \"ArrowLeft\":\n prev();\n break;\n case \"ArrowRight\":\n next();\n break;\n }\n };\n\n // Touch handlers for swipe gestures\n const handleTouchStart = (e: TouchEvent) => {\n const touch = e.touches[0];\n if (touch) {\n touchStartX = touch.clientX;\n touchStartY = touch.clientY;\n }\n };\n\n const handleTouchEnd = (e: TouchEvent) => {\n const touch = e.changedTouches[0];\n if (!touch) return;\n\n const deltaX = touch.clientX - touchStartX;\n const deltaY = touch.clientY - touchStartY;\n\n // Only trigger swipe if horizontal movement is dominant\n if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > SWIPE_THRESHOLD) {\n if (deltaX > 0) {\n prev();\n } else {\n next();\n }\n }\n };\n\n // Click on backdrop closes lightbox\n const handleBackdropClick = (e: MouseEvent) => {\n if (e.target === dialogRef) {\n close();\n }\n };\n\n // The browser cancels the dialog itself, as on the Android back gesture;\n // closing here still returns focus and tells the owner.\n const handleCancel = (e: Event) => {\n e.preventDefault();\n close();\n };\n\n // Registration and teardown both live in onMount: onCleanup also runs when an\n // SSR render is disposed, where `document` does not exist.\n onMount(() => {\n opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n openerRing = ringOnReturn(opener);\n // The native dialog would return focus with a ring of the browser's choosing.\n opener?.blur();\n dialogRef.showModal();\n document.addEventListener(\"keydown\", handleKeyDown);\n onCleanup(() => document.removeEventListener(\"keydown\", handleKeyDown));\n });\n\n return (\n <dialog\n ref={dialogRef}\n class=\"k2b-content-lightbox\"\n onMouseDown={handleBackdropClick}\n onCancel={handleCancel}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n aria-label={lightboxMessages().imageLightbox}\n >\n {/* Top bar */}\n <div class=\"k2b-content-lightbox__bar\">\n <div class=\"k2b-content-lightbox__meta\">\n <Show when={isMultiple()}>\n <span class=\"k2b-content-lightbox__counter k2b-overlay-surface\" aria-live=\"polite\">\n {index() + 1} / {props.images.length}\n </span>\n </Show>\n <Show when={current()?.alt}>\n <div class=\"k2b-content-lightbox__caption k2b-overlay-surface\">\n <div class=\"k2b-content-lightbox__caption-text\">{current()?.alt}</div>\n </div>\n </Show>\n </div>\n\n <div class=\"k2b-content-lightbox__actions\">\n <For each={current()?.actions ?? []}>\n {(action) => (\n <button\n type=\"button\"\n onClick={() => action.onClick()}\n class=\"k2b-content-lightbox__button k2b-overlay-surface\"\n aria-label={action.label}\n >\n <i class={action.icon} aria-hidden=\"true\" />\n <span class=\"k2b-content-lightbox__button-label\">{action.label}</span>\n </button>\n )}\n </For>\n <Show when={current()?.downloadUrl}>\n <a\n href={current()!.downloadUrl}\n download=\"\"\n class=\"k2b-content-lightbox__button k2b-overlay-surface\"\n aria-label={lightboxMessages().downloadImage}\n >\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n <span class=\"k2b-content-lightbox__button-label\">{messages().download}</span>\n </a>\n </Show>\n <button\n type=\"button\"\n onClick={close}\n class=\"k2b-content-lightbox__button k2b-overlay-surface\"\n aria-label={lightboxMessages().closeLightbox}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n <span class=\"k2b-content-lightbox__button-label\">{messages().close}</span>\n </button>\n </div>\n </div>\n\n <div class=\"k2b-content-lightbox__stage\">\n <Show when={current()}>\n {(image) => <img src={image().src} alt={image().alt ?? \"\"} class=\"k2b-content-lightbox__image\" draggable={false} />}\n </Show>\n </div>\n\n <Show when={isMultiple()}>\n <button\n type=\"button\"\n onClick={prev}\n class=\"k2b-content-lightbox__nav k2b-overlay-surface\"\n data-direction=\"previous\"\n aria-label={lightboxMessages().previousImage}\n >\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n onClick={next}\n class=\"k2b-content-lightbox__nav k2b-overlay-surface\"\n data-direction=\"next\"\n aria-label={lightboxMessages().nextImage}\n >\n <i class=\"ti ti-chevron-right\" aria-hidden=\"true\" />\n </button>\n </Show>\n\n <Show when={props.images.length >= STRIP_FROM}>\n <ThumbnailStrip\n class=\"k2b-content-lightbox__strip k2b-overlay-surface\"\n label={lightboxMessages().imageNavigation}\n items={props.images.map((image, i) => ({\n id: String(i),\n name: image.alt || lightboxMessages().goToImage({ index: i + 1 }),\n thumbnail: image.thumbnail ?? image.src,\n }))}\n currentItem={String(index())}\n onSelectItem={(id) => setIndex(Number(id))}\n />\n </Show>\n\n <Show when={isMultiple() && props.images.length < STRIP_FROM}>\n <div class=\"k2b-content-lightbox__dots k2b-overlay-surface\" role=\"group\" aria-label={lightboxMessages().imageNavigation}>\n <For each={props.images}>\n {(_, i) => (\n <button\n type=\"button\"\n onClick={() => setIndex(i())}\n class=\"k2b-content-lightbox__dot\"\n aria-current={index() === i() ? \"true\" : undefined}\n aria-label={lightboxMessages().goToImage({ index: i() + 1 })}\n />\n )}\n </For>\n </div>\n </Show>\n </dialog>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -10,9 +10,10 @@ var _tmpl$ = ["<div class=\"k2b-map-view__notice\">", "</div>"],
10
10
  _tmpl$3 = "<i class=\"ti ti-plus\" aria-hidden=\"true\"></i>",
11
11
  _tmpl$4 = "<i class=\"ti ti-minus\" aria-hidden=\"true\"></i>",
12
12
  _tmpl$5 = "<i class=\"ti ti-current-location\" aria-hidden=\"true\"></i>",
13
- _tmpl$6 = ["<div class=\"", "\" style=\"", "\"", " role=\"region\"", "><span class=\"k2b-sr-only\">", "</span><div class=\"k2b-map-view__live\"></div>", "<div class=\"k2b-map-view__messages\">", "", "</div><div class=\"k2b-map-view__controls\"><div class=\"k2b-map-view__zoom\">", "", "</div>", "</div><div class=\"k2b-map-view__foot\"><div class=\"k2b-map-view__info\" aria-live=\"polite\">", "</div>", "</div></div>"],
14
- _tmpl$7 = ["<span>", "</span>"],
15
- _tmpl$8 = ["<div class=\"k2b-map-view__empty\">", "</div>"];
13
+ _tmpl$6 = ["<div class=\"k2b-map-view__locate-group k2b-overlay-surface\">", "</div>"],
14
+ _tmpl$7 = ["<div class=\"", "\" style=\"", "\"", " role=\"region\"", "><span class=\"k2b-sr-only\">", "</span><div class=\"k2b-map-view__live\"></div>", "<div class=\"k2b-map-view__messages\">", "", "</div><div class=\"k2b-map-view__controls\"><div class=\"k2b-map-view__zoom k2b-overlay-surface\">", "", "</div>", "</div><div class=\"k2b-map-view__foot\"><div class=\"k2b-map-view__info\" aria-live=\"polite\">", "</div>", "</div></div>"],
15
+ _tmpl$8 = ["<span>", "</span>"],
16
+ _tmpl$9 = ["<div class=\"k2b-map-view__empty\">", "</div>"];
16
17
  import { children, createEffect, createMemo, createSignal, on, onCleanup, onMount, Show, untrack } from "solid-js";
17
18
  import { Button, IconButton } from "../actions/Button";
18
19
  import { prefersReducedMotion } from "../motion";
@@ -443,19 +444,19 @@ export function MapView(props) {
443
444
  };
444
445
  if (direction === "in") map.zoomIn(options);else map.zoomOut(options);
445
446
  };
446
- return _$ssr(_tmpl$6, `k2b-map-view${props.class ? ` ${_$escape(props.class, true)}` : ""}`, _$ssrStyleProperty("height:", `${_$escape(props.height, true)}px`), _$ssrAttribute("data-state", _$escape(state(), true), false), _$ssrAttribute("aria-label", _$escape(messages().mapLabel, true), false), _$escape(messages().summary({
447
+ return _$ssr(_tmpl$7, `k2b-map-view${props.class ? ` ${_$escape(props.class, true)}` : ""}`, _$ssrStyleProperty("height:", `${_$escape(props.height, true)}px`), _$ssrAttribute("data-state", _$escape(state(), true), false), _$ssrAttribute("aria-label", _$escape(messages().mapLabel, true), false), _$escape(messages().summary({
447
448
  count: props.markers?.length ?? 0
448
449
  })), _$escape(_$createComponent(Show, {
449
450
  get when() {
450
451
  return frame();
451
452
  },
452
453
  get fallback() {
453
- return _$ssr(_tmpl$8, _$escape(_$createComponent(Show, {
454
+ return _$ssr(_tmpl$9, _$escape(_$createComponent(Show, {
454
455
  get when() {
455
456
  return empty();
456
457
  },
457
458
  get children() {
458
- return _$ssr(_tmpl$7, _$escape(empty()));
459
+ return _$ssr(_tmpl$8, _$escape(empty()));
459
460
  }
460
461
  })));
461
462
  },
@@ -531,8 +532,7 @@ export function MapView(props) {
531
532
  return props.onLocate;
532
533
  },
533
534
  get children() {
534
- return _$createComponent(IconButton, {
535
- "class": "k2b-map-view__locate",
535
+ return _$ssr(_tmpl$6, _$escape(_$createComponent(IconButton, {
536
536
  tooltip: false,
537
537
  get label() {
538
538
  return messages().locate;
@@ -544,7 +544,7 @@ export function MapView(props) {
544
544
  get children() {
545
545
  return _$ssr(_tmpl$5);
546
546
  }
547
- });
547
+ })));
548
548
  }
549
549
  })), _$escape(_$createComponent(Show, {
550
550
  get when() {