@verbb/plugin-kit-react 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +31 -0
  4. package/dist/_virtual/_rolldown/runtime.js +34 -0
  5. package/dist/components/Button.d.ts +26 -0
  6. package/dist/components/Button.d.ts.map +1 -0
  7. package/dist/components/Button.js +148 -0
  8. package/dist/components/Button.js.map +1 -0
  9. package/dist/components/ButtonGroup.d.ts +11 -0
  10. package/dist/components/ButtonGroup.d.ts.map +1 -0
  11. package/dist/components/ButtonGroup.js +59 -0
  12. package/dist/components/ButtonGroup.js.map +1 -0
  13. package/dist/components/Calendar.d.ts +11 -0
  14. package/dist/components/Calendar.d.ts.map +1 -0
  15. package/dist/components/Calendar.js +133 -0
  16. package/dist/components/Calendar.js.map +1 -0
  17. package/dist/components/Checkbox.d.ts +5 -0
  18. package/dist/components/Checkbox.d.ts.map +1 -0
  19. package/dist/components/Checkbox.js +41 -0
  20. package/dist/components/Checkbox.js.map +1 -0
  21. package/dist/components/CheckboxInput.d.ts +14 -0
  22. package/dist/components/CheckboxInput.d.ts.map +1 -0
  23. package/dist/components/CheckboxInput.js +31 -0
  24. package/dist/components/CheckboxInput.js.map +1 -0
  25. package/dist/components/CheckboxSelect.d.ts +19 -0
  26. package/dist/components/CheckboxSelect.d.ts.map +1 -0
  27. package/dist/components/CheckboxSelect.js +63 -0
  28. package/dist/components/CheckboxSelect.js.map +1 -0
  29. package/dist/components/ColorInput.d.ts +14 -0
  30. package/dist/components/ColorInput.d.ts.map +1 -0
  31. package/dist/components/ColorInput.js +148 -0
  32. package/dist/components/ColorInput.js.map +1 -0
  33. package/dist/components/Combobox.d.ts +40 -0
  34. package/dist/components/Combobox.d.ts.map +1 -0
  35. package/dist/components/Combobox.js +393 -0
  36. package/dist/components/Combobox.js.map +1 -0
  37. package/dist/components/ComboboxInput.d.ts +28 -0
  38. package/dist/components/ComboboxInput.d.ts.map +1 -0
  39. package/dist/components/ComboboxInput.js +165 -0
  40. package/dist/components/ComboboxInput.js.map +1 -0
  41. package/dist/components/Command.d.ts +26 -0
  42. package/dist/components/Command.d.ts.map +1 -0
  43. package/dist/components/Command.js +94 -0
  44. package/dist/components/Command.js.map +1 -0
  45. package/dist/components/CopyButton.d.ts +9 -0
  46. package/dist/components/CopyButton.d.ts.map +1 -0
  47. package/dist/components/CopyButton.js +40 -0
  48. package/dist/components/CopyButton.js.map +1 -0
  49. package/dist/components/DatePicker.d.ts +9 -0
  50. package/dist/components/DatePicker.d.ts.map +1 -0
  51. package/dist/components/DatePicker.js +46 -0
  52. package/dist/components/DatePicker.js.map +1 -0
  53. package/dist/components/Dialog.d.ts +21 -0
  54. package/dist/components/Dialog.d.ts.map +1 -0
  55. package/dist/components/Dialog.js +179 -0
  56. package/dist/components/Dialog.js.map +1 -0
  57. package/dist/components/DropdownMenu.d.ts +47 -0
  58. package/dist/components/DropdownMenu.d.ts.map +1 -0
  59. package/dist/components/DropdownMenu.js +240 -0
  60. package/dist/components/DropdownMenu.js.map +1 -0
  61. package/dist/components/EditableTable.d.ts +28 -0
  62. package/dist/components/EditableTable.d.ts.map +1 -0
  63. package/dist/components/EditableTable.js +145 -0
  64. package/dist/components/EditableTable.js.map +1 -0
  65. package/dist/components/FadeIn.d.ts +12 -0
  66. package/dist/components/FadeIn.d.ts.map +1 -0
  67. package/dist/components/FadeIn.js +24 -0
  68. package/dist/components/FadeIn.js.map +1 -0
  69. package/dist/components/Input.d.ts +9 -0
  70. package/dist/components/Input.d.ts.map +1 -0
  71. package/dist/components/Input.js +43 -0
  72. package/dist/components/Input.js.map +1 -0
  73. package/dist/components/InputGroup.d.ts +20 -0
  74. package/dist/components/InputGroup.d.ts.map +1 -0
  75. package/dist/components/InputGroup.js +111 -0
  76. package/dist/components/InputGroup.js.map +1 -0
  77. package/dist/components/Label.d.ts +4 -0
  78. package/dist/components/Label.d.ts.map +1 -0
  79. package/dist/components/Label.js +15 -0
  80. package/dist/components/Label.js.map +1 -0
  81. package/dist/components/Lightswitch.d.ts +9 -0
  82. package/dist/components/Lightswitch.d.ts.map +1 -0
  83. package/dist/components/Lightswitch.js +56 -0
  84. package/dist/components/Lightswitch.js.map +1 -0
  85. package/dist/components/Markdown.d.ts +11 -0
  86. package/dist/components/Markdown.d.ts.map +1 -0
  87. package/dist/components/Markdown.js +46 -0
  88. package/dist/components/Markdown.js.map +1 -0
  89. package/dist/components/MenuButton.d.ts +40 -0
  90. package/dist/components/MenuButton.d.ts.map +1 -0
  91. package/dist/components/MenuButton.js +122 -0
  92. package/dist/components/MenuButton.js.map +1 -0
  93. package/dist/components/ModalTabs.d.ts +8 -0
  94. package/dist/components/ModalTabs.d.ts.map +1 -0
  95. package/dist/components/ModalTabs.js +37 -0
  96. package/dist/components/ModalTabs.js.map +1 -0
  97. package/dist/components/PaneTabs.d.ts +8 -0
  98. package/dist/components/PaneTabs.d.ts.map +1 -0
  99. package/dist/components/PaneTabs.js +37 -0
  100. package/dist/components/PaneTabs.js.map +1 -0
  101. package/dist/components/Popover.d.ts +12 -0
  102. package/dist/components/Popover.d.ts.map +1 -0
  103. package/dist/components/Popover.js +70 -0
  104. package/dist/components/Popover.js.map +1 -0
  105. package/dist/components/RadioGroup.d.ts +6 -0
  106. package/dist/components/RadioGroup.d.ts.map +1 -0
  107. package/dist/components/RadioGroup.js +34 -0
  108. package/dist/components/RadioGroup.js.map +1 -0
  109. package/dist/components/ScrollArea.d.ts +16 -0
  110. package/dist/components/ScrollArea.d.ts.map +1 -0
  111. package/dist/components/ScrollArea.js +47 -0
  112. package/dist/components/ScrollArea.js.map +1 -0
  113. package/dist/components/Select.d.ts +23 -0
  114. package/dist/components/Select.d.ts.map +1 -0
  115. package/dist/components/Select.js +205 -0
  116. package/dist/components/Select.js.map +1 -0
  117. package/dist/components/SelectInput.d.ts +33 -0
  118. package/dist/components/SelectInput.d.ts.map +1 -0
  119. package/dist/components/SelectInput.js +85 -0
  120. package/dist/components/SelectInput.js.map +1 -0
  121. package/dist/components/Separator.d.ts +4 -0
  122. package/dist/components/Separator.d.ts.map +1 -0
  123. package/dist/components/Separator.js +17 -0
  124. package/dist/components/Separator.js.map +1 -0
  125. package/dist/components/SlideUp.d.ts +12 -0
  126. package/dist/components/SlideUp.d.ts.map +1 -0
  127. package/dist/components/SlideUp.js +36 -0
  128. package/dist/components/SlideUp.js.map +1 -0
  129. package/dist/components/Slot.d.ts +6 -0
  130. package/dist/components/Slot.d.ts.map +1 -0
  131. package/dist/components/Slot.js +52 -0
  132. package/dist/components/Slot.js.map +1 -0
  133. package/dist/components/Spinner.d.ts +9 -0
  134. package/dist/components/Spinner.d.ts.map +1 -0
  135. package/dist/components/Spinner.js +43 -0
  136. package/dist/components/Spinner.js.map +1 -0
  137. package/dist/components/Status.d.ts +8 -0
  138. package/dist/components/Status.d.ts.map +1 -0
  139. package/dist/components/Status.js +55 -0
  140. package/dist/components/Status.js.map +1 -0
  141. package/dist/components/Table.d.ts +10 -0
  142. package/dist/components/Table.d.ts.map +1 -0
  143. package/dist/components/Table.js +64 -0
  144. package/dist/components/Table.js.map +1 -0
  145. package/dist/components/Tabs.d.ts +8 -0
  146. package/dist/components/Tabs.d.ts.map +1 -0
  147. package/dist/components/Tabs.js +37 -0
  148. package/dist/components/Tabs.js.map +1 -0
  149. package/dist/components/Textarea.d.ts +8 -0
  150. package/dist/components/Textarea.d.ts.map +1 -0
  151. package/dist/components/Textarea.js +26 -0
  152. package/dist/components/Textarea.js.map +1 -0
  153. package/dist/components/TimePicker.d.ts +9 -0
  154. package/dist/components/TimePicker.d.ts.map +1 -0
  155. package/dist/components/TimePicker.js +40 -0
  156. package/dist/components/TimePicker.js.map +1 -0
  157. package/dist/components/TiptapContent.d.ts +9 -0
  158. package/dist/components/TiptapContent.d.ts.map +1 -0
  159. package/dist/components/TiptapContent.js +24 -0
  160. package/dist/components/TiptapContent.js.map +1 -0
  161. package/dist/components/TiptapEditor.d.ts +41 -0
  162. package/dist/components/TiptapEditor.d.ts.map +1 -0
  163. package/dist/components/TiptapEditor.js +555 -0
  164. package/dist/components/TiptapEditor.js.map +1 -0
  165. package/dist/components/TiptapInput.d.ts +15 -0
  166. package/dist/components/TiptapInput.d.ts.map +1 -0
  167. package/dist/components/TiptapInput.js +138 -0
  168. package/dist/components/TiptapInput.js.map +1 -0
  169. package/dist/components/Toggle.d.ts +9 -0
  170. package/dist/components/Toggle.d.ts.map +1 -0
  171. package/dist/components/Toggle.js +48 -0
  172. package/dist/components/Toggle.js.map +1 -0
  173. package/dist/components/ToggleGroup.d.ts +11 -0
  174. package/dist/components/ToggleGroup.d.ts.map +1 -0
  175. package/dist/components/ToggleGroup.js +70 -0
  176. package/dist/components/ToggleGroup.js.map +1 -0
  177. package/dist/components/Tooltip.d.ts +9 -0
  178. package/dist/components/Tooltip.d.ts.map +1 -0
  179. package/dist/components/Tooltip.js +51 -0
  180. package/dist/components/Tooltip.js.map +1 -0
  181. package/dist/components/VirtualizedScrollArea.d.ts +25 -0
  182. package/dist/components/VirtualizedScrollArea.d.ts.map +1 -0
  183. package/dist/components/VirtualizedScrollArea.js +80 -0
  184. package/dist/components/VirtualizedScrollArea.js.map +1 -0
  185. package/dist/components/editable-table/RowDataCells.d.ts +3 -0
  186. package/dist/components/editable-table/RowDataCells.d.ts.map +1 -0
  187. package/dist/components/editable-table/RowDataCells.js +33 -0
  188. package/dist/components/editable-table/RowDataCells.js.map +1 -0
  189. package/dist/components/editable-table/TableCell.d.ts +13 -0
  190. package/dist/components/editable-table/TableCell.d.ts.map +1 -0
  191. package/dist/components/editable-table/TableCell.js +415 -0
  192. package/dist/components/editable-table/TableCell.js.map +1 -0
  193. package/dist/components/editable-table/TableRow.d.ts +3 -0
  194. package/dist/components/editable-table/TableRow.d.ts.map +1 -0
  195. package/dist/components/editable-table/TableRow.js +163 -0
  196. package/dist/components/editable-table/TableRow.js.map +1 -0
  197. package/dist/components/editable-table/helpers.d.ts +12 -0
  198. package/dist/components/editable-table/helpers.d.ts.map +1 -0
  199. package/dist/components/editable-table/helpers.js +23 -0
  200. package/dist/components/editable-table/helpers.js.map +1 -0
  201. package/dist/components/editable-table/index.d.ts +4 -0
  202. package/dist/components/editable-table/index.d.ts.map +1 -0
  203. package/dist/components/editable-table/index.js +4 -0
  204. package/dist/components/editable-table/types.d.ts +43 -0
  205. package/dist/components/editable-table/types.d.ts.map +1 -0
  206. package/dist/components/editable-table/types.js +0 -0
  207. package/dist/components/editable-table/useEditableTableCellChange.d.ts +17 -0
  208. package/dist/components/editable-table/useEditableTableCellChange.d.ts.map +1 -0
  209. package/dist/components/editable-table/useEditableTableCellChange.js +152 -0
  210. package/dist/components/editable-table/useEditableTableCellChange.js.map +1 -0
  211. package/dist/components/editable-table/useEditableTableDnd.d.ts +18 -0
  212. package/dist/components/editable-table/useEditableTableDnd.d.ts.map +1 -0
  213. package/dist/components/editable-table/useEditableTableDnd.js +55 -0
  214. package/dist/components/editable-table/useEditableTableDnd.js.map +1 -0
  215. package/dist/components/editable-table/useEditableTableRows.d.ts +17 -0
  216. package/dist/components/editable-table/useEditableTableRows.d.ts.map +1 -0
  217. package/dist/components/editable-table/useEditableTableRows.js +108 -0
  218. package/dist/components/editable-table/useEditableTableRows.js.map +1 -0
  219. package/dist/components/index.d.ts +45 -0
  220. package/dist/components/index.d.ts.map +1 -0
  221. package/dist/components/index.js +45 -0
  222. package/dist/components/tiptap/InlineVariablePickerPopover.d.ts +24 -0
  223. package/dist/components/tiptap/InlineVariablePickerPopover.d.ts.map +1 -0
  224. package/dist/components/tiptap/InlineVariablePickerPopover.js +63 -0
  225. package/dist/components/tiptap/InlineVariablePickerPopover.js.map +1 -0
  226. package/dist/components/tiptap/InsertLinkDialog.d.ts +14 -0
  227. package/dist/components/tiptap/InsertLinkDialog.d.ts.map +1 -0
  228. package/dist/components/tiptap/InsertLinkDialog.js +145 -0
  229. package/dist/components/tiptap/InsertLinkDialog.js.map +1 -0
  230. package/dist/components/tiptap/LinkBubbleMenu.d.ts +10 -0
  231. package/dist/components/tiptap/LinkBubbleMenu.d.ts.map +1 -0
  232. package/dist/components/tiptap/LinkBubbleMenu.js +106 -0
  233. package/dist/components/tiptap/LinkBubbleMenu.js.map +1 -0
  234. package/dist/components/tiptap/LinkDropdown.d.ts +53 -0
  235. package/dist/components/tiptap/LinkDropdown.d.ts.map +1 -0
  236. package/dist/components/tiptap/LinkDropdown.js +155 -0
  237. package/dist/components/tiptap/LinkDropdown.js.map +1 -0
  238. package/dist/components/tiptap/VariableCommandList.d.ts +37 -0
  239. package/dist/components/tiptap/VariableCommandList.d.ts.map +1 -0
  240. package/dist/components/tiptap/VariableCommandList.js +166 -0
  241. package/dist/components/tiptap/VariableCommandList.js.map +1 -0
  242. package/dist/components/tiptap/VariableDropdown.d.ts +33 -0
  243. package/dist/components/tiptap/VariableDropdown.d.ts.map +1 -0
  244. package/dist/components/tiptap/VariableDropdown.js +121 -0
  245. package/dist/components/tiptap/VariableDropdown.js.map +1 -0
  246. package/dist/components/tiptap/VariablePickerContext.d.ts +38 -0
  247. package/dist/components/tiptap/VariablePickerContext.d.ts.map +1 -0
  248. package/dist/components/tiptap/VariablePickerContext.js +30 -0
  249. package/dist/components/tiptap/VariablePickerContext.js.map +1 -0
  250. package/dist/components/tiptap/VariableTag.d.ts +6 -0
  251. package/dist/components/tiptap/VariableTag.d.ts.map +1 -0
  252. package/dist/components/tiptap/VariableTag.js +153 -0
  253. package/dist/components/tiptap/VariableTag.js.map +1 -0
  254. package/dist/components/tiptap/VariableTagView.d.ts +3 -0
  255. package/dist/components/tiptap/VariableTagView.d.ts.map +1 -0
  256. package/dist/components/tiptap/VariableTagView.js +445 -0
  257. package/dist/components/tiptap/VariableTagView.js.map +1 -0
  258. package/dist/components/tiptap/VariableTransformControls.d.ts +37 -0
  259. package/dist/components/tiptap/VariableTransformControls.d.ts.map +1 -0
  260. package/dist/components/tiptap/VariableTransformControls.js +157 -0
  261. package/dist/components/tiptap/VariableTransformControls.js.map +1 -0
  262. package/dist/components/tiptap/editorConfig.d.ts +15 -0
  263. package/dist/components/tiptap/editorConfig.d.ts.map +1 -0
  264. package/dist/components/tiptap/editorConfig.js +191 -0
  265. package/dist/components/tiptap/editorConfig.js.map +1 -0
  266. package/dist/components/tiptap/useInlineVariablePicker.d.ts +34 -0
  267. package/dist/components/tiptap/useInlineVariablePicker.d.ts.map +1 -0
  268. package/dist/components/tiptap/useInlineVariablePicker.js +240 -0
  269. package/dist/components/tiptap/useInlineVariablePicker.js.map +1 -0
  270. package/dist/components/tiptap/useVariablePicker.d.ts +28 -0
  271. package/dist/components/tiptap/useVariablePicker.d.ts.map +1 -0
  272. package/dist/components/tiptap/useVariablePicker.js +122 -0
  273. package/dist/components/tiptap/useVariablePicker.js.map +1 -0
  274. package/dist/components/tiptap/variablePickerUtils.d.ts +11 -0
  275. package/dist/components/tiptap/variablePickerUtils.d.ts.map +1 -0
  276. package/dist/components/tiptap/variablePickerUtils.js +63 -0
  277. package/dist/components/tiptap/variablePickerUtils.js.map +1 -0
  278. package/dist/components/tiptap/variableSerialization.d.ts +49 -0
  279. package/dist/components/tiptap/variableSerialization.d.ts.map +1 -0
  280. package/dist/components/tiptap/variableSerialization.js +250 -0
  281. package/dist/components/tiptap/variableSerialization.js.map +1 -0
  282. package/dist/css/core.css +288 -0
  283. package/dist/css/style.css +295 -0
  284. package/dist/forms/Field.d.ts +37 -0
  285. package/dist/forms/Field.d.ts.map +1 -0
  286. package/dist/forms/Field.js +159 -0
  287. package/dist/forms/Field.js.map +1 -0
  288. package/dist/forms/SchemaFormEngine.d.ts +23 -0
  289. package/dist/forms/SchemaFormEngine.d.ts.map +1 -0
  290. package/dist/forms/SchemaFormEngine.js +444 -0
  291. package/dist/forms/SchemaFormEngine.js.map +1 -0
  292. package/dist/forms/components/FieldWrap.d.ts +11 -0
  293. package/dist/forms/components/FieldWrap.d.ts.map +1 -0
  294. package/dist/forms/components/FieldWrap.js +84 -0
  295. package/dist/forms/components/FieldWrap.js.map +1 -0
  296. package/dist/forms/components/ModalTabs.d.ts +21 -0
  297. package/dist/forms/components/ModalTabs.d.ts.map +1 -0
  298. package/dist/forms/components/ModalTabs.js +84 -0
  299. package/dist/forms/components/ModalTabs.js.map +1 -0
  300. package/dist/forms/components/index.d.ts +3 -0
  301. package/dist/forms/components/index.d.ts.map +1 -0
  302. package/dist/forms/components/index.js +3 -0
  303. package/dist/forms/contexts/VariableCategoriesContext.d.ts +17 -0
  304. package/dist/forms/contexts/VariableCategoriesContext.d.ts.map +1 -0
  305. package/dist/forms/contexts/VariableCategoriesContext.js +18 -0
  306. package/dist/forms/contexts/VariableCategoriesContext.js.map +1 -0
  307. package/dist/forms/engine/FormStateStore.d.ts +24 -0
  308. package/dist/forms/engine/FormStateStore.d.ts.map +1 -0
  309. package/dist/forms/engine/FormStateStore.js +97 -0
  310. package/dist/forms/engine/FormStateStore.js.map +1 -0
  311. package/dist/forms/engine/SchemaIndex.d.ts +33 -0
  312. package/dist/forms/engine/SchemaIndex.d.ts.map +1 -0
  313. package/dist/forms/engine/SchemaIndex.js +21 -0
  314. package/dist/forms/engine/SchemaIndex.js.map +1 -0
  315. package/dist/forms/engine/ValidationEngine.d.ts +13 -0
  316. package/dist/forms/engine/ValidationEngine.d.ts.map +1 -0
  317. package/dist/forms/engine/ValidationEngine.js +155 -0
  318. package/dist/forms/engine/ValidationEngine.js.map +1 -0
  319. package/dist/forms/engine/buildGroupedMessage.d.ts +2 -0
  320. package/dist/forms/engine/buildGroupedMessage.d.ts.map +1 -0
  321. package/dist/forms/engine/buildGroupedMessage.js +20 -0
  322. package/dist/forms/engine/buildGroupedMessage.js.map +1 -0
  323. package/dist/forms/engine/context.d.ts +60 -0
  324. package/dist/forms/engine/context.d.ts.map +1 -0
  325. package/dist/forms/engine/context.js +12 -0
  326. package/dist/forms/engine/context.js.map +1 -0
  327. package/dist/forms/engine/rules/email.d.ts +2 -0
  328. package/dist/forms/engine/rules/email.d.ts.map +1 -0
  329. package/dist/forms/engine/rules/email.js +11 -0
  330. package/dist/forms/engine/rules/email.js.map +1 -0
  331. package/dist/forms/engine/rules/emailOrVariable.d.ts +2 -0
  332. package/dist/forms/engine/rules/emailOrVariable.d.ts.map +1 -0
  333. package/dist/forms/engine/rules/emailOrVariable.js +13 -0
  334. package/dist/forms/engine/rules/emailOrVariable.js.map +1 -0
  335. package/dist/forms/engine/rules/handle.d.ts +2 -0
  336. package/dist/forms/engine/rules/handle.d.ts.map +1 -0
  337. package/dist/forms/engine/rules/handle.js +12 -0
  338. package/dist/forms/engine/rules/handle.js.map +1 -0
  339. package/dist/forms/engine/rules/index.d.ts +9 -0
  340. package/dist/forms/engine/rules/index.d.ts.map +1 -0
  341. package/dist/forms/engine/rules/index.js +35 -0
  342. package/dist/forms/engine/rules/index.js.map +1 -0
  343. package/dist/forms/engine/rules/max.d.ts +2 -0
  344. package/dist/forms/engine/rules/max.d.ts.map +1 -0
  345. package/dist/forms/engine/rules/max.js +16 -0
  346. package/dist/forms/engine/rules/max.js.map +1 -0
  347. package/dist/forms/engine/rules/min.d.ts +2 -0
  348. package/dist/forms/engine/rules/min.d.ts.map +1 -0
  349. package/dist/forms/engine/rules/min.js +16 -0
  350. package/dist/forms/engine/rules/min.js.map +1 -0
  351. package/dist/forms/engine/rules/required.d.ts +2 -0
  352. package/dist/forms/engine/rules/required.d.ts.map +1 -0
  353. package/dist/forms/engine/rules/required.js +11 -0
  354. package/dist/forms/engine/rules/required.js.map +1 -0
  355. package/dist/forms/engine/rules/uniqueHandle.d.ts +9 -0
  356. package/dist/forms/engine/rules/uniqueHandle.d.ts.map +1 -0
  357. package/dist/forms/engine/rules/uniqueHandle.js +95 -0
  358. package/dist/forms/engine/rules/uniqueHandle.js.map +1 -0
  359. package/dist/forms/engine/rules/utils.d.ts +3 -0
  360. package/dist/forms/engine/rules/utils.d.ts.map +1 -0
  361. package/dist/forms/engine/rules/utils.js +21 -0
  362. package/dist/forms/engine/rules/utils.js.map +1 -0
  363. package/dist/forms/fields/CalculationsField.d.ts +24 -0
  364. package/dist/forms/fields/CalculationsField.d.ts.map +1 -0
  365. package/dist/forms/fields/CalculationsField.js +215 -0
  366. package/dist/forms/fields/CalculationsField.js.map +1 -0
  367. package/dist/forms/fields/CalculationsToolbar.d.ts +17 -0
  368. package/dist/forms/fields/CalculationsToolbar.d.ts.map +1 -0
  369. package/dist/forms/fields/CalculationsToolbar.js +130 -0
  370. package/dist/forms/fields/CalculationsToolbar.js.map +1 -0
  371. package/dist/forms/fields/CheckboxSelectField.d.ts +19 -0
  372. package/dist/forms/fields/CheckboxSelectField.d.ts.map +1 -0
  373. package/dist/forms/fields/CheckboxSelectField.js +30 -0
  374. package/dist/forms/fields/CheckboxSelectField.js.map +1 -0
  375. package/dist/forms/fields/ColorField.d.ts +15 -0
  376. package/dist/forms/fields/ColorField.d.ts.map +1 -0
  377. package/dist/forms/fields/ColorField.js +30 -0
  378. package/dist/forms/fields/ColorField.js.map +1 -0
  379. package/dist/forms/fields/ComboboxField.d.ts +23 -0
  380. package/dist/forms/fields/ComboboxField.d.ts.map +1 -0
  381. package/dist/forms/fields/ComboboxField.js +38 -0
  382. package/dist/forms/fields/ComboboxField.js.map +1 -0
  383. package/dist/forms/fields/DateTimeField.d.ts +14 -0
  384. package/dist/forms/fields/DateTimeField.d.ts.map +1 -0
  385. package/dist/forms/fields/DateTimeField.js +53 -0
  386. package/dist/forms/fields/DateTimeField.js.map +1 -0
  387. package/dist/forms/fields/EditableTableField.d.ts +22 -0
  388. package/dist/forms/fields/EditableTableField.d.ts.map +1 -0
  389. package/dist/forms/fields/EditableTableField.js +37 -0
  390. package/dist/forms/fields/EditableTableField.js.map +1 -0
  391. package/dist/forms/fields/ElementSelectField.d.ts +20 -0
  392. package/dist/forms/fields/ElementSelectField.d.ts.map +1 -0
  393. package/dist/forms/fields/ElementSelectField.js +215 -0
  394. package/dist/forms/fields/ElementSelectField.js.map +1 -0
  395. package/dist/forms/fields/GroupField.d.ts +19 -0
  396. package/dist/forms/fields/GroupField.d.ts.map +1 -0
  397. package/dist/forms/fields/GroupField.js +50 -0
  398. package/dist/forms/fields/GroupField.js.map +1 -0
  399. package/dist/forms/fields/HandleField.d.ts +20 -0
  400. package/dist/forms/fields/HandleField.d.ts.map +1 -0
  401. package/dist/forms/fields/HandleField.js +70 -0
  402. package/dist/forms/fields/HandleField.js.map +1 -0
  403. package/dist/forms/fields/LightswitchField.d.ts +14 -0
  404. package/dist/forms/fields/LightswitchField.d.ts.map +1 -0
  405. package/dist/forms/fields/LightswitchField.js +29 -0
  406. package/dist/forms/fields/LightswitchField.js.map +1 -0
  407. package/dist/forms/fields/ListField.d.ts +17 -0
  408. package/dist/forms/fields/ListField.d.ts.map +1 -0
  409. package/dist/forms/fields/ListField.js +51 -0
  410. package/dist/forms/fields/ListField.js.map +1 -0
  411. package/dist/forms/fields/NumberField.d.ts +17 -0
  412. package/dist/forms/fields/NumberField.d.ts.map +1 -0
  413. package/dist/forms/fields/NumberField.js +33 -0
  414. package/dist/forms/fields/NumberField.js.map +1 -0
  415. package/dist/forms/fields/RadioGroupField.d.ts +25 -0
  416. package/dist/forms/fields/RadioGroupField.d.ts.map +1 -0
  417. package/dist/forms/fields/RadioGroupField.js +102 -0
  418. package/dist/forms/fields/RadioGroupField.js.map +1 -0
  419. package/dist/forms/fields/RichTextField.d.ts +23 -0
  420. package/dist/forms/fields/RichTextField.d.ts.map +1 -0
  421. package/dist/forms/fields/RichTextField.js +50 -0
  422. package/dist/forms/fields/RichTextField.js.map +1 -0
  423. package/dist/forms/fields/SelectField.d.ts +25 -0
  424. package/dist/forms/fields/SelectField.d.ts.map +1 -0
  425. package/dist/forms/fields/SelectField.js +73 -0
  426. package/dist/forms/fields/SelectField.js.map +1 -0
  427. package/dist/forms/fields/StaticTableField.d.ts +34 -0
  428. package/dist/forms/fields/StaticTableField.d.ts.map +1 -0
  429. package/dist/forms/fields/StaticTableField.js +128 -0
  430. package/dist/forms/fields/StaticTableField.js.map +1 -0
  431. package/dist/forms/fields/TextField.d.ts +16 -0
  432. package/dist/forms/fields/TextField.d.ts.map +1 -0
  433. package/dist/forms/fields/TextField.js +31 -0
  434. package/dist/forms/fields/TextField.js.map +1 -0
  435. package/dist/forms/fields/TextareaField.d.ts +17 -0
  436. package/dist/forms/fields/TextareaField.d.ts.map +1 -0
  437. package/dist/forms/fields/TextareaField.js +32 -0
  438. package/dist/forms/fields/TextareaField.js.map +1 -0
  439. package/dist/forms/fields/VariablePickerField.d.ts +21 -0
  440. package/dist/forms/fields/VariablePickerField.d.ts.map +1 -0
  441. package/dist/forms/fields/VariablePickerField.js +49 -0
  442. package/dist/forms/fields/VariablePickerField.js.map +1 -0
  443. package/dist/forms/index.d.ts +8 -0
  444. package/dist/forms/index.d.ts.map +1 -0
  445. package/dist/forms/index.js +10 -0
  446. package/dist/forms/registry.d.ts +8 -0
  447. package/dist/forms/registry.d.ts.map +1 -0
  448. package/dist/forms/registry.js +76 -0
  449. package/dist/forms/registry.js.map +1 -0
  450. package/dist/forms/store/element-store.d.ts +11 -0
  451. package/dist/forms/store/element-store.d.ts.map +1 -0
  452. package/dist/forms/store/element-store.js +41 -0
  453. package/dist/forms/store/element-store.js.map +1 -0
  454. package/dist/forms/useEditableTableFieldBinding.d.ts +13 -0
  455. package/dist/forms/useEditableTableFieldBinding.d.ts.map +1 -0
  456. package/dist/forms/useEditableTableFieldBinding.js +91 -0
  457. package/dist/forms/useEditableTableFieldBinding.js.map +1 -0
  458. package/dist/forms/useEngineField.d.ts +9 -0
  459. package/dist/forms/useEngineField.d.ts.map +1 -0
  460. package/dist/forms/useEngineField.js +32 -0
  461. package/dist/forms/useEngineField.js.map +1 -0
  462. package/dist/hooks/index.d.ts +3 -0
  463. package/dist/hooks/index.d.ts.map +1 -0
  464. package/dist/hooks/index.js +3 -0
  465. package/dist/hooks/useKeyboardShortcuts.d.ts +14 -0
  466. package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  467. package/dist/hooks/useKeyboardShortcuts.js +67 -0
  468. package/dist/hooks/useKeyboardShortcuts.js.map +1 -0
  469. package/dist/hooks/useTranslation.d.ts +3 -0
  470. package/dist/hooks/useTranslation.d.ts.map +1 -0
  471. package/dist/hooks/useTranslation.js +12 -0
  472. package/dist/hooks/useTranslation.js.map +1 -0
  473. package/dist/index.d.ts +2 -0
  474. package/dist/index.d.ts.map +1 -0
  475. package/dist/index.js +2 -0
  476. package/dist/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +15 -0
  477. package/dist/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +1 -0
  478. package/dist/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js +15 -0
  479. package/dist/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js.map +1 -0
  480. package/dist/node_modules/@babel/runtime/helpers/classCallCheck.js +13 -0
  481. package/dist/node_modules/@babel/runtime/helpers/classCallCheck.js.map +1 -0
  482. package/dist/node_modules/@babel/runtime/helpers/createClass.js +21 -0
  483. package/dist/node_modules/@babel/runtime/helpers/createClass.js.map +1 -0
  484. package/dist/node_modules/@babel/runtime/helpers/defineProperty.js +20 -0
  485. package/dist/node_modules/@babel/runtime/helpers/defineProperty.js.map +1 -0
  486. package/dist/node_modules/@babel/runtime/helpers/interopRequireDefault.js +13 -0
  487. package/dist/node_modules/@babel/runtime/helpers/interopRequireDefault.js.map +1 -0
  488. package/dist/node_modules/@babel/runtime/helpers/iterableToArray.js +13 -0
  489. package/dist/node_modules/@babel/runtime/helpers/iterableToArray.js.map +1 -0
  490. package/dist/node_modules/@babel/runtime/helpers/nonIterableSpread.js +13 -0
  491. package/dist/node_modules/@babel/runtime/helpers/nonIterableSpread.js.map +1 -0
  492. package/dist/node_modules/@babel/runtime/helpers/toConsumableArray.js +21 -0
  493. package/dist/node_modules/@babel/runtime/helpers/toConsumableArray.js.map +1 -0
  494. package/dist/node_modules/@babel/runtime/helpers/toPrimitive.js +22 -0
  495. package/dist/node_modules/@babel/runtime/helpers/toPrimitive.js.map +1 -0
  496. package/dist/node_modules/@babel/runtime/helpers/toPropertyKey.js +18 -0
  497. package/dist/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +1 -0
  498. package/dist/node_modules/@babel/runtime/helpers/typeof.js +18 -0
  499. package/dist/node_modules/@babel/runtime/helpers/typeof.js.map +1 -0
  500. package/dist/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +19 -0
  501. package/dist/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +1 -0
  502. package/dist/node_modules/jexl/dist/Expression.js +84 -0
  503. package/dist/node_modules/jexl/dist/Expression.js.map +1 -0
  504. package/dist/node_modules/jexl/dist/Jexl.js +165 -0
  505. package/dist/node_modules/jexl/dist/Jexl.js.map +1 -0
  506. package/dist/node_modules/jexl/dist/Lexer.js +152 -0
  507. package/dist/node_modules/jexl/dist/Lexer.js.map +1 -0
  508. package/dist/node_modules/jexl/dist/PromiseSync.js +87 -0
  509. package/dist/node_modules/jexl/dist/PromiseSync.js.map +1 -0
  510. package/dist/node_modules/jexl/dist/evaluator/Evaluator.js +98 -0
  511. package/dist/node_modules/jexl/dist/evaluator/Evaluator.js.map +1 -0
  512. package/dist/node_modules/jexl/dist/evaluator/handlers.js +162 -0
  513. package/dist/node_modules/jexl/dist/evaluator/handlers.js.map +1 -0
  514. package/dist/node_modules/jexl/dist/grammar.js +195 -0
  515. package/dist/node_modules/jexl/dist/grammar.js.map +1 -0
  516. package/dist/node_modules/jexl/dist/parser/Parser.js +135 -0
  517. package/dist/node_modules/jexl/dist/parser/Parser.js.map +1 -0
  518. package/dist/node_modules/jexl/dist/parser/handlers.js +205 -0
  519. package/dist/node_modules/jexl/dist/parser/handlers.js.map +1 -0
  520. package/dist/node_modules/jexl/dist/parser/states.js +158 -0
  521. package/dist/node_modules/jexl/dist/parser/states.js.map +1 -0
  522. package/dist/types/global.d.d.ts +1 -0
  523. package/dist/types/global.d.js +0 -0
  524. package/dist/utils/classes.d.ts +18 -0
  525. package/dist/utils/classes.d.ts.map +1 -0
  526. package/dist/utils/classes.js +25 -0
  527. package/dist/utils/classes.js.map +1 -0
  528. package/dist/utils/config.d.ts +14 -0
  529. package/dist/utils/config.d.ts.map +1 -0
  530. package/dist/utils/config.js +16 -0
  531. package/dist/utils/config.js.map +1 -0
  532. package/dist/utils/craftHostBridge.d.ts +16 -0
  533. package/dist/utils/craftHostBridge.d.ts.map +1 -0
  534. package/dist/utils/craftHostBridge.js +28 -0
  535. package/dist/utils/craftHostBridge.js.map +1 -0
  536. package/dist/utils/handle.d.ts +10 -0
  537. package/dist/utils/handle.d.ts.map +1 -0
  538. package/dist/utils/handle.js +51 -0
  539. package/dist/utils/handle.js.map +1 -0
  540. package/dist/utils/hostBridge.d.ts +40 -0
  541. package/dist/utils/hostBridge.d.ts.map +1 -0
  542. package/dist/utils/hostBridge.js +35 -0
  543. package/dist/utils/hostBridge.js.map +1 -0
  544. package/dist/utils/index.d.ts +18 -0
  545. package/dist/utils/index.d.ts.map +1 -0
  546. package/dist/utils/index.js +66 -0
  547. package/dist/utils/index.js.map +1 -0
  548. package/dist/utils/portal.d.ts +17 -0
  549. package/dist/utils/portal.d.ts.map +1 -0
  550. package/dist/utils/portal.js +51 -0
  551. package/dist/utils/portal.js.map +1 -0
  552. package/dist/utils/schema.d.ts +17 -0
  553. package/dist/utils/schema.d.ts.map +1 -0
  554. package/dist/utils/schema.js +56 -0
  555. package/dist/utils/schema.js.map +1 -0
  556. package/dist/utils/schemaFieldNames.d.ts +2 -0
  557. package/dist/utils/schemaFieldNames.d.ts.map +1 -0
  558. package/dist/utils/schemaFieldNames.js +16 -0
  559. package/dist/utils/schemaFieldNames.js.map +1 -0
  560. package/dist/utils/schemaIndex.d.ts +6 -0
  561. package/dist/utils/schemaIndex.d.ts.map +1 -0
  562. package/dist/utils/schemaIndex.js +31 -0
  563. package/dist/utils/schemaIndex.js.map +1 -0
  564. package/dist/utils/schemaIndexCache.d.ts +6 -0
  565. package/dist/utils/schemaIndexCache.d.ts.map +1 -0
  566. package/dist/utils/schemaIndexCache.js +32 -0
  567. package/dist/utils/schemaIndexCache.js.map +1 -0
  568. package/dist/utils/schemaNormalize.d.ts +13 -0
  569. package/dist/utils/schemaNormalize.d.ts.map +1 -0
  570. package/dist/utils/schemaNormalize.js +17 -0
  571. package/dist/utils/schemaNormalize.js.map +1 -0
  572. package/dist/utils/store.d.ts +7 -0
  573. package/dist/utils/store.d.ts.map +1 -0
  574. package/dist/utils/store.js +6 -0
  575. package/dist/utils/store.js.map +1 -0
  576. package/dist/utils/timeOptions.d.ts +6 -0
  577. package/dist/utils/timeOptions.d.ts.map +1 -0
  578. package/dist/utils/timeOptions.js +42 -0
  579. package/dist/utils/timeOptions.js.map +1 -0
  580. package/dist/utils/tiptap.d.ts +13 -0
  581. package/dist/utils/tiptap.d.ts.map +1 -0
  582. package/dist/utils/tiptap.js +39 -0
  583. package/dist/utils/tiptap.js.map +1 -0
  584. package/dist/utils/translation.d.ts +5 -0
  585. package/dist/utils/translation.d.ts.map +1 -0
  586. package/dist/utils/translation.js +21 -0
  587. package/dist/utils/translation.js.map +1 -0
  588. package/dist/utils/validation.d.ts +4 -0
  589. package/dist/utils/validation.d.ts.map +1 -0
  590. package/dist/utils/validation.js +253 -0
  591. package/dist/utils/validation.js.map +1 -0
  592. package/package.json +167 -0
  593. package/vite-dev.mjs +56 -0
