@k2b/ui 0.49.0 → 0.51.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 (461) hide show
  1. package/dist/base.css +70 -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/ContextMenu.js +3 -0
  8. package/dist/browser/actions/ContextMenu.js.map +1 -1
  9. package/dist/browser/actions/Dropdown.js +43 -10
  10. package/dist/browser/actions/Dropdown.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 +188 -0
  20. package/dist/browser/charts/core/area.js.map +1 -0
  21. package/dist/browser/charts/core/calendar.js +186 -0
  22. package/dist/browser/charts/core/calendar.js.map +1 -0
  23. package/dist/browser/charts/core/chart-map-data.js +9 -0
  24. package/dist/browser/charts/core/chart-map-data.js.map +1 -0
  25. package/dist/browser/charts/core/chart-messages.js +17 -0
  26. package/dist/browser/charts/core/chart-messages.js.map +1 -0
  27. package/dist/browser/charts/core/hbar-layout.js +118 -0
  28. package/dist/browser/charts/core/hbar-layout.js.map +1 -0
  29. package/dist/browser/charts/core/hbar.js +39 -0
  30. package/dist/browser/charts/core/hbar.js.map +1 -0
  31. package/dist/browser/charts/core/index.js +17 -0
  32. package/dist/browser/charts/core/index.js.map +1 -0
  33. package/dist/browser/charts/core/inspection.js +9 -0
  34. package/dist/browser/charts/core/inspection.js.map +1 -0
  35. package/dist/browser/charts/core/map.js +116 -0
  36. package/dist/browser/charts/core/map.js.map +1 -0
  37. package/dist/browser/charts/core/registry.js +35 -0
  38. package/dist/browser/charts/core/registry.js.map +1 -0
  39. package/dist/browser/charts/core/render-size.js +13 -0
  40. package/dist/browser/charts/core/render-size.js.map +1 -0
  41. package/dist/browser/charts/core/render.js +113 -0
  42. package/dist/browser/charts/core/render.js.map +1 -0
  43. package/dist/browser/charts/core/snapshot.js +65 -0
  44. package/dist/browser/charts/core/snapshot.js.map +1 -0
  45. package/dist/browser/charts/core/svg-renderers.js +2406 -0
  46. package/dist/browser/charts/core/svg-renderers.js.map +1 -0
  47. package/dist/browser/charts/core/svg.js +21 -0
  48. package/dist/browser/charts/core/svg.js.map +1 -0
  49. package/dist/browser/charts/core/termination.test-fixture.js +162 -0
  50. package/dist/browser/charts/core/termination.test-fixture.js.map +1 -0
  51. package/dist/browser/charts/core/text.js +13 -0
  52. package/dist/browser/charts/core/text.js.map +1 -0
  53. package/dist/browser/charts/core/types.js +6 -0
  54. package/dist/browser/charts/core/types.js.map +1 -0
  55. package/dist/browser/charts/core/waterfall.js +162 -0
  56. package/dist/browser/charts/core/waterfall.js.map +1 -0
  57. package/dist/browser/charts/description.js +2 -0
  58. package/dist/browser/charts/description.js.map +1 -0
  59. package/dist/browser/charts.js +4 -2
  60. package/dist/browser/charts.js.map +1 -1
  61. package/dist/browser/content/BalanceSummary.js +106 -0
  62. package/dist/browser/content/BalanceSummary.js.map +1 -0
  63. package/dist/browser/content/Chart.js +21 -616
  64. package/dist/browser/content/Chart.js.map +1 -1
  65. package/dist/browser/content/ChartExplorer.js +366 -122
  66. package/dist/browser/content/ChartExplorer.js.map +1 -1
  67. package/dist/browser/content/ChartRoot.js +632 -0
  68. package/dist/browser/content/ChartRoot.js.map +1 -0
  69. package/dist/browser/content/ChartSnapshotView.js +16 -9
  70. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  71. package/dist/browser/content/ChartSparkline.js +24 -0
  72. package/dist/browser/content/ChartSparkline.js.map +1 -0
  73. package/dist/browser/content/DataTable.js +676 -293
  74. package/dist/browser/content/DataTable.js.map +1 -1
  75. package/dist/browser/content/DataTableTools.js +119 -0
  76. package/dist/browser/content/DataTableTools.js.map +1 -0
  77. package/dist/browser/content/FileView.js +111 -61
  78. package/dist/browser/content/FileView.js.map +1 -1
  79. package/dist/browser/content/FlowAmount.js +82 -0
  80. package/dist/browser/content/FlowAmount.js.map +1 -0
  81. package/dist/browser/content/Lightbox.js +8 -8
  82. package/dist/browser/content/Lightbox.js.map +1 -1
  83. package/dist/browser/content/MapView.js +30 -28
  84. package/dist/browser/content/MapView.js.map +1 -1
  85. package/dist/browser/content/PdfPreview.js +84 -52
  86. package/dist/browser/content/PdfPreview.js.map +1 -1
  87. package/dist/browser/content/PdfViewer.js +588 -0
  88. package/dist/browser/content/PdfViewer.js.map +1 -0
  89. package/dist/browser/content/balance-summary-messages.js +26 -0
  90. package/dist/browser/content/balance-summary-messages.js.map +1 -0
  91. package/dist/browser/content/chart-bar.js +251 -21
  92. package/dist/browser/content/chart-bar.js.map +1 -1
  93. package/dist/browser/content/chart-calendar.js +43 -0
  94. package/dist/browser/content/chart-calendar.js.map +1 -0
  95. package/dist/browser/content/chart-inspection-core.js +178 -50
  96. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  97. package/dist/browser/content/chart-inspection.js.map +1 -1
  98. package/dist/browser/content/chart-line-gaps.js +2 -2
  99. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  100. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  101. package/dist/browser/content/chart-message-catalog.js +174 -0
  102. package/dist/browser/content/chart-message-catalog.js.map +1 -0
  103. package/dist/browser/content/chart-messages.js +2 -138
  104. package/dist/browser/content/chart-messages.js.map +1 -1
  105. package/dist/browser/content/chart-snapshot.js +1 -62
  106. package/dist/browser/content/chart-snapshot.js.map +1 -1
  107. package/dist/browser/content/chart-state-timeline.js +1 -1
  108. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  109. package/dist/browser/content/chart-svg.js +4 -2
  110. package/dist/browser/content/chart-svg.js.map +1 -1
  111. package/dist/browser/content/chart-time-axis.js +139 -0
  112. package/dist/browser/content/chart-time-axis.js.map +1 -0
  113. package/dist/browser/content/data-table-columns.js +160 -0
  114. package/dist/browser/content/data-table-columns.js.map +1 -0
  115. package/dist/browser/content/data-table-messages.js +38 -2
  116. package/dist/browser/content/data-table-messages.js.map +1 -1
  117. package/dist/browser/content/flow-amount-messages.js +26 -0
  118. package/dist/browser/content/flow-amount-messages.js.map +1 -0
  119. package/dist/browser/content/index.js +5 -0
  120. package/dist/browser/content/index.js.map +1 -1
  121. package/dist/browser/content/pdf-document.js +29 -0
  122. package/dist/browser/content/pdf-document.js.map +1 -0
  123. package/dist/browser/content/pdf-limits.js +31 -0
  124. package/dist/browser/content/pdf-limits.js.map +1 -0
  125. package/dist/browser/content/pdf-messages.js +34 -2
  126. package/dist/browser/content/pdf-messages.js.map +1 -1
  127. package/dist/browser/content/pdf-viewer-engine.js +57 -0
  128. package/dist/browser/content/pdf-viewer-worker.js +28 -0
  129. package/dist/browser/inputs/ChoiceInputs.js +94 -51
  130. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  131. package/dist/browser/inputs/ChoiceSlider.js +75 -58
  132. package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
  133. package/dist/browser/inputs/DatePicker.js +118 -102
  134. package/dist/browser/inputs/DatePicker.js.map +1 -1
  135. package/dist/browser/inputs/PeriodPicker.js +874 -0
  136. package/dist/browser/inputs/PeriodPicker.js.map +1 -0
  137. package/dist/browser/inputs/SelectChip.js +50 -17
  138. package/dist/browser/inputs/SelectChip.js.map +1 -1
  139. package/dist/browser/inputs/date-picker.js +13 -0
  140. package/dist/browser/inputs/date-picker.js.map +1 -1
  141. package/dist/browser/inputs/index.js +4 -1
  142. package/dist/browser/inputs/index.js.map +1 -1
  143. package/dist/browser/inputs/input-messages.js +8 -2
  144. package/dist/browser/inputs/input-messages.js.map +1 -1
  145. package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
  146. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  147. package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
  148. package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
  149. package/dist/browser/inputs/period-picker-messages.js +71 -0
  150. package/dist/browser/inputs/period-picker-messages.js.map +1 -0
  151. package/dist/browser/inputs/period.js +263 -0
  152. package/dist/browser/inputs/period.js.map +1 -0
  153. package/dist/browser/intl/Format.js +31 -8
  154. package/dist/browser/intl/Format.js.map +1 -1
  155. package/dist/browser/layout/AppWorkspace.js +7 -1
  156. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  157. package/dist/browser/layout/DetailPanel.js +147 -120
  158. package/dist/browser/layout/DetailPanel.js.map +1 -1
  159. package/dist/browser/layout/Discussion.js +101 -108
  160. package/dist/browser/layout/Discussion.js.map +1 -1
  161. package/dist/browser/layout/index.js.map +1 -1
  162. package/dist/browser/surfaces/BudgetList.js +281 -0
  163. package/dist/browser/surfaces/BudgetList.js.map +1 -0
  164. package/dist/browser/surfaces/DescriptionList.js +5 -2
  165. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  166. package/dist/browser/surfaces/ProgressBar.js +134 -21
  167. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  168. package/dist/browser/surfaces/StatCell.js +327 -146
  169. package/dist/browser/surfaces/StatCell.js.map +1 -1
  170. package/dist/browser/surfaces/StatGrid.js +75 -57
  171. package/dist/browser/surfaces/StatGrid.js.map +1 -1
  172. package/dist/browser/surfaces/budget-messages.js +64 -0
  173. package/dist/browser/surfaces/budget-messages.js.map +1 -0
  174. package/dist/browser/surfaces/delta-badge.js +79 -0
  175. package/dist/browser/surfaces/delta-badge.js.map +1 -0
  176. package/dist/browser/surfaces/index.js +2 -1
  177. package/dist/browser/surfaces/index.js.map +1 -1
  178. package/dist/browser/surfaces/person-color.js +2 -2
  179. package/dist/browser/surfaces/person-color.js.map +1 -1
  180. package/dist/browser/surfaces/stat-cell-messages.js +41 -0
  181. package/dist/browser/surfaces/stat-cell-messages.js.map +1 -0
  182. package/dist/browser/widgets/Dashboard.js +137 -0
  183. package/dist/browser/widgets/Dashboard.js.map +1 -0
  184. package/dist/browser/widgets/DashboardFrame.js +310 -0
  185. package/dist/browser/widgets/DashboardFrame.js.map +1 -0
  186. package/dist/browser/widgets/index.js +2 -0
  187. package/dist/browser/widgets/index.js.map +1 -1
  188. package/dist/licenses/pdfjs-dist.txt +177 -0
  189. package/dist/ssr/actions/Button.js.map +1 -1
  190. package/dist/ssr/actions/CommandList.js +638 -0
  191. package/dist/ssr/actions/CommandList.js.map +1 -0
  192. package/dist/ssr/actions/CommandMenu.js +197 -0
  193. package/dist/ssr/actions/CommandMenu.js.map +1 -0
  194. package/dist/ssr/actions/ContextMenu.js +3 -0
  195. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  196. package/dist/ssr/actions/Dropdown.js +43 -10
  197. package/dist/ssr/actions/Dropdown.js.map +1 -1
  198. package/dist/ssr/actions/command-dock.js +47 -0
  199. package/dist/ssr/actions/command-dock.js.map +1 -0
  200. package/dist/ssr/actions/command-items.js +84 -0
  201. package/dist/ssr/actions/command-items.js.map +1 -0
  202. package/dist/ssr/actions/command-messages.js +42 -0
  203. package/dist/ssr/actions/command-messages.js.map +1 -0
  204. package/dist/ssr/actions/index.js +1 -0
  205. package/dist/ssr/actions/index.js.map +1 -1
  206. package/dist/ssr/charts/core/area.js +188 -0
  207. package/dist/ssr/charts/core/area.js.map +1 -0
  208. package/dist/ssr/charts/core/calendar.js +186 -0
  209. package/dist/ssr/charts/core/calendar.js.map +1 -0
  210. package/dist/ssr/charts/core/chart-map-data.js +9 -0
  211. package/dist/ssr/charts/core/chart-map-data.js.map +1 -0
  212. package/dist/ssr/charts/core/chart-messages.js +17 -0
  213. package/dist/ssr/charts/core/chart-messages.js.map +1 -0
  214. package/dist/ssr/charts/core/hbar-layout.js +118 -0
  215. package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
  216. package/dist/ssr/charts/core/hbar.js +39 -0
  217. package/dist/ssr/charts/core/hbar.js.map +1 -0
  218. package/dist/ssr/charts/core/index.js +17 -0
  219. package/dist/ssr/charts/core/index.js.map +1 -0
  220. package/dist/ssr/charts/core/inspection.js +9 -0
  221. package/dist/ssr/charts/core/inspection.js.map +1 -0
  222. package/dist/ssr/charts/core/map.js +116 -0
  223. package/dist/ssr/charts/core/map.js.map +1 -0
  224. package/dist/ssr/charts/core/registry.js +35 -0
  225. package/dist/ssr/charts/core/registry.js.map +1 -0
  226. package/dist/ssr/charts/core/render-size.js +13 -0
  227. package/dist/ssr/charts/core/render-size.js.map +1 -0
  228. package/dist/ssr/charts/core/render.js +113 -0
  229. package/dist/ssr/charts/core/render.js.map +1 -0
  230. package/dist/ssr/charts/core/snapshot.js +65 -0
  231. package/dist/ssr/charts/core/snapshot.js.map +1 -0
  232. package/dist/ssr/charts/core/svg-renderers.js +2406 -0
  233. package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
  234. package/dist/ssr/charts/core/svg.js +21 -0
  235. package/dist/ssr/charts/core/svg.js.map +1 -0
  236. package/dist/ssr/charts/core/termination.test-fixture.js +162 -0
  237. package/dist/ssr/charts/core/termination.test-fixture.js.map +1 -0
  238. package/dist/ssr/charts/core/text.js +13 -0
  239. package/dist/ssr/charts/core/text.js.map +1 -0
  240. package/dist/ssr/charts/core/types.js +6 -0
  241. package/dist/ssr/charts/core/types.js.map +1 -0
  242. package/dist/ssr/charts/core/waterfall.js +162 -0
  243. package/dist/ssr/charts/core/waterfall.js.map +1 -0
  244. package/dist/ssr/charts/description.js +2 -0
  245. package/dist/ssr/charts/description.js.map +1 -0
  246. package/dist/ssr/charts.js +4 -2
  247. package/dist/ssr/charts.js.map +1 -1
  248. package/dist/ssr/content/BalanceSummary.js +75 -0
  249. package/dist/ssr/content/BalanceSummary.js.map +1 -0
  250. package/dist/ssr/content/Chart.js +21 -483
  251. package/dist/ssr/content/Chart.js.map +1 -1
  252. package/dist/ssr/content/ChartExplorer.js +190 -46
  253. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  254. package/dist/ssr/content/ChartRoot.js +475 -0
  255. package/dist/ssr/content/ChartRoot.js.map +1 -0
  256. package/dist/ssr/content/ChartSnapshotView.js +5 -1
  257. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  258. package/dist/ssr/content/ChartSparkline.js +24 -0
  259. package/dist/ssr/content/ChartSparkline.js.map +1 -0
  260. package/dist/ssr/content/DataTable.js +287 -78
  261. package/dist/ssr/content/DataTable.js.map +1 -1
  262. package/dist/ssr/content/DataTableTools.js +106 -0
  263. package/dist/ssr/content/DataTableTools.js.map +1 -0
  264. package/dist/ssr/content/FileView.js +56 -7
  265. package/dist/ssr/content/FileView.js.map +1 -1
  266. package/dist/ssr/content/FlowAmount.js +58 -0
  267. package/dist/ssr/content/FlowAmount.js.map +1 -0
  268. package/dist/ssr/content/Lightbox.js +8 -8
  269. package/dist/ssr/content/Lightbox.js.map +1 -1
  270. package/dist/ssr/content/MapView.js +9 -9
  271. package/dist/ssr/content/MapView.js.map +1 -1
  272. package/dist/ssr/content/PdfPreview.js +49 -20
  273. package/dist/ssr/content/PdfPreview.js.map +1 -1
  274. package/dist/ssr/content/PdfViewer.js +484 -0
  275. package/dist/ssr/content/PdfViewer.js.map +1 -0
  276. package/dist/ssr/content/balance-summary-messages.js +26 -0
  277. package/dist/ssr/content/balance-summary-messages.js.map +1 -0
  278. package/dist/ssr/content/chart-bar.js +251 -21
  279. package/dist/ssr/content/chart-bar.js.map +1 -1
  280. package/dist/ssr/content/chart-calendar.js +43 -0
  281. package/dist/ssr/content/chart-calendar.js.map +1 -0
  282. package/dist/ssr/content/chart-inspection-core.js +178 -50
  283. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  284. package/dist/ssr/content/chart-inspection.js.map +1 -1
  285. package/dist/ssr/content/chart-line-gaps.js +2 -2
  286. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  287. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  288. package/dist/ssr/content/chart-message-catalog.js +174 -0
  289. package/dist/ssr/content/chart-message-catalog.js.map +1 -0
  290. package/dist/ssr/content/chart-messages.js +2 -138
  291. package/dist/ssr/content/chart-messages.js.map +1 -1
  292. package/dist/ssr/content/chart-snapshot.js +1 -62
  293. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  294. package/dist/ssr/content/chart-state-timeline.js +1 -1
  295. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  296. package/dist/ssr/content/chart-svg.js +4 -2
  297. package/dist/ssr/content/chart-svg.js.map +1 -1
  298. package/dist/ssr/content/chart-time-axis.js +139 -0
  299. package/dist/ssr/content/chart-time-axis.js.map +1 -0
  300. package/dist/ssr/content/data-table-columns.js +160 -0
  301. package/dist/ssr/content/data-table-columns.js.map +1 -0
  302. package/dist/ssr/content/data-table-messages.js +38 -2
  303. package/dist/ssr/content/data-table-messages.js.map +1 -1
  304. package/dist/ssr/content/flow-amount-messages.js +26 -0
  305. package/dist/ssr/content/flow-amount-messages.js.map +1 -0
  306. package/dist/ssr/content/index.js +5 -0
  307. package/dist/ssr/content/index.js.map +1 -1
  308. package/dist/ssr/content/pdf-document.js +29 -0
  309. package/dist/ssr/content/pdf-document.js.map +1 -0
  310. package/dist/ssr/content/pdf-limits.js +31 -0
  311. package/dist/ssr/content/pdf-limits.js.map +1 -0
  312. package/dist/ssr/content/pdf-messages.js +34 -2
  313. package/dist/ssr/content/pdf-messages.js.map +1 -1
  314. package/dist/ssr/inputs/ChoiceInputs.js +49 -12
  315. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  316. package/dist/ssr/inputs/ChoiceSlider.js +17 -12
  317. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
  318. package/dist/ssr/inputs/DatePicker.js +19 -13
  319. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  320. package/dist/ssr/inputs/PeriodPicker.js +598 -0
  321. package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
  322. package/dist/ssr/inputs/SelectChip.js +26 -9
  323. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  324. package/dist/ssr/inputs/date-picker.js +13 -0
  325. package/dist/ssr/inputs/date-picker.js.map +1 -1
  326. package/dist/ssr/inputs/index.js +4 -1
  327. package/dist/ssr/inputs/index.js.map +1 -1
  328. package/dist/ssr/inputs/input-messages.js +8 -2
  329. package/dist/ssr/inputs/input-messages.js.map +1 -1
  330. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  331. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  332. package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
  333. package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
  334. package/dist/ssr/inputs/period-picker-messages.js +71 -0
  335. package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
  336. package/dist/ssr/inputs/period.js +263 -0
  337. package/dist/ssr/inputs/period.js.map +1 -0
  338. package/dist/ssr/intl/Format.js +22 -2
  339. package/dist/ssr/intl/Format.js.map +1 -1
  340. package/dist/ssr/layout/AppWorkspace.js +7 -1
  341. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  342. package/dist/ssr/layout/DetailPanel.js +27 -4
  343. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  344. package/dist/ssr/layout/Discussion.js +16 -2
  345. package/dist/ssr/layout/Discussion.js.map +1 -1
  346. package/dist/ssr/layout/index.js.map +1 -1
  347. package/dist/ssr/surfaces/BudgetList.js +170 -0
  348. package/dist/ssr/surfaces/BudgetList.js.map +1 -0
  349. package/dist/ssr/surfaces/DescriptionList.js +1 -1
  350. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  351. package/dist/ssr/surfaces/ProgressBar.js +96 -5
  352. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  353. package/dist/ssr/surfaces/StatCell.js +157 -52
  354. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  355. package/dist/ssr/surfaces/StatGrid.js +24 -35
  356. package/dist/ssr/surfaces/StatGrid.js.map +1 -1
  357. package/dist/ssr/surfaces/budget-messages.js +64 -0
  358. package/dist/ssr/surfaces/budget-messages.js.map +1 -0
  359. package/dist/ssr/surfaces/delta-badge.js +55 -0
  360. package/dist/ssr/surfaces/delta-badge.js.map +1 -0
  361. package/dist/ssr/surfaces/index.js +2 -1
  362. package/dist/ssr/surfaces/index.js.map +1 -1
  363. package/dist/ssr/surfaces/person-color.js +2 -2
  364. package/dist/ssr/surfaces/person-color.js.map +1 -1
  365. package/dist/ssr/surfaces/stat-cell-messages.js +41 -0
  366. package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -0
  367. package/dist/ssr/widgets/Dashboard.js +84 -0
  368. package/dist/ssr/widgets/Dashboard.js.map +1 -0
  369. package/dist/ssr/widgets/DashboardFrame.js +200 -0
  370. package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
  371. package/dist/ssr/widgets/index.js +2 -0
  372. package/dist/ssr/widgets/index.js.map +1 -1
  373. package/dist/styles.css +1 -1
  374. package/dist/types/actions/Button.d.ts +1 -1
  375. package/dist/types/actions/CommandList.d.ts +120 -0
  376. package/dist/types/actions/CommandMenu.d.ts +39 -0
  377. package/dist/types/actions/Dropdown.d.ts +17 -0
  378. package/dist/types/actions/command-dock.d.ts +8 -0
  379. package/dist/types/actions/command-items.d.ts +134 -0
  380. package/dist/types/actions/command-messages.d.ts +19 -0
  381. package/dist/types/actions/index.d.ts +3 -0
  382. package/dist/types/charts/core/area.d.ts +62 -0
  383. package/dist/types/charts/core/calendar.d.ts +57 -0
  384. package/dist/types/charts/core/chart-map-data.d.ts +3 -0
  385. package/dist/types/charts/core/chart-messages.d.ts +5 -0
  386. package/dist/types/charts/core/hbar-layout.d.ts +74 -0
  387. package/dist/types/charts/core/hbar.d.ts +13 -0
  388. package/dist/types/charts/core/index.d.ts +16 -0
  389. package/dist/types/charts/core/inspection.d.ts +16 -0
  390. package/dist/types/charts/core/map.d.ts +3 -0
  391. package/dist/types/charts/core/registry.d.ts +33 -0
  392. package/dist/types/charts/core/render-size.d.ts +7 -0
  393. package/dist/types/charts/core/render.d.ts +37 -0
  394. package/dist/types/charts/core/snapshot.d.ts +27 -0
  395. package/dist/types/charts/core/svg-renderers.d.ts +722 -0
  396. package/dist/types/charts/core/svg.d.ts +20 -0
  397. package/dist/types/charts/core/termination.test-fixture.d.ts +1 -0
  398. package/dist/types/charts/core/text.d.ts +5 -0
  399. package/dist/types/charts/core/types.d.ts +20 -0
  400. package/dist/types/charts/core/waterfall.d.ts +68 -0
  401. package/dist/types/charts/description.d.ts +226 -0
  402. package/dist/types/charts.d.ts +5 -2
  403. package/dist/types/content/BalanceSummary.d.ts +29 -0
  404. package/dist/types/content/Chart.d.ts +19 -117
  405. package/dist/types/content/ChartExplorer.d.ts +43 -2
  406. package/dist/types/content/ChartRoot.d.ts +92 -0
  407. package/dist/types/content/ChartSnapshotView.d.ts +1 -0
  408. package/dist/types/content/ChartSparkline.d.ts +5 -0
  409. package/dist/types/content/DataTable.d.ts +28 -0
  410. package/dist/types/content/DataTableTools.d.ts +44 -0
  411. package/dist/types/content/FlowAmount.d.ts +28 -0
  412. package/dist/types/content/PdfViewer.d.ts +32 -0
  413. package/dist/types/content/balance-summary-messages.d.ts +11 -0
  414. package/dist/types/content/chart-bar.d.ts +95 -2
  415. package/dist/types/content/chart-calendar.d.ts +4 -0
  416. package/dist/types/content/chart-inspection-core.d.ts +21 -16
  417. package/dist/types/content/chart-inspection.d.ts +5 -1
  418. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  419. package/dist/types/content/chart-message-catalog.d.ts +84 -0
  420. package/dist/types/content/chart-messages.d.ts +2 -33
  421. package/dist/types/content/chart-snapshot.d.ts +1 -26
  422. package/dist/types/content/chart-svg.d.ts +1 -1
  423. package/dist/types/content/chart-time-axis.d.ts +26 -0
  424. package/dist/types/content/data-table-columns.d.ts +72 -0
  425. package/dist/types/content/data-table-messages.d.ts +18 -0
  426. package/dist/types/content/flow-amount-messages.d.ts +11 -0
  427. package/dist/types/content/index.d.ts +12 -2
  428. package/dist/types/content/pdf-document.d.ts +5 -0
  429. package/dist/types/content/pdf-engine.d.ts +9 -0
  430. package/dist/types/content/pdf-limits.d.ts +43 -0
  431. package/dist/types/content/pdf-messages.d.ts +16 -0
  432. package/dist/types/inputs/ChoiceInputs.d.ts +4 -0
  433. package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
  434. package/dist/types/inputs/DatePicker.d.ts +22 -0
  435. package/dist/types/inputs/PeriodPicker.d.ts +24 -0
  436. package/dist/types/inputs/SelectChip.d.ts +2 -0
  437. package/dist/types/inputs/date-picker.d.ts +6 -0
  438. package/dist/types/inputs/index.d.ts +8 -2
  439. package/dist/types/inputs/input-messages.d.ts +3 -0
  440. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
  441. package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
  442. package/dist/types/inputs/period-picker-messages.d.ts +34 -0
  443. package/dist/types/inputs/period.d.ts +134 -0
  444. package/dist/types/intl/Format.d.ts +5 -0
  445. package/dist/types/layout/AppWorkspace.d.ts +5 -0
  446. package/dist/types/layout/DetailPanel.d.ts +12 -0
  447. package/dist/types/layout/index.d.ts +1 -1
  448. package/dist/types/surfaces/BudgetList.d.ts +42 -0
  449. package/dist/types/surfaces/DescriptionList.d.ts +5 -0
  450. package/dist/types/surfaces/ProgressBar.d.ts +38 -2
  451. package/dist/types/surfaces/StatCell.d.ts +40 -2
  452. package/dist/types/surfaces/StatGrid.d.ts +3 -1
  453. package/dist/types/surfaces/budget-messages.d.ts +30 -0
  454. package/dist/types/surfaces/delta-badge.d.ts +10 -0
  455. package/dist/types/surfaces/index.d.ts +4 -3
  456. package/dist/types/surfaces/person-color.d.ts +2 -2
  457. package/dist/types/surfaces/stat-cell-messages.d.ts +19 -0
  458. package/dist/types/widgets/Dashboard.d.ts +42 -0
  459. package/dist/types/widgets/DashboardFrame.d.ts +58 -0
  460. package/dist/types/widgets/index.d.ts +2 -0
  461. package/package.json +8 -1
