@multiplatform.one/forms 7.73.0 → 7.74.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 +2 -2
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/IconButtonGroup.cjs +32 -0
- package/dist/cjs/Button/IconButtonGroup.native.js +32 -0
- package/dist/cjs/Button/IconButtonGroup.native.js.map +1 -1
- package/dist/cjs/Button/circleGlyph.native.js.map +1 -1
- package/dist/cjs/Button/glass.cjs +4 -1
- package/dist/cjs/Button/iconButtonGroupContext.native.js.map +1 -1
- package/dist/cjs/Button/index.cjs +42 -13
- package/dist/cjs/Button/index.native.js +52 -17
- 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.cjs +62 -0
- package/dist/cjs/Button/webGlass.native.js +68 -0
- package/dist/cjs/Button/webGlass.native.js.map +1 -0
- 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/echoContext.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/iconEcho.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.native.js.map +1 -1
- package/dist/cjs/Label/index.native.js.map +1 -1
- package/dist/cjs/MediaPicker/base64.native.js.map +1 -1
- package/dist/cjs/MediaPicker/payload.native.js.map +1 -1
- package/dist/cjs/MediaPicker/types.native.js.map +1 -1
- package/dist/cjs/MediaPicker/useMediaPicker.native.js.map +1 -1
- package/dist/cjs/Skeleton/index.native.js.map +1 -1
- package/dist/cjs/Spinner/SpinnerGlyph.native.js.map +1 -1
- package/dist/cjs/Spinner/spinnerSize.native.js.map +1 -1
- package/dist/cjs/Table/index.native.js.map +1 -1
- package/dist/cjs/Wheel/haptic.native.js.map +1 -1
- package/dist/cjs/Wheel/index.native.js.map +1 -1
- package/dist/cjs/Wheel/wheelShared.native.js.map +1 -1
- package/dist/cjs/actionLabel.native.js.map +1 -1
- package/dist/cjs/fieldDefaults.native.js.map +1 -1
- package/dist/cjs/fieldLayout.native.js +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/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 +8 -3
- package/dist/cjs/fields/FileUpload/index.native.js +10 -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/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.native.js +1 -1
- package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -1
- package/dist/cjs/fields/nativeDateTime/sheetKeyboard.native.js.map +1 -1
- package/dist/cjs/fields/nativeSelect.native.js.map +1 -1
- package/dist/cjs/fields/selectedOrder.native.js.map +1 -1
- package/dist/cjs/formSpacing.native.js.map +1 -1
- package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
- package/dist/cjs/index.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/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 +32 -0
- package/dist/esm/Button/IconButtonGroup.mjs.map +1 -1
- package/dist/esm/Button/IconButtonGroup.native.js +32 -0
- package/dist/esm/Button/IconButtonGroup.native.js.map +1 -1
- package/dist/esm/Button/circleGlyph.native.js.map +1 -1
- package/dist/esm/Button/glass.mjs +4 -2
- package/dist/esm/Button/glass.mjs.map +1 -1
- package/dist/esm/Button/iconButtonGroupContext.mjs.map +1 -1
- package/dist/esm/Button/iconButtonGroupContext.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +43 -15
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +51 -17
- 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.mjs +36 -0
- package/dist/esm/Button/webGlass.mjs.map +1 -0
- package/dist/esm/Button/webGlass.native.js +39 -0
- package/dist/esm/Button/webGlass.native.js.map +1 -0
- 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/echoContext.native.js.map +1 -1
- package/dist/esm/FloatingPanel/iconEcho.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.native.js.map +1 -1
- 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/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 +8 -3
- package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
- package/dist/esm/fields/FileUpload/index.native.js +8 -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/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.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/dateTimePickerLoader.native.js.map +1 -1
- package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +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/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 +32 -0
- package/dist/jsx/Button/IconButtonGroup.mjs.map +1 -1
- package/dist/jsx/Button/IconButtonGroup.native.js +32 -0
- package/dist/jsx/Button/IconButtonGroup.native.js.map +1 -1
- package/dist/jsx/Button/glass.mjs +4 -2
- package/dist/jsx/Button/glass.mjs.map +1 -1
- package/dist/jsx/Button/iconButtonGroupContext.mjs.map +1 -1
- package/dist/jsx/Button/iconButtonGroupContext.native.js.map +1 -1
- package/dist/jsx/Button/index.mjs +43 -15
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +50 -15
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/Button/webGlass.mjs +36 -0
- package/dist/jsx/Button/webGlass.mjs.map +1 -0
- package/dist/jsx/Button/webGlass.native.js +68 -0
- package/dist/jsx/Button/webGlass.native.js.map +1 -0
- package/dist/jsx/fields/FileUpload/index.mjs +8 -3
- package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
- package/dist/jsx/fields/FileUpload/index.native.js +8 -3
- package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
- package/package.json +8 -8
- package/src/Button/Button.accentInk.spec.tsx +39 -8
- package/src/Button/Button.iconButton.spec.tsx +143 -3
- package/src/Button/Button.stories.tsx +55 -38
- package/src/Button/IconButtonGroup.spec.tsx +26 -0
- package/src/Button/IconButtonGroup.tsx +39 -0
- package/src/Button/glass.spec.ts +73 -0
- package/src/Button/glass.ts +8 -3
- package/src/Button/iconButtonGroupContext.ts +2 -1
- package/src/Button/index.tsx +66 -11
- package/src/Button/webGlass.ts +42 -0
- package/src/fields/FileUpload/FileUpload.spec.tsx +8 -0
- package/src/fields/FileUpload/index.tsx +12 -4
- package/types/Button/IconButtonGroup.d.ts.map +1 -1
- package/types/Button/glass.d.ts +5 -2
- package/types/Button/glass.d.ts.map +1 -1
- package/types/Button/iconButtonGroupContext.d.ts +2 -1
- package/types/Button/iconButtonGroupContext.d.ts.map +1 -1
- package/types/Button/index.d.ts +7 -0
- package/types/Button/index.d.ts.map +1 -1
- package/types/Button/webGlass.d.ts +32 -0
- package/types/Button/webGlass.d.ts.map +1 -0
- package/types/fields/FileUpload/index.d.ts.map +1 -1
|
@@ -5,8 +5,11 @@ import {
|
|
|
5
5
|
FOCUS_RING_CLIPPED_OFFSET,
|
|
6
6
|
FOCUS_RING_MIN_CONTRAST,
|
|
7
7
|
ensureFocusVisibleRing,
|
|
8
|
+
GlyphTintFallbackProvider,
|
|
8
9
|
Paragraph,
|
|
9
10
|
Surface,
|
|
11
|
+
glyphTintFallback,
|
|
12
|
+
type GlyphTintFallback,
|
|
10
13
|
} from "@multiplatform.one/theme";
|
|
11
14
|
import { Button as TamaguiButton, XStack, YStack, useTheme } from "tamagui";
|
|
12
15
|
import {
|
|
@@ -539,25 +542,36 @@ export const IconButtons: Story = {
|
|
|
539
542
|
// SHC's own code rather than this reproduction.
|
|
540
543
|
const shcRoundGlyph = { circular: true, chromeless: true, accentInk: true } as const;
|
|
541
544
|
|
|
545
|
+
// FZ-8020 r4: the house theme has no hue, so `tint` renders each fallback
|
|
546
|
+
// (ink, the system tint, a house hue) from one build for Clay's compare.
|
|
547
|
+
type TintStory = StoryObj<{ tint: GlyphTintFallback }>;
|
|
548
|
+
const tintArgs: Pick<TintStory, "args" | "argTypes"> = {
|
|
549
|
+
args: { tint: glyphTintFallback },
|
|
550
|
+
argTypes: { tint: { control: "inline-radio", options: ["ink", "system", "accent"] } },
|
|
551
|
+
};
|
|
552
|
+
|
|
542
553
|
/** Clay's SHC Nodes screen (IMG_1925 on FZ-8020): the add and the copy. */
|
|
543
|
-
export const ShcNodesScreen:
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
<
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
<
|
|
559
|
-
|
|
560
|
-
|
|
554
|
+
export const ShcNodesScreen: TintStory = {
|
|
555
|
+
...tintArgs,
|
|
556
|
+
render: ({ tint }) => (
|
|
557
|
+
<GlyphTintFallbackProvider value={tint}>
|
|
558
|
+
<YStack gap="$4" padding="$4" backgroundColor="$background" data-testid="shc-nodes">
|
|
559
|
+
<XStack alignItems="center" gap="$2">
|
|
560
|
+
<Paragraph flex={1} size="$9" fontWeight="700">
|
|
561
|
+
Nodes
|
|
562
|
+
</Paragraph>
|
|
563
|
+
<Button size="$3" {...shcRoundGlyph} icon={PlusIcon} aria-label="Add node" />
|
|
564
|
+
</XStack>
|
|
565
|
+
<XStack alignItems="center" gap="$2">
|
|
566
|
+
<Paragraph fontFamily="$mono">shc node join</Paragraph>
|
|
567
|
+
<Button size="$2" {...shcRoundGlyph} icon={CopyIcon} aria-label="Copy" />
|
|
568
|
+
</XStack>
|
|
569
|
+
<XStack alignItems="center">
|
|
570
|
+
<Paragraph fontFamily="$mono">shc node join</Paragraph>
|
|
571
|
+
<IconButton inline icon={CopyIcon} aria-label="Copy (inline)" />
|
|
572
|
+
</XStack>
|
|
573
|
+
</YStack>
|
|
574
|
+
</GlyphTintFallbackProvider>
|
|
561
575
|
),
|
|
562
576
|
};
|
|
563
577
|
|
|
@@ -568,30 +582,33 @@ const shcUpdatePlate = { circular: true, outlined: true } as const;
|
|
|
568
582
|
* Clay's SHC Updates rows (IMG_1926 on FZ-8020): the plate SHC asks for, its
|
|
569
583
|
* glyph now at the circle ratio, above the bare tinted glyph LC-176 wants.
|
|
570
584
|
*/
|
|
571
|
-
export const ShcUpdateRows:
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
585
|
+
export const ShcUpdateRows: TintStory = {
|
|
586
|
+
...tintArgs,
|
|
587
|
+
render: ({ tint }) => (
|
|
588
|
+
<GlyphTintFallbackProvider value={tint}>
|
|
589
|
+
<YStack gap="$2" padding="$4" backgroundColor="$background" data-testid="shc-update-rows">
|
|
590
|
+
{(["$3", "$4"] as const).map((size) => (
|
|
591
|
+
<XStack key={size} alignItems="center" gap="$3" minHeight="$5">
|
|
592
|
+
<YStack flex={1}>
|
|
593
|
+
<Paragraph fontWeight="600">pokemon</Paragraph>
|
|
594
|
+
<Paragraph color="$color11">1.2.0+34</Paragraph>
|
|
595
|
+
</YStack>
|
|
596
|
+
<Button
|
|
597
|
+
size={size}
|
|
598
|
+
{...shcUpdatePlate}
|
|
599
|
+
icon={ArrowCircleUpIcon}
|
|
600
|
+
aria-label={`Update pokemon (plate ${size})`}
|
|
601
|
+
/>
|
|
602
|
+
</XStack>
|
|
603
|
+
))}
|
|
604
|
+
<XStack alignItems="center" gap="$3" minHeight="$5">
|
|
576
605
|
<YStack flex={1}>
|
|
577
606
|
<Paragraph fontWeight="600">pokemon</Paragraph>
|
|
578
607
|
<Paragraph color="$color11">1.2.0+34</Paragraph>
|
|
579
608
|
</YStack>
|
|
580
|
-
<
|
|
581
|
-
size={size}
|
|
582
|
-
{...shcUpdatePlate}
|
|
583
|
-
icon={ArrowCircleUpIcon}
|
|
584
|
-
aria-label={`Update pokemon (plate ${size})`}
|
|
585
|
-
/>
|
|
609
|
+
<IconButton accentInk icon={ArrowCircleUpIcon} aria-label="Update pokemon" />
|
|
586
610
|
</XStack>
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
<YStack flex={1}>
|
|
590
|
-
<Paragraph fontWeight="600">pokemon</Paragraph>
|
|
591
|
-
<Paragraph color="$color11">1.2.0+34</Paragraph>
|
|
592
|
-
</YStack>
|
|
593
|
-
<IconButton accentInk icon={ArrowCircleUpIcon} aria-label="Update pokemon" />
|
|
594
|
-
</XStack>
|
|
595
|
-
</YStack>
|
|
611
|
+
</YStack>
|
|
612
|
+
</GlyphTintFallbackProvider>
|
|
596
613
|
),
|
|
597
614
|
};
|
|
@@ -29,10 +29,14 @@ vi.mock("./glass", () => ({
|
|
|
29
29
|
|
|
30
30
|
afterEach(() => {
|
|
31
31
|
cleanup();
|
|
32
|
+
vi.unstubAllGlobals();
|
|
32
33
|
glass.available = false;
|
|
33
34
|
glass.containerLoads = 0;
|
|
34
35
|
});
|
|
35
36
|
|
|
37
|
+
const IPHONE =
|
|
38
|
+
"Mozilla/5.0 (iPhone; CPU iPhone OS 26_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1";
|
|
39
|
+
|
|
36
40
|
const houseConfig = createDefaultThemeConfig();
|
|
37
41
|
|
|
38
42
|
function Glyph({ size, weight }: { size?: number; weight?: string }) {
|
|
@@ -48,6 +52,28 @@ function houseRender(ui: ReactElement) {
|
|
|
48
52
|
}
|
|
49
53
|
|
|
50
54
|
describe("LC-176: IconButtonGroup", () => {
|
|
55
|
+
it("on iOS Safari a bar group is one glass capsule, its buttons bare glyphs on it", () => {
|
|
56
|
+
vi.stubGlobal("navigator", { userAgent: IPHONE, platform: "iPhone", maxTouchPoints: 5 });
|
|
57
|
+
glass.available = true;
|
|
58
|
+
houseRender(
|
|
59
|
+
<Surface bar>
|
|
60
|
+
<IconButtonGroup data-testid="group">
|
|
61
|
+
<IconButton icon={Glyph} aria-label="Archive" />
|
|
62
|
+
<IconButton icon={Glyph} aria-label="Delete" />
|
|
63
|
+
</IconButtonGroup>
|
|
64
|
+
<IconButton icon={Glyph} aria-label="Back" />
|
|
65
|
+
</Surface>,
|
|
66
|
+
);
|
|
67
|
+
const group = screen.getByTestId("group");
|
|
68
|
+
expect(group.getAttribute("data-mp-icon-button-group")).toBe("glass");
|
|
69
|
+
expect(group.querySelectorAll('[data-mp-glass="web"]')).toHaveLength(1);
|
|
70
|
+
expect(group.querySelector("[data-glass]")).toBeNull();
|
|
71
|
+
for (const name of ["Archive", "Delete"])
|
|
72
|
+
expect(screen.getByLabelText(name).getAttribute("data-mp-icon-button")).not.toBe("glass");
|
|
73
|
+
// A lone bar button keeps its own circle.
|
|
74
|
+
expect(screen.getByLabelText("Back").querySelector("[data-glass]")).not.toBeNull();
|
|
75
|
+
});
|
|
76
|
+
|
|
51
77
|
it("over media, the group is one capsule and its buttons draw their glyphs alone", () => {
|
|
52
78
|
houseRender(
|
|
53
79
|
<>
|
|
@@ -3,6 +3,7 @@ import { useCallback, 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
|
+
import { isAppleTouchWeb, WebGlassFace } from "./webGlass";
|
|
6
7
|
import { IconButtonGroupContext, IconButtonGroupRegistry } from "./iconButtonGroupContext";
|
|
7
8
|
|
|
8
9
|
/**
|
|
@@ -55,6 +56,44 @@ export function IconButtonGroup({ plate, children, ...rest }: IconButtonGroupPro
|
|
|
55
56
|
</IconButtonGroupContext.Provider>
|
|
56
57
|
);
|
|
57
58
|
}
|
|
59
|
+
if (bar && isWeb && isAppleTouchWeb()) {
|
|
60
|
+
// The caller's layout props stay on the outer row; the capsule hugs the
|
|
61
|
+
// buttons inside it, so a stretched slot never draws a wide empty pill.
|
|
62
|
+
return (
|
|
63
|
+
<IconButtonGroupRegistry.Provider value={register}>
|
|
64
|
+
<IconButtonGroupContext.Provider value="glass">
|
|
65
|
+
<XStack
|
|
66
|
+
alignItems="center"
|
|
67
|
+
data-mp-icon-button-group={members > 0 ? "glass" : "bar"}
|
|
68
|
+
{...rest}
|
|
69
|
+
>
|
|
70
|
+
<XStack
|
|
71
|
+
alignItems="center"
|
|
72
|
+
position="relative"
|
|
73
|
+
zIndex={0}
|
|
74
|
+
paddingHorizontal="$2"
|
|
75
|
+
gap="$1"
|
|
76
|
+
data-mp-glass-capsule=""
|
|
77
|
+
>
|
|
78
|
+
{members > 0 ? (
|
|
79
|
+
<WebGlassFace
|
|
80
|
+
style={{
|
|
81
|
+
position: "absolute",
|
|
82
|
+
top: 0,
|
|
83
|
+
right: 0,
|
|
84
|
+
bottom: 0,
|
|
85
|
+
left: 0,
|
|
86
|
+
borderRadius: 100000,
|
|
87
|
+
}}
|
|
88
|
+
/>
|
|
89
|
+
) : null}
|
|
90
|
+
{children}
|
|
91
|
+
</XStack>
|
|
92
|
+
</XStack>
|
|
93
|
+
</IconButtonGroupContext.Provider>
|
|
94
|
+
</IconButtonGroupRegistry.Provider>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
58
97
|
const GlassView = bar ? loadGlassView() : null;
|
|
59
98
|
const row = (
|
|
60
99
|
<XStack
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vitest-environment jsdom
|
|
3
|
+
*
|
|
4
|
+
* LC-176 / LC-266: on the web only iOS Safari takes the glass face (Clay on
|
|
5
|
+
* rv_3bb3f1f65d6b981f).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { createDefaultThemeConfig } from "@multiplatform.one/theme";
|
|
9
|
+
import { cleanup, render } from "@testing-library/react";
|
|
10
|
+
import { createElement } from "react";
|
|
11
|
+
import { TamaguiProvider } from "tamagui";
|
|
12
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
13
|
+
import { isAppleTouchWeb, loadGlassView } from "./glass";
|
|
14
|
+
|
|
15
|
+
const IPHONE =
|
|
16
|
+
"Mozilla/5.0 (iPhone; CPU iPhone OS 26_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1";
|
|
17
|
+
const MAC_SAFARI =
|
|
18
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15";
|
|
19
|
+
const houseConfig = createDefaultThemeConfig();
|
|
20
|
+
const PIXEL =
|
|
21
|
+
"Mozilla/5.0 (Linux; Android 15; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Mobile Safari/537.36";
|
|
22
|
+
|
|
23
|
+
describe("isAppleTouchWeb", () => {
|
|
24
|
+
it("an iPhone's Safari takes the glass face", () => {
|
|
25
|
+
expect(isAppleTouchWeb({ userAgent: IPHONE, platform: "iPhone", maxTouchPoints: 5 })).toBe(
|
|
26
|
+
true,
|
|
27
|
+
);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("iPadOS reports a Mac with touch, and is iOS", () => {
|
|
31
|
+
expect(
|
|
32
|
+
isAppleTouchWeb({ userAgent: MAC_SAFARI, platform: "MacIntel", maxTouchPoints: 5 }),
|
|
33
|
+
).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("a Mac, an Android phone and no navigator draw the bare glyph", () => {
|
|
37
|
+
expect(
|
|
38
|
+
isAppleTouchWeb({ userAgent: MAC_SAFARI, platform: "MacIntel", maxTouchPoints: 0 }),
|
|
39
|
+
).toBe(false);
|
|
40
|
+
expect(isAppleTouchWeb({ userAgent: PIXEL, platform: "Linux armv8l", maxTouchPoints: 5 })).toBe(
|
|
41
|
+
false,
|
|
42
|
+
);
|
|
43
|
+
expect(isAppleTouchWeb(undefined)).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe("loadGlassView on the web", () => {
|
|
48
|
+
afterEach(() => {
|
|
49
|
+
cleanup();
|
|
50
|
+
vi.unstubAllGlobals();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("iOS Safari's glass circle sits under the glyph it backs", () => {
|
|
54
|
+
vi.stubGlobal("navigator", { userAgent: IPHONE, platform: "iPhone", maxTouchPoints: 5 });
|
|
55
|
+
const Glass = loadGlassView();
|
|
56
|
+
expect(Glass).not.toBeNull();
|
|
57
|
+
const { container } = render(
|
|
58
|
+
createElement(
|
|
59
|
+
TamaguiProvider,
|
|
60
|
+
{ config: houseConfig.tamagui, defaultTheme: "light", disableInjectCSS: true },
|
|
61
|
+
createElement(Glass!, { style: { position: "absolute" } }),
|
|
62
|
+
),
|
|
63
|
+
);
|
|
64
|
+
const face = container.querySelector('[data-mp-glass="web"]') as HTMLElement | null;
|
|
65
|
+
expect(face).not.toBeNull();
|
|
66
|
+
expect(face!.style.zIndex).toBe("-1");
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("every other browser draws the bare glyph", () => {
|
|
70
|
+
vi.stubGlobal("navigator", { userAgent: PIXEL, platform: "Linux armv8l", maxTouchPoints: 5 });
|
|
71
|
+
expect(loadGlassView()).toBeNull();
|
|
72
|
+
});
|
|
73
|
+
});
|
package/src/Button/glass.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ComponentType, ReactNode } from "react";
|
|
2
|
+
import { isAppleTouchWeb, WebGlassFace } from "./webGlass";
|
|
2
3
|
|
|
3
4
|
/** The slice of expo-glass-effect's `GlassView` an icon button draws. */
|
|
4
5
|
export type GlassViewComponent = ComponentType<{
|
|
@@ -15,13 +16,17 @@ export type GlassContainerComponent = ComponentType<{
|
|
|
15
16
|
children?: ReactNode;
|
|
16
17
|
}>;
|
|
17
18
|
|
|
19
|
+
export { isAppleTouchWeb } from "./webGlass";
|
|
20
|
+
|
|
18
21
|
/**
|
|
19
22
|
* LC-176: the iOS 26 Liquid Glass material an icon button floats on in a bar.
|
|
20
|
-
*
|
|
21
|
-
*
|
|
23
|
+
* Native iOS draws it from expo-glass-effect (`glass.native.ts`; Android
|
|
24
|
+
* probes null). On the web only iOS Safari takes the glass face (Clay on
|
|
25
|
+
* rv_3bb3f1f65d6b981f: "Is there a way to have the buttons at the bottom be
|
|
26
|
+
* liquid glass if it's an iPhone"); every other browser draws the bare glyph.
|
|
22
27
|
*/
|
|
23
28
|
export function loadGlassView(): GlassViewComponent | null {
|
|
24
|
-
return null;
|
|
29
|
+
return isAppleTouchWeb() ? (WebGlassFace as GlassViewComponent) : null;
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
/**
|
|
@@ -4,7 +4,8 @@ const useIsomorphicLayoutEffect = typeof window === "undefined" ? useEffect : us
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* LC-176: the ground an `IconButtonGroup` paints under its buttons. `media`
|
|
7
|
-
* is one shared material capsule and `glass` one shared
|
|
7
|
+
* is one shared material capsule and `glass` one shared glass capsule (Liquid
|
|
8
|
+
* Glass on iOS 26, its web twin in iOS Safari),
|
|
8
9
|
* so a button inside draws its bare glyph instead of its own circle.
|
|
9
10
|
*/
|
|
10
11
|
export type IconButtonGroupGround = "media" | "glass" | null;
|
package/src/Button/index.tsx
CHANGED
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
ensureKeyboardModalityTracking,
|
|
35
35
|
useBarSurface,
|
|
36
36
|
useElevatedSurface,
|
|
37
|
-
|
|
37
|
+
useGlyphTintOnSurface,
|
|
38
38
|
useResolvedKnobs,
|
|
39
39
|
useTouchSurface,
|
|
40
40
|
type ControlTier,
|
|
@@ -443,22 +443,45 @@ export function iconButtonGlyphPx(rowLinePx: number | undefined): number {
|
|
|
443
443
|
/** LC-176: an inline glyph is the text's size; Phosphor's 256 grid pads ~12%. */
|
|
444
444
|
const INLINE_GLYPH_RATIO = 1.2;
|
|
445
445
|
|
|
446
|
+
/**
|
|
447
|
+
* LC-176: Phosphor bold's stem is 0.12 of its ink, an SF Symbols bold plus's
|
|
448
|
+
* 0.18 (measured at 17 and 24pt). An outline stroke this wide, in the 256-unit
|
|
449
|
+
* grid, brings a bold glyph to SF semibold-bold (0.154); a wider one closes
|
|
450
|
+
* Phosphor bold's 16-unit counters (the trash lid, copy's overlap).
|
|
451
|
+
*/
|
|
452
|
+
export const GLYPH_BOLD_STROKE_UNITS = 8;
|
|
453
|
+
|
|
454
|
+
function boldStroke(weight: "regular" | "bold", color = "currentColor") {
|
|
455
|
+
return weight === "bold"
|
|
456
|
+
? {
|
|
457
|
+
stroke: color,
|
|
458
|
+
strokeWidth: GLYPH_BOLD_STROKE_UNITS,
|
|
459
|
+
strokeLinejoin: "round" as const,
|
|
460
|
+
}
|
|
461
|
+
: undefined;
|
|
462
|
+
}
|
|
463
|
+
|
|
446
464
|
function withGlyphWeight(
|
|
447
465
|
icon: IconLike | undefined,
|
|
448
466
|
size: number,
|
|
449
467
|
weight: "regular" | "bold",
|
|
468
|
+
floor = false,
|
|
450
469
|
): IconLike | undefined {
|
|
451
470
|
if (icon == null || icon === false) return icon;
|
|
452
|
-
if (isValidElement<{ size?: number; weight?: string }>(icon)) {
|
|
471
|
+
if (isValidElement<{ size?: number; weight?: string; color?: string }>(icon)) {
|
|
472
|
+
const resolved = (icon.props.weight ?? weight) as "regular" | "bold";
|
|
473
|
+
const own = icon.props.size;
|
|
453
474
|
return cloneElement(icon, {
|
|
454
|
-
...(
|
|
475
|
+
...(own == null || (floor && typeof own === "number" && own < size) ? { size } : undefined),
|
|
455
476
|
...(icon.props.weight == null ? { weight } : undefined),
|
|
477
|
+
...boldStroke(resolved, icon.props.color),
|
|
456
478
|
});
|
|
457
479
|
}
|
|
458
480
|
if (typeof icon === "function" || (typeof icon === "object" && "$$typeof" in icon)) {
|
|
459
481
|
return createElement(icon as ComponentType<{ size?: number; weight?: string }>, {
|
|
460
482
|
size,
|
|
461
483
|
weight,
|
|
484
|
+
...boldStroke(weight),
|
|
462
485
|
});
|
|
463
486
|
}
|
|
464
487
|
return icon;
|
|
@@ -568,7 +591,7 @@ export function Button({
|
|
|
568
591
|
const parentScopeTheme = useTheme();
|
|
569
592
|
const pageOutlineColor = parentScopeTheme.outlineColor?.val as string | undefined;
|
|
570
593
|
const hostAccentInk = useAccentOnSurface();
|
|
571
|
-
const
|
|
594
|
+
const glyphTint = useGlyphTintOnSurface();
|
|
572
595
|
const grouped = useControlGrouped();
|
|
573
596
|
// LC-176 ICON-BUTTON: with no label, the button is its glyph. It paints no
|
|
574
597
|
// plate at rest and takes the bar tint, unless the caller asked for a frame
|
|
@@ -693,7 +716,7 @@ export function Button({
|
|
|
693
716
|
// Accent and intent buttons, chromeless, and grouped segments keep their
|
|
694
717
|
// own contracts.
|
|
695
718
|
const tier: ControlTier | undefined =
|
|
696
|
-
activeThemeName || chromeless || grouped
|
|
719
|
+
activeThemeName || chromeless || grouped || mediaPlate
|
|
697
720
|
? undefined
|
|
698
721
|
: barSurface
|
|
699
722
|
? "plain"
|
|
@@ -806,7 +829,13 @@ export function Button({
|
|
|
806
829
|
// The media plate is its own state ground; a toggle over media shows its
|
|
807
830
|
// state in the glyph.
|
|
808
831
|
const selectedFill = Boolean(isSelected) && !unavailable && !mediaPlate;
|
|
809
|
-
|
|
832
|
+
// A glyph alone holds 3:1; beside a label both take the label's AA tint.
|
|
833
|
+
const barInk =
|
|
834
|
+
accentInk && chromeless && !selectedFill && !unavailable
|
|
835
|
+
? labelled
|
|
836
|
+
? glyphTint.label
|
|
837
|
+
: glyphTint.glyph
|
|
838
|
+
: null;
|
|
810
839
|
const inlineGlyph = iconButton && inline === true && !nested;
|
|
811
840
|
// LC-176: back's caret beside its label is a bar glyph too, and so is the
|
|
812
841
|
// glyph on a plate (media, or the overlay's confirm).
|
|
@@ -824,6 +853,17 @@ export function Button({
|
|
|
824
853
|
? loadGlassView()
|
|
825
854
|
: null;
|
|
826
855
|
const framedCircle = iconOnly && Boolean(circular) && !nested && !mediaPlate && !confirmPlate;
|
|
856
|
+
// LC-176: a glyph on a plate takes the plate's on-colour at full strength,
|
|
857
|
+
// never the frame's quieter default: white on the media material, the text
|
|
858
|
+
// colour on a neutral circle.
|
|
859
|
+
const plateInk =
|
|
860
|
+
unavailable || barInk || outlinedInk
|
|
861
|
+
? undefined
|
|
862
|
+
: mediaPlate || (iconButton && groupGround === "media")
|
|
863
|
+
? "$color12"
|
|
864
|
+
: framedCircle && !activeThemeName
|
|
865
|
+
? hostScoped({ color: "$color12" }).color
|
|
866
|
+
: undefined;
|
|
827
867
|
const framedCirclePx =
|
|
828
868
|
touch && typeof sizeProp !== "number"
|
|
829
869
|
? Math.max(sizeTokenPx(resolvedSize), MIN_PRESS_TARGET)
|
|
@@ -837,13 +877,22 @@ export function Button({
|
|
|
837
877
|
: barGlyph
|
|
838
878
|
? touch
|
|
839
879
|
? Math.max(glyphFloor, resolveButtonSizeRecipe("$6", recipeFamily, touch).iconSize)
|
|
840
|
-
:
|
|
841
|
-
//
|
|
842
|
-
|
|
880
|
+
: iconButton
|
|
881
|
+
? // A bare glyph has no plate to inset from, so it takes its box
|
|
882
|
+
// less a 2pt optical margin, up to the row's glyph: the SHC
|
|
883
|
+
// "+" at $3 reaches the bar's glyph, a $2 copy beside mono
|
|
884
|
+
// text stays in proportion.
|
|
885
|
+
Math.max(recipe.iconSize, Math.min(glyphFloor, recipe.height - 4))
|
|
886
|
+
: // A pointer toolbar keeps its token box (LC-54); the glyph fills
|
|
887
|
+
// it up to the same floor.
|
|
888
|
+
Math.max(recipe.iconSize, Math.min(glyphFloor, recipe.height - 8))
|
|
843
889
|
: recipe.iconSize;
|
|
890
|
+
// LC-176: a bar glyph is never smaller than its row, whatever px the caller
|
|
891
|
+
// passed (the DataTable toolbar's 14pt token icons).
|
|
892
|
+
const barGlyphFloor = barGlyph && !framedCircle && !inlineGlyph && !nested;
|
|
844
893
|
const glyph =
|
|
845
894
|
barGlyph || inlineGlyph || framedCircle
|
|
846
|
-
? withGlyphWeight(icon, iconSize, resolvedGlyphWeight)
|
|
895
|
+
? withGlyphWeight(icon, iconSize, resolvedGlyphWeight, barGlyphFloor)
|
|
847
896
|
: icon;
|
|
848
897
|
|
|
849
898
|
// LC-158: the frame keeps its recipe height under Dynamic Type, so the
|
|
@@ -908,6 +957,7 @@ export function Button({
|
|
|
908
957
|
props.color ??
|
|
909
958
|
(unavailable ? disabledText.color : undefined) ??
|
|
910
959
|
barInk ??
|
|
960
|
+
plateInk ??
|
|
911
961
|
(textColor
|
|
912
962
|
? outlinedOnHost
|
|
913
963
|
? hostScoped({ color: textColor }).color
|
|
@@ -929,7 +979,7 @@ export function Button({
|
|
|
929
979
|
) : null;
|
|
930
980
|
const glyphAfter =
|
|
931
981
|
iconAfter && (barGlyph || inlineGlyph || framedCircle)
|
|
932
|
-
? withGlyphWeight(iconAfter, iconSize, resolvedGlyphWeight)
|
|
982
|
+
? withGlyphWeight(iconAfter, iconSize, resolvedGlyphWeight, barGlyphFloor)
|
|
933
983
|
: iconAfter;
|
|
934
984
|
const iconAfterElement = glyphAfter ? (
|
|
935
985
|
<View flexShrink={0}>
|
|
@@ -1094,6 +1144,10 @@ export function Button({
|
|
|
1094
1144
|
{...(inlineGlyph ? { marginInlineStart: "$2" as const } : undefined)}
|
|
1095
1145
|
// The glass rounds itself, unclipped.
|
|
1096
1146
|
{...(GlassView ? { borderRadius: 100000 } : undefined)}
|
|
1147
|
+
// On the web the absolute glass circle needs its button as the
|
|
1148
|
+
// containing block and stacking context, or it fills the page and
|
|
1149
|
+
// paints over the glyph.
|
|
1150
|
+
{...(GlassView && isWeb ? { position: "relative" as const, zIndex: 0 } : undefined)}
|
|
1097
1151
|
{...(confirmPlate ? { borderRadius: 100000 } : undefined)}
|
|
1098
1152
|
{...(mediaPlate
|
|
1099
1153
|
? {
|
|
@@ -1113,6 +1167,7 @@ export function Button({
|
|
|
1113
1167
|
// text/icon color (currentColor) to the hue's readable text tier.
|
|
1114
1168
|
{...(outlinedInk ? { color: outlinedInk } : undefined)}
|
|
1115
1169
|
{...(barInk ? { color: barInk } : undefined)}
|
|
1170
|
+
{...(plateInk ? { color: plateInk } : undefined)}
|
|
1116
1171
|
// LC-40 DISABLED-VISIBLE: keepLabel washes the chrome (muted fill/
|
|
1117
1172
|
// border) while label/glyphs re-anchor to the lowest AA text tier
|
|
1118
1173
|
// (`color` inherits into currentColor icons); dimWhole dims the
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { isDarkThemeName } from "@multiplatform.one/theme";
|
|
2
|
+
import { createElement } from "react";
|
|
3
|
+
import { useThemeName, YStack } from "tamagui";
|
|
4
|
+
import { MEDIA_PLATE_WEB_STYLE } from "./mediaPlate";
|
|
5
|
+
|
|
6
|
+
type GlassNavigator = { userAgent?: string; platform?: string; maxTouchPoints?: number };
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* LC-266: iOS Safari, iPadOS included (it reports itself as a Mac with a
|
|
10
|
+
* touch screen). The one place web asks which platform it is on, so an iPhone
|
|
11
|
+
* user gets the iPhone's bar buttons in the browser too.
|
|
12
|
+
*/
|
|
13
|
+
export function isAppleTouchWeb(
|
|
14
|
+
nav: GlassNavigator | undefined = typeof navigator === "undefined" ? undefined : navigator,
|
|
15
|
+
): boolean {
|
|
16
|
+
if (!nav) return false;
|
|
17
|
+
if (/iPhone|iPad|iPod/.test(nav.userAgent ?? "")) return true;
|
|
18
|
+
return /Mac/.test(nav.platform ?? nav.userAgent ?? "") && (nav.maxTouchPoints ?? 0) > 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const webGlassMarker = { "data-mp-glass": "web" };
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* LC-176: the Liquid Glass face iOS Safari draws under a bar's icon buttons,
|
|
25
|
+
* one circle for a lone button or one capsule for an `IconButtonGroup`. It is
|
|
26
|
+
* a layer under the glyphs (absolute, z -1 in the button's stacking context):
|
|
27
|
+
* a near-white material in light and a raised grey in dark, edged by a soft
|
|
28
|
+
* drop shadow alone, with the media plate's blur.
|
|
29
|
+
*/
|
|
30
|
+
export function WebGlassFace({ style }: { style?: unknown }) {
|
|
31
|
+
const dark = isDarkThemeName(useThemeName());
|
|
32
|
+
return createElement(YStack, {
|
|
33
|
+
pointerEvents: "none",
|
|
34
|
+
backgroundColor: dark ? "$color4" : "$color1",
|
|
35
|
+
opacity: 0.92,
|
|
36
|
+
shadowColor: "$shadowColor",
|
|
37
|
+
shadowRadius: 10,
|
|
38
|
+
shadowOffset: { width: 0, height: 3 },
|
|
39
|
+
...webGlassMarker,
|
|
40
|
+
style: { ...(style as object), zIndex: -1, ...MEDIA_PLATE_WEB_STYLE },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
@@ -80,6 +80,14 @@ describe("FileUpload", () => {
|
|
|
80
80
|
expect(result.container.textContent).not.toContain("Choose File");
|
|
81
81
|
expect(result.container.textContent).not.toContain("Drag a file");
|
|
82
82
|
expect(result.container.querySelector('[data-file-upload="preview"] img')).toBeTruthy();
|
|
83
|
+
// FZ-8020 r4: the capsule floats inside the visible tile's top-trailing
|
|
84
|
+
// corner, as Photos does, never over empty dropzone.
|
|
85
|
+
const tile = result.container.querySelector('[data-file-upload="preview-tile"]');
|
|
86
|
+
expect(tile?.querySelector("img")).toBeTruthy();
|
|
87
|
+
expect(tile?.contains(actions!)).toBe(true);
|
|
88
|
+
// Round 4's critique: a $color3 tile read 1.06:1 on the page in dark, so
|
|
89
|
+
// the corner the capsule anchors to was invisible.
|
|
90
|
+
expect(tile?.className).toMatch(/_bg-color5/);
|
|
83
91
|
fireEvent.click(result.getButton("Remove sprite.png")!);
|
|
84
92
|
expect(remove).toHaveBeenCalledTimes(1);
|
|
85
93
|
});
|
|
@@ -1065,13 +1065,21 @@ export function FileUpload<
|
|
|
1065
1065
|
width="100%"
|
|
1066
1066
|
>
|
|
1067
1067
|
{singlePreview ? (
|
|
1068
|
-
<YStack
|
|
1068
|
+
<YStack
|
|
1069
|
+
data-file-upload="preview-tile"
|
|
1070
|
+
position="relative"
|
|
1071
|
+
width="$14"
|
|
1072
|
+
height="$14"
|
|
1073
|
+
maxWidth="100%"
|
|
1074
|
+
borderRadius={cappedRadius}
|
|
1075
|
+
overflow="hidden"
|
|
1076
|
+
backgroundColor="$color5"
|
|
1077
|
+
>
|
|
1069
1078
|
<Image
|
|
1070
1079
|
src={singlePreview}
|
|
1071
1080
|
alt={singleFile?.name ?? existingName}
|
|
1072
|
-
width="
|
|
1073
|
-
height="
|
|
1074
|
-
maxWidth="100%"
|
|
1081
|
+
width="100%"
|
|
1082
|
+
height="100%"
|
|
1075
1083
|
objectFit="contain"
|
|
1076
1084
|
onLoad={(event) => {
|
|
1077
1085
|
if (!isWeb) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconButtonGroup.d.ts","sourceRoot":"","sources":["../../src/Button/IconButtonGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"IconButtonGroup.d.ts","sourceRoot":"","sources":["../../src/Button/IconButtonGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAMvE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACvD,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,oBAAoB,2CA0GjF"}
|
package/types/Button/glass.d.ts
CHANGED
|
@@ -12,10 +12,13 @@ export type GlassContainerComponent = ComponentType<{
|
|
|
12
12
|
style?: unknown;
|
|
13
13
|
children?: ReactNode;
|
|
14
14
|
}>;
|
|
15
|
+
export { isAppleTouchWeb } from "./webGlass";
|
|
15
16
|
/**
|
|
16
17
|
* LC-176: the iOS 26 Liquid Glass material an icon button floats on in a bar.
|
|
17
|
-
*
|
|
18
|
-
*
|
|
18
|
+
* Native iOS draws it from expo-glass-effect (`glass.native.ts`; Android
|
|
19
|
+
* probes null). On the web only iOS Safari takes the glass face (Clay on
|
|
20
|
+
* rv_3bb3f1f65d6b981f: "Is there a way to have the buttons at the bottom be
|
|
21
|
+
* liquid glass if it's an iPhone"); every other browser draws the bare glyph.
|
|
19
22
|
*/
|
|
20
23
|
export declare function loadGlassView(): GlassViewComponent | null;
|
|
21
24
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glass.d.ts","sourceRoot":"","sources":["../../src/Button/glass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"glass.d.ts","sourceRoot":"","sources":["../../src/Button/glass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtD,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;CAC3D,CAAC,CAAC;AAEH,oFAAoF;AACpF,MAAM,MAAM,uBAAuB,GAAG,aAAa,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,uBAAuB,GAAG,IAAI,CAEnE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* LC-176: the ground an `IconButtonGroup` paints under its buttons. `media`
|
|
3
|
-
* is one shared material capsule and `glass` one shared
|
|
3
|
+
* is one shared material capsule and `glass` one shared glass capsule (Liquid
|
|
4
|
+
* Glass on iOS 26, its web twin in iOS Safari),
|
|
4
5
|
* so a button inside draws its bare glyph instead of its own circle.
|
|
5
6
|
*/
|
|
6
7
|
export type IconButtonGroupGround = "media" | "glass" | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iconButtonGroupContext.d.ts","sourceRoot":"","sources":["../../src/Button/iconButtonGroupContext.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"iconButtonGroupContext.d.ts","sourceRoot":"","sources":["../../src/Button/iconButtonGroupContext.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7D,eAAO,MAAM,sBAAsB,gDAA6C,CAAC;AAEjF,wBAAgB,wBAAwB,IAAI,qBAAqB,CAEhE;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,iCAAwB,MAAM,IAAI,SAAe,CAAC;AAEtF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAMhE"}
|
package/types/Button/index.d.ts
CHANGED
|
@@ -173,6 +173,13 @@ export declare const ICON_BUTTON_NEUTRAL_GLYPH_PX = 24;
|
|
|
173
173
|
* target.
|
|
174
174
|
*/
|
|
175
175
|
export declare function iconButtonGlyphPx(rowLinePx: number | undefined): number;
|
|
176
|
+
/**
|
|
177
|
+
* LC-176: Phosphor bold's stem is 0.12 of its ink, an SF Symbols bold plus's
|
|
178
|
+
* 0.18 (measured at 17 and 24pt). An outline stroke this wide, in the 256-unit
|
|
179
|
+
* grid, brings a bold glyph to SF semibold-bold (0.154); a wider one closes
|
|
180
|
+
* Phosphor bold's 16-unit counters (the trash lid, copy's overlap).
|
|
181
|
+
*/
|
|
182
|
+
export declare const GLYPH_BOLD_STROKE_UNITS = 8;
|
|
176
183
|
export declare function Button({ children, action, form: formProp, loading, accent, error, warning, success, skeleton, outlined, disabled, theme, onPress, onKeyDown, tabIndex, icon, iconAfter, selected, nested, circular: circularProp, chromeless, edge, accentInk, plate, inline, glyphWeight, verb, noun, actionRole, disabledReason, disabledReasonPlacement, sizeRecipeEscape, recipeFamily, height: heightProp, paddingHorizontal: paddingHorizontalProp, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
177
184
|
export declare namespace Button {
|
|
178
185
|
var Icon: (props: {
|