@multiplatform.one/forms 7.77.1 → 7.77.2
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 +2 -2
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/IconButtonGroup.cjs +45 -18
- package/dist/cjs/Button/IconButtonGroup.native.js +51 -20
- package/dist/cjs/Button/IconButtonGroup.native.js.map +1 -1
- package/dist/cjs/Button/circleGlyph.cjs +12 -2
- package/dist/cjs/Button/circleGlyph.native.js +12 -1
- package/dist/cjs/Button/circleGlyph.native.js.map +1 -1
- package/dist/cjs/Button/iconButtonGroupContext.cjs +7 -1
- package/dist/cjs/Button/iconButtonGroupContext.native.js +7 -1
- package/dist/cjs/Button/iconButtonGroupContext.native.js.map +1 -1
- package/dist/cjs/Button/index.cjs +3 -11
- package/dist/cjs/Button/index.native.js +5 -14
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/Button/mediaPlate.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/ContextualSaveBar/UnsavedChangesDialog.native.js +1 -1
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/index.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.native.js +1 -1
- package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
- package/dist/cjs/FieldGroup.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/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.cjs +50 -0
- package/dist/cjs/FloatingPanel/coverRect.native.js +54 -0
- package/dist/cjs/FloatingPanel/coverRect.native.js.map +1 -0
- package/dist/cjs/FloatingPanel/echoContext.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/iconEcho.cjs +3 -1
- package/dist/cjs/FloatingPanel/iconEcho.native.js +3 -1
- package/dist/cjs/FloatingPanel/iconEcho.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/index.cjs +23 -13
- package/dist/cjs/FloatingPanel/index.native.js +41 -15
- 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 +1 -1
- package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -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/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 +5 -0
- package/dist/cjs/InputParts/index.native.js +7 -0
- package/dist/cjs/InputParts/index.native.js.map +1 -1
- package/dist/cjs/InputParts/keyboardAppearance.cjs +30 -0
- package/dist/cjs/InputParts/keyboardAppearance.native.js +33 -0
- package/dist/cjs/InputParts/keyboardAppearance.native.js.map +1 -0
- 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 +1 -1
- package/dist/cjs/fieldLayout.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/BarcodeScanner.native.js +1 -1
- package/dist/cjs/fields/Barcode/code128.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/index.native.js +2 -2
- package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/qr.native.js.map +1 -1
- package/dist/cjs/fields/Barcode/scannerTypes.native.js.map +1 -1
- package/dist/cjs/fields/Checkbox/Checkbox.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/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.native.js +2 -2
- 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/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.native.js +5 -5
- package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DateRangePicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +3 -3
- package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/MonthPicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js +2 -2
- package/dist/cjs/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/cjs/fields/DatePicker/catalog.native.js +2 -2
- 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 +2 -2
- 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/DurationWheel.cjs +34 -0
- package/dist/cjs/fields/Duration/DurationWheel.native.js +132 -0
- package/dist/cjs/fields/Duration/DurationWheel.native.js.map +1 -0
- package/dist/cjs/fields/Duration/durationMath.cjs +19 -1
- package/dist/cjs/fields/Duration/durationMath.native.js +19 -1
- package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
- package/dist/cjs/fields/Duration/durationWheelTypes.cjs +18 -0
- package/dist/cjs/fields/Duration/durationWheelTypes.native.js +21 -0
- package/dist/cjs/fields/Duration/durationWheelTypes.native.js.map +1 -0
- package/dist/cjs/fields/Duration/index.cjs +30 -10
- package/dist/cjs/fields/Duration/index.native.js +34 -14
- 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.native.js +2 -2
- 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.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/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.native.js +3 -3
- package/dist/cjs/fields/Icon/index.native.js.map +1 -1
- package/dist/cjs/fields/ImageField/index.native.js +2 -2
- package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
- package/dist/cjs/fields/Input/index.native.js +3 -3
- package/dist/cjs/fields/Input/index.native.js.map +1 -1
- package/dist/cjs/fields/MentionInput/index.native.js +3 -3
- package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
- package/dist/cjs/fields/OTPInput/index.native.js +3 -3
- package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
- package/dist/cjs/fields/OTPInput/otpCellCss.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/dialCodes.native.js.map +1 -1
- package/dist/cjs/fields/PhoneInput/index.native.js +3 -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/PhoneInput/regionNames.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/InlineChoices.native.js.map +1 -1
- package/dist/cjs/fields/Select/SheetPickerRow.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/Select/shouldInlineChoices.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/footprint.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/catalog.native.js +3 -3
- package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -1
- package/dist/cjs/fields/TimePicker/index.native.js +2 -2
- 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/nativeDateTime/OsDateTimeSheet.cjs +8 -7
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +9 -8
- 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.cjs +1 -1
- package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js +1 -1
- package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/sheetKeyboard.cjs +1 -1
- package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js +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.native.js +45 -45
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/keyboard/KeyboardDoneBar.native.js +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/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/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 +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/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 +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/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/IconButtonGroup.mjs +47 -20
- package/dist/esm/Button/IconButtonGroup.mjs.map +1 -1
- package/dist/esm/Button/IconButtonGroup.native.js +53 -22
- package/dist/esm/Button/IconButtonGroup.native.js.map +1 -1
- package/dist/esm/Button/circleGlyph.mjs +9 -1
- package/dist/esm/Button/circleGlyph.mjs.map +1 -1
- package/dist/esm/Button/circleGlyph.native.js +10 -1
- package/dist/esm/Button/circleGlyph.native.js.map +1 -1
- package/dist/esm/Button/iconButtonGroupContext.mjs +5 -1
- package/dist/esm/Button/iconButtonGroupContext.mjs.map +1 -1
- package/dist/esm/Button/iconButtonGroupContext.native.js +5 -1
- package/dist/esm/Button/iconButtonGroupContext.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +1 -9
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +1 -10
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/Button/mediaPlate.native.js.map +1 -1
- package/dist/esm/Button/webGlass.native.js.map +1 -1
- package/dist/esm/Chip/index.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/clientKnownIdentity.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/commitImmediateField.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/index.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.native.js.map +1 -1
- package/dist/esm/FieldGroup.native.js.map +1 -1
- package/dist/esm/FloatingPanel/PanelHeader.native.js.map +1 -1
- package/dist/esm/FloatingPanel/RegularPanel.native.js.map +1 -1
- package/dist/esm/FloatingPanel/compactFace.native.js.map +1 -1
- package/dist/esm/FloatingPanel/containingBlock.native.js.map +1 -1
- package/dist/esm/FloatingPanel/coverRect.mjs +23 -0
- package/dist/esm/FloatingPanel/coverRect.mjs.map +1 -0
- package/dist/esm/FloatingPanel/coverRect.native.js +24 -0
- package/dist/esm/FloatingPanel/coverRect.native.js.map +1 -0
- package/dist/esm/FloatingPanel/echoContext.native.js.map +1 -1
- package/dist/esm/FloatingPanel/iconEcho.mjs +4 -2
- package/dist/esm/FloatingPanel/iconEcho.mjs.map +1 -1
- package/dist/esm/FloatingPanel/iconEcho.native.js +4 -2
- package/dist/esm/FloatingPanel/iconEcho.native.js.map +1 -1
- package/dist/esm/FloatingPanel/index.mjs +23 -13
- package/dist/esm/FloatingPanel/index.mjs.map +1 -1
- package/dist/esm/FloatingPanel/index.native.js +41 -15
- package/dist/esm/FloatingPanel/index.native.js.map +1 -1
- package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -1
- package/dist/esm/FloatingPanel/paintedBox.native.js.map +1 -1
- package/dist/esm/FloatingPanel/panelWidth.native.js.map +1 -1
- package/dist/esm/FloatingPanel/pointAnchor.native.js.map +1 -1
- package/dist/esm/FloatingPanel/regularPlacement.native.js.map +1 -1
- package/dist/esm/FloatingPanel/trailingAction.native.js.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/submissionController.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/PasswordReveal.native.js.map +1 -1
- package/dist/esm/InputParts/index.mjs +6 -1
- package/dist/esm/InputParts/index.mjs.map +1 -1
- package/dist/esm/InputParts/index.native.js +8 -1
- package/dist/esm/InputParts/index.native.js.map +1 -1
- package/dist/esm/InputParts/keyboardAppearance.mjs +5 -0
- package/dist/esm/InputParts/keyboardAppearance.mjs.map +1 -0
- package/dist/esm/InputParts/keyboardAppearance.native.js +5 -0
- package/dist/esm/InputParts/keyboardAppearance.native.js.map +1 -0
- package/dist/esm/Label/index.native.js.map +1 -1
- package/dist/esm/MediaPicker/base64.native.js.map +1 -1
- package/dist/esm/MediaPicker/payload.native.js.map +1 -1
- package/dist/esm/MediaPicker/types.native.js.map +1 -1
- package/dist/esm/MediaPicker/useMediaPicker.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/Wheel/wheelShared.native.js.map +1 -1
- package/dist/esm/actionLabel.native.js.map +1 -1
- package/dist/esm/fieldDefaults.native.js.map +1 -1
- package/dist/esm/fieldLayout.native.js.map +1 -1
- package/dist/esm/fields/Barcode/BarcodePreview.native.js.map +1 -1
- package/dist/esm/fields/Barcode/code128.native.js.map +1 -1
- package/dist/esm/fields/Barcode/index.native.js.map +1 -1
- package/dist/esm/fields/Barcode/qr.native.js.map +1 -1
- package/dist/esm/fields/Barcode/scannerTypes.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/Checkbox.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/checkboxGroupContext.native.js.map +1 -1
- package/dist/esm/fields/Checkbox/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/SystemColorField.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/ColorPicker/systemColorWell.gnome.native.js.map +1 -1
- package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/MonthPicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/MultiDatePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/fieldValueSync.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/DurationWheel.mjs +8 -0
- package/dist/esm/fields/Duration/DurationWheel.mjs.map +1 -0
- package/dist/esm/fields/Duration/DurationWheel.native.js +103 -0
- package/dist/esm/fields/Duration/DurationWheel.native.js.map +1 -0
- package/dist/esm/fields/Duration/durationMath.mjs +16 -1
- package/dist/esm/fields/Duration/durationMath.mjs.map +1 -1
- package/dist/esm/fields/Duration/durationMath.native.js +16 -1
- package/dist/esm/fields/Duration/durationMath.native.js.map +1 -1
- package/dist/esm/fields/Duration/durationWheelTypes.mjs +2 -0
- package/dist/esm/fields/Duration/durationWheelTypes.mjs.map +1 -0
- package/dist/esm/fields/Duration/durationWheelTypes.native.js +2 -0
- package/dist/esm/fields/Duration/durationWheelTypes.native.js.map +1 -0
- package/dist/esm/fields/Duration/index.mjs +28 -11
- package/dist/esm/fields/Duration/index.mjs.map +1 -1
- package/dist/esm/fields/Duration/index.native.js +30 -13
- 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.native.js.map +1 -1
- package/dist/esm/fields/FileUpload/nativePickerLoader.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/expoMapsLoader.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/geoValue.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/geocoder.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/geocoderContext.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/Geolocation/nativeSearchFocus.native.js.map +1 -1
- package/dist/esm/fields/Geolocation/photonGeocoder.native.js.map +1 -1
- package/dist/esm/fields/Icon/drawnSet.native.js.map +1 -1
- package/dist/esm/fields/Icon/index.native.js.map +1 -1
- package/dist/esm/fields/ImageField/index.native.js.map +1 -1
- package/dist/esm/fields/Input/index.native.js.map +1 -1
- package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
- package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
- package/dist/esm/fields/OTPInput/otpCellCss.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/dialCodes.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/phone.native.js.map +1 -1
- package/dist/esm/fields/PhoneInput/regionNames.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.native.js.map +1 -1
- package/dist/esm/fields/Select/InlineChoices.native.js.map +1 -1
- package/dist/esm/fields/Select/SheetPickerRow.native.js.map +1 -1
- package/dist/esm/fields/Select/index.native.js.map +1 -1
- package/dist/esm/fields/Select/shouldInlineChoices.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/footprint.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/catalog.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/nativeDateTime/OsDateTimeSheet.mjs +8 -7
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +8 -7
- package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs +1 -1
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -1
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js +1 -1
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs +1 -1
- package/dist/esm/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -1
- package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js +1 -1
- package/dist/esm/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
- package/dist/esm/fields/nativeSelect.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/keyboard/chain.native.js.map +1 -1
- package/dist/esm/keyboard/index.native.js.map +1 -1
- package/dist/esm/keyboard/types.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/choiceRowPress.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/fieldRowContext.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/instantMotion.native.js.map +1 -1
- package/dist/esm/shared/nativeA11y.native.js.map +1 -1
- package/dist/esm/shared/nativeAutoFocus.native.js.map +1 -1
- package/dist/esm/shared/overlaySizeClass.native.js.map +1 -1
- package/dist/esm/shared/overlayStack.native.js.map +1 -1
- package/dist/esm/shared/panelPortal.native.js.map +1 -1
- package/dist/esm/shared/pickerTriggerContract.native.js.map +1 -1
- package/dist/esm/shared/pressSlopProps.native.js.map +1 -1
- package/dist/esm/shared/restoreRetries.native.js.map +1 -1
- package/dist/esm/shared/sheetNavigation.native.js.map +1 -1
- package/dist/esm/shared/systemControlModules.gnome.native.js.map +1 -1
- package/dist/esm/shared/systemControls.native.js.map +1 -1
- package/dist/esm/shared/t.native.js.map +1 -1
- package/dist/esm/shared/tableCellContext.native.js.map +1 -1
- package/dist/esm/shared/useDragScroll.native.js.map +1 -1
- package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
- package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
- package/dist/esm/shared/utils.native.js.map +1 -1
- package/dist/esm/shared/zIndex.native.js.map +1 -1
- package/dist/esm/standardActions.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/Button/IconButtonGroup.mjs +47 -20
- package/dist/jsx/Button/IconButtonGroup.mjs.map +1 -1
- package/dist/jsx/Button/IconButtonGroup.native.js +51 -20
- package/dist/jsx/Button/IconButtonGroup.native.js.map +1 -1
- package/dist/jsx/Button/circleGlyph.mjs +9 -1
- package/dist/jsx/Button/circleGlyph.mjs.map +1 -1
- package/dist/jsx/Button/circleGlyph.native.js +12 -1
- package/dist/jsx/Button/circleGlyph.native.js.map +1 -1
- package/dist/jsx/Button/iconButtonGroupContext.mjs +5 -1
- package/dist/jsx/Button/iconButtonGroupContext.mjs.map +1 -1
- package/dist/jsx/Button/iconButtonGroupContext.native.js +7 -1
- package/dist/jsx/Button/iconButtonGroupContext.native.js.map +1 -1
- package/dist/jsx/Button/index.mjs +1 -9
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +3 -12
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/coverRect.mjs +23 -0
- package/dist/jsx/FloatingPanel/coverRect.mjs.map +1 -0
- package/dist/jsx/FloatingPanel/coverRect.native.js +54 -0
- package/dist/jsx/FloatingPanel/coverRect.native.js.map +1 -0
- package/dist/jsx/FloatingPanel/iconEcho.mjs +4 -2
- package/dist/jsx/FloatingPanel/iconEcho.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/iconEcho.native.js +3 -1
- package/dist/jsx/FloatingPanel/iconEcho.native.js.map +1 -1
- package/dist/jsx/FloatingPanel/index.mjs +23 -13
- package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
- package/dist/jsx/FloatingPanel/index.native.js +41 -15
- package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
- package/dist/jsx/InputParts/index.mjs +6 -1
- package/dist/jsx/InputParts/index.mjs.map +1 -1
- package/dist/jsx/InputParts/index.native.js +7 -0
- package/dist/jsx/InputParts/index.native.js.map +1 -1
- package/dist/jsx/InputParts/keyboardAppearance.mjs +5 -0
- package/dist/jsx/InputParts/keyboardAppearance.mjs.map +1 -0
- package/dist/jsx/InputParts/keyboardAppearance.native.js +33 -0
- package/dist/jsx/InputParts/keyboardAppearance.native.js.map +1 -0
- package/dist/jsx/fields/Duration/DurationWheel.mjs +8 -0
- package/dist/jsx/fields/Duration/DurationWheel.mjs.map +1 -0
- package/dist/jsx/fields/Duration/DurationWheel.native.js +132 -0
- package/dist/jsx/fields/Duration/DurationWheel.native.js.map +1 -0
- package/dist/jsx/fields/Duration/durationMath.mjs +16 -1
- package/dist/jsx/fields/Duration/durationMath.mjs.map +1 -1
- package/dist/jsx/fields/Duration/durationMath.native.js +19 -1
- package/dist/jsx/fields/Duration/durationMath.native.js.map +1 -1
- package/dist/jsx/fields/Duration/durationWheelTypes.mjs +2 -0
- package/dist/jsx/fields/Duration/durationWheelTypes.mjs.map +1 -0
- package/dist/jsx/fields/Duration/durationWheelTypes.native.js +21 -0
- package/dist/jsx/fields/Duration/durationWheelTypes.native.js.map +1 -0
- package/dist/jsx/fields/Duration/index.mjs +28 -11
- package/dist/jsx/fields/Duration/index.mjs.map +1 -1
- package/dist/jsx/fields/Duration/index.native.js +32 -12
- package/dist/jsx/fields/Duration/index.native.js.map +1 -1
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +8 -7
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +8 -7
- package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
- package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs +1 -1
- package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -1
- package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.native.js +1 -1
- package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs +1 -1
- package/dist/jsx/fields/nativeDateTime/sheetKeyboard.mjs.map +1 -1
- package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js +1 -1
- package/dist/jsx/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
- package/package.json +8 -8
- package/src/Button/IconButtonGroup.spec.tsx +20 -0
- package/src/Button/IconButtonGroup.tsx +60 -25
- package/src/Button/circleGlyph.ts +18 -0
- package/src/Button/iconButtonGroupContext.ts +25 -0
- package/src/Button/index.tsx +2 -20
- package/src/FloatingPanel/FloatingPanel.iconEcho.spec.tsx +61 -1
- package/src/FloatingPanel/FloatingPanel.menuFace.native.spec.tsx +104 -0
- package/src/FloatingPanel/coverRect.ts +42 -0
- package/src/FloatingPanel/iconEcho.tsx +9 -3
- package/src/FloatingPanel/index.native.tsx +63 -18
- package/src/FloatingPanel/index.tsx +35 -15
- package/src/InputParts/index.tsx +6 -0
- package/src/InputParts/keyboardAppearance.spec.ts +12 -0
- package/src/InputParts/keyboardAppearance.ts +4 -0
- package/src/fields/Duration/Duration.spec.tsx +19 -10
- package/src/fields/Duration/Duration.wheel.native.spec.tsx +98 -0
- package/src/fields/Duration/DurationWheel.native.tsx +101 -0
- package/src/fields/Duration/DurationWheel.tsx +11 -0
- package/src/fields/Duration/durationMath.spec.ts +43 -0
- package/src/fields/Duration/durationMath.ts +31 -0
- package/src/fields/Duration/durationWheelTypes.ts +18 -0
- package/src/fields/Duration/index.tsx +58 -27
- package/src/fields/nativeDateTime/OsDateTimeSheet.countdown.native.spec.tsx +121 -0
- package/src/fields/nativeDateTime/OsDateTimeSheet.spec.ts +4 -0
- package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +14 -9
- package/src/fields/nativeDateTime/osDateTimeIosDisplay.ts +3 -3
- package/src/fields/nativeDateTime/sheetKeyboard.spec.ts +6 -0
- package/src/fields/nativeDateTime/sheetKeyboard.ts +2 -2
- package/types/Button/IconButtonGroup.d.ts.map +1 -1
- package/types/Button/circleGlyph.d.ts +12 -0
- package/types/Button/circleGlyph.d.ts.map +1 -1
- package/types/Button/iconButtonGroupContext.d.ts +19 -0
- package/types/Button/iconButtonGroupContext.d.ts.map +1 -1
- package/types/Button/index.d.ts +2 -9
- package/types/Button/index.d.ts.map +1 -1
- package/types/FloatingPanel/coverRect.d.ts +25 -0
- package/types/FloatingPanel/coverRect.d.ts.map +1 -0
- package/types/FloatingPanel/index.d.ts.map +1 -1
- package/types/FloatingPanel/index.native.d.ts.map +1 -1
- package/types/InputParts/index.d.ts.map +1 -1
- package/types/InputParts/keyboardAppearance.d.ts +3 -0
- package/types/InputParts/keyboardAppearance.d.ts.map +1 -0
- package/types/fields/Duration/DurationWheel.d.ts +5 -0
- package/types/fields/Duration/DurationWheel.d.ts.map +1 -0
- package/types/fields/Duration/DurationWheel.native.d.ts +5 -0
- package/types/fields/Duration/DurationWheel.native.d.ts.map +1 -0
- package/types/fields/Duration/durationMath.d.ts +13 -0
- package/types/fields/Duration/durationMath.d.ts.map +1 -1
- package/types/fields/Duration/durationWheelTypes.d.ts +18 -0
- package/types/fields/Duration/durationWheelTypes.d.ts.map +1 -0
- package/types/fields/Duration/index.d.ts +8 -3
- package/types/fields/Duration/index.d.ts.map +1 -1
- package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts +1 -1
- package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -1
- package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts +2 -2
- package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts.map +1 -1
- package/types/fields/nativeDateTime/sheetKeyboard.d.ts +1 -1
- package/types/fields/nativeDateTime/sheetKeyboard.d.ts.map +1 -1
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { radiusClassProps, useBarSurface } from "@multiplatform.one/theme";
|
|
2
|
-
import { useCallback, useState, type ReactNode } from "react";
|
|
2
|
+
import { useCallback, useMemo, useRef, useState, type ReactNode } from "react";
|
|
3
3
|
import { isWeb, Theme, View, XStack, type XStackProps } from "tamagui";
|
|
4
4
|
import { loadGlassView } from "./glass";
|
|
5
5
|
import { MEDIA_PLATE_WEB_STYLE } from "./mediaPlate";
|
|
6
6
|
import { isAppleTouchWeb, WebGlassFace } from "./webGlass";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
IconButtonGroupContext,
|
|
9
|
+
IconButtonGroupRegistry,
|
|
10
|
+
IconButtonGroupSurfaceContext,
|
|
11
|
+
type IconButtonGroupSurface,
|
|
12
|
+
} from "./iconButtonGroupContext";
|
|
8
13
|
|
|
9
14
|
/**
|
|
10
15
|
* LC-176: how far apart two Liquid Glass circles may sit and still merge. Half
|
|
@@ -12,6 +17,12 @@ import { IconButtonGroupContext, IconButtonGroupRegistry } from "./iconButtonGro
|
|
|
12
17
|
*/
|
|
13
18
|
export const ICON_BUTTON_GLASS_MERGE_PX = 22;
|
|
14
19
|
|
|
20
|
+
type MeasurableView = {
|
|
21
|
+
measureInWindow?: (
|
|
22
|
+
callback: (x: number, y: number, width: number, height: number) => void,
|
|
23
|
+
) => void;
|
|
24
|
+
};
|
|
25
|
+
|
|
15
26
|
export interface IconButtonGroupProps extends XStackProps {
|
|
16
27
|
/** Over imagery or video: the group shares one material capsule. */
|
|
17
28
|
plate?: "media";
|
|
@@ -35,6 +46,22 @@ export function IconButtonGroup({ plate, children, ...rest }: IconButtonGroupPro
|
|
|
35
46
|
setMembers((count) => count + 1);
|
|
36
47
|
return () => setMembers((count) => count - 1);
|
|
37
48
|
}, []);
|
|
49
|
+
const capsuleRef = useRef<MeasurableView | null>(null);
|
|
50
|
+
const surface = useMemo<IconButtonGroupSurface>(
|
|
51
|
+
() => ({
|
|
52
|
+
measure(callback) {
|
|
53
|
+
const node = capsuleRef.current;
|
|
54
|
+
if (typeof node?.measureInWindow !== "function") {
|
|
55
|
+
callback(null);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
node.measureInWindow((x, y, width, height) =>
|
|
59
|
+
callback(width > 0 && height > 0 ? { x, y, width, height, radius: height / 2 } : null),
|
|
60
|
+
);
|
|
61
|
+
},
|
|
62
|
+
}),
|
|
63
|
+
[],
|
|
64
|
+
);
|
|
38
65
|
if (plate === "media") {
|
|
39
66
|
return (
|
|
40
67
|
<IconButtonGroupContext.Provider value="media">
|
|
@@ -95,11 +122,15 @@ export function IconButtonGroup({ plate, children, ...rest }: IconButtonGroupPro
|
|
|
95
122
|
);
|
|
96
123
|
}
|
|
97
124
|
const GlassView = bar ? loadGlassView() : null;
|
|
125
|
+
const capsule = GlassView != null && members > 0;
|
|
126
|
+
// The capsule hugs its buttons with the web twin's $2 end inset and $1 gap,
|
|
127
|
+
// so its first and last items never sit on its curve (FZ-8550).
|
|
98
128
|
const row = (
|
|
99
129
|
<XStack
|
|
100
130
|
alignItems="center"
|
|
101
|
-
data-mp-icon-button-group={
|
|
131
|
+
data-mp-icon-button-group={capsule ? "glass" : bar ? "bar" : "row"}
|
|
102
132
|
{...rest}
|
|
133
|
+
{...(capsule ? { paddingHorizontal: "$2" as const, gap: "$1" as const } : null)}
|
|
103
134
|
>
|
|
104
135
|
{children}
|
|
105
136
|
</XStack>
|
|
@@ -108,28 +139,32 @@ export function IconButtonGroup({ plate, children, ...rest }: IconButtonGroupPro
|
|
|
108
139
|
return (
|
|
109
140
|
<IconButtonGroupRegistry.Provider value={register}>
|
|
110
141
|
<IconButtonGroupContext.Provider value="glass">
|
|
111
|
-
<
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
142
|
+
<IconButtonGroupSurfaceContext.Provider value={members > 0 ? surface : null}>
|
|
143
|
+
<View
|
|
144
|
+
ref={capsuleRef as never}
|
|
145
|
+
collapsable={false}
|
|
146
|
+
position="relative"
|
|
147
|
+
flexShrink={1}
|
|
148
|
+
minWidth={0}
|
|
149
|
+
onLayout={(event) => setCapsuleHeight(event.nativeEvent.layout.height)}
|
|
150
|
+
>
|
|
151
|
+
{members > 0 ? (
|
|
152
|
+
<GlassView
|
|
153
|
+
glassEffectStyle="regular"
|
|
154
|
+
pointerEvents="none"
|
|
155
|
+
style={{
|
|
156
|
+
position: "absolute",
|
|
157
|
+
top: 0,
|
|
158
|
+
right: 0,
|
|
159
|
+
bottom: 0,
|
|
160
|
+
left: 0,
|
|
161
|
+
borderRadius: capsuleHeight / 2,
|
|
162
|
+
}}
|
|
163
|
+
/>
|
|
164
|
+
) : null}
|
|
165
|
+
{row}
|
|
166
|
+
</View>
|
|
167
|
+
</IconButtonGroupSurfaceContext.Provider>
|
|
133
168
|
</IconButtonGroupContext.Provider>
|
|
134
169
|
</IconButtonGroupRegistry.Provider>
|
|
135
170
|
);
|
|
@@ -4,3 +4,21 @@
|
|
|
4
4
|
* ratio, never a small glyph lost in a big plate.
|
|
5
5
|
*/
|
|
6
6
|
export const ICON_BUTTON_CIRCLE_GLYPH_RATIO = 0.58;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* LC-176: Phosphor bold's stem is 0.12 of its ink, an SF Symbols bold plus's
|
|
10
|
+
* 0.18 (measured at 17 and 24pt). An outline stroke this wide, in the 256-unit
|
|
11
|
+
* grid, brings a bold glyph to SF semibold-bold (0.154); a wider one closes
|
|
12
|
+
* Phosphor bold's 16-unit counters (the trash lid, copy's overlap).
|
|
13
|
+
*/
|
|
14
|
+
export const GLYPH_BOLD_STROKE_UNITS = 8;
|
|
15
|
+
|
|
16
|
+
export function boldStroke(weight: "regular" | "bold", color = "currentColor") {
|
|
17
|
+
return weight === "bold"
|
|
18
|
+
? {
|
|
19
|
+
stroke: color,
|
|
20
|
+
strokeWidth: GLYPH_BOLD_STROKE_UNITS,
|
|
21
|
+
strokeLinejoin: "round" as const,
|
|
22
|
+
}
|
|
23
|
+
: undefined;
|
|
24
|
+
}
|
|
@@ -30,3 +30,28 @@ export function useIconButtonGroupMember(iconOnly: boolean): void {
|
|
|
30
30
|
[iconOnly, register],
|
|
31
31
|
);
|
|
32
32
|
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The window frame and corner radius of the plate an `IconButtonGroup` paints
|
|
36
|
+
* (a native Liquid Glass capsule). Native has no DOM to walk, so a panel
|
|
37
|
+
* opening from a grouped button reads the plate it covers here (LC-112,
|
|
38
|
+
* FZ-8550).
|
|
39
|
+
*/
|
|
40
|
+
export interface IconButtonGroupPlate {
|
|
41
|
+
x: number;
|
|
42
|
+
y: number;
|
|
43
|
+
width: number;
|
|
44
|
+
height: number;
|
|
45
|
+
radius: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface IconButtonGroupSurface {
|
|
49
|
+
/** Answers once: the plate, or null when it cannot be measured. */
|
|
50
|
+
measure(callback: (plate: IconButtonGroupPlate | null) => void): void;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const IconButtonGroupSurfaceContext = createContext<IconButtonGroupSurface | null>(null);
|
|
54
|
+
|
|
55
|
+
export function useIconButtonGroupSurface(): IconButtonGroupSurface | null {
|
|
56
|
+
return useContext(IconButtonGroupSurfaceContext);
|
|
57
|
+
}
|
package/src/Button/index.tsx
CHANGED
|
@@ -80,10 +80,10 @@ import { useControlGrouped } from "../shared/groupContext";
|
|
|
80
80
|
import { useInPanelEcho, usePanelTriggerRadiusReporter } from "../FloatingPanel/echoContext";
|
|
81
81
|
import { loadGlassView } from "./glass";
|
|
82
82
|
import { MEDIA_PLATE_WEB_STYLE } from "./mediaPlate";
|
|
83
|
-
import { ICON_BUTTON_CIRCLE_GLYPH_RATIO } from "./circleGlyph";
|
|
83
|
+
import { boldStroke, GLYPH_BOLD_STROKE_UNITS, ICON_BUTTON_CIRCLE_GLYPH_RATIO } from "./circleGlyph";
|
|
84
84
|
import { useIconButtonGroupGround, useIconButtonGroupMember } from "./iconButtonGroupContext";
|
|
85
85
|
|
|
86
|
-
export { ICON_BUTTON_CIRCLE_GLYPH_RATIO };
|
|
86
|
+
export { GLYPH_BOLD_STROKE_UNITS, ICON_BUTTON_CIRCLE_GLYPH_RATIO };
|
|
87
87
|
|
|
88
88
|
/**
|
|
89
89
|
* Coordinated size recipe (Polaris slim/medium/large, Primer s/m/l, Linear
|
|
@@ -466,24 +466,6 @@ export function iconButtonGlyphPx(rowLinePx: number | undefined): number {
|
|
|
466
466
|
/** LC-176: an inline glyph is the text's size; Phosphor's 256 grid pads ~12%. */
|
|
467
467
|
const INLINE_GLYPH_RATIO = 1.2;
|
|
468
468
|
|
|
469
|
-
/**
|
|
470
|
-
* LC-176: Phosphor bold's stem is 0.12 of its ink, an SF Symbols bold plus's
|
|
471
|
-
* 0.18 (measured at 17 and 24pt). An outline stroke this wide, in the 256-unit
|
|
472
|
-
* grid, brings a bold glyph to SF semibold-bold (0.154); a wider one closes
|
|
473
|
-
* Phosphor bold's 16-unit counters (the trash lid, copy's overlap).
|
|
474
|
-
*/
|
|
475
|
-
export const GLYPH_BOLD_STROKE_UNITS = 8;
|
|
476
|
-
|
|
477
|
-
function boldStroke(weight: "regular" | "bold", color = "currentColor") {
|
|
478
|
-
return weight === "bold"
|
|
479
|
-
? {
|
|
480
|
-
stroke: color,
|
|
481
|
-
strokeWidth: GLYPH_BOLD_STROKE_UNITS,
|
|
482
|
-
strokeLinejoin: "round" as const,
|
|
483
|
-
}
|
|
484
|
-
: undefined;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
469
|
function withGlyphWeight(
|
|
488
470
|
icon: IconLike | undefined,
|
|
489
471
|
size: number,
|
|
@@ -8,10 +8,11 @@ import { PlusIcon, XIcon } from "@phosphor-icons/react";
|
|
|
8
8
|
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
9
9
|
import { fireEvent, render, waitFor, within } from "@testing-library/react";
|
|
10
10
|
import { useState } from "react";
|
|
11
|
-
import { Surface, useBarSurface } from "@multiplatform.one/theme";
|
|
11
|
+
import { MIN_PRESS_TARGET, Surface, useBarSurface } from "@multiplatform.one/theme";
|
|
12
12
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
13
13
|
import { Text } from "tamagui";
|
|
14
14
|
import { Button } from "../Button";
|
|
15
|
+
import { GLYPH_BOLD_STROKE_UNITS } from "../Button/circleGlyph";
|
|
15
16
|
import { FloatingPanel } from "./index";
|
|
16
17
|
import { usePanelIconEchoBox } from "./echoContext";
|
|
17
18
|
import { PanelHeader } from "./PanelHeader";
|
|
@@ -98,6 +99,31 @@ function AddPanel({ kind = "close", header = false }: { kind?: IconEcho; header?
|
|
|
98
99
|
);
|
|
99
100
|
}
|
|
100
101
|
|
|
102
|
+
/** An account menu opened from a 32pt avatar (no `icon`, so its X is a circle). */
|
|
103
|
+
function AvatarPanel() {
|
|
104
|
+
return (
|
|
105
|
+
<FloatingPanel
|
|
106
|
+
open
|
|
107
|
+
onOpenChange={() => {}}
|
|
108
|
+
anchorMode="cover-trigger"
|
|
109
|
+
compactFace="menu"
|
|
110
|
+
triggerEcho={false}
|
|
111
|
+
iconEcho="menu"
|
|
112
|
+
coverAlign="auto"
|
|
113
|
+
widthMode="fit-content"
|
|
114
|
+
triggerSizing="content"
|
|
115
|
+
contentPadding="none"
|
|
116
|
+
trigger={
|
|
117
|
+
<span role="button" aria-label="Account">
|
|
118
|
+
AD
|
|
119
|
+
</span>
|
|
120
|
+
}
|
|
121
|
+
>
|
|
122
|
+
<Text>Sign out</Text>
|
|
123
|
+
</FloatingPanel>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
101
127
|
const glyphPath = (node: Element | null | undefined) =>
|
|
102
128
|
node?.querySelector("svg path")?.getAttribute("d");
|
|
103
129
|
|
|
@@ -294,4 +320,38 @@ describe("LC-112 icon trigger echo on the web (FZ-8480)", () => {
|
|
|
294
320
|
expect(panel.style.transformOrigin).toBe("bottom left");
|
|
295
321
|
expect(result.queryByTestId("floating-panel-sheet")).toBeNull();
|
|
296
322
|
});
|
|
323
|
+
|
|
324
|
+
it("strokes the avatar's X to the bar buttons' bold stem (FZ-8480 follow-up)", async () => {
|
|
325
|
+
measure({ x: 100, y: 12, width: 44, height: 44 });
|
|
326
|
+
const bar = renderWithProviders(<AddPanel kind="menu" />);
|
|
327
|
+
const barPanel = await open(bar);
|
|
328
|
+
const barX = within(barPanel).getByRole("button", { name: "Close" }).querySelector("svg");
|
|
329
|
+
expect(barX?.getAttribute("stroke-width")).toBe(String(GLYPH_BOLD_STROKE_UNITS));
|
|
330
|
+
bar.unmount();
|
|
331
|
+
const result = renderWithProviders(<AvatarPanel />);
|
|
332
|
+
const panel = (await result.findByTestId("floating-panel-viewport")) as HTMLElement;
|
|
333
|
+
const avatarX = within(panel).getByRole("button", { name: "Close" }).querySelector("svg");
|
|
334
|
+
expect(avatarX?.getAttribute("stroke-width")).toBe(barX?.getAttribute("stroke-width"));
|
|
335
|
+
expect(avatarX?.getAttribute("stroke-linejoin")).toBe("round");
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it("covers a 32pt avatar at its 44pt target, its centre on the row-icon column (FZ-8480 GAP)", async () => {
|
|
339
|
+
const avatar = { x: 100, y: 18, width: 32, height: 32 };
|
|
340
|
+
measure(avatar, 240);
|
|
341
|
+
const result = renderWithProviders(<AvatarPanel />);
|
|
342
|
+
const panel = (await result.findByTestId("floating-panel-viewport")) as HTMLElement;
|
|
343
|
+
await waitFor(() => expect(panel.style.visibility).toBe("visible"));
|
|
344
|
+
const inset = (MIN_PRESS_TARGET - avatar.width) / 2;
|
|
345
|
+
expect(panel.style.left).toBe(`${avatar.x - inset}px`);
|
|
346
|
+
expect(panel.style.top).toBe(`${avatar.y - inset}px`);
|
|
347
|
+
const row = panel.querySelector<HTMLElement>("[data-fp-icon-echo]") as HTMLElement;
|
|
348
|
+
expect(row.style.height).toBe(`${MIN_PRESS_TARGET}px`);
|
|
349
|
+
const box = row.querySelector<HTMLElement>("[data-fp-icon-echo-box]") as HTMLElement;
|
|
350
|
+
expect(box.style.width).toBe(`${avatar.width}px`);
|
|
351
|
+
expect(box.style.marginLeft).toBe(`${inset}px`);
|
|
352
|
+
expect(box.style.marginTop).toBe(`${inset}px`);
|
|
353
|
+
// The X's centre sits half a press target in, the centre of a menu row's
|
|
354
|
+
// leading glyph slot.
|
|
355
|
+
expect(inset + avatar.width / 2).toBe(MIN_PRESS_TARGET / 2);
|
|
356
|
+
});
|
|
297
357
|
});
|
|
@@ -9,7 +9,13 @@ import { PlusIcon, XIcon } from "@phosphor-icons/react";
|
|
|
9
9
|
import { useState, type ReactNode } from "react";
|
|
10
10
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
11
11
|
import { Text, XStack, YStack, getTokens, getVariableValue } from "tamagui";
|
|
12
|
+
import { MIN_PRESS_TARGET } from "@multiplatform.one/theme";
|
|
12
13
|
import { Button } from "../Button";
|
|
14
|
+
import {
|
|
15
|
+
IconButtonGroupSurfaceContext,
|
|
16
|
+
type IconButtonGroupPlate,
|
|
17
|
+
type IconButtonGroupSurface,
|
|
18
|
+
} from "../Button/iconButtonGroupContext";
|
|
13
19
|
import { Input as InputParts } from "../InputParts";
|
|
14
20
|
import { OverlayStackProvider } from "../shared/overlayStack";
|
|
15
21
|
import { MENU_MIN_WIDTH, type CompactFace } from "./compactFace";
|
|
@@ -540,3 +546,101 @@ describe("LC-112 icon trigger echo on native (FZ-8480, rv_2607879d3bdaf9bf)", ()
|
|
|
540
546
|
expect(glyphPath(iconEcho())).not.toBe(glyphPath(live));
|
|
541
547
|
});
|
|
542
548
|
});
|
|
549
|
+
|
|
550
|
+
const capsuleSurface = (plate: IconButtonGroupPlate): IconButtonGroupSurface => ({
|
|
551
|
+
measure: (callback) => callback(plate),
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
describe("LC-112 grouped glass capsule on native (FZ-8550, Round 37 second pass)", () => {
|
|
555
|
+
const plate = { x: 200, y: 50, width: 174, height: 44, radius: 22 };
|
|
556
|
+
|
|
557
|
+
it("covers the whole capsule from context at its radius; only the pressed trigger shows, as its X", () => {
|
|
558
|
+
trigger = { x: 330, y: 50, width: 44, height: 44 };
|
|
559
|
+
const result = renderWithProviders(
|
|
560
|
+
<IconButtonGroupSurfaceContext.Provider value={capsuleSurface(plate)}>
|
|
561
|
+
<EchoMenu kind="menu" />
|
|
562
|
+
</IconButtonGroupSurfaceContext.Provider>,
|
|
563
|
+
);
|
|
564
|
+
tap(result.getAllByRole("button", { name: "Add node" })[0]!);
|
|
565
|
+
const panel = menu() as HTMLElement;
|
|
566
|
+
layout(panel, MENU_MIN_WIDTH, 180);
|
|
567
|
+
const left = parseFloat(panel.style.left);
|
|
568
|
+
const top = parseFloat(panel.style.top);
|
|
569
|
+
// The panel's frame contains the capsule's: same top edge, both ends.
|
|
570
|
+
expect(top).toBe(plate.y);
|
|
571
|
+
expect(left).toBeLessThanOrEqual(plate.x);
|
|
572
|
+
expect(left + MENU_MIN_WIDTH).toBeGreaterThanOrEqual(plate.x + plate.width);
|
|
573
|
+
expect(left).toBe(plate.x + plate.width - MENU_MIN_WIDTH);
|
|
574
|
+
expect(corners(frame() as HTMLElement)).toEqual(radiusAtoms(plate.radius));
|
|
575
|
+
// The band is the capsule's height; the X keeps the trigger's own box.
|
|
576
|
+
const band = iconBand() as HTMLElement;
|
|
577
|
+
expect(band.style.height).toBe(`${plate.height}px`);
|
|
578
|
+
const box = band.firstElementChild as HTMLElement;
|
|
579
|
+
expect(box.style.width).toBe(`${trigger.width}px`);
|
|
580
|
+
expect(box.style.marginInlineStart || box.style.marginLeft).toBe(`${trigger.x - left}px`);
|
|
581
|
+
// Only the pressed trigger shows, as an X; nothing else of the group.
|
|
582
|
+
const echoes = document.querySelectorAll('[data-testid="floating-panel-icon-echo"]');
|
|
583
|
+
expect(echoes).toHaveLength(1);
|
|
584
|
+
const x = render(<XIcon weight="bold" />);
|
|
585
|
+
expect(glyphPath(echoes[0] as Element)).toBe(glyphPath(x.container));
|
|
586
|
+
x.unmount();
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
it("takes the capsule's width as its floor when the capsule is wider than the menu", () => {
|
|
590
|
+
const wide = { x: 16, y: 50, width: 358, height: 44, radius: 22 };
|
|
591
|
+
trigger = { x: 330, y: 50, width: 44, height: 44 };
|
|
592
|
+
const result = renderWithProviders(
|
|
593
|
+
<IconButtonGroupSurfaceContext.Provider value={capsuleSurface(wide)}>
|
|
594
|
+
<EchoMenu kind="menu" />
|
|
595
|
+
</IconButtonGroupSurfaceContext.Provider>,
|
|
596
|
+
);
|
|
597
|
+
tap(result.getAllByRole("button", { name: "Add node" })[0]!);
|
|
598
|
+
const panel = menu() as HTMLElement;
|
|
599
|
+
expect(panel.style.minWidth).toBe(`${wide.width}px`);
|
|
600
|
+
layout(panel, wide.width, 180);
|
|
601
|
+
expect(panel.style.left).toBe(`${wide.x}px`);
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
it("waits for the capsule before it shows, so it never opens on the button alone first", () => {
|
|
605
|
+
trigger = { x: 330, y: 50, width: 44, height: 44 };
|
|
606
|
+
let answer: ((plate: IconButtonGroupPlate | null) => void) | null = null;
|
|
607
|
+
const result = renderWithProviders(
|
|
608
|
+
<IconButtonGroupSurfaceContext.Provider
|
|
609
|
+
value={{
|
|
610
|
+
measure: (callback) => {
|
|
611
|
+
answer = callback;
|
|
612
|
+
},
|
|
613
|
+
}}
|
|
614
|
+
>
|
|
615
|
+
<EchoMenu kind="menu" />
|
|
616
|
+
</IconButtonGroupSurfaceContext.Provider>,
|
|
617
|
+
);
|
|
618
|
+
tap(result.getAllByRole("button", { name: "Add node" })[0]!);
|
|
619
|
+
const panel = menu() as HTMLElement;
|
|
620
|
+
layout(panel, MENU_MIN_WIDTH, 180);
|
|
621
|
+
expect(panel.style.opacity).toBe("0");
|
|
622
|
+
act(() => answer?.(plate));
|
|
623
|
+
expect(panel.style.opacity).toBe("1");
|
|
624
|
+
expect(panel.style.left).toBe(`${plate.x + plate.width - MENU_MIN_WIDTH}px`);
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
it("covers a 32pt avatar at its 44pt target, so its centre is the row-icon column (FZ-8480)", () => {
|
|
628
|
+
trigger = { x: 100, y: 56, width: 32, height: 32 };
|
|
629
|
+
const result = renderWithProviders(<EchoMenu kind="menu" />);
|
|
630
|
+
tap(result.getAllByRole("button", { name: "Add node" })[0]!);
|
|
631
|
+
const panel = menu() as HTMLElement;
|
|
632
|
+
layout(panel, MENU_MIN_WIDTH, 180);
|
|
633
|
+
const inset = (MIN_PRESS_TARGET - trigger.width) / 2;
|
|
634
|
+
expect(panel.style.left).toBe(`${trigger.x - inset}px`);
|
|
635
|
+
expect(panel.style.top).toBe(`${trigger.y - inset}px`);
|
|
636
|
+
const band = iconBand() as HTMLElement;
|
|
637
|
+
expect(band.style.height).toBe(`${MIN_PRESS_TARGET}px`);
|
|
638
|
+
const box = band.firstElementChild as HTMLElement;
|
|
639
|
+
expect(box.style.width).toBe(`${trigger.width}px`);
|
|
640
|
+
expect(box.style.marginTop).toBe(`${inset}px`);
|
|
641
|
+
expect(box.style.marginInlineStart || box.style.marginLeft).toBe(`${inset}px`);
|
|
642
|
+
// The X's centre sits half a press target in: where a row's leading
|
|
643
|
+
// glyph centres (row inset plus half its 18pt slot, on the frame border).
|
|
644
|
+
expect(inset + trigger.width / 2).toBe(MIN_PRESS_TARGET / 2);
|
|
645
|
+
});
|
|
646
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { MIN_PRESS_TARGET } from "@multiplatform.one/theme";
|
|
2
|
+
import type { TriggerRect } from "./pointAnchor";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The 44pt box an icon trigger is pressed in, centred on the trigger
|
|
6
|
+
* (LC-176). A trigger drawn smaller than its target (a 32pt avatar) is
|
|
7
|
+
* covered at its target, so the panel's row-icon column, which centres on
|
|
8
|
+
* a 44pt start inset, runs through the trigger's centre and the X drawn on
|
|
9
|
+
* it (FZ-8480 GAP). A trigger at least that big is its own box.
|
|
10
|
+
*/
|
|
11
|
+
export function pressTargetRect(trigger: TriggerRect, min = MIN_PRESS_TARGET): TriggerRect {
|
|
12
|
+
const width = Math.max(trigger.width, min);
|
|
13
|
+
const height = Math.max(trigger.height, min);
|
|
14
|
+
return {
|
|
15
|
+
x: trigger.x - (width - trigger.width) / 2,
|
|
16
|
+
y: trigger.y - (height - trigger.height) / 2,
|
|
17
|
+
width,
|
|
18
|
+
height,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The surface a panel opened from an icon trigger covers (LC-112, FZ-8480
|
|
24
|
+
* Round 37): the plate the trigger sits on. In a grouped glass capsule
|
|
25
|
+
* that is the capsule (FZ-8550); a lone trigger is its press target.
|
|
26
|
+
*/
|
|
27
|
+
export function iconCoverRect(trigger: TriggerRect, group: TriggerRect | null): TriggerRect {
|
|
28
|
+
return group ?? pressTargetRect(trigger);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Where the trigger sits inside the surface its panel covers: the X box's
|
|
33
|
+
* offset from the cover's top, and the band's height. Null when the cover is
|
|
34
|
+
* the trigger itself.
|
|
35
|
+
*/
|
|
36
|
+
export function echoInCover(
|
|
37
|
+
trigger: TriggerRect,
|
|
38
|
+
cover: TriggerRect,
|
|
39
|
+
): { top: number; height: number } | null {
|
|
40
|
+
if (cover.y === trigger.y && cover.height === trigger.height) return null;
|
|
41
|
+
return { top: trigger.y - cover.y, height: cover.height };
|
|
42
|
+
}
|
|
@@ -2,7 +2,7 @@ import { XIcon } from "@phosphor-icons/react";
|
|
|
2
2
|
import { cloneElement, isValidElement, useState, type ReactElement, type ReactNode } from "react";
|
|
3
3
|
import { SurfaceContext, type SurfaceIntent } from "@multiplatform.one/theme";
|
|
4
4
|
import { useTheme, View } from "tamagui";
|
|
5
|
-
import { ICON_BUTTON_CIRCLE_GLYPH_RATIO } from "../Button/circleGlyph";
|
|
5
|
+
import { boldStroke, ICON_BUTTON_CIRCLE_GLYPH_RATIO } from "../Button/circleGlyph";
|
|
6
6
|
import { t } from "../shared/t";
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -83,10 +83,15 @@ const avatarPlate = "$selectedBackground";
|
|
|
83
83
|
/** The X's glyph before the circle has measured itself. */
|
|
84
84
|
const circleGlyphFallbackPx = 18;
|
|
85
85
|
|
|
86
|
-
/**
|
|
86
|
+
/**
|
|
87
|
+
* An X in a circle the size of the trigger it replaces (an avatar), stroked
|
|
88
|
+
* to the bar buttons' bold stem (LC-176), so every X in a bar reads at one
|
|
89
|
+
* weight.
|
|
90
|
+
*/
|
|
87
91
|
function CircleClose({ label, onClose }: { label: string; onClose: () => void }) {
|
|
88
92
|
const theme = useTheme();
|
|
89
93
|
const [side, setSide] = useState(0);
|
|
94
|
+
const ink = theme.selectedColor?.val ?? theme.color?.val;
|
|
90
95
|
return (
|
|
91
96
|
<View
|
|
92
97
|
role="button"
|
|
@@ -110,7 +115,8 @@ function CircleClose({ label, onClose }: { label: string; onClose: () => void })
|
|
|
110
115
|
<XIcon
|
|
111
116
|
size={side > 0 ? Math.round(side * ICON_BUTTON_CIRCLE_GLYPH_RATIO) : circleGlyphFallbackPx}
|
|
112
117
|
weight="bold"
|
|
113
|
-
color={
|
|
118
|
+
color={ink}
|
|
119
|
+
{...boldStroke("bold", typeof ink === "string" ? ink : undefined)}
|
|
114
120
|
aria-hidden
|
|
115
121
|
/>
|
|
116
122
|
</View>
|