@lattice-php/lattice 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/action/components/action-form.d.ts +24 -0
- package/dist/action/components/action-form.js +238 -0
- package/dist/action/components/action-form.js.map +1 -0
- package/dist/action/components/action-group.d.ts +1 -8
- package/dist/action/components/action-group.js +34 -64
- package/dist/action/components/action-group.js.map +1 -1
- package/dist/action/components/action-menu-context.d.ts +6 -0
- package/dist/action/components/action-menu-context.js +18 -0
- package/dist/action/components/action-menu-context.js.map +1 -0
- package/dist/action/components/action.d.ts +1 -24
- package/dist/action/components/action.js +73 -51
- package/dist/action/components/action.js.map +1 -1
- package/dist/action/index.d.ts +1 -1
- package/dist/action/index.js.map +1 -1
- package/dist/appearance/index.js +7 -2
- package/dist/appearance/index.js.map +1 -1
- package/dist/chat/components/chat-box.d.ts +3 -0
- package/dist/chat/components/chat-box.js +53 -0
- package/dist/chat/components/chat-box.js.map +1 -0
- package/dist/chat/components/message-list.d.ts +5 -0
- package/dist/chat/components/message-list.js +22 -0
- package/dist/chat/components/message-list.js.map +1 -0
- package/dist/chat/components/message.d.ts +5 -0
- package/dist/chat/components/message.js +20 -0
- package/dist/chat/components/message.js.map +1 -0
- package/dist/chat/components/prompt-input.d.ts +8 -0
- package/dist/chat/components/prompt-input.js +49 -0
- package/dist/chat/components/prompt-input.js.map +1 -0
- package/dist/chat/index.d.ts +1 -0
- package/dist/chat/index.js +15 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/parts/text.d.ts +3 -0
- package/dist/chat/parts/text.js +12 -0
- package/dist/chat/parts/text.js.map +1 -0
- package/dist/chat/parts/tool-call.d.ts +3 -0
- package/dist/chat/parts/tool-call.js +20 -0
- package/dist/chat/parts/tool-call.js.map +1 -0
- package/dist/chat/transport.d.ts +2 -0
- package/dist/chat/transport.js +47 -0
- package/dist/chat/transport.js.map +1 -0
- package/dist/chat/types.d.ts +39 -0
- package/dist/chat/use-chat.d.ts +15 -0
- package/dist/chat/use-chat.js +161 -0
- package/dist/chat/use-chat.js.map +1 -0
- package/dist/core/api.d.ts +18 -0
- package/dist/core/api.js +51 -0
- package/dist/core/api.js.map +1 -0
- package/dist/core/collapsed-context.d.ts +2 -0
- package/dist/core/collapsed-context.js +10 -0
- package/dist/core/collapsed-context.js.map +1 -0
- package/dist/core/column-sizing.d.ts +17 -0
- package/dist/core/column-sizing.js +61 -0
- package/dist/core/column-sizing.js.map +1 -0
- package/dist/core/components/badge.d.ts +1 -8
- package/dist/core/components/badge.js +2 -3
- package/dist/core/components/badge.js.map +1 -1
- package/dist/core/components/button.d.ts +5 -13
- package/dist/core/components/button.js +10 -9
- package/dist/core/components/button.js.map +1 -1
- package/dist/core/components/card.d.ts +1 -9
- package/dist/core/components/card.js +1 -3
- package/dist/core/components/card.js.map +1 -1
- package/dist/core/components/chart.d.ts +3 -0
- package/dist/core/components/chart.js +175 -0
- package/dist/core/components/chart.js.map +1 -0
- package/dist/{form/components/base → core/components}/checkbox.js +7 -4
- package/dist/core/components/checkbox.js.map +1 -0
- package/dist/core/components/combobox.d.ts +33 -0
- package/dist/core/components/combobox.js +99 -0
- package/dist/core/components/combobox.js.map +1 -0
- package/dist/core/components/confirm-dialog.d.ts +2 -3
- package/dist/core/components/confirm-dialog.js +17 -17
- package/dist/core/components/confirm-dialog.js.map +1 -1
- package/dist/core/components/control.d.ts +13 -0
- package/dist/core/components/control.js +27 -0
- package/dist/core/components/control.js.map +1 -0
- package/dist/core/components/dialog.d.ts +19 -0
- package/dist/core/components/dialog.js +75 -0
- package/dist/core/components/dialog.js.map +1 -0
- package/dist/core/components/dropdown-menu.d.ts +14 -0
- package/dist/core/components/dropdown-menu.js +42 -0
- package/dist/core/components/dropdown-menu.js.map +1 -0
- package/dist/core/components/floating-panel.d.ts +3 -0
- package/dist/core/components/floating-panel.js +65 -0
- package/dist/core/components/floating-panel.js.map +1 -0
- package/dist/core/components/fragment.d.ts +1 -10
- package/dist/core/components/fragment.js +29 -18
- package/dist/core/components/fragment.js.map +1 -1
- package/dist/core/components/grid.d.ts +1 -8
- package/dist/core/components/grid.js +1 -2
- package/dist/core/components/grid.js.map +1 -1
- package/dist/core/components/heading.d.ts +1 -9
- package/dist/core/components/heading.js +2 -3
- package/dist/core/components/heading.js.map +1 -1
- package/dist/core/components/icon.d.ts +3 -0
- package/dist/core/components/icon.js +31 -0
- package/dist/core/components/icon.js.map +1 -0
- package/dist/core/components/index.d.ts +1 -1
- package/dist/core/components/index.js +12 -1
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/info-tooltip.d.ts +3 -0
- package/dist/core/components/info-tooltip.js +26 -0
- package/dist/core/components/info-tooltip.js.map +1 -0
- package/dist/core/components/link.d.ts +1 -12
- package/dist/core/components/link.js +12 -11
- package/dist/core/components/link.js.map +1 -1
- package/dist/core/components/modal.d.ts +1 -11
- package/dist/core/components/modal.js +16 -42
- package/dist/core/components/modal.js.map +1 -1
- package/dist/core/components/popover.d.ts +8 -0
- package/dist/core/components/popover.js +37 -0
- package/dist/core/components/popover.js.map +1 -0
- package/dist/core/components/raw-block.d.ts +3 -0
- package/dist/core/components/raw-block.js +10 -0
- package/dist/core/components/raw-block.js.map +1 -0
- package/dist/core/components/section.d.ts +3 -0
- package/dist/core/components/section.js +75 -0
- package/dist/core/components/section.js.map +1 -0
- package/dist/core/components/segmented-control.d.ts +1 -14
- package/dist/core/components/segmented-control.js +4 -7
- package/dist/core/components/segmented-control.js.map +1 -1
- package/dist/core/components/segmented-pills.d.ts +4 -2
- package/dist/core/components/segmented-pills.js +10 -1
- package/dist/core/components/segmented-pills.js.map +1 -1
- package/dist/core/components/skeleton.d.ts +3 -0
- package/dist/core/components/skeleton.js +16 -0
- package/dist/core/components/skeleton.js.map +1 -0
- package/dist/core/components/spinner.js +8 -4
- package/dist/core/components/spinner.js.map +1 -1
- package/dist/core/components/stack.d.ts +1 -11
- package/dist/core/components/stack.js +24 -13
- package/dist/core/components/stack.js.map +1 -1
- package/dist/core/components/tabs.d.ts +1 -19
- package/dist/core/components/tabs.js +45 -21
- package/dist/core/components/tabs.js.map +1 -1
- package/dist/core/components/text.d.ts +1 -9
- package/dist/core/components/text.js +18 -3
- package/dist/core/components/text.js.map +1 -1
- package/dist/core/headers.d.ts +1 -0
- package/dist/core/headers.js +14 -0
- package/dist/core/headers.js.map +1 -0
- package/dist/core/registry-context.d.ts +21 -0
- package/dist/core/registry-context.js +40 -0
- package/dist/core/registry-context.js.map +1 -0
- package/dist/core/registry.d.ts +12 -3
- package/dist/core/registry.js +30 -5
- package/dist/core/registry.js.map +1 -1
- package/dist/core/renderer.d.ts +8 -14
- package/dist/core/renderer.js +20 -36
- package/dist/core/renderer.js.map +1 -1
- package/dist/core/test-id.d.ts +8 -0
- package/dist/core/test-id.js +21 -0
- package/dist/core/test-id.js.map +1 -0
- package/dist/core/types.d.ts +68 -26
- package/dist/core/use-column-resizing.d.ts +27 -0
- package/dist/core/use-column-resizing.js +228 -0
- package/dist/core/use-column-resizing.js.map +1 -0
- package/dist/effects/dispatch.d.ts +20 -0
- package/dist/effects/dispatch.js +39 -0
- package/dist/effects/dispatch.js.map +1 -0
- package/dist/effects/registry.d.ts +38 -0
- package/dist/effects/registry.js +51 -0
- package/dist/effects/registry.js.map +1 -0
- package/dist/effects/use-effect-dispatcher.d.ts +8 -0
- package/dist/effects/use-effect-dispatcher.js +20 -0
- package/dist/effects/use-effect-dispatcher.js.map +1 -0
- package/dist/effects/use-flash-effects.d.ts +5 -0
- package/dist/effects/use-flash-effects.js +22 -0
- package/dist/effects/use-flash-effects.js.map +1 -0
- package/dist/events/event-bridge.d.ts +3 -7
- package/dist/events/event-bridge.js +17 -47
- package/dist/events/event-bridge.js.map +1 -1
- package/dist/events/event-names.d.ts +3 -1
- package/dist/events/event-names.js +3 -1
- package/dist/events/event-names.js.map +1 -1
- package/dist/form/components/base/field.d.ts +3 -1
- package/dist/form/components/base/field.js +21 -2
- package/dist/form/components/base/field.js.map +1 -1
- package/dist/form/components/base/input-error.js +1 -1
- package/dist/form/components/base/input-error.js.map +1 -1
- package/dist/form/components/base/input.js +2 -1
- package/dist/form/components/base/input.js.map +1 -1
- package/dist/form/components/base/label.js.map +1 -1
- package/dist/form/components/base/password-input.js +9 -2
- package/dist/form/components/base/password-input.js.map +1 -1
- package/dist/form/components/base/submit-button.d.ts +4 -4
- package/dist/form/components/base/submit-button.js +5 -3
- package/dist/form/components/base/submit-button.js.map +1 -1
- package/dist/form/components/base/textarea.js +2 -1
- package/dist/form/components/base/textarea.js.map +1 -1
- package/dist/form/components/conditions.d.ts +6 -9
- package/dist/form/components/conditions.js +10 -2
- package/dist/form/components/conditions.js.map +1 -1
- package/dist/form/components/context.d.ts +1 -4
- package/dist/form/components/context.js +2 -5
- package/dist/form/components/context.js.map +1 -1
- package/dist/form/components/field-props.d.ts +28 -0
- package/dist/form/components/field-props.js +15 -0
- package/dist/form/components/field-props.js.map +1 -0
- package/dist/form/components/field-scope.d.ts +21 -0
- package/dist/form/components/field-scope.js +54 -0
- package/dist/form/components/field-scope.js.map +1 -0
- package/dist/form/components/fields/block-add-menu.d.ts +9 -0
- package/dist/form/components/fields/block-add-menu.js +27 -0
- package/dist/form/components/fields/block-add-menu.js.map +1 -0
- package/dist/form/components/fields/builder.d.ts +2 -0
- package/dist/form/components/fields/builder.js +124 -0
- package/dist/form/components/fields/builder.js.map +1 -0
- package/dist/form/components/fields/checkbox.d.ts +2 -16
- package/dist/form/components/fields/checkbox.js +28 -30
- package/dist/form/components/fields/checkbox.js.map +1 -1
- package/dist/form/components/fields/choice.d.ts +2 -14
- package/dist/form/components/fields/choice.js +14 -20
- package/dist/form/components/fields/choice.js.map +1 -1
- package/dist/form/components/fields/date-input.d.ts +2 -20
- package/dist/form/components/fields/date-input.js +12 -16
- package/dist/form/components/fields/date-input.js.map +1 -1
- package/dist/form/components/fields/file-upload.d.ts +2 -0
- package/dist/form/components/fields/file-upload.js +250 -0
- package/dist/form/components/fields/file-upload.js.map +1 -0
- package/dist/form/components/fields/hidden-input.d.ts +2 -10
- package/dist/form/components/fields/hidden-input.js +11 -6
- package/dist/form/components/fields/hidden-input.js.map +1 -1
- package/dist/form/components/fields/number-input.d.ts +2 -23
- package/dist/form/components/fields/number-input.js +40 -41
- package/dist/form/components/fields/number-input.js.map +1 -1
- package/dist/form/components/fields/password-input.d.ts +2 -29
- package/dist/form/components/fields/password-input.js +41 -41
- package/dist/form/components/fields/password-input.js.map +1 -1
- package/dist/form/components/fields/repeater-rows.d.ts +12 -0
- package/dist/form/components/fields/repeater-rows.js +46 -0
- package/dist/form/components/fields/repeater-rows.js.map +1 -0
- package/dist/form/components/fields/repeater.d.ts +2 -0
- package/dist/form/components/fields/repeater.js +97 -0
- package/dist/form/components/fields/repeater.js.map +1 -0
- package/dist/form/components/fields/rich-editor.d.ts +2 -17
- package/dist/form/components/fields/rich-editor.js +90 -52
- package/dist/form/components/fields/rich-editor.js.map +1 -1
- package/dist/form/components/fields/row-action-menu.d.ts +17 -0
- package/dist/form/components/fields/row-action-menu.js +61 -0
- package/dist/form/components/fields/row-action-menu.js.map +1 -0
- package/dist/form/components/fields/row-actions.d.ts +10 -0
- package/dist/form/components/fields/row-actions.js +45 -0
- package/dist/form/components/fields/row-actions.js.map +1 -0
- package/dist/form/components/fields/row-item.d.ts +27 -0
- package/dist/form/components/fields/row-item.js +69 -0
- package/dist/form/components/fields/row-item.js.map +1 -0
- package/dist/form/components/fields/select.d.ts +2 -23
- package/dist/form/components/fields/select.js +97 -121
- package/dist/form/components/fields/select.js.map +1 -1
- package/dist/form/components/fields/simple-field.d.ts +9 -0
- package/dist/form/components/fields/simple-field.js +23 -0
- package/dist/form/components/fields/simple-field.js.map +1 -0
- package/dist/form/components/fields/table-rows.d.ts +32 -0
- package/dist/form/components/fields/table-rows.js +188 -0
- package/dist/form/components/fields/table-rows.js.map +1 -0
- package/dist/form/components/fields/text-input.d.ts +2 -21
- package/dist/form/components/fields/text-input.js +13 -17
- package/dist/form/components/fields/text-input.js.map +1 -1
- package/dist/form/components/fields/textarea.d.ts +2 -20
- package/dist/form/components/fields/textarea.js +12 -16
- package/dist/form/components/fields/textarea.js.map +1 -1
- package/dist/form/components/fields/use-flip-reorder.d.ts +6 -0
- package/dist/form/components/fields/use-flip-reorder.js +51 -0
- package/dist/form/components/fields/use-flip-reorder.js.map +1 -0
- package/dist/form/components/fields/use-row-collection.d.ts +11 -0
- package/dist/form/components/fields/use-row-collection.js +44 -0
- package/dist/form/components/fields/use-row-collection.js.map +1 -0
- package/dist/form/components/form-path.d.ts +5 -0
- package/dist/form/components/form-path.js +40 -0
- package/dist/form/components/form-path.js.map +1 -0
- package/dist/form/components/form-transport.d.ts +3 -4
- package/dist/form/components/form-transport.js +17 -18
- package/dist/form/components/form-transport.js.map +1 -1
- package/dist/form/components/form.d.ts +1 -20
- package/dist/form/components/form.js +47 -48
- package/dist/form/components/form.js.map +1 -1
- package/dist/form/components/index.d.ts +3 -1
- package/dist/form/components/index.js +4 -2
- package/dist/form/components/override-keys.d.ts +2 -0
- package/dist/form/components/override-keys.js +12 -0
- package/dist/form/components/override-keys.js.map +1 -0
- package/dist/form/components/prefill-context.d.ts +5 -0
- package/dist/form/components/prefill-context.js +11 -0
- package/dist/form/components/prefill-context.js.map +1 -0
- package/dist/form/components/prefill-targets.d.ts +17 -0
- package/dist/form/components/prefill-targets.js +73 -0
- package/dist/form/components/prefill-targets.js.map +1 -0
- package/dist/form/components/resolved-nodes.d.ts +1 -1
- package/dist/form/components/resolved-nodes.js +6 -3
- package/dist/form/components/resolved-nodes.js.map +1 -1
- package/dist/form/components/row-layout-context.d.ts +5 -0
- package/dist/form/components/row-layout-context.js +18 -0
- package/dist/form/components/row-layout-context.js.map +1 -0
- package/dist/form/components/types.d.ts +1 -0
- package/dist/form/components/use-controlled-field.d.ts +5 -9
- package/dist/form/components/use-controlled-field.js +17 -13
- package/dist/form/components/use-controlled-field.js.map +1 -1
- package/dist/form/components/use-dependent-field.d.ts +1 -1
- package/dist/form/components/use-dependent-field.js +14 -8
- package/dist/form/components/use-dependent-field.js.map +1 -1
- package/dist/form/components/use-field-commit.d.ts +4 -0
- package/dist/form/components/use-field-commit.js +21 -7
- package/dist/form/components/use-field-commit.js.map +1 -1
- package/dist/form/components/use-form-resolver.d.ts +7 -2
- package/dist/form/components/use-form-resolver.js +57 -17
- package/dist/form/components/use-form-resolver.js.map +1 -1
- package/dist/form/components/use-seed-default.d.ts +5 -0
- package/dist/form/components/use-seed-default.js +28 -0
- package/dist/form/components/use-seed-default.js.map +1 -0
- package/dist/form/components/values.js +20 -5
- package/dist/form/components/values.js.map +1 -1
- package/dist/form/index.d.ts +1 -1
- package/dist/form/index.js +13 -11
- package/dist/form/index.js.map +1 -1
- package/dist/form/skeleton.d.ts +1 -1
- package/dist/form/skeleton.js +5 -4
- package/dist/form/skeleton.js.map +1 -1
- package/dist/i18n/backend.d.ts +26 -0
- package/dist/i18n/backend.js +54 -0
- package/dist/i18n/backend.js.map +1 -0
- package/dist/i18n/config.d.ts +6 -0
- package/dist/i18n/config.js +36 -0
- package/dist/i18n/config.js.map +1 -0
- package/dist/i18n/index.d.ts +9 -0
- package/dist/i18n/index.js +7 -0
- package/dist/i18n/instance.d.ts +27 -0
- package/dist/i18n/instance.js +95 -0
- package/dist/i18n/instance.js.map +1 -0
- package/dist/i18n/locale-reload.d.ts +3 -0
- package/dist/i18n/locale-reload.js +17 -0
- package/dist/i18n/locale-reload.js.map +1 -0
- package/dist/i18n/locale-switcher.d.ts +21 -0
- package/dist/i18n/locale-switcher.js +25 -0
- package/dist/i18n/locale-switcher.js.map +1 -0
- package/dist/i18n/locale.d.ts +9 -0
- package/dist/i18n/locale.js +93 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/page-props.d.ts +3 -0
- package/dist/i18n/page-props.js +24 -0
- package/dist/i18n/page-props.js.map +1 -0
- package/dist/icons/icon-renderer.js +30 -5
- package/dist/icons/icon-renderer.js.map +1 -1
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.js +2 -1
- package/dist/icons/sprite.d.ts +30 -0
- package/dist/icons/sprite.js +40 -0
- package/dist/icons/sprite.js.map +1 -0
- package/dist/index.d.ts +23 -9
- package/dist/index.js +22 -7
- package/dist/inertia.d.ts +3 -7
- package/dist/inertia.js +13 -10
- package/dist/inertia.js.map +1 -1
- package/dist/lattice.css +172 -15
- package/dist/layout/breadcrumbs.d.ts +3 -0
- package/dist/layout/breadcrumbs.js +34 -0
- package/dist/layout/breadcrumbs.js.map +1 -0
- package/dist/layout/callouts.d.ts +3 -0
- package/dist/layout/callouts.js +67 -0
- package/dist/layout/callouts.js.map +1 -0
- package/dist/layout/components.d.ts +1 -0
- package/dist/layout/components.js +25 -0
- package/dist/layout/components.js.map +1 -0
- package/dist/layout/context.d.ts +4 -0
- package/dist/layout/context.js +8 -0
- package/dist/layout/context.js.map +1 -0
- package/dist/layout/dropdown.d.ts +3 -0
- package/dist/layout/dropdown.js +23 -0
- package/dist/layout/dropdown.js.map +1 -0
- package/dist/layout/index.d.ts +4 -0
- package/dist/layout/index.js +6 -0
- package/dist/layout/menu-item.d.ts +3 -0
- package/dist/layout/menu-item.js +101 -0
- package/dist/layout/menu-item.js.map +1 -0
- package/dist/layout/menu.d.ts +3 -0
- package/dist/layout/menu.js +13 -0
- package/dist/layout/menu.js.map +1 -0
- package/dist/layout/outlet.d.ts +6 -0
- package/dist/layout/outlet.js +14 -0
- package/dist/layout/outlet.js.map +1 -0
- package/dist/layout/popover.d.ts +17 -0
- package/dist/layout/popover.js +46 -0
- package/dist/layout/popover.js.map +1 -0
- package/dist/layout/schema-layout.d.ts +10 -0
- package/dist/layout/schema-layout.js +23 -0
- package/dist/layout/schema-layout.js.map +1 -0
- package/dist/layout/sidebar.d.ts +3 -0
- package/dist/layout/sidebar.js +48 -0
- package/dist/layout/sidebar.js.map +1 -0
- package/dist/lib/utils.d.ts +0 -2
- package/dist/lib/utils.js +1 -4
- package/dist/lib/utils.js.map +1 -1
- package/dist/page.d.ts +1 -1
- package/dist/page.js +4 -10
- package/dist/page.js.map +1 -1
- package/dist/provider.d.ts +7 -4
- package/dist/provider.js +15 -11
- package/dist/provider.js.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.js +3 -1
- package/dist/registry.js.map +1 -1
- package/dist/svg-sprite-client/index.d.ts +1 -0
- package/dist/svg-sprite-client/index.js +0 -0
- package/dist/svg-sprite-client.d.ts +1 -0
- package/dist/table/align.d.ts +4 -0
- package/dist/table/align.js +23 -0
- package/dist/table/align.js.map +1 -0
- package/dist/table/bulk.d.ts +6 -10
- package/dist/table/bulk.js +13 -35
- package/dist/table/bulk.js.map +1 -1
- package/dist/table/components/bulk-bar.js +40 -6
- package/dist/table/components/bulk-bar.js.map +1 -1
- package/dist/table/components/cells/badge-cell.d.ts +2 -0
- package/dist/table/components/cells/badge-cell.js +16 -0
- package/dist/table/components/cells/badge-cell.js.map +1 -0
- package/dist/table/components/cells/boolean-cell.d.ts +3 -0
- package/dist/table/components/cells/boolean-cell.js +23 -0
- package/dist/table/components/cells/boolean-cell.js.map +1 -0
- package/dist/table/components/cells/icon-cell.d.ts +2 -0
- package/dist/table/components/cells/icon-cell.js +21 -0
- package/dist/table/components/cells/icon-cell.js.map +1 -0
- package/dist/table/components/cells/image-cell.d.ts +2 -0
- package/dist/table/components/cells/image-cell.js +23 -0
- package/dist/table/components/cells/image-cell.js.map +1 -0
- package/dist/table/components/cells/money-cell.d.ts +2 -0
- package/dist/table/components/cells/money-cell.js +28 -0
- package/dist/table/components/cells/money-cell.js.map +1 -0
- package/dist/table/components/cells/number-cell.d.ts +2 -0
- package/dist/table/components/cells/number-cell.js +25 -0
- package/dist/table/components/cells/number-cell.js.map +1 -0
- package/dist/table/components/cells/numeric.d.ts +2 -0
- package/dist/table/components/cells/numeric.js +10 -0
- package/dist/table/components/cells/numeric.js.map +1 -0
- package/dist/table/components/cells/stack-cell.d.ts +3 -0
- package/dist/table/components/cells/stack-cell.js +17 -0
- package/dist/table/components/cells/stack-cell.js.map +1 -0
- package/dist/table/components/cells/text-cell.d.ts +2 -0
- package/dist/table/components/cells/text-cell.js +49 -0
- package/dist/table/components/cells/text-cell.js.map +1 -0
- package/dist/table/components/column-filter-control.d.ts +3 -1
- package/dist/table/components/column-filter-control.js +125 -100
- package/dist/table/components/column-filter-control.js.map +1 -1
- package/dist/table/components/column-header.d.ts +3 -1
- package/dist/table/components/column-header.js +28 -14
- package/dist/table/components/column-header.js.map +1 -1
- package/dist/table/components/filter-bar.d.ts +15 -0
- package/dist/table/components/filter-bar.js +81 -0
- package/dist/table/components/filter-bar.js.map +1 -0
- package/dist/table/components/filter-controls.d.ts +18 -0
- package/dist/table/components/filter-controls.js +256 -0
- package/dist/table/components/filter-controls.js.map +1 -0
- package/dist/table/components/filter-stack-bar.d.ts +2 -2
- package/dist/table/components/filter-stack-bar.js +10 -8
- package/dist/table/components/filter-stack-bar.js.map +1 -1
- package/dist/table/components/filter-value-input.d.ts +6 -3
- package/dist/table/components/filter-value-input.js +27 -17
- package/dist/table/components/filter-value-input.js.map +1 -1
- package/dist/table/components/pagination.d.ts +1 -1
- package/dist/table/components/pagination.js +20 -8
- package/dist/table/components/pagination.js.map +1 -1
- package/dist/table/components/sort-bar.d.ts +2 -2
- package/dist/table/components/sort-bar.js +12 -10
- 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.js +23 -52
- package/dist/table/components/table-cell.js.map +1 -1
- package/dist/table/components/table.d.ts +6 -2
- package/dist/table/components/table.js +198 -136
- package/dist/table/components/table.js.map +1 -1
- package/dist/table/filter-values.d.ts +13 -0
- package/dist/table/filter-values.js +30 -0
- package/dist/table/filter-values.js.map +1 -0
- package/dist/table/format.js +5 -3
- package/dist/table/format.js.map +1 -1
- package/dist/table/index.d.ts +1 -1
- package/dist/table/index.js.map +1 -1
- package/dist/table/payload.d.ts +1 -1
- package/dist/table/payload.js +24 -3
- package/dist/table/payload.js.map +1 -1
- package/dist/table/query.d.ts +10 -2
- package/dist/table/query.js +64 -11
- package/dist/table/query.js.map +1 -1
- package/dist/table/registry.d.ts +19 -0
- package/dist/table/registry.js +14 -0
- package/dist/table/registry.js.map +1 -0
- package/dist/table/types.d.ts +43 -57
- package/dist/table/use-table.d.ts +9 -5
- package/dist/table/use-table.js +66 -27
- package/dist/table/use-table.js.map +1 -1
- package/dist/toast/callout.d.ts +6 -0
- package/dist/toast/callout.js +31 -0
- package/dist/toast/callout.js.map +1 -0
- package/dist/toast/index.d.ts +5 -0
- package/dist/toast/index.js +4 -0
- package/dist/toast/toast.d.ts +14 -0
- package/dist/toast/toast.js +51 -0
- package/dist/toast/toast.js.map +1 -0
- package/dist/toast/toaster.d.ts +3 -0
- package/dist/toast/toaster.js +62 -0
- package/dist/toast/toaster.js.map +1 -0
- package/dist/toast/variant-styles.d.ts +6 -0
- package/dist/toast/variant-styles.js +37 -0
- package/dist/toast/variant-styles.js.map +1 -0
- package/dist/types/generated.d.ts +1037 -0
- package/dist/types/generated.js +0 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/vite-env.d.ts +1 -0
- package/dist/vite.d.ts +25 -0
- package/dist/vite.js +72 -0
- package/dist/vite.js.map +1 -0
- package/package.json +125 -12
- package/resources/icons/align-center.svg +17 -0
- package/resources/icons/align-justify.svg +17 -0
- package/resources/icons/align-left.svg +17 -0
- package/resources/icons/align-right.svg +17 -0
- package/resources/icons/arrow-down.svg +16 -0
- package/resources/icons/arrow-up.svg +16 -0
- package/resources/icons/bold.svg +15 -0
- package/resources/icons/check.svg +15 -0
- package/resources/icons/chevron-down.svg +15 -0
- package/resources/icons/chevron-right.svg +15 -0
- package/resources/icons/chevrons-up-down.svg +16 -0
- package/resources/icons/circle-alert.svg +17 -0
- package/resources/icons/circle-check.svg +16 -0
- package/resources/icons/circle-help.svg +17 -0
- package/resources/icons/circle-x.svg +17 -0
- package/resources/icons/code.svg +16 -0
- package/resources/icons/columns-3.svg +17 -0
- package/resources/icons/copy.svg +16 -0
- package/resources/icons/external-link.svg +17 -0
- package/resources/icons/eye-off.svg +18 -0
- package/resources/icons/eye.svg +16 -0
- package/resources/icons/filter.svg +15 -0
- package/resources/icons/heading-1.svg +18 -0
- package/resources/icons/heading-2.svg +18 -0
- package/resources/icons/heading-3.svg +19 -0
- package/resources/icons/highlighter.svg +16 -0
- package/resources/icons/info.svg +17 -0
- package/resources/icons/italic.svg +17 -0
- package/resources/icons/layout-dashboard.svg +18 -0
- package/resources/icons/link.svg +16 -0
- package/resources/icons/list-ordered.svg +20 -0
- package/resources/icons/list.svg +20 -0
- package/resources/icons/loader-2.svg +15 -0
- package/resources/icons/minus.svg +15 -0
- package/resources/icons/more-horizontal.svg +17 -0
- package/resources/icons/panel-left.svg +16 -0
- package/resources/icons/pencil-line.svg +17 -0
- package/resources/icons/pencil.svg +16 -0
- package/resources/icons/plus.svg +16 -0
- package/resources/icons/quote.svg +16 -0
- package/resources/icons/rotate-ccw.svg +16 -0
- package/resources/icons/rows-3.svg +17 -0
- package/resources/icons/search.svg +16 -0
- package/resources/icons/send.svg +16 -0
- package/resources/icons/settings.svg +16 -0
- package/resources/icons/smile.svg +18 -0
- package/resources/icons/strikethrough.svg +17 -0
- package/resources/icons/table.svg +18 -0
- package/resources/icons/trash-2.svg +19 -0
- package/resources/icons/underline.svg +16 -0
- package/resources/icons/x.svg +16 -0
- package/dist/action/effects.d.ts +0 -30
- package/dist/action/effects.js +0 -44
- package/dist/action/effects.js.map +0 -1
- package/dist/core/props.d.ts +0 -14
- package/dist/core/props.js +0 -30
- package/dist/core/props.js.map +0 -1
- package/dist/form/components/base/checkbox.js.map +0 -1
- package/dist/form/components/fields/submit-button.d.ts +0 -10
- package/dist/form/components/fields/submit-button.js +0 -14
- package/dist/form/components/fields/submit-button.js.map +0 -1
- package/dist/generated/types.d.ts +0 -17
- package/dist/icons/default-icons.d.ts +0 -3
- package/dist/icons/default-icons.js +0 -44
- package/dist/icons/default-icons.js.map +0 -1
- package/dist/icons/dynamic-lucide-renderer.d.ts +0 -2
- package/dist/icons/dynamic-lucide-renderer.js +0 -18
- package/dist/icons/dynamic-lucide-renderer.js.map +0 -1
- package/dist/menu/index.d.ts +0 -1
- package/dist/menu/index.js +0 -2
- package/dist/menu/use-menu.d.ts +0 -2
- package/dist/menu/use-menu.js +0 -9
- package/dist/menu/use-menu.js.map +0 -1
- /package/dist/{generated → chat}/types.js +0 -0
- /package/dist/{form/components/base → core/components}/checkbox.d.ts +0 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { localeHeader } from "./locale.js";
|
|
2
|
+
import { setConfig } from "./config.js";
|
|
3
|
+
import { ensureI18n, i18n, preloadLanguages } from "./instance.js";
|
|
4
|
+
import HttpBackend from "i18next-http-backend";
|
|
5
|
+
//#region resources/js/i18n/backend.ts
|
|
6
|
+
/** laravel-i18next's namespaced routes; an app behind a custom prefix overrides them via {@link BackendOptions}. */
|
|
7
|
+
var DEFAULT_LOAD_PATH = "/locales/{{lng}}/{{ns}}.json";
|
|
8
|
+
var DEFAULT_ADD_PATH = "/locales/add/{{lng}}/{{ns}}";
|
|
9
|
+
/** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */
|
|
10
|
+
async function configureI18n(config, options = {}) {
|
|
11
|
+
setConfig(config);
|
|
12
|
+
if (!config?.enabled) {
|
|
13
|
+
await ensureI18n((base) => ({
|
|
14
|
+
...base,
|
|
15
|
+
ns: options.namespaces ?? base.ns
|
|
16
|
+
}));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
await enableBackend({
|
|
20
|
+
saveMissing: config.saveMissing,
|
|
21
|
+
namespaces: options.namespaces
|
|
22
|
+
});
|
|
23
|
+
preloadLanguages(config.preloadLocales);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load translations from a backend such as bambamboole/laravel-i18next,
|
|
27
|
+
* overriding the renderer's inline English defaults. Call before the first
|
|
28
|
+
* render. Importing this module is the opt-in: apps that never call it don't
|
|
29
|
+
* bundle the HTTP backend.
|
|
30
|
+
*/
|
|
31
|
+
async function enableBackend(options = {}) {
|
|
32
|
+
const { namespaces, loadPath = DEFAULT_LOAD_PATH, addPath = DEFAULT_ADD_PATH, saveMissing = false, customHeaders } = options;
|
|
33
|
+
const customHeadersWithLocale = () => ({
|
|
34
|
+
...localeHeader(),
|
|
35
|
+
...customHeaders?.()
|
|
36
|
+
});
|
|
37
|
+
i18n.use(HttpBackend);
|
|
38
|
+
await ensureI18n((base) => ({
|
|
39
|
+
...base,
|
|
40
|
+
ns: namespaces ?? base.ns,
|
|
41
|
+
partialBundledLanguages: true,
|
|
42
|
+
saveMissing,
|
|
43
|
+
backend: {
|
|
44
|
+
loadPath,
|
|
45
|
+
addPath,
|
|
46
|
+
customHeaders: customHeadersWithLocale,
|
|
47
|
+
withCredentials: true
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { configureI18n, enableBackend };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","names":[],"sources":["../../resources/js/i18n/backend.ts"],"sourcesContent":["import type { I18nConfig } from \"@lattice-php/lattice/types/generated\";\nimport HttpBackend from \"i18next-http-backend\";\nimport { setConfig } from \"./config\";\nimport { ensureI18n, i18n, preloadLanguages } from \"./instance\";\nimport { localeHeader } from \"./locale\";\n\n/** The i18n settings the backend shares to the frontend (Inertia `lattice.i18n`). */\nexport type { I18nConfig };\n\n/** laravel-i18next's namespaced routes; an app behind a custom prefix overrides them via {@link BackendOptions}. */\nconst DEFAULT_LOAD_PATH = \"/locales/{{lng}}/{{ns}}.json\";\nconst DEFAULT_ADD_PATH = \"/locales/add/{{lng}}/{{ns}}\";\n\nexport type BackendOptions = {\n namespaces?: string[];\n /** i18next-http-backend load path. Defaults to laravel-i18next's namespaced route. */\n loadPath?: string;\n /** Path that receives keys reported by saveMissing. */\n addPath?: string;\n /** Report missing keys back to the backend (laravel-i18next persists them). */\n saveMissing?: boolean;\n /** Extra request headers, e.g. the CSRF token for the saveMissing POST. */\n customHeaders?: () => Record<string, string>;\n};\n\nexport type ConfigureI18nOptions = {\n namespaces?: string[];\n};\n/** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */\nexport async function configureI18n(\n config: I18nConfig | undefined,\n options: ConfigureI18nOptions = {},\n): Promise<void> {\n setConfig(config);\n\n if (!config?.enabled) {\n await ensureI18n((base) => ({\n ...base,\n ns: options.namespaces ?? base.ns,\n }));\n\n return;\n }\n\n await enableBackend({ saveMissing: config.saveMissing, namespaces: options.namespaces });\n\n // Fire-and-forget so warming the other locales never delays the active one.\n void preloadLanguages(config.preloadLocales);\n}\n\n/**\n * Load translations from a backend such as bambamboole/laravel-i18next,\n * overriding the renderer's inline English defaults. Call before the first\n * render. Importing this module is the opt-in: apps that never call it don't\n * bundle the HTTP backend.\n */\nexport async function enableBackend(options: BackendOptions = {}): Promise<void> {\n const {\n namespaces,\n loadPath = DEFAULT_LOAD_PATH,\n addPath = DEFAULT_ADD_PATH,\n saveMissing = false,\n customHeaders,\n } = options;\n\n const customHeadersWithLocale = (): Record<string, string> => ({\n ...localeHeader(),\n ...customHeaders?.(),\n });\n\n i18n.use(HttpBackend);\n\n await ensureI18n((base) => ({\n ...base,\n ns: namespaces ?? base.ns,\n partialBundledLanguages: true,\n saveMissing,\n backend: { loadPath, addPath, customHeaders: customHeadersWithLocale, withCredentials: true },\n }));\n}\n"],"mappings":";;;;;;AAUA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;;AAkBzB,eAAsB,cACpB,QACA,UAAgC,CAAC,GAClB;CACf,UAAU,MAAM;CAEhB,IAAI,CAAC,QAAQ,SAAS;EACpB,MAAM,YAAY,UAAU;GAC1B,GAAG;GACH,IAAI,QAAQ,cAAc,KAAK;EACjC,EAAE;EAEF;CACF;CAEA,MAAM,cAAc;EAAE,aAAa,OAAO;EAAa,YAAY,QAAQ;CAAW,CAAC;CAGvF,iBAAsB,OAAO,cAAc;AAC7C;;;;;;;AAQA,eAAsB,cAAc,UAA0B,CAAC,GAAkB;CAC/E,MAAM,EACJ,YACA,WAAW,mBACX,UAAU,kBACV,cAAc,OACd,kBACE;CAEJ,MAAM,iCAAyD;EAC7D,GAAG,aAAa;EAChB,GAAG,gBAAgB;CACrB;CAEA,KAAK,IAAI,WAAW;CAEpB,MAAM,YAAY,UAAU;EAC1B,GAAG;EACH,IAAI,cAAc,KAAK;EACvB,yBAAyB;EACzB;EACA,SAAS;GAAE;GAAU;GAAS,eAAe;GAAyB,iBAAiB;EAAK;CAC9F,EAAE;AACJ"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useSyncExternalStore } from "react";
|
|
2
|
+
//#region resources/js/i18n/config.ts
|
|
3
|
+
var fallback = { locales: [] };
|
|
4
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
5
|
+
var active = fallback;
|
|
6
|
+
function normalizeLocales(locales) {
|
|
7
|
+
return Array.from(new Set((locales ?? []).map((locale) => locale.trim()).filter(Boolean)));
|
|
8
|
+
}
|
|
9
|
+
function sameLocales(left, right) {
|
|
10
|
+
return left.length === right.length && left.every((locale, index) => locale === right[index]);
|
|
11
|
+
}
|
|
12
|
+
function snapshot() {
|
|
13
|
+
return active;
|
|
14
|
+
}
|
|
15
|
+
function subscribe(callback) {
|
|
16
|
+
listeners.add(callback);
|
|
17
|
+
return () => {
|
|
18
|
+
listeners.delete(callback);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function notify() {
|
|
22
|
+
listeners.forEach((listener) => listener());
|
|
23
|
+
}
|
|
24
|
+
function setConfig(config) {
|
|
25
|
+
const locales = normalizeLocales(config?.locales);
|
|
26
|
+
if (sameLocales(active.locales, locales)) return;
|
|
27
|
+
active = { locales };
|
|
28
|
+
notify();
|
|
29
|
+
}
|
|
30
|
+
function useConfig() {
|
|
31
|
+
return useSyncExternalStore(subscribe, snapshot, () => fallback);
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { setConfig, useConfig };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../resources/js/i18n/config.ts"],"sourcesContent":["import type { I18nConfig } from \"@lattice-php/lattice/types/generated\";\nimport { useSyncExternalStore } from \"react\";\n\nexport type Config = {\n readonly locales: readonly string[];\n};\n\nconst fallback: Config = { locales: [] };\nconst listeners = new Set<() => void>();\n\nlet active: Config = fallback;\n\nfunction normalizeLocales(locales: readonly string[] | undefined): string[] {\n return Array.from(new Set((locales ?? []).map((locale) => locale.trim()).filter(Boolean)));\n}\n\nfunction sameLocales(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((locale, index) => locale === right[index]);\n}\n\nfunction snapshot(): Config {\n return active;\n}\n\nfunction subscribe(callback: () => void): () => void {\n listeners.add(callback);\n\n return () => {\n listeners.delete(callback);\n };\n}\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nexport function setConfig(config: I18nConfig | undefined): void {\n const locales = normalizeLocales(config?.locales);\n\n if (sameLocales(active.locales, locales)) {\n return;\n }\n\n active = { locales };\n notify();\n}\n\nexport function useConfig(): Config {\n return useSyncExternalStore(subscribe, snapshot, () => fallback);\n}\n"],"mappings":";;AAOA,IAAM,WAAmB,EAAE,SAAS,CAAC,EAAE;AACvC,IAAM,4BAAY,IAAI,IAAgB;AAEtC,IAAI,SAAiB;AAErB,SAAS,iBAAiB,SAAkD;CAC1E,OAAO,MAAM,KAAK,IAAI,KAAK,WAAW,CAAC,GAAG,KAAK,WAAW,OAAO,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AAC3F;AAEA,SAAS,YAAY,MAAyB,OAAmC;CAC/E,OAAO,KAAK,WAAW,MAAM,UAAU,KAAK,OAAO,QAAQ,UAAU,WAAW,MAAM,MAAM;AAC9F;AAEA,SAAS,WAAmB;CAC1B,OAAO;AACT;AAEA,SAAS,UAAU,UAAkC;CACnD,UAAU,IAAI,QAAQ;CAEtB,aAAa;EACX,UAAU,OAAO,QAAQ;CAC3B;AACF;AAEA,SAAS,SAAe;CACtB,UAAU,SAAS,aAAa,SAAS,CAAC;AAC5C;AAEA,SAAgB,UAAU,QAAsC;CAC9D,MAAM,UAAU,iBAAiB,QAAQ,OAAO;CAEhD,IAAI,YAAY,OAAO,SAAS,OAAO,GACrC;CAGF,SAAS,EAAE,QAAQ;CACnB,OAAO;AACT;AAEA,SAAgB,YAAoB;CAClC,OAAO,qBAAqB,WAAW,gBAAgB,QAAQ;AACjE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { i18n, useT, translate } from './instance';
|
|
2
|
+
export { configureI18n, enableBackend } from './backend';
|
|
3
|
+
export { currentLocale, localeHeader, setLocale, useLocale } from './locale';
|
|
4
|
+
export { LocaleReload } from './locale-reload';
|
|
5
|
+
export { LocaleSwitcher, useLocaleOptions } from './locale-switcher';
|
|
6
|
+
export { configureI18nFromPageProps, i18nConfigFromPageProps } from './page-props';
|
|
7
|
+
export type { BackendOptions, ConfigureI18nOptions, I18nConfig } from './backend';
|
|
8
|
+
export type { LocaleOption, LocaleSwitcherProps, UseLocaleOptionsOptions, UseLocaleOptionsReturn, } from './locale-switcher';
|
|
9
|
+
export type { UseLocaleReturn } from './locale';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { currentLocale, localeHeader, setLocale, useLocale } from "./locale.js";
|
|
2
|
+
import { i18n, translate, useT } from "./instance.js";
|
|
3
|
+
import { configureI18n, enableBackend } from "./backend.js";
|
|
4
|
+
import { LocaleReload } from "./locale-reload.js";
|
|
5
|
+
import { LocaleSwitcher, useLocaleOptions } from "./locale-switcher.js";
|
|
6
|
+
import { configureI18nFromPageProps, i18nConfigFromPageProps } from "./page-props.js";
|
|
7
|
+
export { LocaleReload, LocaleSwitcher, configureI18n, configureI18nFromPageProps, currentLocale, enableBackend, i18n, i18nConfigFromPageProps, localeHeader, setLocale, translate, useLocale, useLocaleOptions, useT };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { i18n as I18nInstance, InitOptions } from 'i18next';
|
|
2
|
+
type TranslationFunction = (key: string, defaultValue?: string, options?: Record<string, unknown>) => string;
|
|
3
|
+
export type TranslationResult = {
|
|
4
|
+
t: TranslationFunction;
|
|
5
|
+
i18n: I18nInstance;
|
|
6
|
+
locale: string;
|
|
7
|
+
locales: readonly string[];
|
|
8
|
+
ready: boolean;
|
|
9
|
+
setLocale: (locale: string) => void;
|
|
10
|
+
};
|
|
11
|
+
export declare const i18n: I18nInstance;
|
|
12
|
+
/**
|
|
13
|
+
* Initialize the instance exactly once. The first caller wins — a rendered
|
|
14
|
+
* component (inline English, zero config) or `enableBackend()`, which registers
|
|
15
|
+
* its backend first because i18next can only wire a backend during `init`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function ensureI18n(extend?: (base: InitOptions) => InitOptions): Promise<unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* Eagerly load the namespaces for the given locales so a later
|
|
20
|
+
* `changeLanguage` resolves them from the store instead of an HTTP round-trip,
|
|
21
|
+
* which would otherwise flash the fallback language on switch. The active
|
|
22
|
+
* locale is already loaded by {@link ensureI18n}, so it is skipped.
|
|
23
|
+
*/
|
|
24
|
+
export declare function preloadLanguages(locales: readonly string[]): Promise<void>;
|
|
25
|
+
export declare function useT(namespace: string): TranslationResult;
|
|
26
|
+
export declare function translate(namespace: string, key: string, defaultValue: string, options?: Record<string, unknown>): string;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { currentLocale, subscribeLocale, useLocale } from "./locale.js";
|
|
2
|
+
import { useConfig } from "./config.js";
|
|
3
|
+
import { useCallback, useSyncExternalStore } from "react";
|
|
4
|
+
import i18next from "i18next";
|
|
5
|
+
//#region resources/js/i18n/instance.ts
|
|
6
|
+
var NAMESPACE = "lattice";
|
|
7
|
+
var i18n = i18next.createInstance();
|
|
8
|
+
var initialization;
|
|
9
|
+
var revision = 0;
|
|
10
|
+
function subscribe(onStoreChange) {
|
|
11
|
+
const listener = () => {
|
|
12
|
+
revision += 1;
|
|
13
|
+
onStoreChange();
|
|
14
|
+
};
|
|
15
|
+
i18n.on("initialized", listener);
|
|
16
|
+
i18n.on("loaded", listener);
|
|
17
|
+
i18n.on("languageChanged", listener);
|
|
18
|
+
i18n.store?.on("added", listener);
|
|
19
|
+
i18n.store?.on("removed", listener);
|
|
20
|
+
return () => {
|
|
21
|
+
i18n.off("initialized", listener);
|
|
22
|
+
i18n.off("loaded", listener);
|
|
23
|
+
i18n.off("languageChanged", listener);
|
|
24
|
+
i18n.store?.off("added", listener);
|
|
25
|
+
i18n.store?.off("removed", listener);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function snapshot() {
|
|
29
|
+
return revision;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Initialize the instance exactly once. The first caller wins — a rendered
|
|
33
|
+
* component (inline English, zero config) or `enableBackend()`, which registers
|
|
34
|
+
* its backend first because i18next can only wire a backend during `init`.
|
|
35
|
+
*/
|
|
36
|
+
function ensureI18n(extend) {
|
|
37
|
+
if (!initialization) {
|
|
38
|
+
const base = {
|
|
39
|
+
lng: currentLocale(),
|
|
40
|
+
fallbackLng: "en",
|
|
41
|
+
ns: [NAMESPACE],
|
|
42
|
+
defaultNS: NAMESPACE,
|
|
43
|
+
interpolation: { escapeValue: false }
|
|
44
|
+
};
|
|
45
|
+
initialization = i18n.init(extend ? extend(base) : base);
|
|
46
|
+
}
|
|
47
|
+
return initialization;
|
|
48
|
+
}
|
|
49
|
+
subscribeLocale((locale) => {
|
|
50
|
+
ensureI18n().then(() => {
|
|
51
|
+
if (i18n.language !== locale) i18n.changeLanguage(locale);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Eagerly load the namespaces for the given locales so a later
|
|
56
|
+
* `changeLanguage` resolves them from the store instead of an HTTP round-trip,
|
|
57
|
+
* which would otherwise flash the fallback language on switch. The active
|
|
58
|
+
* locale is already loaded by {@link ensureI18n}, so it is skipped.
|
|
59
|
+
*/
|
|
60
|
+
async function preloadLanguages(locales) {
|
|
61
|
+
const pending = locales.filter((locale) => locale !== currentLocale());
|
|
62
|
+
if (pending.length === 0) return;
|
|
63
|
+
await ensureI18n();
|
|
64
|
+
await i18n.loadLanguages([...pending]);
|
|
65
|
+
}
|
|
66
|
+
function useT(namespace) {
|
|
67
|
+
ensureI18n();
|
|
68
|
+
useSyncExternalStore(subscribe, snapshot, snapshot);
|
|
69
|
+
const { locales } = useConfig();
|
|
70
|
+
const { locale, setLocale } = useLocale();
|
|
71
|
+
return {
|
|
72
|
+
t: useCallback((key, defaultValue = key, options = {}) => translate(namespace, key, defaultValue, options), [namespace]),
|
|
73
|
+
i18n,
|
|
74
|
+
locale,
|
|
75
|
+
locales,
|
|
76
|
+
ready: i18n.isInitialized,
|
|
77
|
+
setLocale
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function translate(namespace, key, defaultValue, options) {
|
|
81
|
+
ensureI18n();
|
|
82
|
+
if (!i18n.isInitialized || !i18n.hasLoadedNamespace(namespace)) return i18n.t(key, defaultValue, {
|
|
83
|
+
ns: namespace,
|
|
84
|
+
...options,
|
|
85
|
+
saveMissing: false
|
|
86
|
+
});
|
|
87
|
+
return i18n.t(key, defaultValue, {
|
|
88
|
+
ns: namespace,
|
|
89
|
+
...options
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//#endregion
|
|
93
|
+
export { ensureI18n, i18n, preloadLanguages, translate, useT };
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.js","names":[],"sources":["../../resources/js/i18n/instance.ts"],"sourcesContent":["import i18next, { type i18n as I18nInstance, type InitOptions } from \"i18next\";\nimport { useCallback, useSyncExternalStore } from \"react\";\nimport { useConfig } from \"./config\";\nimport { currentLocale, subscribeLocale, useLocale } from \"./locale\";\n\nconst NAMESPACE = \"lattice\";\n\ntype TranslationFunction = (\n key: string,\n defaultValue?: string,\n options?: Record<string, unknown>,\n) => string;\n\nexport type TranslationResult = {\n t: TranslationFunction;\n i18n: I18nInstance;\n locale: string;\n locales: readonly string[];\n ready: boolean;\n setLocale: (locale: string) => void;\n};\n\nexport const i18n: I18nInstance = i18next.createInstance();\n\nlet initialization: Promise<unknown> | undefined;\nlet revision = 0;\n\nfunction subscribe(onStoreChange: () => void): () => void {\n const listener = () => {\n revision += 1;\n onStoreChange();\n };\n\n i18n.on(\"initialized\", listener);\n i18n.on(\"loaded\", listener);\n i18n.on(\"languageChanged\", listener);\n i18n.store?.on(\"added\", listener);\n i18n.store?.on(\"removed\", listener);\n\n return () => {\n i18n.off(\"initialized\", listener);\n i18n.off(\"loaded\", listener);\n i18n.off(\"languageChanged\", listener);\n i18n.store?.off(\"added\", listener);\n i18n.store?.off(\"removed\", listener);\n };\n}\n\nfunction snapshot(): number {\n return revision;\n}\n\n/**\n * Initialize the instance exactly once. The first caller wins — a rendered\n * component (inline English, zero config) or `enableBackend()`, which registers\n * its backend first because i18next can only wire a backend during `init`.\n */\nexport function ensureI18n(extend?: (base: InitOptions) => InitOptions): Promise<unknown> {\n if (!initialization) {\n const base: InitOptions = {\n lng: currentLocale(),\n fallbackLng: \"en\",\n ns: [NAMESPACE],\n defaultNS: NAMESPACE,\n interpolation: { escapeValue: false },\n };\n\n initialization = i18n.init(extend ? extend(base) : base);\n }\n\n return initialization;\n}\n\nsubscribeLocale((locale) => {\n void ensureI18n().then(() => {\n if (i18n.language !== locale) {\n void i18n.changeLanguage(locale);\n }\n });\n});\n\n/**\n * Eagerly load the namespaces for the given locales so a later\n * `changeLanguage` resolves them from the store instead of an HTTP round-trip,\n * which would otherwise flash the fallback language on switch. The active\n * locale is already loaded by {@link ensureI18n}, so it is skipped.\n */\nexport async function preloadLanguages(locales: readonly string[]): Promise<void> {\n const pending = locales.filter((locale) => locale !== currentLocale());\n\n if (pending.length === 0) {\n return;\n }\n\n await ensureI18n();\n await i18n.loadLanguages([...pending]);\n}\n\nexport function useT(namespace: string): TranslationResult {\n ensureI18n();\n useSyncExternalStore(subscribe, snapshot, snapshot);\n const { locales } = useConfig();\n const { locale, setLocale } = useLocale();\n\n const t = useCallback<TranslationFunction>(\n (key, defaultValue = key, options = {}) => translate(namespace, key, defaultValue, options),\n [namespace],\n );\n\n return { t, i18n, locale, locales, ready: i18n.isInitialized, setLocale };\n}\n\nexport function translate(\n namespace: string,\n key: string,\n defaultValue: string,\n options?: Record<string, unknown>,\n): string {\n ensureI18n();\n\n if (!i18n.isInitialized || !i18n.hasLoadedNamespace(namespace)) {\n return i18n.t(key, defaultValue, { ns: namespace, ...options, saveMissing: false });\n }\n\n return i18n.t(key, defaultValue, { ns: namespace, ...options });\n}\n"],"mappings":";;;;;AAKA,IAAM,YAAY;AAiBlB,IAAa,OAAqB,QAAQ,eAAe;AAEzD,IAAI;AACJ,IAAI,WAAW;AAEf,SAAS,UAAU,eAAuC;CACxD,MAAM,iBAAiB;EACrB,YAAY;EACZ,cAAc;CAChB;CAEA,KAAK,GAAG,eAAe,QAAQ;CAC/B,KAAK,GAAG,UAAU,QAAQ;CAC1B,KAAK,GAAG,mBAAmB,QAAQ;CACnC,KAAK,OAAO,GAAG,SAAS,QAAQ;CAChC,KAAK,OAAO,GAAG,WAAW,QAAQ;CAElC,aAAa;EACX,KAAK,IAAI,eAAe,QAAQ;EAChC,KAAK,IAAI,UAAU,QAAQ;EAC3B,KAAK,IAAI,mBAAmB,QAAQ;EACpC,KAAK,OAAO,IAAI,SAAS,QAAQ;EACjC,KAAK,OAAO,IAAI,WAAW,QAAQ;CACrC;AACF;AAEA,SAAS,WAAmB;CAC1B,OAAO;AACT;;;;;;AAOA,SAAgB,WAAW,QAA+D;CACxF,IAAI,CAAC,gBAAgB;EACnB,MAAM,OAAoB;GACxB,KAAK,cAAc;GACnB,aAAa;GACb,IAAI,CAAC,SAAS;GACd,WAAW;GACX,eAAe,EAAE,aAAa,MAAM;EACtC;EAEA,iBAAiB,KAAK,KAAK,SAAS,OAAO,IAAI,IAAI,IAAI;CACzD;CAEA,OAAO;AACT;AAEA,iBAAiB,WAAW;CAC1B,WAAgB,EAAE,WAAW;EAC3B,IAAI,KAAK,aAAa,QACpB,KAAU,eAAe,MAAM;CAEnC,CAAC;AACH,CAAC;;;;;;;AAQD,eAAsB,iBAAiB,SAA2C;CAChF,MAAM,UAAU,QAAQ,QAAQ,WAAW,WAAW,cAAc,CAAC;CAErE,IAAI,QAAQ,WAAW,GACrB;CAGF,MAAM,WAAW;CACjB,MAAM,KAAK,cAAc,CAAC,GAAG,OAAO,CAAC;AACvC;AAEA,SAAgB,KAAK,WAAsC;CACzD,WAAW;CACX,qBAAqB,WAAW,UAAU,QAAQ;CAClD,MAAM,EAAE,YAAY,UAAU;CAC9B,MAAM,EAAE,QAAQ,cAAc,UAAU;CAOxC,OAAO;EAAE,GALC,aACP,KAAK,eAAe,KAAK,UAAU,CAAC,MAAM,UAAU,WAAW,KAAK,cAAc,OAAO,GAC1F,CAAC,SAAS,CAGH;EAAG;EAAM;EAAQ;EAAS,OAAO,KAAK;EAAe;CAAU;AAC1E;AAEA,SAAgB,UACd,WACA,KACA,cACA,SACQ;CACR,WAAW;CAEX,IAAI,CAAC,KAAK,iBAAiB,CAAC,KAAK,mBAAmB,SAAS,GAC3D,OAAO,KAAK,EAAE,KAAK,cAAc;EAAE,IAAI;EAAW,GAAG;EAAS,aAAa;CAAM,CAAC;CAGpF,OAAO,KAAK,EAAE,KAAK,cAAc;EAAE,IAAI;EAAW,GAAG;CAAQ,CAAC;AAChE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EventBridge } from "../events/event-bridge.js";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { router } from "@inertiajs/react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region resources/js/i18n/locale-reload.tsx
|
|
6
|
+
function LocaleReload({ preserveScroll = true, preserveState = true }) {
|
|
7
|
+
return /* @__PURE__ */ jsx(EventBridge, { onLocaleChange: useCallback(() => {
|
|
8
|
+
router.visit(window.location.href, {
|
|
9
|
+
preserveScroll,
|
|
10
|
+
preserveState
|
|
11
|
+
});
|
|
12
|
+
}, [preserveScroll, preserveState]) });
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { LocaleReload };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=locale-reload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale-reload.js","names":[],"sources":["../../resources/js/i18n/locale-reload.tsx"],"sourcesContent":["import type { VisitOptions } from \"@inertiajs/core\";\nimport { router } from \"@inertiajs/react\";\nimport { useCallback } from \"react\";\nimport { EventBridge } from \"../events/event-bridge\";\n\nexport type LocaleReloadProps = Pick<VisitOptions, \"preserveScroll\" | \"preserveState\">;\n\n// preserveState by default: the visit only re-fetches the re-localized props,\n// so keeping the page mounted avoids remounting the whole tree (and losing\n// table sort/filter, form input, focus) on every locale switch.\nexport function LocaleReload({ preserveScroll = true, preserveState = true }: LocaleReloadProps) {\n const reload = useCallback(() => {\n router.visit(window.location.href, { preserveScroll, preserveState });\n }, [preserveScroll, preserveState]);\n\n return <EventBridge onLocaleChange={reload} />;\n}\n"],"mappings":";;;;;AAUA,SAAgB,aAAa,EAAE,iBAAiB,MAAM,gBAAgB,QAA2B;CAK/F,OAAO,oBAAC,aAAD,EAAa,gBAJL,kBAAkB;EAC/B,OAAO,MAAM,OAAO,SAAS,MAAM;GAAE;GAAgB;EAAc,CAAC;CACtE,GAAG,CAAC,gBAAgB,aAAa,CAEG,EAAS,CAAA;AAC/C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type LocaleOption = {
|
|
3
|
+
readonly value: string;
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly active: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type UseLocaleOptionsOptions = {
|
|
8
|
+
readonly namespace?: string;
|
|
9
|
+
readonly label?: (locale: string) => string;
|
|
10
|
+
};
|
|
11
|
+
export type UseLocaleOptionsReturn = {
|
|
12
|
+
readonly locale: string;
|
|
13
|
+
readonly locales: readonly string[];
|
|
14
|
+
readonly options: readonly LocaleOption[];
|
|
15
|
+
readonly setLocale: (locale: string) => void;
|
|
16
|
+
};
|
|
17
|
+
export type LocaleSwitcherProps = UseLocaleOptionsOptions & {
|
|
18
|
+
readonly children: (state: UseLocaleOptionsReturn) => ReactNode;
|
|
19
|
+
};
|
|
20
|
+
export declare function useLocaleOptions({ namespace, label, }?: UseLocaleOptionsOptions): UseLocaleOptionsReturn;
|
|
21
|
+
export declare function LocaleSwitcher({ children, ...options }: LocaleSwitcherProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useT } from "./instance.js";
|
|
2
|
+
import { Fragment, jsx } from "react/jsx-runtime";
|
|
3
|
+
//#region resources/js/i18n/locale-switcher.tsx
|
|
4
|
+
function useLocaleOptions({ namespace = "lattice", label } = {}) {
|
|
5
|
+
const { t, locale, locales, setLocale } = useT(namespace);
|
|
6
|
+
const values = locales.length > 0 ? locales : [locale];
|
|
7
|
+
const labelFor = label ?? ((value) => t(`language.${value}`, value));
|
|
8
|
+
return {
|
|
9
|
+
locale,
|
|
10
|
+
locales: values,
|
|
11
|
+
options: values.map((value) => ({
|
|
12
|
+
value,
|
|
13
|
+
label: labelFor(value),
|
|
14
|
+
active: value === locale
|
|
15
|
+
})),
|
|
16
|
+
setLocale
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function LocaleSwitcher({ children, ...options }) {
|
|
20
|
+
return /* @__PURE__ */ jsx(Fragment, { children: children(useLocaleOptions(options)) });
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { LocaleSwitcher, useLocaleOptions };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=locale-switcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale-switcher.js","names":[],"sources":["../../resources/js/i18n/locale-switcher.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { useT } from \"./instance\";\n\nexport type LocaleOption = {\n readonly value: string;\n readonly label: string;\n readonly active: boolean;\n};\n\nexport type UseLocaleOptionsOptions = {\n readonly namespace?: string;\n readonly label?: (locale: string) => string;\n};\n\nexport type UseLocaleOptionsReturn = {\n readonly locale: string;\n readonly locales: readonly string[];\n readonly options: readonly LocaleOption[];\n readonly setLocale: (locale: string) => void;\n};\n\nexport type LocaleSwitcherProps = UseLocaleOptionsOptions & {\n readonly children: (state: UseLocaleOptionsReturn) => ReactNode;\n};\n\nexport function useLocaleOptions({\n namespace = \"lattice\",\n label,\n}: UseLocaleOptionsOptions = {}): UseLocaleOptionsReturn {\n const { t, locale, locales, setLocale } = useT(namespace);\n const values = locales.length > 0 ? locales : [locale];\n const labelFor = label ?? ((value: string): string => t(`language.${value}`, value));\n\n return {\n locale,\n locales: values,\n options: values.map((value) => ({\n value,\n label: labelFor(value),\n active: value === locale,\n })),\n setLocale,\n };\n}\n\nexport function LocaleSwitcher({ children, ...options }: LocaleSwitcherProps) {\n return <>{children(useLocaleOptions(options))}</>;\n}\n"],"mappings":";;;AAyBA,SAAgB,iBAAiB,EAC/B,YAAY,WACZ,UAC2B,CAAC,GAA2B;CACvD,MAAM,EAAE,GAAG,QAAQ,SAAS,cAAc,KAAK,SAAS;CACxD,MAAM,SAAS,QAAQ,SAAS,IAAI,UAAU,CAAC,MAAM;CACrD,MAAM,WAAW,WAAW,UAA0B,EAAE,YAAY,SAAS,KAAK;CAElF,OAAO;EACL;EACA,SAAS;EACT,SAAS,OAAO,KAAK,WAAW;GAC9B;GACA,OAAO,SAAS,KAAK;GACrB,QAAQ,UAAU;EACpB,EAAE;EACF;CACF;AACF;AAEA,SAAgB,eAAe,EAAE,UAAU,GAAG,WAAgC;CAC5E,OAAO,oBAAA,UAAA,EAAA,UAAG,SAAS,iBAAiB,OAAO,CAAC,EAAI,CAAA;AAClD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type UseLocaleReturn = {
|
|
2
|
+
readonly locale: string;
|
|
3
|
+
readonly setLocale: (locale: string) => void;
|
|
4
|
+
};
|
|
5
|
+
export declare function currentLocale(): string;
|
|
6
|
+
export declare function localeHeader(): Record<string, string>;
|
|
7
|
+
export declare function subscribeLocale(callback: (locale: string) => void): () => void;
|
|
8
|
+
export declare function setLocale(locale: string): void;
|
|
9
|
+
export declare function useLocale(): UseLocaleReturn;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { LATTICE_EVENT } from "../events/event-names.js";
|
|
2
|
+
import { useSyncExternalStore } from "react";
|
|
3
|
+
//#region resources/js/i18n/locale.ts
|
|
4
|
+
var key = "locale";
|
|
5
|
+
var fallback = "en";
|
|
6
|
+
var maxAge = 365 * 24 * 60 * 60;
|
|
7
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
8
|
+
var active;
|
|
9
|
+
function normalize(value) {
|
|
10
|
+
const next = value.trim();
|
|
11
|
+
return next === "" ? fallback : next;
|
|
12
|
+
}
|
|
13
|
+
function storedValue() {
|
|
14
|
+
if (typeof window === "undefined") return null;
|
|
15
|
+
try {
|
|
16
|
+
return localStorage.getItem(key);
|
|
17
|
+
} catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function cookieValue() {
|
|
22
|
+
if (typeof document === "undefined") return null;
|
|
23
|
+
const item = document.cookie.split(";").map((cookie) => cookie.trim()).find((cookie) => cookie.startsWith(`${key}=`));
|
|
24
|
+
if (!item) return null;
|
|
25
|
+
try {
|
|
26
|
+
return decodeURIComponent(item.slice(7));
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function documentValue() {
|
|
32
|
+
if (typeof document === "undefined") return null;
|
|
33
|
+
return document.documentElement.lang || null;
|
|
34
|
+
}
|
|
35
|
+
function detectedLocale() {
|
|
36
|
+
return normalize(storedValue() ?? cookieValue() ?? documentValue() ?? fallback);
|
|
37
|
+
}
|
|
38
|
+
function persist(locale) {
|
|
39
|
+
if (typeof document !== "undefined") {
|
|
40
|
+
document.cookie = `${key}=${encodeURIComponent(locale)};path=/;max-age=${maxAge};SameSite=Lax`;
|
|
41
|
+
document.documentElement.lang = locale;
|
|
42
|
+
}
|
|
43
|
+
if (typeof window !== "undefined") try {
|
|
44
|
+
localStorage.setItem(key, locale);
|
|
45
|
+
} catch {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function snapshot() {
|
|
50
|
+
active ??= detectedLocale();
|
|
51
|
+
return active;
|
|
52
|
+
}
|
|
53
|
+
function subscribe(callback) {
|
|
54
|
+
listeners.add(callback);
|
|
55
|
+
return () => {
|
|
56
|
+
listeners.delete(callback);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function notify() {
|
|
60
|
+
listeners.forEach((listener) => listener());
|
|
61
|
+
}
|
|
62
|
+
function dispatch(locale) {
|
|
63
|
+
if (typeof window === "undefined") return;
|
|
64
|
+
window.dispatchEvent(new CustomEvent(LATTICE_EVENT.localeChange, { detail: { locale } }));
|
|
65
|
+
}
|
|
66
|
+
function currentLocale() {
|
|
67
|
+
return snapshot();
|
|
68
|
+
}
|
|
69
|
+
function localeHeader() {
|
|
70
|
+
return { "Accept-Language": currentLocale() };
|
|
71
|
+
}
|
|
72
|
+
function subscribeLocale(callback) {
|
|
73
|
+
return subscribe(() => callback(currentLocale()));
|
|
74
|
+
}
|
|
75
|
+
function setLocale(locale) {
|
|
76
|
+
const previous = currentLocale();
|
|
77
|
+
const next = normalize(locale);
|
|
78
|
+
active = next;
|
|
79
|
+
persist(next);
|
|
80
|
+
if (next === previous) return;
|
|
81
|
+
notify();
|
|
82
|
+
dispatch(next);
|
|
83
|
+
}
|
|
84
|
+
function useLocale() {
|
|
85
|
+
return {
|
|
86
|
+
locale: useSyncExternalStore(subscribe, snapshot, () => fallback),
|
|
87
|
+
setLocale
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
export { currentLocale, localeHeader, setLocale, subscribeLocale, useLocale };
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=locale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale.js","names":[],"sources":["../../resources/js/i18n/locale.ts"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { LATTICE_EVENT } from \"../events/event-names\";\n\nexport type UseLocaleReturn = {\n readonly locale: string;\n readonly setLocale: (locale: string) => void;\n};\n\nconst key = \"locale\";\nconst fallback = \"en\";\nconst maxAge = 365 * 24 * 60 * 60;\nconst listeners = new Set<() => void>();\n\nlet active: string | undefined;\n\nfunction normalize(value: string): string {\n const next = value.trim();\n\n return next === \"\" ? fallback : next;\n}\n\nfunction storedValue(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction cookieValue(): string | null {\n if (typeof document === \"undefined\") {\n return null;\n }\n\n const item = document.cookie\n .split(\";\")\n .map((cookie) => cookie.trim())\n .find((cookie) => cookie.startsWith(`${key}=`));\n\n if (!item) {\n return null;\n }\n\n try {\n return decodeURIComponent(item.slice(key.length + 1));\n } catch {\n return null;\n }\n}\n\nfunction documentValue(): string | null {\n if (typeof document === \"undefined\") {\n return null;\n }\n\n return document.documentElement.lang || null;\n}\n\nfunction detectedLocale(): string {\n return normalize(storedValue() ?? cookieValue() ?? documentValue() ?? fallback);\n}\n\nfunction persist(locale: string): void {\n if (typeof document !== \"undefined\") {\n document.cookie = `${key}=${encodeURIComponent(locale)};path=/;max-age=${maxAge};SameSite=Lax`;\n document.documentElement.lang = locale;\n }\n\n if (typeof window !== \"undefined\") {\n try {\n localStorage.setItem(key, locale);\n } catch {\n return;\n }\n }\n}\n\nfunction snapshot(): string {\n active ??= detectedLocale();\n\n return active;\n}\n\nfunction subscribe(callback: () => void): () => void {\n listeners.add(callback);\n\n return () => {\n listeners.delete(callback);\n };\n}\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nfunction dispatch(locale: string): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.dispatchEvent(new CustomEvent(LATTICE_EVENT.localeChange, { detail: { locale } }));\n}\n\nexport function currentLocale(): string {\n return snapshot();\n}\n\nexport function localeHeader(): Record<string, string> {\n return { \"Accept-Language\": currentLocale() };\n}\n\nexport function subscribeLocale(callback: (locale: string) => void): () => void {\n return subscribe(() => callback(currentLocale()));\n}\n\nexport function setLocale(locale: string): void {\n const previous = currentLocale();\n const next = normalize(locale);\n\n active = next;\n persist(next);\n\n if (next === previous) {\n return;\n }\n\n notify();\n dispatch(next);\n}\n\nexport function useLocale(): UseLocaleReturn {\n const locale = useSyncExternalStore(subscribe, snapshot, () => fallback);\n\n return { locale, setLocale } as const;\n}\n"],"mappings":";;;AAQA,IAAM,MAAM;AACZ,IAAM,WAAW;AACjB,IAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,IAAM,4BAAY,IAAI,IAAgB;AAEtC,IAAI;AAEJ,SAAS,UAAU,OAAuB;CACxC,MAAM,OAAO,MAAM,KAAK;CAExB,OAAO,SAAS,KAAK,WAAW;AAClC;AAEA,SAAS,cAA6B;CACpC,IAAI,OAAO,WAAW,aACpB,OAAO;CAGT,IAAI;EACF,OAAO,aAAa,QAAQ,GAAG;CACjC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,cAA6B;CACpC,IAAI,OAAO,aAAa,aACtB,OAAO;CAGT,MAAM,OAAO,SAAS,OACnB,MAAM,GAAG,EACT,KAAK,WAAW,OAAO,KAAK,CAAC,EAC7B,MAAM,WAAW,OAAO,WAAW,GAAG,IAAI,EAAE,CAAC;CAEhD,IAAI,CAAC,MACH,OAAO;CAGT,IAAI;EACF,OAAO,mBAAmB,KAAK,MAAM,CAAc,CAAC;CACtD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,gBAA+B;CACtC,IAAI,OAAO,aAAa,aACtB,OAAO;CAGT,OAAO,SAAS,gBAAgB,QAAQ;AAC1C;AAEA,SAAS,iBAAyB;CAChC,OAAO,UAAU,YAAY,KAAK,YAAY,KAAK,cAAc,KAAK,QAAQ;AAChF;AAEA,SAAS,QAAQ,QAAsB;CACrC,IAAI,OAAO,aAAa,aAAa;EACnC,SAAS,SAAS,GAAG,IAAI,GAAG,mBAAmB,MAAM,EAAE,kBAAkB,OAAO;EAChF,SAAS,gBAAgB,OAAO;CAClC;CAEA,IAAI,OAAO,WAAW,aACpB,IAAI;EACF,aAAa,QAAQ,KAAK,MAAM;CAClC,QAAQ;EACN;CACF;AAEJ;AAEA,SAAS,WAAmB;CAC1B,WAAW,eAAe;CAE1B,OAAO;AACT;AAEA,SAAS,UAAU,UAAkC;CACnD,UAAU,IAAI,QAAQ;CAEtB,aAAa;EACX,UAAU,OAAO,QAAQ;CAC3B;AACF;AAEA,SAAS,SAAe;CACtB,UAAU,SAAS,aAAa,SAAS,CAAC;AAC5C;AAEA,SAAS,SAAS,QAAsB;CACtC,IAAI,OAAO,WAAW,aACpB;CAGF,OAAO,cAAc,IAAI,YAAY,cAAc,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC1F;AAEA,SAAgB,gBAAwB;CACtC,OAAO,SAAS;AAClB;AAEA,SAAgB,eAAuC;CACrD,OAAO,EAAE,mBAAmB,cAAc,EAAE;AAC9C;AAEA,SAAgB,gBAAgB,UAAgD;CAC9E,OAAO,gBAAgB,SAAS,cAAc,CAAC,CAAC;AAClD;AAEA,SAAgB,UAAU,QAAsB;CAC9C,MAAM,WAAW,cAAc;CAC/B,MAAM,OAAO,UAAU,MAAM;CAE7B,SAAS;CACT,QAAQ,IAAI;CAEZ,IAAI,SAAS,UACX;CAGF,OAAO;CACP,SAAS,IAAI;AACf;AAEA,SAAgB,YAA6B;CAG3C,OAAO;EAAE,QAFM,qBAAqB,WAAW,gBAAgB,QAEtD;EAAQ;CAAU;AAC7B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { configureI18n } from "./backend.js";
|
|
2
|
+
//#region resources/js/i18n/page-props.ts
|
|
3
|
+
function isRecord(value) {
|
|
4
|
+
return typeof value === "object" && value !== null;
|
|
5
|
+
}
|
|
6
|
+
function isStringArray(value) {
|
|
7
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
8
|
+
}
|
|
9
|
+
function isI18nConfig(value) {
|
|
10
|
+
return isRecord(value) && typeof value.enabled === "boolean" && typeof value.saveMissing === "boolean" && isStringArray(value.locales) && isStringArray(value.preloadLocales);
|
|
11
|
+
}
|
|
12
|
+
function i18nConfigFromPageProps(props) {
|
|
13
|
+
if (!isRecord(props)) return;
|
|
14
|
+
const shared = props.lattice;
|
|
15
|
+
const config = isRecord(shared) ? shared.i18n : void 0;
|
|
16
|
+
return isI18nConfig(config) ? config : void 0;
|
|
17
|
+
}
|
|
18
|
+
function configureI18nFromPageProps(props, options = {}) {
|
|
19
|
+
return configureI18n(i18nConfigFromPageProps(props), options);
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { configureI18nFromPageProps, i18nConfigFromPageProps };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=page-props.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-props.js","names":[],"sources":["../../resources/js/i18n/page-props.ts"],"sourcesContent":["import { configureI18n, type ConfigureI18nOptions, type I18nConfig } from \"./backend\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isI18nConfig(value: unknown): value is I18nConfig {\n return (\n isRecord(value) &&\n typeof value.enabled === \"boolean\" &&\n typeof value.saveMissing === \"boolean\" &&\n isStringArray(value.locales) &&\n isStringArray(value.preloadLocales)\n );\n}\n\nexport function i18nConfigFromPageProps(props: unknown): I18nConfig | undefined {\n if (!isRecord(props)) {\n return undefined;\n }\n\n const shared = props.lattice;\n const config = isRecord(shared) ? shared.i18n : undefined;\n\n return isI18nConfig(config) ? config : undefined;\n}\n\nexport function configureI18nFromPageProps(\n props: unknown,\n options: ConfigureI18nOptions = {},\n): Promise<void> {\n return configureI18n(i18nConfigFromPageProps(props), options);\n}\n"],"mappings":";;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,cAAc,OAAmC;CACxD,OAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,SAAS,OAAO,SAAS,QAAQ;AAC/E;AAEA,SAAS,aAAa,OAAqC;CACzD,OACE,SAAS,KAAK,KACd,OAAO,MAAM,YAAY,aACzB,OAAO,MAAM,gBAAgB,aAC7B,cAAc,MAAM,OAAO,KAC3B,cAAc,MAAM,cAAc;AAEtC;AAEA,SAAgB,wBAAwB,OAAwC;CAC9E,IAAI,CAAC,SAAS,KAAK,GACjB;CAGF,MAAM,SAAS,MAAM;CACrB,MAAM,SAAS,SAAS,MAAM,IAAI,OAAO,OAAO,KAAA;CAEhD,OAAO,aAAa,MAAM,IAAI,SAAS,KAAA;AACzC;AAEA,SAAgB,2BACd,OACA,UAAgC,CAAC,GAClB;CACf,OAAO,cAAc,wBAAwB,KAAK,GAAG,OAAO;AAC9D"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cn } from "../lib/utils.js";
|
|
2
|
+
import { Icon, useSprite } from "./sprite.js";
|
|
2
3
|
import { createContext, useContext, useMemo } from "react";
|
|
3
|
-
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
5
|
//#region resources/js/icons/icon-renderer.tsx
|
|
5
|
-
var IconRenderersContext = createContext([
|
|
6
|
+
var IconRenderersContext = createContext([]);
|
|
6
7
|
function IconRendererProvider({ children, mode = "stack", renderer }) {
|
|
7
8
|
const parentRenderers = useContext(IconRenderersContext);
|
|
8
9
|
const renderers = useMemo(() => mode === "replace" ? [renderer] : [renderer, ...parentRenderers], [
|
|
@@ -17,6 +18,7 @@ function IconRendererProvider({ children, mode = "stack", renderer }) {
|
|
|
17
18
|
}
|
|
18
19
|
function IconRenderer({ className, icon }) {
|
|
19
20
|
const renderers = useContext(IconRenderersContext);
|
|
21
|
+
const { ids } = useSprite();
|
|
20
22
|
for (const renderer of renderers) {
|
|
21
23
|
const rendered = renderer({
|
|
22
24
|
className,
|
|
@@ -24,9 +26,32 @@ function IconRenderer({ className, icon }) {
|
|
|
24
26
|
});
|
|
25
27
|
if (rendered !== null && rendered !== void 0 && rendered !== false) return rendered;
|
|
26
28
|
}
|
|
27
|
-
return
|
|
29
|
+
if (ids && !ids.includes(icon)) return /* @__PURE__ */ jsx(MissingIcon, { className });
|
|
30
|
+
return /* @__PURE__ */ jsx(Icon, {
|
|
28
31
|
className,
|
|
29
|
-
icon
|
|
32
|
+
name: icon
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function MissingIcon({ className }) {
|
|
36
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
37
|
+
"aria-hidden": "true",
|
|
38
|
+
className: cn("size-lt-icon-md text-lt-muted-fg", className),
|
|
39
|
+
"data-lattice-missing-icon": "",
|
|
40
|
+
fill: "none",
|
|
41
|
+
stroke: "currentColor",
|
|
42
|
+
strokeLinecap: "round",
|
|
43
|
+
strokeLinejoin: "round",
|
|
44
|
+
strokeWidth: "2",
|
|
45
|
+
viewBox: "0 0 24 24",
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ jsx("circle", {
|
|
48
|
+
cx: "12",
|
|
49
|
+
cy: "12",
|
|
50
|
+
r: "10"
|
|
51
|
+
}),
|
|
52
|
+
/* @__PURE__ */ jsx("path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }),
|
|
53
|
+
/* @__PURE__ */ jsx("path", { d: "M12 17h.01" })
|
|
54
|
+
]
|
|
30
55
|
});
|
|
31
56
|
}
|
|
32
57
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-renderer.js","names":[],"sources":["../../resources/js/icons/icon-renderer.tsx"],"sourcesContent":["import { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"icon-renderer.js","names":[],"sources":["../../resources/js/icons/icon-renderer.tsx"],"sourcesContent":["import { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, useSprite } from \"./sprite\";\n\nexport type IconRendererProps = {\n className?: string;\n icon: string;\n};\n\nexport type IconRendererFunction = (props: IconRendererProps) => ReactNode;\n\ntype IconRendererProviderProps = {\n children: ReactNode;\n mode?: \"replace\" | \"stack\";\n renderer: IconRendererFunction;\n};\n\nconst IconRenderersContext = createContext<IconRendererFunction[]>([]);\nconst loggedMissingIcons = new Set<string>();\n\nexport function IconRendererProvider({\n children,\n mode = \"stack\",\n renderer,\n}: IconRendererProviderProps) {\n const parentRenderers = useContext(IconRenderersContext);\n const renderers = useMemo(\n () => (mode === \"replace\" ? [renderer] : [renderer, ...parentRenderers]),\n [mode, parentRenderers, renderer],\n );\n\n return (\n <IconRenderersContext.Provider value={renderers}>{children}</IconRenderersContext.Provider>\n );\n}\n\nexport function IconRenderer({ className, icon }: IconRendererProps) {\n const renderers = useContext(IconRenderersContext);\n const { ids } = useSprite();\n\n // Custom renderers (the override stack) take precedence over the sprite.\n for (const renderer of renderers) {\n const rendered = renderer({ className, icon });\n\n if (rendered !== null && rendered !== undefined && rendered !== false) {\n return rendered;\n }\n }\n\n // When the sprite is wired and the icon is genuinely absent, show a visible\n // marker. When `ids` is unknown (not yet wired), optimistically emit the\n // sprite reference rather than crying wolf.\n if (ids && !ids.includes(icon)) {\n logMissingIcon(icon);\n return <MissingIcon className={className} />;\n }\n\n return <Icon className={className} name={icon} />;\n}\n\nfunction MissingIcon({ className }: { className?: string }) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(\"size-lt-icon-md text-lt-muted-fg\", className)}\n data-lattice-missing-icon=\"\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nfunction logMissingIcon(icon: string): void {\n if (!import.meta.env.DEV || loggedMissingIcons.has(icon)) {\n return;\n }\n\n loggedMissingIcons.add(icon);\n console.log(`[Lattice] Missing icon renderer for \"${icon}\".`);\n}\n"],"mappings":";;;;;AAkBA,IAAM,uBAAuB,cAAsC,CAAC,CAAC;AAGrE,SAAgB,qBAAqB,EACnC,UACA,OAAO,SACP,YAC4B;CAC5B,MAAM,kBAAkB,WAAW,oBAAoB;CACvD,MAAM,YAAY,cACT,SAAS,YAAY,CAAC,QAAQ,IAAI,CAAC,UAAU,GAAG,eAAe,GACtE;EAAC;EAAM;EAAiB;CAAQ,CAClC;CAEA,OACE,oBAAC,qBAAqB,UAAtB;EAA+B,OAAO;EAAY;CAAwC,CAAA;AAE9F;AAEA,SAAgB,aAAa,EAAE,WAAW,QAA2B;CACnE,MAAM,YAAY,WAAW,oBAAoB;CACjD,MAAM,EAAE,QAAQ,UAAU;CAG1B,KAAK,MAAM,YAAY,WAAW;EAChC,MAAM,WAAW,SAAS;GAAE;GAAW;EAAK,CAAC;EAE7C,IAAI,aAAa,QAAQ,aAAa,KAAA,KAAa,aAAa,OAC9D,OAAO;CAEX;CAKA,IAAI,OAAO,CAAC,IAAI,SAAS,IAAI,GAE3B,OAAO,oBAAC,aAAD,EAAwB,UAAY,CAAA;CAG7C,OAAO,oBAAC,MAAD;EAAiB;EAAW,MAAM;CAAO,CAAA;AAClD;AAEA,SAAS,YAAY,EAAE,aAAqC;CAC1D,OACE,qBAAC,OAAD;EACE,eAAY;EACZ,WAAW,GAAG,oCAAoC,SAAS;EAC3D,6BAA0B;EAC1B,MAAK;EACL,QAAO;EACP,eAAc;EACd,gBAAe;EACf,aAAY;EACZ,SAAQ;YATV;GAWE,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;GAAM,CAAA;GAChC,oBAAC,QAAD,EAAM,GAAE,uCAAwC,CAAA;GAChD,oBAAC,QAAD,EAAM,GAAE,aAAc,CAAA;EACnB;;AAET"}
|
package/dist/icons/index.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
+
export { Icon, SpriteProvider, useSprite } from './sprite';
|
|
2
|
+
export type { IconName, KnownIcons, SpriteValue } from './sprite';
|
|
1
3
|
export { IconRenderer, IconRendererProvider } from './icon-renderer';
|
|
2
4
|
export type { IconRendererFunction, IconRendererProps } from './icon-renderer';
|
package/dist/icons/index.js
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface KnownIcons {
|
|
3
|
+
}
|
|
4
|
+
export type IconName = keyof KnownIcons | (string & {});
|
|
5
|
+
export type SpriteValue = {
|
|
6
|
+
/** The sprite URL. Empty when the sprite is inlined into the document (dev). */
|
|
7
|
+
href: string;
|
|
8
|
+
/** Every symbol id in the sprite, or undefined when not yet wired/known. */
|
|
9
|
+
ids?: readonly string[];
|
|
10
|
+
/** Inline sprite markup to inject once (dev); empty/omitted in builds. */
|
|
11
|
+
source?: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Seeds the icon sprite for everything below it. When `sprite.source` is set
|
|
15
|
+
* (dev), it's injected once so same-document `<use href="#id">` references
|
|
16
|
+
* resolve; in builds `href` points at the emitted sprite asset instead.
|
|
17
|
+
*/
|
|
18
|
+
export declare function SpriteProvider({ children, sprite }: {
|
|
19
|
+
children: ReactNode;
|
|
20
|
+
sprite: SpriteValue;
|
|
21
|
+
}): import("react").JSX.Element;
|
|
22
|
+
export declare function useSprite(): SpriteValue;
|
|
23
|
+
/**
|
|
24
|
+
* Renders a single sprite symbol by name. Used for Lattice's own UI chrome and
|
|
25
|
+
* as the resolved default for server-driven icons. Extra `<svg>` props are
|
|
26
|
+
* forwarded, so callers can override `aria-hidden`, set a `role`, etc.
|
|
27
|
+
*/
|
|
28
|
+
export declare function Icon({ className, name, ...props }: {
|
|
29
|
+
name: IconName;
|
|
30
|
+
} & React.ComponentProps<"svg">): import("react").JSX.Element;
|