@yahoo/uds-mobile 2.13.0 → 2.15.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.
Files changed (149) hide show
  1. package/README.md +3 -1
  2. package/dist/components/Avatar/Avatar.cjs +45 -0
  3. package/dist/components/Avatar/Avatar.d.cts +19 -0
  4. package/dist/components/Avatar/Avatar.d.cts.map +1 -0
  5. package/dist/components/Avatar/Avatar.d.ts +19 -0
  6. package/dist/components/Avatar/Avatar.d.ts.map +1 -0
  7. package/dist/components/Avatar/Avatar.js +45 -0
  8. package/dist/components/Avatar/Avatar.js.map +1 -0
  9. package/dist/components/Avatar/AvatarIcon.cjs +47 -0
  10. package/dist/components/Avatar/AvatarIcon.d.cts +9 -0
  11. package/dist/components/Avatar/AvatarIcon.d.cts.map +1 -0
  12. package/dist/components/Avatar/AvatarIcon.d.ts +9 -0
  13. package/dist/components/Avatar/AvatarIcon.d.ts.map +1 -0
  14. package/dist/components/Avatar/AvatarIcon.js +47 -0
  15. package/dist/components/Avatar/AvatarIcon.js.map +1 -0
  16. package/dist/components/Avatar/AvatarImage.cjs +81 -0
  17. package/dist/components/Avatar/AvatarImage.d.cts +9 -0
  18. package/dist/components/Avatar/AvatarImage.d.cts.map +1 -0
  19. package/dist/components/Avatar/AvatarImage.d.ts +9 -0
  20. package/dist/components/Avatar/AvatarImage.d.ts.map +1 -0
  21. package/dist/components/Avatar/AvatarImage.js +81 -0
  22. package/dist/components/Avatar/AvatarImage.js.map +1 -0
  23. package/dist/components/Avatar/AvatarText.cjs +49 -0
  24. package/dist/components/Avatar/AvatarText.d.cts +9 -0
  25. package/dist/components/Avatar/AvatarText.d.cts.map +1 -0
  26. package/dist/components/Avatar/AvatarText.d.ts +9 -0
  27. package/dist/components/Avatar/AvatarText.d.ts.map +1 -0
  28. package/dist/components/Avatar/AvatarText.js +49 -0
  29. package/dist/components/Avatar/AvatarText.js.map +1 -0
  30. package/dist/components/Avatar/index.cjs +10 -0
  31. package/dist/components/Avatar/index.d.cts +7 -0
  32. package/dist/components/Avatar/index.d.ts +7 -0
  33. package/dist/components/Avatar/index.js +6 -0
  34. package/dist/components/Avatar/types.cjs +1 -0
  35. package/dist/components/Avatar/types.d.cts +28 -0
  36. package/dist/components/Avatar/types.d.cts.map +1 -0
  37. package/dist/components/Avatar/types.d.ts +28 -0
  38. package/dist/components/Avatar/types.d.ts.map +1 -0
  39. package/dist/components/Avatar/types.js +1 -0
  40. package/dist/components/Avatar/utils.cjs +38 -0
  41. package/dist/components/Avatar/utils.d.cts +14 -0
  42. package/dist/components/Avatar/utils.d.cts.map +1 -0
  43. package/dist/components/Avatar/utils.d.ts +14 -0
  44. package/dist/components/Avatar/utils.d.ts.map +1 -0
  45. package/dist/components/Avatar/utils.js +35 -0
  46. package/dist/components/Avatar/utils.js.map +1 -0
  47. package/dist/components/Badge.cjs +1 -1
  48. package/dist/components/Badge.js +1 -1
  49. package/dist/components/Chip/Chip.cjs +54 -0
  50. package/dist/components/Chip/Chip.d.cts +19 -0
  51. package/dist/components/Chip/Chip.d.cts.map +1 -0
  52. package/dist/components/Chip/Chip.d.ts +19 -0
  53. package/dist/components/Chip/Chip.d.ts.map +1 -0
  54. package/dist/components/Chip/Chip.js +54 -0
  55. package/dist/components/Chip/Chip.js.map +1 -0
  56. package/dist/components/Chip/ChipBase.cjs +119 -0
  57. package/dist/components/Chip/ChipBase.d.cts +13 -0
  58. package/dist/components/Chip/ChipBase.d.cts.map +1 -0
  59. package/dist/components/Chip/ChipBase.d.ts +13 -0
  60. package/dist/components/Chip/ChipBase.d.ts.map +1 -0
  61. package/dist/components/Chip/ChipBase.js +116 -0
  62. package/dist/components/Chip/ChipBase.js.map +1 -0
  63. package/dist/components/Chip/ChipButton.cjs +18 -0
  64. package/dist/components/Chip/ChipButton.d.cts +9 -0
  65. package/dist/components/Chip/ChipButton.d.cts.map +1 -0
  66. package/dist/components/Chip/ChipButton.d.ts +9 -0
  67. package/dist/components/Chip/ChipButton.d.ts.map +1 -0
  68. package/dist/components/Chip/ChipButton.js +18 -0
  69. package/dist/components/Chip/ChipButton.js.map +1 -0
  70. package/dist/components/Chip/ChipDismissible.cjs +49 -0
  71. package/dist/components/Chip/ChipDismissible.d.cts +9 -0
  72. package/dist/components/Chip/ChipDismissible.d.cts.map +1 -0
  73. package/dist/components/Chip/ChipDismissible.d.ts +9 -0
  74. package/dist/components/Chip/ChipDismissible.d.ts.map +1 -0
  75. package/dist/components/Chip/ChipDismissible.js +49 -0
  76. package/dist/components/Chip/ChipDismissible.js.map +1 -0
  77. package/dist/components/Chip/ChipToggle.cjs +32 -0
  78. package/dist/components/Chip/ChipToggle.d.cts +9 -0
  79. package/dist/components/Chip/ChipToggle.d.cts.map +1 -0
  80. package/dist/components/Chip/ChipToggle.d.ts +9 -0
  81. package/dist/components/Chip/ChipToggle.d.ts.map +1 -0
  82. package/dist/components/Chip/ChipToggle.js +32 -0
  83. package/dist/components/Chip/ChipToggle.js.map +1 -0
  84. package/dist/components/Chip/chipTheme.cjs +23 -0
  85. package/dist/components/Chip/chipTheme.d.cts +14 -0
  86. package/dist/components/Chip/chipTheme.d.cts.map +1 -0
  87. package/dist/components/Chip/chipTheme.d.ts +14 -0
  88. package/dist/components/Chip/chipTheme.d.ts.map +1 -0
  89. package/dist/components/Chip/chipTheme.js +24 -0
  90. package/dist/components/Chip/chipTheme.js.map +1 -0
  91. package/dist/components/Chip/index.cjs +10 -0
  92. package/dist/components/Chip/index.d.cts +7 -0
  93. package/dist/components/Chip/index.d.ts +7 -0
  94. package/dist/components/Chip/index.js +6 -0
  95. package/dist/components/Chip/types.cjs +1 -0
  96. package/dist/components/Chip/types.d.cts +76 -0
  97. package/dist/components/Chip/types.d.cts.map +1 -0
  98. package/dist/components/Chip/types.d.ts +76 -0
  99. package/dist/components/Chip/types.d.ts.map +1 -0
  100. package/dist/components/Chip/types.js +1 -0
  101. package/dist/components/Input.cjs +1 -1
  102. package/dist/components/Input.js +1 -1
  103. package/dist/components/{Radio.cjs → Radio/Radio.cjs} +32 -10
  104. package/dist/components/{Radio.d.cts → Radio/Radio.d.cts} +2 -2
  105. package/dist/components/Radio/Radio.d.cts.map +1 -0
  106. package/dist/components/{Radio.d.ts → Radio/Radio.d.ts} +2 -2
  107. package/dist/components/Radio/Radio.d.ts.map +1 -0
  108. package/dist/components/{Radio.js → Radio/Radio.js} +32 -10
  109. package/dist/components/Radio/Radio.js.map +1 -0
  110. package/dist/components/Radio/RadioGroup.cjs +84 -0
  111. package/dist/components/Radio/RadioGroup.d.cts +52 -0
  112. package/dist/components/Radio/RadioGroup.d.cts.map +1 -0
  113. package/dist/components/Radio/RadioGroup.d.ts +52 -0
  114. package/dist/components/Radio/RadioGroup.d.ts.map +1 -0
  115. package/dist/components/Radio/RadioGroup.js +84 -0
  116. package/dist/components/Radio/RadioGroup.js.map +1 -0
  117. package/dist/components/Radio/RadioGroupContext.cjs +12 -0
  118. package/dist/components/Radio/RadioGroupContext.d.cts +20 -0
  119. package/dist/components/Radio/RadioGroupContext.d.cts.map +1 -0
  120. package/dist/components/Radio/RadioGroupContext.d.ts +20 -0
  121. package/dist/components/Radio/RadioGroupContext.d.ts.map +1 -0
  122. package/dist/components/Radio/RadioGroupContext.js +11 -0
  123. package/dist/components/Radio/RadioGroupContext.js.map +1 -0
  124. package/dist/components/Radio/index.cjs +6 -0
  125. package/dist/components/Radio/index.d.cts +4 -0
  126. package/dist/components/Radio/index.d.ts +4 -0
  127. package/dist/components/Radio/index.js +4 -0
  128. package/dist/types/dist/index.d.cts +49 -2
  129. package/dist/types/dist/index.d.cts.map +1 -1
  130. package/dist/types/dist/index.d.ts +49 -2
  131. package/dist/types/dist/index.d.ts.map +1 -1
  132. package/package.json +23 -13
  133. package/dist/components/Avatar.cjs +0 -116
  134. package/dist/components/Avatar.d.cts +0 -68
  135. package/dist/components/Avatar.d.cts.map +0 -1
  136. package/dist/components/Avatar.d.ts +0 -68
  137. package/dist/components/Avatar.d.ts.map +0 -1
  138. package/dist/components/Avatar.js +0 -116
  139. package/dist/components/Avatar.js.map +0 -1
  140. package/dist/components/Chip.cjs +0 -139
  141. package/dist/components/Chip.d.cts +0 -82
  142. package/dist/components/Chip.d.cts.map +0 -1
  143. package/dist/components/Chip.d.ts +0 -82
  144. package/dist/components/Chip.d.ts.map +0 -1
  145. package/dist/components/Chip.js +0 -139
  146. package/dist/components/Chip.js.map +0 -1
  147. package/dist/components/Radio.d.cts.map +0 -1
  148. package/dist/components/Radio.d.ts.map +0 -1
  149. package/dist/components/Radio.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"Chip.d.cts","names":[],"sources":["../../src/components/Chip.tsx"],"mappings":";;;;;;;;UAYU,SAAA,SAAkB,IAAA,CAAK,SAAA;;EAE/B,GAAA,GAAM,GAAA,CAAI,IAAA;EAFF;EAIR,OAAA,GAAU,WAAA;;EAEV,IAAA,GAAO,QAAA;EAJG;EAMV,QAAA;EAJU;EAMV,QAAA;EAEY;EAAZ,SAAA,GAAY,YAAA;EAgBD;EAdX,OAAA,GAAU,YAAA;EAdoB;EAgB9B,QAAA;EAhB0B;EAkB1B,OAAA;EAhBA;EAkBA,SAAA;EAlBU;EAoBV,QAAA,IAAY,OAAA;EAlBF;EAoBV,SAAA;EAlBO;EAoBP,sBAAA;EAhBA;EAkBA,QAAA,GAAW,KAAA,CAAM,SAAA;AAAA;;;;;;;;;;;;;;;AAAS;;;;;;;;;;;;;;;;;;;;;;;;;;cA2CtB,IAAA,EAAI,OAAA,CAAA,oBAAA,CAAA,SAAA"}
