@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 +12 -0
- package/dts/cells/ListCellFallback.d.ts.map +1 -1
- package/dts/typography/TextFallback.d.ts +12 -0
- package/dts/typography/TextFallback.d.ts.map +1 -0
- package/dts/typography/index.d.ts +1 -0
- package/dts/typography/index.d.ts.map +1 -1
- package/esm/cells/ListCellFallback.js +19 -23
- package/esm/typography/TextFallback.js +42 -0
- package/esm/typography/index.js +1 -0
- package/package.json +3 -3
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;
|
|
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 +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(
|
|
41
|
+
return /*#__PURE__*/_jsx(TextFallback, {
|
|
44
42
|
"aria-hidden": true,
|
|
45
43
|
disableRandomRectWidth: disableRandomRectWidth,
|
|
46
|
-
|
|
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
|
|
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(
|
|
59
|
+
children: [!!detail && /*#__PURE__*/_jsx(TextFallback, {
|
|
63
60
|
"aria-hidden": true,
|
|
64
61
|
disableRandomRectWidth: disableRandomRectWidth,
|
|
65
|
-
|
|
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(
|
|
67
|
+
}), !!subdetail && /*#__PURE__*/_jsx(TextFallback, {
|
|
71
68
|
"aria-hidden": true,
|
|
72
69
|
disableRandomRectWidth: disableRandomRectWidth,
|
|
73
|
-
|
|
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
|
|
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(
|
|
82
|
+
return /*#__PURE__*/_jsx(TextFallback, {
|
|
86
83
|
"aria-hidden": true,
|
|
87
84
|
disableRandomRectWidth: disableRandomRectWidth,
|
|
88
|
-
|
|
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
|
|
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(
|
|
96
|
+
return /*#__PURE__*/_jsx(TextFallback, {
|
|
100
97
|
"aria-hidden": true,
|
|
101
98
|
disableRandomRectWidth: disableRandomRectWidth,
|
|
102
|
-
|
|
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
|
|
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(
|
|
120
|
+
return /*#__PURE__*/_jsx(TextFallback, {
|
|
124
121
|
"aria-hidden": true,
|
|
125
122
|
disableRandomRectWidth: disableRandomRectWidth,
|
|
126
|
-
|
|
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,
|
|
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
|
+
});
|
package/esm/typography/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coinbase/cds-mobile",
|
|
3
|
-
"version": "9.
|
|
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.
|
|
209
|
+
"@coinbase/cds-common": "^9.6.1",
|
|
210
210
|
"@coinbase/cds-icons": "^5.20.0",
|
|
211
|
-
"@coinbase/cds-illustrations": "^4.
|
|
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",
|