@times-design-system/components-wordpress 1.2.2-alpha.1 → 1.2.2-alpha.10
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/BLOCK_CREATION_CHECKLIST.md +95 -5
- package/README.md +10 -4
- package/SCSS_VARIABLES_REFERENCE.md +316 -0
- package/STYLING_SYNC_GUIDE.md +306 -0
- package/TRANSFORMATION_GUIDE.md +286 -13
- package/dist/blocks/ad-container/style.css +23 -20
- package/dist/blocks/button/style-resolved.css +153 -0
- package/dist/blocks/button/style.css +138 -18
- package/dist/blocks/chip/style.css +68 -29
- package/dist/blocks/divider/style.css +25 -13
- package/dist/blocks/flag/style.css +39 -30
- package/dist/blocks/icon-button/style.css +21 -22
- package/dist/blocks/input/style.css +40 -17
- package/dist/blocks/link/style.css +87 -34
- package/dist/blocks/text/style.css +5 -18
- package/dist/blocks/toast/style.css +50 -34
- package/package.json +3 -3
- package/src/blocks/ad-container/style.css +23 -20
- package/src/blocks/button/style-resolved.css +153 -0
- package/src/blocks/button/style.css +138 -18
- package/src/blocks/chip/style.css +68 -29
- package/src/blocks/divider/style.css +25 -13
- package/src/blocks/flag/style.css +39 -30
- package/src/blocks/icon-button/style.css +21 -22
- package/src/blocks/input/style.css +40 -17
- package/src/blocks/link/style.css +87 -34
- package/src/blocks/text/style.css +5 -18
- package/src/blocks/toast/style.css +50 -34
|
@@ -68,13 +68,64 @@ Use this checklist when creating each new WordPress block from a React component
|
|
|
68
68
|
- [ ] Confirmed HTML output in pattern matches `render.php` structure
|
|
69
69
|
- [ ] Included proper ARIA attributes
|
|
70
70
|
|
|
71
|
-
## 6. Styling
|
|
71
|
+
## 6. Styling — Full Parity with React Components
|
|
72
|
+
|
|
73
|
+
### 6a. Copy Styles from React Component
|
|
74
|
+
|
|
75
|
+
- [ ] Located React component styles in `packages/components-react/src/<ComponentName>/<ComponentName>.scss` or `.css`
|
|
76
|
+
- [ ] Identified all style segments: base styles, variant modifiers, state handlers (hover, focus, active, disabled)
|
|
77
|
+
- [ ] Copied complete CSS from React component to WordPress `style.css`
|
|
78
|
+
- [ ] **CRITICAL**: All CSS custom properties (design tokens) are preserved — NO hardcoded values
|
|
79
|
+
- [ ] Followed BEM naming: `.tds-<component>`, `.tds-<component>--modifier` (intent variants, size variants, behaviour variants)
|
|
80
|
+
- [ ] Ensured state handlers (hover, focus, active, disabled) are included
|
|
81
|
+
- [ ] Verified transitions and animations are preserved
|
|
82
|
+
|
|
83
|
+
### 6b. Resolved Design Token Values
|
|
84
|
+
|
|
85
|
+
WordPress blocks use **resolved design token values** — actual hex colors, pixel sizes, and font definitions compiled directly into CSS. This makes blocks completely self-contained.
|
|
86
|
+
|
|
87
|
+
**Conversion Process**:
|
|
88
|
+
|
|
89
|
+
For each CSS property in the React component:
|
|
90
|
+
|
|
91
|
+
1. Identify the design token it references (e.g., `--spacing-05`, `--interactive-primary-fill-default`)
|
|
92
|
+
2. Look up the resolved value in [SCSS_VARIABLES_REFERENCE.md](./SCSS_VARIABLES_REFERENCE.md)
|
|
93
|
+
3. Replace the variable with the actual value:
|
|
94
|
+
- `gap: var(--spacing-03)` → `gap: 4px`
|
|
95
|
+
- `background: var(--interactive-primary-fill-default)` → `background: #005c8a`
|
|
96
|
+
- `font-family: var(--fontFamily040)` → `font-family: Roboto`
|
|
97
|
+
- `font-size: var(--fontSize030)` → `font-size: 1.6rem` (always use rem units from theme-scss)
|
|
98
|
+
|
|
99
|
+
**Checklist**:
|
|
100
|
+
|
|
101
|
+
- [ ] All hex color values are used directly (e.g., `#005c8a`, never `var(--color-*)`)
|
|
102
|
+
- [ ] All spacing uses pixel values (e.g., `8px`, never `var(--spacing-05)`)
|
|
103
|
+
- [ ] All typography uses concrete values (font-family, font-weight, font-size all explicit)
|
|
104
|
+
- [ ] Border radius values are hardcoded (e.g., `4px`, `9999px`)
|
|
105
|
+
- [ ] No CSS custom property fallbacks (e.g., no `var(--spacing-05, 8px)`)
|
|
106
|
+
- [ ] Blocks work in any WordPress theme (no theme-scss dependency needed)
|
|
107
|
+
- [ ] All color values from design tokens are accurate
|
|
108
|
+
|
|
109
|
+
**Reference**: See `SCSS_VARIABLES_REFERENCE.md` for the complete value mapping
|
|
110
|
+
|
|
111
|
+
### 6c. Variant Coverage
|
|
112
|
+
|
|
113
|
+
- [ ] **Intent variants**: primary, secondary, negative (if applicable) with unique color tokens
|
|
114
|
+
- [ ] **Size variants**: small, medium, large (if applicable) with appropriate padding/font-size
|
|
115
|
+
- [ ] **Behaviour variants**: full width, hug content, etc.
|
|
116
|
+
- [ ] **State handlers**: hover, active, focus-visible with box-shadow rings, disabled with opacity/color changes
|
|
117
|
+
- [ ] **Channel/toggle states**: for components like Chip (on/off states with different colors)
|
|
118
|
+
|
|
119
|
+
### 6d. Testing & Validation
|
|
72
120
|
|
|
73
|
-
- [ ] Updated `style.css` with component styles
|
|
74
|
-
- [ ] Used CSS custom properties for design tokens
|
|
75
|
-
- [ ] Followed BEM naming: `.tds-<component>`, `.tds-<component>--modifier`
|
|
76
121
|
- [ ] Tested styles on editor and frontend
|
|
77
|
-
- [ ]
|
|
122
|
+
- [ ] Verified all variant combinations render correctly with proper colors/sizing
|
|
123
|
+
- [ ] Checked focus/hover/active states work as expected
|
|
124
|
+
- [ ] Tested disabled state (proper cursor, opacity, color changes)
|
|
125
|
+
- [ ] Tested responsive breakpoints if applicable
|
|
126
|
+
- [ ] Added `style-editor.css` for editor-specific overrides (only if needed)
|
|
127
|
+
- [ ] Confirmed line count of `style.css` is comparable to React component (similar complexity = similar coverage)
|
|
128
|
+
- [ ] Visual comparison: side-by-side React vs WordPress block in patterns/editor to confirm parity
|
|
78
129
|
|
|
79
130
|
## 7. Utilities
|
|
80
131
|
|
|
@@ -160,10 +211,49 @@ Event handler → Not supported (use editor preview only)
|
|
|
160
211
|
|
|
161
212
|
**Solution**: Verify CSS paths in `block.json` and ensure theme-scss is in dependencies
|
|
162
213
|
|
|
214
|
+
### Issue: Styles incomplete or missing variants
|
|
215
|
+
|
|
216
|
+
**Solution**: Compare `style.css` line count to React component to identify gaps
|
|
217
|
+
```bash
|
|
218
|
+
# Check line count
|
|
219
|
+
wc -l src/blocks/<component>/style.css
|
|
220
|
+
wc -l packages/components-react/src/<ComponentName>/<ComponentName>.scss
|
|
221
|
+
|
|
222
|
+
# If WordPress component is <50% of React component, styles are incomplete
|
|
223
|
+
# Copy missing variant modifiers from React component:
|
|
224
|
+
grep 'tds-<component>--' packages/components-react/src/<ComponentName>/<ComponentName>.scss
|
|
225
|
+
# Ensure all variants are in WordPress style.css
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Typical missing patterns**:
|
|
229
|
+
- Intent variant modifiers (primary, secondary, negative)
|
|
230
|
+
- Size variant modifiers (small, medium, large)
|
|
231
|
+
- State handlers (hover, focus-visible, active, disabled)
|
|
232
|
+
- Focus ring styling with ::after pseudo-element
|
|
233
|
+
- Behaviour modifiers (full, hug)
|
|
234
|
+
|
|
235
|
+
### Issue: Block styles differ from React component
|
|
236
|
+
|
|
237
|
+
**Solution**: Use visual regression testing
|
|
238
|
+
1. Open React component in Storybook
|
|
239
|
+
2. Render WordPress block in editor side-by-side
|
|
240
|
+
3. Compare colors, spacing, typography for each variant
|
|
241
|
+
4. Verify all CSS custom properties use `var(--token-name)` format
|
|
242
|
+
5. Copy any missing styles from React component
|
|
243
|
+
|
|
163
244
|
### Issue: Inspector controls not working
|
|
164
245
|
|
|
165
246
|
**Solution**: Verify `setAttributes()` is called with correct attribute name and value
|
|
166
247
|
|
|
248
|
+
### Issue: Block renders in editor but not in patterns
|
|
249
|
+
|
|
250
|
+
**Solution**: Verify server-side render callback is properly configured
|
|
251
|
+
1. Check `render.php` exists in block directory
|
|
252
|
+
2. Verify `block.json` contains `"render": "file:./render.php"`
|
|
253
|
+
3. Rebuild: `npm run build` (copies render.php to dist/)
|
|
254
|
+
4. Verify render.php HTML structure matches save.js exactly
|
|
255
|
+
5. Test render.php independently in WordPress patterns
|
|
256
|
+
|
|
167
257
|
---
|
|
168
258
|
|
|
169
259
|
## Helpful Commands
|
package/README.md
CHANGED
|
@@ -929,12 +929,15 @@ npm run build && npm run build:plugin # Build for plugin distrib
|
|
|
929
929
|
### Get Help
|
|
930
930
|
|
|
931
931
|
1. **Check Documentation**:
|
|
932
|
-
- [TRANSFORMATION_GUIDE.md](./TRANSFORMATION_GUIDE.md) —
|
|
933
|
-
- [BLOCK_CREATION_CHECKLIST.md](./BLOCK_CREATION_CHECKLIST.md) —
|
|
932
|
+
- [TRANSFORMATION_GUIDE.md](./TRANSFORMATION_GUIDE.md) — Complete transformation process and testing
|
|
933
|
+
- [BLOCK_CREATION_CHECKLIST.md](./BLOCK_CREATION_CHECKLIST.md) — Step-by-step implementation verification
|
|
934
|
+
- [SCSS_VARIABLES_REFERENCE.md](./SCSS_VARIABLES_REFERENCE.md) — Design token CSS custom properties guide
|
|
935
|
+
- [STYLING_SYNC_GUIDE.md](./STYLING_SYNC_GUIDE.md) — Ensure CSS feature parity with React components
|
|
934
936
|
|
|
935
937
|
2. **Common Issues**:
|
|
936
938
|
- See "Troubleshooting Integration" section above
|
|
937
939
|
- Check plugin debug log: `/wp-content/debug.log`
|
|
940
|
+
- **Styling gaps**: Use [STYLING_SYNC_GUIDE.md](./STYLING_SYNC_GUIDE.md) and [SCSS_VARIABLES_REFERENCE.md](./SCSS_VARIABLES_REFERENCE.md) to validate style completeness
|
|
938
941
|
|
|
939
942
|
3. **Report Issues**:
|
|
940
943
|
- GitHub: [times-design-system/issues](https://github.com/newsuk/times-design-system/issues)
|
|
@@ -946,8 +949,11 @@ To add new blocks or improve existing ones:
|
|
|
946
949
|
|
|
947
950
|
1. Review [TRANSFORMATION_GUIDE.md](./TRANSFORMATION_GUIDE.md)
|
|
948
951
|
2. Follow [BLOCK_CREATION_CHECKLIST.md](./BLOCK_CREATION_CHECKLIST.md)
|
|
949
|
-
3.
|
|
950
|
-
4.
|
|
952
|
+
3. **Style using design tokens**: Reference [SCSS_VARIABLES_REFERENCE.md](./SCSS_VARIABLES_REFERENCE.md) for CSS custom properties
|
|
953
|
+
4. **Synchronize styling** using [STYLING_SYNC_GUIDE.md](./STYLING_SYNC_GUIDE.md) — critical for feature parity
|
|
954
|
+
5. Run testing workflow from TRANSFORMATION_GUIDE.md
|
|
955
|
+
6. Test thoroughly before submitting
|
|
956
|
+
7. Submit PR with detailed description
|
|
951
957
|
|
|
952
958
|
## License
|
|
953
959
|
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# Design Token Values Reference for WordPress Blocks
|
|
2
|
+
|
|
3
|
+
This document provides resolved design token values (actual hex colors, pixel sizes, and font definitions) used directly in WordPress block styles.
|
|
4
|
+
|
|
5
|
+
## Important: Resolved Values Architecture
|
|
6
|
+
|
|
7
|
+
WordPress blocks use **resolved design token values** directly in CSS rather than CSS custom properties. This approach:
|
|
8
|
+
|
|
9
|
+
- ✅ Makes blocks **self-contained** and independent of theme-scss loading
|
|
10
|
+
- ✅ Ensures **consistent appearance** across different WordPress installations
|
|
11
|
+
- ✅ Eliminates dependency on CSS variables being defined
|
|
12
|
+
- ✅ Makes blocks work reliably in any WordPress theme context
|
|
13
|
+
|
|
14
|
+
**No CSS custom properties are required at runtime** — all values are baked directly into the compiled block CSS.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Available SCSS Variables
|
|
19
|
+
|
|
20
|
+
All variables from `packages/theme-scss/src/tds-layout.scss` are compiled to CSS custom properties and available in block styles.
|
|
21
|
+
|
|
22
|
+
### Spacing Variables
|
|
23
|
+
|
|
24
|
+
| SCSS Variable | CSS Property | Value | Usage |
|
|
25
|
+
| ------------- | -------------- | ----- | ---------------------------- |
|
|
26
|
+
| `$spacing-01` | `--spacing-01` | 2px | Borders, minimal gaps |
|
|
27
|
+
| `$spacing-02` | `--spacing-02` | 3px | Fine-tuning |
|
|
28
|
+
| `$spacing-03` | `--spacing-03` | 4px | Tight spacing in components |
|
|
29
|
+
| `$spacing-04` | `--spacing-04` | 6px | Small gaps, padding |
|
|
30
|
+
| `$spacing-05` | `--spacing-05` | 8px | Common padding |
|
|
31
|
+
| `$spacing-06` | `--spacing-06` | 10px | Medium gaps |
|
|
32
|
+
| `$spacing-07` | `--spacing-07` | 12px | Medium-large gaps |
|
|
33
|
+
| `$spacing-08` | `--spacing-08` | 14px | Standard gap |
|
|
34
|
+
| `$spacing-09` | `--spacing-09` | 16px | Common gap (1rem equivalent) |
|
|
35
|
+
| `$spacing-10` | `--spacing-10` | 18px | Large gap |
|
|
36
|
+
| `$spacing-11` | `--spacing-11` | 20px | Larger spacing |
|
|
37
|
+
| `$spacing-12` | `--spacing-12` | 23px | Component sizing |
|
|
38
|
+
| `$spacing-13` | `--spacing-13` | 24px | Section divider spacing |
|
|
39
|
+
| `$spacing-14` | `--spacing-14` | 28px | Block separator |
|
|
40
|
+
| `$spacing-15` | `--spacing-15` | 32px | Small component height |
|
|
41
|
+
| `$spacing-16` | `--spacing-16` | 36px | Medium component height |
|
|
42
|
+
| `$spacing-17` | `--spacing-17` | 40px | Large component height |
|
|
43
|
+
| `$spacing-18` | `--spacing-18` | 48px | XL component height |
|
|
44
|
+
| `$spacing-19` | `--spacing-19` | 56px | Block spacing |
|
|
45
|
+
| `$spacing-20` | `--spacing-20` | 64px | Large section spacing |
|
|
46
|
+
| `$spacing-21` | `--spacing-21` | 80px | XL section spacing |
|
|
47
|
+
|
|
48
|
+
### Border Radius Variables
|
|
49
|
+
|
|
50
|
+
| SCSS Variable | CSS Property | Value | Usage |
|
|
51
|
+
| --------------------- | ---------------------- | ------ | ------------------------------ |
|
|
52
|
+
| `$border-radius-50` | `--border-radius-50` | 2px | Minimal rounding |
|
|
53
|
+
| `$border-radius-100` | `--border-radius-100` | 4px | Subtle rounding |
|
|
54
|
+
| `$border-radius-150` | `--border-radius-150` | 6px | Standard rounding |
|
|
55
|
+
| `$border-radius-200` | `--border-radius-200` | 8px | Medium rounding |
|
|
56
|
+
| `$border-radius-300` | `--border-radius-300` | 12px | Larger rounding |
|
|
57
|
+
| `$border-radius-400` | `--border-radius-400` | 16px | XL rounding |
|
|
58
|
+
| `$border-radius-full` | `--border-radius-full` | 9999px | Fully rounded (pills, circles) |
|
|
59
|
+
|
|
60
|
+
### Shadow Variables
|
|
61
|
+
|
|
62
|
+
| SCSS Variable | CSS Property | Usage |
|
|
63
|
+
| -------------------------------- | --------------------------------- | ----------------------- |
|
|
64
|
+
| `$shadow-elevation-down-level-2` | `--shadow-elevation-down-level-2` | Subtle elevation shadow |
|
|
65
|
+
| `$shadow-elevation-down-level-3` | `--shadow-elevation-down-level-3` | Medium elevation shadow |
|
|
66
|
+
| `$shadow-elevation-down-level-4` | `--shadow-elevation-down-level-4` | Strong elevation shadow |
|
|
67
|
+
| `$shadow-elevation-up-level-2` | `--shadow-elevation-up-level-2` | Upward subtle shadow |
|
|
68
|
+
| `$shadow-elevation-up-level-3` | `--shadow-elevation-up-level-3` | Upward medium shadow |
|
|
69
|
+
| `$shadow-elevation-up-level-4` | `--shadow-elevation-up-level-4` | Upward strong shadow |
|
|
70
|
+
|
|
71
|
+
**Example Shadow Usage**:
|
|
72
|
+
|
|
73
|
+
```css
|
|
74
|
+
.tds-toast {
|
|
75
|
+
box-shadow: var(--shadow-elevation-down-level-3);
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Note**: While this example shows CSS variables for illustration, WordPress blocks use **resolved values** (actual hex, pixel sizes, and font names) compiled directly into CSS, not CSS variables.
|
|
80
|
+
|
|
81
|
+
### Breakpoint Variables
|
|
82
|
+
|
|
83
|
+
| SCSS Variable | CSS Property | Value | Usage |
|
|
84
|
+
| -------------------- | --------------------- | ------ | ---------------- |
|
|
85
|
+
| `$breakpoint-small` | `--breakpoint-small` | 0px | Mobile (base) |
|
|
86
|
+
| `$breakpoint-medium` | `--breakpoint-medium` | 440px | Tablet portrait |
|
|
87
|
+
| `$breakpoint-large` | `--breakpoint-large` | 1024px | Tablet landscape |
|
|
88
|
+
| `$breakpoint-xLarge` | `--breakpoint-xLarge` | 1440px | Desktop |
|
|
89
|
+
|
|
90
|
+
**Example Media Query Usage**:
|
|
91
|
+
|
|
92
|
+
```css
|
|
93
|
+
@media (min-width: var(--breakpoint-large)) {
|
|
94
|
+
.tds-ad-container {
|
|
95
|
+
min-height: 400px;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Design Token Variables (from tokens package)
|
|
103
|
+
|
|
104
|
+
These CSS custom properties are compiled from the design tokens package and available in client WordPress installations through the imported theme.
|
|
105
|
+
|
|
106
|
+
### Typography Variables
|
|
107
|
+
|
|
108
|
+
| CSS Property | Purpose | Example Value |
|
|
109
|
+
| --------------------- | ---------------- | ----------------- |
|
|
110
|
+
| `--fontFamily010` | Brand serif font | Times Modern |
|
|
111
|
+
| `--fontFamily020` | Brand font | Times Digital W04 |
|
|
112
|
+
| `--fontFamily040` | Standard font | Roboto |
|
|
113
|
+
| `--fontWeight040` | Regular weight | 400 |
|
|
114
|
+
| `--fontWeight050` | Medium weight | 500 |
|
|
115
|
+
| `--fontWeight070` | Bold weight | 700 |
|
|
116
|
+
| `--fontSize010` | XS text | 1.2rem |
|
|
117
|
+
| `--fontSize020` | S text | 1.4rem |
|
|
118
|
+
| `--fontSize030` | M text | 1.6rem |
|
|
119
|
+
| `--fontSize040` | L text | 1.8rem |
|
|
120
|
+
| `--fontLineHeight010` | Tight leading | 1 |
|
|
121
|
+
| `--fontLineHeight020` | Compact leading | 1.125 |
|
|
122
|
+
| `--fontLineHeight040` | Normal leading | 1.5 |
|
|
123
|
+
|
|
124
|
+
### Interactive State Colors
|
|
125
|
+
|
|
126
|
+
| CSS Property Group | Variants | Usage |
|
|
127
|
+
| ---------------------------------- | -------------------------------------------- | ------------------ |
|
|
128
|
+
| `--interactive-primary-*` | fill, text, border (default, hover, pressed) | Primary actions |
|
|
129
|
+
| `--interactive-secondary-*` | fill, text, border (default, hover, pressed) | Secondary actions |
|
|
130
|
+
| `--interactive-negative-*` | fill, text, border (default, hover, pressed) | Destructive action |
|
|
131
|
+
| `--interactive-chip-primary-on-*` | fill, text, icon (default, hover, pressed) | Selected chip |
|
|
132
|
+
| `--interactive-chip-primary-off-*` | fill, text, icon (default, hover, pressed) | Unselected chip |
|
|
133
|
+
| `--interactive-disabled-*` | Colors for disabled states | Disabled UI |
|
|
134
|
+
| `--interactive-link-primary-*` | text, underline (default, hover, visited) | Primary links |
|
|
135
|
+
| `--interactive-link-secondary-*` | text, underline (default, hover, visited) | Secondary links |
|
|
136
|
+
|
|
137
|
+
### Messaging Colors
|
|
138
|
+
|
|
139
|
+
| CSS Property | Value | Usage |
|
|
140
|
+
| ---------------------- | ----- | ------------- |
|
|
141
|
+
| `--toast-fill-success` | Green | Success toast |
|
|
142
|
+
| `--toast-text-success` | White | Success text |
|
|
143
|
+
| `--toast-fill-error` | Red | Error toast |
|
|
144
|
+
| `--toast-text-error` | White | Error text |
|
|
145
|
+
| `--toast-fill-warning` | Gold | Warning toast |
|
|
146
|
+
| `--toast-text-warning` | Black | Warning text |
|
|
147
|
+
| `--toast-fill-info` | Blue | Info toast |
|
|
148
|
+
| `--toast-text-info` | White | Info text |
|
|
149
|
+
|
|
150
|
+
### Border Colors
|
|
151
|
+
|
|
152
|
+
| CSS Property | Usage |
|
|
153
|
+
| ------------------- | ------------------------ |
|
|
154
|
+
| `--border-primary` | Standard borders |
|
|
155
|
+
| `--border-disabled` | Disabled element borders |
|
|
156
|
+
| `--focus-border` | Focus ring color |
|
|
157
|
+
|
|
158
|
+
### Text Colors
|
|
159
|
+
|
|
160
|
+
| CSS Property | Usage |
|
|
161
|
+
| ---------------------------- | -------------- |
|
|
162
|
+
| `--text-primary` | Body text |
|
|
163
|
+
| `--text-secondary` | Secondary text |
|
|
164
|
+
| `--text-disabled` | Disabled text |
|
|
165
|
+
| `--text-interactive-primary` | Link text |
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Common CSS Variable Patterns
|
|
170
|
+
|
|
171
|
+
### Button Component
|
|
172
|
+
|
|
173
|
+
```css
|
|
174
|
+
.tds-button {
|
|
175
|
+
/* Color tokens from interactive palette */
|
|
176
|
+
--tds-button-bg: var(--interactive-primary-fill-default);
|
|
177
|
+
--tds-button-fg: var(--interactive-primary-text-default);
|
|
178
|
+
--tds-button-border: var(--interactive-primary-border-default);
|
|
179
|
+
|
|
180
|
+
/* Spacing tokens from layout */
|
|
181
|
+
gap: var(--spacing-03);
|
|
182
|
+
padding: 0 var(--spacing-09);
|
|
183
|
+
|
|
184
|
+
/* Typography tokens */
|
|
185
|
+
font-family: var(--fontFamily040);
|
|
186
|
+
font-weight: var(--fontWeight050);
|
|
187
|
+
font-size: var(--fontSize030);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.tds-button--size-small {
|
|
191
|
+
min-height: var(--spacing-15);
|
|
192
|
+
padding: 0 var(--spacing-07);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.tds-button--intent-secondary {
|
|
196
|
+
--tds-button-bg: var(--interactive-secondary-fill-default);
|
|
197
|
+
--tds-button-fg: var(--interactive-secondary-text-default);
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Toast Component
|
|
202
|
+
|
|
203
|
+
```css
|
|
204
|
+
.tds-toast {
|
|
205
|
+
/* Elevation shadow */
|
|
206
|
+
box-shadow: var(--shadow-elevation-down-level-3);
|
|
207
|
+
|
|
208
|
+
/* Spacing */
|
|
209
|
+
padding: var(--spacing-07) var(--spacing-09);
|
|
210
|
+
gap: var(--spacing-07);
|
|
211
|
+
|
|
212
|
+
/* Intent colors */
|
|
213
|
+
background: var(--toast-fill-success);
|
|
214
|
+
color: var(--toast-text-success);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.tds-toast--intent-error {
|
|
218
|
+
background: var(--toast-fill-error);
|
|
219
|
+
color: var(--toast-text-error);
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Chip Component
|
|
224
|
+
|
|
225
|
+
```css
|
|
226
|
+
.tds-chip {
|
|
227
|
+
/* Custom properties for state variations */
|
|
228
|
+
--tds-chip-bg: var(--interactive-chip-primary-on-fill-default);
|
|
229
|
+
--tds-chip-fg: var(--interactive-chip-primary-on-text-default);
|
|
230
|
+
|
|
231
|
+
/* Rounding */
|
|
232
|
+
border-radius: calc(var(--border-radius-full) * 1px);
|
|
233
|
+
|
|
234
|
+
/* Sizing */
|
|
235
|
+
min-height: var(--spacing-16);
|
|
236
|
+
padding: 0 var(--spacing-07);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.tds-chip--size-large {
|
|
240
|
+
min-height: var(--spacing-18);
|
|
241
|
+
padding: 0 var(--spacing-09);
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Best Practices for Block Styling
|
|
248
|
+
|
|
249
|
+
### ✅ DO:
|
|
250
|
+
|
|
251
|
+
- ✅ Always use CSS custom properties for colors, spacing, typography
|
|
252
|
+
- ✅ Define component-specific custom properties (e.g., `--tds-button-bg`) that reference design tokens
|
|
253
|
+
- ✅ Use tokens for ALL hardcoded values (no hex colors, no pixel dimensions)
|
|
254
|
+
- ✅ Reference `--spacing-*` for all gaps, margins, and padding
|
|
255
|
+
- ✅ Reference `--border-radius-*` for all rounding
|
|
256
|
+
- ✅ Use `--fontFamily*` and `--fontWeight*` for typography
|
|
257
|
+
|
|
258
|
+
### ❌ DON'T:
|
|
259
|
+
|
|
260
|
+
- ❌ Hardcode hex colors: `color: #000000;` → Use `color: var(--text-primary);`
|
|
261
|
+
- ❌ Hardcode pixel values: `padding: 16px;` → Use `padding: var(--spacing-09);`
|
|
262
|
+
- ❌ Create custom color/spacing values not in the token system
|
|
263
|
+
- ❌ Skip typography customization: Always specify font, weight, and size via tokens
|
|
264
|
+
- ❌ Duplicate token definitions across files
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Testing CSS Variables
|
|
269
|
+
|
|
270
|
+
To verify CSS variables are resolving correctly:
|
|
271
|
+
|
|
272
|
+
1. **In browser DevTools**: Inspect a rendered block element
|
|
273
|
+
2. **Check computed styles**: Look for `--spacing-*`, `--interactive-*` properties
|
|
274
|
+
3. **Verify colors**: Hover over color properties to see actual hex values
|
|
275
|
+
4. **Check fallback values**: If variable is undefined, CSS fallback is used
|
|
276
|
+
|
|
277
|
+
```css
|
|
278
|
+
/* Safe fallback pattern (if variable not available) */
|
|
279
|
+
color: var(--text-primary, #1a1a1a);
|
|
280
|
+
border-color: var(--border-primary, #999999);
|
|
281
|
+
gap: var(--spacing-03, 4px);
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## For New Block Developers
|
|
287
|
+
|
|
288
|
+
When creating a new WordPress block:
|
|
289
|
+
|
|
290
|
+
1. **Copy styles from React component**: Start with the React component's CSS
|
|
291
|
+
2. **Replace hardcoded values with variables**: Every color → `var(--...)`, every space → `var(--spacing-...)`
|
|
292
|
+
3. **Reference this guide**: Use the variable mappings above
|
|
293
|
+
4. **Test in WordPress**: Ensure CSS custom properties resolve in both editor and frontend
|
|
294
|
+
5. **Compare with existing blocks**: Use Button or Input as a reference model
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Troubleshooting
|
|
299
|
+
|
|
300
|
+
**Problem**: CSS variables not resolving (seeing empty/default values)
|
|
301
|
+
**Solution**: Verify `theme-scss` is installed and theme files are enqueued. Check browser DevTools computed styles.
|
|
302
|
+
|
|
303
|
+
**Problem**: Colors looking different than expected
|
|
304
|
+
**Solution**: Design token hex values may vary. Check actual hex in design tokens or use DevTools color picker.
|
|
305
|
+
|
|
306
|
+
**Problem**: Spacing values too large/small
|
|
307
|
+
**Solution**: Verify you're using the correct `--spacing-*` variable. Reference the table above.
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Reference Files
|
|
312
|
+
|
|
313
|
+
- SCSS Source: `packages/theme-scss/src/tds-layout.scss`
|
|
314
|
+
- CSS Output: `build/css/variables.css`
|
|
315
|
+
- Token Definitions: `packages/tokens/src/tokens.json`
|
|
316
|
+
- Example Block Styles: `packages/components-wordpress/src/blocks/button/style.css`
|