@k2b/ui 0.5.0 → 0.6.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 (387) hide show
  1. package/dist/browser/actions/Button.js +11 -2
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/CopyButton.js.map +1 -1
  5. package/dist/browser/actions/Disclosure.js.map +1 -1
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js.map +1 -1
  8. package/dist/browser/actions/RemoveButton.js.map +1 -1
  9. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  12. package/dist/browser/actions/Tabs.js.map +1 -1
  13. package/dist/browser/actions/Toolbar.js.map +1 -1
  14. package/dist/browser/actions/index.js.map +1 -1
  15. package/dist/browser/chat/ChatComposer.js.map +1 -1
  16. package/dist/browser/chat/ChatContextPopup.js.map +1 -1
  17. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  18. package/dist/browser/chat/ChatRoot.js.map +1 -1
  19. package/dist/browser/chat/ChatTasks.js +1 -1
  20. package/dist/browser/chat/ChatTasks.js.map +1 -1
  21. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  22. package/dist/browser/chat/chat-behavior.js.map +1 -1
  23. package/dist/browser/chat/composer-document.js.map +1 -1
  24. package/dist/browser/chat/index.js.map +1 -1
  25. package/dist/browser/content/Calendar.js.map +1 -1
  26. package/dist/browser/content/Chart.js.map +1 -1
  27. package/dist/browser/content/ChartExplorer.js.map +1 -1
  28. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  29. package/dist/browser/content/ChartFilterControls.js +1 -1
  30. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  31. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  32. package/dist/browser/content/CodeDisplay.js.map +1 -1
  33. package/dist/browser/content/DataTable.js.map +1 -1
  34. package/dist/browser/content/Docs.js.map +1 -1
  35. package/dist/browser/content/FileBrowser.js.map +1 -1
  36. package/dist/browser/content/FileGrid.js.map +1 -1
  37. package/dist/browser/content/FileTree.js.map +1 -1
  38. package/dist/browser/content/FileView.js.map +1 -1
  39. package/dist/browser/content/Lightbox.js.map +1 -1
  40. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  41. package/dist/browser/content/MarkdownView.js.map +1 -1
  42. package/dist/browser/content/Pagination.js.map +1 -1
  43. package/dist/browser/content/PdfPreview.js.map +1 -1
  44. package/dist/browser/content/RangePicker.js.map +1 -1
  45. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  46. package/dist/browser/content/ZoomPanViewport.js +396 -0
  47. package/dist/browser/content/ZoomPanViewport.js.map +1 -0
  48. package/dist/browser/content/calendar-event-layout.js.map +1 -1
  49. package/dist/browser/content/calendar-pointer.js.map +1 -1
  50. package/dist/browser/content/chart-cursor.js.map +1 -1
  51. package/dist/browser/content/chart-explorer.js.map +1 -1
  52. package/dist/browser/content/chart-inspection.js.map +1 -1
  53. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  54. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  55. package/dist/browser/content/chart-snapshot.js.map +1 -1
  56. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  57. package/dist/browser/content/chart-svg.js.map +1 -1
  58. package/dist/browser/content/code-highlight.js.map +1 -1
  59. package/dist/browser/content/collection-selection.js.map +1 -1
  60. package/dist/browser/content/delimited-preferences.js.map +1 -1
  61. package/dist/browser/content/file-tree.js.map +1 -1
  62. package/dist/browser/content/file-view-preview.js.map +1 -1
  63. package/dist/browser/content/index.js +1 -0
  64. package/dist/browser/content/index.js.map +1 -1
  65. package/dist/browser/content/zoom-pan.js +54 -0
  66. package/dist/browser/content/zoom-pan.js.map +1 -0
  67. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  68. package/dist/browser/feedback/Tooltip.js.map +1 -1
  69. package/dist/browser/feedback/dialog-core.js.map +1 -1
  70. package/dist/browser/feedback/index.js.map +1 -1
  71. package/dist/browser/feedback/prompts.js.map +1 -1
  72. package/dist/browser/feedback/toast.js.map +1 -1
  73. package/dist/browser/feedback/tooltip-position.js.map +1 -1
  74. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  75. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  76. package/dist/browser/inputs/Checkbox.js.map +1 -1
  77. package/dist/browser/inputs/CheckboxCard.js.map +1 -1
  78. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  79. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  80. package/dist/browser/inputs/Combobox.js.map +1 -1
  81. package/dist/browser/inputs/DatePicker.js.map +1 -1
  82. package/dist/browser/inputs/FileInputs.js.map +1 -1
  83. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  84. package/dist/browser/inputs/NumberInput.js.map +1 -1
  85. package/dist/browser/inputs/Select.js.map +1 -1
  86. package/dist/browser/inputs/SelectChip.js.map +1 -1
  87. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  88. package/dist/browser/inputs/Switch.js.map +1 -1
  89. package/dist/browser/inputs/TagEditor.js.map +1 -1
  90. package/dist/browser/inputs/TagsInput.js.map +1 -1
  91. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  92. package/dist/browser/inputs/TextInput.js +2 -1
  93. package/dist/browser/inputs/TextInput.js.map +1 -1
  94. package/dist/browser/inputs/choice.js.map +1 -1
  95. package/dist/browser/inputs/completion/behaviors.js.map +1 -1
  96. package/dist/browser/inputs/completion/engine.js.map +1 -1
  97. package/dist/browser/inputs/completion/index.js.map +1 -1
  98. package/dist/browser/inputs/completion/overlay.js.map +1 -1
  99. package/dist/browser/inputs/date-picker.js.map +1 -1
  100. package/dist/browser/inputs/editor-dom.js.map +1 -1
  101. package/dist/browser/inputs/field-contract.js.map +1 -1
  102. package/dist/browser/inputs/icon-options.js.map +1 -1
  103. package/dist/browser/inputs/image-crop.js.map +1 -1
  104. package/dist/browser/inputs/index.js.map +1 -1
  105. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  106. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  107. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  108. package/dist/browser/inputs/markdown/active-formats.js.map +1 -1
  109. package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
  110. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  111. package/dist/browser/internal/color.js.map +1 -1
  112. package/dist/browser/internal/field.js.map +1 -1
  113. package/dist/browser/internal/portal.js.map +1 -1
  114. package/dist/browser/intl/Format.js.map +1 -1
  115. package/dist/browser/intl/index.js.map +1 -1
  116. package/dist/browser/intl/locale.js.map +1 -1
  117. package/dist/browser/intl/messages.js +6 -0
  118. package/dist/browser/intl/messages.js.map +1 -1
  119. package/dist/browser/layout/AppOverview.js.map +1 -1
  120. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  121. package/dist/browser/layout/BottomSheet.js.map +1 -1
  122. package/dist/browser/layout/DataPanel.js.map +1 -1
  123. package/dist/browser/layout/DetailPanel.js.map +1 -1
  124. package/dist/browser/layout/Discussion.js.map +1 -1
  125. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  126. package/dist/browser/layout/Navigation.js.map +1 -1
  127. package/dist/browser/layout/PanelDialog.js.map +1 -1
  128. package/dist/browser/layout/PanelHeader.js.map +1 -1
  129. package/dist/browser/layout/Panes.js.map +1 -1
  130. package/dist/browser/layout/PullToRefresh.js +8 -7
  131. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  132. package/dist/browser/layout/ScrollArea.js.map +1 -1
  133. package/dist/browser/layout/Settings.js.map +1 -1
  134. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  135. package/dist/browser/layout/SettingsModal.js.map +1 -1
  136. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  137. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  138. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  139. package/dist/browser/layout/floating-window-geometry.js.map +1 -1
  140. package/dist/browser/layout/index.js.map +1 -1
  141. package/dist/browser/layout/navigation-model.js.map +1 -1
  142. package/dist/browser/layout/panes-layout.js.map +1 -1
  143. package/dist/browser/layout/scroll-fade.js.map +1 -1
  144. package/dist/browser/layout/stable-id.js.map +1 -1
  145. package/dist/browser/surfaces/Avatar.js.map +1 -1
  146. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  147. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  148. package/dist/browser/surfaces/NotFoundState.js.map +1 -1
  149. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  150. package/dist/browser/surfaces/Paper.js.map +1 -1
  151. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  152. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  153. package/dist/browser/surfaces/StatCell.js.map +1 -1
  154. package/dist/browser/surfaces/StatGrid.js.map +1 -1
  155. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  156. package/dist/browser/surfaces/Tag.js.map +1 -1
  157. package/dist/browser/surfaces/index.js.map +1 -1
  158. package/dist/browser/widgets/Widget.js.map +1 -1
  159. package/dist/browser/widgets/WidgetHero.js.map +1 -1
  160. package/dist/browser/widgets/WidgetList.js.map +1 -1
  161. package/dist/browser/widgets/WidgetPills.js.map +1 -1
  162. package/dist/browser/widgets/WidgetStat.js.map +1 -1
  163. package/dist/browser/widgets/WidgetStatus.js.map +1 -1
  164. package/dist/ssr/actions/Button.js +16 -6
  165. package/dist/ssr/actions/Button.js.map +1 -1
  166. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  167. package/dist/ssr/actions/CopyButton.js +2 -1
  168. package/dist/ssr/actions/CopyButton.js.map +1 -1
  169. package/dist/ssr/actions/Disclosure.js.map +1 -1
  170. package/dist/ssr/actions/Dropdown.js +7 -6
  171. package/dist/ssr/actions/Dropdown.js.map +1 -1
  172. package/dist/ssr/actions/FilterChip.js +5 -4
  173. package/dist/ssr/actions/FilterChip.js.map +1 -1
  174. package/dist/ssr/actions/RemoveButton.js +1 -0
  175. package/dist/ssr/actions/RemoveButton.js.map +1 -1
  176. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  177. package/dist/ssr/actions/SplitButton.js +1 -0
  178. package/dist/ssr/actions/SplitButton.js.map +1 -1
  179. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  180. package/dist/ssr/actions/Tabs.js.map +1 -1
  181. package/dist/ssr/actions/Toolbar.js.map +1 -1
  182. package/dist/ssr/actions/index.js.map +1 -1
  183. package/dist/ssr/chat/ChatComposer.js +6 -5
  184. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  185. package/dist/ssr/chat/ChatContextPopup.js.map +1 -1
  186. package/dist/ssr/chat/ChatPrimitives.js +6 -5
  187. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  188. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  189. package/dist/ssr/chat/ChatTasks.js +1 -1
  190. package/dist/ssr/chat/ChatTasks.js.map +1 -1
  191. package/dist/ssr/chat/ChatTimeline.js +5 -4
  192. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  193. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  194. package/dist/ssr/chat/composer-document.js.map +1 -1
  195. package/dist/ssr/chat/index.js.map +1 -1
  196. package/dist/ssr/content/Calendar.js +2 -1
  197. package/dist/ssr/content/Calendar.js.map +1 -1
  198. package/dist/ssr/content/Chart.js.map +1 -1
  199. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  200. package/dist/ssr/content/ChartExplorerControls.js +5 -4
  201. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  202. package/dist/ssr/content/ChartFilterControls.js +3 -2
  203. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  204. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  205. package/dist/ssr/content/CodeDisplay.js.map +1 -1
  206. package/dist/ssr/content/DataTable.js +1 -0
  207. package/dist/ssr/content/DataTable.js.map +1 -1
  208. package/dist/ssr/content/Docs.js +1 -0
  209. package/dist/ssr/content/Docs.js.map +1 -1
  210. package/dist/ssr/content/FileBrowser.js +2 -1
  211. package/dist/ssr/content/FileBrowser.js.map +1 -1
  212. package/dist/ssr/content/FileGrid.js.map +1 -1
  213. package/dist/ssr/content/FileTree.js +2 -1
  214. package/dist/ssr/content/FileTree.js.map +1 -1
  215. package/dist/ssr/content/FileView.js +5 -4
  216. package/dist/ssr/content/FileView.js.map +1 -1
  217. package/dist/ssr/content/Lightbox.js +2 -1
  218. package/dist/ssr/content/Lightbox.js.map +1 -1
  219. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  220. package/dist/ssr/content/MarkdownView.js.map +1 -1
  221. package/dist/ssr/content/Pagination.js +2 -1
  222. package/dist/ssr/content/Pagination.js.map +1 -1
  223. package/dist/ssr/content/PdfPreview.js.map +1 -1
  224. package/dist/ssr/content/RangePicker.js.map +1 -1
  225. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  226. package/dist/ssr/content/ZoomPanViewport.js +300 -0
  227. package/dist/ssr/content/ZoomPanViewport.js.map +1 -0
  228. package/dist/ssr/content/calendar-event-layout.js.map +1 -1
  229. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  230. package/dist/ssr/content/chart-cursor.js.map +1 -1
  231. package/dist/ssr/content/chart-explorer.js.map +1 -1
  232. package/dist/ssr/content/chart-inspection.js.map +1 -1
  233. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  234. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  235. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  236. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  237. package/dist/ssr/content/chart-svg.js.map +1 -1
  238. package/dist/ssr/content/code-highlight.js.map +1 -1
  239. package/dist/ssr/content/collection-selection.js.map +1 -1
  240. package/dist/ssr/content/delimited-preferences.js.map +1 -1
  241. package/dist/ssr/content/file-tree.js.map +1 -1
  242. package/dist/ssr/content/file-view-preview.js.map +1 -1
  243. package/dist/ssr/content/index.js +1 -0
  244. package/dist/ssr/content/index.js.map +1 -1
  245. package/dist/ssr/content/zoom-pan.js +54 -0
  246. package/dist/ssr/content/zoom-pan.js.map +1 -0
  247. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  248. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  249. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  250. package/dist/ssr/feedback/index.js.map +1 -1
  251. package/dist/ssr/feedback/prompts.js +3 -2
  252. package/dist/ssr/feedback/prompts.js.map +1 -1
  253. package/dist/ssr/feedback/toast.js.map +1 -1
  254. package/dist/ssr/feedback/tooltip-position.js.map +1 -1
  255. package/dist/ssr/inputs/AutocompleteEditor.js +3 -2
  256. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  257. package/dist/ssr/inputs/AutocompleteSelect.js +5 -4
  258. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  259. package/dist/ssr/inputs/Checkbox.js +1 -0
  260. package/dist/ssr/inputs/Checkbox.js.map +1 -1
  261. package/dist/ssr/inputs/CheckboxCard.js.map +1 -1
  262. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  263. package/dist/ssr/inputs/ChoiceInputs.js +1 -0
  264. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  265. package/dist/ssr/inputs/Combobox.js +2 -1
  266. package/dist/ssr/inputs/Combobox.js.map +1 -1
  267. package/dist/ssr/inputs/DatePicker.js +4 -3
  268. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  269. package/dist/ssr/inputs/FileInputs.js +2 -1
  270. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  271. package/dist/ssr/inputs/MultiSelectInput.js +4 -3
  272. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  273. package/dist/ssr/inputs/NumberInput.js +2 -1
  274. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  275. package/dist/ssr/inputs/Select.js +4 -3
  276. package/dist/ssr/inputs/Select.js.map +1 -1
  277. package/dist/ssr/inputs/SelectChip.js +3 -2
  278. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  279. package/dist/ssr/inputs/SpecialInputs.js +1 -0
  280. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  281. package/dist/ssr/inputs/Switch.js.map +1 -1
  282. package/dist/ssr/inputs/TagEditor.js +3 -2
  283. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  284. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  285. package/dist/ssr/inputs/TemplateEditor.js +1 -0
  286. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  287. package/dist/ssr/inputs/TextInput.js +6 -4
  288. package/dist/ssr/inputs/TextInput.js.map +1 -1
  289. package/dist/ssr/inputs/choice.js.map +1 -1
  290. package/dist/ssr/inputs/completion/behaviors.js.map +1 -1
  291. package/dist/ssr/inputs/completion/engine.js.map +1 -1
  292. package/dist/ssr/inputs/completion/index.js.map +1 -1
  293. package/dist/ssr/inputs/completion/overlay.js.map +1 -1
  294. package/dist/ssr/inputs/date-picker.js.map +1 -1
  295. package/dist/ssr/inputs/editor-dom.js.map +1 -1
  296. package/dist/ssr/inputs/field-contract.js.map +1 -1
  297. package/dist/ssr/inputs/icon-options.js.map +1 -1
  298. package/dist/ssr/inputs/image-crop.js.map +1 -1
  299. package/dist/ssr/inputs/index.js.map +1 -1
  300. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  301. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  302. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  303. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  304. package/dist/ssr/inputs/markdown/active-formats.js.map +1 -1
  305. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
  306. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  307. package/dist/ssr/internal/color.js.map +1 -1
  308. package/dist/ssr/internal/field.js.map +1 -1
  309. package/dist/ssr/internal/portal.js.map +1 -1
  310. package/dist/ssr/intl/Format.js.map +1 -1
  311. package/dist/ssr/intl/index.js.map +1 -1
  312. package/dist/ssr/intl/locale.js.map +1 -1
  313. package/dist/ssr/intl/messages.js +6 -0
  314. package/dist/ssr/intl/messages.js.map +1 -1
  315. package/dist/ssr/layout/AppOverview.js +2 -1
  316. package/dist/ssr/layout/AppOverview.js.map +1 -1
  317. package/dist/ssr/layout/AppWorkspace.js +7 -6
  318. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  319. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  320. package/dist/ssr/layout/DataPanel.js +1 -0
  321. package/dist/ssr/layout/DataPanel.js.map +1 -1
  322. package/dist/ssr/layout/DetailPanel.js +1 -0
  323. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  324. package/dist/ssr/layout/Discussion.js +3 -2
  325. package/dist/ssr/layout/Discussion.js.map +1 -1
  326. package/dist/ssr/layout/FloatingWindow.js +1 -0
  327. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  328. package/dist/ssr/layout/Navigation.js +3 -2
  329. package/dist/ssr/layout/Navigation.js.map +1 -1
  330. package/dist/ssr/layout/PanelDialog.js +1 -0
  331. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  332. package/dist/ssr/layout/PanelHeader.js.map +1 -1
  333. package/dist/ssr/layout/Panes.js.map +1 -1
  334. package/dist/ssr/layout/PullToRefresh.js +1 -1
  335. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  336. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  337. package/dist/ssr/layout/Settings.js +2 -1
  338. package/dist/ssr/layout/Settings.js.map +1 -1
  339. package/dist/ssr/layout/SettingsCollection.js +1 -0
  340. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  341. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  342. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  343. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  344. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  345. package/dist/ssr/layout/floating-window-geometry.js.map +1 -1
  346. package/dist/ssr/layout/index.js.map +1 -1
  347. package/dist/ssr/layout/navigation-model.js.map +1 -1
  348. package/dist/ssr/layout/panes-layout.js.map +1 -1
  349. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  350. package/dist/ssr/layout/stable-id.js.map +1 -1
  351. package/dist/ssr/surfaces/Avatar.js +2 -1
  352. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  353. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  354. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  355. package/dist/ssr/surfaces/NotFoundState.js.map +1 -1
  356. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  357. package/dist/ssr/surfaces/Paper.js +2 -1
  358. package/dist/ssr/surfaces/Paper.js.map +1 -1
  359. package/dist/ssr/surfaces/Placeholder.js +2 -1
  360. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  361. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  362. package/dist/ssr/surfaces/StatCell.js +2 -1
  363. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  364. package/dist/ssr/surfaces/StatGrid.js +1 -0
  365. package/dist/ssr/surfaces/StatGrid.js.map +1 -1
  366. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  367. package/dist/ssr/surfaces/Tag.js.map +1 -1
  368. package/dist/ssr/surfaces/index.js.map +1 -1
  369. package/dist/ssr/widgets/Widget.js +1 -0
  370. package/dist/ssr/widgets/Widget.js.map +1 -1
  371. package/dist/ssr/widgets/WidgetHero.js.map +1 -1
  372. package/dist/ssr/widgets/WidgetList.js.map +1 -1
  373. package/dist/ssr/widgets/WidgetPills.js.map +1 -1
  374. package/dist/ssr/widgets/WidgetStat.js +1 -0
  375. package/dist/ssr/widgets/WidgetStat.js.map +1 -1
  376. package/dist/ssr/widgets/WidgetStatus.js.map +1 -1
  377. package/dist/styles.css +1 -1
  378. package/dist/types/actions/Button.d.ts +5 -0
  379. package/dist/types/actions/SplitButton.d.ts +1 -1
  380. package/dist/types/actions/SpotlightSearch.d.ts +1 -1
  381. package/dist/types/actions/index.d.ts +1 -1
  382. package/dist/types/content/ZoomPanViewport.d.ts +33 -0
  383. package/dist/types/content/index.d.ts +2 -0
  384. package/dist/types/content/zoom-pan.d.ts +29 -0
  385. package/dist/types/feedback/prompts.d.ts +4 -3
  386. package/dist/types/intl/messages.d.ts +3 -0
  387. package/package.json +9 -10
