@k2b/ui 0.4.2 → 0.5.1

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 (383) hide show
  1. package/dist/browser/actions/Button.js.map +1 -1
  2. package/dist/browser/actions/ContextMenu.js.map +1 -1
  3. package/dist/browser/actions/CopyButton.js.map +1 -1
  4. package/dist/browser/actions/Disclosure.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js.map +1 -1
  7. package/dist/browser/actions/RemoveButton.js.map +1 -1
  8. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js.map +1 -1
  10. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  11. package/dist/browser/actions/Tabs.js.map +1 -1
  12. package/dist/browser/actions/Toolbar.js.map +1 -1
  13. package/dist/browser/actions/index.js.map +1 -1
  14. package/dist/browser/chat/ChatComposer.js.map +1 -1
  15. package/dist/browser/chat/ChatContextPopup.js.map +1 -1
  16. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  17. package/dist/browser/chat/ChatRoot.js.map +1 -1
  18. package/dist/browser/chat/ChatTasks.js +1 -1
  19. package/dist/browser/chat/ChatTasks.js.map +1 -1
  20. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  21. package/dist/browser/chat/chat-behavior.js.map +1 -1
  22. package/dist/browser/chat/composer-document.js.map +1 -1
  23. package/dist/browser/chat/index.js.map +1 -1
  24. package/dist/browser/content/Calendar.js.map +1 -1
  25. package/dist/browser/content/Chart.js.map +1 -1
  26. package/dist/browser/content/ChartExplorer.js.map +1 -1
  27. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  28. package/dist/browser/content/ChartFilterControls.js +1 -1
  29. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  30. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  31. package/dist/browser/content/CodeDisplay.js.map +1 -1
  32. package/dist/browser/content/DataTable.js.map +1 -1
  33. package/dist/browser/content/Docs.js.map +1 -1
  34. package/dist/browser/content/FileBrowser.js.map +1 -1
  35. package/dist/browser/content/FileGrid.js.map +1 -1
  36. package/dist/browser/content/FileTree.js.map +1 -1
  37. package/dist/browser/content/FileView.js.map +1 -1
  38. package/dist/browser/content/Lightbox.js.map +1 -1
  39. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  40. package/dist/browser/content/MarkdownView.js.map +1 -1
  41. package/dist/browser/content/Pagination.js.map +1 -1
  42. package/dist/browser/content/PdfPreview.js.map +1 -1
  43. package/dist/browser/content/RangePicker.js.map +1 -1
  44. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  45. package/dist/browser/content/calendar-event-layout.js.map +1 -1
  46. package/dist/browser/content/calendar-pointer.js.map +1 -1
  47. package/dist/browser/content/chart-cursor.js.map +1 -1
  48. package/dist/browser/content/chart-explorer.js.map +1 -1
  49. package/dist/browser/content/chart-inspection.js.map +1 -1
  50. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  51. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  52. package/dist/browser/content/chart-snapshot.js.map +1 -1
  53. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  54. package/dist/browser/content/chart-svg.js.map +1 -1
  55. package/dist/browser/content/code-highlight.js.map +1 -1
  56. package/dist/browser/content/collection-selection.js.map +1 -1
  57. package/dist/browser/content/delimited-preferences.js.map +1 -1
  58. package/dist/browser/content/file-tree.js.map +1 -1
  59. package/dist/browser/content/file-view-preview.js.map +1 -1
  60. package/dist/browser/content/index.js.map +1 -1
  61. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  62. package/dist/browser/feedback/Tooltip.js.map +1 -1
  63. package/dist/browser/feedback/dialog-core.js.map +1 -1
  64. package/dist/browser/feedback/index.js.map +1 -1
  65. package/dist/browser/feedback/prompts.js.map +1 -1
  66. package/dist/browser/feedback/toast.js.map +1 -1
  67. package/dist/browser/feedback/tooltip-position.js.map +1 -1
  68. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  69. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  70. package/dist/browser/inputs/Checkbox.js.map +1 -1
  71. package/dist/browser/inputs/CheckboxCard.js.map +1 -1
  72. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  73. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  74. package/dist/browser/inputs/Combobox.js.map +1 -1
  75. package/dist/browser/inputs/DatePicker.js.map +1 -1
  76. package/dist/browser/inputs/FileInputs.js.map +1 -1
  77. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  78. package/dist/browser/inputs/NumberInput.js.map +1 -1
  79. package/dist/browser/inputs/Select.js.map +1 -1
  80. package/dist/browser/inputs/SelectChip.js.map +1 -1
  81. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  82. package/dist/browser/inputs/Switch.js.map +1 -1
  83. package/dist/browser/inputs/TagEditor.js.map +1 -1
  84. package/dist/browser/inputs/TagsInput.js.map +1 -1
  85. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  86. package/dist/browser/inputs/TextInput.js.map +1 -1
  87. package/dist/browser/inputs/choice.js.map +1 -1
  88. package/dist/browser/inputs/completion/behaviors.js.map +1 -1
  89. package/dist/browser/inputs/completion/engine.js.map +1 -1
  90. package/dist/browser/inputs/completion/index.js.map +1 -1
  91. package/dist/browser/inputs/completion/overlay.js.map +1 -1
  92. package/dist/browser/inputs/date-picker.js.map +1 -1
  93. package/dist/browser/inputs/editor-dom.js.map +1 -1
  94. package/dist/browser/inputs/field-contract.js.map +1 -1
  95. package/dist/browser/inputs/icon-options.js.map +1 -1
  96. package/dist/browser/inputs/image-crop.js.map +1 -1
  97. package/dist/browser/inputs/index.js.map +1 -1
  98. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  99. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  100. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  101. package/dist/browser/inputs/markdown/active-formats.js.map +1 -1
  102. package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
  103. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  104. package/dist/browser/internal/color.js.map +1 -1
  105. package/dist/browser/internal/field.js.map +1 -1
  106. package/dist/browser/internal/portal.js.map +1 -1
  107. package/dist/browser/intl/Format.js.map +1 -1
  108. package/dist/browser/intl/index.js.map +1 -1
  109. package/dist/browser/intl/locale.js.map +1 -1
  110. package/dist/browser/intl/messages.js +2 -0
  111. package/dist/browser/intl/messages.js.map +1 -1
  112. package/dist/browser/layout/AppOverview.js +29 -20
  113. package/dist/browser/layout/AppOverview.js.map +1 -1
  114. package/dist/browser/layout/AppWorkspace.js +60 -54
  115. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  116. package/dist/browser/layout/BottomSheet.js.map +1 -1
  117. package/dist/browser/layout/DataPanel.js.map +1 -1
  118. package/dist/browser/layout/DetailPanel.js.map +1 -1
  119. package/dist/browser/layout/Discussion.js.map +1 -1
  120. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  121. package/dist/browser/layout/Navigation.js.map +1 -1
  122. package/dist/browser/layout/PanelDialog.js.map +1 -1
  123. package/dist/browser/layout/PanelHeader.js +1 -1
  124. package/dist/browser/layout/PanelHeader.js.map +1 -1
  125. package/dist/browser/layout/Panes.js.map +1 -1
  126. package/dist/browser/layout/PullToRefresh.js +217 -0
  127. package/dist/browser/layout/PullToRefresh.js.map +1 -0
  128. package/dist/browser/layout/ScrollArea.js.map +1 -1
  129. package/dist/browser/layout/Settings.js.map +1 -1
  130. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  131. package/dist/browser/layout/SettingsModal.js.map +1 -1
  132. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  133. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  134. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  135. package/dist/browser/layout/floating-window-geometry.js.map +1 -1
  136. package/dist/browser/layout/index.js +1 -0
  137. package/dist/browser/layout/index.js.map +1 -1
  138. package/dist/browser/layout/navigation-model.js.map +1 -1
  139. package/dist/browser/layout/panes-layout.js.map +1 -1
  140. package/dist/browser/layout/scroll-fade.js.map +1 -1
  141. package/dist/browser/layout/stable-id.js.map +1 -1
  142. package/dist/browser/surfaces/Avatar.js.map +1 -1
  143. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  144. package/dist/browser/surfaces/LinkCard.js +13 -2
  145. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  146. package/dist/browser/surfaces/NotFoundState.js.map +1 -1
  147. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  148. package/dist/browser/surfaces/Paper.js.map +1 -1
  149. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  150. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  151. package/dist/browser/surfaces/StatCell.js.map +1 -1
  152. package/dist/browser/surfaces/StatGrid.js.map +1 -1
  153. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  154. package/dist/browser/surfaces/Tag.js.map +1 -1
  155. package/dist/browser/surfaces/index.js.map +1 -1
  156. package/dist/browser/widgets/Widget.js.map +1 -1
  157. package/dist/browser/widgets/WidgetHero.js.map +1 -1
  158. package/dist/browser/widgets/WidgetList.js.map +1 -1
  159. package/dist/browser/widgets/WidgetPills.js.map +1 -1
  160. package/dist/browser/widgets/WidgetStat.js.map +1 -1
  161. package/dist/browser/widgets/WidgetStatus.js.map +1 -1
  162. package/dist/ssr/actions/Button.js +5 -4
  163. package/dist/ssr/actions/Button.js.map +1 -1
  164. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  165. package/dist/ssr/actions/CopyButton.js +2 -1
  166. package/dist/ssr/actions/CopyButton.js.map +1 -1
  167. package/dist/ssr/actions/Disclosure.js.map +1 -1
  168. package/dist/ssr/actions/Dropdown.js +7 -6
  169. package/dist/ssr/actions/Dropdown.js.map +1 -1
  170. package/dist/ssr/actions/FilterChip.js +5 -4
  171. package/dist/ssr/actions/FilterChip.js.map +1 -1
  172. package/dist/ssr/actions/RemoveButton.js +1 -0
  173. package/dist/ssr/actions/RemoveButton.js.map +1 -1
  174. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  175. package/dist/ssr/actions/SplitButton.js +1 -0
  176. package/dist/ssr/actions/SplitButton.js.map +1 -1
  177. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  178. package/dist/ssr/actions/Tabs.js.map +1 -1
  179. package/dist/ssr/actions/Toolbar.js.map +1 -1
  180. package/dist/ssr/actions/index.js.map +1 -1
  181. package/dist/ssr/chat/ChatComposer.js +6 -5
  182. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  183. package/dist/ssr/chat/ChatContextPopup.js.map +1 -1
  184. package/dist/ssr/chat/ChatPrimitives.js +6 -5
  185. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  186. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  187. package/dist/ssr/chat/ChatTasks.js +1 -1
  188. package/dist/ssr/chat/ChatTasks.js.map +1 -1
  189. package/dist/ssr/chat/ChatTimeline.js +5 -4
  190. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  191. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  192. package/dist/ssr/chat/composer-document.js.map +1 -1
  193. package/dist/ssr/chat/index.js.map +1 -1
  194. package/dist/ssr/content/Calendar.js +2 -1
  195. package/dist/ssr/content/Calendar.js.map +1 -1
  196. package/dist/ssr/content/Chart.js.map +1 -1
  197. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  198. package/dist/ssr/content/ChartExplorerControls.js +5 -4
  199. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  200. package/dist/ssr/content/ChartFilterControls.js +3 -2
  201. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  202. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  203. package/dist/ssr/content/CodeDisplay.js.map +1 -1
  204. package/dist/ssr/content/DataTable.js +1 -0
  205. package/dist/ssr/content/DataTable.js.map +1 -1
  206. package/dist/ssr/content/Docs.js +1 -0
  207. package/dist/ssr/content/Docs.js.map +1 -1
  208. package/dist/ssr/content/FileBrowser.js +2 -1
  209. package/dist/ssr/content/FileBrowser.js.map +1 -1
  210. package/dist/ssr/content/FileGrid.js.map +1 -1
  211. package/dist/ssr/content/FileTree.js +2 -1
  212. package/dist/ssr/content/FileTree.js.map +1 -1
  213. package/dist/ssr/content/FileView.js +5 -4
  214. package/dist/ssr/content/FileView.js.map +1 -1
  215. package/dist/ssr/content/Lightbox.js +2 -1
  216. package/dist/ssr/content/Lightbox.js.map +1 -1
  217. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  218. package/dist/ssr/content/MarkdownView.js.map +1 -1
  219. package/dist/ssr/content/Pagination.js +2 -1
  220. package/dist/ssr/content/Pagination.js.map +1 -1
  221. package/dist/ssr/content/PdfPreview.js.map +1 -1
  222. package/dist/ssr/content/RangePicker.js.map +1 -1
  223. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  224. package/dist/ssr/content/calendar-event-layout.js.map +1 -1
  225. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  226. package/dist/ssr/content/chart-cursor.js.map +1 -1
  227. package/dist/ssr/content/chart-explorer.js.map +1 -1
  228. package/dist/ssr/content/chart-inspection.js.map +1 -1
  229. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  230. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  231. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  232. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  233. package/dist/ssr/content/chart-svg.js.map +1 -1
  234. package/dist/ssr/content/code-highlight.js.map +1 -1
  235. package/dist/ssr/content/collection-selection.js.map +1 -1
  236. package/dist/ssr/content/delimited-preferences.js.map +1 -1
  237. package/dist/ssr/content/file-tree.js.map +1 -1
  238. package/dist/ssr/content/file-view-preview.js.map +1 -1
  239. package/dist/ssr/content/index.js.map +1 -1
  240. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  241. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  242. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  243. package/dist/ssr/feedback/index.js.map +1 -1
  244. package/dist/ssr/feedback/prompts.js +3 -2
  245. package/dist/ssr/feedback/prompts.js.map +1 -1
  246. package/dist/ssr/feedback/toast.js.map +1 -1
  247. package/dist/ssr/feedback/tooltip-position.js.map +1 -1
  248. package/dist/ssr/inputs/AutocompleteEditor.js +3 -2
  249. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  250. package/dist/ssr/inputs/AutocompleteSelect.js +5 -4
  251. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  252. package/dist/ssr/inputs/Checkbox.js +1 -0
  253. package/dist/ssr/inputs/Checkbox.js.map +1 -1
  254. package/dist/ssr/inputs/CheckboxCard.js.map +1 -1
  255. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  256. package/dist/ssr/inputs/ChoiceInputs.js +1 -0
  257. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  258. package/dist/ssr/inputs/Combobox.js +2 -1
  259. package/dist/ssr/inputs/Combobox.js.map +1 -1
  260. package/dist/ssr/inputs/DatePicker.js +4 -3
  261. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  262. package/dist/ssr/inputs/FileInputs.js +2 -1
  263. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  264. package/dist/ssr/inputs/MultiSelectInput.js +4 -3
  265. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  266. package/dist/ssr/inputs/NumberInput.js +2 -1
  267. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  268. package/dist/ssr/inputs/Select.js +4 -3
  269. package/dist/ssr/inputs/Select.js.map +1 -1
  270. package/dist/ssr/inputs/SelectChip.js +3 -2
  271. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  272. package/dist/ssr/inputs/SpecialInputs.js +1 -0
  273. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  274. package/dist/ssr/inputs/Switch.js.map +1 -1
  275. package/dist/ssr/inputs/TagEditor.js +3 -2
  276. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  277. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  278. package/dist/ssr/inputs/TemplateEditor.js +1 -0
  279. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  280. package/dist/ssr/inputs/TextInput.js +4 -3
  281. package/dist/ssr/inputs/TextInput.js.map +1 -1
  282. package/dist/ssr/inputs/choice.js.map +1 -1
  283. package/dist/ssr/inputs/completion/behaviors.js.map +1 -1
  284. package/dist/ssr/inputs/completion/engine.js.map +1 -1
  285. package/dist/ssr/inputs/completion/index.js.map +1 -1
  286. package/dist/ssr/inputs/completion/overlay.js.map +1 -1
  287. package/dist/ssr/inputs/date-picker.js.map +1 -1
  288. package/dist/ssr/inputs/editor-dom.js.map +1 -1
  289. package/dist/ssr/inputs/field-contract.js.map +1 -1
  290. package/dist/ssr/inputs/icon-options.js.map +1 -1
  291. package/dist/ssr/inputs/image-crop.js.map +1 -1
  292. package/dist/ssr/inputs/index.js.map +1 -1
  293. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  294. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  295. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  296. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  297. package/dist/ssr/inputs/markdown/active-formats.js.map +1 -1
  298. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
  299. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  300. package/dist/ssr/internal/color.js.map +1 -1
  301. package/dist/ssr/internal/field.js.map +1 -1
  302. package/dist/ssr/internal/portal.js.map +1 -1
  303. package/dist/ssr/intl/Format.js.map +1 -1
  304. package/dist/ssr/intl/index.js.map +1 -1
  305. package/dist/ssr/intl/locale.js.map +1 -1
  306. package/dist/ssr/intl/messages.js +2 -0
  307. package/dist/ssr/intl/messages.js.map +1 -1
  308. package/dist/ssr/layout/AppOverview.js +16 -6
  309. package/dist/ssr/layout/AppOverview.js.map +1 -1
  310. package/dist/ssr/layout/AppWorkspace.js +12 -8
  311. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  312. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  313. package/dist/ssr/layout/DataPanel.js +1 -0
  314. package/dist/ssr/layout/DataPanel.js.map +1 -1
  315. package/dist/ssr/layout/DetailPanel.js +1 -0
  316. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  317. package/dist/ssr/layout/Discussion.js +3 -2
  318. package/dist/ssr/layout/Discussion.js.map +1 -1
  319. package/dist/ssr/layout/FloatingWindow.js +1 -0
  320. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  321. package/dist/ssr/layout/Navigation.js +3 -2
  322. package/dist/ssr/layout/Navigation.js.map +1 -1
  323. package/dist/ssr/layout/PanelDialog.js +1 -0
  324. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  325. package/dist/ssr/layout/PanelHeader.js +1 -1
  326. package/dist/ssr/layout/PanelHeader.js.map +1 -1
  327. package/dist/ssr/layout/Panes.js.map +1 -1
  328. package/dist/ssr/layout/PullToRefresh.js +177 -0
  329. package/dist/ssr/layout/PullToRefresh.js.map +1 -0
  330. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  331. package/dist/ssr/layout/Settings.js +2 -1
  332. package/dist/ssr/layout/Settings.js.map +1 -1
  333. package/dist/ssr/layout/SettingsCollection.js +1 -0
  334. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  335. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  336. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  337. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  338. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  339. package/dist/ssr/layout/floating-window-geometry.js.map +1 -1
  340. package/dist/ssr/layout/index.js +1 -0
  341. package/dist/ssr/layout/index.js.map +1 -1
  342. package/dist/ssr/layout/navigation-model.js.map +1 -1
  343. package/dist/ssr/layout/panes-layout.js.map +1 -1
  344. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  345. package/dist/ssr/layout/stable-id.js.map +1 -1
  346. package/dist/ssr/surfaces/Avatar.js +2 -1
  347. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  348. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  349. package/dist/ssr/surfaces/LinkCard.js +11 -2
  350. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  351. package/dist/ssr/surfaces/NotFoundState.js.map +1 -1
  352. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  353. package/dist/ssr/surfaces/Paper.js +2 -1
  354. package/dist/ssr/surfaces/Paper.js.map +1 -1
  355. package/dist/ssr/surfaces/Placeholder.js +2 -1
  356. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  357. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  358. package/dist/ssr/surfaces/StatCell.js +2 -1
  359. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  360. package/dist/ssr/surfaces/StatGrid.js +1 -0
  361. package/dist/ssr/surfaces/StatGrid.js.map +1 -1
  362. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  363. package/dist/ssr/surfaces/Tag.js.map +1 -1
  364. package/dist/ssr/surfaces/index.js.map +1 -1
  365. package/dist/ssr/widgets/Widget.js +1 -0
  366. package/dist/ssr/widgets/Widget.js.map +1 -1
  367. package/dist/ssr/widgets/WidgetHero.js.map +1 -1
  368. package/dist/ssr/widgets/WidgetList.js.map +1 -1
  369. package/dist/ssr/widgets/WidgetPills.js.map +1 -1
  370. package/dist/ssr/widgets/WidgetStat.js +1 -0
  371. package/dist/ssr/widgets/WidgetStat.js.map +1 -1
  372. package/dist/ssr/widgets/WidgetStatus.js.map +1 -1
  373. package/dist/styles.css +1 -1
  374. package/dist/types/actions/SpotlightSearch.d.ts +1 -1
  375. package/dist/types/feedback/prompts.d.ts +2 -2
  376. package/dist/types/intl/messages.d.ts +1 -0
  377. package/dist/types/layout/AppOverview.d.ts +7 -0
  378. package/dist/types/layout/AppWorkspace.d.ts +14 -2
  379. package/dist/types/layout/PanelHeader.d.ts +1 -1
  380. package/dist/types/layout/PullToRefresh.d.ts +21 -0
  381. package/dist/types/layout/index.d.ts +3 -1
  382. package/dist/types/surfaces/LinkCard.d.ts +5 -2
  383. package/package.json +7 -7
