@lattice-php/lattice 0.17.2 → 0.18.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/dist/action/components/action-form.d.ts +2 -2
- package/dist/action/components/action-form.js +11 -11
- package/dist/action/components/action-form.js.map +1 -1
- package/dist/action/components/action-group.d.ts +1 -1
- package/dist/action/components/action-group.js +6 -4
- package/dist/action/components/action-group.js.map +1 -1
- package/dist/action/components/action-trigger-provider.d.ts +10 -0
- package/dist/action/components/action-trigger-provider.js +24 -0
- package/dist/action/components/action-trigger-provider.js.map +1 -0
- package/dist/action/components/action.d.ts +1 -1
- package/dist/action/components/action.js +4 -4
- package/dist/action/components/action.js.map +1 -1
- package/dist/action/{use-action.d.ts → hooks/use-action.d.ts} +1 -1
- package/dist/action/{use-action.js → hooks/use-action.js} +7 -7
- package/dist/action/hooks/use-action.js.map +1 -0
- package/dist/action/hooks/use-click-behavior.d.ts +3 -0
- package/dist/action/hooks/use-click-behavior.js +3 -0
- package/dist/action/index.d.ts +10 -1
- package/dist/action/index.js +8 -13
- package/dist/action/{run-action.d.ts → lib/run-action.d.ts} +1 -1
- package/dist/action/{run-action.js → lib/run-action.js} +2 -2
- package/dist/action/lib/run-action.js.map +1 -0
- package/dist/action/plugin.d.ts +1 -0
- package/dist/action/plugin.js +15 -0
- package/dist/action/plugin.js.map +1 -0
- package/dist/appearance/index.d.ts +4 -1
- package/dist/appearance/index.js +11 -2
- package/dist/appearance/index.js.map +1 -1
- package/dist/chat/components/chat-box.d.ts +1 -1
- package/dist/chat/components/chat-box.js +2 -2
- package/dist/chat/components/chat-box.js.map +1 -1
- package/dist/chat/components/message-list.d.ts +1 -1
- package/dist/chat/components/message-list.js.map +1 -1
- package/dist/chat/components/message.d.ts +1 -1
- package/dist/chat/components/message.js.map +1 -1
- package/dist/chat/components/prompt-input.js +1 -1
- package/dist/chat/components/prompt-input.js.map +1 -1
- package/dist/chat/{use-chat.d.ts → hooks/use-chat.d.ts} +1 -1
- package/dist/chat/{use-chat.js → hooks/use-chat.js} +2 -2
- package/dist/chat/hooks/use-chat.js.map +1 -0
- package/dist/chat/index.d.ts +4 -1
- package/dist/chat/index.js +3 -17
- package/dist/chat/{transport.d.ts → lib/transport.d.ts} +2 -2
- package/dist/chat/{transport.js → lib/transport.js} +2 -2
- package/dist/chat/lib/transport.js.map +1 -0
- package/dist/chat/parts/text.d.ts +1 -1
- package/dist/chat/parts/tool-call.d.ts +1 -1
- package/dist/chat/plugin.d.ts +2 -0
- package/dist/chat/plugin.js +17 -0
- package/dist/chat/plugin.js.map +1 -0
- package/dist/chat/types.d.ts +2 -2
- package/dist/clipboard/index.d.ts +1 -2
- package/dist/clipboard/index.js +1 -10
- package/dist/clipboard/index.js.map +1 -1
- package/dist/core/api.d.ts +1 -1
- package/dist/core/api.js.map +1 -1
- package/dist/core/headers.js.map +1 -1
- package/dist/core/{column-sizing.d.ts → hooks/column-sizing.d.ts} +2 -2
- package/dist/core/{column-sizing.js → hooks/column-sizing.js} +1 -1
- package/dist/core/hooks/column-sizing.js.map +1 -0
- package/dist/core/{use-column-resizing.d.ts → hooks/use-column-resizing.d.ts} +2 -1
- package/dist/core/{use-column-resizing.js → hooks/use-column-resizing.js} +59 -31
- package/dist/core/hooks/use-column-resizing.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.js +10 -0
- package/dist/core/materialize.d.ts +9 -0
- package/dist/core/materialize.js +39 -0
- package/dist/core/materialize.js.map +1 -0
- package/dist/core/nodes.d.ts +1 -1
- package/dist/core/registry-context.d.ts +3 -3
- package/dist/core/registry-context.js.map +1 -1
- package/dist/core/registry.d.ts +5 -3
- package/dist/core/registry.js.map +1 -1
- package/dist/core/renderer.d.ts +1 -1
- package/dist/core/renderer.js +3 -3
- package/dist/core/renderer.js.map +1 -1
- package/dist/core/test-id.d.ts +1 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/create-app.d.ts +3 -3
- package/dist/effects/dispatch.d.ts +2 -2
- package/dist/effects/registry.d.ts +4 -3
- package/dist/effects/registry.js +7 -7
- package/dist/effects/registry.js.map +1 -1
- package/dist/effects/use-effect-dispatcher.d.ts +1 -1
- package/dist/{events/event-bridge.d.ts → event-bridge.d.ts} +2 -3
- package/dist/{events/event-bridge.js → event-bridge.js} +4 -11
- package/dist/event-bridge.js.map +1 -0
- package/dist/form/components/base/field.d.ts +1 -1
- package/dist/form/components/base/field.js +5 -5
- package/dist/form/components/base/field.js.map +1 -1
- package/dist/form/components/base/submit-button.d.ts +1 -1
- package/dist/form/components/base/submit-button.js +3 -3
- package/dist/form/components/base/submit-button.js.map +1 -1
- package/dist/form/components/fields/{block-add-menu.d.ts → add-row-menu.d.ts} +3 -3
- package/dist/form/components/fields/{block-add-menu.js → add-row-menu.js} +10 -10
- package/dist/form/components/fields/add-row-menu.js.map +1 -0
- package/dist/form/components/fields/builder.d.ts +1 -1
- package/dist/form/components/fields/builder.js +80 -75
- package/dist/form/components/fields/builder.js.map +1 -1
- package/dist/form/components/fields/checkbox.d.ts +1 -1
- package/dist/form/components/fields/checkbox.js +12 -9
- 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 +4 -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-picker-field.js +2 -2
- package/dist/form/components/fields/date-picker-field.js.map +1 -1
- package/dist/form/components/fields/date-picker.d.ts +1 -1
- package/dist/form/components/fields/date-time-input.d.ts +1 -1
- package/dist/form/components/fields/file-upload.d.ts +1 -1
- package/dist/form/components/fields/file-upload.js +4 -4
- package/dist/form/components/fields/file-upload.js.map +1 -1
- package/dist/form/components/fields/hidden-input.d.ts +1 -1
- package/dist/form/components/fields/hidden-input.js +1 -1
- 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 +2 -2
- package/dist/form/components/fields/number-input.js.map +1 -1
- package/dist/form/components/fields/otp-input.d.ts +1 -1
- package/dist/form/components/fields/otp-input.js +1 -1
- package/dist/form/components/fields/otp-input.js.map +1 -1
- package/dist/form/components/fields/password-input.d.ts +1 -1
- package/dist/form/components/fields/password-input.js +6 -6
- package/dist/form/components/fields/password-input.js.map +1 -1
- package/dist/form/components/fields/repeater-rows.d.ts +6 -1
- package/dist/form/components/fields/repeater-rows.js +9 -5
- package/dist/form/components/fields/repeater-rows.js.map +1 -1
- package/dist/form/components/fields/repeater.d.ts +1 -1
- package/dist/form/components/fields/repeater.js +57 -48
- package/dist/form/components/fields/repeater.js.map +1 -1
- package/dist/form/components/fields/rich-editor-field.d.ts +1 -1
- package/dist/form/components/fields/rich-editor-field.js +5 -5
- package/dist/form/components/fields/rich-editor-field.js.map +1 -1
- package/dist/form/components/fields/rich-editor.d.ts +1 -1
- package/dist/form/components/fields/row-action-menu.d.ts +2 -2
- package/dist/form/components/fields/row-actions.js +1 -1
- package/dist/form/components/fields/row-actions.js.map +1 -1
- package/dist/form/components/fields/row-item.d.ts +3 -3
- package/dist/form/components/fields/row-item.js +1 -1
- package/dist/form/components/fields/row-item.js.map +1 -1
- package/dist/form/components/fields/row-key-inputs.d.ts +7 -0
- package/dist/form/components/fields/row-key-inputs.js +16 -0
- package/dist/form/components/fields/row-key-inputs.js.map +1 -0
- package/dist/form/components/fields/row-templates.d.ts +9 -0
- package/dist/form/components/fields/row-templates.js +14 -0
- package/dist/form/components/fields/row-templates.js.map +1 -0
- package/dist/form/components/fields/select.d.ts +1 -1
- package/dist/form/components/fields/select.js +23 -13
- package/dist/form/components/fields/select.js.map +1 -1
- package/dist/form/components/fields/simple-field.d.ts +2 -2
- package/dist/form/components/fields/simple-field.js +2 -2
- package/dist/form/components/fields/simple-field.js.map +1 -1
- package/dist/form/components/fields/table-rows.d.ts +3 -3
- package/dist/form/components/fields/table-rows.js +10 -11
- package/dist/form/components/fields/table-rows.js.map +1 -1
- package/dist/form/components/fields/text-input.d.ts +1 -1
- package/dist/form/components/fields/text-input.js +2 -2
- 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 +1 -1
- package/dist/form/components/fields/textarea.js.map +1 -1
- package/dist/form/components/fields/time-input.d.ts +1 -1
- package/dist/form/components/fields/time-input.js +3 -3
- package/dist/form/components/fields/time-input.js.map +1 -1
- package/dist/form/components/fields/time-picker.d.ts +1 -1
- package/dist/form/components/fields/toggle.d.ts +1 -1
- package/dist/form/components/fields/toggle.js +10 -9
- package/dist/form/components/fields/toggle.js.map +1 -1
- package/dist/form/components/fields/use-row-collection.d.ts +1 -1
- package/dist/form/components/fields/use-row-collection.js +2 -2
- package/dist/form/components/fields/use-row-collection.js.map +1 -1
- package/dist/form/components/form.d.ts +1 -1
- package/dist/form/components/form.js +6 -6
- package/dist/form/components/form.js.map +1 -1
- package/dist/form/components/index.d.ts +17 -17
- package/dist/form/embed.d.ts +17 -0
- package/dist/form/embed.js +10 -0
- package/dist/form/{components → hooks}/context.d.ts +3 -0
- package/dist/form/{components → hooks}/context.js +2 -1
- package/dist/form/hooks/context.js.map +1 -0
- package/dist/form/{components → hooks}/field-scope.js +3 -3
- package/dist/form/hooks/field-scope.js.map +1 -0
- package/dist/form/{components → hooks}/prefill-context.js +1 -1
- package/dist/form/hooks/prefill-context.js.map +1 -0
- package/dist/form/{components → hooks}/resolved-nodes.d.ts +1 -1
- package/dist/form/{components → hooks}/resolved-nodes.js +2 -2
- package/dist/form/hooks/resolved-nodes.js.map +1 -0
- package/dist/form/{components → hooks}/row-layout-context.js +1 -1
- package/dist/form/hooks/row-layout-context.js.map +1 -0
- package/dist/form/{components → hooks}/use-controlled-field.d.ts +2 -2
- package/dist/form/{components → hooks}/use-controlled-field.js +6 -5
- package/dist/form/hooks/use-controlled-field.js.map +1 -0
- package/dist/form/hooks/use-dependent-field.d.ts +3 -0
- package/dist/form/{components → hooks}/use-dependent-field.js +6 -6
- package/dist/form/hooks/use-dependent-field.js.map +1 -0
- package/dist/form/{components → hooks}/use-field-commit.d.ts +5 -0
- package/dist/form/{components → hooks}/use-field-commit.js +9 -2
- package/dist/form/hooks/use-field-commit.js.map +1 -0
- package/dist/form/{components → hooks}/use-form-resolver.d.ts +2 -2
- package/dist/form/{components → hooks}/use-form-resolver.js +5 -5
- package/dist/form/hooks/use-form-resolver.js.map +1 -0
- package/dist/form/{components → hooks}/use-seed-default.js +1 -1
- package/dist/form/hooks/use-seed-default.js.map +1 -0
- package/dist/form/{components → hooks}/values.d.ts +3 -1
- package/dist/form/hooks/values.js +136 -0
- package/dist/form/hooks/values.js.map +1 -0
- package/dist/form/index.d.ts +4 -1
- package/dist/form/index.js +3 -30
- package/dist/form/{components → lib}/conditions.d.ts +2 -1
- package/dist/form/{components → lib}/conditions.js +12 -2
- package/dist/form/lib/conditions.js.map +1 -0
- package/dist/form/lib/field-dom-name.d.ts +1 -0
- package/dist/form/lib/field-dom-name.js +10 -0
- package/dist/form/lib/field-dom-name.js.map +1 -0
- package/dist/form/{components → lib}/field-props.d.ts +2 -3
- package/dist/form/{components → lib}/field-props.js +1 -1
- package/dist/form/lib/field-props.js.map +1 -0
- package/dist/form/{components → lib}/form-path.js +1 -1
- package/dist/form/lib/form-path.js.map +1 -0
- package/dist/form/{components → lib}/form-transport.d.ts +1 -1
- package/dist/form/lib/form-transport.js +21 -0
- package/dist/form/lib/form-transport.js.map +1 -0
- package/dist/form/lib/override-keys.js +12 -0
- package/dist/form/lib/override-keys.js.map +1 -0
- package/dist/form/{components → lib}/prefill-targets.d.ts +2 -2
- package/dist/form/{components → lib}/prefill-targets.js +4 -5
- package/dist/form/lib/prefill-targets.js.map +1 -0
- package/dist/form/plugin.d.ts +1 -0
- package/dist/form/plugin.js +47 -0
- package/dist/form/plugin.js.map +1 -0
- package/dist/form/toolkit.d.ts +17 -0
- package/dist/form/toolkit.js +14 -0
- package/dist/form/{components/types.d.ts → types.d.ts} +3 -3
- package/dist/format/number.d.ts +1 -1
- package/dist/format/value.d.ts +1 -1
- package/dist/i18n/backend.d.ts +1 -1
- package/dist/i18n/config.d.ts +1 -1
- package/dist/i18n/index.d.ts +13 -13
- package/dist/i18n/locale-reload.js +1 -1
- package/dist/i18n/locale-reload.js.map +1 -1
- package/dist/i18n/locale.js.map +1 -1
- package/dist/i18n/page-props.d.ts +1 -1
- package/dist/i18n/timezone.js.map +1 -1
- package/dist/i18n/translatable.d.ts +1 -1
- package/dist/icons/icon-renderer.js.map +1 -1
- package/dist/icons/index.d.ts +4 -4
- package/dist/icons/sprite.js.map +1 -1
- package/dist/index.d.ts +37 -38
- package/dist/index.js +10 -9
- package/dist/inertia.js +1 -1
- package/dist/layout/{breadcrumbs.d.ts → components/breadcrumbs.d.ts} +1 -1
- package/dist/layout/{breadcrumbs.js → components/breadcrumbs.js} +2 -2
- package/dist/layout/components/breadcrumbs.js.map +1 -0
- package/dist/layout/{callouts.d.ts → components/callouts.d.ts} +1 -1
- package/dist/layout/{callouts.js → components/callouts.js} +7 -7
- package/dist/layout/components/callouts.js.map +1 -0
- package/dist/layout/{dropdown.d.ts → components/dropdown.d.ts} +1 -1
- package/dist/layout/{dropdown.js → components/dropdown.js} +2 -2
- package/dist/layout/components/dropdown.js.map +1 -0
- package/dist/layout/{menu-item.d.ts → components/menu-item.d.ts} +1 -1
- package/dist/layout/{menu-item.js → components/menu-item.js} +9 -8
- package/dist/layout/components/menu-item.js.map +1 -0
- package/dist/layout/{menu.d.ts → components/menu.d.ts} +1 -1
- package/dist/layout/{menu.js → components/menu.js} +2 -2
- package/dist/layout/components/menu.js.map +1 -0
- package/dist/layout/{outlet.d.ts → components/outlet.d.ts} +1 -1
- package/dist/layout/{outlet.js → components/outlet.js} +2 -2
- package/dist/layout/components/outlet.js.map +1 -0
- package/dist/layout/{popover.js → components/popover.js} +4 -4
- package/dist/layout/components/popover.js.map +1 -0
- package/dist/layout/{schema-layout.js → components/schema-layout.js} +3 -3
- package/dist/layout/components/schema-layout.js.map +1 -0
- package/dist/layout/{sidebar.d.ts → components/sidebar.d.ts} +1 -1
- package/dist/layout/{sidebar.js → components/sidebar.js} +5 -5
- package/dist/layout/components/sidebar.js.map +1 -0
- package/dist/layout/{topbar.d.ts → components/topbar.d.ts} +1 -1
- package/dist/layout/{topbar.js → components/topbar.js} +3 -3
- package/dist/layout/components/topbar.js.map +1 -0
- package/dist/layout/{context.d.ts → hooks/context.d.ts} +1 -1
- package/dist/layout/{context.js → hooks/context.js} +2 -2
- package/dist/layout/hooks/context.js.map +1 -0
- package/dist/layout/index.d.ts +4 -4
- package/dist/layout/index.js +4 -4
- package/dist/layout/plugin.d.ts +2 -0
- package/dist/layout/{components.js → plugin.js} +10 -10
- package/dist/layout/plugin.js.map +1 -0
- package/dist/notifications/api.d.ts +1 -1
- package/dist/notifications/components/notification-item.d.ts +1 -1
- package/dist/notifications/components/notification-item.js.map +1 -1
- package/dist/notifications/components/notification-list.d.ts +2 -2
- package/dist/notifications/components/notification-list.js +1 -1
- package/dist/notifications/components/notification-list.js.map +1 -1
- package/dist/notifications/components/notifications-echo.d.ts +1 -1
- package/dist/notifications/components/notifications-echo.js.map +1 -1
- package/dist/notifications/components/notifications.d.ts +1 -1
- package/dist/notifications/components/notifications.js +3 -3
- package/dist/notifications/components/notifications.js.map +1 -1
- package/dist/notifications/index.d.ts +2 -1
- package/dist/notifications/index.js +1 -10
- package/dist/notifications/plugin.d.ts +2 -0
- package/dist/notifications/plugin.js +11 -0
- package/dist/notifications/plugin.js.map +1 -0
- package/dist/notifications/store.d.ts +1 -1
- package/dist/notifications/types.d.ts +1 -1
- package/dist/page.d.ts +1 -1
- package/dist/provider-base.d.ts +2 -2
- package/dist/provider-base.js +5 -4
- package/dist/provider-base.js.map +1 -1
- package/dist/provider.d.ts +3 -3
- package/dist/realtime/build-effects.d.ts +2 -2
- package/dist/realtime/listeners.d.ts +1 -1
- package/dist/realtime/subscriptions.d.ts +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.js +9 -9
- package/dist/registry.js.map +1 -1
- package/dist/remote/components/data-list.d.ts +2 -2
- package/dist/remote/components/data-list.js +1 -34
- package/dist/remote/components/data-list.js.map +1 -1
- package/dist/remote/index.d.ts +1 -1
- package/dist/remote/index.js +1 -10
- package/dist/remote/plugin.d.ts +2 -0
- package/dist/remote/plugin.js +11 -0
- package/dist/remote/plugin.js.map +1 -0
- package/dist/table/components/bulk-bar.d.ts +1 -1
- package/dist/table/components/bulk-bar.js +4 -4
- package/dist/table/components/bulk-bar.js.map +1 -1
- package/dist/table/components/cells/badge-cell.d.ts +1 -1
- package/dist/table/components/cells/badge-cell.js +1 -1
- package/dist/table/components/cells/badge-cell.js.map +1 -1
- package/dist/table/components/cells/boolean-cell.d.ts +1 -1
- package/dist/table/components/cells/boolean-cell.js.map +1 -1
- package/dist/table/components/cells/icon-cell.d.ts +1 -1
- package/dist/table/components/cells/icon-cell.js.map +1 -1
- package/dist/table/components/cells/image-cell.d.ts +1 -1
- package/dist/table/components/cells/image-cell.js +1 -1
- package/dist/table/components/cells/image-cell.js.map +1 -1
- package/dist/table/components/cells/money-cell.d.ts +1 -1
- package/dist/table/components/cells/money-cell.js +1 -1
- package/dist/table/components/cells/money-cell.js.map +1 -1
- package/dist/table/components/cells/number-cell.d.ts +1 -1
- package/dist/table/components/cells/number-cell.js +1 -1
- package/dist/table/components/cells/number-cell.js.map +1 -1
- package/dist/table/components/cells/stack-cell.d.ts +1 -1
- package/dist/table/components/cells/stack-cell.js +3 -7
- package/dist/table/components/cells/stack-cell.js.map +1 -1
- package/dist/table/components/cells/text-cell.d.ts +1 -1
- package/dist/table/components/cells/text-cell.js +4 -4
- package/dist/table/components/cells/text-cell.js.map +1 -1
- package/dist/table/components/column-filter-control.d.ts +3 -3
- package/dist/table/components/column-filter-control.js +34 -19
- package/dist/table/components/column-filter-control.js.map +1 -1
- package/dist/table/components/column-header.d.ts +1 -1
- package/dist/table/components/column-header.js +7 -7
- package/dist/table/components/column-header.js.map +1 -1
- package/dist/table/components/column-visibility-menu.d.ts +1 -1
- package/dist/table/components/column-visibility-menu.js +3 -3
- package/dist/table/components/column-visibility-menu.js.map +1 -1
- package/dist/table/components/filter-bar.d.ts +9 -7
- package/dist/table/components/filter-bar.js +62 -52
- package/dist/table/components/filter-bar.js.map +1 -1
- package/dist/table/components/filter-controls.d.ts +5 -9
- package/dist/table/components/filter-controls.js +96 -224
- package/dist/table/components/filter-controls.js.map +1 -1
- package/dist/table/components/filter-value-input.d.ts +1 -1
- package/dist/table/components/filter-value-input.js +1 -1
- package/dist/table/components/filter-value-input.js.map +1 -1
- package/dist/table/components/pagination.d.ts +2 -2
- package/dist/table/components/pagination.js.map +1 -1
- package/dist/table/components/sort-bar.d.ts +1 -1
- package/dist/table/components/sort-bar.js +2 -2
- package/dist/table/components/sort-bar.js.map +1 -1
- package/dist/table/components/table-action-node.d.ts +1 -1
- package/dist/table/components/table-action-node.js +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 +2 -2
- package/dist/table/components/table-cell.js.map +1 -1
- package/dist/table/components/table.d.ts +1 -1
- package/dist/table/components/table.js +23 -31
- package/dist/table/components/table.js.map +1 -1
- package/dist/{core → table/hooks}/use-column-visibility.d.ts +5 -3
- package/dist/{core → table/hooks}/use-column-visibility.js +4 -4
- package/dist/table/hooks/use-column-visibility.js.map +1 -0
- package/dist/table/{use-table-selection.js → hooks/use-table-selection.js} +1 -1
- package/dist/table/hooks/use-table-selection.js.map +1 -0
- package/dist/table/{use-table.d.ts → hooks/use-table.d.ts} +7 -7
- package/dist/table/{use-table.js → hooks/use-table.js} +12 -9
- package/dist/table/hooks/use-table.js.map +1 -0
- package/dist/table/index.d.ts +6 -1
- package/dist/table/index.js +5 -11
- package/dist/table/{align.d.ts → lib/align.d.ts} +1 -1
- package/dist/table/{align.js → lib/align.js} +1 -1
- package/dist/table/lib/align.js.map +1 -0
- package/dist/table/{bulk.d.ts → lib/bulk.d.ts} +3 -3
- package/dist/table/{bulk.js → lib/bulk.js} +1 -1
- package/dist/table/lib/bulk.js.map +1 -0
- package/dist/table/{filter-values.d.ts → lib/filter-values.d.ts} +10 -3
- package/dist/table/{filter-values.js → lib/filter-values.js} +14 -4
- package/dist/table/lib/filter-values.js.map +1 -0
- package/dist/table/{format.d.ts → lib/format.d.ts} +2 -2
- package/dist/table/{format.js → lib/format.js} +3 -3
- package/dist/table/lib/format.js.map +1 -0
- package/dist/table/{payload.d.ts → lib/payload.d.ts} +2 -3
- package/dist/table/{payload.js → lib/payload.js} +12 -9
- package/dist/table/lib/payload.js.map +1 -0
- package/dist/table/{query.d.ts → lib/query.d.ts} +3 -3
- package/dist/table/{query.js → lib/query.js} +27 -27
- package/dist/table/lib/query.js.map +1 -0
- package/dist/table/plugin.d.ts +2 -0
- package/dist/table/plugin.js +11 -0
- package/dist/table/plugin.js.map +1 -0
- package/dist/table/registry.d.ts +3 -1
- package/dist/table/registry.js.map +1 -1
- package/dist/table/types.d.ts +57 -7
- package/dist/toast/callout.d.ts +1 -1
- package/dist/toast/callout.js.map +1 -1
- package/dist/toast/index.d.ts +6 -5
- package/dist/toast/index.js +2 -1
- package/dist/toast/toast.d.ts +1 -1
- package/dist/toast/toaster.js.map +1 -1
- package/dist/toast/variant-styles.d.ts +1 -1
- package/dist/types/generated.d.ts +118 -64
- package/dist/types/index.d.ts +1 -1
- package/dist/{action/components → ui}/action-menu-context.js +1 -1
- package/dist/ui/action-menu-context.js.map +1 -0
- package/dist/{form/components/base → ui}/affix-group.d.ts +1 -1
- package/dist/{form/components/base → ui}/affix-group.js +3 -3
- package/dist/ui/affix-group.js.map +1 -0
- package/dist/{core/components → ui}/badge.d.ts +1 -1
- package/dist/{core/components → ui}/badge.js +2 -2
- package/dist/ui/badge.js.map +1 -0
- package/dist/{core/components → ui}/button.d.ts +2 -2
- package/dist/{core/components → ui}/button.js +5 -5
- package/dist/ui/button.js.map +1 -0
- package/dist/{core/components → ui}/card.d.ts +1 -1
- package/dist/{core/components → ui}/card.js +3 -3
- package/dist/ui/card.js.map +1 -0
- package/dist/{core/components → ui}/chart-view.d.ts +1 -1
- package/dist/{core/components → ui}/chart-view.js +5 -5
- package/dist/ui/chart-view.js.map +1 -0
- package/dist/{core/components → ui}/chart.d.ts +1 -1
- package/dist/{core/components → ui}/chart.js +1 -1
- package/dist/ui/chart.js.map +1 -0
- package/dist/{core/components → ui}/checkbox.js +3 -3
- package/dist/ui/checkbox.js.map +1 -0
- package/dist/{core/use-click-behavior.d.ts → ui/click-behavior.d.ts} +17 -19
- package/dist/ui/click-behavior.js +46 -0
- package/dist/ui/click-behavior.js.map +1 -0
- package/dist/{core/components → ui}/collapsible.d.ts +1 -1
- package/dist/{core/components → ui}/collapsible.js +6 -6
- package/dist/ui/collapsible.js.map +1 -0
- package/dist/{core/components → ui}/combobox.d.ts +1 -1
- package/dist/{core/components → ui}/combobox.js +4 -4
- package/dist/ui/combobox.js.map +1 -0
- package/dist/{core/components → ui}/confirm-dialog.d.ts +1 -1
- package/dist/{core/components → ui}/confirm-dialog.js +1 -1
- package/dist/ui/confirm-dialog.js.map +1 -0
- package/dist/{core/components → ui}/control.d.ts +1 -1
- package/dist/{core/components → ui}/control.js +1 -1
- package/dist/ui/control.js.map +1 -0
- package/dist/{clipboard → ui}/copyable-text.d.ts +1 -0
- package/dist/{clipboard → ui}/copyable-text.js +11 -3
- package/dist/ui/copyable-text.js.map +1 -0
- package/dist/{core/components → ui}/dialog.js +3 -3
- package/dist/ui/dialog.js.map +1 -0
- package/dist/{core/components → ui}/dropdown-menu.d.ts +1 -1
- package/dist/{core/components → ui}/dropdown-menu.js +3 -3
- package/dist/ui/dropdown-menu.js.map +1 -0
- package/dist/{core/components → ui}/floating-panel.d.ts +1 -1
- package/dist/{core/components → ui}/floating-panel.js +4 -4
- package/dist/ui/floating-panel.js.map +1 -0
- package/dist/{core/components → ui}/fragment.d.ts +1 -1
- package/dist/{core/components → ui}/fragment.js +5 -5
- package/dist/ui/fragment.js.map +1 -0
- package/dist/{core/components → ui}/grid.d.ts +1 -1
- package/dist/{core/components → ui}/grid.js +3 -3
- package/dist/ui/grid.js.map +1 -0
- package/dist/{core/components → ui}/heading.d.ts +1 -1
- package/dist/{core/components → ui}/heading.js +2 -2
- package/dist/ui/heading.js.map +1 -0
- package/dist/{core/components → ui}/icon.d.ts +1 -1
- package/dist/{core/components → ui}/icon.js +3 -3
- package/dist/ui/icon.js.map +1 -0
- package/dist/ui/index.d.ts +27 -0
- package/dist/ui/index.js +26 -0
- package/dist/{core/components → ui}/info-tooltip.js +3 -3
- package/dist/ui/info-tooltip.js.map +1 -0
- package/dist/{form/components/base → ui}/input-error.js +2 -2
- package/dist/ui/input-error.js.map +1 -0
- package/dist/{form/components/base → ui}/input-otp.js +2 -2
- package/dist/ui/input-otp.js.map +1 -0
- package/dist/{form/components/base → ui}/input.js +3 -3
- package/dist/ui/input.js.map +1 -0
- package/dist/{form/components/base → ui}/label.js +2 -2
- package/dist/ui/label.js.map +1 -0
- package/dist/{core/components → ui}/link.d.ts +1 -1
- package/dist/{core/components → ui}/link.js +8 -7
- package/dist/ui/link.js.map +1 -0
- package/dist/{core/components → ui}/modal.d.ts +1 -1
- package/dist/{core/components → ui}/modal.js +2 -2
- package/dist/ui/modal.js.map +1 -0
- package/dist/{form/components/base → ui}/password-input.js +3 -3
- package/dist/ui/password-input.js.map +1 -0
- package/dist/ui/plugin.d.ts +1 -0
- package/dist/{core/components/index.js → ui/plugin.js} +6 -6
- package/dist/ui/plugin.js.map +1 -0
- package/dist/{core/components → ui}/popover.js +2 -2
- package/dist/ui/popover.js.map +1 -0
- package/dist/{core/components → ui}/raw-block.d.ts +1 -1
- package/dist/{core/components → ui}/raw-block.js +1 -1
- package/dist/ui/raw-block.js.map +1 -0
- package/dist/{core/components → ui}/section.d.ts +1 -1
- package/dist/{core/components → ui}/section.js +6 -6
- package/dist/ui/section.js.map +1 -0
- package/dist/{core/components → ui}/segmented-control.d.ts +1 -1
- package/dist/{core/components → ui}/segmented-control.js +1 -1
- package/dist/ui/segmented-control.js.map +1 -0
- package/dist/{core/components → ui}/segmented-pills.d.ts +1 -1
- package/dist/{core/components → ui}/segmented-pills.js +2 -2
- package/dist/ui/segmented-pills.js.map +1 -0
- package/dist/{core/components → ui}/skeleton.js +2 -2
- package/dist/ui/skeleton.js.map +1 -0
- package/dist/{core/components → ui}/spinner.js +4 -4
- package/dist/ui/spinner.js.map +1 -0
- package/dist/{core/components → ui}/stack.d.ts +1 -1
- package/dist/{core/components → ui}/stack.js +3 -3
- package/dist/ui/stack.js.map +1 -0
- package/dist/{core/components → ui}/tabs.d.ts +1 -1
- package/dist/{core/components → ui}/tabs.js +3 -3
- package/dist/ui/tabs.js.map +1 -0
- package/dist/{core/components → ui}/text.d.ts +1 -1
- package/dist/{core/components → ui}/text.js +4 -4
- package/dist/ui/text.js.map +1 -0
- package/dist/{form/components/base → ui}/textarea.js +3 -3
- package/dist/ui/textarea.js.map +1 -0
- package/dist/{core/components → ui}/tooltip.d.ts +1 -1
- package/dist/{core/components → ui}/tooltip.js +3 -3
- package/dist/ui/tooltip.js.map +1 -0
- package/dist/vite.js +2 -2
- package/dist/vite.js.map +1 -1
- package/package.json +28 -94
- package/resources/icons/align-center.svg +1 -1
- package/resources/icons/align-justify.svg +1 -1
- package/resources/icons/align-left.svg +1 -1
- package/resources/icons/align-right.svg +1 -1
- package/resources/icons/arrow-down.svg +1 -1
- package/resources/icons/arrow-up.svg +1 -1
- package/resources/icons/bell.svg +1 -1
- package/resources/icons/bold.svg +1 -1
- package/resources/icons/calendar.svg +1 -1
- package/resources/icons/check.svg +1 -1
- package/resources/icons/chevron-down.svg +1 -1
- package/resources/icons/chevron-left.svg +1 -1
- package/resources/icons/chevron-right.svg +1 -1
- package/resources/icons/chevrons-up-down.svg +1 -1
- package/resources/icons/circle-alert.svg +1 -1
- package/resources/icons/circle-check.svg +1 -1
- package/resources/icons/circle-help.svg +1 -1
- package/resources/icons/circle-x.svg +1 -1
- package/resources/icons/clock.svg +1 -1
- package/resources/icons/code.svg +1 -1
- package/resources/icons/columns-3.svg +1 -1
- package/resources/icons/copy.svg +1 -1
- package/resources/icons/external-link.svg +1 -1
- package/resources/icons/eye-off.svg +1 -1
- package/resources/icons/eye.svg +1 -1
- package/resources/icons/filter.svg +1 -1
- package/resources/icons/heading-1.svg +1 -1
- package/resources/icons/heading-2.svg +1 -1
- package/resources/icons/heading-3.svg +1 -1
- package/resources/icons/highlighter.svg +1 -1
- package/resources/icons/info.svg +1 -1
- package/resources/icons/italic.svg +1 -1
- package/resources/icons/layout-dashboard.svg +1 -1
- package/resources/icons/link.svg +1 -1
- package/resources/icons/list-ordered.svg +1 -1
- package/resources/icons/list.svg +1 -1
- package/resources/icons/loader-2.svg +1 -1
- package/resources/icons/minus.svg +1 -1
- package/resources/icons/more-horizontal.svg +1 -1
- package/resources/icons/panel-left.svg +1 -1
- package/resources/icons/pencil-line.svg +1 -1
- package/resources/icons/pencil.svg +1 -1
- package/resources/icons/plus.svg +1 -1
- package/resources/icons/quote.svg +1 -1
- package/resources/icons/rotate-ccw.svg +1 -1
- package/resources/icons/rows-3.svg +1 -1
- package/resources/icons/search.svg +1 -1
- package/resources/icons/send.svg +1 -1
- package/resources/icons/settings.svg +1 -1
- package/resources/icons/smile.svg +1 -1
- package/resources/icons/strikethrough.svg +1 -1
- package/resources/icons/table.svg +1 -1
- package/resources/icons/trash-2.svg +1 -1
- package/resources/icons/underline.svg +1 -1
- package/resources/icons/x.svg +1 -1
- package/dist/action/components/action-menu-context.js.map +0 -1
- package/dist/action/index.js.map +0 -1
- package/dist/action/run-action.js.map +0 -1
- package/dist/action/use-action.js.map +0 -1
- package/dist/chat/index.js.map +0 -1
- package/dist/chat/transport.js.map +0 -1
- package/dist/chat/use-chat.js.map +0 -1
- package/dist/clipboard/copyable-text.js.map +0 -1
- package/dist/core/column-sizing.js.map +0 -1
- package/dist/core/components/badge.js.map +0 -1
- package/dist/core/components/button.js.map +0 -1
- package/dist/core/components/card.js.map +0 -1
- package/dist/core/components/chart-view.js.map +0 -1
- package/dist/core/components/chart.js.map +0 -1
- package/dist/core/components/checkbox.js.map +0 -1
- package/dist/core/components/collapsible.js.map +0 -1
- package/dist/core/components/combobox.js.map +0 -1
- package/dist/core/components/confirm-dialog.js.map +0 -1
- package/dist/core/components/control.js.map +0 -1
- package/dist/core/components/dialog.js.map +0 -1
- package/dist/core/components/dropdown-menu.js.map +0 -1
- package/dist/core/components/floating-panel.js.map +0 -1
- package/dist/core/components/fragment.js.map +0 -1
- package/dist/core/components/grid.js.map +0 -1
- package/dist/core/components/heading.js.map +0 -1
- package/dist/core/components/icon.js.map +0 -1
- package/dist/core/components/index.d.ts +0 -1
- package/dist/core/components/index.js.map +0 -1
- package/dist/core/components/info-tooltip.js.map +0 -1
- package/dist/core/components/link.js.map +0 -1
- package/dist/core/components/modal.js.map +0 -1
- package/dist/core/components/popover.js.map +0 -1
- package/dist/core/components/raw-block.js.map +0 -1
- package/dist/core/components/section.js.map +0 -1
- package/dist/core/components/segmented-control.js.map +0 -1
- package/dist/core/components/segmented-pills.js.map +0 -1
- package/dist/core/components/skeleton.js.map +0 -1
- package/dist/core/components/spinner.js.map +0 -1
- package/dist/core/components/stack.js.map +0 -1
- package/dist/core/components/tabs.js.map +0 -1
- package/dist/core/components/text.js.map +0 -1
- package/dist/core/components/tooltip.js.map +0 -1
- package/dist/core/use-click-behavior.js +0 -46
- package/dist/core/use-click-behavior.js.map +0 -1
- package/dist/core/use-column-resizing.js.map +0 -1
- package/dist/core/use-column-visibility.js.map +0 -1
- package/dist/events/event-bridge.js.map +0 -1
- package/dist/form/components/base/affix-group.js.map +0 -1
- package/dist/form/components/base/input-error.js.map +0 -1
- package/dist/form/components/base/input-otp.js.map +0 -1
- package/dist/form/components/base/input.js.map +0 -1
- package/dist/form/components/base/label.js.map +0 -1
- package/dist/form/components/base/password-input.js.map +0 -1
- package/dist/form/components/base/textarea.js.map +0 -1
- package/dist/form/components/conditions.js.map +0 -1
- package/dist/form/components/context.js.map +0 -1
- package/dist/form/components/field-props.js.map +0 -1
- package/dist/form/components/field-scope.js.map +0 -1
- package/dist/form/components/fields/block-add-menu.js.map +0 -1
- package/dist/form/components/form-path.js.map +0 -1
- package/dist/form/components/form-transport.js +0 -30
- package/dist/form/components/form-transport.js.map +0 -1
- package/dist/form/components/override-keys.js +0 -12
- package/dist/form/components/override-keys.js.map +0 -1
- package/dist/form/components/prefill-context.js.map +0 -1
- package/dist/form/components/prefill-targets.js.map +0 -1
- package/dist/form/components/resolved-nodes.js.map +0 -1
- package/dist/form/components/row-layout-context.js.map +0 -1
- package/dist/form/components/use-controlled-field.js.map +0 -1
- package/dist/form/components/use-dependent-field.d.ts +0 -3
- package/dist/form/components/use-dependent-field.js.map +0 -1
- package/dist/form/components/use-field-commit.js.map +0 -1
- package/dist/form/components/use-form-resolver.js.map +0 -1
- package/dist/form/components/use-seed-default.js.map +0 -1
- package/dist/form/components/values.js +0 -52
- package/dist/form/components/values.js.map +0 -1
- package/dist/form/index.js.map +0 -1
- package/dist/layout/breadcrumbs.js.map +0 -1
- package/dist/layout/callouts.js.map +0 -1
- package/dist/layout/components.d.ts +0 -1
- package/dist/layout/components.js.map +0 -1
- package/dist/layout/context.js.map +0 -1
- package/dist/layout/dropdown.js.map +0 -1
- package/dist/layout/menu-item.js.map +0 -1
- package/dist/layout/menu.js.map +0 -1
- package/dist/layout/outlet.js.map +0 -1
- package/dist/layout/popover.js.map +0 -1
- package/dist/layout/schema-layout.js.map +0 -1
- package/dist/layout/sidebar.js.map +0 -1
- package/dist/layout/topbar.js.map +0 -1
- package/dist/notifications/index.js.map +0 -1
- package/dist/remote/index.js.map +0 -1
- package/dist/svg-sprite-client/index.d.ts +0 -1
- package/dist/svg-sprite-client/index.js +0 -0
- package/dist/table/align.js.map +0 -1
- package/dist/table/bulk.js.map +0 -1
- package/dist/table/components/filter-stack-bar.d.ts +0 -7
- package/dist/table/components/filter-stack-bar.js +0 -38
- package/dist/table/components/filter-stack-bar.js.map +0 -1
- package/dist/table/filter-values.js.map +0 -1
- package/dist/table/format.js.map +0 -1
- package/dist/table/index.js.map +0 -1
- package/dist/table/payload.js.map +0 -1
- package/dist/table/query.js.map +0 -1
- package/dist/table/use-table-selection.js.map +0 -1
- package/dist/table/use-table.js.map +0 -1
- package/dist/types/generated.js +0 -0
- package/dist/types/index.js +0 -0
- /package/dist/form/{components → hooks}/field-scope.d.ts +0 -0
- /package/dist/form/{components → hooks}/prefill-context.d.ts +0 -0
- /package/dist/form/{components → hooks}/row-layout-context.d.ts +0 -0
- /package/dist/form/{components → hooks}/use-seed-default.d.ts +0 -0
- /package/dist/form/{components → lib}/form-path.d.ts +0 -0
- /package/dist/form/{components → lib}/override-keys.d.ts +0 -0
- /package/dist/form/{components/types.js → types.js} +0 -0
- /package/dist/layout/{popover.d.ts → components/popover.d.ts} +0 -0
- /package/dist/layout/{schema-layout.d.ts → components/schema-layout.d.ts} +0 -0
- /package/dist/table/{use-table-selection.d.ts → hooks/use-table-selection.d.ts} +0 -0
- /package/dist/{action/components → ui}/action-menu-context.d.ts +0 -0
- /package/dist/{core/components → ui}/checkbox.d.ts +0 -0
- /package/dist/{core/components → ui}/dialog.d.ts +0 -0
- /package/dist/{core/components → ui}/info-tooltip.d.ts +0 -0
- /package/dist/{form/components/base → ui}/input-error.d.ts +0 -0
- /package/dist/{form/components/base → ui}/input-otp.d.ts +0 -0
- /package/dist/{form/components/base → ui}/input.d.ts +0 -0
- /package/dist/{form/components/base → ui}/label.d.ts +0 -0
- /package/dist/{form/components/base → ui}/password-input.d.ts +0 -0
- /package/dist/{core/components → ui}/popover.d.ts +0 -0
- /package/dist/{core/components → ui}/skeleton.d.ts +0 -0
- /package/dist/{core/components → ui}/spinner.d.ts +0 -0
- /package/dist/{form/components/base → ui}/textarea.d.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ndjsonChatTransport } from "
|
|
1
|
+
import { ndjsonChatTransport } from "../lib/transport.js";
|
|
2
2
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
-
//#region resources/js/chat/use-chat.ts
|
|
3
|
+
//#region resources/js/chat/hooks/use-chat.ts
|
|
4
4
|
var idCounter = 0;
|
|
5
5
|
function defaultGenerateId() {
|
|
6
6
|
idCounter += 1;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-chat.js","names":[],"sources":["../../../resources/js/chat/hooks/use-chat.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { ndjsonChatTransport } from \"@lattice-php/lattice/chat/lib/transport\";\nimport type {\n ChatFrame,\n ChatMessage,\n ChatStatus,\n ChatTransport,\n UseChatReturn,\n} from \"@lattice-php/lattice/chat/types\";\n\nexport type UseChatOptions = {\n endpoint: string;\n transport?: ChatTransport;\n initialMessages?: ChatMessage[];\n generateId?: () => string;\n};\n\nlet idCounter = 0;\n\nfunction defaultGenerateId(): string {\n idCounter += 1;\n\n return `chat-${idCounter}`;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction lastIsAssistant(messages: ChatMessage[]): boolean {\n const last = messages.at(-1);\n\n return last !== undefined && last.role === \"assistant\";\n}\n\n/**\n * Pure reducer for a single streamed frame: a `text` frame appends to the open\n * assistant text part (opening one if the last part is not text); a `part` frame\n * pushes a complete part, which closes the open text part. Operates immutably on\n * the last assistant message.\n */\nexport function foldFrame(messages: ChatMessage[], frame: ChatFrame): ChatMessage[] {\n if (!lastIsAssistant(messages)) {\n return messages;\n }\n\n const index = messages.length - 1;\n const target = messages[index];\n\n if (frame.type === \"text\") {\n const parts = [...target.parts];\n const openIndex = parts.length - 1;\n const open = parts[openIndex];\n\n if (open !== undefined && open.type === \"chat.part.text\") {\n const openText = (open.props as { text: string }).text;\n parts[openIndex] = { type: \"chat.part.text\", props: { text: `${openText}${frame.value}` } };\n } else {\n parts.push({ type: \"chat.part.text\", props: { text: frame.value } });\n }\n\n const next = [...messages];\n next[index] = { ...target, parts };\n\n return next;\n }\n\n if (frame.type === \"part\") {\n const next = [...messages];\n next[index] = { ...target, parts: [...target.parts, frame.part] };\n\n return next;\n }\n\n return messages;\n}\n\nexport function useChat({\n endpoint,\n transport = ndjsonChatTransport,\n initialMessages = [],\n generateId = defaultGenerateId,\n}: UseChatOptions): UseChatReturn {\n const [messages, setMessagesState] = useState<ChatMessage[]>(initialMessages);\n const [status, setStatus] = useState<ChatStatus>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const abortRef = useRef<AbortController | null>(null);\n const lastUserTextRef = useRef<string | null>(null);\n const messagesRef = useRef<ChatMessage[]>(messages);\n messagesRef.current = messages;\n\n const commitMessages = useCallback((next: ChatMessage[]): void => {\n messagesRef.current = next;\n setMessagesState(next);\n }, []);\n\n const runTurn = useCallback(\n async (history: ChatMessage[], userText: string): Promise<void> => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n setError(null);\n setStatus(\"submitted\");\n\n const userMessage: ChatMessage = {\n id: generateId(),\n role: \"user\",\n parts: [{ type: \"chat.part.text\", props: { text: userText } }],\n };\n const assistantMessage: ChatMessage = { id: generateId(), role: \"assistant\", parts: [] };\n commitMessages([...history, userMessage, assistantMessage]);\n setStatus(\"streaming\");\n\n try {\n for await (const frame of transport({\n url: endpoint,\n body: { message: userText },\n signal: controller.signal,\n })) {\n if (frame.type === \"done\") {\n setStatus(\"idle\");\n continue;\n }\n\n if (frame.type === \"error\") {\n setError(frame.message ?? \"Chat failed\");\n setStatus(\"error\");\n continue;\n }\n\n commitMessages(foldFrame(messagesRef.current, frame));\n }\n\n setStatus((current) =>\n current === \"streaming\" || current === \"submitted\" ? \"idle\" : current,\n );\n } catch (caught) {\n if (isAbortError(caught)) {\n setStatus(\"idle\");\n\n return;\n }\n\n setError(errorMessage(caught));\n setStatus(\"error\");\n }\n },\n [commitMessages, endpoint, generateId, transport],\n );\n\n const sendMessage = useCallback(\n (text: string): void => {\n const trimmed = text.trim();\n if (trimmed === \"\") {\n return;\n }\n\n lastUserTextRef.current = trimmed;\n void runTurn(messagesRef.current, trimmed);\n },\n [runTurn],\n );\n\n const stop = useCallback((): void => {\n abortRef.current?.abort();\n setStatus(\"idle\");\n }, []);\n\n const regenerate = useCallback((): void => {\n const userText = lastUserTextRef.current;\n if (userText === null) {\n return;\n }\n\n const current = messagesRef.current;\n const history = lastIsAssistant(current) ? current.slice(0, -2) : current;\n void runTurn(history, userText);\n }, [runTurn]);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n return { messages, status, error, sendMessage, setMessages: commitMessages, stop, regenerate };\n}\n"],"mappings":"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"}
|
package/dist/chat/index.d.ts
CHANGED
package/dist/chat/index.js
CHANGED
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import { ToolCallPart } from "./parts/tool-call.js";
|
|
5
|
-
//#region resources/js/chat/index.ts
|
|
6
|
-
var chatComponents = createPlugin({
|
|
7
|
-
name: "lattice/chat",
|
|
8
|
-
components: {
|
|
9
|
-
"chat.box": eagerComponent(ChatBox),
|
|
10
|
-
"chat.part.text": eagerComponent(TextPart),
|
|
11
|
-
"chat.part.tool-call": eagerComponent(ToolCallPart)
|
|
12
|
-
}
|
|
13
|
-
});
|
|
14
|
-
//#endregion
|
|
15
|
-
export { chatComponents };
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
import { useChat } from "./hooks/use-chat.js";
|
|
2
|
+
import { chatComponents } from "./plugin.js";
|
|
3
|
+
export { chatComponents, useChat };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RemoteAccess } from '
|
|
2
|
-
import { ChatFrame, ChatTransportRequest } from '
|
|
1
|
+
import { RemoteAccess } from '../../core/api.js';
|
|
2
|
+
import { ChatFrame, ChatTransportRequest } from '../types.js';
|
|
3
3
|
export declare function ndjsonChatTransport({ url, body, signal, }: ChatTransportRequest): AsyncGenerator<ChatFrame>;
|
|
4
4
|
export declare function createRemoteNdjsonChatTransport(remote: RemoteAccess): ({ url, body, signal, }: ChatTransportRequest) => AsyncGenerator<ChatFrame>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { apiFetch, remoteFetch } from "
|
|
2
|
-
//#region resources/js/chat/transport.ts
|
|
1
|
+
import { apiFetch, remoteFetch } from "../../core/api.js";
|
|
2
|
+
//#region resources/js/chat/lib/transport.ts
|
|
3
3
|
function parseFrame(line) {
|
|
4
4
|
try {
|
|
5
5
|
return JSON.parse(line);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","names":[],"sources":["../../../resources/js/chat/lib/transport.ts"],"sourcesContent":["import { apiFetch, remoteFetch, type RemoteAccess } from \"@lattice-php/lattice/core/api\";\nimport type { ChatFrame, ChatTransportRequest } from \"@lattice-php/lattice/chat/types\";\n\nfunction parseFrame(line: string): ChatFrame | null {\n try {\n return JSON.parse(line) as ChatFrame;\n } catch {\n return null;\n }\n}\n\nexport async function* ndjsonChatTransport({\n url,\n body,\n signal,\n}: ChatTransportRequest): AsyncGenerator<ChatFrame> {\n const res = await apiFetch(url, {\n method: \"POST\",\n signal,\n headers: { Accept: \"application/x-ndjson\" },\n body: JSON.stringify(body),\n throwOnError: false,\n });\n\n if (!res.ok || !res.body) {\n throw new Error(`Chat stream failed (${res.status})`);\n }\n\n yield* readNdjsonFrames(res.body);\n}\n\nexport function createRemoteNdjsonChatTransport(remote: RemoteAccess) {\n return async function* remoteNdjsonChatTransport({\n url,\n body,\n signal,\n }: ChatTransportRequest): AsyncGenerator<ChatFrame> {\n const res = await remoteFetch(url, {\n remote,\n method: \"POST\",\n signal,\n headers: {\n Accept: \"application/x-ndjson\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n throwOnError: false,\n });\n\n if (!res.ok || !res.body) {\n throw new Error(`Chat stream failed (${res.status})`);\n }\n\n yield* readNdjsonFrames(res.body);\n };\n}\n\nasync function* readNdjsonFrames(body: ReadableStream<Uint8Array>): AsyncGenerator<ChatFrame> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.trim() === \"\") {\n continue;\n }\n\n const frame = parseFrame(line);\n if (frame) {\n yield frame;\n }\n }\n }\n\n buffer += decoder.decode();\n if (buffer.trim() !== \"\") {\n const frame = parseFrame(buffer);\n if (frame) {\n yield frame;\n }\n }\n } finally {\n await reader.cancel().catch(() => {});\n }\n}\n"],"mappings":";;AAGA,SAAS,WAAW,MAAgC;CAClD,IAAI;EACF,OAAO,KAAK,MAAM,IAAI;CACxB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,gBAAuB,oBAAoB,EACzC,KACA,MACA,UACkD;CAClD,MAAM,MAAM,MAAM,SAAS,KAAK;EAC9B,QAAQ;EACR;EACA,SAAS,EAAE,QAAQ,uBAAuB;EAC1C,MAAM,KAAK,UAAU,IAAI;EACzB,cAAc;CAChB,CAAC;CAED,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAClB,MAAM,IAAI,MAAM,uBAAuB,IAAI,OAAO,EAAE;CAGtD,OAAO,iBAAiB,IAAI,IAAI;AAClC;AAEA,SAAgB,gCAAgC,QAAsB;CACpE,OAAO,gBAAgB,0BAA0B,EAC/C,KACA,MACA,UACkD;EAClD,MAAM,MAAM,MAAM,YAAY,KAAK;GACjC;GACA,QAAQ;GACR;GACA,SAAS;IACP,QAAQ;IACR,gBAAgB;GAClB;GACA,MAAM,KAAK,UAAU,IAAI;GACzB,cAAc;EAChB,CAAC;EAED,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAClB,MAAM,IAAI,MAAM,uBAAuB,IAAI,OAAO,EAAE;EAGtD,OAAO,iBAAiB,IAAI,IAAI;CAClC;AACF;AAEA,gBAAgB,iBAAiB,MAA6D;CAC5F,MAAM,SAAS,KAAK,UAAU;CAC9B,MAAM,UAAU,IAAI,YAAY;CAChC,IAAI,SAAS;CAEb,IAAI;EACF,SAAS;GACP,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;GAC1C,IAAI,MACF;GAGF,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;GAChD,MAAM,QAAQ,OAAO,MAAM,IAAI;GAC/B,SAAS,MAAM,IAAI,KAAK;GAExB,KAAK,MAAM,QAAQ,OAAO;IACxB,IAAI,KAAK,KAAK,MAAM,IAClB;IAGF,MAAM,QAAQ,WAAW,IAAI;IAC7B,IAAI,OACF,MAAM;GAEV;EACF;EAEA,UAAU,QAAQ,OAAO;EACzB,IAAI,OAAO,KAAK,MAAM,IAAI;GACxB,MAAM,QAAQ,WAAW,MAAM;GAC/B,IAAI,OACF,MAAM;EAEV;CACF,UAAU;EACR,MAAM,OAAO,OAAO,EAAE,YAAY,CAAC,CAAC;CACtC;AACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createPlugin, eagerComponent } from "../core/registry.js";
|
|
2
|
+
import { ChatBox } from "./components/chat-box.js";
|
|
3
|
+
import { TextPart } from "./parts/text.js";
|
|
4
|
+
import { ToolCallPart } from "./parts/tool-call.js";
|
|
5
|
+
//#region resources/js/chat/plugin.ts
|
|
6
|
+
var chatComponents = createPlugin({
|
|
7
|
+
name: "lattice/chat",
|
|
8
|
+
components: {
|
|
9
|
+
"chat.box": eagerComponent(ChatBox),
|
|
10
|
+
"chat.part.text": eagerComponent(TextPart),
|
|
11
|
+
"chat.part.tool-call": eagerComponent(ToolCallPart)
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
//#endregion
|
|
15
|
+
export { chatComponents };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/chat/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport ChatBoxComponent from \"./components/chat-box\";\nimport { TextPart } from \"./parts/text\";\nimport { ToolCallPart } from \"./parts/tool-call\";\n\nexport type ChatComponentType = \"chat.box\" | \"chat.part.text\" | \"chat.part.tool-call\";\n\nexport const chatComponents = createPlugin({\n name: \"lattice/chat\",\n components: {\n \"chat.box\": eagerComponent(ChatBoxComponent),\n \"chat.part.text\": eagerComponent(TextPart),\n \"chat.part.tool-call\": eagerComponent(ToolCallPart),\n } satisfies ComponentRegistryFor<ChatComponentType>,\n});\n"],"mappings":";;;;;AAWA,IAAa,iBAAiB,aAAa;CACzC,MAAM;CACN,YAAY;EACV,YAAY,eAAe,OAAgB;EAC3C,kBAAkB,eAAe,QAAQ;EACzC,uBAAuB,eAAe,YAAY;CACpD;AACF,CAAC"}
|
package/dist/chat/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Node } from '../core/types';
|
|
2
|
-
import { ChatMessage, ChatRole } from '../types/generated';
|
|
1
|
+
import { Node } from '../core/types.js';
|
|
2
|
+
import { ChatMessage, ChatRole } from '../types/generated.js';
|
|
3
3
|
export type { ChatMessage, ChatRole };
|
|
4
4
|
export type ChatStatus = "idle" | "submitted" | "streaming" | "error";
|
|
5
5
|
export type ChatFrame = {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
export { CopyableText } from '
|
|
1
|
+
export { CopyableText, copyToClipboard } from '../ui/copyable-text.js';
|
|
2
2
|
export type CopiedValue = string | null;
|
|
3
3
|
export type CopyFn = (text: string) => Promise<boolean>;
|
|
4
4
|
export type UseClipboardReturn = [CopiedValue, CopyFn];
|
|
5
|
-
export declare function copyToClipboard(text: string): Promise<boolean>;
|
|
6
5
|
export declare function useClipboard(): UseClipboardReturn;
|
package/dist/clipboard/index.js
CHANGED
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
import { CopyableText } from "
|
|
1
|
+
import { CopyableText, copyToClipboard } from "../ui/copyable-text.js";
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
//#region resources/js/clipboard/index.ts
|
|
4
|
-
async function copyToClipboard(text) {
|
|
5
|
-
if (!navigator?.clipboard) return false;
|
|
6
|
-
try {
|
|
7
|
-
await navigator.clipboard.writeText(text);
|
|
8
|
-
return true;
|
|
9
|
-
} catch {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
4
|
function useClipboard() {
|
|
14
5
|
const [copiedText, setCopiedText] = useState(null);
|
|
15
6
|
const copy = async (text) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../resources/js/clipboard/index.ts"],"sourcesContent":["import { useState } from \"react\";\n\nexport { CopyableText } from \"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../resources/js/clipboard/index.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { copyToClipboard } from \"@lattice-php/lattice/ui/copyable-text\";\n\nexport { CopyableText, copyToClipboard } from \"@lattice-php/lattice/ui/copyable-text\";\n\nexport type CopiedValue = string | null;\nexport type CopyFn = (text: string) => Promise<boolean>;\nexport type UseClipboardReturn = [CopiedValue, CopyFn];\n\nexport function useClipboard(): UseClipboardReturn {\n const [copiedText, setCopiedText] = useState<CopiedValue>(null);\n\n const copy: CopyFn = async (text) => {\n const copied = await copyToClipboard(text);\n\n setCopiedText(copied ? text : null);\n\n return copied;\n };\n\n return [copiedText, copy];\n}\n"],"mappings":";;;AASA,SAAgB,eAAmC;CACjD,MAAM,CAAC,YAAY,iBAAiB,SAAsB,IAAI;CAE9D,MAAM,OAAe,OAAO,SAAS;EACnC,MAAM,SAAS,MAAM,gBAAgB,IAAI;EAEzC,cAAc,SAAS,OAAO,IAAI;EAElC,OAAO;CACT;CAEA,OAAO,CAAC,YAAY,IAAI;AAC1B"}
|
package/dist/core/api.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BrowserToken as GeneratedBrowserToken, RemoteAccess as GeneratedRemoteAccess } from '../types/generated';
|
|
1
|
+
import { BrowserToken as GeneratedBrowserToken, RemoteAccess as GeneratedRemoteAccess } from '../types/generated.js';
|
|
2
2
|
export declare class ApiError extends Error {
|
|
3
3
|
readonly response: Response;
|
|
4
4
|
constructor(response: Response);
|
package/dist/core/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":[],"sources":["../../resources/js/core/api.ts"],"sourcesContent":["/**\n * The single funnel for raw-fetch HTTP, so the cross-cutting header, credential,\n * and error policy has one home and call sites only declare intent. Returns a\n * Response (not parsed data) so one primitive serves JSON, the chat's streaming\n * getReader(), and multipart alike. Not for the Inertia world (router/useHttp),\n * which carries its own headers.\n */\n\nimport { withHeaders } from \"./headers\";\nimport { localeHeader } from \"
|
|
1
|
+
{"version":3,"file":"api.js","names":[],"sources":["../../resources/js/core/api.ts"],"sourcesContent":["/**\n * The single funnel for raw-fetch HTTP, so the cross-cutting header, credential,\n * and error policy has one home and call sites only declare intent. Returns a\n * Response (not parsed data) so one primitive serves JSON, the chat's streaming\n * getReader(), and multipart alike. Not for the Inertia world (router/useHttp),\n * which carries its own headers.\n */\n\nimport { withHeaders } from \"./headers\";\nimport { localeHeader } from \"@lattice-php/lattice/i18n/locale\";\nimport type {\n BrowserToken as GeneratedBrowserToken,\n RemoteAccess as GeneratedRemoteAccess,\n} from \"@lattice-php/lattice/types/generated\";\n\nexport class ApiError extends Error {\n constructor(readonly response: Response) {\n super(`HTTP ${response.status}`);\n }\n}\n\nfunction xsrfToken(): string {\n const match = document.cookie.match(/XSRF-TOKEN=([^;]+)/);\n\n return match ? decodeURIComponent(match[1]) : \"\";\n}\n\nexport type ApiInit = Omit<RequestInit, \"headers\"> & {\n ref?: string;\n headers?: Record<string, string>;\n throwOnError?: boolean;\n};\n\nexport type BrowserToken = GeneratedBrowserToken;\nexport type RemoteAccess = GeneratedRemoteAccess;\n\nexport type RemoteInit = Omit<RequestInit, \"credentials\" | \"headers\"> & {\n headers?: Record<string, string>;\n remote: RemoteAccess;\n retryOnUnauthorized?: boolean;\n throwOnError?: boolean;\n};\n\ntype CachedBrowserToken = {\n expiresAt: number;\n token: BrowserToken;\n};\n\nconst tokenRefreshSkewMs = 10_000;\nconst remoteTokenCache = new Map<string, CachedBrowserToken>();\nconst pendingRemoteTokens = new Map<string, Promise<BrowserToken>>();\n\nfunction defaultHeaders(method: string | undefined): Record<string, string> {\n const isWrite = method !== undefined && method !== \"GET\" && method !== \"HEAD\";\n\n if (!isWrite) {\n return { Accept: \"application/json\" };\n }\n\n return {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-XSRF-TOKEN\": xsrfToken(),\n };\n}\n\nexport async function apiFetch(url: string, init: ApiInit = {}): Promise<Response> {\n const { ref, headers, throwOnError = true, method, ...rest } = init;\n // Some servers reject a lower-case method line, and fetch only normalizes the\n // standard verbs, so upper-case it here.\n const normalizedMethod = method?.toUpperCase();\n const response = await fetch(url, {\n credentials: \"same-origin\",\n ...rest,\n method: normalizedMethod,\n headers: withHeaders(ref ?? \"\", { ...defaultHeaders(normalizedMethod), ...headers }),\n });\n\n if (throwOnError && !response.ok) {\n throw new ApiError(response);\n }\n\n return response;\n}\n\nexport async function apiJson<T>(url: string, init?: ApiInit): Promise<T> {\n return (await apiFetch(url, init)).json() as Promise<T>;\n}\n\nfunction remoteTokenKey(remote: RemoteAccess): string {\n return [remote.source, remote.audience, [...remote.scopes].sort().join(\" \")].join(\"\\u001f\");\n}\n\nexport function clearRemoteTokenCache(): void {\n remoteTokenCache.clear();\n pendingRemoteTokens.clear();\n}\n\nexport function invalidateRemoteToken(remote: RemoteAccess): void {\n remoteTokenCache.delete(remoteTokenKey(remote));\n}\n\nexport async function remoteToken(remote: RemoteAccess): Promise<BrowserToken> {\n const key = remoteTokenKey(remote);\n const cached = remoteTokenCache.get(key);\n\n if (cached && cached.expiresAt > Date.now() + tokenRefreshSkewMs) {\n return cached.token;\n }\n\n const pending = pendingRemoteTokens.get(key);\n\n if (pending) {\n return pending;\n }\n\n const request = apiJson<BrowserToken>(remote.tokenEndpoint, {\n method: \"POST\",\n ref: remote.ref,\n body: JSON.stringify({\n nodeId: remote.nodeId,\n nodeType: remote.nodeType,\n audience: remote.audience,\n scopes: remote.scopes,\n }),\n })\n .then((token) => {\n remoteTokenCache.set(key, {\n token,\n expiresAt: Date.now() + Math.max(0, token.expiresIn) * 1000,\n });\n\n return token;\n })\n .finally(() => {\n pendingRemoteTokens.delete(key);\n });\n\n pendingRemoteTokens.set(key, request);\n\n return request;\n}\n\nfunction isUnauthorized(response: Response): boolean {\n return response.status === 401 || response.status === 403;\n}\n\nasync function fetchRemoteWithToken(\n url: string,\n init: Omit<RemoteInit, \"remote\" | \"retryOnUnauthorized\" | \"throwOnError\">,\n token: BrowserToken,\n): Promise<Response> {\n const { headers, ...rest } = init;\n\n return fetch(url, {\n ...rest,\n credentials: \"omit\",\n headers: {\n Accept: \"application/json\",\n ...localeHeader(),\n ...headers,\n Authorization: `${token.tokenType} ${token.accessToken}`,\n },\n });\n}\n\nexport async function remoteFetch(url: string, init: RemoteInit): Promise<Response> {\n const { remote, retryOnUnauthorized = true, throwOnError = true, ...request } = init;\n let token = await remoteToken(remote);\n let response = await fetchRemoteWithToken(url, request, token);\n\n if (retryOnUnauthorized && isUnauthorized(response)) {\n invalidateRemoteToken(remote);\n token = await remoteToken(remote);\n response = await fetchRemoteWithToken(url, request, token);\n }\n\n if (throwOnError && !response.ok) {\n throw new ApiError(response);\n }\n\n return response;\n}\n\nexport async function remoteJson<T>(url: string, init: RemoteInit): Promise<T> {\n return (await remoteFetch(url, init)).json() as Promise<T>;\n}\n"],"mappings":"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"}
|
package/dist/core/headers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headers.js","names":[],"sources":["../../resources/js/core/headers.ts"],"sourcesContent":["import { localeHeader } from \"
|
|
1
|
+
{"version":3,"file":"headers.js","names":[],"sources":["../../resources/js/core/headers.ts"],"sourcesContent":["import { localeHeader } from \"@lattice-php/lattice/i18n/locale\";\nimport { withRefHeader } from \"./component-ref\";\n\nexport function withHeaders(\n componentRef = \"\",\n headers: Record<string, string> = {},\n): Record<string, string> {\n return {\n ...localeHeader(),\n ...withRefHeader(componentRef),\n ...headers,\n };\n}\n"],"mappings":";;;AAGA,SAAgB,YACd,eAAe,IACf,UAAkC,CAAC,GACX;CACxB,OAAO;EACL,GAAG,aAAa;EAChB,GAAG,cAAc,YAAY;EAC7B,GAAG;CACL;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ColumnWidth } from '
|
|
1
|
+
import { ColumnWidth } from '../../types/generated.js';
|
|
2
2
|
export type SizableColumn = {
|
|
3
3
|
key: string;
|
|
4
|
-
label?: string;
|
|
4
|
+
label?: string | null;
|
|
5
5
|
width: ColumnWidth;
|
|
6
6
|
};
|
|
7
7
|
export declare const DEFAULT_COLUMN_WIDTH: ColumnWidth;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-sizing.js","names":[],"sources":["../../../resources/js/core/hooks/column-sizing.ts"],"sourcesContent":["import type { ColumnWidth } from \"@lattice-php/lattice/types/generated\";\n\nexport type SizableColumn = {\n key: string;\n label?: string | null;\n width: ColumnWidth;\n};\n\nexport const DEFAULT_COLUMN_WIDTH: ColumnWidth = \"md\";\n\nconst tracks: Record<\n ColumnWidth,\n { track: string; minPx: number; defaultPx: number; maxPx: number }\n> = {\n xs: { track: \"minmax(4rem, 0.35fr)\", minPx: 64, defaultPx: 96, maxPx: 1024 },\n sm: { track: \"minmax(6rem, 0.5fr)\", minPx: 96, defaultPx: 128, maxPx: 1024 },\n md: { track: \"minmax(8rem, 1fr)\", minPx: 128, defaultPx: 176, maxPx: 1024 },\n lg: { track: \"minmax(12rem, 1.5fr)\", minPx: 192, defaultPx: 240, maxPx: 1024 },\n xl: { track: \"minmax(16rem, 2fr)\", minPx: 256, defaultPx: 320, maxPx: 1024 },\n};\n\nexport function columnWidthTrack(width: ColumnWidth): string {\n return tracks[width].track;\n}\n\nexport function minColumnWidthPx(column: SizableColumn): number {\n return tracks[column.width].minPx;\n}\n\nexport function defaultColumnWidthPx(column: SizableColumn): number {\n return tracks[column.width].defaultPx;\n}\n\nexport function maxColumnWidthPx(column: SizableColumn): number {\n return tracks[column.width].maxPx;\n}\n\nexport function buildColumnGridTemplate({\n columns,\n leadingTracks = [],\n trailingTracks = [],\n overrides = {},\n}: {\n columns: SizableColumn[];\n leadingTracks?: string[];\n trailingTracks?: string[];\n overrides?: Record<string, number | undefined>;\n}): string {\n return [\n ...leadingTracks,\n ...columns.map((column) => {\n const override = overrides[column.key];\n\n if (override !== undefined) {\n return `${Math.min(maxColumnWidthPx(column), Math.max(minColumnWidthPx(column), override))}px`;\n }\n\n return columnWidthTrack(column.width);\n }),\n ...trailingTracks,\n ].join(\" \");\n}\n"],"mappings":";AAQA,IAAa,uBAAoC;AAEjD,IAAM,SAGF;CACF,IAAI;EAAE,OAAO;EAAwB,OAAO;EAAI,WAAW;EAAI,OAAO;CAAK;CAC3E,IAAI;EAAE,OAAO;EAAuB,OAAO;EAAI,WAAW;EAAK,OAAO;CAAK;CAC3E,IAAI;EAAE,OAAO;EAAqB,OAAO;EAAK,WAAW;EAAK,OAAO;CAAK;CAC1E,IAAI;EAAE,OAAO;EAAwB,OAAO;EAAK,WAAW;EAAK,OAAO;CAAK;CAC7E,IAAI;EAAE,OAAO;EAAsB,OAAO;EAAK,WAAW;EAAK,OAAO;CAAK;AAC7E;AAEA,SAAgB,iBAAiB,OAA4B;CAC3D,OAAO,OAAO,OAAO;AACvB;AAEA,SAAgB,iBAAiB,QAA+B;CAC9D,OAAO,OAAO,OAAO,OAAO;AAC9B;AAEA,SAAgB,qBAAqB,QAA+B;CAClE,OAAO,OAAO,OAAO,OAAO;AAC9B;AAEA,SAAgB,iBAAiB,QAA+B;CAC9D,OAAO,OAAO,OAAO,OAAO;AAC9B;AAEA,SAAgB,wBAAwB,EACtC,SACA,gBAAgB,CAAC,GACjB,iBAAiB,CAAC,GAClB,YAAY,CAAC,KAMJ;CACT,OAAO;EACL,GAAG;EACH,GAAG,QAAQ,KAAK,WAAW;GACzB,MAAM,WAAW,UAAU,OAAO;GAElC,IAAI,aAAa,KAAA,GACf,OAAO,GAAG,KAAK,IAAI,iBAAiB,MAAM,GAAG,KAAK,IAAI,iBAAiB,MAAM,GAAG,QAAQ,CAAC,EAAE;GAG7F,OAAO,iBAAiB,OAAO,KAAK;EACtC,CAAC;EACD,GAAG;CACL,EAAE,KAAK,GAAG;AACZ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'react';
|
|
2
|
-
import { SizableColumn } from './column-sizing';
|
|
2
|
+
import { SizableColumn } from './column-sizing.js';
|
|
3
3
|
type ResizeHandleProps = HTMLAttributes<HTMLDivElement> & {
|
|
4
4
|
"aria-label": string;
|
|
5
5
|
"aria-orientation": "vertical";
|
|
@@ -21,6 +21,7 @@ export declare function useColumnResizing({ columnGapPx, columns, enabled, leadi
|
|
|
21
21
|
getResizeHandleProps: (column: SizableColumn) => ResizeHandleProps;
|
|
22
22
|
gridTemplateColumns: string;
|
|
23
23
|
hasOverrides: boolean;
|
|
24
|
+
resizeRootRef: import('react').RefObject<HTMLDivElement | null>;
|
|
24
25
|
resetColumns: () => void;
|
|
25
26
|
resetColumnWidth: (column: SizableColumn) => void;
|
|
26
27
|
};
|
|
@@ -1,49 +1,57 @@
|
|
|
1
1
|
import { buildColumnGridTemplate, defaultColumnWidthPx, maxColumnWidthPx, minColumnWidthPx } from "./column-sizing.js";
|
|
2
2
|
import { useCallback, useMemo, useRef, useState } from "react";
|
|
3
|
-
//#region resources/js/core/use-column-resizing.ts
|
|
3
|
+
//#region resources/js/core/hooks/use-column-resizing.ts
|
|
4
4
|
var emptyTracks = [];
|
|
5
5
|
function useColumnResizing({ columnGapPx = 0, columns, enabled, leadingTracks = emptyTracks, showIndicator = false, storageKey, trailingTracks = emptyTracks }) {
|
|
6
6
|
const columnKeys = useMemo(() => columns.map((column) => column.key), [columns]);
|
|
7
7
|
const [overrides, setOverrides] = useState(() => readStoredOverrides(storageKey, columns));
|
|
8
8
|
const overridesRef = useRef(overrides);
|
|
9
9
|
const drag = useRef(null);
|
|
10
|
-
const
|
|
10
|
+
const resizeRootRef = useRef(null);
|
|
11
|
+
const templateForOverrides = useCallback((nextOverrides) => buildColumnGridTemplate({
|
|
11
12
|
columns,
|
|
12
13
|
leadingTracks,
|
|
13
14
|
trailingTracks,
|
|
14
|
-
overrides: enabled ?
|
|
15
|
+
overrides: enabled ? nextOverrides : {}
|
|
15
16
|
}), [
|
|
16
17
|
columns,
|
|
17
18
|
enabled,
|
|
18
19
|
leadingTracks,
|
|
19
|
-
overrides,
|
|
20
20
|
trailingTracks
|
|
21
21
|
]);
|
|
22
|
+
const gridTemplateColumns = useMemo(() => templateForOverrides(overrides), [overrides, templateForOverrides]);
|
|
23
|
+
const applyTemplate = useCallback((template) => {
|
|
24
|
+
const root = resizeRootRef.current;
|
|
25
|
+
if (!root) return;
|
|
26
|
+
root.style.gridTemplateColumns = template;
|
|
27
|
+
root.style.setProperty("--lattice-table-columns", template);
|
|
28
|
+
}, []);
|
|
29
|
+
const commitOverrides = useCallback((next) => {
|
|
30
|
+
overridesRef.current = next;
|
|
31
|
+
setOverrides(next);
|
|
32
|
+
writeStoredOverrides(storageKey, columnKeys, next);
|
|
33
|
+
applyTemplate(templateForOverrides(next));
|
|
34
|
+
}, [
|
|
35
|
+
applyTemplate,
|
|
36
|
+
columnKeys,
|
|
37
|
+
storageKey,
|
|
38
|
+
templateForOverrides
|
|
39
|
+
]);
|
|
40
|
+
const overridesWithColumnWidth = useCallback((current, column, width, maxWidth) => ({
|
|
41
|
+
...current,
|
|
42
|
+
[column.key]: Math.min(maxWidth ?? maxColumnWidthPx(column), Math.max(minColumnWidthPx(column), width))
|
|
43
|
+
}), []);
|
|
22
44
|
const setColumnWidth = useCallback((column, width, maxWidth) => {
|
|
23
|
-
|
|
24
|
-
|
|
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]);
|
|
45
|
+
commitOverrides(overridesWithColumnWidth(overridesRef.current, column, width, maxWidth));
|
|
46
|
+
}, [commitOverrides, overridesWithColumnWidth]);
|
|
33
47
|
const resetColumnWidth = useCallback((column) => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
writeStoredOverrides(storageKey, columnKeys, next);
|
|
39
|
-
return next;
|
|
40
|
-
});
|
|
41
|
-
}, [columnKeys, storageKey]);
|
|
48
|
+
const next = { ...overridesRef.current };
|
|
49
|
+
delete next[column.key];
|
|
50
|
+
commitOverrides(next);
|
|
51
|
+
}, [commitOverrides]);
|
|
42
52
|
const resetColumns = useCallback(() => {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
writeStoredOverrides(storageKey, columnKeys, {});
|
|
46
|
-
}, [columnKeys, storageKey]);
|
|
53
|
+
commitOverrides({});
|
|
54
|
+
}, [commitOverrides]);
|
|
47
55
|
const hasOverrides = enabled && Object.values(overrides).some((width) => typeof width === "number");
|
|
48
56
|
const currentColumnWidth = useCallback((column) => overridesRef.current[column.key] ?? defaultColumnWidthPx(column), []);
|
|
49
57
|
return {
|
|
@@ -57,11 +65,18 @@ function useColumnResizing({ columnGapPx = 0, columns, enabled, leadingTracks =
|
|
|
57
65
|
column,
|
|
58
66
|
columnGapPx,
|
|
59
67
|
columns,
|
|
60
|
-
grid: handle.parentElement?.parentElement,
|
|
68
|
+
grid: resizeRootRef.current ?? handle.parentElement?.parentElement,
|
|
61
69
|
leadingTracks,
|
|
62
70
|
trailingTracks
|
|
63
71
|
});
|
|
64
72
|
const resizeBy = (handle, delta) => setColumnWidth(column, current + delta, maxWidthForHandle(handle));
|
|
73
|
+
const finishDrag = (event, releaseCapture) => {
|
|
74
|
+
const active = drag.current;
|
|
75
|
+
if (active?.key !== column.key) return;
|
|
76
|
+
drag.current = null;
|
|
77
|
+
if (active.overrides !== null) commitOverrides(active.overrides);
|
|
78
|
+
if (releaseCapture) event.currentTarget.releasePointerCapture?.(event.pointerId);
|
|
79
|
+
};
|
|
65
80
|
return {
|
|
66
81
|
"aria-label": `Resize ${label}`,
|
|
67
82
|
"aria-orientation": "vertical",
|
|
@@ -101,6 +116,7 @@ function useColumnResizing({ columnGapPx = 0, columns, enabled, leadingTracks =
|
|
|
101
116
|
drag.current = {
|
|
102
117
|
key: column.key,
|
|
103
118
|
maxWidth: maxWidthForHandle(event.currentTarget),
|
|
119
|
+
overrides: null,
|
|
104
120
|
startWidth: parentWidth > 0 ? parentWidth : current,
|
|
105
121
|
startX: event.clientX
|
|
106
122
|
};
|
|
@@ -110,12 +126,19 @@ function useColumnResizing({ columnGapPx = 0, columns, enabled, leadingTracks =
|
|
|
110
126
|
onPointerMove: (event) => {
|
|
111
127
|
const active = drag.current;
|
|
112
128
|
if (!enabled || active?.key !== column.key) return;
|
|
113
|
-
|
|
129
|
+
const next = overridesWithColumnWidth(overridesRef.current, column, active.startWidth + event.clientX - active.startX, active.maxWidth);
|
|
130
|
+
active.overrides = next;
|
|
131
|
+
overridesRef.current = next;
|
|
132
|
+
applyTemplate(templateForOverrides(next));
|
|
114
133
|
},
|
|
115
134
|
onPointerUp: (event) => {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
135
|
+
finishDrag(event, true);
|
|
136
|
+
},
|
|
137
|
+
onPointerCancel: (event) => {
|
|
138
|
+
finishDrag(event, true);
|
|
139
|
+
},
|
|
140
|
+
onLostPointerCapture: (event) => {
|
|
141
|
+
finishDrag(event, false);
|
|
119
142
|
},
|
|
120
143
|
role: "separator",
|
|
121
144
|
tabIndex: 0
|
|
@@ -126,13 +149,18 @@ function useColumnResizing({ columnGapPx = 0, columns, enabled, leadingTracks =
|
|
|
126
149
|
currentColumnWidth,
|
|
127
150
|
enabled,
|
|
128
151
|
leadingTracks,
|
|
152
|
+
applyTemplate,
|
|
153
|
+
commitOverrides,
|
|
154
|
+
overridesWithColumnWidth,
|
|
129
155
|
resetColumnWidth,
|
|
130
156
|
setColumnWidth,
|
|
131
157
|
showIndicator,
|
|
158
|
+
templateForOverrides,
|
|
132
159
|
trailingTracks
|
|
133
160
|
]),
|
|
134
161
|
gridTemplateColumns,
|
|
135
162
|
hasOverrides,
|
|
163
|
+
resizeRootRef,
|
|
136
164
|
resetColumns,
|
|
137
165
|
resetColumnWidth
|
|
138
166
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-column-resizing.js","names":[],"sources":["../../../resources/js/core/hooks/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 overrides: Record<string, number | undefined> | null;\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 const resizeRootRef = useRef<HTMLDivElement | null>(null);\n\n const templateForOverrides = useCallback(\n (nextOverrides: Record<string, number | undefined>): string =>\n buildColumnGridTemplate({\n columns,\n leadingTracks,\n trailingTracks,\n overrides: enabled ? nextOverrides : {},\n }),\n [columns, enabled, leadingTracks, trailingTracks],\n );\n\n const gridTemplateColumns = useMemo(\n () => templateForOverrides(overrides),\n [overrides, templateForOverrides],\n );\n\n const applyTemplate = useCallback((template: string): void => {\n const root = resizeRootRef.current;\n\n if (!root) {\n return;\n }\n\n root.style.gridTemplateColumns = template;\n root.style.setProperty(\"--lattice-table-columns\", template);\n }, []);\n\n const commitOverrides = useCallback(\n (next: Record<string, number | undefined>) => {\n overridesRef.current = next;\n setOverrides(next);\n writeStoredOverrides(storageKey, columnKeys, next);\n applyTemplate(templateForOverrides(next));\n },\n [applyTemplate, columnKeys, storageKey, templateForOverrides],\n );\n\n const overridesWithColumnWidth = useCallback(\n (\n current: Record<string, number | undefined>,\n column: SizableColumn,\n width: number,\n maxWidth?: number,\n ): Record<string, number | undefined> => ({\n ...current,\n [column.key]: Math.min(\n maxWidth ?? maxColumnWidthPx(column),\n Math.max(minColumnWidthPx(column), width),\n ),\n }),\n [],\n );\n\n const setColumnWidth = useCallback(\n (column: SizableColumn, width: number, maxWidth?: number) => {\n commitOverrides(overridesWithColumnWidth(overridesRef.current, column, width, maxWidth));\n },\n [commitOverrides, overridesWithColumnWidth],\n );\n\n const resetColumnWidth = useCallback(\n (column: SizableColumn) => {\n const next = { ...overridesRef.current };\n delete next[column.key];\n\n commitOverrides(next);\n },\n [commitOverrides],\n );\n\n const resetColumns = useCallback(() => {\n commitOverrides({});\n }, [commitOverrides]);\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: resizeRootRef.current ?? 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 const finishDrag = (event: PointerEvent<HTMLDivElement>, releaseCapture: boolean): void => {\n const active = drag.current;\n\n if (active?.key !== column.key) {\n return;\n }\n\n drag.current = null;\n if (active.overrides !== null) {\n commitOverrides(active.overrides);\n }\n\n if (releaseCapture) {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n };\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 overrides: null,\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 const next = overridesWithColumnWidth(\n overridesRef.current,\n column,\n active.startWidth + event.clientX - active.startX,\n active.maxWidth,\n );\n\n active.overrides = next;\n overridesRef.current = next;\n applyTemplate(templateForOverrides(next));\n },\n onPointerUp: (event: PointerEvent<HTMLDivElement>) => {\n finishDrag(event, true);\n },\n onPointerCancel: (event: PointerEvent<HTMLDivElement>) => {\n finishDrag(event, true);\n },\n onLostPointerCapture: (event: PointerEvent<HTMLDivElement>) => {\n finishDrag(event, false);\n },\n role: \"separator\",\n tabIndex: 0,\n };\n },\n [\n columnGapPx,\n columns,\n currentColumnWidth,\n enabled,\n leadingTracks,\n applyTemplate,\n commitOverrides,\n overridesWithColumnWidth,\n resetColumnWidth,\n setColumnWidth,\n showIndicator,\n templateForOverrides,\n trailingTracks,\n ],\n );\n\n return {\n getResizeHandleProps,\n gridTemplateColumns,\n hasOverrides,\n resizeRootRef,\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\n if (!isStoredColumnWidths(stored)) {\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 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,13 @@
|
|
|
1
|
+
export { ApiError, apiFetch, apiJson, clearRemoteTokenCache, invalidateRemoteToken, remoteFetch, remoteJson, remoteToken, } from './api.js';
|
|
2
|
+
export type { ApiInit, BrowserToken, RemoteAccess, RemoteInit } from './api.js';
|
|
3
|
+
export { CollapsedContext, useCollapsed } from './collapsed-context.js';
|
|
4
|
+
export { LATTICE_REF_HEADER, withRefHeader } from './component-ref.js';
|
|
5
|
+
export { withHeaders } from './headers.js';
|
|
6
|
+
export { dataBindings, isRecord, materializeNode, materializeProps, materializeSchema, rowValue, } from './materialize.js';
|
|
7
|
+
export type { DataBindings, RemoteRow } from './materialize.js';
|
|
8
|
+
export { toNodes } from './nodes.js';
|
|
9
|
+
export { createPlugin, createRegistry, eagerComponent, extendRegistry, lazyComponent, } from './registry.js';
|
|
10
|
+
export type { Plugin, Registry } from './registry.js';
|
|
11
|
+
export { RegistryContext, setDefaultRegistry, useColumnRegistry, useComponentRegistry, useEffectHandlerRegistry, } from './registry-context.js';
|
|
12
|
+
export { Renderer, RenderNode } from './renderer.js';
|
|
13
|
+
export type * from './types.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createPlugin, createRegistry, eagerComponent, extendRegistry, lazyComponent } from "./registry.js";
|
|
2
|
+
import { RegistryContext, setDefaultRegistry, useColumnRegistry, useComponentRegistry, useEffectHandlerRegistry } from "./registry-context.js";
|
|
3
|
+
import { LATTICE_REF_HEADER, withRefHeader } from "./component-ref.js";
|
|
4
|
+
import { withHeaders } from "./headers.js";
|
|
5
|
+
import { CollapsedContext, useCollapsed } from "./collapsed-context.js";
|
|
6
|
+
import { RenderNode, Renderer } from "./renderer.js";
|
|
7
|
+
import { ApiError, apiFetch, apiJson, clearRemoteTokenCache, invalidateRemoteToken, remoteFetch, remoteJson, remoteToken } from "./api.js";
|
|
8
|
+
import { toNodes } from "./nodes.js";
|
|
9
|
+
import { dataBindings, isRecord, materializeNode, materializeProps, materializeSchema, rowValue } from "./materialize.js";
|
|
10
|
+
export { ApiError, CollapsedContext, LATTICE_REF_HEADER, RegistryContext, RenderNode, Renderer, apiFetch, apiJson, clearRemoteTokenCache, createPlugin, createRegistry, dataBindings, eagerComponent, extendRegistry, invalidateRemoteToken, isRecord, lazyComponent, materializeNode, materializeProps, materializeSchema, remoteFetch, remoteJson, remoteToken, rowValue, setDefaultRegistry, toNodes, useCollapsed, useColumnRegistry, useComponentRegistry, useEffectHandlerRegistry, withHeaders, withRefHeader };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Node, NodeProps, Schema } from './types.js';
|
|
2
|
+
export type RemoteRow = Record<string, unknown>;
|
|
3
|
+
export type DataBindings = Record<string, string>;
|
|
4
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
5
|
+
export declare function dataBindings(value: unknown): DataBindings;
|
|
6
|
+
export declare function rowValue(row: RemoteRow, key: string): unknown;
|
|
7
|
+
export declare function materializeProps(props: unknown, row: RemoteRow): NodeProps;
|
|
8
|
+
export declare function materializeNode(node: Node, row: RemoteRow): Node;
|
|
9
|
+
export declare function materializeSchema(schema: Schema | undefined, row: RemoteRow): Schema;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//#region resources/js/core/materialize.ts
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
function dataBindings(value) {
|
|
6
|
+
if (!isRecord(value)) return {};
|
|
7
|
+
return Object.fromEntries(Object.entries(value).filter((entry) => {
|
|
8
|
+
return typeof entry[1] === "string";
|
|
9
|
+
}));
|
|
10
|
+
}
|
|
11
|
+
function rowValue(row, key) {
|
|
12
|
+
if (key in row) return row[key];
|
|
13
|
+
return key.split(".").reduce((value, segment) => {
|
|
14
|
+
return isRecord(value) ? value[segment] : void 0;
|
|
15
|
+
}, row);
|
|
16
|
+
}
|
|
17
|
+
function materializeProps(props, row) {
|
|
18
|
+
if (!isRecord(props)) return {};
|
|
19
|
+
const { dataBindings: bindings, ...materialized } = props;
|
|
20
|
+
for (const [prop, key] of Object.entries(dataBindings(bindings))) {
|
|
21
|
+
const value = rowValue(row, key);
|
|
22
|
+
if (value !== void 0) materialized[prop] = value;
|
|
23
|
+
}
|
|
24
|
+
return materialized;
|
|
25
|
+
}
|
|
26
|
+
function materializeNode(node, row) {
|
|
27
|
+
return {
|
|
28
|
+
...node,
|
|
29
|
+
props: materializeProps(node.props, row),
|
|
30
|
+
schema: node.schema?.map((child) => materializeNode(child, row))
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function materializeSchema(schema, row) {
|
|
34
|
+
return schema?.map((node) => materializeNode(node, row)) ?? [];
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { dataBindings, isRecord, materializeNode, materializeProps, materializeSchema, rowValue };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=materialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materialize.js","names":[],"sources":["../../resources/js/core/materialize.ts"],"sourcesContent":["import type { Node, NodeProps, Schema } from \"./types\";\n\nexport type RemoteRow = Record<string, unknown>;\n\nexport type DataBindings = Record<string, string>;\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function dataBindings(value: unknown): DataBindings {\n if (!isRecord(value)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => {\n return typeof entry[1] === \"string\";\n }),\n );\n}\n\nexport function rowValue(row: RemoteRow, key: string): unknown {\n if (key in row) {\n return row[key];\n }\n\n return key.split(\".\").reduce<unknown>((value, segment) => {\n return isRecord(value) ? value[segment] : undefined;\n }, row);\n}\n\nexport function materializeProps(props: unknown, row: RemoteRow): NodeProps {\n if (!isRecord(props)) {\n return {};\n }\n\n const { dataBindings: bindings, ...materialized } = props;\n\n for (const [prop, key] of Object.entries(dataBindings(bindings))) {\n const value = rowValue(row, key);\n\n if (value !== undefined) {\n materialized[prop] = value;\n }\n }\n\n return materialized;\n}\n\nexport function materializeNode(node: Node, row: RemoteRow): Node {\n return {\n ...node,\n props: materializeProps(node.props, row),\n schema: node.schema?.map((child) => materializeNode(child, row)),\n } as Node;\n}\n\nexport function materializeSchema(schema: Schema | undefined, row: RemoteRow): Schema {\n return schema?.map((node) => materializeNode(node, row)) ?? [];\n}\n"],"mappings":";AAMA,SAAgB,SAAS,OAAkD;CACzE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAgB,aAAa,OAA8B;CACzD,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO,CAAC;CAGV,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,EAAE,QAAQ,UAAqC;EACjE,OAAO,OAAO,MAAM,OAAO;CAC7B,CAAC,CACH;AACF;AAEA,SAAgB,SAAS,KAAgB,KAAsB;CAC7D,IAAI,OAAO,KACT,OAAO,IAAI;CAGb,OAAO,IAAI,MAAM,GAAG,EAAE,QAAiB,OAAO,YAAY;EACxD,OAAO,SAAS,KAAK,IAAI,MAAM,WAAW,KAAA;CAC5C,GAAG,GAAG;AACR;AAEA,SAAgB,iBAAiB,OAAgB,KAA2B;CAC1E,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO,CAAC;CAGV,MAAM,EAAE,cAAc,UAAU,GAAG,iBAAiB;CAEpD,KAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,aAAa,QAAQ,CAAC,GAAG;EAChE,MAAM,QAAQ,SAAS,KAAK,GAAG;EAE/B,IAAI,UAAU,KAAA,GACZ,aAAa,QAAQ;CAEzB;CAEA,OAAO;AACT;AAEA,SAAgB,gBAAgB,MAAY,KAAsB;CAChE,OAAO;EACL,GAAG;EACH,OAAO,iBAAiB,KAAK,OAAO,GAAG;EACvC,QAAQ,KAAK,QAAQ,KAAK,UAAU,gBAAgB,OAAO,GAAG,CAAC;CACjE;AACF;AAEA,SAAgB,kBAAkB,QAA4B,KAAwB;CACpF,OAAO,QAAQ,KAAK,SAAS,gBAAgB,MAAM,GAAG,CAAC,KAAK,CAAC;AAC/D"}
|
package/dist/core/nodes.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ComponentRegistry, Registry } from './registry';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { ComponentRegistry, Registry } from './registry.js';
|
|
2
|
+
import { EffectHandlerRegistry } from '../effects/registry.js';
|
|
3
|
+
import { ColumnRegistry } from '../table/registry.js';
|
|
4
4
|
/**
|
|
5
5
|
* Holds the active Registry for the current Provider subtree. Extracted into
|
|
6
6
|
* its own module to break the circular reference between provider.tsx (which
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-context.js","names":[],"sources":["../../resources/js/core/registry-context.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ComponentRegistry, Registry } from \"./registry\";\nimport type {
|
|
1
|
+
{"version":3,"file":"registry-context.js","names":[],"sources":["../../resources/js/core/registry-context.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ComponentRegistry, Registry } from \"./registry\";\nimport type { EffectHandlerRegistry } from \"@lattice-php/lattice/effects/registry\";\nimport type { ColumnRegistry } from \"@lattice-php/lattice/table/registry\";\n\n/**\n * Holds the active Registry for the current Provider subtree. Extracted into\n * its own module to break the circular reference between provider.tsx (which\n * imports the default registry instance) and use-effect-dispatcher.ts (which\n * imports the context selector). Neither file imports from the other; both\n * import from here.\n *\n * The context default is null. Selectors fall back to `_defaultRegistry`,\n * which provider.tsx sets at module evaluation time (after registry.ts has\n * finished loading). This avoids a synchronous evaluation cycle while\n * preserving the pre-existing behaviour that components work without a\n * surrounding <Provider>.\n */\nexport const RegistryContext = createContext<Registry | null>(null);\n\n/**\n * Called by provider.tsx at module-evaluation time, after registry.ts finishes\n * loading. The constraint is on CALLING this setter, not on importing this\n * module: do not call setDefaultRegistry from any module that evaluates before\n * registry.ts completes. (use-effect-dispatcher.ts safely imports the selectors\n * below — that import is exactly why this module was extracted.)\n */\nlet _defaultRegistry: Registry | null = null;\n\nexport function setDefaultRegistry(registry: Registry): void {\n _defaultRegistry = registry;\n}\n\nexport function useComponentRegistry(): ComponentRegistry {\n const registry = useContext(RegistryContext) ?? _defaultRegistry;\n return registry?.components ?? {};\n}\n\nexport function useColumnRegistry(): ColumnRegistry {\n const registry = useContext(RegistryContext) ?? _defaultRegistry;\n return registry?.columns ?? {};\n}\n\nexport function useEffectHandlerRegistry(): EffectHandlerRegistry {\n const registry = useContext(RegistryContext) ?? _defaultRegistry;\n return registry?.effects ?? {};\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,IAAa,kBAAkB,cAA+B,IAAI;;;;;;;;AASlE,IAAI,mBAAoC;AAExC,SAAgB,mBAAmB,UAA0B;CAC3D,mBAAmB;AACrB;AAEA,SAAgB,uBAA0C;CAExD,QADiB,WAAW,eAAe,KAAK,mBAC/B,cAAc,CAAC;AAClC;AAEA,SAAgB,oBAAoC;CAElD,QADiB,WAAW,eAAe,KAAK,mBAC/B,WAAW,CAAC;AAC/B;AAEA,SAAgB,2BAAkD;CAEhE,QADiB,WAAW,eAAe,KAAK,mBAC/B,WAAW,CAAC;AAC/B"}
|