@coinbase/cds-mobile 9.5.0 → 9.6.1

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/CHANGELOG.md CHANGED
@@ -8,6 +8,18 @@ All notable changes to this project will be documented in this file.
8
8
 
9
9
  <!-- template-start -->
10
10
 
11
+ ## 9.6.1 (7/7/2026 PST)
12
+
13
+ #### 🐞 Fixes
14
+
15
+ - Fix: memoize fallback styles. [[#782](https://github.com/coinbase/cds/pull/782)]
16
+
17
+ ## 9.6.0 (7/6/2026 PST)
18
+
19
+ #### 🚀 Updates
20
+
21
+ - Feat: add TextFallback. [[#780](https://github.com/coinbase/cds/pull/780)]
22
+
11
23
  ## 9.5.0 (6/25/2026 PST)
12
24
 
13
25
  #### 🚀 Updates
@@ -1 +1 @@
1
- {"version":3,"file":"ListCellFallback.d.ts","sourceRoot":"","sources":["../../src/cells/ListCellFallback.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,KAAK,SAAS,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAC;AACpG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAS1E,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAgD,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGlG,MAAM,MAAM,yBAAyB,GAAG,WAAW,GACjD,sBAAsB,GACtB,IAAI,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,GACpD,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,cAAc,GAAG,cAAc,GAAG,gBAAgB,CAAC,GAAG;IACxF,mDAAmD;IACnD,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,2FAA2F;IAC3F,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,iCAAiC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEJ,MAAM,MAAM,qBAAqB,GAAG,yBAAyB,GAAG;IAC9D,+DAA+D;IAC/D,MAAM,CAAC,EAAE;QACP,kEAAkE;QAClE,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClC,4CAA4C;QAC5C,MAAM,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9B,+CAA+C;QAC/C,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QACjC,2CAA2C;QAC3C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAC7B,iDAAiD;QACjD,WAAW,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,8CAA8C;QAC9C,QAAQ,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAChC,iDAAiD;QACjD,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;KAClC,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,gBAAgB,6DAkM3B,CAAC"}
1
+ {"version":3,"file":"ListCellFallback.d.ts","sourceRoot":"","sources":["../../src/cells/ListCellFallback.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,KAAK,SAAS,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAC;AACpG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAQ1E,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAgD,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGlG,MAAM,MAAM,yBAAyB,GAAG,WAAW,GACjD,sBAAsB,GACtB,IAAI,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,GACpD,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,cAAc,GAAG,cAAc,GAAG,gBAAgB,CAAC,GAAG;IACxF,mDAAmD;IACnD,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,2FAA2F;IAC3F,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,iCAAiC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEJ,MAAM,MAAM,qBAAqB,GAAG,yBAAyB,GAAG;IAC9D,+DAA+D;IAC/D,MAAM,CAAC,EAAE;QACP,kEAAkE;QAClE,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClC,4CAA4C;QAC5C,MAAM,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9B,+CAA+C;QAC/C,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QACjC,2CAA2C;QAC3C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAC7B,iDAAiD;QACjD,WAAW,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,8CAA8C;QAC9C,QAAQ,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAChC,iDAAiD;QACjD,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;KAClC,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,gBAAgB,6DAwK3B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ThemeVars } from '@coinbase/cds-common/core/theme';
2
+ import { type FallbackBaseProps, type FallbackProps } from '../layout/Fallback';
3
+ export type TextFallbackBaseProps = Omit<FallbackBaseProps, 'height'> & {
4
+ /** Font token used to size the fallback to match text line height. */
5
+ font: ThemeVars.FontSize;
6
+ };
7
+ export type TextFallbackProps = Omit<FallbackProps, 'height'> & Pick<TextFallbackBaseProps, 'font'>;
8
+ /**
9
+ * Loading placeholder sized to match a typography font token's line height.
10
+ */
11
+ export declare const TextFallback: import('react').NamedExoticComponent<TextFallbackProps>;
12
+ //# sourceMappingURL=TextFallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextFallback.d.ts","sourceRoot":"","sources":["../../src/typography/TextFallback.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EAAY,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE1F,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG;IACtE,sEAAsE;IACtE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAEpG;;GAEG;AACH,eAAO,MAAM,YAAY,yDAyBvB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from './Link';
2
2
  export * from './Text';
3
3
  export * from './TextBody';
4
+ export * from './TextFallback';
4
5
  export * from './TextCaption';
5
6
  export * from './TextDisplay1';
6
7
  export * from './TextDisplay2';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/typography/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/typography/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -5,9 +5,8 @@ import { memo, useMemo } from 'react';
5
5
  import { StyleSheet, Text } from 'react-native';
6
6
  import { getRectWidthVariant } from '@coinbase/cds-common/utils/getRectWidthVariant';
7
7
  import { useComponentConfig } from '../hooks/useComponentConfig';
8
- import { useTheme } from '../hooks/useTheme';
9
- import { Fallback } from '../layout/Fallback';
10
8
  import { VStack } from '../layout/VStack';
9
+ import { TextFallback } from '../typography/TextFallback';
11
10
  import { Cell } from './Cell';
12
11
  import { CellAccessory } from './CellAccessory';
13
12
  import { condensedInnerSpacing, condensedOuterSpacing } from './ListCell';
@@ -35,21 +34,20 @@ export const ListCellFallback = /*#__PURE__*/memo(function ListCellFallback(_pro
35
34
  accessibilityLabel = 'Loading'
36
35
  } = mergedProps,
37
36
  props = _objectWithoutPropertiesLoose(mergedProps, _excluded);
38
- const theme = useTheme();
39
37
  const descriptionFallback = useMemo(() => {
40
38
  if (!description) {
41
39
  return null;
42
40
  }
43
- return /*#__PURE__*/_jsx(Fallback, {
41
+ return /*#__PURE__*/_jsx(TextFallback, {
44
42
  "aria-hidden": true,
45
43
  disableRandomRectWidth: disableRandomRectWidth,
46
- height: spacingVariant === 'condensed' ? theme.lineHeight.label2 : theme.lineHeight.body,
44
+ font: spacingVariant === 'condensed' ? 'label2' : 'body',
47
45
  rectWidthVariant: getRectWidthVariant(rectWidthVariant, 0),
48
46
  style: styles == null ? void 0 : styles.description,
49
47
  testID: "list-cell-fallback-description",
50
48
  width: 110
51
49
  });
52
- }, [description, disableRandomRectWidth, rectWidthVariant, spacingVariant, styles == null ? void 0 : styles.description, theme.lineHeight.body, theme.lineHeight.label2]);
50
+ }, [description, disableRandomRectWidth, rectWidthVariant, spacingVariant, styles == null ? void 0 : styles.description]);
53
51
  const detailFallback = useMemo(() => {
54
52
  if (!detail && !subdetail) {
55
53
  return null;
@@ -57,58 +55,57 @@ export const ListCellFallback = /*#__PURE__*/memo(function ListCellFallback(_pro
57
55
  return /*#__PURE__*/_jsxs(VStack, {
58
56
  alignContent: "flex-end",
59
57
  alignItems: "flex-end",
60
- gap: 0.5,
61
58
  justifyContent: "center",
62
- children: [!!detail && /*#__PURE__*/_jsx(Fallback, {
59
+ children: [!!detail && /*#__PURE__*/_jsx(TextFallback, {
63
60
  "aria-hidden": true,
64
61
  disableRandomRectWidth: disableRandomRectWidth,
65
- height: theme.lineHeight.body,
62
+ font: "body",
66
63
  rectWidthVariant: getRectWidthVariant(rectWidthVariant, 1),
67
64
  style: styles == null ? void 0 : styles.detail,
68
65
  testID: "list-cell-fallback-detail",
69
66
  width: 60
70
- }), !!subdetail && /*#__PURE__*/_jsx(Fallback, {
67
+ }), !!subdetail && /*#__PURE__*/_jsx(TextFallback, {
71
68
  "aria-hidden": true,
72
69
  disableRandomRectWidth: disableRandomRectWidth,
73
- height: spacingVariant === 'condensed' ? theme.lineHeight.label2 : theme.lineHeight.body,
70
+ font: spacingVariant === 'condensed' ? 'label2' : 'body',
74
71
  rectWidthVariant: getRectWidthVariant(rectWidthVariant, 1),
75
72
  style: styles == null ? void 0 : styles.subdetail,
76
73
  testID: "list-cell-fallback-subdetail",
77
74
  width: 60
78
75
  })]
79
76
  });
80
- }, [detail, disableRandomRectWidth, rectWidthVariant, spacingVariant, styles == null ? void 0 : styles.detail, styles == null ? void 0 : styles.subdetail, subdetail, theme.lineHeight.body, theme.lineHeight.label2]);
77
+ }, [detail, disableRandomRectWidth, rectWidthVariant, spacingVariant, styles == null ? void 0 : styles.detail, styles == null ? void 0 : styles.subdetail, subdetail]);
81
78
  const helperTextFallback = useMemo(() => {
82
79
  if (!helperText) {
83
80
  return null;
84
81
  }
85
- return /*#__PURE__*/_jsx(Fallback, {
82
+ return /*#__PURE__*/_jsx(TextFallback, {
86
83
  "aria-hidden": true,
87
84
  disableRandomRectWidth: disableRandomRectWidth,
88
- height: theme.lineHeight.body,
85
+ font: "body",
89
86
  rectWidthVariant: getRectWidthVariant(rectWidthVariant, 4),
90
87
  style: styles == null ? void 0 : styles.helperText,
91
88
  testID: "list-cell-fallback-helper-text",
92
89
  width: "85%"
93
90
  });
94
- }, [disableRandomRectWidth, helperText, rectWidthVariant, styles == null ? void 0 : styles.helperText, theme.lineHeight.body]);
91
+ }, [disableRandomRectWidth, helperText, rectWidthVariant, styles == null ? void 0 : styles.helperText]);
95
92
  const subtitleFallback = useMemo(() => {
96
93
  if (!subtitle) {
97
94
  return null;
98
95
  }
99
- return /*#__PURE__*/_jsx(Fallback, {
96
+ return /*#__PURE__*/_jsx(TextFallback, {
100
97
  "aria-hidden": true,
101
98
  disableRandomRectWidth: disableRandomRectWidth,
102
- height: theme.lineHeight.label1,
99
+ font: "label1",
103
100
  rectWidthVariant: getRectWidthVariant(rectWidthVariant, 2),
104
101
  style: styles == null ? void 0 : styles.subtitle,
105
102
  testID: "list-cell-fallback-subtitle",
106
103
  width: 80
107
104
  });
108
- }, [disableRandomRectWidth, rectWidthVariant, styles == null ? void 0 : styles.subtitle, subtitle, theme.lineHeight.label1]);
105
+ }, [disableRandomRectWidth, rectWidthVariant, styles == null ? void 0 : styles.subtitle, subtitle]);
109
106
  const mediaFallback = useMemo(() => {
110
107
  if (!media) {
111
- return;
108
+ return undefined;
112
109
  }
113
110
  return /*#__PURE__*/_jsx(MediaFallback, {
114
111
  "aria-hidden": true,
@@ -120,16 +117,16 @@ export const ListCellFallback = /*#__PURE__*/memo(function ListCellFallback(_pro
120
117
  if (!title) {
121
118
  return null;
122
119
  }
123
- return /*#__PURE__*/_jsx(Fallback, {
120
+ return /*#__PURE__*/_jsx(TextFallback, {
124
121
  "aria-hidden": true,
125
122
  disableRandomRectWidth: disableRandomRectWidth,
126
- height: theme.lineHeight.headline,
123
+ font: "headline",
127
124
  rectWidthVariant: getRectWidthVariant(rectWidthVariant, 3),
128
125
  style: styles == null ? void 0 : styles.title,
129
126
  testID: "list-cell-fallback-title",
130
127
  width: 90
131
128
  });
132
- }, [disableRandomRectWidth, rectWidthVariant, styles == null ? void 0 : styles.title, theme.lineHeight.headline, title]);
129
+ }, [disableRandomRectWidth, rectWidthVariant, styles == null ? void 0 : styles.title, title]);
133
130
  return /*#__PURE__*/_jsxs(Cell, _extends({
134
131
  accessory: accessory ? /*#__PURE__*/_jsx(CellAccessory, {
135
132
  type: accessory
@@ -149,7 +146,6 @@ export const ListCellFallback = /*#__PURE__*/memo(function ListCellFallback(_pro
149
146
  style: localStyles.visuallyHidden,
150
147
  children: accessibilityLabel
151
148
  }), /*#__PURE__*/_jsxs(VStack, {
152
- gap: 0.5,
153
149
  children: [titleFallback, subtitleFallback, descriptionFallback]
154
150
  })]
155
151
  }));
@@ -0,0 +1,42 @@
1
+ const _excluded = ["font", "style"];
2
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
3
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
4
+ import { memo, useMemo } from 'react';
5
+ import { useWindowDimensions } from 'react-native';
6
+ import { useTheme } from '../hooks/useTheme';
7
+ import { Fallback } from '../layout/Fallback';
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ /**
10
+ * Loading placeholder sized to match a typography font token's line height.
11
+ */
12
+ export const TextFallback = /*#__PURE__*/memo(function TextFallback(_ref) {
13
+ let {
14
+ font,
15
+ style
16
+ } = _ref,
17
+ props = _objectWithoutPropertiesLoose(_ref, _excluded);
18
+ const theme = useTheme();
19
+ const {
20
+ fontScale
21
+ } = useWindowDimensions();
22
+ const {
23
+ height,
24
+ paddingVertical
25
+ } = useMemo(() => {
26
+ const fontSize = theme.fontSize[font] * fontScale;
27
+ const lineHeight = theme.lineHeight[font] * fontScale;
28
+ const lineHeightOffset = lineHeight - fontSize;
29
+ return {
30
+ height: fontSize,
31
+ paddingVertical: Math.max(lineHeightOffset, 0) / 2
32
+ };
33
+ }, [font, fontScale, theme]);
34
+ const fallbackStyle = useMemo(() => [{
35
+ paddingTop: paddingVertical,
36
+ paddingBottom: paddingVertical
37
+ }, style], [paddingVertical, style]);
38
+ return /*#__PURE__*/_jsx(Fallback, _extends({
39
+ height: height,
40
+ style: fallbackStyle
41
+ }, props));
42
+ });
@@ -1,6 +1,7 @@
1
1
  export * from './Link';
2
2
  export * from './Text';
3
3
  export * from './TextBody';
4
+ export * from './TextFallback';
4
5
  export * from './TextCaption';
5
6
  export * from './TextDisplay1';
6
7
  export * from './TextDisplay2';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cds-mobile",
3
- "version": "9.5.0",
3
+ "version": "9.6.1",
4
4
  "description": "Coinbase Design System - Mobile",
5
5
  "repository": {
6
6
  "type": "git",
@@ -206,9 +206,9 @@
206
206
  "react-native-worklets": "0.5.2"
207
207
  },
208
208
  "dependencies": {
209
- "@coinbase/cds-common": "^9.5.0",
209
+ "@coinbase/cds-common": "^9.6.1",
210
210
  "@coinbase/cds-icons": "^5.20.0",
211
- "@coinbase/cds-illustrations": "^4.43.0",
211
+ "@coinbase/cds-illustrations": "^4.44.0",
212
212
  "@coinbase/cds-lottie-files": "^3.3.4",
213
213
  "@coinbase/cds-utils": "^2.3.5",
214
214
  "@floating-ui/react-native": "^0.10.5",