@@ -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 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 +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":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["GHOST_SENTINEL","ANCHOR_SENTINEL","String","fromCharCode","escapeHtml","value","replace","plainTextHighlight","renderWithOverlay","text","highlighter","options","injections","anchor","at","marker","order","undefined","ghost","filter","injection","Boolean","sort","left","right","workText","reduce","slice","html","split","join"],"sources":["inputs/completion/overlay.ts"],"sourcesContent":["import { GHOST_SENTINEL } from \"./engine\";\n\nconst ANCHOR_SENTINEL = String.fromCharCode(0xe011);\n\nconst escapeHtml = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n\nexport const plainTextHighlight = escapeHtml;\n\nexport type RenderOptions = {\n ghost?: { at: number; text: string };\n anchor?: { at: number };\n};\n\nexport const renderWithOverlay = (text: string, highlighter: (text: string) => string, options: RenderOptions = {}): string => {\n const injections = [\n options.anchor ? { at: options.anchor.at, marker: ANCHOR_SENTINEL, order: 1 } : undefined,\n options.ghost ? { at: options.ghost.at, marker: GHOST_SENTINEL, order: 0 } : undefined,\n ]\n .filter((injection): injection is { at: number; marker: string; order: number } => Boolean(injection))\n .sort((left, right) => right.at - left.at || left.order - right.order);\n const workText = injections.reduce(\n (value, injection) => `${value.slice(0, injection.at)}${injection.marker}${value.slice(injection.at)}`,\n text,\n );\n let html = highlighter(workText);\n if (options.ghost) {\n html = html\n .split(GHOST_SENTINEL)\n .join(\n `<span class=\"k2b-completion-ghost\"${options.anchor ? \"\" : \" data-completion-anchor\"}>${escapeHtml(options.ghost.text)}<span class=\"k2b-completion-ghost__arrow\" aria-hidden=\"true\">→</span></span>`,\n );\n }\n if (options.anchor) {\n html = html.split(ANCHOR_SENTINEL).join('<span class=\"k2b-completion-anchor\" data-completion-anchor aria-hidden=\"true\">\\u200b</span>');\n }\n return html;\n};\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,UAAU;AAEzC,MAAMC,eAAe,GAAGC,MAAM,CAACC,YAAY,CAAC,MAAM,CAAC;AAEnD,MAAMC,UAAU,GAAIC,KAAa,IAC/BA,KAAK,CAACC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;AAEzH,OAAO,MAAMC,kBAAkB,GAAGH,UAAU;AAO5C,OAAO,MAAMI,iBAAiB,GAAGA,CAACC,IAAY,EAAEC,WAAqC,EAAEC,OAAsB,GAAG,CAAC,CAAC,KAAa;EAC7H,MAAMC,UAAU,GAAG,CACjBD,OAAO,CAACE,MAAM,GAAG;IAAEC,EAAE,EAAEH,OAAO,CAACE,MAAM,CAACC,EAAE;IAAEC,MAAM,EAAEd,eAAe;IAAEe,KAAK,EAAE;EAAE,CAAC,GAAGC,SAAS,EACzFN,OAAO,CAACO,KAAK,GAAG;IAAEJ,EAAE,EAAEH,OAAO,CAACO,KAAK,CAACJ,EAAE;IAAEC,MAAM,EAAEf,cAAc;IAAEgB,KAAK,EAAE;EAAE,CAAC,GAAGC,SAAS,CACvF,CACEE,MAAM,CAAEC,SAAS,IAAiEC,OAAO,CAACD,SAAS,CAAC,CAAC,CACrGE,IAAI,CAAC,CAACC,IAAI,EAAEC,KAAK,KAAKA,KAAK,CAACV,EAAE,GAAGS,IAAI,CAACT,EAAE,IAAIS,IAAI,CAACP,KAAK,GAAGQ,KAAK,CAACR,KAAK,CAAC;EACxE,MAAMS,QAAQ,GAAGb,UAAU,CAACc,MAAM,CAChC,CAACrB,KAAK,EAAEe,SAAS,KAAK,GAAGf,KAAK,CAACsB,KAAK,CAAC,CAAC,EAAEP,SAAS,CAACN,EAAE,CAAC,GAAGM,SAAS,CAACL,MAAM,GAAGV,KAAK,CAACsB,KAAK,CAACP,SAAS,CAACN,EAAE,CAAC,EAAE,EACtGL,IACF,CAAC;EACD,IAAImB,IAAI,GAAGlB,WAAW,CAACe,QAAQ,CAAC;EAChC,IAAId,OAAO,CAACO,KAAK,EAAE;IACjBU,IAAI,GAAGA,IAAI,CACRC,KAAK,CAAC7B,cAAc,CAAC,CACrB8B,IAAI,CACH,qCAAqCnB,OAAO,CAACE,MAAM,GAAG,EAAE,GAAG,yBAAyB,IAAIT,UAAU,CAACO,OAAO,CAACO,KAAK,CAACT,IAAI,CAAC,8EACxH,CAAC;EACL;EACA,IAAIE,OAAO,CAACE,MAAM,EAAE;IAClBe,IAAI,GAAGA,IAAI,CAACC,KAAK,CAAC5B,eAAe,CAAC,CAAC6B,IAAI,CAAC,6FAA6F,CAAC;EACxI;EACA,OAAOF,IAAI;AACb,CAAC","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/completion/overlay.ts"],"sourcesContent":["import { GHOST_SENTINEL } from \"./engine\";\n\nconst ANCHOR_SENTINEL = String.fromCharCode(0xe011);\n\nconst escapeHtml = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n\nexport const plainTextHighlight = escapeHtml;\n\nexport type RenderOptions = {\n ghost?: { at: number; text: string };\n anchor?: { at: number };\n};\n\nexport const renderWithOverlay = (text: string, highlighter: (text: string) => string, options: RenderOptions = {}): string => {\n const injections = [\n options.anchor ? { at: options.anchor.at, marker: ANCHOR_SENTINEL, order: 1 } : undefined,\n options.ghost ? { at: options.ghost.at, marker: GHOST_SENTINEL, order: 0 } : undefined,\n ]\n .filter((injection): injection is { at: number; marker: string; order: number } => Boolean(injection))\n .sort((left, right) => right.at - left.at || left.order - right.order);\n const workText = injections.reduce(\n (value, injection) => `${value.slice(0, injection.at)}${injection.marker}${value.slice(injection.at)}`,\n text,\n );\n let html = highlighter(workText);\n if (options.ghost) {\n html = html\n .split(GHOST_SENTINEL)\n .join(\n `<span class=\"k2b-completion-ghost\"${options.anchor ? \"\" : \" data-completion-anchor\"}>${escapeHtml(options.ghost.text)}<span class=\"k2b-completion-ghost__arrow\" aria-hidden=\"true\">→</span></span>`,\n );\n }\n if (options.anchor) {\n html = html.split(ANCHOR_SENTINEL).join('<span class=\"k2b-completion-anchor\" data-completion-anchor aria-hidden=\"true\">\\u200b</span>');\n }\n return html;\n};\n"],"mappings":"AAAA,SAAS,cAAc,QAAQ,UAAU;AAEzC,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;AAEnD,MAAM,UAAU,GAAI,KAAa,IAC/B,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;AAEzH,OAAO,MAAM,kBAAkB,GAAG,UAAU;AAO5C,OAAO,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,WAAqC,EAAE,OAAsB,GAAG,CAAC,CAAC,KAAa;EAC7H,MAAM,UAAU,GAAG,CACjB,OAAO,CAAC,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;IAAE,MAAM,EAAE,eAAe;IAAE,KAAK,EAAE;EAAE,CAAC,GAAG,SAAS,EACzF,OAAO,CAAC,KAAK,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;IAAE,MAAM,EAAE,cAAc;IAAE,KAAK,EAAE;EAAE,CAAC,GAAG,SAAS,CACvF,CACE,MAAM,CAAE,SAAS,IAAiE,OAAO,CAAC,SAAS,CAAC,CAAC,CACrG,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;EACxE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAChC,CAAC,KAAK,EAAE,SAAS,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,EACtG,IACF,CAAC;EACD,IAAI,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC;EAChC,IAAI,OAAO,CAAC,KAAK,EAAE;IACjB,IAAI,GAAG,IAAI,CACR,KAAK,CAAC,cAAc,CAAC,CACrB,IAAI,CACH,qCAAqC,OAAO,CAAC,MAAM,GAAG,EAAE,GAAG,yBAAyB,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,8EACxH,CAAC;EACL;EACA,IAAI,OAAO,CAAC,MAAM,EAAE;IAClB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,6FAA6F,CAAC;EACxI;EACA,OAAO,IAAI;AACb,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["dates","pickerContext","context","weekStartsOn","hasInstantOffset","value","test","dateKey","date","formatDateKey","monthNames","merged","formatter","Intl","DateTimeFormat","locale","month","timeZone","Array","from","length","_","index","format","Date","UTC","resolveFocusDay","monthDayKeys","preferred","includes","yearMonth","year","split","Number","monthDate","String","padStart","zonedDateTimeToInstant","disambiguation","parseDateValue","today","parseCalendarDate","slice","displayDate","formatDate","localDateTimeInput","getFullYear","getMonth","day","getDate","hours","getHours","minutes","getMinutes","dateTimeInput","instantToZonedInput","splitDateTime","input","time","isCompleteTime","map","toDateTimeValue","resolvedTime","local","formatDateTimeValue","formatDateTime","normalizeTimeInput","hour","Math","max","min","minute","filterTimeInput","digits","replace","orderedRange","start","end","localeCompare","previewRange","range","preview","inRange","Boolean","isRangeEdge","formatDateOnlyRangeDuration","parse","days","floor","abs"],"sources":["inputs/date-picker.ts"],"sourcesContent":["import { type DateContext, dates } from \"@k2b/stdlib\";\n\nexport type DateRangeValue = {\n start: string | null;\n end: string | null;\n};\n\nexport const pickerContext = (context?: DateContext): DateContext => ({\n weekStartsOn: 1,\n ...context,\n});\n\nexport const hasInstantOffset = (value: string): boolean => /[T\\s].*([zZ]|[+-]\\d{2}:?\\d{2})$/.test(value);\n\nexport const dateKey = (date: Date | string, context?: DateContext): string => dates.formatDateKey(date, pickerContext(context));\n\n/**\n * Short month names for the month panel. `dates.months()` only returns the long\n * form (\"September\"), which overflows the three-column month grid, so the short\n * form is derived here while staying locale aware.\n */\nexport const monthNames = (context?: DateContext): string[] => {\n const merged = pickerContext(context);\n const formatter = new Intl.DateTimeFormat(merged.locale, { month: \"short\", timeZone: \"UTC\" });\n return Array.from({ length: 12 }, (_, index) => formatter.format(Date.UTC(2024, index, 15)));\n};\n\n/**\n * Picks the roving-tabindex day for a rendered month grid. The preferred day is\n * used when the grid actually contains it, otherwise the first day of the\n * visible month keeps exactly one cell reachable by Tab.\n */\nexport const resolveFocusDay = (monthDayKeys: readonly string[], preferred: string | null | undefined): string | undefined =>\n preferred && monthDayKeys.includes(preferred) ? preferred : monthDayKeys[0];\n\nexport const yearMonth = (date: Date, context?: DateContext): { year: number; month: number } => {\n const [year = \"1970\", month = \"1\"] = dateKey(date, context).split(\"-\");\n return { year: Number(year), month: Number(month) - 1 };\n};\n\nexport const monthDate = (year: number, month: number, context?: DateContext): Date => {\n const value = `${year}-${String(month + 1).padStart(2, \"0\")}-01T12:00`;\n if (context?.timeZone) {\n return new Date(dates.zonedDateTimeToInstant(value, context.timeZone, { disambiguation: \"compatible\" }));\n }\n return new Date(year, month, 1, 12);\n};\n\nexport const parseDateValue = (value: string | null | undefined, context?: DateContext): Date => {\n if (!value) return dates.today(pickerContext(context));\n return dates.parseCalendarDate(value.slice(0, 10), pickerContext(context));\n};\n\nexport const displayDate = (value: string | null | undefined, context?: DateContext): string =>\n value ? dates.formatDate(`${value.slice(0, 10)}T12:00`, pickerContext(context)) : \"\";\n\nconst localDateTimeInput = (value: string): string => {\n if (!hasInstantOffset(value)) return value.slice(0, 16);\n const date = new Date(value);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n return `${year}-${month}-${day}T${hours}:${minutes}`;\n};\n\nexport const dateTimeInput = (value: string | null | undefined, context?: DateContext): string => {\n if (!value) return \"\";\n if (context?.timeZone && hasInstantOffset(value)) return dates.instantToZonedInput(value, context.timeZone);\n return localDateTimeInput(value);\n};\n\nexport const splitDateTime = (value: string | null | undefined, context?: DateContext): { date: string; time: string } => {\n const input = dateTimeInput(value, context);\n const [date = \"\", time = \"\"] = input.split(\"T\");\n return { date, time: time.slice(0, 5) };\n};\n\nexport const isCompleteTime = (value: string): boolean => {\n if (!/^\\d{2}:\\d{2}$/.test(value)) return false;\n const [hours, minutes] = value.split(\":\").map(Number);\n return hours! >= 0 && hours! <= 23 && minutes! >= 0 && minutes! <= 59;\n};\n\nexport const toDateTimeValue = (date: string, time: string, context?: DateContext): string | null => {\n if (!date) return null;\n const resolvedTime = time || \"00:00\";\n if (!isCompleteTime(resolvedTime)) return null;\n const local = `${date}T${resolvedTime}`;\n if (context?.timeZone) {\n return dates.zonedDateTimeToInstant(local, context.timeZone, { disambiguation: \"compatible\" });\n }\n return local;\n};\n\nexport const formatDateTimeValue = (value: string | null | undefined, context?: DateContext): string =>\n value ? dates.formatDateTime(value, pickerContext(context)) : \"\";\n\nexport const normalizeTimeInput = (value: string): string => {\n const [hours = \"\", minutes = \"\"] = value.split(\":\");\n const hour = Math.max(0, Math.min(23, Number(hours || 0)));\n const minute = Math.max(0, Math.min(59, Number(minutes || 0)));\n return `${String(hour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n};\n\nexport const filterTimeInput = (value: string): string => {\n const digits = value.replace(/\\D/g, \"\").slice(0, 4);\n return digits.length <= 2 ? digits : `${digits.slice(0, 2)}:${digits.slice(2)}`;\n};\n\nexport const orderedRange = (start: string, end: string): DateRangeValue =>\n end.localeCompare(start) < 0 ? { start: end, end: start } : { start, end };\n\nexport const previewRange = (range: DateRangeValue, preview: string | null): DateRangeValue => {\n if (!range.start || range.end || !preview) return range;\n return orderedRange(range.start, preview);\n};\n\nexport const inRange = (day: string, range: DateRangeValue): boolean =>\n Boolean(range.start && range.end && day >= range.start && day <= range.end);\n\nexport const isRangeEdge = (day: string, range: DateRangeValue): boolean => day === range.start || day === range.end;\n\nexport const formatDateOnlyRangeDuration = (range: DateRangeValue, context?: DateContext): string => {\n if (!range.start || !range.end) return \"\";\n const start = Date.parse(`${dateKey(range.start, context)}T00:00:00.000Z`);\n const end = Date.parse(`${dateKey(range.end, context)}T00:00:00.000Z`);\n const days = Math.floor(Math.abs(end - start) / 86_400_000) + 1;\n return `${days} ${days === 1 ? \"day\" : \"days\"}`;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/date-picker.ts"],"sourcesContent":["import { type DateContext, dates } from \"@k2b/stdlib\";\n\nexport type DateRangeValue = {\n start: string | null;\n end: string | null;\n};\n\nexport const pickerContext = (context?: DateContext): DateContext => ({\n weekStartsOn: 1,\n ...context,\n});\n\nexport const hasInstantOffset = (value: string): boolean => /[T\\s].*([zZ]|[+-]\\d{2}:?\\d{2})$/.test(value);\n\nexport const dateKey = (date: Date | string, context?: DateContext): string => dates.formatDateKey(date, pickerContext(context));\n\n/**\n * Short month names for the month panel. `dates.months()` only returns the long\n * form (\"September\"), which overflows the three-column month grid, so the short\n * form is derived here while staying locale aware.\n */\nexport const monthNames = (context?: DateContext): string[] => {\n const merged = pickerContext(context);\n const formatter = new Intl.DateTimeFormat(merged.locale, { month: \"short\", timeZone: \"UTC\" });\n return Array.from({ length: 12 }, (_, index) => formatter.format(Date.UTC(2024, index, 15)));\n};\n\n/**\n * Picks the roving-tabindex day for a rendered month grid. The preferred day is\n * used when the grid actually contains it, otherwise the first day of the\n * visible month keeps exactly one cell reachable by Tab.\n */\nexport const resolveFocusDay = (monthDayKeys: readonly string[], preferred: string | null | undefined): string | undefined =>\n preferred && monthDayKeys.includes(preferred) ? preferred : monthDayKeys[0];\n\nexport const yearMonth = (date: Date, context?: DateContext): { year: number; month: number } => {\n const [year = \"1970\", month = \"1\"] = dateKey(date, context).split(\"-\");\n return { year: Number(year), month: Number(month) - 1 };\n};\n\nexport const monthDate = (year: number, month: number, context?: DateContext): Date => {\n const value = `${year}-${String(month + 1).padStart(2, \"0\")}-01T12:00`;\n if (context?.timeZone) {\n return new Date(dates.zonedDateTimeToInstant(value, context.timeZone, { disambiguation: \"compatible\" }));\n }\n return new Date(year, month, 1, 12);\n};\n\nexport const parseDateValue = (value: string | null | undefined, context?: DateContext): Date => {\n if (!value) return dates.today(pickerContext(context));\n return dates.parseCalendarDate(value.slice(0, 10), pickerContext(context));\n};\n\nexport const displayDate = (value: string | null | undefined, context?: DateContext): string =>\n value ? dates.formatDate(`${value.slice(0, 10)}T12:00`, pickerContext(context)) : \"\";\n\nconst localDateTimeInput = (value: string): string => {\n if (!hasInstantOffset(value)) return value.slice(0, 16);\n const date = new Date(value);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n return `${year}-${month}-${day}T${hours}:${minutes}`;\n};\n\nexport const dateTimeInput = (value: string | null | undefined, context?: DateContext): string => {\n if (!value) return \"\";\n if (context?.timeZone && hasInstantOffset(value)) return dates.instantToZonedInput(value, context.timeZone);\n return localDateTimeInput(value);\n};\n\nexport const splitDateTime = (value: string | null | undefined, context?: DateContext): { date: string; time: string } => {\n const input = dateTimeInput(value, context);\n const [date = \"\", time = \"\"] = input.split(\"T\");\n return { date, time: time.slice(0, 5) };\n};\n\nexport const isCompleteTime = (value: string): boolean => {\n if (!/^\\d{2}:\\d{2}$/.test(value)) return false;\n const [hours, minutes] = value.split(\":\").map(Number);\n return hours! >= 0 && hours! <= 23 && minutes! >= 0 && minutes! <= 59;\n};\n\nexport const toDateTimeValue = (date: string, time: string, context?: DateContext): string | null => {\n if (!date) return null;\n const resolvedTime = time || \"00:00\";\n if (!isCompleteTime(resolvedTime)) return null;\n const local = `${date}T${resolvedTime}`;\n if (context?.timeZone) {\n return dates.zonedDateTimeToInstant(local, context.timeZone, { disambiguation: \"compatible\" });\n }\n return local;\n};\n\nexport const formatDateTimeValue = (value: string | null | undefined, context?: DateContext): string =>\n value ? dates.formatDateTime(value, pickerContext(context)) : \"\";\n\nexport const normalizeTimeInput = (value: string): string => {\n const [hours = \"\", minutes = \"\"] = value.split(\":\");\n const hour = Math.max(0, Math.min(23, Number(hours || 0)));\n const minute = Math.max(0, Math.min(59, Number(minutes || 0)));\n return `${String(hour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n};\n\nexport const filterTimeInput = (value: string): string => {\n const digits = value.replace(/\\D/g, \"\").slice(0, 4);\n return digits.length <= 2 ? digits : `${digits.slice(0, 2)}:${digits.slice(2)}`;\n};\n\nexport const orderedRange = (start: string, end: string): DateRangeValue =>\n end.localeCompare(start) < 0 ? { start: end, end: start } : { start, end };\n\nexport const previewRange = (range: DateRangeValue, preview: string | null): DateRangeValue => {\n if (!range.start || range.end || !preview) return range;\n return orderedRange(range.start, preview);\n};\n\nexport const inRange = (day: string, range: DateRangeValue): boolean =>\n Boolean(range.start && range.end && day >= range.start && day <= range.end);\n\nexport const isRangeEdge = (day: string, range: DateRangeValue): boolean => day === range.start || day === range.end;\n\nexport const formatDateOnlyRangeDuration = (range: DateRangeValue, context?: DateContext): string => {\n if (!range.start || !range.end) return \"\";\n const start = Date.parse(`${dateKey(range.start, context)}T00:00:00.000Z`);\n const end = Date.parse(`${dateKey(range.end, context)}T00:00:00.000Z`);\n const days = Math.floor(Math.abs(end - start) / 86_400_000) + 1;\n return `${days} ${days === 1 ? \"day\" : \"days\"}`;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["replaceTextareaRange","textarea","start","end","replacement","focus","setSelectionRange","document","execCommand","setRangeText","value","slice","caret","length","dispatchEvent","Event","bubbles"],"sources":["inputs/editor-dom.ts"],"sourcesContent":["/**\n * Replaces one textarea range while preserving the browser's native undo path\n * where possible. The fallback emits the input event that the editing command\n * would have emitted, so callers never need a second dispatch.\n */\nexport const replaceTextareaRange = (textarea: HTMLTextAreaElement, start: number, end: number, replacement: string): boolean => {\n textarea.focus();\n textarea.setSelectionRange(start, end);\n\n try {\n if (typeof document !== \"undefined\" && document.execCommand?.(\"insertText\", false, replacement)) return true;\n } catch {\n // Fall through to the standards-based replacement below.\n }\n\n if (typeof textarea.setRangeText === \"function\") {\n textarea.setRangeText(replacement, start, end, \"end\");\n } else {\n textarea.value = textarea.value.slice(0, start) + replacement + textarea.value.slice(end);\n const caret = start + replacement.length;\n textarea.setSelectionRange(caret, caret);\n }\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n return true;\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,oBAAoB,GAAGA,CAACC,QAA6B,EAAEC,KAAa,EAAEC,GAAW,EAAEC,WAAmB,KAAc;EAC/HH,QAAQ,CAACI,KAAK,CAAC,CAAC;EAChBJ,QAAQ,CAACK,iBAAiB,CAACJ,KAAK,EAAEC,GAAG,CAAC;EAEtC,IAAI;IACF,IAAI,OAAOI,QAAQ,KAAK,WAAW,IAAIA,QAAQ,CAACC,WAAW,GAAG,YAAY,EAAE,KAAK,EAAEJ,WAAW,CAAC,EAAE,OAAO,IAAI;EAC9G,CAAC,CAAC,MAAM;IACN;EAAA;EAGF,IAAI,OAAOH,QAAQ,CAACQ,YAAY,KAAK,UAAU,EAAE;IAC/CR,QAAQ,CAACQ,YAAY,CAACL,WAAW,EAAEF,KAAK,EAAEC,GAAG,EAAE,KAAK,CAAC;EACvD,CAAC,MAAM;IACLF,QAAQ,CAACS,KAAK,GAAGT,QAAQ,CAACS,KAAK,CAACC,KAAK,CAAC,CAAC,EAAET,KAAK,CAAC,GAAGE,WAAW,GAAGH,QAAQ,CAACS,KAAK,CAACC,KAAK,CAACR,GAAG,CAAC;IACzF,MAAMS,KAAK,GAAGV,KAAK,GAAGE,WAAW,CAACS,MAAM;IACxCZ,QAAQ,CAACK,iBAAiB,CAACM,KAAK,EAAEA,KAAK,CAAC;EAC1C;EACAX,QAAQ,CAACa,aAAa,CAAC,IAAIC,KAAK,CAAC,OAAO,EAAE;IAAEC,OAAO,EAAE;EAAK,CAAC,CAAC,CAAC;EAC7D,OAAO,IAAI;AACb,CAAC","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/editor-dom.ts"],"sourcesContent":["/**\n * Replaces one textarea range while preserving the browser's native undo path\n * where possible. The fallback emits the input event that the editing command\n * would have emitted, so callers never need a second dispatch.\n */\nexport const replaceTextareaRange = (textarea: HTMLTextAreaElement, start: number, end: number, replacement: string): boolean => {\n textarea.focus();\n textarea.setSelectionRange(start, end);\n\n try {\n if (typeof document !== \"undefined\" && document.execCommand?.(\"insertText\", false, replacement)) return true;\n } catch {\n // Fall through to the standards-based replacement below.\n }\n\n if (typeof textarea.setRangeText === \"function\") {\n textarea.setRangeText(replacement, start, end, \"end\");\n } else {\n textarea.value = textarea.value.slice(0, start) + replacement + textarea.value.slice(end);\n const caret = start + replacement.length;\n textarea.setSelectionRange(caret, caret);\n }\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n return true;\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,oBAAoB,GAAG,CAAC,QAA6B,EAAE,KAAa,EAAE,GAAW,EAAE,WAAmB,KAAc;EAC/H,QAAQ,CAAC,KAAK,CAAC,CAAC;EAChB,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;EAEtC,IAAI;IACF,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,WAAW,GAAG,YAAY,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,OAAO,IAAI;EAC9G,CAAC,CAAC,MAAM;IACN;EAAA;EAGF,IAAI,OAAO,QAAQ,CAAC,YAAY,KAAK,UAAU,EAAE;IAC/C,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC;EACvD,CAAC,MAAM;IACL,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;IACzF,MAAM,KAAK,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM;IACxC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;EAC1C;EACA,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE;EAAK,CAAC,CAAC,CAAC;EAC7D,OAAO,IAAI;AACb,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["commitFieldValue","owner","value","onValueChange","onValueCommit","resolveMaybeAccessor"],"sources":["inputs/field-contract.ts"],"sourcesContent":["import type { DateContext as StdlibDateContext } from \"@k2b/stdlib\";\nimport type { JSX } from \"solid-js\";\n\nexport type DateContext = StdlibDateContext;\nexport type MaybeAccessor<T> = T | (() => T);\n\nexport type FieldProps = {\n id?: string;\n class?: string;\n label?: JSX.Element;\n description?: JSX.Element;\n error?: MaybeAccessor<JSX.Element | undefined>;\n required?: boolean;\n disabled?: boolean;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n};\n\nexport type ValueFieldProps<T> = FieldProps & {\n value: MaybeAccessor<T>;\n onValueChange?: (value: T) => void;\n onValueCommit?: (value: T) => void;\n};\n\n/** Reports one atomic edit as both the current and committed field value. */\nexport const commitFieldValue = <T>(owner: Pick<ValueFieldProps<T>, \"onValueChange\" | \"onValueCommit\">, value: T): void => {\n owner.onValueChange?.(value);\n owner.onValueCommit?.(value);\n};\n\nexport function resolveMaybeAccessor<T>(value: MaybeAccessor<T>): T;\nexport function resolveMaybeAccessor<T>(value: MaybeAccessor<T> | undefined): T | undefined;\nexport function resolveMaybeAccessor<T>(value: MaybeAccessor<T> | undefined): T | undefined {\n return typeof value === \"function\" ? (value as () => T)() : value;\n}\n"],"mappings":"AAwBA;AACA,OAAO,MAAMA,gBAAgB,GAAGA,CAAIC,KAAkE,EAAEC,KAAQ,KAAW;EACzHD,KAAK,CAACE,aAAa,GAAGD,KAAK,CAAC;EAC5BD,KAAK,CAACG,aAAa,GAAGF,KAAK,CAAC;AAC9B,CAAC;AAID,OAAO,SAASG,oBAAoBA,CAAIH,KAAmC,EAAiB;EAC1F,OAAO,OAAOA,KAAK,KAAK,UAAU,GAAIA,KAAK,CAAa,CAAC,GAAGA,KAAK;AACnE","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/field-contract.ts"],"sourcesContent":["import type { DateContext as StdlibDateContext } from \"@k2b/stdlib\";\nimport type { JSX } from \"solid-js\";\n\nexport type DateContext = StdlibDateContext;\nexport type MaybeAccessor<T> = T | (() => T);\n\nexport type FieldProps = {\n id?: string;\n class?: string;\n label?: JSX.Element;\n description?: JSX.Element;\n error?: MaybeAccessor<JSX.Element | undefined>;\n required?: boolean;\n disabled?: boolean;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n};\n\nexport type ValueFieldProps<T> = FieldProps & {\n value: MaybeAccessor<T>;\n onValueChange?: (value: T) => void;\n onValueCommit?: (value: T) => void;\n};\n\n/** Reports one atomic edit as both the current and committed field value. */\nexport const commitFieldValue = <T>(owner: Pick<ValueFieldProps<T>, \"onValueChange\" | \"onValueCommit\">, value: T): void => {\n owner.onValueChange?.(value);\n owner.onValueCommit?.(value);\n};\n\nexport function resolveMaybeAccessor<T>(value: MaybeAccessor<T>): T;\nexport function resolveMaybeAccessor<T>(value: MaybeAccessor<T> | undefined): T | undefined;\nexport function resolveMaybeAccessor<T>(value: MaybeAccessor<T> | undefined): T | undefined {\n return typeof value === \"function\" ? (value as () => T)() : value;\n}\n"],"mappings":"AAwBA;AACA,OAAO,MAAM,gBAAgB,GAAG,CAAI,KAAkE,EAAE,KAAQ,KAAW;EACzH,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;EAC5B,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;AAC9B,CAAC;AAID,OAAO,SAAS,oBAAoB,CAAI,KAAmC,EAAiB;EAC1F,OAAO,OAAO,KAAK,KAAK,UAAU,GAAI,KAAK,CAAa,CAAC,GAAG,KAAK;AACnE","ignoreList":[]}