@multiplatform.one/forms 7.6.3 → 7.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/AdaptivePopup/index.native.js +1 -1
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/index.cjs +8 -2
- package/dist/cjs/Button/index.native.js +14 -3
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/Chip/index.cjs +1 -3
- package/dist/cjs/Chip/index.native.js +5 -3
- package/dist/cjs/Chip/index.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/index.cjs +19 -3
- package/dist/cjs/ContextualSaveBar/index.native.js +22 -6
- package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
- package/dist/cjs/ControlGroup/index.native.js +1 -1
- package/dist/cjs/ControlGroup/index.native.js.map +1 -1
- package/dist/cjs/DescriptionList/index.cjs +41 -13
- package/dist/cjs/DescriptionList/index.native.js +45 -15
- package/dist/cjs/DescriptionList/index.native.js.map +1 -1
- package/dist/cjs/ErrorSummary.cjs +4 -1
- package/dist/cjs/ErrorSummary.native.js +4 -1
- package/dist/cjs/ErrorSummary.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/index.native.js +1 -1
- package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
- package/dist/cjs/FieldGroup.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +24 -2
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +43 -2
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/cjs/Form/index.native.js +1 -1
- package/dist/cjs/Form/index.native.js.map +1 -1
- package/dist/cjs/Form/validateOn.native.js.map +1 -1
- package/dist/cjs/FormGrid.native.js.map +1 -1
- package/dist/cjs/FormSection.native.js.map +1 -1
- package/dist/cjs/InputParts/index.cjs +42 -2
- package/dist/cjs/InputParts/index.native.js +42 -2
- package/dist/cjs/InputParts/index.native.js.map +1 -1
- package/dist/cjs/Label/index.native.js.map +1 -1
- package/dist/cjs/Skeleton/index.native.js.map +1 -1
- package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
- package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
- package/dist/cjs/Table/index.native.js.map +1 -1
- package/dist/cjs/Wheel/haptic.native.js.map +1 -1
- package/dist/cjs/Wheel/index.native.js.map +1 -1
- package/dist/cjs/actionLabel.native.js.map +1 -1
- package/dist/cjs/fieldDefaults.native.js.map +1 -1
- package/dist/cjs/fieldLayout.native.js +1 -1
- package/dist/cjs/fieldLayout.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
- package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/index.native.js +2 -2
- package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/Checkbox.cjs +5 -2
- package/dist/cjs/fields/Checkbox/Checkbox.native.js +7 -4
- package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxBox.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxCard.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxGroup.cjs +69 -59
- package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +76 -66
- package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/checkboxGroupContext.cjs +33 -0
- package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js +36 -0
- package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
- package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/index.native.js +3 -3
- package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/parts.native.js +2 -2
- package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
- package/dist/cjs/fields/Combobox/index.native.js +5 -5
- package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +402 -0
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +441 -0
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
- package/dist/cjs/fields/DatePicker/DatetimePicker.cjs +2 -376
- package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +70 -298
- package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/catalog.cjs +306 -0
- package/dist/cjs/fields/DatePicker/catalog.native.js +350 -0
- package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -0
- package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/index.cjs +7 -280
- package/dist/cjs/fields/DatePicker/index.native.js +67 -186
- package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/parts.cjs +12 -9
- package/dist/cjs/fields/DatePicker/parts.native.js +14 -11
- package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/utils.native.js.map +1 -1
- package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
- package/dist/cjs/fields/Duration/index.cjs +29 -3
- package/dist/cjs/fields/Duration/index.native.js +32 -6
- package/dist/cjs/fields/Duration/index.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload/filePickerTypes.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload/index.cjs +0 -1
- package/dist/cjs/fields/FileUpload/index.native.js +7 -3
- package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
- package/dist/cjs/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/geoValue.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/index.native.js +5 -5
- package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/mapMath.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/mapTypes.native.js.map +1 -1
- package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/cjs/fields/Icon/index.native.js +3 -3
- package/dist/cjs/fields/Icon/index.native.js.map +1 -1
- package/dist/cjs/fields/ImageField/index.native.js +2 -2
- package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
- package/dist/cjs/fields/Input/index.native.js +2 -2
- package/dist/cjs/fields/Input/index.native.js.map +1 -1
- package/dist/cjs/fields/MentionInput/index.native.js +3 -3
- package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
- package/dist/cjs/fields/OTPInput/index.native.js +3 -3
- package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
- package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/index.cjs +9 -4
- package/dist/cjs/fields/PhoneInput/index.native.js +16 -9
- package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/phone.native.js.map +1 -1
- package/dist/cjs/fields/Progress/index.native.js +1 -1
- package/dist/cjs/fields/Progress/index.native.js.map +1 -1
- package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
- package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/Rating/index.cjs +1 -1
- package/dist/cjs/fields/Rating/index.native.js +5 -2
- package/dist/cjs/fields/Rating/index.native.js.map +1 -1
- package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
- package/dist/cjs/fields/Rating/types.native.js.map +1 -1
- package/dist/cjs/fields/SearchInput/index.cjs +6 -0
- package/dist/cjs/fields/SearchInput/index.native.js +8 -2
- package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.cjs +88 -2
- package/dist/cjs/fields/Select/index.native.js +94 -6
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Signature/index.cjs +9 -5
- package/dist/cjs/fields/Signature/index.native.js +11 -7
- package/dist/cjs/fields/Signature/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/index.cjs +3 -1
- package/dist/cjs/fields/Slider/index.native.js +4 -2
- package/dist/cjs/fields/Slider/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/cjs/fields/Stepper/index.native.js +2 -2
- package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
- package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
- package/dist/cjs/fields/Switch/index.cjs +5 -18
- package/dist/cjs/fields/Switch/index.native.js +7 -20
- package/dist/cjs/fields/Switch/index.native.js.map +1 -1
- package/dist/cjs/fields/TextArea/index.cjs +19 -5
- package/dist/cjs/fields/TextArea/index.native.js +25 -7
- package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/catalog.cjs +203 -0
- package/dist/cjs/fields/TimePicker/catalog.native.js +227 -0
- package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -0
- package/dist/cjs/fields/TimePicker/index.cjs +6 -177
- package/dist/cjs/fields/TimePicker/index.native.js +75 -86
- package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/parts.native.js +1 -1
- package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/TimeRangeScrubber/geometry.cjs +6 -0
- package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js +6 -0
- package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
- package/dist/cjs/fields/TimeRangeScrubber/index.cjs +34 -14
- package/dist/cjs/fields/TimeRangeScrubber/index.native.js +40 -16
- package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
- package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
- package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +202 -0
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +211 -0
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
- package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.cjs +30 -0
- package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js +33 -0
- package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
- package/dist/cjs/fields/nativeSelect.cjs +30 -0
- package/dist/cjs/fields/nativeSelect.native.js +33 -0
- package/dist/cjs/fields/nativeSelect.native.js.map +1 -0
- package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
- package/dist/cjs/formSpacing.native.js.map +1 -1
- package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.native.js +44 -43
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/requiredMarking.native.js.map +1 -1
- package/dist/cjs/shared/TimeColumn.native.js +1 -1
- package/dist/cjs/shared/TimeColumn.native.js.map +1 -1
- package/dist/cjs/shared/capabilityPreflight.native.js.map +1 -1
- package/dist/cjs/shared/colorRamps.native.js.map +1 -1
- package/dist/cjs/shared/devWarn.native.js.map +1 -1
- package/dist/cjs/shared/floatingList.native.js +1 -1
- package/dist/cjs/shared/floatingList.native.js.map +1 -1
- package/dist/cjs/shared/focusManagement.native.js.map +1 -1
- package/dist/cjs/shared/groupContext.native.js.map +1 -1
- package/dist/cjs/shared/i18n.native.js.map +1 -1
- package/dist/cjs/shared/t.native.js.map +1 -1
- package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
- package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
- package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
- package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
- package/dist/cjs/shared/utils.native.js +1 -1
- package/dist/cjs/shared/utils.native.js.map +1 -1
- package/dist/cjs/shared/zIndex.native.js.map +1 -1
- package/dist/cjs/themedPrimitives.cjs +5 -0
- package/dist/cjs/themedPrimitives.native.js +5 -0
- package/dist/cjs/themedPrimitives.native.js.map +1 -1
- package/dist/cjs/types.native.js.map +1 -1
- package/dist/cjs/utils/LinkCell.native.js.map +1 -1
- package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +9 -3
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +14 -3
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/Chip/index.mjs +1 -3
- package/dist/esm/Chip/index.mjs.map +1 -1
- package/dist/esm/Chip/index.native.js +5 -3
- package/dist/esm/Chip/index.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/index.mjs +19 -3
- package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
- package/dist/esm/ContextualSaveBar/index.native.js +19 -3
- package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
- package/dist/esm/ControlGroup/index.native.js.map +1 -1
- package/dist/esm/DescriptionList/index.mjs +41 -13
- package/dist/esm/DescriptionList/index.mjs.map +1 -1
- package/dist/esm/DescriptionList/index.native.js +43 -13
- package/dist/esm/DescriptionList/index.native.js.map +1 -1
- package/dist/esm/ErrorSummary.mjs +5 -2
- package/dist/esm/ErrorSummary.mjs.map +1 -1
- package/dist/esm/ErrorSummary.native.js +5 -2
- package/dist/esm/ErrorSummary.native.js.map +1 -1
- package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
- package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
- package/dist/esm/FieldDisplay/index.native.js.map +1 -1
- package/dist/esm/FieldGroup.native.js.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs +24 -3
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js +43 -3
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/esm/Form/index.native.js.map +1 -1
- package/dist/esm/Form/validateOn.native.js.map +1 -1
- package/dist/esm/FormGrid.native.js.map +1 -1
- package/dist/esm/FormSection.native.js.map +1 -1
- package/dist/esm/InputParts/index.mjs +43 -3
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +43 -3
- package/dist/esm/InputParts/index.native.js.map +1 -1
- package/dist/esm/Label/index.native.js.map +1 -1
- package/dist/esm/Skeleton/index.native.js.map +1 -1
- package/dist/esm/Spinner/SpinnerGlyph.native.js.map +1 -1
- package/dist/esm/Spinner/spinnerSize.native.js.map +1 -1
- package/dist/esm/Table/index.native.js.map +1 -1
- package/dist/esm/Wheel/haptic.native.js.map +1 -1
- package/dist/esm/Wheel/index.native.js.map +1 -1
- package/dist/esm/actionLabel.native.js.map +1 -1
- package/dist/esm/fieldDefaults.native.js.map +1 -1
- package/dist/esm/fieldLayout.native.js.map +1 -1
- package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
- package/dist/esm/fields/Barcode/index.native.js.map +1 -1
- package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
- package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.mjs +5 -2
- package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.native.js +6 -3
- package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxBox.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxCard.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxGroup.mjs +69 -59
- package/dist/esm/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxGroup.native.js +75 -65
- package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/checkboxGroupContext.mjs +7 -0
- package/dist/esm/fields/Checkbox/checkboxGroupContext.mjs.map +1 -0
- package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js +7 -0
- package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
- package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +377 -0
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -0
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +413 -0
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
- package/dist/esm/fields/DatePicker/DatetimePicker.mjs +1 -375
- package/dist/esm/fields/DatePicker/DatetimePicker.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.native.js +65 -293
- package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/catalog.mjs +276 -0
- package/dist/esm/fields/DatePicker/catalog.mjs.map +1 -0
- package/dist/esm/fields/DatePicker/catalog.native.js +317 -0
- package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -0
- package/dist/esm/fields/DatePicker/fieldValueSync.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/index.mjs +1 -274
- package/dist/esm/fields/DatePicker/index.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/index.native.js +60 -179
- package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/parts.mjs +13 -10
- package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/parts.native.js +13 -10
- package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/utils.native.js.map +1 -1
- package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
- package/dist/esm/fields/Duration/index.mjs +29 -4
- package/dist/esm/fields/Duration/index.mjs.map +1 -1
- package/dist/esm/fields/Duration/index.native.js +29 -4
- package/dist/esm/fields/Duration/index.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/index.mjs +0 -1
- package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
- package/dist/esm/fields/FileUpload/index.native.js +5 -1
- package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/mapMath.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/mapTypes.native.js.map +1 -1
- package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/esm/fields/Icon/index.native.js.map +1 -1
- package/dist/esm/fields/ImageField/index.native.js.map +1 -1
- package/dist/esm/fields/Input/index.native.js.map +1 -1
- package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
- package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
- package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/index.mjs +9 -4
- package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
- package/dist/esm/fields/PhoneInput/index.native.js +13 -6
- package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
- package/dist/esm/fields/Progress/index.native.js.map +1 -1
- package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/esm/fields/Rating/index.mjs +2 -2
- package/dist/esm/fields/Rating/index.mjs.map +1 -1
- package/dist/esm/fields/Rating/index.native.js +5 -2
- package/dist/esm/fields/Rating/index.native.js.map +1 -1
- package/dist/esm/fields/Rating/ratingMath.native.js.map +1 -1
- package/dist/esm/fields/Rating/types.native.js.map +1 -1
- package/dist/esm/fields/SearchInput/index.mjs +6 -0
- package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
- package/dist/esm/fields/SearchInput/index.native.js +6 -0
- package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
- package/dist/esm/fields/Select/index.mjs +78 -3
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +80 -3
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/Signature/index.mjs +10 -6
- package/dist/esm/fields/Signature/index.mjs.map +1 -1
- package/dist/esm/fields/Signature/index.native.js +10 -6
- package/dist/esm/fields/Signature/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/index.mjs +4 -2
- package/dist/esm/fields/Slider/index.mjs.map +1 -1
- package/dist/esm/fields/Slider/index.native.js +4 -2
- package/dist/esm/fields/Slider/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/esm/fields/Stepper/index.native.js.map +1 -1
- package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
- package/dist/esm/fields/Switch/index.mjs +6 -19
- package/dist/esm/fields/Switch/index.mjs.map +1 -1
- package/dist/esm/fields/Switch/index.native.js +6 -19
- package/dist/esm/fields/Switch/index.native.js.map +1 -1
- package/dist/esm/fields/TextArea/index.mjs +19 -5
- package/dist/esm/fields/TextArea/index.mjs.map +1 -1
- package/dist/esm/fields/TextArea/index.native.js +23 -5
- package/dist/esm/fields/TextArea/index.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/catalog.mjs +174 -0
- package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -0
- package/dist/esm/fields/TimePicker/catalog.native.js +195 -0
- package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -0
- package/dist/esm/fields/TimePicker/index.mjs +2 -173
- package/dist/esm/fields/TimePicker/index.mjs.map +1 -1
- package/dist/esm/fields/TimePicker/index.native.js +76 -87
- package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
- package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/esm/fields/TimeRangeScrubber/geometry.mjs +6 -1
- package/dist/esm/fields/TimeRangeScrubber/geometry.mjs.map +1 -1
- package/dist/esm/fields/TimeRangeScrubber/geometry.native.js +6 -1
- package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
- package/dist/esm/fields/TimeRangeScrubber/index.mjs +37 -18
- package/dist/esm/fields/TimeRangeScrubber/index.mjs.map +1 -1
- package/dist/esm/fields/TimeRangeScrubber/index.native.js +41 -18
- package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
- package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +166 -0
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -0
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +172 -0
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs +5 -0
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -0
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js +5 -0
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
- package/dist/esm/fields/nativeSelect.mjs +5 -0
- package/dist/esm/fields/nativeSelect.mjs.map +1 -0
- package/dist/esm/fields/nativeSelect.native.js +5 -0
- package/dist/esm/fields/nativeSelect.native.js.map +1 -0
- package/dist/esm/fields/selectedOrder.native.js.map +1 -1
- package/dist/esm/formSpacing.native.js.map +1 -1
- package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -2
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/requiredMarking.native.js.map +1 -1
- package/dist/esm/shared/TimeColumn.native.js.map +1 -1
- package/dist/esm/shared/capabilityPreflight.native.js.map +1 -1
- package/dist/esm/shared/colorRamps.native.js.map +1 -1
- package/dist/esm/shared/devWarn.native.js.map +1 -1
- package/dist/esm/shared/floatingList.native.js.map +1 -1
- package/dist/esm/shared/focusManagement.native.js.map +1 -1
- package/dist/esm/shared/groupContext.native.js.map +1 -1
- package/dist/esm/shared/i18n.native.js.map +1 -1
- package/dist/esm/shared/t.native.js.map +1 -1
- package/dist/esm/shared/tableCellContext.native.js.map +1 -1
- package/dist/esm/shared/useDragScroll.native.js.map +1 -1
- package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
- package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
- package/dist/esm/shared/utils.native.js.map +1 -1
- package/dist/esm/shared/zIndex.native.js.map +1 -1
- package/dist/esm/themedPrimitives.mjs +5 -0
- package/dist/esm/themedPrimitives.mjs.map +1 -1
- package/dist/esm/themedPrimitives.native.js +5 -0
- package/dist/esm/themedPrimitives.native.js.map +1 -1
- package/dist/esm/types.native.js.map +1 -1
- package/dist/esm/utils/LinkCell.native.js.map +1 -1
- package/dist/jsx/AdaptivePopup/index.native.js +1 -1
- package/dist/jsx/AdaptivePopup/index.native.js.map +1 -1
- package/dist/jsx/Button/index.mjs +9 -3
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +14 -3
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/Chip/index.mjs +1 -3
- package/dist/jsx/Chip/index.mjs.map +1 -1
- package/dist/jsx/Chip/index.native.js +5 -3
- package/dist/jsx/Chip/index.native.js.map +1 -1
- package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
- package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/jsx/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
- package/dist/jsx/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
- package/dist/jsx/ContextualSaveBar/index.mjs +19 -3
- package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
- package/dist/jsx/ContextualSaveBar/index.native.js +22 -6
- package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
- package/dist/jsx/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
- package/dist/jsx/ControlGroup/index.native.js +1 -1
- package/dist/jsx/ControlGroup/index.native.js.map +1 -1
- package/dist/jsx/DescriptionList/index.mjs +41 -13
- package/dist/jsx/DescriptionList/index.mjs.map +1 -1
- package/dist/jsx/DescriptionList/index.native.js +45 -15
- package/dist/jsx/DescriptionList/index.native.js.map +1 -1
- package/dist/jsx/ErrorSummary.mjs +5 -2
- package/dist/jsx/ErrorSummary.mjs.map +1 -1
- package/dist/jsx/ErrorSummary.native.js +4 -1
- package/dist/jsx/ErrorSummary.native.js.map +1 -1
- package/dist/jsx/FieldDisplay/editMode.native.js.map +1 -1
- package/dist/jsx/FieldDisplay/formatters.native.js.map +1 -1
- package/dist/jsx/FieldDisplay/index.native.js +1 -1
- package/dist/jsx/FieldDisplay/index.native.js.map +1 -1
- package/dist/jsx/FieldGroup.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +24 -3
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +43 -2
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/jsx/Form/index.native.js +1 -1
- package/dist/jsx/Form/index.native.js.map +1 -1
- package/dist/jsx/Form/validateOn.native.js.map +1 -1
- package/dist/jsx/FormGrid.native.js.map +1 -1
- package/dist/jsx/FormSection.native.js.map +1 -1
- package/dist/jsx/InputParts/index.mjs +43 -3
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +42 -2
- package/dist/jsx/InputParts/index.native.js.map +1 -1
- package/dist/jsx/Label/index.native.js.map +1 -1
- package/dist/jsx/Skeleton/index.native.js.map +1 -1
- package/dist/jsx/Spinner/SpinnerGlyph.native.js.map +1 -1
- package/dist/jsx/Spinner/spinnerSize.native.js.map +1 -1
- package/dist/jsx/Table/index.native.js.map +1 -1
- package/dist/jsx/Wheel/haptic.native.js.map +1 -1
- package/dist/jsx/Wheel/index.native.js.map +1 -1
- package/dist/jsx/actionLabel.native.js.map +1 -1
- package/dist/jsx/fieldDefaults.native.js.map +1 -1
- package/dist/jsx/fieldLayout.native.js +1 -1
- package/dist/jsx/fieldLayout.native.js.map +1 -1
- package/dist/jsx/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/jsx/fields/Barcode/BarcodeScanner.native.js +1 -1
- package/dist/jsx/fields/Barcode/code128.native.js.map +1 -1
- package/dist/jsx/fields/Barcode/index.native.js +2 -2
- package/dist/jsx/fields/Barcode/index.native.js.map +1 -1
- package/dist/jsx/fields/Barcode/qr.native.js.map +1 -1
- package/dist/jsx/fields/Barcode/scannerTypes.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/Checkbox.mjs +5 -2
- package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
- package/dist/jsx/fields/Checkbox/Checkbox.native.js +7 -4
- package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxBox.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxCard.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxFieldFrame.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs +69 -59
- package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js +76 -66
- package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/checkboxGroupContext.mjs +7 -0
- package/dist/jsx/fields/Checkbox/checkboxGroupContext.mjs.map +1 -0
- package/dist/jsx/fields/Checkbox/checkboxGroupContext.native.js +36 -0
- package/dist/jsx/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
- package/dist/jsx/fields/Checkbox/index.native.js.map +1 -1
- package/dist/jsx/fields/ColorPicker/index.native.js +3 -3
- package/dist/jsx/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/jsx/fields/ColorPicker/parts.native.js +2 -2
- package/dist/jsx/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/jsx/fields/Combobox/authorOptions.native.js.map +1 -1
- package/dist/jsx/fields/Combobox/index.native.js +5 -5
- package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DateRangePicker.native.js +2 -2
- package/dist/jsx/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +377 -0
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -0
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +441 -0
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
- package/dist/jsx/fields/DatePicker/DatetimePicker.mjs +1 -375
- package/dist/jsx/fields/DatePicker/DatetimePicker.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +70 -298
- package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/MonthPicker.native.js +2 -2
- package/dist/jsx/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js +2 -2
- package/dist/jsx/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/catalog.mjs +276 -0
- package/dist/jsx/fields/DatePicker/catalog.mjs.map +1 -0
- package/dist/jsx/fields/DatePicker/catalog.native.js +350 -0
- package/dist/jsx/fields/DatePicker/catalog.native.js.map +1 -0
- package/dist/jsx/fields/DatePicker/fieldValueSync.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/index.mjs +1 -274
- package/dist/jsx/fields/DatePicker/index.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/index.native.js +67 -186
- package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/parts.mjs +13 -10
- package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/parts.native.js +14 -11
- package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/utils.native.js.map +1 -1
- package/dist/jsx/fields/Duration/durationMath.native.js.map +1 -1
- package/dist/jsx/fields/Duration/index.mjs +29 -4
- package/dist/jsx/fields/Duration/index.mjs.map +1 -1
- package/dist/jsx/fields/Duration/index.native.js +32 -6
- package/dist/jsx/fields/Duration/index.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload/filePickerTypes.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload/index.mjs +0 -1
- package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload/index.native.js +7 -3
- package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/geoValue.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/index.native.js +5 -5
- package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/mapMath.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/mapTypes.native.js.map +1 -1
- package/dist/jsx/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/jsx/fields/Icon/index.native.js +3 -3
- package/dist/jsx/fields/Icon/index.native.js.map +1 -1
- package/dist/jsx/fields/ImageField/index.native.js +2 -2
- package/dist/jsx/fields/ImageField/index.native.js.map +1 -1
- package/dist/jsx/fields/Input/index.native.js +2 -2
- package/dist/jsx/fields/Input/index.native.js.map +1 -1
- package/dist/jsx/fields/MentionInput/index.native.js +3 -3
- package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
- package/dist/jsx/fields/OTPInput/index.native.js +3 -3
- package/dist/jsx/fields/OTPInput/index.native.js.map +1 -1
- package/dist/jsx/fields/OTPInput/otpCellCss.native.js.map +1 -1
- package/dist/jsx/fields/PhoneInput/dialCodes.native.js.map +1 -1
- package/dist/jsx/fields/PhoneInput/index.mjs +9 -4
- package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
- package/dist/jsx/fields/PhoneInput/index.native.js +16 -9
- package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/jsx/fields/PhoneInput/phone.native.js.map +1 -1
- package/dist/jsx/fields/Progress/index.native.js +1 -1
- package/dist/jsx/fields/Progress/index.native.js.map +1 -1
- package/dist/jsx/fields/RadioGroup/index.native.js +1 -1
- package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/jsx/fields/Rating/index.mjs +2 -2
- package/dist/jsx/fields/Rating/index.mjs.map +1 -1
- package/dist/jsx/fields/Rating/index.native.js +5 -2
- package/dist/jsx/fields/Rating/index.native.js.map +1 -1
- package/dist/jsx/fields/Rating/ratingMath.native.js.map +1 -1
- package/dist/jsx/fields/Rating/types.native.js.map +1 -1
- package/dist/jsx/fields/SearchInput/index.mjs +6 -0
- package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
- package/dist/jsx/fields/SearchInput/index.native.js +8 -2
- package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/index.mjs +78 -3
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +94 -6
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/fields/Signature/index.mjs +10 -6
- package/dist/jsx/fields/Signature/index.mjs.map +1 -1
- package/dist/jsx/fields/Signature/index.native.js +11 -7
- package/dist/jsx/fields/Signature/index.native.js.map +1 -1
- package/dist/jsx/fields/Slider/index.mjs +4 -2
- package/dist/jsx/fields/Slider/index.mjs.map +1 -1
- package/dist/jsx/fields/Slider/index.native.js +4 -2
- package/dist/jsx/fields/Slider/index.native.js.map +1 -1
- package/dist/jsx/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/jsx/fields/Stepper/index.native.js +2 -2
- package/dist/jsx/fields/Stepper/index.native.js.map +1 -1
- package/dist/jsx/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
- package/dist/jsx/fields/Switch/index.mjs +6 -19
- package/dist/jsx/fields/Switch/index.mjs.map +1 -1
- package/dist/jsx/fields/Switch/index.native.js +7 -20
- package/dist/jsx/fields/Switch/index.native.js.map +1 -1
- package/dist/jsx/fields/TextArea/index.mjs +19 -5
- package/dist/jsx/fields/TextArea/index.mjs.map +1 -1
- package/dist/jsx/fields/TextArea/index.native.js +25 -7
- package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/catalog.mjs +174 -0
- package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -0
- package/dist/jsx/fields/TimePicker/catalog.native.js +227 -0
- package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -0
- package/dist/jsx/fields/TimePicker/index.mjs +2 -173
- package/dist/jsx/fields/TimePicker/index.mjs.map +1 -1
- package/dist/jsx/fields/TimePicker/index.native.js +75 -86
- package/dist/jsx/fields/TimePicker/index.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/parts.native.js +1 -1
- package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/jsx/fields/TimeRangeScrubber/geometry.mjs +6 -1
- package/dist/jsx/fields/TimeRangeScrubber/geometry.mjs.map +1 -1
- package/dist/jsx/fields/TimeRangeScrubber/geometry.native.js +6 -0
- package/dist/jsx/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
- package/dist/jsx/fields/TimeRangeScrubber/index.mjs +37 -18
- package/dist/jsx/fields/TimeRangeScrubber/index.mjs.map +1 -1
- package/dist/jsx/fields/TimeRangeScrubber/index.native.js +40 -16
- package/dist/jsx/fields/TimeRangeScrubber/index.native.js.map +1 -1
- package/dist/jsx/fields/ToggleGroup/index.native.js +1 -1
- package/dist/jsx/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +166 -0
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -0
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +211 -0
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
- package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs +5 -0
- package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -0
- package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.native.js +33 -0
- package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
- package/dist/jsx/fields/nativeSelect.mjs +5 -0
- package/dist/jsx/fields/nativeSelect.mjs.map +1 -0
- package/dist/jsx/fields/nativeSelect.native.js +33 -0
- package/dist/jsx/fields/nativeSelect.native.js.map +1 -0
- package/dist/jsx/fields/selectedOrder.native.js.map +1 -1
- package/dist/jsx/formSpacing.native.js.map +1 -1
- package/dist/jsx/hooks/useFocusManagement.native.js.map +1 -1
- package/dist/jsx/index.js +2 -2
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +2 -2
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +44 -43
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/requiredMarking.native.js.map +1 -1
- package/dist/jsx/shared/TimeColumn.native.js +1 -1
- package/dist/jsx/shared/TimeColumn.native.js.map +1 -1
- package/dist/jsx/shared/capabilityPreflight.native.js.map +1 -1
- package/dist/jsx/shared/colorRamps.native.js.map +1 -1
- package/dist/jsx/shared/devWarn.native.js.map +1 -1
- package/dist/jsx/shared/floatingList.native.js +1 -1
- package/dist/jsx/shared/floatingList.native.js.map +1 -1
- package/dist/jsx/shared/focusManagement.native.js.map +1 -1
- package/dist/jsx/shared/groupContext.native.js.map +1 -1
- package/dist/jsx/shared/i18n.native.js.map +1 -1
- package/dist/jsx/shared/t.native.js.map +1 -1
- package/dist/jsx/shared/tableCellContext.native.js.map +1 -1
- package/dist/jsx/shared/useDragScroll.native.js.map +1 -1
- package/dist/jsx/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/jsx/shared/useSheetEscapeDismiss.native.js.map +1 -1
- package/dist/jsx/shared/useWheelIncrement.native.js.map +1 -1
- package/dist/jsx/shared/utils.native.js +1 -1
- package/dist/jsx/shared/utils.native.js.map +1 -1
- package/dist/jsx/shared/zIndex.native.js.map +1 -1
- package/dist/jsx/themedPrimitives.mjs +5 -0
- package/dist/jsx/themedPrimitives.mjs.map +1 -1
- package/dist/jsx/themedPrimitives.native.js +5 -0
- package/dist/jsx/themedPrimitives.native.js.map +1 -1
- package/dist/jsx/types.native.js.map +1 -1
- package/dist/jsx/utils/LinkCell.native.js.map +1 -1
- package/package.json +12 -9
- package/src/Button/Button.labelInk.spec.tsx +1 -1
- package/src/Button/Button.sizeLadder.spec.tsx +124 -0
- package/src/Button/Button.spec.tsx +7 -17
- package/src/Button/Button.stories.tsx +14 -0
- package/src/Button/index.tsx +24 -4
- package/src/Chip/Chip.spec.tsx +15 -0
- package/src/Chip/Chip.stories.tsx +251 -0
- package/src/Chip/index.tsx +5 -1
- package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +51 -0
- package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +42 -23
- package/src/ContextualSaveBar/UnsavedChangesDialog.spec.tsx +167 -0
- package/src/ContextualSaveBar/UnsavedChangesDialog.stories.tsx +118 -0
- package/src/ContextualSaveBar/index.tsx +14 -5
- package/src/ContextualSaveBar/unsavedChangesDialogStories.spec.tsx +79 -0
- package/src/DescriptionList/DescriptionList.spec.tsx +19 -1
- package/src/DescriptionList/DescriptionList.stories.tsx +5 -1
- package/src/DescriptionList/index.tsx +60 -20
- package/src/ErrorSummary.stories.tsx +197 -0
- package/src/ErrorSummary.tsx +5 -2
- package/src/FloatingPanel/panelWidthContract.spec.ts +2 -2
- package/src/FloatingPanel/useFloatingPanel.spec.tsx +199 -1
- package/src/FloatingPanel/useFloatingPanel.ts +45 -3
- package/src/InputParts/InputParts.stories.tsx +230 -0
- package/src/InputParts/index.tsx +56 -2
- package/src/InputParts/inputPartsStories.spec.tsx +122 -0
- package/src/Skeleton/Skeleton.stories.tsx +148 -0
- package/src/Skeleton/skeletonStories.spec.tsx +107 -0
- package/src/Spinner/SpinnerGlyph.spec.tsx +132 -0
- package/src/Wheel/Wheel.stories.tsx +232 -0
- package/src/Wheel/WheelEdgeFade.spec.tsx +141 -0
- package/src/Wheel/wheelStories.spec.tsx +143 -0
- package/src/errorSummaryStories.spec.tsx +114 -0
- package/src/fields/Checkbox/Checkbox.spec.tsx +24 -0
- package/src/fields/Checkbox/Checkbox.tsx +8 -3
- package/src/fields/Checkbox/CheckboxBox.spec.tsx +395 -0
- package/src/fields/Checkbox/CheckboxCard.spec.tsx +197 -0
- package/src/fields/Checkbox/CheckboxFieldFrame.spec.tsx +116 -0
- package/src/fields/Checkbox/CheckboxGroup.stories.tsx +15 -0
- package/src/fields/Checkbox/CheckboxGroup.tsx +77 -70
- package/src/fields/Checkbox/checkboxGroupContext.ts +12 -0
- package/src/fields/DatePicker/Calendar.spec.tsx +6 -5
- package/src/fields/DatePicker/DatePicker.stories.tsx +13 -0
- package/src/fields/DatePicker/DatetimePicker.catalog.tsx +586 -0
- package/src/fields/DatePicker/DatetimePicker.native.tsx +243 -0
- package/src/fields/DatePicker/DatetimePicker.tsx +2 -584
- package/src/fields/DatePicker/catalog.tsx +450 -0
- package/src/fields/DatePicker/index.native.tsx +261 -0
- package/src/fields/DatePicker/index.tsx +20 -448
- package/src/fields/DatePicker/parts.tsx +11 -6
- package/src/fields/Duration/Duration.spec.tsx +50 -0
- package/src/fields/Duration/Duration.stories.tsx +21 -0
- package/src/fields/Duration/index.tsx +43 -5
- package/src/fields/FileUpload/index.tsx +5 -1
- package/src/fields/Input/Input.spec.tsx +3 -1
- package/src/fields/PhoneInput/PhoneInput.spec.tsx +16 -63
- package/src/fields/PhoneInput/PhoneInput.tvalue-source.spec.ts +23 -0
- package/src/fields/PhoneInput/index.tsx +10 -3
- package/src/fields/Rating/index.tsx +9 -1
- package/src/fields/SearchInput/SearchInput.spec.tsx +20 -0
- package/src/fields/SearchInput/index.tsx +6 -0
- package/src/fields/Select/Select.stories.tsx +23 -1
- package/src/fields/Select/index.tsx +87 -1
- package/src/fields/Signature/Signature.spec.tsx +22 -3
- package/src/fields/Signature/index.tsx +16 -7
- package/src/fields/Slider/index.tsx +4 -1
- package/src/fields/Switch/index.tsx +14 -12
- package/src/fields/TextArea/TextArea.spec.tsx +68 -0
- package/src/fields/TextArea/index.tsx +23 -5
- package/src/fields/TimePicker/TimePicker.stories.tsx +13 -0
- package/src/fields/TimePicker/catalog.tsx +265 -0
- package/src/fields/TimePicker/index.native.tsx +229 -0
- package/src/fields/TimePicker/index.tsx +6 -261
- package/src/fields/TimeRangeScrubber/TimeRangeScrubber.spec.tsx +36 -0
- package/src/fields/TimeRangeScrubber/geometry.ts +13 -0
- package/src/fields/TimeRangeScrubber/index.tsx +49 -8
- package/src/fields/nativeDateTime/OsDateTimeSheet.spec.ts +12 -0
- package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +197 -0
- package/src/fields/nativeDateTime/osDateTimeIosDisplay.ts +4 -0
- package/src/fields/nativeSelect.spec.ts +28 -0
- package/src/fields/nativeSelect.ts +13 -0
- package/src/index.ts +2 -2
- package/src/themedPrimitives.tsx +10 -6
- package/types/Button/index.d.ts +3 -2
- package/types/Button/index.d.ts.map +1 -1
- package/types/Chip/index.d.ts.map +1 -1
- package/types/ContextualSaveBar/index.d.ts.map +1 -1
- package/types/DescriptionList/index.d.ts.map +1 -1
- package/types/ErrorSummary.d.ts.map +1 -1
- package/types/FloatingPanel/useFloatingPanel.d.ts +13 -0
- package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
- package/types/InputParts/index.d.ts.map +1 -1
- package/types/fields/Checkbox/Checkbox.d.ts.map +1 -1
- package/types/fields/Checkbox/CheckboxGroup.d.ts.map +1 -1
- package/types/fields/Checkbox/checkboxGroupContext.d.ts +8 -0
- package/types/fields/Checkbox/checkboxGroupContext.d.ts.map +1 -0
- package/types/fields/DatePicker/DatetimePicker.catalog.d.ts +35 -0
- package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -0
- package/types/fields/DatePicker/DatetimePicker.d.ts +2 -32
- package/types/fields/DatePicker/DatetimePicker.d.ts.map +1 -1
- package/types/fields/DatePicker/DatetimePicker.native.d.ts +26 -0
- package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -0
- package/types/fields/DatePicker/catalog.d.ts +42 -0
- package/types/fields/DatePicker/catalog.d.ts.map +1 -0
- package/types/fields/DatePicker/index.d.ts +2 -39
- package/types/fields/DatePicker/index.d.ts.map +1 -1
- package/types/fields/DatePicker/index.native.d.ts +40 -0
- package/types/fields/DatePicker/index.native.d.ts.map +1 -0
- package/types/fields/DatePicker/parts.d.ts.map +1 -1
- package/types/fields/Duration/index.d.ts +2 -0
- package/types/fields/Duration/index.d.ts.map +1 -1
- package/types/fields/FileUpload/index.d.ts.map +1 -1
- package/types/fields/PhoneInput/index.d.ts.map +1 -1
- package/types/fields/Rating/index.d.ts.map +1 -1
- package/types/fields/SearchInput/index.d.ts.map +1 -1
- package/types/fields/Select/index.d.ts +6 -1
- package/types/fields/Select/index.d.ts.map +1 -1
- package/types/fields/Signature/index.d.ts.map +1 -1
- package/types/fields/Slider/index.d.ts.map +1 -1
- package/types/fields/Switch/index.d.ts.map +1 -1
- package/types/fields/TextArea/index.d.ts.map +1 -1
- package/types/fields/TimePicker/catalog.d.ts +41 -0
- package/types/fields/TimePicker/catalog.d.ts.map +1 -0
- package/types/fields/TimePicker/index.d.ts +2 -38
- package/types/fields/TimePicker/index.d.ts.map +1 -1
- package/types/fields/TimePicker/index.native.d.ts +31 -0
- package/types/fields/TimePicker/index.native.d.ts.map +1 -0
- package/types/fields/TimeRangeScrubber/geometry.d.ts +8 -0
- package/types/fields/TimeRangeScrubber/geometry.d.ts.map +1 -1
- package/types/fields/TimeRangeScrubber/index.d.ts +1 -1
- package/types/fields/TimeRangeScrubber/index.d.ts.map +1 -1
- package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts +12 -0
- package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -0
- package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts +3 -0
- package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts.map +1 -0
- package/types/fields/nativeSelect.d.ts +12 -0
- package/types/fields/nativeSelect.d.ts.map +1 -0
- package/types/index.d.ts +2 -2
- package/types/index.d.ts.map +1 -1
- package/types/themedPrimitives.d.ts.map +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mounts every Forms/Skeleton story and asserts what it exists to show. The
|
|
3
|
+
* theme hooks stay REAL: text-bone height comes from the size recipe and the
|
|
4
|
+
* pulse gates on knobProps.transition, so a stub would measure neither.
|
|
5
|
+
*
|
|
6
|
+
* Geometry is read off the CLASS, not `style`. Tamagui compiles width, height
|
|
7
|
+
* and radius into atomic classes (`_w-240px`, `_w-7037` for 70%), and only the
|
|
8
|
+
* pulse stays an inline style — so `el.style.width` is empty on every bone.
|
|
9
|
+
*/
|
|
10
|
+
import { cleanup } from "@testing-library/react";
|
|
11
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
12
|
+
import type { ReactElement } from "react";
|
|
13
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
14
|
+
|
|
15
|
+
import * as storiesModule from "./Skeleton.stories";
|
|
16
|
+
|
|
17
|
+
afterEach(cleanup);
|
|
18
|
+
|
|
19
|
+
const meta = storiesModule.default;
|
|
20
|
+
const { Basic, Variants, TextLines, Circles, LoadingRow, MotionOff, RadiusKnob } = storiesModule;
|
|
21
|
+
|
|
22
|
+
type StoryLike = { render?: (args: Record<string, unknown>) => ReactElement };
|
|
23
|
+
|
|
24
|
+
function mount(story: StoryLike) {
|
|
25
|
+
if (!story.render) throw new Error("story has no render");
|
|
26
|
+
return renderWithProviders(story.render({ ...(meta.args as Record<string, unknown>) }));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Every bone is a SkeletonFrame, which Tamagui names `is_Skeleton`. */
|
|
30
|
+
function bones(container: HTMLElement): HTMLElement[] {
|
|
31
|
+
return Array.from(container.querySelectorAll<HTMLElement>(".is_Skeleton"));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const classesOf = (el: HTMLElement) => (el.getAttribute("class") ?? "").split(" ");
|
|
35
|
+
const widthClass = (el: HTMLElement) => classesOf(el).find((c) => c.startsWith("_w-"));
|
|
36
|
+
const heightClass = (el: HTMLElement) => classesOf(el).find((c) => c.startsWith("_h-"));
|
|
37
|
+
|
|
38
|
+
const stories = { Basic, Variants, TextLines, Circles, LoadingRow, MotionOff, RadiusKnob } as const;
|
|
39
|
+
|
|
40
|
+
describe("Forms/Skeleton stories", () => {
|
|
41
|
+
it("files under a Forms title so the gallery buckets it with the fields it fills in for", () => {
|
|
42
|
+
expect(meta.title).toBe("Forms/Skeleton");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it.each(Object.entries(stories))("%s mounts at least one bone", (_name, story) => {
|
|
46
|
+
expect(bones(mount(story as StoryLike).container).length).toBeGreaterThan(0);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("Basic paints one bone at the meta width", () => {
|
|
50
|
+
const painted = bones(mount(Basic as StoryLike).container);
|
|
51
|
+
expect(painted.length).toBe(1);
|
|
52
|
+
expect(widthClass(painted[0])).toBe("_w-240px");
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("Variants shows all four, and the circular one is 1:1", () => {
|
|
56
|
+
const { container, getByText } = mount(Variants as StoryLike);
|
|
57
|
+
for (const name of ["text", "rounded", "rectangular", "circular"]) {
|
|
58
|
+
expect(getByText(name)).toBeTruthy();
|
|
59
|
+
}
|
|
60
|
+
const square = bones(container).find(
|
|
61
|
+
(el) => widthClass(el) === "_w-48px" && heightClass(el) === "_h-48px",
|
|
62
|
+
);
|
|
63
|
+
expect(square).toBeTruthy();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("TextLines shortens the last line so a block reads as prose", () => {
|
|
67
|
+
const { container, getByText } = mount(TextLines as StoryLike);
|
|
68
|
+
expect(getByText("three lines, last at 70%")).toBeTruthy();
|
|
69
|
+
const widths = bones(container).map(widthClass);
|
|
70
|
+
// 70% and 40% are the two lastLineWidth values; 100% is every other line.
|
|
71
|
+
expect(widths).toContain("_w-7037");
|
|
72
|
+
expect(widths).toContain("_w-4037");
|
|
73
|
+
expect(widths).toContain("_w-10037");
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("Circles renders three, two of them at explicit sizes", () => {
|
|
77
|
+
const painted = bones(mount(Circles as StoryLike).container);
|
|
78
|
+
expect(painted.length).toBe(3);
|
|
79
|
+
const widths = painted.map(widthClass);
|
|
80
|
+
expect(widths).toContain("_w-32px");
|
|
81
|
+
expect(widths).toContain("_w-64px");
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("LoadingRow composes an avatar plus a name and two body lines", () => {
|
|
85
|
+
const painted = bones(mount(LoadingRow as StoryLike).container);
|
|
86
|
+
// 1 circle + 1 name bone + 2 body bones.
|
|
87
|
+
expect(painted.length).toBe(4);
|
|
88
|
+
expect(painted.map(widthClass)).toContain("_w-40px");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
/** LC-20 / LC-68: the pulse is on with the knob and gone without it. */
|
|
92
|
+
it("MotionOff pulses the animated column and not the animate={false} one", () => {
|
|
93
|
+
const { container, getByText } = mount(MotionOff as StoryLike);
|
|
94
|
+
expect(getByText("animation knob on")).toBeTruthy();
|
|
95
|
+
expect(getByText("animation: none")).toBeTruthy();
|
|
96
|
+
const animations = bones(container).map((el) => el.style.animation);
|
|
97
|
+
expect(animations.some((a) => a.includes("skeleton-pulse"))).toBe(true);
|
|
98
|
+
expect(animations.some((a) => !a)).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("RadiusKnob renders one column per radius stop", () => {
|
|
102
|
+
const { getByText } = mount(RadiusKnob as StoryLike);
|
|
103
|
+
for (const stop of ["none", "medium", "large"]) {
|
|
104
|
+
expect(getByText(`borderRadius: ${stop}`)).toBeTruthy();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpinnerGlyph and useSpinnerStroke (MPO-143).
|
|
3
|
+
*
|
|
4
|
+
* Spinner.spec.tsx covers the status region, the size ladder and the animation
|
|
5
|
+
* knob; the glyph inside it — the two-circle arc that IS the spinner — had no
|
|
6
|
+
* coverage. Two contracts live here: the arc is exactly 270 degrees of the
|
|
7
|
+
* circumference on a faint full track, and `useSpinnerStroke` resolves a `$`
|
|
8
|
+
* token through the theme while passing a literal colour straight through.
|
|
9
|
+
*/
|
|
10
|
+
import { cleanup } from "@testing-library/react";
|
|
11
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
12
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
13
|
+
import { SpinnerGlyph, useSpinnerStroke } from "./SpinnerGlyph";
|
|
14
|
+
|
|
15
|
+
afterEach(cleanup);
|
|
16
|
+
|
|
17
|
+
const R = 9;
|
|
18
|
+
const CIRCUMFERENCE = 2 * Math.PI * R;
|
|
19
|
+
|
|
20
|
+
function svg(container: HTMLElement): SVGElement {
|
|
21
|
+
const node = container.querySelector("svg");
|
|
22
|
+
if (!node) throw new Error("SpinnerGlyph rendered no svg");
|
|
23
|
+
return node as unknown as SVGElement;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function circles(container: HTMLElement): SVGElement[] {
|
|
27
|
+
return Array.from(container.querySelectorAll("circle")) as unknown as SVGElement[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function Probe({ color }: { color?: string }) {
|
|
31
|
+
const stroke = useSpinnerStroke(color);
|
|
32
|
+
return <span data-stroke={stroke} />;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function stroke(container: HTMLElement): string | null {
|
|
36
|
+
return container.querySelector("[data-stroke]")?.getAttribute("data-stroke") ?? null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
describe("SpinnerGlyph — the arc", () => {
|
|
40
|
+
it("draws a track and a head, never one circle", () => {
|
|
41
|
+
const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
|
|
42
|
+
expect(circles(container)).toHaveLength(2);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("keeps the viewBox fixed and scales through width/height, so it stays crisp", () => {
|
|
46
|
+
const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={48} />);
|
|
47
|
+
const node = svg(container);
|
|
48
|
+
expect(node.getAttribute("viewBox")).toBe("0 0 24 24");
|
|
49
|
+
expect(node.getAttribute("width")).toBe("48");
|
|
50
|
+
expect(node.getAttribute("height")).toBe("48");
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("takes the box size it is handed rather than a fixed one", () => {
|
|
54
|
+
const small = renderWithProviders(<SpinnerGlyph color="#123456" size={16} />);
|
|
55
|
+
expect(svg(small.container).getAttribute("width")).toBe("16");
|
|
56
|
+
cleanup();
|
|
57
|
+
const large = renderWithProviders(<SpinnerGlyph color="#123456" size={64} />);
|
|
58
|
+
expect(svg(large.container).getAttribute("width")).toBe("64");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("makes the track faint and the head solid, both in the requested colour", () => {
|
|
62
|
+
const { container } = renderWithProviders(<SpinnerGlyph color="#abcdef" size={24} />);
|
|
63
|
+
const [track, head] = circles(container);
|
|
64
|
+
expect(track.getAttribute("stroke")).toBe("#abcdef");
|
|
65
|
+
expect(head.getAttribute("stroke")).toBe("#abcdef");
|
|
66
|
+
expect(Number(track.getAttribute("opacity"))).toBeCloseTo(0.2, 5);
|
|
67
|
+
expect(head.getAttribute("opacity")).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("paints 270 degrees of arc and leaves the remaining quarter open", () => {
|
|
71
|
+
const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
|
|
72
|
+
const [, head] = circles(container);
|
|
73
|
+
const [drawn, gap] = String(
|
|
74
|
+
head.getAttribute("stroke-dasharray") ?? head.getAttribute("strokeDasharray"),
|
|
75
|
+
)
|
|
76
|
+
.split(" ")
|
|
77
|
+
.map(Number);
|
|
78
|
+
expect(drawn).toBeCloseTo(CIRCUMFERENCE * 0.75, 5);
|
|
79
|
+
expect(gap).toBeCloseTo(CIRCUMFERENCE * 0.25, 5);
|
|
80
|
+
expect(drawn + gap).toBeCloseTo(CIRCUMFERENCE, 5);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("starts the head at twelve o'clock, not at three", () => {
|
|
84
|
+
const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
|
|
85
|
+
const [, head] = circles(container);
|
|
86
|
+
expect(head.getAttribute("transform")).toBe("rotate(-90 12 12)");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("rounds the head's cap, which is what makes it read as Linear/Polaris rather than a pie slice", () => {
|
|
90
|
+
const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
|
|
91
|
+
const [track, head] = circles(container);
|
|
92
|
+
expect(head.getAttribute("stroke-linecap") ?? head.getAttribute("strokeLinecap")).toBe("round");
|
|
93
|
+
expect(track.getAttribute("stroke-linecap") ?? track.getAttribute("strokeLinecap")).toBeNull();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("fills neither circle, so the spinner is a ring and not a disc", () => {
|
|
97
|
+
const { container } = renderWithProviders(<SpinnerGlyph color="#123456" size={24} />);
|
|
98
|
+
for (const circle of circles(container)) {
|
|
99
|
+
expect(circle.getAttribute("fill")).toBe("none");
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe("useSpinnerStroke", () => {
|
|
105
|
+
it("passes a literal colour through untouched", () => {
|
|
106
|
+
const { container } = renderWithProviders(<Probe color="#ff0000" />);
|
|
107
|
+
expect(stroke(container)).toBe("#ff0000");
|
|
108
|
+
cleanup();
|
|
109
|
+
const named = renderWithProviders(<Probe color="rebeccapurple" />);
|
|
110
|
+
expect(stroke(named.container)).toBe("rebeccapurple");
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("resolves a $ token to a concrete colour instead of leaking the token", () => {
|
|
114
|
+
const { container } = renderWithProviders(<Probe color="$color" />);
|
|
115
|
+
const value = stroke(container);
|
|
116
|
+
expect(value).toBeTruthy();
|
|
117
|
+
expect(value?.startsWith("$")).toBe(false);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("defaults to $color when no colour is given, and still resolves it", () => {
|
|
121
|
+
const explicit = renderWithProviders(<Probe color="$color" />);
|
|
122
|
+
const explicitValue = stroke(explicit.container);
|
|
123
|
+
cleanup();
|
|
124
|
+
const implicit = renderWithProviders(<Probe />);
|
|
125
|
+
expect(stroke(implicit.container)).toBe(explicitValue);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("hands back the token itself when the theme has no such key, rather than throwing", () => {
|
|
129
|
+
const { container } = renderWithProviders(<Probe color="$definitelyNotAThemeKey" />);
|
|
130
|
+
expect(stroke(container)).toBe("$definitelyNotAThemeKey");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { action } from "@multiplatform.one/storybook";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
|
|
3
|
+
import { Preset } from "@multiplatform.one/theme";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { Paragraph, XStack, YStack } from "tamagui";
|
|
6
|
+
import { Wheel } from "./index";
|
|
7
|
+
|
|
8
|
+
const numbers = Array.from({ length: 24 }, (_, i) => i);
|
|
9
|
+
const pad2 = (n: number) => String(n).padStart(2, "0");
|
|
10
|
+
const hours = numbers.map((h) => ({ value: h, label: pad2(h) }));
|
|
11
|
+
const minutes = Array.from({ length: 60 }, (_, m) => ({ value: m, label: pad2(m) }));
|
|
12
|
+
const periods = [
|
|
13
|
+
{ value: "AM", label: "AM" },
|
|
14
|
+
{ value: "PM", label: "PM" },
|
|
15
|
+
];
|
|
16
|
+
const currencyNames = { usd: "US Dollar", eur: "Euro", inr: "Rupee", jpy: "Yen" } as const;
|
|
17
|
+
|
|
18
|
+
const meta: Meta<typeof Wheel> = {
|
|
19
|
+
title: "Forms/Wheel",
|
|
20
|
+
component: Wheel,
|
|
21
|
+
parameters: {
|
|
22
|
+
status: { type: "beta" },
|
|
23
|
+
docs: {
|
|
24
|
+
description: {
|
|
25
|
+
component:
|
|
26
|
+
"iOS UIPickerView / Flutter CupertinoPicker cylinder. Drag, flick or arrow-key to bring an item through the centre band. TimePicker and DatePicker paint columns of these; `highlightEdges` joins adjacent columns into one selection band.",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
argTypes: {
|
|
31
|
+
visibleItems: { control: "select", options: [3, 5, 7] },
|
|
32
|
+
loop: { control: "boolean" },
|
|
33
|
+
disabled: { control: "boolean" },
|
|
34
|
+
width: { control: "number" },
|
|
35
|
+
itemHeight: { control: "number" },
|
|
36
|
+
highlightEdges: { control: "select", options: ["all", "start", "end", "none"] },
|
|
37
|
+
size: { control: "select", options: ["$6", "$8", "$9"] },
|
|
38
|
+
},
|
|
39
|
+
args: {
|
|
40
|
+
items: hours,
|
|
41
|
+
value: 9,
|
|
42
|
+
visibleItems: 5,
|
|
43
|
+
loop: false,
|
|
44
|
+
disabled: false,
|
|
45
|
+
highlightEdges: "all",
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export default meta;
|
|
50
|
+
type Story = StoryObj<typeof Wheel>;
|
|
51
|
+
|
|
52
|
+
export const Basic: Story = {
|
|
53
|
+
render: (args) => {
|
|
54
|
+
const Example = () => {
|
|
55
|
+
const [value, setValue] = useState<number>((args.value as number) ?? 9);
|
|
56
|
+
return (
|
|
57
|
+
<YStack gap="$3" alignItems="flex-start">
|
|
58
|
+
<Wheel
|
|
59
|
+
{...args}
|
|
60
|
+
value={value}
|
|
61
|
+
onChange={(next) => {
|
|
62
|
+
setValue(next as number);
|
|
63
|
+
action("onChange")(next);
|
|
64
|
+
}}
|
|
65
|
+
aria-label="Hour"
|
|
66
|
+
/>
|
|
67
|
+
<Paragraph size="$3">selected: {pad2(value)}</Paragraph>
|
|
68
|
+
</YStack>
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
return <Example />;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/** Plain values (no `{ value, label }` wrapper) render their own `String(item)`. */
|
|
76
|
+
export const PlainValues: Story = {
|
|
77
|
+
render: () => (
|
|
78
|
+
<Wheel
|
|
79
|
+
items={["Small", "Medium", "Large", "Extra large"]}
|
|
80
|
+
value="Medium"
|
|
81
|
+
width={140}
|
|
82
|
+
onChange={action("onChange")}
|
|
83
|
+
aria-label="Size"
|
|
84
|
+
/>
|
|
85
|
+
),
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* `visibleItems` is the cylinder depth. 3 is a compact inline row, 7 the full
|
|
90
|
+
* iOS sheet; the value must stay odd so an item sits dead centre.
|
|
91
|
+
*/
|
|
92
|
+
export const VisibleItems: Story = {
|
|
93
|
+
render: () => (
|
|
94
|
+
<XStack gap="$6" alignItems="flex-start">
|
|
95
|
+
{([3, 5, 7] as const).map((count) => (
|
|
96
|
+
<YStack key={count} gap="$2" alignItems="center">
|
|
97
|
+
<Paragraph size="$2">visibleItems={count}</Paragraph>
|
|
98
|
+
<Wheel items={hours} value={9} visibleItems={count} aria-label={`Hour ${count}`} />
|
|
99
|
+
</YStack>
|
|
100
|
+
))}
|
|
101
|
+
</XStack>
|
|
102
|
+
),
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* `loop` wraps at the ends instead of rubber-banding. Hours and minutes loop;
|
|
107
|
+
* a bounded set like AM/PM must not, or the user can scroll past the last row
|
|
108
|
+
* into a value that was never offered.
|
|
109
|
+
*/
|
|
110
|
+
export const LoopingAndBounded: Story = {
|
|
111
|
+
render: () => (
|
|
112
|
+
<XStack gap="$6" alignItems="flex-start">
|
|
113
|
+
<YStack gap="$2" alignItems="center">
|
|
114
|
+
<Paragraph size="$2">loop</Paragraph>
|
|
115
|
+
<Wheel items={minutes} value={30} loop onChange={action("onChange")} aria-label="Minute" />
|
|
116
|
+
</YStack>
|
|
117
|
+
<YStack gap="$2" alignItems="center">
|
|
118
|
+
<Paragraph size="$2">bounded</Paragraph>
|
|
119
|
+
<Wheel
|
|
120
|
+
items={periods}
|
|
121
|
+
value="AM"
|
|
122
|
+
loop={false}
|
|
123
|
+
width={72}
|
|
124
|
+
onChange={action("onChange")}
|
|
125
|
+
aria-label="AM/PM"
|
|
126
|
+
/>
|
|
127
|
+
</YStack>
|
|
128
|
+
</XStack>
|
|
129
|
+
),
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Multi-column joining: the row of columns reads as ONE selection band because
|
|
134
|
+
* the first declares `start`, the last `end`, and everything between `none`.
|
|
135
|
+
* This is the arrangement TimePicker ships.
|
|
136
|
+
*/
|
|
137
|
+
export const JoinedColumns: Story = {
|
|
138
|
+
render: () => (
|
|
139
|
+
<XStack width={320}>
|
|
140
|
+
<Wheel items={hours} value={9} loop flex={1} highlightEdges="start" aria-label="Hour" />
|
|
141
|
+
<Wheel items={minutes} value={30} loop flex={1} highlightEdges="none" aria-label="Minute" />
|
|
142
|
+
<Wheel items={periods} value="AM" flex={1} highlightEdges="end" aria-label="AM/PM" />
|
|
143
|
+
</XStack>
|
|
144
|
+
),
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export const Disabled: Story = {
|
|
148
|
+
render: () => (
|
|
149
|
+
<XStack gap="$6" alignItems="flex-start">
|
|
150
|
+
<YStack gap="$2" alignItems="center">
|
|
151
|
+
<Paragraph size="$2">enabled</Paragraph>
|
|
152
|
+
<Wheel items={hours} value={9} aria-label="Hour enabled" />
|
|
153
|
+
</YStack>
|
|
154
|
+
<YStack gap="$2" alignItems="center">
|
|
155
|
+
<Paragraph size="$2">disabled</Paragraph>
|
|
156
|
+
<Wheel items={hours} value={9} disabled aria-label="Hour disabled" />
|
|
157
|
+
</YStack>
|
|
158
|
+
</XStack>
|
|
159
|
+
),
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* `renderItem` owns the row; the wheel keeps geometry and selection. It is
|
|
164
|
+
* handed the VALUE, not the `{ value, label }` wrapper — so a story that wants
|
|
165
|
+
* a display string looks it up itself.
|
|
166
|
+
*/
|
|
167
|
+
export const CustomRenderItem: Story = {
|
|
168
|
+
render: () => (
|
|
169
|
+
<Wheel
|
|
170
|
+
items={Object.keys(currencyNames)}
|
|
171
|
+
value="inr"
|
|
172
|
+
width={200}
|
|
173
|
+
onChange={action("onChange")}
|
|
174
|
+
aria-label="Currency"
|
|
175
|
+
renderItem={(item, _index, isSelected) => (
|
|
176
|
+
<Paragraph size="$5" fontWeight={isSelected ? "700" : "400"}>
|
|
177
|
+
{currencyNames[item as keyof typeof currencyNames]}
|
|
178
|
+
</Paragraph>
|
|
179
|
+
)}
|
|
180
|
+
/>
|
|
181
|
+
),
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
/** Edge cases the geometry has to survive: empty, single item, very long labels. */
|
|
185
|
+
export const EdgeCases: Story = {
|
|
186
|
+
render: () => (
|
|
187
|
+
<XStack gap="$6" alignItems="flex-start" flexWrap="wrap">
|
|
188
|
+
<YStack gap="$2" alignItems="center">
|
|
189
|
+
<Paragraph size="$2">empty</Paragraph>
|
|
190
|
+
<Wheel items={[]} aria-label="Empty" />
|
|
191
|
+
</YStack>
|
|
192
|
+
<YStack gap="$2" alignItems="center">
|
|
193
|
+
<Paragraph size="$2">single item</Paragraph>
|
|
194
|
+
<Wheel items={[{ value: "only", label: "Only" }]} value="only" aria-label="Single" />
|
|
195
|
+
</YStack>
|
|
196
|
+
<YStack gap="$2" alignItems="center">
|
|
197
|
+
<Paragraph size="$2">long labels</Paragraph>
|
|
198
|
+
<Wheel
|
|
199
|
+
items={[
|
|
200
|
+
{ value: "a", label: "Asia/Kolkata" },
|
|
201
|
+
{ value: "b", label: "America/Argentina/Buenos_Aires" },
|
|
202
|
+
{ value: "c", label: "Europe/Isle_of_Man" },
|
|
203
|
+
]}
|
|
204
|
+
value="b"
|
|
205
|
+
width={200}
|
|
206
|
+
aria-label="Timezone"
|
|
207
|
+
/>
|
|
208
|
+
</YStack>
|
|
209
|
+
</XStack>
|
|
210
|
+
),
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* MOTION-RIDES-KNOB (LC-68): at `animation: "none"` a keyboard snap must JUMP,
|
|
215
|
+
* not tween. Arrow-key both wheels and watch the difference.
|
|
216
|
+
*/
|
|
217
|
+
export const MotionOff: Story = {
|
|
218
|
+
render: () => (
|
|
219
|
+
<XStack gap="$6" alignItems="flex-start">
|
|
220
|
+
<YStack gap="$2" alignItems="center">
|
|
221
|
+
<Paragraph size="$2">animation: medium</Paragraph>
|
|
222
|
+
<Wheel items={hours} value={9} loop aria-label="Hour animated" />
|
|
223
|
+
</YStack>
|
|
224
|
+
<Preset overrides={{ animation: "none" }}>
|
|
225
|
+
<YStack gap="$2" alignItems="center">
|
|
226
|
+
<Paragraph size="$2">animation: none</Paragraph>
|
|
227
|
+
<Wheel items={hours} value={9} loop aria-label="Hour static" />
|
|
228
|
+
</YStack>
|
|
229
|
+
</Preset>
|
|
230
|
+
</XStack>
|
|
231
|
+
),
|
|
232
|
+
};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WheelEdgeFade — LC-25's two halves (MPO-143).
|
|
3
|
+
*
|
|
4
|
+
* The contract is a platform split with a contrast reason behind it. On web the
|
|
5
|
+
* wheel viewport carries a CSS mask, so this component must render NOTHING; on
|
|
6
|
+
* native it paints two absolutely-positioned gradient bands as an OVERLAY. The
|
|
7
|
+
* overlay is the whole point: fading the rows themselves would drop their
|
|
8
|
+
* opacity below 1 and take the inactive `$color11` numerals under the AA floor,
|
|
9
|
+
* which is the regression Wheel.spec.tsx guards from the other side.
|
|
10
|
+
*
|
|
11
|
+
* Both halves are exercised. A spec that covered only the file the web build
|
|
12
|
+
* resolves would be asserting `null` and calling it a test.
|
|
13
|
+
*
|
|
14
|
+
* `expo-linear-gradient` ships untranspiled JSX in its published build, which
|
|
15
|
+
* the web transform cannot parse, so it is mocked into a probe element. The
|
|
16
|
+
* mock is the gradient, not the component under test: colours, start and end
|
|
17
|
+
* come straight from WheelEdgeFade.
|
|
18
|
+
*/
|
|
19
|
+
import { cleanup } from "@testing-library/react";
|
|
20
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
21
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
22
|
+
import { WheelEdgeFade } from "./WheelEdgeFade";
|
|
23
|
+
import { WheelEdgeFade as NativeWheelEdgeFade } from "./WheelEdgeFade.native";
|
|
24
|
+
|
|
25
|
+
vi.mock("expo-linear-gradient", () => ({
|
|
26
|
+
LinearGradient: (props: { colors?: string[]; start?: unknown; end?: unknown }) => (
|
|
27
|
+
<div
|
|
28
|
+
data-gradient="true"
|
|
29
|
+
data-colors={(props.colors ?? []).join("|")}
|
|
30
|
+
data-start={JSON.stringify(props.start)}
|
|
31
|
+
data-end={JSON.stringify(props.end)}
|
|
32
|
+
/>
|
|
33
|
+
),
|
|
34
|
+
}));
|
|
35
|
+
|
|
36
|
+
afterEach(cleanup);
|
|
37
|
+
|
|
38
|
+
function bands(container: HTMLElement): HTMLElement[] {
|
|
39
|
+
return Array.from(container.querySelectorAll("[style*='height']")) as HTMLElement[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function gradients(container: HTMLElement): HTMLElement[] {
|
|
43
|
+
return Array.from(container.querySelectorAll("[data-gradient]")) as HTMLElement[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function colorsOf(node: HTMLElement): string[] {
|
|
47
|
+
return String(node.getAttribute("data-colors") ?? "").split("|");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
describe("WheelEdgeFade — web", () => {
|
|
51
|
+
it("renders nothing, because the viewport's CSS mask already does the fade", () => {
|
|
52
|
+
const { container } = renderWithProviders(<WheelEdgeFade height={24} />);
|
|
53
|
+
expect(container.querySelector("[data-gradient]")).toBeNull();
|
|
54
|
+
expect(container.textContent).toBe("");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("renders nothing at every height, so it can never dim a row", () => {
|
|
58
|
+
for (const height of [0, 1, 24, 400]) {
|
|
59
|
+
const { container } = renderWithProviders(<WheelEdgeFade height={height} />);
|
|
60
|
+
expect(container.querySelector("[data-gradient]"), String(height)).toBeNull();
|
|
61
|
+
cleanup();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe("WheelEdgeFade — native", () => {
|
|
67
|
+
it("paints one band per edge, never a single one", () => {
|
|
68
|
+
const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
|
|
69
|
+
expect(gradients(container)).toHaveLength(2);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("draws nothing at all when the band height is zero or negative", () => {
|
|
73
|
+
const zero = renderWithProviders(<NativeWheelEdgeFade height={0} />);
|
|
74
|
+
expect(gradients(zero.container)).toHaveLength(0);
|
|
75
|
+
cleanup();
|
|
76
|
+
const negative = renderWithProviders(<NativeWheelEdgeFade height={-8} />);
|
|
77
|
+
expect(gradients(negative.container)).toHaveLength(0);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("pins one band to the top and one to the bottom", () => {
|
|
81
|
+
const { container } = renderWithProviders(<NativeWheelEdgeFade height={30} />);
|
|
82
|
+
const edges = bands(container).map((node) => node.getAttribute("style") ?? "");
|
|
83
|
+
expect(edges.some((style) => /top:\s*0px/.test(style))).toBe(true);
|
|
84
|
+
expect(edges.some((style) => /bottom:\s*0px/.test(style))).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("gives each band the height it was handed, so the caller sets the fade depth", () => {
|
|
88
|
+
const { container } = renderWithProviders(<NativeWheelEdgeFade height={30} />);
|
|
89
|
+
const heights = bands(container).map(
|
|
90
|
+
(node) => /height:\s*(\d+)px/.exec(node.getAttribute("style") ?? "")?.[1],
|
|
91
|
+
);
|
|
92
|
+
expect(heights.filter(Boolean)).toEqual(["30", "30"]);
|
|
93
|
+
cleanup();
|
|
94
|
+
const taller = renderWithProviders(<NativeWheelEdgeFade height={64} />);
|
|
95
|
+
expect(
|
|
96
|
+
bands(taller.container).map(
|
|
97
|
+
(node) => /height:\s*(\d+)px/.exec(node.getAttribute("style") ?? "")?.[1],
|
|
98
|
+
),
|
|
99
|
+
).toEqual(["64", "64"]);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("keeps the bands out of the way of a drag, so the wheel still scrolls", () => {
|
|
103
|
+
const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
|
|
104
|
+
for (const band of bands(container)) {
|
|
105
|
+
expect(band.className).toContain("r-pointerEvents");
|
|
106
|
+
expect(band.className).toContain("r-position");
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("runs the top band opaque-to-clear and the bottom band clear-to-opaque", () => {
|
|
111
|
+
const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
|
|
112
|
+
const [top, bottom] = gradients(container).map(colorsOf);
|
|
113
|
+
expect(top).toHaveLength(2);
|
|
114
|
+
expect(bottom).toHaveLength(2);
|
|
115
|
+
// The two bands are mirror images: the top starts on the page background
|
|
116
|
+
// and ends transparent, the bottom does the reverse.
|
|
117
|
+
expect(top[0]).toBe(bottom[1]);
|
|
118
|
+
expect(top[1]).toBe(bottom[0]);
|
|
119
|
+
expect(top[1]).toMatch(/,\s*0\)$/);
|
|
120
|
+
expect(top[0]).not.toMatch(/,\s*0\)$/);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("derives the fade colour from the theme background rather than a hardcoded white", () => {
|
|
124
|
+
const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
|
|
125
|
+
const [opaque, clear] = colorsOf(gradients(container)[0]);
|
|
126
|
+
expect(opaque).toBeTruthy();
|
|
127
|
+
expect(opaque).not.toBe("transparent");
|
|
128
|
+
// The clear stop is the SAME colour at zero alpha, so the band never
|
|
129
|
+
// shifts hue across its length.
|
|
130
|
+
const channels = /rgba\(([^)]+),\s*0\)$/.exec(clear)?.[1];
|
|
131
|
+
expect(channels, `clear stop ${clear} must be the opaque stop at alpha 0`).toBeTruthy();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("runs both gradients vertically down the centre line", () => {
|
|
135
|
+
const { container } = renderWithProviders(<NativeWheelEdgeFade height={24} />);
|
|
136
|
+
for (const gradient of gradients(container)) {
|
|
137
|
+
expect(gradient.getAttribute("data-start")).toBe(JSON.stringify({ x: 0.5, y: 0 }));
|
|
138
|
+
expect(gradient.getAttribute("data-end")).toBe(JSON.stringify({ x: 0.5, y: 1 }));
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
});
|