@k2b/ui 0.50.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 (294) hide show
  1. package/dist/base.css +32 -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/command-dock.js +47 -0
  10. package/dist/browser/actions/command-dock.js.map +1 -0
  11. package/dist/browser/actions/command-items.js +84 -0
  12. package/dist/browser/actions/command-items.js.map +1 -0
  13. package/dist/browser/actions/command-messages.js +42 -0
  14. package/dist/browser/actions/command-messages.js.map +1 -0
  15. package/dist/browser/actions/index.js +1 -0
  16. package/dist/browser/actions/index.js.map +1 -1
  17. package/dist/browser/charts/core/area.js +3 -5
  18. package/dist/browser/charts/core/area.js.map +1 -1
  19. package/dist/browser/charts/core/calendar.js +1 -1
  20. package/dist/browser/charts/core/calendar.js.map +1 -1
  21. package/dist/browser/charts/core/chart-messages.js +17 -0
  22. package/dist/browser/charts/core/chart-messages.js.map +1 -0
  23. package/dist/browser/charts/core/hbar-layout.js +118 -0
  24. package/dist/browser/charts/core/hbar-layout.js.map +1 -0
  25. package/dist/browser/charts/core/hbar.js +39 -0
  26. package/dist/browser/charts/core/hbar.js.map +1 -0
  27. package/dist/browser/charts/core/index.js +7 -2
  28. package/dist/browser/charts/core/index.js.map +1 -1
  29. package/dist/browser/charts/core/map.js +116 -0
  30. package/dist/browser/charts/core/map.js.map +1 -0
  31. package/dist/browser/charts/core/registry.js +22 -15
  32. package/dist/browser/charts/core/registry.js.map +1 -1
  33. package/dist/browser/charts/core/render-size.js +13 -0
  34. package/dist/browser/charts/core/render-size.js.map +1 -0
  35. package/dist/browser/charts/core/render.js +20 -10
  36. package/dist/browser/charts/core/render.js.map +1 -1
  37. package/dist/browser/charts/core/snapshot.js +3 -3
  38. package/dist/browser/charts/core/snapshot.js.map +1 -1
  39. package/dist/browser/charts/core/svg-renderers.js +2406 -0
  40. package/dist/browser/charts/core/svg-renderers.js.map +1 -0
  41. package/dist/browser/charts/core/svg.js +4 -2525
  42. package/dist/browser/charts/core/svg.js.map +1 -1
  43. package/dist/browser/charts/core/types.js +0 -2
  44. package/dist/browser/charts/core/types.js.map +1 -1
  45. package/dist/browser/charts/core/waterfall.js +162 -0
  46. package/dist/browser/charts/core/waterfall.js.map +1 -0
  47. package/dist/browser/charts/description.js +2 -0
  48. package/dist/browser/charts/description.js.map +1 -0
  49. package/dist/browser/charts.js.map +1 -1
  50. package/dist/browser/content/Chart.js +14 -628
  51. package/dist/browser/content/Chart.js.map +1 -1
  52. package/dist/browser/content/ChartRoot.js +632 -0
  53. package/dist/browser/content/ChartRoot.js.map +1 -0
  54. package/dist/browser/content/ChartSparkline.js +24 -0
  55. package/dist/browser/content/ChartSparkline.js.map +1 -0
  56. package/dist/browser/content/FileView.js +111 -61
  57. package/dist/browser/content/FileView.js.map +1 -1
  58. package/dist/browser/content/Lightbox.js +8 -8
  59. package/dist/browser/content/Lightbox.js.map +1 -1
  60. package/dist/browser/content/MapView.js +30 -28
  61. package/dist/browser/content/MapView.js.map +1 -1
  62. package/dist/browser/content/PdfPreview.js +84 -52
  63. package/dist/browser/content/PdfPreview.js.map +1 -1
  64. package/dist/browser/content/PdfViewer.js +588 -0
  65. package/dist/browser/content/PdfViewer.js.map +1 -0
  66. package/dist/browser/content/chart-bar.js +246 -16
  67. package/dist/browser/content/chart-bar.js.map +1 -1
  68. package/dist/browser/content/chart-inspection-core.js +22 -21
  69. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  70. package/dist/browser/content/chart-line-gaps.js +1 -1
  71. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  72. package/dist/browser/content/chart-message-catalog.js +10 -0
  73. package/dist/browser/content/chart-message-catalog.js.map +1 -1
  74. package/dist/browser/content/chart-state-timeline.js +1 -1
  75. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  76. package/dist/browser/content/chart-svg.js +2 -1
  77. package/dist/browser/content/chart-svg.js.map +1 -1
  78. package/dist/browser/content/index.js +1 -0
  79. package/dist/browser/content/index.js.map +1 -1
  80. package/dist/browser/content/pdf-document.js +29 -0
  81. package/dist/browser/content/pdf-document.js.map +1 -0
  82. package/dist/browser/content/pdf-limits.js +31 -0
  83. package/dist/browser/content/pdf-limits.js.map +1 -0
  84. package/dist/browser/content/pdf-messages.js +34 -2
  85. package/dist/browser/content/pdf-messages.js.map +1 -1
  86. package/dist/browser/content/pdf-viewer-engine.js +57 -0
  87. package/dist/browser/content/pdf-viewer-worker.js +28 -0
  88. package/dist/browser/inputs/ChoiceInputs.js +94 -51
  89. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  90. package/dist/browser/inputs/ChoiceSlider.js +75 -58
  91. package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
  92. package/dist/browser/inputs/DatePicker.js +113 -98
  93. package/dist/browser/inputs/DatePicker.js.map +1 -1
  94. package/dist/browser/inputs/PeriodPicker.js +874 -0
  95. package/dist/browser/inputs/PeriodPicker.js.map +1 -0
  96. package/dist/browser/inputs/index.js +4 -1
  97. package/dist/browser/inputs/index.js.map +1 -1
  98. package/dist/browser/inputs/input-messages.js +8 -2
  99. package/dist/browser/inputs/input-messages.js.map +1 -1
  100. package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
  101. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  102. package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
  103. package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
  104. package/dist/browser/inputs/period-picker-messages.js +71 -0
  105. package/dist/browser/inputs/period-picker-messages.js.map +1 -0
  106. package/dist/browser/inputs/period.js +263 -0
  107. package/dist/browser/inputs/period.js.map +1 -0
  108. package/dist/browser/layout/DetailPanel.js +147 -120
  109. package/dist/browser/layout/DetailPanel.js.map +1 -1
  110. package/dist/browser/layout/Discussion.js +101 -108
  111. package/dist/browser/layout/Discussion.js.map +1 -1
  112. package/dist/browser/layout/index.js.map +1 -1
  113. package/dist/browser/surfaces/DescriptionList.js +5 -2
  114. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  115. package/dist/browser/surfaces/StatCell.js +19 -14
  116. package/dist/browser/surfaces/StatCell.js.map +1 -1
  117. package/dist/browser/surfaces/delta-badge.js +16 -2
  118. package/dist/browser/surfaces/delta-badge.js.map +1 -1
  119. package/dist/browser/widgets/DashboardFrame.js +310 -0
  120. package/dist/browser/widgets/DashboardFrame.js.map +1 -0
  121. package/dist/browser/widgets/index.js +1 -0
  122. package/dist/browser/widgets/index.js.map +1 -1
  123. package/dist/licenses/pdfjs-dist.txt +177 -0
  124. package/dist/ssr/actions/Button.js.map +1 -1
  125. package/dist/ssr/actions/CommandList.js +638 -0
  126. package/dist/ssr/actions/CommandList.js.map +1 -0
  127. package/dist/ssr/actions/CommandMenu.js +197 -0
  128. package/dist/ssr/actions/CommandMenu.js.map +1 -0
  129. package/dist/ssr/actions/Dropdown.js +43 -10
  130. package/dist/ssr/actions/Dropdown.js.map +1 -1
  131. package/dist/ssr/actions/command-dock.js +47 -0
  132. package/dist/ssr/actions/command-dock.js.map +1 -0
  133. package/dist/ssr/actions/command-items.js +84 -0
  134. package/dist/ssr/actions/command-items.js.map +1 -0
  135. package/dist/ssr/actions/command-messages.js +42 -0
  136. package/dist/ssr/actions/command-messages.js.map +1 -0
  137. package/dist/ssr/actions/index.js +1 -0
  138. package/dist/ssr/actions/index.js.map +1 -1
  139. package/dist/ssr/charts/core/area.js +3 -5
  140. package/dist/ssr/charts/core/area.js.map +1 -1
  141. package/dist/ssr/charts/core/calendar.js +1 -1
  142. package/dist/ssr/charts/core/calendar.js.map +1 -1
  143. package/dist/ssr/charts/core/chart-messages.js +17 -0
  144. package/dist/ssr/charts/core/chart-messages.js.map +1 -0
  145. package/dist/ssr/charts/core/hbar-layout.js +118 -0
  146. package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
  147. package/dist/ssr/charts/core/hbar.js +39 -0
  148. package/dist/ssr/charts/core/hbar.js.map +1 -0
  149. package/dist/ssr/charts/core/index.js +7 -2
  150. package/dist/ssr/charts/core/index.js.map +1 -1
  151. package/dist/ssr/charts/core/map.js +116 -0
  152. package/dist/ssr/charts/core/map.js.map +1 -0
  153. package/dist/ssr/charts/core/registry.js +22 -15
  154. package/dist/ssr/charts/core/registry.js.map +1 -1
  155. package/dist/ssr/charts/core/render-size.js +13 -0
  156. package/dist/ssr/charts/core/render-size.js.map +1 -0
  157. package/dist/ssr/charts/core/render.js +20 -10
  158. package/dist/ssr/charts/core/render.js.map +1 -1
  159. package/dist/ssr/charts/core/snapshot.js +3 -3
  160. package/dist/ssr/charts/core/snapshot.js.map +1 -1
  161. package/dist/ssr/charts/core/svg-renderers.js +2406 -0
  162. package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
  163. package/dist/ssr/charts/core/svg.js +4 -2525
  164. package/dist/ssr/charts/core/svg.js.map +1 -1
  165. package/dist/ssr/charts/core/types.js +0 -2
  166. package/dist/ssr/charts/core/types.js.map +1 -1
  167. package/dist/ssr/charts/core/waterfall.js +162 -0
  168. package/dist/ssr/charts/core/waterfall.js.map +1 -0
  169. package/dist/ssr/charts/description.js +2 -0
  170. package/dist/ssr/charts/description.js.map +1 -0
  171. package/dist/ssr/charts.js.map +1 -1
  172. package/dist/ssr/content/Chart.js +14 -471
  173. package/dist/ssr/content/Chart.js.map +1 -1
  174. package/dist/ssr/content/ChartRoot.js +475 -0
  175. package/dist/ssr/content/ChartRoot.js.map +1 -0
  176. package/dist/ssr/content/ChartSparkline.js +24 -0
  177. package/dist/ssr/content/ChartSparkline.js.map +1 -0
  178. package/dist/ssr/content/FileView.js +56 -7
  179. package/dist/ssr/content/FileView.js.map +1 -1
  180. package/dist/ssr/content/Lightbox.js +8 -8
  181. package/dist/ssr/content/Lightbox.js.map +1 -1
  182. package/dist/ssr/content/MapView.js +9 -9
  183. package/dist/ssr/content/MapView.js.map +1 -1
  184. package/dist/ssr/content/PdfPreview.js +49 -20
  185. package/dist/ssr/content/PdfPreview.js.map +1 -1
  186. package/dist/ssr/content/PdfViewer.js +484 -0
  187. package/dist/ssr/content/PdfViewer.js.map +1 -0
  188. package/dist/ssr/content/chart-bar.js +246 -16
  189. package/dist/ssr/content/chart-bar.js.map +1 -1
  190. package/dist/ssr/content/chart-inspection-core.js +22 -21
  191. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  192. package/dist/ssr/content/chart-line-gaps.js +1 -1
  193. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  194. package/dist/ssr/content/chart-message-catalog.js +10 -0
  195. package/dist/ssr/content/chart-message-catalog.js.map +1 -1
  196. package/dist/ssr/content/chart-state-timeline.js +1 -1
  197. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  198. package/dist/ssr/content/chart-svg.js +2 -1
  199. package/dist/ssr/content/chart-svg.js.map +1 -1
  200. package/dist/ssr/content/index.js +1 -0
  201. package/dist/ssr/content/index.js.map +1 -1
  202. package/dist/ssr/content/pdf-document.js +29 -0
  203. package/dist/ssr/content/pdf-document.js.map +1 -0
  204. package/dist/ssr/content/pdf-limits.js +31 -0
  205. package/dist/ssr/content/pdf-limits.js.map +1 -0
  206. package/dist/ssr/content/pdf-messages.js +34 -2
  207. package/dist/ssr/content/pdf-messages.js.map +1 -1
  208. package/dist/ssr/inputs/ChoiceInputs.js +49 -12
  209. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  210. package/dist/ssr/inputs/ChoiceSlider.js +17 -12
  211. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
  212. package/dist/ssr/inputs/DatePicker.js +14 -9
  213. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  214. package/dist/ssr/inputs/PeriodPicker.js +598 -0
  215. package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
  216. package/dist/ssr/inputs/index.js +4 -1
  217. package/dist/ssr/inputs/index.js.map +1 -1
  218. package/dist/ssr/inputs/input-messages.js +8 -2
  219. package/dist/ssr/inputs/input-messages.js.map +1 -1
  220. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  221. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  222. package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
  223. package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
  224. package/dist/ssr/inputs/period-picker-messages.js +71 -0
  225. package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
  226. package/dist/ssr/inputs/period.js +263 -0
  227. package/dist/ssr/inputs/period.js.map +1 -0
  228. package/dist/ssr/layout/DetailPanel.js +27 -4
  229. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  230. package/dist/ssr/layout/Discussion.js +16 -2
  231. package/dist/ssr/layout/Discussion.js.map +1 -1
  232. package/dist/ssr/layout/index.js.map +1 -1
  233. package/dist/ssr/surfaces/DescriptionList.js +1 -1
  234. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  235. package/dist/ssr/surfaces/StatCell.js +4 -5
  236. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  237. package/dist/ssr/surfaces/delta-badge.js +16 -2
  238. package/dist/ssr/surfaces/delta-badge.js.map +1 -1
  239. package/dist/ssr/widgets/DashboardFrame.js +200 -0
  240. package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
  241. package/dist/ssr/widgets/index.js +1 -0
  242. package/dist/ssr/widgets/index.js.map +1 -1
  243. package/dist/styles.css +1 -1
  244. package/dist/types/actions/Button.d.ts +1 -1
  245. package/dist/types/actions/CommandList.d.ts +120 -0
  246. package/dist/types/actions/CommandMenu.d.ts +39 -0
  247. package/dist/types/actions/Dropdown.d.ts +17 -0
  248. package/dist/types/actions/command-dock.d.ts +8 -0
  249. package/dist/types/actions/command-items.d.ts +134 -0
  250. package/dist/types/actions/command-messages.d.ts +19 -0
  251. package/dist/types/actions/index.d.ts +3 -0
  252. package/dist/types/charts/core/calendar.d.ts +1 -1
  253. package/dist/types/charts/core/chart-messages.d.ts +5 -0
  254. package/dist/types/charts/core/hbar-layout.d.ts +74 -0
  255. package/dist/types/charts/core/hbar.d.ts +13 -0
  256. package/dist/types/charts/core/index.d.ts +7 -2
  257. package/dist/types/charts/core/map.d.ts +3 -0
  258. package/dist/types/charts/core/registry.d.ts +17 -11
  259. package/dist/types/charts/core/render-size.d.ts +7 -0
  260. package/dist/types/charts/core/render.d.ts +1 -4
  261. package/dist/types/charts/core/snapshot.d.ts +2 -2
  262. package/dist/types/charts/core/svg-renderers.d.ts +722 -0
  263. package/dist/types/charts/core/svg.d.ts +4 -698
  264. package/dist/types/charts/core/types.d.ts +1 -12
  265. package/dist/types/charts/core/waterfall.d.ts +68 -0
  266. package/dist/types/charts/description.d.ts +226 -0
  267. package/dist/types/charts.d.ts +1 -0
  268. package/dist/types/content/Chart.d.ts +3 -91
  269. package/dist/types/content/ChartRoot.d.ts +92 -0
  270. package/dist/types/content/ChartSparkline.d.ts +5 -0
  271. package/dist/types/content/PdfViewer.d.ts +32 -0
  272. package/dist/types/content/chart-bar.d.ts +95 -2
  273. package/dist/types/content/index.d.ts +2 -0
  274. package/dist/types/content/pdf-document.d.ts +5 -0
  275. package/dist/types/content/pdf-engine.d.ts +9 -0
  276. package/dist/types/content/pdf-limits.d.ts +43 -0
  277. package/dist/types/content/pdf-messages.d.ts +16 -0
  278. package/dist/types/inputs/ChoiceInputs.d.ts +4 -0
  279. package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
  280. package/dist/types/inputs/DatePicker.d.ts +22 -0
  281. package/dist/types/inputs/PeriodPicker.d.ts +24 -0
  282. package/dist/types/inputs/index.d.ts +8 -2
  283. package/dist/types/inputs/input-messages.d.ts +3 -0
  284. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
  285. package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
  286. package/dist/types/inputs/period-picker-messages.d.ts +34 -0
  287. package/dist/types/inputs/period.d.ts +134 -0
  288. package/dist/types/layout/DetailPanel.d.ts +12 -0
  289. package/dist/types/layout/index.d.ts +1 -1
  290. package/dist/types/surfaces/DescriptionList.d.ts +5 -0
  291. package/dist/types/surfaces/StatCell.d.ts +6 -1
  292. package/dist/types/widgets/DashboardFrame.d.ts +58 -0
  293. package/dist/types/widgets/index.d.ts +1 -0
  294. package/package.json +2 -1
