@multiplatform.one/forms 7.5.0 → 7.6.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 +1 -1
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/index.cjs +6 -10
- package/dist/cjs/Button/index.native.js +7 -11
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/Chip/index.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.cjs +0 -1
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -2
- 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 +3 -3
- 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.native.js +2 -2
- 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.cjs +2 -1
- package/dist/cjs/FieldDisplay/index.native.js +10 -3
- package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
- package/dist/cjs/FieldGroup.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/index.cjs +8 -1
- 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 +64 -2
- package/dist/cjs/InputParts/index.native.js +70 -4
- 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.cjs +15 -9
- package/dist/cjs/fields/Barcode/BarcodePreview.native.js +15 -9
- 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.native.js +1 -1
- 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.native.js +1 -1
- package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- 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.cjs +14 -11
- package/dist/cjs/fields/Combobox/index.native.js +21 -16
- 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.native.js +3 -3
- 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/fieldValueSync.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/index.native.js +2 -2
- package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/parts.native.js +2 -2
- 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.native.js +3 -3
- 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 +11 -3
- package/dist/cjs/fields/FileUpload/index.native.js +22 -5
- 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/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.cjs +1 -0
- package/dist/cjs/fields/Icon/index.native.js +4 -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.cjs +175 -95
- package/dist/cjs/fields/Input/index.native.js +85 -6
- package/dist/cjs/fields/Input/index.native.js.map +1 -1
- package/dist/cjs/fields/MentionInput/index.cjs +6 -1
- package/dist/cjs/fields/MentionInput/index.native.js +9 -4
- package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
- package/dist/cjs/fields/OTPInput/index.cjs +7 -2
- package/dist/cjs/fields/OTPInput/index.native.js +10 -5
- 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.native.js +4 -3
- 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.native.js +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 +2 -2
- package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.native.js +4 -4
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Signature/index.native.js +2 -2
- package/dist/cjs/fields/Signature/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/index.native.js +1 -1
- 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.native.js +2 -2
- package/dist/cjs/fields/Switch/index.native.js.map +1 -1
- package/dist/cjs/fields/TextArea/index.native.js +2 -2
- package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/index.native.js +3 -3
- 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.native.js.map +1 -1
- package/dist/cjs/fields/TimeRangeScrubber/index.native.js +2 -2
- 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/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.native.js +43 -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.cjs +4 -14
- package/dist/cjs/shared/utils.native.js +7 -15
- package/dist/cjs/shared/utils.native.js.map +1 -1
- package/dist/cjs/shared/zIndex.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/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +6 -9
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +6 -9
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/Chip/index.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs +0 -1
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js +0 -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.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.native.js.map +1 -1
- 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.mjs +2 -1
- package/dist/esm/FieldDisplay/index.mjs.map +1 -1
- package/dist/esm/FieldDisplay/index.native.js +9 -2
- package/dist/esm/FieldDisplay/index.native.js.map +1 -1
- package/dist/esm/FieldGroup.native.js.map +1 -1
- package/dist/esm/FloatingPanel/index.mjs +8 -1
- package/dist/esm/FloatingPanel/index.mjs.map +1 -1
- 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 +64 -2
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +70 -4
- 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.mjs +15 -9
- package/dist/esm/fields/Barcode/BarcodePreview.mjs.map +1 -1
- package/dist/esm/fields/Barcode/BarcodePreview.native.js +15 -9
- 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.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.native.js.map +1 -1
- 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.mjs +14 -11
- package/dist/esm/fields/Combobox/index.mjs.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js +16 -11
- 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.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/fieldValueSync.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
- 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.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/filePickerTypes.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/index.mjs +11 -3
- package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
- package/dist/esm/fields/FileUpload/index.native.js +20 -3
- 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/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.mjs +1 -0
- package/dist/esm/fields/Icon/index.mjs.map +1 -1
- package/dist/esm/fields/Icon/index.native.js +1 -0
- 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.mjs +177 -98
- package/dist/esm/fields/Input/index.mjs.map +1 -1
- package/dist/esm/fields/Input/index.native.js +85 -7
- package/dist/esm/fields/Input/index.native.js.map +1 -1
- package/dist/esm/fields/MentionInput/index.mjs +6 -1
- package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
- package/dist/esm/fields/MentionInput/index.native.js +6 -1
- package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
- package/dist/esm/fields/OTPInput/index.mjs +7 -3
- package/dist/esm/fields/OTPInput/index.mjs.map +1 -1
- package/dist/esm/fields/OTPInput/index.native.js +7 -3
- 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.map +1 -1
- package/dist/esm/fields/PhoneInput/index.native.js +1 -0
- 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.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.map +1 -1
- package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/Signature/index.native.js.map +1 -1
- 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.native.js.map +1 -1
- package/dist/esm/fields/TextArea/index.native.js.map +1 -1
- 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.native.js.map +1 -1
- 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/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.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.mjs +4 -14
- package/dist/esm/shared/utils.mjs.map +1 -1
- package/dist/esm/shared/utils.native.js +6 -14
- package/dist/esm/shared/utils.native.js.map +1 -1
- package/dist/esm/shared/zIndex.native.js.map +1 -1
- 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 +6 -9
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +7 -11
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/Chip/index.native.js.map +1 -1
- package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs +0 -1
- package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.mjs.map +1 -1
- package/dist/jsx/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -2
- 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.native.js +3 -3
- 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.native.js +2 -2
- package/dist/jsx/DescriptionList/index.native.js.map +1 -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.mjs +2 -1
- package/dist/jsx/FieldDisplay/index.mjs.map +1 -1
- package/dist/jsx/FieldDisplay/index.native.js +10 -3
- package/dist/jsx/FieldDisplay/index.native.js.map +1 -1
- package/dist/jsx/FieldGroup.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/index.mjs +8 -1
- package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
- 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 +64 -2
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +70 -4
- 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.mjs +15 -9
- package/dist/jsx/fields/Barcode/BarcodePreview.mjs.map +1 -1
- package/dist/jsx/fields/Barcode/BarcodePreview.native.js +15 -9
- 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.native.js +1 -1
- 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.native.js +1 -1
- package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
- 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.mjs +14 -11
- package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
- package/dist/jsx/fields/Combobox/index.native.js +21 -16
- 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.native.js +3 -3
- 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/fieldValueSync.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/index.native.js +2 -2
- package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
- package/dist/jsx/fields/DatePicker/parts.native.js +2 -2
- 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.native.js +3 -3
- 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 +11 -3
- package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload/index.native.js +22 -5
- 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/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.mjs +1 -0
- package/dist/jsx/fields/Icon/index.mjs.map +1 -1
- package/dist/jsx/fields/Icon/index.native.js +4 -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.mjs +177 -98
- package/dist/jsx/fields/Input/index.mjs.map +1 -1
- package/dist/jsx/fields/Input/index.native.js +85 -6
- package/dist/jsx/fields/Input/index.native.js.map +1 -1
- package/dist/jsx/fields/MentionInput/index.mjs +6 -1
- package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
- package/dist/jsx/fields/MentionInput/index.native.js +9 -4
- package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
- package/dist/jsx/fields/OTPInput/index.mjs +7 -3
- package/dist/jsx/fields/OTPInput/index.mjs.map +1 -1
- package/dist/jsx/fields/OTPInput/index.native.js +10 -5
- 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.map +1 -1
- package/dist/jsx/fields/PhoneInput/index.native.js +4 -3
- 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.native.js +1 -1
- 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.map +1 -1
- package/dist/jsx/fields/SearchInput/index.native.js +2 -2
- package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
- package/dist/jsx/fields/Select/index.native.js +4 -4
- package/dist/jsx/fields/Select/index.native.js.map +1 -1
- package/dist/jsx/fields/Signature/index.native.js +2 -2
- package/dist/jsx/fields/Signature/index.native.js.map +1 -1
- package/dist/jsx/fields/Slider/index.native.js +1 -1
- 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.native.js +2 -2
- package/dist/jsx/fields/Switch/index.native.js.map +1 -1
- package/dist/jsx/fields/TextArea/index.native.js +2 -2
- package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
- package/dist/jsx/fields/TimePicker/index.native.js +3 -3
- 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.native.js.map +1 -1
- package/dist/jsx/fields/TimeRangeScrubber/index.native.js +2 -2
- 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/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.native.js +43 -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.mjs +4 -14
- package/dist/jsx/shared/utils.mjs.map +1 -1
- package/dist/jsx/shared/utils.native.js +7 -15
- package/dist/jsx/shared/utils.native.js.map +1 -1
- package/dist/jsx/shared/zIndex.native.js.map +1 -1
- 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 +7 -7
- package/src/Button/Button.density.spec.tsx +118 -32
- package/src/Button/Button.labelInk.spec.tsx +72 -19
- package/src/Button/Button.lc71.spec.tsx +10 -3
- package/src/Button/Button.stories.tsx +7 -6
- package/src/Button/index.tsx +22 -12
- package/src/ContextualSaveBar/UnsavedChangesDialog.tsx +0 -1
- package/src/FieldDisplay/FieldDisplay.spec.tsx +11 -2
- package/src/FieldDisplay/index.tsx +5 -0
- package/src/FloatingPanel/index.tsx +22 -1
- package/src/FloatingPanel/panelWidthContract.spec.ts +1 -0
- package/src/InputParts/index.tsx +100 -3
- package/src/fields/Barcode/BarcodePreview.spec.tsx +139 -5
- package/src/fields/Barcode/BarcodePreview.tsx +47 -15
- package/src/fields/Combobox/Combobox.spec.tsx +64 -1
- package/src/fields/Combobox/index.tsx +22 -11
- package/src/fields/FileUpload/FileUpload.spec.tsx +28 -0
- package/src/fields/FileUpload/index.tsx +26 -1
- package/src/fields/Icon/Icon.stories.tsx +1 -1
- package/src/fields/Icon/index.tsx +1 -0
- package/src/fields/Input/index.tsx +180 -81
- package/src/fields/MentionInput/index.tsx +9 -1
- package/src/fields/OTPInput/OtpInput.spec.tsx +36 -4
- package/src/fields/OTPInput/index.tsx +18 -3
- package/src/fields/OTPInput/otpCellHeightTouch.spec.ts +44 -0
- package/src/fields/PhoneInput/index.tsx +1 -0
- package/src/fields/SearchInput/index.tsx +5 -3
- package/src/shared/utils.spec.ts +46 -0
- package/src/shared/utils.ts +31 -16
- package/types/Button/index.d.ts +8 -3
- package/types/Button/index.d.ts.map +1 -1
- package/types/ContextualSaveBar/UnsavedChangesDialog.d.ts.map +1 -1
- package/types/FieldDisplay/index.d.ts.map +1 -1
- package/types/InputParts/index.d.ts +9 -5
- package/types/InputParts/index.d.ts.map +1 -1
- package/types/fields/Barcode/BarcodePreview.d.ts +20 -9
- package/types/fields/Barcode/BarcodePreview.d.ts.map +1 -1
- package/types/fields/Checkbox/index.d.ts +3 -3
- package/types/fields/Combobox/index.d.ts.map +1 -1
- package/types/fields/FileUpload/index.d.ts.map +1 -1
- package/types/fields/Icon/index.d.ts.map +1 -1
- package/types/fields/Input/index.d.ts +18 -6
- package/types/fields/Input/index.d.ts.map +1 -1
- package/types/fields/MentionInput/index.d.ts.map +1 -1
- package/types/fields/OTPInput/index.d.ts +12 -0
- package/types/fields/OTPInput/index.d.ts.map +1 -1
- package/types/fields/PhoneInput/index.d.ts.map +1 -1
- package/types/fields/RadioGroup/index.d.ts +2 -2
- package/types/fields/SearchInput/index.d.ts.map +1 -1
- package/types/fields/ToggleGroup/index.d.ts +1 -1
- package/types/shared/utils.d.ts.map +1 -1
|
@@ -2,17 +2,25 @@
|
|
|
2
2
|
* @vitest-environment jsdom
|
|
3
3
|
*
|
|
4
4
|
* MPO-42 / LC-76: the density knob and the `compact` PROP must land the
|
|
5
|
-
* SAME padX. Height stays 44 at both stops — density moves
|
|
5
|
+
* SAME padX. Height stays 44 at both stops — density moves space, not size.
|
|
6
|
+
*
|
|
7
|
+
* LC-79 / LC-80: the internals come from the size recipe, so density picks
|
|
8
|
+
* the recipe FAMILY (`control` -> `controlCompact`) and never subtracts a
|
|
9
|
+
* hand-set delta. The delta drifted from the generated table at every token
|
|
10
|
+
* but `$4`, and at `$2` it INVERTED — `max(8, 7 - 2)` painted a compact
|
|
11
|
+
* Button 8px wider than the comfortable 7px one.
|
|
6
12
|
*/
|
|
7
13
|
|
|
8
14
|
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
9
|
-
import { Preset } from "@multiplatform.one/theme";
|
|
15
|
+
import { Preset, recipeFamilies } from "@multiplatform.one/theme";
|
|
10
16
|
import { cleanup, screen } from "@testing-library/react";
|
|
11
17
|
import { afterEach, describe, expect, it } from "vitest";
|
|
12
|
-
import { Button } from "./index";
|
|
18
|
+
import { Button, buttonDensityFamily, resolveButtonSizeRecipe } from "./index";
|
|
13
19
|
|
|
14
20
|
afterEach(cleanup);
|
|
15
21
|
|
|
22
|
+
const sizes = ["$2", "$3", "$4"] as const;
|
|
23
|
+
|
|
16
24
|
/** Last `_pl-Npx` / `_pr-Npx` class wins (paddingHorizontal expands to both). */
|
|
17
25
|
function paddingPxFromClass(el: HTMLElement): number | null {
|
|
18
26
|
let found: number | null = null;
|
|
@@ -23,56 +31,134 @@ function paddingPxFromClass(el: HTMLElement): number | null {
|
|
|
23
31
|
return found;
|
|
24
32
|
}
|
|
25
33
|
|
|
34
|
+
function gapPxFromClass(el: HTMLElement): number | null {
|
|
35
|
+
for (const c of String(el.className || "").split(/\s+/)) {
|
|
36
|
+
const m = c.match(/^_gap-(\d+)px$/);
|
|
37
|
+
if (m) return Number(m[1]);
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function renderProp(size: (typeof sizes)[number]) {
|
|
43
|
+
renderWithProviders(
|
|
44
|
+
<Button compact size={size} icon={<span>i</span>}>
|
|
45
|
+
Save
|
|
46
|
+
</Button>,
|
|
47
|
+
);
|
|
48
|
+
return screen.getByRole("button");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function renderKnob(size: (typeof sizes)[number]) {
|
|
52
|
+
renderWithProviders(
|
|
53
|
+
<Preset overrides={{ density: "compact" }}>
|
|
54
|
+
<Button size={size} icon={<span>i</span>}>
|
|
55
|
+
Save
|
|
56
|
+
</Button>
|
|
57
|
+
</Preset>,
|
|
58
|
+
);
|
|
59
|
+
return screen.getByRole("button");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function renderComfortable(size: (typeof sizes)[number]) {
|
|
63
|
+
renderWithProviders(
|
|
64
|
+
<Button size={size} icon={<span>i</span>}>
|
|
65
|
+
Save
|
|
66
|
+
</Button>,
|
|
67
|
+
);
|
|
68
|
+
return screen.getByRole("button");
|
|
69
|
+
}
|
|
70
|
+
|
|
26
71
|
describe("Button density knob = compact PROP (MPO-42)", () => {
|
|
27
72
|
it("compact PROP and density:compact knob land the SAME padX", () => {
|
|
28
|
-
|
|
29
|
-
<Button compact size="$4">
|
|
30
|
-
Save
|
|
31
|
-
</Button>,
|
|
32
|
-
);
|
|
33
|
-
const viaProp = screen.getByRole("button");
|
|
73
|
+
const viaProp = renderProp("$4");
|
|
34
74
|
const propPad = paddingPxFromClass(viaProp);
|
|
35
75
|
expect(viaProp.getAttribute("data-mp-density")).toBe("compact");
|
|
36
76
|
expect(propPad).toBe(16);
|
|
37
77
|
cleanup();
|
|
38
78
|
|
|
39
|
-
|
|
40
|
-
<Preset overrides={{ density: "compact" }}>
|
|
41
|
-
<Button size="$4">Save</Button>
|
|
42
|
-
</Preset>,
|
|
43
|
-
);
|
|
44
|
-
const viaKnob = screen.getByRole("button");
|
|
45
|
-
const knobPad = paddingPxFromClass(viaKnob);
|
|
79
|
+
const viaKnob = renderKnob("$4");
|
|
46
80
|
expect(viaKnob.getAttribute("data-mp-density")).toBe("compact");
|
|
47
|
-
expect(
|
|
48
|
-
expect(
|
|
81
|
+
expect(paddingPxFromClass(viaKnob)).toBe(propPad);
|
|
82
|
+
expect(paddingPxFromClass(viaKnob)).toBe(16);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("both channels land the SAME padX at every size step, not just $4", () => {
|
|
86
|
+
for (const size of sizes) {
|
|
87
|
+
const viaProp = paddingPxFromClass(renderProp(size));
|
|
88
|
+
cleanup();
|
|
89
|
+
const viaKnob = paddingPxFromClass(renderKnob(size));
|
|
90
|
+
cleanup();
|
|
91
|
+
expect(viaKnob, `padX at ${size}`).toBe(viaProp);
|
|
92
|
+
}
|
|
49
93
|
});
|
|
50
94
|
|
|
51
95
|
it("height stays 44 at comfortable and compact density stops", () => {
|
|
52
|
-
|
|
53
|
-
const comfortable = screen.getByRole("button");
|
|
96
|
+
const comfortable = renderComfortable("$4");
|
|
54
97
|
expect(comfortable.getAttribute("data-mp-button-height")).toBe("44");
|
|
55
98
|
expect(comfortable.className).toMatch(/_h-44px/);
|
|
56
99
|
expect(paddingPxFromClass(comfortable)).toBe(18);
|
|
57
100
|
cleanup();
|
|
58
101
|
|
|
59
|
-
|
|
60
|
-
<Preset overrides={{ density: "compact" }}>
|
|
61
|
-
<Button size="$4">Save</Button>
|
|
62
|
-
</Preset>,
|
|
63
|
-
);
|
|
64
|
-
const viaKnob = screen.getByRole("button");
|
|
102
|
+
const viaKnob = renderKnob("$4");
|
|
65
103
|
expect(viaKnob.getAttribute("data-mp-button-height")).toBe("44");
|
|
66
104
|
expect(viaKnob.className).toMatch(/_h-44px/);
|
|
67
105
|
cleanup();
|
|
68
106
|
|
|
69
|
-
|
|
70
|
-
<Button compact size="$4">
|
|
71
|
-
Save
|
|
72
|
-
</Button>,
|
|
73
|
-
);
|
|
74
|
-
const viaProp = screen.getByRole("button");
|
|
107
|
+
const viaProp = renderProp("$4");
|
|
75
108
|
expect(viaProp.getAttribute("data-mp-button-height")).toBe("44");
|
|
76
109
|
expect(viaProp.className).toMatch(/_h-44px/);
|
|
77
110
|
});
|
|
111
|
+
|
|
112
|
+
it("density never changes the painted height at any size step (LC-76)", () => {
|
|
113
|
+
for (const size of sizes) {
|
|
114
|
+
const relaxed = renderComfortable(size).getAttribute("data-mp-button-height");
|
|
115
|
+
cleanup();
|
|
116
|
+
const tight = renderKnob(size).getAttribute("data-mp-button-height");
|
|
117
|
+
cleanup();
|
|
118
|
+
expect(tight, `height at ${size}`).toBe(relaxed);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe("Button density comes from the recipe family (LC-79 / LC-80)", () => {
|
|
124
|
+
it("density picks the family, it does not subtract from the recipe", () => {
|
|
125
|
+
expect(buttonDensityFamily("control", true)).toBe("controlCompact");
|
|
126
|
+
expect(buttonDensityFamily("control", false)).toBe("control");
|
|
127
|
+
// An explicit controlCompact consumer (Chip) does not tighten twice.
|
|
128
|
+
expect(buttonDensityFamily("controlCompact", true)).toBe("controlCompact");
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("compact padX is the generated controlCompact table, at every size", () => {
|
|
132
|
+
for (const size of sizes) {
|
|
133
|
+
const expected = resolveButtonSizeRecipe(size, "controlCompact").paddingHorizontal;
|
|
134
|
+
const viaKnob = paddingPxFromClass(renderKnob(size));
|
|
135
|
+
cleanup();
|
|
136
|
+
expect(viaKnob, `padX at ${size}`).toBe(expected);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("compact is never WIDER than comfortable — the $2 inversion stays fixed", () => {
|
|
141
|
+
for (const size of sizes) {
|
|
142
|
+
const relaxed = paddingPxFromClass(renderComfortable(size)) ?? 0;
|
|
143
|
+
cleanup();
|
|
144
|
+
const tight = paddingPxFromClass(renderKnob(size)) ?? 0;
|
|
145
|
+
cleanup();
|
|
146
|
+
expect(tight, `padX at ${size}`).toBeLessThan(relaxed);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("the inner gap stays the recipe gap — gap == radius at both stops", () => {
|
|
151
|
+
for (const size of sizes) {
|
|
152
|
+
const radius = recipeFamilies.controlCompact.radii[size];
|
|
153
|
+
const relaxed = gapPxFromClass(renderComfortable(size));
|
|
154
|
+
cleanup();
|
|
155
|
+
const tight = gapPxFromClass(renderKnob(size));
|
|
156
|
+
cleanup();
|
|
157
|
+
expect(tight, `gap at ${size}`).toBe(resolveButtonSizeRecipe(size, "controlCompact").gap);
|
|
158
|
+
expect(tight, `gap == radius at ${size}`).toBe(radius);
|
|
159
|
+
expect(relaxed, `comfortable gap at ${size}`).toBe(
|
|
160
|
+
resolveButtonSizeRecipe(size, "control").gap,
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
78
164
|
});
|
|
@@ -9,21 +9,20 @@
|
|
|
9
9
|
*
|
|
10
10
|
* jsdom cannot cascade Tamagui CSS, so the DOM arm reads the atomic
|
|
11
11
|
* classes the text node emits (`_col-color11`, `_fow-400`). Contrast is
|
|
12
|
-
* the theme-table arm: intent `$color11`
|
|
13
|
-
* both schemes
|
|
12
|
+
* the theme-table arm: intent `$color11` against EVERY page surface the
|
|
13
|
+
* house theme paints, in both schemes — `$background`/`$color1` (white)
|
|
14
|
+
* and `$color2` (#f9f9fa, what the gallery boards are shot on).
|
|
14
15
|
*/
|
|
15
16
|
|
|
16
17
|
import { render, cleanup, screen } from "@testing-library/react";
|
|
17
18
|
import {
|
|
18
19
|
aaTextContrastRatio,
|
|
19
|
-
contrastRatio,
|
|
20
20
|
createDefaultThemeConfig,
|
|
21
21
|
createThemesBuilder,
|
|
22
22
|
defaultAccentTheme,
|
|
23
23
|
defaultBaseTheme,
|
|
24
24
|
defaultBuilderOptions,
|
|
25
|
-
|
|
26
|
-
relativeLuminance,
|
|
25
|
+
measureContrast,
|
|
27
26
|
} from "@multiplatform.one/theme";
|
|
28
27
|
import { afterEach, describe, expect, it } from "vitest";
|
|
29
28
|
import { TamaguiProvider, YStack } from "tamagui";
|
|
@@ -40,6 +39,15 @@ const houseThemes = createThemesBuilder(
|
|
|
40
39
|
|
|
41
40
|
const INTENTS = ["error", "warning", "success"] as const;
|
|
42
41
|
const SCHEMES = ["light", "dark"] as const;
|
|
42
|
+
/**
|
|
43
|
+
* The house theme has THREE page surfaces and they are not interchangeable:
|
|
44
|
+
* `$background` and `$color1` are pure white, `$color2` is #f9f9fa. Every
|
|
45
|
+
* gallery board paints `$color2` (actionFeedbackMain.tsx board root), so a
|
|
46
|
+
* contrast arm that only reads `$background` certifies on a surface the
|
|
47
|
+
* boards never shoot — the same shape of hole as measuring the FRAME
|
|
48
|
+
* instead of the text node. All three are measured here.
|
|
49
|
+
*/
|
|
50
|
+
const WHITE_PAGE_SURFACES = ["background", "color1"] as const;
|
|
43
51
|
|
|
44
52
|
function houseRender(ui: React.ReactElement, theme: "light" | "dark" = "light") {
|
|
45
53
|
return render(
|
|
@@ -53,12 +61,13 @@ function labelNode(text: string): HTMLElement {
|
|
|
53
61
|
return screen.getByText(text);
|
|
54
62
|
}
|
|
55
63
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
64
|
+
/**
|
|
65
|
+
* One implementation of the arithmetic (the point of exporting
|
|
66
|
+
* `measureContrast`), and the REPORTED 2-decimal ratio, so the number a
|
|
67
|
+
* failure prints is the number the verdict used.
|
|
68
|
+
*/
|
|
69
|
+
function pageRatio(ink: string, ground: string, label: string): number {
|
|
70
|
+
return measureContrast({ foreground: ink, background: ground, label }).ratio;
|
|
62
71
|
}
|
|
63
72
|
|
|
64
73
|
describe("Button MPO-40 outlined intent label ink", () => {
|
|
@@ -121,23 +130,67 @@ describe("Button MPO-40 outlined intent label ink", () => {
|
|
|
121
130
|
}
|
|
122
131
|
});
|
|
123
132
|
|
|
124
|
-
it("intent $color11
|
|
133
|
+
it("intent $color11 clears 4.5:1 on the white page surfaces in both schemes; on-fill $color never does", () => {
|
|
125
134
|
for (const scheme of SCHEMES) {
|
|
126
|
-
const ground = houseThemes[scheme].background;
|
|
127
135
|
for (const intent of INTENTS) {
|
|
128
136
|
const ink = houseThemes[`${scheme}_${intent}`].color11;
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
137
|
+
for (const surface of WHITE_PAGE_SURFACES) {
|
|
138
|
+
const ground = houseThemes[scheme][surface];
|
|
139
|
+
const label = `${scheme}_${intent}.color11 ${ink} on ${scheme}.${surface} ${ground}`;
|
|
140
|
+
expect(pageRatio(ink, ground, label), label).toBeGreaterThanOrEqual(aaTextContrastRatio);
|
|
141
|
+
}
|
|
134
142
|
|
|
135
143
|
const onFill = houseThemes[`${scheme}_${intent}_Button`].color;
|
|
144
|
+
const ground = houseThemes[scheme].background;
|
|
136
145
|
expect(
|
|
137
|
-
|
|
146
|
+
pageRatio(onFill, ground, `${scheme}_${intent}_Button.color`),
|
|
138
147
|
`${scheme}_${intent}_Button.color is the on-fill foreground`,
|
|
139
148
|
).toBeLessThan(2);
|
|
140
149
|
}
|
|
141
150
|
}
|
|
142
151
|
});
|
|
152
|
+
|
|
153
|
+
it("dark intent $color11 clears 4.5:1 on the $color2 page surface too", () => {
|
|
154
|
+
for (const intent of INTENTS) {
|
|
155
|
+
const ink = houseThemes[`dark_${intent}`].color11;
|
|
156
|
+
const ground = houseThemes.dark.color2;
|
|
157
|
+
const label = `dark_${intent}.color11 ${ink} on dark.color2 ${ground}`;
|
|
158
|
+
expect(pageRatio(ink, ground, label), label).toBeGreaterThanOrEqual(aaTextContrastRatio);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// PINNED MISS — MPO-40's own secondary finding, still OPEN.
|
|
163
|
+
//
|
|
164
|
+
// Fixing the plumbing (the arm above) was necessary, not sufficient. On
|
|
165
|
+
// $color2 — the surface every gallery board is shot on — light warning
|
|
166
|
+
// and success $color11 are under mpo's own floor, and those are exactly
|
|
167
|
+
// the numbers button-anatomy already prints for its CONTRACT row. The
|
|
168
|
+
// step that would close them is a PALETTE change (Radix yellow-11
|
|
169
|
+
// #9e6c00 / green-11 #218358), owned by the contrast-floor lane, not by
|
|
170
|
+
// the Button. colorRules.ts pins the same warning miss on the intent's
|
|
171
|
+
// own color1 (#fcfcf7, 4.44:1); this pins it on the page ground.
|
|
172
|
+
//
|
|
173
|
+
// These numbers are asserted EXACTLY on purpose. Step the palette and
|
|
174
|
+
// this test fails, which is the reminder to re-measure the board and
|
|
175
|
+
// tick MPO-40's contrast criterion — never a regression to re-baseline.
|
|
176
|
+
it("light warning/success $color11 are STILL under 4.5:1 on the $color2 page surface", () => {
|
|
177
|
+
const ground = houseThemes.light.color2;
|
|
178
|
+
const measured = Object.fromEntries(
|
|
179
|
+
INTENTS.map((intent): [string, number] => [
|
|
180
|
+
intent,
|
|
181
|
+
pageRatio(
|
|
182
|
+
houseThemes[`light_${intent}`].color11,
|
|
183
|
+
ground,
|
|
184
|
+
`light_${intent}.color11 on light.color2`,
|
|
185
|
+
),
|
|
186
|
+
]),
|
|
187
|
+
);
|
|
188
|
+
expect(measured, `light.color2 is ${ground}`).toEqual({
|
|
189
|
+
error: 4.95,
|
|
190
|
+
warning: 4.34,
|
|
191
|
+
success: 4.48,
|
|
192
|
+
});
|
|
193
|
+
expect(measured.warning).toBeLessThan(aaTextContrastRatio);
|
|
194
|
+
expect(measured.success).toBeLessThan(aaTextContrastRatio);
|
|
195
|
+
});
|
|
143
196
|
});
|
|
@@ -6,7 +6,7 @@ import { cleanup, fireEvent, screen } from "@testing-library/react";
|
|
|
6
6
|
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
7
7
|
import { Preset } from "@multiplatform.one/theme";
|
|
8
8
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
9
|
-
import { Button,
|
|
9
|
+
import { Button, buttonDensityFamily, buttonSizeRecipes, resolveButtonSizeRecipe } from "./index";
|
|
10
10
|
|
|
11
11
|
afterEach(cleanup);
|
|
12
12
|
|
|
@@ -52,8 +52,15 @@ describe("Button size recipes", () => {
|
|
|
52
52
|
|
|
53
53
|
describe("Button density ≠ size", () => {
|
|
54
54
|
it("compact tightens pad without shrinking recipe height", () => {
|
|
55
|
-
|
|
56
|
-
expect(
|
|
55
|
+
// Density picks the FAMILY; it never subtracts from the recipe (LC-79).
|
|
56
|
+
expect(buttonDensityFamily("control", true)).toBe("controlCompact");
|
|
57
|
+
expect(buttonDensityFamily("control", false)).toBe("control");
|
|
58
|
+
expect(resolveButtonSizeRecipe("$4", "controlCompact").paddingHorizontal).toBeLessThan(
|
|
59
|
+
resolveButtonSizeRecipe("$4", "control").paddingHorizontal,
|
|
60
|
+
);
|
|
61
|
+
expect(resolveButtonSizeRecipe("$4", "controlCompact").height).toBe(
|
|
62
|
+
resolveButtonSizeRecipe("$4", "control").height,
|
|
63
|
+
);
|
|
57
64
|
renderWithProviders(
|
|
58
65
|
<Button compact size="$4">
|
|
59
66
|
Save
|
|
@@ -57,11 +57,12 @@ export const Basic: Story = {
|
|
|
57
57
|
options: ["$2", "$3", "$4", "$5", "$6"],
|
|
58
58
|
description: "Tamagui size token",
|
|
59
59
|
},
|
|
60
|
-
variant
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
// The house fill channel is the `outlined` boolean. `variant="outlined"`
|
|
61
|
+
// is raw-tamagui API this component does not read (only the
|
|
62
|
+
// `@multiplatform.one/components` shim maps it), so a `variant` control
|
|
63
|
+
// here drove nothing — MPO-19 X3 measured the board's own "Outlined"
|
|
64
|
+
// specimen rendering as a filled button with a transparent edge.
|
|
65
|
+
outlined: { control: "boolean", description: "Outlined fill style" },
|
|
65
66
|
chromeless: { control: "boolean", description: "Transparent, text-only style" },
|
|
66
67
|
disabled: { control: "boolean", description: "Disable the button" },
|
|
67
68
|
skeleton: { control: "boolean", description: "Show skeleton placeholder" },
|
|
@@ -210,7 +211,7 @@ export const Comparison: Story = {
|
|
|
210
211
|
<Button icon={Activity} onPress={pressed("custom.icon")}>
|
|
211
212
|
With Icon
|
|
212
213
|
</Button>
|
|
213
|
-
<Button
|
|
214
|
+
<Button outlined onPress={pressed("custom.outlined")}>
|
|
214
215
|
Outlined
|
|
215
216
|
</Button>
|
|
216
217
|
<Button disabled disabledReason="Needs a completed draft">
|
package/src/Button/index.tsx
CHANGED
|
@@ -76,13 +76,18 @@ export function resolveButtonSizeRecipe(
|
|
|
76
76
|
return sizeRecipeForToken(size == null ? "$true" : String(size), { family });
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
/**
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Density selects the recipe FAMILY, it does not subtract from the recipe
|
|
81
|
+
* (LC-79 / LC-80): control -> controlCompact, same heights, tighter ratios.
|
|
82
|
+
* A hand-set delta is a second density writer and it drifts from the
|
|
83
|
+
* generated table at every token but `$4` — it inverted at `$2`, where
|
|
84
|
+
* `max(8, 7 - 2)` painted a compact Button WIDER than a comfortable one.
|
|
85
|
+
*/
|
|
86
|
+
export function buttonDensityFamily(
|
|
87
|
+
family: RecipeFamilyName,
|
|
88
|
+
densityTight: boolean,
|
|
89
|
+
): RecipeFamilyName {
|
|
90
|
+
return densityTight ? "controlCompact" : family;
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
/**
|
|
@@ -416,9 +421,11 @@ export function Button({
|
|
|
416
421
|
(warning && "warning") ||
|
|
417
422
|
(success && "success") ||
|
|
418
423
|
undefined;
|
|
419
|
-
// compact is density
|
|
424
|
+
// compact is density, not a size step — do not pass it through
|
|
420
425
|
// useResolvedKnobs (size stays on the size axis; LC-76). The PROP and the
|
|
421
|
-
// density knob
|
|
426
|
+
// density knob share one channel: both pick the recipe FAMILY, the same
|
|
427
|
+
// way resolveKnobs picks it for every other control, so both land the
|
|
428
|
+
// same padX and the internals stay recipe-generated (LC-75 / LC-79).
|
|
422
429
|
const { knobProps, control, text, disabledState } = useResolvedKnobs({
|
|
423
430
|
intent,
|
|
424
431
|
component: "Button",
|
|
@@ -430,10 +437,13 @@ export function Button({
|
|
|
430
437
|
const grouped = useControlGrouped();
|
|
431
438
|
const sizeProp = (props as { size?: SizeTokens | number }).size;
|
|
432
439
|
const resolvedSize = sizeProp ?? knobProps.sizeToken;
|
|
433
|
-
const recipe = resolveButtonSizeRecipe(resolvedSize, recipeFamily);
|
|
434
440
|
const densityTight = compact !== undefined ? compact === true : knobProps.density === "compact";
|
|
435
|
-
const
|
|
436
|
-
|
|
441
|
+
const recipe = resolveButtonSizeRecipe(
|
|
442
|
+
resolvedSize,
|
|
443
|
+
buttonDensityFamily(recipeFamily, densityTight),
|
|
444
|
+
);
|
|
445
|
+
const padX = recipe.paddingHorizontal;
|
|
446
|
+
const innerGap = recipe.gap;
|
|
437
447
|
if (skeleton) {
|
|
438
448
|
return (
|
|
439
449
|
<View
|
|
@@ -119,11 +119,20 @@ describe("FieldDisplay", () => {
|
|
|
119
119
|
expect(root?.getAttribute("data-field")).toBe("datepicker");
|
|
120
120
|
});
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
/**
|
|
123
|
+
* The qr format reaches BarcodePreview (the round trip is asserted there),
|
|
124
|
+
* but a display cell's bound is the glyph size — around 20px — and a QR
|
|
125
|
+
* needs one WHOLE pixel per module, 29 minimum. So the cell draws no matrix
|
|
126
|
+
* and, because it already prints the value beside the symbol, contributes
|
|
127
|
+
* nothing rather than a second copy of the string (textFallback={false}).
|
|
128
|
+
* Growing the row to fit a scannable square is the thing LC-06 forbids.
|
|
129
|
+
*/
|
|
130
|
+
it("prints the barcode value once and draws no unreadable QR at a display bound", () => {
|
|
123
131
|
const result = renderWithProviders(
|
|
124
132
|
<FieldDisplay field="barcode" value="SKU-001234" fieldProps={{ formats: ["qr"] }} />,
|
|
125
133
|
);
|
|
126
|
-
expect(result.container.querySelector('[data-testid="barcode-preview-qr"]')).
|
|
134
|
+
expect(result.container.querySelector('[data-testid="barcode-preview-qr"]')).toBeNull();
|
|
127
135
|
expect(result.container.querySelector("canvas")).toBeNull();
|
|
136
|
+
expect(result.container.textContent?.split("SKU-001234").length).toBe(2); // exactly once
|
|
128
137
|
});
|
|
129
138
|
});
|
|
@@ -563,11 +563,16 @@ function BarcodeDisplay({ value, fieldProps }: { value: any; fieldProps?: Record
|
|
|
563
563
|
return (
|
|
564
564
|
<XStack alignItems="center" minWidth={0} flexShrink={1} {...knobProps.gap}>
|
|
565
565
|
<ValueText mono>{text}</ValueText>
|
|
566
|
+
{/* The value is already printed beside the symbol, so an undrawable one
|
|
567
|
+
contributes NOTHING rather than a second copy of the string. At this
|
|
568
|
+
bound that is every QR past a short value at a large size — a display
|
|
569
|
+
cell cannot hold 33 whole-pixel modules without growing the row. */}
|
|
566
570
|
<BarcodePreview
|
|
567
571
|
value={text}
|
|
568
572
|
height={Math.max(12, glyphSize)}
|
|
569
573
|
moduleWidth={1}
|
|
570
574
|
format={typeof format === "string" ? format : undefined}
|
|
575
|
+
textFallback={false}
|
|
571
576
|
/>
|
|
572
577
|
</XStack>
|
|
573
578
|
);
|
|
@@ -607,6 +607,18 @@ function FloatingPanelWeb({
|
|
|
607
607
|
// animation=none → no CSS tween (same contract as knobProps.transition === undefined)
|
|
608
608
|
const webTransition = panel.knobProps.transition ? panelTransition : "none";
|
|
609
609
|
|
|
610
|
+
// `elevatedSurface` carries a web-only `style: { boxShadow }` (MPO-69,
|
|
611
|
+
// d326cc0c2). Two `style` props on one element do NOT merge — the later
|
|
612
|
+
// spread replaces the earlier — so spreading the complete fragment after the
|
|
613
|
+
// positioning style silently dropped `position: fixed`, `top`, `left`,
|
|
614
|
+
// `zIndex` and `overflow`, and every web FloatingPanel rendered in normal
|
|
615
|
+
// flow, pushing the page down instead of floating over it. Measured on
|
|
616
|
+
// origin/main 048289071: DatePicker's panel sat at trigger.bottom + 5.39 (the
|
|
617
|
+
// field container's flex gap), not the contract's 0.
|
|
618
|
+
// The complete fragment still goes on the element (AGENTS.md) — its style is
|
|
619
|
+
// folded into the positioning style rather than competing with it.
|
|
620
|
+
const { style: elevatedSurfaceStyle, ...elevatedSurfaceProps } = panel.knobProps.elevatedSurface;
|
|
621
|
+
|
|
610
622
|
// Same slot problem as the sheet branch, but only half of it lands here. The
|
|
611
623
|
// POINTER path survives, because `useClick(..., { event: "mousedown" })`
|
|
612
624
|
// listens on mousedown and Tamagui only stops the click. The KEYBOARD path
|
|
@@ -650,6 +662,13 @@ function FloatingPanelWeb({
|
|
|
650
662
|
})}
|
|
651
663
|
cursor={disabled ? "not-allowed" : "pointer"}
|
|
652
664
|
opacity={disabled ? 0.5 : 1}
|
|
665
|
+
// The cover contract is stated as a relation between the panel's top
|
|
666
|
+
// edge and THIS element's bottom edge — the box floating-ui anchors
|
|
667
|
+
// to, which is the whole trigger, not whatever glyph inside it was
|
|
668
|
+
// clicked. Marking it keeps the measurement unambiguous (a ColorPicker
|
|
669
|
+
// read from its swatch measures the swatch's inset, not the gap).
|
|
670
|
+
// Same idiom TreeSelect already uses for `data-fp-panel`.
|
|
671
|
+
data-fp-reference=""
|
|
653
672
|
>
|
|
654
673
|
{trigger}
|
|
655
674
|
</View>
|
|
@@ -659,6 +678,7 @@ function FloatingPanelWeb({
|
|
|
659
678
|
{...getFloatingProps({
|
|
660
679
|
ref: panel.refs.setFloating,
|
|
661
680
|
style: {
|
|
681
|
+
...elevatedSurfaceStyle,
|
|
662
682
|
position: panel.strategy,
|
|
663
683
|
top: overlayStyleRef.current?.top ?? panel.y ?? 0,
|
|
664
684
|
left: panel.x ?? 0,
|
|
@@ -675,9 +695,10 @@ function FloatingPanelWeb({
|
|
|
675
695
|
onScroll: handleScroll,
|
|
676
696
|
})}
|
|
677
697
|
data-testid="floating-panel-viewport"
|
|
698
|
+
data-fp-panel=""
|
|
678
699
|
{...panelChromeFocus}
|
|
679
700
|
pointerEvents={panel.visible ? "auto" : "none"}
|
|
680
|
-
{...
|
|
701
|
+
{...elevatedSurfaceProps}
|
|
681
702
|
// Complete elevatedSurface fragment above is the ONLY surface source
|
|
682
703
|
// (SF-OVERLAY "including border and elevation", Round 2 docket).
|
|
683
704
|
// The one layered exception is anatomy, not surface: the dropdown
|