climaybe 1.7.3 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/bin/version.txt +1 -1
- package/package.json +1 -1
- package/src/commands/add-cursor-skill.js +12 -7
- package/src/commands/init.js +10 -5
- package/src/cursor/rules/00-rule-index.mdc +24 -0
- package/src/cursor/rules/accessibility-rules.mdc +527 -0
- package/src/cursor/rules/commit-rules.mdc +286 -0
- package/src/cursor/rules/cursor-rule-template.mdc +66 -0
- package/src/cursor/rules/examples/section-example.liquid +52 -0
- package/src/cursor/rules/examples/snippet-example.liquid +83 -0
- package/src/cursor/rules/figma-design-system.mdc +182 -0
- package/src/cursor/rules/global-rules-reference.mdc +62 -0
- package/src/cursor/rules/javascript-standards.mdc +1125 -0
- package/src/cursor/rules/js-refactor-tasks.mdc +123 -0
- package/src/cursor/rules/linear-task-creation.mdc +105 -0
- package/src/cursor/rules/liquid-doc-rules.mdc +595 -0
- package/src/cursor/rules/liquid.mdc +228 -0
- package/src/cursor/rules/project-overview.mdc +81 -0
- package/src/cursor/rules/schemas.mdc +150 -0
- package/src/cursor/rules/sections.mdc +25 -0
- package/src/cursor/rules/snippets.mdc +134 -0
- package/src/cursor/rules/tailwindcss-rules.mdc +410 -0
- package/src/cursor/skills/accessibility-pass/SKILL.md +54 -0
- package/src/cursor/skills/changelog-release/SKILL.md +50 -0
- package/src/cursor/skills/commit/SKILL.md +27 -0
- package/src/cursor/skills/commit-in-groups/SKILL.md +55 -0
- package/src/cursor/skills/linear-create-task/SKILL.md +81 -0
- package/src/cursor/skills/liquid-doc-comments/SKILL.md +37 -0
- package/src/cursor/skills/locale-translation-prep/SKILL.md +49 -0
- package/src/cursor/skills/schema-section-change/SKILL.md +39 -0
- package/src/cursor/skills/section-from-spec/SKILL.md +39 -0
- package/src/cursor/skills/theme-check-fix/SKILL.md +47 -0
- package/src/index.js +3 -2
- package/src/lib/commit-tooling.js +0 -44
- package/src/lib/config.js +1 -1
- package/src/lib/cursor-bundle.js +47 -0
- package/src/lib/prompts.js +3 -2
- package/src/workflows/build/reusable-build.yml +1 -1
- package/src/workflows/shared/version-bump.yml +5 -2
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Tailwind CSS and theme token standards for Liquid and theme styles. Static classes only, semantic tokens from _styles/02_base/02.02_colors.css, content sources in _styles/main.css.
|
|
3
|
+
globs:
|
|
4
|
+
- "**/*.liquid"
|
|
5
|
+
- "_styles/**/*.css"
|
|
6
|
+
- "assets/*.css"
|
|
7
|
+
alwaysApply: false
|
|
8
|
+
---
|
|
9
|
+
# Tailwind CSS Development Rules
|
|
10
|
+
|
|
11
|
+
Apply when editing Liquid templates or theme CSS that use Tailwind classes or theme tokens. Use semantic tokens (surface, subtle, emphasis, accent, text-primary, border-secondary) from this project's `@theme`; see `_styles/02_base/02.02_colors.css`.
|
|
12
|
+
|
|
13
|
+
## Core Principles
|
|
14
|
+
|
|
15
|
+
### 1. Static Class Generation
|
|
16
|
+
**CRITICAL**: Never combine Tailwind classes with Liquid variables or dynamic values.
|
|
17
|
+
|
|
18
|
+
**Why this matters:**
|
|
19
|
+
- Tailwind CSS scans unparsed files during build time to generate CSS
|
|
20
|
+
- Liquid parsing happens on Shopify servers, not during local builds
|
|
21
|
+
- Tailwind cannot see the final rendered HTML with dynamic values
|
|
22
|
+
- This means dynamic classes like `duration-{{ animation_duration }}` will NOT work
|
|
23
|
+
|
|
24
|
+
**❌ Bad Examples:**
|
|
25
|
+
```liquid
|
|
26
|
+
<!-- These will NOT work - Tailwind can't see the dynamic values -->
|
|
27
|
+
<div class="duration-{{ animation_duration }}">
|
|
28
|
+
<div class="w-{{ width }}">
|
|
29
|
+
<div class="text-{{ color }}">
|
|
30
|
+
<div class="bg-{{ background_color }}">
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**✅ Good Examples:**
|
|
34
|
+
```liquid
|
|
35
|
+
<!-- Use static Tailwind classes -->
|
|
36
|
+
<div class="duration-300">
|
|
37
|
+
<div class="w-full">
|
|
38
|
+
<div class="text-blue-600">
|
|
39
|
+
<div class="bg-gray-100">
|
|
40
|
+
|
|
41
|
+
<!-- Or use conditional classes -->
|
|
42
|
+
<div class="{% if show_animation %}duration-300{% else %}duration-0{% endif %}">
|
|
43
|
+
<div class="{% if size == 'sm' %}w-1/2{% else %}w-full{% endif %}">
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. Conditional Class Application
|
|
47
|
+
Use conditional statements to apply different static classes:
|
|
48
|
+
|
|
49
|
+
```liquid
|
|
50
|
+
<!-- ✅ Good: Conditional static classes -->
|
|
51
|
+
<div class="{% if expanded %}bg-blue-100{% else %}bg-gray-50{% endif %}">
|
|
52
|
+
<div class="{% if size == 'sm' %}text-sm{% else %}text-base{% endif %}">
|
|
53
|
+
<div class="{% if show_animation %}transition-all duration-300{% else %}transition-none{% endif %}">
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 3. Custom CSS for Dynamic Values
|
|
57
|
+
For truly dynamic values, use custom CSS classes:
|
|
58
|
+
|
|
59
|
+
```liquid
|
|
60
|
+
<!-- ✅ Good: Custom CSS for dynamic values -->
|
|
61
|
+
<style>
|
|
62
|
+
.duration-custom { transition-duration: var(--custom-duration); }
|
|
63
|
+
.width-custom { width: var(--custom-width); }
|
|
64
|
+
</style>
|
|
65
|
+
|
|
66
|
+
<div class="duration-custom" style="--custom-duration: {{ animation_duration }}ms">
|
|
67
|
+
<div class="width-custom" style="--custom-width: {{ width }}%">
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Class Organization
|
|
71
|
+
|
|
72
|
+
### 1. Logical Grouping
|
|
73
|
+
Group related classes together in a logical order:
|
|
74
|
+
|
|
75
|
+
```liquid
|
|
76
|
+
<!-- ✅ Good: Logical grouping -->
|
|
77
|
+
<div class="
|
|
78
|
+
flex items-center justify-between
|
|
79
|
+
p-4 m-2
|
|
80
|
+
bg-white border border-gray-200 rounded-lg
|
|
81
|
+
hover:bg-gray-50 focus:ring-2 focus:ring-blue-500
|
|
82
|
+
transition-colors duration-200
|
|
83
|
+
">
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2. Responsive Design
|
|
87
|
+
Use responsive prefixes consistently:
|
|
88
|
+
|
|
89
|
+
```liquid
|
|
90
|
+
<!-- ✅ Good: Responsive design -->
|
|
91
|
+
<div class="
|
|
92
|
+
w-full md:w-1/2 lg:w-1/3
|
|
93
|
+
text-sm md:text-base lg:text-lg
|
|
94
|
+
p-2 md:p-4 lg:p-6
|
|
95
|
+
">
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 3. State Classes
|
|
99
|
+
Group state-based classes together:
|
|
100
|
+
|
|
101
|
+
```liquid
|
|
102
|
+
<!-- ✅ Good: State classes grouped -->
|
|
103
|
+
<button class="
|
|
104
|
+
px-4 py-2 rounded
|
|
105
|
+
bg-blue-600 text-white
|
|
106
|
+
hover:bg-blue-700 focus:bg-blue-700
|
|
107
|
+
focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2
|
|
108
|
+
disabled:opacity-50 disabled:cursor-not-allowed
|
|
109
|
+
transition-colors duration-200
|
|
110
|
+
">
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Performance Best Practices
|
|
114
|
+
|
|
115
|
+
### 1. Content Source Configuration
|
|
116
|
+
Tailwind v4 content sources are in `_styles/main.css`. All template and asset paths are scanned for class names:
|
|
117
|
+
|
|
118
|
+
```css
|
|
119
|
+
/* _styles/main.css */
|
|
120
|
+
@import "tailwindcss" source(none);
|
|
121
|
+
@plugin "@tailwindcss/typography";
|
|
122
|
+
@source "../assets/*.js";
|
|
123
|
+
@source "../assets/!(style).css";
|
|
124
|
+
@source "../layout/*.liquid";
|
|
125
|
+
@source "../blocks/*.liquid";
|
|
126
|
+
@source "../sections/*.liquid";
|
|
127
|
+
@source "../snippets/*.liquid";
|
|
128
|
+
@source "../templates/*.liquid";
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Token imports: `01_theme/01_primitives.css`, `02_base/02.01_sizes.css`, `02_base/02.02_colors.css`, `02_base/02.03_typography.css`. Any file that uses Tailwind classes must be covered by these `@source` paths so classes are not purged.
|
|
132
|
+
|
|
133
|
+
### 2. Avoid Arbitrary Values
|
|
134
|
+
Prefer predefined Tailwind classes over arbitrary values:
|
|
135
|
+
|
|
136
|
+
```liquid
|
|
137
|
+
<!-- ❌ Bad: Arbitrary values -->
|
|
138
|
+
<div class="w-[123px] h-[456px]">
|
|
139
|
+
|
|
140
|
+
<!-- ✅ Good: Predefined classes -->
|
|
141
|
+
<div class="w-32 h-40">
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### 3. Use CSS Custom Properties
|
|
145
|
+
For dynamic values, use CSS custom properties defined in `_styles/main.css` and imported token files (`01_primitives.css`, `02.02_colors.css`, etc.).
|
|
146
|
+
|
|
147
|
+
## Color System (Theme Tokens)
|
|
148
|
+
|
|
149
|
+
### 1. Primitives and semantic tokens
|
|
150
|
+
- **Primitives**: `_styles/01_theme/01_primitives.css` — raw colors (e.g. `--color-dune-50`, `--color-abbey-950`).
|
|
151
|
+
- **Semantic tokens**: `_styles/02_base/02.02_colors.css` — background, text, border tokens used by Tailwind utilities.
|
|
152
|
+
|
|
153
|
+
### 2. Semantic token names (this project)
|
|
154
|
+
Background: `--background-color-surface`, `--background-color-subtle`, `--background-color-emphasis`, `--background-color-accent`.
|
|
155
|
+
Text: `--text-color-primary`, `--text-color-secondary`, `--text-color-on-accent`, `--text-color-on-accent-sec`.
|
|
156
|
+
Border: `--border-color-primary`, `--border-color-secondary`, `--border-color-on-accent`, `--border-color-on-accent-sec`.
|
|
157
|
+
|
|
158
|
+
Tailwind generates classes from these (e.g. `bg-surface`, `bg-subtle`, `text-primary`, `text-on-accent`, `border-primary`, `border-secondary`). Gradients: `--background-image-gradient-surface`, `-subtle`, `-emphasis`, `-contrast`.
|
|
159
|
+
|
|
160
|
+
### 3. Using theme colors in Liquid
|
|
161
|
+
Prefer semantic utility classes; use arbitrary values only when no token exists:
|
|
162
|
+
|
|
163
|
+
```liquid
|
|
164
|
+
<!-- Prefer: semantic classes from @theme -->
|
|
165
|
+
<div class="bg-surface text-primary border border-secondary">
|
|
166
|
+
<div class="bg-subtle text-secondary">
|
|
167
|
+
<div class="bg-accent text-on-accent">
|
|
168
|
+
<div class="border-primary">
|
|
169
|
+
|
|
170
|
+
<!-- Optional: arbitrary value from a token -->
|
|
171
|
+
<div class="bg-[hsl(var(--background-color-emphasis))]">
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 4. Color schemas (@utility)
|
|
175
|
+
Sections can switch palette via `@utility` classes: `color-schema-primary`, `color-schema-secondary`, `color-schema-muted`, `color-schema-accent-1`, `color-schema-accent-2`, `color-schema-accent-3`, `color-schema-contrast`. Apply to a wrapper (e.g. section root) so children inherit semantic tokens. See `_styles/02_base/02.02_colors.css`.
|
|
176
|
+
|
|
177
|
+
## Design-Focused Accessibility
|
|
178
|
+
|
|
179
|
+
### 1. Contextual Focus States
|
|
180
|
+
Use design-appropriate focus indicators instead of generic rings:
|
|
181
|
+
|
|
182
|
+
```liquid
|
|
183
|
+
<!-- ✅ Good: Input with border focus -->
|
|
184
|
+
<input class="
|
|
185
|
+
border border-secondary
|
|
186
|
+
focus:border-primary focus:outline-none
|
|
187
|
+
transition-colors duration-200
|
|
188
|
+
">
|
|
189
|
+
|
|
190
|
+
<!-- ✅ Good: Summary with background focus -->
|
|
191
|
+
<summary class="
|
|
192
|
+
bg-white hover:bg-emphasis
|
|
193
|
+
focus:bg-emphasis focus:outline-none
|
|
194
|
+
transition-colors duration-200
|
|
195
|
+
">
|
|
196
|
+
|
|
197
|
+
<!-- ✅ Good: Button with ring focus (appropriate for buttons) -->
|
|
198
|
+
<button class="
|
|
199
|
+
bg-subtle text-on-accent
|
|
200
|
+
hover:bg-subtle/90
|
|
201
|
+
focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2
|
|
202
|
+
transition-colors duration-200
|
|
203
|
+
">
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### 2. Focus State Guidelines
|
|
207
|
+
Choose focus indicators based on component context:
|
|
208
|
+
|
|
209
|
+
- **Inputs/Form Fields**: Use `focus:border-primary` when parent has `border-secondary`
|
|
210
|
+
- **Summary Elements**: Use `focus:bg-emphasis` for subtle background change
|
|
211
|
+
- **Buttons**: Use `focus:ring-2 focus:ring-primary` for clear button focus
|
|
212
|
+
- **Links**: Use `focus:underline` or `focus:text-primary` for text-based focus
|
|
213
|
+
- **Cards/Containers**: Use `focus:border-primary` or `focus:shadow-lg`
|
|
214
|
+
|
|
215
|
+
### 3. Reduced Motion
|
|
216
|
+
Respect user preferences using the theme's custom properties:
|
|
217
|
+
|
|
218
|
+
```css
|
|
219
|
+
/* _styles/main.css */
|
|
220
|
+
@media (prefers-reduced-motion: reduce) {
|
|
221
|
+
.transition-all {
|
|
222
|
+
transition: none !important;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 4. High Contrast
|
|
228
|
+
Support high contrast mode:
|
|
229
|
+
|
|
230
|
+
```css
|
|
231
|
+
/* _styles/main.css */
|
|
232
|
+
@media (prefers-contrast: high) {
|
|
233
|
+
.border-gray-200 {
|
|
234
|
+
border-color: #000000 !important;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Component Patterns
|
|
240
|
+
|
|
241
|
+
### 1. Atomic Components
|
|
242
|
+
Use consistent patterns for atomic components:
|
|
243
|
+
|
|
244
|
+
```liquid
|
|
245
|
+
<!-- Button component pattern -->
|
|
246
|
+
<button class="
|
|
247
|
+
inline-flex items-center justify-center
|
|
248
|
+
px-4 py-2 rounded-md
|
|
249
|
+
text-sm font-medium
|
|
250
|
+
bg-subtle text-on-accent
|
|
251
|
+
hover:bg-subtle/90 focus:bg-subtle/90
|
|
252
|
+
focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2
|
|
253
|
+
disabled:opacity-50 disabled:cursor-not-allowed
|
|
254
|
+
transition-colors duration-200
|
|
255
|
+
{{ class }}
|
|
256
|
+
">
|
|
257
|
+
{{ content }}
|
|
258
|
+
</button>
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### 2. Layout Components
|
|
262
|
+
Use consistent spacing and layout patterns:
|
|
263
|
+
|
|
264
|
+
```liquid
|
|
265
|
+
<!-- Container pattern -->
|
|
266
|
+
<div class="
|
|
267
|
+
max-w-7xl mx-auto px-4 sm:px-6 lg:px-8
|
|
268
|
+
{{ class }}
|
|
269
|
+
">
|
|
270
|
+
{{ content }}
|
|
271
|
+
</div>
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### 3. Form Components
|
|
275
|
+
Use consistent form styling:
|
|
276
|
+
|
|
277
|
+
```liquid
|
|
278
|
+
<!-- Input pattern -->
|
|
279
|
+
<input class="
|
|
280
|
+
block w-full rounded-md
|
|
281
|
+
border border-secondary
|
|
282
|
+
focus:border-primary focus:outline-none
|
|
283
|
+
disabled:bg-emphasis disabled:cursor-not-allowed
|
|
284
|
+
transition-colors duration-200
|
|
285
|
+
{{ class }}
|
|
286
|
+
">
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Common Patterns
|
|
290
|
+
|
|
291
|
+
### 1. Card Components
|
|
292
|
+
```liquid
|
|
293
|
+
<div class="
|
|
294
|
+
bg-subtle border border-secondary rounded-lg shadow-sm
|
|
295
|
+
hover:shadow-md transition-shadow duration-200
|
|
296
|
+
{{ class }}
|
|
297
|
+
">
|
|
298
|
+
{{ content }}
|
|
299
|
+
</div>
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 2. Navigation Items
|
|
303
|
+
```liquid
|
|
304
|
+
<a class="
|
|
305
|
+
block px-3 py-2 rounded-md text-sm font-medium
|
|
306
|
+
text-secondary hover:text-primary hover:bg-emphasis
|
|
307
|
+
focus:outline-none focus:bg-emphasis
|
|
308
|
+
transition-colors duration-200
|
|
309
|
+
{{ class }}
|
|
310
|
+
">
|
|
311
|
+
{{ content }}
|
|
312
|
+
</a>
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 3. Status Indicators
|
|
316
|
+
```liquid
|
|
317
|
+
<span class="
|
|
318
|
+
inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium
|
|
319
|
+
{{ status == 'success' ? 'bg-green-100 text-green-800' : '' }}
|
|
320
|
+
{{ status == 'error' ? 'bg-red-100 text-red-800' : '' }}
|
|
321
|
+
{{ status == 'warning' ? 'bg-yellow-100 text-yellow-800' : '' }}
|
|
322
|
+
{{ status == 'info' ? 'bg-blue-100 text-blue-800' : '' }}
|
|
323
|
+
">
|
|
324
|
+
{{ content }}
|
|
325
|
+
</span>
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Debugging Tips
|
|
329
|
+
|
|
330
|
+
### 1. Class Verification
|
|
331
|
+
Use browser dev tools to verify classes are applied correctly:
|
|
332
|
+
|
|
333
|
+
```javascript
|
|
334
|
+
// Check if classes are present
|
|
335
|
+
console.log(element.className);
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### 2. Purge Verification
|
|
339
|
+
Ensure classes aren't being purged by checking the content sources in `_styles/main.css`:
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
# Check what classes are being purged
|
|
343
|
+
npx tailwindcss --content ./**/*.liquid --output ./temp.css
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### 3. Dynamic Class Debugging
|
|
347
|
+
For conditional classes, add debugging:
|
|
348
|
+
|
|
349
|
+
```liquid
|
|
350
|
+
<!-- Debug conditional classes -->
|
|
351
|
+
<div class="
|
|
352
|
+
{% if debug %}border-2 border-red-500{% endif %}
|
|
353
|
+
{{ conditional_classes }}
|
|
354
|
+
">
|
|
355
|
+
<!-- Add debug output -->
|
|
356
|
+
{% if debug %}
|
|
357
|
+
<div class="text-xs text-gray-500">
|
|
358
|
+
Applied classes: {{ conditional_classes }}
|
|
359
|
+
</div>
|
|
360
|
+
{% endif %}
|
|
361
|
+
</div>
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## Theme Integration
|
|
365
|
+
|
|
366
|
+
### 1. Tokens and custom properties
|
|
367
|
+
Use semantic classes (e.g. `bg-surface`, `text-primary`) so styles stay within the token system. For one-off values, use theme variables from `_styles/01_theme/01_primitives.css` and `_styles/02_base/02.02_colors.css`. Typography and sizes: `_styles/02_base/02.01_sizes.css`, `02.03_typography.css`.
|
|
368
|
+
|
|
369
|
+
### 2. Responsive breakpoints
|
|
370
|
+
Use Tailwind breakpoints (e.g. `md:`, `lg:`) consistently; theme may define `--breakpoint-*` in `@theme`.
|
|
371
|
+
|
|
372
|
+
### 3. Custom utilities
|
|
373
|
+
Add custom utilities in `_styles/` (e.g. in a layer file imported by `main.css`):
|
|
374
|
+
|
|
375
|
+
```css
|
|
376
|
+
/* _styles/main.css */
|
|
377
|
+
@layer utilities {
|
|
378
|
+
.text-balance {
|
|
379
|
+
text-wrap: balance;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
.hide-scroll-bar {
|
|
383
|
+
-ms-overflow-style: none;
|
|
384
|
+
scrollbar-width: none;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.hide-scroll-bar::-webkit-scrollbar {
|
|
388
|
+
display: none;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## Compliance Checklist
|
|
394
|
+
|
|
395
|
+
Before committing any Tailwind CSS changes, ensure:
|
|
396
|
+
|
|
397
|
+
- [ ] No dynamic Tailwind classes with Liquid variables
|
|
398
|
+
- [ ] All conditional classes use static Tailwind values
|
|
399
|
+
- [ ] Contextual focus states used (not generic rings everywhere)
|
|
400
|
+
- [ ] Responsive design implemented correctly
|
|
401
|
+
- [ ] Performance optimizations applied
|
|
402
|
+
- [ ] Design-appropriate accessibility considerations addressed
|
|
403
|
+
- [ ] Classes are logically grouped and organized
|
|
404
|
+
- [ ] Custom CSS used for truly dynamic values
|
|
405
|
+
- [ ] Content sources in `_styles/main.css` include all template files
|
|
406
|
+
- [ ] No arbitrary values unless absolutely necessary
|
|
407
|
+
- [ ] Theme custom properties used when appropriate
|
|
408
|
+
- [ ] Custom utilities added to `_styles/main.css` when needed
|
|
409
|
+
- [ ] Semantic tokens used (surface, subtle, emphasis, accent, text-primary, border-secondary) from `_styles/02_base/02.02_colors.css`
|
|
410
|
+
- [ ] Focus states match component context and design
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: accessibility-pass
|
|
3
|
+
description: Runs an accessibility audit on a section, snippet, or component. Use when the user says "accessibility pass", "a11y audit", "check accessibility", "WCAG check", or "audit this section/snippet". Follows project accessibility rules.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Accessibility Pass
|
|
7
|
+
|
|
8
|
+
Runs a structured a11y audit on specified file(s) and reports findings with fix suggestions.
|
|
9
|
+
|
|
10
|
+
## Rules to Apply
|
|
11
|
+
|
|
12
|
+
Before auditing, read and apply:
|
|
13
|
+
|
|
14
|
+
1. `.cursor/rules/00-rule-index.mdc` — rule index
|
|
15
|
+
2. `.cursor/rules/accessibility-rules.mdc` — WCAG 2.1 AA, semantic HTML, ARIA, keyboard, focus, screen readers
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
1. **Identify scope** — User specifies file(s) or "current file". If unspecified, ask or assume the file they have open.
|
|
20
|
+
2. **Load rules** — Read `accessibility-rules.mdc` and use it as the checklist basis.
|
|
21
|
+
3. **Audit** — Go through the file(s) and check:
|
|
22
|
+
- Semantic structure (headings, landmarks, lists)
|
|
23
|
+
- ARIA (only when needed; state sync with JS if applicable)
|
|
24
|
+
- Keyboard (focusable elements, tab order, visible focus, Escape/Enter/Space)
|
|
25
|
+
- Images (alt text; decorative with empty alt or aria-hidden)
|
|
26
|
+
- Forms (labels, errors, required)
|
|
27
|
+
- Links/buttons (descriptive text, no "click here")
|
|
28
|
+
- Dynamic content (live regions if content updates)
|
|
29
|
+
4. **Report** — For each finding:
|
|
30
|
+
- Location (element or line)
|
|
31
|
+
- Issue (what’s wrong)
|
|
32
|
+
- WCAG criterion if relevant
|
|
33
|
+
- Suggested fix (concrete code or change)
|
|
34
|
+
5. **Severity** — Label as Critical (blocks access), Suggestion (improvement), or Nice-to-have.
|
|
35
|
+
|
|
36
|
+
## Output Format
|
|
37
|
+
|
|
38
|
+
```markdown
|
|
39
|
+
## Accessibility audit: [file path]
|
|
40
|
+
|
|
41
|
+
### Critical
|
|
42
|
+
- **[Element/location]** — [issue]. [Fix].
|
|
43
|
+
|
|
44
|
+
### Suggestions
|
|
45
|
+
- ...
|
|
46
|
+
|
|
47
|
+
### Nice-to-have
|
|
48
|
+
- ...
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Example Trigger
|
|
52
|
+
|
|
53
|
+
User: "Run an accessibility pass on this section" (with `sections/product--main.liquid` open).
|
|
54
|
+
→ Audit that file against accessibility-rules.mdc and output the structured report.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: changelog-release
|
|
3
|
+
description: Generates changelog or release notes from git history using project commit conventions. Use when the user says "changelog", "release notes", "what changed since last tag", or "list commits for release". Follows commit-rules types (feat, fix, refactor, etc.).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Changelog / Release Notes
|
|
7
|
+
|
|
8
|
+
Builds a changelog or release notes from commits since a ref (e.g. last tag), grouped by project commit types.
|
|
9
|
+
|
|
10
|
+
## Rules to Apply
|
|
11
|
+
|
|
12
|
+
When grouping and labeling commits, read and apply:
|
|
13
|
+
|
|
14
|
+
1. `.cursor/rules/00-rule-index.mdc` — rule index
|
|
15
|
+
2. `.cursor/rules/commit-rules.mdc` — commit types (🔨 fix, 🚀 feat, ♻️ refactor, 🎨 style, etc.) and format
|
|
16
|
+
|
|
17
|
+
Use the same type labels and emoji for changelog sections so the output matches how the team writes commits.
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
|
|
21
|
+
1. **Determine range** — Since last tag (e.g. `git describe --tags --abbrev=0` then `git log TAG..HEAD`), or since a branch/commit the user specifies. If unclear, default to "since last tag".
|
|
22
|
+
2. **Get commits** — Run `git log --oneline [range]` (or with `--pretty=format:...` for message + body). Parse commit messages.
|
|
23
|
+
3. **Group by type** — Map each commit to a type from commit-rules.mdc (fix, feat, refactor, style, remove, wip, docs, ai, chore, upgrade). Ignore merge commits. Put "unknown" or "other" for non-matching messages.
|
|
24
|
+
4. **Format** — Output markdown:
|
|
25
|
+
- Optional title (e.g. "Changelog since v1.2.0")
|
|
26
|
+
- Sections by type (e.g. "## 🚀 Features", "## 🔨 Fixes")
|
|
27
|
+
- Under each section: list of commit descriptions (one line each, link to commit if desired). Strip emoji+type prefix for readability if you want, or keep for consistency.
|
|
28
|
+
5. **Optional** — Add "Breaking changes" subsection if any commit message indicates breaking change (e.g. `!` or "BREAKING CHANGE").
|
|
29
|
+
|
|
30
|
+
## Output Format
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
# Changelog (since [ref])
|
|
34
|
+
|
|
35
|
+
## 🚀 Features
|
|
36
|
+
- add product quick view modal
|
|
37
|
+
- implement infinite scroll for collections
|
|
38
|
+
|
|
39
|
+
## 🔨 Fixes
|
|
40
|
+
- resolve cart total calculation error
|
|
41
|
+
- modal close button not working
|
|
42
|
+
|
|
43
|
+
## ♻️ Refactor
|
|
44
|
+
- optimize product card rendering
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Example Trigger
|
|
48
|
+
|
|
49
|
+
User: "Generate changelog since last tag."
|
|
50
|
+
→ Resolve last tag, get `git log` since then, group by commit-rules types, output structured changelog.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: commit
|
|
3
|
+
description: Groups working-tree changes into logical commits and commits them using conventional commit rules (type, optional scope, subject; commitlint). Use when the user asks to commit, group commits, stage and commit, or write conventional commits.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Commit (group + conventional)
|
|
7
|
+
|
|
8
|
+
Group changes by purpose, then commit each group. A conventional message is optional; when the user provides or wants one, use the format below so commitlint and semantic-release stay happy.
|
|
9
|
+
|
|
10
|
+
## Workflow
|
|
11
|
+
|
|
12
|
+
1. **Inspect** — Get full picture of changes (git status, git diff).
|
|
13
|
+
2. **Group** — Partition by type: feat, fix, docs, style, refactor, perf, test, build, ci, chore.
|
|
14
|
+
3. **Commit each group** — If the user wants a message: type(scope): subject, imperative, lowercase, no period, ≤100 chars. If they don't, commit without message or with a minimal one (e.g. chore: wip).
|
|
15
|
+
4. **Validate** — commit-msg hook may reject invalid messages when a message is used.
|
|
16
|
+
|
|
17
|
+
## Message rules (commitlint, when a message is used)
|
|
18
|
+
|
|
19
|
+
- **Types:** feat, fix, docs, style, refactor, perf, test, build, ci, chore.
|
|
20
|
+
- **Header:** type(scope): subject — subject optional; max 100 chars when present. Body lines max 200.
|
|
21
|
+
- **Imperative, present tense:** "add feature" not "added feature".
|
|
22
|
+
|
|
23
|
+
## Examples
|
|
24
|
+
|
|
25
|
+
feat(init): add store alias prompt
|
|
26
|
+
fix(sync): prevent overwrite of unchanged files
|
|
27
|
+
docs: add conventional commit section to CONTRIBUTING
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: commit-in-groups
|
|
3
|
+
description: Groups current working tree changes into logical commits and suggests commit messages per project convention. Use when the user says "/commit-in-groups", "commit in groups", "group my commits", "suggest separate commits", or "split my changes into commits". Follows commit-rules.mdc (emoji + type + description).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Commit in Groups
|
|
7
|
+
|
|
8
|
+
Analyzes uncommitted changes, groups them into logical commits, and suggests one message per group using the project's commit format.
|
|
9
|
+
|
|
10
|
+
**Preference:** Prefer multiple commits unless changes are closely related. When in doubt, split into separate commits (e.g. tooling vs theme code, different features or areas). Only group into one commit when the changes clearly belong together (e.g. one feature and its snippet, or a single refactor touching several files for the same purpose).
|
|
11
|
+
|
|
12
|
+
## Rules to Apply
|
|
13
|
+
|
|
14
|
+
Before suggesting any commit messages, read and apply:
|
|
15
|
+
|
|
16
|
+
1. `.cursor/rules/00-rule-index.mdc` — rule index
|
|
17
|
+
2. `.cursor/rules/commit-rules.mdc` — commit format (emoji + type + description), types (fix, feat, refactor, style, etc.), imperative mood, optional scope
|
|
18
|
+
|
|
19
|
+
Use the exact format and types from commit-rules; no period at end; lowercase description.
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
1. **Get change summary** — Run `git status` and `git diff` (and `git diff --staged` if anything is staged). Identify all modified, added, and deleted files.
|
|
24
|
+
2. **Group logically** — Prefer more, smaller commits when changes are unrelated. Cluster only when clearly the same intent:
|
|
25
|
+
- Unrelated areas (e.g. tooling/skills vs theme snippet, cart fix vs collection style) → separate commits
|
|
26
|
+
- One feature (e.g. new section + its snippet) → one commit
|
|
27
|
+
- Refactor in one area, fix in another → separate commits
|
|
28
|
+
- Locale/schema/docs can be separate if they form a clear unit
|
|
29
|
+
- When in doubt, split rather than combine
|
|
30
|
+
3. **Assign type** — For each group, pick the best type from commit-rules (🔨 fix, 🚀 feat, ♻️ refactor, 🎨 style, 🗑️ remove, 📝 docs, 🔧 chore, etc.) and optional scope (e.g. `sections`, `cart`, `locales`).
|
|
31
|
+
4. **Write messages** — One line per commit: `<emoji> <type>(scope): <description>`. Imperative, lowercase, no period. Multi-line body only if the change is complex and warrants bullets.
|
|
32
|
+
5. **Output and execute** — List the suggested commits (message + files per commit), then **run the commits yourself**: for each group, run `git add` on the listed files and `git commit -m "..."` with the exact message. Do not only suggest commands; execute them so the working tree is left with the changes committed. Summarize what was committed at the end.
|
|
33
|
+
|
|
34
|
+
## Output Format
|
|
35
|
+
|
|
36
|
+
Show the plan briefly, then run it:
|
|
37
|
+
|
|
38
|
+
```markdown
|
|
39
|
+
## Suggested commits
|
|
40
|
+
|
|
41
|
+
**Commit 1:** `🚀 feat(sections): add featured collection section`
|
|
42
|
+
- `sections/s--featured-collection.liquid`
|
|
43
|
+
- `snippets/m--product-card.liquid`
|
|
44
|
+
|
|
45
|
+
**Commit 2:** `🎨 style(cart): adjust drawer spacing`
|
|
46
|
+
- `sections/cart--drawer.liquid`
|
|
47
|
+
- `assets/style.css`
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Then execute: `git add` + `git commit` for each group in order. After running, confirm: "Done. Created N commits: …"
|
|
51
|
+
|
|
52
|
+
## Example Trigger
|
|
53
|
+
|
|
54
|
+
User: "/commit-in-groups" or "group my changes into separate commits."
|
|
55
|
+
→ Run git status/diff, group changes, list commits with messages and file lists, then **run** `git add` and `git commit` for each group (do not only suggest commands).
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear-create-task
|
|
3
|
+
description: Creates Linear issues in the Voldt Redesign project with PRD-style descriptions. Use when the user says "create Linear task", "add Linear issue", "create task in Linear", "/linear-task", or describes a feature/fix and asks to put it in Linear. Assigns to Berk (coding) or Taha (design). Supports attaching images/videos to the issue and using them to enrich the PRD. Uses user-Linear MCP.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Linear Create Task
|
|
7
|
+
|
|
8
|
+
Creates a Linear issue in the **Voldt Redesign** project with a PRD-style description, sensible defaults for milestone and labels, and assignee by task type. Uploads user-provided images/videos as attachments and uses them to enhance the description.
|
|
9
|
+
|
|
10
|
+
## Rules to Apply
|
|
11
|
+
|
|
12
|
+
Before creating a task, read `.cursor/rules/00-rule-index.mdc`. No other rule file is required; mention commit-rules only if the user wants a branch name convention.
|
|
13
|
+
|
|
14
|
+
## Linear Context
|
|
15
|
+
|
|
16
|
+
- **Project:** `Voldt Redesign — [12.07]` or `voldt redesign`
|
|
17
|
+
- **Team:** `Electric Maybe` (required for `save_issue`)
|
|
18
|
+
|
|
19
|
+
**Milestones (use exact name):**
|
|
20
|
+
|
|
21
|
+
| Name | Description |
|
|
22
|
+
|------|-------------|
|
|
23
|
+
| Core Commerce Design | Product, cart, header, footer templates |
|
|
24
|
+
| Merch Design | Home, collection, search templates |
|
|
25
|
+
| Content Design | The rest of the templates |
|
|
26
|
+
| Core Commerce Dev | Product, cart, header, footer |
|
|
27
|
+
| Merch Dev | Home, collection, search |
|
|
28
|
+
| Content Dev | The rest |
|
|
29
|
+
|
|
30
|
+
**Labels (team Electric Maybe) — use as needed:**
|
|
31
|
+
|
|
32
|
+
- **Type:** `🚀 feat`, `🔨 fix`, `🔁 change`, `🔥 remove`, `🤖 chore`, `✅ QA`, `📣 marketing`, `💫 revision`, `🧱 section`, `📄 template`
|
|
33
|
+
- **Origin:** `project-requirement`, `client-request`, `qa-found`, `bug-discovered`, `internal-decision`
|
|
34
|
+
- **Team:** `dev`, `design`
|
|
35
|
+
- **Risk:** `!`, `!!`, `!!!`
|
|
36
|
+
- **Scope:** `collection template`, `product template`, `cart template`, or section/snippet names (e.g. `s--featured-collection`, `m--filters`)
|
|
37
|
+
|
|
38
|
+
If in doubt, call MCP `user-Linear` **list_milestones** with `project: "Voldt Redesign — [12.07]"` or **list_issue_labels** with `team: "Electric Maybe"` to refresh.
|
|
39
|
+
|
|
40
|
+
## PRD Description Structure
|
|
41
|
+
|
|
42
|
+
- **Title:** Short, clear (e.g. problem + solution in a few words).
|
|
43
|
+
- **Description (Markdown):**
|
|
44
|
+
- Problem/context (1–2 sentences or bullets).
|
|
45
|
+
- `### Requirements` or `### Structure` — e.g. metaobject fields, API, data model.
|
|
46
|
+
- `### Proposed solution` — numbered steps (1. … 2. …).
|
|
47
|
+
- `### Related files` — bullet list of paths (`snippets/…`, `sections/…`).
|
|
48
|
+
- If user attached media: add `### Screenshots / reference` and describe what they show (do not invent; only what can be inferred).
|
|
49
|
+
|
|
50
|
+
Optional on the issue: **estimate** (points), **dueDate** (ISO), **parentId** (sub-task), **links** `[{url, title}]`, **state** (from **list_issue_statuses** for team).
|
|
51
|
+
|
|
52
|
+
## Workflow
|
|
53
|
+
|
|
54
|
+
1. **Gather input** — Title (required; from user or derived). Description/PRD: freeform; if minimal, expand into PRD structure above. Type: coding vs design (for assignee and labels). Milestone: from user or default `Merch Dev`. Labels: from user or defaults. Optional: estimate, due date, parent issue, state, links.
|
|
55
|
+
2. **Enhance PRD from media** — If the user attached images or videos, describe what they show and add a `### Screenshots / reference` section to the description. Do not invent details.
|
|
56
|
+
3. **Resolve project and team** — Use project `Voldt Redesign — [12.07]` and team `Electric Maybe`.
|
|
57
|
+
4. **Create issue** — Call MCP **user-Linear** tool **save_issue** with: `title`, `description` (Markdown), `team`, `project`, `milestone`, `labels`, `assignee` (Berk or Taha per rule below); optional `estimate`, `dueDate`, `state`, `parentId`, `links`. Capture the returned issue identifier (e.g. EM-xxxx).
|
|
58
|
+
5. **Attach media** — For each user-provided image/video: if you have file content or path, encode to base64 and call **user-Linear** **create_attachment** with the new issue identifier, `base64Content`, `filename`, `contentType` (e.g. `image/png`, `video/mp4`), and optional `title`.
|
|
59
|
+
6. **Confirm** — Reply with issue identifier (e.g. EM-xxxx), Linear URL, and what was set (title, assignee, milestone, labels, attachments). If assignee by name fails, use **list_users** to resolve by name and retry with the returned user id/email.
|
|
60
|
+
|
|
61
|
+
## Assignee Rule
|
|
62
|
+
|
|
63
|
+
- **Coding task** (implementation, fix, refactor, backend, Liquid/JS/CSS, “dev”): assignee **Berk** (e.g. `assignee: "Berk"` or email if needed).
|
|
64
|
+
- **Design task** (Figma, UI/UX, visual, layout, “design”): assignee **Taha** (e.g. `assignee: "Taha"` or email if needed).
|
|
65
|
+
- If unclear, ask or default to Berk. Resolve via **list_users** if name resolution fails.
|
|
66
|
+
|
|
67
|
+
## Defaults (when user does not specify)
|
|
68
|
+
|
|
69
|
+
- **Milestone:** `Merch Dev`
|
|
70
|
+
- **Labels:** at least `project-requirement` + `dev` (coding) or `design` (design) + one type label: `🚀 feat`, `🔨 fix`, or `🤖 chore` as appropriate
|
|
71
|
+
- **State:** leave unset (Linear default) unless the user specifies one; optionally call **list_issue_statuses** with `team: "Electric Maybe"` and pick Backlog/Todo if you want to set state explicitly.
|
|
72
|
+
|
|
73
|
+
## MCP Tools (user-Linear)
|
|
74
|
+
|
|
75
|
+
- **save_issue** — Create the issue (required: `title`, `team`; use `project`, `milestone`, `labels`, `assignee`, `description`; optional: `estimate`, `dueDate`, `state`, `parentId`, `links`).
|
|
76
|
+
- **create_attachment** — After issue is created: `issue` (identifier from save_issue response), `base64Content`, `filename`, `contentType`, optional `title`, `subtitle`.
|
|
77
|
+
- **list_milestones** — Optional: `project: "Voldt Redesign — [12.07]"` to refresh milestone list.
|
|
78
|
+
- **list_issue_labels** — Optional: `team: "Electric Maybe"` to refresh labels.
|
|
79
|
+
- **list_issue_statuses** — Optional: `team: "Electric Maybe"` to set state.
|
|
80
|
+
- **list_users** — If assignee by name fails, resolve Berk/Taha and retry with id or email.
|
|
81
|
+
- **get_issue** — Optional: confirm issue after creation.
|