@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.
- package/CHANGELOG.md +5 -0
- package/LICENSE.md +21 -0
- package/README.md +31 -0
- package/dist/_virtual/_rolldown/runtime.js +34 -0
- package/dist/components/Button.d.ts +26 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +148 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/ButtonGroup.d.ts +11 -0
- package/dist/components/ButtonGroup.d.ts.map +1 -0
- package/dist/components/ButtonGroup.js +59 -0
- package/dist/components/ButtonGroup.js.map +1 -0
- package/dist/components/Calendar.d.ts +11 -0
- package/dist/components/Calendar.d.ts.map +1 -0
- package/dist/components/Calendar.js +133 -0
- package/dist/components/Calendar.js.map +1 -0
- package/dist/components/Checkbox.d.ts +5 -0
- package/dist/components/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox.js +41 -0
- package/dist/components/Checkbox.js.map +1 -0
- package/dist/components/CheckboxInput.d.ts +14 -0
- package/dist/components/CheckboxInput.d.ts.map +1 -0
- package/dist/components/CheckboxInput.js +31 -0
- package/dist/components/CheckboxInput.js.map +1 -0
- package/dist/components/CheckboxSelect.d.ts +19 -0
- package/dist/components/CheckboxSelect.d.ts.map +1 -0
- package/dist/components/CheckboxSelect.js +63 -0
- package/dist/components/CheckboxSelect.js.map +1 -0
- package/dist/components/ColorInput.d.ts +14 -0
- package/dist/components/ColorInput.d.ts.map +1 -0
- package/dist/components/ColorInput.js +148 -0
- package/dist/components/ColorInput.js.map +1 -0
- package/dist/components/Combobox.d.ts +40 -0
- package/dist/components/Combobox.d.ts.map +1 -0
- package/dist/components/Combobox.js +393 -0
- package/dist/components/Combobox.js.map +1 -0
- package/dist/components/ComboboxInput.d.ts +28 -0
- package/dist/components/ComboboxInput.d.ts.map +1 -0
- package/dist/components/ComboboxInput.js +165 -0
- package/dist/components/ComboboxInput.js.map +1 -0
- package/dist/components/Command.d.ts +26 -0
- package/dist/components/Command.d.ts.map +1 -0
- package/dist/components/Command.js +94 -0
- package/dist/components/Command.js.map +1 -0
- package/dist/components/CopyButton.d.ts +9 -0
- package/dist/components/CopyButton.d.ts.map +1 -0
- package/dist/components/CopyButton.js +40 -0
- package/dist/components/CopyButton.js.map +1 -0
- package/dist/components/DatePicker.d.ts +9 -0
- package/dist/components/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker.js +46 -0
- package/dist/components/DatePicker.js.map +1 -0
- package/dist/components/Dialog.d.ts +21 -0
- package/dist/components/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog.js +179 -0
- package/dist/components/Dialog.js.map +1 -0
- package/dist/components/DropdownMenu.d.ts +47 -0
- package/dist/components/DropdownMenu.d.ts.map +1 -0
- package/dist/components/DropdownMenu.js +240 -0
- package/dist/components/DropdownMenu.js.map +1 -0
- package/dist/components/EditableTable.d.ts +28 -0
- package/dist/components/EditableTable.d.ts.map +1 -0
- package/dist/components/EditableTable.js +145 -0
- package/dist/components/EditableTable.js.map +1 -0
- package/dist/components/FadeIn.d.ts +12 -0
- package/dist/components/FadeIn.d.ts.map +1 -0
- package/dist/components/FadeIn.js +24 -0
- package/dist/components/FadeIn.js.map +1 -0
- package/dist/components/Input.d.ts +9 -0
- package/dist/components/Input.d.ts.map +1 -0
- package/dist/components/Input.js +43 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/InputGroup.d.ts +20 -0
- package/dist/components/InputGroup.d.ts.map +1 -0
- package/dist/components/InputGroup.js +111 -0
- package/dist/components/InputGroup.js.map +1 -0
- package/dist/components/Label.d.ts +4 -0
- package/dist/components/Label.d.ts.map +1 -0
- package/dist/components/Label.js +15 -0
- package/dist/components/Label.js.map +1 -0
- package/dist/components/Lightswitch.d.ts +9 -0
- package/dist/components/Lightswitch.d.ts.map +1 -0
- package/dist/components/Lightswitch.js +56 -0
- package/dist/components/Lightswitch.js.map +1 -0
- package/dist/components/Markdown.d.ts +11 -0
- package/dist/components/Markdown.d.ts.map +1 -0
- package/dist/components/Markdown.js +46 -0
- package/dist/components/Markdown.js.map +1 -0
- package/dist/components/MenuButton.d.ts +40 -0
- package/dist/components/MenuButton.d.ts.map +1 -0
- package/dist/components/MenuButton.js +122 -0
- package/dist/components/MenuButton.js.map +1 -0
- package/dist/components/ModalTabs.d.ts +8 -0
- package/dist/components/ModalTabs.d.ts.map +1 -0
- package/dist/components/ModalTabs.js +37 -0
- package/dist/components/ModalTabs.js.map +1 -0
- package/dist/components/PaneTabs.d.ts +8 -0
- package/dist/components/PaneTabs.d.ts.map +1 -0
- package/dist/components/PaneTabs.js +37 -0
- package/dist/components/PaneTabs.js.map +1 -0
- package/dist/components/Popover.d.ts +12 -0
- package/dist/components/Popover.d.ts.map +1 -0
- package/dist/components/Popover.js +70 -0
- package/dist/components/Popover.js.map +1 -0
- package/dist/components/RadioGroup.d.ts +6 -0
- package/dist/components/RadioGroup.d.ts.map +1 -0
- package/dist/components/RadioGroup.js +34 -0
- package/dist/components/RadioGroup.js.map +1 -0
- package/dist/components/ScrollArea.d.ts +16 -0
- package/dist/components/ScrollArea.d.ts.map +1 -0
- package/dist/components/ScrollArea.js +47 -0
- package/dist/components/ScrollArea.js.map +1 -0
- package/dist/components/Select.d.ts +23 -0
- package/dist/components/Select.d.ts.map +1 -0
- package/dist/components/Select.js +205 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/SelectInput.d.ts +33 -0
- package/dist/components/SelectInput.d.ts.map +1 -0
- package/dist/components/SelectInput.js +85 -0
- package/dist/components/SelectInput.js.map +1 -0
- package/dist/components/Separator.d.ts +4 -0
- package/dist/components/Separator.d.ts.map +1 -0
- package/dist/components/Separator.js +17 -0
- package/dist/components/Separator.js.map +1 -0
- package/dist/components/SlideUp.d.ts +12 -0
- package/dist/components/SlideUp.d.ts.map +1 -0
- package/dist/components/SlideUp.js +36 -0
- package/dist/components/SlideUp.js.map +1 -0
- package/dist/components/Slot.d.ts +6 -0
- package/dist/components/Slot.d.ts.map +1 -0
- package/dist/components/Slot.js +52 -0
- package/dist/components/Slot.js.map +1 -0
- package/dist/components/Spinner.d.ts +9 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +43 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/Status.d.ts +8 -0
- package/dist/components/Status.d.ts.map +1 -0
- package/dist/components/Status.js +55 -0
- package/dist/components/Status.js.map +1 -0
- package/dist/components/Table.d.ts +10 -0
- package/dist/components/Table.d.ts.map +1 -0
- package/dist/components/Table.js +64 -0
- package/dist/components/Table.js.map +1 -0
- package/dist/components/Tabs.d.ts +8 -0
- package/dist/components/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs.js +37 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/components/Textarea.d.ts +8 -0
- package/dist/components/Textarea.d.ts.map +1 -0
- package/dist/components/Textarea.js +26 -0
- package/dist/components/Textarea.js.map +1 -0
- package/dist/components/TimePicker.d.ts +9 -0
- package/dist/components/TimePicker.d.ts.map +1 -0
- package/dist/components/TimePicker.js +40 -0
- package/dist/components/TimePicker.js.map +1 -0
- package/dist/components/TiptapContent.d.ts +9 -0
- package/dist/components/TiptapContent.d.ts.map +1 -0
- package/dist/components/TiptapContent.js +24 -0
- package/dist/components/TiptapContent.js.map +1 -0
- package/dist/components/TiptapEditor.d.ts +41 -0
- package/dist/components/TiptapEditor.d.ts.map +1 -0
- package/dist/components/TiptapEditor.js +555 -0
- package/dist/components/TiptapEditor.js.map +1 -0
- package/dist/components/TiptapInput.d.ts +15 -0
- package/dist/components/TiptapInput.d.ts.map +1 -0
- package/dist/components/TiptapInput.js +138 -0
- package/dist/components/TiptapInput.js.map +1 -0
- package/dist/components/Toggle.d.ts +9 -0
- package/dist/components/Toggle.d.ts.map +1 -0
- package/dist/components/Toggle.js +48 -0
- package/dist/components/Toggle.js.map +1 -0
- package/dist/components/ToggleGroup.d.ts +11 -0
- package/dist/components/ToggleGroup.d.ts.map +1 -0
- package/dist/components/ToggleGroup.js +70 -0
- package/dist/components/ToggleGroup.js.map +1 -0
- package/dist/components/Tooltip.d.ts +9 -0
- package/dist/components/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip.js +51 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/VirtualizedScrollArea.d.ts +25 -0
- package/dist/components/VirtualizedScrollArea.d.ts.map +1 -0
- package/dist/components/VirtualizedScrollArea.js +80 -0
- package/dist/components/VirtualizedScrollArea.js.map +1 -0
- package/dist/components/editable-table/RowDataCells.d.ts +3 -0
- package/dist/components/editable-table/RowDataCells.d.ts.map +1 -0
- package/dist/components/editable-table/RowDataCells.js +33 -0
- package/dist/components/editable-table/RowDataCells.js.map +1 -0
- package/dist/components/editable-table/TableCell.d.ts +13 -0
- package/dist/components/editable-table/TableCell.d.ts.map +1 -0
- package/dist/components/editable-table/TableCell.js +415 -0
- package/dist/components/editable-table/TableCell.js.map +1 -0
- package/dist/components/editable-table/TableRow.d.ts +3 -0
- package/dist/components/editable-table/TableRow.d.ts.map +1 -0
- package/dist/components/editable-table/TableRow.js +163 -0
- package/dist/components/editable-table/TableRow.js.map +1 -0
- package/dist/components/editable-table/helpers.d.ts +12 -0
- package/dist/components/editable-table/helpers.d.ts.map +1 -0
- package/dist/components/editable-table/helpers.js +23 -0
- package/dist/components/editable-table/helpers.js.map +1 -0
- package/dist/components/editable-table/index.d.ts +4 -0
- package/dist/components/editable-table/index.d.ts.map +1 -0
- package/dist/components/editable-table/index.js +4 -0
- package/dist/components/editable-table/types.d.ts +43 -0
- package/dist/components/editable-table/types.d.ts.map +1 -0
- package/dist/components/editable-table/types.js +0 -0
- package/dist/components/editable-table/useEditableTableCellChange.d.ts +17 -0
- package/dist/components/editable-table/useEditableTableCellChange.d.ts.map +1 -0
- package/dist/components/editable-table/useEditableTableCellChange.js +152 -0
- package/dist/components/editable-table/useEditableTableCellChange.js.map +1 -0
- package/dist/components/editable-table/useEditableTableDnd.d.ts +18 -0
- package/dist/components/editable-table/useEditableTableDnd.d.ts.map +1 -0
- package/dist/components/editable-table/useEditableTableDnd.js +55 -0
- package/dist/components/editable-table/useEditableTableDnd.js.map +1 -0
- package/dist/components/editable-table/useEditableTableRows.d.ts +17 -0
- package/dist/components/editable-table/useEditableTableRows.d.ts.map +1 -0
- package/dist/components/editable-table/useEditableTableRows.js +108 -0
- package/dist/components/editable-table/useEditableTableRows.js.map +1 -0
- package/dist/components/index.d.ts +45 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +45 -0
- package/dist/components/tiptap/InlineVariablePickerPopover.d.ts +24 -0
- package/dist/components/tiptap/InlineVariablePickerPopover.d.ts.map +1 -0
- package/dist/components/tiptap/InlineVariablePickerPopover.js +63 -0
- package/dist/components/tiptap/InlineVariablePickerPopover.js.map +1 -0
- package/dist/components/tiptap/InsertLinkDialog.d.ts +14 -0
- package/dist/components/tiptap/InsertLinkDialog.d.ts.map +1 -0
- package/dist/components/tiptap/InsertLinkDialog.js +145 -0
- package/dist/components/tiptap/InsertLinkDialog.js.map +1 -0
- package/dist/components/tiptap/LinkBubbleMenu.d.ts +10 -0
- package/dist/components/tiptap/LinkBubbleMenu.d.ts.map +1 -0
- package/dist/components/tiptap/LinkBubbleMenu.js +106 -0
- package/dist/components/tiptap/LinkBubbleMenu.js.map +1 -0
- package/dist/components/tiptap/LinkDropdown.d.ts +53 -0
- package/dist/components/tiptap/LinkDropdown.d.ts.map +1 -0
- package/dist/components/tiptap/LinkDropdown.js +155 -0
- package/dist/components/tiptap/LinkDropdown.js.map +1 -0
- package/dist/components/tiptap/VariableCommandList.d.ts +37 -0
- package/dist/components/tiptap/VariableCommandList.d.ts.map +1 -0
- package/dist/components/tiptap/VariableCommandList.js +166 -0
- package/dist/components/tiptap/VariableCommandList.js.map +1 -0
- package/dist/components/tiptap/VariableDropdown.d.ts +33 -0
- package/dist/components/tiptap/VariableDropdown.d.ts.map +1 -0
- package/dist/components/tiptap/VariableDropdown.js +121 -0
- package/dist/components/tiptap/VariableDropdown.js.map +1 -0
- package/dist/components/tiptap/VariablePickerContext.d.ts +38 -0
- package/dist/components/tiptap/VariablePickerContext.d.ts.map +1 -0
- package/dist/components/tiptap/VariablePickerContext.js +30 -0
- package/dist/components/tiptap/VariablePickerContext.js.map +1 -0
- package/dist/components/tiptap/VariableTag.d.ts +6 -0
- package/dist/components/tiptap/VariableTag.d.ts.map +1 -0
- package/dist/components/tiptap/VariableTag.js +153 -0
- package/dist/components/tiptap/VariableTag.js.map +1 -0
- package/dist/components/tiptap/VariableTagView.d.ts +3 -0
- package/dist/components/tiptap/VariableTagView.d.ts.map +1 -0
- package/dist/components/tiptap/VariableTagView.js +445 -0
- package/dist/components/tiptap/VariableTagView.js.map +1 -0
- package/dist/components/tiptap/VariableTransformControls.d.ts +37 -0
- package/dist/components/tiptap/VariableTransformControls.d.ts.map +1 -0
- package/dist/components/tiptap/VariableTransformControls.js +157 -0
- package/dist/components/tiptap/VariableTransformControls.js.map +1 -0
- package/dist/components/tiptap/editorConfig.d.ts +15 -0
- package/dist/components/tiptap/editorConfig.d.ts.map +1 -0
- package/dist/components/tiptap/editorConfig.js +191 -0
- package/dist/components/tiptap/editorConfig.js.map +1 -0
- package/dist/components/tiptap/useInlineVariablePicker.d.ts +34 -0
- package/dist/components/tiptap/useInlineVariablePicker.d.ts.map +1 -0
- package/dist/components/tiptap/useInlineVariablePicker.js +240 -0
- package/dist/components/tiptap/useInlineVariablePicker.js.map +1 -0
- package/dist/components/tiptap/useVariablePicker.d.ts +28 -0
- package/dist/components/tiptap/useVariablePicker.d.ts.map +1 -0
- package/dist/components/tiptap/useVariablePicker.js +122 -0
- package/dist/components/tiptap/useVariablePicker.js.map +1 -0
- package/dist/components/tiptap/variablePickerUtils.d.ts +11 -0
- package/dist/components/tiptap/variablePickerUtils.d.ts.map +1 -0
- package/dist/components/tiptap/variablePickerUtils.js +63 -0
- package/dist/components/tiptap/variablePickerUtils.js.map +1 -0
- package/dist/components/tiptap/variableSerialization.d.ts +49 -0
- package/dist/components/tiptap/variableSerialization.d.ts.map +1 -0
- package/dist/components/tiptap/variableSerialization.js +250 -0
- package/dist/components/tiptap/variableSerialization.js.map +1 -0
- package/dist/css/core.css +288 -0
- package/dist/css/style.css +295 -0
- package/dist/forms/Field.d.ts +37 -0
- package/dist/forms/Field.d.ts.map +1 -0
- package/dist/forms/Field.js +159 -0
- package/dist/forms/Field.js.map +1 -0
- package/dist/forms/SchemaFormEngine.d.ts +23 -0
- package/dist/forms/SchemaFormEngine.d.ts.map +1 -0
- package/dist/forms/SchemaFormEngine.js +444 -0
- package/dist/forms/SchemaFormEngine.js.map +1 -0
- package/dist/forms/components/FieldWrap.d.ts +11 -0
- package/dist/forms/components/FieldWrap.d.ts.map +1 -0
- package/dist/forms/components/FieldWrap.js +84 -0
- package/dist/forms/components/FieldWrap.js.map +1 -0
- package/dist/forms/components/ModalTabs.d.ts +21 -0
- package/dist/forms/components/ModalTabs.d.ts.map +1 -0
- package/dist/forms/components/ModalTabs.js +84 -0
- package/dist/forms/components/ModalTabs.js.map +1 -0
- package/dist/forms/components/index.d.ts +3 -0
- package/dist/forms/components/index.d.ts.map +1 -0
- package/dist/forms/components/index.js +3 -0
- package/dist/forms/contexts/VariableCategoriesContext.d.ts +17 -0
- package/dist/forms/contexts/VariableCategoriesContext.d.ts.map +1 -0
- package/dist/forms/contexts/VariableCategoriesContext.js +18 -0
- package/dist/forms/contexts/VariableCategoriesContext.js.map +1 -0
- package/dist/forms/engine/FormStateStore.d.ts +24 -0
- package/dist/forms/engine/FormStateStore.d.ts.map +1 -0
- package/dist/forms/engine/FormStateStore.js +97 -0
- package/dist/forms/engine/FormStateStore.js.map +1 -0
- package/dist/forms/engine/SchemaIndex.d.ts +33 -0
- package/dist/forms/engine/SchemaIndex.d.ts.map +1 -0
- package/dist/forms/engine/SchemaIndex.js +21 -0
- package/dist/forms/engine/SchemaIndex.js.map +1 -0
- package/dist/forms/engine/ValidationEngine.d.ts +13 -0
- package/dist/forms/engine/ValidationEngine.d.ts.map +1 -0
- package/dist/forms/engine/ValidationEngine.js +155 -0
- package/dist/forms/engine/ValidationEngine.js.map +1 -0
- package/dist/forms/engine/buildGroupedMessage.d.ts +2 -0
- package/dist/forms/engine/buildGroupedMessage.d.ts.map +1 -0
- package/dist/forms/engine/buildGroupedMessage.js +20 -0
- package/dist/forms/engine/buildGroupedMessage.js.map +1 -0
- package/dist/forms/engine/context.d.ts +60 -0
- package/dist/forms/engine/context.d.ts.map +1 -0
- package/dist/forms/engine/context.js +12 -0
- package/dist/forms/engine/context.js.map +1 -0
- package/dist/forms/engine/rules/email.d.ts +2 -0
- package/dist/forms/engine/rules/email.d.ts.map +1 -0
- package/dist/forms/engine/rules/email.js +11 -0
- package/dist/forms/engine/rules/email.js.map +1 -0
- package/dist/forms/engine/rules/emailOrVariable.d.ts +2 -0
- package/dist/forms/engine/rules/emailOrVariable.d.ts.map +1 -0
- package/dist/forms/engine/rules/emailOrVariable.js +13 -0
- package/dist/forms/engine/rules/emailOrVariable.js.map +1 -0
- package/dist/forms/engine/rules/handle.d.ts +2 -0
- package/dist/forms/engine/rules/handle.d.ts.map +1 -0
- package/dist/forms/engine/rules/handle.js +12 -0
- package/dist/forms/engine/rules/handle.js.map +1 -0
- package/dist/forms/engine/rules/index.d.ts +9 -0
- package/dist/forms/engine/rules/index.d.ts.map +1 -0
- package/dist/forms/engine/rules/index.js +35 -0
- package/dist/forms/engine/rules/index.js.map +1 -0
- package/dist/forms/engine/rules/max.d.ts +2 -0
- package/dist/forms/engine/rules/max.d.ts.map +1 -0
- package/dist/forms/engine/rules/max.js +16 -0
- package/dist/forms/engine/rules/max.js.map +1 -0
- package/dist/forms/engine/rules/min.d.ts +2 -0
- package/dist/forms/engine/rules/min.d.ts.map +1 -0
- package/dist/forms/engine/rules/min.js +16 -0
- package/dist/forms/engine/rules/min.js.map +1 -0
- package/dist/forms/engine/rules/required.d.ts +2 -0
- package/dist/forms/engine/rules/required.d.ts.map +1 -0
- package/dist/forms/engine/rules/required.js +11 -0
- package/dist/forms/engine/rules/required.js.map +1 -0
- package/dist/forms/engine/rules/uniqueHandle.d.ts +9 -0
- package/dist/forms/engine/rules/uniqueHandle.d.ts.map +1 -0
- package/dist/forms/engine/rules/uniqueHandle.js +95 -0
- package/dist/forms/engine/rules/uniqueHandle.js.map +1 -0
- package/dist/forms/engine/rules/utils.d.ts +3 -0
- package/dist/forms/engine/rules/utils.d.ts.map +1 -0
- package/dist/forms/engine/rules/utils.js +21 -0
- package/dist/forms/engine/rules/utils.js.map +1 -0
- package/dist/forms/fields/CalculationsField.d.ts +24 -0
- package/dist/forms/fields/CalculationsField.d.ts.map +1 -0
- package/dist/forms/fields/CalculationsField.js +215 -0
- package/dist/forms/fields/CalculationsField.js.map +1 -0
- package/dist/forms/fields/CalculationsToolbar.d.ts +17 -0
- package/dist/forms/fields/CalculationsToolbar.d.ts.map +1 -0
- package/dist/forms/fields/CalculationsToolbar.js +130 -0
- package/dist/forms/fields/CalculationsToolbar.js.map +1 -0
- package/dist/forms/fields/CheckboxSelectField.d.ts +19 -0
- package/dist/forms/fields/CheckboxSelectField.d.ts.map +1 -0
- package/dist/forms/fields/CheckboxSelectField.js +30 -0
- package/dist/forms/fields/CheckboxSelectField.js.map +1 -0
- package/dist/forms/fields/ColorField.d.ts +15 -0
- package/dist/forms/fields/ColorField.d.ts.map +1 -0
- package/dist/forms/fields/ColorField.js +30 -0
- package/dist/forms/fields/ColorField.js.map +1 -0
- package/dist/forms/fields/ComboboxField.d.ts +23 -0
- package/dist/forms/fields/ComboboxField.d.ts.map +1 -0
- package/dist/forms/fields/ComboboxField.js +38 -0
- package/dist/forms/fields/ComboboxField.js.map +1 -0
- package/dist/forms/fields/DateTimeField.d.ts +14 -0
- package/dist/forms/fields/DateTimeField.d.ts.map +1 -0
- package/dist/forms/fields/DateTimeField.js +53 -0
- package/dist/forms/fields/DateTimeField.js.map +1 -0
- package/dist/forms/fields/EditableTableField.d.ts +22 -0
- package/dist/forms/fields/EditableTableField.d.ts.map +1 -0
- package/dist/forms/fields/EditableTableField.js +37 -0
- package/dist/forms/fields/EditableTableField.js.map +1 -0
- package/dist/forms/fields/ElementSelectField.d.ts +20 -0
- package/dist/forms/fields/ElementSelectField.d.ts.map +1 -0
- package/dist/forms/fields/ElementSelectField.js +215 -0
- package/dist/forms/fields/ElementSelectField.js.map +1 -0
- package/dist/forms/fields/GroupField.d.ts +19 -0
- package/dist/forms/fields/GroupField.d.ts.map +1 -0
- package/dist/forms/fields/GroupField.js +50 -0
- package/dist/forms/fields/GroupField.js.map +1 -0
- package/dist/forms/fields/HandleField.d.ts +20 -0
- package/dist/forms/fields/HandleField.d.ts.map +1 -0
- package/dist/forms/fields/HandleField.js +70 -0
- package/dist/forms/fields/HandleField.js.map +1 -0
- package/dist/forms/fields/LightswitchField.d.ts +14 -0
- package/dist/forms/fields/LightswitchField.d.ts.map +1 -0
- package/dist/forms/fields/LightswitchField.js +29 -0
- package/dist/forms/fields/LightswitchField.js.map +1 -0
- package/dist/forms/fields/ListField.d.ts +17 -0
- package/dist/forms/fields/ListField.d.ts.map +1 -0
- package/dist/forms/fields/ListField.js +51 -0
- package/dist/forms/fields/ListField.js.map +1 -0
- package/dist/forms/fields/NumberField.d.ts +17 -0
- package/dist/forms/fields/NumberField.d.ts.map +1 -0
- package/dist/forms/fields/NumberField.js +33 -0
- package/dist/forms/fields/NumberField.js.map +1 -0
- package/dist/forms/fields/RadioGroupField.d.ts +25 -0
- package/dist/forms/fields/RadioGroupField.d.ts.map +1 -0
- package/dist/forms/fields/RadioGroupField.js +102 -0
- package/dist/forms/fields/RadioGroupField.js.map +1 -0
- package/dist/forms/fields/RichTextField.d.ts +23 -0
- package/dist/forms/fields/RichTextField.d.ts.map +1 -0
- package/dist/forms/fields/RichTextField.js +50 -0
- package/dist/forms/fields/RichTextField.js.map +1 -0
- package/dist/forms/fields/SelectField.d.ts +25 -0
- package/dist/forms/fields/SelectField.d.ts.map +1 -0
- package/dist/forms/fields/SelectField.js +73 -0
- package/dist/forms/fields/SelectField.js.map +1 -0
- package/dist/forms/fields/StaticTableField.d.ts +34 -0
- package/dist/forms/fields/StaticTableField.d.ts.map +1 -0
- package/dist/forms/fields/StaticTableField.js +128 -0
- package/dist/forms/fields/StaticTableField.js.map +1 -0
- package/dist/forms/fields/TextField.d.ts +16 -0
- package/dist/forms/fields/TextField.d.ts.map +1 -0
- package/dist/forms/fields/TextField.js +31 -0
- package/dist/forms/fields/TextField.js.map +1 -0
- package/dist/forms/fields/TextareaField.d.ts +17 -0
- package/dist/forms/fields/TextareaField.d.ts.map +1 -0
- package/dist/forms/fields/TextareaField.js +32 -0
- package/dist/forms/fields/TextareaField.js.map +1 -0
- package/dist/forms/fields/VariablePickerField.d.ts +21 -0
- package/dist/forms/fields/VariablePickerField.d.ts.map +1 -0
- package/dist/forms/fields/VariablePickerField.js +49 -0
- package/dist/forms/fields/VariablePickerField.js.map +1 -0
- package/dist/forms/index.d.ts +8 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +10 -0
- package/dist/forms/registry.d.ts +8 -0
- package/dist/forms/registry.d.ts.map +1 -0
- package/dist/forms/registry.js +76 -0
- package/dist/forms/registry.js.map +1 -0
- package/dist/forms/store/element-store.d.ts +11 -0
- package/dist/forms/store/element-store.d.ts.map +1 -0
- package/dist/forms/store/element-store.js +41 -0
- package/dist/forms/store/element-store.js.map +1 -0
- package/dist/forms/useEditableTableFieldBinding.d.ts +13 -0
- package/dist/forms/useEditableTableFieldBinding.d.ts.map +1 -0
- package/dist/forms/useEditableTableFieldBinding.js +91 -0
- package/dist/forms/useEditableTableFieldBinding.js.map +1 -0
- package/dist/forms/useEngineField.d.ts +9 -0
- package/dist/forms/useEngineField.d.ts.map +1 -0
- package/dist/forms/useEngineField.js +32 -0
- package/dist/forms/useEngineField.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts +14 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/hooks/useKeyboardShortcuts.js +67 -0
- package/dist/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/hooks/useTranslation.d.ts +3 -0
- package/dist/hooks/useTranslation.d.ts.map +1 -0
- package/dist/hooks/useTranslation.js +12 -0
- package/dist/hooks/useTranslation.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +15 -0
- package/dist/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js +15 -0
- package/dist/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/classCallCheck.js +13 -0
- package/dist/node_modules/@babel/runtime/helpers/classCallCheck.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/createClass.js +21 -0
- package/dist/node_modules/@babel/runtime/helpers/createClass.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/defineProperty.js +20 -0
- package/dist/node_modules/@babel/runtime/helpers/defineProperty.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/interopRequireDefault.js +13 -0
- package/dist/node_modules/@babel/runtime/helpers/interopRequireDefault.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/iterableToArray.js +13 -0
- package/dist/node_modules/@babel/runtime/helpers/iterableToArray.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/nonIterableSpread.js +13 -0
- package/dist/node_modules/@babel/runtime/helpers/nonIterableSpread.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/toConsumableArray.js +21 -0
- package/dist/node_modules/@babel/runtime/helpers/toConsumableArray.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/toPrimitive.js +22 -0
- package/dist/node_modules/@babel/runtime/helpers/toPrimitive.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/toPropertyKey.js +18 -0
- package/dist/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/typeof.js +18 -0
- package/dist/node_modules/@babel/runtime/helpers/typeof.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +19 -0
- package/dist/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +1 -0
- package/dist/node_modules/jexl/dist/Expression.js +84 -0
- package/dist/node_modules/jexl/dist/Expression.js.map +1 -0
- package/dist/node_modules/jexl/dist/Jexl.js +165 -0
- package/dist/node_modules/jexl/dist/Jexl.js.map +1 -0
- package/dist/node_modules/jexl/dist/Lexer.js +152 -0
- package/dist/node_modules/jexl/dist/Lexer.js.map +1 -0
- package/dist/node_modules/jexl/dist/PromiseSync.js +87 -0
- package/dist/node_modules/jexl/dist/PromiseSync.js.map +1 -0
- package/dist/node_modules/jexl/dist/evaluator/Evaluator.js +98 -0
- package/dist/node_modules/jexl/dist/evaluator/Evaluator.js.map +1 -0
- package/dist/node_modules/jexl/dist/evaluator/handlers.js +162 -0
- package/dist/node_modules/jexl/dist/evaluator/handlers.js.map +1 -0
- package/dist/node_modules/jexl/dist/grammar.js +195 -0
- package/dist/node_modules/jexl/dist/grammar.js.map +1 -0
- package/dist/node_modules/jexl/dist/parser/Parser.js +135 -0
- package/dist/node_modules/jexl/dist/parser/Parser.js.map +1 -0
- package/dist/node_modules/jexl/dist/parser/handlers.js +205 -0
- package/dist/node_modules/jexl/dist/parser/handlers.js.map +1 -0
- package/dist/node_modules/jexl/dist/parser/states.js +158 -0
- package/dist/node_modules/jexl/dist/parser/states.js.map +1 -0
- package/dist/types/global.d.d.ts +1 -0
- package/dist/types/global.d.js +0 -0
- package/dist/utils/classes.d.ts +18 -0
- package/dist/utils/classes.d.ts.map +1 -0
- package/dist/utils/classes.js +25 -0
- package/dist/utils/classes.js.map +1 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +16 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/craftHostBridge.d.ts +16 -0
- package/dist/utils/craftHostBridge.d.ts.map +1 -0
- package/dist/utils/craftHostBridge.js +28 -0
- package/dist/utils/craftHostBridge.js.map +1 -0
- package/dist/utils/handle.d.ts +10 -0
- package/dist/utils/handle.d.ts.map +1 -0
- package/dist/utils/handle.js +51 -0
- package/dist/utils/handle.js.map +1 -0
- package/dist/utils/hostBridge.d.ts +40 -0
- package/dist/utils/hostBridge.d.ts.map +1 -0
- package/dist/utils/hostBridge.js +35 -0
- package/dist/utils/hostBridge.js.map +1 -0
- package/dist/utils/index.d.ts +18 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +66 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/portal.d.ts +17 -0
- package/dist/utils/portal.d.ts.map +1 -0
- package/dist/utils/portal.js +51 -0
- package/dist/utils/portal.js.map +1 -0
- package/dist/utils/schema.d.ts +17 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +56 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/schemaFieldNames.d.ts +2 -0
- package/dist/utils/schemaFieldNames.d.ts.map +1 -0
- package/dist/utils/schemaFieldNames.js +16 -0
- package/dist/utils/schemaFieldNames.js.map +1 -0
- package/dist/utils/schemaIndex.d.ts +6 -0
- package/dist/utils/schemaIndex.d.ts.map +1 -0
- package/dist/utils/schemaIndex.js +31 -0
- package/dist/utils/schemaIndex.js.map +1 -0
- package/dist/utils/schemaIndexCache.d.ts +6 -0
- package/dist/utils/schemaIndexCache.d.ts.map +1 -0
- package/dist/utils/schemaIndexCache.js +32 -0
- package/dist/utils/schemaIndexCache.js.map +1 -0
- package/dist/utils/schemaNormalize.d.ts +13 -0
- package/dist/utils/schemaNormalize.d.ts.map +1 -0
- package/dist/utils/schemaNormalize.js +17 -0
- package/dist/utils/schemaNormalize.js.map +1 -0
- package/dist/utils/store.d.ts +7 -0
- package/dist/utils/store.d.ts.map +1 -0
- package/dist/utils/store.js +6 -0
- package/dist/utils/store.js.map +1 -0
- package/dist/utils/timeOptions.d.ts +6 -0
- package/dist/utils/timeOptions.d.ts.map +1 -0
- package/dist/utils/timeOptions.js +42 -0
- package/dist/utils/timeOptions.js.map +1 -0
- package/dist/utils/tiptap.d.ts +13 -0
- package/dist/utils/tiptap.d.ts.map +1 -0
- package/dist/utils/tiptap.js +39 -0
- package/dist/utils/tiptap.js.map +1 -0
- package/dist/utils/translation.d.ts +5 -0
- package/dist/utils/translation.d.ts.map +1 -0
- package/dist/utils/translation.js +21 -0
- package/dist/utils/translation.js.map +1 -0
- package/dist/utils/validation.d.ts +4 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +253 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +167 -0
- 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":";;;;;AAqBA,SAAgB,kBAAkB,EAC9B,oBACA,wBACA,uBACA,SACA,QACA,aACA,mBACA,iBAAiB,SACQ;CACzB,MAAM,IAAI,gBAAgB;CAC1B,MAAM,CAAC,OAAO,YAAY,SAA2B,EAAE,CAAC;CACxD,MAAM,CAAC,QAAQ,aAAa,SAAS,GAAG;CAExC,MAAM,OAAO,MAAM,GAAG,GAAG;CACzB,MAAM,sBAAsB,CAAC,kBAAkB,QAAQ,OAAO,IAAI,QAAQ,KAAK,IAAI,QAAQ,YAAY;CAEvG,MAAM,iBAAiB,cACb;AACF,MAAI,CAAC,oBACD,QAAO,EAAE;AAGb,SAAO,2BAA2B,oBAAoB,wBAAwB,sBAAsB;IAExG;EAAC;EAAqB;EAAoB;EAAwB;EAAsB,CAC3F;CAED,MAAM,kBAAmC,cAAc;AACnD,MAAI,CAAC,oBACD,QAAO,EAAE;AAGb,SAAO,iBAAiB,gBAAgB,EAAE;IAC3C;EAAC;EAAgB;EAAqB;EAAE,CAAC;CAE5C,MAAM,mBAAmB,OAAO,MAAM,CAAC,aAAa;CAEpD,MAAM,SAAiC,cAAc;AACjD,MAAI,CAAC,uBAAuB,CAAC,KACzB,QAAO,EAAE;AAGb,MAAI,MAAM,UAAU,QAAQ;GACxB,MAAM,EAAE,aAAa;GACrB,MAAM,aAAa,KAAK,SAAS,KAAK,SAAS;AAC/C,OAAI,CAAC,iBACD,QAAO,CAAC;IAAE,OAAO,EAAE,YAAY;IAAE,OAAO;IAAY,OAAO;IAAU,CAAC;GAE1E,MAAM,WAAW,SAAS,QAAQ,SAAS;AACvC,WAAO,qBAAqB,MAAM,iBAAiB;KACrD;AACF,UAAO,SAAS,SAAS,CAAC;IAAE,OAAO,EAAE,YAAY;IAAE,OAAO;IAAY,OAAO;IAAU,CAAC,GAAG,EAAE;;AAGjG,MAAI,CAAC,iBACD,QAAO;AAGX,SAAO,gBACF,KAAK,MAAM;AACR,UAAO;IACH,GAAG;IACH,OAAO,EAAE,MAAM,QAAQ,SAAS;AAE5B,SADoB,qBAAqB,MAAM,iBAC3C,CACA,QAAO;AAIX,aADiB,MAAM,QAAQ,KAAK,SAAS,GAAG,KAAK,WAAW,EAAE,EAClD,MAAM,MAAM;AACxB,aAAO,qBAAqB,GAAG,iBAAiB;OAClD;MACJ;IACL;IACH,CACD,QAAQ,MAAM;AACX,UAAO,EAAE,MAAM,SAAS;IAC1B;IACP;EAAC;EAAM;EAAkB;EAAiB;EAAqB;EAAE,CAAC;CAErE,MAAM,UAAU,cAAc;AAC1B,UAAQ,UAAU,EAAE,EAAE,SAAS,MAAM;AACjC,UAAO,EAAE;IACX;IACH,CAAC,OAAO,CAAC;CAEZ,MAAM,eAAe,aAAa,UAA0B,oBAAqC;AAC7F,MAAI,MAAM,QAAQ,SAAS,SAAS,IAAI,SAAS,SAAS,SAAS,GAAG;AAClE,aAAU,MAAM;AACZ,WAAO,CAAC,GAAG,GAAG,SAAS;KACzB;AACF,aAAU,GAAG;AACb;;AAIJ,UADqB,mBAAmB,QAAQ,UAC1B,UAAU,qBAAqB,CAAC;IACvD;EAAC;EAAmB;EAAS;EAAK,CAAC;CAEtC,MAAM,aAAa,kBAAkB;AACjC,YAAU,MAAM;AACZ,UAAO,EAAE,MAAM,GAAG,GAAG;IACvB;IACH,EAAE,CAAC;CAEN,MAAM,QAAQ,kBAAkB;AAC5B,WAAS,EAAE,CAAC;AACZ,YAAU,GAAG;IACd,EAAE,CAAC;AAEN,iBAAgB;AACZ,MAAI,OACA,KAAI,eAAe,MAAM,QAAQ,YAAY,SAAS,IAAI,YAAY,SAAS,SAAS,GAAG;AACvF,YAAS,CAAC,YAAY,CAAC;AACvB,aAAU,GAAG;QAEb,QAAO;IAGhB;EAAC;EAAa;EAAQ;EAAM,CAAC;AAEhC,QAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACH"}
|
|
@@ -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"}
|