@@ -1,82 +0,0 @@
1
-
2
- import { ChipSize, ChipVariant } from "../types/dist/index.js";
3
- import { IconSlotType } from "./IconSlot.js";
4
- import * as _$react from "react";
5
- import { Ref } from "react";
6
- import { View, ViewProps } from "react-native";
7
-
8
- //#region src/components/Chip.d.ts
9
- interface ChipProps extends Omit<ViewProps, 'children'> {
10
- /** Ref to the underlying View */
11
- ref?: Ref<View>;
12
- /** The visual style variant @default 'primary' */
13
- variant?: ChipVariant;
14
- /** The size of the chip @default 'md' */
15
- size?: ChipSize;
16
- /** Minimum width of the chip in pixels */
17
- minWidth?: number;
18
- /** Maximum width of the chip in pixels @default 200 */
19
- maxWidth?: number;
20
- /** Icon displayed at the start of the chip */
21
- startIcon?: IconSlotType;
22
- /** Icon displayed at the end of the chip */
23
- endIcon?: IconSlotType;
24
- /** Whether the chip is disabled */
25
- disabled?: boolean;
26
- /** Called when the chip is pressed. Makes the chip interactive. */
27
- onPress?: () => void;
28
- /** Whether the chip is toggled/selected. */
29
- isToggled?: boolean;
30
- /** Called when the chip toggle state changes. */
31
- onToggle?: (toggled: boolean) => void;
32
- /** Called when the dismiss button is pressed. Shows a dismiss icon. */
33
- onDismiss?: () => void;
34
- /** Accessibility label for the dismiss button. */
35
- dismissButtonAriaLabel?: string;
36
- /** Chip label content */
37
- children?: React.ReactNode;
38
- }
39
- /**
40
- * **A chip component for selections, filters, or actions**
41
- *
42
- * @description
43
- * Chips help people make selections, filter content, or trigger actions.
44
- * They can be toggleable, dismissible, or simple pressable elements.
45
- *
46
- * @category Interactive
47
- * @platform mobile
48
- *
49
- * @example
50
- * ```tsx
51
- * import { Chip } from '@yahoo/uds-mobile/Chip';
52
- *
53
- * // Basic chip
54
- * <Chip>Label</Chip>
55
- *
56
- * // Toggle chip
57
- * <Chip isToggled={selected} onToggle={setSelected}>Filter</Chip>
58
- *
59
- * // Dismissible chip
60
- * <Chip onDismiss={() => removeChip()}>Tag</Chip>
61
- *
62
- * // With icons
63
- * <Chip startIcon="Star" variant="brand">Favorite</Chip>
64
- * ```
65
- *
66
- * @usage
67
- * - Filters: For multi-select filtering options
68
- * - Tags: For displaying and removing tags
69
- * - Actions: For quick contextual actions
70
- *
71
- * @accessibility
72
- * - Toggle chips use `accessibilityRole="checkbox"` with checked state
73
- * - Action chips use `accessibilityRole="button"`
74
- * - Dismiss button has customizable `dismissButtonAriaLabel`
75
- *
76
- * @see {@link Badge} for non-interactive status indicators
77
- * @see {@link Button} for primary actions
78
- */
79
- declare const Chip: _$react.NamedExoticComponent<ChipProps>;
80
- //#endregion
81
- export { Chip, type ChipProps };
82
- //# sourceMappingURL=Chip.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Chip.d.ts","names":[],"sources":["../../src/components/Chip.tsx"],"mappings":";;;;;;;;UAYU,SAAA,SAAkB,IAAA,CAAK,SAAA;;EAE/B,GAAA,GAAM,GAAA,CAAI,IAAA;EAFF;EAIR,OAAA,GAAU,WAAA;;EAEV,IAAA,GAAO,QAAA;EAJG;EAMV,QAAA;EAJU;EAMV,QAAA;EAEY;EAAZ,SAAA,GAAY,YAAA;EAgBD;EAdX,OAAA,GAAU,YAAA;EAdoB;EAgB9B,QAAA;EAhB0B;EAkB1B,OAAA;EAhBA;EAkBA,SAAA;EAlBU;EAoBV,QAAA,IAAY,OAAA;EAlBF;EAoBV,SAAA;EAlBO;EAoBP,sBAAA;EAhBA;EAkBA,QAAA,GAAW,KAAA,CAAM,SAAA;AAAA;;;;;;;;;;;;;;;AAAS;;;;;;;;;;;;;;;;;;;;;;;;;;cA2CtB,IAAA,EAAI,OAAA,CAAA,oBAAA,CAAA,SAAA"}
@@ -1,139 +0,0 @@
1
- /*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
2
- import { IconSlot } from "./IconSlot.js";
3
- import { Text } from "./Text.js";
4
- import { HStack } from "./HStack.js";
5
- import { Pressable } from "./Pressable.js";
6
- import { memo, useCallback, useMemo } from "react";
7
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
- import { chipStyles } from "../../generated/styles";
9
- //#region src/components/Chip.tsx
10
- /**
11
- * **A chip component for selections, filters, or actions**
12
- *
13
- * @description
14
- * Chips help people make selections, filter content, or trigger actions.
15
- * They can be toggleable, dismissible, or simple pressable elements.
16
- *
17
- * @category Interactive
18
- * @platform mobile
19
- *
20
- * @example
21
- * ```tsx
22
- * import { Chip } from '@yahoo/uds-mobile/Chip';
23
- *
24
- * // Basic chip
25
- * <Chip>Label</Chip>
26
- *
27
- * // Toggle chip
28
- * <Chip isToggled={selected} onToggle={setSelected}>Filter</Chip>
29
- *
30
- * // Dismissible chip
31
- * <Chip onDismiss={() => removeChip()}>Tag</Chip>
32
- *
33
- * // With icons
34
- * <Chip startIcon="Star" variant="brand">Favorite</Chip>
35
- * ```
36
- *
37
- * @usage
38
- * - Filters: For multi-select filtering options
39
- * - Tags: For displaying and removing tags
40
- * - Actions: For quick contextual actions
41
- *
42
- * @accessibility
43
- * - Toggle chips use `accessibilityRole="checkbox"` with checked state
44
- * - Action chips use `accessibilityRole="button"`
45
- * - Dismiss button has customizable `dismissButtonAriaLabel`
46
- *
47
- * @see {@link Badge} for non-interactive status indicators
48
- * @see {@link Button} for primary actions
49
- */
50
- const Chip = memo(function Chip({ variant = "primary", size = "md", minWidth, maxWidth = 200, startIcon, endIcon, disabled = false, isToggled = false, onPress, onToggle, onDismiss, dismissButtonAriaLabel = "Dismiss", children, style, ref, ...rest }) {
51
- const isInteractive = Boolean(onPress || onToggle);
52
- const isDismissible = Boolean(onDismiss);
53
- const isDisabled = disabled;
54
- const toggleState = isToggled ? "on" : "off";
55
- chipStyles.useVariants({
56
- size,
57
- link: variant,
58
- dismissible: variant,
59
- toggle: toggleState
60
- });
61
- const handlePress = useCallback(() => {
62
- if (isDisabled) return;
63
- if (onToggle) onToggle(!isToggled);
64
- else if (onPress) onPress();
65
- }, [
66
- isDisabled,
67
- onToggle,
68
- isToggled,
69
- onPress
70
- ]);
71
- const handleDismiss = useCallback(() => {
72
- if (isDisabled) return;
73
- onDismiss?.();
74
- }, [isDisabled, onDismiss]);
75
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [
76
- startIcon && /* @__PURE__ */ jsx(IconSlot, {
77
- icon: startIcon,
78
- variant: "fill",
79
- style: chipStyles.icon
80
- }),
81
- /* @__PURE__ */ jsx(Text, {
82
- numberOfLines: 1,
83
- textAlign: "center",
84
- flexShrink: "1",
85
- style: chipStyles.text,
86
- children
87
- }),
88
- isDismissible ? /* @__PURE__ */ jsx(Pressable, {
89
- onPress: isDisabled ? void 0 : handleDismiss,
90
- disabled: isDisabled,
91
- accessibilityLabel: dismissButtonAriaLabel,
92
- accessibilityRole: "button",
93
- children: /* @__PURE__ */ jsx(IconSlot, {
94
- icon: endIcon ?? "Cross",
95
- variant: "fill",
96
- style: chipStyles.icon
97
- })
98
- }) : endIcon && /* @__PURE__ */ jsx(IconSlot, {
99
- icon: endIcon,
100
- variant: "fill",
101
- style: chipStyles.icon
102
- })
103
- ] });
104
- const a11yState = {
105
- disabled: isDisabled,
106
- checked: onToggle ? isToggled : void 0
107
- };
108
- const sharedProps = {
109
- ref,
110
- style: useMemo(() => [chipStyles.root, style], [chipStyles.root, style]),
111
- flexDirection: "row",
112
- alignItems: "center",
113
- overflow: "hidden",
114
- alignSelf: "flex-start",
115
- maxWidth,
116
- minWidth,
117
- disabled: isDisabled,
118
- opacity: isDisabled ? .5 : void 0,
119
- accessibilityState: a11yState,
120
- ...rest
121
- };
122
- if (isInteractive) return /* @__PURE__ */ jsx(Pressable, {
123
- onPress: handlePress,
124
- accessibilityRole: onToggle ? "checkbox" : "button",
125
- ...sharedProps,
126
- children: content
127
- });
128
- return /* @__PURE__ */ jsx(HStack, {
129
- accessibilityRole: isDismissible ? "button" : void 0,
130
- ...sharedProps,
131
- ...rest,
132
- children: content
133
- });
134
- });
135
- Chip.displayName = "Chip";
136
- //#endregion
137
- export { Chip };
138
-
139
- //# sourceMappingURL=Chip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Chip.js","names":[],"sources":["../../src/components/Chip.tsx"],"sourcesContent":["import type { ChipSize, ChipVariant } from '@yahoo/uds-types';\nimport type { Ref } from 'react';\nimport { memo, useCallback, useMemo } from 'react';\nimport type { View, ViewProps } from 'react-native';\n\nimport { chipStyles } from '../../generated/styles';\nimport { HStack } from './HStack';\nimport type { IconSlotType } from './IconSlot';\nimport { IconSlot } from './IconSlot';\nimport { Pressable } from './Pressable';\nimport { Text } from './Text';\n\ninterface ChipProps extends Omit<ViewProps, 'children'> {\n /** Ref to the underlying View */\n ref?: Ref<View>;\n /** The visual style variant @default 'primary' */\n variant?: ChipVariant;\n /** The size of the chip @default 'md' */\n size?: ChipSize;\n /** Minimum width of the chip in pixels */\n minWidth?: number;\n /** Maximum width of the chip in pixels @default 200 */\n maxWidth?: number;\n /** Icon displayed at the start of the chip */\n startIcon?: IconSlotType;\n /** Icon displayed at the end of the chip */\n endIcon?: IconSlotType;\n /** Whether the chip is disabled */\n disabled?: boolean;\n /** Called when the chip is pressed. Makes the chip interactive. */\n onPress?: () => void;\n /** Whether the chip is toggled/selected. */\n isToggled?: boolean;\n /** Called when the chip toggle state changes. */\n onToggle?: (toggled: boolean) => void;\n /** Called when the dismiss button is pressed. Shows a dismiss icon. */\n onDismiss?: () => void;\n /** Accessibility label for the dismiss button. */\n dismissButtonAriaLabel?: string;\n /** Chip label content */\n children?: React.ReactNode;\n}\n\n/**\n * **A chip component for selections, filters, or actions**\n *\n * @description\n * Chips help people make selections, filter content, or trigger actions.\n * They can be toggleable, dismissible, or simple pressable elements.\n *\n * @category Interactive\n * @platform mobile\n *\n * @example\n * ```tsx\n * import { Chip } from '@yahoo/uds-mobile/Chip';\n *\n * // Basic chip\n * <Chip>Label</Chip>\n *\n * // Toggle chip\n * <Chip isToggled={selected} onToggle={setSelected}>Filter</Chip>\n *\n * // Dismissible chip\n * <Chip onDismiss={() => removeChip()}>Tag</Chip>\n *\n * // With icons\n * <Chip startIcon=\"Star\" variant=\"brand\">Favorite</Chip>\n * ```\n *\n * @usage\n * - Filters: For multi-select filtering options\n * - Tags: For displaying and removing tags\n * - Actions: For quick contextual actions\n *\n * @accessibility\n * - Toggle chips use `accessibilityRole=\"checkbox\"` with checked state\n * - Action chips use `accessibilityRole=\"button\"`\n * - Dismiss button has customizable `dismissButtonAriaLabel`\n *\n * @see {@link Badge} for non-interactive status indicators\n * @see {@link Button} for primary actions\n */\nconst Chip = memo(function Chip({\n variant = 'primary',\n size = 'md',\n minWidth,\n maxWidth = 200,\n startIcon,\n endIcon,\n disabled = false,\n isToggled = false,\n onPress,\n onToggle,\n onDismiss,\n dismissButtonAriaLabel = 'Dismiss',\n children,\n style,\n ref,\n ...rest\n}: ChipProps) {\n const isInteractive = Boolean(onPress || onToggle);\n const isDismissible = Boolean(onDismiss);\n const isDisabled = disabled;\n // Determine which variant type to use for styling\n const toggleState = isToggled ? 'on' : 'off';\n\n // Apply layer-based styles\n // Note: Chip doesn't have disabled variants in theme - handled via opacity\n // Note: pressed state is applied dynamically via Pressable's style callback\n chipStyles.useVariants({\n size,\n link: variant,\n dismissible: variant,\n toggle: toggleState,\n });\n\n const handlePress = useCallback(() => {\n if (isDisabled) {\n return;\n }\n\n if (onToggle) {\n onToggle(!isToggled);\n } else if (onPress) {\n onPress();\n }\n }, [isDisabled, onToggle, isToggled, onPress]);\n\n const handleDismiss = useCallback(() => {\n if (isDisabled) {\n return;\n }\n onDismiss?.();\n }, [isDisabled, onDismiss]);\n\n const content = (\n <>\n {startIcon && <IconSlot icon={startIcon} variant=\"fill\" style={chipStyles.icon} />}\n <Text numberOfLines={1} textAlign=\"center\" flexShrink=\"1\" style={chipStyles.text}>\n {children}\n </Text>\n {isDismissible ? (\n <Pressable\n onPress={isDisabled ? undefined : handleDismiss}\n disabled={isDisabled}\n accessibilityLabel={dismissButtonAriaLabel}\n accessibilityRole=\"button\"\n >\n <IconSlot icon={endIcon ?? 'Cross'} variant=\"fill\" style={chipStyles.icon} />\n </Pressable>\n ) : (\n endIcon && <IconSlot icon={endIcon} variant=\"fill\" style={chipStyles.icon} />\n )}\n </>\n );\n\n const a11yState = {\n disabled: isDisabled,\n checked: onToggle ? isToggled : undefined,\n };\n\n const rootStyles = useMemo(() => [chipStyles.root, style], [chipStyles.root, style]);\n const sharedProps = {\n ref,\n style: rootStyles,\n flexDirection: 'row',\n alignItems: 'center',\n overflow: 'hidden',\n alignSelf: 'flex-start',\n maxWidth,\n minWidth,\n disabled: isDisabled,\n opacity: isDisabled ? 0.5 : undefined,\n accessibilityState: a11yState,\n ...rest,\n } as const;\n\n // Interactive chip (toggle or button)\n if (isInteractive) {\n return (\n <Pressable\n onPress={handlePress}\n accessibilityRole={onToggle ? 'checkbox' : 'button'}\n {...sharedProps}\n >\n {content}\n </Pressable>\n );\n }\n\n // Non-interactive chip (display only or dismissible)\n return (\n <HStack accessibilityRole={isDismissible ? 'button' : undefined} {...sharedProps} {...rest}>\n {content}\n </HStack>\n );\n});\n\nChip.displayName = 'Chip';\n\nexport { Chip, type ChipProps };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFA,MAAM,OAAO,KAAK,SAAS,KAAK,EAC9B,UAAU,WACV,OAAO,MACP,UACA,WAAW,KACX,WACA,SACA,WAAW,OACX,YAAY,OACZ,SACA,UACA,WACA,yBAAyB,WACzB,UACA,OACA,KACA,GAAG,QACS;CACZ,MAAM,gBAAgB,QAAQ,WAAW,SAAS;CAClD,MAAM,gBAAgB,QAAQ,UAAU;CACxC,MAAM,aAAa;CAEnB,MAAM,cAAc,YAAY,OAAO;CAKvC,WAAW,YAAY;EACrB;EACA,MAAM;EACN,aAAa;EACb,QAAQ;EACT,CAAC;CAEF,MAAM,cAAc,kBAAkB;EACpC,IAAI,YACF;EAGF,IAAI,UACF,SAAS,CAAC,UAAU;OACf,IAAI,SACT,SAAS;IAEV;EAAC;EAAY;EAAU;EAAW;EAAQ,CAAC;CAE9C,MAAM,gBAAgB,kBAAkB;EACtC,IAAI,YACF;EAEF,aAAa;IACZ,CAAC,YAAY,UAAU,CAAC;CAE3B,MAAM,UACJ,qBAAA,UAAA,EAAA,UAAA;EACG,aAAa,oBAAC,UAAD;GAAU,MAAM;GAAW,SAAQ;GAAO,OAAO,WAAW;GAAQ,CAAA;EAClF,oBAAC,MAAD;GAAM,eAAe;GAAG,WAAU;GAAS,YAAW;GAAI,OAAO,WAAW;GACzE;GACI,CAAA;EACN,gBACC,oBAAC,WAAD;GACE,SAAS,aAAa,KAAA,IAAY;GAClC,UAAU;GACV,oBAAoB;GACpB,mBAAkB;aAElB,oBAAC,UAAD;IAAU,MAAM,WAAW;IAAS,SAAQ;IAAO,OAAO,WAAW;IAAQ,CAAA;GACnE,CAAA,GAEZ,WAAW,oBAAC,UAAD;GAAU,MAAM;GAAS,SAAQ;GAAO,OAAO,WAAW;GAAQ,CAAA;EAE9E,EAAA,CAAA;CAGL,MAAM,YAAY;EAChB,UAAU;EACV,SAAS,WAAW,YAAY,KAAA;EACjC;CAGD,MAAM,cAAc;EAClB;EACA,OAHiB,cAAc,CAAC,WAAW,MAAM,MAAM,EAAE,CAAC,WAAW,MAAM,MAAM,CAGhE;EACjB,eAAe;EACf,YAAY;EACZ,UAAU;EACV,WAAW;EACX;EACA;EACA,UAAU;EACV,SAAS,aAAa,KAAM,KAAA;EAC5B,oBAAoB;EACpB,GAAG;EACJ;CAGD,IAAI,eACF,OACE,oBAAC,WAAD;EACE,SAAS;EACT,mBAAmB,WAAW,aAAa;EAC3C,GAAI;YAEH;EACS,CAAA;CAKhB,OACE,oBAAC,QAAD;EAAQ,mBAAmB,gBAAgB,WAAW,KAAA;EAAW,GAAI;EAAa,GAAI;YACnF;EACM,CAAA;EAEX;AAEF,KAAK,cAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Radio.d.cts","names":[],"sources":["../../src/components/Radio.tsx"],"mappings":";;;;;;;UAmBU,UAAA,SAAmB,IAAA,CAAK,SAAA,YAAqB,mBAAA;;EAErD,GAAA,GAAM,GAAA,CAAI,IAAA;EAFS;EAInB,cAAA;EAJgC;EAMhC,QAAA;EAJM;EAMN,QAAA;EARqD;EAUrD,QAAA,IAAY,OAAA;AAAA;;;;;;;;;;;;;;AAAgB;;;;;;;;;;;;;;;;;;;cAmDxB,KAAA,EAAK,OAAA,CAAA,oBAAA,CAAA,UAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Radio.d.ts","names":[],"sources":["../../src/components/Radio.tsx"],"mappings":";;;;;;;UAmBU,UAAA,SAAmB,IAAA,CAAK,SAAA,YAAqB,mBAAA;;EAErD,GAAA,GAAM,GAAA,CAAI,IAAA;EAFS;EAInB,cAAA;EAJgC;EAMhC,QAAA;EAJM;EAMN,QAAA;EARqD;EAUrD,QAAA,IAAY,OAAA;AAAA;;;;;;;;;;;;;;AAAgB;;;;;;;;;;;;;;;;;;;cAmDxB,KAAA,EAAK,OAAA,CAAA,oBAAA,CAAA,UAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Radio.js","names":["Pressable"],"sources":["../../src/components/Radio.tsx"],"sourcesContent":["import type { RadioVariant, UniversalRadioProps } from '@yahoo/uds-types';\nimport type { Ref } from 'react';\nimport { memo, useCallback, useId, useMemo, useState } from 'react';\nimport type { ViewProps } from 'react-native';\nimport { View } from 'react-native';\nimport Animated, { useAnimatedStyle, useDerivedValue, withSpring } from 'react-native-reanimated';\n\nimport { radioStyles } from '../../generated/styles';\nimport { BUTTON_SPRING_CONFIG, SCALE_EFFECTS } from '../motion';\nimport { FormLabel } from './FormLabel';\nimport { Pressable } from './Pressable';\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\n/** Derived from RadioValue - maps boolean to 'checked'/'unchecked' string literals */\ntype RadioValueState = 'checked' | 'unchecked';\n\ninterface RadioProps extends Omit<ViewProps, 'style'>, UniversalRadioProps {\n /** Ref to the underlying View */\n ref?: Ref<View>;\n /** Default checked state for uncontrolled mode */\n defaultChecked?: boolean;\n /** Whether the radio is disabled */\n disabled?: boolean;\n /** Whether the radio is required */\n required?: boolean;\n /** Callback fired when the checked state changes */\n onChange?: (checked: boolean) => void;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Variant Mapping */\n/* -------------------------------------------------------------------------- */\n\n/** All style variants available in the generated styles (includes error variants) */\ntype RadioStyleVariant = 'primary' | 'secondary' | 'alert' | 'alert-secondary';\n\nconst VARIANT_ERROR_MAP: Record<RadioVariant, RadioStyleVariant> = {\n primary: 'alert',\n secondary: 'alert-secondary',\n};\n\n/* -------------------------------------------------------------------------- */\n/* Radio Component */\n/* -------------------------------------------------------------------------- */\n\n/**\n * **⚙️ A radio component**\n *\n * @description\n * A radio component allows users to select one option from a set.\n * Unlike checkbox, radio buttons cannot have multiple selected in a group,\n * allowing only one selection at a time.\n *\n * @category Form\n * @platform mobile\n *\n * @example\n * ```tsx\n * import { Radio } from '@yahoo/uds-mobile/Radio';\n *\n * <Radio label=\"Option A\" />\n * <Radio label=\"Option B\" checked={true} onChange={setChecked} />\n * ```\n *\n * @usage\n * - Forms: For selecting a single option from multiple choices\n * - Settings: For toggling between mutually exclusive preferences\n *\n * @accessibility\n * - Sets `accessibilityRole=\"radio\"` automatically\n * - Announces checked/unchecked state\n * - Label is used as accessibility label\n * - Supports `reduceMotion` for users who prefer reduced motion\n *\n * @see {@link Checkbox} for multi-select options\n * @see {@link Switch} for binary toggles\n */\nconst Radio = memo(function Radio({\n // Radio props\n label,\n labelPosition = 'start',\n variant: variantProp = 'primary',\n size = 'md',\n checked: checkedProp,\n hasError,\n reduceMotion,\n // Native props\n defaultChecked,\n disabled,\n required,\n onChange,\n ref,\n ...viewProps\n}: RadioProps) {\n const generatedId = useId();\n const uid = `uds-radio-${generatedId}`;\n\n /* --------------------------------- State ---------------------------------- */\n const isControlled = checkedProp !== undefined;\n const [internalChecked, setInternalChecked] = useState<boolean>(\n isControlled ? checkedProp : (defaultChecked ?? false),\n );\n const [pressed, setPressed] = useState(false);\n\n // Use controlled value if provided, otherwise use internal state\n const checked = isControlled ? checkedProp : internalChecked;\n\n /* ------------------------------ Derived Values ---------------------------- */\n const valueState: RadioValueState = useMemo(() => {\n return checked ? 'checked' : 'unchecked';\n }, [checked]);\n\n /* -------------------------------- Animation ------------------------------- */\n const shouldAnimate = !reduceMotion;\n\n // Scale animation for press feedback (disabled when reduceMotion is true)\n const scaleProgress = useDerivedValue(\n () =>\n shouldAnimate\n ? withSpring(pressed ? SCALE_EFFECTS.down : SCALE_EFFECTS.none, BUTTON_SPRING_CONFIG)\n : SCALE_EFFECTS.none, // No scale effect when reduceMotion is true\n [pressed, shouldAnimate],\n );\n\n const radioAnimatedStyle = useAnimatedStyle(() => ({\n transform: [{ scale: scaleProgress.value }],\n }));\n\n /* -------------------------------- Handlers -------------------------------- */\n const handlePress = useCallback(() => {\n if (disabled) {\n return;\n }\n\n const newChecked = !checked;\n\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n\n onChange?.(newChecked);\n }, [disabled, checked, isControlled, onChange]);\n\n const handlePressIn = useCallback(() => {\n setPressed(true);\n }, []);\n\n const handlePressOut = useCallback(() => {\n setPressed(false);\n }, []);\n\n /* --------------------------------- Styles --------------------------------- */\n // Compute the style variant (primary/secondary maps to alert variants when hasError)\n const styleVariant: RadioStyleVariant = hasError ? VARIANT_ERROR_MAP[variantProp] : variantProp;\n\n radioStyles.useVariants({\n size,\n variant: styleVariant, // primary, secondary, alert, alert-secondary\n value: valueState, // checked, unchecked\n pressed,\n });\n\n const rootStyle = useMemo(\n () => [radioStyles.root, { opacity: disabled ? 0.5 : 1 }],\n [radioStyles.root, disabled],\n );\n\n const radioBoxStyle = useMemo(\n () => [\n radioStyles.radio,\n {\n alignItems: 'center' as const,\n justifyContent: 'center' as const,\n borderRadius: 9999,\n },\n radioAnimatedStyle,\n ],\n [radioStyles.radio, radioAnimatedStyle],\n );\n\n // Inner circle size: fixed 8x8px to match web implementation\n const INNER_CIRCLE_SIZE = 8;\n\n const circleStyle = useMemo(\n () => [\n radioStyles.radioCircle,\n {\n width: INNER_CIRCLE_SIZE,\n height: INNER_CIRCLE_SIZE,\n borderRadius: 9999,\n },\n ],\n [radioStyles.radioCircle],\n );\n\n /* ---------------------------- Render Helpers ------------------------------ */\n const labelContent = useMemo(() => {\n if (!label) {\n return null;\n }\n\n return (\n <FormLabel\n color=\"inherit\"\n variant=\"inherit\"\n label={label}\n required={required}\n showRequiredAsterisk={required}\n hasError={hasError}\n style={radioStyles.text}\n />\n );\n }, [label, required, hasError, radioStyles.text]);\n\n const a11yState = useMemo(\n () => ({\n disabled,\n checked,\n }),\n [disabled, checked],\n );\n\n /* --------------------------------- Render --------------------------------- */\n return (\n <Pressable\n ref={ref}\n nativeID={uid}\n onPress={handlePress}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n disabled={disabled}\n flexDirection={labelPosition === 'start' ? 'row' : 'row-reverse'}\n alignItems=\"center\"\n alignSelf=\"flex-start\"\n accessibilityRole=\"radio\"\n accessibilityState={a11yState}\n accessibilityLabel={typeof label === 'string' ? label : undefined}\n {...viewProps}\n style={rootStyle}\n >\n <Animated.View style={radioBoxStyle}>{checked && <View style={circleStyle} />}</Animated.View>\n\n {labelContent}\n </Pressable>\n );\n});\n\nRadio.displayName = 'Radio';\n\nexport { Radio, type RadioProps };\n"],"mappings":";;;;;;;;;;;AAuCA,MAAM,oBAA6D;CACjE,SAAS;CACT,WAAW;CACZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCD,MAAM,QAAQ,KAAK,SAAS,MAAM,EAEhC,OACA,gBAAgB,SAChB,SAAS,cAAc,WACvB,OAAO,MACP,SAAS,aACT,UACA,cAEA,gBACA,UACA,UACA,UACA,KACA,GAAG,aACU;CAEb,MAAM,MAAM,aADQ,OACgB;CAGpC,MAAM,eAAe,gBAAgB,KAAA;CACrC,MAAM,CAAC,iBAAiB,sBAAsB,SAC5C,eAAe,cAAe,kBAAkB,MACjD;CACD,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAG7C,MAAM,UAAU,eAAe,cAAc;CAG7C,MAAM,aAA8B,cAAc;EAChD,OAAO,UAAU,YAAY;IAC5B,CAAC,QAAQ,CAAC;CAGb,MAAM,gBAAgB,CAAC;CAGvB,MAAM,gBAAgB,sBAElB,gBACI,WAAW,UAAU,cAAc,OAAO,cAAc,MAAM,qBAAqB,GACnF,cAAc,MACpB,CAAC,SAAS,cAAc,CACzB;CAED,MAAM,qBAAqB,wBAAwB,EACjD,WAAW,CAAC,EAAE,OAAO,cAAc,OAAO,CAAC,EAC5C,EAAE;CAGH,MAAM,cAAc,kBAAkB;EACpC,IAAI,UACF;EAGF,MAAM,aAAa,CAAC;EAEpB,IAAI,CAAC,cACH,mBAAmB,WAAW;EAGhC,WAAW,WAAW;IACrB;EAAC;EAAU;EAAS;EAAc;EAAS,CAAC;CAE/C,MAAM,gBAAgB,kBAAkB;EACtC,WAAW,KAAK;IACf,EAAE,CAAC;CAEN,MAAM,iBAAiB,kBAAkB;EACvC,WAAW,MAAM;IAChB,EAAE,CAAC;CAIN,MAAM,eAAkC,WAAW,kBAAkB,eAAe;CAEpF,YAAY,YAAY;EACtB;EACA,SAAS;EACT,OAAO;EACP;EACD,CAAC;CAEF,MAAM,YAAY,cACV,CAAC,YAAY,MAAM,EAAE,SAAS,WAAW,KAAM,GAAG,CAAC,EACzD,CAAC,YAAY,MAAM,SAAS,CAC7B;CAED,MAAM,gBAAgB,cACd;EACJ,YAAY;EACZ;GACE,YAAY;GACZ,gBAAgB;GAChB,cAAc;GACf;EACD;EACD,EACD,CAAC,YAAY,OAAO,mBAAmB,CACxC;CAGD,MAAM,oBAAoB;CAE1B,MAAM,cAAc,cACZ,CACJ,YAAY,aACZ;EACE,OAAO;EACP,QAAQ;EACR,cAAc;EACf,CACF,EACD,CAAC,YAAY,YAAY,CAC1B;CAGD,MAAM,eAAe,cAAc;EACjC,IAAI,CAAC,OACH,OAAO;EAGT,OACE,oBAAC,WAAD;GACE,OAAM;GACN,SAAQ;GACD;GACG;GACV,sBAAsB;GACZ;GACV,OAAO,YAAY;GACnB,CAAA;IAEH;EAAC;EAAO;EAAU;EAAU,YAAY;EAAK,CAAC;CAEjD,MAAM,YAAY,eACT;EACL;EACA;EACD,GACD,CAAC,UAAU,QAAQ,CACpB;CAGD,OACE,qBAACA,aAAD;EACO;EACL,UAAU;EACV,SAAS;EACT,WAAW;EACX,YAAY;EACF;EACV,eAAe,kBAAkB,UAAU,QAAQ;EACnD,YAAW;EACX,WAAU;EACV,mBAAkB;EAClB,oBAAoB;EACpB,oBAAoB,OAAO,UAAU,WAAW,QAAQ,KAAA;EACxD,GAAI;EACJ,OAAO;YAdT,CAgBE,oBAAC,SAAS,MAAV;GAAe,OAAO;aAAgB,WAAW,oBAAC,MAAD,EAAM,OAAO,aAAe,CAAA;GAAiB,CAAA,EAE7F,aACS;;EAEd;AAEF,MAAM,cAAc"}