@trebired/frontend 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/LICENSE +661 -0
- package/README.md +212 -0
- package/dist/actions/buttons.d.ts +8 -0
- package/dist/actions/buttons.d.ts.map +1 -0
- package/dist/actions/buttons.js +116 -0
- package/dist/actions/buttons.js.map +1 -0
- package/dist/actions/components/index.d.ts +26 -0
- package/dist/actions/components/index.d.ts.map +1 -0
- package/dist/actions/components/index.js +25 -0
- package/dist/actions/components/index.js.map +1 -0
- package/dist/actions/confetti.d.ts +12 -0
- package/dist/actions/confetti.d.ts.map +1 -0
- package/dist/actions/confetti.js +36 -0
- package/dist/actions/confetti.js.map +1 -0
- package/dist/actions/forms.d.ts +12 -0
- package/dist/actions/forms.d.ts.map +1 -0
- package/dist/actions/forms.js +159 -0
- package/dist/actions/forms.js.map +1 -0
- package/dist/actions/index.d.ts +8 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +7 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/request.d.ts +13 -0
- package/dist/actions/request.d.ts.map +1 -0
- package/dist/actions/request.js +83 -0
- package/dist/actions/request.js.map +1 -0
- package/dist/actions/response.d.ts +18 -0
- package/dist/actions/response.d.ts.map +1 -0
- package/dist/actions/response.js +104 -0
- package/dist/actions/response.js.map +1 -0
- package/dist/actions/styles/index.scss +42 -0
- package/dist/actions/triggers.d.ts +24 -0
- package/dist/actions/triggers.d.ts.map +1 -0
- package/dist/actions/triggers.js +107 -0
- package/dist/actions/triggers.js.map +1 -0
- package/dist/actions/types.d.ts +63 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +2 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +11 -0
- package/dist/components/index.js.map +1 -0
- package/dist/dom/index.d.ts +26 -0
- package/dist/dom/index.d.ts.map +1 -0
- package/dist/dom/index.js +164 -0
- package/dist/dom/index.js.map +1 -0
- package/dist/flash/components/index.d.ts +28 -0
- package/dist/flash/components/index.d.ts.map +1 -0
- package/dist/flash/components/index.js +27 -0
- package/dist/flash/components/index.js.map +1 -0
- package/dist/flash/dialogs.d.ts +6 -0
- package/dist/flash/dialogs.d.ts.map +1 -0
- package/dist/flash/dialogs.js +120 -0
- package/dist/flash/dialogs.js.map +1 -0
- package/dist/flash/duration.d.ts +8 -0
- package/dist/flash/duration.d.ts.map +1 -0
- package/dist/flash/duration.js +20 -0
- package/dist/flash/duration.js.map +1 -0
- package/dist/flash/elements.d.ts +14 -0
- package/dist/flash/elements.d.ts.map +1 -0
- package/dist/flash/elements.js +67 -0
- package/dist/flash/elements.js.map +1 -0
- package/dist/flash/index.d.ts +8 -0
- package/dist/flash/index.d.ts.map +1 -0
- package/dist/flash/index.js +18 -0
- package/dist/flash/index.js.map +1 -0
- package/dist/flash/stack.d.ts +6 -0
- package/dist/flash/stack.d.ts.map +1 -0
- package/dist/flash/stack.js +56 -0
- package/dist/flash/stack.js.map +1 -0
- package/dist/flash/styles/index.scss +118 -0
- package/dist/flash/toast.d.ts +24 -0
- package/dist/flash/toast.d.ts.map +1 -0
- package/dist/flash/toast.js +67 -0
- package/dist/flash/toast.js.map +1 -0
- package/dist/flash/types.d.ts +29 -0
- package/dist/flash/types.d.ts.map +1 -0
- package/dist/flash/types.js +2 -0
- package/dist/flash/types.js.map +1 -0
- package/dist/http/index.d.ts +30 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +104 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +104 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs/components/index.d.ts +16 -0
- package/dist/inputs/components/index.d.ts.map +1 -0
- package/dist/inputs/components/index.js +112 -0
- package/dist/inputs/components/index.js.map +1 -0
- package/dist/inputs/index.d.ts +17 -0
- package/dist/inputs/index.d.ts.map +1 -0
- package/dist/inputs/index.js +54 -0
- package/dist/inputs/index.js.map +1 -0
- package/dist/inputs/styles/cropper.scss +244 -0
- package/dist/inputs/styles/field.scss +15 -0
- package/dist/inputs/styles/index.scss +3 -0
- package/dist/inputs/styles/upload.scss +125 -0
- package/dist/inputs/upload/config.d.ts +57 -0
- package/dist/inputs/upload/config.d.ts.map +1 -0
- package/dist/inputs/upload/config.js +61 -0
- package/dist/inputs/upload/config.js.map +1 -0
- package/dist/inputs/upload/crop-session.d.ts +6 -0
- package/dist/inputs/upload/crop-session.d.ts.map +1 -0
- package/dist/inputs/upload/crop-session.js +204 -0
- package/dist/inputs/upload/crop-session.js.map +1 -0
- package/dist/inputs/upload/crop.d.ts +20 -0
- package/dist/inputs/upload/crop.d.ts.map +1 -0
- package/dist/inputs/upload/crop.js +124 -0
- package/dist/inputs/upload/crop.js.map +1 -0
- package/dist/inputs/upload/dom.d.ts +19 -0
- package/dist/inputs/upload/dom.d.ts.map +1 -0
- package/dist/inputs/upload/dom.js +74 -0
- package/dist/inputs/upload/dom.js.map +1 -0
- package/dist/inputs/upload/drop.d.ts +10 -0
- package/dist/inputs/upload/drop.d.ts.map +1 -0
- package/dist/inputs/upload/drop.js +92 -0
- package/dist/inputs/upload/drop.js.map +1 -0
- package/dist/inputs/upload/files.d.ts +14 -0
- package/dist/inputs/upload/files.d.ts.map +1 -0
- package/dist/inputs/upload/files.js +82 -0
- package/dist/inputs/upload/files.js.map +1 -0
- package/dist/inputs/upload/manager.d.ts +36 -0
- package/dist/inputs/upload/manager.d.ts.map +1 -0
- package/dist/inputs/upload/manager.js +236 -0
- package/dist/inputs/upload/manager.js.map +1 -0
- package/dist/inputs/upload/markup.d.ts +30 -0
- package/dist/inputs/upload/markup.d.ts.map +1 -0
- package/dist/inputs/upload/markup.js +118 -0
- package/dist/inputs/upload/markup.js.map +1 -0
- package/dist/inputs/upload/model.d.ts +41 -0
- package/dist/inputs/upload/model.d.ts.map +1 -0
- package/dist/inputs/upload/model.js +76 -0
- package/dist/inputs/upload/model.js.map +1 -0
- package/dist/inputs/upload/state.d.ts +16 -0
- package/dist/inputs/upload/state.d.ts.map +1 -0
- package/dist/inputs/upload/state.js +181 -0
- package/dist/inputs/upload/state.js.map +1 -0
- package/dist/inputs/upload/text.d.ts +7 -0
- package/dist/inputs/upload/text.d.ts.map +1 -0
- package/dist/inputs/upload/text.js +29 -0
- package/dist/inputs/upload/text.js.map +1 -0
- package/dist/inputs/upload/types.d.ts +86 -0
- package/dist/inputs/upload/types.d.ts.map +1 -0
- package/dist/inputs/upload/types.js +2 -0
- package/dist/inputs/upload/types.js.map +1 -0
- package/dist/layer/components/index.d.ts +12 -0
- package/dist/layer/components/index.d.ts.map +1 -0
- package/dist/layer/components/index.js +12 -0
- package/dist/layer/components/index.js.map +1 -0
- package/dist/layer/index.d.ts +22 -0
- package/dist/layer/index.d.ts.map +1 -0
- package/dist/layer/index.js +159 -0
- package/dist/layer/index.js.map +1 -0
- package/dist/layer/styles/index.scss +6 -0
- package/dist/live/components/index.d.ts +15 -0
- package/dist/live/components/index.d.ts.map +1 -0
- package/dist/live/components/index.js +12 -0
- package/dist/live/components/index.js.map +1 -0
- package/dist/live/index.d.ts +29 -0
- package/dist/live/index.d.ts.map +1 -0
- package/dist/live/index.js +103 -0
- package/dist/live/index.js.map +1 -0
- package/dist/logging/index.d.ts +17 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +68 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/modal/components/index.d.ts +18 -0
- package/dist/modal/components/index.d.ts.map +1 -0
- package/dist/modal/components/index.js +20 -0
- package/dist/modal/components/index.js.map +1 -0
- package/dist/modal/index.d.ts +24 -0
- package/dist/modal/index.d.ts.map +1 -0
- package/dist/modal/index.js +184 -0
- package/dist/modal/index.js.map +1 -0
- package/dist/modal/styles/index.scss +50 -0
- package/dist/popover/components/index.d.ts +14 -0
- package/dist/popover/components/index.d.ts.map +1 -0
- package/dist/popover/components/index.js +16 -0
- package/dist/popover/components/index.js.map +1 -0
- package/dist/popover/index.d.ts +16 -0
- package/dist/popover/index.d.ts.map +1 -0
- package/dist/popover/index.js +140 -0
- package/dist/popover/index.js.map +1 -0
- package/dist/popover/styles/index.scss +24 -0
- package/dist/progress/components/index.d.ts +10 -0
- package/dist/progress/components/index.d.ts.map +1 -0
- package/dist/progress/components/index.js +14 -0
- package/dist/progress/components/index.js.map +1 -0
- package/dist/progress/index.d.ts +18 -0
- package/dist/progress/index.d.ts.map +1 -0
- package/dist/progress/index.js +89 -0
- package/dist/progress/index.js.map +1 -0
- package/dist/progress/styles/index.scss +16 -0
- package/dist/react/index.d.ts +17 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +47 -0
- package/dist/react/index.js.map +1 -0
- package/dist/src/actions/buttons.d.ts +8 -0
- package/dist/src/actions/buttons.d.ts.map +1 -0
- package/dist/src/actions/buttons.js +116 -0
- package/dist/src/actions/buttons.js.map +1 -0
- package/dist/src/actions/components/index.d.ts +26 -0
- package/dist/src/actions/components/index.d.ts.map +1 -0
- package/dist/src/actions/components/index.js +25 -0
- package/dist/src/actions/components/index.js.map +1 -0
- package/dist/src/actions/confetti.d.ts +12 -0
- package/dist/src/actions/confetti.d.ts.map +1 -0
- package/dist/src/actions/confetti.js +36 -0
- package/dist/src/actions/confetti.js.map +1 -0
- package/dist/src/actions/forms.d.ts +12 -0
- package/dist/src/actions/forms.d.ts.map +1 -0
- package/dist/src/actions/forms.js +159 -0
- package/dist/src/actions/forms.js.map +1 -0
- package/dist/src/actions/index.d.ts +8 -0
- package/dist/src/actions/index.d.ts.map +1 -0
- package/dist/src/actions/index.js +7 -0
- package/dist/src/actions/index.js.map +1 -0
- package/dist/src/actions/request.d.ts +13 -0
- package/dist/src/actions/request.d.ts.map +1 -0
- package/dist/src/actions/request.js +83 -0
- package/dist/src/actions/request.js.map +1 -0
- package/dist/src/actions/response.d.ts +18 -0
- package/dist/src/actions/response.d.ts.map +1 -0
- package/dist/src/actions/response.js +104 -0
- package/dist/src/actions/response.js.map +1 -0
- package/dist/src/actions/triggers.d.ts +24 -0
- package/dist/src/actions/triggers.d.ts.map +1 -0
- package/dist/src/actions/triggers.js +107 -0
- package/dist/src/actions/triggers.js.map +1 -0
- package/dist/src/actions/types.d.ts +63 -0
- package/dist/src/actions/types.d.ts.map +1 -0
- package/dist/src/actions/types.js +2 -0
- package/dist/src/actions/types.js.map +1 -0
- package/dist/src/components/index.d.ts +5 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/index.js +11 -0
- package/dist/src/components/index.js.map +1 -0
- package/dist/src/dom/index.d.ts +26 -0
- package/dist/src/dom/index.d.ts.map +1 -0
- package/dist/src/dom/index.js +164 -0
- package/dist/src/dom/index.js.map +1 -0
- package/dist/src/flash/components/index.d.ts +28 -0
- package/dist/src/flash/components/index.d.ts.map +1 -0
- package/dist/src/flash/components/index.js +27 -0
- package/dist/src/flash/components/index.js.map +1 -0
- package/dist/src/flash/dialogs.d.ts +6 -0
- package/dist/src/flash/dialogs.d.ts.map +1 -0
- package/dist/src/flash/dialogs.js +120 -0
- package/dist/src/flash/dialogs.js.map +1 -0
- package/dist/src/flash/duration.d.ts +8 -0
- package/dist/src/flash/duration.d.ts.map +1 -0
- package/dist/src/flash/duration.js +20 -0
- package/dist/src/flash/duration.js.map +1 -0
- package/dist/src/flash/elements.d.ts +14 -0
- package/dist/src/flash/elements.d.ts.map +1 -0
- package/dist/src/flash/elements.js +67 -0
- package/dist/src/flash/elements.js.map +1 -0
- package/dist/src/flash/index.d.ts +8 -0
- package/dist/src/flash/index.d.ts.map +1 -0
- package/dist/src/flash/index.js +18 -0
- package/dist/src/flash/index.js.map +1 -0
- package/dist/src/flash/stack.d.ts +6 -0
- package/dist/src/flash/stack.d.ts.map +1 -0
- package/dist/src/flash/stack.js +56 -0
- package/dist/src/flash/stack.js.map +1 -0
- package/dist/src/flash/toast.d.ts +24 -0
- package/dist/src/flash/toast.d.ts.map +1 -0
- package/dist/src/flash/toast.js +67 -0
- package/dist/src/flash/toast.js.map +1 -0
- package/dist/src/flash/types.d.ts +29 -0
- package/dist/src/flash/types.d.ts.map +1 -0
- package/dist/src/flash/types.js +2 -0
- package/dist/src/flash/types.js.map +1 -0
- package/dist/src/http/index.d.ts +30 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/index.js +104 -0
- package/dist/src/http/index.js.map +1 -0
- package/dist/src/index.d.ts +40 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +104 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/inputs/components/index.d.ts +16 -0
- package/dist/src/inputs/components/index.d.ts.map +1 -0
- package/dist/src/inputs/components/index.js +112 -0
- package/dist/src/inputs/components/index.js.map +1 -0
- package/dist/src/inputs/index.d.ts +17 -0
- package/dist/src/inputs/index.d.ts.map +1 -0
- package/dist/src/inputs/index.js +54 -0
- package/dist/src/inputs/index.js.map +1 -0
- package/dist/src/inputs/upload/config.d.ts +57 -0
- package/dist/src/inputs/upload/config.d.ts.map +1 -0
- package/dist/src/inputs/upload/config.js +61 -0
- package/dist/src/inputs/upload/config.js.map +1 -0
- package/dist/src/inputs/upload/crop-session.d.ts +6 -0
- package/dist/src/inputs/upload/crop-session.d.ts.map +1 -0
- package/dist/src/inputs/upload/crop-session.js +204 -0
- package/dist/src/inputs/upload/crop-session.js.map +1 -0
- package/dist/src/inputs/upload/crop.d.ts +20 -0
- package/dist/src/inputs/upload/crop.d.ts.map +1 -0
- package/dist/src/inputs/upload/crop.js +124 -0
- package/dist/src/inputs/upload/crop.js.map +1 -0
- package/dist/src/inputs/upload/dom.d.ts +19 -0
- package/dist/src/inputs/upload/dom.d.ts.map +1 -0
- package/dist/src/inputs/upload/dom.js +74 -0
- package/dist/src/inputs/upload/dom.js.map +1 -0
- package/dist/src/inputs/upload/drop.d.ts +10 -0
- package/dist/src/inputs/upload/drop.d.ts.map +1 -0
- package/dist/src/inputs/upload/drop.js +92 -0
- package/dist/src/inputs/upload/drop.js.map +1 -0
- package/dist/src/inputs/upload/files.d.ts +14 -0
- package/dist/src/inputs/upload/files.d.ts.map +1 -0
- package/dist/src/inputs/upload/files.js +82 -0
- package/dist/src/inputs/upload/files.js.map +1 -0
- package/dist/src/inputs/upload/manager.d.ts +36 -0
- package/dist/src/inputs/upload/manager.d.ts.map +1 -0
- package/dist/src/inputs/upload/manager.js +236 -0
- package/dist/src/inputs/upload/manager.js.map +1 -0
- package/dist/src/inputs/upload/markup.d.ts +30 -0
- package/dist/src/inputs/upload/markup.d.ts.map +1 -0
- package/dist/src/inputs/upload/markup.js +118 -0
- package/dist/src/inputs/upload/markup.js.map +1 -0
- package/dist/src/inputs/upload/model.d.ts +41 -0
- package/dist/src/inputs/upload/model.d.ts.map +1 -0
- package/dist/src/inputs/upload/model.js +76 -0
- package/dist/src/inputs/upload/model.js.map +1 -0
- package/dist/src/inputs/upload/state.d.ts +16 -0
- package/dist/src/inputs/upload/state.d.ts.map +1 -0
- package/dist/src/inputs/upload/state.js +181 -0
- package/dist/src/inputs/upload/state.js.map +1 -0
- package/dist/src/inputs/upload/text.d.ts +7 -0
- package/dist/src/inputs/upload/text.d.ts.map +1 -0
- package/dist/src/inputs/upload/text.js +29 -0
- package/dist/src/inputs/upload/text.js.map +1 -0
- package/dist/src/inputs/upload/types.d.ts +86 -0
- package/dist/src/inputs/upload/types.d.ts.map +1 -0
- package/dist/src/inputs/upload/types.js +2 -0
- package/dist/src/inputs/upload/types.js.map +1 -0
- package/dist/src/layer/components/index.d.ts +12 -0
- package/dist/src/layer/components/index.d.ts.map +1 -0
- package/dist/src/layer/components/index.js +12 -0
- package/dist/src/layer/components/index.js.map +1 -0
- package/dist/src/layer/index.d.ts +22 -0
- package/dist/src/layer/index.d.ts.map +1 -0
- package/dist/src/layer/index.js +159 -0
- package/dist/src/layer/index.js.map +1 -0
- package/dist/src/live/components/index.d.ts +15 -0
- package/dist/src/live/components/index.d.ts.map +1 -0
- package/dist/src/live/components/index.js +12 -0
- package/dist/src/live/components/index.js.map +1 -0
- package/dist/src/live/index.d.ts +29 -0
- package/dist/src/live/index.d.ts.map +1 -0
- package/dist/src/live/index.js +103 -0
- package/dist/src/live/index.js.map +1 -0
- package/dist/src/logging/index.d.ts +17 -0
- package/dist/src/logging/index.d.ts.map +1 -0
- package/dist/src/logging/index.js +68 -0
- package/dist/src/logging/index.js.map +1 -0
- package/dist/src/modal/components/index.d.ts +18 -0
- package/dist/src/modal/components/index.d.ts.map +1 -0
- package/dist/src/modal/components/index.js +20 -0
- package/dist/src/modal/components/index.js.map +1 -0
- package/dist/src/modal/index.d.ts +24 -0
- package/dist/src/modal/index.d.ts.map +1 -0
- package/dist/src/modal/index.js +184 -0
- package/dist/src/modal/index.js.map +1 -0
- package/dist/src/popover/components/index.d.ts +14 -0
- package/dist/src/popover/components/index.d.ts.map +1 -0
- package/dist/src/popover/components/index.js +16 -0
- package/dist/src/popover/components/index.js.map +1 -0
- package/dist/src/popover/index.d.ts +16 -0
- package/dist/src/popover/index.d.ts.map +1 -0
- package/dist/src/popover/index.js +140 -0
- package/dist/src/popover/index.js.map +1 -0
- package/dist/src/progress/components/index.d.ts +10 -0
- package/dist/src/progress/components/index.d.ts.map +1 -0
- package/dist/src/progress/components/index.js +14 -0
- package/dist/src/progress/components/index.js.map +1 -0
- package/dist/src/progress/index.d.ts +18 -0
- package/dist/src/progress/index.d.ts.map +1 -0
- package/dist/src/progress/index.js +89 -0
- package/dist/src/progress/index.js.map +1 -0
- package/dist/src/react/index.d.ts +17 -0
- package/dist/src/react/index.d.ts.map +1 -0
- package/dist/src/react/index.js +47 -0
- package/dist/src/react/index.js.map +1 -0
- package/dist/src/styles/index.d.ts +3 -0
- package/dist/src/styles/index.d.ts.map +1 -0
- package/dist/src/styles/index.js +14 -0
- package/dist/src/styles/index.js.map +1 -0
- package/dist/src/theme/components/index.d.ts +14 -0
- package/dist/src/theme/components/index.d.ts.map +1 -0
- package/dist/src/theme/components/index.js +13 -0
- package/dist/src/theme/components/index.js.map +1 -0
- package/dist/src/theme/index.d.ts +26 -0
- package/dist/src/theme/index.d.ts.map +1 -0
- package/dist/src/theme/index.js +119 -0
- package/dist/src/theme/index.js.map +1 -0
- package/dist/src/tooltip/components/index.d.ts +17 -0
- package/dist/src/tooltip/components/index.d.ts.map +1 -0
- package/dist/src/tooltip/components/index.js +20 -0
- package/dist/src/tooltip/components/index.js.map +1 -0
- package/dist/src/tooltip/index.d.ts +10 -0
- package/dist/src/tooltip/index.d.ts.map +1 -0
- package/dist/src/tooltip/index.js +171 -0
- package/dist/src/tooltip/index.js.map +1 -0
- package/dist/styles/index.d.ts +3 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +14 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/styles/tokens.scss +22 -0
- package/dist/styles/utils.scss +220 -0
- package/dist/theme/components/index.d.ts +14 -0
- package/dist/theme/components/index.d.ts.map +1 -0
- package/dist/theme/components/index.js +13 -0
- package/dist/theme/components/index.js.map +1 -0
- package/dist/theme/index.d.ts +26 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +119 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/tooltip/components/index.d.ts +17 -0
- package/dist/tooltip/components/index.d.ts.map +1 -0
- package/dist/tooltip/components/index.js +20 -0
- package/dist/tooltip/components/index.js.map +1 -0
- package/dist/tooltip/index.d.ts +10 -0
- package/dist/tooltip/index.d.ts.map +1 -0
- package/dist/tooltip/index.js +171 -0
- package/dist/tooltip/index.js.map +1 -0
- package/dist/tooltip/styles/index.scss +17 -0
- package/package.json +232 -0
package/README.md
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# @trebired/frontend
|
|
2
|
+
|
|
3
|
+
Generic browser runtime systems for DOM binding, actions, overlays, theme state, live refresh, inputs, upload, and React rendering in the Trebired ecosystem.
|
|
4
|
+
|
|
5
|
+
`@trebired/frontend` owns reusable browser behavior. Callers own product routes, product copy, storage keys, icon systems, persistence, navigation, logging, and backend response contracts beyond the documented generic JSON shape.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Runtime support: Bun 1+.
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
bun i @trebired/frontend
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Quick Start
|
|
16
|
+
|
|
17
|
+
Bind the canonical runtime after your document shell is available:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { bindFrontendRuntime } from "@trebired/frontend";
|
|
21
|
+
|
|
22
|
+
bindFrontendRuntime(document, {
|
|
23
|
+
adapters: {
|
|
24
|
+
navigation: {
|
|
25
|
+
navigate(url) {
|
|
26
|
+
window.location.assign(url);
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Load only the SCSS systems your product uses:
|
|
34
|
+
|
|
35
|
+
```scss
|
|
36
|
+
@use "@trebired/frontend/styles/tokens" as *;
|
|
37
|
+
@use "@trebired/frontend/styles/utils" as *;
|
|
38
|
+
@use "@trebired/frontend/actions/styles" as *;
|
|
39
|
+
@use "@trebired/frontend/flash/styles" as *;
|
|
40
|
+
@use "@trebired/frontend/progress/styles" as *;
|
|
41
|
+
@use "@trebired/frontend/layer/styles" as *;
|
|
42
|
+
@use "@trebired/frontend/tooltip/styles" as *;
|
|
43
|
+
@use "@trebired/frontend/popover/styles" as *;
|
|
44
|
+
@use "@trebired/frontend/modal/styles" as *;
|
|
45
|
+
@use "@trebired/frontend/inputs/styles" as *;
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Markup stays normal HTML:
|
|
49
|
+
|
|
50
|
+
```html
|
|
51
|
+
<form method="post" action="/api/save" data-tbf-action>
|
|
52
|
+
<input name="title" />
|
|
53
|
+
<button type="submit" data-tbf-confetti="true">Save</button>
|
|
54
|
+
</form>
|
|
55
|
+
|
|
56
|
+
<button type="button" aria-controls="settings" data-tbf-modal-open>
|
|
57
|
+
Settings
|
|
58
|
+
</button>
|
|
59
|
+
<div id="settings" class="tbf-modal" data-tbf-modal aria-hidden="true">
|
|
60
|
+
<div class="tbf-modal__content" data-tbf-modal-content>
|
|
61
|
+
<button type="button" data-tbf-modal-close>Close</button>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
TSX components are available from system component subpaths when a product wants package-owned default markup:
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
import { UploadField } from "@trebired/frontend/inputs/components";
|
|
70
|
+
|
|
71
|
+
export function AvatarUpload() {
|
|
72
|
+
return (
|
|
73
|
+
<UploadField
|
|
74
|
+
name="avatar"
|
|
75
|
+
accept="image/png,image/jpeg"
|
|
76
|
+
crop={true}
|
|
77
|
+
preview={true}
|
|
78
|
+
drop={true}
|
|
79
|
+
emptyToggle={{ name: "avatar_empty", value: "1" }}
|
|
80
|
+
/>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Concepts
|
|
86
|
+
|
|
87
|
+
### Runtime Ownership
|
|
88
|
+
|
|
89
|
+
The package exposes feature binders such as `bindActionForms(root)`, `bindTooltips(root)`, `bindModals(root)`, `bindUploads(root)`, and the root `bindFrontendRuntime(root, options)` binder. Binders are idempotent and accept `Document`, `HTMLElement`, or `DocumentFragment` roots.
|
|
90
|
+
|
|
91
|
+
### Adapter Boundary
|
|
92
|
+
|
|
93
|
+
Options accept adapters for logger, i18n, navigation, reload, progress, flash, theme persistence, and live skip checks. Defaults stay browser-generic. Runtime logging uses `@trebired/logger-adapter` and emits under `trebired.frontend.*`.
|
|
94
|
+
|
|
95
|
+
### Data Attributes
|
|
96
|
+
|
|
97
|
+
The package-owned selectors use `data-tbf-*` attributes. They never require custom elements.
|
|
98
|
+
|
|
99
|
+
### Markup Components
|
|
100
|
+
|
|
101
|
+
Component subpaths render real HTML with `data-tbf-*` attributes and `tbf-*` classes. They are not exported from `@trebired/frontend`, so the root runtime stays browser-behavior only.
|
|
102
|
+
|
|
103
|
+
Upload markup includes hidden file and directory inputs, mixed file/folder buttons, multiple-file support, drag/drop slots, accepted-format metadata, preview slots, list output, clear-current-preview state, crop config, a crop hidden field, and an empty-toggle hidden field.
|
|
104
|
+
|
|
105
|
+
## Configuration
|
|
106
|
+
|
|
107
|
+
### Runtime Options
|
|
108
|
+
|
|
109
|
+
`bindFrontendRuntime(root, options)` accepts:
|
|
110
|
+
|
|
111
|
+
- `adapters.logger`
|
|
112
|
+
- `adapters.loggerAdapter`
|
|
113
|
+
- `adapters.defaultLogger`
|
|
114
|
+
- `adapters.i18n`
|
|
115
|
+
- `adapters.navigation`
|
|
116
|
+
- `adapters.reload`
|
|
117
|
+
- `adapters.progress`
|
|
118
|
+
- `adapters.flash`
|
|
119
|
+
- `adapters.themePersistence`
|
|
120
|
+
- `adapters.live`
|
|
121
|
+
- `theme`
|
|
122
|
+
- `live`
|
|
123
|
+
- `observe`
|
|
124
|
+
- `frontend_quiet`
|
|
125
|
+
- `quiet`
|
|
126
|
+
|
|
127
|
+
Set `frontend_quiet: true`, `quiet: true`, `globalThis.frontend_quiet = true`, or `<html data-tbf-frontend-quiet="true">` to disable package runtime logging.
|
|
128
|
+
|
|
129
|
+
## Runtime
|
|
130
|
+
|
|
131
|
+
### Binding Order
|
|
132
|
+
|
|
133
|
+
The canonical runtime binds theme, layer roots, progress, flash, inputs, uploads, tooltips, popovers, modals, actions, and live refresh in that order.
|
|
134
|
+
|
|
135
|
+
### CSS
|
|
136
|
+
|
|
137
|
+
There is no aggregate CSS file. Each style-owning system exposes SCSS through package exports so `@trebired/bundler` can resolve package `sass` and `style` conditions from `node_modules`.
|
|
138
|
+
|
|
139
|
+
Default SCSS is intentionally plain: `tbf-*` classes, CSS variables, black/white fallback colors, and square radius fallbacks. Products own visual polish by overriding variables.
|
|
140
|
+
|
|
141
|
+
Base exports:
|
|
142
|
+
|
|
143
|
+
- `@trebired/frontend/styles/tokens`
|
|
144
|
+
- `@trebired/frontend/styles/utils`
|
|
145
|
+
|
|
146
|
+
System exports:
|
|
147
|
+
|
|
148
|
+
- `@trebired/frontend/actions/styles`
|
|
149
|
+
- `@trebired/frontend/flash/styles`
|
|
150
|
+
- `@trebired/frontend/progress/styles`
|
|
151
|
+
- `@trebired/frontend/layer/styles`
|
|
152
|
+
- `@trebired/frontend/tooltip/styles`
|
|
153
|
+
- `@trebired/frontend/popover/styles`
|
|
154
|
+
- `@trebired/frontend/modal/styles`
|
|
155
|
+
- `@trebired/frontend/inputs/styles`
|
|
156
|
+
|
|
157
|
+
### Upload Crop
|
|
158
|
+
|
|
159
|
+
Upload crop uses `cropperjs` only through the upload crop path. The root runtime import and the normal `@trebired/frontend/inputs` import do not load cropper or TSX component modules until a crop session opens.
|
|
160
|
+
|
|
161
|
+
## Public API
|
|
162
|
+
|
|
163
|
+
Entrypoints:
|
|
164
|
+
|
|
165
|
+
- `@trebired/frontend`
|
|
166
|
+
- `@trebired/frontend/dom`
|
|
167
|
+
- `@trebired/frontend/http`
|
|
168
|
+
- `@trebired/frontend/actions`
|
|
169
|
+
- `@trebired/frontend/actions/components`
|
|
170
|
+
- `@trebired/frontend/flash`
|
|
171
|
+
- `@trebired/frontend/flash/components`
|
|
172
|
+
- `@trebired/frontend/progress`
|
|
173
|
+
- `@trebired/frontend/progress/components`
|
|
174
|
+
- `@trebired/frontend/layer`
|
|
175
|
+
- `@trebired/frontend/layer/components`
|
|
176
|
+
- `@trebired/frontend/tooltip`
|
|
177
|
+
- `@trebired/frontend/tooltip/components`
|
|
178
|
+
- `@trebired/frontend/popover`
|
|
179
|
+
- `@trebired/frontend/popover/components`
|
|
180
|
+
- `@trebired/frontend/modal`
|
|
181
|
+
- `@trebired/frontend/modal/components`
|
|
182
|
+
- `@trebired/frontend/inputs`
|
|
183
|
+
- `@trebired/frontend/inputs/components`
|
|
184
|
+
- `@trebired/frontend/theme`
|
|
185
|
+
- `@trebired/frontend/theme/components`
|
|
186
|
+
- `@trebired/frontend/live`
|
|
187
|
+
- `@trebired/frontend/live/components`
|
|
188
|
+
- `@trebired/frontend/react`
|
|
189
|
+
- `@trebired/frontend/styles`
|
|
190
|
+
- `@trebired/frontend/styles/tokens`
|
|
191
|
+
- `@trebired/frontend/styles/utils`
|
|
192
|
+
- `@trebired/frontend/actions/styles`
|
|
193
|
+
- `@trebired/frontend/flash/styles`
|
|
194
|
+
- `@trebired/frontend/progress/styles`
|
|
195
|
+
- `@trebired/frontend/layer/styles`
|
|
196
|
+
- `@trebired/frontend/tooltip/styles`
|
|
197
|
+
- `@trebired/frontend/popover/styles`
|
|
198
|
+
- `@trebired/frontend/modal/styles`
|
|
199
|
+
- `@trebired/frontend/inputs/styles`
|
|
200
|
+
|
|
201
|
+
## What It Does Not Do
|
|
202
|
+
|
|
203
|
+
This package does not:
|
|
204
|
+
|
|
205
|
+
- define custom elements
|
|
206
|
+
- render Markdown or MDX
|
|
207
|
+
- export markup components from the root entrypoint
|
|
208
|
+
- ship an aggregate `styles.css`
|
|
209
|
+
- own product routes, domains, copy, or storage keys
|
|
210
|
+
- require a specific icon system
|
|
211
|
+
- migrate an existing application to consume the package
|
|
212
|
+
- replace framework-specific component libraries
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type BindRoot } from "../dom/index.d.ts";
|
|
2
|
+
import type { ActionJson, SubmitActionButtonOptions } from "./types.js";
|
|
3
|
+
declare const ACTION_BUTTON_SELECTOR = "[data-tbf-submit],[data-tbf-action-url]";
|
|
4
|
+
declare function submitActionButton(button: HTMLElement, event?: Event, options?: SubmitActionButtonOptions): Promise<ActionJson>;
|
|
5
|
+
declare function bindActionButton(button: HTMLElement | null, options?: SubmitActionButtonOptions): boolean;
|
|
6
|
+
declare function bindActionButtons(root?: BindRoot, options?: SubmitActionButtonOptions): void;
|
|
7
|
+
export { ACTION_BUTTON_SELECTOR, bindActionButton, bindActionButtons, submitActionButton, };
|
|
8
|
+
//# sourceMappingURL=buttons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buttons.d.ts","sourceRoot":"","sources":["../../../src/actions/buttons.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAExE,QAAA,MAAM,sBAAsB,4CACe,CAAC;AAqE5C,iBAAe,kBAAkB,CAC/B,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,KAAK,EACb,OAAO,GAAE,yBAA8B,uBAmCxC;AAED,iBAAS,gBAAgB,CACvB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,GAAE,yBAA8B,WASxC;AAED,iBAAS,iBAAiB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,yBAA8B,QAI5F;AAED,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { queryAll, readDataJson, setControlDisabled, } from "../dom/index.js";
|
|
2
|
+
import { flash as defaultFlash } from "../flash/index.js";
|
|
3
|
+
import { maybeFireActionSuccessConfetti } from "./confetti.js";
|
|
4
|
+
import { handleJson } from "./request.js";
|
|
5
|
+
import { actionResponseOk } from "./response.js";
|
|
6
|
+
const ACTION_BUTTON_SELECTOR = "[data-tbf-submit],[data-tbf-action-url]";
|
|
7
|
+
const boundButtons = new WeakMap();
|
|
8
|
+
function buttonUrl(button, options) {
|
|
9
|
+
return String(options.url || button.getAttribute("data-tbf-action-url") || "").trim();
|
|
10
|
+
}
|
|
11
|
+
function buttonMethod(button, options) {
|
|
12
|
+
return String(options.method || button.getAttribute("data-tbf-action-method") || "post").toUpperCase();
|
|
13
|
+
}
|
|
14
|
+
function readButtonBody(button, options) {
|
|
15
|
+
if (options.body !== undefined)
|
|
16
|
+
return options.body;
|
|
17
|
+
return readDataJson(button, "data-tbf-action-body", {});
|
|
18
|
+
}
|
|
19
|
+
function dispatchActionButtonEvent(button, name, detail, cancelable = false) {
|
|
20
|
+
const event = new CustomEvent(name, {
|
|
21
|
+
bubbles: true,
|
|
22
|
+
cancelable,
|
|
23
|
+
detail: { ...detail, button },
|
|
24
|
+
});
|
|
25
|
+
button.dispatchEvent(event);
|
|
26
|
+
return event;
|
|
27
|
+
}
|
|
28
|
+
async function confirmActionButton(button, options) {
|
|
29
|
+
const configured = options.confirm === true || button.hasAttribute("data-tbf-confirm");
|
|
30
|
+
if (!configured && !button.hasAttribute("data-tbf-confirm-title"))
|
|
31
|
+
return true;
|
|
32
|
+
const detail = { button, confirm: null };
|
|
33
|
+
const event = dispatchActionButtonEvent(button, "tbf:action-confirm", detail, true);
|
|
34
|
+
if (event.defaultPrevented)
|
|
35
|
+
return false;
|
|
36
|
+
if (detail.confirm !== null && detail.confirm !== undefined) {
|
|
37
|
+
const value = typeof detail.confirm === "function" ? detail.confirm() : detail.confirm;
|
|
38
|
+
return Boolean(await value);
|
|
39
|
+
}
|
|
40
|
+
const flashApi = options.adapters?.flash || defaultFlash;
|
|
41
|
+
return await flashApi.confirmElement?.(button, button);
|
|
42
|
+
}
|
|
43
|
+
async function resolveCustomActionButtonRequest(button, options) {
|
|
44
|
+
if (typeof options.request === "function") {
|
|
45
|
+
return { handled: true, json: await options.request() };
|
|
46
|
+
}
|
|
47
|
+
const detail = { button, handled: false, json: null, request: null };
|
|
48
|
+
const event = dispatchActionButtonEvent(button, "tbf:action-request", detail, true);
|
|
49
|
+
if (!event.defaultPrevented && !detail.handled && detail.request == null) {
|
|
50
|
+
return { handled: false, json: null };
|
|
51
|
+
}
|
|
52
|
+
if (typeof detail.request === "function") {
|
|
53
|
+
return { handled: true, json: await detail.request() };
|
|
54
|
+
}
|
|
55
|
+
if (detail.request && typeof detail.request.then === "function") {
|
|
56
|
+
return { handled: true, json: await detail.request };
|
|
57
|
+
}
|
|
58
|
+
return { handled: true, json: detail.json };
|
|
59
|
+
}
|
|
60
|
+
async function submitActionButton(button, event, options = {}) {
|
|
61
|
+
event?.preventDefault();
|
|
62
|
+
event?.stopImmediatePropagation();
|
|
63
|
+
if (!(await confirmActionButton(button, options)))
|
|
64
|
+
return null;
|
|
65
|
+
const wasDisabled = button.hasAttribute("disabled") || button.disabled === true;
|
|
66
|
+
let json = null;
|
|
67
|
+
setControlDisabled(button, true);
|
|
68
|
+
try {
|
|
69
|
+
dispatchActionButtonEvent(button, "tbf:action-submit", {});
|
|
70
|
+
const custom = await resolveCustomActionButtonRequest(button, options);
|
|
71
|
+
json = custom.handled
|
|
72
|
+
? custom.json
|
|
73
|
+
: await handleJson(buttonUrl(button, options), {
|
|
74
|
+
adapters: options.adapters,
|
|
75
|
+
body: readButtonBody(button, options),
|
|
76
|
+
method: buttonMethod(button, options),
|
|
77
|
+
ui: options.ui,
|
|
78
|
+
});
|
|
79
|
+
const ok = actionResponseOk(json);
|
|
80
|
+
if (ok)
|
|
81
|
+
maybeFireActionSuccessConfetti(button, options.successConfetti === true);
|
|
82
|
+
dispatchActionButtonEvent(button, "tbf:action-complete", { json, ok });
|
|
83
|
+
return json;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
dispatchActionButtonEvent(button, "tbf:action-complete", {
|
|
87
|
+
error,
|
|
88
|
+
json: null,
|
|
89
|
+
ok: false,
|
|
90
|
+
});
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
if (!wasDisabled && options.keepDisabled?.(json) !== true) {
|
|
95
|
+
setControlDisabled(button, false);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function bindActionButton(button, options = {}) {
|
|
100
|
+
if (!(button instanceof HTMLElement) || boundButtons.has(button))
|
|
101
|
+
return false;
|
|
102
|
+
const handler = (event) => {
|
|
103
|
+
if (!event.defaultPrevented)
|
|
104
|
+
void submitActionButton(button, event, options);
|
|
105
|
+
};
|
|
106
|
+
button.addEventListener("click", handler);
|
|
107
|
+
boundButtons.set(button, handler);
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
function bindActionButtons(root = document, options = {}) {
|
|
111
|
+
queryAll(root, ACTION_BUTTON_SELECTOR).forEach((button) => {
|
|
112
|
+
bindActionButton(button, options);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
export { ACTION_BUTTON_SELECTOR, bindActionButton, bindActionButtons, submitActionButton, };
|
|
116
|
+
//# sourceMappingURL=buttons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buttons.js","sourceRoot":"","sources":["../../../src/actions/buttons.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ButtonHTMLAttributes, FormHTMLAttributes, HTMLAttributes, ReactNode } from "react";
|
|
2
|
+
type ActionFormProps = FormHTMLAttributes<HTMLFormElement> & {
|
|
3
|
+
actionConfig?: Record<string, unknown>;
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
confirm?: boolean;
|
|
6
|
+
jsonBody?: boolean;
|
|
7
|
+
silent?: boolean;
|
|
8
|
+
successConfetti?: boolean;
|
|
9
|
+
};
|
|
10
|
+
type ActionButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
11
|
+
actionBody?: Record<string, unknown>;
|
|
12
|
+
actionMethod?: string;
|
|
13
|
+
actionUrl?: string;
|
|
14
|
+
confirm?: boolean;
|
|
15
|
+
successConfetti?: boolean;
|
|
16
|
+
};
|
|
17
|
+
type ActionTriggerProps = HTMLAttributes<HTMLButtonElement> & {
|
|
18
|
+
action: string;
|
|
19
|
+
href?: string;
|
|
20
|
+
};
|
|
21
|
+
declare function ActionForm(props: ActionFormProps): import("react").JSX.Element;
|
|
22
|
+
declare function ActionButton(props: ActionButtonProps): import("react").JSX.Element;
|
|
23
|
+
declare function ActionTrigger(props: ActionTriggerProps): import("react").JSX.Element;
|
|
24
|
+
export { ActionButton, ActionForm, ActionTrigger };
|
|
25
|
+
export type { ActionButtonProps, ActionFormProps, ActionTriggerProps };
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/actions/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,SAAS,EACV,MAAM,OAAO,CAAC;AAGf,KAAK,eAAe,GAAG,kBAAkB,CAAC,eAAe,CAAC,GAAG;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,KAAK,iBAAiB,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,KAAK,kBAAkB,GAAG,cAAc,CAAC,iBAAiB,CAAC,GAAG;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAWF,iBAAS,UAAU,CAAC,KAAK,EAAE,eAAe,+BA8BzC;AAED,iBAAS,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BA0B7C;AAED,iBAAS,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAe/C;AAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { classNames, dataBool, jsonScript } from "../../components/index.js";
|
|
3
|
+
function actionConfig(props) {
|
|
4
|
+
return {
|
|
5
|
+
...(props.actionConfig || {}),
|
|
6
|
+
...(props.jsonBody ? { body: "json" } : {}),
|
|
7
|
+
...(props.silent ? { silent: true } : {}),
|
|
8
|
+
...(props.successConfetti ? { successConfetti: true } : {}),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function ActionForm(props) {
|
|
12
|
+
const { actionConfig: _actionConfig, children, className, confirm, jsonBody: _jsonBody, silent: _silent, successConfetti: _successConfetti, ...rest } = props;
|
|
13
|
+
const config = actionConfig(props);
|
|
14
|
+
return (_jsxs("form", { ...rest, className: classNames("tbf-form", className), "data-tbf-action": "", "data-tbf-confirm": dataBool(confirm), children: [Object.keys(config).length ? (_jsx("script", { "data-tbf-action-config": "", hidden: true, type: "application/json", dangerouslySetInnerHTML: { __html: jsonScript(config) } })) : null, children] }));
|
|
15
|
+
}
|
|
16
|
+
function ActionButton(props) {
|
|
17
|
+
const { actionBody, actionMethod, actionUrl, children, className, confirm, successConfetti, type = "button", ...rest } = props;
|
|
18
|
+
return (_jsx("button", { ...rest, className: classNames("tbf-button", className), "data-tbf-action-body": actionBody ? jsonScript(actionBody) : undefined, "data-tbf-action-method": actionMethod, "data-tbf-action-url": actionUrl, "data-tbf-confetti": dataBool(successConfetti), "data-tbf-confirm": dataBool(confirm), type: type, children: children }));
|
|
19
|
+
}
|
|
20
|
+
function ActionTrigger(props) {
|
|
21
|
+
const { action, children, className, href, role, tabIndex, ...rest } = props;
|
|
22
|
+
return (_jsx("button", { ...rest, className: classNames("tbf-action-trigger", className), "data-tbf-action-trigger": action, "data-tbf-href": href, role: role, tabIndex: tabIndex, type: "button", children: children }));
|
|
23
|
+
}
|
|
24
|
+
export { ActionButton, ActionForm, ActionTrigger };
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/actions/components/index.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAwBjE,SAAS,YAAY,CAAC,KAAsB;IAC1C,OAAO;QACL,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;QAC7B,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAsB;IACxC,MAAM,EACJ,YAAY,EAAE,aAAa,EAC3B,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EAAE,SAAS,EACnB,MAAM,EAAE,OAAO,EACf,eAAe,EAAE,gBAAgB,EACjC,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IACV,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,CACL,mBACM,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,qBAC5B,EAAE,sBACA,QAAQ,CAAC,OAAO,CAAC,aAElC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAC5B,2CACyB,EAAE,EACzB,MAAM,QACN,IAAI,EAAC,kBAAkB,EACvB,uBAAuB,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,GACvD,CACH,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,IACJ,CACR,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAwB;IAC5C,MAAM,EACJ,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,SAAS,EACT,OAAO,EACP,eAAe,EACf,IAAI,GAAG,QAAQ,EACf,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IACV,OAAO,CACL,oBACM,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,YAAY,EAAE,SAAS,CAAC,0BACxB,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,4BAC7C,YAAY,yBACf,SAAS,uBACX,QAAQ,CAAC,eAAe,CAAC,sBAC1B,QAAQ,CAAC,OAAO,CAAC,EACnC,IAAI,EAAE,IAAI,YAET,QAAQ,GACF,CACV,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC9C,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC7E,OAAO,CACL,oBACM,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,oBAAoB,EAAE,SAAS,CAAC,6BAC7B,MAAM,mBAChB,IAAI,EACnB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,QAAQ,YAEZ,QAAQ,GACF,CACV,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare const CONFETTI_EVENT = "tbf:confetti";
|
|
2
|
+
declare const CONFETTI_SELECTOR = "[data-tbf-confetti=\"true\"],[data-tbf-confetti=\"1\"]";
|
|
3
|
+
type ConfettiOptions = {
|
|
4
|
+
durationMs?: number;
|
|
5
|
+
particles?: number;
|
|
6
|
+
};
|
|
7
|
+
declare function shouldFireActionSuccessConfetti(trigger: HTMLElement | null, configured?: boolean): boolean;
|
|
8
|
+
declare function fireSuccessConfetti(options?: ConfettiOptions): boolean;
|
|
9
|
+
declare function maybeFireActionSuccessConfetti(trigger: HTMLElement | null, configured?: boolean, options?: ConfettiOptions): boolean;
|
|
10
|
+
export { CONFETTI_EVENT, CONFETTI_SELECTOR, fireSuccessConfetti, maybeFireActionSuccessConfetti, shouldFireActionSuccessConfetti, };
|
|
11
|
+
export type { ConfettiOptions };
|
|
12
|
+
//# sourceMappingURL=confetti.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confetti.d.ts","sourceRoot":"","sources":["../../../src/actions/confetti.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,iBAAiB,CAAC;AACtC,QAAA,MAAM,iBAAiB,2DAAuD,CAAC;AAE/E,KAAK,eAAe,GAAG;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,iBAAS,+BAA+B,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,UAAU,UAAQ,WAGvF;AAED,iBAAS,mBAAmB,CAAC,OAAO,GAAE,eAAoB,WAsBzD;AAED,iBAAS,8BAA8B,CACrC,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,UAAU,UAAQ,EAClB,OAAO,GAAE,eAAoB,WAI9B;AAED,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,8BAA8B,EAC9B,+BAA+B,GAChC,CAAC;AACF,YAAY,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const CONFETTI_EVENT = "tbf:confetti";
|
|
2
|
+
const CONFETTI_SELECTOR = '[data-tbf-confetti="true"],[data-tbf-confetti="1"]';
|
|
3
|
+
function shouldFireActionSuccessConfetti(trigger, configured = false) {
|
|
4
|
+
if (configured)
|
|
5
|
+
return true;
|
|
6
|
+
return Boolean(trigger && trigger.matches(CONFETTI_SELECTOR));
|
|
7
|
+
}
|
|
8
|
+
function fireSuccessConfetti(options = {}) {
|
|
9
|
+
if (typeof document === "undefined")
|
|
10
|
+
return false;
|
|
11
|
+
const particles = Math.max(8, Math.min(80, Number(options.particles) || 36));
|
|
12
|
+
const layer = document.createElement("div");
|
|
13
|
+
layer.className = "tbf-confetti";
|
|
14
|
+
layer.setAttribute("aria-hidden", "true");
|
|
15
|
+
for (let index = 0; index < particles; index += 1) {
|
|
16
|
+
const piece = document.createElement("i");
|
|
17
|
+
piece.style.setProperty("--x", `${Math.random() * 100}vw`);
|
|
18
|
+
piece.style.setProperty("--d", `${Math.random() * 0.7 + 0.4}s`);
|
|
19
|
+
piece.style.setProperty("--r", `${Math.random() * 360}deg`);
|
|
20
|
+
piece.style.setProperty("--tbf-confetti-hue", `${Math.floor(Math.random() * 360)}deg`);
|
|
21
|
+
layer.appendChild(piece);
|
|
22
|
+
}
|
|
23
|
+
document.body.appendChild(layer);
|
|
24
|
+
document.dispatchEvent(new CustomEvent(CONFETTI_EVENT, {
|
|
25
|
+
detail: { layer, options },
|
|
26
|
+
}));
|
|
27
|
+
window.setTimeout(() => layer.remove(), Number(options.durationMs) || 1400);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
function maybeFireActionSuccessConfetti(trigger, configured = false, options = {}) {
|
|
31
|
+
if (!shouldFireActionSuccessConfetti(trigger, configured))
|
|
32
|
+
return false;
|
|
33
|
+
return fireSuccessConfetti(options);
|
|
34
|
+
}
|
|
35
|
+
export { CONFETTI_EVENT, CONFETTI_SELECTOR, fireSuccessConfetti, maybeFireActionSuccessConfetti, shouldFireActionSuccessConfetti, };
|
|
36
|
+
//# sourceMappingURL=confetti.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confetti.js","sourceRoot":"","sources":["../../../src/actions/confetti.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,cAAc,CAAC;AACtC,MAAM,iBAAiB,GAAG,oDAAoD,CAAC;AAO/E,SAAS,+BAA+B,CAAC,OAA2B,EAAE,UAAU,GAAG,KAAK;IACtF,IAAI,UAAU;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,mBAAmB,CAAC,UAA2B,EAAE;IACxD,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,KAAK,CAAC,SAAS,GAAG,cAAc,CAAC;IACjC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3D,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAChE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;QAC5D,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACvF,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,cAAc,EAAE;QAC9B,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC3B,CAAC,CACH,CAAC;IACF,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,8BAA8B,CACrC,OAA2B,EAC3B,UAAU,GAAG,KAAK,EAClB,UAA2B,EAAE;IAE7B,IAAI,CAAC,+BAA+B,CAAC,OAAO,EAAE,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,8BAA8B,EAC9B,+BAA+B,GAChC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type BindRoot } from "../dom/index.d.ts";
|
|
2
|
+
import type { SubmitActionFormOptions } from "./types.js";
|
|
3
|
+
declare const ACTION_FORM_SELECTOR = "form[data-tbf-action]";
|
|
4
|
+
declare const ACTION_CONFIG_SELECTOR = "script[type=\"application/json\"][data-tbf-action-config]";
|
|
5
|
+
declare function readActionFormConfig(form: HTMLFormElement): {
|
|
6
|
+
[x: string]: unknown;
|
|
7
|
+
};
|
|
8
|
+
declare function submitActionForm(form: HTMLFormElement, event?: SubmitEvent, options?: SubmitActionFormOptions): Promise<any>;
|
|
9
|
+
declare function bindActionForm(form: HTMLFormElement | null, options?: SubmitActionFormOptions): boolean;
|
|
10
|
+
declare function bindActionForms(root?: BindRoot, options?: SubmitActionFormOptions): void;
|
|
11
|
+
export { ACTION_CONFIG_SELECTOR, ACTION_FORM_SELECTOR, bindActionForm, bindActionForms, readActionFormConfig, submitActionForm, };
|
|
12
|
+
//# sourceMappingURL=forms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/actions/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AAMvB,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,oBAAoB,0BAA0B,CAAC;AACrD,QAAA,MAAM,sBAAsB,8DAC+B,CAAC;AAW5D,iBAAS,oBAAoB,CAAC,IAAI,EAAE,eAAe;;EAKlD;AA8GD,iBAAe,gBAAgB,CAC7B,IAAI,EAAE,eAAe,EACrB,KAAK,CAAC,EAAE,WAAW,EACnB,OAAO,GAAE,uBAA4B,gBA+CtC;AAED,iBAAS,cAAc,CACrB,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,OAAO,GAAE,uBAA4B,WAStC;AAED,iBAAS,eAAe,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,uBAA4B,QAIxF;AAED,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { formDataFlatRecord, formDataSearchParams, queryAll, readDataJson, readElementJson, setControlDisabled, } from "../dom/index.js";
|
|
2
|
+
import { ensureFormCsrfToken } from "../http/index.js";
|
|
3
|
+
import { flash as defaultFlash } from "../flash/index.js";
|
|
4
|
+
import { maybeFireActionSuccessConfetti } from "./confetti.js";
|
|
5
|
+
import { handleJson } from "./request.js";
|
|
6
|
+
import { actionResponseOk } from "./response.js";
|
|
7
|
+
const ACTION_FORM_SELECTOR = "form[data-tbf-action]";
|
|
8
|
+
const ACTION_CONFIG_SELECTOR = 'script[type="application/json"][data-tbf-action-config]';
|
|
9
|
+
const boundForms = new WeakMap();
|
|
10
|
+
function submitterFor(event) {
|
|
11
|
+
return event?.submitter instanceof HTMLElement ? event.submitter : null;
|
|
12
|
+
}
|
|
13
|
+
function submitterAttr(submitter, attr) {
|
|
14
|
+
return String(submitter?.getAttribute(attr) || "").trim();
|
|
15
|
+
}
|
|
16
|
+
function readActionFormConfig(form) {
|
|
17
|
+
return {
|
|
18
|
+
...readElementJson(form, ACTION_CONFIG_SELECTOR, {}),
|
|
19
|
+
...readDataJson(form, "data-tbf-action-config", {}),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function resolveSubmitAction(form, submitter) {
|
|
23
|
+
return submitterAttr(submitter, "formaction") || form.action;
|
|
24
|
+
}
|
|
25
|
+
function resolveSubmitMethod(form, submitter) {
|
|
26
|
+
return (submitterAttr(submitter, "formmethod") ||
|
|
27
|
+
String(form.getAttribute("method") || form.method || "post")).toUpperCase();
|
|
28
|
+
}
|
|
29
|
+
function resolveSubmitEnctype(form, submitter) {
|
|
30
|
+
return (submitterAttr(submitter, "formenctype") ||
|
|
31
|
+
String(form.getAttribute("enctype") || form.enctype || "")).toLowerCase();
|
|
32
|
+
}
|
|
33
|
+
function formDataFromSubmit(form, submitter) {
|
|
34
|
+
const data = new FormData(form);
|
|
35
|
+
if (submitter instanceof HTMLButtonElement &&
|
|
36
|
+
submitter.name &&
|
|
37
|
+
submitter.value &&
|
|
38
|
+
!data.has(submitter.name)) {
|
|
39
|
+
data.append(submitter.name, submitter.value);
|
|
40
|
+
}
|
|
41
|
+
return data;
|
|
42
|
+
}
|
|
43
|
+
function createSubmitBody(form, submitter, config) {
|
|
44
|
+
const data = formDataFromSubmit(form, submitter);
|
|
45
|
+
if (config.body === "json")
|
|
46
|
+
return formDataFlatRecord(data);
|
|
47
|
+
return resolveSubmitEnctype(form, submitter) === "multipart/form-data"
|
|
48
|
+
? data
|
|
49
|
+
: formDataSearchParams(data);
|
|
50
|
+
}
|
|
51
|
+
function dispatchActionFormEvent(form, name, detail, cancelable = false) {
|
|
52
|
+
const event = new CustomEvent(name, {
|
|
53
|
+
bubbles: true,
|
|
54
|
+
cancelable,
|
|
55
|
+
detail: { ...detail, form },
|
|
56
|
+
});
|
|
57
|
+
form.dispatchEvent(event);
|
|
58
|
+
return event;
|
|
59
|
+
}
|
|
60
|
+
async function confirmActionForm(form, submitter, options) {
|
|
61
|
+
const configured = options.confirm === true || form.hasAttribute("data-tbf-confirm");
|
|
62
|
+
if (!configured && !form.hasAttribute("data-tbf-confirm-title"))
|
|
63
|
+
return true;
|
|
64
|
+
const detail = { confirm: null, form, submitter };
|
|
65
|
+
const event = dispatchActionFormEvent(form, "tbf:action-confirm", detail, true);
|
|
66
|
+
if (event.defaultPrevented)
|
|
67
|
+
return false;
|
|
68
|
+
if (detail.confirm !== null && detail.confirm !== undefined) {
|
|
69
|
+
const value = typeof detail.confirm === "function" ? detail.confirm() : detail.confirm;
|
|
70
|
+
return Boolean(await value);
|
|
71
|
+
}
|
|
72
|
+
const flashApi = options.adapters?.flash || defaultFlash;
|
|
73
|
+
return await flashApi.confirmElement?.(submitter, form);
|
|
74
|
+
}
|
|
75
|
+
async function resolveCustomActionFormRequest(form, submitter, options) {
|
|
76
|
+
if (typeof options.request === "function") {
|
|
77
|
+
return { handled: true, json: await options.request(form, submitter) };
|
|
78
|
+
}
|
|
79
|
+
const detail = { form, handled: false, json: null, request: null, submitter };
|
|
80
|
+
const event = dispatchActionFormEvent(form, "tbf:action-request", detail, true);
|
|
81
|
+
if (!event.defaultPrevented && !detail.handled && detail.request == null) {
|
|
82
|
+
return { handled: false, json: null };
|
|
83
|
+
}
|
|
84
|
+
if (typeof detail.request === "function") {
|
|
85
|
+
return { handled: true, json: await detail.request() };
|
|
86
|
+
}
|
|
87
|
+
if (detail.request && typeof detail.request.then === "function") {
|
|
88
|
+
return { handled: true, json: await detail.request };
|
|
89
|
+
}
|
|
90
|
+
return { handled: true, json: detail.json };
|
|
91
|
+
}
|
|
92
|
+
function formUi(options, config) {
|
|
93
|
+
return {
|
|
94
|
+
...(options.ui || {}),
|
|
95
|
+
ignoreResponseAction: options.ui?.ignoreResponseAction === true ||
|
|
96
|
+
config.ignoreResponseAction === true,
|
|
97
|
+
silent: options.ui?.silent === true || config.silent === true,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async function submitActionForm(form, event, options = {}) {
|
|
101
|
+
event?.preventDefault();
|
|
102
|
+
event?.stopImmediatePropagation();
|
|
103
|
+
const submitter = submitterFor(event);
|
|
104
|
+
if (!(await confirmActionForm(form, submitter, options)))
|
|
105
|
+
return null;
|
|
106
|
+
const config = readActionFormConfig(form);
|
|
107
|
+
setControlDisabled(submitter, true);
|
|
108
|
+
try {
|
|
109
|
+
ensureFormCsrfToken(form);
|
|
110
|
+
options.beforeSubmit?.(form, submitter);
|
|
111
|
+
dispatchActionFormEvent(form, "tbf:action-submit", { submitter });
|
|
112
|
+
const custom = await resolveCustomActionFormRequest(form, submitter, options);
|
|
113
|
+
const json = custom.handled
|
|
114
|
+
? custom.json
|
|
115
|
+
: await handleJson(resolveSubmitAction(form, submitter), {
|
|
116
|
+
adapters: options.adapters,
|
|
117
|
+
body: createSubmitBody(form, submitter, config),
|
|
118
|
+
method: resolveSubmitMethod(form, submitter),
|
|
119
|
+
ui: formUi(options, config),
|
|
120
|
+
}, formUi(options, config));
|
|
121
|
+
const ok = actionResponseOk(json);
|
|
122
|
+
if (ok) {
|
|
123
|
+
maybeFireActionSuccessConfetti(submitter || form, config.successConfetti === true);
|
|
124
|
+
}
|
|
125
|
+
options.onComplete?.(ok, json);
|
|
126
|
+
dispatchActionFormEvent(form, "tbf:action-complete", { json, ok, submitter });
|
|
127
|
+
return json;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
options.onComplete?.(false, { ok: false });
|
|
131
|
+
dispatchActionFormEvent(form, "tbf:action-complete", {
|
|
132
|
+
error,
|
|
133
|
+
json: null,
|
|
134
|
+
ok: false,
|
|
135
|
+
submitter,
|
|
136
|
+
});
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
setControlDisabled(submitter, false);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function bindActionForm(form, options = {}) {
|
|
144
|
+
if (!(form instanceof HTMLFormElement) || boundForms.has(form))
|
|
145
|
+
return false;
|
|
146
|
+
const handler = ((event) => {
|
|
147
|
+
void submitActionForm(form, event, options);
|
|
148
|
+
});
|
|
149
|
+
form.addEventListener("submit", handler, true);
|
|
150
|
+
boundForms.set(form, handler);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
function bindActionForms(root = document, options = {}) {
|
|
154
|
+
queryAll(root, ACTION_FORM_SELECTOR).forEach((form) => {
|
|
155
|
+
bindActionForm(form, options);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
export { ACTION_CONFIG_SELECTOR, ACTION_FORM_SELECTOR, bindActionForm, bindActionForms, readActionFormConfig, submitActionForm, };
|
|
159
|
+
//# sourceMappingURL=forms.js.map
|