@lattice-php/lattice 0.2.0 → 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/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 +2 -0
- package/dist/chat/transport.js +47 -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 +18 -0
- package/dist/core/api.js +51 -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.map +1 -1
- package/dist/core/components/button.d.ts +1 -1
- package/dist/core/components/button.js +4 -0
- package/dist/core/components/button.js.map +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 +3 -3
- package/dist/{form/components/base → core/components}/checkbox.js.map +1 -1
- 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 +75 -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.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 +6 -10
- 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.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 +19 -8
- package/dist/core/components/stack.js.map +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 +22 -8
- 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/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.map +1 -1
- package/dist/form/components/base/password-input.js.map +1 -1
- package/dist/form/components/base/submit-button.js +3 -1
- 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 +250 -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 +3 -1
- 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 +31 -22
- 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 +37 -9
- 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 +2 -1
- 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/index.d.ts +18 -8
- package/dist/index.js +18 -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 +49 -16
- 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 +6 -0
- 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 +23 -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 +30 -59
- 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 +3 -3
- package/dist/layout/sidebar.js.map +1 -1
- package/dist/page.js +3 -9
- 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/registry.js +2 -1
- package/dist/registry.js.map +1 -1
- 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 +5 -6
- package/dist/table/components/cells/text-cell.js.map +1 -1
- package/dist/table/components/column-filter-control.d.ts +3 -1
- package/dist/table/components/column-filter-control.js +73 -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 +15 -0
- package/dist/table/components/filter-bar.js +81 -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.map +1 -1
- package/dist/table/components/filter-value-input.d.ts +1 -0
- package/dist/table/components/filter-value-input.js +6 -5
- 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.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 +191 -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 +7 -2
- package/dist/table/use-table.js +57 -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 +51 -0
- package/dist/toast/toast.js.map +1 -0
- package/dist/toast/toaster.js +10 -74
- 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 +461 -101
- 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 +111 -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/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
package/dist/core/registry.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LazyExoticComponent } from 'react';
|
|
2
2
|
import { RendererComponent, RendererComponentModule } from './types';
|
|
3
|
-
import { ColumnRegistry } from '../table/
|
|
3
|
+
import { ColumnRegistry } from '../table/registry';
|
|
4
|
+
import { EffectHandlerRegistry } from '../effects/registry';
|
|
4
5
|
export type EagerComponentRegistration = {
|
|
5
6
|
component: RendererComponent;
|
|
6
7
|
mode: "eager";
|
|
@@ -17,10 +18,12 @@ export type Plugin = {
|
|
|
17
18
|
name: string;
|
|
18
19
|
components?: ComponentRegistry;
|
|
19
20
|
columns?: ColumnRegistry;
|
|
21
|
+
effects?: EffectHandlerRegistry;
|
|
20
22
|
};
|
|
21
23
|
export type Registry = {
|
|
22
24
|
components: ComponentRegistry;
|
|
23
25
|
columns: ColumnRegistry;
|
|
26
|
+
effects: EffectHandlerRegistry;
|
|
24
27
|
};
|
|
25
28
|
export type LazyComponentOptions<TType extends string> = {
|
|
26
29
|
fallback?: RendererComponent<TType>;
|
package/dist/core/registry.js
CHANGED
|
@@ -27,10 +27,15 @@ function createRegistry(...plugins) {
|
|
|
27
27
|
columns: {
|
|
28
28
|
...registry.columns,
|
|
29
29
|
...plugin.columns
|
|
30
|
+
},
|
|
31
|
+
effects: {
|
|
32
|
+
...registry.effects,
|
|
33
|
+
...plugin.effects
|
|
30
34
|
}
|
|
31
35
|
}), {
|
|
32
36
|
components: {},
|
|
33
|
-
columns: {}
|
|
37
|
+
columns: {},
|
|
38
|
+
effects: {}
|
|
34
39
|
});
|
|
35
40
|
}
|
|
36
41
|
function extendRegistry(registry, ...plugins) {
|
|
@@ -43,6 +48,10 @@ function extendRegistry(registry, ...plugins) {
|
|
|
43
48
|
columns: {
|
|
44
49
|
...registry.columns,
|
|
45
50
|
...merged.columns
|
|
51
|
+
},
|
|
52
|
+
effects: {
|
|
53
|
+
...registry.effects,
|
|
54
|
+
...merged.effects
|
|
46
55
|
}
|
|
47
56
|
};
|
|
48
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","names":[],"sources":["../../resources/js/core/registry.ts"],"sourcesContent":["import { lazy } from \"react\";\nimport type { LazyExoticComponent } from \"react\";\nimport type { RendererComponent, RendererComponentModule } from \"./types\";\nimport type { ColumnRegistry } from \"../table/
|
|
1
|
+
{"version":3,"file":"registry.js","names":[],"sources":["../../resources/js/core/registry.ts"],"sourcesContent":["import { lazy } from \"react\";\nimport type { LazyExoticComponent } from \"react\";\nimport type { RendererComponent, RendererComponentModule } from \"./types\";\nimport type { ColumnRegistry } from \"../table/registry\";\nimport type { EffectHandlerRegistry } from \"../effects/registry\";\n\nexport type EagerComponentRegistration = {\n component: RendererComponent;\n mode: \"eager\";\n};\n\nexport type LazyComponentRegistration = {\n component: LazyExoticComponent<RendererComponent>;\n fallback?: RendererComponent;\n load: () => Promise<RendererComponentModule>;\n mode: \"lazy\";\n};\n\nexport type ComponentRegistration = EagerComponentRegistration | LazyComponentRegistration;\n\nexport type ComponentRegistry = Record<string, ComponentRegistration>;\n\nexport type Plugin = {\n name: string;\n components?: ComponentRegistry;\n columns?: ColumnRegistry;\n effects?: EffectHandlerRegistry;\n};\n\nexport type Registry = {\n components: ComponentRegistry;\n columns: ColumnRegistry;\n effects: EffectHandlerRegistry;\n};\n\nexport type LazyComponentOptions<TType extends string> = {\n fallback?: RendererComponent<TType>;\n};\n\nexport function eagerComponent<TType extends string>(\n component: RendererComponent<TType>,\n): EagerComponentRegistration {\n return {\n component: component as unknown as RendererComponent,\n mode: \"eager\",\n };\n}\n\nexport function lazyComponent<TType extends string>(\n load: () => Promise<RendererComponentModule<TType>>,\n options: LazyComponentOptions<TType> = {},\n): LazyComponentRegistration {\n const erasedLoader = load as unknown as () => Promise<RendererComponentModule>;\n\n return {\n component: lazy(erasedLoader),\n fallback: options.fallback as RendererComponent | undefined,\n load: erasedLoader,\n mode: \"lazy\",\n };\n}\n\nexport function createPlugin(plugin: Plugin): Plugin {\n return plugin;\n}\n\nexport function createRegistry(...plugins: Plugin[]): Registry {\n return plugins.reduce<Registry>(\n (registry, plugin) => ({\n components: { ...registry.components, ...plugin.components },\n columns: { ...registry.columns, ...plugin.columns },\n effects: { ...registry.effects, ...plugin.effects },\n }),\n { components: {}, columns: {}, effects: {} },\n );\n}\n\nexport function extendRegistry(registry: Registry, ...plugins: Plugin[]): Registry {\n const merged = createRegistry(...plugins);\n\n return {\n components: { ...registry.components, ...merged.components },\n columns: { ...registry.columns, ...merged.columns },\n effects: { ...registry.effects, ...merged.effects },\n };\n}\n"],"mappings":";;AAuCA,SAAgB,eACd,WAC4B;CAC5B,OAAO;EACM;EACX,MAAM;CACR;AACF;AAEA,SAAgB,cACd,MACA,UAAuC,CAAC,GACb;CAC3B,MAAM,eAAe;CAErB,OAAO;EACL,WAAW,KAAK,YAAY;EAC5B,UAAU,QAAQ;EAClB,MAAM;EACN,MAAM;CACR;AACF;AAEA,SAAgB,aAAa,QAAwB;CACnD,OAAO;AACT;AAEA,SAAgB,eAAe,GAAG,SAA6B;CAC7D,OAAO,QAAQ,QACZ,UAAU,YAAY;EACrB,YAAY;GAAE,GAAG,SAAS;GAAY,GAAG,OAAO;EAAW;EAC3D,SAAS;GAAE,GAAG,SAAS;GAAS,GAAG,OAAO;EAAQ;EAClD,SAAS;GAAE,GAAG,SAAS;GAAS,GAAG,OAAO;EAAQ;CACpD,IACA;EAAE,YAAY,CAAC;EAAG,SAAS,CAAC;EAAG,SAAS,CAAC;CAAE,CAC7C;AACF;AAEA,SAAgB,eAAe,UAAoB,GAAG,SAA6B;CACjF,MAAM,SAAS,eAAe,GAAG,OAAO;CAExC,OAAO;EACL,YAAY;GAAE,GAAG,SAAS;GAAY,GAAG,OAAO;EAAW;EAC3D,SAAS;GAAE,GAAG,SAAS;GAAS,GAAG,OAAO;EAAQ;EAClD,SAAS;GAAE,GAAG,SAAS;GAAS,GAAG,OAAO;EAAQ;CACpD;AACF"}
|
package/dist/core/renderer.d.ts
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
fallback: ReactNode;
|
|
6
|
-
missingComponent: UnknownComponent;
|
|
7
|
-
registry: ComponentRegistry;
|
|
8
|
-
};
|
|
9
|
-
export declare function useRendererContext(): RendererContextValue;
|
|
10
|
-
export declare function Renderer({ fallback, missingComponent: UnknownComponent, nodes, registry, }: {
|
|
11
|
-
fallback?: ReactNode;
|
|
12
|
-
missingComponent?: UnknownComponent;
|
|
2
|
+
import { Node } from './types';
|
|
3
|
+
/** Renders a schema (list of nodes) against the active component registry. */
|
|
4
|
+
export declare function Renderer({ nodes }: {
|
|
13
5
|
nodes: Node[];
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
export {}
|
|
6
|
+
}): ReactNode;
|
|
7
|
+
/** Renders a single node against the active component registry. */
|
|
8
|
+
export declare function RenderNode({ node }: {
|
|
9
|
+
node: Node;
|
|
10
|
+
}): ReactNode;
|
package/dist/core/renderer.js
CHANGED
|
@@ -1,41 +1,31 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useComponentRegistry } from "./registry-context.js";
|
|
2
|
+
import { useCollapsed } from "./collapsed-context.js";
|
|
3
|
+
import { Suspense } from "react";
|
|
2
4
|
import { jsx } from "react/jsx-runtime";
|
|
3
5
|
//#region resources/js/core/renderer.tsx
|
|
4
6
|
function MissingComponent({ node }) {
|
|
5
7
|
return null;
|
|
6
8
|
}
|
|
7
|
-
var RendererContext = createContext(null);
|
|
8
|
-
function useRendererContext() {
|
|
9
|
-
const context = useContext(RendererContext);
|
|
10
|
-
if (!context) throw new Error("Renderer context is not available.");
|
|
11
|
-
return context;
|
|
12
|
-
}
|
|
13
9
|
function nodeKey(node, index) {
|
|
14
10
|
return node.key ?? node.id ?? `${node.type}-${index}`;
|
|
15
11
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
registry,
|
|
24
|
-
UnknownComponent
|
|
25
|
-
]);
|
|
26
|
-
return /* @__PURE__ */ jsx(RendererContext.Provider, {
|
|
27
|
-
value: context,
|
|
28
|
-
children: nodes.map((node, index) => /* @__PURE__ */ jsx(NodeRenderer, { node }, nodeKey(node, index)))
|
|
29
|
-
});
|
|
12
|
+
/** Renders a schema (list of nodes) against the active component registry. */
|
|
13
|
+
function Renderer({ nodes }) {
|
|
14
|
+
return nodes.map((node, index) => /* @__PURE__ */ jsx(NodeRenderer, { node }, nodeKey(node, index)));
|
|
15
|
+
}
|
|
16
|
+
/** Renders a single node against the active component registry. */
|
|
17
|
+
function RenderNode({ node }) {
|
|
18
|
+
return /* @__PURE__ */ jsx(NodeRenderer, { node });
|
|
30
19
|
}
|
|
31
20
|
function NodeRenderer({ node }) {
|
|
32
|
-
const
|
|
33
|
-
const registration =
|
|
34
|
-
if (
|
|
21
|
+
const collapsed = useCollapsed();
|
|
22
|
+
const registration = useComponentRegistry()[node.type];
|
|
23
|
+
if (collapsed && node.props?.hideWhenCollapsed === true) return null;
|
|
24
|
+
if (!registration) return /* @__PURE__ */ jsx(MissingComponent, { node });
|
|
35
25
|
const Component = registration.component;
|
|
36
26
|
const renderedComponent = /* @__PURE__ */ jsx(Component, {
|
|
37
27
|
node,
|
|
38
|
-
children: node.schema?.length ?
|
|
28
|
+
children: node.schema?.length ? /* @__PURE__ */ jsx(Renderer, { nodes: node.schema }) : null
|
|
39
29
|
});
|
|
40
30
|
if (registration.mode === "lazy") {
|
|
41
31
|
const FallbackComponent = registration.fallback;
|
|
@@ -43,13 +33,13 @@ function NodeRenderer({ node }) {
|
|
|
43
33
|
fallback: FallbackComponent ? /* @__PURE__ */ jsx(FallbackComponent, {
|
|
44
34
|
node,
|
|
45
35
|
children: null
|
|
46
|
-
}) :
|
|
36
|
+
}) : null,
|
|
47
37
|
children: renderedComponent
|
|
48
38
|
});
|
|
49
39
|
}
|
|
50
40
|
return renderedComponent;
|
|
51
41
|
}
|
|
52
42
|
//#endregion
|
|
53
|
-
export {
|
|
43
|
+
export { RenderNode, Renderer };
|
|
54
44
|
|
|
55
45
|
//# sourceMappingURL=renderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","names":[],"sources":["../../resources/js/core/renderer.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"renderer.js","names":[],"sources":["../../resources/js/core/renderer.tsx"],"sourcesContent":["import { Suspense } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { Node } from \"./types\";\nimport { useCollapsed } from \"./collapsed-context\";\nimport { useComponentRegistry } from \"./registry-context\";\n\nfunction MissingComponent({ node }: { node: Node }) {\n if (!import.meta.env.DEV) {\n return null;\n }\n\n return <div data-lattice-missing-component={node.type}>Missing component: {node.type}</div>;\n}\n\nfunction nodeKey(node: Node, index: number): string {\n return node.key ?? node.id ?? `${node.type}-${index}`;\n}\n\n/** Renders a schema (list of nodes) against the active component registry. */\nexport function Renderer({ nodes }: { nodes: Node[] }): ReactNode {\n return nodes.map((node, index) => <NodeRenderer key={nodeKey(node, index)} node={node} />);\n}\n\n/** Renders a single node against the active component registry. */\nexport function RenderNode({ node }: { node: Node }): ReactNode {\n return <NodeRenderer node={node} />;\n}\n\nfunction NodeRenderer({ node }: { node: Node }) {\n const collapsed = useCollapsed();\n const registry = useComponentRegistry();\n const registration = registry[node.type];\n\n if (collapsed && node.props?.hideWhenCollapsed === true) {\n return null;\n }\n\n if (!registration) {\n return <MissingComponent node={node} />;\n }\n\n const Component = registration.component;\n const children = node.schema?.length ? <Renderer nodes={node.schema} /> : null;\n const renderedComponent = <Component node={node}>{children}</Component>;\n\n if (registration.mode === \"lazy\") {\n const FallbackComponent = registration.fallback;\n const fallback = FallbackComponent ? (\n <FallbackComponent node={node}>{null}</FallbackComponent>\n ) : null;\n\n return <Suspense fallback={fallback}>{renderedComponent}</Suspense>;\n }\n\n return renderedComponent;\n}\n"],"mappings":";;;;;AAMA,SAAS,iBAAiB,EAAE,QAAwB;CAEhD,OAAO;AAIX;AAEA,SAAS,QAAQ,MAAY,OAAuB;CAClD,OAAO,KAAK,OAAO,KAAK,MAAM,GAAG,KAAK,KAAK,GAAG;AAChD;;AAGA,SAAgB,SAAS,EAAE,SAAuC;CAChE,OAAO,MAAM,KAAK,MAAM,UAAU,oBAAC,cAAD,EAA+C,KAAO,GAAnC,QAAQ,MAAM,KAAK,CAAgB,CAAC;AAC3F;;AAGA,SAAgB,WAAW,EAAE,QAAmC;CAC9D,OAAO,oBAAC,cAAD,EAAoB,KAAO,CAAA;AACpC;AAEA,SAAS,aAAa,EAAE,QAAwB;CAC9C,MAAM,YAAY,aAAa;CAE/B,MAAM,eADW,qBACI,EAAS,KAAK;CAEnC,IAAI,aAAa,KAAK,OAAO,sBAAsB,MACjD,OAAO;CAGT,IAAI,CAAC,cACH,OAAO,oBAAC,kBAAD,EAAwB,KAAO,CAAA;CAGxC,MAAM,YAAY,aAAa;CAE/B,MAAM,oBAAoB,oBAAC,WAAD;EAAiB;EAAO,UADjC,KAAK,QAAQ,SAAS,oBAAC,UAAD,EAAU,OAAO,KAAK,OAAS,CAAA,IAAI;CACJ,CAAA;CAEtE,IAAI,aAAa,SAAS,QAAQ;EAChC,MAAM,oBAAoB,aAAa;EAKvC,OAAO,oBAAC,UAAD;GAAoB,UAJV,oBACf,oBAAC,mBAAD;IAAyB;cAAO;GAAwB,CAAA,IACtD;aAEkC;EAA4B,CAAA;CACpE;CAEA,OAAO;AACT"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Node } from './types';
|
|
2
|
+
type IdentifiedNode = Pick<Node, "id" | "key">;
|
|
3
|
+
export declare function testIdentity(value: string | null | undefined): string | undefined;
|
|
4
|
+
export declare function nodeIdentity(node: IdentifiedNode): string | undefined;
|
|
5
|
+
export declare function leafTestIdentity(value: string | null | undefined): string | undefined;
|
|
6
|
+
export declare function prefixedTestId(prefix: string, value: string | null | undefined): string | undefined;
|
|
7
|
+
export declare function prefixedNodeTestId(prefix: string, node: IdentifiedNode): string | undefined;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region resources/js/core/test-id.ts
|
|
2
|
+
function testIdentity(value) {
|
|
3
|
+
return value === void 0 || value === null || value === "" ? void 0 : value;
|
|
4
|
+
}
|
|
5
|
+
function nodeIdentity(node) {
|
|
6
|
+
return testIdentity(node.key) ?? testIdentity(node.id);
|
|
7
|
+
}
|
|
8
|
+
function leafTestIdentity(value) {
|
|
9
|
+
return testIdentity(value)?.split(".").at(-1);
|
|
10
|
+
}
|
|
11
|
+
function prefixedTestId(prefix, value) {
|
|
12
|
+
const identity = leafTestIdentity(value);
|
|
13
|
+
return identity ? `${prefix}-${identity}` : void 0;
|
|
14
|
+
}
|
|
15
|
+
function prefixedNodeTestId(prefix, node) {
|
|
16
|
+
return prefixedTestId(prefix, nodeIdentity(node));
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { leafTestIdentity, nodeIdentity, prefixedNodeTestId, prefixedTestId, testIdentity };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=test-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-id.js","names":[],"sources":["../../resources/js/core/test-id.ts"],"sourcesContent":["import type { Node } from \"./types\";\n\ntype IdentifiedNode = Pick<Node, \"id\" | \"key\">;\n\nexport function testIdentity(value: string | null | undefined): string | undefined {\n return value === undefined || value === null || value === \"\" ? undefined : value;\n}\n\nexport function nodeIdentity(node: IdentifiedNode): string | undefined {\n return testIdentity(node.key) ?? testIdentity(node.id);\n}\n\nexport function leafTestIdentity(value: string | null | undefined): string | undefined {\n return testIdentity(value)?.split(\".\").at(-1);\n}\n\nexport function prefixedTestId(\n prefix: string,\n value: string | null | undefined,\n): string | undefined {\n const identity = leafTestIdentity(value);\n\n return identity ? `${prefix}-${identity}` : undefined;\n}\n\nexport function prefixedNodeTestId(prefix: string, node: IdentifiedNode): string | undefined {\n return prefixedTestId(prefix, nodeIdentity(node));\n}\n"],"mappings":";AAIA,SAAgB,aAAa,OAAsD;CACjF,OAAO,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU,KAAK,KAAA,IAAY;AAC7E;AAEA,SAAgB,aAAa,MAA0C;CACrE,OAAO,aAAa,KAAK,GAAG,KAAK,aAAa,KAAK,EAAE;AACvD;AAEA,SAAgB,iBAAiB,OAAsD;CACrF,OAAO,aAAa,KAAK,GAAG,MAAM,GAAG,EAAE,GAAG,EAAE;AAC9C;AAEA,SAAgB,eACd,QACA,OACoB;CACpB,MAAM,WAAW,iBAAiB,KAAK;CAEvC,OAAO,WAAW,GAAG,OAAO,GAAG,aAAa,KAAA;AAC9C;AAEA,SAAgB,mBAAmB,QAAgB,MAA0C;CAC3F,OAAO,eAAe,QAAQ,aAAa,IAAI,CAAC;AAClD"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -3,6 +3,9 @@ import { Node as WireNode, NodeType, Option, PageContainer as KnownPageContainer
|
|
|
3
3
|
export type { KnownPageContainer, NodeType, WireNode };
|
|
4
4
|
/** Loose props bag for nodes whose `type` is not a generated built-in. */
|
|
5
5
|
export type NodeProps = Record<string, unknown>;
|
|
6
|
+
export type CommonNodeProps = {
|
|
7
|
+
hideWhenCollapsed?: boolean | null;
|
|
8
|
+
};
|
|
6
9
|
/** A `{ label, value }` pair used by the choice, select and segmented controls. */
|
|
7
10
|
export type { Option };
|
|
8
11
|
/**
|
|
@@ -25,18 +28,23 @@ export type LooseNode<TType extends string = string> = {
|
|
|
25
28
|
*/
|
|
26
29
|
export interface ComponentProps {
|
|
27
30
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Resolves a registry `type` string to its payload: consumer augmentations
|
|
33
|
+
* (`TAugment`) first, then generated built-ins (`TBuiltins`), then a loose
|
|
34
|
+
* fallback. Shared by the component, column, chat-part and effect type maps so
|
|
35
|
+
* every extensible kind resolves the same way.
|
|
36
|
+
*/
|
|
37
|
+
export type ResolveProps<TAugment, TBuiltins, TType extends string, TFallback> = TType extends keyof TAugment ? TAugment[TType] : TType extends keyof TBuiltins ? TBuiltins[TType] : TFallback;
|
|
38
|
+
type WireNodeProps = {
|
|
39
|
+
[TNode in WireNode as TNode["type"]]: TNode extends {
|
|
40
|
+
props: infer TProps;
|
|
41
|
+
} ? TProps : never;
|
|
42
|
+
};
|
|
35
43
|
/**
|
|
36
44
|
* Resolves a wire `type` to its props: consumer augmentations
|
|
37
45
|
* (`ComponentProps`) first, then generated built-ins, then a loose bag.
|
|
38
46
|
*/
|
|
39
|
-
export type PropsOf<TType extends string> =
|
|
47
|
+
export type PropsOf<TType extends string> = ResolveProps<ComponentProps, WireNodeProps, TType, NodeProps> & CommonNodeProps;
|
|
40
48
|
/**
|
|
41
49
|
* Resolves a wire `type` string to its node shape: built-ins narrow to their
|
|
42
50
|
* generated props, unknown types fall back to a loose props bag so custom
|
|
@@ -58,6 +66,12 @@ export type LayoutPayload = {
|
|
|
58
66
|
key: string;
|
|
59
67
|
schema: Schema;
|
|
60
68
|
};
|
|
69
|
+
/**
|
|
70
|
+
* The page payload the server hydrates onto `lattice` (see PHP `Page::toArray`).
|
|
71
|
+
* Hand-written rather than generated: its `schema`/`layout.schema` are component
|
|
72
|
+
* trees serialized eagerly during the request (to fire side effects before the
|
|
73
|
+
* final encode), so they cannot be derived from a value object as typed `Node[]`.
|
|
74
|
+
*/
|
|
61
75
|
export type PagePayload = {
|
|
62
76
|
breadcrumbs: PageBreadcrumb[];
|
|
63
77
|
container: PageContainer;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
import { SizableColumn } from './column-sizing';
|
|
3
|
+
type ResizeHandleProps = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
+
"aria-label": string;
|
|
5
|
+
"aria-orientation": "vertical";
|
|
6
|
+
"aria-valuemax": number;
|
|
7
|
+
"aria-valuemin": number;
|
|
8
|
+
"aria-valuenow": number;
|
|
9
|
+
role: "separator";
|
|
10
|
+
tabIndex: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function useColumnResizing({ columnGapPx, columns, enabled, leadingTracks, showIndicator, storageKey, trailingTracks, }: {
|
|
13
|
+
columnGapPx?: number;
|
|
14
|
+
columns: SizableColumn[];
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
leadingTracks?: string[];
|
|
17
|
+
showIndicator?: boolean;
|
|
18
|
+
storageKey?: string;
|
|
19
|
+
trailingTracks?: string[];
|
|
20
|
+
}): {
|
|
21
|
+
getResizeHandleProps: (column: SizableColumn) => ResizeHandleProps;
|
|
22
|
+
gridTemplateColumns: string;
|
|
23
|
+
hasOverrides: boolean;
|
|
24
|
+
resetColumns: () => void;
|
|
25
|
+
resetColumnWidth: (column: SizableColumn) => void;
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
@@ -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"}
|