UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

984 lines (981 loc) • 49 kB
import { composeDatePickerColorKeys, composeTimePickerColorKeys } from "./composeTypes.native.js"; import { composeIconCodepoints } from "./generated/composeIcons.native.js"; import { isSyncState } from "./syncStore.native.js"; var horizontalAlignments = [ "start", "centerHorizontally", "end" ]; var verticalAlignments = [ "top", "centerVertically", "bottom" ]; var contentAlignments = [ "topStart", "topCenter", "topEnd", "centerStart", "center", "centerEnd", "bottomStart", "bottomCenter", "bottomEnd", "top", "bottom", "start", "end" ]; var verticalArrangements = [ "top", "center", "bottom", "spaceBetween", "spaceAround", "spaceEvenly" ]; var horizontalArrangements = [ "start", "center", "end", "spaceBetween", "spaceAround", "spaceEvenly" ]; var textAlignments = [ "unspecified", "left", "right", "center", "justify", "start", "end" ]; var fontWeights = [ "thin", "extraLight", "light", "normal", "medium", "semiBold", "bold", "extraBold", "black" ]; var buttonVariants = [ "filled", "tonal", "elevated", "outlined", "text" ]; var buttonTones = ["default", "danger"]; var textFieldVariants = ["filled", "outlined"]; var textFieldKeyboardTypes = [ "default", "number", "decimal", "email", "password", "phone", "url" ]; var textFieldImeActions = [ "default", "none", "go", "search", "send", "previous", "next", "done" ]; var textFieldCapitalizations = [ "none", "characters", "words", "sentences" ]; var progressVariants = [ "linear", "circular", "linearWavy", "circularWavy" ]; var progressStrokeCaps = [ "round", "butt", "square" ]; var composeStyleKeys = /* @__PURE__ */ new Set([ "backgroundColor", "foregroundColor", "padding", "paddingTop", "paddingRight", "paddingBottom", "paddingLeft", "width", "height", "fillMaxWidth", "fillMaxHeight", "weight", "cornerRadius", "opacity", "borderColor", "borderWidth" ]); var composeStyleNumberKeys = /* @__PURE__ */ new Set([ "padding", "paddingTop", "paddingRight", "paddingBottom", "paddingLeft", "width", "height", "cornerRadius", "borderWidth" ]); var composeStyleColorKeys = /* @__PURE__ */ new Set([ "backgroundColor", "foregroundColor", "borderColor" ]); var checkboxColorKeys = /* @__PURE__ */ new Set([ "checkedColor", "disabledCheckedColor", "uncheckedColor", "disabledUncheckedColor", "checkmarkColor" ]); var radioColorKeys = /* @__PURE__ */ new Set([ "selectedColor", "unselectedColor", "disabledSelectedColor", "disabledUnselectedColor" ]); var cardColorKeys = /* @__PURE__ */ new Set(["containerColor", "contentColor"]); var listItemColorKeys = /* @__PURE__ */ new Set([ "containerColor", "contentColor", "leadingContentColor", "trailingContentColor", "supportingContentColor", "overlineContentColor" ]); function validateListItemProps(props) { if (props.colors !== void 0) assertComposeColors(props.colors, listItemColorKeys, "ListItem"); if (props.tonalElevation !== void 0) { assertFiniteNumber(props.tonalElevation, "ListItem tonalElevation"); if (props.tonalElevation < 0) throw new Error("Compose ListItem tonalElevation must be nonnegative"); } if (props.shadowElevation !== void 0) { assertFiniteNumber(props.shadowElevation, "ListItem shadowElevation"); if (props.shadowElevation < 0) throw new Error("Compose ListItem shadowElevation must be nonnegative"); } } function validateBadgeProps(props) { if (props.containerColor !== void 0) assertComposeColorValue(props.containerColor, "Badge containerColor"); if (props.contentColor !== void 0) assertComposeColorValue(props.contentColor, "Badge contentColor"); } var assistChipColorKeys = /* @__PURE__ */ new Set([ "containerColor", "labelColor", "leadingIconContentColor", "trailingIconContentColor" ]); var filterChipColorKeys = /* @__PURE__ */ new Set([ "containerColor", "labelColor", "iconColor", "selectedContainerColor", "selectedLabelColor", "selectedLeadingIconColor", "selectedTrailingIconColor" ]); var inputChipColorKeys = /* @__PURE__ */ new Set([ "containerColor", "labelColor", "leadingIconColor", "trailingIconColor", "selectedContainerColor", "selectedLabelColor", "selectedLeadingIconColor", "selectedTrailingIconColor" ]); var suggestionChipColorKeys = /* @__PURE__ */ new Set([ "containerColor", "labelColor", "iconContentColor" ]); var iconButtonColorKeys = /* @__PURE__ */ new Set([ "containerColor", "contentColor", "disabledContainerColor", "disabledContentColor" ]); var toggleButtonColorKeys = /* @__PURE__ */ new Set([ "containerColor", "contentColor", "checkedContainerColor", "checkedContentColor", "disabledContainerColor", "disabledContentColor" ]); var segmentedButtonColorKeys = /* @__PURE__ */ new Set([ "activeBorderColor", "activeContentColor", "inactiveBorderColor", "inactiveContentColor", "disabledActiveBorderColor", "disabledActiveContentColor", "disabledInactiveBorderColor", "disabledInactiveContentColor", "activeContainerColor", "inactiveContainerColor", "disabledActiveContainerColor", "disabledInactiveContainerColor" ]); var switchColorKeys = /* @__PURE__ */ new Set([ "checkedThumbColor", "checkedTrackColor", "checkedBorderColor", "checkedIconColor", "uncheckedThumbColor", "uncheckedTrackColor", "uncheckedBorderColor", "uncheckedIconColor", "disabledCheckedThumbColor", "disabledCheckedTrackColor", "disabledCheckedBorderColor", "disabledCheckedIconColor", "disabledUncheckedThumbColor", "disabledUncheckedTrackColor", "disabledUncheckedBorderColor", "disabledUncheckedIconColor" ]); var sliderColorKeys = /* @__PURE__ */ new Set([ "thumbColor", "activeTrackColor", "inactiveTrackColor", "activeTickColor", "inactiveTickColor" ]); function assertComposeColorValue(value, name) { var resourcePaths = value && typeof value === "object" && "resource_paths" in value ? value.resource_paths : void 0; if ((typeof value !== "string" || !value.trim()) && (typeof value !== "number" || !Number.isFinite(value)) && (!Array.isArray(resourcePaths) || resourcePaths.length === 0 || resourcePaths.some(function(path) { return typeof path !== "string" || !path; }))) throw new Error(`Compose ${name} must be a color value`); } function assertComposeColors(colors, keys, owner) { if (!colors || typeof colors !== "object" || Array.isArray(colors)) throw new Error(`Compose ${owner} colors must be an object`); var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = Object.entries(colors)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var [key, value] = _step.value; if (!keys.has(key)) throw new Error(`Compose ${owner} colors does not support ${key}`); if (value !== void 0) assertComposeColorValue(value, `${owner} colors ${key}`); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } function assertComposeStyle(style) { if (style === void 0) return; if (!style || typeof style !== "object" || Array.isArray(style)) throw new Error("Compose composeStyle must be an object"); var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = Object.keys(style)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; if (!composeStyleKeys.has(key)) throw new Error(`Compose composeStyle does not support ${key}`); var value = style[key]; if (value === void 0) continue; if (composeStyleNumberKeys.has(key)) { if (typeof value !== "number" || !Number.isFinite(value) || value < 0) throw new Error(`Compose composeStyle ${key} must be a nonnegative finite number`); continue; } if (key === "opacity") { if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || value > 1) throw new Error("Compose composeStyle opacity must be a number from 0 to 1"); continue; } if (key === "weight") { if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) throw new Error("Compose composeStyle weight must be a positive finite number"); continue; } if (composeStyleColorKeys.has(key)) { assertComposeColorValue(value, `composeStyle ${key}`); continue; } if (typeof value !== "boolean") throw new Error(`Compose composeStyle ${key} must be a boolean`); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } function assertString(value, name) { var nonEmpty = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false; if (typeof value !== "string" || nonEmpty && !value.trim()) throw new Error(`Compose ${name} must be${nonEmpty ? " a non-empty" : ""} string`); } function assertOptionalString(value, name) { if (value !== void 0) assertString(value, name); } function assertBoolean(value, name) { if (typeof value !== "boolean") throw new Error(`Compose ${name} must be a boolean`); } function assertOptionalBoolean(value, name) { if (value !== void 0) assertBoolean(value, name); } function assertOneOf(value, name, values) { if (!values.includes(value)) throw new Error(`Compose ${name} must be one of ${values.join(", ")}`); } function assertFiniteNumber(value, name) { if (typeof value !== "number" || !Number.isFinite(value)) throw new Error(`Compose ${name} must be a finite number`); } function assertFunction(value, name) { if (typeof value !== "function") throw new Error(`Compose ${name} must be a function`); } function validateColumnProps(props) { var _props_horizontalAlignment, _props_verticalArrangement; var horizontalAlignment = (_props_horizontalAlignment = props.horizontalAlignment) !== null && _props_horizontalAlignment !== void 0 ? _props_horizontalAlignment : "start"; var verticalArrangement = (_props_verticalArrangement = props.verticalArrangement) !== null && _props_verticalArrangement !== void 0 ? _props_verticalArrangement : "top"; assertOneOf(horizontalAlignment, "Column horizontalAlignment", horizontalAlignments); assertOneOf(verticalArrangement, "Column verticalArrangement", verticalArrangements); if (props.spacing !== void 0 && (!Number.isFinite(props.spacing) || props.spacing < 0)) throw new Error("Compose Column spacing must be a nonnegative finite number"); if (props.spacing !== void 0 && verticalArrangement.startsWith("space")) throw new Error("Compose Column spacing cannot be combined with a space-distribution arrangement"); } function validateRowProps(props) { var _props_verticalAlignment, _props_horizontalArrangement; var verticalAlignment = (_props_verticalAlignment = props.verticalAlignment) !== null && _props_verticalAlignment !== void 0 ? _props_verticalAlignment : "top"; var horizontalArrangement = (_props_horizontalArrangement = props.horizontalArrangement) !== null && _props_horizontalArrangement !== void 0 ? _props_horizontalArrangement : "start"; assertOneOf(verticalAlignment, "Row verticalAlignment", verticalAlignments); assertOneOf(horizontalArrangement, "Row horizontalArrangement", horizontalArrangements); if (props.spacing !== void 0 && (!Number.isFinite(props.spacing) || props.spacing < 0)) throw new Error("Compose Row spacing must be a nonnegative finite number"); if (props.spacing !== void 0 && horizontalArrangement.startsWith("space")) throw new Error("Compose Row spacing cannot be combined with a space-distribution arrangement"); } function validateFlowRowProps(props) { var _props_horizontalArrangement, _props_verticalArrangement; function arrangement(value, name, names) { if (typeof value === "string") { if (!names.includes(value)) throw new Error(`Compose FlowRow ${name} is unsupported`); return; } if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).length !== 1 || !("spacedBy" in value) || typeof value.spacedBy !== "number" || !Number.isFinite(value.spacedBy) || value.spacedBy < 0) throw new Error(`Compose FlowRow ${name} spacedBy must be a nonnegative finite number`); } arrangement((_props_horizontalArrangement = props.horizontalArrangement) !== null && _props_horizontalArrangement !== void 0 ? _props_horizontalArrangement : "start", "horizontalArrangement", horizontalArrangements); arrangement((_props_verticalArrangement = props.verticalArrangement) !== null && _props_verticalArrangement !== void 0 ? _props_verticalArrangement : "top", "verticalArrangement", verticalArrangements); } function validateBoxProps(props) { var _props_contentAlignment; assertOneOf((_props_contentAlignment = props.contentAlignment) !== null && _props_contentAlignment !== void 0 ? _props_contentAlignment : "topStart", "Box contentAlignment", contentAlignments); } function validateTextProps(props) { assertString(props.text, "Text text"); if (props.fontSize !== void 0 && (!Number.isFinite(props.fontSize) || props.fontSize <= 0)) throw new Error("Compose Text fontSize must be a positive finite number"); if (props.fontWeight !== void 0) assertOneOf(props.fontWeight, "Text fontWeight", fontWeights); if (props.textAlign !== void 0) assertOneOf(props.textAlign, "Text textAlign", textAlignments); if (props.maxLines !== void 0 && (!Number.isInteger(props.maxLines) || props.maxLines <= 0)) throw new Error("Compose Text maxLines must be a positive integer"); } function composeIconGlyph(owner, name) { if (!Object.hasOwn(composeIconCodepoints, name)) throw new Error(`Compose ${owner} must be a Material Symbols name, got ${JSON.stringify(name)}`); return String.fromCodePoint(composeIconCodepoints[name]); } function validateIconProps(props) { assertString(props.name, "Icon name", true); if (props.size !== void 0 && (!Number.isFinite(props.size) || props.size <= 0)) throw new Error("Compose Icon size must be a positive finite number"); assertOptionalBoolean(props.filled, "Icon filled"); composeIconGlyph("Icon name", props.name); } function validateButtonProps(props) { var _props_disabled, _props_variant, _props_tone, _props_iconFilled; assertString(props.label, "Button label", true); assertBoolean((_props_disabled = props.disabled) !== null && _props_disabled !== void 0 ? _props_disabled : false, "Button disabled"); assertOneOf((_props_variant = props.variant) !== null && _props_variant !== void 0 ? _props_variant : "filled", "Button variant", buttonVariants); assertOneOf((_props_tone = props.tone) !== null && _props_tone !== void 0 ? _props_tone : "default", "Button tone", buttonTones); assertBoolean((_props_iconFilled = props.iconFilled) !== null && _props_iconFilled !== void 0 ? _props_iconFilled : false, "Button iconFilled"); if (props.icon !== void 0) composeIconGlyph("Button icon", props.icon); if (props.onPress !== void 0) assertFunction(props.onPress, "Button onPress"); } function validateIconButtonProps(props) { var _props_enabled; assertBoolean((_props_enabled = props.enabled) !== null && _props_enabled !== void 0 ? _props_enabled : true, "IconButton enabled"); if (props.onClick !== void 0) assertFunction(props.onClick, "IconButton onClick"); if (props.colors !== void 0) assertComposeColors(props.colors, iconButtonColorKeys, "IconButton"); } function validateFloatingActionButtonProps(props, variant) { var _props_expanded; assertOneOf(variant, "FloatingActionButton variant", [ "small", "medium", "large", "extended" ]); assertBoolean((_props_expanded = props.expanded) !== null && _props_expanded !== void 0 ? _props_expanded : true, "FloatingActionButton expanded"); if (props.containerColor !== void 0) assertComposeColorValue(props.containerColor, "FloatingActionButton containerColor"); if (props.onClick !== void 0) assertFunction(props.onClick, "FloatingActionButton onClick"); } function validateToggleButtonProps(props) { var _props_enabled; assertBoolean(props.checked, "ToggleButton checked"); assertBoolean((_props_enabled = props.enabled) !== null && _props_enabled !== void 0 ? _props_enabled : true, "ToggleButton enabled"); if (props.onCheckedChange !== void 0) assertFunction(props.onCheckedChange, "ToggleButton onCheckedChange"); if (props.colors !== void 0) assertComposeColors(props.colors, toggleButtonColorKeys, "ToggleButton"); } function validateSegmentedButtonProps(props) { var _props_enabled; if (props.selected !== void 0) assertBoolean(props.selected, "SegmentedButton selected"); if (props.checked !== void 0) assertBoolean(props.checked, "SegmentedButton checked"); assertBoolean((_props_enabled = props.enabled) !== null && _props_enabled !== void 0 ? _props_enabled : true, "SegmentedButton enabled"); if (props.onClick !== void 0) assertFunction(props.onClick, "SegmentedButton onClick"); if (props.onCheckedChange !== void 0) assertFunction(props.onCheckedChange, "SegmentedButton onCheckedChange"); if (props.colors !== void 0) assertComposeColors(props.colors, segmentedButtonColorKeys, "SegmentedButton"); } function validateSwitchProps(props) { var _props_disabled, _props_label; assertBoolean(props.isOn, "Switch isOn"); assertBoolean((_props_disabled = props.disabled) !== null && _props_disabled !== void 0 ? _props_disabled : false, "Switch disabled"); assertString((_props_label = props.label) !== null && _props_label !== void 0 ? _props_label : "", "Switch label"); assertFunction(props.onIsOnChange, "Switch onIsOnChange"); if (props.colors !== void 0) assertComposeColors(props.colors, switchColorKeys, "Switch"); } function validateCheckboxProps(props) { var _props_disabled; assertBoolean(props.value, "Checkbox value"); assertBoolean((_props_disabled = props.disabled) !== null && _props_disabled !== void 0 ? _props_disabled : false, "Checkbox disabled"); if (props.onCheckedChange !== void 0) assertFunction(props.onCheckedChange, "Checkbox onCheckedChange"); if (props.colors !== void 0) assertComposeColors(props.colors, checkboxColorKeys, "Checkbox"); } function validateRadioButtonProps(props) { var _props_disabled; assertBoolean(props.selected, "RadioButton selected"); assertBoolean((_props_disabled = props.disabled) !== null && _props_disabled !== void 0 ? _props_disabled : false, "RadioButton disabled"); if (props.onClick !== void 0) assertFunction(props.onClick, "RadioButton onClick"); if (props.colors !== void 0) assertComposeColors(props.colors, radioColorKeys, "RadioButton"); } function validateCardProps(props, kind) { if (props.colors !== void 0) assertComposeColors(props.colors, cardColorKeys, kind); if (props.elevation !== void 0) { assertFiniteNumber(props.elevation, `${kind} elevation`); if (props.elevation < 0) throw new Error(`Compose ${kind} elevation must be nonnegative`); } if (kind === "ElevatedCard" && props.border !== void 0) throw new Error("Compose ElevatedCard does not support border"); assertComposeBorder(props.border, kind); } function validateSurfaceProps(props) { if (props.color !== void 0) assertComposeColorValue(props.color, "Surface color"); if (props.contentColor !== void 0) assertComposeColorValue(props.contentColor, "Surface contentColor"); if (props.tonalElevation !== void 0) { assertFiniteNumber(props.tonalElevation, "Surface tonalElevation"); if (props.tonalElevation < 0) throw new Error("Compose Surface tonalElevation must be nonnegative"); } if (props.shadowElevation !== void 0) { assertFiniteNumber(props.shadowElevation, "Surface shadowElevation"); if (props.shadowElevation < 0) throw new Error("Compose Surface shadowElevation must be nonnegative"); } assertComposeBorder(props.border, "Surface"); assertOptionalBoolean(props.enabled, "Surface enabled"); assertOptionalBoolean(props.selected, "Surface selected"); assertOptionalBoolean(props.checked, "Surface checked"); if (props.onClick !== void 0) assertFunction(props.onClick, "Surface onClick"); if (props.onCheckedChange !== void 0) assertFunction(props.onCheckedChange, "Surface onCheckedChange"); } function assertComposeBorder(border, kind) { if (border === void 0) return; if (!border || typeof border !== "object" || Array.isArray(border)) throw new Error(`Compose ${kind} border must be an object`); var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = Object.keys(border)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; if (key !== "width" && key !== "color") throw new Error(`Compose ${kind} border does not support ${key}`); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } if (border.width !== void 0) { assertFiniteNumber(border.width, `${kind} border width`); if (border.width < 0) throw new Error(`Compose ${kind} border width must be nonnegative`); } if (border.color !== void 0) assertComposeColorValue(border.color, `${kind} border color`); } function validateChipProps(props, kind) { var _props_enabled; var selected = "selected" in props ? props.selected : void 0; if (kind === "FilterChip") assertBoolean(selected, `${kind} selected`); else if (kind === "InputChip" && selected !== void 0) assertBoolean(selected, `${kind} selected`); assertBoolean((_props_enabled = props.enabled) !== null && _props_enabled !== void 0 ? _props_enabled : true, `${kind} enabled`); if (props.onClick !== void 0) assertFunction(props.onClick, `${kind} onClick`); if (props.colors !== void 0) { var keys = kind === "AssistChip" ? assistChipColorKeys : kind === "FilterChip" ? filterChipColorKeys : kind === "InputChip" ? inputChipColorKeys : suggestionChipColorKeys; assertComposeColors(props.colors, keys, kind); } if (props.elevation !== void 0) { assertFiniteNumber(props.elevation, `${kind} elevation`); if (props.elevation < 0) throw new Error(`Compose ${kind} elevation must be nonnegative`); } assertComposeBorder(props.border, kind); } function validateDividerProps(props, kind) { if (props.thickness !== void 0) { assertFiniteNumber(props.thickness, `${kind} thickness`); if (props.thickness < 0) throw new Error(`Compose ${kind} thickness must be nonnegative`); } if (props.color !== void 0) assertComposeColorValue(props.color, `${kind} color`); } function validateTextFieldProps(props) { if (typeof props.text !== "string" && !isSyncState(props.text)) throw new Error("Compose TextField text must be a string or NativeState handle"); assertFunction(props.onTextChange, "TextField onTextChange"); assertOptionalString(props.label, "TextField label"); assertOptionalString(props.placeholder, "TextField placeholder"); assertOptionalBoolean(props.disabled, "TextField disabled"); if (props.variant !== void 0) assertOneOf(props.variant, "TextField variant", textFieldVariants); if (props.keyboardType !== void 0) assertOneOf(props.keyboardType, "TextField keyboardType", textFieldKeyboardTypes); assertOptionalBoolean(props.secureText, "TextField secureText"); assertOptionalBoolean(props.focused, "TextField focused"); if (props.onFocusChange !== void 0) assertFunction(props.onFocusChange, "TextField onFocusChange"); if (props.imeAction !== void 0) assertOneOf(props.imeAction, "TextField imeAction", textFieldImeActions); if (props.onSubmit !== void 0) assertFunction(props.onSubmit, "TextField onSubmit"); if (props.maxLength !== void 0 && (!Number.isInteger(props.maxLength) || props.maxLength < 0)) throw new Error("Compose TextField maxLength must be a nonnegative integer"); assertOptionalBoolean(props.multiline, "TextField multiline"); if (props.capitalization !== void 0) assertOneOf(props.capitalization, "TextField capitalization", textFieldCapitalizations); assertOptionalBoolean(props.autoCorrect, "TextField autoCorrect"); if (props.textAlign !== void 0) assertOneOf(props.textAlign, "TextField textAlign", textAlignments); } function validateSliderProps(props) { var _props_minimumValue, _props_maximumValue, _props_step, _props_lowerLimit, _props_upperLimit; var minimumValue = (_props_minimumValue = props.minimumValue) !== null && _props_minimumValue !== void 0 ? _props_minimumValue : 0; var maximumValue = (_props_maximumValue = props.maximumValue) !== null && _props_maximumValue !== void 0 ? _props_maximumValue : 1; var step = (_props_step = props.step) !== null && _props_step !== void 0 ? _props_step : 0; assertFiniteNumber(props.value, "Slider value"); assertFiniteNumber(minimumValue, "Slider minimumValue"); assertFiniteNumber(maximumValue, "Slider maximumValue"); assertFiniteNumber(step, "Slider step"); if (props.lowerLimit !== void 0) assertFiniteNumber(props.lowerLimit, "Slider lowerLimit"); if (props.upperLimit !== void 0) assertFiniteNumber(props.upperLimit, "Slider upperLimit"); if (props.lowerLimit !== void 0 && !Number.isFinite(Math.fround(props.lowerLimit)) || props.upperLimit !== void 0 && !Number.isFinite(Math.fround(props.upperLimit))) throw new Error("Compose Slider limits must be representable by Android Float values"); if (minimumValue >= maximumValue) throw new Error("Compose Slider minimumValue must be less than maximumValue"); if (!Number.isFinite(Math.fround(minimumValue)) || !Number.isFinite(Math.fround(maximumValue)) || Math.fround(minimumValue) >= Math.fround(maximumValue)) throw new Error("Compose Slider range must be representable by Android Float values"); if (step < 0) throw new Error("Compose Slider step must be a nonnegative finite number"); if (step > 0) { var intervals = (maximumValue - minimumValue) / step; var roundedIntervals = Math.round(intervals); if (Math.abs(intervals - roundedIntervals) > Number.EPSILON * Math.max(1, Math.abs(intervals)) * 8) throw new Error("Compose Slider step must evenly divide its range"); if (roundedIntervals > 1001) throw new Error("Compose Slider step must produce at most 1001 intervals"); } if (props.value < minimumValue || props.value > maximumValue) throw new Error("Compose Slider value must be between minimumValue and maximumValue"); if (Math.max(Math.fround(minimumValue), Math.fround((_props_lowerLimit = props.lowerLimit) !== null && _props_lowerLimit !== void 0 ? _props_lowerLimit : minimumValue)) > Math.min(Math.fround(maximumValue), Math.fround((_props_upperLimit = props.upperLimit) !== null && _props_upperLimit !== void 0 ? _props_upperLimit : maximumValue))) throw new Error("Compose Slider limits must overlap the value range"); assertFunction(props.onValueChange, "Slider onValueChange"); assertOptionalBoolean(props.disabled, "Slider disabled"); if (props.colors !== void 0) assertComposeColors(props.colors, sliderColorKeys, "Slider"); } function validateAlertDialogProps(props) { assertBoolean(props.visible, "AlertDialog visible"); assertOptionalString(props.title, "AlertDialog title"); assertOptionalString(props.message, "AlertDialog message"); assertString(props.confirmLabel, "AlertDialog confirmLabel", true); assertOptionalString(props.dismissLabel, "AlertDialog dismissLabel"); assertFunction(props.onConfirm, "AlertDialog onConfirm"); assertFunction(props.onDismiss, "AlertDialog onDismiss"); } function validateDialogProps(props) { assertBoolean(props.visible, "Dialog visible"); assertFunction(props.onDismiss, "Dialog onDismiss"); } function validateProgressIndicatorProps(props) { var _props_variant; if (props.variant !== void 0) assertOneOf(props.variant, "ProgressIndicator variant", progressVariants); if (props.progress != null && (typeof props.progress !== "number" || !Number.isFinite(props.progress) || props.progress < 0 || props.progress > 1)) throw new Error("Compose ProgressIndicator progress must be a number from 0 to 1"); if (props.color !== void 0) assertComposeColorValue(props.color, "ProgressIndicator color"); if (props.trackColor !== void 0) assertComposeColorValue(props.trackColor, "ProgressIndicator trackColor"); var variant = (_props_variant = props.variant) !== null && _props_variant !== void 0 ? _props_variant : "circular"; if (props.strokeCap !== void 0) { assertOneOf(props.strokeCap, "ProgressIndicator strokeCap", progressStrokeCaps); if (variant !== "linear" && variant !== "circular") throw new Error("Compose ProgressIndicator strokeCap requires a regular indicator"); } for (var _i = 0, _iter = [ "gapSize", "strokeWidth", "stopSize", "amplitude", "wavelength", "waveSpeed" ]; _i < _iter.length; _i++) { var key = _iter[_i]; var value = props[key]; if (value === void 0) continue; assertFiniteNumber(value, `ProgressIndicator ${key}`); if (value < 0 || key === "amplitude" && value > 1) throw new Error(`Compose ProgressIndicator ${key} is out of range`); } if (props.gapSize !== void 0 && variant !== "linear" && variant !== "circular") throw new Error("Compose ProgressIndicator gapSize requires a regular indicator"); if (props.strokeWidth !== void 0 && variant !== "circular") throw new Error("Compose ProgressIndicator strokeWidth requires a circular indicator"); if (props.stopSize !== void 0 && variant !== "linearWavy") throw new Error("Compose ProgressIndicator stopSize requires a linear wavy indicator"); if ((props.amplitude !== void 0 || props.wavelength !== void 0 || props.waveSpeed !== void 0) && variant !== "linearWavy" && variant !== "circularWavy") throw new Error("Compose ProgressIndicator wave settings require a wavy indicator"); if (props.drawStopIndicator !== void 0) { if (variant !== "linear" || props.progress == null) throw new Error("Compose ProgressIndicator drawStopIndicator requires determinate linear progress"); var stop = props.drawStopIndicator; if (typeof stop !== "object" || stop === null || Array.isArray(stop)) throw new Error("Compose ProgressIndicator drawStopIndicator must be an object"); var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = Object.keys(stop)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key1 = _step.value; if (key1 !== "color" && key1 !== "strokeCap" && key1 !== "stopSize") throw new Error(`Compose ProgressIndicator drawStopIndicator has unknown key ${key1}`); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } if (stop.color !== void 0) assertComposeColorValue(stop.color, "ProgressIndicator drawStopIndicator color"); if (stop.strokeCap !== void 0) assertOneOf(stop.strokeCap, "ProgressIndicator drawStopIndicator strokeCap", progressStrokeCaps); if (stop.stopSize !== void 0) { assertFiniteNumber(stop.stopSize, "ProgressIndicator drawStopIndicator stopSize"); if (stop.stopSize < 0) throw new Error("Compose ProgressIndicator drawStopIndicator stopSize must be nonnegative"); } } } function validateLoadingIndicatorProps(props) { if (props.progress != null && (typeof props.progress !== "number" || !Number.isFinite(props.progress) || props.progress < 0 || props.progress > 1)) throw new Error("Compose LoadingIndicator progress must be a number from 0 to 1"); if (props.color !== void 0) assertComposeColorValue(props.color, "LoadingIndicator color"); if ("containerColor" in props && props.containerColor !== void 0) assertComposeColorValue(props.containerColor, "ContainedLoadingIndicator containerColor"); } var datePickerColorKeys = new Set(composeDatePickerColorKeys); var timePickerColorKeys = new Set(composeTimePickerColorKeys); var pickerVariants = ["picker", "input"]; function assertDate(value, name) { if (!(value instanceof Date) || !Number.isFinite(value.getTime())) throw new Error(`Compose ${name} must be a valid Date`); } function composeUtcDay(date) { return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()); } function validatePickerShared(props, owner) { assertDate(props.selection, `${owner} selection`); if (props.variant !== void 0) assertOneOf(props.variant, `${owner} variant`, pickerVariants); if (props.color !== void 0) assertComposeColorValue(props.color, `${owner} color`); } function validateDatePickerProps(props) { var owner = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "DatePicker"; validatePickerShared(props, owner); assertOptionalBoolean(props.showModeToggle, `${owner} showModeToggle`); if (props.minimumDate !== void 0) assertDate(props.minimumDate, `${owner} minimumDate`); if (props.maximumDate !== void 0) assertDate(props.maximumDate, `${owner} maximumDate`); var day = composeUtcDay(props.selection); var minimum = props.minimumDate && composeUtcDay(props.minimumDate); var maximum = props.maximumDate && composeUtcDay(props.maximumDate); if (minimum !== void 0 && maximum !== void 0 && minimum > maximum) throw new Error(`Compose ${owner} minimumDate must not be after maximumDate`); if (minimum !== void 0 && day < minimum || maximum !== void 0 && day > maximum) throw new Error(`Compose ${owner} selection must be between minimumDate and maximumDate`); if (props.colors !== void 0) assertComposeColors(props.colors, datePickerColorKeys, owner); } function validateTimePickerProps(props) { var owner = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "TimePicker"; validatePickerShared(props, owner); assertOptionalBoolean(props.is24Hour, `${owner} is24Hour`); if (props.colors !== void 0) assertComposeColors(props.colors, timePickerColorKeys, owner); } function validatePickerDialogProps(props, owner) { assertBoolean(props.visible, `${owner} visible`); assertFunction(props.onConfirm, `${owner} onConfirm`); assertFunction(props.onDismiss, `${owner} onDismiss`); assertOptionalString(props.confirmLabel, `${owner} confirmLabel`); assertOptionalString(props.dismissLabel, `${owner} dismissLabel`); } var lazyAlignments = [ "start", "end", "center" ]; var lazyRowAlignments = [ "top", "bottom", "center" ]; var lazyContentPaddingKeys = [ "start", "end", "top", "bottom" ]; var imageContentScales = [ "fit", "crop", "fillBounds", "fillWidth", "fillHeight", "inside", "none" ]; var snackbarColorKeys = /* @__PURE__ */ new Set([ "containerColor", "contentColor", "actionColor", "actionContentColor", "dismissActionContentColor" ]); var snackbarPropKeys = /* @__PURE__ */ new Set([...snackbarColorKeys, "actionOnNewLine"]); var snackbarDurations = [ "short", "long", "indefinite" ]; var sheetPropertyKeys = /* @__PURE__ */ new Set(["shouldDismissOnClickOutside"]); function assertSpacedBy(value, owner, name) { if (value === void 0) return void 0; if (typeof value === "string") { assertOneOf(value, `${owner} ${name}`, name === "horizontalArrangement" ? horizontalArrangements : verticalArrangements); return value; } if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).length !== 1 || !("spacedBy" in value)) throw new Error(`Compose ${owner} ${name} must be a preset or { spacedBy }`); var spacedBy = value.spacedBy; if (typeof spacedBy !== "number" || !Number.isFinite(spacedBy) || spacedBy < 0) throw new Error(`Compose ${owner} ${name} spacedBy must be a nonnegative finite number`); return spacedBy; } function assertLazyContentPadding(value, owner) { if (value === void 0) return; if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`Compose ${owner} contentPadding must be an object`); var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = Object.entries(value)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var [key, entry] = _step.value; if (!lazyContentPaddingKeys.includes(key)) throw new Error(`Compose ${owner} contentPadding has unknown key ${key}`); if (entry !== void 0 && (typeof entry !== "number" || !Number.isFinite(entry) || entry < 0)) throw new Error(`Compose ${owner} contentPadding ${key} must be a nonnegative finite number`); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } function validateLazyColumnProps(props) { var _props_horizontalAlignment, _props_verticalArrangement; assertOneOf((_props_horizontalAlignment = props.horizontalAlignment) !== null && _props_horizontalAlignment !== void 0 ? _props_horizontalAlignment : "start", "LazyColumn horizontalAlignment", lazyAlignments); assertSpacedBy((_props_verticalArrangement = props.verticalArrangement) !== null && _props_verticalArrangement !== void 0 ? _props_verticalArrangement : "top", "LazyColumn", "verticalArrangement"); assertLazyContentPadding(props.contentPadding, "LazyColumn"); } function validateLazyRowProps(props) { var _props_verticalAlignment, _props_horizontalArrangement; assertOneOf((_props_verticalAlignment = props.verticalAlignment) !== null && _props_verticalAlignment !== void 0 ? _props_verticalAlignment : "top", "LazyRow verticalAlignment", lazyRowAlignments); assertSpacedBy((_props_horizontalArrangement = props.horizontalArrangement) !== null && _props_horizontalArrangement !== void 0 ? _props_horizontalArrangement : "start", "LazyRow", "horizontalArrangement"); assertLazyContentPadding(props.contentPadding, "LazyRow"); } function validateImageProps(props) { var source = props.source; var validSource = typeof source === "number" && Number.isFinite(source) || source !== null && typeof source === "object" && !Array.isArray(source) && typeof source.uri === "string" && source.uri.length > 0; if (!validSource) throw new Error("Compose Image source must be a { uri } object or a bundled asset id"); if (props.contentScale !== void 0) assertOneOf(props.contentScale, "Image contentScale", imageContentScales); if (props.alignment !== void 0) assertOneOf(props.alignment, "Image alignment", contentAlignments); if (props.contentDescription !== void 0 && props.contentDescription !== null && typeof props.contentDescription !== "string") throw new Error("Compose Image contentDescription must be a string or null"); if (props.tint !== void 0) assertComposeColorValue(props.tint, "Image tint"); if (props.alpha !== void 0 && (typeof props.alpha !== "number" || !(props.alpha >= 0 && props.alpha <= 1))) throw new Error("Compose Image alpha must be a number from 0 to 1"); if (props.onLoad !== void 0) assertFunction(props.onLoad, "Image onLoad"); if (props.onError !== void 0) assertFunction(props.onError, "Image onError"); } function validateSnackbarProps(props) { var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = Object.entries(props)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var [key, value] = _step.value; if (key === "children") continue; if (!snackbarPropKeys.has(key)) throw new Error(`Compose Snackbar colors does not support ${key}`); if (key === "actionOnNewLine") { if (value !== void 0) assertBoolean(value, "Snackbar actionOnNewLine"); } else if (value !== void 0) assertComposeColorValue(value, `Snackbar ${key}`); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } function validateSnackbarShowOptions(options) { if (!options || typeof options !== "object" || Array.isArray(options)) throw new Error("Compose SnackbarHost message must be a non-empty string"); if (typeof options.message !== "string" || !options.message.trim()) throw new Error("Compose SnackbarHost message must be a non-empty string"); if (options.actionLabel !== void 0 && typeof options.actionLabel !== "string") throw new Error("Compose SnackbarHost actionLabel must be a string"); if (options.duration !== void 0) assertOneOf(options.duration, "SnackbarHost duration", snackbarDurations); if (options.withDismissAction !== void 0) assertBoolean(options.withDismissAction, "SnackbarHost withDismissAction"); } var navigationBarItemColorKeys = /* @__PURE__ */ new Set([ "selectedIconColor", "selectedTextColor", "indicatorColor", "unselectedIconColor", "unselectedTextColor", "disabledIconColor", "disabledTextColor" ]); function validateNavigationBarProps(props) { if (props.containerColor !== void 0) assertComposeColorValue(props.containerColor, "NavigationBar containerColor"); if (props.contentColor !== void 0) assertComposeColorValue(props.contentColor, "NavigationBar contentColor"); if (props.tonalElevation !== void 0) { assertFiniteNumber(props.tonalElevation, "NavigationBar tonalElevation"); if (props.tonalElevation < 0) throw new Error("Compose NavigationBar tonalElevation must be nonnegative"); } } function validateNavigationBarItemProps(props) { assertBoolean(props.selected, "NavigationBarItem selected"); assertFunction(props.onClick, "NavigationBarItem onClick"); assertOptionalString(props.label, "NavigationBarItem label"); assertString(props.icon, "NavigationBarItem icon", true); composeIconGlyph("NavigationBarItem icon", props.icon); assertOptionalBoolean(props.iconFilled, "NavigationBarItem iconFilled"); assertOptionalBoolean(props.enabled, "NavigationBarItem enabled"); assertOptionalBoolean(props.alwaysShowLabel, "NavigationBarItem alwaysShowLabel"); if (props.colors !== void 0) assertComposeColors(props.colors, navigationBarItemColorKeys, "NavigationBarItem"); } function validateSearchBarProps(props) { var owner = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "SearchBar"; assertString(props.query, `${owner} query`); assertFunction(props.onQueryChange, `${owner} onQueryChange`); assertBoolean(props.expanded, `${owner} expanded`); assertFunction(props.onExpandedChange, `${owner} onExpandedChange`); assertOptionalString(props.placeholder, `${owner} placeholder`); assertOptionalBoolean(props.enabled, `${owner} enabled`); if (props.onSearch !== void 0) assertFunction(props.onSearch, `${owner} onSearch`); if (props.containerColor !== void 0) assertComposeColorValue(props.containerColor, `${owner} containerColor`); } var dropdownMenuItemColorKeys = /* @__PURE__ */ new Set([ "textColor", "leadingIconColor", "trailingIconColor", "disabledTextColor", "disabledLeadingIconColor", "disabledTrailingIconColor" ]); function validateDropdownMenuProps(props) { assertBoolean(props.expanded, "DropdownMenu expanded"); assertFunction(props.onDismissRequest, "DropdownMenu onDismissRequest"); if (props.containerColor !== void 0) assertComposeColorValue(props.containerColor, "DropdownMenu containerColor"); } function validateDropdownMenuItemProps(props) { assertString(props.text, "DropdownMenuItem text", true); assertFunction(props.onClick, "DropdownMenuItem onClick"); assertOptionalBoolean(props.enabled, "DropdownMenuItem enabled"); if (props.leadingIcon !== void 0) { assertString(props.leadingIcon, "DropdownMenuItem leadingIcon", true); composeIconGlyph("DropdownMenuItem leadingIcon", props.leadingIcon); } if (props.trailingIcon !== void 0) { assertString(props.trailingIcon, "DropdownMenuItem trailingIcon", true); composeIconGlyph("DropdownMenuItem trailingIcon", props.trailingIcon); } assertOptionalBoolean(props.iconFilled, "DropdownMenuItem iconFilled"); if (props.colors !== void 0) assertComposeColors(props.colors, dropdownMenuItemColorKeys, "DropdownMenuItem"); } function validateExposedDropdownMenuBoxProps(props) { assertBoolean(props.expanded, "ExposedDropdownMenuBox expanded"); assertFunction(props.onExpandedChange, "ExposedDropdownMenuBox onExpandedChange"); assertString(props.value, "ExposedDropdownMenuBox value"); assertOptionalString(props.placeholder, "ExposedDropdownMenuBox placeholder"); assertOptionalBoolean(props.enabled, "ExposedDropdownMenuBox enabled"); } function validatePullToRefreshBoxProps(props) { assertBoolean(props.isRefreshing, "PullToRefreshBox isRefreshing"); assertFunction(props.onRefresh, "PullToRefreshBox onRefresh"); assertOptionalBoolean(props.enabled, "PullToRefreshBox enabled"); } var animatedVisibilityTransitions = [ "fade", "scale", "slideVertically", "expandVertically" ]; function validateTooltipBoxProps(props) { assertString(props.text, "TooltipBox text", true); assertOptionalString(props.title, "TooltipBox title"); assertOptionalBoolean(props.enabled, "TooltipBox enabled"); } function validateAnimatedVisibilityProps(props) { assertBoolean(props.visible, "AnimatedVisibility visible"); if (props.enter !== void 0) assertOneOf(props.enter, "AnimatedVisibility enter", animatedVisibilityTransitions); if (props.exit !== void 0) assertOneOf(props.exit, "AnimatedVisibility exit", animatedVisibilityTransitions); } function validateModalBottomSheetProps(props) { assertFunction(props.onDismissRequest, "ModalBottomSheet onDismissRequest"); if (props.properties !== void 0) { if (!props.properties || typeof props.properties !== "object" || Array.isArray(props.properties)) throw new Error("Compose ModalBottomSheet properties must be an object"); var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = Object.entries(props.properties)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var [key, value] = _step.value; if (!sheetPropertyKeys.has(key)) throw new Error(`Compose ModalBottomSheet properties has unknown key ${key}`); if (value !== void 0) assertBoolean(value, `ModalBottomSheet properties ${key}`); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } if (props.scrimColor !== void 0) assertComposeColorValue(props.scrimColor, "ModalBottomSheet scrimColor"); assertOptionalBoolean(props.skipPartiallyExpanded, "ModalBottomSheet skipPartiallyExpanded"); assertOptionalBoolean(props.initialFullyExpanded, "ModalBottomSheet initialFullyExpanded"); assertOptionalBoolean(props.showDragHandle, "ModalBottomSheet showDragHandle"); assertOptionalBoolean(props.sheetGesturesEnabled, "ModalBottomSheet sheetGesturesEnabled"); } export { animatedVisibilityTransitions, assertBoolean, assertComposeStyle, assertFiniteNumber, assertFunction, assertOneOf, assertOptionalBoolean, assertOptionalString, assertString, buttonTones, buttonVariants, composeIconGlyph, composeUtcDay, contentAlignments, fontWeights, horizontalAlignments, horizontalArrangements, imageContentScales, lazyAlignments, lazyRowAlignments, progressStrokeCaps, progressVariants, snackbarDurations, textAlignments, textFieldCapitalizations, textFieldImeActions, textFieldKeyboardTypes, textFieldVariants, validateAlertDialogProps, validateAnimatedVisibilityProps, validateBadgeProps, validateBoxProps, validateButtonProps, validateCardProps, validateCheckboxProps, validateChipProps, validateColumnProps, validateDatePickerProps, validateDialogProps, validateDividerProps, validateDropdownMenuItemProps, validateDropdownMenuProps, validateExposedDropdownMenuBoxProps, validateFloatingActionButtonProps, validateFlowRowProps, validateIconButtonProps, validateIconProps, validateImageProps, validateLazyColumnProps, validateLazyRowProps, validateListItemProps, validateLoadingIndicatorProps, validateModalBottomSheetProps, validateNavigationBarItemProps, validateNavigationBarProps, validatePickerDialogProps, validateProgressIndicatorProps, validatePullToRefreshBoxProps, validateRadioButtonProps, validateRowProps, validateSearchBarProps, validateSegmentedButtonProps, validateSliderProps, validateSnackbarProps, validateSnackbarShowOptions, validateSurfaceProps, validateSwitchProps, validateTextFieldProps, validateTextProps, validateTimePickerProps, validateToggleButtonProps, validateTooltipBoxProps, verticalAlignments, verticalArrangements }; //# sourceMappingURL=composeValidation.native.js.map