@jamesodwyer/gds-figma-vite 2.0.2 → 2.0.4

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.
@@ -74,10 +74,123 @@ function App() {
74
74
 
75
75
  ---
76
76
 
77
+ ## CRITICAL: Compound Component Pattern
78
+
79
+ Many GDS components use the **compound component pattern**. Sub-components are accessed via dot notation on the parent component, NOT as separate imports.
80
+
81
+ ### Correct Usage (Dot Notation)
82
+
83
+ ```tsx
84
+ // ✅ CORRECT - Use dot notation for sub-components
85
+ <Modal>
86
+ <Modal.Header>...</Modal.Header>
87
+ <Modal.Title>...</Modal.Title>
88
+ <Modal.Content>...</Modal.Content>
89
+ <Modal.Description>...</Modal.Description>
90
+ <Modal.Actions>...</Modal.Actions>
91
+ </Modal>
92
+
93
+ <Card>
94
+ <Card.Title>...</Card.Title>
95
+ <Card.Body>...</Card.Body>
96
+ </Card>
97
+
98
+ <InputField id="email">
99
+ <InputField.Label>...</InputField.Label>
100
+ <InputField.Input />
101
+ </InputField>
102
+ ```
103
+
104
+ ### WRONG Usage (Do NOT Do This)
105
+
106
+ ```tsx
107
+ // ❌ WRONG - These components DO NOT EXIST as separate imports
108
+ <ModalHeader> // WRONG - use Modal.Header
109
+ <ModalTitle> // WRONG - use Modal.Title
110
+ <ModalContent> // WRONG - use Modal.Content
111
+ <ModalDescription> // WRONG - use Modal.Description
112
+ <ModalActions> // WRONG - use Modal.Actions
113
+ <CardTitle> // WRONG - use Card.Title
114
+ <CardBody> // WRONG - use Card.Body
115
+ <CardContent> // WRONG - does not exist at all
116
+ ```
117
+
118
+ ### Components with Compound Sub-components
119
+
120
+ | Component | Sub-components |
121
+ |-----------|----------------|
122
+ | Modal | `.Header`, `.Title`, `.Content`, `.Description`, `.Image`, `.CloseButton`, `.Actions` |
123
+ | Card | `.Title`, `.Body` |
124
+ | InputField | `.Label`, `.Row`, `.Input`, `.Textarea`, `.Select`, `.Checkbox`, `.Radio`, `.StartIcon`, `.EndIcon`, `.Validation` |
125
+ | Accordion | `.Item`, `.Toggle`, `.Content` |
126
+
127
+ ---
128
+
129
+ ## CRITICAL: Non-Existent Components
130
+
131
+ > **⚠️ WARNING FOR AI AGENTS**: The following components DO NOT exist in this design system. Do NOT generate code using them.
132
+
133
+ ### Components That DO NOT Exist
134
+
135
+ | Non-Existent | Use Instead |
136
+ |--------------|-------------|
137
+ | `ButtonGroup` | Use `Stack` with `gap` prop, or a styled `div` with flexbox |
138
+ | `CardContent` | Put content directly inside `Card.Body` |
139
+ | `CardHeader` | Use `Card.Title` |
140
+ | `CardActions` | Put buttons inside `Card.Body` |
141
+ | `ModalDescription` | Use `Modal.Description` (compound component) |
142
+ | `ModalHeader` | Use `Modal.Header` (compound component) |
143
+ | `ModalBody` | Use `Modal.Content` (compound component) |
144
+ | `ModalFooter` | Use `Modal.Actions` (compound component) |
145
+ | `FormControl` | Use `InputField` compound component |
146
+ | `FormLabel` | Use `InputField.Label` |
147
+ | `FormHelperText` | Use `InputField.Validation` |
148
+ | `Grid` | Use CSS Grid or styled `div` |
149
+ | `Box` | Use styled `div` with spacing tokens |
150
+ | `Container` | Use styled `div` with spacing tokens |
151
+ | `Typography` | Use `TextStyle` component |
152
+ | `Divider` | Use styled `hr` or `div` |
153
+ | `IconButton` | Use `CircleButton` or `SquareButton` |
154
+ | `Snackbar` | Use `Toast` |
155
+ | `Dialog` | Use `Modal` |
156
+ | `Drawer` | Use `SidePanel` |
157
+ | `AppBar` | Use `Header` |
158
+
159
+ ### Layout Without ButtonGroup
160
+
161
+ Use `Stack` for horizontal button layouts:
162
+
163
+ ```tsx
164
+ import { Stack, Button } from '@jamesodwyer/gds-figma-vite';
165
+
166
+ // For horizontal button group
167
+ <Stack gap="club" style={{ display: 'flex', flexDirection: 'row' }}>
168
+ <Button colorVariant="secondary">Cancel</Button>
169
+ <Button colorVariant="primary">Confirm</Button>
170
+ </Stack>
171
+
172
+ // Or use a styled div
173
+ import styled from 'styled-components';
174
+ import { spacing } from '@jamesodwyer/gds-figma-vite';
175
+
176
+ const ButtonRow = styled.div`
177
+ display: flex;
178
+ gap: ${spacing.club};
179
+ `;
180
+
181
+ <ButtonRow>
182
+ <Button colorVariant="secondary">Cancel</Button>
183
+ <Button colorVariant="primary">Confirm</Button>
184
+ </ButtonRow>
185
+ ```
186
+
187
+ ---
188
+
77
189
  ## IMPORTANT: Code Generation Rules
78
190
 
79
191
  ### DO:
80
192
  - Always wrap with `GdsProvider` or `ThemeProvider`
193
+ - Use compound component syntax (`Modal.Header`, `Card.Body`, etc.)
81
194
  - Use semantic color tokens from theme (`theme.base.primary`, `theme.status.danger`)
82
195
  - Use spacing tokens (`spacing.auditorium`, `spacing.arena`)
83
196
  - Use textStyle for typography (`textStyle.rainier`, `textStyle.everest`)
@@ -86,6 +199,8 @@ function App() {
86
199
  - Import components from `@jamesodwyer/gds-figma-vite`
87
200
 
88
201
  ### DO NOT:
202
+ - **Never import sub-components separately** - use dot notation (`Modal.Header` not `ModalHeader`)
203
+ - **Never use components that don't exist** - check the exports list above
89
204
  - Never hardcode hex color values - always use theme tokens
90
205
  - Never use pixel values for spacing - use spacing tokens
91
206
  - Never use custom font sizes - use textStyle utilities
@@ -116,6 +231,7 @@ function App() {
116
231
  ### Layout Components
117
232
  | Component | Purpose | Docs |
118
233
  |-----------|---------|------|
234
+ | `Stack` | Spacing utility for vertical/horizontal layouts | [Stack.md](./components/Stack.md) |
119
235
  | `Card` | Content containers with Title and Body | [Card.md](./components/Card.md) |
120
236
  | `Modal` | Overlay dialogs requiring user attention | [Modal.md](./components/Modal.md) |
121
237
  | `SidePanel` | Slide-in panels for supplementary content | [SidePanel.md](./components/SidePanel.md) |
@@ -8,6 +8,8 @@ Container component for grouping related content with optional elevation and sty
8
8
  import { Card } from '@jamesodwyer/gds-figma-vite';
9
9
  ```
10
10
 
11
+ > **⚠️ IMPORTANT**: Card uses a compound component pattern. Sub-components are accessed via dot notation (`Card.Title`, `Card.Body`), NOT as separate imports.
12
+
11
13
  ## Purpose
12
14
 
13
15
  Use Card to:
@@ -15,13 +17,60 @@ Use Card to:
15
17
  - Create visual separation between content areas
16
18
  - Display information in a contained, elevated surface
17
19
 
18
- ## Structure
20
+ ## Structure (Compound Components)
21
+
22
+ Card uses **dot notation** for sub-components. These are NOT separate imports.
19
23
 
20
24
  | Sub-component | Description |
21
25
  |---------------|-------------|
22
- | Card | Main container |
23
- | Card.Title | Header/title area |
24
- | Card.Body | Main content area |
26
+ | `Card` | Main container |
27
+ | `Card.Title` | Header/title area |
28
+ | `Card.Body` | Main content area |
29
+
30
+ ### ❌ WRONG - Do Not Use These (They Don't Exist)
31
+
32
+ ```tsx
33
+ // These components DO NOT EXIST - do not import or use them:
34
+ <CardTitle> // ❌ WRONG
35
+ <CardBody> // ❌ WRONG
36
+ <CardContent> // ❌ WRONG - does not exist at all
37
+ <CardHeader> // ❌ WRONG
38
+ <CardActions> // ❌ WRONG
39
+ <CardFooter> // ❌ WRONG
40
+ ```
41
+
42
+ ### ✅ CORRECT - Use Dot Notation
43
+
44
+ ```tsx
45
+ // Always use dot notation:
46
+ <Card>
47
+ <Card.Title>My Title</Card.Title> // ✅ CORRECT
48
+ <Card.Body>My content</Card.Body> // ✅ CORRECT
49
+ </Card>
50
+ ```
51
+
52
+ ### Note on CardContent
53
+
54
+ There is **NO `CardContent` component**. Put your content directly inside `Card.Body`:
55
+
56
+ ```tsx
57
+ // ❌ WRONG - CardContent doesn't exist
58
+ <Card>
59
+ <Card.Body>
60
+ <CardContent> {/* This will cause an error! */}
61
+ <p>Content</p>
62
+ </CardContent>
63
+ </Card.Body>
64
+ </Card>
65
+
66
+ // ✅ CORRECT - Put content directly in Card.Body
67
+ <Card>
68
+ <Card.Body>
69
+ <TextStyle>Content goes here</TextStyle>
70
+ <Button>Action</Button>
71
+ </Card.Body>
72
+ </Card>
73
+ ```
25
74
 
26
75
  ## Basic Usage
27
76
 
@@ -8,6 +8,8 @@ Overlay dialog for focused user interactions requiring attention or action.
8
8
  import { Modal } from '@jamesodwyer/gds-figma-vite';
9
9
  ```
10
10
 
11
+ > **⚠️ IMPORTANT**: Modal uses a compound component pattern. All sub-components are accessed via dot notation (`Modal.Header`, `Modal.Title`, etc.), NOT as separate imports.
12
+
11
13
  ## Purpose
12
14
 
13
15
  Use Modal for:
@@ -16,18 +18,44 @@ Use Modal for:
16
18
  - Important information that needs acknowledgment
17
19
  - Alert dialogs
18
20
 
19
- ## Structure
21
+ ## Structure (Compound Components)
22
+
23
+ Modal uses **dot notation** for sub-components. These are NOT separate imports.
20
24
 
21
25
  | Sub-component | Description |
22
26
  |---------------|-------------|
23
- | Modal | Container with backdrop |
24
- | Modal.Header | Header section |
25
- | Modal.Title | Modal title |
26
- | Modal.Content | Main content area |
27
- | Modal.Description | Descriptive text |
28
- | Modal.Image | Optional banner image |
29
- | Modal.CloseButton | Close button |
30
- | Modal.Actions | Action buttons container |
27
+ | `Modal` | Container with backdrop |
28
+ | `Modal.Header` | Header section |
29
+ | `Modal.Title` | Modal title |
30
+ | `Modal.Content` | Main content area |
31
+ | `Modal.Description` | Descriptive text |
32
+ | `Modal.Image` | Optional banner image |
33
+ | `Modal.CloseButton` | Close button |
34
+ | `Modal.Actions` | Action buttons container |
35
+
36
+ ### ❌ WRONG - Do Not Use These (They Don't Exist)
37
+
38
+ ```tsx
39
+ // These components DO NOT EXIST - do not import or use them:
40
+ <ModalHeader> // ❌ WRONG
41
+ <ModalTitle> // ❌ WRONG
42
+ <ModalContent> // ❌ WRONG
43
+ <ModalDescription> // ❌ WRONG
44
+ <ModalActions> // ❌ WRONG
45
+ <ModalFooter> // ❌ WRONG
46
+ <ModalBody> // ❌ WRONG
47
+ ```
48
+
49
+ ### ✅ CORRECT - Use Dot Notation
50
+
51
+ ```tsx
52
+ // Always use dot notation:
53
+ <Modal.Header> // ✅ CORRECT
54
+ <Modal.Title> // ✅ CORRECT
55
+ <Modal.Content> // ✅ CORRECT
56
+ <Modal.Description> // ✅ CORRECT
57
+ <Modal.Actions> // ✅ CORRECT
58
+ ```
31
59
 
32
60
  ## Props
33
61
 
@@ -0,0 +1,174 @@
1
+ # Stack Component
2
+
3
+ Simple layout utility for adding consistent spacing between child elements.
4
+
5
+ ## Import
6
+
7
+ ```tsx
8
+ import { Stack } from '@jamesodwyer/gds-figma-vite';
9
+ ```
10
+
11
+ ## Purpose
12
+
13
+ Use Stack to:
14
+ - Add consistent vertical spacing between elements
15
+ - Create horizontal layouts with gaps (using CSS)
16
+ - Replace non-existent `ButtonGroup` component
17
+ - Quickly layout form elements or content sections
18
+
19
+ ## Props
20
+
21
+ | Prop | Type | Default | Description |
22
+ |------|------|---------|-------------|
23
+ | gap | SpacingToken | - | Gap between children using spacing scale |
24
+
25
+ ### Available Gap Values
26
+
27
+ | Token | Value |
28
+ |-------|-------|
29
+ | `lounge` | 4px |
30
+ | `club` | 8px |
31
+ | `hall` | 12px |
32
+ | `auditorium` | 16px |
33
+ | `theatre` | 20px |
34
+ | `amphitheatre` | 24px |
35
+ | `arena` | 32px |
36
+ | `stadium` | 48px |
37
+ | `dome` | 64px |
38
+ | `field` | 88px |
39
+
40
+ ## Basic Usage (Vertical Stack)
41
+
42
+ ```tsx
43
+ import { GdsProvider, Stack, Button } from '@jamesodwyer/gds-figma-vite';
44
+
45
+ <GdsProvider>
46
+ <Stack gap="auditorium">
47
+ <Button colorVariant="primary">First Button</Button>
48
+ <Button colorVariant="secondary">Second Button</Button>
49
+ <Button colorVariant="tertiary">Third Button</Button>
50
+ </Stack>
51
+ </GdsProvider>
52
+ ```
53
+
54
+ ## Horizontal Layout (Button Row)
55
+
56
+ > **Note**: `ButtonGroup` does not exist in GDS. Use Stack with flex styling instead.
57
+
58
+ ```tsx
59
+ import { GdsProvider, Stack, Button } from '@jamesodwyer/gds-figma-vite';
60
+
61
+ <GdsProvider>
62
+ <Stack gap="club" style={{ display: 'flex', flexDirection: 'row' }}>
63
+ <Button colorVariant="secondary">Cancel</Button>
64
+ <Button colorVariant="primary">Confirm</Button>
65
+ </Stack>
66
+ </GdsProvider>
67
+ ```
68
+
69
+ ## With Styled Components
70
+
71
+ For more control, extend Stack with styled-components:
72
+
73
+ ```tsx
74
+ import styled from 'styled-components';
75
+ import { Stack, Button, spacing } from '@jamesodwyer/gds-figma-vite';
76
+
77
+ const ButtonRow = styled(Stack)`
78
+ display: flex;
79
+ flex-direction: row;
80
+ justify-content: flex-end;
81
+ `;
82
+
83
+ <ButtonRow gap="club">
84
+ <Button colorVariant="secondary">Cancel</Button>
85
+ <Button colorVariant="primary">Submit</Button>
86
+ </ButtonRow>
87
+ ```
88
+
89
+ ## Form Layout Example
90
+
91
+ ```tsx
92
+ import { GdsProvider, Stack, InputField, Button } from '@jamesodwyer/gds-figma-vite';
93
+
94
+ <GdsProvider>
95
+ <form>
96
+ <Stack gap="auditorium">
97
+ <InputField id="name">
98
+ <InputField.Label>Name</InputField.Label>
99
+ <InputField.Row marginTop="club">
100
+ <InputField.Input />
101
+ </InputField.Row>
102
+ </InputField>
103
+
104
+ <InputField id="email">
105
+ <InputField.Label>Email</InputField.Label>
106
+ <InputField.Row marginTop="club">
107
+ <InputField.Input type="email" />
108
+ </InputField.Row>
109
+ </InputField>
110
+
111
+ <Button colorVariant="primary" fullWidth>
112
+ Submit
113
+ </Button>
114
+ </Stack>
115
+ </form>
116
+ </GdsProvider>
117
+ ```
118
+
119
+ ## Alternative: Styled Div
120
+
121
+ If you prefer more explicit control, use a styled div:
122
+
123
+ ```tsx
124
+ import styled from 'styled-components';
125
+ import { spacing } from '@jamesodwyer/gds-figma-vite';
126
+
127
+ const VerticalStack = styled.div`
128
+ display: flex;
129
+ flex-direction: column;
130
+ gap: ${spacing.auditorium};
131
+ `;
132
+
133
+ const HorizontalStack = styled.div`
134
+ display: flex;
135
+ flex-direction: row;
136
+ gap: ${spacing.club};
137
+ `;
138
+ ```
139
+
140
+ ## Common Patterns
141
+
142
+ ### Modal Actions (Replacing ButtonGroup)
143
+
144
+ ```tsx
145
+ <Modal.Actions>
146
+ <Stack gap="club" style={{ display: 'flex', flexDirection: 'row', justifyContent: 'flex-end' }}>
147
+ <Button colorVariant="secondary" onClick={handleCancel}>
148
+ Cancel
149
+ </Button>
150
+ <Button colorVariant="primary" onClick={handleConfirm}>
151
+ Confirm
152
+ </Button>
153
+ </Stack>
154
+ </Modal.Actions>
155
+ ```
156
+
157
+ ### Card Content Layout
158
+
159
+ ```tsx
160
+ <Card>
161
+ <Card.Body>
162
+ <Stack gap="auditorium">
163
+ <TextStyle>First section of content</TextStyle>
164
+ <TextStyle>Second section of content</TextStyle>
165
+ <Button colorVariant="primary">Action</Button>
166
+ </Stack>
167
+ </Card.Body>
168
+ </Card>
169
+ ```
170
+
171
+ ## Related Components
172
+
173
+ - `Modal.Actions` - Container for modal action buttons
174
+ - `InputField.Row` - Row container with margin support for form inputs
@@ -0,0 +1,385 @@
1
+ # Ticketmaster Global Design System (GDS) - AI Guidelines
2
+
3
+ > **FOR AI AGENTS**: This is a self-contained guide for code generation. All information is in this single file.
4
+
5
+ ## Package Information
6
+
7
+ - **Package**: `@jamesodwyer/gds-figma-vite`
8
+ - **Framework**: React 18+ with styled-components
9
+ - **Themes**: TM (Ticketmaster/blue), LN (Live Nation/red)
10
+
11
+ ---
12
+
13
+ ## REQUIRED: GdsProvider Wrapper
14
+
15
+ Every application MUST wrap components with `GdsProvider`:
16
+
17
+ ```tsx
18
+ import { GdsProvider, Button } from '@jamesodwyer/gds-figma-vite';
19
+
20
+ function App() {
21
+ return (
22
+ <GdsProvider theme="TM">
23
+ <Button colorVariant="primary">Click Me</Button>
24
+ </GdsProvider>
25
+ );
26
+ }
27
+ ```
28
+
29
+ | Prop | Type | Default | Description |
30
+ |------|------|---------|-------------|
31
+ | theme | 'TM' \| 'LN' | 'TM' | Brand theme |
32
+ | includeGlobalStyles | boolean | true | Include global CSS |
33
+
34
+ ---
35
+
36
+ ## CRITICAL: Compound Component Pattern
37
+
38
+ Many GDS components use **dot notation** for sub-components. These are NOT separate imports.
39
+
40
+ ### Correct Usage
41
+
42
+ ```tsx
43
+ // CORRECT - Use dot notation
44
+ <Modal>
45
+ <Modal.Header>
46
+ <Modal.Title>Title</Modal.Title>
47
+ <Modal.CloseButton label="Close" />
48
+ </Modal.Header>
49
+ <Modal.Content>
50
+ <Modal.Description>Content here</Modal.Description>
51
+ </Modal.Content>
52
+ <Modal.Actions>
53
+ <Button colorVariant="secondary">Cancel</Button>
54
+ <Button colorVariant="primary">Confirm</Button>
55
+ </Modal.Actions>
56
+ </Modal>
57
+
58
+ <Card>
59
+ <Card.Title>Card Title</Card.Title>
60
+ <Card.Body>Card content</Card.Body>
61
+ </Card>
62
+
63
+ <InputField id="email">
64
+ <InputField.Label>Email</InputField.Label>
65
+ <InputField.Row marginTop="club">
66
+ <InputField.Input type="email" />
67
+ </InputField.Row>
68
+ </InputField>
69
+ ```
70
+
71
+ ### Components with Sub-components
72
+
73
+ | Component | Sub-components (use dot notation) |
74
+ |-----------|-----------------------------------|
75
+ | `Modal` | `.Header`, `.Title`, `.Content`, `.Description`, `.Image`, `.CloseButton`, `.Actions` |
76
+ | `Card` | `.Title`, `.Body` |
77
+ | `InputField` | `.Label`, `.Row`, `.Input`, `.Textarea`, `.Select`, `.Checkbox`, `.Radio`, `.StartIcon`, `.EndIcon`, `.Validation` |
78
+ | `Accordion` | `.Item`, `.Toggle`, `.Content` |
79
+
80
+ ---
81
+
82
+ ## CRITICAL: Components That DO NOT Exist
83
+
84
+ > **WARNING**: These components are NOT in GDS. Do NOT use them.
85
+
86
+ | DO NOT USE | Use Instead |
87
+ |------------|-------------|
88
+ | `ButtonGroup` | `<div style={{display:'flex',gap:'8px'}}>` or styled div |
89
+ | `CardContent` | Put content directly in `Card.Body` |
90
+ | `CardHeader` | Use `Card.Title` |
91
+ | `CardActions` | Put buttons in `Card.Body` |
92
+ | `ModalDescription` | Use `Modal.Description` (dot notation) |
93
+ | `ModalHeader` | Use `Modal.Header` (dot notation) |
94
+ | `ModalBody` | Use `Modal.Content` (dot notation) |
95
+ | `ModalFooter` | Use `Modal.Actions` (dot notation) |
96
+ | `FormControl` | Use `InputField` |
97
+ | `FormLabel` | Use `InputField.Label` |
98
+ | `Grid` | Use CSS Grid or styled div |
99
+ | `Box` | Use styled div |
100
+ | `Container` | Use styled div |
101
+ | `Typography` | Use `TextStyle` |
102
+ | `Divider` | Use styled hr or div |
103
+ | `Snackbar` | Use `Toast` |
104
+ | `Dialog` | Use `Modal` |
105
+ | `Drawer` | Use `SidePanel` |
106
+
107
+ ### Button Row Example (Instead of ButtonGroup)
108
+
109
+ ```tsx
110
+ // For horizontal button layouts:
111
+ <div style={{ display: 'flex', gap: '8px' }}>
112
+ <Button colorVariant="secondary">Cancel</Button>
113
+ <Button colorVariant="primary">Confirm</Button>
114
+ </div>
115
+ ```
116
+
117
+ ---
118
+
119
+ ## Available Components
120
+
121
+ ### Layout
122
+ - `Card` - Container with `.Title`, `.Body`
123
+ - `Modal` - Dialog with `.Header`, `.Title`, `.Content`, `.Description`, `.CloseButton`, `.Actions`
124
+ - `SidePanel` - Slide-in panel
125
+ - `Accordion` - Collapsible sections
126
+ - `Header` - Page header
127
+ - `Footer` - Page footer
128
+
129
+ ### Buttons
130
+ - `Button` - Primary button (colorVariant: 'primary' | 'secondary' | 'tertiary')
131
+ - `CircleButton` - Circular icon button
132
+ - `SquareButton` - Square icon button
133
+ - `PillButton` - Pill-shaped button
134
+
135
+ ### Form Inputs
136
+ - `InputField` - Compound form input (see sub-components above)
137
+ - `TextInput` - Simple text input
138
+ - `TextArea` - Multi-line input
139
+ - `Checkbox` - Boolean selection
140
+ - `RadioButton` - Single selection
141
+ - `SelectInput` - Dropdown
142
+ - `ToggleSwitch` - On/off switch
143
+ - `PasswordInput` - Password with toggle
144
+ - `PhoneNumber` - Phone with country code
145
+ - `DateOfBirth` - Date input
146
+ - `CountryPicker` - Country dropdown
147
+ - `Stepper` - Increment/decrement
148
+
149
+ ### Feedback
150
+ - `Toast` - Temporary notification
151
+ - `AlertBox` - Inline alert (status: 'info' | 'success' | 'warning' | 'danger')
152
+ - `LoadingSpinner` - Loading indicator
153
+ - `Skeleton` - Loading placeholder
154
+ - `ErrorMessage` - Error text
155
+ - `SuccessMessage` - Success text
156
+ - `Badge` - Status label
157
+ - `Tooltip` - Hover tooltip
158
+
159
+ ### Typography
160
+ - `TextStyle` - Styled text spans
161
+ - `TitleHeading` - Page titles
162
+ - `DisplayHeading` - Hero text
163
+ - `Link` - Styled links
164
+
165
+ ---
166
+
167
+ ## Spacing Tokens
168
+
169
+ Use spacing tokens instead of pixel values:
170
+
171
+ ```tsx
172
+ import { spacing } from '@jamesodwyer/gds-figma-vite';
173
+ ```
174
+
175
+ | Token | Value | Usage |
176
+ |-------|-------|-------|
177
+ | `spacing.lounge` | 4px | Tight spacing, icon gaps |
178
+ | `spacing.club` | 8px | Small gaps |
179
+ | `spacing.hall` | 12px | Small padding |
180
+ | `spacing.auditorium` | 16px | Default padding |
181
+ | `spacing.theatre` | 20px | Medium spacing |
182
+ | `spacing.amphitheatre` | 24px | Large padding |
183
+ | `spacing.arena` | 32px | Section spacing |
184
+ | `spacing.stadium` | 48px | Large sections |
185
+ | `spacing.dome` | 64px | Page sections |
186
+ | `spacing.field` | 88px | Hero spacing |
187
+
188
+ ```tsx
189
+ import styled from 'styled-components';
190
+ import { spacing } from '@jamesodwyer/gds-figma-vite';
191
+
192
+ const Container = styled.div`
193
+ padding: ${spacing.auditorium};
194
+ gap: ${spacing.club};
195
+ margin-bottom: ${spacing.arena};
196
+ `;
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Typography (textStyle)
202
+
203
+ Use `textStyle` for consistent typography:
204
+
205
+ ```tsx
206
+ import { textStyle } from '@jamesodwyer/gds-figma-vite';
207
+ ```
208
+
209
+ | Style | Size | Weight | Usage |
210
+ |-------|------|--------|-------|
211
+ | `textStyle.mauna` | 44-54px | 700 | Hero displays |
212
+ | `textStyle.everest` | 32-44px | 700 | Page titles |
213
+ | `textStyle.kilimanjaro` | 24-32px | 700 | Section headers |
214
+ | `textStyle.matterhorn` | 24-28px | 700 | Large headings |
215
+ | `textStyle.vinson` | 22-24px | 700 | Subheadings |
216
+ | `textStyle.blanc` | 18-20px | 700 | Small headers |
217
+ | `textStyle.fiji` | 18px | 600 | Emphasized body |
218
+ | `textStyle.rainier` | 16px | 400 | Body text (default) |
219
+ | `textStyle.etna` | 14px | 400 | Small text |
220
+ | `textStyle.snowdon` | 12px | 600 | Labels/captions |
221
+
222
+ ```tsx
223
+ import styled from 'styled-components';
224
+ import { textStyle } from '@jamesodwyer/gds-figma-vite';
225
+
226
+ const Title = styled.h1`
227
+ ${textStyle.everest}
228
+ `;
229
+
230
+ const Body = styled.p`
231
+ ${textStyle.rainier}
232
+ `;
233
+ ```
234
+
235
+ ---
236
+
237
+ ## Elevation (Shadows)
238
+
239
+ ```tsx
240
+ import { elevation } from '@jamesodwyer/gds-figma-vite';
241
+ ```
242
+
243
+ | Level | Usage |
244
+ |-------|-------|
245
+ | `elevation.level0` | Default (no shadow) |
246
+ | `elevation.level1` | Cards, content blocks |
247
+ | `elevation.level2` | Sticky headers |
248
+ | `elevation.level3` | Multiple sticky elements |
249
+ | `elevation.level4` | Modals, dialogs |
250
+
251
+ ```tsx
252
+ const Card = styled.div`
253
+ ${elevation.level1}
254
+ background: white;
255
+ `;
256
+ ```
257
+
258
+ ---
259
+
260
+ ## Theme Colors
261
+
262
+ Access colors through theme props:
263
+
264
+ ```tsx
265
+ const Component = styled.div`
266
+ background: ${props => props.theme.base.bg};
267
+ color: ${props => props.theme.text.primary};
268
+ border-color: ${props => props.theme.base.border};
269
+
270
+ &.error { color: ${props => props.theme.status.danger}; }
271
+ &.success { color: ${props => props.theme.status.success}; }
272
+ `;
273
+ ```
274
+
275
+ ### Theme Color Categories
276
+ - `theme.base.primary` - Brand primary color
277
+ - `theme.base.bg` - Background
278
+ - `theme.base.border` - Border color
279
+ - `theme.text.primary` - Primary text
280
+ - `theme.text.secondary` - Secondary text
281
+ - `theme.status.success` - Success green
282
+ - `theme.status.danger` - Error red
283
+ - `theme.status.warning` - Warning yellow
284
+
285
+ ---
286
+
287
+ ## Icons
288
+
289
+ Import icons directly:
290
+
291
+ ```tsx
292
+ import { HeartIcon, CheckmarkIcon, CloseIcon } from '@jamesodwyer/gds-figma-vite';
293
+
294
+ // Usage
295
+ <HeartIcon size="24" />
296
+ <Button startIcon={<CheckmarkIcon />}>Confirm</Button>
297
+ ```
298
+
299
+ Icon props: `size` (string like "24" or "1.5rem"), `fillColor` (optional)
300
+
301
+ ---
302
+
303
+ ## Button Props
304
+
305
+ ```tsx
306
+ <Button
307
+ colorVariant="primary" // 'primary' | 'secondary' | 'tertiary'
308
+ fullWidth={false} // boolean
309
+ disabled={false} // boolean
310
+ startIcon={<Icon />} // ReactNode
311
+ endIcon={<Icon />} // ReactNode
312
+ onClick={() => {}} // function
313
+ >
314
+ Button Text
315
+ </Button>
316
+ ```
317
+
318
+ ---
319
+
320
+ ## Modal Props
321
+
322
+ ```tsx
323
+ <Modal
324
+ isOpen={true} // boolean
325
+ onClose={() => setOpen(false)} // function (required)
326
+ ariaLabel="Modal title" // string (required)
327
+ mobileMaxViewportWidth="768px" // string (required)
328
+ role="dialog" // 'dialog' | 'alertdialog'
329
+ size="standard" // 'standard' | 'large'
330
+ variant="default" // 'default' | 'danger'
331
+ >
332
+ <Modal.Header>
333
+ <Modal.Title>Title</Modal.Title>
334
+ <Modal.CloseButton label="Close modal" />
335
+ </Modal.Header>
336
+ <Modal.Content>
337
+ <Modal.Description>Content</Modal.Description>
338
+ </Modal.Content>
339
+ <Modal.Actions>
340
+ <Button colorVariant="secondary">Cancel</Button>
341
+ <Button colorVariant="primary">Confirm</Button>
342
+ </Modal.Actions>
343
+ </Modal>
344
+ ```
345
+
346
+ ---
347
+
348
+ ## InputField Props
349
+
350
+ ```tsx
351
+ <InputField id="fieldId"> {/* id is required */}
352
+ <InputField.Label>Label Text</InputField.Label>
353
+ <InputField.Row marginTop="club">
354
+ <InputField.Input
355
+ type="text" // 'text' | 'email' | 'password' | etc.
356
+ placeholder="..."
357
+ isErrored={false} // boolean - shows error styling
358
+ />
359
+ </InputField.Row>
360
+ <InputField.Validation
361
+ type="error" // 'error' | 'success'
362
+ screenReaderErrorPrefix="Error:"
363
+ >
364
+ Error message here
365
+ </InputField.Validation>
366
+ </InputField>
367
+ ```
368
+
369
+ ---
370
+
371
+ ## Code Generation Rules
372
+
373
+ ### DO:
374
+ - Wrap with `GdsProvider`
375
+ - Use compound component syntax (`Modal.Header`, `Card.Body`)
376
+ - Use spacing tokens (`spacing.auditorium`)
377
+ - Use textStyle for typography
378
+ - Use theme colors (`props.theme.base.primary`)
379
+
380
+ ### DO NOT:
381
+ - Import sub-components separately (use dot notation)
382
+ - Use components that don't exist (ButtonGroup, CardContent, etc.)
383
+ - Hardcode hex colors
384
+ - Hardcode pixel values for spacing
385
+ - Skip the GdsProvider wrapper
@@ -2,6 +2,42 @@
2
2
 
3
3
  All components are imported from `@jamesodwyer/gds-figma-vite`.
4
4
 
5
+ ---
6
+
7
+ ## CRITICAL: Compound Component Pattern
8
+
9
+ Several GDS components use the **compound component pattern**. Sub-components are accessed via **dot notation**, NOT as separate imports.
10
+
11
+ ### Components with Sub-components
12
+
13
+ | Component | Sub-components (use dot notation) |
14
+ |-----------|-----------------------------------|
15
+ | `Modal` | `.Header`, `.Title`, `.Content`, `.Description`, `.Image`, `.CloseButton`, `.Actions` |
16
+ | `Card` | `.Title`, `.Body` |
17
+ | `InputField` | `.Label`, `.Row`, `.Input`, `.Textarea`, `.Select`, `.Checkbox`, `.Radio`, `.StartIcon`, `.EndIcon`, `.Validation` |
18
+ | `Accordion` | `.Item`, `.Toggle`, `.Content` |
19
+
20
+ ### Example Usage
21
+
22
+ ```tsx
23
+ // ✅ CORRECT - Use dot notation
24
+ <Modal>
25
+ <Modal.Header>
26
+ <Modal.Title>Title</Modal.Title>
27
+ </Modal.Header>
28
+ <Modal.Content>
29
+ <Modal.Description>Content</Modal.Description>
30
+ </Modal.Content>
31
+ </Modal>
32
+
33
+ // ❌ WRONG - These don't exist as separate components
34
+ <ModalHeader> // Does not exist
35
+ <ModalContent> // Does not exist
36
+ <CardContent> // Does not exist
37
+ ```
38
+
39
+ ---
40
+
5
41
  ## Layout Components
6
42
 
7
43
  | Component | Description | Usage |
@@ -83,10 +119,39 @@ All components are imported from `@jamesodwyer/gds-figma-vite`.
83
119
 
84
120
  | Component | Description | Usage |
85
121
  |-----------|-------------|-------|
122
+ | Stack | Vertical/horizontal layout with spacing | Element spacing, button rows |
86
123
  | Countdown | Timer countdown | Time-limited offers |
87
124
  | CountdownTimer | Alternative timer | Countdown displays |
88
125
  | ShareCard | Social sharing card | Share dialogs |
89
126
  | BrandLogo | Brand logo display | Branding |
127
+ | VisuallyHidden | Screen reader only content | Accessibility |
128
+ | IconButton | Icon-only button utility | Icon actions |
129
+
130
+ ---
131
+
132
+ ## Components That DO NOT Exist
133
+
134
+ > **WARNING**: The following components are NOT part of GDS. Do not use them.
135
+
136
+ | Non-Existent Component | Use Instead |
137
+ |------------------------|-------------|
138
+ | `ButtonGroup` | `Stack` with flex styling |
139
+ | `CardContent` | Put content in `Card.Body` |
140
+ | `CardHeader` | Use `Card.Title` |
141
+ | `CardActions` | Put buttons in `Card.Body` |
142
+ | `ModalDescription` | Use `Modal.Description` |
143
+ | `ModalHeader` | Use `Modal.Header` |
144
+ | `ModalBody` | Use `Modal.Content` |
145
+ | `ModalFooter` | Use `Modal.Actions` |
146
+ | `FormControl` | Use `InputField` |
147
+ | `Grid` | Use CSS Grid or styled div |
148
+ | `Box` | Use styled div with spacing tokens |
149
+ | `Container` | Use styled div with spacing tokens |
150
+ | `Typography` | Use `TextStyle` |
151
+ | `Divider` | Use styled hr or div |
152
+ | `Snackbar` | Use `Toast` |
153
+ | `Dialog` | Use `Modal` |
154
+ | `Drawer` | Use `SidePanel` |
90
155
 
91
156
  ## Import Examples
92
157
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jamesodwyer/gds-figma-vite",
3
- "version": "2.0.2",
3
+ "version": "2.0.4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },