@tempoxyz/ds 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fonts/Inter-cyrillic-ext.woff2 +0 -0
- package/dist/fonts/Inter-cyrillic.woff2 +0 -0
- package/dist/fonts/Inter-greek-ext.woff2 +0 -0
- package/dist/fonts/Inter-greek.woff2 +0 -0
- package/dist/fonts/Inter-latin-ext.woff2 +0 -0
- package/dist/fonts/Inter-latin.woff2 +0 -0
- package/dist/fonts/Inter-symbols.woff2 +0 -0
- package/dist/fonts/Inter-vietnamese.woff2 +0 -0
- package/dist/mobile/Haptics.d.ts +39 -0
- package/dist/mobile/Haptics.d.ts.map +1 -0
- package/dist/mobile/Haptics.js +51 -0
- package/dist/mobile/Haptics.js.map +1 -0
- package/dist/mobile/components/Button.d.ts.map +1 -1
- package/dist/mobile/components/Button.js +3 -3
- package/dist/mobile/components/Button.js.map +1 -1
- package/dist/mobile/components/IconButton.d.ts.map +1 -1
- package/dist/mobile/components/IconButton.js +3 -3
- package/dist/mobile/components/IconButton.js.map +1 -1
- package/dist/mobile/components/Spinner.js +1 -1
- package/dist/mobile/components/Spinner.js.map +1 -1
- package/dist/mobile/components/TextButton.d.ts.map +1 -1
- package/dist/mobile/components/TextButton.js +3 -3
- package/dist/mobile/components/TextButton.js.map +1 -1
- package/dist/mobile/components/TextInput.js +1 -1
- package/dist/mobile/components/TextInput.js.map +1 -1
- package/dist/mobile/components/Toast.js +1 -1
- package/dist/mobile/components/Toast.js.map +1 -1
- package/dist/mobile/components/Toggle.d.ts.map +1 -1
- package/dist/mobile/components/Toggle.js +2 -2
- package/dist/mobile/components/Toggle.js.map +1 -1
- package/dist/mobile/index.d.ts +2 -0
- package/dist/mobile/index.d.ts.map +1 -1
- package/dist/mobile/index.js +2 -0
- package/dist/mobile/index.js.map +1 -1
- package/dist/mobile/useColor.d.ts +23 -0
- package/dist/mobile/useColor.d.ts.map +1 -0
- package/dist/mobile/useColor.js +29 -0
- package/dist/mobile/useColor.js.map +1 -0
- package/dist/web/components/Accordion.css +1 -1
- package/dist/web/components/Accordion.js +8 -8
- package/dist/web/components/Accordion.js.zyzz.json +1 -1
- package/dist/web/components/AlertDialog.css +1 -1
- package/dist/web/components/AlertDialog.js +2 -2
- package/dist/web/components/AlertDialog.js.zyzz.json +1 -1
- package/dist/web/components/Amount.css +1 -1
- package/dist/web/components/Amount.js +3 -3
- package/dist/web/components/Amount.js.zyzz.json +1 -1
- package/dist/web/components/AmountInput.css +1 -1
- package/dist/web/components/AmountInput.js +4 -4
- package/dist/web/components/AmountInput.js.zyzz.json +1 -1
- package/dist/web/components/AppShell.css +1 -1
- package/dist/web/components/AppShell.js +16 -16
- package/dist/web/components/AppShell.js.zyzz.json +1 -1
- package/dist/web/components/Autocomplete.js.zyzz.json +1 -1
- package/dist/web/components/Avatar.css +1 -1
- package/dist/web/components/Avatar.js +4 -6
- package/dist/web/components/Avatar.js.zyzz.json +1 -1
- package/dist/web/components/Banner.css +1 -1
- package/dist/web/components/Banner.js +5 -5
- package/dist/web/components/Banner.js.zyzz.json +1 -1
- package/dist/web/components/Breadcrumbs.css +1 -1
- package/dist/web/components/Breadcrumbs.js +6 -6
- package/dist/web/components/Breadcrumbs.js.zyzz.json +1 -1
- package/dist/web/components/Button.css +1 -1
- package/dist/web/components/Button.js +4 -4
- package/dist/web/components/Button.js.zyzz.json +1 -1
- package/dist/web/components/Calendar.css +1 -1
- package/dist/web/components/Calendar.js +7 -7
- package/dist/web/components/Calendar.js.zyzz.json +1 -1
- package/dist/web/components/Callout.css +1 -1
- package/dist/web/components/Callout.js +5 -5
- package/dist/web/components/Callout.js.zyzz.json +1 -1
- package/dist/web/components/Checkbox.css +1 -1
- package/dist/web/components/Checkbox.js +5 -5
- package/dist/web/components/Checkbox.js.zyzz.json +1 -1
- package/dist/web/components/CheckboxGroup.css +1 -1
- package/dist/web/components/CheckboxGroup.js +1 -1
- package/dist/web/components/CheckboxGroup.js.zyzz.json +1 -1
- package/dist/web/components/ChoiceGroup.css +1 -1
- package/dist/web/components/ChoiceGroup.js +5 -5
- package/dist/web/components/ChoiceGroup.js.zyzz.json +1 -1
- package/dist/web/components/Choicebox.css +1 -1
- package/dist/web/components/Choicebox.js +11 -11
- package/dist/web/components/Choicebox.js.zyzz.json +1 -1
- package/dist/web/components/Combobox.css +1 -1
- package/dist/web/components/Combobox.js +4 -4
- package/dist/web/components/Combobox.js.zyzz.json +1 -1
- package/dist/web/components/Container.css +1 -1
- package/dist/web/components/Container.js +1 -3
- package/dist/web/components/Container.js.zyzz.json +1 -1
- package/dist/web/components/CopyButton.css +1 -1
- package/dist/web/components/CopyButton.js +3 -3
- package/dist/web/components/CopyButton.js.zyzz.json +1 -1
- package/dist/web/components/DatePicker.css +1 -1
- package/dist/web/components/DatePicker.js +6 -6
- package/dist/web/components/DatePicker.js.zyzz.json +1 -1
- package/dist/web/components/Dialog.css +1 -1
- package/dist/web/components/Dialog.js +6 -6
- package/dist/web/components/Dialog.js.zyzz.json +1 -1
- package/dist/web/components/Drawer.css +1 -1
- package/dist/web/components/Drawer.js +4 -4
- package/dist/web/components/Drawer.js.zyzz.json +1 -1
- package/dist/web/components/Empty.css +1 -1
- package/dist/web/components/Empty.js +5 -5
- package/dist/web/components/Empty.js.zyzz.json +1 -1
- package/dist/web/components/Field.css +1 -1
- package/dist/web/components/Field.js +5 -5
- package/dist/web/components/Field.js.zyzz.json +1 -1
- package/dist/web/components/Fieldset.css +1 -1
- package/dist/web/components/Fieldset.js +2 -2
- package/dist/web/components/Fieldset.js.zyzz.json +1 -1
- package/dist/web/components/Frame.css +1 -1
- package/dist/web/components/Frame.js +8 -10
- package/dist/web/components/Frame.js.zyzz.json +1 -1
- package/dist/web/components/Gauge.css +1 -1
- package/dist/web/components/Gauge.js +6 -6
- package/dist/web/components/Gauge.js.zyzz.json +1 -1
- package/dist/web/components/Grid.css +1 -1
- package/dist/web/components/Grid.js +1 -3
- package/dist/web/components/Grid.js.zyzz.json +1 -1
- package/dist/web/components/Hex.css +1 -1
- package/dist/web/components/Hex.d.ts +43 -1
- package/dist/web/components/Hex.d.ts.map +1 -1
- package/dist/web/components/Hex.js +10 -8
- package/dist/web/components/Hex.js.map +1 -1
- package/dist/web/components/Hex.js.zyzz.json +1 -1
- package/dist/web/components/IconChip.css +1 -1
- package/dist/web/components/IconChip.js +1 -3
- package/dist/web/components/IconChip.js.zyzz.json +1 -1
- package/dist/web/components/Identicon.css +1 -1
- package/dist/web/components/Identicon.d.ts +8 -0
- package/dist/web/components/Identicon.d.ts.map +1 -1
- package/dist/web/components/Identicon.js +5 -4
- package/dist/web/components/Identicon.js.map +1 -1
- package/dist/web/components/Identicon.js.zyzz.json +1 -1
- package/dist/web/components/Inline.css +1 -1
- package/dist/web/components/Inline.js +1 -3
- package/dist/web/components/Inline.js.zyzz.json +1 -1
- package/dist/web/components/Input.css +1 -1
- package/dist/web/components/Input.js +4 -4
- package/dist/web/components/Input.js.zyzz.json +1 -1
- package/dist/web/components/Inset.css +1 -1
- package/dist/web/components/Inset.js +1 -3
- package/dist/web/components/Inset.js.zyzz.json +1 -1
- package/dist/web/components/Kbd.css +1 -1
- package/dist/web/components/Kbd.js +3 -3
- package/dist/web/components/Kbd.js.zyzz.json +1 -1
- package/dist/web/components/LoadingDots.css +1 -1
- package/dist/web/components/LoadingDots.js +3 -3
- package/dist/web/components/LoadingDots.js.zyzz.json +1 -1
- package/dist/web/components/Menu.css +1 -1
- package/dist/web/components/Menu.js +9 -9
- package/dist/web/components/Menu.js.zyzz.json +1 -1
- package/dist/web/components/NumberField.css +1 -1
- package/dist/web/components/NumberField.js +5 -5
- package/dist/web/components/NumberField.js.zyzz.json +1 -1
- package/dist/web/components/OtpField.css +1 -1
- package/dist/web/components/OtpField.js +3 -3
- package/dist/web/components/OtpField.js.zyzz.json +1 -1
- package/dist/web/components/Pagination.css +1 -1
- package/dist/web/components/Pagination.js +6 -6
- package/dist/web/components/Pagination.js.zyzz.json +1 -1
- package/dist/web/components/Popover.css +1 -1
- package/dist/web/components/Popover.js +5 -5
- package/dist/web/components/Popover.js.zyzz.json +1 -1
- package/dist/web/components/Progress.css +1 -1
- package/dist/web/components/Progress.js +6 -6
- package/dist/web/components/Progress.js.zyzz.json +1 -1
- package/dist/web/components/Qr.css +1 -1
- package/dist/web/components/Qr.js +1 -3
- package/dist/web/components/Qr.js.zyzz.json +1 -1
- package/dist/web/components/RadioGroup.css +1 -1
- package/dist/web/components/RadioGroup.js +4 -4
- package/dist/web/components/RadioGroup.js.zyzz.json +1 -1
- package/dist/web/components/Rows.css +1 -1
- package/dist/web/components/Rows.d.ts +61 -9
- package/dist/web/components/Rows.d.ts.map +1 -1
- package/dist/web/components/Rows.js +33 -22
- package/dist/web/components/Rows.js.map +1 -1
- package/dist/web/components/Rows.js.zyzz.json +1 -1
- package/dist/web/components/SecretValue.css +1 -1
- package/dist/web/components/SecretValue.js +3 -3
- package/dist/web/components/SecretValue.js.zyzz.json +1 -1
- package/dist/web/components/Select.css +1 -1
- package/dist/web/components/Select.js +2 -2
- package/dist/web/components/Select.js.zyzz.json +1 -1
- package/dist/web/components/Separator.css +1 -1
- package/dist/web/components/Separator.js +1 -1
- package/dist/web/components/Separator.js.zyzz.json +1 -1
- package/dist/web/components/SidebarMenu.css +1 -1
- package/dist/web/components/SidebarMenu.js +8 -8
- package/dist/web/components/SidebarMenu.js.zyzz.json +1 -1
- package/dist/web/components/Skeleton.css +1 -1
- package/dist/web/components/Skeleton.js +1 -3
- package/dist/web/components/Skeleton.js.zyzz.json +1 -1
- package/dist/web/components/Slider.css +1 -1
- package/dist/web/components/Slider.js +6 -6
- package/dist/web/components/Slider.js.zyzz.json +1 -1
- package/dist/web/components/Snippet.css +1 -1
- package/dist/web/components/Snippet.js +4 -4
- package/dist/web/components/Snippet.js.zyzz.json +1 -1
- package/dist/web/components/Spinner.css +1 -1
- package/dist/web/components/Spinner.js +3 -3
- package/dist/web/components/Spinner.js.zyzz.json +1 -1
- package/dist/web/components/SplitButton.css +1 -1
- package/dist/web/components/SplitButton.js +1 -1
- package/dist/web/components/SplitButton.js.zyzz.json +1 -1
- package/dist/web/components/Stack.css +1 -1
- package/dist/web/components/Stack.js +1 -3
- package/dist/web/components/Stack.js.zyzz.json +1 -1
- package/dist/web/components/Stepper.css +1 -1
- package/dist/web/components/Stepper.js +3 -3
- package/dist/web/components/Stepper.js.zyzz.json +1 -1
- package/dist/web/components/Surface.css +1 -1
- package/dist/web/components/Surface.js +5 -7
- package/dist/web/components/Surface.js.zyzz.json +1 -1
- package/dist/web/components/Switch.css +1 -1
- package/dist/web/components/Switch.js +3 -3
- package/dist/web/components/Switch.js.zyzz.json +1 -1
- package/dist/web/components/Table.css +1 -1
- package/dist/web/components/Table.js +5 -7
- package/dist/web/components/Table.js.zyzz.json +1 -1
- package/dist/web/components/Tabs.css +1 -1
- package/dist/web/components/Tabs.js +4 -6
- package/dist/web/components/Tabs.js.zyzz.json +1 -1
- package/dist/web/components/Tag.css +1 -1
- package/dist/web/components/Tag.js +3 -3
- package/dist/web/components/Tag.js.zyzz.json +1 -1
- package/dist/web/components/Textarea.css +1 -1
- package/dist/web/components/Textarea.js +1 -3
- package/dist/web/components/Textarea.js.zyzz.json +1 -1
- package/dist/web/components/Toast.css +1 -1
- package/dist/web/components/Toast.js +10 -10
- package/dist/web/components/Toast.js.zyzz.json +1 -1
- package/dist/web/components/Token.css +1 -1
- package/dist/web/components/Token.js +1 -3
- package/dist/web/components/Token.js.zyzz.json +1 -1
- package/dist/web/components/Tooltip.css +1 -1
- package/dist/web/components/Tooltip.js +2 -2
- package/dist/web/components/Tooltip.js.zyzz.json +1 -1
- package/dist/web/components/internal/Field.css +1 -1
- package/dist/web/components/internal/Field.js +4 -4
- package/dist/web/components/internal/Field.js.zyzz.json +1 -1
- package/dist/web/components/internal/InputGroup.css +1 -1
- package/dist/web/components/internal/InputGroup.js +1 -3
- package/dist/web/components/internal/InputGroup.js.zyzz.json +1 -1
- package/dist/web/components/internal/Listbox.css +1 -1
- package/dist/web/components/internal/Listbox.js +13 -13
- package/dist/web/components/internal/Listbox.js.zyzz.json +1 -1
- package/dist/web/index.js.zyzz.json +1 -1
- package/dist/web/vars.d.ts +7 -0
- package/dist/web/vars.d.ts.map +1 -1
- package/dist/web/vars.js.map +1 -1
- package/dist/web/vars.js.zyzz.json +1 -1
- package/dist/web/zyzz.config.d.ts +35 -0
- package/dist/web/zyzz.config.d.ts.map +1 -1
- package/dist/web/zyzz.config.js +10 -0
- package/dist/web/zyzz.config.js.map +1 -1
- package/dist/web/zyzz.config.js.zyzz.json +1 -1
- package/package.json +33 -1
- package/src/fonts/Inter-cyrillic-ext.woff2 +0 -0
- package/src/fonts/Inter-cyrillic.woff2 +0 -0
- package/src/fonts/Inter-greek-ext.woff2 +0 -0
- package/src/fonts/Inter-greek.woff2 +0 -0
- package/src/fonts/Inter-latin-ext.woff2 +0 -0
- package/src/fonts/Inter-latin.woff2 +0 -0
- package/src/fonts/Inter-symbols.woff2 +0 -0
- package/src/fonts/Inter-vietnamese.woff2 +0 -0
- package/src/fonts/README.md +8 -0
- package/src/mobile/Haptics.ts +55 -0
- package/src/mobile/README.md +97 -1
- package/src/mobile/components/Button.tsx +3 -3
- package/src/mobile/components/IconButton.tsx +3 -3
- package/src/mobile/components/Spinner.tsx +1 -1
- package/src/mobile/components/TextButton.tsx +3 -3
- package/src/mobile/components/TextInput.tsx +1 -1
- package/src/mobile/components/Toast.tsx +1 -1
- package/src/mobile/components/Toggle.tsx +2 -2
- package/src/mobile/index.ts +2 -0
- package/src/mobile/useColor.ts +31 -0
- package/src/web/components/Hex.tsx +45 -2
- package/src/web/components/Identicon.tsx +15 -1
- package/src/web/components/Rows.tsx +74 -15
- package/src/web/vars.ts +9 -0
- package/src/web/zyzz.config.ts +72 -1
- package/dist/mobile/internal/useColor.d.ts +0 -4
- package/dist/mobile/internal/useColor.d.ts.map +0 -1
- package/dist/mobile/internal/useColor.js +0 -12
- package/dist/mobile/internal/useColor.js.map +0 -1
- package/src/mobile/internal/useColor.ts +0 -13
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tempoxyz/ds",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.6",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
7
7
|
"DESIGN.md",
|
|
@@ -31,10 +31,42 @@
|
|
|
31
31
|
"src": "./src/fonts/GeistMono-Variable.woff2",
|
|
32
32
|
"default": "./dist/fonts/GeistMono-Variable.woff2"
|
|
33
33
|
},
|
|
34
|
+
"./fonts/Inter-cyrillic-ext.woff2": {
|
|
35
|
+
"src": "./src/fonts/Inter-cyrillic-ext.woff2",
|
|
36
|
+
"default": "./dist/fonts/Inter-cyrillic-ext.woff2"
|
|
37
|
+
},
|
|
38
|
+
"./fonts/Inter-cyrillic.woff2": {
|
|
39
|
+
"src": "./src/fonts/Inter-cyrillic.woff2",
|
|
40
|
+
"default": "./dist/fonts/Inter-cyrillic.woff2"
|
|
41
|
+
},
|
|
42
|
+
"./fonts/Inter-greek-ext.woff2": {
|
|
43
|
+
"src": "./src/fonts/Inter-greek-ext.woff2",
|
|
44
|
+
"default": "./dist/fonts/Inter-greek-ext.woff2"
|
|
45
|
+
},
|
|
46
|
+
"./fonts/Inter-greek.woff2": {
|
|
47
|
+
"src": "./src/fonts/Inter-greek.woff2",
|
|
48
|
+
"default": "./dist/fonts/Inter-greek.woff2"
|
|
49
|
+
},
|
|
50
|
+
"./fonts/Inter-latin-ext.woff2": {
|
|
51
|
+
"src": "./src/fonts/Inter-latin-ext.woff2",
|
|
52
|
+
"default": "./dist/fonts/Inter-latin-ext.woff2"
|
|
53
|
+
},
|
|
54
|
+
"./fonts/Inter-latin.woff2": {
|
|
55
|
+
"src": "./src/fonts/Inter-latin.woff2",
|
|
56
|
+
"default": "./dist/fonts/Inter-latin.woff2"
|
|
57
|
+
},
|
|
58
|
+
"./fonts/Inter-symbols.woff2": {
|
|
59
|
+
"src": "./src/fonts/Inter-symbols.woff2",
|
|
60
|
+
"default": "./dist/fonts/Inter-symbols.woff2"
|
|
61
|
+
},
|
|
34
62
|
"./fonts/Inter-Variable.woff2": {
|
|
35
63
|
"src": "./src/fonts/Inter-Variable.woff2",
|
|
36
64
|
"default": "./dist/fonts/Inter-Variable.woff2"
|
|
37
65
|
},
|
|
66
|
+
"./fonts/Inter-vietnamese.woff2": {
|
|
67
|
+
"src": "./src/fonts/Inter-vietnamese.woff2",
|
|
68
|
+
"default": "./dist/fonts/Inter-vietnamese.woff2"
|
|
69
|
+
},
|
|
38
70
|
"./icons": {
|
|
39
71
|
"src": "./src/web/icons/index.ts",
|
|
40
72
|
"types": "./dist/web/icons/index.d.ts",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/fonts/README.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
# Fonts
|
|
2
2
|
|
|
3
3
|
Inter is the Inter Project's variable font, copied unchanged from `web/InterVariable.woff2` in the [Inter 4.1 release](https://github.com/rsms/inter/releases/tag/v4.1). Geist Mono is Vercel's variable font, copied unchanged from the [`geist`](https://www.npmjs.com/package/geist) package (1.8.1). The SIL Open Font License 1.1 in `Inter-OFL.txt` and `Geist-OFL.txt` permits redistribution in `@tempoxyz/ds`. The Web contracts declare each face across weights 100 to 900.
|
|
4
|
+
|
|
5
|
+
The Web contracts load Inter from its subsets, such as `Inter-latin.woff2`, one for each Inter face in `src/web/zyzz.config.ts`. A browser downloads only the subsets that cover the page's text. Each subset keeps Inter's axes, OpenType features, and names, and together they hold every character of `Inter-Variable.woff2`. The license permits modified versions, since Inter reserves no font name.
|
|
6
|
+
|
|
7
|
+
If an Inter face's `unicodeRange` changes, write the subsets again. The script requires fonttools and brotli (`pip install fonttools brotli`).
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
node scripts/subset-fonts.ts
|
|
11
|
+
```
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** Haptic feedback with the meanings Apple documents for each system pattern. @module */
|
|
2
|
+
import * as ExpoHaptics from 'expo-haptics'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Plays an error notification: a task or action failed.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* Haptics.error()
|
|
9
|
+
*/
|
|
10
|
+
export function error() {
|
|
11
|
+
void ExpoHaptics.notificationAsync(ExpoHaptics.NotificationFeedbackType.Error)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Plays a light impact: a control was pressed. `Button`, `IconButton`, and `TextButton` play it
|
|
16
|
+
* before `onPress`.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* <Pressable onPress={() => { Haptics.press(); open() }} />
|
|
20
|
+
*/
|
|
21
|
+
export function press() {
|
|
22
|
+
void ExpoHaptics.impactAsync(ExpoHaptics.ImpactFeedbackStyle.Light)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Plays a selection tick: a value changed, such as a picked option or a toggled setting.
|
|
27
|
+
* `Toggle` plays it when its value changes.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* Haptics.select()
|
|
31
|
+
*/
|
|
32
|
+
export function select() {
|
|
33
|
+
void ExpoHaptics.selectionAsync()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Plays a success notification: a task or action completed, such as a sent message or a saved
|
|
38
|
+
* change.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* Haptics.success()
|
|
42
|
+
*/
|
|
43
|
+
export function success() {
|
|
44
|
+
void ExpoHaptics.notificationAsync(ExpoHaptics.NotificationFeedbackType.Success)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Plays a warning notification: a task or action produced a warning, such as a blocked send.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* Haptics.warning()
|
|
52
|
+
*/
|
|
53
|
+
export function warning() {
|
|
54
|
+
void ExpoHaptics.notificationAsync(ExpoHaptics.NotificationFeedbackType.Warning)
|
|
55
|
+
}
|
package/src/mobile/README.md
CHANGED
|
@@ -24,6 +24,12 @@ export default zyzz(getDefaultConfig(import.meta.dirname), {
|
|
|
24
24
|
|
|
25
25
|
`fonts` maps each Figma family to a font that your app registers. The library bundles no font files. Map a family to `System` to preview with iOS system fonts.
|
|
26
26
|
|
|
27
|
+
`fonts` must name every family that any style sets, including your app's own. A `fontFamily` that the map does not name fails the Metro build with `Provide an explicit fonts mapping for this family`. Register the font files with `expo-font`.
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
fonts: { 'HB Set v0.96': 'HBSet', Inter: 'Inter', 'JetBrains Mono': 'JetBrainsMono', 'Pilat-Book': 'Pilat-Book' },
|
|
31
|
+
```
|
|
32
|
+
|
|
27
33
|
## Usage
|
|
28
34
|
|
|
29
35
|
Render components below a `Provider`. Styles resolve against the Provider above the component that renders them, so place it at your app root.
|
|
@@ -48,6 +54,75 @@ function Checkout() {
|
|
|
48
54
|
|
|
49
55
|
`style` and `variants` accept TDS tokens and React Native's axis shorthands, such as `paddingHorizontal`.
|
|
50
56
|
|
|
57
|
+
Props that take a color instead of a style, such as icon fills and spinner tints, read a style's color through `useColor`. It follows the Provider's scheme.
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
import { style, useColor } from '@tempoxyz/ds/mobile'
|
|
61
|
+
import { Copy } from '@tempoxyz/ds/mobile/icons'
|
|
62
|
+
|
|
63
|
+
namespace styles {
|
|
64
|
+
export const icon = style({ color: 'content.secondary' })
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function CopyIcon() {
|
|
68
|
+
return <Copy color={useColor(styles.icon().style)} />
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Metro reads every `style` and `variants` call while it bundles, before your code runs, so their arguments follow these rules:
|
|
73
|
+
|
|
74
|
+
- **Static values:** Each value must be a literal or a reference to a constant. Spreads of constant objects work. A computed expression, such as `Platform.select(...)` or a function call, fails the build with `Expected a literal string or number; expressions are not evaluated`.
|
|
75
|
+
- **Values off the scale:** Add `!custom` to a value that no token covers, such as `maxWidth: '85% !custom'` or `height: '36px !custom'`.
|
|
76
|
+
- **Zero:** Spacing and position props take the `none` token, such as `left: 'none'`.
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
namespace styles {
|
|
80
|
+
export const bubble = style({ borderRadius: 'md', maxWidth: '85% !custom', padding: '12' })
|
|
81
|
+
|
|
82
|
+
export const fill = style({
|
|
83
|
+
bottom: 'none',
|
|
84
|
+
left: 'none',
|
|
85
|
+
position: 'absolute',
|
|
86
|
+
right: 'none',
|
|
87
|
+
top: 'none',
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Platform differences
|
|
93
|
+
|
|
94
|
+
Put values that differ by platform in `targets`. Metro builds one bundle per platform and compiles only that platform's branch into it, so nothing checks the platform at runtime. Declarations apply in this order: shared, then `native`, then `ios` or `android`.
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
namespace styles {
|
|
98
|
+
export const card = style({
|
|
99
|
+
backgroundColor: 'container.regular',
|
|
100
|
+
padding: '12',
|
|
101
|
+
targets: {
|
|
102
|
+
ios: { borderRadius: 28 },
|
|
103
|
+
android: { borderRadius: 16, elevation: 2 },
|
|
104
|
+
},
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Branches take plain React Native values, not tokens. A token name in a branch, such as `ios: { backgroundColor: 'container.regular' }`, passes the build and the type check, but reaches React Native as that string and does not render. Keep token values in the shared declarations.
|
|
110
|
+
|
|
111
|
+
For a module that differs as a whole, Metro also resolves `Card.ios.tsx` and `Card.android.tsx`.
|
|
112
|
+
|
|
113
|
+
### Runtime values
|
|
114
|
+
|
|
115
|
+
Values known only at runtime, such as safe area insets, keyboard height or measured sizes, go next to the compiled style in an array. Pick between compiled styles for state in the same array, or use `variants`.
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
const insets = useSafeAreaInsets()
|
|
119
|
+
|
|
120
|
+
<View style={[styles.footer().style, { paddingBottom: insets.bottom }]} />
|
|
121
|
+
<Pressable style={[styles.option().style, selected && styles.selected().style]} />
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Props that take a color instead of a style read it through `useColor`, as above.
|
|
125
|
+
|
|
51
126
|
## Custom Tokens
|
|
52
127
|
|
|
53
128
|
An app config names its sets `base` and `inverse`, since every Zyzz config reads the Provider's set selection. Zyzz extensions only replace existing tokens. Define app tokens in your own sets, and reference TDS tokens through `variables` and `inverse`.
|
|
@@ -105,9 +180,30 @@ Components also accept the props and `ref` of the React Native element they rend
|
|
|
105
180
|
- Skeleton placeholders pulse and Spinner rotates, and both stay still when Reduce Motion is on.
|
|
106
181
|
- React Native has no backdrop blur, so overlay secondary controls keep only their translucent fill.
|
|
107
182
|
|
|
183
|
+
## Haptics
|
|
184
|
+
|
|
185
|
+
`Haptics` plays the system patterns with the meanings Apple documents for them, so feedback reads the same in every TDS app. Components play `press` and `select` on their own. Play the others where the outcome happens.
|
|
186
|
+
|
|
187
|
+
| Function | Pattern | Use for |
|
|
188
|
+
| --------- | -------------------- | -------------------------------------------------------------- |
|
|
189
|
+
| `press` | Light impact | A pressed control. Button, IconButton, and TextButton play it. |
|
|
190
|
+
| `select` | Selection | A changed value. Toggle plays it. |
|
|
191
|
+
| `success` | Success notification | A completed task, such as a sent message. |
|
|
192
|
+
| `warning` | Warning notification | A task that produced a warning. |
|
|
193
|
+
| `error` | Error notification | A failed task. |
|
|
194
|
+
|
|
195
|
+
```tsx
|
|
196
|
+
import { Haptics } from '@tempoxyz/ds/mobile'
|
|
197
|
+
|
|
198
|
+
async function send() {
|
|
199
|
+
await api.send(message)
|
|
200
|
+
Haptics.success()
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
108
204
|
## Icons
|
|
109
205
|
|
|
110
|
-
Use the [mobile icon components](./icons/README.md) for the App icon catalog. Pass a `color`, because SVG elements do not inherit text color in React Native.
|
|
206
|
+
Use the [mobile icon components](./icons/README.md) for the App icon catalog. Pass a `color`, because SVG elements do not inherit text color in React Native. `useColor` resolves a token for it.
|
|
111
207
|
|
|
112
208
|
```tsx
|
|
113
209
|
import { Copy } from '@tempoxyz/ds/mobile/icons'
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as Haptics from 'expo-haptics'
|
|
2
1
|
import { cloneElement, type ComponentPropsWithRef, type ReactElement } from 'react'
|
|
3
2
|
import { type ColorValue, Pressable, Text, View } from 'react-native'
|
|
4
3
|
import type * as zyzz from 'zyzz'
|
|
5
|
-
import
|
|
4
|
+
import * as Haptics from '../Haptics.js'
|
|
5
|
+
import { useColor } from '../useColor.js'
|
|
6
6
|
import { inverse } from '../vars.js'
|
|
7
7
|
import { style, variants } from '../zyzz.config.js'
|
|
8
8
|
import { Spinner } from './Spinner.js'
|
|
@@ -51,7 +51,7 @@ export function Button(props: Button.Props) {
|
|
|
51
51
|
{...pressableProps}
|
|
52
52
|
disabled={disabled || loading}
|
|
53
53
|
onPress={(event) => {
|
|
54
|
-
|
|
54
|
+
Haptics.press()
|
|
55
55
|
props.onPress?.(event)
|
|
56
56
|
}}
|
|
57
57
|
style={(state) => [
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as Haptics from 'expo-haptics'
|
|
2
1
|
import { cloneElement, type ComponentPropsWithRef, type ReactElement } from 'react'
|
|
3
2
|
import { type ColorValue, Pressable } from 'react-native'
|
|
4
3
|
import type * as zyzz from 'zyzz'
|
|
5
|
-
import
|
|
4
|
+
import * as Haptics from '../Haptics.js'
|
|
5
|
+
import { useColor } from '../useColor.js'
|
|
6
6
|
import { inverse } from '../vars.js'
|
|
7
7
|
import { variants } from '../zyzz.config.js'
|
|
8
8
|
|
|
@@ -39,7 +39,7 @@ export function IconButton(props: IconButton.Props) {
|
|
|
39
39
|
{...pressableProps}
|
|
40
40
|
disabled={disabled}
|
|
41
41
|
onPress={(event) => {
|
|
42
|
-
|
|
42
|
+
Haptics.press()
|
|
43
43
|
props.onPress?.(event)
|
|
44
44
|
}}
|
|
45
45
|
style={(state) => [
|
|
@@ -3,7 +3,7 @@ import { type ColorValue, View } from 'react-native'
|
|
|
3
3
|
import Animated from 'react-native-reanimated'
|
|
4
4
|
import { Circle, Path, Svg } from 'react-native-svg'
|
|
5
5
|
import type * as zyzz from 'zyzz'
|
|
6
|
-
import { useColor } from '../
|
|
6
|
+
import { useColor } from '../useColor.js'
|
|
7
7
|
import { useReducedMotion } from '../internal/useReducedMotion.js'
|
|
8
8
|
import { style, variants } from '../zyzz.config.js'
|
|
9
9
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as Haptics from 'expo-haptics'
|
|
2
1
|
import type { ComponentPropsWithRef } from 'react'
|
|
3
2
|
import { Pressable, Text } from 'react-native'
|
|
3
|
+
import * as Haptics from '../Haptics.js'
|
|
4
4
|
import { ChevronRight } from '../icons/index.js'
|
|
5
|
-
import { useColor } from '../
|
|
5
|
+
import { useColor } from '../useColor.js'
|
|
6
6
|
import { style, variants } from '../zyzz.config.js'
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -35,7 +35,7 @@ export function TextButton(props: TextButton.Props) {
|
|
|
35
35
|
{...pressableProps}
|
|
36
36
|
disabled={disabled}
|
|
37
37
|
onPress={(event) => {
|
|
38
|
-
|
|
38
|
+
Haptics.press()
|
|
39
39
|
props.onPress?.(event)
|
|
40
40
|
}}
|
|
41
41
|
style={(state) => [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ComponentPropsWithRef } from 'react'
|
|
2
2
|
import { TextInput as NativeTextInput, Text, View } from 'react-native'
|
|
3
3
|
import type * as zyzz from 'zyzz'
|
|
4
|
-
import { useColor } from '../
|
|
4
|
+
import { useColor } from '../useColor.js'
|
|
5
5
|
import { style, variants } from '../zyzz.config.js'
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -2,7 +2,7 @@ import type { ComponentPropsWithRef } from 'react'
|
|
|
2
2
|
import { Text, View } from 'react-native'
|
|
3
3
|
import type * as zyzz from 'zyzz'
|
|
4
4
|
import { AlertCircle, CheckCircle } from '../icons/index.js'
|
|
5
|
-
import { useColor } from '../
|
|
5
|
+
import { useColor } from '../useColor.js'
|
|
6
6
|
import { style, variants } from '../zyzz.config.js'
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as Haptics from 'expo-haptics'
|
|
2
1
|
import type { ComponentPropsWithRef } from 'react'
|
|
3
2
|
import { Pressable, View } from 'react-native'
|
|
4
3
|
import type * as zyzz from 'zyzz'
|
|
4
|
+
import * as Haptics from '../Haptics.js'
|
|
5
5
|
import { variables as core } from '../primitives.js'
|
|
6
6
|
import { style, variants } from '../zyzz.config.js'
|
|
7
7
|
|
|
@@ -33,7 +33,7 @@ export function Toggle(props: Toggle.Props) {
|
|
|
33
33
|
{...pressableProps}
|
|
34
34
|
disabled={disabled}
|
|
35
35
|
onPress={(event) => {
|
|
36
|
-
|
|
36
|
+
Haptics.select()
|
|
37
37
|
props.onPress?.(event)
|
|
38
38
|
onValueChange?.(value !== true)
|
|
39
39
|
}}
|
package/src/mobile/index.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { Avatar } from './components/Avatar.js'
|
|
|
2
2
|
export { Badge } from './components/Badge.js'
|
|
3
3
|
export { Button } from './components/Button.js'
|
|
4
4
|
export { CodeInput } from './components/CodeInput.js'
|
|
5
|
+
export * as Haptics from './Haptics.js'
|
|
5
6
|
export { IconButton } from './components/IconButton.js'
|
|
6
7
|
export { Skeleton } from './components/Skeleton.js'
|
|
7
8
|
export { Spinner } from './components/Spinner.js'
|
|
@@ -9,5 +10,6 @@ export { TextButton } from './components/TextButton.js'
|
|
|
9
10
|
export { TextInput } from './components/TextInput.js'
|
|
10
11
|
export { Toast } from './components/Toast.js'
|
|
11
12
|
export { Toggle } from './components/Toggle.js'
|
|
13
|
+
export { useColor } from './useColor.js'
|
|
12
14
|
export { inverse, variables } from './vars.js'
|
|
13
15
|
export { Provider, style, variants, vars } from './zyzz.config.js'
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Resolves a compiled style's color for native props that take a color instead of a style. @module */
|
|
2
|
+
import type { ColorValue } from 'react-native'
|
|
3
|
+
import { useStyles } from 'zyzz/react-native'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Returns the `color` of a compiled style, resolved against the nearest `Provider`. Use it for
|
|
7
|
+
* props that take a color value instead of a style, such as SVG and icon fills, `ActivityIndicator`
|
|
8
|
+
* and `RefreshControl` tints, and `TextInput` placeholder colors.
|
|
9
|
+
*
|
|
10
|
+
* On iOS, a `system` color scheme resolves to a dynamic color object that switches with the device
|
|
11
|
+
* appearance, so pass the value through rather than reading it as a string.
|
|
12
|
+
*
|
|
13
|
+
* @throws {Error} If the style sets no `color`.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* namespace styles {
|
|
17
|
+
* export const icon = style({ color: 'content.secondary' })
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* function CopyIcon() {
|
|
21
|
+
* return <Copy color={useColor(styles.icon().style)} />
|
|
22
|
+
* }
|
|
23
|
+
*/
|
|
24
|
+
export function useColor(
|
|
25
|
+
style: Readonly<Record<string, string | number | undefined>> | undefined,
|
|
26
|
+
): ColorValue {
|
|
27
|
+
const color: unknown = useStyles().style(style).color
|
|
28
|
+
if (typeof color === 'string') return color
|
|
29
|
+
if (color && typeof color === 'object') return color as ColorValue
|
|
30
|
+
throw new Error('Expected a compiled style with a color')
|
|
31
|
+
}
|
|
@@ -55,6 +55,8 @@ export declare namespace formatHex {
|
|
|
55
55
|
* - Add `copy` wherever readers need the full value, since the visible text omits its middle.
|
|
56
56
|
* - The copy button is named `Copy <value>` by default. Pass `aria-label` to `Hex.Copy` to name
|
|
57
57
|
* what it copies, such as `Copy address`.
|
|
58
|
+
* - After a `Rows.Label`, the text matches the row's 500 weight, and the text and copy icon end at
|
|
59
|
+
* the row's text edge, as the other row values do.
|
|
58
60
|
*
|
|
59
61
|
* @example
|
|
60
62
|
* <Hex copy value="0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" />
|
|
@@ -119,6 +121,7 @@ export namespace Hex {
|
|
|
119
121
|
<HexContext value={{ evm, setSlack, slack, value, variant }}>
|
|
120
122
|
<span
|
|
121
123
|
{...attributes}
|
|
124
|
+
data-hex=""
|
|
122
125
|
{...styles.root({ className, size, style: props.style, variant, vars })}
|
|
123
126
|
>
|
|
124
127
|
{children}
|
|
@@ -199,7 +202,7 @@ export namespace Hex {
|
|
|
199
202
|
}}
|
|
200
203
|
{...styles.text({ className: props.className, style: props.style })}
|
|
201
204
|
>
|
|
202
|
-
<span aria-hidden="true" {...styles.cut()}>
|
|
205
|
+
<span aria-hidden="true" data-hex-cut="" {...styles.cut()}>
|
|
203
206
|
<Midcut prefix={prefix} value={value} />
|
|
204
207
|
</span>
|
|
205
208
|
{/* Sizes the text to the value plus one character, since Midcut truncates at that width.
|
|
@@ -347,7 +350,47 @@ namespace styles {
|
|
|
347
350
|
selectors: { '&:has([data-stretch]:active)': { scale: 'none !custom' } },
|
|
348
351
|
},
|
|
349
352
|
},
|
|
350
|
-
inline
|
|
353
|
+
// After a `Rows.Label`, an inline Hex ends the row's value column and matches the 500
|
|
354
|
+
// weight of the row text beside it. Midcut's leftover space moves before the text, which
|
|
355
|
+
// leaves the button no slack to cover, and the button bleeds over the 4px around its icon.
|
|
356
|
+
// The text and icon then end at the row's text edge.
|
|
357
|
+
inline: {
|
|
358
|
+
selectors: {
|
|
359
|
+
// The other half of the row, less the 12px gap after the label, the 24px of the copy
|
|
360
|
+
// button and its gap, and Midcut's last character, rounded down to whole character
|
|
361
|
+
// pairs. The text box then fits the visible text, and half a pixel keeps Midcut's own
|
|
362
|
+
// rounding from dropping a pair to floating-point error.
|
|
363
|
+
'[data-label] ~ &': {
|
|
364
|
+
maxWidth: 'calc(round(down, 50% - 36px - 1ch, 2ch) + 1ch + 24.5px) !custom',
|
|
365
|
+
typography: 'copy.13.mono.strong',
|
|
366
|
+
},
|
|
367
|
+
// A leading identicon and its 8px gap add to that width, and `Rows.Label` yields the
|
|
368
|
+
// same width, so the address keeps the width of one without an identicon.
|
|
369
|
+
'[data-label] ~ &:has(> [data-identicon="16"]:first-child)': {
|
|
370
|
+
maxWidth: 'calc(round(down, 50% - 36px - 1ch, 2ch) + 1ch + 48.5px) !custom',
|
|
371
|
+
},
|
|
372
|
+
'[data-label] ~ &:has(> [data-identicon="24"]:first-child)': {
|
|
373
|
+
maxWidth: 'calc(round(down, 50% - 36px - 1ch, 2ch) + 1ch + 56.5px) !custom',
|
|
374
|
+
},
|
|
375
|
+
'[data-label] ~ &:has(> [data-identicon="32"]:first-child)': {
|
|
376
|
+
maxWidth: 'calc(round(down, 50% - 36px - 1ch, 2ch) + 1ch + 64.5px) !custom',
|
|
377
|
+
},
|
|
378
|
+
'[data-label] ~ &:has(> [data-identicon="40"]:first-child)': {
|
|
379
|
+
maxWidth: 'calc(round(down, 50% - 36px - 1ch, 2ch) + 1ch + 72.5px) !custom',
|
|
380
|
+
},
|
|
381
|
+
'[data-label] ~ &:has(> [data-identicon="48"]:first-child)': {
|
|
382
|
+
maxWidth: 'calc(round(down, 50% - 36px - 1ch, 2ch) + 1ch + 80.5px) !custom',
|
|
383
|
+
},
|
|
384
|
+
'[data-label] ~ &:has(> [data-identicon="64"]:first-child)': {
|
|
385
|
+
maxWidth: 'calc(round(down, 50% - 36px - 1ch, 2ch) + 1ch + 96.5px) !custom',
|
|
386
|
+
},
|
|
387
|
+
'[data-label] ~ & [data-hex-cut] > [title]': { justifyContent: 'flex-end' },
|
|
388
|
+
'[data-label] ~ & [data-hex-copy]': { marginInlineEnd: '-4' },
|
|
389
|
+
'[data-label] ~ * &': { typography: 'copy.13.mono.strong' },
|
|
390
|
+
'[data-label] ~ * & [data-hex-cut] > [title]': { justifyContent: 'flex-end' },
|
|
391
|
+
'[data-label] ~ * & [data-hex-copy]': { marginInlineEnd: '-4' },
|
|
392
|
+
},
|
|
393
|
+
},
|
|
351
394
|
},
|
|
352
395
|
},
|
|
353
396
|
},
|
|
@@ -22,6 +22,9 @@ const palette = [
|
|
|
22
22
|
* - Never use it as the only identifier. Show the address or account name beside it.
|
|
23
23
|
* - When that text is adjacent, pass `aria-hidden` so the address is not announced twice.
|
|
24
24
|
* - Otherwise pass an `aria-label` that names the account, since raw addresses read poorly.
|
|
25
|
+
* - In a `Rows` value, render it as the first child of `Hex.Root`. It sits 8px before the
|
|
26
|
+
* address, and the label yields its width, so the address keeps the width of one without an
|
|
27
|
+
* identicon.
|
|
25
28
|
*
|
|
26
29
|
* @example
|
|
27
30
|
* <Identicon aria-hidden address={address} size="32" />
|
|
@@ -41,6 +44,7 @@ export function Identicon(props: Identicon.Props) {
|
|
|
41
44
|
role="img"
|
|
42
45
|
viewBox="0 0 1 1"
|
|
43
46
|
{...attributes}
|
|
47
|
+
data-identicon={size ?? '40'}
|
|
44
48
|
{...styles.identicon({ className, size, style: props.style, vars })}
|
|
45
49
|
>
|
|
46
50
|
<defs>
|
|
@@ -104,7 +108,17 @@ function derive(address: string) {
|
|
|
104
108
|
namespace styles {
|
|
105
109
|
export const identicon = variants(
|
|
106
110
|
{
|
|
107
|
-
base: {
|
|
111
|
+
base: {
|
|
112
|
+
borderRadius: 'full',
|
|
113
|
+
display: 'block',
|
|
114
|
+
flexShrink: '0 !custom',
|
|
115
|
+
selectors: {
|
|
116
|
+
// Leading a `Hex` after a `Rows.Label`, the identicon stays in flow 8px before the
|
|
117
|
+
// address, so a tall identicon grows the row and a long label never sits under it.
|
|
118
|
+
// `Hex.Root` adds 4px of gap.
|
|
119
|
+
'[data-label] ~ [data-hex] > &:first-child': { marginInlineEnd: '4' },
|
|
120
|
+
},
|
|
121
|
+
},
|
|
108
122
|
defaultVariants: { size: '40' },
|
|
109
123
|
variants: {
|
|
110
124
|
size: {
|