@@ -0,0 +1,484 @@
1
+ import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
2
+ import { ssr as _$ssr } from "solid-js/web";
3
+ import { memo as _$memo } from "solid-js/web";
4
+ import { createComponent as _$createComponent } from "solid-js/web";
5
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
6
+ import { escape as _$escape } from "solid-js/web";
7
+ var _tmpl$ = ["<span class=\"k2b-sr-only\">", "</span>"],
8
+ _tmpl$2 = ["<span aria-hidden=\"true\">", "</span>"],
9
+ _tmpl$3 = ["<span aria-live=\"polite\">", "</span>"],
10
+ _tmpl$4 = "<i class=\"ti ti-arrows-horizontal\" aria-hidden=\"true\"></i>",
11
+ _tmpl$5 = ["<div class=\"k2b-pdf-viewer__bar\">", "</div>"],
12
+ _tmpl$6 = ["<div class=\"", "\"", "", "><div class=\"k2b-pdf-viewer__pages\"", " tabindex=\"0\" role=\"document\"", "><div class=\"k2b-pdf-viewer__stack\">", "</div></div>", "</div>"],
13
+ _tmpl$7 = ["<div class=\"k2b-pdf-viewer__page\"", " style=\"", "\">", "", "</div>"],
14
+ _tmpl$8 = ["<img", " draggable=\"false\" alt=\"", "\">"],
15
+ _tmpl$9 = "<div class=\"k2b-pdf-viewer__text\"></div>";
16
+ import { batch, createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show } from "solid-js";
17
+ import { Button } from "../actions/Button";
18
+ import { Toolbar } from "../actions/Toolbar";
19
+ import { openPdfDocument, pageImageWidth } from "./pdf-document";
20
+ import { usePdfMessages } from "./pdf-messages";
21
+ /** CSS pixels per PDF point at 100 %: 96 dpi on screen, 72 points per inch. */
22
+ const POINT = 96 / 72;
23
+ /** Steps for − and + in percent; Ctrl or ⌘ with the wheel and two fingers zoom freely between the first and the last. */
24
+ export const PDF_ZOOM_STEPS = [25, 50, 75, 100, 125, 150, 200, 300];
25
+ const SMALLEST = PDF_ZOOM_STEPS[0];
26
+ const LARGEST = PDF_ZOOM_STEPS[PDF_ZOOM_STEPS.length - 1] ?? 300;
27
+ /** Horizontal padding of the page stack, both sides together. */
28
+ const INSET = 24;
29
+ /** Pages within this distance of the view draw; farther ones keep only their box. */
30
+ const NEAR_MARGIN = "150% 0px";
31
+ /** At most this many drawn pages stay in memory; the ones out of view are released first. */
32
+ const KEPT_IMAGES = 24;
33
+
34
+ /** The next zoom step above or below `percent`; at either end it stays there. */
35
+ export const nextPdfZoomStep = (percent, direction) => direction === 1 ? PDF_ZOOM_STEPS.find(step => step > percent + 0.5) ?? LARGEST : [...PDF_ZOOM_STEPS].reverse().find(step => step < percent - 0.5) ?? SMALLEST;
36
+
37
+ /**
38
+ * The page width most pages share, at a tie the first page's. "Width" fits every page to the area, so a landscape page
39
+ * among portrait ones never scrolls sideways; percentages and fixed zoom follow this common width.
40
+ */
41
+ export const commonPageWidth = pages => {
42
+ const counts = new Map();
43
+ for (const page of pages) counts.set(Math.round(page.width), (counts.get(Math.round(page.width)) ?? 0) + 1);
44
+ let best = Math.round(pages[0]?.width ?? 1);
45
+ let most = 0;
46
+ for (const [width, count] of counts) if (count > most) {
47
+ best = width;
48
+ most = count;
49
+ }
50
+ return Math.max(1, best);
51
+ };
52
+
53
+ /**
54
+ * A PDF drawn by pdf.js in every browser: pages as images in one scroll area, an invisible text layer over each page
55
+ * to select, copy, and find text, and a small zoom bar. Only pages near the view are drawn and carry text; the others
56
+ * keep their size, so the scroll bar is right from the start. Printing and forms stay with the browser's own viewer.
57
+ */
58
+ export default function PdfViewer(props) {
59
+ const messages = usePdfMessages();
60
+ const [doc, setDoc] = createSignal(null);
61
+ const pages = () => doc()?.pages ?? [];
62
+ const shown = () => props.page === undefined ? pages().map((_, index) => index) : [props.page].filter(index => index < pages().length);
63
+ const [images, setImages] = createSignal(new Map());
64
+ const [near, setNear] = createSignal(new Set());
65
+ const [fitWidth, setFitWidth] = createSignal(true);
66
+ const [fixed, setFixed] = createSignal(POINT);
67
+ const [inner, setInner] = createSignal(0);
68
+ const [current, setCurrent] = createSignal(0);
69
+ const [ready, setReady] = createSignal(false);
70
+ let area;
71
+ let drawRun;
72
+ let drawTimer;
73
+ let gone = false;
74
+ const releaseAll = () => {
75
+ for (const image of images().values()) URL.revokeObjectURL(image.url);
76
+ setImages(new Map());
77
+ };
78
+
79
+ // Opening: a new `data` opens a new document and closes the previous one.
80
+ createEffect(on(() => props.data, data => {
81
+ const opening = new AbortController();
82
+ let opened = null;
83
+ onCleanup(() => {
84
+ opening.abort();
85
+ drawRun?.abort();
86
+ releaseAll();
87
+ void opened?.close();
88
+ });
89
+ setReady(false);
90
+ void openPdfDocument(data, opening.signal).then(handle => {
91
+ if (!handle || opening.signal.aborted) return void handle?.close();
92
+ opened = handle;
93
+ // A document without pages has nothing to draw; the host shows its fallback instead of waiting forever.
94
+ if (handle.pages.length === 0) return void props.onError?.(new Error("The PDF has no pages"));
95
+ setDoc(handle);
96
+ }, error => {
97
+ if (!opening.signal.aborted) props.onError?.(error);
98
+ });
99
+ }));
100
+ onCleanup(() => {
101
+ gone = true;
102
+ clearTimeout(drawTimer);
103
+ });
104
+ const commonWidth = createMemo(() => commonPageWidth(pages()));
105
+ const areaWidth = () => Math.max(120, inner());
106
+ /** CSS pixels per point of the common page width; percent, steps, and fixed zoom follow from it. */
107
+ const factor = () => fitWidth() ? areaWidth() / commonWidth() : fixed();
108
+ const percent = () => Math.round(factor() / POINT * 100);
109
+ const pageWidth = page => Math.max(1, Math.floor(fitWidth() ? areaWidth() : page.width * fixed()));
110
+
111
+ /**
112
+ * Draws each near page whose image is too small (blurred) or far too large (memory) for its shown size. A new zoom or
113
+ * scroll aborts and continues. A page that fails keeps its old image; without one, `onError` reports it.
114
+ */
115
+ const redraw = async () => {
116
+ drawRun?.abort();
117
+ const run = new AbortController();
118
+ drawRun = run;
119
+ const handle = doc();
120
+ if (!handle) return;
121
+ const order = shown().filter(index => near().has(index));
122
+ for (const index of order) {
123
+ const page = pages()[index];
124
+ if (!page) continue;
125
+ const target = pageImageWidth(pageWidth(page), window.devicePixelRatio, page.height / page.width);
126
+ const existing = images().get(index);
127
+ if (existing && target <= existing.width * 1.15 && target >= existing.width * 0.5) continue;
128
+ const image = await handle.draw(index, target, run.signal).catch(() => "failed");
129
+ if (run.signal.aborted || gone || doc() !== handle) {
130
+ if (image && image !== "failed") URL.revokeObjectURL(image.url);
131
+ return;
132
+ }
133
+ if (image === "failed" || !image) {
134
+ if (existing) continue;
135
+ props.onError?.(new Error(`Page ${index + 1} could not be drawn`));
136
+ return;
137
+ }
138
+ setImages(previous => {
139
+ const next = new Map(previous);
140
+ next.set(index, image);
141
+ // Keep memory bounded: release drawn pages out of view, oldest first, past the limit.
142
+ for (const key of next.keys()) {
143
+ if (next.size <= KEPT_IMAGES) break;
144
+ if (near().has(key)) continue;
145
+ const released = next.get(key);
146
+ if (released) URL.revokeObjectURL(released.url);
147
+ next.delete(key);
148
+ }
149
+ return next;
150
+ });
151
+ if (existing) URL.revokeObjectURL(existing.url);
152
+ if (!ready()) {
153
+ setReady(true);
154
+ props.onReady?.();
155
+ }
156
+ }
157
+ };
158
+ const scheduleRedraw = delay => {
159
+ clearTimeout(drawTimer);
160
+ drawTimer = setTimeout(() => void redraw(), delay);
161
+ };
162
+ createEffect(on(factor, () => scheduleRedraw(200), {
163
+ defer: true
164
+ }));
165
+ createEffect(on(near, () => scheduleRedraw(0), {
166
+ defer: true
167
+ }));
168
+ // A new document of the same shape keeps the page boxes and the near set, so it draws on its own.
169
+ createEffect(on(doc, () => scheduleRedraw(0), {
170
+ defer: true
171
+ }));
172
+ createEffect(on(() => props.page, () => {
173
+ if (area) area.scrollTop = 0;
174
+ scheduleRedraw(0);
175
+ }, {
176
+ defer: true
177
+ }));
178
+
179
+ /**
180
+ * Zooms to `target` (CSS pixels per point) around a point of the area (pointer, between the fingers, else the
181
+ * centre) that stays where it is. The point counts relative to the page under it, because padding, gaps, and the
182
+ * centring of narrow pages do not grow with the zoom.
183
+ */
184
+ const zoomTo = (target, clientX, clientY) => {
185
+ if (props.zoom === false || !area) return;
186
+ const before = factor();
187
+ const next = Math.min(LARGEST, Math.max(SMALLEST, target / POINT * 100)) / 100 * POINT;
188
+ if (Math.abs(next - before) < 1e-4) return;
189
+ const box = area.getBoundingClientRect();
190
+ const x = clientX ?? box.left + area.clientWidth / 2;
191
+ const y = clientY ?? box.top + area.clientHeight / 2;
192
+ const boxes = [...area.querySelectorAll("[data-pdf-page]")];
193
+ const distance = page => {
194
+ const rect = page.getBoundingClientRect();
195
+ return y < rect.top ? rect.top - y : y > rect.bottom ? y - rect.bottom : 0;
196
+ };
197
+ const anchor = boxes.reduce((best, page) => !best || distance(page) < distance(best) ? page : best, undefined);
198
+ const anchorBefore = anchor?.getBoundingClientRect();
199
+ const relativeX = anchorBefore ? (x - anchorBefore.left) / anchorBefore.width : 0;
200
+ const relativeY = anchorBefore ? (y - anchorBefore.top) / anchorBefore.height : 0;
201
+ batch(() => {
202
+ setFitWidth(false);
203
+ setFixed(next);
204
+ });
205
+ if (!anchor) return;
206
+ const anchorAfter = anchor.getBoundingClientRect();
207
+ area.scrollLeft += anchorAfter.left + relativeX * anchorAfter.width - x;
208
+ area.scrollTop += anchorAfter.top + relativeY * anchorAfter.height - y;
209
+ };
210
+ const step = direction => zoomTo(nextPdfZoomStep(percent(), direction) / 100 * POINT);
211
+ const fit = () => {
212
+ if (!area || fitWidth()) return;
213
+ const before = factor();
214
+ const top = area.scrollTop;
215
+ setFitWidth(true);
216
+ area.scrollLeft = 0;
217
+ area.scrollTop = top * factor() / before;
218
+ };
219
+ onMount(() => {
220
+ if (!area) return;
221
+ const scroller = area;
222
+ setInner(scroller.clientWidth - INSET);
223
+ const resize = new ResizeObserver(() => setInner(scroller.clientWidth - INSET));
224
+ resize.observe(scroller);
225
+ // Pages near the view draw and carry their text; the observer follows every page box as it appears. Without an
226
+ // IntersectionObserver every page counts as near, as MapView does.
227
+ const nearPages = typeof IntersectionObserver === "undefined" ? undefined : new IntersectionObserver(entries => {
228
+ setNear(previous => {
229
+ const next = new Set(previous);
230
+ for (const entry of entries) {
231
+ const index = Number(entry.target.getAttribute("data-pdf-page"));
232
+ if (entry.isIntersecting) next.add(index);else next.delete(index);
233
+ }
234
+ return next;
235
+ });
236
+ }, {
237
+ root: scroller,
238
+ rootMargin: NEAR_MARGIN
239
+ });
240
+ if (!nearPages) createEffect(() => setNear(new Set(shown())));
241
+ // Page boxes come and go with the document and `page`: new ones are observed, removed ones released, so a detached
242
+ // page and its image are never kept alive.
243
+ const observed = new Set();
244
+ const watched = new MutationObserver(() => {
245
+ for (const page of observed) if (!page.isConnected) {
246
+ nearPages?.unobserve(page);
247
+ observed.delete(page);
248
+ }
249
+ for (const page of scroller.querySelectorAll("[data-pdf-page]")) {
250
+ if (observed.has(page)) continue;
251
+ observed.add(page);
252
+ nearPages?.observe(page);
253
+ }
254
+ });
255
+ watched.observe(scroller, {
256
+ childList: true,
257
+ subtree: true
258
+ });
259
+ // The page in the middle of the view is the current one.
260
+ let frame = 0;
261
+ const track = () => {
262
+ cancelAnimationFrame(frame);
263
+ frame = requestAnimationFrame(() => {
264
+ const middle = scroller.getBoundingClientRect().top + scroller.clientHeight / 2;
265
+ for (const page of scroller.querySelectorAll("[data-pdf-page]")) {
266
+ const rect = page.getBoundingClientRect();
267
+ if (rect.bottom >= middle) {
268
+ setCurrent(Number(page.dataset.pdfPage));
269
+ break;
270
+ }
271
+ }
272
+ });
273
+ };
274
+ // Ctrl or ⌘ with the wheel; a trackpad pinch sends the same with Ctrl. Without a key the wheel scrolls as always.
275
+ const wheel = event => {
276
+ if (!(event.ctrlKey || event.metaKey)) return;
277
+ event.preventDefault();
278
+ const delta = Math.max(-120, Math.min(120, event.deltaMode === 1 ? event.deltaY * 16 : event.deltaY));
279
+ zoomTo(factor() * Math.exp(-delta * 0.002), event.clientX, event.clientY);
280
+ };
281
+ // Two fingers on touch; `touch-action: pan-x pan-y` leaves scrolling to the browser but keeps page zoom out.
282
+ let pinch = null;
283
+ const spread = touches => {
284
+ const [a, b] = [touches[0], touches[1]];
285
+ return a && b ? Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY) : 0;
286
+ };
287
+ const touchStart = event => {
288
+ if (event.touches.length === 2) pinch = {
289
+ distance: spread(event.touches) || 1,
290
+ factor: factor()
291
+ };
292
+ };
293
+ const touchMove = event => {
294
+ const [a, b] = [event.touches[0], event.touches[1]];
295
+ if (!pinch || !a || !b) return;
296
+ event.preventDefault();
297
+ zoomTo(pinch.factor * spread(event.touches) / pinch.distance, (a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2);
298
+ };
299
+ const touchEnd = event => {
300
+ if (event.touches.length < 2) pinch = null;
301
+ };
302
+ // Safari on a Mac reports a trackpad pinch as its own gesture (`scale`), not as a wheel.
303
+ let gestureStart = 0;
304
+ const gestureBegin = event => {
305
+ if (pinch) return;
306
+ event.preventDefault();
307
+ gestureStart = factor();
308
+ };
309
+ const gestureChange = event => {
310
+ const scale = Reflect.get(event, "scale");
311
+ if (pinch || !gestureStart || typeof scale !== "number") return;
312
+ event.preventDefault();
313
+ const x = Reflect.get(event, "clientX");
314
+ const y = Reflect.get(event, "clientY");
315
+ zoomTo(gestureStart * scale, typeof x === "number" ? x : undefined, typeof y === "number" ? y : undefined);
316
+ };
317
+ const gestureEnd = () => {
318
+ gestureStart = 0;
319
+ };
320
+ // A selection does not jump across gaps while the layer knows a drag is selecting (its end marker then fills it).
321
+ const selectEnd = () => {
322
+ for (const layer of scroller.querySelectorAll(".k2b-pdf-viewer__text[data-selecting]")) layer.removeAttribute("data-selecting");
323
+ };
324
+ scroller.addEventListener("scroll", track, {
325
+ passive: true
326
+ });
327
+ scroller.addEventListener("wheel", wheel, {
328
+ passive: false
329
+ });
330
+ scroller.addEventListener("touchstart", touchStart, {
331
+ passive: true
332
+ });
333
+ scroller.addEventListener("touchmove", touchMove, {
334
+ passive: false
335
+ });
336
+ scroller.addEventListener("touchend", touchEnd);
337
+ scroller.addEventListener("touchcancel", touchEnd);
338
+ scroller.addEventListener("gesturestart", gestureBegin);
339
+ scroller.addEventListener("gesturechange", gestureChange);
340
+ scroller.addEventListener("gestureend", gestureEnd);
341
+ window.addEventListener("pointerup", selectEnd);
342
+ onCleanup(() => {
343
+ cancelAnimationFrame(frame);
344
+ resize.disconnect();
345
+ nearPages?.disconnect();
346
+ watched.disconnect();
347
+ scroller.removeEventListener("scroll", track);
348
+ scroller.removeEventListener("wheel", wheel);
349
+ scroller.removeEventListener("touchstart", touchStart);
350
+ scroller.removeEventListener("touchmove", touchMove);
351
+ scroller.removeEventListener("touchend", touchEnd);
352
+ scroller.removeEventListener("touchcancel", touchEnd);
353
+ scroller.removeEventListener("gesturestart", gestureBegin);
354
+ scroller.removeEventListener("gesturechange", gestureChange);
355
+ scroller.removeEventListener("gestureend", gestureEnd);
356
+ window.removeEventListener("pointerup", selectEnd);
357
+ });
358
+ });
359
+ return (// Out of keyboard reach until the first page is drawn, so focus never lands on a viewer still being prepared.
360
+ _$ssr(_tmpl$6, `k2b-pdf-viewer ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-drawn", ready() ? "" : _$escape(undefined, true), false), _$ssrAttribute("inert", !ready(), true), _$ssrAttribute("data-fit", fitWidth() ? "" : _$escape(undefined, true), false) + _$ssrAttribute("data-zoom", _$escape(percent(), true), false), _$ssrAttribute("aria-label", _$escape(props.title, true), false), _$escape(_$createComponent(For, {
361
+ get each() {
362
+ return shown();
363
+ },
364
+ children: index => {
365
+ const page = () => pages()[index] ?? {
366
+ width: 1,
367
+ height: 1
368
+ };
369
+ const width = () => pageWidth(page());
370
+ const image = () => images().get(index);
371
+ return _$ssr(_tmpl$7, _$ssrAttribute("data-pdf-page", _$escape(index, true), false), _$ssrStyleProperty("width:", `${_$escape(width(), true)}px`) + _$ssrStyleProperty(";aspect-ratio:", `${_$escape(page().width, true)} / ${_$escape(page().height, true)}`) + _$ssrStyleProperty(";--total-scale-factor:", _$escape(String(width() / page().width), true)), _$escape(_$createComponent(Show, {
372
+ get when() {
373
+ return image();
374
+ },
375
+ children: drawn => _$ssr(_tmpl$8, _$ssrAttribute("src", _$escape(drawn().url, true), false) + _$ssrAttribute("width", _$escape(drawn().width, true), false) + _$ssrAttribute("height", _$escape(drawn().height, true), false), `${_$escape(props.title, true)}: ${_$escape(messages().pdfPage({
376
+ number: index + 1,
377
+ total: pages().length
378
+ }), true)}`)
379
+ })), _$escape(_$createComponent(Show, {
380
+ get when() {
381
+ return _$memo(() => !!near().has(index))() && doc();
382
+ },
383
+ keyed: true,
384
+ children: handle => _$createComponent(PdfTextLayer, {
385
+ document: handle,
386
+ index: index
387
+ })
388
+ })));
389
+ }
390
+ })), _$escape(_$createComponent(Show, {
391
+ get when() {
392
+ return _$memo(() => props.zoom !== false)() && doc();
393
+ },
394
+ get children() {
395
+ return _$ssr(_tmpl$5, _$escape(_$createComponent(Toolbar, {
396
+ get label() {
397
+ return messages().pdfZoom;
398
+ },
399
+ get children() {
400
+ return [_$createComponent(Show, {
401
+ get when() {
402
+ return _$memo(() => props.page === undefined)() && pages().length > 1;
403
+ },
404
+ get children() {
405
+ return [_$createComponent(Toolbar.Label, {
406
+ "class": "k2b-pdf-viewer__page-number",
407
+ get children() {
408
+ return [_$ssr(_tmpl$, _$escape(messages().pdfPage({
409
+ number: current() + 1,
410
+ total: pages().length
411
+ }))), _$ssr(_tmpl$2, _$escape(messages().pdfPageShort({
412
+ number: current() + 1,
413
+ total: pages().length
414
+ })))];
415
+ }
416
+ }), _$createComponent(Toolbar.Separator, {})];
417
+ }
418
+ }), _$createComponent(Toolbar.Action, {
419
+ get label() {
420
+ return messages().pdfZoomOut;
421
+ },
422
+ icon: "ti ti-minus",
423
+ get disabled() {
424
+ return percent() <= SMALLEST;
425
+ },
426
+ onClick: () => step(-1)
427
+ }), _$createComponent(Toolbar.Label, {
428
+ "class": "k2b-pdf-viewer__percent",
429
+ get children() {
430
+ return _$ssr(_tmpl$3, _$escape(messages().pdfZoomPercent({
431
+ value: percent()
432
+ })));
433
+ }
434
+ }), _$createComponent(Toolbar.Action, {
435
+ get label() {
436
+ return messages().pdfZoomIn;
437
+ },
438
+ icon: "ti ti-plus",
439
+ get disabled() {
440
+ return percent() >= LARGEST;
441
+ },
442
+ onClick: () => step(1)
443
+ }), _$createComponent(Toolbar.Separator, {}), _$createComponent(Button, {
444
+ variant: "ghost",
445
+ type: "button",
446
+ get ["aria-pressed"]() {
447
+ return fitWidth();
448
+ },
449
+ get ["aria-label"]() {
450
+ return messages().pdfFitWidthLabel;
451
+ },
452
+ get title() {
453
+ return messages().pdfFitWidthLabel;
454
+ },
455
+ onClick: fit,
456
+ get children() {
457
+ return [_$ssr(_tmpl$4), " ", messages().pdfFitWidth];
458
+ }
459
+ })];
460
+ }
461
+ })));
462
+ }
463
+ })))
464
+ );
465
+ }
466
+
467
+ /** One page's text layer; pdf.js builds it once, and zoom changes only `--total-scale-factor` on the page. */
468
+ function PdfTextLayer(props) {
469
+ let layer;
470
+ onMount(() => {
471
+ if (!layer) return;
472
+ const container = layer;
473
+ const abort = new AbortController();
474
+ onCleanup(() => abort.abort());
475
+ void props.document.textLayer(props.index, container, abort.signal).then(() => {
476
+ if (abort.signal.aborted) return;
477
+ const end = document.createElement("div");
478
+ end.className = "k2b-pdf-viewer__text-end";
479
+ container.append(end);
480
+ }, () => undefined);
481
+ });
482
+ return _$ssr(_tmpl$9);
483
+ }
484
+ //# sourceMappingURL=PdfViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/PdfViewer.tsx"],"sourcesContent":["import { batch, createEffect, createMemo, createSignal, For, type JSX, on, onCleanup, onMount, Show } from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Toolbar } from \"../actions/Toolbar\";\nimport { openPdfDocument, type PdfDocumentHandle, type PdfPageImage, type PdfPageSize, pageImageWidth } from \"./pdf-document\";\nimport { usePdfMessages } from \"./pdf-messages\";\n\nexport type PdfViewerProps = {\n /** The PDF itself. A new value opens that document. */\n data: Blob | ArrayBuffer;\n /** The document's name, for the scroll area and the page images. */\n title: string;\n /** Without the zoom bar, always fit to the width. Defaults to `true`. */\n zoom?: boolean;\n /** Shows only this page (zero-based) instead of all pages one below the other. */\n page?: number;\n /** The first visible page is drawn; a host can drop its loading state. */\n onReady?: () => void;\n /** The document could not be opened, or a page could not be drawn and has no image yet. */\n onError?: (error: unknown) => void;\n class?: string;\n};\n\n/** CSS pixels per PDF point at 100 %: 96 dpi on screen, 72 points per inch. */\nconst POINT = 96 / 72;\n/** Steps for − and + in percent; Ctrl or ⌘ with the wheel and two fingers zoom freely between the first and the last. */\nexport const PDF_ZOOM_STEPS = [25, 50, 75, 100, 125, 150, 200, 300] as const;\nconst SMALLEST = PDF_ZOOM_STEPS[0];\nconst LARGEST = PDF_ZOOM_STEPS[PDF_ZOOM_STEPS.length - 1] ?? 300;\n/** Horizontal padding of the page stack, both sides together. */\nconst INSET = 24;\n/** Pages within this distance of the view draw; farther ones keep only their box. */\nconst NEAR_MARGIN = \"150% 0px\";\n/** At most this many drawn pages stay in memory; the ones out of view are released first. */\nconst KEPT_IMAGES = 24;\n\n/** The next zoom step above or below `percent`; at either end it stays there. */\nexport const nextPdfZoomStep = (percent: number, direction: 1 | -1): number =>\n direction === 1\n ? (PDF_ZOOM_STEPS.find((step) => step > percent + 0.5) ?? LARGEST)\n : ([...PDF_ZOOM_STEPS].reverse().find((step) => step < percent - 0.5) ?? SMALLEST);\n\n/**\n * The page width most pages share, at a tie the first page's. \"Width\" fits every page to the area, so a landscape page\n * among portrait ones never scrolls sideways; percentages and fixed zoom follow this common width.\n */\nexport const commonPageWidth = (pages: readonly PdfPageSize[]): number => {\n const counts = new Map<number, number>();\n for (const page of pages) counts.set(Math.round(page.width), (counts.get(Math.round(page.width)) ?? 0) + 1);\n let best = Math.round(pages[0]?.width ?? 1);\n let most = 0;\n for (const [width, count] of counts)\n if (count > most) {\n best = width;\n most = count;\n }\n return Math.max(1, best);\n};\n\n/**\n * A PDF drawn by pdf.js in every browser: pages as images in one scroll area, an invisible text layer over each page\n * to select, copy, and find text, and a small zoom bar. Only pages near the view are drawn and carry text; the others\n * keep their size, so the scroll bar is right from the start. Printing and forms stay with the browser's own viewer.\n */\nexport default function PdfViewer(props: PdfViewerProps): JSX.Element {\n const messages = usePdfMessages();\n const [doc, setDoc] = createSignal<PdfDocumentHandle | null>(null);\n const pages = (): readonly PdfPageSize[] => doc()?.pages ?? [];\n const shown = () =>\n props.page === undefined ? pages().map((_, index) => index) : [props.page].filter((index) => index < pages().length);\n const [images, setImages] = createSignal<ReadonlyMap<number, PdfPageImage>>(new Map());\n const [near, setNear] = createSignal<ReadonlySet<number>>(new Set());\n const [fitWidth, setFitWidth] = createSignal(true);\n const [fixed, setFixed] = createSignal(POINT);\n const [inner, setInner] = createSignal(0);\n const [current, setCurrent] = createSignal(0);\n const [ready, setReady] = createSignal(false);\n let area: HTMLDivElement | undefined;\n let drawRun: AbortController | undefined;\n let drawTimer: ReturnType<typeof setTimeout> | undefined;\n let gone = false;\n\n const releaseAll = () => {\n for (const image of images().values()) URL.revokeObjectURL(image.url);\n setImages(new Map());\n };\n\n // Opening: a new `data` opens a new document and closes the previous one.\n createEffect(\n on(\n () => props.data,\n (data) => {\n const opening = new AbortController();\n let opened: PdfDocumentHandle | null = null;\n onCleanup(() => {\n opening.abort();\n drawRun?.abort();\n releaseAll();\n void opened?.close();\n });\n setReady(false);\n void openPdfDocument(data, opening.signal).then(\n (handle) => {\n if (!handle || opening.signal.aborted) return void handle?.close();\n opened = handle;\n // A document without pages has nothing to draw; the host shows its fallback instead of waiting forever.\n if (handle.pages.length === 0) return void props.onError?.(new Error(\"The PDF has no pages\"));\n setDoc(handle);\n },\n (error: unknown) => {\n if (!opening.signal.aborted) props.onError?.(error);\n },\n );\n },\n ),\n );\n onCleanup(() => {\n gone = true;\n clearTimeout(drawTimer);\n });\n\n const commonWidth = createMemo(() => commonPageWidth(pages()));\n const areaWidth = () => Math.max(120, inner());\n /** CSS pixels per point of the common page width; percent, steps, and fixed zoom follow from it. */\n const factor = () => (fitWidth() ? areaWidth() / commonWidth() : fixed());\n const percent = () => Math.round((factor() / POINT) * 100);\n const pageWidth = (page: PdfPageSize) => Math.max(1, Math.floor(fitWidth() ? areaWidth() : page.width * fixed()));\n\n /**\n * Draws each near page whose image is too small (blurred) or far too large (memory) for its shown size. A new zoom or\n * scroll aborts and continues. A page that fails keeps its old image; without one, `onError` reports it.\n */\n const redraw = async () => {\n drawRun?.abort();\n const run = new AbortController();\n drawRun = run;\n const handle = doc();\n if (!handle) return;\n const order = shown().filter((index) => near().has(index));\n for (const index of order) {\n const page = pages()[index];\n if (!page) continue;\n const target = pageImageWidth(pageWidth(page), window.devicePixelRatio, page.height / page.width);\n const existing = images().get(index);\n if (existing && target <= existing.width * 1.15 && target >= existing.width * 0.5) continue;\n const image = await handle.draw(index, target, run.signal).catch(() => \"failed\" as const);\n if (run.signal.aborted || gone || doc() !== handle) {\n if (image && image !== \"failed\") URL.revokeObjectURL(image.url);\n return;\n }\n if (image === \"failed\" || !image) {\n if (existing) continue;\n props.onError?.(new Error(`Page ${index + 1} could not be drawn`));\n return;\n }\n setImages((previous) => {\n const next = new Map(previous);\n next.set(index, image);\n // Keep memory bounded: release drawn pages out of view, oldest first, past the limit.\n for (const key of next.keys()) {\n if (next.size <= KEPT_IMAGES) break;\n if (near().has(key)) continue;\n const released = next.get(key);\n if (released) URL.revokeObjectURL(released.url);\n next.delete(key);\n }\n return next;\n });\n if (existing) URL.revokeObjectURL(existing.url);\n if (!ready()) {\n setReady(true);\n props.onReady?.();\n }\n }\n };\n const scheduleRedraw = (delay: number) => {\n clearTimeout(drawTimer);\n drawTimer = setTimeout(() => void redraw(), delay);\n };\n createEffect(on(factor, () => scheduleRedraw(200), { defer: true }));\n createEffect(on(near, () => scheduleRedraw(0), { defer: true }));\n // A new document of the same shape keeps the page boxes and the near set, so it draws on its own.\n createEffect(on(doc, () => scheduleRedraw(0), { defer: true }));\n createEffect(\n on(\n () => props.page,\n () => {\n if (area) area.scrollTop = 0;\n scheduleRedraw(0);\n },\n { defer: true },\n ),\n );\n\n /**\n * Zooms to `target` (CSS pixels per point) around a point of the area (pointer, between the fingers, else the\n * centre) that stays where it is. The point counts relative to the page under it, because padding, gaps, and the\n * centring of narrow pages do not grow with the zoom.\n */\n const zoomTo = (target: number, clientX?: number, clientY?: number) => {\n if (props.zoom === false || !area) return;\n const before = factor();\n const next = (Math.min(LARGEST, Math.max(SMALLEST, (target / POINT) * 100)) / 100) * POINT;\n if (Math.abs(next - before) < 1e-4) return;\n const box = area.getBoundingClientRect();\n const x = clientX ?? box.left + area.clientWidth / 2;\n const y = clientY ?? box.top + area.clientHeight / 2;\n const boxes = [...area.querySelectorAll<HTMLElement>(\"[data-pdf-page]\")];\n const distance = (page: HTMLElement) => {\n const rect = page.getBoundingClientRect();\n return y < rect.top ? rect.top - y : y > rect.bottom ? y - rect.bottom : 0;\n };\n const anchor = boxes.reduce<HTMLElement | undefined>(\n (best, page) => (!best || distance(page) < distance(best) ? page : best),\n undefined,\n );\n const anchorBefore = anchor?.getBoundingClientRect();\n const relativeX = anchorBefore ? (x - anchorBefore.left) / anchorBefore.width : 0;\n const relativeY = anchorBefore ? (y - anchorBefore.top) / anchorBefore.height : 0;\n batch(() => {\n setFitWidth(false);\n setFixed(next);\n });\n if (!anchor) return;\n const anchorAfter = anchor.getBoundingClientRect();\n area.scrollLeft += anchorAfter.left + relativeX * anchorAfter.width - x;\n area.scrollTop += anchorAfter.top + relativeY * anchorAfter.height - y;\n };\n const step = (direction: 1 | -1) => zoomTo((nextPdfZoomStep(percent(), direction) / 100) * POINT);\n const fit = () => {\n if (!area || fitWidth()) return;\n const before = factor();\n const top = area.scrollTop;\n setFitWidth(true);\n area.scrollLeft = 0;\n area.scrollTop = (top * factor()) / before;\n };\n\n onMount(() => {\n if (!area) return;\n const scroller = area;\n setInner(scroller.clientWidth - INSET);\n const resize = new ResizeObserver(() => setInner(scroller.clientWidth - INSET));\n resize.observe(scroller);\n // Pages near the view draw and carry their text; the observer follows every page box as it appears. Without an\n // IntersectionObserver every page counts as near, as MapView does.\n const nearPages =\n typeof IntersectionObserver === \"undefined\"\n ? undefined\n : new IntersectionObserver(\n (entries) => {\n setNear((previous) => {\n const next = new Set(previous);\n for (const entry of entries) {\n const index = Number(entry.target.getAttribute(\"data-pdf-page\"));\n if (entry.isIntersecting) next.add(index);\n else next.delete(index);\n }\n return next;\n });\n },\n { root: scroller, rootMargin: NEAR_MARGIN },\n );\n if (!nearPages) createEffect(() => setNear(new Set(shown())));\n // Page boxes come and go with the document and `page`: new ones are observed, removed ones released, so a detached\n // page and its image are never kept alive.\n const observed = new Set<HTMLElement>();\n const watched = new MutationObserver(() => {\n for (const page of observed)\n if (!page.isConnected) {\n nearPages?.unobserve(page);\n observed.delete(page);\n }\n for (const page of scroller.querySelectorAll<HTMLElement>(\"[data-pdf-page]\")) {\n if (observed.has(page)) continue;\n observed.add(page);\n nearPages?.observe(page);\n }\n });\n watched.observe(scroller, { childList: true, subtree: true });\n // The page in the middle of the view is the current one.\n let frame = 0;\n const track = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const middle = scroller.getBoundingClientRect().top + scroller.clientHeight / 2;\n for (const page of scroller.querySelectorAll<HTMLElement>(\"[data-pdf-page]\")) {\n const rect = page.getBoundingClientRect();\n if (rect.bottom >= middle) {\n setCurrent(Number(page.dataset.pdfPage));\n break;\n }\n }\n });\n };\n // Ctrl or ⌘ with the wheel; a trackpad pinch sends the same with Ctrl. Without a key the wheel scrolls as always.\n const wheel = (event: WheelEvent) => {\n if (!(event.ctrlKey || event.metaKey)) return;\n event.preventDefault();\n const delta = Math.max(-120, Math.min(120, event.deltaMode === 1 ? event.deltaY * 16 : event.deltaY));\n zoomTo(factor() * Math.exp(-delta * 0.002), event.clientX, event.clientY);\n };\n // Two fingers on touch; `touch-action: pan-x pan-y` leaves scrolling to the browser but keeps page zoom out.\n let pinch: { distance: number; factor: number } | null = null;\n const spread = (touches: TouchList) => {\n const [a, b] = [touches[0], touches[1]];\n return a && b ? Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY) : 0;\n };\n const touchStart = (event: TouchEvent) => {\n if (event.touches.length === 2) pinch = { distance: spread(event.touches) || 1, factor: factor() };\n };\n const touchMove = (event: TouchEvent) => {\n const [a, b] = [event.touches[0], event.touches[1]];\n if (!pinch || !a || !b) return;\n event.preventDefault();\n zoomTo((pinch.factor * spread(event.touches)) / pinch.distance, (a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2);\n };\n const touchEnd = (event: TouchEvent) => {\n if (event.touches.length < 2) pinch = null;\n };\n // Safari on a Mac reports a trackpad pinch as its own gesture (`scale`), not as a wheel.\n let gestureStart = 0;\n const gestureBegin = (event: Event) => {\n if (pinch) return;\n event.preventDefault();\n gestureStart = factor();\n };\n const gestureChange = (event: Event) => {\n const scale: unknown = Reflect.get(event, \"scale\");\n if (pinch || !gestureStart || typeof scale !== \"number\") return;\n event.preventDefault();\n const x: unknown = Reflect.get(event, \"clientX\");\n const y: unknown = Reflect.get(event, \"clientY\");\n zoomTo(gestureStart * scale, typeof x === \"number\" ? x : undefined, typeof y === \"number\" ? y : undefined);\n };\n const gestureEnd = () => {\n gestureStart = 0;\n };\n // A selection does not jump across gaps while the layer knows a drag is selecting (its end marker then fills it).\n const selectEnd = () => {\n for (const layer of scroller.querySelectorAll(\".k2b-pdf-viewer__text[data-selecting]\")) layer.removeAttribute(\"data-selecting\");\n };\n scroller.addEventListener(\"scroll\", track, { passive: true });\n scroller.addEventListener(\"wheel\", wheel, { passive: false });\n scroller.addEventListener(\"touchstart\", touchStart, { passive: true });\n scroller.addEventListener(\"touchmove\", touchMove, { passive: false });\n scroller.addEventListener(\"touchend\", touchEnd);\n scroller.addEventListener(\"touchcancel\", touchEnd);\n scroller.addEventListener(\"gesturestart\", gestureBegin);\n scroller.addEventListener(\"gesturechange\", gestureChange);\n scroller.addEventListener(\"gestureend\", gestureEnd);\n window.addEventListener(\"pointerup\", selectEnd);\n onCleanup(() => {\n cancelAnimationFrame(frame);\n resize.disconnect();\n nearPages?.disconnect();\n watched.disconnect();\n scroller.removeEventListener(\"scroll\", track);\n scroller.removeEventListener(\"wheel\", wheel);\n scroller.removeEventListener(\"touchstart\", touchStart);\n scroller.removeEventListener(\"touchmove\", touchMove);\n scroller.removeEventListener(\"touchend\", touchEnd);\n scroller.removeEventListener(\"touchcancel\", touchEnd);\n scroller.removeEventListener(\"gesturestart\", gestureBegin);\n scroller.removeEventListener(\"gesturechange\", gestureChange);\n scroller.removeEventListener(\"gestureend\", gestureEnd);\n window.removeEventListener(\"pointerup\", selectEnd);\n });\n });\n\n return (\n // Out of keyboard reach until the first page is drawn, so focus never lands on a viewer still being prepared.\n <div class={`k2b-pdf-viewer ${props.class ?? \"\"}`} data-drawn={ready() ? \"\" : undefined} inert={!ready()}>\n {/* One scroll area: fitted to the width it scrolls only down, zoomed the same area also scrolls sideways. */}\n <div\n ref={area}\n class=\"k2b-pdf-viewer__pages\"\n data-fit={fitWidth() ? \"\" : undefined}\n data-zoom={percent()}\n tabIndex={0}\n role=\"document\"\n aria-label={props.title}\n >\n <div class=\"k2b-pdf-viewer__stack\">\n <For each={shown()}>\n {(index) => {\n const page = () => pages()[index] ?? { width: 1, height: 1 };\n const width = () => pageWidth(page());\n const image = () => images().get(index);\n return (\n <div\n class=\"k2b-pdf-viewer__page\"\n data-pdf-page={index}\n style={{\n width: `${width()}px`,\n \"aspect-ratio\": `${page().width} / ${page().height}`,\n \"--total-scale-factor\": String(width() / page().width),\n }}\n >\n <Show when={image()}>\n {(drawn) => (\n <img\n src={drawn().url}\n width={drawn().width}\n height={drawn().height}\n draggable={false}\n alt={`${props.title}: ${messages().pdfPage({ number: index + 1, total: pages().length })}`}\n />\n )}\n </Show>\n <Show when={near().has(index) && doc()} keyed>\n {(handle) => <PdfTextLayer document={handle} index={index} />}\n </Show>\n </div>\n );\n }}\n </For>\n </div>\n </div>\n <Show when={props.zoom !== false && doc()}>\n <div class=\"k2b-pdf-viewer__bar\">\n <Toolbar label={messages().pdfZoom}>\n <Show when={props.page === undefined && pages().length > 1}>\n <Toolbar.Label class=\"k2b-pdf-viewer__page-number\">\n <span class=\"k2b-sr-only\">{messages().pdfPage({ number: current() + 1, total: pages().length })}</span>\n <span aria-hidden=\"true\">{messages().pdfPageShort({ number: current() + 1, total: pages().length })}</span>\n </Toolbar.Label>\n <Toolbar.Separator />\n </Show>\n <Toolbar.Action label={messages().pdfZoomOut} icon=\"ti ti-minus\" disabled={percent() <= SMALLEST} onClick={() => step(-1)} />\n <Toolbar.Label class=\"k2b-pdf-viewer__percent\">\n <span aria-live=\"polite\">{messages().pdfZoomPercent({ value: percent() })}</span>\n </Toolbar.Label>\n <Toolbar.Action label={messages().pdfZoomIn} icon=\"ti ti-plus\" disabled={percent() >= LARGEST} onClick={() => step(1)} />\n <Toolbar.Separator />\n <Button\n variant=\"ghost\"\n type=\"button\"\n aria-pressed={fitWidth()}\n aria-label={messages().pdfFitWidthLabel}\n title={messages().pdfFitWidthLabel}\n onClick={fit}\n >\n <i class=\"ti ti-arrows-horizontal\" aria-hidden=\"true\" /> {messages().pdfFitWidth}\n </Button>\n </Toolbar>\n </div>\n </Show>\n </div>\n );\n}\n\n/** One page's text layer; pdf.js builds it once, and zoom changes only `--total-scale-factor` on the page. */\nfunction PdfTextLayer(props: { document: PdfDocumentHandle; index: number }): JSX.Element {\n let layer: HTMLDivElement | undefined;\n onMount(() => {\n if (!layer) return;\n const container = layer;\n const abort = new AbortController();\n onCleanup(() => abort.abort());\n void props.document.textLayer(props.index, container, abort.signal).then(\n () => {\n if (abort.signal.aborted) return;\n const end = document.createElement(\"div\");\n end.className = \"k2b-pdf-viewer__text-end\";\n container.append(end);\n },\n () => undefined,\n );\n });\n return <div ref={layer} class=\"k2b-pdf-viewer__text\" onPointerDown={() => layer?.setAttribute(\"data-selecting\", \"\")} />;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const balanceSummaryMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ start: "Start",
8
+ end: "End",
9
+ in: "in",
10
+ out: "out"
11
+ },
12
+ de: {
13
+ start: "Anfang",
14
+ end: "Ende",
15
+ in: "rein",
16
+ out: "raus"
17
+ }
18
+ }
19
+ });
20
+ /** Resolved from an explicit locale override, else the inherited render locale. */
21
+ export const useBalanceSummaryMessages = override => {
22
+ const locale = useLocale();
23
+ return () => balanceSummaryMessages.resolve([override?.() ?? locale()]).t;
24
+ };
25
+ export const checkBalanceSummaryMessages = () => balanceSummaryMessages.check();
26
+ //# sourceMappingURL=balance-summary-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/balance-summary-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst balanceSummaryMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: { start: \"Start\", end: \"End\", in: \"in\", out: \"out\" },\n de: { start: \"Anfang\", end: \"Ende\", in: \"rein\", out: \"raus\" },\n },\n});\n\nexport type BalanceSummaryMessages = ReturnType<(typeof balanceSummaryMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from an explicit locale override, else the inherited render locale. */\nexport const useBalanceSummaryMessages = (override?: () => string | undefined): (() => BalanceSummaryMessages) => {\n const locale = useLocale();\n return () => balanceSummaryMessages.resolve([override?.() ?? locale()]).t;\n};\n\nexport const checkBalanceSummaryMessages = () => balanceSummaryMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC;EACzC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MAAE,KAAK,EAAE,OAAO;MAAE,GAAG,EAAE,KAAK;MAAE,EAAE,EAAE,IAAI;MAAE,GAAG,EAAE;IAAM,CAAC;IACxD,EAAE,EAAE;MAAE,KAAK,EAAE,QAAQ;MAAE,GAAG,EAAE,MAAM;MAAE,EAAE,EAAE,MAAM;MAAE,GAAG,EAAE;IAAO;EAC9D;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,yBAAyB,GAAI,QAAmC,IAAqC;EAChH,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,OAAO,MAAM,2BAA2B,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}