@@ -0,0 +1,240 @@
1
+ import { useTranslation } from "../../hooks/useTranslation.js";
2
+ import "../../hooks/index.js";
3
+ import { buildVariableTagAttrs, replaceTokenWithVariable } from "./variableSerialization.js";
4
+ import { getVariableCategoryEntries, matchesVariableQuery, toTopLevelGroups } from "./variablePickerUtils.js";
5
+ import { useCallback, useEffect, useMemo, useState } from "react";
6
+ //#region src/components/tiptap/useInlineVariablePicker.ts
7
+ /** Keep cursor placeholders from blocking inline variable trigger matching. */
8
+ var INLINE_TRIGGER_REGEX = /(?:^|[\s\u200B\u2060])@([A-Za-z0-9:_-]*)$/;
9
+ function getFilteredVariables(t, variableCategories, variableCategoryLabels, variableCategoryOrder, query, activeParent) {
10
+ const groupedTopLevelOptions = toTopLevelGroups(getVariableCategoryEntries(variableCategories, variableCategoryLabels, variableCategoryOrder), t);
11
+ const q = query.trim().toLowerCase();
12
+ if (activeParent?.children?.length) {
13
+ const { children } = activeParent;
14
+ if (!q) return {
15
+ groups: [],
16
+ options: children.slice(0, 50),
17
+ isChildMode: true
18
+ };
19
+ return {
20
+ groups: [],
21
+ options: children.filter((item) => {
22
+ return matchesVariableQuery(item, q);
23
+ }).slice(0, 50),
24
+ isChildMode: true
25
+ };
26
+ }
27
+ if (!q) return {
28
+ groups: groupedTopLevelOptions,
29
+ options: groupedTopLevelOptions.flatMap((g) => {
30
+ return g.items;
31
+ }).slice(0, 100),
32
+ isChildMode: false
33
+ };
34
+ const filteredGroups = groupedTopLevelOptions.map((group) => {
35
+ return {
36
+ ...group,
37
+ items: group.items.filter((item) => {
38
+ if (matchesVariableQuery(item, q)) return true;
39
+ return (Array.isArray(item.children) ? item.children : []).some((c) => {
40
+ return matchesVariableQuery(c, q);
41
+ });
42
+ })
43
+ };
44
+ }).filter((g) => {
45
+ return g.items.length > 0;
46
+ });
47
+ const options = [];
48
+ for (const group of filteredGroups) {
49
+ for (let ii = 0; ii < group.items.length; ii++) {
50
+ const item = group.items[ii];
51
+ const hasChildren = Array.isArray(item.children) && item.children.length > 0;
52
+ const parentMatches = matchesVariableQuery(item, q);
53
+ if (!hasChildren || parentMatches) options.push(item);
54
+ if (hasChildren) {
55
+ for (const child of item.children) if (matchesVariableQuery(child, q)) options.push(child);
56
+ }
57
+ if (options.length >= 100) break;
58
+ }
59
+ if (options.length >= 100) break;
60
+ }
61
+ return {
62
+ groups: filteredGroups,
63
+ options,
64
+ isChildMode: false
65
+ };
66
+ }
67
+ function useInlineVariablePicker(editor, options) {
68
+ const { variableCategories, variableCategoryLabels, variableCategoryOrder, variablePickerTriggerCharacters = ["@"], disabled = false, readOnly = false, wrapperRef, onOpenDropdown } = options;
69
+ const t = useTranslation();
70
+ const [state, setState] = useState({
71
+ open: false,
72
+ query: "",
73
+ from: 0,
74
+ to: 0,
75
+ top: 0,
76
+ left: 0,
77
+ selectedIndex: -1,
78
+ activeParent: null
79
+ });
80
+ const filteredVariables = useMemo(() => {
81
+ return getFilteredVariables(t, variableCategories, variableCategoryLabels, variableCategoryOrder, state.query, state.activeParent);
82
+ }, [
83
+ t,
84
+ variableCategories,
85
+ variableCategoryLabels,
86
+ variableCategoryOrder,
87
+ state.query,
88
+ state.activeParent
89
+ ]);
90
+ const updateFromCursor = useCallback(() => {
91
+ if (!editor || readOnly || disabled) return;
92
+ const { state: editorState, view } = editor;
93
+ const { selection } = editorState;
94
+ if (!selection.empty) {
95
+ setState((prev) => {
96
+ return prev.open ? {
97
+ ...prev,
98
+ open: false,
99
+ query: "",
100
+ selectedIndex: -1
101
+ } : prev;
102
+ });
103
+ return;
104
+ }
105
+ const cursorPos = selection.from;
106
+ const start = Math.max(0, cursorPos - 120);
107
+ const match = editorState.doc.textBetween(start, cursorPos, "\n").match(INLINE_TRIGGER_REGEX);
108
+ if (!match) {
109
+ setState((prev) => {
110
+ return prev.open ? {
111
+ ...prev,
112
+ open: false,
113
+ query: "",
114
+ selectedIndex: -1
115
+ } : prev;
116
+ });
117
+ return;
118
+ }
119
+ const query = match[1] ?? "";
120
+ const tokenFrom = cursorPos - (query.length + 1);
121
+ const coords = view.coordsAtPos(cursorPos);
122
+ const wrapperRect = wrapperRef.current?.getBoundingClientRect();
123
+ if (!wrapperRect) return;
124
+ setState((prev) => {
125
+ return {
126
+ ...prev,
127
+ open: true,
128
+ query,
129
+ from: tokenFrom,
130
+ to: cursorPos,
131
+ top: coords.bottom - wrapperRect.top + 4,
132
+ left: coords.left - wrapperRect.left,
133
+ activeParent: prev.activeParent
134
+ };
135
+ });
136
+ }, [
137
+ disabled,
138
+ editor,
139
+ readOnly,
140
+ wrapperRef
141
+ ]);
142
+ const handleSelect = (selected, baseVariableOpt) => {
143
+ if (!selected) return;
144
+ if (Array.isArray(selected.children) && selected.children.length > 0) {
145
+ setState((prev) => {
146
+ return {
147
+ ...prev,
148
+ activeParent: selected,
149
+ query: "",
150
+ selectedIndex: -1
151
+ };
152
+ });
153
+ return;
154
+ }
155
+ replaceTokenWithVariable(editor, buildVariableTagAttrs(baseVariableOpt ?? state.activeParent ?? selected, selected, { openOnInsert: false }), state.from, state.to);
156
+ requestAnimationFrame(() => {
157
+ editor?.commands.focus();
158
+ });
159
+ setState((prev) => {
160
+ return {
161
+ ...prev,
162
+ open: false,
163
+ query: "",
164
+ selectedIndex: -1,
165
+ activeParent: null
166
+ };
167
+ });
168
+ };
169
+ const closePicker = () => {
170
+ setState((prev) => {
171
+ return {
172
+ ...prev,
173
+ open: false,
174
+ query: "",
175
+ selectedIndex: -1,
176
+ activeParent: null
177
+ };
178
+ });
179
+ };
180
+ const goBack = () => {
181
+ setState((prev) => {
182
+ return {
183
+ ...prev,
184
+ activeParent: null,
185
+ selectedIndex: -1
186
+ };
187
+ });
188
+ };
189
+ const setQuery = (query) => {
190
+ setState((prev) => {
191
+ return {
192
+ ...prev,
193
+ query
194
+ };
195
+ });
196
+ };
197
+ const handleKeyDown = (view, event) => {
198
+ if (!Object.values(variableCategories ?? {}).flatMap((items) => {
199
+ return Array.isArray(items) ? items : [];
200
+ }).length || disabled || readOnly) return false;
201
+ const isShortcut = (event.metaKey || event.ctrlKey) && event.shiftKey && event.key.toLowerCase() === "v";
202
+ const isTrigger = variablePickerTriggerCharacters.includes(event.key) && !event.metaKey && !event.ctrlKey && !event.altKey;
203
+ if (!isShortcut && !isTrigger) return false;
204
+ if (state.open) return false;
205
+ if (isTrigger) {
206
+ const { from } = view.state.selection;
207
+ const prevChar = from > 1 ? view.state.doc.textBetween(from - 1, from, "\n") : "";
208
+ /** Allow @ after whitespace, brackets, quotes, or zwsp (used after variable tags) */
209
+ if (prevChar && !/[\s\u200B\u2060]|\(|\[|"|'/.test(prevChar)) return false;
210
+ }
211
+ if (isShortcut) {
212
+ event.preventDefault();
213
+ onOpenDropdown?.();
214
+ return true;
215
+ }
216
+ return false;
217
+ };
218
+ useEffect(() => {
219
+ if (!editor) return;
220
+ editor.on("update", updateFromCursor);
221
+ editor.on("selectionUpdate", updateFromCursor);
222
+ return () => {
223
+ editor.off("update", updateFromCursor);
224
+ editor.off("selectionUpdate", updateFromCursor);
225
+ };
226
+ }, [editor, updateFromCursor]);
227
+ return {
228
+ state,
229
+ filteredVariables,
230
+ handleSelect,
231
+ closePicker,
232
+ goBack,
233
+ handleKeyDown,
234
+ setQuery
235
+ };
236
+ }
237
+ //#endregion
238
+ export { useInlineVariablePicker };
239
+
240
+ //# sourceMappingURL=useInlineVariablePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInlineVariablePicker.js","names":[],"sources":["../../../src/components/tiptap/useInlineVariablePicker.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { useTranslation } from '@verbb/plugin-kit-react/hooks';\nimport type { EditorView } from '@tiptap/pm/view';\nimport {\n buildVariableTagAttrs,\n replaceTokenWithVariable,\n} from './variableSerialization';\nimport type { VariableCategories, VariableOption } from './VariableDropdown';\nimport type { FilteredVariables } from './InlineVariablePickerPopover';\nimport { getVariableCategoryEntries, matchesVariableQuery, toTopLevelGroups } from './variablePickerUtils';\n\n/** Keep cursor placeholders from blocking inline variable trigger matching. */\nconst INLINE_TRIGGER_REGEX = /(?:^|[\\s\\u200B\\u2060])@([A-Za-z0-9:_-]*)$/;\n\nfunction getFilteredVariables(\n t: (msg: string) => string,\n variableCategories: VariableCategories,\n variableCategoryLabels: Record<string, string> | undefined,\n variableCategoryOrder: string[] | undefined,\n query: string,\n activeParent: VariableOption | null,\n): FilteredVariables {\n const entries = getVariableCategoryEntries(variableCategories, variableCategoryLabels, variableCategoryOrder);\n const groupedTopLevelOptions = toTopLevelGroups(entries, t);\n\n const q = query.trim().toLowerCase();\n\n if (activeParent?.children?.length) {\n const { children } = activeParent;\n if (!q) {\n return { groups: [], options: children.slice(0, 50), isChildMode: true };\n }\n const filtered = children\n .filter((item) => {\n return matchesVariableQuery(item, q);\n })\n .slice(0, 50);\n return { groups: [], options: filtered, isChildMode: true };\n }\n\n if (!q) {\n const options = groupedTopLevelOptions.flatMap((g) => {\n return g.items;\n }).slice(0, 100);\n return { groups: groupedTopLevelOptions, options, isChildMode: false };\n }\n\n const filteredGroups = groupedTopLevelOptions\n .map((group) => {\n return {\n ...group,\n items: group.items.filter((item) => {\n const baseMatch = matchesVariableQuery(item, q);\n if (baseMatch) {\n return true;\n }\n\n const children = Array.isArray(item.children) ? item.children : [];\n return children.some((c) => {\n return matchesVariableQuery(c, q);\n });\n }),\n };\n })\n .filter((g) => {\n return g.items.length > 0;\n });\n\n // Build options in the SAME order as VariableCommandList renders:\n // for each (group, item): [parent if showParent] + [matching children]\n const options: VariableOption[] = [];\n for (const group of filteredGroups) {\n for (let ii = 0; ii < group.items.length; ii++) {\n const item = group.items[ii];\n const hasChildren = Array.isArray(item.children) && item.children.length > 0;\n const parentMatches = matchesVariableQuery(item, q);\n const showParent = !hasChildren || parentMatches;\n if (showParent) {\n options.push(item);\n }\n if (hasChildren) {\n for (const child of item.children!) {\n const childMatches = matchesVariableQuery(child, q);\n if (childMatches) {\n options.push(child);\n }\n }\n }\n if (options.length >= 100) {\n break;\n }\n }\n if (options.length >= 100) {\n break;\n }\n }\n return { groups: filteredGroups, options, isChildMode: false };\n}\n\nexport type InlinePickerState = {\n open: boolean;\n query: string;\n from: number;\n to: number;\n top: number;\n left: number;\n selectedIndex: number;\n activeParent: VariableOption | null;\n};\n\nexport type InlineVariablePickerHandleKeyDown = (view: EditorView, event: KeyboardEvent) => boolean;\n\nexport function useInlineVariablePicker(\n editor: Editor | null,\n options: {\n variableCategories: VariableCategories;\n variableCategoryLabels?: Record<string, string>;\n variableCategoryOrder?: string[];\n variablePickerTriggerCharacters?: string[];\n disabled?: boolean;\n readOnly?: boolean;\n wrapperRef: React.RefObject<HTMLDivElement | null>;\n onOpenDropdown?: () => void;\n },\n) {\n const {\n variableCategories,\n variableCategoryLabels,\n variableCategoryOrder,\n variablePickerTriggerCharacters = ['@'],\n disabled = false,\n readOnly = false,\n wrapperRef,\n onOpenDropdown,\n } = options;\n\n const t = useTranslation();\n\n const [state, setState] = useState<InlinePickerState>({\n open: false,\n query: '',\n from: 0,\n to: 0,\n top: 0,\n left: 0,\n selectedIndex: -1,\n activeParent: null,\n });\n\n const filteredVariables = useMemo(() => {\n return getFilteredVariables(\n t,\n variableCategories,\n variableCategoryLabels,\n variableCategoryOrder,\n state.query,\n state.activeParent,\n );\n }, [t, variableCategories, variableCategoryLabels, variableCategoryOrder, state.query, state.activeParent]);\n\n const updateFromCursor = useCallback(() => {\n if (!editor || readOnly || disabled) {\n return;\n }\n\n const { state: editorState, view } = editor;\n const { selection } = editorState;\n\n if (!selection.empty) {\n setState((prev) => {\n return prev.open ? { ...prev, open: false, query: '', selectedIndex: -1 } : prev;\n });\n return;\n }\n\n const cursorPos = selection.from;\n const start = Math.max(0, cursorPos - 120);\n const textBefore = editorState.doc.textBetween(start, cursorPos, '\\n');\n const match = textBefore.match(INLINE_TRIGGER_REGEX);\n\n if (!match) {\n setState((prev) => {\n return prev.open ? { ...prev, open: false, query: '', selectedIndex: -1 } : prev;\n });\n return;\n }\n\n const query = match[1] ?? '';\n const tokenLength = query.length + 1;\n const tokenFrom = cursorPos - tokenLength;\n const coords = view.coordsAtPos(cursorPos);\n const wrapperRect = wrapperRef.current?.getBoundingClientRect();\n if (!wrapperRect) {\n return;\n }\n\n setState((prev) => {\n return {\n ...prev,\n open: true,\n query,\n from: tokenFrom,\n to: cursorPos,\n top: coords.bottom - wrapperRect.top + 4,\n left: coords.left - wrapperRect.left,\n activeParent: prev.activeParent,\n };\n });\n }, [disabled, editor, readOnly, wrapperRef]);\n\n const handleSelect = (selected: VariableOption, baseVariableOpt?: VariableOption) => {\n if (!selected) {\n return;\n }\n\n if (Array.isArray(selected.children) && selected.children.length > 0) {\n setState((prev) => {\n return {\n ...prev,\n activeParent: selected,\n query: '',\n selectedIndex: -1,\n };\n });\n return;\n }\n\n const baseVariable = baseVariableOpt ?? state.activeParent ?? selected;\n const tagAttrs = buildVariableTagAttrs(baseVariable, selected, { openOnInsert: false });\n replaceTokenWithVariable(editor!, tagAttrs, state.from, state.to);\n requestAnimationFrame(() => {\n editor?.commands.focus();\n });\n setState((prev) => {\n return {\n ...prev,\n open: false,\n query: '',\n selectedIndex: -1,\n activeParent: null,\n };\n });\n };\n\n const closePicker = () => {\n setState((prev) => {\n return {\n ...prev,\n open: false,\n query: '',\n selectedIndex: -1,\n activeParent: null,\n };\n });\n };\n\n const goBack = () => {\n setState((prev) => {\n return {\n ...prev,\n activeParent: null,\n selectedIndex: -1,\n };\n });\n };\n\n const setQuery = (query: string) => {\n setState((prev) => {\n return { ...prev, query };\n });\n };\n\n const handleKeyDown: InlineVariablePickerHandleKeyDown = (view, event) => {\n const variables = Object.values(variableCategories ?? {}).flatMap((items) => {\n return Array.isArray(items) ? items : [];\n });\n if (!variables.length || disabled || readOnly) {\n return false;\n }\n\n const isShortcut = (event.metaKey || event.ctrlKey) && event.shiftKey && event.key.toLowerCase() === 'v';\n const isTrigger = variablePickerTriggerCharacters.includes(event.key) && !event.metaKey && !event.ctrlKey && !event.altKey;\n if (!isShortcut && !isTrigger) {\n return false;\n }\n\n // When picker is open, focus moves to it; cmdk handles keyboard nav\n if (state.open) {\n return false;\n }\n\n if (isTrigger) {\n const { from } = view.state.selection;\n const prevChar = from > 1 ? view.state.doc.textBetween(from - 1, from, '\\n') : '';\n /** Allow @ after whitespace, brackets, quotes, or zwsp (used after variable tags) */\n if (prevChar && !/[\\s\\u200B\\u2060]|\\(|\\[|\"|'/.test(prevChar)) {\n return false;\n }\n }\n\n if (isShortcut) {\n event.preventDefault();\n onOpenDropdown?.();\n return true;\n }\n\n return false;\n };\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n editor.on('update', updateFromCursor);\n editor.on('selectionUpdate', updateFromCursor);\n return () => {\n editor.off('update', updateFromCursor);\n editor.off('selectionUpdate', updateFromCursor);\n };\n }, [editor, updateFromCursor]);\n\n return {\n state,\n filteredVariables,\n handleSelect,\n closePicker,\n goBack,\n handleKeyDown,\n setQuery,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { VariableOption, VariableCategories } from './VariableDropdown';
2
+ import { VariableGroup } from './VariableCommandList';
3
+ export type UseVariablePickerOptions = {
4
+ variableCategories: VariableCategories;
5
+ variableCategoryLabels?: Record<string, string>;
6
+ variableCategoryOrder?: string[];
7
+ /** Called when a leaf variable is selected. defaultIfEmpty is optional (e.g. "Guest" for {user:firstName|Guest}). */
8
+ onApply: (baseVariable: VariableOption, variable: VariableOption, defaultIfEmpty?: string) => void;
9
+ /** When true, reset pages and search (e.g. when picker opens) */
10
+ isOpen?: boolean;
11
+ /** When opening for edit, start on this child page instead of top level */
12
+ initialPage?: VariableOption | null;
13
+ /** Optional: return current "default if empty" value when a variable is applied */
14
+ getDefaultIfEmpty?: () => string;
15
+ /** Defers expensive top-level group building until the picker is opened. */
16
+ deferUntilOpen?: boolean;
17
+ };
18
+ export declare function useVariablePicker({ variableCategories, variableCategoryLabels, variableCategoryOrder, onApply, isOpen, initialPage, getDefaultIfEmpty, deferUntilOpen, }: UseVariablePickerOptions): {
19
+ groups: VariableGroup[];
20
+ options: VariableOption[];
21
+ search: string;
22
+ setSearch: import('react').Dispatch<import('react').SetStateAction<string>>;
23
+ page: VariableOption | undefined;
24
+ handleSelect: (variable: VariableOption, baseVariableOpt?: VariableOption) => void;
25
+ handleBack: () => void;
26
+ reset: () => void;
27
+ };
28
+ //# sourceMappingURL=useVariablePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVariablePicker.d.ts","sourceRoot":"","sources":["../../../src/components/tiptap/useVariablePicker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,wBAAwB,GAAG;IACnC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,qHAAqH;IACrH,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnG,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;IACjC,4EAA4E;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAC9B,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,OAAO,EACP,MAAM,EACN,WAAW,EACX,iBAAiB,EACjB,cAAsB,GACzB,EAAE,wBAAwB;;;;;;6BA8EqB,cAAc,oBAAoB,cAAc;;;EA6C/F"}
@@ -0,0 +1,122 @@
1
+ import { useTranslation } from "../../hooks/useTranslation.js";
2
+ import "../../hooks/index.js";
3
+ import { getVariableCategoryEntries, matchesVariableQuery, toTopLevelGroups } from "./variablePickerUtils.js";
4
+ import { useCallback, useEffect, useMemo, useState } from "react";
5
+ //#region src/components/tiptap/useVariablePicker.ts
6
+ function useVariablePicker({ variableCategories, variableCategoryLabels, variableCategoryOrder, onApply, isOpen, initialPage, getDefaultIfEmpty, deferUntilOpen = false }) {
7
+ const t = useTranslation();
8
+ const [pages, setPages] = useState([]);
9
+ const [search, setSearch] = useState("");
10
+ const page = pages.at(-1);
11
+ const shouldResolveGroups = !deferUntilOpen || Boolean(isOpen) || Boolean(page) || Boolean(initialPage);
12
+ const flatCategories = useMemo(() => {
13
+ if (!shouldResolveGroups) return [];
14
+ return getVariableCategoryEntries(variableCategories, variableCategoryLabels, variableCategoryOrder);
15
+ }, [
16
+ shouldResolveGroups,
17
+ variableCategories,
18
+ variableCategoryLabels,
19
+ variableCategoryOrder
20
+ ]);
21
+ const groupedTopLevel = useMemo(() => {
22
+ if (!shouldResolveGroups) return [];
23
+ return toTopLevelGroups(flatCategories, t);
24
+ }, [
25
+ flatCategories,
26
+ shouldResolveGroups,
27
+ t
28
+ ]);
29
+ const normalizedSearch = search.trim().toLowerCase();
30
+ const groups = useMemo(() => {
31
+ if (!shouldResolveGroups && !page) return [];
32
+ if (page?.children?.length) {
33
+ const { children } = page;
34
+ const groupValue = page.value ?? page.label ?? "selectors";
35
+ if (!normalizedSearch) return [{
36
+ label: t("Selectors"),
37
+ value: groupValue,
38
+ items: children
39
+ }];
40
+ const filtered = children.filter((item) => {
41
+ return matchesVariableQuery(item, normalizedSearch);
42
+ });
43
+ return filtered.length ? [{
44
+ label: t("Selectors"),
45
+ value: groupValue,
46
+ items: filtered
47
+ }] : [];
48
+ }
49
+ if (!normalizedSearch) return groupedTopLevel;
50
+ return groupedTopLevel.map((g) => {
51
+ return {
52
+ ...g,
53
+ items: g.items.filter((item) => {
54
+ if (matchesVariableQuery(item, normalizedSearch)) return true;
55
+ return (Array.isArray(item.children) ? item.children : []).some((c) => {
56
+ return matchesVariableQuery(c, normalizedSearch);
57
+ });
58
+ })
59
+ };
60
+ }).filter((g) => {
61
+ return g.items.length > 0;
62
+ });
63
+ }, [
64
+ page,
65
+ normalizedSearch,
66
+ groupedTopLevel,
67
+ shouldResolveGroups,
68
+ t
69
+ ]);
70
+ const options = useMemo(() => {
71
+ return (groups ?? []).flatMap((g) => {
72
+ return g.items;
73
+ });
74
+ }, [groups]);
75
+ const handleSelect = useCallback((variable, baseVariableOpt) => {
76
+ if (Array.isArray(variable.children) && variable.children.length > 0) {
77
+ setPages((p) => {
78
+ return [...p, variable];
79
+ });
80
+ setSearch("");
81
+ return;
82
+ }
83
+ onApply(baseVariableOpt ?? page ?? variable, variable, getDefaultIfEmpty?.());
84
+ }, [
85
+ getDefaultIfEmpty,
86
+ onApply,
87
+ page
88
+ ]);
89
+ const handleBack = useCallback(() => {
90
+ setPages((p) => {
91
+ return p.slice(0, -1);
92
+ });
93
+ }, []);
94
+ const reset = useCallback(() => {
95
+ setPages([]);
96
+ setSearch("");
97
+ }, []);
98
+ useEffect(() => {
99
+ if (isOpen) if (initialPage && Array.isArray(initialPage.children) && initialPage.children.length > 0) {
100
+ setPages([initialPage]);
101
+ setSearch("");
102
+ } else reset();
103
+ }, [
104
+ initialPage,
105
+ isOpen,
106
+ reset
107
+ ]);
108
+ return {
109
+ groups,
110
+ options,
111
+ search,
112
+ setSearch,
113
+ page,
114
+ handleSelect,
115
+ handleBack,
116
+ reset
117
+ };
118
+ }
119
+ //#endregion
120
+ export { useVariablePicker };
121
+
122
+ //# sourceMappingURL=useVariablePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVariablePicker.js","names":[],"sources":["../../../src/components/tiptap/useVariablePicker.ts"],"sourcesContent":["import { useCallback, useMemo, useState, useEffect } from 'react';\nimport { useTranslation } from '@verbb/plugin-kit-react/hooks';\nimport type { VariableOption, VariableCategories } from './VariableDropdown';\nimport type { VariableGroup } from './VariableCommandList';\nimport { getVariableCategoryEntries, matchesVariableQuery, toTopLevelGroups } from './variablePickerUtils';\nexport type UseVariablePickerOptions = {\n variableCategories: VariableCategories;\n variableCategoryLabels?: Record<string, string>;\n variableCategoryOrder?: string[];\n /** Called when a leaf variable is selected. defaultIfEmpty is optional (e.g. \"Guest\" for {user:firstName|Guest}). */\n onApply: (baseVariable: VariableOption, variable: VariableOption, defaultIfEmpty?: string) => void;\n /** When true, reset pages and search (e.g. when picker opens) */\n isOpen?: boolean;\n /** When opening for edit, start on this child page instead of top level */\n initialPage?: VariableOption | null;\n /** Optional: return current \"default if empty\" value when a variable is applied */\n getDefaultIfEmpty?: () => string;\n /** Defers expensive top-level group building until the picker is opened. */\n deferUntilOpen?: boolean;\n};\n\nexport function useVariablePicker({\n variableCategories,\n variableCategoryLabels,\n variableCategoryOrder,\n onApply,\n isOpen,\n initialPage,\n getDefaultIfEmpty,\n deferUntilOpen = false,\n}: UseVariablePickerOptions) {\n const t = useTranslation();\n const [pages, setPages] = useState<VariableOption[]>([]);\n const [search, setSearch] = useState('');\n\n const page = pages.at(-1);\n const shouldResolveGroups = !deferUntilOpen || Boolean(isOpen) || Boolean(page) || Boolean(initialPage);\n\n const flatCategories = useMemo(\n () => {\n if (!shouldResolveGroups) {\n return [];\n }\n\n return getVariableCategoryEntries(variableCategories, variableCategoryLabels, variableCategoryOrder);\n },\n [shouldResolveGroups, variableCategories, variableCategoryLabels, variableCategoryOrder],\n );\n\n const groupedTopLevel: VariableGroup[] = useMemo(() => {\n if (!shouldResolveGroups) {\n return [];\n }\n\n return toTopLevelGroups(flatCategories, t);\n }, [flatCategories, shouldResolveGroups, t]);\n\n const normalizedSearch = search.trim().toLowerCase();\n\n const groups: VariableGroup[] | null = useMemo(() => {\n if (!shouldResolveGroups && !page) {\n return [];\n }\n\n if (page?.children?.length) {\n const { children } = page;\n const groupValue = page.value ?? page.label ?? 'selectors';\n if (!normalizedSearch) {\n return [{ label: t('Selectors'), value: groupValue, items: children }];\n }\n const filtered = children.filter((item) => {\n return matchesVariableQuery(item, normalizedSearch);\n });\n return filtered.length ? [{ label: t('Selectors'), value: groupValue, items: filtered }] : [];\n }\n\n if (!normalizedSearch) {\n return groupedTopLevel;\n }\n\n return groupedTopLevel\n .map((g) => {\n return {\n ...g,\n items: g.items.filter((item) => {\n const selfMatches = matchesVariableQuery(item, normalizedSearch);\n if (selfMatches) {\n return true;\n }\n\n const children = Array.isArray(item.children) ? item.children : [];\n return children.some((c) => {\n return matchesVariableQuery(c, normalizedSearch);\n });\n }),\n };\n })\n .filter((g) => {\n return g.items.length > 0;\n });\n }, [page, normalizedSearch, groupedTopLevel, shouldResolveGroups, t]);\n\n const options = useMemo(() => {\n return (groups ?? []).flatMap((g) => {\n return g.items;\n });\n }, [groups]);\n\n const handleSelect = useCallback((variable: VariableOption, baseVariableOpt?: VariableOption) => {\n if (Array.isArray(variable.children) && variable.children.length > 0) {\n setPages((p) => {\n return [...p, variable];\n });\n setSearch('');\n return;\n }\n\n const baseVariable = baseVariableOpt ?? page ?? variable;\n onApply(baseVariable, variable, getDefaultIfEmpty?.());\n }, [getDefaultIfEmpty, onApply, page]);\n\n const handleBack = useCallback(() => {\n setPages((p) => {\n return p.slice(0, -1);\n });\n }, []);\n\n const reset = useCallback(() => {\n setPages([]);\n setSearch('');\n }, []);\n\n useEffect(() => {\n if (isOpen) {\n if (initialPage && Array.isArray(initialPage.children) && initialPage.children.length > 0) {\n setPages([initialPage]);\n setSearch('');\n } else {\n reset();\n }\n }\n }, [initialPage, isOpen, reset]);\n\n return {\n groups,\n options,\n search,\n setSearch,\n page,\n handleSelect,\n handleBack,\n reset,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { VariableCategories, VariableOption } from './VariableDropdown';
2
+ import { VariableGroup } from './VariableCommandList';
3
+ export type VariableCategoryEntry = {
4
+ key: string;
5
+ label: string;
6
+ options: VariableOption[];
7
+ };
8
+ export declare function getVariableCategoryEntries(variableCategories: VariableCategories, variableCategoryLabels?: Record<string, string>, variableCategoryOrder?: string[]): VariableCategoryEntry[];
9
+ export declare function toTopLevelGroups(entries: VariableCategoryEntry[], t: (message: string) => string): VariableGroup[];
10
+ export declare function matchesVariableQuery(item: VariableOption, normalizedQuery: string): boolean;
11
+ //# sourceMappingURL=variablePickerUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variablePickerUtils.d.ts","sourceRoot":"","sources":["../../../src/components/tiptap/variablePickerUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,qBAAqB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAC;AAEF,wBAAgB,0BAA0B,CACtC,kBAAkB,EAAE,kBAAkB,EACtC,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/C,qBAAqB,CAAC,EAAE,MAAM,EAAE,GACjC,qBAAqB,EAAE,CA6BzB;AAED,wBAAgB,gBAAgB,CAC5B,OAAO,EAAE,qBAAqB,EAAE,EAChC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAC/B,aAAa,EAAE,CA0CjB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAS3F"}
@@ -0,0 +1,63 @@
1
+ import { formatVariableCategoryLabel } from "./VariableDropdown.js";
2
+ //#region src/components/tiptap/variablePickerUtils.ts
3
+ function getVariableCategoryEntries(variableCategories, variableCategoryLabels, variableCategoryOrder) {
4
+ const entries = Object.entries(variableCategories ?? {}).map(([key, options]) => {
5
+ return {
6
+ key,
7
+ label: formatVariableCategoryLabel(key, variableCategoryLabels),
8
+ options: Array.isArray(options) ? options : []
9
+ };
10
+ }).filter((entry) => {
11
+ return entry.options.length > 0;
12
+ });
13
+ const order = variableCategoryOrder ?? Object.keys(variableCategories ?? {});
14
+ entries.sort((a, b) => {
15
+ const aOrderIndex = order.indexOf(a.key);
16
+ const bOrderIndex = order.indexOf(b.key);
17
+ const aOrder = aOrderIndex === -1 ? Number.MAX_SAFE_INTEGER : aOrderIndex;
18
+ const bOrder = bOrderIndex === -1 ? Number.MAX_SAFE_INTEGER : bOrderIndex;
19
+ if (aOrder !== bOrder) return aOrder - bOrder;
20
+ return a.label.localeCompare(b.label);
21
+ });
22
+ return entries;
23
+ }
24
+ function toTopLevelGroups(entries, t) {
25
+ const groups = [];
26
+ entries.forEach((entry) => {
27
+ if (entry.key === "fieldsVariables") {
28
+ const pageBuckets = /* @__PURE__ */ new Map();
29
+ let hasPageBuckets = false;
30
+ entry.options.forEach((item) => {
31
+ const pageLabel = String(item?.pageLabel || "").trim();
32
+ if (!pageLabel) return;
33
+ hasPageBuckets = true;
34
+ if (!pageBuckets.has(pageLabel)) pageBuckets.set(pageLabel, []);
35
+ pageBuckets.get(pageLabel).push(item);
36
+ });
37
+ if (hasPageBuckets) {
38
+ pageBuckets.forEach((items, pageLabel) => {
39
+ groups.push({
40
+ label: t(pageLabel),
41
+ value: `${entry.key}:${pageLabel}`,
42
+ items
43
+ });
44
+ });
45
+ return;
46
+ }
47
+ }
48
+ groups.push({
49
+ label: t(entry.label),
50
+ value: entry.key,
51
+ items: entry.options
52
+ });
53
+ });
54
+ return groups;
55
+ }
56
+ function matchesVariableQuery(item, normalizedQuery) {
57
+ if (!normalizedQuery) return true;
58
+ return (item.label ?? "").toLowerCase().includes(normalizedQuery) || String(item.value ?? "").toLowerCase().includes(normalizedQuery);
59
+ }
60
+ //#endregion
61
+ export { getVariableCategoryEntries, matchesVariableQuery, toTopLevelGroups };
62
+
63
+ //# sourceMappingURL=variablePickerUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variablePickerUtils.js","names":[],"sources":["../../../src/components/tiptap/variablePickerUtils.ts"],"sourcesContent":["import type { VariableCategories, VariableOption } from './VariableDropdown';\nimport { formatVariableCategoryLabel } from './VariableDropdown';\nimport type { VariableGroup } from './VariableCommandList';\n\nexport type VariableCategoryEntry = {\n key: string;\n label: string;\n options: VariableOption[];\n};\n\nexport function getVariableCategoryEntries(\n variableCategories: VariableCategories,\n variableCategoryLabels?: Record<string, string>,\n variableCategoryOrder?: string[],\n): VariableCategoryEntry[] {\n const entries = Object.entries(variableCategories ?? {})\n .map(([key, options]) => {\n return ({\n key,\n label: formatVariableCategoryLabel(key, variableCategoryLabels),\n options: Array.isArray(options) ? options : []\n });\n })\n .filter(entry => {\n return entry.options.length > 0;\n });\n\n const order = variableCategoryOrder ?? Object.keys(variableCategories ?? {});\n\n entries.sort((a, b) => {\n const aOrderIndex = order.indexOf(a.key);\n const bOrderIndex = order.indexOf(b.key);\n const aOrder = aOrderIndex === -1 ? Number.MAX_SAFE_INTEGER : aOrderIndex;\n const bOrder = bOrderIndex === -1 ? Number.MAX_SAFE_INTEGER : bOrderIndex;\n\n if (aOrder !== bOrder) {\n return aOrder - bOrder;\n }\n\n return a.label.localeCompare(b.label);\n });\n\n return entries;\n}\n\nexport function toTopLevelGroups(\n entries: VariableCategoryEntry[],\n t: (message: string) => string,\n): VariableGroup[] {\n const groups: VariableGroup[] = [];\n\n entries.forEach((entry) => {\n if (entry.key === 'fieldsVariables') {\n const pageBuckets = new Map<string, VariableOption[]>();\n let hasPageBuckets = false;\n\n entry.options.forEach((item) => {\n const pageLabel = String((item as VariableOption)?.pageLabel || '').trim();\n if (!pageLabel) {\n return;\n }\n\n hasPageBuckets = true;\n if (!pageBuckets.has(pageLabel)) {\n pageBuckets.set(pageLabel, []);\n }\n pageBuckets.get(pageLabel)!.push(item);\n });\n\n if (hasPageBuckets) {\n pageBuckets.forEach((items, pageLabel) => {\n groups.push({\n label: t(pageLabel),\n value: `${entry.key}:${pageLabel}`,\n items,\n });\n });\n\n return;\n }\n }\n\n groups.push({\n label: t(entry.label),\n value: entry.key,\n items: entry.options,\n });\n });\n\n return groups;\n}\n\nexport function matchesVariableQuery(item: VariableOption, normalizedQuery: string): boolean {\n if (!normalizedQuery) {\n return true;\n }\n\n return (\n (item.label ?? '').toLowerCase().includes(normalizedQuery) ||\n String(item.value ?? '').toLowerCase().includes(normalizedQuery)\n );\n}\n"],"mappings":";;AAUA,SAAgB,2BACZ,oBACA,wBACA,uBACuB;CACvB,MAAM,UAAU,OAAO,QAAQ,sBAAsB,EAAE,CAAC,CACnD,KAAK,CAAC,KAAK,aAAa;AACzB,SAAQ;GACJ;GACA,OAAO,4BAA4B,KAAK,uBAAuB;GAC/D,SAAS,MAAM,QAAQ,QAAQ,GAAG,UAAU,EAAE;GACjD;GACH,CACG,QAAO,UAAS;AACjB,SAAO,MAAM,QAAQ,SAAS;GAChC;CAEF,MAAM,QAAQ,yBAAyB,OAAO,KAAK,sBAAsB,EAAE,CAAC;AAE5E,SAAQ,MAAM,GAAG,MAAM;EACnB,MAAM,cAAc,MAAM,QAAQ,EAAE,IAAI;EACxC,MAAM,cAAc,MAAM,QAAQ,EAAE,IAAI;EACxC,MAAM,SAAS,gBAAgB,KAAK,OAAO,mBAAmB;EAC9D,MAAM,SAAS,gBAAgB,KAAK,OAAO,mBAAmB;AAE9D,MAAI,WAAW,OACX,QAAO,SAAS;AAGpB,SAAO,EAAE,MAAM,cAAc,EAAE,MAAM;GACvC;AAEF,QAAO;;AAGX,SAAgB,iBACZ,SACA,GACe;CACf,MAAM,SAA0B,EAAE;AAElC,SAAQ,SAAS,UAAU;AACvB,MAAI,MAAM,QAAQ,mBAAmB;GACjC,MAAM,8BAAc,IAAI,KAA+B;GACvD,IAAI,iBAAiB;AAErB,SAAM,QAAQ,SAAS,SAAS;IAC5B,MAAM,YAAY,OAAQ,MAAyB,aAAa,GAAG,CAAC,MAAM;AAC1E,QAAI,CAAC,UACD;AAGJ,qBAAiB;AACjB,QAAI,CAAC,YAAY,IAAI,UAAU,CAC3B,aAAY,IAAI,WAAW,EAAE,CAAC;AAElC,gBAAY,IAAI,UAAU,CAAE,KAAK,KAAK;KACxC;AAEF,OAAI,gBAAgB;AAChB,gBAAY,SAAS,OAAO,cAAc;AACtC,YAAO,KAAK;MACR,OAAO,EAAE,UAAU;MACnB,OAAO,GAAG,MAAM,IAAI,GAAG;MACvB;MACH,CAAC;MACJ;AAEF;;;AAIR,SAAO,KAAK;GACR,OAAO,EAAE,MAAM,MAAM;GACrB,OAAO,MAAM;GACb,OAAO,MAAM;GAChB,CAAC;GACJ;AAEF,QAAO;;AAGX,SAAgB,qBAAqB,MAAsB,iBAAkC;AACzF,KAAI,CAAC,gBACD,QAAO;AAGX,SACK,KAAK,SAAS,IAAI,aAAa,CAAC,SAAS,gBAAgB,IAC1D,OAAO,KAAK,SAAS,GAAG,CAAC,aAAa,CAAC,SAAS,gBAAgB"}
@@ -0,0 +1,49 @@
1
+ import { Editor, JSONContent } from '@tiptap/core';
2
+ import { VariableOption } from './VariableDropdown';
3
+ export type VariableTagAttrs = {
4
+ label: string;
5
+ value: string;
6
+ openOnInsert: boolean;
7
+ /** Inline default when value is empty (e.g. {user:firstName|Guest}) */
8
+ default?: string;
9
+ /** Optional transform id (e.g. "round", "format"). */
10
+ transformerId?: string;
11
+ /** Optional transform params payload. */
12
+ transformerParams?: Record<string, unknown>;
13
+ };
14
+ export declare function dedupeVariableOptions(items: VariableOption[]): VariableOption[];
15
+ export declare function flattenVariableOptions(items: VariableOption[]): VariableOption[];
16
+ /**
17
+ * Build VariableTag attributes from base and selected variable options.
18
+ * Optional defaultIfEmpty is used when the resolved value is empty (e.g. "Guest" for {user:firstName|Guest}).
19
+ */
20
+ export declare function buildVariableTagAttrs(baseVariable: VariableOption, selectedVariable?: VariableOption, options?: {
21
+ openOnInsert?: boolean;
22
+ defaultIfEmpty?: string;
23
+ transformerId?: string;
24
+ transformerParams?: Record<string, unknown>;
25
+ }): VariableTagAttrs;
26
+ /**
27
+ * Strip optional inline default from token for lookup: {user:firstName|Guest} -> {user:firstName}.
28
+ * Returns [tokenWithoutDefault, defaultText].
29
+ */
30
+ export declare function parseTokenWithDefault(tokenValue: string): [string, string | undefined];
31
+ /**
32
+ * Resolve variable tag attrs from a token string (e.g. '{form:name}' or '{user:firstName|Guest}').
33
+ */
34
+ export declare function resolveVariableTagByValue(tokenValue: string, topLevelVariables: VariableOption[], allVariables: VariableOption[]): VariableTagAttrs | null;
35
+ /**
36
+ * Convert string value with {token} placeholders to Tiptap doc content.
37
+ */
38
+ export declare function valueToContent(value: string, topLevelVariables: VariableOption[], allVariables: VariableOption[], trailingCursorText?: string): JSONContent | null;
39
+ /**
40
+ * Convert Tiptap content to string value.
41
+ * Content is typically editor.getJSON().content (array of block/inline nodes).
42
+ */
43
+ export declare function contentToValue(content: unknown): string;
44
+ /**
45
+ * Replace a range in the editor with a variable tag node.
46
+ * @param editor - Tiptap editor instance
47
+ */
48
+ export declare function replaceTokenWithVariable(editor: Editor, attrs: VariableTagAttrs, from: number, to: number): void;
49
+ //# sourceMappingURL=variableSerialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variableSerialization.d.ts","sourceRoot":"","sources":["../../../src/components/tiptap/variableSerialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/C,CAAC;AA6IF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAe/E;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAehF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACjC,YAAY,EAAE,cAAc,EAC5B,gBAAgB,GAAE,cAA6B,EAC/C,OAAO,GAAE;IACL,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C,GACP,gBAAgB,CAoBlB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAGtF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACrC,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,cAAc,EAAE,EACnC,YAAY,EAAE,cAAc,EAAE,GAC/B,gBAAgB,GAAG,IAAI,CA0DzB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC1B,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,cAAc,EAAE,EACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,kBAAkB,SAAW,GAC9B,WAAW,GAAG,IAAI,CA0BpB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA4CvD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACX,IAAI,CAqBN"}