@multiplatform.one/forms 7.90.6 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/IconButtonGroup.native.js.map +1 -1
- package/dist/cjs/Button/circleGlyph.native.js.map +1 -1
- package/dist/cjs/Button/glass.cjs +4 -0
- package/dist/cjs/Button/glass.native.js +6 -0
- package/dist/cjs/Button/glass.native.js.map +1 -1
- package/dist/cjs/Button/iconButtonGroupContext.native.js.map +1 -1
- package/dist/cjs/Button/index.cjs +1 -2
- package/dist/cjs/Button/index.native.js +1 -2
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/Button/webGlass.native.js.map +1 -1
- package/dist/cjs/Chip/index.native.js.map +1 -1
- package/dist/cjs/Composer/index.cjs +85 -0
- package/dist/cjs/Composer/index.native.js +95 -0
- package/dist/cjs/Composer/index.native.js.map +1 -0
- 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.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/useUnsavedChangesGuard.native.js.map +1 -1
- package/dist/cjs/ControlGroup/index.native.js.map +1 -1
- package/dist/cjs/DescriptionList/index.native.js.map +1 -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.map +1 -1
- package/dist/cjs/FieldGroup.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/PanelHeader.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/RegularPanel.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/compactFace.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/containingBlock.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/coverRect.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/index.cjs +1 -4
- package/dist/cjs/FloatingPanel/index.native.js +2 -3
- package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/paintedBox.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/panelWidth.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/regularPlacement.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +1 -7
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +1 -7
- package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/cjs/Form/index.native.js.map +1 -1
- package/dist/cjs/Form/submissionController.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/PasswordReveal.native.js.map +1 -1
- package/dist/cjs/InputParts/index.cjs +32 -1
- package/dist/cjs/InputParts/index.native.js +32 -1
- package/dist/cjs/InputParts/index.native.js.map +1 -1
- package/dist/cjs/InputParts/keyboardAppearance.native.js.map +1 -1
- package/dist/cjs/Label/index.native.js.map +1 -1
- package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
- package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
- package/dist/cjs/MediaPicker/types.native.js.map +1 -1
- package/dist/cjs/MediaPicker/useMediaPicker.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/Wheel/wheelShared.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.map +1 -1
- package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
- 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 +0 -2
- package/dist/cjs/fields/Checkbox/Checkbox.native.js +0 -2
- 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 +2 -4
- package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +2 -4
- package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/SystemColorField.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/index.cjs +1 -3
- package/dist/cjs/fields/ColorPicker/index.native.js +2 -4
- package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
- package/dist/cjs/fields/Combobox/authorOptions.native.js.map +1 -1
- package/dist/cjs/fields/Combobox/index.cjs +0 -2
- package/dist/cjs/fields/Combobox/index.native.js +1 -3
- 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.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +2 -5
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +2 -5
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +1 -3
- package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/catalog.cjs +2 -5
- package/dist/cjs/fields/DatePicker/catalog.native.js +2 -5
- package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/fieldValueSync.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/index.native.js +1 -3
- package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
- 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/durationWheelTypes.native.js.map +1 -1
- 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 +1 -3
- package/dist/cjs/fields/FileUpload/index.native.js +1 -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/geocoder.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/geocoderContext.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/index.cjs +2 -2
- package/dist/cjs/fields/Geolocation/index.native.js +2 -2
- 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/Geolocation/nativeSearchFocus.native.js.map +1 -1
- package/dist/cjs/fields/Geolocation/photonGeocoder.native.js.map +1 -1
- package/dist/cjs/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/cjs/fields/Icon/index.cjs +1 -3
- package/dist/cjs/fields/Icon/index.native.js +1 -3
- package/dist/cjs/fields/Icon/index.native.js.map +1 -1
- package/dist/cjs/fields/ImageField/index.cjs +1 -5
- package/dist/cjs/fields/ImageField/index.native.js +1 -5
- package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
- package/dist/cjs/fields/Input/index.native.js.map +1 -1
- package/dist/cjs/fields/MentionInput/index.cjs +3 -5
- package/dist/cjs/fields/MentionInput/index.native.js +3 -5
- package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
- 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/OTPInput/otpCellEdge.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
- 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/PhoneInput/regionNames.native.js.map +1 -1
- package/dist/cjs/fields/Progress/index.native.js.map +1 -1
- package/dist/cjs/fields/RadioGroup/index.cjs +0 -2
- package/dist/cjs/fields/RadioGroup/index.native.js +0 -2
- package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
- 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.native.js.map +1 -1
- package/dist/cjs/fields/Select/InlineChoices.native.js.map +1 -1
- package/dist/cjs/fields/Select/SheetPickerRow.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.cjs +0 -2
- package/dist/cjs/fields/Select/index.native.js +3 -5
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/shouldInlineChoices.native.js.map +1 -1
- package/dist/cjs/fields/Signature/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/index.cjs +0 -2
- package/dist/cjs/fields/Slider/index.native.js +0 -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.map +1 -1
- package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
- package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
- package/dist/cjs/fields/Switch/index.native.js.map +1 -1
- package/dist/cjs/fields/TextArea/index.cjs +0 -2
- package/dist/cjs/fields/TextArea/index.native.js +1 -3
- package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
- package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
- package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
- package/dist/cjs/fields/ToggleGroup/index.cjs +0 -2
- package/dist/cjs/fields/ToggleGroup/index.native.js +1 -3
- package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
- package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
- 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 +3 -1
- package/dist/cjs/index.gnome.cjs +200 -0
- package/dist/cjs/index.gnome.native.js +203 -0
- package/dist/cjs/index.gnome.native.js.map +1 -0
- package/dist/cjs/index.native.js +2 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/keyboard/chain.native.js.map +1 -1
- package/dist/cjs/keyboard/index.native.js.map +1 -1
- package/dist/cjs/keyboard/types.native.js.map +1 -1
- package/dist/cjs/nativeTwins.cjs +28 -0
- package/dist/cjs/nativeTwins.native.js +31 -0
- package/dist/cjs/nativeTwins.native.js.map +1 -0
- package/dist/cjs/requiredMarking.native.js.map +1 -1
- package/dist/cjs/shared/CheckGlyph.native.js.map +1 -1
- package/dist/cjs/shared/OverlayWindow.native.js +2 -33
- package/dist/cjs/shared/OverlayWindow.native.js.map +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/checkedOnField.native.js.map +1 -1
- package/dist/cjs/shared/choiceRowPress.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/fieldRowContext.native.js.map +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/instantMotion.native.js.map +1 -1
- package/dist/cjs/shared/nativeA11y.native.js.map +1 -1
- package/dist/cjs/shared/nativeAutoFocus.native.js.map +1 -1
- package/dist/cjs/shared/nativeOverlayWindow.cjs +50 -0
- package/dist/cjs/shared/nativeOverlayWindow.native.js +54 -0
- package/dist/cjs/shared/nativeOverlayWindow.native.js.map +1 -0
- package/dist/cjs/shared/overlaySizeClass.native.js.map +1 -1
- package/dist/cjs/shared/overlayStack.native.js.map +1 -1
- package/dist/cjs/shared/panelPortal.native.js.map +1 -1
- package/dist/cjs/shared/pickerTriggerContract.native.js.map +1 -1
- package/dist/cjs/shared/pressSlopProps.native.js.map +1 -1
- package/dist/cjs/shared/restoreRetries.native.js.map +1 -1
- package/dist/cjs/shared/sheetNavigation.native.js.map +1 -1
- package/dist/cjs/shared/systemControlModules.gnome.native.js.map +1 -1
- package/dist/cjs/shared/systemControls.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.map +1 -1
- package/dist/cjs/shared/zIndex.native.js.map +1 -1
- package/dist/cjs/standardActions.native.js.map +1 -1
- 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/Button/glass.mjs +4 -1
- package/dist/esm/Button/glass.mjs.map +1 -1
- package/dist/esm/Button/glass.native.js +6 -1
- package/dist/esm/Button/glass.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +2 -3
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +2 -3
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/Composer/index.mjs +60 -0
- package/dist/esm/Composer/index.mjs.map +1 -0
- package/dist/esm/Composer/index.native.js +67 -0
- package/dist/esm/Composer/index.native.js.map +1 -0
- package/dist/esm/FloatingPanel/index.mjs +3 -5
- package/dist/esm/FloatingPanel/index.mjs.map +1 -1
- package/dist/esm/FloatingPanel/index.native.js +3 -4
- package/dist/esm/FloatingPanel/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs +2 -7
- package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js +2 -7
- package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/esm/InputParts/index.mjs +33 -2
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +33 -2
- package/dist/esm/InputParts/index.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.mjs +0 -2
- package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.native.js +0 -2
- package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxGroup.mjs +2 -4
- package/dist/esm/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
- package/dist/esm/fields/Checkbox/CheckboxGroup.native.js +2 -4
- package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/index.mjs +1 -3
- package/dist/esm/fields/ColorPicker/index.mjs.map +1 -1
- package/dist/esm/fields/ColorPicker/index.native.js +2 -4
- package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/esm/fields/Combobox/index.mjs +0 -2
- package/dist/esm/fields/Combobox/index.mjs.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js +1 -3
- package/dist/esm/fields/Combobox/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +2 -5
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +2 -5
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.native.js +1 -3
- package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/catalog.mjs +2 -5
- package/dist/esm/fields/DatePicker/catalog.mjs.map +1 -1
- package/dist/esm/fields/DatePicker/catalog.native.js +2 -5
- package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/index.native.js +1 -3
- package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/index.mjs +1 -3
- package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
- package/dist/esm/fields/FileUpload/index.native.js +1 -3
- package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/index.mjs +2 -2
- package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
- package/dist/esm/fields/Geolocation/index.native.js +2 -2
- package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
- package/dist/esm/fields/Icon/index.mjs +1 -3
- package/dist/esm/fields/Icon/index.mjs.map +1 -1
- package/dist/esm/fields/Icon/index.native.js +1 -3
- package/dist/esm/fields/Icon/index.native.js.map +1 -1
- package/dist/esm/fields/ImageField/index.mjs +1 -5
- package/dist/esm/fields/ImageField/index.mjs.map +1 -1
- package/dist/esm/fields/ImageField/index.native.js +1 -5
- package/dist/esm/fields/ImageField/index.native.js.map +1 -1
- package/dist/esm/fields/MentionInput/index.mjs +3 -5
- package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
- package/dist/esm/fields/MentionInput/index.native.js +3 -5
- package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
- package/dist/esm/fields/RadioGroup/index.mjs +0 -2
- package/dist/esm/fields/RadioGroup/index.mjs.map +1 -1
- package/dist/esm/fields/RadioGroup/index.native.js +0 -2
- package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/esm/fields/Select/index.mjs +0 -2
- package/dist/esm/fields/Select/index.mjs.map +1 -1
- package/dist/esm/fields/Select/index.native.js +3 -5
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/index.mjs +0 -2
- package/dist/esm/fields/Slider/index.mjs.map +1 -1
- package/dist/esm/fields/Slider/index.native.js +0 -2
- package/dist/esm/fields/Slider/index.native.js.map +1 -1
- package/dist/esm/fields/TextArea/index.mjs +0 -2
- package/dist/esm/fields/TextArea/index.mjs.map +1 -1
- package/dist/esm/fields/TextArea/index.native.js +1 -3
- package/dist/esm/fields/TextArea/index.native.js.map +1 -1
- package/dist/esm/fields/ToggleGroup/index.mjs +0 -2
- package/dist/esm/fields/ToggleGroup/index.mjs.map +1 -1
- package/dist/esm/fields/ToggleGroup/index.native.js +1 -3
- package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/esm/index.gnome.mjs +61 -0
- package/dist/esm/index.gnome.mjs.map +1 -0
- package/dist/esm/index.gnome.native.js +61 -0
- package/dist/esm/index.gnome.native.js.map +1 -0
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/nativeTwins.mjs +3 -0
- package/dist/esm/nativeTwins.mjs.map +1 -0
- package/dist/esm/nativeTwins.native.js +3 -0
- package/dist/esm/nativeTwins.native.js.map +1 -0
- package/dist/esm/shared/OverlayWindow.native.js +1 -25
- package/dist/esm/shared/OverlayWindow.native.js.map +1 -1
- package/dist/esm/shared/nativeOverlayWindow.mjs +25 -0
- package/dist/esm/shared/nativeOverlayWindow.mjs.map +1 -0
- package/dist/esm/shared/nativeOverlayWindow.native.js +26 -0
- package/dist/esm/shared/nativeOverlayWindow.native.js.map +1 -0
- package/dist/jsx/Button/glass.mjs +4 -1
- package/dist/jsx/Button/glass.mjs.map +1 -1
- package/dist/jsx/Button/glass.native.js +6 -0
- package/dist/jsx/Button/glass.native.js.map +1 -1
- package/dist/jsx/Button/index.mjs +2 -3
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +1 -2
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/Composer/index.mjs +60 -0
- package/dist/jsx/Composer/index.mjs.map +1 -0
- package/dist/jsx/Composer/index.native.js +95 -0
- package/dist/jsx/Composer/index.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/index.mjs +3 -5
- package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/index.native.js +2 -3
- package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +2 -7
- package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +1 -7
- package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
- package/dist/jsx/InputParts/index.mjs +33 -2
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +32 -1
- package/dist/jsx/InputParts/index.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/Checkbox.mjs +0 -2
- package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
- package/dist/jsx/fields/Checkbox/Checkbox.native.js +0 -2
- package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs +2 -4
- package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js +2 -4
- package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- package/dist/jsx/fields/ColorPicker/index.mjs +1 -3
- package/dist/jsx/fields/ColorPicker/index.mjs.map +1 -1
- package/dist/jsx/fields/ColorPicker/index.native.js +2 -4
- package/dist/jsx/fields/ColorPicker/index.native.js.map +1 -1
- package/dist/jsx/fields/Combobox/index.mjs +0 -2
- package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
- package/dist/jsx/fields/Combobox/index.native.js +1 -3
- package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +2 -5
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +2 -5
- package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +1 -3
- package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/catalog.mjs +2 -5
- package/dist/jsx/fields/DatePicker/catalog.mjs.map +1 -1
- package/dist/jsx/fields/DatePicker/catalog.native.js +2 -5
- package/dist/jsx/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/index.native.js +1 -3
- package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
- package/dist/jsx/fields/FileUpload/index.mjs +1 -3
- package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload/index.native.js +1 -3
- package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
- package/dist/jsx/fields/Geolocation/index.mjs +2 -2
- package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
- package/dist/jsx/fields/Geolocation/index.native.js +2 -2
- package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
- package/dist/jsx/fields/Icon/index.mjs +1 -3
- package/dist/jsx/fields/Icon/index.mjs.map +1 -1
- package/dist/jsx/fields/Icon/index.native.js +1 -3
- package/dist/jsx/fields/Icon/index.native.js.map +1 -1
- package/dist/jsx/fields/ImageField/index.mjs +1 -5
- package/dist/jsx/fields/ImageField/index.mjs.map +1 -1
- package/dist/jsx/fields/ImageField/index.native.js +1 -5
- package/dist/jsx/fields/ImageField/index.native.js.map +1 -1
- package/dist/jsx/fields/MentionInput/index.mjs +3 -5
- package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
- package/dist/jsx/fields/MentionInput/index.native.js +3 -5
- package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
- package/dist/jsx/fields/RadioGroup/index.mjs +0 -2
- package/dist/jsx/fields/RadioGroup/index.mjs.map +1 -1
- package/dist/jsx/fields/RadioGroup/index.native.js +0 -2
- package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/index.mjs +0 -2
- package/dist/jsx/fields/Select/index.mjs.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +3 -5
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/fields/Slider/index.mjs +0 -2
- package/dist/jsx/fields/Slider/index.mjs.map +1 -1
- package/dist/jsx/fields/Slider/index.native.js +0 -2
- package/dist/jsx/fields/Slider/index.native.js.map +1 -1
- package/dist/jsx/fields/TextArea/index.mjs +0 -2
- package/dist/jsx/fields/TextArea/index.mjs.map +1 -1
- package/dist/jsx/fields/TextArea/index.native.js +1 -3
- package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
- package/dist/jsx/fields/ToggleGroup/index.mjs +0 -2
- package/dist/jsx/fields/ToggleGroup/index.mjs.map +1 -1
- package/dist/jsx/fields/ToggleGroup/index.native.js +1 -3
- package/dist/jsx/fields/ToggleGroup/index.native.js.map +1 -1
- package/dist/jsx/index.gnome.mjs +61 -0
- package/dist/jsx/index.gnome.mjs.map +1 -0
- package/dist/jsx/index.gnome.native.js +203 -0
- package/dist/jsx/index.gnome.native.js.map +1 -0
- package/dist/jsx/index.js +2 -1
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +2 -1
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +2 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/nativeTwins.mjs +3 -0
- package/dist/jsx/nativeTwins.mjs.map +1 -0
- package/dist/jsx/nativeTwins.native.js +31 -0
- package/dist/jsx/nativeTwins.native.js.map +1 -0
- package/dist/jsx/shared/OverlayWindow.native.js +2 -33
- package/dist/jsx/shared/OverlayWindow.native.js.map +1 -1
- package/dist/jsx/shared/nativeOverlayWindow.mjs +25 -0
- package/dist/jsx/shared/nativeOverlayWindow.mjs.map +1 -0
- package/dist/jsx/shared/nativeOverlayWindow.native.js +54 -0
- package/dist/jsx/shared/nativeOverlayWindow.native.js.map +1 -0
- package/package.json +22 -9
- package/src/Button/glass.native.field.spec.ts +14 -0
- package/src/Button/glass.native.ts +5 -0
- package/src/Button/glass.ts +8 -0
- package/src/Button/index.tsx +2 -7
- package/src/Composer/Composer.spec.tsx +66 -0
- package/src/Composer/Composer.stories.tsx +56 -0
- package/src/Composer/index.tsx +82 -0
- package/src/FloatingPanel/FloatingPanel.stories.tsx +1 -1
- package/src/FloatingPanel/index.native.tsx +2 -3
- package/src/FloatingPanel/index.tsx +1 -10
- package/src/FloatingPanel/panelWidthContract.spec.ts +1 -10
- package/src/FloatingPanel/useFloatingPanel.spec.tsx +0 -26
- package/src/FloatingPanel/useFloatingPanel.ts +1 -19
- package/src/FloatingPanel/viewportHydration.spec.tsx +2 -2
- package/src/InputParts/InputParts.glass.spec.tsx +99 -0
- package/src/InputParts/index.tsx +41 -0
- package/src/fields/Checkbox/Checkbox.spec.tsx +8 -25
- package/src/fields/Checkbox/Checkbox.stories.tsx +4 -4
- package/src/fields/Checkbox/Checkbox.tsx +1 -5
- package/src/fields/Checkbox/CheckboxGroup.stories.tsx +2 -2
- package/src/fields/Checkbox/CheckboxGroup.tsx +3 -8
- package/src/fields/ColorPicker/ColorPicker.spec.tsx +2 -11
- package/src/fields/ColorPicker/index.tsx +3 -7
- package/src/fields/Combobox/Combobox.spec.tsx +1 -5
- package/src/fields/Combobox/Combobox.stories.tsx +6 -6
- package/src/fields/Combobox/index.tsx +1 -6
- package/src/fields/DatePicker/DatePicker.spec.tsx +4 -21
- package/src/fields/DatePicker/DatetimePicker.catalog.tsx +3 -9
- package/src/fields/DatePicker/DatetimePicker.native.spec.tsx +3 -13
- package/src/fields/DatePicker/DatetimePicker.native.tsx +1 -4
- package/src/fields/DatePicker/DatetimePicker.spec.tsx +3 -18
- package/src/fields/DatePicker/DatetimePicker.stories.tsx +3 -3
- package/src/fields/DatePicker/catalog.tsx +3 -9
- package/src/fields/DatePicker/index.native.tsx +1 -4
- package/src/fields/FileUpload/FileUpload.spec.tsx +2 -10
- package/src/fields/FileUpload/index.tsx +3 -7
- package/src/fields/Geolocation/index.tsx +2 -2
- package/src/fields/Icon/index.tsx +1 -5
- package/src/fields/ImageField/ImageField.spec.tsx +2 -10
- package/src/fields/ImageField/index.tsx +2 -9
- package/src/fields/MentionInput/MentionInput.spec.tsx +2 -14
- package/src/fields/MentionInput/index.tsx +3 -7
- package/src/fields/RadioGroup/RadioGroup.spec.tsx +3 -21
- package/src/fields/RadioGroup/RadioGroup.stories.tsx +4 -4
- package/src/fields/RadioGroup/index.tsx +1 -6
- package/src/fields/Select/Select.spec.tsx +1 -5
- package/src/fields/Select/Select.stories.tsx +5 -5
- package/src/fields/Select/index.tsx +1 -6
- package/src/fields/Slider/Slider.spec.tsx +8 -22
- package/src/fields/Slider/Slider.stories.tsx +5 -5
- package/src/fields/Slider/index.tsx +1 -6
- package/src/fields/TextArea/TextArea.spec.tsx +17 -35
- package/src/fields/TextArea/TextArea.stories.tsx +6 -6
- package/src/fields/TextArea/index.tsx +0 -4
- package/src/fields/ToggleGroup/ToggleGroup.spec.tsx +2 -11
- package/src/fields/ToggleGroup/ToggleGroup.stories.tsx +5 -5
- package/src/fields/ToggleGroup/index.tsx +1 -6
- package/src/fields/pickerActivation.spec.tsx +1 -1
- package/src/fields/pickerRows.spec.tsx +4 -4
- package/src/index.gnome.ts +150 -0
- package/src/index.ts +3 -0
- package/src/nativeTwins.ts +8 -0
- package/src/shared/OverlayWindow.native.tsx +1 -28
- package/src/shared/nativeOverlayWindow.tsx +28 -0
- package/types/Button/glass.d.ts +5 -0
- package/types/Button/glass.d.ts.map +1 -1
- package/types/Button/glass.native.d.ts +2 -0
- package/types/Button/glass.native.d.ts.map +1 -1
- package/types/Button/index.d.ts +1 -2
- package/types/Button/index.d.ts.map +1 -1
- package/types/Composer/index.d.ts +28 -0
- package/types/Composer/index.d.ts.map +1 -0
- package/types/FloatingPanel/index.d.ts +1 -7
- package/types/FloatingPanel/index.d.ts.map +1 -1
- package/types/FloatingPanel/index.native.d.ts +1 -1
- package/types/FloatingPanel/index.native.d.ts.map +1 -1
- package/types/FloatingPanel/useFloatingPanel.d.ts +1 -11
- 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 +1 -3
- package/types/fields/Checkbox/Checkbox.d.ts.map +1 -1
- package/types/fields/Checkbox/CheckboxGroup.d.ts +1 -4
- package/types/fields/Checkbox/CheckboxGroup.d.ts.map +1 -1
- package/types/fields/Checkbox/index.d.ts +3 -3
- package/types/fields/ColorPicker/index.d.ts +1 -3
- package/types/fields/ColorPicker/index.d.ts.map +1 -1
- package/types/fields/Combobox/index.d.ts +1 -4
- package/types/fields/Combobox/index.d.ts.map +1 -1
- package/types/fields/DatePicker/DatetimePicker.catalog.d.ts +0 -3
- package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -1
- package/types/fields/DatePicker/DatetimePicker.native.d.ts +0 -1
- package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -1
- package/types/fields/DatePicker/catalog.d.ts +0 -3
- package/types/fields/DatePicker/catalog.d.ts.map +1 -1
- package/types/fields/DatePicker/index.native.d.ts +0 -1
- package/types/fields/DatePicker/index.native.d.ts.map +1 -1
- package/types/fields/FileUpload/index.d.ts +1 -3
- package/types/fields/FileUpload/index.d.ts.map +1 -1
- package/types/fields/Icon/index.d.ts +0 -2
- package/types/fields/Icon/index.d.ts.map +1 -1
- package/types/fields/ImageField/index.d.ts +2 -4
- package/types/fields/ImageField/index.d.ts.map +1 -1
- package/types/fields/MentionInput/index.d.ts +0 -2
- package/types/fields/MentionInput/index.d.ts.map +1 -1
- package/types/fields/RadioGroup/index.d.ts +1 -4
- package/types/fields/RadioGroup/index.d.ts.map +1 -1
- package/types/fields/Select/index.d.ts +1 -4
- package/types/fields/Select/index.d.ts.map +1 -1
- package/types/fields/Slider/index.d.ts +1 -4
- package/types/fields/Slider/index.d.ts.map +1 -1
- package/types/fields/TextArea/index.d.ts +1 -3
- package/types/fields/TextArea/index.d.ts.map +1 -1
- package/types/fields/ToggleGroup/index.d.ts +1 -4
- package/types/fields/ToggleGroup/index.d.ts.map +1 -1
- package/types/index.d.ts +2 -0
- package/types/index.d.ts.map +1 -1
- package/types/index.gnome.d.ts +88 -0
- package/types/index.gnome.d.ts.map +1 -0
- package/types/nativeTwins.d.ts +8 -0
- package/types/nativeTwins.d.ts.map +1 -0
- package/types/shared/OverlayWindow.native.d.ts +1 -14
- package/types/shared/OverlayWindow.native.d.ts.map +1 -1
- package/types/shared/nativeOverlayWindow.d.ts +15 -0
- package/types/shared/nativeOverlayWindow.d.ts.map +1 -0
- package/types/shared/pickerTriggerContract.d.ts +3 -3
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LC-268 (FZ-10606): on iOS 26 a field in chrome, the composer and the search
|
|
3
|
+
* field in a bar, sits on the system's Liquid Glass. Everywhere else, and in
|
|
4
|
+
* content, it is the plain field. One component and one API: the bar and the
|
|
5
|
+
* platform pick it, never an app prop.
|
|
6
|
+
*/
|
|
7
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
8
|
+
import { Surface } from "@multiplatform.one/theme";
|
|
9
|
+
import type { ReactElement } from "react";
|
|
10
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
11
|
+
import { SearchInput } from "../fields/SearchInput";
|
|
12
|
+
import { Input } from "./index";
|
|
13
|
+
|
|
14
|
+
const glass = vi.hoisted(() => ({ system: false }));
|
|
15
|
+
vi.mock("../Button/glass", async (importOriginal) => {
|
|
16
|
+
const real = await importOriginal<typeof import("../Button/glass")>();
|
|
17
|
+
function FakeSystemGlass({
|
|
18
|
+
glassEffectStyle,
|
|
19
|
+
isInteractive,
|
|
20
|
+
style: _style,
|
|
21
|
+
children,
|
|
22
|
+
}: Record<string, unknown>) {
|
|
23
|
+
return (
|
|
24
|
+
<div
|
|
25
|
+
data-glass="system"
|
|
26
|
+
data-effect={glassEffectStyle as string}
|
|
27
|
+
data-interactive={String(isInteractive)}
|
|
28
|
+
>
|
|
29
|
+
{children as never}
|
|
30
|
+
</div>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
...real,
|
|
35
|
+
loadFieldGlassView: () => (glass.system ? FakeSystemGlass : null),
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
glass.system = false;
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
function field(): ReactElement {
|
|
44
|
+
return (
|
|
45
|
+
<Input.Box aria-label="Message">
|
|
46
|
+
<Input.Area placeholder="Type a message" />
|
|
47
|
+
</Input.Box>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function glassOf(container: HTMLElement): Element | null {
|
|
52
|
+
return container.querySelector("[data-glass]");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
describe("LC-268: a field in chrome sits on system Liquid Glass (FZ-10606)", () => {
|
|
56
|
+
it("in a bar on iOS 26 the field's ground is the system's glass, not MPO's fill", () => {
|
|
57
|
+
glass.system = true;
|
|
58
|
+
const { container } = renderWithProviders(<Surface bar>{field()}</Surface>);
|
|
59
|
+
const layer = glassOf(container)!;
|
|
60
|
+
expect(layer.getAttribute("data-glass")).toBe("system");
|
|
61
|
+
expect(layer.getAttribute("data-effect")).toBe("regular");
|
|
62
|
+
expect(layer.getAttribute("data-interactive")).toBe("false");
|
|
63
|
+
const box = container.querySelector("[data-mp-field-glass]")!;
|
|
64
|
+
expect(box.contains(layer)).toBe(true);
|
|
65
|
+
expect(box.contains(container.querySelector("textarea, input"))).toBe(true);
|
|
66
|
+
const ground = getComputedStyle(box as HTMLElement).backgroundColor;
|
|
67
|
+
expect(["", "transparent", "rgba(0, 0, 0, 0)"]).toContain(ground);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("a search field in a bar takes the same glass, its slotted glyphs stay bare", () => {
|
|
71
|
+
glass.system = true;
|
|
72
|
+
const { container, getByLabelText } = renderWithProviders(
|
|
73
|
+
<Surface bar>
|
|
74
|
+
<SearchInput placeholder="Search" />
|
|
75
|
+
</Surface>,
|
|
76
|
+
);
|
|
77
|
+
expect(glassOf(container)?.getAttribute("data-glass")).toBe("system");
|
|
78
|
+
expect(container.querySelector("[data-mp-field-glass]")).not.toBeNull();
|
|
79
|
+
expect(getByLabelText("Search")).toBeTruthy();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("in content the field stays plain even where iOS draws glass", () => {
|
|
83
|
+
glass.system = true;
|
|
84
|
+
const { container } = renderWithProviders(field());
|
|
85
|
+
expect(glassOf(container)).toBeNull();
|
|
86
|
+
expect(container.querySelector("[data-mp-field-glass]")).toBeNull();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("without system glass (Android, the web, iOS before 26) a bar's field stays plain", () => {
|
|
90
|
+
const { container } = renderWithProviders(<Surface bar>{field()}</Surface>);
|
|
91
|
+
expect(glassOf(container)).toBeNull();
|
|
92
|
+
expect(container.querySelector("[data-mp-field-glass]")).toBeNull();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("the web loader never hands a field glass, iOS Safari included", async () => {
|
|
96
|
+
const real = await vi.importActual<typeof import("../Button/glass")>("../Button/glass");
|
|
97
|
+
expect(real.loadFieldGlassView()).toBeNull();
|
|
98
|
+
});
|
|
99
|
+
});
|
package/src/InputParts/index.tsx
CHANGED
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
resolveGlyphPaint,
|
|
49
49
|
SIZE_RECIPE_RADIUS_TOKEN_TO_STOP,
|
|
50
50
|
Surface,
|
|
51
|
+
useBarSurface,
|
|
51
52
|
sizeRecipeBoxVariants,
|
|
52
53
|
sizeRecipeForToken,
|
|
53
54
|
sizeRecipeIconVariants,
|
|
@@ -67,6 +68,7 @@ import { useFieldRow } from "../shared/fieldRowContext";
|
|
|
67
68
|
import { useIsInTableCell } from "../shared/tableCellContext";
|
|
68
69
|
import { useInPanelEcho, usePanelTriggerRadiusReporter } from "../FloatingPanel/echoContext";
|
|
69
70
|
import { keyboardAppearanceFor } from "./keyboardAppearance";
|
|
71
|
+
import { loadFieldGlassView } from "../Button/glass";
|
|
70
72
|
import { useFieldA11y, useFieldDescribedBy } from "../fieldLayout";
|
|
71
73
|
|
|
72
74
|
/**
|
|
@@ -394,6 +396,7 @@ const InputGroupImpl = InputGroupFrame.styleable<{
|
|
|
394
396
|
const inFieldRow = useFieldRow();
|
|
395
397
|
const groupedVertical = useControlGroupVertical();
|
|
396
398
|
const inTableCell = useIsInTableCell() || inFieldRow;
|
|
399
|
+
const barSurface = useBarSurface();
|
|
397
400
|
// Native Pressable owns onPress; do not also pass it to XGroup (double-fire).
|
|
398
401
|
const framePressProps = isWeb ? { onPress, disabled } : { disabled };
|
|
399
402
|
// Standalone Box clips children to radius. Grouped / in-cell frames leave
|
|
@@ -604,6 +607,15 @@ const InputGroupImpl = InputGroupFrame.styleable<{
|
|
|
604
607
|
);
|
|
605
608
|
}
|
|
606
609
|
|
|
610
|
+
const FieldGlass = barSurface && !inPanelEcho ? loadFieldGlassView() : null;
|
|
611
|
+
const glassChrome = FieldGlass
|
|
612
|
+
? {
|
|
613
|
+
...fieldGlassChrome,
|
|
614
|
+
...(focused ? undefined : { borderColor: "transparent" }),
|
|
615
|
+
"data-mp-field-glass": "",
|
|
616
|
+
}
|
|
617
|
+
: undefined;
|
|
618
|
+
|
|
607
619
|
return inFieldFrame(
|
|
608
620
|
<FocusContext.Provider focused={focused} setFocused={setFocused}>
|
|
609
621
|
{wrapNativePressable(
|
|
@@ -652,8 +664,16 @@ const InputGroupImpl = InputGroupFrame.styleable<{
|
|
|
652
664
|
}
|
|
653
665
|
: undefined)}
|
|
654
666
|
{...echoChrome}
|
|
667
|
+
{...glassChrome}
|
|
655
668
|
overflow={boxOverflow}
|
|
656
669
|
>
|
|
670
|
+
{FieldGlass ? (
|
|
671
|
+
<FieldGlass
|
|
672
|
+
glassEffectStyle="regular"
|
|
673
|
+
isInteractive={false}
|
|
674
|
+
style={{ ...fieldGlassFill, borderRadius: drawnRadius }}
|
|
675
|
+
/>
|
|
676
|
+
) : null}
|
|
657
677
|
{children}
|
|
658
678
|
{trailingSlot}
|
|
659
679
|
</InputGroupFrame>,
|
|
@@ -662,6 +682,27 @@ const InputGroupImpl = InputGroupFrame.styleable<{
|
|
|
662
682
|
);
|
|
663
683
|
});
|
|
664
684
|
|
|
685
|
+
/**
|
|
686
|
+
* LC-268 (FZ-10606): a field in a bar on iOS 26 sits on the system's Liquid
|
|
687
|
+
* Glass, the composer and search field of the iOS 26 bars. The glass is the
|
|
688
|
+
* ground, so MPO paints no fill, shadow or resting edge over it; focus keeps
|
|
689
|
+
* its accent border (LC-133).
|
|
690
|
+
*/
|
|
691
|
+
const fieldGlassChrome = {
|
|
692
|
+
backgroundColor: "transparent",
|
|
693
|
+
elevation: undefined,
|
|
694
|
+
shadowColor: "transparent",
|
|
695
|
+
shadowOpacity: 0,
|
|
696
|
+
} as const;
|
|
697
|
+
|
|
698
|
+
const fieldGlassFill = {
|
|
699
|
+
position: "absolute",
|
|
700
|
+
top: 0,
|
|
701
|
+
right: 0,
|
|
702
|
+
bottom: 0,
|
|
703
|
+
left: 0,
|
|
704
|
+
} as const;
|
|
705
|
+
|
|
665
706
|
/**
|
|
666
707
|
* LC-176 (FZ-8711): everything inside a field's frame is part of the field,
|
|
667
708
|
* so an icon button in its leading or trailing slot draws the bare tinted
|
|
@@ -62,14 +62,14 @@ describe("Checkbox", () => {
|
|
|
62
62
|
expect(result.container.querySelector("[role='checkbox']")).toBeNull();
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
-
it("calls
|
|
66
|
-
const
|
|
65
|
+
it("calls onChange when clicked", () => {
|
|
66
|
+
const onChange = vi.fn();
|
|
67
67
|
const result = renderWithProviders(
|
|
68
|
-
<Checkbox name="cb" defaultValue={false}
|
|
68
|
+
<Checkbox name="cb" defaultValue={false} onChange={onChange} />,
|
|
69
69
|
);
|
|
70
70
|
const checkbox = result.getCheckbox();
|
|
71
71
|
if (checkbox) fireEvent.click(checkbox);
|
|
72
|
-
expect(
|
|
72
|
+
expect(onChange).toHaveBeenCalledWith(true);
|
|
73
73
|
});
|
|
74
74
|
|
|
75
75
|
it("clicking the painted box still toggles", () => {
|
|
@@ -86,23 +86,15 @@ describe("Checkbox", () => {
|
|
|
86
86
|
expect(onChange).toHaveBeenCalledWith(true);
|
|
87
87
|
});
|
|
88
88
|
|
|
89
|
-
it("fires canonical onChange
|
|
89
|
+
it("fires canonical onChange once", () => {
|
|
90
90
|
const onChange = vi.fn();
|
|
91
|
-
const onCheckedChange = vi.fn();
|
|
92
91
|
const result = renderWithProviders(
|
|
93
|
-
<Checkbox
|
|
94
|
-
name="cb"
|
|
95
|
-
defaultValue={false}
|
|
96
|
-
onChange={onChange}
|
|
97
|
-
onCheckedChange={onCheckedChange}
|
|
98
|
-
/>,
|
|
92
|
+
<Checkbox name="cb" defaultValue={false} onChange={onChange} />,
|
|
99
93
|
);
|
|
100
94
|
const checkbox = result.getCheckbox();
|
|
101
95
|
if (checkbox) fireEvent.click(checkbox);
|
|
102
96
|
expect(onChange).toHaveBeenCalledTimes(1);
|
|
103
97
|
expect(onChange).toHaveBeenCalledWith(true);
|
|
104
|
-
expect(onCheckedChange).toHaveBeenCalledTimes(1);
|
|
105
|
-
expect(onCheckedChange).toHaveBeenCalledWith(true);
|
|
106
98
|
});
|
|
107
99
|
});
|
|
108
100
|
|
|
@@ -236,25 +228,16 @@ describe("CheckboxGroup", () => {
|
|
|
236
228
|
expect(result.findTextElement("Option C")).toBeDefined();
|
|
237
229
|
});
|
|
238
230
|
|
|
239
|
-
it("fires canonical onChange
|
|
231
|
+
it("fires canonical onChange once", () => {
|
|
240
232
|
const onChange = vi.fn();
|
|
241
|
-
const onValueChange = vi.fn();
|
|
242
233
|
const result = renderWithProviders(
|
|
243
|
-
<CheckboxGroup
|
|
244
|
-
label="Pick options"
|
|
245
|
-
name="opts"
|
|
246
|
-
options={options}
|
|
247
|
-
onChange={onChange}
|
|
248
|
-
onValueChange={onValueChange}
|
|
249
|
-
/>,
|
|
234
|
+
<CheckboxGroup label="Pick options" name="opts" options={options} onChange={onChange} />,
|
|
250
235
|
);
|
|
251
236
|
const checkbox = result.container.querySelector("[role='checkbox']");
|
|
252
237
|
expect(checkbox).toBeTruthy();
|
|
253
238
|
if (checkbox) fireEvent.click(checkbox);
|
|
254
239
|
expect(onChange).toHaveBeenCalledTimes(1);
|
|
255
240
|
expect(onChange).toHaveBeenCalledWith(["a"]);
|
|
256
|
-
expect(onValueChange).toHaveBeenCalledTimes(1);
|
|
257
|
-
expect(onValueChange).toHaveBeenCalledWith(["a"]);
|
|
258
241
|
});
|
|
259
242
|
|
|
260
243
|
it("renders required label with asterisk", () => {
|
|
@@ -182,9 +182,9 @@ export const Comparison: StoryObj = {
|
|
|
182
182
|
<Checkbox
|
|
183
183
|
label="Accept terms"
|
|
184
184
|
defaultValue={customChecked}
|
|
185
|
-
|
|
185
|
+
onChange={(val) => {
|
|
186
186
|
setCustomChecked(!!val);
|
|
187
|
-
action("custom.
|
|
187
|
+
action("custom.onChange")(val);
|
|
188
188
|
}}
|
|
189
189
|
/>
|
|
190
190
|
</YStack>
|
|
@@ -332,9 +332,9 @@ export const CheckboxGroupInteractive: StoryObj = {
|
|
|
332
332
|
{ value: "opt3", label: "Option 3" },
|
|
333
333
|
]}
|
|
334
334
|
value={selected}
|
|
335
|
-
|
|
335
|
+
onChange={(values) => {
|
|
336
336
|
setSelected(values);
|
|
337
|
-
action("
|
|
337
|
+
action("onChange")(values);
|
|
338
338
|
}}
|
|
339
339
|
/>
|
|
340
340
|
<Paragraph size="$2">Selected: {selected.join(", ") || "None"}</Paragraph>
|
|
@@ -64,8 +64,6 @@ export interface CheckboxProps {
|
|
|
64
64
|
* (Input/Select/Switch all use `onChange`). Prefer this.
|
|
65
65
|
*/
|
|
66
66
|
onChange?: (checked: CheckedState) => void;
|
|
67
|
-
/** @deprecated Use `onChange` instead. Kept as an alias for the tamagui/Radix name. */
|
|
68
|
-
onCheckedChange?: (checked: CheckedState) => void;
|
|
69
67
|
onBlur?: (...args: any[]) => void;
|
|
70
68
|
checkboxProps?: Omit<TamaguiCheckboxProps, "children" | "checked" | "id" | "onCheckedChange">;
|
|
71
69
|
children?: ReactNode;
|
|
@@ -102,18 +100,16 @@ export function Checkbox({
|
|
|
102
100
|
checked,
|
|
103
101
|
defaultValue,
|
|
104
102
|
onChange,
|
|
105
|
-
onCheckedChange,
|
|
106
103
|
onBlur,
|
|
107
104
|
checkboxProps,
|
|
108
105
|
children,
|
|
109
106
|
pointy,
|
|
110
107
|
skeleton,
|
|
111
108
|
}: CheckboxProps) {
|
|
112
|
-
// Canonical `onChange`
|
|
109
|
+
// Canonical `onChange` fires from a
|
|
113
110
|
// single emit site (same reconciliation as Switch).
|
|
114
111
|
const handleValueChange = (val: CheckedState) => {
|
|
115
112
|
onChange?.(val);
|
|
116
|
-
onCheckedChange?.(val);
|
|
117
113
|
};
|
|
118
114
|
const { resolvedForm, knobProps, text, elevation, disabledState, id } = useFormField({
|
|
119
115
|
form: formProp,
|
|
@@ -40,7 +40,7 @@ type Story = StoryObj<typeof CheckboxGroup>;
|
|
|
40
40
|
export const Basic: Story = {
|
|
41
41
|
render: (args) => (
|
|
42
42
|
<YStack maxWidth={400}>
|
|
43
|
-
<CheckboxGroup {...args}
|
|
43
|
+
<CheckboxGroup {...args} onChange={action("onChange")} />
|
|
44
44
|
</YStack>
|
|
45
45
|
),
|
|
46
46
|
};
|
|
@@ -226,7 +226,7 @@ export const ElevationLarge: Story = {
|
|
|
226
226
|
render: (args) => (
|
|
227
227
|
<Preset overrides={{ elevation: "large" }}>
|
|
228
228
|
<YStack maxWidth={400}>
|
|
229
|
-
<CheckboxGroup {...args}
|
|
229
|
+
<CheckboxGroup {...args} onChange={action("onChange")} />
|
|
230
230
|
</YStack>
|
|
231
231
|
</Preset>
|
|
232
232
|
),
|
|
@@ -54,11 +54,8 @@ export interface CheckboxGroupProps {
|
|
|
54
54
|
defaultValue?: string[];
|
|
55
55
|
/**
|
|
56
56
|
* Canonical change handler, consistent with the rest of the field family.
|
|
57
|
-
* Prefer this over `onValueChange`.
|
|
58
57
|
*/
|
|
59
58
|
onChange?: (value: string[]) => void;
|
|
60
|
-
/** @deprecated Use `onChange` instead. */
|
|
61
|
-
onValueChange?: (value: string[]) => void;
|
|
62
59
|
onBlur?: (...args: any[]) => void;
|
|
63
60
|
options?: CheckboxGroupOption[];
|
|
64
61
|
orientation?: "horizontal" | "vertical";
|
|
@@ -89,7 +86,6 @@ export function CheckboxGroup({
|
|
|
89
86
|
value,
|
|
90
87
|
defaultValue,
|
|
91
88
|
onChange,
|
|
92
|
-
onValueChange,
|
|
93
89
|
onBlur,
|
|
94
90
|
options,
|
|
95
91
|
orientation = "vertical",
|
|
@@ -98,11 +94,10 @@ export function CheckboxGroup({
|
|
|
98
94
|
skeleton,
|
|
99
95
|
card,
|
|
100
96
|
}: CheckboxGroupProps) {
|
|
101
|
-
// Canonical `onChange`
|
|
97
|
+
// Canonical `onChange` fires from the
|
|
102
98
|
// single emit site below (same reconciliation as Switch).
|
|
103
99
|
const handleValueChange = (newValues: string[]) => {
|
|
104
100
|
onChange?.(newValues);
|
|
105
|
-
onValueChange?.(newValues);
|
|
106
101
|
};
|
|
107
102
|
const { resolvedForm, knobProps, disabledState, id } = useFormField({
|
|
108
103
|
form: formProp,
|
|
@@ -212,7 +207,7 @@ export function CheckboxGroup({
|
|
|
212
207
|
<Checkbox
|
|
213
208
|
id={itemId}
|
|
214
209
|
checked={isChecked}
|
|
215
|
-
|
|
210
|
+
onChange={(checked) => {
|
|
216
211
|
if (isDisabled || readOnly) return;
|
|
217
212
|
emit(toggleValue(currentValues, option.value, checked));
|
|
218
213
|
}}
|
|
@@ -260,7 +255,7 @@ export function CheckboxGroup({
|
|
|
260
255
|
label={option.label}
|
|
261
256
|
id={itemId}
|
|
262
257
|
checked={isChecked}
|
|
263
|
-
|
|
258
|
+
onChange={(checked) => {
|
|
264
259
|
if (isDisabled || readOnly) return;
|
|
265
260
|
const newValues = toggleValue(currentValues, option.value, checked);
|
|
266
261
|
handleChange?.(newValues);
|
|
@@ -118,18 +118,11 @@ describe("ColorPicker", () => {
|
|
|
118
118
|
});
|
|
119
119
|
});
|
|
120
120
|
|
|
121
|
-
it("fires canonical onChange
|
|
121
|
+
it("fires canonical onChange once when cleared", async () => {
|
|
122
122
|
const ColorPicker = await loadColorPicker();
|
|
123
123
|
const onChange = vi.fn();
|
|
124
|
-
const onValueChange = vi.fn();
|
|
125
124
|
const result = renderWithProviders(
|
|
126
|
-
<ColorPicker
|
|
127
|
-
label="Color"
|
|
128
|
-
name="color"
|
|
129
|
-
defaultValue="#112233"
|
|
130
|
-
onChange={onChange}
|
|
131
|
-
onValueChange={onValueChange}
|
|
132
|
-
/>,
|
|
125
|
+
<ColorPicker label="Color" name="color" defaultValue="#112233" onChange={onChange} />,
|
|
133
126
|
);
|
|
134
127
|
|
|
135
128
|
const triggerButton = result.container.querySelector("button");
|
|
@@ -142,8 +135,6 @@ describe("ColorPicker", () => {
|
|
|
142
135
|
expect(onChange).toHaveBeenCalledWith("");
|
|
143
136
|
});
|
|
144
137
|
expect(onChange).toHaveBeenCalledTimes(1);
|
|
145
|
-
expect(onValueChange).toHaveBeenCalledTimes(1);
|
|
146
|
-
expect(onValueChange).toHaveBeenCalledWith("");
|
|
147
138
|
});
|
|
148
139
|
|
|
149
140
|
it("shows format validation error for unrecognized rgb value", async () => {
|
|
@@ -77,11 +77,9 @@ export type ColorPickerProps<
|
|
|
77
77
|
value?: string;
|
|
78
78
|
/**
|
|
79
79
|
* Canonical change handler, consistent with the rest of the field family.
|
|
80
|
-
* Fires in both standalone and form mode.
|
|
80
|
+
* Fires in both standalone and form mode.
|
|
81
81
|
*/
|
|
82
82
|
onChange?: (value: string) => void;
|
|
83
|
-
/** @deprecated Use `onChange` instead. */
|
|
84
|
-
onValueChange?: (value: string) => void;
|
|
85
83
|
/** When true, renders a skeleton placeholder instead of the color picker */
|
|
86
84
|
skeleton?: boolean;
|
|
87
85
|
};
|
|
@@ -743,7 +741,6 @@ export function ColorPicker<
|
|
|
743
741
|
onBlur,
|
|
744
742
|
value: controlledValue,
|
|
745
743
|
onChange,
|
|
746
|
-
onValueChange,
|
|
747
744
|
skeleton,
|
|
748
745
|
id: idProp,
|
|
749
746
|
} = useProps(props);
|
|
@@ -751,14 +748,13 @@ export function ColorPicker<
|
|
|
751
748
|
const themePresets = useThemePresetColors();
|
|
752
749
|
const presetColors = presetColorsProp ?? themePresets;
|
|
753
750
|
|
|
754
|
-
// Canonical `onChange`
|
|
751
|
+
// Canonical `onChange` fires from a
|
|
755
752
|
// single emit per change (same reconciliation as Switch).
|
|
756
753
|
const emitValueChange = useCallback(
|
|
757
754
|
(newValue: string) => {
|
|
758
755
|
onChange?.(newValue);
|
|
759
|
-
onValueChange?.(newValue);
|
|
760
756
|
},
|
|
761
|
-
[onChange
|
|
757
|
+
[onChange],
|
|
762
758
|
);
|
|
763
759
|
|
|
764
760
|
const { resolvedForm, knobProps, id } = useFormField({ form, id: idProp });
|
|
@@ -110,9 +110,8 @@ describe("Combobox", () => {
|
|
|
110
110
|
expect(findInPage("Disabled")).toBeDefined();
|
|
111
111
|
});
|
|
112
112
|
|
|
113
|
-
it("fires canonical onChange
|
|
113
|
+
it("fires canonical onChange once when dismissing a chip", async () => {
|
|
114
114
|
const onChange = vi.fn();
|
|
115
|
-
const onValueChange = vi.fn();
|
|
116
115
|
const result = renderWithProviders(
|
|
117
116
|
<Combobox
|
|
118
117
|
label="Fruits"
|
|
@@ -122,7 +121,6 @@ describe("Combobox", () => {
|
|
|
122
121
|
dismissible
|
|
123
122
|
value={["apple", "banana"]}
|
|
124
123
|
onChange={onChange}
|
|
125
|
-
onValueChange={onValueChange}
|
|
126
124
|
/>,
|
|
127
125
|
);
|
|
128
126
|
// Labels are differentiated per chip now — "Remove {label}".
|
|
@@ -134,8 +132,6 @@ describe("Combobox", () => {
|
|
|
134
132
|
// Exactly once each — guards against the standalone double-fire bug.
|
|
135
133
|
expect(onChange).toHaveBeenCalledTimes(1);
|
|
136
134
|
expect(onChange).toHaveBeenCalledWith(["banana"]);
|
|
137
|
-
expect(onValueChange).toHaveBeenCalledTimes(1);
|
|
138
|
-
expect(onValueChange).toHaveBeenCalledWith(["banana"]);
|
|
139
135
|
});
|
|
140
136
|
|
|
141
137
|
it("stable keeps Cherry in third position when selected and open", async () => {
|
|
@@ -182,9 +182,9 @@ export const Basic: Story = {
|
|
|
182
182
|
<Combobox
|
|
183
183
|
{...args}
|
|
184
184
|
value={value}
|
|
185
|
-
|
|
185
|
+
onChange={(val) => {
|
|
186
186
|
setValue(Array.isArray(val) ? val[0] : val);
|
|
187
|
-
action("
|
|
187
|
+
action("onChange")(val);
|
|
188
188
|
}}
|
|
189
189
|
/>
|
|
190
190
|
{value && <Text color="$colorHover">Selected: {value}</Text>}
|
|
@@ -203,7 +203,7 @@ export const WithLabel: Story = {
|
|
|
203
203
|
helperText="Select an author from the list"
|
|
204
204
|
options={authorOptions}
|
|
205
205
|
value={value}
|
|
206
|
-
|
|
206
|
+
onChange={(v) => setValue(Array.isArray(v) ? v[0] : v)}
|
|
207
207
|
placeholder="Select an author..."
|
|
208
208
|
searchPlaceholder="Type to search..."
|
|
209
209
|
/>
|
|
@@ -251,7 +251,7 @@ export const Interactive: Story = {
|
|
|
251
251
|
label="Pick an author"
|
|
252
252
|
options={authorOptions}
|
|
253
253
|
value={value}
|
|
254
|
-
|
|
254
|
+
onChange={(v) => setValue(Array.isArray(v) ? v[0] : v)}
|
|
255
255
|
placeholder="Select an author..."
|
|
256
256
|
/>
|
|
257
257
|
<Text>Selected: {value || "None"}</Text>
|
|
@@ -275,7 +275,7 @@ export const CustomTrigger: StoryObj<typeof Combobox> = {
|
|
|
275
275
|
<Combobox
|
|
276
276
|
options={authorOptions}
|
|
277
277
|
value={value}
|
|
278
|
-
|
|
278
|
+
onChange={(v) => setValue(Array.isArray(v) ? v[0] : v)}
|
|
279
279
|
searchPlaceholder="Type to search..."
|
|
280
280
|
popoverWidth={260}
|
|
281
281
|
trigger={(selected) => (
|
|
@@ -321,7 +321,7 @@ export const ManyOptions: StoryObj<typeof Combobox> = {
|
|
|
321
321
|
label="Pick an item"
|
|
322
322
|
options={options}
|
|
323
323
|
value={value}
|
|
324
|
-
|
|
324
|
+
onChange={(v) => setValue(Array.isArray(v) ? v[0] : v)}
|
|
325
325
|
placeholder="Select from 100 items..."
|
|
326
326
|
searchPlaceholder="Type to filter..."
|
|
327
327
|
emptyMessage="No matching items."
|
|
@@ -163,11 +163,8 @@ export interface ComboboxProps {
|
|
|
163
163
|
defaultValue?: string | string[];
|
|
164
164
|
/**
|
|
165
165
|
* Canonical change handler, consistent with the rest of the field family.
|
|
166
|
-
* Prefer this over `onValueChange`.
|
|
167
166
|
*/
|
|
168
167
|
onChange?: (value: string | string[]) => void;
|
|
169
|
-
/** @deprecated Use `onChange` instead. */
|
|
170
|
-
onValueChange?: (value: string | string[]) => void;
|
|
171
168
|
placeholder?: string;
|
|
172
169
|
searchPlaceholder?: string;
|
|
173
170
|
emptyMessage?: string;
|
|
@@ -2564,7 +2561,6 @@ export function Combobox({
|
|
|
2564
2561
|
value: valueProp,
|
|
2565
2562
|
defaultValue,
|
|
2566
2563
|
onChange,
|
|
2567
|
-
onValueChange,
|
|
2568
2564
|
placeholder: placeholderProp,
|
|
2569
2565
|
searchPlaceholder: searchPlaceholderProp,
|
|
2570
2566
|
emptyMessage: emptyMessageProp,
|
|
@@ -2704,10 +2700,9 @@ export function Combobox({
|
|
|
2704
2700
|
onValueChange={(value) => {
|
|
2705
2701
|
if (disabled) return;
|
|
2706
2702
|
handleValueChange?.(value);
|
|
2707
|
-
// Canonical `onChange`
|
|
2703
|
+
// Canonical `onChange` fires from
|
|
2708
2704
|
// this single emit site (same reconciliation as Switch).
|
|
2709
2705
|
onChange?.(value);
|
|
2710
|
-
onValueChange?.(value);
|
|
2711
2706
|
}}
|
|
2712
2707
|
onBlur={handleBlur}
|
|
2713
2708
|
placeholder={placeholder}
|
|
@@ -82,12 +82,11 @@ describe("DatePicker", () => {
|
|
|
82
82
|
expect(document.querySelector('[data-testid="floating-panel-viewport"]')).toBeNull();
|
|
83
83
|
});
|
|
84
84
|
|
|
85
|
-
it("fires canonical onChange
|
|
85
|
+
it("fires canonical onChange once when a day is picked", async () => {
|
|
86
86
|
const DatePicker = await loadDatePicker();
|
|
87
87
|
const onChange = vi.fn();
|
|
88
|
-
const onValueChange = vi.fn();
|
|
89
88
|
const result = renderWithProviders(
|
|
90
|
-
<DatePicker label="Date" name="date" onChange={onChange}
|
|
89
|
+
<DatePicker label="Date" name="date" onChange={onChange} />,
|
|
91
90
|
);
|
|
92
91
|
|
|
93
92
|
const trigger = result.container.querySelector("input,button,[role='button']");
|
|
@@ -106,9 +105,7 @@ describe("DatePicker", () => {
|
|
|
106
105
|
});
|
|
107
106
|
|
|
108
107
|
expect(onChange).toHaveBeenCalledTimes(1);
|
|
109
|
-
expect(onValueChange).toHaveBeenCalledTimes(1);
|
|
110
108
|
expect(onChange.mock.calls[0][0]).toBeInstanceOf(Date);
|
|
111
|
-
expect(onChange.mock.calls[0][0]).toEqual(onValueChange.mock.calls[0][0]);
|
|
112
109
|
});
|
|
113
110
|
});
|
|
114
111
|
|
|
@@ -262,32 +259,18 @@ describe("DatePicker", () => {
|
|
|
262
259
|
it("standalone controlled: a value arriving after mount displays, without onChange", async () => {
|
|
263
260
|
const DatePicker = await loadDatePicker();
|
|
264
261
|
const onChange = vi.fn();
|
|
265
|
-
const onValueChange = vi.fn();
|
|
266
262
|
const result = renderWithProviders(
|
|
267
|
-
<DatePicker
|
|
268
|
-
label="Due Date"
|
|
269
|
-
value={null}
|
|
270
|
-
onChange={onChange}
|
|
271
|
-
onValueChange={onValueChange}
|
|
272
|
-
/>,
|
|
263
|
+
<DatePicker label="Due Date" value={null} onChange={onChange} />,
|
|
273
264
|
);
|
|
274
265
|
expect(getDisplayInput(result.container)?.value ?? "").toBe("");
|
|
275
266
|
|
|
276
267
|
// Late seed: the upstream doc value (frappe wire string) arrives after
|
|
277
268
|
// first paint.
|
|
278
|
-
result.rerender(
|
|
279
|
-
<DatePicker
|
|
280
|
-
label="Due Date"
|
|
281
|
-
value="2026-03-05"
|
|
282
|
-
onChange={onChange}
|
|
283
|
-
onValueChange={onValueChange}
|
|
284
|
-
/>,
|
|
285
|
-
);
|
|
269
|
+
result.rerender(<DatePicker label="Due Date" value="2026-03-05" onChange={onChange} />);
|
|
286
270
|
await waitFor(() => {
|
|
287
271
|
expect(getDisplayInput(result.container)?.value).toBe("Mar 5, 2026");
|
|
288
272
|
});
|
|
289
273
|
expect(onChange).not.toHaveBeenCalled();
|
|
290
|
-
expect(onValueChange).not.toHaveBeenCalled();
|
|
291
274
|
});
|
|
292
275
|
|
|
293
276
|
it("form-integrated: a field value set after mount displays, without onChange", async () => {
|
|
@@ -75,11 +75,8 @@ export type DatetimePickerProps<
|
|
|
75
75
|
value?: Date | string | null;
|
|
76
76
|
/**
|
|
77
77
|
* Canonical change handler, consistent with the rest of the field family.
|
|
78
|
-
* Prefer this over `onValueChange`.
|
|
79
78
|
*/
|
|
80
79
|
onChange?: (value: Date | null) => void;
|
|
81
|
-
/** @deprecated Use `onChange` instead. */
|
|
82
|
-
onValueChange?: (value: Date | null) => void;
|
|
83
80
|
/** Native only. `false` keeps the catalog overlay; omit for the OS picker. */
|
|
84
81
|
native?: boolean;
|
|
85
82
|
/**
|
|
@@ -359,7 +356,6 @@ export function DatetimePicker<
|
|
|
359
356
|
defaultValue,
|
|
360
357
|
value: controlledValue,
|
|
361
358
|
onChange,
|
|
362
|
-
onValueChange,
|
|
363
359
|
form,
|
|
364
360
|
inputProps: _inputProps,
|
|
365
361
|
placeholder = t("Select date and time"),
|
|
@@ -419,11 +415,10 @@ export function DatetimePicker<
|
|
|
419
415
|
setSelectedDatetime(date);
|
|
420
416
|
setDisplayDate(date);
|
|
421
417
|
fieldChange?.(date);
|
|
422
|
-
// Canonical `onChange`
|
|
418
|
+
// Canonical `onChange` fires (single emit).
|
|
423
419
|
onChange?.(date);
|
|
424
|
-
onValueChange?.(date);
|
|
425
420
|
},
|
|
426
|
-
[minDate, maxDate, setDisplayDate, onChange
|
|
421
|
+
[minDate, maxDate, setDisplayDate, onChange],
|
|
427
422
|
);
|
|
428
423
|
|
|
429
424
|
const handleClearDatetime = useCallback(
|
|
@@ -432,9 +427,8 @@ export function DatetimePicker<
|
|
|
432
427
|
setDisplayDate(new Date());
|
|
433
428
|
fieldChange?.(null);
|
|
434
429
|
onChange?.(null);
|
|
435
|
-
onValueChange?.(null);
|
|
436
430
|
},
|
|
437
|
-
[setDisplayDate, onChange
|
|
431
|
+
[setDisplayDate, onChange],
|
|
438
432
|
);
|
|
439
433
|
|
|
440
434
|
const displayValue = useMemo(
|