@puzzle-ui/ui 0.0.0-stage → 0.2.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/README.md +97 -2
- package/dist/LICENSE +21 -0
- package/dist/components/actions/button/button-content.cjs +41 -0
- package/dist/components/actions/button/button-content.cjs.map +1 -0
- package/dist/components/actions/button/button-content.js +41 -0
- package/dist/components/actions/button/button-content.js.map +1 -0
- package/dist/components/actions/button/button.css +191 -0
- package/dist/components/actions/button/button.types.d.cts +30 -0
- package/dist/components/actions/button/button.types.d.ts +30 -0
- package/dist/components/actions/button/index.cjs +80 -0
- package/dist/components/actions/button/index.cjs.map +1 -0
- package/dist/components/actions/button/index.d.cts +3 -0
- package/dist/components/actions/button/index.d.ts +3 -0
- package/dist/components/actions/button/index.js +80 -0
- package/dist/components/actions/button/index.js.map +1 -0
- package/dist/components/actions/button-group/button-group.css +64 -0
- package/dist/components/actions/button-group/index.cjs +25 -0
- package/dist/components/actions/button-group/index.cjs.map +1 -0
- package/dist/components/actions/button-group/index.d.cts +14 -0
- package/dist/components/actions/button-group/index.d.ts +14 -0
- package/dist/components/actions/button-group/index.js +25 -0
- package/dist/components/actions/button-group/index.js.map +1 -0
- package/dist/components/actions/toggle-group/index.cjs +124 -0
- package/dist/components/actions/toggle-group/index.cjs.map +1 -0
- package/dist/components/actions/toggle-group/index.d.cts +10 -0
- package/dist/components/actions/toggle-group/index.d.ts +10 -0
- package/dist/components/actions/toggle-group/index.js +124 -0
- package/dist/components/actions/toggle-group/index.js.map +1 -0
- package/dist/components/actions/toggle-group/toggle-group.css +67 -0
- package/dist/components/actions/toggle-group/toggle-group.types.d.cts +54 -0
- package/dist/components/actions/toggle-group/toggle-group.types.d.ts +54 -0
- package/dist/components/data-display/alert/alert.css +128 -0
- package/dist/components/data-display/alert/alert.types.d.cts +14 -0
- package/dist/components/data-display/alert/alert.types.d.ts +14 -0
- package/dist/components/data-display/alert/alert.utils.cjs +11 -0
- package/dist/components/data-display/alert/alert.utils.cjs.map +1 -0
- package/dist/components/data-display/alert/alert.utils.js +11 -0
- package/dist/components/data-display/alert/alert.utils.js.map +1 -0
- package/dist/components/data-display/alert/index.cjs +103 -0
- package/dist/components/data-display/alert/index.cjs.map +1 -0
- package/dist/components/data-display/alert/index.d.cts +3 -0
- package/dist/components/data-display/alert/index.d.ts +3 -0
- package/dist/components/data-display/alert/index.js +103 -0
- package/dist/components/data-display/alert/index.js.map +1 -0
- package/dist/components/data-display/avatar/avatar.css +30 -0
- package/dist/components/data-display/avatar/index.cjs +42 -0
- package/dist/components/data-display/avatar/index.cjs.map +1 -0
- package/dist/components/data-display/avatar/index.d.cts +10 -0
- package/dist/components/data-display/avatar/index.d.ts +10 -0
- package/dist/components/data-display/avatar/index.js +42 -0
- package/dist/components/data-display/avatar/index.js.map +1 -0
- package/dist/components/data-display/badge/badge.css +91 -0
- package/dist/components/data-display/badge/index.cjs +31 -0
- package/dist/components/data-display/badge/index.cjs.map +1 -0
- package/dist/components/data-display/badge/index.d.cts +18 -0
- package/dist/components/data-display/badge/index.d.ts +18 -0
- package/dist/components/data-display/badge/index.js +31 -0
- package/dist/components/data-display/badge/index.js.map +1 -0
- package/dist/components/data-display/card/card.css +164 -0
- package/dist/components/data-display/card/index.cjs +42 -0
- package/dist/components/data-display/card/index.cjs.map +1 -0
- package/dist/components/data-display/card/index.d.cts +29 -0
- package/dist/components/data-display/card/index.d.ts +29 -0
- package/dist/components/data-display/card/index.js +35 -0
- package/dist/components/data-display/card/index.js.map +1 -0
- package/dist/components/data-display/image/image.css +80 -0
- package/dist/components/data-display/image/image.types.d.cts +154 -0
- package/dist/components/data-display/image/image.types.d.ts +154 -0
- package/dist/components/data-display/image/image.utils.cjs +55 -0
- package/dist/components/data-display/image/image.utils.cjs.map +1 -0
- package/dist/components/data-display/image/image.utils.js +51 -0
- package/dist/components/data-display/image/image.utils.js.map +1 -0
- package/dist/components/data-display/image/index.cjs +176 -0
- package/dist/components/data-display/image/index.cjs.map +1 -0
- package/dist/components/data-display/image/index.d.cts +3 -0
- package/dist/components/data-display/image/index.d.ts +3 -0
- package/dist/components/data-display/image/index.js +176 -0
- package/dist/components/data-display/image/index.js.map +1 -0
- package/dist/components/data-display/image/use-image-state.cjs +54 -0
- package/dist/components/data-display/image/use-image-state.cjs.map +1 -0
- package/dist/components/data-display/image/use-image-state.js +54 -0
- package/dist/components/data-display/image/use-image-state.js.map +1 -0
- package/dist/components/data-display/paper/index.cjs +16 -0
- package/dist/components/data-display/paper/index.cjs.map +1 -0
- package/dist/components/data-display/paper/index.d.cts +8 -0
- package/dist/components/data-display/paper/index.d.ts +8 -0
- package/dist/components/data-display/paper/index.js +16 -0
- package/dist/components/data-display/paper/index.js.map +1 -0
- package/dist/components/data-display/paper/paper.css +40 -0
- package/dist/components/data-display/progress/circular-progress.cjs +75 -0
- package/dist/components/data-display/progress/circular-progress.cjs.map +1 -0
- package/dist/components/data-display/progress/circular-progress.css +21 -0
- package/dist/components/data-display/progress/circular-progress.d.cts +9 -0
- package/dist/components/data-display/progress/circular-progress.d.ts +9 -0
- package/dist/components/data-display/progress/circular-progress.js +75 -0
- package/dist/components/data-display/progress/circular-progress.js.map +1 -0
- package/dist/components/data-display/progress/linear-progress.cjs +32 -0
- package/dist/components/data-display/progress/linear-progress.cjs.map +1 -0
- package/dist/components/data-display/progress/linear-progress.css +39 -0
- package/dist/components/data-display/progress/linear-progress.d.cts +5 -0
- package/dist/components/data-display/progress/linear-progress.d.ts +5 -0
- package/dist/components/data-display/progress/linear-progress.js +32 -0
- package/dist/components/data-display/progress/linear-progress.js.map +1 -0
- package/dist/components/data-display/progress/types.d.cts +5 -0
- package/dist/components/data-display/progress/types.d.ts +5 -0
- package/dist/components/data-display/progress/utils.cjs +16 -0
- package/dist/components/data-display/progress/utils.cjs.map +1 -0
- package/dist/components/data-display/progress/utils.js +15 -0
- package/dist/components/data-display/progress/utils.js.map +1 -0
- package/dist/components/data-display/skeleton/index.cjs +18 -0
- package/dist/components/data-display/skeleton/index.cjs.map +1 -0
- package/dist/components/data-display/skeleton/index.d.cts +10 -0
- package/dist/components/data-display/skeleton/index.d.ts +10 -0
- package/dist/components/data-display/skeleton/index.js +18 -0
- package/dist/components/data-display/skeleton/index.js.map +1 -0
- package/dist/components/data-display/skeleton/skeleton.css +47 -0
- package/dist/components/editors/text-editor/editor.cjs +620 -0
- package/dist/components/editors/text-editor/editor.cjs.map +1 -0
- package/dist/components/editors/text-editor/editor.d.cts +1 -0
- package/dist/components/editors/text-editor/editor.d.ts +1 -0
- package/dist/components/editors/text-editor/editor.js +620 -0
- package/dist/components/editors/text-editor/editor.js.map +1 -0
- package/dist/components/editors/text-editor/index.cjs +39 -0
- package/dist/components/editors/text-editor/index.cjs.map +1 -0
- package/dist/components/editors/text-editor/index.d.cts +13 -0
- package/dist/components/editors/text-editor/index.d.ts +13 -0
- package/dist/components/editors/text-editor/index.js +38 -0
- package/dist/components/editors/text-editor/index.js.map +1 -0
- package/dist/components/editors/text-editor/text-document.cjs +406 -0
- package/dist/components/editors/text-editor/text-document.cjs.map +1 -0
- package/dist/components/editors/text-editor/text-document.js +391 -0
- package/dist/components/editors/text-editor/text-document.js.map +1 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.cjs +251 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.cjs.map +1 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.css +16 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.d.cts +7 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.d.ts +7 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.js +251 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.js.map +1 -0
- package/dist/components/editors/text-editor/text-editor.css +116 -0
- package/dist/components/editors/text-editor/text-editor.types.d.cts +37 -0
- package/dist/components/editors/text-editor/text-editor.types.d.ts +37 -0
- package/dist/components/editors/text-editor/text-parser.cjs +262 -0
- package/dist/components/editors/text-editor/text-parser.cjs.map +1 -0
- package/dist/components/editors/text-editor/text-parser.js +261 -0
- package/dist/components/editors/text-editor/text-parser.js.map +1 -0
- package/dist/components/editors/text-editor/text-renderer.cjs +85 -0
- package/dist/components/editors/text-editor/text-renderer.cjs.map +1 -0
- package/dist/components/editors/text-editor/text-renderer.d.cts +7 -0
- package/dist/components/editors/text-editor/text-renderer.d.ts +7 -0
- package/dist/components/editors/text-editor/text-renderer.js +85 -0
- package/dist/components/editors/text-editor/text-renderer.js.map +1 -0
- package/dist/components/forms/autocomplete/autocomplete.css +384 -0
- package/dist/components/forms/autocomplete/autocomplete.types.d.cts +86 -0
- package/dist/components/forms/autocomplete/autocomplete.types.d.ts +86 -0
- package/dist/components/forms/autocomplete/autocomplete.utils.cjs +47 -0
- package/dist/components/forms/autocomplete/autocomplete.utils.cjs.map +1 -0
- package/dist/components/forms/autocomplete/autocomplete.utils.js +44 -0
- package/dist/components/forms/autocomplete/autocomplete.utils.js.map +1 -0
- package/dist/components/forms/autocomplete/index.cjs +532 -0
- package/dist/components/forms/autocomplete/index.cjs.map +1 -0
- package/dist/components/forms/autocomplete/index.d.cts +3 -0
- package/dist/components/forms/autocomplete/index.d.ts +3 -0
- package/dist/components/forms/autocomplete/index.js +532 -0
- package/dist/components/forms/autocomplete/index.js.map +1 -0
- package/dist/components/forms/checkbox/checkbox.css +146 -0
- package/dist/components/forms/checkbox/index.cjs +80 -0
- package/dist/components/forms/checkbox/index.cjs.map +1 -0
- package/dist/components/forms/checkbox/index.d.cts +20 -0
- package/dist/components/forms/checkbox/index.d.ts +20 -0
- package/dist/components/forms/checkbox/index.js +80 -0
- package/dist/components/forms/checkbox/index.js.map +1 -0
- package/dist/components/forms/date-picker/date-picker.css +478 -0
- package/dist/components/forms/date-picker/date-picker.types.d.cts +75 -0
- package/dist/components/forms/date-picker/date-picker.types.d.ts +75 -0
- package/dist/components/forms/date-picker/date-picker.utils.cjs +76 -0
- package/dist/components/forms/date-picker/date-picker.utils.cjs.map +1 -0
- package/dist/components/forms/date-picker/date-picker.utils.js +64 -0
- package/dist/components/forms/date-picker/date-picker.utils.js.map +1 -0
- package/dist/components/forms/date-picker/index.cjs +572 -0
- package/dist/components/forms/date-picker/index.cjs.map +1 -0
- package/dist/components/forms/date-picker/index.d.cts +3 -0
- package/dist/components/forms/date-picker/index.d.ts +3 -0
- package/dist/components/forms/date-picker/index.js +572 -0
- package/dist/components/forms/date-picker/index.js.map +1 -0
- package/dist/components/forms/file-upload/file-upload.css +290 -0
- package/dist/components/forms/file-upload/file-upload.types.d.cts +51 -0
- package/dist/components/forms/file-upload/file-upload.types.d.ts +51 -0
- package/dist/components/forms/file-upload/file-upload.utils.cjs +76 -0
- package/dist/components/forms/file-upload/file-upload.utils.cjs.map +1 -0
- package/dist/components/forms/file-upload/file-upload.utils.js +72 -0
- package/dist/components/forms/file-upload/file-upload.utils.js.map +1 -0
- package/dist/components/forms/file-upload/index.cjs +346 -0
- package/dist/components/forms/file-upload/index.cjs.map +1 -0
- package/dist/components/forms/file-upload/index.d.cts +3 -0
- package/dist/components/forms/file-upload/index.d.ts +3 -0
- package/dist/components/forms/file-upload/index.js +346 -0
- package/dist/components/forms/file-upload/index.js.map +1 -0
- package/dist/components/forms/form-field/form-field-state.cjs +25 -0
- package/dist/components/forms/form-field/form-field-state.cjs.map +1 -0
- package/dist/components/forms/form-field/form-field-state.js +25 -0
- package/dist/components/forms/form-field/form-field-state.js.map +1 -0
- package/dist/components/forms/form-field/form-field.css +44 -0
- package/dist/components/forms/form-field/index.cjs +61 -0
- package/dist/components/forms/form-field/index.cjs.map +1 -0
- package/dist/components/forms/form-field/index.d.cts +23 -0
- package/dist/components/forms/form-field/index.d.ts +23 -0
- package/dist/components/forms/form-field/index.js +61 -0
- package/dist/components/forms/form-field/index.js.map +1 -0
- package/dist/components/forms/input/index.d.cts +4 -0
- package/dist/components/forms/input/index.d.ts +4 -0
- package/dist/components/forms/input/input.css +153 -0
- package/dist/components/forms/input/number-input.cjs +192 -0
- package/dist/components/forms/input/number-input.cjs.map +1 -0
- package/dist/components/forms/input/number-input.d.cts +20 -0
- package/dist/components/forms/input/number-input.d.ts +20 -0
- package/dist/components/forms/input/number-input.js +192 -0
- package/dist/components/forms/input/number-input.js.map +1 -0
- package/dist/components/forms/input/text-area-input.cjs +47 -0
- package/dist/components/forms/input/text-area-input.cjs.map +1 -0
- package/dist/components/forms/input/text-area-input.d.cts +8 -0
- package/dist/components/forms/input/text-area-input.d.ts +8 -0
- package/dist/components/forms/input/text-area-input.js +47 -0
- package/dist/components/forms/input/text-area-input.js.map +1 -0
- package/dist/components/forms/input/text-input.cjs +47 -0
- package/dist/components/forms/input/text-input.cjs.map +1 -0
- package/dist/components/forms/input/text-input.d.cts +9 -0
- package/dist/components/forms/input/text-input.d.ts +9 -0
- package/dist/components/forms/input/text-input.js +47 -0
- package/dist/components/forms/input/text-input.js.map +1 -0
- package/dist/components/forms/label/index.cjs +26 -0
- package/dist/components/forms/label/index.cjs.map +1 -0
- package/dist/components/forms/label/index.d.cts +8 -0
- package/dist/components/forms/label/index.d.ts +8 -0
- package/dist/components/forms/label/index.js +26 -0
- package/dist/components/forms/label/index.js.map +1 -0
- package/dist/components/forms/label/label.css +22 -0
- package/dist/components/forms/radio-group/index.cjs +226 -0
- package/dist/components/forms/radio-group/index.cjs.map +1 -0
- package/dist/components/forms/radio-group/index.d.cts +5 -0
- package/dist/components/forms/radio-group/index.d.ts +5 -0
- package/dist/components/forms/radio-group/index.js +225 -0
- package/dist/components/forms/radio-group/index.js.map +1 -0
- package/dist/components/forms/radio-group/radio-group.css +222 -0
- package/dist/components/forms/radio-group/radio-group.types.d.cts +51 -0
- package/dist/components/forms/radio-group/radio-group.types.d.ts +51 -0
- package/dist/components/forms/radio-group/radio-group.utils.cjs +22 -0
- package/dist/components/forms/radio-group/radio-group.utils.cjs.map +1 -0
- package/dist/components/forms/radio-group/radio-group.utils.js +21 -0
- package/dist/components/forms/radio-group/radio-group.utils.js.map +1 -0
- package/dist/components/forms/select/index.cjs +468 -0
- package/dist/components/forms/select/index.cjs.map +1 -0
- package/dist/components/forms/select/index.d.cts +112 -0
- package/dist/components/forms/select/index.d.ts +112 -0
- package/dist/components/forms/select/index.js +468 -0
- package/dist/components/forms/select/index.js.map +1 -0
- package/dist/components/forms/select/select.css +363 -0
- package/dist/components/forms/slider/index.cjs +93 -0
- package/dist/components/forms/slider/index.cjs.map +1 -0
- package/dist/components/forms/slider/index.d.cts +37 -0
- package/dist/components/forms/slider/index.d.ts +37 -0
- package/dist/components/forms/slider/index.js +93 -0
- package/dist/components/forms/slider/index.js.map +1 -0
- package/dist/components/forms/slider/slider.css +202 -0
- package/dist/components/forms/stepper/index.cjs +113 -0
- package/dist/components/forms/stepper/index.cjs.map +1 -0
- package/dist/components/forms/stepper/index.d.cts +48 -0
- package/dist/components/forms/stepper/index.d.ts +48 -0
- package/dist/components/forms/stepper/index.js +113 -0
- package/dist/components/forms/stepper/index.js.map +1 -0
- package/dist/components/forms/stepper/stepper.css +241 -0
- package/dist/components/forms/switch/index.cjs +45 -0
- package/dist/components/forms/switch/index.cjs.map +1 -0
- package/dist/components/forms/switch/index.d.cts +11 -0
- package/dist/components/forms/switch/index.d.ts +11 -0
- package/dist/components/forms/switch/index.js +45 -0
- package/dist/components/forms/switch/index.js.map +1 -0
- package/dist/components/forms/switch/switch.css +142 -0
- package/dist/components/layout/app-bar/app-bar.css +197 -0
- package/dist/components/layout/app-bar/index.cjs +150 -0
- package/dist/components/layout/app-bar/index.cjs.map +1 -0
- package/dist/components/layout/app-bar/index.d.cts +21 -0
- package/dist/components/layout/app-bar/index.d.ts +21 -0
- package/dist/components/layout/app-bar/index.js +150 -0
- package/dist/components/layout/app-bar/index.js.map +1 -0
- package/dist/components/layout/background/background.css +160 -0
- package/dist/components/layout/background/index.cjs +34 -0
- package/dist/components/layout/background/index.cjs.map +1 -0
- package/dist/components/layout/background/index.d.cts +23 -0
- package/dist/components/layout/background/index.d.ts +23 -0
- package/dist/components/layout/background/index.js +34 -0
- package/dist/components/layout/background/index.js.map +1 -0
- package/dist/components/layout/bottom-navigation/bottom-navigation.css +108 -0
- package/dist/components/layout/bottom-navigation/index.cjs +51 -0
- package/dist/components/layout/bottom-navigation/index.cjs.map +1 -0
- package/dist/components/layout/bottom-navigation/index.d.cts +19 -0
- package/dist/components/layout/bottom-navigation/index.d.ts +19 -0
- package/dist/components/layout/bottom-navigation/index.js +50 -0
- package/dist/components/layout/bottom-navigation/index.js.map +1 -0
- package/dist/components/layout/breadcrumbs/breadcrumbs.css +80 -0
- package/dist/components/layout/breadcrumbs/index.cjs +38 -0
- package/dist/components/layout/breadcrumbs/index.cjs.map +1 -0
- package/dist/components/layout/breadcrumbs/index.d.cts +18 -0
- package/dist/components/layout/breadcrumbs/index.d.ts +18 -0
- package/dist/components/layout/breadcrumbs/index.js +38 -0
- package/dist/components/layout/breadcrumbs/index.js.map +1 -0
- package/dist/components/layout/collapsable-sidebar/collapsable-sidebar.css +240 -0
- package/dist/components/layout/collapsable-sidebar/index.cjs +107 -0
- package/dist/components/layout/collapsable-sidebar/index.cjs.map +1 -0
- package/dist/components/layout/collapsable-sidebar/index.d.cts +35 -0
- package/dist/components/layout/collapsable-sidebar/index.d.ts +35 -0
- package/dist/components/layout/collapsable-sidebar/index.js +107 -0
- package/dist/components/layout/collapsable-sidebar/index.js.map +1 -0
- package/dist/components/layout/container/container.css +24 -0
- package/dist/components/layout/container/container.utils.cjs +11 -0
- package/dist/components/layout/container/container.utils.cjs.map +1 -0
- package/dist/components/layout/container/container.utils.d.cts +1 -0
- package/dist/components/layout/container/container.utils.d.ts +1 -0
- package/dist/components/layout/container/container.utils.js +11 -0
- package/dist/components/layout/container/container.utils.js.map +1 -0
- package/dist/components/layout/container/index.cjs +17 -0
- package/dist/components/layout/container/index.cjs.map +1 -0
- package/dist/components/layout/container/index.d.cts +11 -0
- package/dist/components/layout/container/index.d.ts +11 -0
- package/dist/components/layout/container/index.js +17 -0
- package/dist/components/layout/container/index.js.map +1 -0
- package/dist/components/layout/page-layout/index.cjs +80 -0
- package/dist/components/layout/page-layout/index.cjs.map +1 -0
- package/dist/components/layout/page-layout/index.d.cts +61 -0
- package/dist/components/layout/page-layout/index.d.ts +61 -0
- package/dist/components/layout/page-layout/index.js +80 -0
- package/dist/components/layout/page-layout/index.js.map +1 -0
- package/dist/components/layout/page-layout/page-layout.css +88 -0
- package/dist/components/layout/resizable-panels/index.cjs +226 -0
- package/dist/components/layout/resizable-panels/index.cjs.map +1 -0
- package/dist/components/layout/resizable-panels/index.d.cts +59 -0
- package/dist/components/layout/resizable-panels/index.d.ts +59 -0
- package/dist/components/layout/resizable-panels/index.js +224 -0
- package/dist/components/layout/resizable-panels/index.js.map +1 -0
- package/dist/components/layout/resizable-panels/resizable-panels.css +121 -0
- package/dist/components/layout/resizable-panels/resizable-panels.utils.cjs +107 -0
- package/dist/components/layout/resizable-panels/resizable-panels.utils.cjs.map +1 -0
- package/dist/components/layout/resizable-panels/resizable-panels.utils.js +105 -0
- package/dist/components/layout/resizable-panels/resizable-panels.utils.js.map +1 -0
- package/dist/components/layout/section/index.cjs +15 -0
- package/dist/components/layout/section/index.cjs.map +1 -0
- package/dist/components/layout/section/index.d.cts +2 -0
- package/dist/components/layout/section/index.d.ts +2 -0
- package/dist/components/layout/section/index.js +15 -0
- package/dist/components/layout/section/index.js.map +1 -0
- package/dist/components/layout/section/section.css +71 -0
- package/dist/components/layout/section/types.d.cts +13 -0
- package/dist/components/layout/section/types.d.ts +13 -0
- package/dist/components/layout/section-stack/index.cjs +29 -0
- package/dist/components/layout/section-stack/index.cjs.map +1 -0
- package/dist/components/layout/section-stack/index.d.cts +8 -0
- package/dist/components/layout/section-stack/index.d.ts +8 -0
- package/dist/components/layout/section-stack/index.js +29 -0
- package/dist/components/layout/section-stack/index.js.map +1 -0
- package/dist/components/layout/sidebar/index.cjs +16 -0
- package/dist/components/layout/sidebar/index.cjs.map +1 -0
- package/dist/components/layout/sidebar/index.d.cts +7 -0
- package/dist/components/layout/sidebar/index.d.ts +7 -0
- package/dist/components/layout/sidebar/index.js +16 -0
- package/dist/components/layout/sidebar/index.js.map +1 -0
- package/dist/components/layout/sidebar/sidebar.css +21 -0
- package/dist/components/layout/stack/index.cjs +30 -0
- package/dist/components/layout/stack/index.cjs.map +1 -0
- package/dist/components/layout/stack/index.d.cts +31 -0
- package/dist/components/layout/stack/index.d.ts +31 -0
- package/dist/components/layout/stack/index.js +30 -0
- package/dist/components/layout/stack/index.js.map +1 -0
- package/dist/components/layout/stack/stack.css +303 -0
- package/dist/components/navigation/accordion/accordion.css +97 -0
- package/dist/components/navigation/accordion/index.cjs +107 -0
- package/dist/components/navigation/accordion/index.cjs.map +1 -0
- package/dist/components/navigation/accordion/index.d.cts +48 -0
- package/dist/components/navigation/accordion/index.d.ts +48 -0
- package/dist/components/navigation/accordion/index.js +107 -0
- package/dist/components/navigation/accordion/index.js.map +1 -0
- package/dist/components/navigation/carousel/carousel.css +283 -0
- package/dist/components/navigation/carousel/controller.cjs +46 -0
- package/dist/components/navigation/carousel/controller.cjs.map +1 -0
- package/dist/components/navigation/carousel/controller.d.cts +16 -0
- package/dist/components/navigation/carousel/controller.d.ts +16 -0
- package/dist/components/navigation/carousel/controller.js +45 -0
- package/dist/components/navigation/carousel/controller.js.map +1 -0
- package/dist/components/navigation/carousel/index.cjs +494 -0
- package/dist/components/navigation/carousel/index.cjs.map +1 -0
- package/dist/components/navigation/carousel/index.d.cts +27 -0
- package/dist/components/navigation/carousel/index.d.ts +27 -0
- package/dist/components/navigation/carousel/index.js +494 -0
- package/dist/components/navigation/carousel/index.js.map +1 -0
- package/dist/components/navigation/link/index.cjs +40 -0
- package/dist/components/navigation/link/index.cjs.map +1 -0
- package/dist/components/navigation/link/index.d.cts +3 -0
- package/dist/components/navigation/link/index.d.ts +3 -0
- package/dist/components/navigation/link/index.js +40 -0
- package/dist/components/navigation/link/index.js.map +1 -0
- package/dist/components/navigation/link/link.css +31 -0
- package/dist/components/navigation/link/types.d.cts +12 -0
- package/dist/components/navigation/link/types.d.ts +12 -0
- package/dist/components/navigation/tabs/index.cjs +111 -0
- package/dist/components/navigation/tabs/index.cjs.map +1 -0
- package/dist/components/navigation/tabs/index.d.cts +30 -0
- package/dist/components/navigation/tabs/index.d.ts +30 -0
- package/dist/components/navigation/tabs/index.js +110 -0
- package/dist/components/navigation/tabs/index.js.map +1 -0
- package/dist/components/navigation/tabs/tabs.css +216 -0
- package/dist/components/navigation/tree-view/index.cjs +455 -0
- package/dist/components/navigation/tree-view/index.cjs.map +1 -0
- package/dist/components/navigation/tree-view/index.d.cts +96 -0
- package/dist/components/navigation/tree-view/index.d.ts +96 -0
- package/dist/components/navigation/tree-view/index.js +455 -0
- package/dist/components/navigation/tree-view/index.js.map +1 -0
- package/dist/components/navigation/tree-view/tree-view.css +258 -0
- package/dist/components/overlays/backdrop/backdrop.css +10 -0
- package/dist/components/overlays/backdrop/index.cjs +70 -0
- package/dist/components/overlays/backdrop/index.cjs.map +1 -0
- package/dist/components/overlays/backdrop/index.d.cts +12 -0
- package/dist/components/overlays/backdrop/index.d.ts +12 -0
- package/dist/components/overlays/backdrop/index.js +70 -0
- package/dist/components/overlays/backdrop/index.js.map +1 -0
- package/dist/components/overlays/command/command.css +154 -0
- package/dist/components/overlays/command/command.types.d.cts +36 -0
- package/dist/components/overlays/command/command.types.d.ts +36 -0
- package/dist/components/overlays/command/command.utils.cjs +39 -0
- package/dist/components/overlays/command/command.utils.cjs.map +1 -0
- package/dist/components/overlays/command/command.utils.js +35 -0
- package/dist/components/overlays/command/command.utils.js.map +1 -0
- package/dist/components/overlays/command/index.cjs +274 -0
- package/dist/components/overlays/command/index.cjs.map +1 -0
- package/dist/components/overlays/command/index.d.cts +4 -0
- package/dist/components/overlays/command/index.d.ts +4 -0
- package/dist/components/overlays/command/index.js +273 -0
- package/dist/components/overlays/command/index.js.map +1 -0
- package/dist/components/overlays/dialog/dialog.css +121 -0
- package/dist/components/overlays/dialog/index.cjs +80 -0
- package/dist/components/overlays/dialog/index.cjs.map +1 -0
- package/dist/components/overlays/dialog/index.d.cts +35 -0
- package/dist/components/overlays/dialog/index.d.ts +35 -0
- package/dist/components/overlays/dialog/index.js +80 -0
- package/dist/components/overlays/dialog/index.js.map +1 -0
- package/dist/components/overlays/drawer/drawer.css +133 -0
- package/dist/components/overlays/drawer/index.cjs +90 -0
- package/dist/components/overlays/drawer/index.cjs.map +1 -0
- package/dist/components/overlays/drawer/index.d.cts +11 -0
- package/dist/components/overlays/drawer/index.d.ts +11 -0
- package/dist/components/overlays/drawer/index.js +90 -0
- package/dist/components/overlays/drawer/index.js.map +1 -0
- package/dist/components/overlays/drawer/use-resize-bar.cjs +152 -0
- package/dist/components/overlays/drawer/use-resize-bar.cjs.map +1 -0
- package/dist/components/overlays/drawer/use-resize-bar.js +152 -0
- package/dist/components/overlays/drawer/use-resize-bar.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.cjs +132 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.d.cts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.d.ts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.js +132 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.cjs +136 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.d.cts +7 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.d.ts +7 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.js +132 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.cjs +76 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.d.cts +4 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.d.ts +4 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.js +75 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.cjs +96 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.d.cts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.d.ts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.js +96 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.cjs +111 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.context.cjs +21 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.context.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.context.js +18 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.context.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.css +127 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.d.cts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.d.ts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.js +111 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.types.d.cts +66 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.types.d.ts +66 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.cjs +44 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.js +39 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/index.cjs +31 -0
- package/dist/components/overlays/dropdown-menu/index.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/index.d.cts +19 -0
- package/dist/components/overlays/dropdown-menu/index.d.ts +19 -0
- package/dist/components/overlays/dropdown-menu/index.js +22 -0
- package/dist/components/overlays/dropdown-menu/index.js.map +1 -0
- package/dist/components/overlays/floating-position/calculate-position.cjs +94 -0
- package/dist/components/overlays/floating-position/calculate-position.cjs.map +1 -0
- package/dist/components/overlays/floating-position/calculate-position.js +89 -0
- package/dist/components/overlays/floating-position/calculate-position.js.map +1 -0
- package/dist/components/overlays/floating-position/use-floating-position.cjs +89 -0
- package/dist/components/overlays/floating-position/use-floating-position.cjs.map +1 -0
- package/dist/components/overlays/floating-position/use-floating-position.js +89 -0
- package/dist/components/overlays/floating-position/use-floating-position.js.map +1 -0
- package/dist/components/overlays/notification/index.cjs +142 -0
- package/dist/components/overlays/notification/index.cjs.map +1 -0
- package/dist/components/overlays/notification/index.d.cts +16 -0
- package/dist/components/overlays/notification/index.d.ts +16 -0
- package/dist/components/overlays/notification/index.js +139 -0
- package/dist/components/overlays/notification/index.js.map +1 -0
- package/dist/components/overlays/notification/notification-provider.cjs +69 -0
- package/dist/components/overlays/notification/notification-provider.cjs.map +1 -0
- package/dist/components/overlays/notification/notification-provider.d.cts +3 -0
- package/dist/components/overlays/notification/notification-provider.d.ts +3 -0
- package/dist/components/overlays/notification/notification-provider.js +68 -0
- package/dist/components/overlays/notification/notification-provider.js.map +1 -0
- package/dist/components/overlays/notification/notification.css +172 -0
- package/dist/components/overlays/notification/notification.types.d.cts +41 -0
- package/dist/components/overlays/notification/notification.types.d.ts +41 -0
- package/dist/components/overlays/notification/notification.utils.cjs +23 -0
- package/dist/components/overlays/notification/notification.utils.cjs.map +1 -0
- package/dist/components/overlays/notification/notification.utils.js +22 -0
- package/dist/components/overlays/notification/notification.utils.js.map +1 -0
- package/dist/components/overlays/notification/use-notification.cjs +12 -0
- package/dist/components/overlays/notification/use-notification.cjs.map +1 -0
- package/dist/components/overlays/notification/use-notification.d.cts +3 -0
- package/dist/components/overlays/notification/use-notification.d.ts +3 -0
- package/dist/components/overlays/notification/use-notification.js +12 -0
- package/dist/components/overlays/notification/use-notification.js.map +1 -0
- package/dist/components/overlays/overlay-stack/index.cjs +195 -0
- package/dist/components/overlays/overlay-stack/index.cjs.map +1 -0
- package/dist/components/overlays/overlay-stack/index.js +193 -0
- package/dist/components/overlays/overlay-stack/index.js.map +1 -0
- package/dist/components/overlays/popout/index.cjs +196 -0
- package/dist/components/overlays/popout/index.cjs.map +1 -0
- package/dist/components/overlays/popout/index.d.cts +26 -0
- package/dist/components/overlays/popout/index.d.ts +26 -0
- package/dist/components/overlays/popout/index.js +195 -0
- package/dist/components/overlays/popout/index.js.map +1 -0
- package/dist/components/overlays/popout/popout.css +15 -0
- package/dist/components/overlays/popover/index.cjs +163 -0
- package/dist/components/overlays/popover/index.cjs.map +1 -0
- package/dist/components/overlays/popover/index.d.cts +28 -0
- package/dist/components/overlays/popover/index.d.ts +28 -0
- package/dist/components/overlays/popover/index.js +163 -0
- package/dist/components/overlays/popover/index.js.map +1 -0
- package/dist/components/overlays/popover/popover.css +56 -0
- package/dist/components/overlays/portal/index.cjs +33 -0
- package/dist/components/overlays/portal/index.cjs.map +1 -0
- package/dist/components/overlays/portal/index.d.cts +15 -0
- package/dist/components/overlays/portal/index.d.ts +15 -0
- package/dist/components/overlays/portal/index.js +33 -0
- package/dist/components/overlays/portal/index.js.map +1 -0
- package/dist/components/overlays/portal/target.cjs +17 -0
- package/dist/components/overlays/portal/target.cjs.map +1 -0
- package/dist/components/overlays/portal/target.css +3 -0
- package/dist/components/overlays/portal/target.d.cts +7 -0
- package/dist/components/overlays/portal/target.d.ts +7 -0
- package/dist/components/overlays/portal/target.js +17 -0
- package/dist/components/overlays/portal/target.js.map +1 -0
- package/dist/components/overlays/tooltip/index.cjs +71 -0
- package/dist/components/overlays/tooltip/index.cjs.map +1 -0
- package/dist/components/overlays/tooltip/index.d.cts +24 -0
- package/dist/components/overlays/tooltip/index.d.ts +24 -0
- package/dist/components/overlays/tooltip/index.js +71 -0
- package/dist/components/overlays/tooltip/index.js.map +1 -0
- package/dist/components/overlays/tooltip/tooltip.css +67 -0
- package/dist/components/typography/heading.cjs +14 -0
- package/dist/components/typography/heading.cjs.map +1 -0
- package/dist/components/typography/heading.d.cts +11 -0
- package/dist/components/typography/heading.d.ts +11 -0
- package/dist/components/typography/heading.js +14 -0
- package/dist/components/typography/heading.js.map +1 -0
- package/dist/components/typography/text.cjs +14 -0
- package/dist/components/typography/text.cjs.map +1 -0
- package/dist/components/typography/text.d.cts +12 -0
- package/dist/components/typography/text.d.ts +12 -0
- package/dist/components/typography/text.js +14 -0
- package/dist/components/typography/text.js.map +1 -0
- package/dist/components/utilities/preview/highlight.cjs +79 -0
- package/dist/components/utilities/preview/highlight.cjs.map +1 -0
- package/dist/components/utilities/preview/highlight.js +79 -0
- package/dist/components/utilities/preview/highlight.js.map +1 -0
- package/dist/components/utilities/preview/index.cjs +391 -0
- package/dist/components/utilities/preview/index.cjs.map +1 -0
- package/dist/components/utilities/preview/index.d.cts +20 -0
- package/dist/components/utilities/preview/index.d.ts +20 -0
- package/dist/components/utilities/preview/index.js +391 -0
- package/dist/components/utilities/preview/index.js.map +1 -0
- package/dist/components/utilities/preview/preview.css +268 -0
- package/dist/components/utilities/scroll-lock/index.cjs +124 -0
- package/dist/components/utilities/scroll-lock/index.cjs.map +1 -0
- package/dist/components/utilities/scroll-lock/index.d.cts +6 -0
- package/dist/components/utilities/scroll-lock/index.d.ts +6 -0
- package/dist/components/utilities/scroll-lock/index.js +124 -0
- package/dist/components/utilities/scroll-lock/index.js.map +1 -0
- package/dist/components/utilities/transition/index.cjs +171 -0
- package/dist/components/utilities/transition/index.cjs.map +1 -0
- package/dist/components/utilities/transition/index.d.cts +27 -0
- package/dist/components/utilities/transition/index.d.ts +27 -0
- package/dist/components/utilities/transition/index.js +171 -0
- package/dist/components/utilities/transition/index.js.map +1 -0
- package/dist/components/utilities/transition/transition.css +130 -0
- package/dist/index.cjs +159 -0
- package/dist/index.d.cts +86 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.js +70 -0
- package/package.json +65 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","names":[],"sources":["../../../../src/components/editors/text-editor/editor.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { ClipboardEvent, FormEvent, KeyboardEvent } from \"react\";\nimport { cn } from \"@puzzle-ui/core\";\nimport {\n applyMark,\n createTextDocument,\n createTextSelection,\n getOrderedSelection,\n insertDocumentAtSelection,\n insertTextAtSelection,\n isCollapsedSelection,\n normalizeTextDocument,\n setTextVariant,\n setTextAlign,\n setListType,\n getListType,\n getTextAlign,\n} from \"./text-document\";\nimport { parseHtmlToDocument, parseMarkdownToDocument } from \"./text-parser\";\nimport type {\n TextBlockVariant,\n TextDocument,\n TextMark,\n TextPoint,\n TextSelection,\n TextAlign,\n TextListType,\n} from \"./text-editor.types\";\nimport \"./text-editor.css\";\n\ntype TextEditorHandle = {\n focus: () => void;\n getDocument: () => TextDocument;\n getSelection: () => TextSelection;\n getActiveMarks: () => TextMark[];\n isActive: (mark: TextMark) => boolean;\n getActiveTextVariant: () => TextBlockVariant | null;\n isTextVariantActive: (variant: TextBlockVariant) => boolean;\n toggleMark: (mark: TextMark) => void;\n setTextVariant: (variant: TextBlockVariant) => void;\n setTextAlign: (align: TextAlign) => void;\n isTextAlignActive: (align: TextAlign) => boolean;\n setListType: (listType: TextListType | null) => void;\n isListTypeActive: (listType: TextListType) => boolean;\n insertText: (text: string) => void;\n replaceSelection: (document: TextDocument) => void;\n undo: () => void;\n redo: () => void;\n canUndo: () => boolean;\n canRedo: () => boolean;\n};\n\ntype EditorProps = {\n /** Controlled document. Use the same object emitted by onChange when updating it. */\n value?: TextDocument;\n /** Initial document for uncontrolled use. */\n defaultValue?: TextDocument;\n onChange?: (document: TextDocument) => void;\n onSelectionChange?: (selection: TextSelection) => void;\n onActiveMarksChange?: (marks: TextMark[]) => void;\n onActiveTextVariantChange?: (variant: TextBlockVariant | null) => void;\n placeholder?: string;\n className?: string;\n readOnly?: boolean;\n autoFocus?: boolean;\n \"aria-label\"?: string;\n};\n\ntype HistoryEntry = {\n document: TextDocument;\n selection: TextSelection;\n};\n\ntype HistoryState = {\n undo: HistoryEntry[];\n redo: HistoryEntry[];\n lastInputType: string;\n lastInputAt: number;\n};\n\ntype DomPoint = {\n node: Node;\n offset: number;\n};\n\nconst isInside = (root: HTMLElement, node: Node | null): node is Node =>\n node != null && (node === root || root.contains(node));\n\nconst nodeTextLength = (node: Node): number => {\n if (node.nodeType === Node.TEXT_NODE) return node.textContent?.length ?? 0;\n if (node instanceof Element && node.tagName.toLowerCase() === \"br\") {\n return node.hasAttribute(\"data-puzzle-placeholder\") ? 0 : 1;\n }\n\n return Array.from(node.childNodes).reduce(\n (total, child) => total + nodeTextLength(child),\n 0,\n );\n};\n\nconst measureBeforePoint = (\n current: Node,\n target: Node,\n targetOffset: number,\n): number | null => {\n if (current === target) {\n if (current.nodeType === Node.TEXT_NODE) {\n return Math.max(\n 0,\n Math.min(targetOffset, current.textContent?.length ?? 0),\n );\n }\n\n return Array.from(current.childNodes)\n .slice(0, targetOffset)\n .reduce((total, child) => total + nodeTextLength(child), 0);\n }\n\n let total = 0;\n for (const child of Array.from(current.childNodes)) {\n if (child === target || child.contains(target)) {\n const nested = measureBeforePoint(child, target, targetOffset);\n return nested == null ? null : total + nested;\n }\n total += nodeTextLength(child);\n }\n\n return null;\n};\n\nconst pointFromDom = (\n root: HTMLElement,\n node: Node,\n offset: number,\n): TextPoint | null => {\n if (!isInside(root, node)) return null;\n\n if (node === root) {\n const blocks = Array.from(root.children) as HTMLElement[];\n if (!blocks.length) return null;\n const blockIndex = Math.max(0, Math.min(offset, blocks.length - 1));\n const blockElement = blocks[blockIndex];\n return {\n block: blockIndex,\n offset: offset >= blocks.length ? nodeTextLength(blockElement) : 0,\n };\n }\n\n const markedBlock =\n node instanceof Element\n ? node.closest<HTMLElement>(\"[data-puzzle-editor-block]\")\n : node.parentElement?.closest<HTMLElement>(\"[data-puzzle-editor-block]\");\n let directChild: Node | null = node;\n while (directChild && directChild.parentNode !== root) {\n directChild = directChild.parentNode;\n }\n const blockElement =\n markedBlock ?? (directChild instanceof HTMLElement ? directChild : null);\n\n if (!blockElement || !root.contains(blockElement)) return null;\n\n const block = Array.from(root.children).indexOf(blockElement);\n if (block < 0) return null;\n\n const measured = measureBeforePoint(blockElement, node, offset);\n const contentLength = nodeTextLength(blockElement);\n return {\n block,\n offset: Math.max(0, Math.min(measured ?? 0, contentLength)),\n };\n};\n\nconst selectionFromDom = (root: HTMLElement): TextSelection | null => {\n const selection = root.ownerDocument.defaultView?.getSelection();\n if (!selection?.anchorNode || !selection.focusNode) return null;\n if (\n !root.contains(selection.anchorNode) ||\n !root.contains(selection.focusNode)\n ) {\n return null;\n }\n\n const anchor = pointFromDom(\n root,\n selection.anchorNode,\n selection.anchorOffset,\n );\n const focus = pointFromDom(root, selection.focusNode, selection.focusOffset);\n return anchor && focus ? { anchor, focus } : null;\n};\n\nconst collectDomPoints = (\n root: HTMLElement,\n): {\n points: Array<{\n start: number;\n length: number;\n node: Node;\n kind: \"text\" | \"break\";\n }>;\n length: number;\n} => {\n const points: Array<{\n start: number;\n length: number;\n node: Node;\n kind: \"text\" | \"break\";\n }> = [];\n let length = 0;\n\n const visit = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const nodeLength = node.textContent?.length ?? 0;\n if (nodeLength) {\n points.push({ start: length, length: nodeLength, node, kind: \"text\" });\n length += nodeLength;\n }\n return;\n }\n\n if (node instanceof Element && node.tagName.toLowerCase() === \"br\") {\n if (!node.hasAttribute(\"data-puzzle-placeholder\")) {\n points.push({ start: length, length: 1, node, kind: \"break\" });\n length += 1;\n }\n return;\n }\n\n for (const child of Array.from(node.childNodes)) visit(child);\n };\n\n visit(root);\n return { points, length };\n};\n\nconst domPointFromPoint = (\n blockElement: HTMLElement,\n targetOffset: number,\n): DomPoint => {\n const { points, length } = collectDomPoints(blockElement);\n const offset = Math.max(0, Math.min(targetOffset, length));\n\n for (const point of points) {\n const end = point.start + point.length;\n if (point.kind === \"text\" && offset <= end) {\n return {\n node: point.node,\n offset: Math.max(0, Math.min(offset - point.start, point.length)),\n };\n }\n\n if (point.kind === \"break\" && offset <= end) {\n const br = point.node as Element;\n const parent = br.parentNode;\n if (!parent) break;\n const index = Array.prototype.indexOf.call(\n parent.childNodes,\n br,\n ) as number;\n return {\n node: parent,\n offset: index + (offset === end ? 1 : 0),\n };\n }\n }\n\n const last = points[points.length - 1];\n if (last?.kind === \"text\") {\n return { node: last.node, offset: last.length };\n }\n\n return { node: blockElement, offset: blockElement.childNodes.length };\n};\n\nconst setDomSelection = (root: HTMLElement, selection: TextSelection) => {\n const anchorBlock = root.children.item(\n selection.anchor.block,\n ) as HTMLElement | null;\n const focusBlock = root.children.item(\n selection.focus.block,\n ) as HTMLElement | null;\n if (!anchorBlock || !focusBlock) return;\n\n const anchor = domPointFromPoint(anchorBlock, selection.anchor.offset);\n const focus = domPointFromPoint(focusBlock, selection.focus.offset);\n const domSelection = root.ownerDocument.defaultView?.getSelection();\n if (!domSelection) return;\n\n try {\n if (typeof domSelection.setBaseAndExtent === \"function\") {\n domSelection.setBaseAndExtent(\n anchor.node,\n anchor.offset,\n focus.node,\n focus.offset,\n );\n return;\n }\n\n const range = root.ownerDocument.createRange();\n const ordered = getOrderedSelection(selection);\n const startBlock = root.children.item(\n ordered.start.block,\n ) as HTMLElement | null;\n const endBlock = root.children.item(\n ordered.end.block,\n ) as HTMLElement | null;\n if (!startBlock || !endBlock) return;\n const start = domPointFromPoint(startBlock, ordered.start.offset);\n const end = domPointFromPoint(endBlock, ordered.end.offset);\n range.setStart(start.node, start.offset);\n range.setEnd(end.node, end.offset);\n domSelection.removeAllRanges();\n domSelection.addRange(range);\n } catch {\n // The DOM may have changed between render and selection restoration.\n }\n};\n\n/**\n * Render the canonical document into a contenteditable element without making\n * React responsible for its children. Browsers mutate contenteditable DOM while\n * editing (for example, Backspace may remove a placeholder <br> itself). React\n * must therefore not reconcile those descendants as React-owned nodes.\n */\nconst renderDocumentToDom = (root: HTMLElement, textDocument: TextDocument) => {\n const ownerDocument = root.ownerDocument;\n const fragment = ownerDocument.createDocumentFragment();\n\n for (const block of textDocument.content) {\n const blockElement = ownerDocument.createElement(\"p\");\n blockElement.className = `puzzle-text-editor__block puzzle-typography-${block.variant}`;\n blockElement.dataset.puzzleEditorBlock = \"true\";\n blockElement.dataset.puzzleVariant = block.variant;\n if (block.align) {\n blockElement.dataset.puzzleAlign = block.align;\n blockElement.style.textAlign = block.align;\n }\n if (block.listType) blockElement.dataset.puzzleListType = block.listType;\n\n if (!block.children.length) {\n const placeholder = ownerDocument.createElement(\"br\");\n placeholder.dataset.puzzlePlaceholder = \"true\";\n blockElement.appendChild(placeholder);\n } else {\n for (const inline of block.children) {\n const inlineElement = ownerDocument.createElement(\"span\");\n const content = ownerDocument.createDocumentFragment();\n const parts = inline.text.split(\"\\n\");\n\n parts.forEach((part, index) => {\n if (index > 0) content.appendChild(ownerDocument.createElement(\"br\"));\n if (part) content.appendChild(ownerDocument.createTextNode(part));\n });\n\n let node: Node = content;\n for (const mark of [...(inline.marks ?? [])].reverse()) {\n const tagName =\n mark === \"bold\"\n ? \"strong\"\n : mark === \"italic\"\n ? \"em\"\n : mark === \"underline\"\n ? \"u\"\n : \"s\";\n const wrapper = ownerDocument.createElement(tagName);\n wrapper.appendChild(node);\n node = wrapper;\n }\n\n inlineElement.appendChild(node);\n blockElement.appendChild(inlineElement);\n }\n }\n\n fragment.appendChild(blockElement);\n }\n\n root.replaceChildren(fragment);\n};\n\nconst isMark = (value: string): value is TextMark =>\n value === \"bold\" ||\n value === \"italic\" ||\n value === \"underline\" ||\n value === \"strike\";\n\nconst documentsEqual = (left: TextDocument, right: TextDocument): boolean =>\n JSON.stringify(left) === JSON.stringify(right);\n\nconst getMarksForSelection = (\n document: TextDocument,\n selection: TextSelection,\n pendingMarks: TextMark[] = [],\n pendingMarksOverride = false,\n): TextMark[] => {\n if (isCollapsedSelection(selection)) {\n if (pendingMarksOverride) return [...pendingMarks];\n const block = document.content[selection.focus.block];\n if (!block) return [];\n const offset = selection.focus.offset;\n let position = 0;\n let previous: TextMark[] | undefined;\n for (const inline of block.children) {\n const end = position + inline.text.length;\n if (offset > position && offset <= end) return [...(inline.marks ?? [])];\n if (offset === position && previous) return [...previous];\n if (offset < end) return [...(inline.marks ?? [])];\n previous = inline.marks ?? [];\n position = end;\n }\n return [...(previous ?? [])];\n }\n const { start, end } = getOrderedSelection(selection);\n let commonMarks: Set<TextMark> | null = null;\n let foundText = false;\n document.content.forEach((block, blockIndex) => {\n if (blockIndex < start.block || blockIndex > end.block) return;\n const from = blockIndex === start.block ? start.offset : 0;\n const to =\n blockIndex === end.block\n ? end.offset\n : block.children.reduce(\n (total, inline) => total + inline.text.length,\n 0,\n );\n if (to <= from) return;\n let position = 0;\n for (const inline of block.children) {\n const inlineStart = position;\n const inlineEnd = inlineStart + inline.text.length;\n position = inlineEnd;\n if (inlineEnd <= from || inlineStart >= to) continue;\n foundText = true;\n const marks = new Set(inline.marks ?? []);\n commonMarks =\n commonMarks == null\n ? marks\n : new Set([...commonMarks].filter((mark) => marks.has(mark)));\n }\n });\n return foundText && commonMarks ? [...commonMarks] : [];\n};\n\nconst getVariantForSelection = (\n document: TextDocument,\n selection: TextSelection,\n): TextBlockVariant | null => {\n if (!document.content.length) return null;\n const { start, end } = getOrderedSelection(selection);\n const lastBlock = isCollapsedSelection(selection)\n ? start.block\n : end.offset === 0 && end.block > start.block\n ? end.block - 1\n : end.block;\n const variants = document.content\n .slice(start.block, lastBlock + 1)\n .map((block) => block.variant);\n return variants.length && variants.every((variant) => variant === variants[0])\n ? variants[0]\n : null;\n};\n\nconst Editor = forwardRef<TextEditorHandle, EditorProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onSelectionChange,\n onActiveMarksChange,\n onActiveTextVariantChange,\n placeholder,\n className,\n readOnly = false,\n autoFocus = false,\n \"aria-label\": ariaLabel = \"Text editor\",\n },\n forwardedRef,\n ) => {\n const [documentState, setDocumentState] = useState<TextDocument>(() =>\n normalizeTextDocument(value ?? defaultValue ?? createTextDocument()),\n );\n const [selectionState, setSelectionState] = useState<TextSelection>(() =>\n createTextSelection(),\n );\n const editableRef = useRef<HTMLDivElement | null>(null);\n const documentRef = useRef(documentState);\n const selectionRef = useRef(selectionState);\n const restoreSelectionRef = useRef<TextSelection | null>(null);\n // Contenteditable descendants are managed imperatively, never by React.\n // Skip rendering after native input because the browser has already edited\n // the DOM and rebuilding it would disrupt composition/selection.\n const renderDomOnDocumentChangeRef = useRef(true);\n const inputTypeRef = useRef(\"\");\n const selectionBeforeInputRef = useRef<TextSelection>(selectionState);\n const pendingMarksRef = useRef<TextMark[]>([]);\n const pendingMarksOverrideRef = useRef(false);\n const historyRef = useRef<HistoryState>({\n undo: [],\n redo: [],\n lastInputType: \"\",\n lastInputAt: 0,\n });\n\n const updateSelection = useCallback(\n (nextSelection: TextSelection) => {\n selectionRef.current = nextSelection;\n setSelectionState(nextSelection);\n onSelectionChange?.(nextSelection);\n onActiveMarksChange?.(\n getMarksForSelection(\n documentRef.current,\n nextSelection,\n pendingMarksRef.current,\n pendingMarksOverrideRef.current,\n ),\n );\n onActiveTextVariantChange?.(\n getVariantForSelection(documentRef.current, nextSelection),\n );\n },\n [onSelectionChange, onActiveMarksChange, onActiveTextVariantChange],\n );\n\n const restoreSelection = useCallback((nextSelection: TextSelection) => {\n const root = editableRef.current;\n if (!root) return;\n setDomSelection(root, nextSelection);\n }, []);\n\n const focus = useCallback(() => {\n const root = editableRef.current;\n if (!root) return;\n root.focus({ preventScroll: true });\n restoreSelection(selectionRef.current);\n }, [restoreSelection]);\n\n const clearTypingGroup = useCallback(() => {\n historyRef.current.lastInputAt = 0;\n historyRef.current.lastInputType = \"\";\n }, []);\n\n const pushHistory = useCallback(\n (document: TextDocument, selection: TextSelection) => {\n historyRef.current.undo.push({ document, selection });\n if (historyRef.current.undo.length > 100)\n historyRef.current.undo.shift();\n historyRef.current.redo = [];\n clearTypingGroup();\n },\n [clearTypingGroup],\n );\n\n const emitDocument = useCallback(\n (nextDocument: TextDocument, nextSelection = selectionRef.current) => {\n const normalized = normalizeTextDocument(nextDocument);\n renderDomOnDocumentChangeRef.current = true;\n documentRef.current = normalized;\n restoreSelectionRef.current = nextSelection;\n updateSelection(nextSelection);\n setDocumentState(normalized);\n onChange?.(normalized);\n },\n [onChange, updateSelection],\n );\n\n const commitTransform = useCallback(\n (nextDocument: TextDocument, nextSelection = selectionRef.current) => {\n if (documentsEqual(documentRef.current, nextDocument)) {\n updateSelection(nextSelection);\n restoreSelectionRef.current = nextSelection;\n return;\n }\n\n pushHistory(documentRef.current, selectionRef.current);\n emitDocument(nextDocument, nextSelection);\n },\n [emitDocument, pushHistory, updateSelection],\n );\n\n const undo = useCallback(() => {\n const history = historyRef.current;\n const previous = history.undo.pop();\n if (!previous) return;\n history.redo.push({\n document: documentRef.current,\n selection: selectionRef.current,\n });\n clearTypingGroup();\n emitDocument(previous.document, previous.selection);\n }, [clearTypingGroup, emitDocument]);\n\n const redo = useCallback(() => {\n const history = historyRef.current;\n const next = history.redo.pop();\n if (!next) return;\n history.undo.push({\n document: documentRef.current,\n selection: selectionRef.current,\n });\n clearTypingGroup();\n emitDocument(next.document, next.selection);\n }, [clearTypingGroup, emitDocument]);\n\n const getActiveMarks = useCallback(\n (): TextMark[] =>\n getMarksForSelection(\n documentRef.current,\n selectionRef.current,\n pendingMarksRef.current,\n pendingMarksOverrideRef.current,\n ),\n [],\n );\n\n const isActive = useCallback(\n (mark: TextMark): boolean => getActiveMarks().includes(mark),\n [getActiveMarks],\n );\n\n const getActiveTextVariant = useCallback(\n (): TextBlockVariant | null =>\n getVariantForSelection(documentRef.current, selectionRef.current),\n [],\n );\n\n const isTextVariantActive = useCallback(\n (variant: TextBlockVariant): boolean =>\n getActiveTextVariant() === variant,\n [getActiveTextVariant],\n );\n\n const toggleMark = useCallback(\n (mark: TextMark) => {\n focus();\n const selection = selectionRef.current;\n if (isCollapsedSelection(selection)) {\n const pending = new Set(getActiveMarks());\n if (pending.has(mark)) pending.delete(mark);\n else pending.add(mark);\n pendingMarksRef.current = [\"bold\", \"italic\", \"underline\", \"strike\"]\n .filter(isMark)\n .filter((item) => pending.has(item));\n pendingMarksOverrideRef.current = true;\n onActiveMarksChange?.(\n getMarksForSelection(\n documentRef.current,\n selectionRef.current,\n pendingMarksRef.current,\n true,\n ),\n );\n return;\n }\n\n commitTransform(applyMark(documentRef.current, selection, mark));\n },\n [commitTransform, focus, getActiveMarks, onActiveMarksChange],\n );\n\n const changeVariant = useCallback(\n (variant: TextBlockVariant) => {\n focus();\n commitTransform(\n setTextVariant(documentRef.current, selectionRef.current, variant),\n );\n },\n [commitTransform, focus],\n );\n\n const changeAlign = useCallback(\n (align: TextAlign) => {\n focus();\n commitTransform(\n setTextAlign(documentRef.current, selectionRef.current, align),\n );\n },\n [commitTransform, focus],\n );\n\n const isTextAlignActive = useCallback((align: TextAlign): boolean => {\n const currentAlign = getTextAlign(\n documentRef.current,\n selectionRef.current,\n );\n return (\n currentAlign === align || (currentAlign === null && align === \"left\")\n );\n }, []);\n\n const changeListType = useCallback(\n (listType: TextListType | null) => {\n focus();\n commitTransform(\n setListType(documentRef.current, selectionRef.current, listType),\n );\n },\n [commitTransform, focus],\n );\n\n const isListTypeActive = useCallback((listType: TextListType): boolean => {\n return getListType(documentRef.current, selectionRef.current, listType);\n }, []);\n\n const replaceSelection = useCallback(\n (insertedDocument: TextDocument) => {\n focus();\n const result = insertDocumentAtSelection(\n documentRef.current,\n selectionRef.current,\n insertedDocument,\n );\n pendingMarksRef.current = [];\n pendingMarksOverrideRef.current = false;\n commitTransform(result.document, result.selection);\n },\n [commitTransform, focus],\n );\n\n const insertText = useCallback(\n (text: string) => {\n focus();\n const result = insertTextAtSelection(\n documentRef.current,\n selectionRef.current,\n text,\n pendingMarksRef.current,\n );\n pendingMarksRef.current = [];\n pendingMarksOverrideRef.current = false;\n commitTransform(result.document, result.selection);\n },\n [commitTransform, focus],\n );\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n focus,\n getDocument: () => documentRef.current,\n getSelection: () => selectionRef.current,\n getActiveMarks,\n isActive,\n getActiveTextVariant,\n isTextVariantActive,\n toggleMark,\n setTextVariant: changeVariant,\n setTextAlign: changeAlign,\n isTextAlignActive,\n setListType: changeListType,\n isListTypeActive,\n insertText,\n replaceSelection,\n undo,\n redo,\n canUndo: () => historyRef.current.undo.length > 0,\n canRedo: () => historyRef.current.redo.length > 0,\n }),\n [\n changeAlign,\n changeListType,\n changeVariant,\n focus,\n isTextAlignActive,\n getActiveMarks,\n getActiveTextVariant,\n insertText,\n isActive,\n isTextVariantActive,\n redo,\n replaceSelection,\n toggleMark,\n undo,\n ],\n );\n\n useEffect(() => {\n if (!value || value === documentRef.current) return;\n const normalized = normalizeTextDocument(value);\n renderDomOnDocumentChangeRef.current = true;\n documentRef.current = normalized;\n const selection = createTextSelection();\n selectionRef.current = selection;\n restoreSelectionRef.current = selection;\n historyRef.current = {\n undo: [],\n redo: [],\n lastInputType: \"\",\n lastInputAt: 0,\n };\n setDocumentState(normalized);\n updateSelection(selection);\n }, [value, updateSelection]);\n\n useLayoutEffect(() => {\n const root = editableRef.current;\n if (!root) return;\n\n if (renderDomOnDocumentChangeRef.current) {\n renderDocumentToDom(root, documentState);\n }\n // Each document-state commit consumes the render decision. Native input\n // skips a DOM render; commands/external value changes explicitly enable it.\n renderDomOnDocumentChangeRef.current = true;\n\n const selection = restoreSelectionRef.current;\n if (!selection) return;\n restoreSelectionRef.current = null;\n restoreSelection(selection);\n }, [documentState, restoreSelection]);\n\n useEffect(() => {\n onActiveMarksChange?.(getActiveMarks());\n onActiveTextVariantChange?.(getActiveTextVariant());\n }, [\n getActiveMarks,\n getActiveTextVariant,\n onActiveMarksChange,\n onActiveTextVariantChange,\n ]);\n\n useEffect(() => {\n if (autoFocus) focus();\n }, [autoFocus, focus]);\n\n useEffect(() => {\n const ownerDocument = editableRef.current?.ownerDocument;\n if (!ownerDocument) return;\n\n const onSelectionChangeInDocument = () => {\n const root = editableRef.current;\n if (!root) return;\n const next = selectionFromDom(root);\n if (!next) return;\n const current = selectionRef.current;\n if (\n next.anchor.block === current.anchor.block &&\n next.anchor.offset === current.anchor.offset &&\n next.focus.block === current.focus.block &&\n next.focus.offset === current.focus.offset\n ) {\n return;\n }\n updateSelection(next);\n };\n\n ownerDocument.addEventListener(\n \"selectionchange\",\n onSelectionChangeInDocument,\n );\n return () =>\n ownerDocument.removeEventListener(\n \"selectionchange\",\n onSelectionChangeInDocument,\n );\n }, [updateSelection]);\n\n const handleBeforeInput = (event: FormEvent<HTMLDivElement>) => {\n const nativeEvent = event.nativeEvent as InputEvent;\n const inputType = nativeEvent.inputType ?? \"\";\n inputTypeRef.current = inputType;\n selectionBeforeInputRef.current =\n selectionFromDom(event.currentTarget) ?? selectionRef.current;\n\n if (inputType === \"historyUndo\") {\n event.preventDefault();\n undo();\n } else if (inputType === \"historyRedo\") {\n event.preventDefault();\n redo();\n }\n };\n\n const handleInput = (event: FormEvent<HTMLDivElement>) => {\n const root = event.currentTarget;\n const previousDocument = documentRef.current;\n const beforeSelection = selectionBeforeInputRef.current;\n const inputType = inputTypeRef.current;\n let nextDocument = parseHtmlToDocument(root.innerHTML);\n const nextSelection = selectionFromDom(root) ?? selectionRef.current;\n\n if (\n pendingMarksRef.current.length &&\n isCollapsedSelection(beforeSelection) &&\n (inputType === \"insertText\" || inputType === \"insertCompositionText\")\n ) {\n const insertedRange = {\n anchor: beforeSelection.anchor,\n focus: nextSelection.focus,\n };\n if (!isCollapsedSelection(insertedRange)) {\n for (const mark of pendingMarksRef.current) {\n nextDocument = applyMark(nextDocument, insertedRange, mark, true);\n }\n }\n }\n\n if (documentsEqual(previousDocument, nextDocument)) {\n updateSelection(nextSelection);\n return;\n }\n\n const now = Date.now();\n const canGroup =\n isCollapsedSelection(beforeSelection) &&\n (inputType === \"insertText\" ||\n inputType === \"insertCompositionText\" ||\n inputType === \"deleteContentBackward\" ||\n inputType === \"deleteContentForward\") &&\n historyRef.current.lastInputType === inputType &&\n now - historyRef.current.lastInputAt < 800;\n\n if (!canGroup) {\n historyRef.current.undo.push({\n document: previousDocument,\n selection: beforeSelection,\n });\n if (historyRef.current.undo.length > 100)\n historyRef.current.undo.shift();\n }\n\n historyRef.current.redo = [];\n historyRef.current.lastInputType = inputType;\n historyRef.current.lastInputAt = now;\n documentRef.current = normalizeTextDocument(nextDocument);\n if (\n inputType === \"insertText\" ||\n inputType === \"insertCompositionText\" ||\n inputType === \"insertFromPaste\"\n ) {\n pendingMarksRef.current = [];\n pendingMarksOverrideRef.current = false;\n }\n restoreSelectionRef.current = nextSelection;\n updateSelection(nextSelection);\n renderDomOnDocumentChangeRef.current = false;\n setDocumentState(documentRef.current);\n onChange?.(documentRef.current);\n };\n\n const handlePaste = (event: ClipboardEvent<HTMLDivElement>) => {\n if (readOnly) return;\n event.preventDefault();\n const currentSelection = selectionFromDom(event.currentTarget);\n if (currentSelection) updateSelection(currentSelection);\n const html = event.clipboardData.getData(\"text/html\");\n const plainText = event.clipboardData.getData(\"text/plain\");\n if (!html.trim() && !plainText) return;\n const parsed = html.trim()\n ? parseHtmlToDocument(html)\n : parseMarkdownToDocument(plainText);\n replaceSelection(parsed);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const modifier = event.metaKey || event.ctrlKey;\n if (!modifier) return;\n const key = event.key.toLowerCase();\n\n if (key === \"z\") {\n event.preventDefault();\n if (event.shiftKey) redo();\n else undo();\n } else if (key === \"y\") {\n event.preventDefault();\n redo();\n } else if (key === \"b\") {\n event.preventDefault();\n toggleMark(\"bold\");\n } else if (key === \"i\") {\n event.preventDefault();\n toggleMark(\"italic\");\n } else if (key === \"u\") {\n event.preventDefault();\n toggleMark(\"underline\");\n } else if (key === \"x\" && event.shiftKey) {\n event.preventDefault();\n toggleMark(\"strike\");\n }\n };\n\n const handleKeyUp = () => {\n const root = editableRef.current;\n const next = root ? selectionFromDom(root) : null;\n if (next) updateSelection(next);\n };\n\n const handleMouseUp = () => {\n const root = editableRef.current;\n const next = root ? selectionFromDom(root) : null;\n if (next) updateSelection(next);\n };\n\n return (\n <div\n ref={editableRef}\n className={cn(\"puzzle-text-editor\", className)}\n contentEditable={!readOnly}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-label={ariaLabel}\n aria-multiline=\"true\"\n aria-readonly={readOnly || undefined}\n data-placeholder={placeholder}\n data-empty={\n documentState.content.every((block) =>\n block.children.every((inline) => !inline.text),\n )\n ? \"true\"\n : undefined\n }\n spellCheck\n onBeforeInput={handleBeforeInput}\n onInput={handleInput}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onMouseUp={handleMouseUp}\n onFocus={handleKeyUp}\n />\n );\n },\n);\n\nEditor.displayName = \"Editor\";\n\nexport { Editor, type TextEditorHandle, type EditorProps };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const require_index = require("../../layout/stack/index.cjs");
|
|
2
|
+
const require_editor = require("./editor.cjs");
|
|
3
|
+
let react = require("react");
|
|
4
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
|
+
// src/components/editors/text-editor/index.tsx
|
|
6
|
+
const TextEditorContext = (0, react.createContext)(null);
|
|
7
|
+
const useTextEditor = () => {
|
|
8
|
+
const context = (0, react.useContext)(TextEditorContext);
|
|
9
|
+
if (!context) throw new Error("useTextEditor must be used within a TextEditorProvider");
|
|
10
|
+
return context;
|
|
11
|
+
};
|
|
12
|
+
const TextEditor = ({ toolbar, value, defaultValue, onChange }) => {
|
|
13
|
+
const editorHandleRef = (0, react.useRef)(null);
|
|
14
|
+
const [activeMarks, setActiveMarks] = (0, react.useState)([]);
|
|
15
|
+
const [activeVariant, setActiveVariant] = (0, react.useState)("body1");
|
|
16
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_index.Stack, {
|
|
17
|
+
direction: "col",
|
|
18
|
+
gap: "md",
|
|
19
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextEditorContext.Provider, {
|
|
20
|
+
value: {
|
|
21
|
+
...editorHandleRef.current,
|
|
22
|
+
activeMarks,
|
|
23
|
+
activeVariant
|
|
24
|
+
},
|
|
25
|
+
children: toolbar
|
|
26
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_editor.Editor, {
|
|
27
|
+
ref: editorHandleRef,
|
|
28
|
+
value,
|
|
29
|
+
defaultValue,
|
|
30
|
+
onChange,
|
|
31
|
+
onActiveMarksChange: setActiveMarks,
|
|
32
|
+
onActiveTextVariantChange: setActiveVariant
|
|
33
|
+
})]
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
exports.TextEditor = TextEditor;
|
|
37
|
+
exports.useTextEditor = useTextEditor;
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createContext","useContext","useRef","useState","Stack","Editor"],"sources":["../../../../src/components/editors/text-editor/index.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { TextEditorHandle } from \"./editor\";\nimport { Stack } from \"../../layout/stack\";\nimport { Editor } from \"./editor\";\nimport type {\n TextBlockVariant,\n TextDocument,\n TextMark,\n} from \"./text-editor.types\";\n\ntype TextEditorContextType = Partial<TextEditorHandle> & {\n activeMarks: TextMark[];\n activeVariant: TextBlockVariant | null;\n};\n\nconst TextEditorContext = createContext<TextEditorContextType | null>(null);\n\nexport const useTextEditor = () => {\n const context = useContext(TextEditorContext);\n if (!context) {\n throw new Error(\"useTextEditor must be used within a TextEditorProvider\");\n }\n return context;\n};\n\ntype TextEditorProps = {\n toolbar?: ReactNode;\n /** Controlled document. Use the same object emitted by onChange when updating it. */\n value?: TextDocument;\n /** Initial document for uncontrolled use. */\n defaultValue?: TextDocument;\n onChange?: (document: TextDocument) => void;\n};\n\nconst TextEditor = ({\n toolbar,\n value,\n defaultValue,\n onChange,\n}: TextEditorProps) => {\n const editorHandleRef = useRef<TextEditorHandle>(null);\n const [activeMarks, setActiveMarks] = useState<TextMark[]>([]);\n const [activeVariant, setActiveVariant] = useState<TextBlockVariant | null>(\n \"body1\",\n );\n\n return (\n <Stack direction=\"col\" gap=\"md\">\n <TextEditorContext.Provider\n value={{\n ...editorHandleRef.current,\n activeMarks,\n activeVariant,\n }}\n >\n {toolbar}\n </TextEditorContext.Provider>\n <Editor\n ref={editorHandleRef}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n onActiveMarksChange={setActiveMarks}\n onActiveTextVariantChange={setActiveVariant}\n />\n </Stack>\n );\n};\n\nexport { TextEditor, type TextEditorProps };\n"],"mappings":";;;;;AAqBA,MAAM,qBAAA,GAAoBA,MAAAA,cAAAA,CAA4C,IAAI;AAE1E,MAAa,sBAAsB;CACjC,MAAM,WAAA,GAAUC,MAAAA,WAAAA,CAAW,iBAAiB;CAC5C,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,wDAAwD;CAE1E,OAAO;AACT;AAWA,MAAM,cAAc,EAClB,SACA,OACA,cACA,eACqB;CACrB,MAAM,mBAAA,GAAkBC,MAAAA,OAAAA,CAAyB,IAAI;CACrD,MAAM,CAAC,aAAa,mBAAA,GAAkBC,MAAAA,SAAAA,CAAqB,CAAC,CAAC;CAC7D,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CACxC,OACF;CAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,cAAAA,OAAD;EAAO,WAAU;EAAM,KAAI;EAA3B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAkB,UAAnB;GACE,OAAO;IACL,GAAG,gBAAgB;IACnB;IACA;GACF;GAEC,UAAA;EACyB,CAAA,GAC5B,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,QAAD;GACE,KAAK;GACE;GACO;GACJ;GACV,qBAAqB;GACrB,2BAA2B;EAC5B,CAAA,CACI;;AAEX"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import "./editor.cjs";
|
|
2
|
+
import { TextDocument } from "./text-editor.types.cjs";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
type TextEditorProps = {
|
|
5
|
+
toolbar?: ReactNode;
|
|
6
|
+
/** Controlled document. Use the same object emitted by onChange when updating it. */
|
|
7
|
+
value?: TextDocument;
|
|
8
|
+
/** Initial document for uncontrolled use. */
|
|
9
|
+
defaultValue?: TextDocument;
|
|
10
|
+
onChange?: (document: TextDocument) => void;
|
|
11
|
+
};
|
|
12
|
+
declare const TextEditor: ({ toolbar, value, defaultValue, onChange }: TextEditorProps) => import("react").JSX.Element;
|
|
13
|
+
export { TextEditor, type TextEditorProps };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import "./editor.js";
|
|
2
|
+
import { TextDocument } from "./text-editor.types.js";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
type TextEditorProps = {
|
|
5
|
+
toolbar?: ReactNode;
|
|
6
|
+
/** Controlled document. Use the same object emitted by onChange when updating it. */
|
|
7
|
+
value?: TextDocument;
|
|
8
|
+
/** Initial document for uncontrolled use. */
|
|
9
|
+
defaultValue?: TextDocument;
|
|
10
|
+
onChange?: (document: TextDocument) => void;
|
|
11
|
+
};
|
|
12
|
+
declare const TextEditor: ({ toolbar, value, defaultValue, onChange }: TextEditorProps) => import("react").JSX.Element;
|
|
13
|
+
export { TextEditor, type TextEditorProps };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Stack } from "../../layout/stack/index.js";
|
|
2
|
+
import { Editor } from "./editor.js";
|
|
3
|
+
import { createContext, useContext, useRef, useState } from "react";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
// src/components/editors/text-editor/index.tsx
|
|
6
|
+
const TextEditorContext = createContext(null);
|
|
7
|
+
const useTextEditor = () => {
|
|
8
|
+
const context = useContext(TextEditorContext);
|
|
9
|
+
if (!context) throw new Error("useTextEditor must be used within a TextEditorProvider");
|
|
10
|
+
return context;
|
|
11
|
+
};
|
|
12
|
+
const TextEditor = ({ toolbar, value, defaultValue, onChange }) => {
|
|
13
|
+
const editorHandleRef = useRef(null);
|
|
14
|
+
const [activeMarks, setActiveMarks] = useState([]);
|
|
15
|
+
const [activeVariant, setActiveVariant] = useState("body1");
|
|
16
|
+
return /* @__PURE__ */ jsxs(Stack, {
|
|
17
|
+
direction: "col",
|
|
18
|
+
gap: "md",
|
|
19
|
+
children: [/* @__PURE__ */ jsx(TextEditorContext.Provider, {
|
|
20
|
+
value: {
|
|
21
|
+
...editorHandleRef.current,
|
|
22
|
+
activeMarks,
|
|
23
|
+
activeVariant
|
|
24
|
+
},
|
|
25
|
+
children: toolbar
|
|
26
|
+
}), /* @__PURE__ */ jsx(Editor, {
|
|
27
|
+
ref: editorHandleRef,
|
|
28
|
+
value,
|
|
29
|
+
defaultValue,
|
|
30
|
+
onChange,
|
|
31
|
+
onActiveMarksChange: setActiveMarks,
|
|
32
|
+
onActiveTextVariantChange: setActiveVariant
|
|
33
|
+
})]
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
export { TextEditor, useTextEditor };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/editors/text-editor/index.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { TextEditorHandle } from \"./editor\";\nimport { Stack } from \"../../layout/stack\";\nimport { Editor } from \"./editor\";\nimport type {\n TextBlockVariant,\n TextDocument,\n TextMark,\n} from \"./text-editor.types\";\n\ntype TextEditorContextType = Partial<TextEditorHandle> & {\n activeMarks: TextMark[];\n activeVariant: TextBlockVariant | null;\n};\n\nconst TextEditorContext = createContext<TextEditorContextType | null>(null);\n\nexport const useTextEditor = () => {\n const context = useContext(TextEditorContext);\n if (!context) {\n throw new Error(\"useTextEditor must be used within a TextEditorProvider\");\n }\n return context;\n};\n\ntype TextEditorProps = {\n toolbar?: ReactNode;\n /** Controlled document. Use the same object emitted by onChange when updating it. */\n value?: TextDocument;\n /** Initial document for uncontrolled use. */\n defaultValue?: TextDocument;\n onChange?: (document: TextDocument) => void;\n};\n\nconst TextEditor = ({\n toolbar,\n value,\n defaultValue,\n onChange,\n}: TextEditorProps) => {\n const editorHandleRef = useRef<TextEditorHandle>(null);\n const [activeMarks, setActiveMarks] = useState<TextMark[]>([]);\n const [activeVariant, setActiveVariant] = useState<TextBlockVariant | null>(\n \"body1\",\n );\n\n return (\n <Stack direction=\"col\" gap=\"md\">\n <TextEditorContext.Provider\n value={{\n ...editorHandleRef.current,\n activeMarks,\n activeVariant,\n }}\n >\n {toolbar}\n </TextEditorContext.Provider>\n <Editor\n ref={editorHandleRef}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n onActiveMarksChange={setActiveMarks}\n onActiveTextVariantChange={setActiveVariant}\n />\n </Stack>\n );\n};\n\nexport { TextEditor, type TextEditorProps };\n"],"mappings":";;;;;AAqBA,MAAM,oBAAoB,cAA4C,IAAI;AAE1E,MAAa,sBAAsB;CACjC,MAAM,UAAU,WAAW,iBAAiB;CAC5C,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,wDAAwD;CAE1E,OAAO;AACT;AAWA,MAAM,cAAc,EAClB,SACA,OACA,cACA,eACqB;CACrB,MAAM,kBAAkB,OAAyB,IAAI;CACrD,MAAM,CAAC,aAAa,kBAAkB,SAAqB,CAAC,CAAC;CAC7D,MAAM,CAAC,eAAe,oBAAoB,SACxC,OACF;CAEA,OACE,qBAAC,OAAD;EAAO,WAAU;EAAM,KAAI;EAA3B,UAAA,CACE,oBAAC,kBAAkB,UAAnB;GACE,OAAO;IACL,GAAG,gBAAgB;IACnB;IACA;GACF;GAEC,UAAA;EACyB,CAAA,GAC5B,oBAAC,QAAD;GACE,KAAK;GACE;GACO;GACJ;GACV,qBAAqB;GACrB,2BAA2B;EAC5B,CAAA,CACI;;AAEX"}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
// src/components/editors/text-editor/text-document.ts
|
|
2
|
+
const HEADING_VARIANTS = /* @__PURE__ */ new Set([
|
|
3
|
+
"display1",
|
|
4
|
+
"display2",
|
|
5
|
+
"headline1",
|
|
6
|
+
"headline2",
|
|
7
|
+
"headline3",
|
|
8
|
+
"headline4"
|
|
9
|
+
]);
|
|
10
|
+
const MARK_ORDER = [
|
|
11
|
+
"bold",
|
|
12
|
+
"italic",
|
|
13
|
+
"underline",
|
|
14
|
+
"strike"
|
|
15
|
+
];
|
|
16
|
+
const isHeadingVariant = (variant) => HEADING_VARIANTS.has(variant);
|
|
17
|
+
const createTextDocument = (text = "") => ({
|
|
18
|
+
type: "doc",
|
|
19
|
+
content: [{
|
|
20
|
+
type: "paragraph",
|
|
21
|
+
variant: "body1",
|
|
22
|
+
children: text ? [{ text }] : []
|
|
23
|
+
}]
|
|
24
|
+
});
|
|
25
|
+
const createTextSelection = (block = 0, offset = 0) => ({
|
|
26
|
+
anchor: {
|
|
27
|
+
block,
|
|
28
|
+
offset
|
|
29
|
+
},
|
|
30
|
+
focus: {
|
|
31
|
+
block,
|
|
32
|
+
offset
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
const getBlockLength = (block) => block.children.reduce((length, child) => length + child.text.length, 0);
|
|
36
|
+
const isCollapsedSelection = (selection) => selection.anchor.block === selection.focus.block && selection.anchor.offset === selection.focus.offset;
|
|
37
|
+
const getOrderedSelection = (selection) => {
|
|
38
|
+
const { anchor, focus } = selection;
|
|
39
|
+
if (anchor.block < focus.block || anchor.block === focus.block && anchor.offset <= focus.offset) return {
|
|
40
|
+
start: anchor,
|
|
41
|
+
end: focus
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
start: focus,
|
|
45
|
+
end: anchor
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
const normalizeMarks = (marks = []) => MARK_ORDER.filter((mark) => marks.includes(mark));
|
|
49
|
+
const sameMarks = (left = [], right = []) => {
|
|
50
|
+
const a = normalizeMarks(left);
|
|
51
|
+
const b = normalizeMarks(right);
|
|
52
|
+
return a.length === b.length && a.every((mark, index) => mark === b[index]);
|
|
53
|
+
};
|
|
54
|
+
const normalizeInlines = (inlines) => {
|
|
55
|
+
const result = [];
|
|
56
|
+
for (const inline of inlines) {
|
|
57
|
+
if (!inline.text) continue;
|
|
58
|
+
const marks = normalizeMarks(inline.marks);
|
|
59
|
+
const previous = result[result.length - 1];
|
|
60
|
+
if (previous && sameMarks(previous.marks, marks)) {
|
|
61
|
+
previous.text += inline.text;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
result.push({
|
|
65
|
+
text: inline.text,
|
|
66
|
+
...marks.length ? { marks } : {}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
};
|
|
71
|
+
const isTextMark = (value) => value === "bold" || value === "italic" || value === "underline" || value === "strike";
|
|
72
|
+
const isTextVariant = (value) => value === "display1" || value === "display2" || value === "headline1" || value === "headline2" || value === "headline3" || value === "headline4" || value === "subtitle1" || value === "subtitle2" || value === "body1" || value === "body2" || value === "button" || value === "caption" || value === "overline";
|
|
73
|
+
const normalizeTextDocument = (input) => {
|
|
74
|
+
const content = Array.isArray(input?.content) ? input.content.flatMap((candidate) => {
|
|
75
|
+
if (!candidate || !Array.isArray(candidate.children)) return [];
|
|
76
|
+
const variant = isTextVariant(candidate.variant) ? candidate.variant : "body1";
|
|
77
|
+
const children = normalizeInlines(candidate.children.flatMap((inline) => {
|
|
78
|
+
if (!inline || typeof inline.text !== "string") return [];
|
|
79
|
+
const marks = Array.isArray(inline.marks) ? inline.marks.filter(isTextMark) : [];
|
|
80
|
+
return [{
|
|
81
|
+
text: inline.text,
|
|
82
|
+
marks
|
|
83
|
+
}];
|
|
84
|
+
}));
|
|
85
|
+
const listType = candidate.listType === "bullet" || candidate.listType === "ordered" ? candidate.listType : void 0;
|
|
86
|
+
const align = candidate.align === "left" || candidate.align === "center" || candidate.align === "right" || candidate.align === "justify" ? candidate.align : void 0;
|
|
87
|
+
const headingLevel = (listType ? "listItem" : candidate.type === "heading" && isHeadingVariant(variant) ? "heading" : "paragraph") === "heading" && Number.isInteger(candidate.headingLevel) && candidate.headingLevel >= 1 && candidate.headingLevel <= 6 ? candidate.headingLevel : void 0;
|
|
88
|
+
return [{
|
|
89
|
+
type: listType ? "listItem" : candidate.type === "heading" && isHeadingVariant(variant) ? "heading" : "paragraph",
|
|
90
|
+
variant,
|
|
91
|
+
children,
|
|
92
|
+
...listType ? { listType } : {},
|
|
93
|
+
...align ? { align } : {},
|
|
94
|
+
...headingLevel ? { headingLevel } : {}
|
|
95
|
+
}];
|
|
96
|
+
}) : [];
|
|
97
|
+
return {
|
|
98
|
+
type: "doc",
|
|
99
|
+
content: content.length ? content : [{
|
|
100
|
+
type: "paragraph",
|
|
101
|
+
variant: "body1",
|
|
102
|
+
children: []
|
|
103
|
+
}]
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
const sliceInlines = (inlines, from, to) => {
|
|
107
|
+
if (to <= from) return [];
|
|
108
|
+
const result = [];
|
|
109
|
+
let position = 0;
|
|
110
|
+
for (const inline of inlines) {
|
|
111
|
+
const start = position;
|
|
112
|
+
const end = position + inline.text.length;
|
|
113
|
+
const overlapStart = Math.max(start, from);
|
|
114
|
+
const overlapEnd = Math.min(end, to);
|
|
115
|
+
if (overlapStart < overlapEnd) result.push({
|
|
116
|
+
text: inline.text.slice(overlapStart - start, overlapEnd - start),
|
|
117
|
+
...inline.marks?.length ? { marks: [...inline.marks] } : {}
|
|
118
|
+
});
|
|
119
|
+
position = end;
|
|
120
|
+
if (position >= to) break;
|
|
121
|
+
}
|
|
122
|
+
return normalizeInlines(result);
|
|
123
|
+
};
|
|
124
|
+
const transformInlineRange = (inlines, from, to, transform) => {
|
|
125
|
+
if (to <= from) return inlines.map((inline) => ({ ...inline }));
|
|
126
|
+
const result = [];
|
|
127
|
+
let position = 0;
|
|
128
|
+
for (const inline of inlines) {
|
|
129
|
+
const start = position;
|
|
130
|
+
const end = start + inline.text.length;
|
|
131
|
+
if (end <= from || start >= to) result.push({
|
|
132
|
+
...inline,
|
|
133
|
+
...inline.marks ? { marks: [...inline.marks] } : {}
|
|
134
|
+
});
|
|
135
|
+
else {
|
|
136
|
+
const leftLength = Math.max(0, from - start);
|
|
137
|
+
const rightStart = Math.max(0, to - start);
|
|
138
|
+
const marks = inline.marks ?? [];
|
|
139
|
+
if (leftLength > 0) result.push({
|
|
140
|
+
text: inline.text.slice(0, leftLength),
|
|
141
|
+
...marks.length ? { marks: [...marks] } : {}
|
|
142
|
+
});
|
|
143
|
+
const middleEnd = Math.min(inline.text.length, to - start);
|
|
144
|
+
if (middleEnd > leftLength) result.push({
|
|
145
|
+
text: inline.text.slice(leftLength, middleEnd),
|
|
146
|
+
marks: transform([...marks])
|
|
147
|
+
});
|
|
148
|
+
if (rightStart < inline.text.length) result.push({
|
|
149
|
+
text: inline.text.slice(Math.max(0, rightStart)),
|
|
150
|
+
...marks.length ? { marks: [...marks] } : {}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
position = end;
|
|
154
|
+
}
|
|
155
|
+
return normalizeInlines(result);
|
|
156
|
+
};
|
|
157
|
+
const applyMark = (document, selection, mark, force) => {
|
|
158
|
+
if (isCollapsedSelection(selection)) return document;
|
|
159
|
+
const { start, end } = getOrderedSelection(selection);
|
|
160
|
+
const allMarked = document.content.every((block, index) => {
|
|
161
|
+
if (index < start.block || index > end.block) return true;
|
|
162
|
+
const from = index === start.block ? start.offset : 0;
|
|
163
|
+
const to = index === end.block ? end.offset : getBlockLength(block);
|
|
164
|
+
if (to <= from) return true;
|
|
165
|
+
let position = 0;
|
|
166
|
+
for (const inline of block.children) {
|
|
167
|
+
const inlineStart = position;
|
|
168
|
+
const inlineEnd = position + inline.text.length;
|
|
169
|
+
position = inlineEnd;
|
|
170
|
+
if (inlineEnd <= from || inlineStart >= to) continue;
|
|
171
|
+
if (!inline.marks?.includes(mark)) return false;
|
|
172
|
+
}
|
|
173
|
+
return true;
|
|
174
|
+
});
|
|
175
|
+
const addMark = force ?? !allMarked;
|
|
176
|
+
return {
|
|
177
|
+
type: "doc",
|
|
178
|
+
content: document.content.map((block, index) => {
|
|
179
|
+
if (index < start.block || index > end.block) return block;
|
|
180
|
+
const from = index === start.block ? start.offset : 0;
|
|
181
|
+
const to = index === end.block ? end.offset : getBlockLength(block);
|
|
182
|
+
if (to <= from) return block;
|
|
183
|
+
return {
|
|
184
|
+
...block,
|
|
185
|
+
children: transformInlineRange(block.children, from, to, (marks) => {
|
|
186
|
+
const next = new Set(marks);
|
|
187
|
+
if (addMark) next.add(mark);
|
|
188
|
+
else next.delete(mark);
|
|
189
|
+
return MARK_ORDER.filter((item) => next.has(item));
|
|
190
|
+
})
|
|
191
|
+
};
|
|
192
|
+
})
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
const setTextVariant = (document, selection, variant) => {
|
|
196
|
+
const { start, end } = getOrderedSelection(selection);
|
|
197
|
+
const lastBlock = isCollapsedSelection(selection) ? start.block : end.offset === 0 && end.block > start.block ? end.block - 1 : end.block;
|
|
198
|
+
return {
|
|
199
|
+
type: "doc",
|
|
200
|
+
content: document.content.map((block, index) => {
|
|
201
|
+
if (index < start.block || index > lastBlock) return block;
|
|
202
|
+
return {
|
|
203
|
+
...block,
|
|
204
|
+
type: block.listType ? "listItem" : isHeadingVariant(variant) ? "heading" : "paragraph",
|
|
205
|
+
variant
|
|
206
|
+
};
|
|
207
|
+
})
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
const inlineWithOffset = (inlines, offset) => ({
|
|
211
|
+
before: sliceInlines(inlines, 0, offset),
|
|
212
|
+
after: sliceInlines(inlines, offset, inlines.reduce((sum, item) => sum + item.text.length, 0))
|
|
213
|
+
});
|
|
214
|
+
const insertDocumentAtSelection = (document, selection, insertedDocument) => {
|
|
215
|
+
const source = normalizeTextDocument(document);
|
|
216
|
+
const inserted = normalizeTextDocument(insertedDocument);
|
|
217
|
+
const { start, end } = getOrderedSelection(selection);
|
|
218
|
+
const startIndex = Math.max(0, Math.min(start.block, source.content.length - 1));
|
|
219
|
+
const endIndex = Math.max(startIndex, Math.min(end.block, source.content.length - 1));
|
|
220
|
+
const startBlock = source.content[startIndex];
|
|
221
|
+
const endBlock = source.content[endIndex];
|
|
222
|
+
const startOffset = Math.max(0, Math.min(start.offset, getBlockLength(startBlock)));
|
|
223
|
+
const endOffset = Math.max(0, Math.min(end.offset, getBlockLength(endBlock)));
|
|
224
|
+
const prefix = inlineWithOffset(startBlock.children, startOffset).before;
|
|
225
|
+
const suffix = inlineWithOffset(endBlock.children, endOffset).after;
|
|
226
|
+
const insertedBlocks = inserted.content.map((block) => ({
|
|
227
|
+
...block,
|
|
228
|
+
children: block.children.map((inline) => ({
|
|
229
|
+
...inline,
|
|
230
|
+
...inline.marks ? { marks: [...inline.marks] } : {}
|
|
231
|
+
}))
|
|
232
|
+
}));
|
|
233
|
+
const leftSurvives = prefix.length > 0 || startOffset > 0;
|
|
234
|
+
const rightSurvives = suffix.length > 0 || endOffset < getBlockLength(endBlock);
|
|
235
|
+
const first = insertedBlocks[0];
|
|
236
|
+
const last = insertedBlocks[insertedBlocks.length - 1];
|
|
237
|
+
const separatePrefix = leftSurvives && first.type === "heading";
|
|
238
|
+
const separateSuffix = rightSurvives && last.type === "heading";
|
|
239
|
+
const replacement = [];
|
|
240
|
+
if (separatePrefix) replacement.push({
|
|
241
|
+
...startBlock,
|
|
242
|
+
children: prefix
|
|
243
|
+
});
|
|
244
|
+
if (insertedBlocks.length === 1) {
|
|
245
|
+
if (separatePrefix || separateSuffix) {
|
|
246
|
+
replacement.push({
|
|
247
|
+
...first,
|
|
248
|
+
type: separatePrefix || !leftSurvives ? first.type : startBlock.type,
|
|
249
|
+
variant: separatePrefix || !leftSurvives ? first.variant : startBlock.variant,
|
|
250
|
+
children: separatePrefix ? first.children : normalizeInlines([...prefix, ...first.children])
|
|
251
|
+
});
|
|
252
|
+
if (separateSuffix) replacement.push({
|
|
253
|
+
...endBlock,
|
|
254
|
+
children: suffix
|
|
255
|
+
});
|
|
256
|
+
else {
|
|
257
|
+
const finalIndex = replacement.length - 1;
|
|
258
|
+
replacement[finalIndex] = {
|
|
259
|
+
...replacement[finalIndex],
|
|
260
|
+
children: normalizeInlines([...replacement[finalIndex].children, ...suffix])
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
} else {
|
|
264
|
+
const useInsertedStyle = !leftSurvives && !rightSurvives;
|
|
265
|
+
replacement.push({
|
|
266
|
+
...useInsertedStyle ? first : startBlock,
|
|
267
|
+
type: useInsertedStyle ? first.type : startBlock.type,
|
|
268
|
+
variant: useInsertedStyle ? first.variant : startBlock.variant,
|
|
269
|
+
children: normalizeInlines([
|
|
270
|
+
...prefix,
|
|
271
|
+
...first.children,
|
|
272
|
+
...suffix
|
|
273
|
+
])
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
} else {
|
|
277
|
+
replacement.push({
|
|
278
|
+
...separatePrefix || !leftSurvives ? first : startBlock,
|
|
279
|
+
type: separatePrefix || !leftSurvives ? first.type : startBlock.type,
|
|
280
|
+
variant: separatePrefix || !leftSurvives ? first.variant : startBlock.variant,
|
|
281
|
+
children: separatePrefix ? first.children : normalizeInlines([...prefix, ...first.children])
|
|
282
|
+
});
|
|
283
|
+
for (let index = 1; index < insertedBlocks.length - 1; index += 1) replacement.push(insertedBlocks[index]);
|
|
284
|
+
if (separateSuffix) {
|
|
285
|
+
replacement.push(last);
|
|
286
|
+
replacement.push({
|
|
287
|
+
...endBlock,
|
|
288
|
+
children: suffix
|
|
289
|
+
});
|
|
290
|
+
} else replacement.push({
|
|
291
|
+
...rightSurvives ? endBlock : last,
|
|
292
|
+
type: rightSurvives ? endBlock.type : last.type,
|
|
293
|
+
variant: rightSurvives ? endBlock.variant : last.variant,
|
|
294
|
+
children: normalizeInlines([...last.children, ...suffix])
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
const content = [
|
|
298
|
+
...source.content.slice(0, startIndex),
|
|
299
|
+
...replacement,
|
|
300
|
+
...source.content.slice(endIndex + 1)
|
|
301
|
+
];
|
|
302
|
+
const caretReplacementIndex = separateSuffix ? replacement.length - 2 : replacement.length - 1;
|
|
303
|
+
const caretBlock = replacement[Math.max(0, caretReplacementIndex)];
|
|
304
|
+
const suffixLength = suffix.reduce((total, inline) => total + inline.text.length, 0);
|
|
305
|
+
const caretOffset = separateSuffix ? getBlockLength(caretBlock) : Math.max(0, getBlockLength(caretBlock) - suffixLength);
|
|
306
|
+
const caret = {
|
|
307
|
+
block: startIndex + Math.max(0, caretReplacementIndex),
|
|
308
|
+
offset: caretOffset
|
|
309
|
+
};
|
|
310
|
+
return {
|
|
311
|
+
document: {
|
|
312
|
+
type: "doc",
|
|
313
|
+
content: content.length ? content : createTextDocument().content
|
|
314
|
+
},
|
|
315
|
+
selection: {
|
|
316
|
+
anchor: caret,
|
|
317
|
+
focus: caret
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
};
|
|
321
|
+
const insertTextAtSelection = (document, selection, text, marks = []) => {
|
|
322
|
+
const inserted = {
|
|
323
|
+
type: "doc",
|
|
324
|
+
content: text.split("\n").map((line) => ({
|
|
325
|
+
type: "paragraph",
|
|
326
|
+
variant: "body1",
|
|
327
|
+
children: line ? [{
|
|
328
|
+
text: line,
|
|
329
|
+
...marks.length ? { marks: [...marks] } : {}
|
|
330
|
+
}] : []
|
|
331
|
+
}))
|
|
332
|
+
};
|
|
333
|
+
return insertDocumentAtSelection(document, selection, inserted);
|
|
334
|
+
};
|
|
335
|
+
/** Apply text alignment to every block touched by the current selection. */
|
|
336
|
+
const setTextAlign = (document, selection, align) => {
|
|
337
|
+
const { start, end } = getOrderedSelection(selection);
|
|
338
|
+
const lastBlock = isCollapsedSelection(selection) ? start.block : end.offset === 0 && end.block > start.block ? end.block - 1 : end.block;
|
|
339
|
+
return {
|
|
340
|
+
type: "doc",
|
|
341
|
+
content: document.content.map((block, index) => {
|
|
342
|
+
if (index < start.block || index > lastBlock) return block;
|
|
343
|
+
return {
|
|
344
|
+
...block,
|
|
345
|
+
align
|
|
346
|
+
};
|
|
347
|
+
})
|
|
348
|
+
};
|
|
349
|
+
};
|
|
350
|
+
const getTextAlign = (document, selection) => {
|
|
351
|
+
const { start, end } = getOrderedSelection(selection);
|
|
352
|
+
const lastBlock = isCollapsedSelection(selection) ? start.block : end.offset === 0 && end.block > start.block ? end.block - 1 : end.block;
|
|
353
|
+
const selected = document.content.slice(start.block, lastBlock + 1);
|
|
354
|
+
if (selected.length === 0) return null;
|
|
355
|
+
const align = selected[0].align ?? null;
|
|
356
|
+
return selected.every((block) => (block.align ?? null) === align) ? align : null;
|
|
357
|
+
};
|
|
358
|
+
/** Toggle a list type for the selected blocks; null removes list formatting. */
|
|
359
|
+
const setListType = (document, selection, listType) => {
|
|
360
|
+
const { start, end } = getOrderedSelection(selection);
|
|
361
|
+
const lastBlock = isCollapsedSelection(selection) ? start.block : end.offset === 0 && end.block > start.block ? end.block - 1 : end.block;
|
|
362
|
+
const selected = document.content.slice(start.block, lastBlock + 1);
|
|
363
|
+
const remove = listType != null && selected.length > 0 && selected.every((block) => block.listType === listType);
|
|
364
|
+
return {
|
|
365
|
+
type: "doc",
|
|
366
|
+
content: document.content.map((block, index) => {
|
|
367
|
+
if (index < start.block || index > lastBlock) return block;
|
|
368
|
+
if (remove || listType == null) {
|
|
369
|
+
const { listType: _listType, ...rest } = block;
|
|
370
|
+
return {
|
|
371
|
+
...rest,
|
|
372
|
+
type: block.type === "listItem" ? "paragraph" : block.type
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
return {
|
|
376
|
+
...block,
|
|
377
|
+
type: "listItem",
|
|
378
|
+
listType
|
|
379
|
+
};
|
|
380
|
+
})
|
|
381
|
+
};
|
|
382
|
+
};
|
|
383
|
+
const getListType = (document, selection, listType) => {
|
|
384
|
+
const { start, end } = getOrderedSelection(selection);
|
|
385
|
+
const lastBlock = isCollapsedSelection(selection) ? start.block : end.offset === 0 && end.block > start.block ? end.block - 1 : end.block;
|
|
386
|
+
const selected = document.content.slice(start.block, lastBlock + 1);
|
|
387
|
+
return selected.length > 0 && selected.every((block) => block.listType === listType);
|
|
388
|
+
};
|
|
389
|
+
exports.applyMark = applyMark;
|
|
390
|
+
exports.createTextDocument = createTextDocument;
|
|
391
|
+
exports.createTextSelection = createTextSelection;
|
|
392
|
+
exports.getBlockLength = getBlockLength;
|
|
393
|
+
exports.getListType = getListType;
|
|
394
|
+
exports.getOrderedSelection = getOrderedSelection;
|
|
395
|
+
exports.getTextAlign = getTextAlign;
|
|
396
|
+
exports.insertDocumentAtSelection = insertDocumentAtSelection;
|
|
397
|
+
exports.insertTextAtSelection = insertTextAtSelection;
|
|
398
|
+
exports.isCollapsedSelection = isCollapsedSelection;
|
|
399
|
+
exports.isHeadingVariant = isHeadingVariant;
|
|
400
|
+
exports.normalizeInlines = normalizeInlines;
|
|
401
|
+
exports.normalizeTextDocument = normalizeTextDocument;
|
|
402
|
+
exports.setListType = setListType;
|
|
403
|
+
exports.setTextAlign = setTextAlign;
|
|
404
|
+
exports.setTextVariant = setTextVariant;
|
|
405
|
+
|
|
406
|
+
//# sourceMappingURL=text-document.cjs.map
|