@multiplatform.one/forms 7.54.1 → 7.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/AdaptivePopup/index.native.js +1 -1
- package/dist/cjs/AdaptivePopup/index.native.js.map +1 -1
- package/dist/cjs/Button/index.cjs +10 -1
- package/dist/cjs/Button/index.native.js +15 -6
- package/dist/cjs/Button/index.native.js.map +1 -1
- package/dist/cjs/Chip/index.native.js.map +1 -1
- package/dist/cjs/ContextualSaveBar/UnsavedChangesDialog.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.cjs +216 -54
- package/dist/cjs/DescriptionList/index.native.js +228 -59
- package/dist/cjs/DescriptionList/index.native.js.map +1 -1
- package/dist/cjs/ErrorSummary.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/editMode.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/formatters.native.js.map +1 -1
- package/dist/cjs/FieldDisplay/index.cjs +8 -2
- package/dist/cjs/FieldDisplay/index.native.js +9 -3
- package/dist/cjs/FieldDisplay/index.native.js.map +1 -1
- package/dist/cjs/FieldGroup.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/nestedAction.native.js.map +1 -1
- package/dist/cjs/FloatingPanel/pointAnchor.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/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/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.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.cjs +7 -2
- package/dist/cjs/fields/Progress/index.native.js +8 -3
- package/dist/cjs/fields/Progress/index.native.js.map +1 -1
- package/dist/cjs/fields/RadioGroup/index.native.js +1 -1
- package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
- package/dist/cjs/fields/Rating/index.native.js +1 -1
- package/dist/cjs/fields/Rating/index.native.js.map +1 -1
- package/dist/cjs/fields/Rating/ratingMath.native.js.map +1 -1
- package/dist/cjs/fields/Rating/types.native.js.map +1 -1
- package/dist/cjs/fields/SearchInput/index.native.js +2 -2
- package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
- package/dist/cjs/fields/Select/index.native.js +4 -4
- package/dist/cjs/fields/Select/index.native.js.map +1 -1
- package/dist/cjs/fields/Signature/index.native.js +2 -2
- package/dist/cjs/fields/Signature/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/index.native.js +1 -1
- package/dist/cjs/fields/Slider/index.native.js.map +1 -1
- package/dist/cjs/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/cjs/fields/Stepper/index.native.js +2 -2
- package/dist/cjs/fields/Stepper/index.native.js.map +1 -1
- package/dist/cjs/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
- package/dist/cjs/fields/Switch/footprint.native.js.map +1 -1
- package/dist/cjs/fields/Switch/index.cjs +13 -0
- package/dist/cjs/fields/Switch/index.native.js +15 -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.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/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/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/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/t.native.js.map +1 -1
- package/dist/cjs/shared/tableCellContext.native.js.map +1 -1
- package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
- package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/cjs/shared/useSheetEscapeDismiss.native.js.map +1 -1
- package/dist/cjs/shared/useWheelIncrement.native.js.map +1 -1
- package/dist/cjs/shared/utils.native.js +1 -1
- package/dist/cjs/shared/utils.native.js.map +1 -1
- package/dist/cjs/shared/zIndex.native.js.map +1 -1
- package/dist/cjs/themedPrimitives.native.js.map +1 -1
- package/dist/cjs/types.native.js.map +1 -1
- package/dist/cjs/utils/LinkCell.native.js.map +1 -1
- package/dist/esm/AdaptivePopup/index.native.js.map +1 -1
- package/dist/esm/Button/index.mjs +11 -2
- package/dist/esm/Button/index.mjs.map +1 -1
- package/dist/esm/Button/index.native.js +14 -5
- package/dist/esm/Button/index.native.js.map +1 -1
- package/dist/esm/Chip/index.native.js.map +1 -1
- package/dist/esm/ContextualSaveBar/UnsavedChangesDialog.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.mjs +217 -56
- package/dist/esm/DescriptionList/index.mjs.map +1 -1
- package/dist/esm/DescriptionList/index.native.js +227 -59
- package/dist/esm/DescriptionList/index.native.js.map +1 -1
- package/dist/esm/ErrorSummary.native.js.map +1 -1
- package/dist/esm/FieldDisplay/editMode.native.js.map +1 -1
- package/dist/esm/FieldDisplay/formatters.native.js.map +1 -1
- package/dist/esm/FieldDisplay/index.mjs +8 -2
- package/dist/esm/FieldDisplay/index.mjs.map +1 -1
- package/dist/esm/FieldDisplay/index.native.js +8 -2
- package/dist/esm/FieldDisplay/index.native.js.map +1 -1
- package/dist/esm/FieldGroup.native.js.map +1 -1
- package/dist/esm/FloatingPanel/nestedAction.native.js.map +1 -1
- package/dist/esm/FloatingPanel/pointAnchor.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/index.native.js.map +1 -1
- package/dist/esm/fields/ColorPicker/parts.native.js.map +1 -1
- package/dist/esm/fields/Combobox/authorOptions.native.js.map +1 -1
- package/dist/esm/fields/Combobox/index.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DateRangePicker.native.js.map +1 -1
- package/dist/esm/fields/DatePicker/DatetimePicker.catalog.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.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.mjs +8 -3
- package/dist/esm/fields/Progress/index.mjs.map +1 -1
- package/dist/esm/fields/Progress/index.native.js +8 -3
- 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/index.native.js.map +1 -1
- package/dist/esm/fields/Signature/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/index.native.js.map +1 -1
- package/dist/esm/fields/Slider/jumpMotion.native.js.map +1 -1
- package/dist/esm/fields/Stepper/index.native.js.map +1 -1
- package/dist/esm/fields/Stepper/resolveStepperPlacement.native.js.map +1 -1
- package/dist/esm/fields/Switch/footprint.native.js.map +1 -1
- package/dist/esm/fields/Switch/index.mjs +13 -0
- package/dist/esm/fields/Switch/index.mjs.map +1 -1
- package/dist/esm/fields/Switch/index.native.js +13 -0
- 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/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/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/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/t.native.js.map +1 -1
- package/dist/esm/shared/tableCellContext.native.js.map +1 -1
- package/dist/esm/shared/useDragScroll.native.js.map +1 -1
- package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
- package/dist/esm/shared/useSheetEscapeDismiss.native.js.map +1 -1
- package/dist/esm/shared/useWheelIncrement.native.js.map +1 -1
- package/dist/esm/shared/utils.native.js.map +1 -1
- package/dist/esm/shared/zIndex.native.js.map +1 -1
- package/dist/esm/themedPrimitives.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/index.mjs +11 -2
- package/dist/jsx/Button/index.mjs.map +1 -1
- package/dist/jsx/Button/index.native.js +13 -4
- package/dist/jsx/Button/index.native.js.map +1 -1
- package/dist/jsx/DescriptionList/index.mjs +217 -56
- package/dist/jsx/DescriptionList/index.mjs.map +1 -1
- package/dist/jsx/DescriptionList/index.native.js +226 -57
- package/dist/jsx/DescriptionList/index.native.js.map +1 -1
- package/dist/jsx/FieldDisplay/index.mjs +8 -2
- package/dist/jsx/FieldDisplay/index.mjs.map +1 -1
- package/dist/jsx/FieldDisplay/index.native.js +8 -2
- package/dist/jsx/FieldDisplay/index.native.js.map +1 -1
- package/dist/jsx/fields/Progress/index.mjs +8 -3
- package/dist/jsx/fields/Progress/index.mjs.map +1 -1
- package/dist/jsx/fields/Progress/index.native.js +7 -2
- package/dist/jsx/fields/Progress/index.native.js.map +1 -1
- package/dist/jsx/fields/Switch/index.mjs +13 -0
- package/dist/jsx/fields/Switch/index.mjs.map +1 -1
- package/dist/jsx/fields/Switch/index.native.js +13 -0
- package/dist/jsx/fields/Switch/index.native.js.map +1 -1
- package/dist/jsx/index.native.js.map +1 -1
- package/package.json +8 -8
- package/src/Button/Button.accentInk.spec.tsx +135 -0
- package/src/Button/index.tsx +14 -0
- package/src/DescriptionList/DescriptionList.secondaryInk.spec.tsx +49 -0
- package/src/DescriptionList/DescriptionList.spec.tsx +87 -1
- package/src/DescriptionList/index.tsx +235 -81
- package/src/FieldDisplay/index.tsx +4 -2
- package/src/fields/Progress/Progress.spec.tsx +21 -0
- package/src/fields/Progress/index.tsx +18 -3
- package/src/fields/Switch/Switch.spec.tsx +21 -0
- package/src/fields/Switch/index.tsx +20 -0
- package/types/Button/index.d.ts +8 -1
- package/types/Button/index.d.ts.map +1 -1
- package/types/DescriptionList/index.d.ts +27 -4
- package/types/DescriptionList/index.d.ts.map +1 -1
- package/types/FieldDisplay/index.d.ts.map +1 -1
- package/types/fields/Progress/index.d.ts.map +1 -1
- package/types/fields/Switch/index.d.ts +7 -1
- package/types/fields/Switch/index.d.ts.map +1 -1
|
@@ -8,7 +8,7 @@ import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
|
8
8
|
import { Preset } from "@multiplatform.one/theme";
|
|
9
9
|
import { FORM_GRID_COLLAPSE_WIDTH } from "../FormGrid";
|
|
10
10
|
import { EMPTY, formatDateText, formatNumericText } from "../FieldDisplay/formatters";
|
|
11
|
-
import { DescriptionList, PropertyList } from "./index";
|
|
11
|
+
import { DescriptionList, PropertyList, middleSplit } from "./index";
|
|
12
12
|
|
|
13
13
|
afterEach(() => {
|
|
14
14
|
vi.unstubAllGlobals();
|
|
@@ -278,3 +278,89 @@ describe("DescriptionList", () => {
|
|
|
278
278
|
expect(root?.querySelectorAll("[data-mpo-description-list-row]").length).toBe(1);
|
|
279
279
|
});
|
|
280
280
|
});
|
|
281
|
+
|
|
282
|
+
describe("DescriptionList hierarchy (LC-169)", () => {
|
|
283
|
+
const issuer = "https://91-98-47-56.sslip.io/auth/realms/master";
|
|
284
|
+
|
|
285
|
+
it("middleSplit keeps the last path segments that fit, or the last 12 characters", () => {
|
|
286
|
+
expect(middleSplit(issuer)).toEqual(["https://91-98-47-56.sslip.io", "/auth/realms/master"]);
|
|
287
|
+
expect(middleSplit("master")).toEqual(["master", ""]);
|
|
288
|
+
const digest = "sha256:9f2c41a7e0b3d5c8a1f4e6b2c9d0";
|
|
289
|
+
const [head, tail] = middleSplit(digest);
|
|
290
|
+
expect(tail).toHaveLength(12);
|
|
291
|
+
expect(head + tail).toBe(digest);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it("an identifier row is mono, one line, cut in the middle, with copy", () => {
|
|
295
|
+
const result = renderWithProviders(
|
|
296
|
+
<DescriptionList
|
|
297
|
+
placement="top"
|
|
298
|
+
items={[{ term: "Issuer", value: issuer, identifier: true }]}
|
|
299
|
+
/>,
|
|
300
|
+
);
|
|
301
|
+
const row = result.container.querySelector(
|
|
302
|
+
"[data-mpo-description-list-identifier]",
|
|
303
|
+
) as HTMLElement;
|
|
304
|
+
expect(row).not.toBeNull();
|
|
305
|
+
expect(row.textContent).toContain(issuer);
|
|
306
|
+
const parts = Array.from(row.querySelectorAll("span")).filter((node) =>
|
|
307
|
+
["https://91-98-47-56.sslip.io", "/auth/realms/master"].includes(node.textContent ?? ""),
|
|
308
|
+
);
|
|
309
|
+
expect(parts).toHaveLength(2);
|
|
310
|
+
expect(result.getByLabelText("Copy to clipboard")).toBeTruthy();
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
it("the term is the label role, a size under the value's body", () => {
|
|
314
|
+
const result = renderWithProviders(
|
|
315
|
+
<DescriptionList placement="top" items={[{ term: "Realm", value: "master" }]} />,
|
|
316
|
+
);
|
|
317
|
+
const term = result.container.querySelector("[data-mpo-description-list-term]") as HTMLElement;
|
|
318
|
+
const value = result.container.querySelector(
|
|
319
|
+
"[data-mpo-description-list-value]",
|
|
320
|
+
) as HTMLElement;
|
|
321
|
+
const size = (el: Element) =>
|
|
322
|
+
String((el as HTMLElement).className)
|
|
323
|
+
.split(" ")
|
|
324
|
+
.filter((c) => c.startsWith("_fos-"));
|
|
325
|
+
const valueText = value.querySelector("span, div[class*='_fos-']") ?? value;
|
|
326
|
+
expect(size(term)).not.toEqual(size(valueText));
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
it("inline: glyph and label lead, the value trails on the same line, an identifier still stacks", () => {
|
|
330
|
+
const result = renderWithProviders(
|
|
331
|
+
<DescriptionList
|
|
332
|
+
placement="inline"
|
|
333
|
+
items={[
|
|
334
|
+
{ term: "Realm", value: "master", icon: <span data-testid="glyph" /> },
|
|
335
|
+
{
|
|
336
|
+
term: "Issuer",
|
|
337
|
+
value: "https://91-98-47-56.sslip.io/auth/realms/master",
|
|
338
|
+
identifier: true,
|
|
339
|
+
},
|
|
340
|
+
]}
|
|
341
|
+
/>,
|
|
342
|
+
);
|
|
343
|
+
const list = result.container.querySelector("[data-mpo-description-list]") as HTMLElement;
|
|
344
|
+
expect(list.getAttribute("data-placement")).toBe("inline");
|
|
345
|
+
const [realmRow, issuerRow] = Array.from(
|
|
346
|
+
result.container.querySelectorAll("[data-mpo-description-list-row]"),
|
|
347
|
+
) as HTMLElement[];
|
|
348
|
+
const realmTerm = realmRow.querySelector("[data-mpo-description-list-term]") as HTMLElement;
|
|
349
|
+
const realmValue = realmRow.querySelector("[data-mpo-description-list-value]") as HTMLElement;
|
|
350
|
+
const line = realmTerm.closest("[class*='_fd-row']") as HTMLElement;
|
|
351
|
+
expect(line).not.toBeNull();
|
|
352
|
+
expect(line.contains(realmValue) || realmRow.contains(realmValue)).toBe(true);
|
|
353
|
+
expect(result.getByTestId("glyph")).toBeTruthy();
|
|
354
|
+
// The inline label takes its value's size and differs from it by ink.
|
|
355
|
+
const fontSize = (el: Element) => String(el.className).match(/_fos-\S+/)?.[0];
|
|
356
|
+
const valueText = realmValue.querySelector(
|
|
357
|
+
"[data-component='FieldDisplay'] [class*='_fos-']",
|
|
358
|
+
) as HTMLElement;
|
|
359
|
+
expect(fontSize(realmTerm)).toBeDefined();
|
|
360
|
+
expect(fontSize(realmTerm)).toEqual(fontSize(valueText));
|
|
361
|
+
// The value trails: its frame packs to the end of the line.
|
|
362
|
+
const frame = realmValue.querySelector("[data-component='FieldDisplay']") as HTMLElement;
|
|
363
|
+
expect(String(frame.className)).toMatch(/_jc-flex-end/);
|
|
364
|
+
expect(issuerRow.querySelector("[data-mpo-description-list-identifier]")).not.toBeNull();
|
|
365
|
+
});
|
|
366
|
+
});
|
|
@@ -7,15 +7,20 @@
|
|
|
7
7
|
* read/edit flip moves no label (LC-44). Chromeless by default (LC-39);
|
|
8
8
|
* the framed variant paints, so it earns the Card inset.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* LC-169 CARD-HIERARCHY: the term is the label role (footnote size,
|
|
11
|
+
* secondary ink) and the value the body in the primary ink, so a label never
|
|
12
|
+
* reads at its value's size, weight and ink. An `identifier` row (a URL, an
|
|
13
|
+
* id) is mono, one line, truncated in the middle, with copy. House Separator
|
|
14
|
+
* (1px `$borderColor`, quiet = opacity 0.5) owns the row rule.
|
|
12
15
|
* Forms cannot import `@multiplatform.one/components` (that package depends
|
|
13
16
|
* on forms); the recipes are the same measured law.
|
|
14
17
|
*/
|
|
15
18
|
|
|
16
19
|
import {
|
|
17
20
|
Children,
|
|
21
|
+
createContext,
|
|
18
22
|
isValidElement,
|
|
23
|
+
useContext,
|
|
19
24
|
useLayoutEffect,
|
|
20
25
|
useMemo,
|
|
21
26
|
useRef,
|
|
@@ -25,7 +30,14 @@ import {
|
|
|
25
30
|
type ReactNode,
|
|
26
31
|
type Ref,
|
|
27
32
|
} from "react";
|
|
28
|
-
import {
|
|
33
|
+
import { writeToClipboard } from "@multiplatform.one/platform";
|
|
34
|
+
import {
|
|
35
|
+
IconSlot,
|
|
36
|
+
compareSizeTokens,
|
|
37
|
+
useGlyphColor,
|
|
38
|
+
useResolvedKnobs,
|
|
39
|
+
} from "@multiplatform.one/theme";
|
|
40
|
+
import { CopyIcon } from "@phosphor-icons/react";
|
|
29
41
|
import { type SizeTokens, Text, View, XStack, YStack, isWeb } from "tamagui";
|
|
30
42
|
import { Button } from "../Button";
|
|
31
43
|
import { FORM_GRID_COLLAPSE_WIDTH } from "../FormGrid";
|
|
@@ -34,10 +46,17 @@ import { formReadableMaxWidth } from "../formSpacing";
|
|
|
34
46
|
import { DescriptionListSlotProvider, FieldDisplay, type FieldDisplayType } from "../FieldDisplay";
|
|
35
47
|
import { t } from "../shared/t";
|
|
36
48
|
|
|
37
|
-
|
|
49
|
+
/**
|
|
50
|
+
* `inline` is the card fact row (LC-169): glyph and label leading, the value
|
|
51
|
+
* trailing on the same line, a hairline between rows. An identifier row still
|
|
52
|
+
* stacks, since a long mono id cannot share its line.
|
|
53
|
+
*/
|
|
54
|
+
export type DescriptionListPlacement = "side" | "top" | "inline";
|
|
38
55
|
|
|
39
56
|
export interface DescriptionListItem {
|
|
40
57
|
term: ReactNode;
|
|
58
|
+
/** A glyph that names the fact's kind, before the term in the secondary ink. */
|
|
59
|
+
icon?: ReactNode;
|
|
41
60
|
/** FieldDisplay type — every typed value mounts FieldDisplay (LC-12). */
|
|
42
61
|
field?: FieldDisplayType;
|
|
43
62
|
value?: any;
|
|
@@ -45,6 +64,11 @@ export interface DescriptionListItem {
|
|
|
45
64
|
linkedValue?: any;
|
|
46
65
|
/** Opt-in ellipsis for identifier-class values (DG-OVF). */
|
|
47
66
|
truncate?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* A long identifier (URL, id, digest): mono, one line, truncated in the
|
|
69
|
+
* middle so both ends stay legible, with a copy action (LC-169).
|
|
70
|
+
*/
|
|
71
|
+
identifier?: boolean;
|
|
48
72
|
/** Optional per-row Change action. */
|
|
49
73
|
onChange?: () => void;
|
|
50
74
|
changeLabel?: string;
|
|
@@ -83,6 +107,8 @@ export interface DescriptionListProps {
|
|
|
83
107
|
* tight rhythm (shorter rows, `gapSm` columns).
|
|
84
108
|
*/
|
|
85
109
|
size?: SizeTokens;
|
|
110
|
+
/** Called after an identifier row's copy, for the owner's confirm (CopyField precedent). */
|
|
111
|
+
onCopyResult?: (ok: boolean) => void;
|
|
86
112
|
testID?: string;
|
|
87
113
|
}
|
|
88
114
|
|
|
@@ -114,7 +140,7 @@ function resolvePlacement(
|
|
|
114
140
|
prop: DescriptionListPlacement | undefined,
|
|
115
141
|
knobPlacement: string,
|
|
116
142
|
): DescriptionListPlacement {
|
|
117
|
-
if (prop === "side" || prop === "top") return prop;
|
|
143
|
+
if (prop === "side" || prop === "top" || prop === "inline") return prop;
|
|
118
144
|
if (knobPlacement === "top" || knobPlacement === "side") {
|
|
119
145
|
return knobPlacement;
|
|
120
146
|
}
|
|
@@ -154,15 +180,17 @@ function ListRule({ quiet }: { quiet?: boolean }) {
|
|
|
154
180
|
);
|
|
155
181
|
}
|
|
156
182
|
|
|
157
|
-
function TermText({ children }: { children: ReactNode }) {
|
|
183
|
+
function TermText({ children, inline = false }: { children: ReactNode; inline?: boolean }) {
|
|
158
184
|
const { knobProps } = useResolvedKnobs();
|
|
159
185
|
return (
|
|
160
186
|
<Text
|
|
161
187
|
data-mpo-description-list-term=""
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
188
|
+
// LC-169: a stacked term is the label role (a size under its value, the
|
|
189
|
+
// secondary ink); an inline one shares the value's line, so it takes the
|
|
190
|
+
// value's size and differs by ink.
|
|
191
|
+
{...(inline
|
|
192
|
+
? { ...knobProps.body, ...knobProps.label, color: "$textMuted" }
|
|
193
|
+
: knobProps.textRole.label)}
|
|
166
194
|
minWidth={0}
|
|
167
195
|
// `overflowWrap` is not a tamagui style prop; passed as one it reaches
|
|
168
196
|
// the DOM host as an unknown React prop. Web takes it through `style`.
|
|
@@ -173,6 +201,24 @@ function TermText({ children }: { children: ReactNode }) {
|
|
|
173
201
|
);
|
|
174
202
|
}
|
|
175
203
|
|
|
204
|
+
function TermLead({ row, inline = false }: { row: DescriptionListItem; inline?: boolean }) {
|
|
205
|
+
const { knobProps } = useResolvedKnobs();
|
|
206
|
+
const ink = useGlyphColor("$textMuted");
|
|
207
|
+
if (row.icon == null) return <TermText inline={inline}>{row.term}</TermText>;
|
|
208
|
+
return (
|
|
209
|
+
<XStack alignItems="center" minWidth={0} {...knobProps.gapSm}>
|
|
210
|
+
<View
|
|
211
|
+
aria-hidden
|
|
212
|
+
flexShrink={0}
|
|
213
|
+
{...(isWeb && ink ? ({ style: { color: ink } } as Record<string, unknown>) : {})}
|
|
214
|
+
>
|
|
215
|
+
<IconSlot icon={row.icon} color={ink} size={16} />
|
|
216
|
+
</View>
|
|
217
|
+
<TermText inline={inline}>{row.term}</TermText>
|
|
218
|
+
</XStack>
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
176
222
|
function ChangeAction({ onChange, label }: { onChange: () => void; label?: string }) {
|
|
177
223
|
return (
|
|
178
224
|
<View data-mpo-description-list-action="" alignItems="flex-start" justifyContent="flex-end">
|
|
@@ -183,21 +229,105 @@ function ChangeAction({ onChange, label }: { onChange: () => void; label?: strin
|
|
|
183
229
|
);
|
|
184
230
|
}
|
|
185
231
|
|
|
186
|
-
|
|
232
|
+
/**
|
|
233
|
+
* Where a long identifier splits for middle truncation: the tail keeps the
|
|
234
|
+
* last path segments that fit in 20 characters (`/auth/realms/master`), or
|
|
235
|
+
* the last 12 characters when there is no path.
|
|
236
|
+
*/
|
|
237
|
+
export function middleSplit(text: string): [string, string] {
|
|
238
|
+
if (text.length <= 24) return [text, ""];
|
|
239
|
+
let start = text.length - 12;
|
|
240
|
+
let from = text.length - 2;
|
|
241
|
+
for (;;) {
|
|
242
|
+
const slash = text.lastIndexOf("/", from);
|
|
243
|
+
if (slash <= 0 || text.length - slash > 20) break;
|
|
244
|
+
start = slash;
|
|
245
|
+
from = slash - 1;
|
|
246
|
+
}
|
|
247
|
+
return [text.slice(0, start), text.slice(start)];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* The glyph never flips (DG-FB-01 / LC-16): the confirm is the owner's, through
|
|
252
|
+
* `onCopyResult`, the same channel Input's copy end-cap uses (CopyField routes
|
|
253
|
+
* it to notify()).
|
|
254
|
+
*/
|
|
255
|
+
const CopyResultContext = createContext<((ok: boolean) => void) | undefined>(undefined);
|
|
256
|
+
|
|
257
|
+
function IdentifierValue({ text }: { text: string }) {
|
|
258
|
+
const onCopyResult = useContext(CopyResultContext);
|
|
259
|
+
const { knobProps } = useResolvedKnobs();
|
|
260
|
+
const [head, tail] = middleSplit(text);
|
|
261
|
+
const ink = { ...knobProps.body, fontFamily: "$mono", color: "$color" } as const;
|
|
262
|
+
const copy = async () => {
|
|
263
|
+
const ok = await writeToClipboard(text);
|
|
264
|
+
onCopyResult?.(ok);
|
|
265
|
+
};
|
|
266
|
+
return (
|
|
267
|
+
<XStack
|
|
268
|
+
data-mpo-description-list-identifier=""
|
|
269
|
+
alignItems="center"
|
|
270
|
+
minWidth={0}
|
|
271
|
+
width="100%"
|
|
272
|
+
{...knobProps.gapSm}
|
|
273
|
+
>
|
|
274
|
+
{isWeb ? (
|
|
275
|
+
<XStack flex={1} minWidth={0} {...({ title: text } as Record<string, unknown>)}>
|
|
276
|
+
<Text {...ink} numberOfLines={1} flexShrink={1} minWidth={0}>
|
|
277
|
+
{head}
|
|
278
|
+
</Text>
|
|
279
|
+
{tail ? (
|
|
280
|
+
<Text {...ink} numberOfLines={1} flexShrink={0}>
|
|
281
|
+
{tail}
|
|
282
|
+
</Text>
|
|
283
|
+
) : null}
|
|
284
|
+
</XStack>
|
|
285
|
+
) : (
|
|
286
|
+
<Text {...ink} flex={1} minWidth={0} numberOfLines={1} ellipsizeMode="middle">
|
|
287
|
+
{text}
|
|
288
|
+
</Text>
|
|
289
|
+
)}
|
|
290
|
+
<Button
|
|
291
|
+
nested
|
|
292
|
+
chromeless
|
|
293
|
+
circular
|
|
294
|
+
flexShrink={0}
|
|
295
|
+
icon={<CopyIcon />}
|
|
296
|
+
aria-label={t("Copy to clipboard")}
|
|
297
|
+
onPress={() => void copy()}
|
|
298
|
+
/>
|
|
299
|
+
</XStack>
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function ValueSlot({ row, trailing = false }: { row: DescriptionListItem; trailing?: boolean }) {
|
|
187
304
|
return (
|
|
188
305
|
<View data-mpo-description-list-value="" minWidth={0} width="100%">
|
|
189
306
|
{row.children != null ? (
|
|
190
|
-
|
|
307
|
+
trailing ? (
|
|
308
|
+
<XStack justifyContent="flex-end" alignItems="center" minWidth={0} width="100%">
|
|
309
|
+
{row.children}
|
|
310
|
+
</XStack>
|
|
311
|
+
) : (
|
|
312
|
+
row.children
|
|
313
|
+
)
|
|
314
|
+
) : row.identifier && row.value != null && row.value !== "" ? (
|
|
315
|
+
<IdentifierValue text={String(row.value)} />
|
|
191
316
|
) : (
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
317
|
+
// FieldDisplay grows on flex 1 from a zero basis; in a column with no
|
|
318
|
+
// height of its own that collapsed it to 0 and the next rule ran
|
|
319
|
+
// through the value. A row lets it grow across and keep its height.
|
|
320
|
+
<XStack minWidth={0} width="100%">
|
|
321
|
+
<FieldDisplay
|
|
322
|
+
field={row.field ?? "input"}
|
|
323
|
+
value={row.value}
|
|
324
|
+
fieldProps={row.fieldProps}
|
|
325
|
+
linkedValue={row.linkedValue}
|
|
326
|
+
chromeless
|
|
327
|
+
align={trailing ? "right" : "left"}
|
|
328
|
+
truncate={trailing || row.truncate}
|
|
329
|
+
/>
|
|
330
|
+
</XStack>
|
|
201
331
|
)}
|
|
202
332
|
</View>
|
|
203
333
|
);
|
|
@@ -206,6 +336,7 @@ function ValueSlot({ row }: { row: DescriptionListItem }) {
|
|
|
206
336
|
function DescriptionListRowView({
|
|
207
337
|
row,
|
|
208
338
|
stacked,
|
|
339
|
+
inline = false,
|
|
209
340
|
hasActionColumn,
|
|
210
341
|
rhythm,
|
|
211
342
|
showRule,
|
|
@@ -213,6 +344,7 @@ function DescriptionListRowView({
|
|
|
213
344
|
}: {
|
|
214
345
|
row: DescriptionListItem;
|
|
215
346
|
stacked: boolean;
|
|
347
|
+
inline?: boolean;
|
|
216
348
|
hasActionColumn: boolean;
|
|
217
349
|
rhythm: ReturnType<typeof listItemRhythm>;
|
|
218
350
|
showRule: boolean;
|
|
@@ -224,20 +356,23 @@ function DescriptionListRowView({
|
|
|
224
356
|
<View data-mpo-description-list-action="" />
|
|
225
357
|
) : null;
|
|
226
358
|
|
|
227
|
-
const
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
359
|
+
const oneLine = inline && !row.identifier;
|
|
360
|
+
const rowStyle: CSSProperties | undefined = oneLine
|
|
361
|
+
? undefined
|
|
362
|
+
: isWeb
|
|
363
|
+
? stacked
|
|
364
|
+
? {
|
|
365
|
+
display: "grid",
|
|
366
|
+
gridTemplateColumns: hasActionColumn ? "minmax(0,1fr) max-content" : "minmax(0,1fr)",
|
|
367
|
+
columnGap: undefined,
|
|
368
|
+
rowGap: undefined,
|
|
369
|
+
}
|
|
370
|
+
: {
|
|
371
|
+
display: "grid",
|
|
372
|
+
gridTemplateColumns: "subgrid",
|
|
373
|
+
gridColumn: "1 / -1",
|
|
374
|
+
}
|
|
375
|
+
: undefined;
|
|
241
376
|
|
|
242
377
|
const termStyle: CSSProperties | undefined = isWeb
|
|
243
378
|
? stacked
|
|
@@ -255,10 +390,20 @@ function DescriptionListRowView({
|
|
|
255
390
|
: { justifySelf: "end" }
|
|
256
391
|
: undefined;
|
|
257
392
|
|
|
258
|
-
const body =
|
|
393
|
+
const body = oneLine ? (
|
|
394
|
+
<XStack alignItems="center" width="100%" minWidth={0} gap={rhythm.columnGap as never}>
|
|
395
|
+
<View flexShrink={0} maxWidth="60%" minWidth={0}>
|
|
396
|
+
<TermLead row={row} inline />
|
|
397
|
+
</View>
|
|
398
|
+
<View flex={1} minWidth={0}>
|
|
399
|
+
<ValueSlot row={row} trailing />
|
|
400
|
+
</View>
|
|
401
|
+
{action}
|
|
402
|
+
</XStack>
|
|
403
|
+
) : stacked ? (
|
|
259
404
|
<>
|
|
260
405
|
<View style={termStyle}>
|
|
261
|
-
<
|
|
406
|
+
<TermLead row={row} />
|
|
262
407
|
</View>
|
|
263
408
|
{action ? <View style={actionStyle}>{action}</View> : null}
|
|
264
409
|
<View style={valueStyle} paddingTop={rhythm.stackGap as never}>
|
|
@@ -268,7 +413,7 @@ function DescriptionListRowView({
|
|
|
268
413
|
) : isWeb ? (
|
|
269
414
|
<>
|
|
270
415
|
<View style={termStyle}>
|
|
271
|
-
<
|
|
416
|
+
<TermLead row={row} />
|
|
272
417
|
</View>
|
|
273
418
|
<View style={valueStyle}>
|
|
274
419
|
<ValueSlot row={row} />
|
|
@@ -283,7 +428,7 @@ function DescriptionListRowView({
|
|
|
283
428
|
flexShrink={0}
|
|
284
429
|
width={`${purposeMaxCh()}ch` as never}
|
|
285
430
|
>
|
|
286
|
-
<
|
|
431
|
+
<TermLead row={row} />
|
|
287
432
|
</View>
|
|
288
433
|
<View flex={1} minWidth={0}>
|
|
289
434
|
<ValueSlot row={row} />
|
|
@@ -314,6 +459,7 @@ function DescriptionListRowView({
|
|
|
314
459
|
function DescriptionListWeb({
|
|
315
460
|
rows,
|
|
316
461
|
stacked,
|
|
462
|
+
inline,
|
|
317
463
|
hasAction,
|
|
318
464
|
rhythm,
|
|
319
465
|
quiet,
|
|
@@ -324,6 +470,7 @@ function DescriptionListWeb({
|
|
|
324
470
|
}: {
|
|
325
471
|
rows: DescriptionListItem[];
|
|
326
472
|
stacked: boolean;
|
|
473
|
+
inline: boolean;
|
|
327
474
|
hasAction: boolean;
|
|
328
475
|
rhythm: ReturnType<typeof listItemRhythm>;
|
|
329
476
|
quiet?: boolean;
|
|
@@ -374,6 +521,7 @@ function DescriptionListWeb({
|
|
|
374
521
|
key={index}
|
|
375
522
|
row={row}
|
|
376
523
|
stacked={stacked}
|
|
524
|
+
inline={inline}
|
|
377
525
|
hasActionColumn={hasAction}
|
|
378
526
|
rhythm={rhythm}
|
|
379
527
|
showRule={index > 0}
|
|
@@ -443,6 +591,7 @@ export function DescriptionList({
|
|
|
443
591
|
maxWidth = formReadableMaxWidth,
|
|
444
592
|
labelColumnWidth = LABEL_COLUMN_WIDTH,
|
|
445
593
|
size,
|
|
594
|
+
onCopyResult,
|
|
446
595
|
testID,
|
|
447
596
|
}: DescriptionListProps) {
|
|
448
597
|
const { knobProps } = useResolvedKnobs({ size });
|
|
@@ -456,50 +605,55 @@ export function DescriptionList({
|
|
|
456
605
|
const hasAction = rows.some(rowHasAction);
|
|
457
606
|
const measureCollapse = placement === "side";
|
|
458
607
|
const { ref, wide, onLayout } = useContainerWide(measureCollapse);
|
|
459
|
-
const
|
|
608
|
+
const inline = placement === "inline";
|
|
609
|
+
const stacked = placement === "top" || inline || (placement === "side" && !wide);
|
|
460
610
|
|
|
461
611
|
const list = (
|
|
462
|
-
<
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
612
|
+
<CopyResultContext.Provider value={onCopyResult}>
|
|
613
|
+
<DescriptionListSlotProvider>
|
|
614
|
+
{isWeb ? (
|
|
615
|
+
<DescriptionListWeb
|
|
616
|
+
rows={rows}
|
|
617
|
+
stacked={stacked}
|
|
618
|
+
inline={inline}
|
|
619
|
+
hasAction={hasAction}
|
|
620
|
+
rhythm={rhythm}
|
|
621
|
+
quiet={quiet}
|
|
622
|
+
labelColumnWidth={labelColumnWidth}
|
|
623
|
+
sizeToken={knobProps.sizeToken}
|
|
624
|
+
placement={placement}
|
|
625
|
+
framed={framed}
|
|
626
|
+
/>
|
|
627
|
+
) : (
|
|
628
|
+
<YStack
|
|
629
|
+
data-mpo-description-list=""
|
|
630
|
+
data-placement={placement}
|
|
631
|
+
data-stacked={stacked ? "true" : "false"}
|
|
632
|
+
data-rhythm={rhythm.tight ? "tight" : "regular"}
|
|
633
|
+
data-framed={framed ? "true" : "false"}
|
|
634
|
+
data-quiet={quiet ? "true" : "false"}
|
|
635
|
+
data-has-action={hasAction ? "true" : "false"}
|
|
636
|
+
data-label-column-width={labelColumnWidth}
|
|
637
|
+
data-size-token={knobProps.sizeToken}
|
|
638
|
+
width="100%"
|
|
639
|
+
minWidth={0}
|
|
640
|
+
>
|
|
641
|
+
{rows.map((row, index) => (
|
|
642
|
+
<DescriptionListRowView
|
|
643
|
+
key={index}
|
|
644
|
+
row={row}
|
|
645
|
+
stacked={stacked}
|
|
646
|
+
inline={inline}
|
|
647
|
+
hasActionColumn={hasAction}
|
|
648
|
+
rhythm={rhythm}
|
|
649
|
+
showRule={index > 0}
|
|
650
|
+
quiet={quiet}
|
|
651
|
+
/>
|
|
652
|
+
))}
|
|
653
|
+
</YStack>
|
|
654
|
+
)}
|
|
655
|
+
</DescriptionListSlotProvider>
|
|
656
|
+
</CopyResultContext.Provider>
|
|
503
657
|
);
|
|
504
658
|
|
|
505
659
|
const widthProps = {
|
|
@@ -193,8 +193,10 @@ function useDisplayChrome() {
|
|
|
193
193
|
};
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
+
const frameJustify = { left: "flex-start", center: "center", right: "flex-end" } as const;
|
|
197
|
+
|
|
196
198
|
function DisplayFrame({ field, children }: { field: FieldDisplayType; children: ReactNode }) {
|
|
197
|
-
const { knobProps, chromeless } = useDisplayChrome();
|
|
199
|
+
const { knobProps, chromeless, align } = useDisplayChrome();
|
|
198
200
|
if (chromeless) {
|
|
199
201
|
return (
|
|
200
202
|
<XStack
|
|
@@ -202,7 +204,7 @@ function DisplayFrame({ field, children }: { field: FieldDisplayType; children:
|
|
|
202
204
|
data-field={field}
|
|
203
205
|
data-chromeless=""
|
|
204
206
|
alignItems="center"
|
|
205
|
-
justifyContent="
|
|
207
|
+
justifyContent={frameJustify[align ?? "left"]}
|
|
206
208
|
minWidth={0}
|
|
207
209
|
flex={1}
|
|
208
210
|
width="100%"
|
|
@@ -320,6 +320,27 @@ describe("Progress", () => {
|
|
|
320
320
|
expect(radiusAtoms).not.toContain("_btlr-100000px");
|
|
321
321
|
});
|
|
322
322
|
|
|
323
|
+
it("rounds the fill's leading end at large and full, where the rail is already a capsule (LC-132)", () => {
|
|
324
|
+
const fillRadiusAtoms = (borderRadius: "medium" | "large" | "full") => {
|
|
325
|
+
const { container, unmount } = renderWithProviders(
|
|
326
|
+
<Preset overrides={{ borderRadius }}>
|
|
327
|
+
<Progress label="Fill end" value={50} />
|
|
328
|
+
</Preset>,
|
|
329
|
+
);
|
|
330
|
+
const atoms = String(getIndicator(container)?.className || "")
|
|
331
|
+
.split(" ")
|
|
332
|
+
.filter((c) => c.startsWith("_bbrr-"));
|
|
333
|
+
unmount();
|
|
334
|
+
return atoms;
|
|
335
|
+
};
|
|
336
|
+
const medium = fillRadiusAtoms("medium");
|
|
337
|
+
const large = fillRadiusAtoms("large");
|
|
338
|
+
const full = fillRadiusAtoms("full");
|
|
339
|
+
expect(medium).toContain("_bbrr-t-radius-0");
|
|
340
|
+
expect(large).toContain("_bbrr-t-radius-2");
|
|
341
|
+
expect(full).toContain("_bbrr-t-radius-12");
|
|
342
|
+
});
|
|
343
|
+
|
|
323
344
|
it("skeleton track height matches the live 0.25× size formula, not a 6px leftover", () => {
|
|
324
345
|
const live = renderWithProviders(<Progress label="Upload" value={50} />);
|
|
325
346
|
const bar = live.container.querySelector("[role='progressbar']") as HTMLElement;
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { transitionOrInstant } from "../../shared/instantMotion";
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
3
|
import type { AnyFormApi } from "../../types";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
Intent,
|
|
6
|
+
radiusStopFromToken,
|
|
7
|
+
railFillRadius,
|
|
8
|
+
transitionProps,
|
|
9
|
+
type MotionRole,
|
|
10
|
+
} from "@multiplatform.one/theme";
|
|
5
11
|
import type { KnobProps } from "@multiplatform.one/theme";
|
|
6
12
|
import { getSize } from "@tamagui/get-token";
|
|
7
13
|
import type { LabelProps, SizeTokens } from "tamagui";
|
|
@@ -86,11 +92,18 @@ function indicatorMotion(role: MotionRole) {
|
|
|
86
92
|
* `ProgressIndicator` component sub-theme. Capturing here keeps the hue
|
|
87
93
|
* scope explicit. useTheme() subscribes, so scheme changes stay live.
|
|
88
94
|
*/
|
|
89
|
-
function HueFillIndicator({
|
|
95
|
+
function HueFillIndicator({
|
|
96
|
+
motion,
|
|
97
|
+
radius,
|
|
98
|
+
}: {
|
|
99
|
+
motion: MotionRole;
|
|
100
|
+
radius: ReturnType<typeof railFillRadius>;
|
|
101
|
+
}) {
|
|
90
102
|
const theme = useTheme();
|
|
91
103
|
const fill = theme.color9?.val;
|
|
92
104
|
return (
|
|
93
105
|
<ProgressIndicator
|
|
106
|
+
borderRadius={radius}
|
|
94
107
|
{...(fill ? { backgroundColor: fill as any } : undefined)}
|
|
95
108
|
{...indicatorMotion(motion)}
|
|
96
109
|
/>
|
|
@@ -176,6 +189,7 @@ function ProgressTrack({
|
|
|
176
189
|
const trackSize = size ?? sizeToken;
|
|
177
190
|
const percent = Math.round((progressValue / max) * 100);
|
|
178
191
|
const motion = indicatorMotion(knobProps.motion.slide);
|
|
192
|
+
const fillRadius = railFillRadius(radiusStopFromToken(knobProps.borderRadius.borderRadius));
|
|
179
193
|
const name = typeof label === "string" && label ? label : t("Progress");
|
|
180
194
|
|
|
181
195
|
const progressElement = (
|
|
@@ -203,12 +217,13 @@ function ProgressTrack({
|
|
|
203
217
|
>
|
|
204
218
|
{intent && intent !== "accent" ? (
|
|
205
219
|
<Intent name={intent}>
|
|
206
|
-
<HueFillIndicator motion={knobProps.motion.slide} />
|
|
220
|
+
<HueFillIndicator motion={knobProps.motion.slide} radius={fillRadius} />
|
|
207
221
|
</Intent>
|
|
208
222
|
) : (
|
|
209
223
|
// Accent fills use the mark channel without a solid sub-theme scope.
|
|
210
224
|
// The default fill must hold 3:1 against both the track and page (DF-06).
|
|
211
225
|
<ProgressIndicator
|
|
226
|
+
borderRadius={fillRadius}
|
|
212
227
|
backgroundColor={
|
|
213
228
|
intent === "accent" ? formSelectedColors.mark : formControlColors.boundary
|
|
214
229
|
}
|