@@ -1 +1 @@
1
- {"version":3,"names":["Show","splitProps","createFieldMeta","fieldControlAria","commitFieldValue","resolveMaybeAccessor","Switch","props","local","rest","meta","id","checked","value","error","_el$","_$getNextElement","_tmpl$3","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_co$","_$getNextMarker","_el$9","_el$0","_co$2","_el$1","_el$10","_co$3","_$spread","_$mergeProps","controlId","name","disabled","required","event","currentTarget","_$insert","_c$","_$memo","label","_el$11","_tmpl$5","_el$13","_el$14","_co$4","_el$15","_el$16","_co$5","_$createComponent","when","children","_tmpl$4","_$effect","_$setAttribute","labelId","description","_el$7","_tmpl$","descriptionId","_el$8","_tmpl$2","errorId","_p$","_v$","class","_v$2","undefined","_v$3","e","_$className","t","a","_$runHydrationEvents"],"sources":["inputs/Switch.tsx"],"sourcesContent":["import { type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, fieldControlAria } from \"../internal/field\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\n\nexport type SwitchProps = ValueFieldProps<boolean> & {\n name?: string;\n};\n\nexport function Switch(props: SwitchProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"label\", \"onValueChange\", \"onValueCommit\", \"value\"]);\n const meta = createFieldMeta(props.id);\n const checked = () => resolveMaybeAccessor(local.value) ?? false;\n const error = () => resolveMaybeAccessor(props.error);\n\n return (\n <div\n class={`k2b-switch-field ${props.class ?? \"\"}`}\n data-disabled={rest.disabled ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n >\n <label class=\"k2b-switch\">\n <input\n id={meta.controlId}\n name={props.name}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked()}\n disabled={rest.disabled}\n required={rest.required}\n {...fieldControlAria(meta, props)}\n onChange={(event) => commitFieldValue(local, event.currentTarget.checked)}\n />\n <span class=\"k2b-switch__track\" aria-hidden=\"true\">\n <span class=\"k2b-switch__thumb\" />\n </span>\n {local.label && (\n <span id={meta.labelId} class=\"k2b-switch__label\">\n {local.label}\n <Show when={rest.required}>\n <span class=\"k2b-field__required\" aria-hidden=\"true\">\n *\n </span>\n </Show>\n </span>\n )}\n </label>\n <Show when={props.description}>\n <span id={meta.descriptionId} class=\"k2b-field__description\">\n {props.description}\n </span>\n </Show>\n <Show when={error()}>\n <p id={meta.errorId} class=\"k2b-field__error\" role=\"alert\" aria-live=\"polite\">\n {error()}\n </p>\n </Show>\n </div>\n );\n}\n\nexport default Switch;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/Switch.tsx"],"sourcesContent":["import { type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, fieldControlAria } from \"../internal/field\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\n\nexport type SwitchProps = ValueFieldProps<boolean> & {\n name?: string;\n};\n\nexport function Switch(props: SwitchProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"label\", \"onValueChange\", \"onValueCommit\", \"value\"]);\n const meta = createFieldMeta(props.id);\n const checked = () => resolveMaybeAccessor(local.value) ?? false;\n const error = () => resolveMaybeAccessor(props.error);\n\n return (\n <div\n class={`k2b-switch-field ${props.class ?? \"\"}`}\n data-disabled={rest.disabled ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n >\n <label class=\"k2b-switch\">\n <input\n id={meta.controlId}\n name={props.name}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked()}\n disabled={rest.disabled}\n required={rest.required}\n {...fieldControlAria(meta, props)}\n onChange={(event) => commitFieldValue(local, event.currentTarget.checked)}\n />\n <span class=\"k2b-switch__track\" aria-hidden=\"true\">\n <span class=\"k2b-switch__thumb\" />\n </span>\n {local.label && (\n <span id={meta.labelId} class=\"k2b-switch__label\">\n {local.label}\n <Show when={rest.required}>\n <span class=\"k2b-field__required\" aria-hidden=\"true\">\n *\n </span>\n </Show>\n </span>\n )}\n </label>\n <Show when={props.description}>\n <span id={meta.descriptionId} class=\"k2b-field__description\">\n {props.description}\n </span>\n </Show>\n <Show when={error()}>\n <p id={meta.errorId} class=\"k2b-field__error\" role=\"alert\" aria-live=\"polite\">\n {error()}\n </p>\n </Show>\n </div>\n );\n}\n\nexport default Switch;\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAmB,IAAI,EAAE,UAAU,QAAQ,UAAU;AACrD,SAAS,eAAe,EAAE,gBAAgB,QAAQ,mBAAmB;AAErE,SAAS,gBAAgB,EAAE,oBAAoB,QAAQ,kBAAkB;AAMzE,OAAO,SAAS,MAAM,CAAC,KAAkB,EAAe;EACtD,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;EAC7F,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;EACtC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK;EAChE,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC;EAErD;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA,IAQQ,EAAE;QAAA,OAAE,IAAI,CAAC,SAAS;MAAA;MAAA,IAClB,IAAI;QAAA,OAAE,KAAK,CAAC,IAAI;MAAA;MAAA,IAGhB,OAAO;QAAA,OAAE,OAAO,CAAC,CAAC;MAAA;MAAA,IAClB,QAAQ;QAAA,OAAE,IAAI,CAAC,QAAQ;MAAA;MAAA,IACvB,QAAQ;QAAA,OAAE,IAAI,CAAC,QAAQ;MAAA;IAAA,SACnB,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;MAAA,YACtB,KAAK,IAAK,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO;IAAC;IAAA;MAAA,yBAK1E,KAAK,CAAC,KAAK;MAAA,aAAX;QAAA;UAAA;UAAA;UAAA;UAAA;QAAA,uBAEI,KAAK,CAAC,KAAK;QAAA,mCACX,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,IAAI,CAAC,QAAQ;UAAA;UAAA;YAAA;UAAA;QAAA;QAAA,4CAFjB,IAAI,CAAC,OAAO;QAAA;MAAA,IAQvB;IAAA;IAAA,iCAEF,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,WAAW;MAAA;MAAA;QAAA;QAAA,sBAExB,KAAK,CAAC,WAAW;QAAA,2CADV,IAAI,CAAC,aAAa;QAAA;MAAA;IAAA;IAAA,iCAI7B,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,CAAC;MAAA;MAAA;QAAA;QAAA,gBAEd,KAAK;QAAA,2CADD,IAAI,CAAC,OAAO;QAAA;MAAA;IAAA;IAAA;MAAA,UApCd,oBAAoB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;QAAA,OAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS;QAAA,OACnC,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;IAAA;IAAA;IAAA;EAAA;AAwChD;AAEA,eAAe,MAAM","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createEffect","createSignal","For","onCleanup","Show","Button","IconButton","useUiMessages","Tag","ColorInput","TextInput","EditorForm","props","initialName","initial","name","initialColor","color","defaultColor","setName","setColor","error","setError","onDirtyChange","submit","event","preventDefault","normalized","trim","busy","undefined","onSave","cause","Error","message","saveError","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","_el$4","_co$","_$getNextMarker","nextSibling","_el$5","_el$6","_co$2","_el$10","_el$11","_co$5","_el$7","_el$8","_el$9","_co$3","_el$0","_el$1","_co$4","addEventListener","_$insert","_$createComponent","label","labels","placeholder","namePlaceholder","value","onValueChange","disabled","required","autofocus","aria-label","onValueCommit","compact","when","children","_el$12","_tmpl$2","type","size","loading","save","variant","onClick","onCancel","cancel","_$effect","_$setAttribute","TagEditor","messages","mode","setMode","busyId","setBusyId","rowError","setRowError","create","addTag","empty","noTagsYet","tagName","edit","remove","delete","run","id","action","tagActionFailed","_el$13","_tmpl$4","_el$15","_el$16","_co$6","_el$17","_el$18","_co$7","items","length","fallback","_el$19","_tmpl$5","_el$14","_tmpl$3","each","item","_el$20","_tmpl$6","_el$21","_el$22","_co$8","_el$23","_el$24","_co$9","_$memo","onUpdate","_el$25","_tmpl$8","_el$27","_el$28","_co$0","_el$29","_el$30","_co$1","Boolean","_tmpl$7","onDelete","catch","_tmpl$9","tagCouldNotBeSaved","_el$32","onCreate","_tmpl$0","_p$","_v$","class","_v$2","e","_$className","t"],"sources":["inputs/TagEditor.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Tag } from \"../surfaces/Tag\";\nimport { ColorInput } from \"./ChoiceInputs\";\nimport { TextInput } from \"./TextInput\";\n\nexport type TagEditorItem = {\n id: string;\n name: string;\n color?: string | null;\n};\n\nexport type TagEditorValue = {\n name: string;\n color: string;\n};\n\nexport type TagEditorLabels = {\n create: string;\n empty: string;\n name: string;\n namePlaceholder: string;\n color: string;\n save: string;\n cancel: string;\n edit: string;\n remove: string;\n};\n\nexport type TagEditorProps<T extends TagEditorItem = TagEditorItem> = {\n items: readonly T[];\n onCreate?: (value: TagEditorValue) => void | Promise<void>;\n onUpdate?: (item: T, value: TagEditorValue) => void | Promise<void>;\n onDelete?: (item: T) => void | Promise<void>;\n labels?: Partial<TagEditorLabels>;\n defaultColor?: string;\n disabled?: boolean;\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\ntype EditorFormProps = {\n initial?: TagEditorItem;\n labels: TagEditorLabels;\n defaultColor: string;\n busy: boolean;\n saveError: string;\n onCancel: () => void;\n onDirtyChange?: (dirty: boolean) => void;\n onSave: (value: TagEditorValue) => Promise<void>;\n};\n\nfunction EditorForm(props: EditorFormProps): JSX.Element {\n const initialName = props.initial?.name ?? \"\";\n const initialColor = props.initial?.color ?? props.defaultColor;\n const [name, setName] = createSignal(initialName);\n const [color, setColor] = createSignal(initialColor);\n const [error, setError] = createSignal<string>();\n\n createEffect(() => props.onDirtyChange?.(name() !== initialName || color() !== initialColor));\n onCleanup(() => props.onDirtyChange?.(false));\n\n const submit = async (event: SubmitEvent) => {\n event.preventDefault();\n const normalized = name().trim();\n if (!normalized || props.busy) return;\n setError(undefined);\n try {\n await props.onSave({ name: normalized, color: color() });\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : props.saveError);\n }\n };\n\n return (\n <form class=\"k2b-tag-editor__form\" aria-busy={props.busy ? \"true\" : undefined} onSubmit={submit}>\n <div class=\"k2b-tag-editor__fields\">\n <TextInput\n label={props.labels.name}\n placeholder={props.labels.namePlaceholder}\n value={name}\n onValueChange={setName}\n disabled={props.busy}\n required\n autofocus\n />\n <ColorInput\n aria-label={props.labels.color}\n value={color}\n onValueChange={setColor}\n onValueCommit={setColor}\n disabled={props.busy}\n compact\n />\n </div>\n <Show when={error()}>\n {(message) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {message()}\n </p>\n )}\n </Show>\n <div class=\"k2b-tag-editor__form-actions\">\n <Button type=\"submit\" size=\"sm\" loading={props.busy} disabled={!name().trim()}>\n {props.labels.save}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={props.busy} onClick={props.onCancel}>\n {props.labels.cancel}\n </Button>\n </div>\n </form>\n );\n}\n\n/** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */\nexport function TagEditor<T extends TagEditorItem = TagEditorItem>(props: TagEditorProps<T>): JSX.Element {\n const messages = useUiMessages();\n const [mode, setMode] = createSignal<\"create\" | string | null>(null);\n const [busyId, setBusyId] = createSignal<string | null>(null);\n const [rowError, setRowError] = createSignal<{ id: string; message: string }>();\n const labels = (): TagEditorLabels => ({\n create: messages().addTag,\n empty: messages().noTagsYet,\n name: messages().name,\n namePlaceholder: messages().tagName,\n color: messages().color,\n save: messages().save,\n cancel: messages().cancel,\n edit: messages().edit,\n remove: messages().delete,\n ...props.labels,\n });\n const defaultColor = () => props.defaultColor ?? \"#6b7280\";\n const run = async (id: string, action: () => void | Promise<void>) => {\n if (busyId()) return;\n setBusyId(id);\n setRowError(undefined);\n try {\n await action();\n setMode(null);\n } catch (cause) {\n setRowError({ id, message: cause instanceof Error ? cause.message : messages().tagActionFailed });\n throw cause;\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <div class={`k2b-tag-editor ${props.class ?? \"\"}`} data-disabled={props.disabled ? \"true\" : undefined}>\n <Show when={props.items.length > 0} fallback={<p class=\"k2b-tag-editor__empty\">{labels().empty}</p>}>\n <ul class=\"k2b-tag-editor__list\">\n <For each={props.items}>\n {(item) => (\n <li class=\"k2b-tag-editor__row\">\n <Show\n when={mode() === item.id && props.onUpdate}\n fallback={\n <>\n <Tag color={item.color}>{item.name}</Tag>\n <span class=\"k2b-tag-editor__row-actions\">\n <Show when={props.onUpdate}>\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().edit} ${item.name}`}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => setMode(item.id)}\n >\n <i class=\"ti ti-pencil\" aria-hidden=\"true\" />\n </IconButton>\n </Show>\n <Show when={props.onDelete}>\n {(remove) => (\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().remove} ${item.name}`}\n loading={busyId() === item.id}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => void run(item.id, () => remove()(item)).catch(() => undefined)}\n >\n <i class=\"ti ti-trash\" aria-hidden=\"true\" />\n </IconButton>\n )}\n </Show>\n </span>\n </>\n }\n >\n <EditorForm\n initial={item}\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === item.id}\n saveError={messages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(item.id, () => props.onUpdate?.(item, value))}\n />\n </Show>\n <Show when={rowError()?.id === item.id && mode() !== item.id ? rowError() : undefined}>\n {(error) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {error().message}\n </p>\n )}\n </Show>\n </li>\n )}\n </For>\n </ul>\n </Show>\n\n <Show when={props.onCreate}>\n {(create) => (\n <Show\n when={mode() === \"create\"}\n fallback={\n <Button size=\"xs\" variant=\"subtle\" disabled={props.disabled || Boolean(busyId())} onClick={() => setMode(\"create\")}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n {labels().create}\n </Button>\n }\n >\n <EditorForm\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === \"create\"}\n saveError={messages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(\"create\", () => create()(value))}\n />\n </Show>\n )}\n </Show>\n </div>\n );\n}\n\nexport default TagEditor;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TagEditor.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Tag } from \"../surfaces/Tag\";\nimport { ColorInput } from \"./ChoiceInputs\";\nimport { TextInput } from \"./TextInput\";\n\nexport type TagEditorItem = {\n id: string;\n name: string;\n color?: string | null;\n};\n\nexport type TagEditorValue = {\n name: string;\n color: string;\n};\n\nexport type TagEditorLabels = {\n create: string;\n empty: string;\n name: string;\n namePlaceholder: string;\n color: string;\n save: string;\n cancel: string;\n edit: string;\n remove: string;\n};\n\nexport type TagEditorProps<T extends TagEditorItem = TagEditorItem> = {\n items: readonly T[];\n onCreate?: (value: TagEditorValue) => void | Promise<void>;\n onUpdate?: (item: T, value: TagEditorValue) => void | Promise<void>;\n onDelete?: (item: T) => void | Promise<void>;\n labels?: Partial<TagEditorLabels>;\n defaultColor?: string;\n disabled?: boolean;\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\ntype EditorFormProps = {\n initial?: TagEditorItem;\n labels: TagEditorLabels;\n defaultColor: string;\n busy: boolean;\n saveError: string;\n onCancel: () => void;\n onDirtyChange?: (dirty: boolean) => void;\n onSave: (value: TagEditorValue) => Promise<void>;\n};\n\nfunction EditorForm(props: EditorFormProps): JSX.Element {\n const initialName = props.initial?.name ?? \"\";\n const initialColor = props.initial?.color ?? props.defaultColor;\n const [name, setName] = createSignal(initialName);\n const [color, setColor] = createSignal(initialColor);\n const [error, setError] = createSignal<string>();\n\n createEffect(() => props.onDirtyChange?.(name() !== initialName || color() !== initialColor));\n onCleanup(() => props.onDirtyChange?.(false));\n\n const submit = async (event: SubmitEvent) => {\n event.preventDefault();\n const normalized = name().trim();\n if (!normalized || props.busy) return;\n setError(undefined);\n try {\n await props.onSave({ name: normalized, color: color() });\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : props.saveError);\n }\n };\n\n return (\n <form class=\"k2b-tag-editor__form\" aria-busy={props.busy ? \"true\" : undefined} onSubmit={submit}>\n <div class=\"k2b-tag-editor__fields\">\n <TextInput\n label={props.labels.name}\n placeholder={props.labels.namePlaceholder}\n value={name}\n onValueChange={setName}\n disabled={props.busy}\n required\n autofocus\n />\n <ColorInput\n aria-label={props.labels.color}\n value={color}\n onValueChange={setColor}\n onValueCommit={setColor}\n disabled={props.busy}\n compact\n />\n </div>\n <Show when={error()}>\n {(message) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {message()}\n </p>\n )}\n </Show>\n <div class=\"k2b-tag-editor__form-actions\">\n <Button type=\"submit\" size=\"sm\" loading={props.busy} disabled={!name().trim()}>\n {props.labels.save}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={props.busy} onClick={props.onCancel}>\n {props.labels.cancel}\n </Button>\n </div>\n </form>\n );\n}\n\n/** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */\nexport function TagEditor<T extends TagEditorItem = TagEditorItem>(props: TagEditorProps<T>): JSX.Element {\n const messages = useUiMessages();\n const [mode, setMode] = createSignal<\"create\" | string | null>(null);\n const [busyId, setBusyId] = createSignal<string | null>(null);\n const [rowError, setRowError] = createSignal<{ id: string; message: string }>();\n const labels = (): TagEditorLabels => ({\n create: messages().addTag,\n empty: messages().noTagsYet,\n name: messages().name,\n namePlaceholder: messages().tagName,\n color: messages().color,\n save: messages().save,\n cancel: messages().cancel,\n edit: messages().edit,\n remove: messages().delete,\n ...props.labels,\n });\n const defaultColor = () => props.defaultColor ?? \"#6b7280\";\n const run = async (id: string, action: () => void | Promise<void>) => {\n if (busyId()) return;\n setBusyId(id);\n setRowError(undefined);\n try {\n await action();\n setMode(null);\n } catch (cause) {\n setRowError({ id, message: cause instanceof Error ? cause.message : messages().tagActionFailed });\n throw cause;\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <div class={`k2b-tag-editor ${props.class ?? \"\"}`} data-disabled={props.disabled ? \"true\" : undefined}>\n <Show when={props.items.length > 0} fallback={<p class=\"k2b-tag-editor__empty\">{labels().empty}</p>}>\n <ul class=\"k2b-tag-editor__list\">\n <For each={props.items}>\n {(item) => (\n <li class=\"k2b-tag-editor__row\">\n <Show\n when={mode() === item.id && props.onUpdate}\n fallback={\n <>\n <Tag color={item.color}>{item.name}</Tag>\n <span class=\"k2b-tag-editor__row-actions\">\n <Show when={props.onUpdate}>\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().edit} ${item.name}`}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => setMode(item.id)}\n >\n <i class=\"ti ti-pencil\" aria-hidden=\"true\" />\n </IconButton>\n </Show>\n <Show when={props.onDelete}>\n {(remove) => (\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().remove} ${item.name}`}\n loading={busyId() === item.id}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => void run(item.id, () => remove()(item)).catch(() => undefined)}\n >\n <i class=\"ti ti-trash\" aria-hidden=\"true\" />\n </IconButton>\n )}\n </Show>\n </span>\n </>\n }\n >\n <EditorForm\n initial={item}\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === item.id}\n saveError={messages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(item.id, () => props.onUpdate?.(item, value))}\n />\n </Show>\n <Show when={rowError()?.id === item.id && mode() !== item.id ? rowError() : undefined}>\n {(error) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {error().message}\n </p>\n )}\n </Show>\n </li>\n )}\n </For>\n </ul>\n </Show>\n\n <Show when={props.onCreate}>\n {(create) => (\n <Show\n when={mode() === \"create\"}\n fallback={\n <Button size=\"xs\" variant=\"subtle\" disabled={props.disabled || Boolean(busyId())} onClick={() => setMode(\"create\")}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n {labels().create}\n </Button>\n }\n >\n <EditorForm\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === \"create\"}\n saveError={messages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(\"create\", () => create()(value))}\n />\n </Show>\n )}\n </Show>\n </div>\n );\n}\n\nexport default TagEditor;\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createEffect","createSignal","createUniqueId","Show","createFieldMeta","Field","fieldControlAria","useUiMessages","resolveMaybeAccessor","TagsInput","props","messages","meta","id","announcementId","error","placeholder","tagsPlaceholder","focused","setFocused","focusStartValue","normalize","text","replace","trim","parseTags","tags","seen","Set","limit","maxTags","undefined","Number","POSITIVE_INFINITY","Math","max","floor","rawTag","split","tag","has","length","add","push","value","join","draft","setDraft","announce","previous","next","previousTags","nextTags","added","filter","removed","announcement","document","getElementById","textContent","tagsAdded","tagsRemoved","Boolean","_$createComponent","class","label","description","labelFor","required","disabled","children","_el$","_$getNextElement","_tmpl$2","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$7","_el$8","_co$","_$getNextMarker","_el$6","_$insert","when","_el$5","_tmpl$","fallback","_el$0","_tmpl$4","map","_el$1","_tmpl$5","_$spread","_$mergeProps","controlId","_$memo","onFocus","event","nextDraft","currentTarget","onValueChange","onBlur","onValueCommit","key","preventDefault","blur","_$effect","_p$","_v$","_v$2","_v$3","icon","_v$4","activeIcon","e","_$setAttribute","t","a","_$className","o","_$runHydrationEvents","name","_el$10","_tmpl$6","_$setProperty","_el$9","_tmpl$3"],"sources":["inputs/TagsInput.tsx"],"sourcesContent":["import { createEffect, createSignal, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\n\nexport type TagsInputProps = ValueFieldProps<string[]> & {\n placeholder?: string;\n icon?: string;\n activeIcon?: string;\n maxTags?: number;\n name?: string;\n};\n\nexport function TagsInput(props: TagsInputProps): JSX.Element {\n const messages = useUiMessages();\n const meta = createFieldMeta(props.id);\n const announcementId = `k2b-tags-${createUniqueId()}`;\n const error = () => resolveMaybeAccessor(props.error);\n const placeholder = () => props.placeholder ?? messages().tagsPlaceholder;\n const [focused, setFocused] = createSignal(false);\n let focusStartValue: readonly string[] = [];\n const normalize = (text: string) => text.replace(/\\s+/g, \" \").trim();\n const parseTags = (text: string): string[] => {\n const tags: string[] = [];\n const seen = new Set<string>();\n const limit = props.maxTags === undefined ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(props.maxTags));\n for (const rawTag of text.split(\",\")) {\n const tag = normalize(rawTag);\n if (!tag || seen.has(tag)) continue;\n if (tags.length >= limit) break;\n seen.add(tag);\n tags.push(tag);\n }\n return tags;\n };\n const value = () => parseTags((resolveMaybeAccessor(props.value) ?? []).join(\",\"));\n const [draft, setDraft] = createSignal(value().join(\", \"));\n createEffect(() => {\n if (!focused()) setDraft(value().join(\", \"));\n });\n\n const announce = (previous: readonly string[], next: readonly string[]) => {\n const previousTags = new Set(previous);\n const nextTags = new Set(next);\n const added = next.filter((tag) => !previousTags.has(tag));\n const removed = previous.filter((tag) => !nextTags.has(tag));\n const announcement = document.getElementById(announcementId);\n if (announcement) {\n announcement.textContent = [\n added.length ? messages().tagsAdded({ tags: added.join(\", \") }) : \"\",\n removed.length ? messages().tagsRemoved({ tags: removed.join(\", \") }) : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n labelFor={false}\n required={props.required}\n disabled={props.disabled}\n >\n <div class=\"k2b-tags-input\" data-invalid={error() ? \"true\" : undefined} data-disabled={props.disabled ? \"true\" : undefined}>\n <span class=\"k2b-tags-input__icon\" aria-hidden=\"true\">\n <i class={`${props.icon ?? \"ti ti-tag\"} k2b-tags-input__icon-idle`} />\n <i class={`${props.activeIcon ?? \"ti ti-pencil\"} k2b-tags-input__icon-active`} />\n </span>\n <Show when={!focused()}>\n <span class=\"k2b-tags-input__values\" aria-hidden=\"true\">\n <Show when={value().length > 0} fallback={<span class=\"k2b-tags-input__placeholder\">{placeholder()}</span>}>\n {value().map((tag) => (\n <span class=\"k2b-tag\">{tag}</span>\n ))}\n </Show>\n </span>\n </Show>\n <input\n id={meta.controlId}\n type=\"text\"\n {...fieldControlAria(meta, props)}\n disabled={props.disabled}\n placeholder={focused() || value().length === 0 ? placeholder() : undefined}\n value={draft()}\n onFocus={() => {\n if (props.disabled) return;\n focusStartValue = value();\n setDraft(focusStartValue.join(\", \"));\n setFocused(true);\n }}\n onInput={(event) => {\n if (props.disabled) return;\n const nextDraft = event.currentTarget.value;\n setDraft(nextDraft);\n props.onValueChange?.(parseTags(nextDraft));\n }}\n onBlur={() => {\n if (props.disabled) return;\n const next = parseTags(draft());\n announce(focusStartValue, next);\n props.onValueCommit?.(next);\n setFocused(false);\n }}\n onKeyDown={(event) => event.key === \"Enter\" && (event.preventDefault(), event.currentTarget.blur())}\n />\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value().join(\",\")} />}</Show>\n <div id={announcementId} class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" />\n </Field>\n );\n}\n\nexport default TagsInput;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TagsInput.tsx"],"sourcesContent":["import { createEffect, createSignal, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\n\nexport type TagsInputProps = ValueFieldProps<string[]> & {\n placeholder?: string;\n icon?: string;\n activeIcon?: string;\n maxTags?: number;\n name?: string;\n};\n\nexport function TagsInput(props: TagsInputProps): JSX.Element {\n const messages = useUiMessages();\n const meta = createFieldMeta(props.id);\n const announcementId = `k2b-tags-${createUniqueId()}`;\n const error = () => resolveMaybeAccessor(props.error);\n const placeholder = () => props.placeholder ?? messages().tagsPlaceholder;\n const [focused, setFocused] = createSignal(false);\n let focusStartValue: readonly string[] = [];\n const normalize = (text: string) => text.replace(/\\s+/g, \" \").trim();\n const parseTags = (text: string): string[] => {\n const tags: string[] = [];\n const seen = new Set<string>();\n const limit = props.maxTags === undefined ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(props.maxTags));\n for (const rawTag of text.split(\",\")) {\n const tag = normalize(rawTag);\n if (!tag || seen.has(tag)) continue;\n if (tags.length >= limit) break;\n seen.add(tag);\n tags.push(tag);\n }\n return tags;\n };\n const value = () => parseTags((resolveMaybeAccessor(props.value) ?? []).join(\",\"));\n const [draft, setDraft] = createSignal(value().join(\", \"));\n createEffect(() => {\n if (!focused()) setDraft(value().join(\", \"));\n });\n\n const announce = (previous: readonly string[], next: readonly string[]) => {\n const previousTags = new Set(previous);\n const nextTags = new Set(next);\n const added = next.filter((tag) => !previousTags.has(tag));\n const removed = previous.filter((tag) => !nextTags.has(tag));\n const announcement = document.getElementById(announcementId);\n if (announcement) {\n announcement.textContent = [\n added.length ? messages().tagsAdded({ tags: added.join(\", \") }) : \"\",\n removed.length ? messages().tagsRemoved({ tags: removed.join(\", \") }) : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n labelFor={false}\n required={props.required}\n disabled={props.disabled}\n >\n <div class=\"k2b-tags-input\" data-invalid={error() ? \"true\" : undefined} data-disabled={props.disabled ? \"true\" : undefined}>\n <span class=\"k2b-tags-input__icon\" aria-hidden=\"true\">\n <i class={`${props.icon ?? \"ti ti-tag\"} k2b-tags-input__icon-idle`} />\n <i class={`${props.activeIcon ?? \"ti ti-pencil\"} k2b-tags-input__icon-active`} />\n </span>\n <Show when={!focused()}>\n <span class=\"k2b-tags-input__values\" aria-hidden=\"true\">\n <Show when={value().length > 0} fallback={<span class=\"k2b-tags-input__placeholder\">{placeholder()}</span>}>\n {value().map((tag) => (\n <span class=\"k2b-tag\">{tag}</span>\n ))}\n </Show>\n </span>\n </Show>\n <input\n id={meta.controlId}\n type=\"text\"\n {...fieldControlAria(meta, props)}\n disabled={props.disabled}\n placeholder={focused() || value().length === 0 ? placeholder() : undefined}\n value={draft()}\n onFocus={() => {\n if (props.disabled) return;\n focusStartValue = value();\n setDraft(focusStartValue.join(\", \"));\n setFocused(true);\n }}\n onInput={(event) => {\n if (props.disabled) return;\n const nextDraft = event.currentTarget.value;\n setDraft(nextDraft);\n props.onValueChange?.(parseTags(nextDraft));\n }}\n onBlur={() => {\n if (props.disabled) return;\n const next = parseTags(draft());\n announce(focusStartValue, next);\n props.onValueCommit?.(next);\n setFocused(false);\n }}\n onKeyDown={(event) => event.key === \"Enter\" && (event.preventDefault(), event.currentTarget.blur())}\n />\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value().join(\",\")} />}</Show>\n <div id={announcementId} class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" />\n </Field>\n );\n}\n\nexport default TagsInput;\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createMemo","For","useUiMessages","PANES_LAYOUT_VERSION","AutocompleteEditor","TextInput","createTemplateEditorPanesLayout","version","root","type","direction","ratio","first","items","active","second","HTML_TAGS","name","snippet","hint","suggestion","text","label","appendSpace","templateCompletions","variables","trigger","dropdown","allowAfterWord","suggest","query","context","normalized","toLowerCase","leadingBrace","tokenStart","fullText","open","close","values","filter","variable","startsWith","map","kind","conditions","loops","tag","escapeHtml","value","replace","highlightLiquidToken","token","inner","trim","keyword","split","includes","highlightTag","match","attrs","highlightTemplate","stashed","escaped","marker","length","push","withTags","_","index","Number","TemplateEditor","props","messages","completions","_$createComponent","_$mergeProps","lines","spellcheck","placeholder","templateEditorPlaceholder","highlight","TemplatePreview","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_$effect","_p$","_v$","class","_v$2","html","_v$3","title","templatePreview","e","_$className","t","_$setAttribute","a","undefined","TemplateSampleData","_el$3","_tmpl$2","_$insert","each","children","description","onValueChange"],"sources":["inputs/TemplateEditor.tsx"],"sourcesContent":["import { createMemo, For, type JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PANES_LAYOUT_VERSION, type PanesLayout } from \"../layout/panes-layout\";\nimport { AutocompleteEditor, type AutocompleteEditorProps } from \"./AutocompleteEditor\";\nimport type { Completion, Suggestion } from \"./completion\";\nimport { TextInput } from \"./TextInput\";\n\nexport type TemplateVariableKind = \"string\" | \"email\" | \"url\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n\nexport type TemplateVariable = {\n name: string;\n kind?: TemplateVariableKind;\n description?: string;\n};\n\nexport type TemplateEditorProps = Omit<AutocompleteEditorProps, \"completions\" | \"highlight\"> & {\n variables: readonly TemplateVariable[];\n};\n\nexport type TemplatePreviewProps = {\n html: string;\n title?: string;\n class?: string;\n};\n\nexport type TemplateSampleDataProps = {\n variables: readonly TemplateVariable[];\n values: Readonly<Record<string, string>>;\n onValueChange: (name: string, value: string) => void;\n class?: string;\n};\n\nexport type TemplateEditorLayout = PanesLayout;\n\nexport const createTemplateEditorPanesLayout = (): TemplateEditorLayout => ({\n version: PANES_LAYOUT_VERSION,\n root: {\n type: \"split\",\n direction: \"horizontal\",\n ratio: 0.5,\n first: { type: \"group\", items: [\"html\"], active: \"html\" },\n second: { type: \"group\", items: [\"preview\", \"sample-data\"], active: \"preview\" },\n },\n});\n\nconst HTML_TAGS = [\n { name: \"p\", snippet: \"<p></p>\", hint: \"paragraph\" },\n {\n name: \"a\",\n snippet: '<a href=\"{{ LOGIN_URL }}\">Link</a>',\n hint: \"link\",\n },\n { name: \"strong\", snippet: \"<strong></strong>\", hint: \"bold\" },\n { name: \"em\", snippet: \"<em></em>\", hint: \"emphasis\" },\n { name: \"br\", snippet: \"<br>\", hint: \"line break\" },\n { name: \"ul\", snippet: \"<ul>\\n <li></li>\\n</ul>\", hint: \"list\" },\n {\n name: \"table\",\n snippet: \"<table>\\n <tr><td></td></tr>\\n</table>\",\n hint: \"table\",\n },\n] as const;\n\nconst suggestion = (text: string, hint: string, label?: string): Suggestion => ({ text, hint, label, appendSpace: false });\n\nconst templateCompletions = (variables: readonly TemplateVariable[]): Completion[] => [\n {\n trigger: \"{\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query, context) => {\n const normalized = query.toLowerCase();\n const leadingBrace = context.tokenStart > 0 && context.fullText[context.tokenStart - 1] === \"{\";\n const open = leadingBrace ? \"{ \" : \"{{ \";\n const close = leadingBrace ? \" }}\" : \" }}\";\n const values = variables\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`${open}${variable.name}${close}`, variable.kind ?? \"string\", variable.name));\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...values, ...conditions, ...loops];\n },\n },\n {\n trigger: \"%\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...conditions, ...loops];\n },\n },\n {\n trigger: \"<\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n return HTML_TAGS.filter((tag) => tag.name.startsWith(normalized)).map((tag) => suggestion(tag.snippet, tag.hint, tag.name));\n },\n },\n];\n\nconst escapeHtml = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n\nconst highlightLiquidToken = (token: string): string => {\n const inner = token.replace(/^\\{\\{|\\}\\}$|^\\{%|\\%}$/g, \"\").trim();\n const keyword = inner.split(/\\s+/)[0] ?? \"\";\n const kind = token.startsWith(\"{%\") ? (keyword.startsWith(\"end\") ? \"end\" : \"control\") : inner.includes(\"| raw\") ? \"raw\" : \"value\";\n return `<span class=\"k2b-template-token\" data-kind=\"${kind}\">${escapeHtml(token)}</span>`;\n};\n\nconst highlightTag = (tag: string): string => {\n const match = tag.match(/^(&lt;\\/?)([a-zA-Z][\\w:-]*)([\\s\\S]*?)(&gt;)$/);\n if (!match) return `<span class=\"k2b-template-tag\">${tag}</span>`;\n const attrs = (match[3] ?? \"\").replace(\n /([\\w:-]+)(=)(&quot;[\\s\\S]*?&quot;|'[\\s\\S]*?'|[^\\s&]+)/g,\n '<span class=\"k2b-template-attribute\">$1</span><span class=\"k2b-template-punctuation\">$2</span><span class=\"k2b-template-string\">$3</span>',\n );\n return `<span class=\"k2b-template-punctuation\">${match[1]}</span><span class=\"k2b-template-tag\">${match[2]}</span>${attrs}<span class=\"k2b-template-punctuation\">${match[4]}</span>`;\n};\n\nconst highlightTemplate = (text: string): string => {\n const stashed: string[] = [];\n const escaped = escapeHtml(text).replace(/{{[\\s\\S]*?}}|{%[\\s\\S]*?%}/g, (token) => {\n const marker = `\\uE000${stashed.length}\\uE001`;\n stashed.push(highlightLiquidToken(token));\n return marker;\n });\n const withTags = escaped.replace(/&lt;!--[\\s\\S]*?--&gt;|&lt;\\/?[a-zA-Z][\\s\\S]*?&gt;/g, (tag) =>\n tag.startsWith(\"&lt;!--\") ? `<span class=\"k2b-template-comment\">${tag}</span>` : highlightTag(tag),\n );\n return withTags.replace(/\\uE000(\\d+)\\uE001/g, (_, index) => stashed[Number(index)] ?? \"\");\n};\n\nexport function TemplateEditor(props: TemplateEditorProps): JSX.Element {\n const messages = useUiMessages();\n const completions = createMemo(() => templateCompletions(props.variables));\n return (\n <AutocompleteEditor\n {...props}\n lines={props.lines ?? 22}\n spellcheck={props.spellcheck ?? false}\n placeholder={props.placeholder ?? messages().templateEditorPlaceholder}\n highlight={highlightTemplate}\n completions={completions()}\n />\n );\n}\n\nexport function TemplatePreview(props: TemplatePreviewProps): JSX.Element {\n const messages = useUiMessages();\n return (\n <section class={`k2b-template-preview ${props.class ?? \"\"}`}>\n <iframe sandbox=\"\" srcdoc={props.html} title={props.title ?? messages().templatePreview} />\n </section>\n );\n}\n\nexport function TemplateSampleData(props: TemplateSampleDataProps): JSX.Element {\n return (\n <section class={`k2b-template-sample ${props.class ?? \"\"}`}>\n <For each={props.variables}>\n {(variable) => (\n <TextInput\n label={`{{ ${variable.name} }}`}\n description={variable.description}\n value={props.values[variable.name] ?? \"\"}\n onValueChange={(value) => props.onValueChange(variable.name, value)}\n />\n )}\n </For>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TemplateEditor.tsx"],"sourcesContent":["import { createMemo, For, type JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PANES_LAYOUT_VERSION, type PanesLayout } from \"../layout/panes-layout\";\nimport { AutocompleteEditor, type AutocompleteEditorProps } from \"./AutocompleteEditor\";\nimport type { Completion, Suggestion } from \"./completion\";\nimport { TextInput } from \"./TextInput\";\n\nexport type TemplateVariableKind = \"string\" | \"email\" | \"url\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n\nexport type TemplateVariable = {\n name: string;\n kind?: TemplateVariableKind;\n description?: string;\n};\n\nexport type TemplateEditorProps = Omit<AutocompleteEditorProps, \"completions\" | \"highlight\"> & {\n variables: readonly TemplateVariable[];\n};\n\nexport type TemplatePreviewProps = {\n html: string;\n title?: string;\n class?: string;\n};\n\nexport type TemplateSampleDataProps = {\n variables: readonly TemplateVariable[];\n values: Readonly<Record<string, string>>;\n onValueChange: (name: string, value: string) => void;\n class?: string;\n};\n\nexport type TemplateEditorLayout = PanesLayout;\n\nexport const createTemplateEditorPanesLayout = (): TemplateEditorLayout => ({\n version: PANES_LAYOUT_VERSION,\n root: {\n type: \"split\",\n direction: \"horizontal\",\n ratio: 0.5,\n first: { type: \"group\", items: [\"html\"], active: \"html\" },\n second: { type: \"group\", items: [\"preview\", \"sample-data\"], active: \"preview\" },\n },\n});\n\nconst HTML_TAGS = [\n { name: \"p\", snippet: \"<p></p>\", hint: \"paragraph\" },\n {\n name: \"a\",\n snippet: '<a href=\"{{ LOGIN_URL }}\">Link</a>',\n hint: \"link\",\n },\n { name: \"strong\", snippet: \"<strong></strong>\", hint: \"bold\" },\n { name: \"em\", snippet: \"<em></em>\", hint: \"emphasis\" },\n { name: \"br\", snippet: \"<br>\", hint: \"line break\" },\n { name: \"ul\", snippet: \"<ul>\\n <li></li>\\n</ul>\", hint: \"list\" },\n {\n name: \"table\",\n snippet: \"<table>\\n <tr><td></td></tr>\\n</table>\",\n hint: \"table\",\n },\n] as const;\n\nconst suggestion = (text: string, hint: string, label?: string): Suggestion => ({ text, hint, label, appendSpace: false });\n\nconst templateCompletions = (variables: readonly TemplateVariable[]): Completion[] => [\n {\n trigger: \"{\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query, context) => {\n const normalized = query.toLowerCase();\n const leadingBrace = context.tokenStart > 0 && context.fullText[context.tokenStart - 1] === \"{\";\n const open = leadingBrace ? \"{ \" : \"{{ \";\n const close = leadingBrace ? \" }}\" : \" }}\";\n const values = variables\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`${open}${variable.name}${close}`, variable.kind ?? \"string\", variable.name));\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...values, ...conditions, ...loops];\n },\n },\n {\n trigger: \"%\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...conditions, ...loops];\n },\n },\n {\n trigger: \"<\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n return HTML_TAGS.filter((tag) => tag.name.startsWith(normalized)).map((tag) => suggestion(tag.snippet, tag.hint, tag.name));\n },\n },\n];\n\nconst escapeHtml = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n\nconst highlightLiquidToken = (token: string): string => {\n const inner = token.replace(/^\\{\\{|\\}\\}$|^\\{%|\\%}$/g, \"\").trim();\n const keyword = inner.split(/\\s+/)[0] ?? \"\";\n const kind = token.startsWith(\"{%\") ? (keyword.startsWith(\"end\") ? \"end\" : \"control\") : inner.includes(\"| raw\") ? \"raw\" : \"value\";\n return `<span class=\"k2b-template-token\" data-kind=\"${kind}\">${escapeHtml(token)}</span>`;\n};\n\nconst highlightTag = (tag: string): string => {\n const match = tag.match(/^(&lt;\\/?)([a-zA-Z][\\w:-]*)([\\s\\S]*?)(&gt;)$/);\n if (!match) return `<span class=\"k2b-template-tag\">${tag}</span>`;\n const attrs = (match[3] ?? \"\").replace(\n /([\\w:-]+)(=)(&quot;[\\s\\S]*?&quot;|'[\\s\\S]*?'|[^\\s&]+)/g,\n '<span class=\"k2b-template-attribute\">$1</span><span class=\"k2b-template-punctuation\">$2</span><span class=\"k2b-template-string\">$3</span>',\n );\n return `<span class=\"k2b-template-punctuation\">${match[1]}</span><span class=\"k2b-template-tag\">${match[2]}</span>${attrs}<span class=\"k2b-template-punctuation\">${match[4]}</span>`;\n};\n\nconst highlightTemplate = (text: string): string => {\n const stashed: string[] = [];\n const escaped = escapeHtml(text).replace(/{{[\\s\\S]*?}}|{%[\\s\\S]*?%}/g, (token) => {\n const marker = `\\uE000${stashed.length}\\uE001`;\n stashed.push(highlightLiquidToken(token));\n return marker;\n });\n const withTags = escaped.replace(/&lt;!--[\\s\\S]*?--&gt;|&lt;\\/?[a-zA-Z][\\s\\S]*?&gt;/g, (tag) =>\n tag.startsWith(\"&lt;!--\") ? `<span class=\"k2b-template-comment\">${tag}</span>` : highlightTag(tag),\n );\n return withTags.replace(/\\uE000(\\d+)\\uE001/g, (_, index) => stashed[Number(index)] ?? \"\");\n};\n\nexport function TemplateEditor(props: TemplateEditorProps): JSX.Element {\n const messages = useUiMessages();\n const completions = createMemo(() => templateCompletions(props.variables));\n return (\n <AutocompleteEditor\n {...props}\n lines={props.lines ?? 22}\n spellcheck={props.spellcheck ?? false}\n placeholder={props.placeholder ?? messages().templateEditorPlaceholder}\n highlight={highlightTemplate}\n completions={completions()}\n />\n );\n}\n\nexport function TemplatePreview(props: TemplatePreviewProps): JSX.Element {\n const messages = useUiMessages();\n return (\n <section class={`k2b-template-preview ${props.class ?? \"\"}`}>\n <iframe sandbox=\"\" srcdoc={props.html} title={props.title ?? messages().templatePreview} />\n </section>\n );\n}\n\nexport function TemplateSampleData(props: TemplateSampleDataProps): JSX.Element {\n return (\n <section class={`k2b-template-sample ${props.class ?? \"\"}`}>\n <For each={props.variables}>\n {(variable) => (\n <TextInput\n label={`{{ ${variable.name} }}`}\n description={variable.description}\n value={props.values[variable.name] ?? \"\"}\n onValueChange={(value) => props.onValueChange(variable.name, value)}\n />\n )}\n </For>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -33,7 +33,8 @@ export function TextInput(props) {
33
33
  const [passwordVisible, setPasswordVisible] = createSignal(false);
34
34
  const multiline = () => Boolean(local.multiline || local.markdown);
35
35
  const icon = () => local.icon ?? (local.variant === "ai" ? "ti ti-sparkles" : local.markdown ? "ti ti-markdown" : "ti ti-cursor-text");
36
- const activeIcon = () => local.activeIcon ?? (local.variant === "ai" ? "ti ti-sparkles" : "ti ti-pencil");
36
+ // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.
37
+ const activeIcon = () => local.activeIcon ?? local.icon ?? (local.variant === "ai" ? "ti ti-sparkles" : "ti ti-pencil");
37
38
  const input = next => local.onValueChange?.(next);
38
39
  const commit = next => local.onValueCommit?.(next);
39
40
  const clear = () => {
@@ -1 +1 @@
1
- {"version":3,"names":["createSignal","Show","splitProps","createFieldMeta","Field","fieldControlAria","useUiMessages","commitFieldValue","resolveMaybeAccessor","MarkdownEditor","TextInput","props","messages","local","rest","meta","id","value","error","passwordVisible","setPasswordVisible","multiline","Boolean","markdown","icon","variant","activeIcon","input","next","onValueChange","commit","onValueCommit","clear","onClear","_$createComponent","when","fallback","class","label","description","required","disabled","children","_el$","_$getNextElement","_tmpl$5","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$1","_el$10","_co$","_$getNextMarker","_el$11","_el$12","_co$2","_el$13","_el$14","_co$3","_el$15","_el$16","_co$4","_el$17","_el$18","_co$5","_$insert","prefix","_el$5","_tmpl$","_el$19","_tmpl$6","_$spread","_$mergeProps","controlId","type","_$memo","password","minlength","minLength","maxlength","maxLength","event","currentTarget","onSubmit","key","shiftKey","metaKey","preventDefault","_$runHydrationEvents","_el$6","_tmpl$2","rows","lines","suffix","_el$7","clearable","readOnly","_el$8","_tmpl$3","$$click","_$effect","_$setAttribute","clearLabel","_el$9","_tmpl$4","_el$0","visible","_p$","_v$","hidePassword","showPassword","_v$2","_v$3","_v$4","e","t","a","_$setProperty","o","_$className","undefined","_v$5","_v$6","_v$7","_v$8","monospace","_v$9","String","_v$0","_v$1","i","_$style","n","s","name","placeholder","spellcheck","abbreviations","completions","aria-label","aria-describedby","_$delegateEvents"],"sources":["inputs/TextInput.tsx"],"sourcesContent":["import { createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { Completion } from \"./completion\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\n\nexport type TextInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onInput\" | \"prefix\" | \"suffix\" | \"type\" | \"value\" | keyof ValueFieldProps<string>\n> &\n ValueFieldProps<string> & {\n minLength?: number;\n maxLength?: number;\n type?: \"text\" | \"search\" | \"email\" | \"url\" | \"tel\";\n variant?: \"default\" | \"ai\";\n icon?: string;\n activeIcon?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n multiline?: boolean;\n monospace?: boolean;\n password?: boolean;\n markdown?: boolean;\n onSubmit?: () => void;\n lines?: number;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n };\n\nexport function TextInput(props: TextInputProps): JSX.Element {\n const messages = useUiMessages();\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"completions\",\n \"description\",\n \"error\",\n \"icon\",\n \"id\",\n \"label\",\n \"lines\",\n \"markdown\",\n \"minLength\",\n \"maxLength\",\n \"monospace\",\n \"multiline\",\n \"onClear\",\n \"onValueCommit\",\n \"onSubmit\",\n \"onValueChange\",\n \"password\",\n \"prefix\",\n \"required\",\n \"suffix\",\n \"type\",\n \"value\",\n \"variant\",\n \"abbreviations\",\n ]);\n const meta = createFieldMeta(local.id);\n const value = () => resolveMaybeAccessor(local.value) ?? \"\";\n const error = () => resolveMaybeAccessor(local.error);\n const [passwordVisible, setPasswordVisible] = createSignal(false);\n const multiline = () => Boolean(local.multiline || local.markdown);\n const icon = () => local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : local.markdown ? \"ti ti-markdown\" : \"ti ti-cursor-text\");\n const activeIcon = () => local.activeIcon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : \"ti ti-pencil\");\n const input = (next: string) => local.onValueChange?.(next);\n const commit = (next: string) => local.onValueCommit?.(next);\n const clear = () => {\n if (local.onClear) {\n local.onClear();\n return;\n }\n commitFieldValue(local, \"\");\n };\n\n return (\n <Show\n when={local.markdown}\n fallback={\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n <div\n class=\"k2b-input-shell k2b-text-input\"\n data-invalid={error() ? \"true\" : undefined}\n data-ai={local.variant === \"ai\" ? \"true\" : undefined}\n data-multiline={multiline() ? \"true\" : undefined}\n data-monospace={local.monospace ? \"true\" : undefined}\n style={multiline() ? { \"--k2b-editor-lines\": String(local.lines ?? 3) } : undefined}\n >\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n <i class={activeIcon()} />\n </span>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <Show\n when={multiline()}\n fallback={\n <input\n {...rest}\n id={meta.controlId}\n class=\"k2b-input\"\n type={local.password && !passwordVisible() ? \"password\" : (local.type ?? \"text\")}\n value={value()}\n minlength={local.minLength}\n maxlength={local.maxLength}\n required={local.required}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n }\n >\n <textarea\n {...(rest as unknown as JSX.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n id={meta.controlId}\n class=\"k2b-input k2b-text-input__textarea\"\n value={value()}\n rows={local.lines ?? 3}\n required={local.required}\n minlength={local.minLength}\n maxlength={local.maxLength}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n </Show>\n <Show when={local.suffix}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && value() && !multiline() && !local.password && !rest.disabled && !rest.readOnly}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <Show when={local.password && !multiline()}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear\"\n aria-label={passwordVisible() ? messages().hidePassword : messages().showPassword}\n aria-pressed={passwordVisible()}\n disabled={rest.disabled}\n onClick={() => setPasswordVisible((visible) => !visible)}\n >\n <i class={passwordVisible() ? \"ti ti-eye-off\" : \"ti ti-eye\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n }\n >\n <MarkdownEditor\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n id={meta.controlId}\n name={rest.name}\n value={value()}\n onValueChange={input}\n onValueCommit={local.onValueCommit}\n onSubmit={local.onSubmit}\n placeholder={rest.placeholder}\n disabled={rest.disabled}\n required={local.required}\n lines={local.lines}\n maxLength={local.maxLength}\n spellcheck={rest.spellcheck === undefined ? undefined : rest.spellcheck === true || rest.spellcheck === \"true\"}\n abbreviations={local.abbreviations}\n completions={local.completions}\n aria-label={local[\"aria-label\"]}\n aria-describedby={local[\"aria-describedby\"]}\n />\n </Show>\n );\n}\n\nexport default TextInput;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TextInput.tsx"],"sourcesContent":["import { createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { Completion } from \"./completion\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\n\nexport type TextInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onInput\" | \"prefix\" | \"suffix\" | \"type\" | \"value\" | keyof ValueFieldProps<string>\n> &\n ValueFieldProps<string> & {\n minLength?: number;\n maxLength?: number;\n type?: \"text\" | \"search\" | \"email\" | \"url\" | \"tel\";\n variant?: \"default\" | \"ai\";\n icon?: string;\n activeIcon?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n multiline?: boolean;\n monospace?: boolean;\n password?: boolean;\n markdown?: boolean;\n onSubmit?: () => void;\n lines?: number;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n };\n\nexport function TextInput(props: TextInputProps): JSX.Element {\n const messages = useUiMessages();\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"completions\",\n \"description\",\n \"error\",\n \"icon\",\n \"id\",\n \"label\",\n \"lines\",\n \"markdown\",\n \"minLength\",\n \"maxLength\",\n \"monospace\",\n \"multiline\",\n \"onClear\",\n \"onValueCommit\",\n \"onSubmit\",\n \"onValueChange\",\n \"password\",\n \"prefix\",\n \"required\",\n \"suffix\",\n \"type\",\n \"value\",\n \"variant\",\n \"abbreviations\",\n ]);\n const meta = createFieldMeta(local.id);\n const value = () => resolveMaybeAccessor(local.value) ?? \"\";\n const error = () => resolveMaybeAccessor(local.error);\n const [passwordVisible, setPasswordVisible] = createSignal(false);\n const multiline = () => Boolean(local.multiline || local.markdown);\n const icon = () => local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : local.markdown ? \"ti ti-markdown\" : \"ti ti-cursor-text\");\n // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.\n const activeIcon = () => local.activeIcon ?? local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : \"ti ti-pencil\");\n const input = (next: string) => local.onValueChange?.(next);\n const commit = (next: string) => local.onValueCommit?.(next);\n const clear = () => {\n if (local.onClear) {\n local.onClear();\n return;\n }\n commitFieldValue(local, \"\");\n };\n\n return (\n <Show\n when={local.markdown}\n fallback={\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n <div\n class=\"k2b-input-shell k2b-text-input\"\n data-invalid={error() ? \"true\" : undefined}\n data-ai={local.variant === \"ai\" ? \"true\" : undefined}\n data-multiline={multiline() ? \"true\" : undefined}\n data-monospace={local.monospace ? \"true\" : undefined}\n style={multiline() ? { \"--k2b-editor-lines\": String(local.lines ?? 3) } : undefined}\n >\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n <i class={activeIcon()} />\n </span>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <Show\n when={multiline()}\n fallback={\n <input\n {...rest}\n id={meta.controlId}\n class=\"k2b-input\"\n type={local.password && !passwordVisible() ? \"password\" : (local.type ?? \"text\")}\n value={value()}\n minlength={local.minLength}\n maxlength={local.maxLength}\n required={local.required}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n }\n >\n <textarea\n {...(rest as unknown as JSX.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n id={meta.controlId}\n class=\"k2b-input k2b-text-input__textarea\"\n value={value()}\n rows={local.lines ?? 3}\n required={local.required}\n minlength={local.minLength}\n maxlength={local.maxLength}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n </Show>\n <Show when={local.suffix}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && value() && !multiline() && !local.password && !rest.disabled && !rest.readOnly}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <Show when={local.password && !multiline()}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear\"\n aria-label={passwordVisible() ? messages().hidePassword : messages().showPassword}\n aria-pressed={passwordVisible()}\n disabled={rest.disabled}\n onClick={() => setPasswordVisible((visible) => !visible)}\n >\n <i class={passwordVisible() ? \"ti ti-eye-off\" : \"ti ti-eye\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n }\n >\n <MarkdownEditor\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n id={meta.controlId}\n name={rest.name}\n value={value()}\n onValueChange={input}\n onValueCommit={local.onValueCommit}\n onSubmit={local.onSubmit}\n placeholder={rest.placeholder}\n disabled={rest.disabled}\n required={local.required}\n lines={local.lines}\n maxLength={local.maxLength}\n spellcheck={rest.spellcheck === undefined ? undefined : rest.spellcheck === true || rest.spellcheck === \"true\"}\n abbreviations={local.abbreviations}\n completions={local.completions}\n aria-label={local[\"aria-label\"]}\n aria-describedby={local[\"aria-describedby\"]}\n />\n </Show>\n );\n}\n\nexport default TextInput;\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createEffect","createSignal","onCleanup","filterChoiceOptions","options","query","normalized","trim","toLocaleLowerCase","filter","option","label","description","value","some","part","includes","nextEnabledChoiceIndex","current","direction","length","every","disabled","index","visited","errorMessage","error","Error","message","createChoiceLoader","loader","debounceMs","setOptions","loading","setLoading","setError","controller","timer","request","lastQuery","cancel","clearTimeout","undefined","abort","run","loadOptions","AbortController","currentController","currentRequest","next","signal","aborted","reason","load","immediate","setTimeout","retry","popoverIsOpen","popover","matches","placeChoicePopover","trigger","margin","gap","triggerRect","getBoundingClientRect","width","Math","min","window","innerWidth","style","popoverRect","left","max","roomBelow","innerHeight","bottom","roomAbove","top","opensAbove","height","createChoicePopover","open","setOpen","setTrigger","setPopover","place","triggerElement","popoverElement","show","showPopover","queueMicrotask","hide","restoreFocus","hidePopover","focus","syncOpenState","containWheel","event","ctrlKey","preventDefault","target","Element","groups","closest","horizontalDelta","shiftKey","deltaX","deltaY","abs","scrollWidth","clientWidth","unit","deltaMode","scrollLeft","querySelector","scrollHeight","clientHeight","scrollTop","addEventListener","passive","removeEventListener","dismiss","Node","contains","reposition","observer","ResizeObserver","observe","document","disconnect","toggle"],"sources":["inputs/choice.ts"],"sourcesContent":["import { createEffect, createSignal, onCleanup, type Setter } from \"solid-js\";\n\nexport type ChoiceOption<T extends string = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n color?: string;\n disabled?: boolean;\n /** Optional overlapping groups used by choice controls that expose group filtering. */\n groups?: readonly string[];\n};\n\nexport type ChoiceOptionsLoader<T extends string = string> = (query: string, signal: AbortSignal) => Promise<readonly ChoiceOption<T>[]>;\n\nexport const filterChoiceOptions = <T extends string>(options: readonly ChoiceOption<T>[], query: string): readonly ChoiceOption<T>[] => {\n const normalized = query.trim().toLocaleLowerCase();\n if (!normalized) return options;\n return options.filter((option) =>\n [option.label, option.description, option.value].some((part) => part?.toLocaleLowerCase().includes(normalized)),\n );\n};\n\nexport const nextEnabledChoiceIndex = <T extends string>(\n options: readonly ChoiceOption<T>[],\n current: number,\n direction: 1 | -1,\n): number => {\n if (options.length === 0 || options.every((option) => option.disabled)) return -1;\n\n let index = current;\n for (let visited = 0; visited < options.length; visited += 1) {\n index = (index + direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n};\n\nconst errorMessage = (error: unknown): string => (error instanceof Error ? error.message : \"Failed to load options\");\n\nexport function createChoiceLoader<T extends string>(\n loader: () => ChoiceOptionsLoader<T> | undefined,\n debounceMs: () => number,\n): {\n options: () => readonly ChoiceOption<T>[];\n loading: () => boolean;\n error: () => string | undefined;\n load: (query: string, immediate?: boolean) => void;\n retry: () => void;\n cancel: () => void;\n} {\n const [options, setOptions] = createSignal<readonly ChoiceOption<T>[]>([]);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<string>();\n let controller: AbortController | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let request = 0;\n let lastQuery = \"\";\n\n const cancel = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n controller?.abort();\n controller = undefined;\n };\n\n const run = async (query: string) => {\n const loadOptions = loader();\n if (!loadOptions) return;\n\n controller?.abort();\n controller = new AbortController();\n const currentController = controller;\n const currentRequest = ++request;\n setLoading(true);\n setError(undefined);\n\n try {\n const next = await loadOptions(query, currentController.signal);\n if (currentRequest === request && !currentController.signal.aborted) setOptions(next);\n } catch (reason) {\n if (currentRequest === request && !currentController.signal.aborted) {\n setOptions([]);\n setError(errorMessage(reason));\n }\n } finally {\n if (currentRequest === request) setLoading(false);\n }\n };\n\n const load = (query: string, immediate = false) => {\n lastQuery = query;\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (immediate || debounceMs() <= 0) {\n void run(query);\n return;\n }\n timer = setTimeout(() => {\n timer = undefined;\n void run(query);\n }, debounceMs());\n };\n\n onCleanup(cancel);\n return { options, loading, error, load, retry: () => load(lastQuery, true), cancel };\n}\n\nconst popoverIsOpen = (popover: HTMLElement | undefined): boolean => {\n if (!popover) return false;\n try {\n return popover.matches(\":popover-open\");\n } catch {\n return false;\n }\n};\n\nexport const placeChoicePopover = (trigger: HTMLElement, popover: HTMLElement): void => {\n const margin = 8;\n const gap = 4;\n const triggerRect = trigger.getBoundingClientRect();\n // Cloud sizes its dropdowns to the trigger exactly (`dialog.style.width =\n // rect.width`). Keep that so a narrow toolbar select does not open a wide\n // panel that no longer lines up with the control it belongs to.\n const width = Math.min(triggerRect.width, window.innerWidth - margin * 2);\n popover.style.width = `${width}px`;\n\n const popoverRect = popover.getBoundingClientRect();\n const left = Math.max(margin, Math.min(triggerRect.left, window.innerWidth - width - margin));\n const roomBelow = window.innerHeight - triggerRect.bottom - gap - margin;\n const roomAbove = triggerRect.top - gap - margin;\n const opensAbove = popoverRect.height > roomBelow && roomAbove > roomBelow;\n const top = opensAbove\n ? Math.max(margin, triggerRect.top - popoverRect.height - gap)\n : Math.min(triggerRect.bottom + gap, window.innerHeight - popoverRect.height - margin);\n\n popover.style.left = `${left}px`;\n popover.style.top = `${Math.max(margin, top)}px`;\n};\n\nexport function createChoicePopover(disabled: () => boolean): {\n open: () => boolean;\n setTrigger: Setter<HTMLElement | undefined>;\n setPopover: Setter<HTMLElement | undefined>;\n show: () => void;\n hide: (restoreFocus?: boolean) => void;\n toggle: () => void;\n trigger: () => HTMLElement | undefined;\n} {\n const [open, setOpen] = createSignal(false);\n const [trigger, setTrigger] = createSignal<HTMLElement>();\n const [popover, setPopover] = createSignal<HTMLElement>();\n\n const place = () => {\n const triggerElement = trigger();\n const popoverElement = popover();\n if (triggerElement && popoverElement && open()) placeChoicePopover(triggerElement, popoverElement);\n };\n\n const show = () => {\n const popoverElement = popover();\n if (disabled() || !popoverElement || popoverIsOpen(popoverElement)) return;\n popoverElement.showPopover();\n setOpen(true);\n queueMicrotask(place);\n };\n\n const hide = (restoreFocus = false) => {\n const popoverElement = popover();\n if (popoverIsOpen(popoverElement)) popoverElement?.hidePopover();\n setOpen(false);\n if (restoreFocus) queueMicrotask(() => trigger()?.focus());\n };\n\n createEffect(() => {\n const popoverElement = popover();\n if (!popoverElement) return;\n const syncOpenState = () => setOpen(popoverIsOpen(popoverElement));\n const containWheel = (event: WheelEvent) => {\n if (event.ctrlKey) return;\n event.preventDefault();\n\n const target = event.target instanceof Element ? event.target : undefined;\n const groups = target?.closest<HTMLElement>(\".k2b-choice-groups\");\n const horizontalDelta = event.shiftKey && event.deltaX === 0 ? event.deltaY : event.deltaX;\n if (groups && (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) && groups.scrollWidth > groups.clientWidth) {\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? groups.clientWidth : 1;\n groups.scrollLeft += horizontalDelta * unit;\n return;\n }\n\n const options = popoverElement.querySelector<HTMLElement>(\".k2b-choice-options\");\n if (!options || options.scrollHeight <= options.clientHeight) return;\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? options.clientHeight : 1;\n options.scrollTop += event.deltaY * unit;\n };\n popoverElement.addEventListener(\"toggle\", syncOpenState);\n popoverElement.addEventListener(\"wheel\", containWheel, { passive: false });\n onCleanup(() => {\n popoverElement.removeEventListener(\"toggle\", syncOpenState);\n popoverElement.removeEventListener(\"wheel\", containWheel);\n });\n });\n\n createEffect(() => {\n if (!open()) return;\n\n const dismiss = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || trigger()?.contains(target) || popover()?.contains(target)) return;\n hide();\n };\n const reposition = () => place();\n\n // Async option lists arrive after the popover is already open, so the first\n // placement measures an empty panel. Re-place whenever the panel resizes,\n // otherwise a dropdown that grows past the viewport bottom stays clipped.\n const popoverElement = popover();\n const observer = popoverElement && typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(reposition) : undefined;\n if (popoverElement) observer?.observe(popoverElement);\n\n document.addEventListener(\"pointerdown\", dismiss, true);\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n onCleanup(() => {\n observer?.disconnect();\n document.removeEventListener(\"pointerdown\", dismiss, true);\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n });\n });\n\n onCleanup(() => hide());\n return {\n open,\n setTrigger,\n setPopover,\n show,\n hide,\n toggle: () => (open() ? hide() : show()),\n trigger,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/choice.ts"],"sourcesContent":["import { createEffect, createSignal, onCleanup, type Setter } from \"solid-js\";\n\nexport type ChoiceOption<T extends string = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n color?: string;\n disabled?: boolean;\n /** Optional overlapping groups used by choice controls that expose group filtering. */\n groups?: readonly string[];\n};\n\nexport type ChoiceOptionsLoader<T extends string = string> = (query: string, signal: AbortSignal) => Promise<readonly ChoiceOption<T>[]>;\n\nexport const filterChoiceOptions = <T extends string>(options: readonly ChoiceOption<T>[], query: string): readonly ChoiceOption<T>[] => {\n const normalized = query.trim().toLocaleLowerCase();\n if (!normalized) return options;\n return options.filter((option) =>\n [option.label, option.description, option.value].some((part) => part?.toLocaleLowerCase().includes(normalized)),\n );\n};\n\nexport const nextEnabledChoiceIndex = <T extends string>(\n options: readonly ChoiceOption<T>[],\n current: number,\n direction: 1 | -1,\n): number => {\n if (options.length === 0 || options.every((option) => option.disabled)) return -1;\n\n let index = current;\n for (let visited = 0; visited < options.length; visited += 1) {\n index = (index + direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n};\n\nconst errorMessage = (error: unknown): string => (error instanceof Error ? error.message : \"Failed to load options\");\n\nexport function createChoiceLoader<T extends string>(\n loader: () => ChoiceOptionsLoader<T> | undefined,\n debounceMs: () => number,\n): {\n options: () => readonly ChoiceOption<T>[];\n loading: () => boolean;\n error: () => string | undefined;\n load: (query: string, immediate?: boolean) => void;\n retry: () => void;\n cancel: () => void;\n} {\n const [options, setOptions] = createSignal<readonly ChoiceOption<T>[]>([]);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<string>();\n let controller: AbortController | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let request = 0;\n let lastQuery = \"\";\n\n const cancel = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n controller?.abort();\n controller = undefined;\n };\n\n const run = async (query: string) => {\n const loadOptions = loader();\n if (!loadOptions) return;\n\n controller?.abort();\n controller = new AbortController();\n const currentController = controller;\n const currentRequest = ++request;\n setLoading(true);\n setError(undefined);\n\n try {\n const next = await loadOptions(query, currentController.signal);\n if (currentRequest === request && !currentController.signal.aborted) setOptions(next);\n } catch (reason) {\n if (currentRequest === request && !currentController.signal.aborted) {\n setOptions([]);\n setError(errorMessage(reason));\n }\n } finally {\n if (currentRequest === request) setLoading(false);\n }\n };\n\n const load = (query: string, immediate = false) => {\n lastQuery = query;\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (immediate || debounceMs() <= 0) {\n void run(query);\n return;\n }\n timer = setTimeout(() => {\n timer = undefined;\n void run(query);\n }, debounceMs());\n };\n\n onCleanup(cancel);\n return { options, loading, error, load, retry: () => load(lastQuery, true), cancel };\n}\n\nconst popoverIsOpen = (popover: HTMLElement | undefined): boolean => {\n if (!popover) return false;\n try {\n return popover.matches(\":popover-open\");\n } catch {\n return false;\n }\n};\n\nexport const placeChoicePopover = (trigger: HTMLElement, popover: HTMLElement): void => {\n const margin = 8;\n const gap = 4;\n const triggerRect = trigger.getBoundingClientRect();\n // Cloud sizes its dropdowns to the trigger exactly (`dialog.style.width =\n // rect.width`). Keep that so a narrow toolbar select does not open a wide\n // panel that no longer lines up with the control it belongs to.\n const width = Math.min(triggerRect.width, window.innerWidth - margin * 2);\n popover.style.width = `${width}px`;\n\n const popoverRect = popover.getBoundingClientRect();\n const left = Math.max(margin, Math.min(triggerRect.left, window.innerWidth - width - margin));\n const roomBelow = window.innerHeight - triggerRect.bottom - gap - margin;\n const roomAbove = triggerRect.top - gap - margin;\n const opensAbove = popoverRect.height > roomBelow && roomAbove > roomBelow;\n const top = opensAbove\n ? Math.max(margin, triggerRect.top - popoverRect.height - gap)\n : Math.min(triggerRect.bottom + gap, window.innerHeight - popoverRect.height - margin);\n\n popover.style.left = `${left}px`;\n popover.style.top = `${Math.max(margin, top)}px`;\n};\n\nexport function createChoicePopover(disabled: () => boolean): {\n open: () => boolean;\n setTrigger: Setter<HTMLElement | undefined>;\n setPopover: Setter<HTMLElement | undefined>;\n show: () => void;\n hide: (restoreFocus?: boolean) => void;\n toggle: () => void;\n trigger: () => HTMLElement | undefined;\n} {\n const [open, setOpen] = createSignal(false);\n const [trigger, setTrigger] = createSignal<HTMLElement>();\n const [popover, setPopover] = createSignal<HTMLElement>();\n\n const place = () => {\n const triggerElement = trigger();\n const popoverElement = popover();\n if (triggerElement && popoverElement && open()) placeChoicePopover(triggerElement, popoverElement);\n };\n\n const show = () => {\n const popoverElement = popover();\n if (disabled() || !popoverElement || popoverIsOpen(popoverElement)) return;\n popoverElement.showPopover();\n setOpen(true);\n queueMicrotask(place);\n };\n\n const hide = (restoreFocus = false) => {\n const popoverElement = popover();\n if (popoverIsOpen(popoverElement)) popoverElement?.hidePopover();\n setOpen(false);\n if (restoreFocus) queueMicrotask(() => trigger()?.focus());\n };\n\n createEffect(() => {\n const popoverElement = popover();\n if (!popoverElement) return;\n const syncOpenState = () => setOpen(popoverIsOpen(popoverElement));\n const containWheel = (event: WheelEvent) => {\n if (event.ctrlKey) return;\n event.preventDefault();\n\n const target = event.target instanceof Element ? event.target : undefined;\n const groups = target?.closest<HTMLElement>(\".k2b-choice-groups\");\n const horizontalDelta = event.shiftKey && event.deltaX === 0 ? event.deltaY : event.deltaX;\n if (groups && (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) && groups.scrollWidth > groups.clientWidth) {\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? groups.clientWidth : 1;\n groups.scrollLeft += horizontalDelta * unit;\n return;\n }\n\n const options = popoverElement.querySelector<HTMLElement>(\".k2b-choice-options\");\n if (!options || options.scrollHeight <= options.clientHeight) return;\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? options.clientHeight : 1;\n options.scrollTop += event.deltaY * unit;\n };\n popoverElement.addEventListener(\"toggle\", syncOpenState);\n popoverElement.addEventListener(\"wheel\", containWheel, { passive: false });\n onCleanup(() => {\n popoverElement.removeEventListener(\"toggle\", syncOpenState);\n popoverElement.removeEventListener(\"wheel\", containWheel);\n });\n });\n\n createEffect(() => {\n if (!open()) return;\n\n const dismiss = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || trigger()?.contains(target) || popover()?.contains(target)) return;\n hide();\n };\n const reposition = () => place();\n\n // Async option lists arrive after the popover is already open, so the first\n // placement measures an empty panel. Re-place whenever the panel resizes,\n // otherwise a dropdown that grows past the viewport bottom stays clipped.\n const popoverElement = popover();\n const observer = popoverElement && typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(reposition) : undefined;\n if (popoverElement) observer?.observe(popoverElement);\n\n document.addEventListener(\"pointerdown\", dismiss, true);\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n onCleanup(() => {\n observer?.disconnect();\n document.removeEventListener(\"pointerdown\", dismiss, true);\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n });\n });\n\n onCleanup(() => hide());\n return {\n open,\n setTrigger,\n setPopover,\n show,\n hide,\n toggle: () => (open() ? hide() : show()),\n trigger,\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["replaceTextareaRange","suggestSync","TRIGGER_CHARS","WORD_CHAR","findExpansion","word","completions","context","completion","trigger","undefined","suggestions","exact","find","suggestion","text","expansion","normalized","toLowerCase","insensitive","createCompletionBehaviorState","lastExpansion","suppressNextExpansion","reset","tryExpand","textarea","options","length","value","caret","selectionStart","selectionEnd","triggerChar","has","wordEnd","wordStart","test","isExcluded","originalWord","slice","fullText","tokenStart","startOffset","tryRestore","last","tail","applySuggestion","textEdit","start","end","Number","isInteger","baseText","nextChar","alreadySeparated","opensScope","appendSpace","insertText","trackExpansion"],"sources":["inputs/completion/behaviors.ts"],"sourcesContent":["import { replaceTextareaRange } from \"../editor-dom\";\nimport { type Completion, type QueryContext, type SuggestContext, type Suggestion, suggestSync, TRIGGER_CHARS, WORD_CHAR } from \"./engine\";\n\ntype LastExpansion = {\n textarea: HTMLTextAreaElement;\n startOffset: number;\n originalWord: string;\n triggerChar: string;\n expansion: string;\n};\n\nconst findExpansion = (word: string, completions: readonly Completion[], context: SuggestContext): Suggestion | null => {\n for (const completion of completions) {\n if (completion.trigger !== undefined) continue;\n const suggestions = suggestSync(completion, word, context);\n if (!suggestions) continue;\n const exact = suggestions.find((suggestion) => suggestion.text === word && suggestion.expansion && suggestion.expansion !== word);\n if (exact) return exact;\n const normalized = word.toLowerCase();\n const insensitive = suggestions.find(\n (suggestion) => suggestion.text.toLowerCase() === normalized && suggestion.expansion && suggestion.expansion !== word,\n );\n if (insensitive) return insensitive;\n }\n return null;\n};\n\nexport type TryExpandOptions = {\n isExcluded?: (text: string, position: number) => boolean;\n};\n\n/** Keeps abbreviation restoration isolated to one editor instance. */\nexport const createCompletionBehaviorState = () => {\n let lastExpansion: LastExpansion | null = null;\n let suppressNextExpansion = false;\n\n const reset = (): void => {\n lastExpansion = null;\n suppressNextExpansion = false;\n };\n\n const tryExpand = (\n textarea: HTMLTextAreaElement,\n completions: readonly Completion[] | undefined,\n options: TryExpandOptions = {},\n ): boolean => {\n if (suppressNextExpansion) {\n suppressNextExpansion = false;\n return false;\n }\n if (!completions || completions.length === 0) return false;\n\n const value = textarea.value;\n const caret = textarea.selectionStart;\n if (caret === 0 || caret !== textarea.selectionEnd) return false;\n const triggerChar = value[caret - 1];\n if (!triggerChar || !TRIGGER_CHARS.has(triggerChar)) return false;\n\n const wordEnd = caret - 1;\n let wordStart = wordEnd;\n while (wordStart > 0 && WORD_CHAR.test(value[wordStart - 1]!)) wordStart--;\n if (wordStart === wordEnd || options.isExcluded?.(value, wordStart)) return false;\n\n const originalWord = value.slice(wordStart, wordEnd);\n const suggestion = findExpansion(originalWord, completions, {\n fullText: value,\n caret,\n tokenStart: wordStart,\n });\n if (!suggestion?.expansion || suggestion.expansion === originalWord) return false;\n if (!replaceTextareaRange(textarea, wordStart, caret, suggestion.expansion + triggerChar)) return false;\n\n lastExpansion = {\n textarea,\n startOffset: wordStart,\n originalWord,\n triggerChar,\n expansion: suggestion.expansion,\n };\n suppressNextExpansion = true;\n return true;\n };\n\n const tryRestore = (textarea: HTMLTextAreaElement): boolean => {\n const last = lastExpansion;\n if (!last || last.textarea !== textarea) return false;\n const tail = last.startOffset + last.expansion.length + last.triggerChar.length;\n if (\n textarea.selectionStart !== tail ||\n textarea.selectionEnd !== tail ||\n textarea.value.slice(last.startOffset, tail) !== last.expansion + last.triggerChar\n ) {\n return false;\n }\n if (!replaceTextareaRange(textarea, last.startOffset, tail, last.originalWord + last.triggerChar)) return false;\n\n suppressNextExpansion = true;\n lastExpansion = null;\n return true;\n };\n\n const applySuggestion = (\n textarea: HTMLTextAreaElement,\n context: QueryContext,\n suggestion: Suggestion,\n options: { trackExpansion?: boolean } = {},\n ): boolean => {\n if (suggestion.textEdit) {\n const { start, end, text } = suggestion.textEdit;\n if (\n !Number.isInteger(start) ||\n !Number.isInteger(end) ||\n start < 0 ||\n end < start ||\n end > textarea.value.length ||\n textarea.value.slice(start, end) === text\n ) {\n return false;\n }\n return replaceTextareaRange(textarea, start, end, text);\n }\n\n const baseText = suggestion.expansion ?? suggestion.text;\n if (baseText === context.text) return false;\n const nextChar = textarea.value[context.end];\n const alreadySeparated = nextChar === \" \" || nextChar === \"\\t\";\n const opensScope = /[([{]$/.test(baseText);\n const appendSpace = suggestion.appendSpace ?? true;\n const insertText = alreadySeparated || opensScope || !appendSpace ? baseText : `${baseText} `;\n if (!replaceTextareaRange(textarea, context.start, context.end, insertText)) return false;\n\n if ((options.trackExpansion ?? true) && suggestion.expansion !== undefined && suggestion.expansion !== suggestion.text) {\n lastExpansion = {\n textarea,\n startOffset: context.start,\n originalWord: suggestion.text,\n triggerChar: alreadySeparated || opensScope || !appendSpace ? \"\" : \" \",\n expansion: suggestion.expansion,\n };\n suppressNextExpansion = true;\n }\n return true;\n };\n\n return { applySuggestion, reset, tryExpand, tryRestore };\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/completion/behaviors.ts"],"sourcesContent":["import { replaceTextareaRange } from \"../editor-dom\";\nimport { type Completion, type QueryContext, type SuggestContext, type Suggestion, suggestSync, TRIGGER_CHARS, WORD_CHAR } from \"./engine\";\n\ntype LastExpansion = {\n textarea: HTMLTextAreaElement;\n startOffset: number;\n originalWord: string;\n triggerChar: string;\n expansion: string;\n};\n\nconst findExpansion = (word: string, completions: readonly Completion[], context: SuggestContext): Suggestion | null => {\n for (const completion of completions) {\n if (completion.trigger !== undefined) continue;\n const suggestions = suggestSync(completion, word, context);\n if (!suggestions) continue;\n const exact = suggestions.find((suggestion) => suggestion.text === word && suggestion.expansion && suggestion.expansion !== word);\n if (exact) return exact;\n const normalized = word.toLowerCase();\n const insensitive = suggestions.find(\n (suggestion) => suggestion.text.toLowerCase() === normalized && suggestion.expansion && suggestion.expansion !== word,\n );\n if (insensitive) return insensitive;\n }\n return null;\n};\n\nexport type TryExpandOptions = {\n isExcluded?: (text: string, position: number) => boolean;\n};\n\n/** Keeps abbreviation restoration isolated to one editor instance. */\nexport const createCompletionBehaviorState = () => {\n let lastExpansion: LastExpansion | null = null;\n let suppressNextExpansion = false;\n\n const reset = (): void => {\n lastExpansion = null;\n suppressNextExpansion = false;\n };\n\n const tryExpand = (\n textarea: HTMLTextAreaElement,\n completions: readonly Completion[] | undefined,\n options: TryExpandOptions = {},\n ): boolean => {\n if (suppressNextExpansion) {\n suppressNextExpansion = false;\n return false;\n }\n if (!completions || completions.length === 0) return false;\n\n const value = textarea.value;\n const caret = textarea.selectionStart;\n if (caret === 0 || caret !== textarea.selectionEnd) return false;\n const triggerChar = value[caret - 1];\n if (!triggerChar || !TRIGGER_CHARS.has(triggerChar)) return false;\n\n const wordEnd = caret - 1;\n let wordStart = wordEnd;\n while (wordStart > 0 && WORD_CHAR.test(value[wordStart - 1]!)) wordStart--;\n if (wordStart === wordEnd || options.isExcluded?.(value, wordStart)) return false;\n\n const originalWord = value.slice(wordStart, wordEnd);\n const suggestion = findExpansion(originalWord, completions, {\n fullText: value,\n caret,\n tokenStart: wordStart,\n });\n if (!suggestion?.expansion || suggestion.expansion === originalWord) return false;\n if (!replaceTextareaRange(textarea, wordStart, caret, suggestion.expansion + triggerChar)) return false;\n\n lastExpansion = {\n textarea,\n startOffset: wordStart,\n originalWord,\n triggerChar,\n expansion: suggestion.expansion,\n };\n suppressNextExpansion = true;\n return true;\n };\n\n const tryRestore = (textarea: HTMLTextAreaElement): boolean => {\n const last = lastExpansion;\n if (!last || last.textarea !== textarea) return false;\n const tail = last.startOffset + last.expansion.length + last.triggerChar.length;\n if (\n textarea.selectionStart !== tail ||\n textarea.selectionEnd !== tail ||\n textarea.value.slice(last.startOffset, tail) !== last.expansion + last.triggerChar\n ) {\n return false;\n }\n if (!replaceTextareaRange(textarea, last.startOffset, tail, last.originalWord + last.triggerChar)) return false;\n\n suppressNextExpansion = true;\n lastExpansion = null;\n return true;\n };\n\n const applySuggestion = (\n textarea: HTMLTextAreaElement,\n context: QueryContext,\n suggestion: Suggestion,\n options: { trackExpansion?: boolean } = {},\n ): boolean => {\n if (suggestion.textEdit) {\n const { start, end, text } = suggestion.textEdit;\n if (\n !Number.isInteger(start) ||\n !Number.isInteger(end) ||\n start < 0 ||\n end < start ||\n end > textarea.value.length ||\n textarea.value.slice(start, end) === text\n ) {\n return false;\n }\n return replaceTextareaRange(textarea, start, end, text);\n }\n\n const baseText = suggestion.expansion ?? suggestion.text;\n if (baseText === context.text) return false;\n const nextChar = textarea.value[context.end];\n const alreadySeparated = nextChar === \" \" || nextChar === \"\\t\";\n const opensScope = /[([{]$/.test(baseText);\n const appendSpace = suggestion.appendSpace ?? true;\n const insertText = alreadySeparated || opensScope || !appendSpace ? baseText : `${baseText} `;\n if (!replaceTextareaRange(textarea, context.start, context.end, insertText)) return false;\n\n if ((options.trackExpansion ?? true) && suggestion.expansion !== undefined && suggestion.expansion !== suggestion.text) {\n lastExpansion = {\n textarea,\n startOffset: context.start,\n originalWord: suggestion.text,\n triggerChar: alreadySeparated || opensScope || !appendSpace ? \"\" : \" \",\n expansion: suggestion.expansion,\n };\n suppressNextExpansion = true;\n }\n return true;\n };\n\n return { applySuggestion, reset, tryExpand, tryRestore };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["TRIGGER_CHARS","Set","WORD_CHAR","GHOST_SENTINEL","String","fromCharCode","abbreviations","dictionary","suggestions","Object","entries","map","text","expansion","knownLabels","suggestion","suggest","query","normalized","toLowerCase","filter","startsWith","sort","left","right","Number","detectQuery","textarea","completions","options","length","selectionStart","selectionEnd","value","caret","isExcluded","afterCaret","undefined","test","wordStart","trigger","completion","find","candidate","beforeTrigger","allowAfterWord","slice","start","end","resolveSuggestions","context","signal","result","Promise","kind","promise","data","suggestSync","controller","AbortController","abort","catch","pickGhost","typed","collectKnownLabels","labels","label","add","displayLabel","buildSuggestContext","fullText","tokenStart"],"sources":["inputs/completion/engine.ts"],"sourcesContent":["export type Suggestion = {\n text: string;\n label?: string;\n expansion?: string;\n appendSpace?: boolean;\n hint?: string;\n textEdit?: {\n start: number;\n end: number;\n text: string;\n };\n};\n\nexport type SuggestContext = {\n fullText: string;\n caret: number;\n tokenStart: number;\n};\n\nexport type Completion = {\n trigger?: string;\n suggest: (query: string, context: SuggestContext, signal: AbortSignal) => readonly Suggestion[] | Promise<readonly Suggestion[]>;\n /** Static labels used by editor highlighting. Providers are never invoked to derive metadata. */\n knownLabels?: readonly string[];\n debounceMs?: number;\n dropdown?: boolean;\n allowAfterWord?: boolean;\n};\n\nexport type QueryContext = {\n start: number;\n end: number;\n text: string;\n query: string;\n completion: Completion;\n};\n\nexport type DetectOptions = {\n isExcluded?: (text: string, position: number) => boolean;\n};\n\nexport type ResolveResult = { kind: \"sync\"; data: readonly Suggestion[] } | { kind: \"async\"; promise: Promise<readonly Suggestion[]> };\n\nexport const TRIGGER_CHARS = new Set([\" \", \"\\t\", \"\\n\", \",\", \".\", \"!\", \"?\", \";\", \":\", \")\", \"]\", \"}\", '\"', \"'\"]);\nexport const WORD_CHAR = /[\\p{L}\\p{N}_]/u;\nexport const GHOST_SENTINEL = String.fromCharCode(0xe010);\n\nexport const abbreviations = (dictionary: Record<string, string>): Completion => {\n const suggestions = Object.entries(dictionary).map(([text, expansion]) => ({ text, expansion }));\n return {\n knownLabels: suggestions.map((suggestion) => suggestion.text),\n suggest: (query) => {\n if (query === \"\") return suggestions;\n const normalized = query.toLowerCase();\n return suggestions\n .filter((suggestion) => suggestion.text === query || suggestion.text.toLowerCase().startsWith(normalized))\n .sort((left, right) => Number(!left.text.startsWith(query)) - Number(!right.text.startsWith(query)));\n },\n };\n};\n\nexport const detectQuery = (\n textarea: HTMLTextAreaElement,\n completions: readonly Completion[] | undefined,\n options: DetectOptions = {},\n): QueryContext | null => {\n if (!completions || completions.length === 0) return null;\n if (textarea.selectionStart !== textarea.selectionEnd) return null;\n\n const value = textarea.value;\n const caret = textarea.selectionStart;\n if (caret === 0 || options.isExcluded?.(value, caret)) return null;\n const afterCaret = value[caret];\n if (afterCaret !== undefined && WORD_CHAR.test(afterCaret)) return null;\n\n let wordStart = caret;\n while (wordStart > 0 && WORD_CHAR.test(value[wordStart - 1]!)) wordStart--;\n const trigger = wordStart > 0 ? value[wordStart - 1] : undefined;\n\n if (trigger) {\n const completion = completions.find((candidate) => candidate.trigger === trigger);\n if (completion) {\n const beforeTrigger = wordStart >= 2 ? value[wordStart - 2] : undefined;\n if (!beforeTrigger || !WORD_CHAR.test(beforeTrigger) || completion.allowAfterWord) {\n const query = value.slice(wordStart, caret);\n return {\n start: wordStart - 1,\n end: caret,\n text: trigger + query,\n query,\n completion,\n };\n }\n }\n }\n\n if (caret > wordStart) {\n const completion = completions.find((candidate) => candidate.trigger === undefined);\n if (completion) {\n const query = value.slice(wordStart, caret);\n return { start: wordStart, end: caret, text: query, query, completion };\n }\n }\n return null;\n};\n\nexport const resolveSuggestions = (completion: Completion, query: string, context: SuggestContext, signal: AbortSignal): ResolveResult => {\n const result = completion.suggest(query, context, signal);\n return result instanceof Promise ? { kind: \"async\", promise: result } : { kind: \"sync\", data: result };\n};\n\nexport const suggestSync = (completion: Completion, query: string, context: SuggestContext): readonly Suggestion[] | null => {\n const controller = new AbortController();\n let result: readonly Suggestion[] | Promise<readonly Suggestion[]>;\n try {\n result = completion.suggest(query, context, controller.signal);\n } catch {\n return null;\n }\n if (!(result instanceof Promise)) return result;\n controller.abort();\n void result.catch(() => undefined);\n return null;\n};\n\nexport const pickGhost = (suggestions: readonly Suggestion[], typed: string): Suggestion | null => {\n const normalized = typed.toLowerCase();\n return (\n suggestions.find((suggestion) => suggestion.text.length > typed.length && suggestion.text.toLowerCase().startsWith(normalized)) ?? null\n );\n};\n\nexport const collectKnownLabels = (completions: readonly Completion[] | undefined): Set<string> => {\n const labels = new Set<string>();\n for (const completion of completions ?? []) {\n for (const label of completion.knownLabels ?? []) labels.add(label);\n }\n return labels;\n};\n\nexport const displayLabel = (suggestion: Suggestion, completion: Completion): string => {\n if (suggestion.label !== undefined) return suggestion.label;\n return completion.trigger && suggestion.text.startsWith(completion.trigger)\n ? suggestion.text.slice(completion.trigger.length)\n : suggestion.text;\n};\n\nexport const buildSuggestContext = (textarea: HTMLTextAreaElement, context: QueryContext): SuggestContext => ({\n fullText: textarea.value,\n caret: textarea.selectionStart,\n tokenStart: context.start,\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/completion/engine.ts"],"sourcesContent":["export type Suggestion = {\n text: string;\n label?: string;\n expansion?: string;\n appendSpace?: boolean;\n hint?: string;\n textEdit?: {\n start: number;\n end: number;\n text: string;\n };\n};\n\nexport type SuggestContext = {\n fullText: string;\n caret: number;\n tokenStart: number;\n};\n\nexport type Completion = {\n trigger?: string;\n suggest: (query: string, context: SuggestContext, signal: AbortSignal) => readonly Suggestion[] | Promise<readonly Suggestion[]>;\n /** Static labels used by editor highlighting. Providers are never invoked to derive metadata. */\n knownLabels?: readonly string[];\n debounceMs?: number;\n dropdown?: boolean;\n allowAfterWord?: boolean;\n};\n\nexport type QueryContext = {\n start: number;\n end: number;\n text: string;\n query: string;\n completion: Completion;\n};\n\nexport type DetectOptions = {\n isExcluded?: (text: string, position: number) => boolean;\n};\n\nexport type ResolveResult = { kind: \"sync\"; data: readonly Suggestion[] } | { kind: \"async\"; promise: Promise<readonly Suggestion[]> };\n\nexport const TRIGGER_CHARS = new Set([\" \", \"\\t\", \"\\n\", \",\", \".\", \"!\", \"?\", \";\", \":\", \")\", \"]\", \"}\", '\"', \"'\"]);\nexport const WORD_CHAR = /[\\p{L}\\p{N}_]/u;\nexport const GHOST_SENTINEL = String.fromCharCode(0xe010);\n\nexport const abbreviations = (dictionary: Record<string, string>): Completion => {\n const suggestions = Object.entries(dictionary).map(([text, expansion]) => ({ text, expansion }));\n return {\n knownLabels: suggestions.map((suggestion) => suggestion.text),\n suggest: (query) => {\n if (query === \"\") return suggestions;\n const normalized = query.toLowerCase();\n return suggestions\n .filter((suggestion) => suggestion.text === query || suggestion.text.toLowerCase().startsWith(normalized))\n .sort((left, right) => Number(!left.text.startsWith(query)) - Number(!right.text.startsWith(query)));\n },\n };\n};\n\nexport const detectQuery = (\n textarea: HTMLTextAreaElement,\n completions: readonly Completion[] | undefined,\n options: DetectOptions = {},\n): QueryContext | null => {\n if (!completions || completions.length === 0) return null;\n if (textarea.selectionStart !== textarea.selectionEnd) return null;\n\n const value = textarea.value;\n const caret = textarea.selectionStart;\n if (caret === 0 || options.isExcluded?.(value, caret)) return null;\n const afterCaret = value[caret];\n if (afterCaret !== undefined && WORD_CHAR.test(afterCaret)) return null;\n\n let wordStart = caret;\n while (wordStart > 0 && WORD_CHAR.test(value[wordStart - 1]!)) wordStart--;\n const trigger = wordStart > 0 ? value[wordStart - 1] : undefined;\n\n if (trigger) {\n const completion = completions.find((candidate) => candidate.trigger === trigger);\n if (completion) {\n const beforeTrigger = wordStart >= 2 ? value[wordStart - 2] : undefined;\n if (!beforeTrigger || !WORD_CHAR.test(beforeTrigger) || completion.allowAfterWord) {\n const query = value.slice(wordStart, caret);\n return {\n start: wordStart - 1,\n end: caret,\n text: trigger + query,\n query,\n completion,\n };\n }\n }\n }\n\n if (caret > wordStart) {\n const completion = completions.find((candidate) => candidate.trigger === undefined);\n if (completion) {\n const query = value.slice(wordStart, caret);\n return { start: wordStart, end: caret, text: query, query, completion };\n }\n }\n return null;\n};\n\nexport const resolveSuggestions = (completion: Completion, query: string, context: SuggestContext, signal: AbortSignal): ResolveResult => {\n const result = completion.suggest(query, context, signal);\n return result instanceof Promise ? { kind: \"async\", promise: result } : { kind: \"sync\", data: result };\n};\n\nexport const suggestSync = (completion: Completion, query: string, context: SuggestContext): readonly Suggestion[] | null => {\n const controller = new AbortController();\n let result: readonly Suggestion[] | Promise<readonly Suggestion[]>;\n try {\n result = completion.suggest(query, context, controller.signal);\n } catch {\n return null;\n }\n if (!(result instanceof Promise)) return result;\n controller.abort();\n void result.catch(() => undefined);\n return null;\n};\n\nexport const pickGhost = (suggestions: readonly Suggestion[], typed: string): Suggestion | null => {\n const normalized = typed.toLowerCase();\n return (\n suggestions.find((suggestion) => suggestion.text.length > typed.length && suggestion.text.toLowerCase().startsWith(normalized)) ?? null\n );\n};\n\nexport const collectKnownLabels = (completions: readonly Completion[] | undefined): Set<string> => {\n const labels = new Set<string>();\n for (const completion of completions ?? []) {\n for (const label of completion.knownLabels ?? []) labels.add(label);\n }\n return labels;\n};\n\nexport const displayLabel = (suggestion: Suggestion, completion: Completion): string => {\n if (suggestion.label !== undefined) return suggestion.label;\n return completion.trigger && suggestion.text.startsWith(completion.trigger)\n ? suggestion.text.slice(completion.trigger.length)\n : suggestion.text;\n};\n\nexport const buildSuggestContext = (textarea: HTMLTextAreaElement, context: QueryContext): SuggestContext => ({\n fullText: textarea.value,\n caret: textarea.selectionStart,\n tokenStart: context.start,\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createCompletionBehaviorState","abbreviations","buildSuggestContext","collectKnownLabels","detectQuery","displayLabel","GHOST_SENTINEL","pickGhost","resolveSuggestions","suggestSync","TRIGGER_CHARS","WORD_CHAR","plainTextHighlight","renderWithOverlay"],"sources":["inputs/completion/index.ts"],"sourcesContent":["export {\n createCompletionBehaviorState,\n type TryExpandOptions,\n} from \"./behaviors\";\nexport {\n abbreviations,\n buildSuggestContext,\n type Completion,\n collectKnownLabels,\n type DetectOptions,\n detectQuery,\n displayLabel,\n GHOST_SENTINEL,\n pickGhost,\n type QueryContext,\n type ResolveResult,\n resolveSuggestions,\n type SuggestContext,\n type Suggestion,\n suggestSync,\n TRIGGER_CHARS,\n WORD_CHAR,\n} from \"./engine\";\nexport {\n plainTextHighlight,\n type RenderOptions,\n renderWithOverlay,\n} from \"./overlay\";\n"],"mappings":"AAAA,SACEA,6BAA6B,QAExB,aAAa;AACpB,SACEC,aAAa,EACbC,mBAAmB,EAEnBC,kBAAkB,EAElBC,WAAW,EACXC,YAAY,EACZC,cAAc,EACdC,SAAS,EAGTC,kBAAkB,EAGlBC,WAAW,EACXC,aAAa,EACbC,SAAS,QACJ,UAAU;AACjB,SACEC,kBAAkB,EAElBC,iBAAiB,QACZ,WAAW","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/completion/index.ts"],"sourcesContent":["export {\n createCompletionBehaviorState,\n type TryExpandOptions,\n} from \"./behaviors\";\nexport {\n abbreviations,\n buildSuggestContext,\n type Completion,\n collectKnownLabels,\n type DetectOptions,\n detectQuery,\n displayLabel,\n GHOST_SENTINEL,\n pickGhost,\n type QueryContext,\n type ResolveResult,\n resolveSuggestions,\n type SuggestContext,\n type Suggestion,\n suggestSync,\n TRIGGER_CHARS,\n WORD_CHAR,\n} from \"./engine\";\nexport {\n plainTextHighlight,\n type RenderOptions,\n renderWithOverlay,\n} from \"./overlay\";\n"],"mappings":"AAAA,SACE,6BAA6B,QAExB,aAAa;AACpB,SACE,aAAa,EACb,mBAAmB,EAEnB,kBAAkB,EAElB,WAAW,EACX,YAAY,EACZ,cAAc,EACd,SAAS,EAGT,kBAAkB,EAGlB,WAAW,EACX,aAAa,EACb,SAAS,QACJ,UAAU;AACjB,SACE,kBAAkB,EAElB,iBAAiB,QACZ,WAAW","ignoreList":[]}