@lattice-php/lattice 0.2.0 → 0.4.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 +3 -1
- package/dist/action/components/action-form.d.ts +2 -2
- package/dist/action/components/action-form.js +35 -67
- package/dist/action/components/action-form.js.map +1 -1
- package/dist/action/components/action-group.js +18 -6
- package/dist/action/components/action-group.js.map +1 -1
- package/dist/action/components/action-menu-context.d.ts +6 -0
- package/dist/action/components/action-menu-context.js +18 -0
- package/dist/action/components/action-menu-context.js.map +1 -0
- package/dist/action/components/action.js +20 -13
- package/dist/action/components/action.js.map +1 -1
- package/dist/action/index.js.map +1 -1
- package/dist/appearance/index.js +7 -2
- package/dist/appearance/index.js.map +1 -1
- package/dist/chat/components/chat-box.d.ts +3 -0
- package/dist/chat/components/chat-box.js +53 -0
- package/dist/chat/components/chat-box.js.map +1 -0
- package/dist/chat/components/message-list.d.ts +5 -0
- package/dist/chat/components/message-list.js +22 -0
- package/dist/chat/components/message-list.js.map +1 -0
- package/dist/chat/components/message.d.ts +5 -0
- package/dist/chat/components/message.js +20 -0
- package/dist/chat/components/message.js.map +1 -0
- package/dist/chat/components/prompt-input.d.ts +8 -0
- package/dist/chat/components/prompt-input.js +49 -0
- package/dist/chat/components/prompt-input.js.map +1 -0
- package/dist/chat/index.d.ts +1 -0
- package/dist/chat/index.js +15 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/parts/text.d.ts +3 -0
- package/dist/chat/parts/text.js +12 -0
- package/dist/chat/parts/text.js.map +1 -0
- package/dist/chat/parts/tool-call.d.ts +3 -0
- package/dist/chat/parts/tool-call.js +20 -0
- package/dist/chat/parts/tool-call.js.map +1 -0
- package/dist/chat/transport.d.ts +4 -0
- package/dist/chat/transport.js +67 -0
- package/dist/chat/transport.js.map +1 -0
- package/dist/chat/types.d.ts +39 -0
- package/dist/chat/use-chat.d.ts +15 -0
- package/dist/chat/use-chat.js +161 -0
- package/dist/chat/use-chat.js.map +1 -0
- package/dist/core/api.d.ts +25 -0
- package/dist/core/api.js +127 -0
- package/dist/core/api.js.map +1 -0
- package/dist/core/collapsed-context.d.ts +2 -0
- package/dist/core/collapsed-context.js +10 -0
- package/dist/core/collapsed-context.js.map +1 -0
- package/dist/core/column-sizing.d.ts +17 -0
- package/dist/core/column-sizing.js +61 -0
- package/dist/core/column-sizing.js.map +1 -0
- package/dist/core/components/badge.js +3 -3
- package/dist/core/components/badge.js.map +1 -1
- package/dist/core/components/button.d.ts +1 -1
- package/dist/core/components/button.js +19 -15
- package/dist/core/components/button.js.map +1 -1
- package/dist/core/components/card.js +1 -1
- package/dist/core/components/card.js.map +1 -1
- package/dist/core/components/chart.d.ts +3 -0
- package/dist/core/components/chart.js +175 -0
- package/dist/core/components/chart.js.map +1 -0
- package/dist/{form/components/base → core/components}/checkbox.js +4 -4
- package/dist/core/components/checkbox.js.map +1 -0
- package/dist/core/components/combobox.d.ts +33 -0
- package/dist/core/components/combobox.js +99 -0
- package/dist/core/components/combobox.js.map +1 -0
- package/dist/core/components/confirm-dialog.js +6 -12
- package/dist/core/components/confirm-dialog.js.map +1 -1
- package/dist/core/components/control.d.ts +13 -0
- package/dist/core/components/control.js +27 -0
- package/dist/core/components/control.js.map +1 -0
- package/dist/core/components/dialog.d.ts +19 -0
- package/dist/core/components/dialog.js +76 -0
- package/dist/core/components/dialog.js.map +1 -0
- package/dist/core/components/dropdown-menu.d.ts +14 -0
- package/dist/core/components/dropdown-menu.js +42 -0
- package/dist/core/components/dropdown-menu.js.map +1 -0
- package/dist/core/components/floating-panel.d.ts +3 -0
- package/dist/core/components/floating-panel.js +65 -0
- package/dist/core/components/floating-panel.js.map +1 -0
- package/dist/core/components/fragment.js +25 -13
- package/dist/core/components/fragment.js.map +1 -1
- package/dist/core/components/grid.js.map +1 -1
- package/dist/core/components/heading.js +1 -1
- package/dist/core/components/heading.js.map +1 -1
- package/dist/core/components/icon.js +1 -0
- package/dist/core/components/icon.js.map +1 -1
- package/dist/core/components/index.js +8 -1
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/info-tooltip.d.ts +3 -0
- package/dist/core/components/info-tooltip.js +26 -0
- package/dist/core/components/info-tooltip.js.map +1 -0
- package/dist/core/components/link.js +12 -6
- package/dist/core/components/link.js.map +1 -1
- package/dist/core/components/modal.js +9 -31
- package/dist/core/components/modal.js.map +1 -1
- package/dist/core/components/popover.d.ts +8 -0
- package/dist/core/components/popover.js +37 -0
- package/dist/core/components/popover.js.map +1 -0
- package/dist/core/components/raw-block.d.ts +3 -0
- package/dist/core/components/raw-block.js +10 -0
- package/dist/core/components/raw-block.js.map +1 -0
- package/dist/core/components/section.js +8 -12
- package/dist/core/components/section.js.map +1 -1
- package/dist/core/components/segmented-control.js.map +1 -1
- package/dist/core/components/segmented-pills.js +1 -1
- package/dist/core/components/segmented-pills.js.map +1 -1
- package/dist/core/components/skeleton.d.ts +3 -0
- package/dist/core/components/skeleton.js +16 -0
- package/dist/core/components/skeleton.js.map +1 -0
- package/dist/core/components/spinner.js.map +1 -1
- package/dist/core/components/stack.js +25 -8
- package/dist/core/components/stack.js.map +1 -1
- package/dist/core/components/tabs.js +1 -1
- package/dist/core/components/tabs.js.map +1 -1
- package/dist/core/components/text.js +17 -1
- package/dist/core/components/text.js.map +1 -1
- package/dist/core/headers.d.ts +1 -0
- package/dist/core/headers.js +14 -0
- package/dist/core/headers.js.map +1 -0
- package/dist/core/registry-context.d.ts +21 -0
- package/dist/core/registry-context.js +40 -0
- package/dist/core/registry-context.js.map +1 -0
- package/dist/core/registry.d.ts +4 -1
- package/dist/core/registry.js +10 -1
- package/dist/core/registry.js.map +1 -1
- package/dist/core/renderer.d.ts +8 -14
- package/dist/core/renderer.js +17 -27
- package/dist/core/renderer.js.map +1 -1
- package/dist/core/test-id.d.ts +8 -0
- package/dist/core/test-id.js +21 -0
- package/dist/core/test-id.js.map +1 -0
- package/dist/core/types.d.ts +25 -9
- package/dist/core/use-column-resizing.d.ts +27 -0
- package/dist/core/use-column-resizing.js +228 -0
- package/dist/core/use-column-resizing.js.map +1 -0
- package/dist/effects/dispatch.d.ts +20 -0
- package/dist/effects/dispatch.js +39 -0
- package/dist/effects/dispatch.js.map +1 -0
- package/dist/effects/registry.d.ts +38 -0
- package/dist/effects/registry.js +51 -0
- package/dist/effects/registry.js.map +1 -0
- package/dist/effects/use-effect-dispatcher.d.ts +8 -0
- package/dist/effects/use-effect-dispatcher.js +20 -0
- package/dist/effects/use-effect-dispatcher.js.map +1 -0
- package/dist/effects/use-flash-effects.d.ts +5 -0
- package/dist/effects/use-flash-effects.js +22 -0
- package/dist/effects/use-flash-effects.js.map +1 -0
- package/dist/events/event-bridge.d.ts +3 -7
- package/dist/events/event-bridge.js +17 -47
- package/dist/events/event-bridge.js.map +1 -1
- package/dist/events/event-names.d.ts +3 -1
- package/dist/events/event-names.js +3 -1
- package/dist/events/event-names.js.map +1 -1
- package/dist/form/components/base/affix-group.d.ts +17 -0
- package/dist/form/components/base/affix-group.js +49 -0
- package/dist/form/components/base/affix-group.js.map +1 -0
- package/dist/form/components/base/field.d.ts +2 -1
- package/dist/form/components/base/field.js +17 -2
- package/dist/form/components/base/field.js.map +1 -1
- package/dist/form/components/base/input-error.js +1 -1
- package/dist/form/components/base/input-error.js.map +1 -1
- package/dist/form/components/base/input.js +2 -1
- package/dist/form/components/base/input.js.map +1 -1
- package/dist/form/components/base/label.js +1 -1
- package/dist/form/components/base/label.js.map +1 -1
- package/dist/form/components/base/password-input.js.map +1 -1
- package/dist/form/components/base/submit-button.js +4 -2
- package/dist/form/components/base/submit-button.js.map +1 -1
- package/dist/form/components/base/textarea.js +2 -1
- package/dist/form/components/base/textarea.js.map +1 -1
- package/dist/form/components/conditions.js.map +1 -1
- package/dist/form/components/context.d.ts +1 -0
- package/dist/form/components/context.js +1 -0
- package/dist/form/components/context.js.map +1 -1
- package/dist/form/components/field-props.d.ts +4 -0
- package/dist/form/components/field-props.js.map +1 -1
- package/dist/form/components/field-scope.d.ts +21 -0
- package/dist/form/components/field-scope.js +54 -0
- package/dist/form/components/field-scope.js.map +1 -0
- package/dist/form/components/fields/block-add-menu.d.ts +9 -0
- package/dist/form/components/fields/block-add-menu.js +27 -0
- package/dist/form/components/fields/block-add-menu.js.map +1 -0
- package/dist/form/components/fields/builder.d.ts +2 -0
- package/dist/form/components/fields/builder.js +124 -0
- package/dist/form/components/fields/builder.js.map +1 -0
- package/dist/form/components/fields/checkbox.d.ts +1 -1
- package/dist/form/components/fields/checkbox.js +14 -11
- package/dist/form/components/fields/checkbox.js.map +1 -1
- package/dist/form/components/fields/choice.d.ts +1 -1
- package/dist/form/components/fields/choice.js +5 -4
- package/dist/form/components/fields/choice.js.map +1 -1
- package/dist/form/components/fields/date-input.d.ts +1 -1
- package/dist/form/components/fields/date-input.js +2 -1
- package/dist/form/components/fields/date-input.js.map +1 -1
- package/dist/form/components/fields/file-upload.d.ts +2 -0
- package/dist/form/components/fields/file-upload.js +282 -0
- package/dist/form/components/fields/file-upload.js.map +1 -0
- package/dist/form/components/fields/hidden-input.d.ts +1 -1
- package/dist/form/components/fields/hidden-input.js +11 -5
- package/dist/form/components/fields/hidden-input.js.map +1 -1
- package/dist/form/components/fields/number-input.d.ts +1 -1
- package/dist/form/components/fields/number-input.js +23 -15
- package/dist/form/components/fields/number-input.js.map +1 -1
- package/dist/form/components/fields/password-input.d.ts +1 -1
- package/dist/form/components/fields/password-input.js +42 -27
- package/dist/form/components/fields/password-input.js.map +1 -1
- package/dist/form/components/fields/repeater-rows.d.ts +12 -0
- package/dist/form/components/fields/repeater-rows.js +46 -0
- package/dist/form/components/fields/repeater-rows.js.map +1 -0
- package/dist/form/components/fields/repeater.d.ts +2 -0
- package/dist/form/components/fields/repeater.js +97 -0
- package/dist/form/components/fields/repeater.js.map +1 -0
- package/dist/form/components/fields/rich-editor.d.ts +1 -1
- package/dist/form/components/fields/rich-editor.js +39 -11
- package/dist/form/components/fields/rich-editor.js.map +1 -1
- package/dist/form/components/fields/row-action-menu.d.ts +17 -0
- package/dist/form/components/fields/row-action-menu.js +61 -0
- package/dist/form/components/fields/row-action-menu.js.map +1 -0
- package/dist/form/components/fields/row-actions.d.ts +10 -0
- package/dist/form/components/fields/row-actions.js +45 -0
- package/dist/form/components/fields/row-actions.js.map +1 -0
- package/dist/form/components/fields/row-item.d.ts +27 -0
- package/dist/form/components/fields/row-item.js +69 -0
- package/dist/form/components/fields/row-item.js.map +1 -0
- package/dist/form/components/fields/select.d.ts +1 -1
- package/dist/form/components/fields/select.js +69 -104
- package/dist/form/components/fields/select.js.map +1 -1
- package/dist/form/components/fields/simple-field.js +1 -0
- package/dist/form/components/fields/simple-field.js.map +1 -1
- package/dist/form/components/fields/table-rows.d.ts +32 -0
- package/dist/form/components/fields/table-rows.js +188 -0
- package/dist/form/components/fields/table-rows.js.map +1 -0
- package/dist/form/components/fields/text-input.d.ts +1 -1
- package/dist/form/components/fields/text-input.js +19 -12
- package/dist/form/components/fields/text-input.js.map +1 -1
- package/dist/form/components/fields/textarea.d.ts +1 -1
- package/dist/form/components/fields/textarea.js +2 -1
- package/dist/form/components/fields/textarea.js.map +1 -1
- package/dist/form/components/fields/use-flip-reorder.d.ts +6 -0
- package/dist/form/components/fields/use-flip-reorder.js +51 -0
- package/dist/form/components/fields/use-flip-reorder.js.map +1 -0
- package/dist/form/components/fields/use-row-collection.d.ts +11 -0
- package/dist/form/components/fields/use-row-collection.js +44 -0
- package/dist/form/components/fields/use-row-collection.js.map +1 -0
- package/dist/form/components/form-path.d.ts +5 -0
- package/dist/form/components/form-path.js +40 -0
- package/dist/form/components/form-path.js.map +1 -0
- package/dist/form/components/form-transport.d.ts +3 -4
- package/dist/form/components/form-transport.js +17 -18
- package/dist/form/components/form-transport.js.map +1 -1
- package/dist/form/components/form.js +24 -18
- package/dist/form/components/form.js.map +1 -1
- package/dist/form/components/index.d.ts +3 -0
- package/dist/form/components/index.js +4 -1
- package/dist/form/components/override-keys.d.ts +2 -0
- package/dist/form/components/override-keys.js +12 -0
- package/dist/form/components/override-keys.js.map +1 -0
- package/dist/form/components/prefill-context.d.ts +5 -0
- package/dist/form/components/prefill-context.js +11 -0
- package/dist/form/components/prefill-context.js.map +1 -0
- package/dist/form/components/prefill-targets.d.ts +17 -0
- package/dist/form/components/prefill-targets.js +73 -0
- package/dist/form/components/prefill-targets.js.map +1 -0
- package/dist/form/components/resolved-nodes.js +4 -1
- package/dist/form/components/resolved-nodes.js.map +1 -1
- package/dist/form/components/row-layout-context.d.ts +5 -0
- package/dist/form/components/row-layout-context.js +18 -0
- package/dist/form/components/row-layout-context.js.map +1 -0
- package/dist/form/components/use-controlled-field.d.ts +2 -0
- package/dist/form/components/use-controlled-field.js +13 -5
- package/dist/form/components/use-controlled-field.js.map +1 -1
- package/dist/form/components/use-dependent-field.js +7 -1
- package/dist/form/components/use-dependent-field.js.map +1 -1
- package/dist/form/components/use-field-commit.d.ts +4 -0
- package/dist/form/components/use-field-commit.js +21 -7
- package/dist/form/components/use-field-commit.js.map +1 -1
- package/dist/form/components/use-form-resolver.d.ts +6 -1
- package/dist/form/components/use-form-resolver.js +50 -5
- package/dist/form/components/use-form-resolver.js.map +1 -1
- package/dist/form/components/use-seed-default.js +8 -3
- package/dist/form/components/use-seed-default.js.map +1 -1
- package/dist/form/components/values.js +20 -5
- package/dist/form/components/values.js.map +1 -1
- package/dist/form/index.js +13 -10
- package/dist/form/index.js.map +1 -1
- package/dist/form/skeleton.js +5 -4
- package/dist/form/skeleton.js.map +1 -1
- package/dist/i18n/backend.d.ts +7 -5
- package/dist/i18n/backend.js +23 -8
- package/dist/i18n/backend.js.map +1 -1
- package/dist/i18n/config.d.ts +6 -0
- package/dist/i18n/config.js +36 -0
- package/dist/i18n/config.js.map +1 -0
- package/dist/i18n/index.d.ts +7 -1
- package/dist/i18n/index.js +5 -1
- package/dist/i18n/instance.d.ts +27 -0
- package/dist/i18n/instance.js +63 -16
- package/dist/i18n/instance.js.map +1 -1
- package/dist/i18n/locale-reload.d.ts +3 -0
- package/dist/i18n/locale-reload.js +17 -0
- package/dist/i18n/locale-reload.js.map +1 -0
- package/dist/i18n/locale-switcher.d.ts +21 -0
- package/dist/i18n/locale-switcher.js +25 -0
- package/dist/i18n/locale-switcher.js.map +1 -0
- package/dist/i18n/locale.d.ts +9 -0
- package/dist/i18n/locale.js +93 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/page-props.d.ts +3 -0
- package/dist/i18n/page-props.js +24 -0
- package/dist/i18n/page-props.js.map +1 -0
- package/dist/i18n/translatable.d.ts +4 -0
- package/dist/i18n/translatable.js +24 -0
- package/dist/i18n/translatable.js.map +1 -0
- package/dist/index.d.ts +20 -8
- package/dist/index.js +19 -7
- package/dist/inertia.d.ts +2 -1
- package/dist/inertia.js +9 -2
- package/dist/inertia.js.map +1 -1
- package/dist/lattice.css +148 -22
- package/dist/layout/breadcrumbs.d.ts +3 -0
- package/dist/layout/breadcrumbs.js +34 -0
- package/dist/layout/breadcrumbs.js.map +1 -0
- package/dist/layout/callouts.d.ts +3 -0
- package/dist/layout/callouts.js +67 -0
- package/dist/layout/callouts.js.map +1 -0
- package/dist/layout/components.js +9 -1
- package/dist/layout/components.js.map +1 -1
- package/dist/layout/context.d.ts +2 -10
- package/dist/layout/context.js +3 -14
- package/dist/layout/context.js.map +1 -1
- package/dist/layout/dropdown.d.ts +3 -0
- package/dist/layout/dropdown.js +24 -0
- package/dist/layout/dropdown.js.map +1 -0
- package/dist/layout/index.d.ts +2 -1
- package/dist/layout/index.js +3 -1
- package/dist/layout/menu-item.js +54 -62
- package/dist/layout/menu-item.js.map +1 -1
- package/dist/layout/menu.js.map +1 -1
- package/dist/layout/outlet.js +2 -2
- package/dist/layout/outlet.js.map +1 -1
- package/dist/layout/popover.d.ts +17 -0
- package/dist/layout/popover.js +46 -0
- package/dist/layout/popover.js.map +1 -0
- package/dist/layout/schema-layout.js +2 -9
- package/dist/layout/schema-layout.js.map +1 -1
- package/dist/layout/sidebar.js +4 -4
- package/dist/layout/sidebar.js.map +1 -1
- package/dist/layout/topbar.d.ts +3 -0
- package/dist/layout/topbar.js +15 -0
- package/dist/layout/topbar.js.map +1 -0
- package/dist/page.js +16 -17
- package/dist/page.js.map +1 -1
- package/dist/provider.d.ts +2 -4
- package/dist/provider.js +5 -9
- package/dist/provider.js.map +1 -1
- package/dist/realtime/build-effects.d.ts +4 -0
- package/dist/realtime/build-effects.js +23 -0
- package/dist/realtime/build-effects.js.map +1 -0
- package/dist/realtime/listeners.d.ts +8 -0
- package/dist/realtime/listeners.js +31 -0
- package/dist/realtime/listeners.js.map +1 -0
- package/dist/realtime/subscriptions.d.ts +4 -0
- package/dist/realtime/subscriptions.js +45 -0
- package/dist/realtime/subscriptions.js.map +1 -0
- package/dist/registry.js +3 -1
- package/dist/registry.js.map +1 -1
- package/dist/remote/components/chat-box.d.ts +3 -0
- package/dist/remote/components/chat-box.js +65 -0
- package/dist/remote/components/chat-box.js.map +1 -0
- package/dist/remote/components/data-list.d.ts +10 -0
- package/dist/remote/components/data-list.js +106 -0
- package/dist/remote/components/data-list.js.map +1 -0
- package/dist/remote/index.d.ts +1 -0
- package/dist/remote/index.js +15 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/svg-sprite-client/index.d.ts +1 -0
- package/dist/svg-sprite-client/index.js +0 -0
- package/dist/svg-sprite-client.d.ts +1 -0
- package/dist/table/align.d.ts +4 -0
- package/dist/table/align.js +23 -0
- package/dist/table/align.js.map +1 -0
- package/dist/table/bulk.js +1 -1
- package/dist/table/bulk.js.map +1 -1
- package/dist/table/components/bulk-bar.js +8 -5
- package/dist/table/components/bulk-bar.js.map +1 -1
- package/dist/table/components/cells/badge-cell.d.ts +2 -5
- package/dist/table/components/cells/badge-cell.js +3 -3
- package/dist/table/components/cells/badge-cell.js.map +1 -1
- package/dist/table/components/cells/boolean-cell.d.ts +3 -0
- package/dist/table/components/cells/boolean-cell.js +23 -0
- package/dist/table/components/cells/boolean-cell.js.map +1 -0
- package/dist/table/components/cells/icon-cell.d.ts +2 -5
- package/dist/table/components/cells/icon-cell.js +4 -5
- package/dist/table/components/cells/icon-cell.js.map +1 -1
- package/dist/table/components/cells/image-cell.d.ts +2 -5
- package/dist/table/components/cells/image-cell.js +4 -5
- package/dist/table/components/cells/image-cell.js.map +1 -1
- package/dist/table/components/cells/money-cell.d.ts +2 -0
- package/dist/table/components/cells/money-cell.js +28 -0
- package/dist/table/components/cells/money-cell.js.map +1 -0
- package/dist/table/components/cells/number-cell.d.ts +2 -0
- package/dist/table/components/cells/number-cell.js +25 -0
- package/dist/table/components/cells/number-cell.js.map +1 -0
- package/dist/table/components/cells/numeric.d.ts +2 -0
- package/dist/table/components/cells/numeric.js +10 -0
- package/dist/table/components/cells/numeric.js.map +1 -0
- package/dist/table/components/cells/stack-cell.d.ts +3 -0
- package/dist/table/components/cells/stack-cell.js +17 -0
- package/dist/table/components/cells/stack-cell.js.map +1 -0
- package/dist/table/components/cells/text-cell.d.ts +2 -6
- package/dist/table/components/cells/text-cell.js +6 -7
- package/dist/table/components/cells/text-cell.js.map +1 -1
- package/dist/table/components/column-filter-control.d.ts +4 -1
- package/dist/table/components/column-filter-control.js +82 -11
- package/dist/table/components/column-filter-control.js.map +1 -1
- package/dist/table/components/column-header.d.ts +3 -1
- package/dist/table/components/column-header.js +11 -8
- package/dist/table/components/column-header.js.map +1 -1
- package/dist/table/components/filter-bar.d.ts +16 -0
- package/dist/table/components/filter-bar.js +104 -0
- package/dist/table/components/filter-bar.js.map +1 -0
- package/dist/table/components/filter-controls.d.ts +18 -0
- package/dist/table/components/filter-controls.js +256 -0
- package/dist/table/components/filter-controls.js.map +1 -0
- package/dist/table/components/filter-stack-bar.js +4 -3
- package/dist/table/components/filter-stack-bar.js.map +1 -1
- package/dist/table/components/filter-value-input.d.ts +1 -0
- package/dist/table/components/filter-value-input.js +7 -6
- package/dist/table/components/filter-value-input.js.map +1 -1
- package/dist/table/components/pagination.js +1 -1
- package/dist/table/components/pagination.js.map +1 -1
- package/dist/table/components/sort-bar.js +1 -1
- package/dist/table/components/sort-bar.js.map +1 -1
- package/dist/table/components/table-action-node.js.map +1 -1
- package/dist/table/components/table-cell.d.ts +1 -1
- package/dist/table/components/table-cell.js +18 -28
- package/dist/table/components/table-cell.js.map +1 -1
- package/dist/table/components/table.js +200 -152
- package/dist/table/components/table.js.map +1 -1
- package/dist/table/filter-values.d.ts +13 -0
- package/dist/table/filter-values.js +30 -0
- package/dist/table/filter-values.js.map +1 -0
- package/dist/table/format.js.map +1 -1
- package/dist/table/index.js.map +1 -1
- package/dist/table/payload.js +24 -3
- package/dist/table/payload.js.map +1 -1
- package/dist/table/query.d.ts +10 -1
- package/dist/table/query.js +60 -6
- package/dist/table/query.js.map +1 -1
- package/dist/table/registry.d.ts +19 -0
- package/dist/table/registry.js +14 -0
- package/dist/table/registry.js.map +1 -0
- package/dist/table/types.d.ts +9 -19
- package/dist/table/use-table.d.ts +8 -2
- package/dist/table/use-table.js +61 -7
- package/dist/table/use-table.js.map +1 -1
- package/dist/toast/callout.d.ts +6 -0
- package/dist/toast/callout.js +31 -0
- package/dist/toast/callout.js.map +1 -0
- package/dist/toast/index.d.ts +4 -0
- package/dist/toast/index.js +3 -1
- package/dist/toast/toast.d.ts +14 -0
- package/dist/toast/toast.js +54 -0
- package/dist/toast/toast.js.map +1 -0
- package/dist/toast/toaster.js +14 -77
- package/dist/toast/toaster.js.map +1 -1
- package/dist/toast/variant-styles.d.ts +6 -0
- package/dist/toast/variant-styles.js +37 -0
- package/dist/toast/variant-styles.js.map +1 -0
- package/dist/types/generated.d.ts +547 -103
- package/dist/types/vite-env.d.ts +1 -0
- package/dist/vite.d.ts +25 -0
- package/dist/vite.js +72 -0
- package/dist/vite.js.map +1 -0
- package/package.json +130 -13
- package/resources/icons/rotate-ccw.svg +16 -0
- package/dist/_virtual/_rolldown/runtime.js +0 -8
- package/dist/action/effects.d.ts +0 -11
- package/dist/action/effects.js +0 -44
- package/dist/action/effects.js.map +0 -1
- package/dist/form/components/base/checkbox.js.map +0 -1
- package/dist/node_modules/i18next/dist/esm/i18next.js +0 -1982
- package/dist/node_modules/i18next/dist/esm/i18next.js.map +0 -1
- package/dist/node_modules/i18next-http-backend/esm/index.js +0 -352
- package/dist/node_modules/i18next-http-backend/esm/index.js.map +0 -1
- package/dist/node_modules/react-i18next/dist/es/context.js +0 -23
- package/dist/node_modules/react-i18next/dist/es/context.js.map +0 -1
- package/dist/node_modules/react-i18next/dist/es/defaults.js +0 -29
- package/dist/node_modules/react-i18next/dist/es/defaults.js.map +0 -1
- package/dist/node_modules/react-i18next/dist/es/i18nInstance.js +0 -10
- package/dist/node_modules/react-i18next/dist/es/i18nInstance.js.map +0 -1
- package/dist/node_modules/react-i18next/dist/es/initReactI18next.js +0 -14
- package/dist/node_modules/react-i18next/dist/es/initReactI18next.js.map +0 -1
- package/dist/node_modules/react-i18next/dist/es/unescape.js +0 -30
- package/dist/node_modules/react-i18next/dist/es/unescape.js.map +0 -1
- package/dist/node_modules/react-i18next/dist/es/useTranslation.js +0 -157
- package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +0 -1
- package/dist/node_modules/react-i18next/dist/es/utils.js +0 -58
- package/dist/node_modules/react-i18next/dist/es/utils.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -70
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -61
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/shim/index.js +0 -13
- package/dist/node_modules/use-sync-external-store/shim/index.js.map +0 -1
- package/dist/table/column-registry.d.ts +0 -9
- package/dist/test-support.d.ts +0 -14
- package/dist/test-support.js +0 -14
- package/dist/test-support.js.map +0 -1
- /package/dist/{table/column-registry.js → chat/types.js} +0 -0
- /package/dist/{form/components/base → core/components}/checkbox.d.ts +0 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { buildColumnGridTemplate, defaultColumnWidthPx, maxColumnWidthPx, minColumnWidthPx } from "./column-sizing.js";
|
|
2
|
+
import { useCallback, useMemo, useRef, useState } from "react";
|
|
3
|
+
//#region resources/js/core/use-column-resizing.ts
|
|
4
|
+
var emptyTracks = [];
|
|
5
|
+
function useColumnResizing({ columnGapPx = 0, columns, enabled, leadingTracks = emptyTracks, showIndicator = false, storageKey, trailingTracks = emptyTracks }) {
|
|
6
|
+
const columnKeys = useMemo(() => columns.map((column) => column.key), [columns]);
|
|
7
|
+
const [overrides, setOverrides] = useState(() => readStoredOverrides(storageKey, columns));
|
|
8
|
+
const overridesRef = useRef(overrides);
|
|
9
|
+
const drag = useRef(null);
|
|
10
|
+
const gridTemplateColumns = useMemo(() => buildColumnGridTemplate({
|
|
11
|
+
columns,
|
|
12
|
+
leadingTracks,
|
|
13
|
+
trailingTracks,
|
|
14
|
+
overrides: enabled ? overrides : {}
|
|
15
|
+
}), [
|
|
16
|
+
columns,
|
|
17
|
+
enabled,
|
|
18
|
+
leadingTracks,
|
|
19
|
+
overrides,
|
|
20
|
+
trailingTracks
|
|
21
|
+
]);
|
|
22
|
+
const setColumnWidth = useCallback((column, width, maxWidth) => {
|
|
23
|
+
setOverrides((current) => {
|
|
24
|
+
const next = {
|
|
25
|
+
...current,
|
|
26
|
+
[column.key]: Math.min(maxWidth ?? maxColumnWidthPx(column), Math.max(minColumnWidthPx(column), width))
|
|
27
|
+
};
|
|
28
|
+
overridesRef.current = next;
|
|
29
|
+
writeStoredOverrides(storageKey, columnKeys, next);
|
|
30
|
+
return next;
|
|
31
|
+
});
|
|
32
|
+
}, [columnKeys, storageKey]);
|
|
33
|
+
const resetColumnWidth = useCallback((column) => {
|
|
34
|
+
setOverrides((current) => {
|
|
35
|
+
const next = { ...current };
|
|
36
|
+
delete next[column.key];
|
|
37
|
+
overridesRef.current = next;
|
|
38
|
+
writeStoredOverrides(storageKey, columnKeys, next);
|
|
39
|
+
return next;
|
|
40
|
+
});
|
|
41
|
+
}, [columnKeys, storageKey]);
|
|
42
|
+
const resetColumns = useCallback(() => {
|
|
43
|
+
setOverrides({});
|
|
44
|
+
overridesRef.current = {};
|
|
45
|
+
writeStoredOverrides(storageKey, columnKeys, {});
|
|
46
|
+
}, [columnKeys, storageKey]);
|
|
47
|
+
const hasOverrides = enabled && Object.values(overrides).some((width) => typeof width === "number");
|
|
48
|
+
const currentColumnWidth = useCallback((column) => overridesRef.current[column.key] ?? defaultColumnWidthPx(column), []);
|
|
49
|
+
return {
|
|
50
|
+
getResizeHandleProps: useCallback((column) => {
|
|
51
|
+
const max = maxColumnWidthPx(column);
|
|
52
|
+
const min = minColumnWidthPx(column);
|
|
53
|
+
const current = currentColumnWidth(column);
|
|
54
|
+
const label = column.label ?? column.key;
|
|
55
|
+
const indicatorClass = showIndicator ? "after:bg-lt-border" : "after:bg-transparent";
|
|
56
|
+
const maxWidthForHandle = (handle) => maxColumnWidthForGrid({
|
|
57
|
+
column,
|
|
58
|
+
columnGapPx,
|
|
59
|
+
columns,
|
|
60
|
+
grid: handle.parentElement?.parentElement,
|
|
61
|
+
leadingTracks,
|
|
62
|
+
trailingTracks
|
|
63
|
+
});
|
|
64
|
+
const resizeBy = (handle, delta) => setColumnWidth(column, current + delta, maxWidthForHandle(handle));
|
|
65
|
+
return {
|
|
66
|
+
"aria-label": `Resize ${label}`,
|
|
67
|
+
"aria-orientation": "vertical",
|
|
68
|
+
"aria-valuemax": max,
|
|
69
|
+
"aria-valuemin": min,
|
|
70
|
+
"aria-valuenow": current,
|
|
71
|
+
className: `absolute inset-y-0 right-0 hidden w-2 cursor-col-resize touch-none items-stretch justify-center md:flex after:my-1 after:w-px ${indicatorClass} hover:after:bg-lt-border focus-visible:outline-none focus-visible:after:bg-lt-ring`,
|
|
72
|
+
onDoubleClick: () => resetColumnWidth(column),
|
|
73
|
+
onKeyDown: (event) => {
|
|
74
|
+
if (!enabled) return;
|
|
75
|
+
const step = event.shiftKey ? 32 : 8;
|
|
76
|
+
if (event.key === "ArrowLeft") {
|
|
77
|
+
event.preventDefault();
|
|
78
|
+
resizeBy(event.currentTarget, -step);
|
|
79
|
+
}
|
|
80
|
+
if (event.key === "ArrowRight") {
|
|
81
|
+
event.preventDefault();
|
|
82
|
+
resizeBy(event.currentTarget, step);
|
|
83
|
+
}
|
|
84
|
+
if (event.key === "Home") {
|
|
85
|
+
event.preventDefault();
|
|
86
|
+
setColumnWidth(column, min);
|
|
87
|
+
}
|
|
88
|
+
if (event.key === "End") {
|
|
89
|
+
event.preventDefault();
|
|
90
|
+
const handleMax = maxWidthForHandle(event.currentTarget);
|
|
91
|
+
setColumnWidth(column, handleMax, handleMax);
|
|
92
|
+
}
|
|
93
|
+
if (event.key === "Enter" || event.key === "Escape") {
|
|
94
|
+
event.preventDefault();
|
|
95
|
+
resetColumnWidth(column);
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
onPointerDown: (event) => {
|
|
99
|
+
if (!enabled) return;
|
|
100
|
+
const parentWidth = event.currentTarget.parentElement?.getBoundingClientRect().width ?? 0;
|
|
101
|
+
drag.current = {
|
|
102
|
+
key: column.key,
|
|
103
|
+
maxWidth: maxWidthForHandle(event.currentTarget),
|
|
104
|
+
startWidth: parentWidth > 0 ? parentWidth : current,
|
|
105
|
+
startX: event.clientX
|
|
106
|
+
};
|
|
107
|
+
event.currentTarget.setPointerCapture?.(event.pointerId);
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
},
|
|
110
|
+
onPointerMove: (event) => {
|
|
111
|
+
const active = drag.current;
|
|
112
|
+
if (!enabled || active?.key !== column.key) return;
|
|
113
|
+
setColumnWidth(column, active.startWidth + event.clientX - active.startX, active.maxWidth);
|
|
114
|
+
},
|
|
115
|
+
onPointerUp: (event) => {
|
|
116
|
+
if (drag.current?.key !== column.key) return;
|
|
117
|
+
drag.current = null;
|
|
118
|
+
event.currentTarget.releasePointerCapture?.(event.pointerId);
|
|
119
|
+
},
|
|
120
|
+
role: "separator",
|
|
121
|
+
tabIndex: 0
|
|
122
|
+
};
|
|
123
|
+
}, [
|
|
124
|
+
columnGapPx,
|
|
125
|
+
columns,
|
|
126
|
+
currentColumnWidth,
|
|
127
|
+
enabled,
|
|
128
|
+
leadingTracks,
|
|
129
|
+
resetColumnWidth,
|
|
130
|
+
setColumnWidth,
|
|
131
|
+
showIndicator,
|
|
132
|
+
trailingTracks
|
|
133
|
+
]),
|
|
134
|
+
gridTemplateColumns,
|
|
135
|
+
hasOverrides,
|
|
136
|
+
resetColumns,
|
|
137
|
+
resetColumnWidth
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function maxColumnWidthForGrid({ column, columnGapPx, columns, grid, leadingTracks, trailingTracks }) {
|
|
141
|
+
const gridWidth = grid?.getBoundingClientRect().width ?? 0;
|
|
142
|
+
if (gridWidth <= 0) return maxColumnWidthPx(column);
|
|
143
|
+
const utilityWidth = [...leadingTracks, ...trailingTracks].reduce((sum, track) => sum + fixedTrackWidthPx(track), 0);
|
|
144
|
+
const siblingMinWidth = columns.reduce((sum, sibling) => sibling.key === column.key ? sum : sum + minColumnWidthPx(sibling), 0);
|
|
145
|
+
const trackCount = columns.length + leadingTracks.length + trailingTracks.length;
|
|
146
|
+
const gapWidth = Math.max(0, trackCount - 1) * columnGapPx;
|
|
147
|
+
const available = gridWidth - utilityWidth - siblingMinWidth - gapWidth;
|
|
148
|
+
return Math.min(maxColumnWidthPx(column), Math.max(minColumnWidthPx(column), available));
|
|
149
|
+
}
|
|
150
|
+
function readStoredOverrides(storageKey, columns) {
|
|
151
|
+
if (!storageKey || typeof window === "undefined") return {};
|
|
152
|
+
try {
|
|
153
|
+
const raw = window.localStorage.getItem(storageKey);
|
|
154
|
+
if (raw === null) return {};
|
|
155
|
+
const stored = JSON.parse(raw);
|
|
156
|
+
const columnKeys = columns.map((column) => column.key);
|
|
157
|
+
if (!isStoredColumnWidths(stored) || !sameColumnKeys(stored.columns, columnKeys)) {
|
|
158
|
+
removeStoredOverrides(storageKey);
|
|
159
|
+
return {};
|
|
160
|
+
}
|
|
161
|
+
const overrides = sanitizeOverrides(stored.overrides, columns);
|
|
162
|
+
if (Object.keys(overrides).length === 0) removeStoredOverrides(storageKey);
|
|
163
|
+
return overrides;
|
|
164
|
+
} catch {
|
|
165
|
+
removeStoredOverrides(storageKey);
|
|
166
|
+
return {};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function writeStoredOverrides(storageKey, columnKeys, overrides) {
|
|
170
|
+
if (!storageKey || typeof window === "undefined") return;
|
|
171
|
+
const stored = {};
|
|
172
|
+
const knownKeys = new Set(columnKeys);
|
|
173
|
+
for (const [key, value] of Object.entries(overrides)) if (knownKeys.has(key) && typeof value === "number" && Number.isFinite(value)) stored[key] = value;
|
|
174
|
+
if (Object.keys(stored).length === 0) {
|
|
175
|
+
removeStoredOverrides(storageKey);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
window.localStorage.setItem(storageKey, JSON.stringify({
|
|
180
|
+
columns: columnKeys,
|
|
181
|
+
overrides: stored
|
|
182
|
+
}));
|
|
183
|
+
} catch {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function removeStoredOverrides(storageKey) {
|
|
188
|
+
if (typeof window === "undefined") return;
|
|
189
|
+
try {
|
|
190
|
+
window.localStorage.removeItem(storageKey);
|
|
191
|
+
} catch {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function isStoredColumnWidths(value) {
|
|
196
|
+
if (typeof value !== "object" || value === null) return false;
|
|
197
|
+
const record = value;
|
|
198
|
+
return Array.isArray(record.columns) && record.columns.every((column) => typeof column === "string") && typeof record.overrides === "object" && record.overrides !== null && !Array.isArray(record.overrides);
|
|
199
|
+
}
|
|
200
|
+
function sameColumnKeys(stored, current) {
|
|
201
|
+
return stored.length === current.length && stored.every((key, index) => key === current[index]);
|
|
202
|
+
}
|
|
203
|
+
function sanitizeOverrides(overrides, columns) {
|
|
204
|
+
const next = {};
|
|
205
|
+
for (const column of columns) {
|
|
206
|
+
const value = overrides[column.key];
|
|
207
|
+
if (typeof value !== "number" || !Number.isFinite(value)) continue;
|
|
208
|
+
next[column.key] = Math.min(maxColumnWidthPx(column), Math.max(minColumnWidthPx(column), value));
|
|
209
|
+
}
|
|
210
|
+
return next;
|
|
211
|
+
}
|
|
212
|
+
function fixedTrackWidthPx(track) {
|
|
213
|
+
const value = track.trim();
|
|
214
|
+
const px = value.match(/^([0-9.]+)px$/);
|
|
215
|
+
if (px) return Number.parseFloat(px[1]);
|
|
216
|
+
const rem = value.match(/^([0-9.]+)rem$/);
|
|
217
|
+
if (rem) return Number.parseFloat(rem[1]) * rootFontSizePx();
|
|
218
|
+
return 0;
|
|
219
|
+
}
|
|
220
|
+
function rootFontSizePx() {
|
|
221
|
+
if (typeof window === "undefined") return 16;
|
|
222
|
+
const parsed = Number.parseFloat(window.getComputedStyle(document.documentElement).fontSize);
|
|
223
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 16;
|
|
224
|
+
}
|
|
225
|
+
//#endregion
|
|
226
|
+
export { useColumnResizing };
|
|
227
|
+
|
|
228
|
+
//# sourceMappingURL=use-column-resizing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-column-resizing.js","names":[],"sources":["../../resources/js/core/use-column-resizing.ts"],"sourcesContent":["import type { HTMLAttributes, KeyboardEvent, PointerEvent } from \"react\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n buildColumnGridTemplate,\n defaultColumnWidthPx,\n maxColumnWidthPx,\n minColumnWidthPx,\n type SizableColumn,\n} from \"./column-sizing\";\n\ntype DragState = {\n key: string;\n maxWidth: number;\n startWidth: number;\n startX: number;\n};\n\ntype ResizeHandleProps = HTMLAttributes<HTMLDivElement> & {\n \"aria-label\": string;\n \"aria-orientation\": \"vertical\";\n \"aria-valuemax\": number;\n \"aria-valuemin\": number;\n \"aria-valuenow\": number;\n role: \"separator\";\n tabIndex: number;\n};\n\ntype StoredColumnWidths = {\n columns: string[];\n overrides: Record<string, number>;\n};\n\nconst emptyTracks: string[] = [];\n\nexport function useColumnResizing({\n columnGapPx = 0,\n columns,\n enabled,\n leadingTracks = emptyTracks,\n showIndicator = false,\n storageKey,\n trailingTracks = emptyTracks,\n}: {\n columnGapPx?: number;\n columns: SizableColumn[];\n enabled: boolean;\n leadingTracks?: string[];\n showIndicator?: boolean;\n storageKey?: string;\n trailingTracks?: string[];\n}) {\n const columnKeys = useMemo(() => columns.map((column) => column.key), [columns]);\n const [overrides, setOverrides] = useState<Record<string, number | undefined>>(() =>\n readStoredOverrides(storageKey, columns),\n );\n const overridesRef = useRef(overrides);\n const drag = useRef<DragState | null>(null);\n\n const gridTemplateColumns = useMemo(\n () =>\n buildColumnGridTemplate({\n columns,\n leadingTracks,\n trailingTracks,\n overrides: enabled ? overrides : {},\n }),\n [columns, enabled, leadingTracks, overrides, trailingTracks],\n );\n\n const setColumnWidth = useCallback(\n (column: SizableColumn, width: number, maxWidth?: number) => {\n setOverrides((current) => {\n const next = {\n ...current,\n [column.key]: Math.min(\n maxWidth ?? maxColumnWidthPx(column),\n Math.max(minColumnWidthPx(column), width),\n ),\n };\n\n overridesRef.current = next;\n writeStoredOverrides(storageKey, columnKeys, next);\n\n return next;\n });\n },\n [columnKeys, storageKey],\n );\n\n const resetColumnWidth = useCallback(\n (column: SizableColumn) => {\n setOverrides((current) => {\n const next = { ...current };\n delete next[column.key];\n\n overridesRef.current = next;\n writeStoredOverrides(storageKey, columnKeys, next);\n\n return next;\n });\n },\n [columnKeys, storageKey],\n );\n\n const resetColumns = useCallback(() => {\n setOverrides({});\n overridesRef.current = {};\n writeStoredOverrides(storageKey, columnKeys, {});\n }, [columnKeys, storageKey]);\n\n const hasOverrides =\n enabled && Object.values(overrides).some((width) => typeof width === \"number\");\n\n const currentColumnWidth = useCallback(\n (column: SizableColumn): number =>\n overridesRef.current[column.key] ?? defaultColumnWidthPx(column),\n [],\n );\n\n const getResizeHandleProps = useCallback(\n (column: SizableColumn): ResizeHandleProps => {\n const max = maxColumnWidthPx(column);\n const min = minColumnWidthPx(column);\n const current = currentColumnWidth(column);\n const label = column.label ?? column.key;\n const indicatorClass = showIndicator ? \"after:bg-lt-border\" : \"after:bg-transparent\";\n\n const maxWidthForHandle = (handle: HTMLDivElement): number =>\n maxColumnWidthForGrid({\n column,\n columnGapPx,\n columns,\n grid: handle.parentElement?.parentElement,\n leadingTracks,\n trailingTracks,\n });\n\n const resizeBy = (handle: HTMLDivElement, delta: number): void =>\n setColumnWidth(column, current + delta, maxWidthForHandle(handle));\n\n return {\n \"aria-label\": `Resize ${label}`,\n \"aria-orientation\": \"vertical\",\n \"aria-valuemax\": max,\n \"aria-valuemin\": min,\n \"aria-valuenow\": current,\n className: `absolute inset-y-0 right-0 hidden w-2 cursor-col-resize touch-none items-stretch justify-center md:flex after:my-1 after:w-px ${indicatorClass} hover:after:bg-lt-border focus-visible:outline-none focus-visible:after:bg-lt-ring`,\n onDoubleClick: () => resetColumnWidth(column),\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => {\n if (!enabled) {\n return;\n }\n\n const step = event.shiftKey ? 32 : 8;\n\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n resizeBy(event.currentTarget, -step);\n }\n\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n resizeBy(event.currentTarget, step);\n }\n\n if (event.key === \"Home\") {\n event.preventDefault();\n setColumnWidth(column, min);\n }\n\n if (event.key === \"End\") {\n event.preventDefault();\n const handleMax = maxWidthForHandle(event.currentTarget);\n setColumnWidth(column, handleMax, handleMax);\n }\n\n if (event.key === \"Enter\" || event.key === \"Escape\") {\n event.preventDefault();\n resetColumnWidth(column);\n }\n },\n onPointerDown: (event: PointerEvent<HTMLDivElement>) => {\n if (!enabled) {\n return;\n }\n\n const parentWidth = event.currentTarget.parentElement?.getBoundingClientRect().width ?? 0;\n drag.current = {\n key: column.key,\n maxWidth: maxWidthForHandle(event.currentTarget),\n startWidth: parentWidth > 0 ? parentWidth : current,\n startX: event.clientX,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n event.preventDefault();\n },\n onPointerMove: (event: PointerEvent<HTMLDivElement>) => {\n const active = drag.current;\n\n if (!enabled || active?.key !== column.key) {\n return;\n }\n\n setColumnWidth(\n column,\n active.startWidth + event.clientX - active.startX,\n active.maxWidth,\n );\n },\n onPointerUp: (event: PointerEvent<HTMLDivElement>) => {\n const active = drag.current;\n\n if (active?.key !== column.key) {\n return;\n }\n\n drag.current = null;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n },\n role: \"separator\",\n tabIndex: 0,\n };\n },\n [\n columnGapPx,\n columns,\n currentColumnWidth,\n enabled,\n leadingTracks,\n resetColumnWidth,\n setColumnWidth,\n showIndicator,\n trailingTracks,\n ],\n );\n\n return {\n getResizeHandleProps,\n gridTemplateColumns,\n hasOverrides,\n resetColumns,\n resetColumnWidth,\n };\n}\n\nfunction maxColumnWidthForGrid({\n column,\n columnGapPx,\n columns,\n grid,\n leadingTracks,\n trailingTracks,\n}: {\n column: SizableColumn;\n columnGapPx: number;\n columns: SizableColumn[];\n grid: Element | null | undefined;\n leadingTracks: string[];\n trailingTracks: string[];\n}): number {\n const gridWidth = grid?.getBoundingClientRect().width ?? 0;\n\n if (gridWidth <= 0) {\n return maxColumnWidthPx(column);\n }\n\n const utilityWidth = [...leadingTracks, ...trailingTracks].reduce(\n (sum, track) => sum + fixedTrackWidthPx(track),\n 0,\n );\n const siblingMinWidth = columns.reduce(\n (sum, sibling) => (sibling.key === column.key ? sum : sum + minColumnWidthPx(sibling)),\n 0,\n );\n const trackCount = columns.length + leadingTracks.length + trailingTracks.length;\n const gapWidth = Math.max(0, trackCount - 1) * columnGapPx;\n const available = gridWidth - utilityWidth - siblingMinWidth - gapWidth;\n\n return Math.min(maxColumnWidthPx(column), Math.max(minColumnWidthPx(column), available));\n}\n\nfunction readStoredOverrides(\n storageKey: string | undefined,\n columns: SizableColumn[],\n): Record<string, number | undefined> {\n if (!storageKey || typeof window === \"undefined\") {\n return {};\n }\n\n try {\n const raw = window.localStorage.getItem(storageKey);\n\n if (raw === null) {\n return {};\n }\n\n const stored = JSON.parse(raw) as unknown;\n const columnKeys = columns.map((column) => column.key);\n\n if (!isStoredColumnWidths(stored) || !sameColumnKeys(stored.columns, columnKeys)) {\n removeStoredOverrides(storageKey);\n\n return {};\n }\n\n const overrides = sanitizeOverrides(stored.overrides, columns);\n\n if (Object.keys(overrides).length === 0) {\n removeStoredOverrides(storageKey);\n }\n\n return overrides;\n } catch {\n removeStoredOverrides(storageKey);\n\n return {};\n }\n}\n\nfunction writeStoredOverrides(\n storageKey: string | undefined,\n columnKeys: string[],\n overrides: Record<string, number | undefined>,\n): void {\n if (!storageKey || typeof window === \"undefined\") {\n return;\n }\n\n const stored: Record<string, number> = {};\n const knownKeys = new Set(columnKeys);\n\n for (const [key, value] of Object.entries(overrides)) {\n if (knownKeys.has(key) && typeof value === \"number\" && Number.isFinite(value)) {\n stored[key] = value;\n }\n }\n\n if (Object.keys(stored).length === 0) {\n removeStoredOverrides(storageKey);\n\n return;\n }\n\n try {\n window.localStorage.setItem(\n storageKey,\n JSON.stringify({\n columns: columnKeys,\n overrides: stored,\n }),\n );\n } catch {\n return;\n }\n}\n\nfunction removeStoredOverrides(storageKey: string): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n try {\n window.localStorage.removeItem(storageKey);\n } catch {\n return;\n }\n}\n\nfunction isStoredColumnWidths(value: unknown): value is StoredColumnWidths {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n Array.isArray(record.columns) &&\n record.columns.every((column) => typeof column === \"string\") &&\n typeof record.overrides === \"object\" &&\n record.overrides !== null &&\n !Array.isArray(record.overrides)\n );\n}\n\nfunction sameColumnKeys(stored: string[], current: string[]): boolean {\n return stored.length === current.length && stored.every((key, index) => key === current[index]);\n}\n\nfunction sanitizeOverrides(\n overrides: Record<string, unknown>,\n columns: SizableColumn[],\n): Record<string, number | undefined> {\n const next: Record<string, number | undefined> = {};\n\n for (const column of columns) {\n const value = overrides[column.key];\n\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n continue;\n }\n\n next[column.key] = Math.min(\n maxColumnWidthPx(column),\n Math.max(minColumnWidthPx(column), value),\n );\n }\n\n return next;\n}\n\nfunction fixedTrackWidthPx(track: string): number {\n const value = track.trim();\n const px = value.match(/^([0-9.]+)px$/);\n\n if (px) {\n return Number.parseFloat(px[1]);\n }\n\n const rem = value.match(/^([0-9.]+)rem$/);\n\n if (rem) {\n return Number.parseFloat(rem[1]) * rootFontSizePx();\n }\n\n return 0;\n}\n\nfunction rootFontSizePx(): number {\n if (typeof window === \"undefined\") {\n return 16;\n }\n\n const parsed = Number.parseFloat(window.getComputedStyle(document.documentElement).fontSize);\n\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 16;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ActionResult, Effect } from '../types/generated';
|
|
2
|
+
import { EffectHandlerRegistry } from './registry';
|
|
3
|
+
export type ActionEffect = Effect;
|
|
4
|
+
/** The server's action response. Fields are optional: a handler may omit any of them. */
|
|
5
|
+
export type ActionResponse = Partial<ActionResult>;
|
|
6
|
+
/**
|
|
7
|
+
* Run each effect through its handler. Handlers default to the built-ins; the
|
|
8
|
+
* Provider passes a merged registry that also includes consumer-registered
|
|
9
|
+
* handlers. An effect with no handler is warned about (dev) and skipped.
|
|
10
|
+
*/
|
|
11
|
+
export declare function dispatchEffects(effects: ActionEffect[], handlers?: EffectHandlerRegistry): void;
|
|
12
|
+
export declare function dispatchActionError(error: unknown): void;
|
|
13
|
+
export declare function getActionEffects(effects: unknown): ActionEffect[];
|
|
14
|
+
/**
|
|
15
|
+
* Structural guard for an effect on the wire. Intentionally open: it accepts any
|
|
16
|
+
* object with a string `type`, not only the built-in types, so consumer-registered
|
|
17
|
+
* effects pass through getActionEffects() and reach their handlers. Dispatch warns
|
|
18
|
+
* on (and skips) a type with no registered handler.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isActionEffect(effect: unknown): effect is ActionEffect;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { LATTICE_EVENT } from "../events/event-names.js";
|
|
2
|
+
import { builtinEffectHandlers } from "./registry.js";
|
|
3
|
+
//#region resources/js/effects/dispatch.ts
|
|
4
|
+
/**
|
|
5
|
+
* Run each effect through its handler. Handlers default to the built-ins; the
|
|
6
|
+
* Provider passes a merged registry that also includes consumer-registered
|
|
7
|
+
* handlers. An effect with no handler is warned about (dev) and skipped.
|
|
8
|
+
*/
|
|
9
|
+
function dispatchEffects(effects, handlers = builtinEffectHandlers) {
|
|
10
|
+
if (typeof window === "undefined") return;
|
|
11
|
+
for (const effect of effects) {
|
|
12
|
+
const handler = handlers[effect.type];
|
|
13
|
+
if (handler === void 0) {
|
|
14
|
+
console.warn(`[lattice] No handler registered for effect type "${effect.type}".`);
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
handler(effect);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function dispatchActionError(error) {
|
|
21
|
+
if (typeof window === "undefined") return;
|
|
22
|
+
window.dispatchEvent(new CustomEvent(LATTICE_EVENT.actionError, { detail: { error } }));
|
|
23
|
+
}
|
|
24
|
+
function getActionEffects(effects) {
|
|
25
|
+
return Array.isArray(effects) ? effects.filter(isActionEffect) : [];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Structural guard for an effect on the wire. Intentionally open: it accepts any
|
|
29
|
+
* object with a string `type`, not only the built-in types, so consumer-registered
|
|
30
|
+
* effects pass through getActionEffects() and reach their handlers. Dispatch warns
|
|
31
|
+
* on (and skips) a type with no registered handler.
|
|
32
|
+
*/
|
|
33
|
+
function isActionEffect(effect) {
|
|
34
|
+
return typeof effect === "object" && effect !== null && "type" in effect && typeof effect.type === "string";
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { dispatchActionError, dispatchEffects, getActionEffects, isActionEffect };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","names":[],"sources":["../../resources/js/effects/dispatch.ts"],"sourcesContent":["import type { ActionResult, Effect } from \"@lattice-php/lattice/types/generated\";\nimport { LATTICE_EVENT } from \"@lattice-php/lattice/events/event-names\";\nimport { builtinEffectHandlers } from \"./registry\";\nimport type { EffectHandlerRegistry } from \"./registry\";\n\nexport type ActionEffect = Effect;\n\n/** The server's action response. Fields are optional: a handler may omit any of them. */\nexport type ActionResponse = Partial<ActionResult>;\n\n/**\n * Run each effect through its handler. Handlers default to the built-ins; the\n * Provider passes a merged registry that also includes consumer-registered\n * handlers. An effect with no handler is warned about (dev) and skipped.\n */\nexport function dispatchEffects(\n effects: ActionEffect[],\n handlers: EffectHandlerRegistry = builtinEffectHandlers,\n): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n for (const effect of effects) {\n const handler = handlers[effect.type];\n\n if (handler === undefined) {\n console.warn(`[lattice] No handler registered for effect type \"${effect.type}\".`);\n continue;\n }\n\n handler(effect);\n }\n}\n\nexport function dispatchActionError(error: unknown): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.dispatchEvent(new CustomEvent(LATTICE_EVENT.actionError, { detail: { error } }));\n}\n\nexport function getActionEffects(effects: unknown): ActionEffect[] {\n return Array.isArray(effects) ? effects.filter(isActionEffect) : [];\n}\n\n/**\n * Structural guard for an effect on the wire. Intentionally open: it accepts any\n * object with a string `type`, not only the built-in types, so consumer-registered\n * effects pass through getActionEffects() and reach their handlers. Dispatch warns\n * on (and skips) a type with no registered handler.\n */\nexport function isActionEffect(effect: unknown): effect is ActionEffect {\n return (\n typeof effect === \"object\" &&\n effect !== null &&\n \"type\" in effect &&\n typeof (effect as { type: unknown }).type === \"string\"\n );\n}\n"],"mappings":";;;;;;;;AAeA,SAAgB,gBACd,SACA,WAAkC,uBAC5B;CACN,IAAI,OAAO,WAAW,aACpB;CAGF,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,UAAU,SAAS,OAAO;EAEhC,IAAI,YAAY,KAAA,GAAW;GACzB,QAAQ,KAAK,oDAAoD,OAAO,KAAK,GAAG;GAChF;EACF;EAEA,QAAQ,MAAM;CAChB;AACF;AAEA,SAAgB,oBAAoB,OAAsB;CACxD,IAAI,OAAO,WAAW,aACpB;CAGF,OAAO,cAAc,IAAI,YAAY,cAAc,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACxF;AAEA,SAAgB,iBAAiB,SAAkC;CACjE,OAAO,MAAM,QAAQ,OAAO,IAAI,QAAQ,OAAO,cAAc,IAAI,CAAC;AACpE;;;;;;;AAQA,SAAgB,eAAe,QAAyC;CACtE,OACE,OAAO,WAAW,YAClB,WAAW,QACX,UAAU,UACV,OAAQ,OAA6B,SAAS;AAElD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ResolveProps } from '../core/types';
|
|
2
|
+
import { Effect } from '../types/generated';
|
|
3
|
+
/**
|
|
4
|
+
* Augmentable map of effect `type` → payload (the effect's fields minus `type`).
|
|
5
|
+
* Consumer apps extend it via `declare module "@lattice-php/lattice"` so their
|
|
6
|
+
* custom effects type their handler's payload; built-ins resolve through the
|
|
7
|
+
* generated `Effect` union.
|
|
8
|
+
*/
|
|
9
|
+
export interface EffectProps {
|
|
10
|
+
}
|
|
11
|
+
type EffectPayloads = {
|
|
12
|
+
[TEffect in Effect as TEffect["type"]]: Omit<TEffect, "type">;
|
|
13
|
+
};
|
|
14
|
+
type EffectPayloadOf<TType extends string> = ResolveProps<EffectProps, EffectPayloads, TType, Record<string, unknown>>;
|
|
15
|
+
/**
|
|
16
|
+
* Resolves an effect `type` to its full shape — `{ type, ...payload }` — the way
|
|
17
|
+
* `Node<T>` pairs a type with its props, so built-ins and consumer effects alike
|
|
18
|
+
* always carry `type`. An unknown type falls back to the loose `Effect` union.
|
|
19
|
+
*/
|
|
20
|
+
export type EffectOf<TType extends string> = string extends TType ? Effect : {
|
|
21
|
+
type: TType;
|
|
22
|
+
} & EffectPayloadOf<TType>;
|
|
23
|
+
export type EffectHandler<TType extends string = string> = (effect: EffectOf<TType>) => void;
|
|
24
|
+
export type EffectHandlerRegistry = Record<string, EffectHandler>;
|
|
25
|
+
/**
|
|
26
|
+
* Registers a typed effect handler, erasing the type parameter for the registry.
|
|
27
|
+
* Mirrors `eagerComponent`/`columnCell`: author against `EffectHandler<"my.type">`
|
|
28
|
+
* for a typed payload, register through this.
|
|
29
|
+
*/
|
|
30
|
+
export declare function effectHandler<TType extends string>(_type: TType, fn: EffectHandler<TType>): EffectHandler;
|
|
31
|
+
/**
|
|
32
|
+
* Built-in effect handlers. Imperative effects act directly; the rest bridge to
|
|
33
|
+
* the `lattice:*` DOM events that toast/callout/modal/fragment/form subscribe to
|
|
34
|
+
* — preserving today's behavior exactly.
|
|
35
|
+
*/
|
|
36
|
+
export declare const builtinEffectHandlers: EffectHandlerRegistry;
|
|
37
|
+
export declare function mergeEffectHandlers(...registries: Array<EffectHandlerRegistry | undefined>): EffectHandlerRegistry;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { LATTICE_EVENT } from "../events/event-names.js";
|
|
2
|
+
import { setLocale } from "../i18n/locale.js";
|
|
3
|
+
import { router } from "@inertiajs/react";
|
|
4
|
+
//#region resources/js/effects/registry.ts
|
|
5
|
+
/**
|
|
6
|
+
* Registers a typed effect handler, erasing the type parameter for the registry.
|
|
7
|
+
* Mirrors `eagerComponent`/`columnCell`: author against `EffectHandler<"my.type">`
|
|
8
|
+
* for a typed payload, register through this.
|
|
9
|
+
*/
|
|
10
|
+
function effectHandler(_type, fn) {
|
|
11
|
+
return fn;
|
|
12
|
+
}
|
|
13
|
+
function triggerDownload(url) {
|
|
14
|
+
const link = document.createElement("a");
|
|
15
|
+
link.href = url;
|
|
16
|
+
link.rel = "noopener";
|
|
17
|
+
document.body.appendChild(link);
|
|
18
|
+
link.click();
|
|
19
|
+
link.remove();
|
|
20
|
+
}
|
|
21
|
+
/** Re-broadcast an effect as its `lattice:*` DOM event for feature components. */
|
|
22
|
+
function bridge(event) {
|
|
23
|
+
return (effect) => window.dispatchEvent(new CustomEvent(event, { detail: effect }));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Built-in effect handlers. Imperative effects act directly; the rest bridge to
|
|
27
|
+
* the `lattice:*` DOM events that toast/callout/modal/fragment/form subscribe to
|
|
28
|
+
* — preserving today's behavior exactly.
|
|
29
|
+
*/
|
|
30
|
+
var builtinEffectHandlers = {
|
|
31
|
+
reloadPage: () => router.reload(),
|
|
32
|
+
redirect: effectHandler("redirect", (effect) => router.visit(effect.url)),
|
|
33
|
+
download: effectHandler("download", (effect) => triggerDownload(effect.url)),
|
|
34
|
+
localeChange: effectHandler("localeChange", (effect) => setLocale(effect.locale)),
|
|
35
|
+
toast: bridge(LATTICE_EVENT.toast),
|
|
36
|
+
callout: bridge(LATTICE_EVENT.callout),
|
|
37
|
+
reloadComponent: bridge(LATTICE_EVENT.reloadComponent),
|
|
38
|
+
openModal: bridge(LATTICE_EVENT.openModal),
|
|
39
|
+
closeModal: bridge(LATTICE_EVENT.closeModal),
|
|
40
|
+
resetForm: bridge(LATTICE_EVENT.resetForm)
|
|
41
|
+
};
|
|
42
|
+
function mergeEffectHandlers(...registries) {
|
|
43
|
+
return registries.reduce((merged, registry) => ({
|
|
44
|
+
...merged,
|
|
45
|
+
...registry
|
|
46
|
+
}), {});
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { builtinEffectHandlers, effectHandler, mergeEffectHandlers };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","names":[],"sources":["../../resources/js/effects/registry.ts"],"sourcesContent":["import { router } from \"@inertiajs/react\";\nimport type { ResolveProps } from \"@lattice-php/lattice/core/types\";\nimport type { Effect } from \"@lattice-php/lattice/types/generated\";\nimport { LATTICE_EVENT } from \"@lattice-php/lattice/events/event-names\";\nimport { setLocale } from \"@lattice-php/lattice/i18n/locale\";\n\n/**\n * Augmentable map of effect `type` → payload (the effect's fields minus `type`).\n * Consumer apps extend it via `declare module \"@lattice-php/lattice\"` so their\n * custom effects type their handler's payload; built-ins resolve through the\n * generated `Effect` union.\n */\nexport interface EffectProps {}\n\n// The generated built-in effect payloads, keyed by `type` (the discriminant stripped).\ntype EffectPayloads = { [TEffect in Effect as TEffect[\"type\"]]: Omit<TEffect, \"type\"> };\n\ntype EffectPayloadOf<TType extends string> = ResolveProps<\n EffectProps,\n EffectPayloads,\n TType,\n Record<string, unknown>\n>;\n\n/**\n * Resolves an effect `type` to its full shape — `{ type, ...payload }` — the way\n * `Node<T>` pairs a type with its props, so built-ins and consumer effects alike\n * always carry `type`. An unknown type falls back to the loose `Effect` union.\n */\nexport type EffectOf<TType extends string> = string extends TType\n ? Effect\n : { type: TType } & EffectPayloadOf<TType>;\n\nexport type EffectHandler<TType extends string = string> = (effect: EffectOf<TType>) => void;\n\nexport type EffectHandlerRegistry = Record<string, EffectHandler>;\n\n/**\n * Registers a typed effect handler, erasing the type parameter for the registry.\n * Mirrors `eagerComponent`/`columnCell`: author against `EffectHandler<\"my.type\">`\n * for a typed payload, register through this.\n */\nexport function effectHandler<TType extends string>(\n _type: TType,\n fn: EffectHandler<TType>,\n): EffectHandler {\n return fn as unknown as EffectHandler;\n}\n\nfunction triggerDownload(url: string): void {\n const link = document.createElement(\"a\");\n link.href = url;\n link.rel = \"noopener\";\n document.body.appendChild(link);\n link.click();\n link.remove();\n}\n\n/** Re-broadcast an effect as its `lattice:*` DOM event for feature components. */\nfunction bridge(event: string): EffectHandler {\n return (effect) => window.dispatchEvent(new CustomEvent(event, { detail: effect }));\n}\n\n/**\n * Built-in effect handlers. Imperative effects act directly; the rest bridge to\n * the `lattice:*` DOM events that toast/callout/modal/fragment/form subscribe to\n * — preserving today's behavior exactly.\n */\nexport const builtinEffectHandlers: EffectHandlerRegistry = {\n reloadPage: () => router.reload(),\n redirect: effectHandler(\"redirect\", (effect) => router.visit(effect.url)),\n download: effectHandler(\"download\", (effect) => triggerDownload(effect.url)),\n localeChange: effectHandler(\"localeChange\", (effect) => setLocale(effect.locale)),\n toast: bridge(LATTICE_EVENT.toast),\n callout: bridge(LATTICE_EVENT.callout),\n reloadComponent: bridge(LATTICE_EVENT.reloadComponent),\n openModal: bridge(LATTICE_EVENT.openModal),\n closeModal: bridge(LATTICE_EVENT.closeModal),\n resetForm: bridge(LATTICE_EVENT.resetForm),\n};\n\nexport function mergeEffectHandlers(\n ...registries: Array<EffectHandlerRegistry | undefined>\n): EffectHandlerRegistry {\n return registries.reduce<EffectHandlerRegistry>(\n (merged, registry) => ({ ...merged, ...registry }),\n {},\n );\n}\n"],"mappings":";;;;;;;;;AA0CA,SAAgB,cACd,OACA,IACe;CACf,OAAO;AACT;AAEA,SAAS,gBAAgB,KAAmB;CAC1C,MAAM,OAAO,SAAS,cAAc,GAAG;CACvC,KAAK,OAAO;CACZ,KAAK,MAAM;CACX,SAAS,KAAK,YAAY,IAAI;CAC9B,KAAK,MAAM;CACX,KAAK,OAAO;AACd;;AAGA,SAAS,OAAO,OAA8B;CAC5C,QAAQ,WAAW,OAAO,cAAc,IAAI,YAAY,OAAO,EAAE,QAAQ,OAAO,CAAC,CAAC;AACpF;;;;;;AAOA,IAAa,wBAA+C;CAC1D,kBAAkB,OAAO,OAAO;CAChC,UAAU,cAAc,aAAa,WAAW,OAAO,MAAM,OAAO,GAAG,CAAC;CACxE,UAAU,cAAc,aAAa,WAAW,gBAAgB,OAAO,GAAG,CAAC;CAC3E,cAAc,cAAc,iBAAiB,WAAW,UAAU,OAAO,MAAM,CAAC;CAChF,OAAO,OAAO,cAAc,KAAK;CACjC,SAAS,OAAO,cAAc,OAAO;CACrC,iBAAiB,OAAO,cAAc,eAAe;CACrD,WAAW,OAAO,cAAc,SAAS;CACzC,YAAY,OAAO,cAAc,UAAU;CAC3C,WAAW,OAAO,cAAc,SAAS;AAC3C;AAEA,SAAgB,oBACd,GAAG,YACoB;CACvB,OAAO,WAAW,QACf,QAAQ,cAAc;EAAE,GAAG;EAAQ,GAAG;CAAS,IAChD,CAAC,CACH;AACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ActionEffect } from './dispatch';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a dispatcher bound to the built-in handlers plus any consumer handlers
|
|
4
|
+
* in the current registry. The built-ins are merged in directly so they fire even
|
|
5
|
+
* with no <Provider> in scope (effects are infrastructural) — this is the single
|
|
6
|
+
* place built-ins enter dispatch.
|
|
7
|
+
*/
|
|
8
|
+
export declare function useEffectDispatcher(): (effects: ActionEffect[]) => void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { builtinEffectHandlers, mergeEffectHandlers } from "./registry.js";
|
|
2
|
+
import { dispatchEffects } from "./dispatch.js";
|
|
3
|
+
import { useEffectHandlerRegistry } from "../core/registry-context.js";
|
|
4
|
+
import { useCallback, useMemo } from "react";
|
|
5
|
+
//#region resources/js/effects/use-effect-dispatcher.ts
|
|
6
|
+
/**
|
|
7
|
+
* Returns a dispatcher bound to the built-in handlers plus any consumer handlers
|
|
8
|
+
* in the current registry. The built-ins are merged in directly so they fire even
|
|
9
|
+
* with no <Provider> in scope (effects are infrastructural) — this is the single
|
|
10
|
+
* place built-ins enter dispatch.
|
|
11
|
+
*/
|
|
12
|
+
function useEffectDispatcher() {
|
|
13
|
+
const registered = useEffectHandlerRegistry();
|
|
14
|
+
const handlers = useMemo(() => mergeEffectHandlers(builtinEffectHandlers, registered), [registered]);
|
|
15
|
+
return useCallback((effects) => dispatchEffects(effects, handlers), [handlers]);
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { useEffectDispatcher };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=use-effect-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-effect-dispatcher.js","names":[],"sources":["../../resources/js/effects/use-effect-dispatcher.ts"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { useEffectHandlerRegistry } from \"@lattice-php/lattice/core/registry-context\";\nimport { dispatchEffects } from \"./dispatch\";\nimport type { ActionEffect } from \"./dispatch\";\nimport { builtinEffectHandlers, mergeEffectHandlers } from \"./registry\";\n\n/**\n * Returns a dispatcher bound to the built-in handlers plus any consumer handlers\n * in the current registry. The built-ins are merged in directly so they fire even\n * with no <Provider> in scope (effects are infrastructural) — this is the single\n * place built-ins enter dispatch.\n */\nexport function useEffectDispatcher(): (effects: ActionEffect[]) => void {\n const registered = useEffectHandlerRegistry();\n\n const handlers = useMemo(\n () => mergeEffectHandlers(builtinEffectHandlers, registered),\n [registered],\n );\n\n return useCallback((effects: ActionEffect[]) => dispatchEffects(effects, handlers), [handlers]);\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,sBAAyD;CACvE,MAAM,aAAa,yBAAyB;CAE5C,MAAM,WAAW,cACT,oBAAoB,uBAAuB,UAAU,GAC3D,CAAC,UAAU,CACb;CAEA,OAAO,aAAa,YAA4B,gBAAgB,SAAS,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAChG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { getActionEffects } from "./dispatch.js";
|
|
2
|
+
import { useEffectDispatcher } from "./use-effect-dispatcher.js";
|
|
3
|
+
import { useEffect } from "react";
|
|
4
|
+
import { router } from "@inertiajs/react";
|
|
5
|
+
//#region resources/js/effects/use-flash-effects.ts
|
|
6
|
+
/**
|
|
7
|
+
* Drains the `latticeEffects` flash bag (server `Effects::flash(...)`) on each
|
|
8
|
+
* Inertia navigation and runs the effects through the registry dispatcher.
|
|
9
|
+
*/
|
|
10
|
+
function useFlashEffects() {
|
|
11
|
+
const dispatch = useEffectDispatcher();
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
return router.on("flash", (event) => {
|
|
14
|
+
const effects = getActionEffects(event.detail?.flash?.latticeEffects);
|
|
15
|
+
if (effects.length > 0) dispatch(effects);
|
|
16
|
+
});
|
|
17
|
+
}, [dispatch]);
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { useFlashEffects };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=use-flash-effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-flash-effects.js","names":[],"sources":["../../resources/js/effects/use-flash-effects.ts"],"sourcesContent":["import { router } from \"@inertiajs/react\";\nimport { useEffect } from \"react\";\nimport { getActionEffects } from \"@lattice-php/lattice/effects/dispatch\";\nimport { useEffectDispatcher } from \"@lattice-php/lattice/effects/use-effect-dispatcher\";\n\ntype InertiaFlashEvent = CustomEvent<{\n flash?: {\n latticeEffects?: unknown;\n };\n}>;\n\n/**\n * Drains the `latticeEffects` flash bag (server `Effects::flash(...)`) on each\n * Inertia navigation and runs the effects through the registry dispatcher.\n */\nexport function useFlashEffects(): void {\n const dispatch = useEffectDispatcher();\n\n useEffect(() => {\n return router.on(\"flash\", (event) => {\n const effects = getActionEffects((event as InertiaFlashEvent).detail?.flash?.latticeEffects);\n\n if (effects.length > 0) {\n dispatch(effects);\n }\n });\n }, [dispatch]);\n}\n"],"mappings":";;;;;;;;;AAeA,SAAgB,kBAAwB;CACtC,MAAM,WAAW,oBAAoB;CAErC,gBAAgB;EACd,OAAO,OAAO,GAAG,UAAU,UAAU;GACnC,MAAM,UAAU,iBAAkB,MAA4B,QAAQ,OAAO,cAAc;GAE3F,IAAI,QAAQ,SAAS,GACnB,SAAS,OAAO;EAEpB,CAAC;CACH,GAAG,CAAC,QAAQ,CAAC;AACf"}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
import { ToastMessage } from '../toast/toast';
|
|
2
2
|
export declare const appearances: readonly ["light", "dark", "system"];
|
|
3
|
-
export type ToastVariant = (typeof toastVariants)[number];
|
|
4
3
|
export type Appearance = (typeof appearances)[number];
|
|
5
|
-
export type ToastMessage = {
|
|
6
|
-
message: string;
|
|
7
|
-
variant: ToastVariant;
|
|
8
|
-
};
|
|
9
4
|
type EventBridgeProps = {
|
|
10
5
|
onAppearanceChange?: (appearance: Appearance) => void;
|
|
6
|
+
onLocaleChange?: (locale: string) => void;
|
|
11
7
|
onToast?: (toast: ToastMessage) => void;
|
|
12
8
|
};
|
|
13
|
-
export declare function EventBridge({ onAppearanceChange, onToast }: EventBridgeProps): null;
|
|
9
|
+
export declare function EventBridge({ onAppearanceChange, onLocaleChange, onToast }: EventBridgeProps): null;
|
|
14
10
|
export {};
|
|
@@ -1,61 +1,20 @@
|
|
|
1
1
|
import { LATTICE_EVENT } from "./event-names.js";
|
|
2
|
+
import { onToast } from "../toast/toast.js";
|
|
2
3
|
import { useEffect } from "react";
|
|
3
|
-
import { router } from "@inertiajs/react";
|
|
4
4
|
//#region resources/js/events/event-bridge.tsx
|
|
5
|
-
var toastVariants = [
|
|
6
|
-
"success",
|
|
7
|
-
"info",
|
|
8
|
-
"warning",
|
|
9
|
-
"error"
|
|
10
|
-
];
|
|
11
5
|
var appearances = [
|
|
12
6
|
"light",
|
|
13
7
|
"dark",
|
|
14
8
|
"system"
|
|
15
9
|
];
|
|
16
|
-
function isToastVariant(value) {
|
|
17
|
-
return toastVariants.some((variant) => variant === value);
|
|
18
|
-
}
|
|
19
10
|
function isAppearance(value) {
|
|
20
11
|
return appearances.some((appearance) => appearance === value);
|
|
21
12
|
}
|
|
22
|
-
function
|
|
23
|
-
if (typeof value !== "object" || value === null) return null;
|
|
24
|
-
const candidate = value;
|
|
25
|
-
if (typeof candidate.message !== "string" || !isToastVariant(candidate.variant)) return null;
|
|
26
|
-
return {
|
|
27
|
-
message: candidate.message,
|
|
28
|
-
variant: candidate.variant
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
function normalizeLatticeToast(event) {
|
|
32
|
-
const detail = event.detail;
|
|
33
|
-
const message = detail?.message;
|
|
34
|
-
if (typeof message !== "string" || message === "") return null;
|
|
35
|
-
return {
|
|
36
|
-
message,
|
|
37
|
-
variant: isToastVariant(detail.variant) ? detail.variant : "success"
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
function EventBridge({ onAppearanceChange, onToast }) {
|
|
13
|
+
function EventBridge({ onAppearanceChange, onLocaleChange, onToast: onToast$1 }) {
|
|
41
14
|
useEffect(() => {
|
|
42
|
-
if (!onToast) return;
|
|
43
|
-
return
|
|
44
|
-
|
|
45
|
-
if (toast) onToast(toast);
|
|
46
|
-
});
|
|
47
|
-
}, [onToast]);
|
|
48
|
-
useEffect(() => {
|
|
49
|
-
if (!onToast) return;
|
|
50
|
-
const listener = (event) => {
|
|
51
|
-
const toast = normalizeLatticeToast(event);
|
|
52
|
-
if (toast) onToast(toast);
|
|
53
|
-
};
|
|
54
|
-
window.addEventListener(LATTICE_EVENT.toast, listener);
|
|
55
|
-
return () => {
|
|
56
|
-
window.removeEventListener(LATTICE_EVENT.toast, listener);
|
|
57
|
-
};
|
|
58
|
-
}, [onToast]);
|
|
15
|
+
if (!onToast$1) return;
|
|
16
|
+
return onToast(onToast$1);
|
|
17
|
+
}, [onToast$1]);
|
|
59
18
|
useEffect(() => {
|
|
60
19
|
if (!onAppearanceChange) return;
|
|
61
20
|
const listener = (event) => {
|
|
@@ -67,9 +26,20 @@ function EventBridge({ onAppearanceChange, onToast }) {
|
|
|
67
26
|
window.removeEventListener(LATTICE_EVENT.appearanceChange, listener);
|
|
68
27
|
};
|
|
69
28
|
}, [onAppearanceChange]);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (!onLocaleChange) return;
|
|
31
|
+
const listener = (event) => {
|
|
32
|
+
const locale = event.detail?.locale;
|
|
33
|
+
if (typeof locale === "string" && locale !== "") onLocaleChange(locale);
|
|
34
|
+
};
|
|
35
|
+
window.addEventListener(LATTICE_EVENT.localeChange, listener);
|
|
36
|
+
return () => {
|
|
37
|
+
window.removeEventListener(LATTICE_EVENT.localeChange, listener);
|
|
38
|
+
};
|
|
39
|
+
}, [onLocaleChange]);
|
|
70
40
|
return null;
|
|
71
41
|
}
|
|
72
42
|
//#endregion
|
|
73
|
-
export { EventBridge, appearances
|
|
43
|
+
export { EventBridge, appearances };
|
|
74
44
|
|
|
75
45
|
//# sourceMappingURL=event-bridge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bridge.js","names":[],"sources":["../../resources/js/events/event-bridge.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"event-bridge.js","names":[],"sources":["../../resources/js/events/event-bridge.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { onToast as subscribeToToasts } from \"@lattice-php/lattice/toast/toast\";\nimport type { ToastMessage } from \"@lattice-php/lattice/toast/toast\";\nimport { LATTICE_EVENT } from \"./event-names\";\n\nexport const appearances = [\"light\", \"dark\", \"system\"] as const;\n\nexport type Appearance = (typeof appearances)[number];\n\ntype EventBridgeProps = {\n onAppearanceChange?: (appearance: Appearance) => void;\n onLocaleChange?: (locale: string) => void;\n onToast?: (toast: ToastMessage) => void;\n};\n\ntype AppearanceEvent = CustomEvent<{\n value?: unknown;\n}>;\n\ntype LocaleEvent = CustomEvent<{\n locale?: unknown;\n}>;\n\nfunction isAppearance(value: unknown): value is Appearance {\n return appearances.some((appearance) => appearance === value);\n}\n\nexport function EventBridge({ onAppearanceChange, onLocaleChange, onToast }: EventBridgeProps) {\n useEffect(() => {\n if (!onToast) {\n return;\n }\n\n return subscribeToToasts(onToast);\n }, [onToast]);\n\n useEffect(() => {\n if (!onAppearanceChange) {\n return;\n }\n\n const listener = (event: Event): void => {\n const value = (event as AppearanceEvent).detail?.value;\n\n if (isAppearance(value)) {\n onAppearanceChange(value);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.appearanceChange, listener);\n\n return () => {\n window.removeEventListener(LATTICE_EVENT.appearanceChange, listener);\n };\n }, [onAppearanceChange]);\n\n useEffect(() => {\n if (!onLocaleChange) {\n return;\n }\n\n const listener = (event: Event): void => {\n const locale = (event as LocaleEvent).detail?.locale;\n\n if (typeof locale === \"string\" && locale !== \"\") {\n onLocaleChange(locale);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.localeChange, listener);\n\n return () => {\n window.removeEventListener(LATTICE_EVENT.localeChange, listener);\n };\n }, [onLocaleChange]);\n\n return null;\n}\n"],"mappings":";;;;AAKA,IAAa,cAAc;CAAC;CAAS;CAAQ;AAAQ;AAkBrD,SAAS,aAAa,OAAqC;CACzD,OAAO,YAAY,MAAM,eAAe,eAAe,KAAK;AAC9D;AAEA,SAAgB,YAAY,EAAE,oBAAoB,gBAAgB,SAAA,aAA6B;CAC7F,gBAAgB;EACd,IAAI,CAAC,WACH;EAGF,OAAO,QAAkB,SAAO;CAClC,GAAG,CAAC,SAAO,CAAC;CAEZ,gBAAgB;EACd,IAAI,CAAC,oBACH;EAGF,MAAM,YAAY,UAAuB;GACvC,MAAM,QAAS,MAA0B,QAAQ;GAEjD,IAAI,aAAa,KAAK,GACpB,mBAAmB,KAAK;EAE5B;EAEA,OAAO,iBAAiB,cAAc,kBAAkB,QAAQ;EAEhE,aAAa;GACX,OAAO,oBAAoB,cAAc,kBAAkB,QAAQ;EACrE;CACF,GAAG,CAAC,kBAAkB,CAAC;CAEvB,gBAAgB;EACd,IAAI,CAAC,gBACH;EAGF,MAAM,YAAY,UAAuB;GACvC,MAAM,SAAU,MAAsB,QAAQ;GAE9C,IAAI,OAAO,WAAW,YAAY,WAAW,IAC3C,eAAe,MAAM;EAEzB;EAEA,OAAO,iBAAiB,cAAc,cAAc,QAAQ;EAE5D,aAAa;GACX,OAAO,oBAAoB,cAAc,cAAc,QAAQ;EACjE;CACF,GAAG,CAAC,cAAc,CAAC;CAEnB,OAAO;AACT"}
|