@@ -0,0 +1,402 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { setProperty as _$setProperty } from "solid-js/web";
4
+ import { setAttribute as _$setAttribute } from "solid-js/web";
5
+ import { effect as _$effect } from "solid-js/web";
6
+ import { getNextElement as _$getNextElement } from "solid-js/web";
7
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
8
+ import { insert as _$insert } from "solid-js/web";
9
+ import { use as _$use } from "solid-js/web";
10
+ import { createComponent as _$createComponent } from "solid-js/web";
11
+ var _tmpl$ = /*#__PURE__*/_$template(`<div popover=manual class=k2b-autocomplete__options data-commands role=presentation>`),
12
+ _tmpl$2 = /*#__PURE__*/_$template(`<label class=k2b-dropdown__search><i class="ti ti-search"aria-hidden=true></i><input type=search role=combobox aria-expanded=true aria-autocomplete=list autocomplete=off enterkeyhint=go>`);
13
+ import { createEffect, createMemo, createSignal, onCleanup, onMount, Show } from "solid-js";
14
+ import { CommandList, commandListKey, commandOptionId, createCommandNavigator } from "../../actions/CommandList";
15
+ import { dockCommandList, followComposer } from "../../actions/command-dock";
16
+ import { commandPlace } from "../../actions/command-items";
17
+ import { useCommandMessages } from "../../actions/command-messages";
18
+ import { detectQuery } from "../completion";
19
+ import { isInCodeZone } from "./code-zone";
20
+ /** Replaces a range of the text the way typing would, so undo keeps working; an empty text deletes. */
21
+ const replace = (textarea, start, end, text) => {
22
+ textarea.focus();
23
+ textarea.setSelectionRange(start, end);
24
+ if (start === end && text === "") return;
25
+ try {
26
+ if (document.execCommand?.(text === "" ? "delete" : "insertText", false, text)) return;
27
+ } catch {
28
+ // Fall through to the standards-based replacement.
29
+ }
30
+ textarea.setRangeText(text, start, end, "end");
31
+ textarea.dispatchEvent(new Event("input", {
32
+ bubbles: true
33
+ }));
34
+ };
35
+ const trigger = {
36
+ trigger: "/",
37
+ suggest: () => []
38
+ };
39
+
40
+ /**
41
+ * Slash commands for a `MarkdownEditor`: `/` at the start of a line or after a space opens the entries docked above the
42
+ * composer, as wide as it is. Place it beside the editor and pass the editor's textarea. It listens to the textarea itself, so editors without
43
+ * commands carry none of it: native listeners run before the editor's own, and a key it uses is marked handled with
44
+ * `preventDefault`, which the editor respects.
45
+ */
46
+ export function SlashCommands(props) {
47
+ return _$createComponent(Show, {
48
+ get when() {
49
+ return props.textarea;
50
+ },
51
+ children: textarea => _$createComponent(AttachedCommands, {
52
+ get textarea() {
53
+ return textarea();
54
+ },
55
+ get items() {
56
+ return props.items;
57
+ },
58
+ get composer() {
59
+ return props.composer;
60
+ }
61
+ })
62
+ });
63
+ }
64
+ function AttachedCommands(props) {
65
+ const messages = useCommandMessages();
66
+ const textarea = props.textarea;
67
+ const id = `${textarea.id || "k2b-markdown"}-commands`;
68
+ const composer = () => props.composer ?? textarea.closest(".k2b-markdown-editor") ?? textarea;
69
+ const [context, setContext] = createSignal(null);
70
+ /**
71
+ * The list as a command left it: the `/query` is gone from the text, but the list stays at its slash while the
72
+ * command runs or after it failed, until the person types, leaves, or presses Escape.
73
+ */
74
+ const [held, setHeld] = createSignal();
75
+ /** Where Escape closed the commands; they stay closed while the caret stays in that `/query`. */
76
+ let dismissedAt = null;
77
+ /**
78
+ * How deep the list is. A further list has its own search field: the `/query` leaves the text, the focus moves into
79
+ * the field, and the composer's text stays as it is while the person searches.
80
+ */
81
+ const [depth, setDepth] = createSignal(0);
82
+ const [search, setSearch] = createSignal("");
83
+ let searchField;
84
+ /** Set while this part moves the focus between the text and the search field itself. */
85
+ let moving = false;
86
+ /** Puts the focus back in the text at `at`, where the slash stood. */
87
+ const focusText = at => {
88
+ moving = true;
89
+ try {
90
+ textarea.focus();
91
+ textarea.setSelectionRange(at, at);
92
+ } finally {
93
+ moving = false;
94
+ }
95
+ };
96
+ /** Set while this part edits the text itself, so its own edit does not count as the person typing. */
97
+ let editing = false;
98
+ let popover;
99
+ const edit = (start, end, text) => {
100
+ editing = true;
101
+ try {
102
+ replace(textarea, start, end, text);
103
+ } finally {
104
+ editing = false;
105
+ }
106
+ };
107
+ const nav = createCommandNavigator({
108
+ items: () => props.items,
109
+ query: () => depth() > 0 ? search() : context()?.query ?? held()?.query ?? "",
110
+ onText: item => {
111
+ // After a command failed, the held list has no `/query` left; a snippet goes where it stood.
112
+ const current = context();
113
+ const start = current?.start ?? held()?.start;
114
+ if (start === undefined) return;
115
+ close();
116
+ edit(start, current?.end ?? start, item.text ?? "");
117
+ },
118
+ beforeRun: () => {
119
+ const current = context();
120
+ if (!current) return;
121
+ // The list stays where it was while the `/query` leaves the text.
122
+ setHeld({
123
+ start: current.start,
124
+ query: current.query
125
+ });
126
+ setContext(null);
127
+ edit(current.start, current.end, "");
128
+ },
129
+ // While the `/query` is in the text, the context leaves it out; once a command removed it, the text is as it is.
130
+ context: () => {
131
+ const current = context();
132
+ const start = current?.start ?? held()?.start ?? textarea.selectionStart;
133
+ const place = commandPlace(textarea.value, start, current?.end ?? start);
134
+ return {
135
+ ...place,
136
+ selection: current ? {
137
+ start,
138
+ end: start
139
+ } : {
140
+ start: textarea.selectionStart,
141
+ end: textarea.selectionEnd
142
+ },
143
+ insert: text => edit(textarea.selectionStart, textarea.selectionEnd, text)
144
+ };
145
+ },
146
+ // A finished command leaves the focus in the text where the slash stood; its outcome, if any, shows in the list's place.
147
+ afterRun: () => {
148
+ const at = held()?.start;
149
+ close();
150
+ if (at !== undefined && document.activeElement !== textarea) focusText(at);
151
+ },
152
+ active: () => context() !== null || held() !== undefined,
153
+ onStep: next => {
154
+ const previous = depth();
155
+ if (next === 0) {
156
+ // Back to the first list: the typed `/query` comes back, and the text has the focus again. The list keeps its
157
+ // place throughout: the context returns before the held state goes, and the focus is in the text before the
158
+ // search field leaves, since a browser blurs a focused field that is removed, which would close the list.
159
+ const at = held();
160
+ if (at) {
161
+ const text = `/${at.query}`;
162
+ setContext({
163
+ start: at.start,
164
+ end: at.start + text.length,
165
+ text,
166
+ query: at.query,
167
+ completion: trigger
168
+ });
169
+ setHeld(undefined);
170
+ moving = true;
171
+ try {
172
+ edit(at.start, at.start, text);
173
+ } finally {
174
+ moving = false;
175
+ }
176
+ }
177
+ setDepth(0);
178
+ setSearch("");
179
+ return;
180
+ }
181
+ setDepth(next);
182
+ setSearch("");
183
+ if (previous === 0) {
184
+ // Into a further list: the `/query` leaves the text, and the list stays where it was.
185
+ const current = context();
186
+ if (current) {
187
+ setHeld({
188
+ start: current.start,
189
+ query: current.query
190
+ });
191
+ setContext(null);
192
+ edit(current.start, current.end, "");
193
+ }
194
+ }
195
+ queueMicrotask(() => {
196
+ moving = true;
197
+ try {
198
+ searchField?.focus({
199
+ preventScroll: true
200
+ });
201
+ } finally {
202
+ moving = false;
203
+ }
204
+ });
205
+ }
206
+ });
207
+ // Entries on their way, or a list that could not load, show too, so the person sees what happens.
208
+ const open = createMemo(() => nav.outcome() !== undefined || held() !== undefined || context() !== null && (nav.step() !== undefined || nav.entries().length > 0 || nav.load().state !== "ready"));
209
+ const close = () => {
210
+ setContext(null);
211
+ setHeld(undefined);
212
+ setDepth(0);
213
+ setSearch("");
214
+ nav.reset();
215
+ };
216
+ const detect = () => {
217
+ if (editing) return;
218
+ // Typing after a command ran or failed moves on: the held list closes, the command keeps running.
219
+ if (held()) close();
220
+ const found = document.activeElement === textarea ? detectQuery(textarea, [trigger], {
221
+ isExcluded: isInCodeZone
222
+ }) : null;
223
+ // Commands start at the line start or after a space, never inside `https://` or after a bracket.
224
+ const usable = found && (found.start === 0 || /\s/.test(textarea.value[found.start - 1] ?? "")) ? found : null;
225
+ if (usable?.start !== context()?.start) {
226
+ if (usable?.start !== dismissedAt) dismissedAt = null;
227
+ close();
228
+ }
229
+ if (usable && usable.start !== dismissedAt) {
230
+ // A new `/` takes the place at once, even from an outcome still in its least time.
231
+ if (usable.start !== context()?.start) nav.clearOutcome();
232
+ setContext(usable);
233
+ }
234
+ };
235
+ /** The person typed: an outcome clears once it showed long enough, and a new `/` opens the list. */
236
+ const typed = () => {
237
+ if (!editing) nav.typedOn();
238
+ detect();
239
+ };
240
+ /** An outcome's button leaves the focus in the text, where the person goes on writing. */
241
+ const backToText = () => {
242
+ if (document.activeElement === textarea) return;
243
+ moving = true;
244
+ try {
245
+ textarea.focus({
246
+ preventScroll: true
247
+ });
248
+ } finally {
249
+ moving = false;
250
+ }
251
+ };
252
+ const position = () => {
253
+ if (!popover?.isConnected) return;
254
+ if (!popover.matches(":popover-open")) popover.showPopover?.();
255
+ dockCommandList(popover, composer());
256
+ };
257
+
258
+ // The textarea points at the list while it shows, as a combobox does.
259
+ createEffect(() => {
260
+ const marked = nav.entries()[nav.active()];
261
+ // In a further list the search field points at it instead.
262
+ const pointing = open() && depth() === 0 && !nav.outcome();
263
+ const active = pointing && marked && !marked.disabled ? commandOptionId(id, nav.active()) : undefined;
264
+ if (pointing) textarea.setAttribute("aria-controls", id);else if (textarea.getAttribute("aria-controls") === id) textarea.removeAttribute("aria-controls");
265
+ if (active) textarea.setAttribute("aria-activedescendant", active);else if (textarea.getAttribute("aria-activedescendant")?.startsWith(`${id}-`)) textarea.removeAttribute("aria-activedescendant");
266
+ });
267
+ // Opening, and entries that arrive while the `/` waits, such as from a reactive source, show the list.
268
+ createEffect(() => {
269
+ if (!open()) return;
270
+ queueMicrotask(position);
271
+ // The composer grows with its text, and a phone's keyboard moves the visible viewport.
272
+ onCleanup(followComposer(composer(), position));
273
+ });
274
+ onMount(() => {
275
+ const key = event => {
276
+ if (!open() || event.defaultPrevented) return;
277
+ const current = context();
278
+ if (event.key === "Escape" && !current) {
279
+ // Escape stops a running command and closes the list it held, or clears an outcome at once.
280
+ event.preventDefault();
281
+ nav.abort();
282
+ nav.clearOutcome();
283
+ close();
284
+ return;
285
+ }
286
+ // An outcome is no list: other keys are the person writing on.
287
+ if (!current && nav.outcome()) return;
288
+ if (commandListKey(nav, event, current?.query ?? "")) event.preventDefault();else if (event.key === "Escape" && current) {
289
+ event.preventDefault();
290
+ dismissedAt = current.start;
291
+ close();
292
+ }
293
+ };
294
+ const selection = () => {
295
+ if (document.activeElement === textarea && !held()) detect();
296
+ };
297
+ const blur = event => {
298
+ if (moving || event.relatedTarget instanceof Node && popover?.contains(event.relatedTarget)) return;
299
+ close();
300
+ dismissedAt = null;
301
+ };
302
+ textarea.addEventListener("keydown", key);
303
+ textarea.addEventListener("input", typed);
304
+ textarea.addEventListener("blur", blur);
305
+ document.addEventListener("selectionchange", selection);
306
+ // A `/` typed while this module loaded opens the list now.
307
+ detect();
308
+ onCleanup(() => {
309
+ textarea.removeEventListener("keydown", key);
310
+ textarea.removeEventListener("input", typed);
311
+ textarea.removeEventListener("blur", blur);
312
+ document.removeEventListener("selectionchange", selection);
313
+ popover?.hidePopover?.();
314
+ });
315
+ });
316
+ return _$createComponent(Show, {
317
+ get when() {
318
+ return open();
319
+ },
320
+ get children() {
321
+ var _el$ = _$getNextElement(_tmpl$);
322
+ _el$.$$keydown = event => {
323
+ if (event.key !== "Escape" || !nav.outcome() || event.target === searchField) return;
324
+ event.preventDefault();
325
+ nav.clearOutcome();
326
+ backToText();
327
+ };
328
+ var _ref$ = popover;
329
+ typeof _ref$ === "function" ? _$use(_ref$, _el$) : popover = _el$;
330
+ _$insert(_el$, _$createComponent(CommandList, {
331
+ onOutcomeAction: backToText,
332
+ navigator: nav,
333
+ id: id,
334
+ get label() {
335
+ return messages().commands;
336
+ },
337
+ get query() {
338
+ return nav.query;
339
+ },
340
+ get header() {
341
+ return _$createComponent(Show, {
342
+ get when() {
343
+ return depth() > 0;
344
+ },
345
+ get children() {
346
+ var _el$2 = _$getNextElement(_tmpl$2),
347
+ _el$3 = _el$2.firstChild,
348
+ _el$4 = _el$3.nextSibling;
349
+ _el$4.addEventListener("blur", event => {
350
+ // Leaving the list, other than to the text by this part itself, closes it. An outcome that took the
351
+ // list's place removed this field; the finished command puts the focus back in the text.
352
+ if (moving || nav.outcome() || event.relatedTarget instanceof Node && popover?.contains(event.relatedTarget)) return;
353
+ close();
354
+ });
355
+ _el$4.$$keydown = event => {
356
+ if (event.key === "Escape" && nav.busy()) {
357
+ // Escape stops a running command and closes the list.
358
+ event.preventDefault();
359
+ const at = held()?.start;
360
+ nav.abort();
361
+ close();
362
+ if (at !== undefined) focusText(at);
363
+ return;
364
+ }
365
+ if (commandListKey(nav, event, search())) event.preventDefault();
366
+ };
367
+ _el$4.$$input = event => setSearch(event.currentTarget.value);
368
+ var _ref$2 = searchField;
369
+ typeof _ref$2 === "function" ? _$use(_ref$2, _el$4) : searchField = _el$4;
370
+ _$setAttribute(_el$4, "aria-controls", id);
371
+ _$setAttribute(_el$4, "spellcheck", false);
372
+ _$effect(_p$ => {
373
+ var _v$ = nav.step()?.next?.label,
374
+ _v$2 = nav.entries()[nav.active()] && !nav.entries()[nav.active()].disabled ? commandOptionId(id, nav.active()) : undefined,
375
+ _v$3 = nav.step()?.next?.label,
376
+ _v$4 = nav.busy();
377
+ _v$ !== _p$.e && _$setAttribute(_el$4, "aria-label", _p$.e = _v$);
378
+ _v$2 !== _p$.t && _$setAttribute(_el$4, "aria-activedescendant", _p$.t = _v$2);
379
+ _v$3 !== _p$.a && _$setAttribute(_el$4, "placeholder", _p$.a = _v$3);
380
+ _v$4 !== _p$.o && _$setProperty(_el$4, "readOnly", _p$.o = _v$4);
381
+ return _p$;
382
+ }, {
383
+ e: undefined,
384
+ t: undefined,
385
+ a: undefined,
386
+ o: undefined
387
+ });
388
+ _$effect(() => _$setProperty(_el$4, "value", search()));
389
+ _$runHydrationEvents();
390
+ return _el$2;
391
+ }
392
+ });
393
+ }
394
+ }));
395
+ _$effect(() => _$setAttribute(_el$, "data-outcome", nav.outcome()?.state));
396
+ _$runHydrationEvents();
397
+ return _el$;
398
+ }
399
+ });
400
+ }
401
+ _$delegateEvents(["keydown", "input"]);
402
+ //# sourceMappingURL=SlashCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/markdown/SlashCommands.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { CommandList, commandListKey, commandOptionId, createCommandNavigator } from \"../../actions/CommandList\";\nimport { dockCommandList, followComposer } from \"../../actions/command-dock\";\nimport { type CommandSource, commandPlace } from \"../../actions/command-items\";\nimport { useCommandMessages } from \"../../actions/command-messages\";\nimport { type Completion, detectQuery, type QueryContext } from \"../completion\";\nimport { isInCodeZone } from \"./code-zone\";\n\nexport type SlashCommandsProps = {\n /** The editor's textarea, from `MarkdownEditor`'s `textareaRef`. The commands attach once it is there. */\n textarea: HTMLTextAreaElement | undefined;\n /** The same entries as `CommandMenu`'s `items`. */\n items: CommandSource;\n /**\n * The composer box the list docks to, such as the frame around the editor and its \"+\" row. Defaults to the editor\n * itself.\n */\n composer?: HTMLElement;\n};\n\n/** Replaces a range of the text the way typing would, so undo keeps working; an empty text deletes. */\nconst replace = (textarea: HTMLTextAreaElement, start: number, end: number, text: string) => {\n textarea.focus();\n textarea.setSelectionRange(start, end);\n if (start === end && text === \"\") return;\n try {\n if (document.execCommand?.(text === \"\" ? \"delete\" : \"insertText\", false, text)) return;\n } catch {\n // Fall through to the standards-based replacement.\n }\n textarea.setRangeText(text, start, end, \"end\");\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n};\n\nconst trigger: Completion = { trigger: \"/\", suggest: () => [] };\n\n/**\n * Slash commands for a `MarkdownEditor`: `/` at the start of a line or after a space opens the entries docked above the\n * composer, as wide as it is. Place it beside the editor and pass the editor's textarea. It listens to the textarea itself, so editors without\n * commands carry none of it: native listeners run before the editor's own, and a key it uses is marked handled with\n * `preventDefault`, which the editor respects.\n */\nexport function SlashCommands(props: SlashCommandsProps): JSX.Element {\n return (\n <Show when={props.textarea}>\n {(textarea) => <AttachedCommands textarea={textarea()} items={props.items} composer={props.composer} />}\n </Show>\n );\n}\n\nfunction AttachedCommands(props: { textarea: HTMLTextAreaElement; items: CommandSource; composer?: HTMLElement }): JSX.Element {\n const messages = useCommandMessages();\n const textarea = props.textarea;\n const id = `${textarea.id || \"k2b-markdown\"}-commands`;\n const composer = (): Element => props.composer ?? textarea.closest(\".k2b-markdown-editor\") ?? textarea;\n const [context, setContext] = createSignal<QueryContext | null>(null);\n /**\n * The list as a command left it: the `/query` is gone from the text, but the list stays at its slash while the\n * command runs or after it failed, until the person types, leaves, or presses Escape.\n */\n const [held, setHeld] = createSignal<{ start: number; query: string }>();\n /** Where Escape closed the commands; they stay closed while the caret stays in that `/query`. */\n let dismissedAt: number | null = null;\n /**\n * How deep the list is. A further list has its own search field: the `/query` leaves the text, the focus moves into\n * the field, and the composer's text stays as it is while the person searches.\n */\n const [depth, setDepth] = createSignal(0);\n const [search, setSearch] = createSignal(\"\");\n let searchField: HTMLInputElement | undefined;\n /** Set while this part moves the focus between the text and the search field itself. */\n let moving = false;\n /** Puts the focus back in the text at `at`, where the slash stood. */\n const focusText = (at: number) => {\n moving = true;\n try {\n textarea.focus();\n textarea.setSelectionRange(at, at);\n } finally {\n moving = false;\n }\n };\n /** Set while this part edits the text itself, so its own edit does not count as the person typing. */\n let editing = false;\n let popover: HTMLDivElement | undefined;\n const edit = (start: number, end: number, text: string) => {\n editing = true;\n try {\n replace(textarea, start, end, text);\n } finally {\n editing = false;\n }\n };\n const nav = createCommandNavigator({\n items: () => props.items,\n query: () => (depth() > 0 ? search() : (context()?.query ?? held()?.query ?? \"\")),\n onText: (item) => {\n // After a command failed, the held list has no `/query` left; a snippet goes where it stood.\n const current = context();\n const start = current?.start ?? held()?.start;\n if (start === undefined) return;\n close();\n edit(start, current?.end ?? start, item.text ?? \"\");\n },\n beforeRun: () => {\n const current = context();\n if (!current) return;\n // The list stays where it was while the `/query` leaves the text.\n setHeld({ start: current.start, query: current.query });\n setContext(null);\n edit(current.start, current.end, \"\");\n },\n // While the `/query` is in the text, the context leaves it out; once a command removed it, the text is as it is.\n context: () => {\n const current = context();\n const start = current?.start ?? held()?.start ?? textarea.selectionStart;\n const place = commandPlace(textarea.value, start, current?.end ?? start);\n return {\n ...place,\n selection: current ? { start, end: start } : { start: textarea.selectionStart, end: textarea.selectionEnd },\n insert: (text: string) => edit(textarea.selectionStart, textarea.selectionEnd, text),\n };\n },\n // A finished command leaves the focus in the text where the slash stood; its outcome, if any, shows in the list's place.\n afterRun: () => {\n const at = held()?.start;\n close();\n if (at !== undefined && document.activeElement !== textarea) focusText(at);\n },\n active: () => context() !== null || held() !== undefined,\n onStep: (next) => {\n const previous = depth();\n if (next === 0) {\n // Back to the first list: the typed `/query` comes back, and the text has the focus again. The list keeps its\n // place throughout: the context returns before the held state goes, and the focus is in the text before the\n // search field leaves, since a browser blurs a focused field that is removed, which would close the list.\n const at = held();\n if (at) {\n const text = `/${at.query}`;\n setContext({ start: at.start, end: at.start + text.length, text, query: at.query, completion: trigger });\n setHeld(undefined);\n moving = true;\n try {\n edit(at.start, at.start, text);\n } finally {\n moving = false;\n }\n }\n setDepth(0);\n setSearch(\"\");\n return;\n }\n setDepth(next);\n setSearch(\"\");\n if (previous === 0) {\n // Into a further list: the `/query` leaves the text, and the list stays where it was.\n const current = context();\n if (current) {\n setHeld({ start: current.start, query: current.query });\n setContext(null);\n edit(current.start, current.end, \"\");\n }\n }\n queueMicrotask(() => {\n moving = true;\n try {\n searchField?.focus({ preventScroll: true });\n } finally {\n moving = false;\n }\n });\n },\n });\n // Entries on their way, or a list that could not load, show too, so the person sees what happens.\n const open = createMemo(\n () =>\n nav.outcome() !== undefined ||\n held() !== undefined ||\n (context() !== null && (nav.step() !== undefined || nav.entries().length > 0 || nav.load().state !== \"ready\")),\n );\n const close = () => {\n setContext(null);\n setHeld(undefined);\n setDepth(0);\n setSearch(\"\");\n nav.reset();\n };\n\n const detect = () => {\n if (editing) return;\n // Typing after a command ran or failed moves on: the held list closes, the command keeps running.\n if (held()) close();\n const found = document.activeElement === textarea ? detectQuery(textarea, [trigger], { isExcluded: isInCodeZone }) : null;\n // Commands start at the line start or after a space, never inside `https://` or after a bracket.\n const usable = found && (found.start === 0 || /\\s/.test(textarea.value[found.start - 1] ?? \"\")) ? found : null;\n if (usable?.start !== context()?.start) {\n if (usable?.start !== dismissedAt) dismissedAt = null;\n close();\n }\n if (usable && usable.start !== dismissedAt) {\n // A new `/` takes the place at once, even from an outcome still in its least time.\n if (usable.start !== context()?.start) nav.clearOutcome();\n setContext(usable);\n }\n };\n /** The person typed: an outcome clears once it showed long enough, and a new `/` opens the list. */\n const typed = () => {\n if (!editing) nav.typedOn();\n detect();\n };\n /** An outcome's button leaves the focus in the text, where the person goes on writing. */\n const backToText = () => {\n if (document.activeElement === textarea) return;\n moving = true;\n try {\n textarea.focus({ preventScroll: true });\n } finally {\n moving = false;\n }\n };\n\n const position = () => {\n if (!popover?.isConnected) return;\n if (!popover.matches(\":popover-open\")) popover.showPopover?.();\n dockCommandList(popover, composer());\n };\n\n // The textarea points at the list while it shows, as a combobox does.\n createEffect(() => {\n const marked = nav.entries()[nav.active()];\n // In a further list the search field points at it instead.\n const pointing = open() && depth() === 0 && !nav.outcome();\n const active = pointing && marked && !marked.disabled ? commandOptionId(id, nav.active()) : undefined;\n if (pointing) textarea.setAttribute(\"aria-controls\", id);\n else if (textarea.getAttribute(\"aria-controls\") === id) textarea.removeAttribute(\"aria-controls\");\n if (active) textarea.setAttribute(\"aria-activedescendant\", active);\n else if (textarea.getAttribute(\"aria-activedescendant\")?.startsWith(`${id}-`)) textarea.removeAttribute(\"aria-activedescendant\");\n });\n // Opening, and entries that arrive while the `/` waits, such as from a reactive source, show the list.\n createEffect(() => {\n if (!open()) return;\n queueMicrotask(position);\n // The composer grows with its text, and a phone's keyboard moves the visible viewport.\n onCleanup(followComposer(composer(), position));\n });\n\n onMount(() => {\n const key = (event: KeyboardEvent) => {\n if (!open() || event.defaultPrevented) return;\n const current = context();\n if (event.key === \"Escape\" && !current) {\n // Escape stops a running command and closes the list it held, or clears an outcome at once.\n event.preventDefault();\n nav.abort();\n nav.clearOutcome();\n close();\n return;\n }\n // An outcome is no list: other keys are the person writing on.\n if (!current && nav.outcome()) return;\n if (commandListKey(nav, event, current?.query ?? \"\")) event.preventDefault();\n else if (event.key === \"Escape\" && current) {\n event.preventDefault();\n dismissedAt = current.start;\n close();\n }\n };\n const selection = () => {\n if (document.activeElement === textarea && !held()) detect();\n };\n const blur = (event: FocusEvent) => {\n if (moving || (event.relatedTarget instanceof Node && popover?.contains(event.relatedTarget))) return;\n close();\n dismissedAt = null;\n };\n textarea.addEventListener(\"keydown\", key);\n textarea.addEventListener(\"input\", typed);\n textarea.addEventListener(\"blur\", blur);\n document.addEventListener(\"selectionchange\", selection);\n // A `/` typed while this module loaded opens the list now.\n detect();\n onCleanup(() => {\n textarea.removeEventListener(\"keydown\", key);\n textarea.removeEventListener(\"input\", typed);\n textarea.removeEventListener(\"blur\", blur);\n document.removeEventListener(\"selectionchange\", selection);\n popover?.hidePopover?.();\n });\n });\n\n return (\n <Show when={open()}>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Escape from an outcome's own buttons; the text owns every other key. */}\n <div\n ref={popover}\n popover=\"manual\"\n class=\"k2b-autocomplete__options\"\n data-commands=\"\"\n data-outcome={nav.outcome()?.state}\n role=\"presentation\"\n // Escape on an outcome's button clears it, as it does in the text.\n onKeyDown={(event) => {\n if (event.key !== \"Escape\" || !nav.outcome() || event.target === searchField) return;\n event.preventDefault();\n nav.clearOutcome();\n backToText();\n }}\n >\n <CommandList\n onOutcomeAction={backToText}\n navigator={nav}\n id={id}\n label={messages().commands}\n query={nav.query}\n header={\n <Show when={depth() > 0}>\n <label class=\"k2b-dropdown__search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={searchField}\n type=\"search\"\n role=\"combobox\"\n aria-label={nav.step()?.next?.label}\n aria-expanded=\"true\"\n aria-controls={id}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n nav.entries()[nav.active()] && !nav.entries()[nav.active()]!.disabled ? commandOptionId(id, nav.active()) : undefined\n }\n autocomplete=\"off\"\n spellcheck={false}\n enterkeyhint=\"go\"\n placeholder={nav.step()?.next?.label}\n value={search()}\n // While a command runs, the list waits for it.\n readOnly={nav.busy()}\n onInput={(event) => setSearch(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\" && nav.busy()) {\n // Escape stops a running command and closes the list.\n event.preventDefault();\n const at = held()?.start;\n nav.abort();\n close();\n if (at !== undefined) focusText(at);\n return;\n }\n if (commandListKey(nav, event, search())) event.preventDefault();\n }}\n onBlur={(event) => {\n // Leaving the list, other than to the text by this part itself, closes it. An outcome that took the\n // list's place removed this field; the finished command puts the focus back in the text.\n if (moving || nav.outcome() || (event.relatedTarget instanceof Node && popover?.contains(event.relatedTarget))) return;\n close();\n }}\n />\n </label>\n </Show>\n }\n />\n </div>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,71 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+
4
+ /** Labels of the built-in period presets and the picker's own words. */
5
+ const periodPickerMessages = i18n.define({
6
+ baseLocale: "en",
7
+ messages: {
8
+ en: {
9
+ period: "Period",
10
+ choosePeriod: "Choose a period",
11
+ custom: "Custom range",
12
+ from: "From",
13
+ to: "To",
14
+ backToPresets: "Back to presets",
15
+ since: ({
16
+ date
17
+ }) => `since ${date}`,
18
+ days: ({
19
+ count
20
+ }) => count === 1 ? "1 day" : `${count} days`,
21
+ today: "Today",
22
+ yesterday: "Yesterday",
23
+ "this-week": "This week",
24
+ "last-week": "Last week",
25
+ "this-month": "This month",
26
+ "last-month": "Last month",
27
+ "this-quarter": "This quarter",
28
+ "last-quarter": "Last quarter",
29
+ "this-year": "This year",
30
+ "last-year": "Last year",
31
+ all: "All time"
32
+ },
33
+ de: {
34
+ period: "Zeitraum",
35
+ choosePeriod: "Zeitraum wählen",
36
+ custom: "Frei wählen",
37
+ from: "Von",
38
+ to: "Bis",
39
+ backToPresets: "Zurück zu den Vorgaben",
40
+ since: ({
41
+ date
42
+ }) => `seit ${date}`,
43
+ days: ({
44
+ count
45
+ }) => count === 1 ? "1 Tag" : `${count} Tage`,
46
+ today: "Heute",
47
+ yesterday: "Gestern",
48
+ "this-week": "Diese Woche",
49
+ "last-week": "Letzte Woche",
50
+ "this-month": "Dieser Monat",
51
+ "last-month": "Letzter Monat",
52
+ "this-quarter": "Dieses Quartal",
53
+ "last-quarter": "Letztes Quartal",
54
+ "this-year": "Dieses Jahr",
55
+ "last-year": "Letztes Jahr",
56
+ all: "Gesamt"
57
+ }
58
+ }
59
+ });
60
+ const builtInKeys = new Set(["today", "yesterday", "this-week", "last-week", "this-month", "last-month", "this-quarter", "last-quarter", "this-year", "last-year", "all"]);
61
+ /** The translated label of a built-in preset key, if it is one. */
62
+ export const builtInPresetLabel = (t, key) => builtInKeys.has(key) ? t[key] : undefined;
63
+
64
+ /** Resolved from the inherited render locale. */
65
+ export const usePeriodPickerMessages = () => {
66
+ const locale = useLocale();
67
+ return () => periodPickerMessages.resolve([locale()]).t;
68
+ };
69
+ export const resolvePeriodPickerMessages = locale => periodPickerMessages.resolve([locale ?? "en"]).t;
70
+ export const checkPeriodPickerMessages = () => periodPickerMessages.check();
71
+ //# sourceMappingURL=period-picker-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/period-picker-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\n/** Labels of the built-in period presets and the picker's own words. */\nconst periodPickerMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n period: \"Period\",\n choosePeriod: \"Choose a period\",\n custom: \"Custom range\",\n from: \"From\",\n to: \"To\",\n backToPresets: \"Back to presets\",\n since: ({ date }: { date: string }) => `since ${date}`,\n days: ({ count }: { count: number }) => (count === 1 ? \"1 day\" : `${count} days`),\n today: \"Today\",\n yesterday: \"Yesterday\",\n \"this-week\": \"This week\",\n \"last-week\": \"Last week\",\n \"this-month\": \"This month\",\n \"last-month\": \"Last month\",\n \"this-quarter\": \"This quarter\",\n \"last-quarter\": \"Last quarter\",\n \"this-year\": \"This year\",\n \"last-year\": \"Last year\",\n all: \"All time\",\n },\n de: {\n period: \"Zeitraum\",\n choosePeriod: \"Zeitraum wählen\",\n custom: \"Frei wählen\",\n from: \"Von\",\n to: \"Bis\",\n backToPresets: \"Zurück zu den Vorgaben\",\n since: ({ date }) => `seit ${date}`,\n days: ({ count }) => (count === 1 ? \"1 Tag\" : `${count} Tage`),\n today: \"Heute\",\n yesterday: \"Gestern\",\n \"this-week\": \"Diese Woche\",\n \"last-week\": \"Letzte Woche\",\n \"this-month\": \"Dieser Monat\",\n \"last-month\": \"Letzter Monat\",\n \"this-quarter\": \"Dieses Quartal\",\n \"last-quarter\": \"Letztes Quartal\",\n \"this-year\": \"Dieses Jahr\",\n \"last-year\": \"Letztes Jahr\",\n all: \"Gesamt\",\n },\n },\n});\n\nexport type PeriodPickerMessages = ReturnType<(typeof periodPickerMessages)[\"resolve\"]>[\"t\"];\n\nconst builtInKeys = new Set([\n \"today\",\n \"yesterday\",\n \"this-week\",\n \"last-week\",\n \"this-month\",\n \"last-month\",\n \"this-quarter\",\n \"last-quarter\",\n \"this-year\",\n \"last-year\",\n \"all\",\n] as const);\ntype BuiltInKey = typeof builtInKeys extends Set<infer K> ? K : never;\n\n/** The translated label of a built-in preset key, if it is one. */\nexport const builtInPresetLabel = (t: PeriodPickerMessages, key: string): string | undefined =>\n builtInKeys.has(key as BuiltInKey) ? t[key as BuiltInKey] : undefined;\n\n/** Resolved from the inherited render locale. */\nexport const usePeriodPickerMessages = (): (() => PeriodPickerMessages) => {\n const locale = useLocale();\n return () => periodPickerMessages.resolve([locale()]).t;\n};\n\nexport const resolvePeriodPickerMessages = (locale?: string): PeriodPickerMessages => periodPickerMessages.resolve([locale ?? \"en\"]).t;\n\nexport const checkPeriodPickerMessages = () => periodPickerMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;;AAE1C;AACA,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC;EACvC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,MAAM,EAAE,QAAQ;MAChB,YAAY,EAAE,iBAAiB;MAC/B,MAAM,EAAE,cAAc;MACtB,IAAI,EAAE,MAAM;MACZ,EAAE,EAAE,IAAI;MACR,aAAa,EAAE,iBAAiB;MAChC,KAAK,EAAE,CAAC;QAAE;MAAuB,CAAC,KAAK,SAAS,IAAI,EAAE;MACtD,IAAI,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAM,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG,KAAK,OAAQ;MACjF,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,WAAW;MACtB,WAAW,EAAE,WAAW;MACxB,WAAW,EAAE,WAAW;MACxB,YAAY,EAAE,YAAY;MAC1B,YAAY,EAAE,YAAY;MAC1B,cAAc,EAAE,cAAc;MAC9B,cAAc,EAAE,cAAc;MAC9B,WAAW,EAAE,WAAW;MACxB,WAAW,EAAE,WAAW;MACxB,GAAG,EAAE;IACP,CAAC;IACD,EAAE,EAAE;MACF,MAAM,EAAE,UAAU;MAClB,YAAY,EAAE,iBAAiB;MAC/B,MAAM,EAAE,aAAa;MACrB,IAAI,EAAE,KAAK;MACX,EAAE,EAAE,KAAK;MACT,aAAa,EAAE,wBAAwB;MACvC,KAAK,EAAE,CAAC;QAAE;MAAK,CAAC,KAAK,QAAQ,IAAI,EAAE;MACnC,IAAI,EAAE,CAAC;QAAE;MAAM,CAAC,KAAM,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG,KAAK,OAAQ;MAC9D,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,SAAS;MACpB,WAAW,EAAE,aAAa;MAC1B,WAAW,EAAE,cAAc;MAC3B,YAAY,EAAE,cAAc;MAC5B,YAAY,EAAE,eAAe;MAC7B,cAAc,EAAE,gBAAgB;MAChC,cAAc,EAAE,iBAAiB;MACjC,WAAW,EAAE,aAAa;MAC1B,WAAW,EAAE,cAAc;MAC3B,GAAG,EAAE;IACP;EACF;AACF,CAAC,CAAC;AAIF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAC1B,OAAO,EACP,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,WAAW,EACX,WAAW,EACX,KAAK,CACG,CAAC;AAGX;AACA,OAAO,MAAM,kBAAkB,GAAG,CAAC,CAAuB,EAAE,GAAW,KACrE,WAAW,CAAC,GAAG,CAAC,GAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAe,GAAG,SAAS;;AAEvE;AACA,OAAO,MAAM,uBAAuB,GAAG,MAAoC;EACzE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,MAAM,2BAA2B,GAAI,MAAe,IAA2B,oBAAoB,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AAEtI,OAAO,MAAM,yBAAyB,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}