@swiftsolve/rove-tokens 1.0.0 → 1.1.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.
package/DESIGN.md CHANGED
@@ -74,7 +74,7 @@ Disabled controls use `--opacity-disabled`.
74
74
 
75
75
  ## Changing the design
76
76
 
77
- Figma is the source of truth. Change a token in the Rove Design System Figma file, export it with the plugin in `figma-plugin/` into `src/figma/`, then run `npm run build` (see the [README](README.md#update-the-tokens)). Don't edit `tokens.css`, `tokens/` or the values in `src/figma/` by hand. What Figma can't hold (shadows, layout, motion) lives in `src/code-tokens.json`.
77
+ Figma is the source of truth. Change a token in the Rove Design System Figma file, export it with the plugin in `figma-plugin/` into `src/figma/`, then run `npm run build` (see the [README](README.md#update-the-tokens)). Don't edit `tokens.css`, `tokens/` or the values in `src/figma/` by hand. What Figma can't hold (shadows, easing curves, the focus outline) lives in `src/code-tokens.json`.
78
78
 
79
79
  Everything below the next line is rewritten by `npm run build`; edit only above it.
80
80
 
@@ -101,8 +101,12 @@ Names and uses, from Figma. The values are in `tokens.css`; Dark and Light diffe
101
101
  - **Radius:** `--radius-xs` 5px, `--radius-sm` 8px, `--radius-md` 10px, `--radius-lg` 13px, `--radius-full` 999px
102
102
  - **Font sizes:** `--font-size-2xs` 10px, `--font-size-xs` 11px, `--font-size-sm` 12px, `--font-size-md` 13px, `--font-size-lg` 14px, `--font-size-xl` 15px (dialog titles), `--font-size-2xl` 17px, `--font-size-3xl` 28px
103
103
  - **Font families:** `--font-family-sans` Inter, `--font-family-numeric` Questrial
104
- - **Focus:** `--focus-offset` 2px (focus ring offset)
104
+ - **Focus:** `--focus-ring-width` 1px (focus ring stroke), `--focus-offset` 2px (focus ring offset)
105
105
  - **Opacity:** `--opacity-tint-xs` 8% (faintest tint), `--opacity-tint-sm` 10% (light tint), `--opacity-tint-md` 14% (tint), `--opacity-tint-lg` 22% (strong tint), `--opacity-tint-xl` 28% (strongest tint), `--opacity-high` 80% (nearly opaque), `--opacity-disabled` 40% (disabled controls)
106
+ - **Layout:** `--rail-item-size` 38px (rail items), `--titlebar-height` 56px (title bar)
107
+ - **Cards:** `--card-padding` `var(--spacing-14)` (card inset), `--card-header-padding-y` `var(--card-padding)`, `--card-header-padding-x` `var(--card-padding)`, `--card-header-min-height` 42px (compact card header), `--card-header-height` 44px (card header), `--card-body-padding` `var(--card-padding)`, `--row-padding-y` 8px (data row, above and below)
108
+ - **Font weights:** `--weight-regular` 400, `--weight-medium` 500, `--weight-semibold` 600
109
+ - **Motion:** `--duration-fast` 140ms (hovers, small changes), `--duration-normal` 220ms (panels, page changes)
106
110
 
107
111
  ### Text styles
108
112
 
@@ -130,8 +134,5 @@ Apply a style with its class from `text-styles.css`. Each class reads four varia
130
134
  What Figma variables can't hold, from `src/code-tokens.json`.
131
135
 
132
136
  - **Shadows:** `--shadow-panel`, `--shadow-raised`, `--shadow-popover`
133
- - **Focus:** `--focus-ring-width` 1px, `--focus-outline`, `--focus-inset`
134
- - **Layout:** `--titlebar-height` 56px, `--rail-item-size` 38px
135
- - **Cards:** `--card-padding` `var(--spacing-14)`, `--card-header-padding-y` `var(--card-padding)`, `--card-header-padding-x` `var(--card-padding)`, `--card-header-min-height` 42px, `--card-header-height` 44px, `--card-body-padding` `var(--card-padding)`, `--row-padding-y` 8px
136
- - **Motion:** `--ease-out`, `--ease-in-out`, `--ease-pulse`, `--duration-fast` 140ms, `--duration-normal` 220ms
137
- - **Font weights:** `--weight-regular` 400, `--weight-medium` 500, `--weight-semibold` 600
137
+ - **Focus:** `--focus-outline`, `--focus-inset`
138
+ - **Motion:** `--ease-out`, `--ease-in-out`, `--ease-pulse`
package/README.md CHANGED
@@ -59,9 +59,9 @@ Each Figma text style becomes four tokens: `--type-<style>-size`, `-weight`, `-l
59
59
  | --- | --- |
60
60
  | `palette.tokens.json` | Every colour, once |
61
61
  | `color.dark.tokens.json`, `color.light.tokens.json` | The Color tokens in each theme, pointing at the palette (`{neutral.850}`) |
62
- | `spacing.tokens.json`, `typography.tokens.json`, `opacity.tokens.json` | The other Figma collections |
62
+ | `spacing.tokens.json`, `typography.tokens.json`, `opacity.tokens.json`, `layout.tokens.json`, `motion.tokens.json` | The other Figma collections |
63
63
  | `text-styles.tokens.json` | Each text style as a `typography` token |
64
- | `code.tokens.json` | The code-only tokens (shadows, motion, layout) |
64
+ | `code.tokens.json` | The code-only tokens (shadows, easing curves, the focus outline) |
65
65
 
66
66
  A theme is every file plus one of the two color files. Paths follow the Figma names (`bg/base` is `bg.base`). Tokens that other tokens point at but that aren't CSS variables (the palette, the shadow colours) are marked `"$extensions": { "net.swiftsolve.rove-tokens": { "css": false } }`. CSS-only expressions (`--focus-inset`, a `calc()`) aren't in them.
67
67
 
@@ -110,7 +110,7 @@ It opens on <http://localhost:6007>; the Theme menu in the toolbar switches Dark
110
110
  | `src/figma/variables.json` | Raw Figma export. Every variable with a Web code syntax becomes that CSS variable. |
111
111
  | `src/figma/text-styles.json` | Raw export of the local text styles: font, size, weight, line height, letter spacing, text case (when set) and the variables bound to them. Each style becomes a `--type-*` group. |
112
112
  | `figma-plugin/` | The Figma plugin that writes the two exports. |
113
- | `src/code-tokens.json` | What Figma variables can't hold: font stacks for the font-family variables, shadows, layout constants, motion. `{figma/name}` pulls a Figma value in per theme. |
113
+ | `src/code-tokens.json` | What Figma variables can't hold: font stacks for the font-family variables, shadows, easing curves and the CSS expressions built on variables (`--focus-outline`). `{figma/name}` pulls a Figma value in per theme. |
114
114
  | `DESIGN.md` | How to build Rove UI with the tokens. The rules at the top are written by hand; the token reference below the marker line is generated by the build. |
115
115
  | `scripts/tokens/build.mjs` | `npm run build`: runs the steps below and writes `tokens.css` and `text-styles.css` at the package root, where the import paths point. |
116
116
  | `scripts/tokens/dtcg.mjs` | Figma export → the DTCG files in `tokens/`, checking that every reference resolves in both themes. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swiftsolve/rove-tokens",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Rove's design tokens, exported from the Rove Design System in Figma, as CSS and DTCG.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -9,29 +9,11 @@
9
9
  "--shadow-raised": "0 12px 32px {shadow-color/raised}",
10
10
  "--shadow-popover": "0 2px 6px {shadow-color/popover-1}, 0 6px 16px {shadow-color/popover-2}",
11
11
 
12
- "--focus-ring-width": "1px",
13
12
  "--focus-outline": "var(--focus-ring-width) solid var(--focus-ring)",
14
13
  "--focus-inset": "calc(-1 * var(--focus-ring-width))",
15
14
 
16
- "--titlebar-height": "56px",
17
- "--rail-item-size": "38px",
18
-
19
- "--card-padding": "var(--spacing-14)",
20
- "--card-header-padding-y": "var(--card-padding)",
21
- "--card-header-padding-x": "var(--card-padding)",
22
- "--card-header-min-height": "42px",
23
- "--card-header-height": "44px",
24
- "--card-body-padding": "var(--card-padding)",
25
- "--row-padding-y": "8px",
26
-
27
15
  "--ease-out": "cubic-bezier(0.16, 1, 0.3, 1)",
28
16
  "--ease-in-out": "cubic-bezier(0.4, 0, 0.2, 1)",
29
- "--ease-pulse": "cubic-bezier(0.42, 0, 0.58, 1)",
30
- "--duration-fast": "140ms",
31
- "--duration-normal": "220ms",
32
-
33
- "--weight-regular": "400",
34
- "--weight-medium": "500",
35
- "--weight-semibold": "600"
17
+ "--ease-pulse": "cubic-bezier(0.42, 0, 0.58, 1)"
36
18
  }
37
19
  }
@@ -56,6 +56,18 @@
56
56
  "modes": [
57
57
  "Value"
58
58
  ]
59
+ },
60
+ {
61
+ "name": "Layout",
62
+ "modes": [
63
+ "Value"
64
+ ]
65
+ },
66
+ {
67
+ "name": "Motion",
68
+ "modes": [
69
+ "Value"
70
+ ]
59
71
  }
60
72
  ],
61
73
  "variables": [
@@ -1902,6 +1914,164 @@
1902
1914
  "alias": "neutral/850-a2"
1903
1915
  }
1904
1916
  }
1917
+ },
1918
+ {
1919
+ "name": "titlebar/height",
1920
+ "collection": "Layout",
1921
+ "type": "FLOAT",
1922
+ "code": "var(--titlebar-height)",
1923
+ "description": "Title bar",
1924
+ "values": {
1925
+ "Value": 56
1926
+ }
1927
+ },
1928
+ {
1929
+ "name": "rail/item-size",
1930
+ "collection": "Layout",
1931
+ "type": "FLOAT",
1932
+ "code": "var(--rail-item-size)",
1933
+ "description": "Rail items",
1934
+ "values": {
1935
+ "Value": 38
1936
+ }
1937
+ },
1938
+ {
1939
+ "name": "card/padding",
1940
+ "collection": "Layout",
1941
+ "type": "FLOAT",
1942
+ "code": "var(--card-padding)",
1943
+ "description": "Card inset",
1944
+ "values": {
1945
+ "Value": {
1946
+ "alias": "spacing/14"
1947
+ }
1948
+ }
1949
+ },
1950
+ {
1951
+ "name": "card/header-padding-y",
1952
+ "collection": "Layout",
1953
+ "type": "FLOAT",
1954
+ "code": "var(--card-header-padding-y)",
1955
+ "description": "",
1956
+ "values": {
1957
+ "Value": {
1958
+ "alias": "card/padding"
1959
+ }
1960
+ }
1961
+ },
1962
+ {
1963
+ "name": "card/header-padding-x",
1964
+ "collection": "Layout",
1965
+ "type": "FLOAT",
1966
+ "code": "var(--card-header-padding-x)",
1967
+ "description": "",
1968
+ "values": {
1969
+ "Value": {
1970
+ "alias": "card/padding"
1971
+ }
1972
+ }
1973
+ },
1974
+ {
1975
+ "name": "card/header-min-height",
1976
+ "collection": "Layout",
1977
+ "type": "FLOAT",
1978
+ "code": "var(--card-header-min-height)",
1979
+ "description": "Compact card header",
1980
+ "values": {
1981
+ "Value": 42
1982
+ }
1983
+ },
1984
+ {
1985
+ "name": "card/header-height",
1986
+ "collection": "Layout",
1987
+ "type": "FLOAT",
1988
+ "code": "var(--card-header-height)",
1989
+ "description": "Card header",
1990
+ "values": {
1991
+ "Value": 44
1992
+ }
1993
+ },
1994
+ {
1995
+ "name": "card/body-padding",
1996
+ "collection": "Layout",
1997
+ "type": "FLOAT",
1998
+ "code": "var(--card-body-padding)",
1999
+ "description": "",
2000
+ "values": {
2001
+ "Value": {
2002
+ "alias": "card/padding"
2003
+ }
2004
+ }
2005
+ },
2006
+ {
2007
+ "name": "row/padding-y",
2008
+ "collection": "Layout",
2009
+ "type": "FLOAT",
2010
+ "code": "var(--row-padding-y)",
2011
+ "description": "Data row, above and below",
2012
+ "values": {
2013
+ "Value": 8
2014
+ }
2015
+ },
2016
+ {
2017
+ "name": "focus/ring-width",
2018
+ "collection": "Spacing",
2019
+ "type": "FLOAT",
2020
+ "code": "var(--focus-ring-width)",
2021
+ "description": "Focus ring stroke",
2022
+ "values": {
2023
+ "Value": 1
2024
+ }
2025
+ },
2026
+ {
2027
+ "name": "weight/regular",
2028
+ "collection": "Typography",
2029
+ "type": "FLOAT",
2030
+ "code": "var(--weight-regular)",
2031
+ "description": "",
2032
+ "values": {
2033
+ "Value": 400
2034
+ }
2035
+ },
2036
+ {
2037
+ "name": "weight/medium",
2038
+ "collection": "Typography",
2039
+ "type": "FLOAT",
2040
+ "code": "var(--weight-medium)",
2041
+ "description": "",
2042
+ "values": {
2043
+ "Value": 500
2044
+ }
2045
+ },
2046
+ {
2047
+ "name": "weight/semibold",
2048
+ "collection": "Typography",
2049
+ "type": "FLOAT",
2050
+ "code": "var(--weight-semibold)",
2051
+ "description": "",
2052
+ "values": {
2053
+ "Value": 600
2054
+ }
2055
+ },
2056
+ {
2057
+ "name": "duration/fast",
2058
+ "collection": "Motion",
2059
+ "type": "FLOAT",
2060
+ "code": "var(--duration-fast)",
2061
+ "description": "Hovers, small changes",
2062
+ "values": {
2063
+ "Value": 140
2064
+ }
2065
+ },
2066
+ {
2067
+ "name": "duration/normal",
2068
+ "collection": "Motion",
2069
+ "type": "FLOAT",
2070
+ "code": "var(--duration-normal)",
2071
+ "description": "Panels, page changes",
2072
+ "values": {
2073
+ "Value": 220
2074
+ }
1905
2075
  }
1906
2076
  ]
1907
2077
  }
package/text-styles.css CHANGED
@@ -1,4 +1,4 @@
1
- /* @swiftsolve/rove-tokens 1.0.0. Generated from Figma by scripts/tokens/build.mjs; do not edit. */
1
+ /* @swiftsolve/rove-tokens 1.1.0. Generated from Figma by scripts/tokens/build.mjs; do not edit. */
2
2
 
3
3
  @layer components {
4
4
  /* Page titles, the wordmark. */
@@ -107,68 +107,14 @@
107
107
  }
108
108
  ]
109
109
  },
110
- "focus-ring-width": {
111
- "$type": "dimension",
112
- "$value": {
113
- "value": 1,
114
- "unit": "px"
115
- }
116
- },
117
110
  "focus-outline": {
118
111
  "$type": "border",
119
112
  "$value": {
120
- "width": "{focus-ring-width}",
113
+ "width": "{focus.ring-width}",
121
114
  "style": "solid",
122
115
  "color": "{focus.ring}"
123
116
  }
124
117
  },
125
- "titlebar-height": {
126
- "$type": "dimension",
127
- "$value": {
128
- "value": 56,
129
- "unit": "px"
130
- }
131
- },
132
- "rail-item-size": {
133
- "$type": "dimension",
134
- "$value": {
135
- "value": 38,
136
- "unit": "px"
137
- }
138
- },
139
- "card-padding": {
140
- "$value": "{spacing.14}"
141
- },
142
- "card-header-padding-y": {
143
- "$value": "{card-padding}"
144
- },
145
- "card-header-padding-x": {
146
- "$value": "{card-padding}"
147
- },
148
- "card-header-min-height": {
149
- "$type": "dimension",
150
- "$value": {
151
- "value": 42,
152
- "unit": "px"
153
- }
154
- },
155
- "card-header-height": {
156
- "$type": "dimension",
157
- "$value": {
158
- "value": 44,
159
- "unit": "px"
160
- }
161
- },
162
- "card-body-padding": {
163
- "$value": "{card-padding}"
164
- },
165
- "row-padding-y": {
166
- "$type": "dimension",
167
- "$value": {
168
- "value": 8,
169
- "unit": "px"
170
- }
171
- },
172
118
  "ease-out": {
173
119
  "$type": "cubicBezier",
174
120
  "$value": [
@@ -195,31 +141,5 @@
195
141
  0.58,
196
142
  1
197
143
  ]
198
- },
199
- "duration-fast": {
200
- "$type": "duration",
201
- "$value": {
202
- "value": 140,
203
- "unit": "ms"
204
- }
205
- },
206
- "duration-normal": {
207
- "$type": "duration",
208
- "$value": {
209
- "value": 220,
210
- "unit": "ms"
211
- }
212
- },
213
- "weight-regular": {
214
- "$type": "fontWeight",
215
- "$value": 400
216
- },
217
- "weight-medium": {
218
- "$type": "fontWeight",
219
- "$value": 500
220
- },
221
- "weight-semibold": {
222
- "$type": "fontWeight",
223
- "$value": 600
224
144
  }
225
145
  }
@@ -0,0 +1,67 @@
1
+ {
2
+ "titlebar": {
3
+ "height": {
4
+ "$type": "dimension",
5
+ "$value": {
6
+ "value": 56,
7
+ "unit": "px"
8
+ },
9
+ "$description": "Title bar"
10
+ }
11
+ },
12
+ "rail": {
13
+ "item-size": {
14
+ "$type": "dimension",
15
+ "$value": {
16
+ "value": 38,
17
+ "unit": "px"
18
+ },
19
+ "$description": "Rail items"
20
+ }
21
+ },
22
+ "card": {
23
+ "padding": {
24
+ "$type": "dimension",
25
+ "$value": "{spacing.14}",
26
+ "$description": "Card inset"
27
+ },
28
+ "header-padding-y": {
29
+ "$type": "dimension",
30
+ "$value": "{card.padding}"
31
+ },
32
+ "header-padding-x": {
33
+ "$type": "dimension",
34
+ "$value": "{card.padding}"
35
+ },
36
+ "header-min-height": {
37
+ "$type": "dimension",
38
+ "$value": {
39
+ "value": 42,
40
+ "unit": "px"
41
+ },
42
+ "$description": "Compact card header"
43
+ },
44
+ "header-height": {
45
+ "$type": "dimension",
46
+ "$value": {
47
+ "value": 44,
48
+ "unit": "px"
49
+ },
50
+ "$description": "Card header"
51
+ },
52
+ "body-padding": {
53
+ "$type": "dimension",
54
+ "$value": "{card.padding}"
55
+ }
56
+ },
57
+ "row": {
58
+ "padding-y": {
59
+ "$type": "dimension",
60
+ "$value": {
61
+ "value": 8,
62
+ "unit": "px"
63
+ },
64
+ "$description": "Data row, above and below"
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "duration": {
3
+ "fast": {
4
+ "$type": "duration",
5
+ "$value": {
6
+ "value": 140,
7
+ "unit": "ms"
8
+ },
9
+ "$description": "Hovers, small changes"
10
+ },
11
+ "normal": {
12
+ "$type": "duration",
13
+ "$value": {
14
+ "value": 220,
15
+ "unit": "ms"
16
+ },
17
+ "$description": "Panels, page changes"
18
+ }
19
+ }
20
+ }
@@ -109,6 +109,14 @@
109
109
  "unit": "px"
110
110
  },
111
111
  "$description": "Focus ring offset"
112
+ },
113
+ "ring-width": {
114
+ "$type": "dimension",
115
+ "$value": {
116
+ "value": 1,
117
+ "unit": "px"
118
+ },
119
+ "$description": "Focus ring stroke"
112
120
  }
113
121
  }
114
122
  }
@@ -78,5 +78,19 @@
78
78
  "sans-serif"
79
79
  ]
80
80
  }
81
+ },
82
+ "weight": {
83
+ "regular": {
84
+ "$type": "fontWeight",
85
+ "$value": 400
86
+ },
87
+ "medium": {
88
+ "$type": "fontWeight",
89
+ "$value": 500
90
+ },
91
+ "semibold": {
92
+ "$type": "fontWeight",
93
+ "$value": 600
94
+ }
81
95
  }
82
96
  }
package/tokens.css CHANGED
@@ -1,4 +1,4 @@
1
- /* @swiftsolve/rove-tokens 1.0.0. Generated from Figma by scripts/tokens/build.mjs; do not edit. */
1
+ /* @swiftsolve/rove-tokens 1.1.0. Generated from Figma by scripts/tokens/build.mjs; do not edit. */
2
2
  :root {
3
3
  /* Color */
4
4
  --bg-base: #0b0b0c; /* Backdrop */
@@ -44,6 +44,7 @@
44
44
 
45
45
  /* Spacing */
46
46
  --focus-offset: 2px; /* Focus ring offset */
47
+ --focus-ring-width: 1px; /* Focus ring stroke */
47
48
  --spacing-2: 2px;
48
49
  --spacing-4: 4px;
49
50
  --spacing-6: 6px;
@@ -70,6 +71,9 @@
70
71
  --font-size-3xl: 28px;
71
72
  --font-family-sans: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
72
73
  --font-family-numeric: 'Questrial', ui-sans-serif, system-ui, sans-serif;
74
+ --weight-regular: 400;
75
+ --weight-medium: 500;
76
+ --weight-semibold: 600;
73
77
 
74
78
  /* Opacity */
75
79
  --opacity-tint-xs: 8%; /* Faintest tint */
@@ -80,29 +84,29 @@
80
84
  --opacity-high: 80%; /* Nearly opaque */
81
85
  --opacity-disabled: 40%; /* Disabled controls */
82
86
 
87
+ /* Layout */
88
+ --titlebar-height: 56px; /* Title bar */
89
+ --rail-item-size: 38px; /* Rail items */
90
+ --card-padding: var(--spacing-14); /* Card inset */
91
+ --card-header-padding-y: var(--card-padding);
92
+ --card-header-padding-x: var(--card-padding);
93
+ --card-header-min-height: 42px; /* Compact card header */
94
+ --card-header-height: 44px; /* Card header */
95
+ --card-body-padding: var(--card-padding);
96
+ --row-padding-y: 8px; /* Data row, above and below */
97
+
98
+ /* Motion */
99
+ --duration-fast: 140ms; /* Hovers, small changes */
100
+ --duration-normal: 220ms; /* Panels, page changes */
101
+
83
102
  /* Code-only */
84
103
  --shadow-panel: 0 1px 2px rgba(0, 0, 0, 0.22), 0 4px 12px rgba(0, 0, 0, 0.1);
85
104
  --shadow-raised: 0 12px 32px rgba(0, 0, 0, 0.22);
86
105
  --shadow-popover: 0 2px 6px rgba(0, 0, 0, 0.22), 0 6px 16px rgba(0, 0, 0, 0.22);
87
- --focus-ring-width: 1px;
88
106
  --focus-outline: var(--focus-ring-width) solid var(--focus-ring);
89
- --titlebar-height: 56px;
90
- --rail-item-size: 38px;
91
- --card-padding: var(--spacing-14);
92
- --card-header-padding-y: var(--card-padding);
93
- --card-header-padding-x: var(--card-padding);
94
- --card-header-min-height: 42px;
95
- --card-header-height: 44px;
96
- --card-body-padding: var(--card-padding);
97
- --row-padding-y: 8px;
98
107
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
99
108
  --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
100
109
  --ease-pulse: cubic-bezier(0.42, 0, 0.58, 1);
101
- --duration-fast: 140ms;
102
- --duration-normal: 220ms;
103
- --weight-regular: 400;
104
- --weight-medium: 500;
105
- --weight-semibold: 600;
106
110
  --focus-inset: calc(-1 * var(--focus-ring-width));
107
111
 
108
112
  /* Type styles */