@happyvertical/smrt-ui 0.51.39 → 0.53.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/AGENTS.md +25 -3
- package/README.md +558 -8
- package/dist/actions/__tests__/swipe-dismiss.test.js +69 -0
- package/dist/actions/swipe-dismiss.d.ts +42 -0
- package/dist/actions/swipe-dismiss.d.ts.map +1 -0
- package/dist/actions/swipe-dismiss.js +69 -0
- package/dist/components/calendar/Calendar.svelte +5 -0
- package/dist/components/calendar/Calendar.svelte.d.ts.map +1 -1
- package/dist/components/calendar/CalendarView.svelte +1250 -0
- package/dist/components/calendar/CalendarView.svelte.d.ts +66 -0
- package/dist/components/calendar/CalendarView.svelte.d.ts.map +1 -0
- package/dist/components/calendar/DayView.svelte +5 -0
- package/dist/components/calendar/DayView.svelte.d.ts.map +1 -1
- package/dist/components/calendar/__tests__/CalendarView.test.js +226 -0
- package/dist/components/calendar/__tests__/calendar-model.test.js +138 -0
- package/dist/components/calendar/calendar-model.d.ts +178 -0
- package/dist/components/calendar/calendar-model.d.ts.map +1 -0
- package/dist/components/calendar/calendar-model.js +362 -0
- package/dist/components/calendar/index.d.ts +12 -1
- package/dist/components/calendar/index.d.ts.map +1 -1
- package/dist/components/calendar/index.js +11 -1
- package/dist/components/data/CollectionList.svelte +23 -5
- package/dist/components/data/CollectionList.svelte.d.ts +8 -2
- package/dist/components/data/CollectionList.svelte.d.ts.map +1 -1
- package/dist/components/data/DataTable.svelte +178 -55
- package/dist/components/data/DataTable.svelte.d.ts.map +1 -1
- package/dist/components/data/DataTableController.d.ts +4 -0
- package/dist/components/data/DataTableController.d.ts.map +1 -1
- package/dist/components/data/DataTableController.js +11 -4
- package/dist/components/data/DataTableResponsive.d.ts +4 -0
- package/dist/components/data/DataTableResponsive.d.ts.map +1 -0
- package/dist/components/data/DataTableResponsive.js +22 -0
- package/dist/components/data/ListSortSelect.svelte +121 -0
- package/dist/components/data/ListSortSelect.svelte.d.ts +22 -0
- package/dist/components/data/ListSortSelect.svelte.d.ts.map +1 -0
- package/dist/components/data/SortableHeader.svelte +169 -0
- package/dist/components/data/SortableHeader.svelte.d.ts +30 -0
- package/dist/components/data/SortableHeader.svelte.d.ts.map +1 -0
- package/dist/components/data/__tests__/CollectionList.test.js +37 -0
- package/dist/components/data/__tests__/DataTable.test.js +76 -0
- package/dist/components/data/__tests__/DataTableController.test.js +35 -0
- package/dist/components/data/__tests__/DataTableResponsive.test.js +80 -0
- package/dist/components/data/__tests__/SortableHeader.test.js +101 -0
- package/dist/components/data/__tests__/link-step-surface.test.js +172 -0
- package/dist/components/data/__tests__/list-sort-state.svelte.test.js +71 -0
- package/dist/components/data/__tests__/list-sort.test.js +91 -0
- package/dist/components/data/__tests__/responsive-table.fixture.svelte +29 -0
- package/dist/components/data/__tests__/responsive-table.fixture.svelte.d.ts +7 -0
- package/dist/components/data/__tests__/responsive-table.fixture.svelte.d.ts.map +1 -0
- package/dist/components/data/__tests__/surface-navigation.test.js +121 -0
- package/dist/components/data/data-surface.d.ts +1 -0
- package/dist/components/data/data-surface.d.ts.map +1 -1
- package/dist/components/data/data-surface.js +1 -0
- package/dist/components/data/index.d.ts +6 -0
- package/dist/components/data/index.d.ts.map +1 -1
- package/dist/components/data/index.js +6 -0
- package/dist/components/data/link-surface.d.ts +79 -0
- package/dist/components/data/link-surface.d.ts.map +1 -0
- package/dist/components/data/link-surface.js +155 -0
- package/dist/components/data/list-sort-state.svelte.d.ts +39 -0
- package/dist/components/data/list-sort-state.svelte.d.ts.map +1 -0
- package/dist/components/data/list-sort-state.svelte.js +47 -0
- package/dist/components/data/list-sort.d.ts +94 -0
- package/dist/components/data/list-sort.d.ts.map +1 -0
- package/dist/components/data/list-sort.js +182 -0
- package/dist/components/data/step-surface.d.ts +73 -0
- package/dist/components/data/step-surface.d.ts.map +1 -0
- package/dist/components/data/step-surface.js +177 -0
- package/dist/components/data/surface-navigation.d.ts +49 -0
- package/dist/components/data/surface-navigation.d.ts.map +1 -0
- package/dist/components/data/surface-navigation.js +100 -0
- package/dist/components/data/types.d.ts +27 -0
- package/dist/components/data/types.d.ts.map +1 -1
- package/dist/components/display/DateDisplay.svelte +76 -14
- package/dist/components/display/DateDisplay.svelte.d.ts +2 -0
- package/dist/components/display/DateDisplay.svelte.d.ts.map +1 -1
- package/dist/components/display/Icon.svelte +3 -16
- package/dist/components/display/Icon.svelte.d.ts +0 -9
- package/dist/components/display/Icon.svelte.d.ts.map +1 -1
- package/dist/components/display/StatusBadge.svelte +29 -2
- package/dist/components/display/StatusBadge.svelte.d.ts +4 -2
- package/dist/components/display/StatusBadge.svelte.d.ts.map +1 -1
- package/dist/components/display/__tests__/DateDisplay.test.js +82 -1
- package/dist/components/display/__tests__/Icon.test.js +132 -2
- package/dist/components/display/__tests__/StatusBadge.test.js +78 -0
- package/dist/components/display/icons.svelte.d.ts +11 -0
- package/dist/components/display/icons.svelte.d.ts.map +1 -0
- package/dist/components/display/icons.svelte.js +60 -0
- package/dist/components/display/index.d.ts +3 -1
- package/dist/components/display/index.d.ts.map +1 -1
- package/dist/components/display/index.js +1 -0
- package/dist/components/display/types.d.ts +2 -0
- package/dist/components/display/types.d.ts.map +1 -1
- package/dist/components/feedback/ConfirmDialog.svelte +59 -48
- package/dist/components/feedback/ConfirmDialog.svelte.d.ts +14 -2
- package/dist/components/feedback/ConfirmDialog.svelte.d.ts.map +1 -1
- package/dist/components/feedback/PhoneSheet.svelte +224 -0
- package/dist/components/feedback/PhoneSheet.svelte.d.ts +35 -0
- package/dist/components/feedback/PhoneSheet.svelte.d.ts.map +1 -0
- package/dist/components/feedback/ToastViewport.svelte +156 -8
- package/dist/components/feedback/ToastViewport.svelte.d.ts +5 -1
- package/dist/components/feedback/ToastViewport.svelte.d.ts.map +1 -1
- package/dist/components/feedback/WorkingStrip.svelte +426 -0
- package/dist/components/feedback/WorkingStrip.svelte.d.ts +37 -0
- package/dist/components/feedback/WorkingStrip.svelte.d.ts.map +1 -0
- package/dist/components/feedback/__tests__/ConfirmDialog.test.js +38 -20
- package/dist/components/feedback/__tests__/PhoneSheet.test.js +101 -0
- package/dist/components/feedback/__tests__/WorkingStrip.test.js +172 -0
- package/dist/components/feedback/__tests__/confirm-message.fixture.svelte +9 -0
- package/dist/components/feedback/__tests__/confirm-message.fixture.svelte.d.ts +19 -0
- package/dist/components/feedback/__tests__/confirm-message.fixture.svelte.d.ts.map +1 -0
- package/dist/components/feedback/__tests__/toast.test.js +142 -1
- package/dist/components/feedback/index.d.ts +5 -1
- package/dist/components/feedback/index.d.ts.map +1 -1
- package/dist/components/feedback/index.js +5 -0
- package/dist/components/feedback/toast.d.ts +13 -1
- package/dist/components/feedback/toast.d.ts.map +1 -1
- package/dist/components/feedback/toast.js +51 -10
- package/dist/components/feedback/working-status.d.ts +34 -0
- package/dist/components/feedback/working-status.d.ts.map +1 -0
- package/dist/components/feedback/working-status.js +5 -0
- package/dist/components/forms/CameraCapture.svelte +619 -0
- package/dist/components/forms/CameraCapture.svelte.d.ts +42 -0
- package/dist/components/forms/CameraCapture.svelte.d.ts.map +1 -0
- package/dist/components/forms/Checkbox.svelte +34 -3
- package/dist/components/forms/Checkbox.svelte.d.ts +2 -0
- package/dist/components/forms/Checkbox.svelte.d.ts.map +1 -1
- package/dist/components/forms/Combobox.svelte +108 -12
- package/dist/components/forms/Combobox.svelte.d.ts +6 -0
- package/dist/components/forms/Combobox.svelte.d.ts.map +1 -1
- package/dist/components/forms/DictationButton.svelte +128 -0
- package/dist/components/forms/DictationButton.svelte.d.ts +19 -0
- package/dist/components/forms/DictationButton.svelte.d.ts.map +1 -0
- package/dist/components/forms/DictationStatus.svelte +164 -0
- package/dist/components/forms/DictationStatus.svelte.d.ts +11 -0
- package/dist/components/forms/DictationStatus.svelte.d.ts.map +1 -0
- package/dist/components/forms/Fieldset.svelte +5 -1
- package/dist/components/forms/Fieldset.svelte.d.ts +2 -0
- package/dist/components/forms/Fieldset.svelte.d.ts.map +1 -1
- package/dist/components/forms/Form.svelte +5 -0
- package/dist/components/forms/Form.svelte.d.ts +1 -0
- package/dist/components/forms/Form.svelte.d.ts.map +1 -1
- package/dist/components/forms/FormActionBar.svelte +84 -0
- package/dist/components/forms/FormActionBar.svelte.d.ts +23 -0
- package/dist/components/forms/FormActionBar.svelte.d.ts.map +1 -0
- package/dist/components/forms/Input.svelte +17 -1
- package/dist/components/forms/Input.svelte.d.ts +2 -0
- package/dist/components/forms/Input.svelte.d.ts.map +1 -1
- package/dist/components/forms/Listbox.svelte +39 -1
- package/dist/components/forms/Listbox.svelte.d.ts.map +1 -1
- package/dist/components/forms/MultiSelect.svelte +41 -1
- package/dist/components/forms/MultiSelect.svelte.d.ts.map +1 -1
- package/dist/components/forms/Radio.svelte +16 -4
- package/dist/components/forms/RadioGroup.svelte +7 -1
- package/dist/components/forms/RadioGroup.svelte.d.ts +2 -0
- package/dist/components/forms/RadioGroup.svelte.d.ts.map +1 -1
- package/dist/components/forms/SearchInput.svelte +207 -0
- package/dist/components/forms/SearchInput.svelte.d.ts +22 -0
- package/dist/components/forms/SearchInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/SegmentedControl.svelte +152 -11
- package/dist/components/forms/SegmentedControl.svelte.d.ts +4 -0
- package/dist/components/forms/SegmentedControl.svelte.d.ts.map +1 -1
- package/dist/components/forms/Select.svelte +17 -1
- package/dist/components/forms/Select.svelte.d.ts +2 -0
- package/dist/components/forms/Select.svelte.d.ts.map +1 -1
- package/dist/components/forms/SignaturePad.svelte +436 -0
- package/dist/components/forms/SignaturePad.svelte.d.ts +32 -0
- package/dist/components/forms/SignaturePad.svelte.d.ts.map +1 -0
- package/dist/components/forms/StagedControlReview.svelte +21 -12
- package/dist/components/forms/StagedControlReview.svelte.d.ts.map +1 -1
- package/dist/components/forms/Switch.svelte +18 -5
- package/dist/components/forms/Switch.svelte.d.ts +2 -0
- package/dist/components/forms/Switch.svelte.d.ts.map +1 -1
- package/dist/components/forms/TagsInput.svelte +8 -1
- package/dist/components/forms/Textarea.svelte +16 -1
- package/dist/components/forms/Textarea.svelte.d.ts +2 -0
- package/dist/components/forms/Textarea.svelte.d.ts.map +1 -1
- package/dist/components/forms/__tests__/CameraCapture.test.js +504 -0
- package/dist/components/forms/__tests__/Combobox.test.js +354 -0
- package/dist/components/forms/__tests__/ControlHitArea.test.js +73 -0
- package/dist/components/forms/__tests__/DictationButton.test.js +176 -0
- package/dist/components/forms/__tests__/Fieldset.test.js +37 -0
- package/dist/components/forms/__tests__/Form.test.js +46 -0
- package/dist/components/forms/__tests__/FormActionBar.test.js +22 -0
- package/dist/components/forms/__tests__/Listbox.test.js +303 -0
- package/dist/components/forms/__tests__/MultiSelect.test.js +281 -0
- package/dist/components/forms/__tests__/SearchInput.test.js +92 -0
- package/dist/components/forms/__tests__/SignaturePad.test.js +338 -0
- package/dist/components/forms/__tests__/StagedControlReview.test.js +37 -3
- package/dist/components/forms/__tests__/camera-capture-session.test.js +207 -0
- package/dist/components/forms/__tests__/capture-form-retry.test.js +166 -0
- package/dist/components/forms/__tests__/capture-form.fixture.svelte +38 -0
- package/dist/components/forms/__tests__/capture-form.fixture.svelte.d.ts +10 -0
- package/dist/components/forms/__tests__/capture-form.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/capture-test-env.d.ts +70 -0
- package/dist/components/forms/__tests__/capture-test-env.d.ts.map +1 -0
- package/dist/components/forms/__tests__/capture-test-env.js +122 -0
- package/dist/components/forms/__tests__/capture-touch.fixture.svelte +15 -0
- package/dist/components/forms/__tests__/capture-touch.fixture.svelte.d.ts +8 -0
- package/dist/components/forms/__tests__/capture-touch.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/combobox-form.fixture.svelte +29 -0
- package/dist/components/forms/__tests__/combobox-form.fixture.svelte.d.ts +14 -0
- package/dist/components/forms/__tests__/combobox-form.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/combobox-labels.fixture.svelte +19 -0
- package/dist/components/forms/__tests__/combobox-labels.fixture.svelte.d.ts +11 -0
- package/dist/components/forms/__tests__/combobox-labels.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/composite-registration.fixture.svelte +29 -0
- package/dist/components/forms/__tests__/composite-registration.fixture.svelte.d.ts +8 -0
- package/dist/components/forms/__tests__/composite-registration.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/control-interaction.test.js +19 -1
- package/dist/components/forms/__tests__/control-proposals.test.js +63 -0
- package/dist/components/forms/__tests__/dictation-recording.test.js +582 -0
- package/dist/components/forms/__tests__/dictation.test.js +486 -0
- package/dist/components/forms/__tests__/form-attachment.fixture.svelte +28 -0
- package/dist/components/forms/__tests__/form-attachment.fixture.svelte.d.ts +11 -0
- package/dist/components/forms/__tests__/form-attachment.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/form-retry-form.fixture.svelte +31 -0
- package/dist/components/forms/__tests__/form-retry-form.fixture.svelte.d.ts +13 -0
- package/dist/components/forms/__tests__/form-retry-form.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/form-retry-form.test.js +107 -0
- package/dist/components/forms/__tests__/hidden-controls-form-retry.test.js +69 -0
- package/dist/components/forms/__tests__/hidden-controls-form.fixture.svelte +29 -0
- package/dist/components/forms/__tests__/hidden-controls-form.fixture.svelte.d.ts +9 -0
- package/dist/components/forms/__tests__/hidden-controls-form.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/listbox-form.fixture.svelte +27 -0
- package/dist/components/forms/__tests__/listbox-form.fixture.svelte.d.ts +13 -0
- package/dist/components/forms/__tests__/listbox-form.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/long-press.test.js +175 -0
- package/dist/components/forms/__tests__/multiselect-form.fixture.svelte +27 -0
- package/dist/components/forms/__tests__/multiselect-form.fixture.svelte.d.ts +13 -0
- package/dist/components/forms/__tests__/multiselect-form.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/native-file-field.test.js +177 -0
- package/dist/components/forms/__tests__/place-picker.fixture.svelte +33 -0
- package/dist/components/forms/__tests__/place-picker.fixture.svelte.d.ts +12 -0
- package/dist/components/forms/__tests__/place-picker.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/segmented-posting.fixture.svelte +28 -0
- package/dist/components/forms/__tests__/segmented-posting.fixture.svelte.d.ts +12 -0
- package/dist/components/forms/__tests__/segmented-posting.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/segmented-posting.test.js +92 -0
- package/dist/components/forms/__tests__/signature-pad-logic.test.js +54 -0
- package/dist/components/forms/__tests__/touch-density.fixture.svelte +34 -0
- package/dist/components/forms/__tests__/touch-density.fixture.svelte.d.ts +8 -0
- package/dist/components/forms/__tests__/touch-density.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/touch-density.test.js +66 -0
- package/dist/components/forms/audio-capture.d.ts +69 -0
- package/dist/components/forms/audio-capture.d.ts.map +1 -0
- package/dist/components/forms/audio-capture.js +193 -0
- package/dist/components/forms/camera-capture-session.d.ts +81 -0
- package/dist/components/forms/camera-capture-session.d.ts.map +1 -0
- package/dist/components/forms/camera-capture-session.js +130 -0
- package/dist/components/forms/control-interaction.d.ts +6 -0
- package/dist/components/forms/control-interaction.d.ts.map +1 -1
- package/dist/components/forms/control-interaction.js +12 -1
- package/dist/components/forms/control-proposals.d.ts +55 -0
- package/dist/components/forms/control-proposals.d.ts.map +1 -0
- package/dist/components/forms/control-proposals.js +188 -0
- package/dist/components/forms/dictation-transcribe.d.ts +36 -0
- package/dist/components/forms/dictation-transcribe.d.ts.map +1 -0
- package/dist/components/forms/dictation-transcribe.js +65 -0
- package/dist/components/forms/dictation.svelte.d.ts +200 -0
- package/dist/components/forms/dictation.svelte.d.ts.map +1 -0
- package/dist/components/forms/dictation.svelte.js +686 -0
- package/dist/components/forms/form-retry/__tests__/boundaries.test.js +23 -0
- package/dist/components/forms/form-retry/__tests__/content-digest.test.js +70 -0
- package/dist/components/forms/form-retry/__tests__/controller.test.js +802 -0
- package/dist/components/forms/form-retry/__tests__/fake-kit.d.ts +82 -0
- package/dist/components/forms/form-retry/__tests__/fake-kit.d.ts.map +1 -0
- package/dist/components/forms/form-retry/__tests__/fake-kit.js +180 -0
- package/dist/components/forms/form-retry/__tests__/form-draft.test.js +169 -0
- package/dist/components/forms/form-retry/__tests__/ssr.test.js +37 -0
- package/dist/components/forms/form-retry/__tests__/storage.d.ts +26 -0
- package/dist/components/forms/form-retry/__tests__/storage.d.ts.map +1 -0
- package/dist/components/forms/form-retry/__tests__/storage.js +63 -0
- package/dist/components/forms/form-retry/__tests__/submission-key.test.js +236 -0
- package/dist/components/forms/form-retry/__tests__/submitted-draft.test.js +334 -0
- package/dist/components/forms/form-retry/content-digest.d.ts +54 -0
- package/dist/components/forms/form-retry/content-digest.d.ts.map +1 -0
- package/dist/components/forms/form-retry/content-digest.js +169 -0
- package/dist/components/forms/form-retry/controller.d.ts +214 -0
- package/dist/components/forms/form-retry/controller.d.ts.map +1 -0
- package/dist/components/forms/form-retry/controller.js +404 -0
- package/dist/components/forms/form-retry/form-draft.d.ts +68 -0
- package/dist/components/forms/form-retry/form-draft.d.ts.map +1 -0
- package/dist/components/forms/form-retry/form-draft.js +161 -0
- package/dist/components/forms/form-retry/index.d.ts +19 -0
- package/dist/components/forms/form-retry/index.d.ts.map +1 -0
- package/dist/components/forms/form-retry/index.js +16 -0
- package/dist/components/forms/form-retry/submission-key.d.ts +244 -0
- package/dist/components/forms/form-retry/submission-key.d.ts.map +1 -0
- package/dist/components/forms/form-retry/submission-key.js +342 -0
- package/dist/components/forms/form-retry/submitted-draft.d.ts +112 -0
- package/dist/components/forms/form-retry/submitted-draft.d.ts.map +1 -0
- package/dist/components/forms/form-retry/submitted-draft.js +270 -0
- package/dist/components/forms/form-retry/types.d.ts +84 -0
- package/dist/components/forms/form-retry/types.d.ts.map +1 -0
- package/dist/components/forms/form-retry/types.js +13 -0
- package/dist/components/forms/index.d.ts +21 -2
- package/dist/components/forms/index.d.ts.map +1 -1
- package/dist/components/forms/index.js +22 -1
- package/dist/components/forms/insert-text.d.ts +12 -0
- package/dist/components/forms/insert-text.d.ts.map +1 -0
- package/dist/components/forms/insert-text.js +38 -0
- package/dist/components/forms/long-press.d.ts +88 -0
- package/dist/components/forms/long-press.d.ts.map +1 -0
- package/dist/components/forms/long-press.js +213 -0
- package/dist/components/forms/native-file-field.d.ts +94 -0
- package/dist/components/forms/native-file-field.d.ts.map +1 -0
- package/dist/components/forms/native-file-field.js +147 -0
- package/dist/components/forms/ready-beep.d.ts +24 -0
- package/dist/components/forms/ready-beep.d.ts.map +1 -0
- package/dist/components/forms/ready-beep.js +82 -0
- package/dist/components/forms/signature-pad-logic.d.ts +50 -0
- package/dist/components/forms/signature-pad-logic.d.ts.map +1 -0
- package/dist/components/forms/signature-pad-logic.js +48 -0
- package/dist/components/forms/types.d.ts +41 -0
- package/dist/components/forms/types.d.ts.map +1 -1
- package/dist/components/layout/PageHeader.svelte +151 -17
- package/dist/components/layout/PageHeader.svelte.d.ts +47 -7
- package/dist/components/layout/PageHeader.svelte.d.ts.map +1 -1
- package/dist/components/layout/__tests__/PageHeader.test.js +87 -1
- package/dist/components/layout/index.d.ts +1 -0
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +1 -0
- package/dist/components/layout/page-header-context.d.ts +25 -0
- package/dist/components/layout/page-header-context.d.ts.map +1 -0
- package/dist/components/layout/page-header-context.js +16 -0
- package/dist/components/nav/FilterChips.svelte +8 -1
- package/dist/components/nav/FilterChips.svelte.d.ts +2 -0
- package/dist/components/nav/FilterChips.svelte.d.ts.map +1 -1
- package/dist/components/nav/Tabs.svelte +241 -0
- package/dist/components/nav/Tabs.svelte.d.ts +15 -0
- package/dist/components/nav/Tabs.svelte.d.ts.map +1 -1
- package/dist/components/nav/__tests__/LinkTabs.test.js +117 -0
- package/dist/components/nav/index.d.ts +1 -0
- package/dist/components/nav/index.d.ts.map +1 -1
- package/dist/components/nav/index.js +1 -0
- package/dist/components/nav/tabs-overflow.d.ts +12 -0
- package/dist/components/nav/tabs-overflow.d.ts.map +1 -0
- package/dist/components/nav/tabs-overflow.js +17 -0
- package/dist/components/nav/types.d.ts +8 -0
- package/dist/components/nav/types.d.ts.map +1 -1
- package/dist/components/ui/Button.svelte +16 -2
- package/dist/components/ui/Button.svelte.d.ts +2 -0
- package/dist/components/ui/Button.svelte.d.ts.map +1 -1
- package/dist/components/ui/Card.svelte +14 -5
- package/dist/components/ui/Dropdown.svelte +55 -1
- package/dist/components/ui/Dropdown.svelte.d.ts +8 -0
- package/dist/components/ui/Dropdown.svelte.d.ts.map +1 -1
- package/dist/components/ui/IconToggle.svelte +139 -0
- package/dist/components/ui/IconToggle.svelte.d.ts +32 -0
- package/dist/components/ui/IconToggle.svelte.d.ts.map +1 -0
- package/dist/components/ui/IconToggleGroup.svelte +56 -0
- package/dist/components/ui/IconToggleGroup.svelte.d.ts +21 -0
- package/dist/components/ui/IconToggleGroup.svelte.d.ts.map +1 -0
- package/dist/components/ui/Pagination.svelte +1 -1
- package/dist/components/ui/Popover.svelte +17 -1
- package/dist/components/ui/Popover.svelte.d.ts +8 -0
- package/dist/components/ui/Popover.svelte.d.ts.map +1 -1
- package/dist/components/ui/__tests__/IconToggle.test.js +59 -0
- package/dist/components/ui/__tests__/IconToggleGroup.test.js +30 -0
- package/dist/components/ui/__tests__/Popover.test.js +44 -0
- package/dist/components/ui/__tests__/dropdown-popover-icon.test.js +125 -0
- package/dist/components/ui/__tests__/phone-touch-targets.test.js +39 -0
- package/dist/components/ui/index.d.ts +2 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +2 -0
- package/dist/i18n/strings.ui.d.ts +65 -0
- package/dist/i18n/strings.ui.d.ts.map +1 -1
- package/dist/i18n/strings.ui.js +72 -0
- package/dist/styles/tokens.css +2 -0
- package/dist/svelte/__tests__/playground.test.js +3 -1
- package/dist/svelte/playground/CalendarPreview.svelte +140 -0
- package/dist/svelte/playground/CalendarPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/CalendarPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground/CapturePreview.svelte +56 -0
- package/dist/svelte/playground/CapturePreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/CapturePreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground.d.ts.map +1 -1
- package/dist/svelte/playground.js +20 -0
- package/dist/themes/ThemeProvider.svelte +9 -0
- package/dist/themes/ThemeProvider.svelte.d.ts +2 -0
- package/dist/themes/ThemeProvider.svelte.d.ts.map +1 -1
- package/dist/themes/css-generator.d.ts.map +1 -1
- package/dist/themes/css-generator.js +3 -0
- package/dist/themes/styles/glass.css +4 -0
- package/dist/themes/styles/happyvertical.css +4 -0
- package/dist/themes/styles/material.css +4 -0
- package/dist/themes/styles/smrt.css +4 -0
- package/dist/themes/styles/studio.css +4 -0
- package/dist/types-generic.d.ts +2 -0
- package/dist/types-generic.d.ts.map +1 -1
- package/package.json +9 -3
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `runOnce()` content digest, computed in the browser (#3291).
|
|
3
|
+
*
|
|
4
|
+
* `runOnce()` (`@happyvertical/smrt-core`, `src/run-once.ts`) digests the
|
|
5
|
+
* submitted content itself on the server, so pairing a form with it does NOT
|
|
6
|
+
* need this function: send the submission key, pass the action's `FormData`
|
|
7
|
+
* as `content`, and the server derives the claim. This exists for the cases
|
|
8
|
+
* where the browser needs the SAME digest the server will compute — to tell a
|
|
9
|
+
* person whether the retry they are about to send is byte-identical to the
|
|
10
|
+
* submit that may already be recorded, to key a client-side record of an
|
|
11
|
+
* attempt, or to log a correlatable identity without logging the content.
|
|
12
|
+
*
|
|
13
|
+
* It is a byte-for-byte port of core's `digestRunOnceContent()`, using Web
|
|
14
|
+
* Crypto (`crypto.subtle`) instead of `node:crypto`; shared test vectors in
|
|
15
|
+
* both packages hold the two together. The algorithm:
|
|
16
|
+
*
|
|
17
|
+
* - Content is normalized once, following JSON serialization exactly:
|
|
18
|
+
* `toJSON(key)` is called with the property name or array index (a `Date`
|
|
19
|
+
* digests as its ISO string), and `undefined`, function and symbol values
|
|
20
|
+
* are omitted from objects and written as `null` in arrays.
|
|
21
|
+
* - A `FormData` digests as its ORDERED entry list — repeated fields and their
|
|
22
|
+
* order are significant — because JSON would reduce every form to `{}` and
|
|
23
|
+
* collapse distinct submissions (#3136). A `File`/`Blob` entry digests by
|
|
24
|
+
* `{ name, size, type }`, never its bytes: re-choosing the same file after a
|
|
25
|
+
* reload reproduces the digest, and a different file of the same name, size
|
|
26
|
+
* and type does too.
|
|
27
|
+
* - Content containing a `FormData` is hashed in a separate domain (the input
|
|
28
|
+
* is prefixed with a byte sorted-key JSON never starts with, and user keys
|
|
29
|
+
* starting with NUL are escaped), so no plain object can forge it.
|
|
30
|
+
* - `Map`, `Set`, `RegExp`, any other non-plain object without `toJSON()`, and
|
|
31
|
+
* `bigint` are rejected with a `TypeError` rather than hashed as `{}`.
|
|
32
|
+
* - The digest is the lowercase hex sha256 of the sorted-key JSON encoding.
|
|
33
|
+
*
|
|
34
|
+
* `crypto.subtle` exists only in secure contexts (HTTPS, `localhost`); the
|
|
35
|
+
* function rejects with a clear error elsewhere.
|
|
36
|
+
*
|
|
37
|
+
* @module
|
|
38
|
+
*/
|
|
39
|
+
const FORM_DATA_TAG = '\u0000FormData';
|
|
40
|
+
const FORM_DATA_DOMAIN = '\u0001run-once-formdata-v1\n';
|
|
41
|
+
class NormalizedFormData {
|
|
42
|
+
entries;
|
|
43
|
+
constructor(entries) {
|
|
44
|
+
this.entries = entries;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const OMIT = Symbol('form-retry-digest-omit');
|
|
48
|
+
function normalize(input, state, key) {
|
|
49
|
+
let value = input;
|
|
50
|
+
if (value !== null &&
|
|
51
|
+
(typeof value === 'object' || typeof value === 'bigint') &&
|
|
52
|
+
typeof value.toJSON === 'function') {
|
|
53
|
+
value = value.toJSON(key);
|
|
54
|
+
}
|
|
55
|
+
if (value === null)
|
|
56
|
+
return null;
|
|
57
|
+
switch (typeof value) {
|
|
58
|
+
case 'undefined':
|
|
59
|
+
case 'function':
|
|
60
|
+
case 'symbol':
|
|
61
|
+
return OMIT;
|
|
62
|
+
case 'string':
|
|
63
|
+
case 'boolean':
|
|
64
|
+
return value;
|
|
65
|
+
case 'number':
|
|
66
|
+
return Number.isFinite(value) ? value : null;
|
|
67
|
+
case 'bigint':
|
|
68
|
+
throw new TypeError('submission content cannot contain a bigint; pass plain JSON data');
|
|
69
|
+
}
|
|
70
|
+
if (typeof FormData !== 'undefined' && value instanceof FormData) {
|
|
71
|
+
state.sawFormData = true;
|
|
72
|
+
const entries = [];
|
|
73
|
+
value.forEach((entry, name) => {
|
|
74
|
+
entries.push([name, normalize(entry, state, name)]);
|
|
75
|
+
});
|
|
76
|
+
return new NormalizedFormData(entries);
|
|
77
|
+
}
|
|
78
|
+
if (typeof Blob !== 'undefined' && value instanceof Blob) {
|
|
79
|
+
return {
|
|
80
|
+
name: value.name ?? null,
|
|
81
|
+
size: value.size,
|
|
82
|
+
type: value.type,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (Array.isArray(value)) {
|
|
86
|
+
return value.map((item, index) => {
|
|
87
|
+
const normalized = normalize(item, state, String(index));
|
|
88
|
+
return normalized === OMIT ? null : normalized;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const prototype = Object.getPrototypeOf(value);
|
|
92
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
93
|
+
const name = value.constructor?.name ||
|
|
94
|
+
'non-plain object';
|
|
95
|
+
throw new TypeError(`submission content cannot contain a ${name}; convert it to plain JSON data`);
|
|
96
|
+
}
|
|
97
|
+
const result = Object.create(null);
|
|
98
|
+
for (const [member, memberValue] of Object.entries(value)) {
|
|
99
|
+
const normalized = normalize(memberValue, state, member);
|
|
100
|
+
if (normalized !== OMIT)
|
|
101
|
+
result[member] = normalized;
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
function toFormDataDomain(value) {
|
|
106
|
+
if (value instanceof NormalizedFormData) {
|
|
107
|
+
return {
|
|
108
|
+
[FORM_DATA_TAG]: value.entries.map(([key, entry]) => [
|
|
109
|
+
key,
|
|
110
|
+
toFormDataDomain(entry),
|
|
111
|
+
]),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (Array.isArray(value))
|
|
115
|
+
return value.map(toFormDataDomain);
|
|
116
|
+
if (value !== null && typeof value === 'object') {
|
|
117
|
+
const result = Object.create(null);
|
|
118
|
+
for (const [key, member] of Object.entries(value)) {
|
|
119
|
+
result[key.startsWith('\u0000') ? `\u0000${key}` : key] =
|
|
120
|
+
toFormDataDomain(member);
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
/** Sorted-key JSON, identical to `@happyvertical/smrt-scanner`'s `stableStringify`. */
|
|
127
|
+
function sortValue(value) {
|
|
128
|
+
if (Array.isArray(value))
|
|
129
|
+
return value.map(sortValue);
|
|
130
|
+
if (value && typeof value === 'object') {
|
|
131
|
+
const sorted = Object.create(null);
|
|
132
|
+
for (const key of Object.keys(value).sort()) {
|
|
133
|
+
sorted[key] = sortValue(value[key]);
|
|
134
|
+
}
|
|
135
|
+
return sorted;
|
|
136
|
+
}
|
|
137
|
+
return value;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The exact string `runOnce()` hashes for `content`.
|
|
141
|
+
* @throws {TypeError} when `content` contains a value with no faithful JSON form.
|
|
142
|
+
* @internal
|
|
143
|
+
*/
|
|
144
|
+
export function submissionDigestInput(content) {
|
|
145
|
+
const state = { sawFormData: false };
|
|
146
|
+
const captured = normalize(content, state, '');
|
|
147
|
+
const normalized = captured === OMIT ? null : captured;
|
|
148
|
+
return state.sawFormData
|
|
149
|
+
? FORM_DATA_DOMAIN + JSON.stringify(sortValue(toFormDataDomain(normalized)))
|
|
150
|
+
: JSON.stringify(sortValue(normalized));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* The content digest `runOnce()` will compute on the server for `content`:
|
|
154
|
+
* lowercase hex sha256. See the module doc for what is and is not digested
|
|
155
|
+
* (a `File` by name, size and type — never its bytes).
|
|
156
|
+
*
|
|
157
|
+
* @throws {TypeError} (as a rejection) when `content` has no faithful JSON
|
|
158
|
+
* form, or when Web Crypto is unavailable (not a secure context).
|
|
159
|
+
*/
|
|
160
|
+
export async function digestSubmissionContent(content) {
|
|
161
|
+
const input = submissionDigestInput(content);
|
|
162
|
+
const subtle = globalThis.crypto?.subtle;
|
|
163
|
+
if (!subtle) {
|
|
164
|
+
throw new TypeError('digestSubmissionContent needs Web Crypto (crypto.subtle), which browsers expose only in secure contexts (HTTPS or localhost)');
|
|
165
|
+
}
|
|
166
|
+
const bytes = new TextEncoder().encode(input);
|
|
167
|
+
const hash = await subtle.digest('SHA-256', bytes);
|
|
168
|
+
return Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
169
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createFormRetry()`: the browser half of `runOnce()` for a SvelteKit
|
|
3
|
+
* enhanced form (#3291).
|
|
4
|
+
*
|
|
5
|
+
* One controller per form. It owns the submission key (`submission-key.ts`),
|
|
6
|
+
* the conditional reset (`form-draft.ts`) and, when asked, the
|
|
7
|
+
* restore-after-reload draft (`submitted-draft.ts`), and exposes them as:
|
|
8
|
+
*
|
|
9
|
+
* - `enhance(submit?)` — a submit function in SvelteKit's `SubmitFunction`
|
|
10
|
+
* shape, for `<form method="POST" use:enhance={retry.enhance()}>`;
|
|
11
|
+
* - `attach` / `action` — an attachment (`{@attach retry.attach}`) or action
|
|
12
|
+
* (`use:retry.action`) that keeps a hidden key field in the form and puts a
|
|
13
|
+
* restored draft back into its controls;
|
|
14
|
+
* - `subscribe` — the Svelte store contract, so `$retry.status` and
|
|
15
|
+
* `$retry.token` are reactive in a component without this module importing
|
|
16
|
+
* Svelte.
|
|
17
|
+
*
|
|
18
|
+
* It is framework-free TypeScript: no `@sveltejs/kit` and no `svelte` import.
|
|
19
|
+
*
|
|
20
|
+
* ## What happens to one submit
|
|
21
|
+
*
|
|
22
|
+
* 1. A file the restored draft says was chosen, but is not chosen now, refuses
|
|
23
|
+
* the submit (`status: 'files-required'`) — a native file input cannot be
|
|
24
|
+
* restored, and sending without it would silently be different content.
|
|
25
|
+
* 2. A submit while another is unresolved is refused (`status: 'busy'`) and
|
|
26
|
+
* nothing is sent; the form keeps what the person typed.
|
|
27
|
+
* 3. Otherwise the key is written into the outgoing `FormData` (so the body is
|
|
28
|
+
* right even if a hidden field is stale or missing) and what the person can
|
|
29
|
+
* see is snapshotted — before the page's own submit function runs, because
|
|
30
|
+
* kit built the body before calling it. With restore enabled, the submitted
|
|
31
|
+
* values are then kept beside the key.
|
|
32
|
+
* 4. The result settles the slot:
|
|
33
|
+
* - `error` (transport failure, lost response, thrown server error): the key,
|
|
34
|
+
* the form and the draft are all kept, and `update()` is NOT called —
|
|
35
|
+
* `enhance`'s default would apply the error and can unmount the form. The
|
|
36
|
+
* unchanged re-submit is the same claim.
|
|
37
|
+
* - `failure` (validation): applied without rotating; the draft is dropped
|
|
38
|
+
* because nothing was recorded.
|
|
39
|
+
* - `success`: the draft is dropped; the form is reset — and the key
|
|
40
|
+
* rotated — only if the fields are unchanged since the submit. A person who
|
|
41
|
+
* typed the next entry while the first was in flight keeps it, under the
|
|
42
|
+
* same key, and sending it is a different claim because its content
|
|
43
|
+
* differs. With the page's own result callback, the key rotates only if
|
|
44
|
+
* the form is actually reset while that callback runs.
|
|
45
|
+
* - `redirect`: a confirmed write only with `redirectConfirmsWrite: true`.
|
|
46
|
+
* - A late result for a submit already settled is ignored entirely.
|
|
47
|
+
*
|
|
48
|
+
* An aborted request (the page called `controller.abort()`, before or during
|
|
49
|
+
* the request — including from its own submit function) produces no result
|
|
50
|
+
* from `enhance`; it settles like a transport error so the form is not stuck
|
|
51
|
+
* refusing submits.
|
|
52
|
+
*
|
|
53
|
+
* @module
|
|
54
|
+
*/
|
|
55
|
+
import { type FormRetryStorage } from './submission-key.js';
|
|
56
|
+
import { type SubmittedDraft } from './submitted-draft.js';
|
|
57
|
+
import type { FormRetrySubmitFunction } from './types.js';
|
|
58
|
+
/** Where the controller is in a submit's life. */
|
|
59
|
+
export type FormRetryStatus =
|
|
60
|
+
/** Nothing submitted yet, or a submit was cancelled by the page. */
|
|
61
|
+
'idle'
|
|
62
|
+
/** A submit is in flight. */
|
|
63
|
+
| 'submitting'
|
|
64
|
+
/** A second submit was refused while one is in flight; nothing was sent. */
|
|
65
|
+
| 'busy'
|
|
66
|
+
/** A restored draft had files that are not chosen again; nothing was sent. */
|
|
67
|
+
| 'files-required'
|
|
68
|
+
/** The last submit got no result; send it again unchanged. */
|
|
69
|
+
| 'transport-error'
|
|
70
|
+
/** The last submit failed validation; nothing was written. */
|
|
71
|
+
| 'failure'
|
|
72
|
+
/** The last submit was confirmed written. */
|
|
73
|
+
| 'success'
|
|
74
|
+
/** The last submit redirected without `redirectConfirmsWrite`. */
|
|
75
|
+
| 'redirect';
|
|
76
|
+
/** A snapshot of the controller, as `subscribe` delivers it. */
|
|
77
|
+
export interface FormRetryState {
|
|
78
|
+
/** The key the next submit carries. */
|
|
79
|
+
token: string;
|
|
80
|
+
/** The key of the unresolved submit, or `null` when idle. */
|
|
81
|
+
inFlight: string | null;
|
|
82
|
+
/** Where the controller is in a submit's life. */
|
|
83
|
+
status: FormRetryStatus;
|
|
84
|
+
/** A submitted draft from before a reload was restored into this form. */
|
|
85
|
+
restored: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* File fields whose file must be chosen again before a submit is allowed:
|
|
88
|
+
* the restored draft says a file was sent, and a file input cannot be
|
|
89
|
+
* restored. Empty when nothing is outstanding.
|
|
90
|
+
*/
|
|
91
|
+
filesToReselect: readonly string[];
|
|
92
|
+
/**
|
|
93
|
+
* Whether the key lives in the tab's storage and survives a reload. `false`
|
|
94
|
+
* in a private window or webview that refuses storage: the key then lives in
|
|
95
|
+
* memory for the life of the page.
|
|
96
|
+
*/
|
|
97
|
+
persistent: boolean;
|
|
98
|
+
}
|
|
99
|
+
/** Non-field state to keep beside the submitted values (opt-in restore). */
|
|
100
|
+
export interface FormRetryValuesHook<T = unknown> {
|
|
101
|
+
/**
|
|
102
|
+
* What to keep for this submit — values the page holds outside form fields
|
|
103
|
+
* (an uploaded asset's id, a signature capture key, a selection). Must be
|
|
104
|
+
* JSON-serializable: a result that is not keeps no draft for that submit
|
|
105
|
+
* and drops an earlier attempt's. Called after the submit is accepted.
|
|
106
|
+
*/
|
|
107
|
+
capture: (formData: FormData) => T;
|
|
108
|
+
/**
|
|
109
|
+
* Put a kept value back after a reload. `value` came from storage: validate
|
|
110
|
+
* it before trusting it, and throw to reject it — the whole draft is then
|
|
111
|
+
* discarded. Called synchronously inside `createFormRetry()`.
|
|
112
|
+
*/
|
|
113
|
+
restore: (value: unknown) => void;
|
|
114
|
+
}
|
|
115
|
+
/** Opt-in restore-after-reload. */
|
|
116
|
+
export interface FormRetryRestoreOptions {
|
|
117
|
+
/**
|
|
118
|
+
* A stable id for whoever is signed in (e.g. `tenantId:userId`). A draft is
|
|
119
|
+
* restored only for the owner it was saved by, and never for an empty owner,
|
|
120
|
+
* so one person's draft is never offered to the next on shared hardware.
|
|
121
|
+
*/
|
|
122
|
+
owner: string;
|
|
123
|
+
/** Oldest draft that may be restored, in ms. Default one day. */
|
|
124
|
+
maxAgeMs?: number;
|
|
125
|
+
/** A stricter freshness rule (e.g. "same business day"); overrides `maxAgeMs`. */
|
|
126
|
+
fresh?: (savedAt: Date, now: Date) => boolean;
|
|
127
|
+
/** Non-field state to keep and restore. */
|
|
128
|
+
values?: FormRetryValuesHook;
|
|
129
|
+
/** Fields never written to storage (password inputs are always skipped). */
|
|
130
|
+
exclude?: readonly string[];
|
|
131
|
+
/**
|
|
132
|
+
* Exact storage name for the draft, overriding the derived
|
|
133
|
+
* `smrt:form-retry:<form>[:<scope>]:draft`.
|
|
134
|
+
*/
|
|
135
|
+
storageKey?: string;
|
|
136
|
+
}
|
|
137
|
+
/** Options for {@link createFormRetry}. */
|
|
138
|
+
export interface FormRetryOptions {
|
|
139
|
+
/** The form's slot. One slot per FORM: two forms on a page need two names. */
|
|
140
|
+
form: string;
|
|
141
|
+
/** One key per record when a form is rendered once per row. */
|
|
142
|
+
scope?: string;
|
|
143
|
+
/** Hidden field that carries the key. Default `submissionKey`. */
|
|
144
|
+
fieldName?: string;
|
|
145
|
+
/**
|
|
146
|
+
* Fields whose change after a submit is not an edit, left out of the
|
|
147
|
+
* "unchanged since submit" check that decides the success reset — e.g. a
|
|
148
|
+
* hidden nonce the page rewrites. Every other control counts, hidden inputs
|
|
149
|
+
* included (choice controls post through them); the key field is always
|
|
150
|
+
* left out. Not a storage rule: use `restore.exclude` for that.
|
|
151
|
+
*/
|
|
152
|
+
ignoreFields?: readonly string[];
|
|
153
|
+
/** Backing store. Default `sessionStorage`; `null` keeps everything in memory. */
|
|
154
|
+
storage?: FormRetryStorage | null;
|
|
155
|
+
/** Exact storage name for the key (migration from an older name). */
|
|
156
|
+
storageKey?: string;
|
|
157
|
+
/** Mints a key. Default: a random UUID v4. */
|
|
158
|
+
mint?: () => string;
|
|
159
|
+
/**
|
|
160
|
+
* Treat a `redirect` result as a confirmed write (rotate the key, drop the
|
|
161
|
+
* draft). Default `false`: a redirect cannot vouch for a write on its own.
|
|
162
|
+
*/
|
|
163
|
+
redirectConfirmsWrite?: boolean;
|
|
164
|
+
/** Opt-in restore-after-reload. */
|
|
165
|
+
restore?: FormRetryRestoreOptions;
|
|
166
|
+
/** Clock seam for draft timestamps and freshness. */
|
|
167
|
+
now?: () => Date;
|
|
168
|
+
}
|
|
169
|
+
/** A form's retry controller. */
|
|
170
|
+
export interface FormRetry {
|
|
171
|
+
/** The key the next submit carries. */
|
|
172
|
+
readonly token: string;
|
|
173
|
+
/** The hidden field name that carries the key. */
|
|
174
|
+
readonly fieldName: string;
|
|
175
|
+
/** The current state. */
|
|
176
|
+
readonly state: FormRetryState;
|
|
177
|
+
/** The draft restored after a reload, or `null`. */
|
|
178
|
+
readonly restored: SubmittedDraft | null;
|
|
179
|
+
/** Svelte store contract: called now and on every change; returns unsubscribe. */
|
|
180
|
+
subscribe(listener: (state: FormRetryState) => void): () => void;
|
|
181
|
+
/**
|
|
182
|
+
* A submit function for `use:enhance`. An optional inner submit function runs
|
|
183
|
+
* after the retry gate (it sees the key in `formData` and may still
|
|
184
|
+
* `cancel()`); its returned callback, if any, replaces the default
|
|
185
|
+
* `update({ reset })` for applied results and receives an `update` whose
|
|
186
|
+
* default `reset` is the safe one. On a success it also decides whether the
|
|
187
|
+
* key retires: only a reset of the form while it runs (through `update()` or
|
|
188
|
+
* `form.reset()`) rotates the key, so values it keeps on screen keep their
|
|
189
|
+
* key. Transport errors and stale results never reach it — observe `status`
|
|
190
|
+
* instead.
|
|
191
|
+
*/
|
|
192
|
+
enhance(submit?: FormRetrySubmitFunction): FormRetrySubmitFunction;
|
|
193
|
+
/** Attachment: `{@attach retry.attach}`. Returns its cleanup. */
|
|
194
|
+
attach: (form: HTMLFormElement) => () => void;
|
|
195
|
+
/** Action: `use:retry.action`. */
|
|
196
|
+
action: (form: HTMLFormElement) => {
|
|
197
|
+
destroy(): void;
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Abandon this fill: drop the stored draft and rotate the key, so the next
|
|
201
|
+
* submit is a new submission. For a "start over" control.
|
|
202
|
+
*
|
|
203
|
+
* Refused while a submit is in flight: that request may already have
|
|
204
|
+
* written, and if its response is lost the unchanged resend must still
|
|
205
|
+
* carry its key (and a reload must still find its draft). Returns `false`
|
|
206
|
+
* and changes nothing then; disable the control while
|
|
207
|
+
* `$retry.inFlight` is set, or call it again once the submit settles.
|
|
208
|
+
* Returns `true` when the fill was discarded.
|
|
209
|
+
*/
|
|
210
|
+
discard(): boolean;
|
|
211
|
+
}
|
|
212
|
+
/** Create the retry controller for one form. */
|
|
213
|
+
export declare function createFormRetry(options: FormRetryOptions): FormRetry;
|
|
214
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/form-retry/controller.ts"],"names":[],"mappings":"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"}
|