@equal-experts/kuat-react 0.12.0 → 0.13.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 +3 -1
- package/agent-docs/AGENTS.md +10 -0
- package/agent-docs/README.md +17 -0
- package/agent-docs/bundle-manifest.json +63 -0
- package/agent-docs/components/_template.md +21 -0
- package/agent-docs/components/button-group.md +27 -0
- package/agent-docs/components/button.md +50 -0
- package/agent-docs/components/components.manifest.json +20 -0
- package/agent-docs/components/kuat-header.md +27 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/LOADING.md +166 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/accessibility.md +444 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/brand.md +99 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/content/README.md +28 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/content/formatting.md +93 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/content/numbers.md +69 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/content/punctuation.md +75 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/content/voice-and-tone.md +263 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/content/writing-style.md +91 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/design/README.md +28 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/design/borders.md +159 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/design/colours.md +173 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/design/design-language.md +116 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/design/spacing.md +130 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/design/typography.md +155 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/foundations/logo.md +151 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/marketing/content/README.md +26 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/marketing/content/blog-posts.md +33 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/marketing/content/marketing-content.md +65 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/marketing/content/seo.md +44 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/marketing/emails.md +74 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/marketing/scenarios/README.md +18 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/marketing/scenarios/marketing-pages.md +368 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/marketing/website.md +169 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/DEPRECATIONS.md +28 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/README.md +65 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/accessibility.md +402 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/component-decision-tree.md +263 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/component-registry.md +68 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/content/README.md +29 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/content/actions.md +51 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/content/confirmations.md +57 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/content/empty-states.md +43 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/content/errors.md +54 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/content/forms.md +74 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/content/product-content.md +138 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/design.md +207 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/emails.md +71 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/review-checklist.md +57 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/review-context.md +44 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/scenarios/README.md +82 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/scenarios/authentication.md +303 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/scenarios/dashboards.md +313 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/scenarios/documentation.md +333 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/scenarios/forms.md +361 -0
- package/agent-docs/external/kuat-agent-rules/kuat-docs/rules/types/web/product/technical.md +488 -0
- package/agent-docs/kuat-docs/rules/README.md +148 -0
- package/agent-docs/kuat-docs/rules/design/layouts.md +394 -0
- package/agent-docs/kuat-docs/rules/scenarios/README.md +83 -0
- package/agent-docs/kuat-docs/rules/scenarios/authentication.md +301 -0
- package/agent-docs/kuat-docs/rules/scenarios/dashboards.md +314 -0
- package/agent-docs/kuat-docs/rules/scenarios/documentation.md +333 -0
- package/agent-docs/kuat-docs/rules/scenarios/forms.md +359 -0
- package/agent-docs/kuat-docs/rules/scenarios/marketing-pages.md +367 -0
- package/agent-docs/manifest.json +9 -0
- package/agent-docs/rules/LOADING-consumer.md +27 -0
- package/dist/components/ui/icon-button/icon-button.d.ts +27 -0
- package/dist/components/ui/icon-button/index.d.ts +2 -0
- package/dist/components/ui/kuat-header/index.d.ts +4 -2
- package/dist/components/ui/kuat-header/kuat-header.d.ts +4 -41
- package/dist/components/ui/kuat-header/kuat-header.logic.d.ts +32 -0
- package/dist/components/ui/kuat-header/kuat-header.types.d.ts +91 -0
- package/dist/icon-button-B5hCoK1b.js +63 -0
- package/dist/icon-button.d.ts +3 -0
- package/dist/icon-button.js +12 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +852 -523
- package/dist/style.css +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
# Marketing Page Scenarios
|
|
2
|
+
|
|
3
|
+
Patterns for landing pages, feature pages, pricing, testimonials, and promotional content.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Principles
|
|
8
|
+
|
|
9
|
+
### User Goals
|
|
10
|
+
|
|
11
|
+
- **Understand the value** - What's in it for me?
|
|
12
|
+
- **Build trust** - Is this credible?
|
|
13
|
+
- **Make decisions** - Which option is right for me?
|
|
14
|
+
- **Take action** - Easy path to next step
|
|
15
|
+
|
|
16
|
+
### UX Principles
|
|
17
|
+
|
|
18
|
+
| Principle | Implementation |
|
|
19
|
+
|-----------|----------------|
|
|
20
|
+
| Clear value proposition | Hero communicates benefit immediately |
|
|
21
|
+
| Social proof | Testimonials, logos, metrics build trust |
|
|
22
|
+
| Scannable content | Users skim before they read |
|
|
23
|
+
| Clear CTAs | Obvious next steps at every section |
|
|
24
|
+
|
|
25
|
+
### Success Metrics
|
|
26
|
+
|
|
27
|
+
- Time on page
|
|
28
|
+
- Scroll depth
|
|
29
|
+
- CTA click-through rate
|
|
30
|
+
- Conversion rate
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Layout
|
|
35
|
+
|
|
36
|
+
**Base Layout:** [Horizontal Navigation](../design/layouts.md#1-horizontal-navigation-layout)
|
|
37
|
+
|
|
38
|
+
Marketing pages use full-width sections with contained content.
|
|
39
|
+
|
|
40
|
+
### Landing Page Structure
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
┌─────────────────────────────────────┐
|
|
44
|
+
│ Header │
|
|
45
|
+
├─────────────────────────────────────┤
|
|
46
|
+
│ Hero Section (full width) │
|
|
47
|
+
├─────────────────────────────────────┤
|
|
48
|
+
│ Social Proof / Logos │
|
|
49
|
+
├─────────────────────────────────────┤
|
|
50
|
+
│ Features Section │
|
|
51
|
+
├─────────────────────────────────────┤
|
|
52
|
+
│ Benefits / How It Works │
|
|
53
|
+
├─────────────────────────────────────┤
|
|
54
|
+
│ Testimonials │
|
|
55
|
+
├─────────────────────────────────────┤
|
|
56
|
+
│ CTA Section │
|
|
57
|
+
├─────────────────────────────────────┤
|
|
58
|
+
│ Footer │
|
|
59
|
+
└─────────────────────────────────────┘
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Pricing Page Structure
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
┌─────────────────────────────────────┐
|
|
66
|
+
│ Header │
|
|
67
|
+
├─────────────────────────────────────┤
|
|
68
|
+
│ Heading: "Pricing" or "Choose Plan" │
|
|
69
|
+
│ [Monthly] [Annual] toggle │
|
|
70
|
+
├─────────────────────────────────────┤
|
|
71
|
+
│ ┌─────┐ ┌─────┐ ┌─────┐ │
|
|
72
|
+
│ │Free │ │ Pro │ │Enter│ │
|
|
73
|
+
│ │ │ │ ★ │ │prise│ │
|
|
74
|
+
│ └─────┘ └─────┘ └─────┘ │
|
|
75
|
+
├─────────────────────────────────────┤
|
|
76
|
+
│ Feature Comparison Table │
|
|
77
|
+
├─────────────────────────────────────┤
|
|
78
|
+
│ FAQ Section │
|
|
79
|
+
├─────────────────────────────────────┤
|
|
80
|
+
│ Footer │
|
|
81
|
+
└─────────────────────────────────────┘
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Specifications
|
|
85
|
+
|
|
86
|
+
| Element | Value |
|
|
87
|
+
|---------|-------|
|
|
88
|
+
| Header height | 64-80px |
|
|
89
|
+
| Content container | max-width 1200-1400px, centered |
|
|
90
|
+
| Section padding | 64-96px vertical |
|
|
91
|
+
| Footer padding | 48-64px vertical |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Design
|
|
96
|
+
|
|
97
|
+
### Color Tokens
|
|
98
|
+
|
|
99
|
+
| Element | Token |
|
|
100
|
+
|---------|-------|
|
|
101
|
+
| Page background | `bg-background` |
|
|
102
|
+
| Header | `bg-background` (light) |
|
|
103
|
+
| Alternating sections | `bg-muted` or `bg-background` |
|
|
104
|
+
| CTA sections | `bg-primary` or dark |
|
|
105
|
+
| Footer | `bg-muted` |
|
|
106
|
+
|
|
107
|
+
### Typography
|
|
108
|
+
|
|
109
|
+
| Element | Style |
|
|
110
|
+
|---------|-------|
|
|
111
|
+
| Hero heading | `text-4xl md:text-5xl lg:text-6xl font-bold` |
|
|
112
|
+
| Hero subheading | `text-xl text-muted-foreground` |
|
|
113
|
+
| Section heading | `text-3xl font-bold` |
|
|
114
|
+
| Section subheading | `text-lg text-muted-foreground` |
|
|
115
|
+
| Body text | `text-base` or `text-lg` |
|
|
116
|
+
| Feature title | `text-lg font-semibold` |
|
|
117
|
+
|
|
118
|
+
### Spacing Between Sections
|
|
119
|
+
|
|
120
|
+
| Section Type | Vertical Padding |
|
|
121
|
+
|--------------|-----------------|
|
|
122
|
+
| Hero | 64-96px |
|
|
123
|
+
| Standard content | 64px |
|
|
124
|
+
| CTA sections | 64-80px |
|
|
125
|
+
| Compact (logos) | 32-48px |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Content
|
|
130
|
+
|
|
131
|
+
### Hero Section
|
|
132
|
+
|
|
133
|
+
**Required Elements:**
|
|
134
|
+
|
|
135
|
+
1. Headline - Clear value proposition
|
|
136
|
+
2. Subheadline - Supporting detail
|
|
137
|
+
3. Primary CTA button
|
|
138
|
+
4. Secondary CTA (optional)
|
|
139
|
+
5. Hero image/illustration (optional)
|
|
140
|
+
|
|
141
|
+
**Hero Variants:**
|
|
142
|
+
|
|
143
|
+
| Variant | Structure |
|
|
144
|
+
|---------|-----------|
|
|
145
|
+
| Centered | Text centered, buttons centered below |
|
|
146
|
+
| Split | Text left (50%), image right (50%) |
|
|
147
|
+
| With background | Dark/image background, light text |
|
|
148
|
+
|
|
149
|
+
**Specifications:**
|
|
150
|
+
|
|
151
|
+
| Element | Value |
|
|
152
|
+
|---------|-------|
|
|
153
|
+
| Heading | Max 10-12 words |
|
|
154
|
+
| Subheading | 1-2 sentences |
|
|
155
|
+
| CTA spacing | 16px between buttons |
|
|
156
|
+
|
|
157
|
+
### Feature Sections
|
|
158
|
+
|
|
159
|
+
**Feature Grid:**
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
┌─────────┐ ┌─────────┐ ┌─────────┐
|
|
163
|
+
│ Icon │ │ Icon │ │ Icon │
|
|
164
|
+
│ Heading │ │ Heading │ │ Heading │
|
|
165
|
+
│ Text │ │ Text │ │ Text │
|
|
166
|
+
└─────────┘ └─────────┘ └─────────┘
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
| Element | Specification |
|
|
170
|
+
|---------|---------------|
|
|
171
|
+
| Grid | 3 columns desktop, 2 tablet, 1 mobile |
|
|
172
|
+
| Gap | 32px |
|
|
173
|
+
| Icon size | 48px, brand color |
|
|
174
|
+
| Alignment | Center or left |
|
|
175
|
+
|
|
176
|
+
**Feature Alternating:**
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
┌─────────────────────────────────────┐
|
|
180
|
+
│ [Image] Text content │
|
|
181
|
+
├─────────────────────────────────────┤
|
|
182
|
+
│ Text content [Image] │
|
|
183
|
+
├─────────────────────────────────────┤
|
|
184
|
+
│ [Image] Text content │
|
|
185
|
+
└─────────────────────────────────────┘
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
- Alternate image position left/right
|
|
189
|
+
- 50/50 or 60/40 split
|
|
190
|
+
- Stack on mobile (image above text)
|
|
191
|
+
|
|
192
|
+
### Pricing Cards
|
|
193
|
+
|
|
194
|
+
| Element | Specification |
|
|
195
|
+
|---------|---------------|
|
|
196
|
+
| Card padding | 32px (`p-8`) |
|
|
197
|
+
| Highlighted tier | `border-primary`, "Popular" badge |
|
|
198
|
+
| Price display | `text-4xl font-bold` |
|
|
199
|
+
| Period | `text-sm text-muted-foreground` |
|
|
200
|
+
| Feature list | 8-10 items max, checkmarks |
|
|
201
|
+
| CTA button | Full width at bottom |
|
|
202
|
+
|
|
203
|
+
### Testimonials
|
|
204
|
+
|
|
205
|
+
**Card Pattern:**
|
|
206
|
+
|
|
207
|
+
| Element | Specification |
|
|
208
|
+
|---------|---------------|
|
|
209
|
+
| Quote | `text-lg`, optional quotation marks |
|
|
210
|
+
| Avatar | 48-64px, rounded full |
|
|
211
|
+
| Name | `font-semibold` |
|
|
212
|
+
| Title/Company | `text-muted-foreground` |
|
|
213
|
+
| Logo | 80-120px wide |
|
|
214
|
+
|
|
215
|
+
**Layout Options:**
|
|
216
|
+
|
|
217
|
+
| Layout | Use Case |
|
|
218
|
+
|--------|----------|
|
|
219
|
+
| Grid (3 col) | Multiple equal testimonials |
|
|
220
|
+
| Carousel | Many testimonials, limited space |
|
|
221
|
+
| Featured | Single prominent quote |
|
|
222
|
+
|
|
223
|
+
### CTA Sections
|
|
224
|
+
|
|
225
|
+
**Mid-page CTA:**
|
|
226
|
+
|
|
227
|
+
| Element | Specification |
|
|
228
|
+
|---------|---------------|
|
|
229
|
+
| Background | `bg-muted` |
|
|
230
|
+
| Padding | 64px vertical |
|
|
231
|
+
| Content | Centered heading + button |
|
|
232
|
+
|
|
233
|
+
**Final CTA (above footer):**
|
|
234
|
+
|
|
235
|
+
| Element | Specification |
|
|
236
|
+
|---------|---------------|
|
|
237
|
+
| Background | `bg-primary` or dark |
|
|
238
|
+
| Text | White/light |
|
|
239
|
+
| Padding | 80-96px vertical |
|
|
240
|
+
| Content | Strong headline + single button |
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Accessibility
|
|
245
|
+
|
|
246
|
+
**Base requirements:** See [accessibility/design.md](../accessibility/design.md), [accessibility/content.md](../accessibility/content.md), and [accessibility/technical.md](../accessibility/technical.md)
|
|
247
|
+
|
|
248
|
+
**Scenario-specific:**
|
|
249
|
+
|
|
250
|
+
| Requirement | Implementation |
|
|
251
|
+
|-------------|----------------|
|
|
252
|
+
| Image alt text | Describe meaningful images, decorative get empty alt |
|
|
253
|
+
| Heading structure | H1 (hero) → H2 (sections) → H3 (sub-sections) |
|
|
254
|
+
| Link purpose | CTAs describe destination/action |
|
|
255
|
+
| Contrast on dark sections | Ensure text meets 4.5:1 on dark backgrounds |
|
|
256
|
+
| Video captions | All promotional videos have captions |
|
|
257
|
+
|
|
258
|
+
### Pricing Table Accessibility
|
|
259
|
+
|
|
260
|
+
- Use semantic `<table>` for comparison tables
|
|
261
|
+
- Clear header row with `<th>` elements
|
|
262
|
+
- Don't rely on color alone for highlighting
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Implementation
|
|
267
|
+
|
|
268
|
+
### Header Pattern
|
|
269
|
+
|
|
270
|
+
| Element | Specification |
|
|
271
|
+
|---------|---------------|
|
|
272
|
+
| Background | `bg-background` (light) |
|
|
273
|
+
| Logo | Full-color, left-aligned, 120-150px |
|
|
274
|
+
| Navigation | Right-aligned, horizontal |
|
|
275
|
+
| CTA button | Primary action in header |
|
|
276
|
+
| Height | 64-80px |
|
|
277
|
+
|
|
278
|
+
### Footer Pattern
|
|
279
|
+
|
|
280
|
+
| Element | Specification |
|
|
281
|
+
|---------|---------------|
|
|
282
|
+
| Background | `bg-muted` |
|
|
283
|
+
| Logo | Full-color, 100-120px |
|
|
284
|
+
| Link columns | Company, Resources, Legal |
|
|
285
|
+
| Social links | Icons, 24px |
|
|
286
|
+
| Copyright | Bottom, `text-sm text-muted-foreground` |
|
|
287
|
+
|
|
288
|
+
### Case Study Structure
|
|
289
|
+
|
|
290
|
+
1. Hero with client logo and headline
|
|
291
|
+
2. Challenge section - What problem?
|
|
292
|
+
3. Solution section - How did we help?
|
|
293
|
+
4. Results section - Metrics and outcomes
|
|
294
|
+
5. Client quote
|
|
295
|
+
6. Related case studies CTA
|
|
296
|
+
|
|
297
|
+
**Results Display:**
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
┌──────┐ ┌──────┐ ┌──────┐
|
|
301
|
+
│ 50% │ │ 3x │ │ 24h │
|
|
302
|
+
│ cost │ │faster│ │deploy│
|
|
303
|
+
│ saved│ │ time │ │ time │
|
|
304
|
+
└──────┘ └──────┘ └──────┘
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
- Use KPI card pattern
|
|
308
|
+
- Include context (e.g., "50% reduction in...")
|
|
309
|
+
|
|
310
|
+
### Responsive Behavior
|
|
311
|
+
|
|
312
|
+
| Element | Desktop | Tablet | Mobile |
|
|
313
|
+
|---------|---------|--------|--------|
|
|
314
|
+
| Hero heading | `text-6xl` | `text-5xl` | `text-4xl` |
|
|
315
|
+
| Feature grid | 3 columns | 2 columns | 1 column |
|
|
316
|
+
| Pricing cards | 3 horizontal | 3 horizontal | Stacked |
|
|
317
|
+
| Split sections | 50/50 | 50/50 | Stacked |
|
|
318
|
+
| Testimonials | 3 columns | 2 columns | 1 column |
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Best Practices
|
|
323
|
+
|
|
324
|
+
### Do's
|
|
325
|
+
|
|
326
|
+
1. **Lead with value** - Hero should answer "what's in it for me?"
|
|
327
|
+
2. **Use social proof** - Logos, testimonials, metrics
|
|
328
|
+
3. **Clear CTAs** - One primary action per section
|
|
329
|
+
4. **Scannable content** - Users skim before reading
|
|
330
|
+
5. **Mobile-first** - Many visitors are on mobile
|
|
331
|
+
6. **Fast loading** - Optimize images, lazy load below fold
|
|
332
|
+
|
|
333
|
+
### Don'ts
|
|
334
|
+
|
|
335
|
+
1. **Don't overwhelm** - One message per section
|
|
336
|
+
2. **Don't hide CTAs** - Make them prominent
|
|
337
|
+
3. **Don't use jargon** - Plain language for broad audience
|
|
338
|
+
4. **Don't auto-play video with sound** - Respect user preferences
|
|
339
|
+
5. **Don't neglect footer** - Important for trust and navigation
|
|
340
|
+
|
|
341
|
+
### Common Mistakes
|
|
342
|
+
|
|
343
|
+
| Mistake | Solution |
|
|
344
|
+
|---------|----------|
|
|
345
|
+
| Unclear value prop | Test headline with users |
|
|
346
|
+
| Too many CTAs | One primary per section |
|
|
347
|
+
| Walls of text | Break into scannable sections |
|
|
348
|
+
| Generic testimonials | Specific, credible quotes |
|
|
349
|
+
| Missing social proof | Add logos, numbers, quotes |
|
|
350
|
+
| Slow loading | Optimize images, lazy load |
|
|
351
|
+
|
|
352
|
+
### Edge Cases
|
|
353
|
+
|
|
354
|
+
| Case | Handling |
|
|
355
|
+
|------|----------|
|
|
356
|
+
| No testimonials yet | Use partner logos, team credentials |
|
|
357
|
+
| Complex pricing | Summary cards + detailed table |
|
|
358
|
+
| Many features | Categorize, show top 3-6, link to full list |
|
|
359
|
+
| Video content | Thumbnail + play button, don't auto-play |
|
|
360
|
+
| International | Consider localization, currency display |
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Related Documentation
|
|
365
|
+
|
|
366
|
+
- [Layout Primitives](../design/layouts.md) - Horizontal Navigation layout
|
|
367
|
+
- [Rules index](../README.md) - Marketing content and logo (paths under *Types — web — marketing* and *Foundations — logo*)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Kuat consumer rules (bundled)
|
|
2
|
+
|
|
3
|
+
**Package:** @equal-experts/kuat-core (and mirrored in kuat-react / kuat-vue agent-docs)
|
|
4
|
+
|
|
5
|
+
**Snapshot:** 67fc215fe87c
|
|
6
|
+
|
|
7
|
+
## Default load (web product / marketing UI)
|
|
8
|
+
|
|
9
|
+
1. `external/kuat-agent-rules/kuat-docs/rules/foundations/` (design, content, brand, logo, accessibility)
|
|
10
|
+
2. `external/kuat-agent-rules/kuat-docs/rules/types/web/product/` — core files + scenarios + content (examples excluded)
|
|
11
|
+
3. `external/kuat-agent-rules/kuat-docs/rules/types/web/marketing/`
|
|
12
|
+
4. `kuat-docs/rules/design/layouts.md` — Kuat layout primitives
|
|
13
|
+
5. `kuat-docs/rules/scenarios/` — Kuat scenario overlays
|
|
14
|
+
6. Component guides on demand: `components/{slug}.md` via `components.manifest.json`
|
|
15
|
+
|
|
16
|
+
## Component IDs
|
|
17
|
+
|
|
18
|
+
Resolve `shadcn:button`, `kuat:button-group`, etc. using `components/components.manifest.json`.
|
|
19
|
+
|
|
20
|
+
## Full org taxonomy
|
|
21
|
+
|
|
22
|
+
Set `KUAT_RULES_PATH` to a `kuat-agent-docs` git clone for slides, graphics, and latest upstream.
|
|
23
|
+
|
|
24
|
+
## Related
|
|
25
|
+
|
|
26
|
+
- [README.md](../README.md)
|
|
27
|
+
- Upstream [LOADING.md](../external/kuat-agent-rules/kuat-docs/rules/LOADING.md)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ButtonColor, ButtonVariant } from '../button/button';
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
/** @deprecated Use "primary" instead. */
|
|
4
|
+
export declare const ICON_BUTTON_VARIANT_DEFAULT_ALIAS = "default";
|
|
5
|
+
export declare const ICON_BUTTON_SIZES: readonly ["mini", "small", "regular", "large"];
|
|
6
|
+
/** @deprecated Use "small" instead. */
|
|
7
|
+
export declare const ICON_BUTTON_SIZE_SM_ALIAS = "sm";
|
|
8
|
+
/** @deprecated Use "large" instead. */
|
|
9
|
+
export declare const ICON_BUTTON_SIZE_LG_ALIAS = "lg";
|
|
10
|
+
export declare const ICON_BUTTON_ROUNDNESS: readonly ["default", "round"];
|
|
11
|
+
export type IconButtonSize = (typeof ICON_BUTTON_SIZES)[number];
|
|
12
|
+
export type IconButtonRoundness = (typeof ICON_BUTTON_ROUNDNESS)[number];
|
|
13
|
+
export interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
14
|
+
variant?: ButtonVariant | typeof ICON_BUTTON_VARIANT_DEFAULT_ALIAS;
|
|
15
|
+
size?: IconButtonSize | typeof ICON_BUTTON_SIZE_SM_ALIAS | typeof ICON_BUTTON_SIZE_LG_ALIAS;
|
|
16
|
+
color?: ButtonColor;
|
|
17
|
+
roundness?: IconButtonRoundness;
|
|
18
|
+
asChild?: boolean;
|
|
19
|
+
}
|
|
20
|
+
declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
21
|
+
declare function iconButtonVariants(options?: {
|
|
22
|
+
variant?: IconButtonProps["variant"];
|
|
23
|
+
size?: IconButtonProps["size"];
|
|
24
|
+
color?: ButtonColor;
|
|
25
|
+
roundness?: IconButtonRoundness;
|
|
26
|
+
}): string;
|
|
27
|
+
export { IconButton, iconButtonVariants };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { IconButton, iconButtonVariants, ICON_BUTTON_SIZES, ICON_BUTTON_ROUNDNESS, ICON_BUTTON_VARIANT_DEFAULT_ALIAS, ICON_BUTTON_SIZE_SM_ALIAS, ICON_BUTTON_SIZE_LG_ALIAS, } from './icon-button';
|
|
2
|
+
export type { IconButtonProps, IconButtonSize, IconButtonRoundness, } from './icon-button';
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export { KuatHeader, EELogo, kuatHeaderVariants,
|
|
2
|
-
export
|
|
1
|
+
export { KuatHeader, EELogo, kuatHeaderVariants, } from './kuat-header';
|
|
2
|
+
export { KUAT_HEADER_VARIANTS, KUAT_HEADER_LOCKUP_VARIANTS, KUAT_HEADER_APP_SWITCHER_EMPTY, EE_LOGO_TEXT_COLORS, } from './kuat-header.types';
|
|
3
|
+
export type { KuatHeaderProps, EELogoProps, KuatHeaderVariant, KuatHeaderLockupVariant, EELogoTextColor, KuatHeaderSubItem, KuatHeaderNavItem, KuatHeaderAccountItem, KuatHeaderAccountConfig, KuatHeaderAccountLabels, KuatHeaderAccountMobileTier, KuatHeaderActionItem, KuatHeaderApp, KuatHeaderAppSwitcherConfig, KuatHeaderAppSwitcherEmpty, KuatHeaderAppSwitcherLabels, KuatHeaderLockupConfig, } from './kuat-header.types';
|
|
4
|
+
export { shouldShowAppSwitcher, resolveAppSwitcherLabels, resolveHeaderLockup, resolveAccountLabels, shouldShowAccountMobileTier, hasStructuredAccount, resolveDesktopAccountMenuItems, shouldUseDesktopAccountDropdown, } from './kuat-header.logic';
|
|
@@ -1,50 +1,13 @@
|
|
|
1
|
+
import { EELogoProps, KuatHeaderProps, KuatHeaderVariant } from './kuat-header.types';
|
|
1
2
|
import * as React from "react";
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export type KuatHeaderLockupVariant = (typeof KUAT_HEADER_LOCKUP_VARIANTS)[number];
|
|
6
|
-
export declare const EE_LOGO_TEXT_COLORS: readonly ["grey", "white"];
|
|
7
|
-
export type EELogoTextColor = (typeof EE_LOGO_TEXT_COLORS)[number];
|
|
3
|
+
export type { EELogoProps, EELogoTextColor, KuatHeaderAccountConfig, KuatHeaderAccountItem, KuatHeaderAccountLabels, KuatHeaderAccountMobileTier, KuatHeaderActionItem, KuatHeaderApp, KuatHeaderAppSwitcherConfig, KuatHeaderAppSwitcherEmpty, KuatHeaderAppSwitcherLabels, KuatHeaderLockupConfig, KuatHeaderLockupVariant, KuatHeaderNavItem, KuatHeaderProps, KuatHeaderSubItem, KuatHeaderVariant, } from './kuat-header.types';
|
|
4
|
+
export { KUAT_HEADER_VARIANTS, KUAT_HEADER_LOCKUP_VARIANTS, EE_LOGO_TEXT_COLORS, KUAT_HEADER_APP_SWITCHER_EMPTY, } from './kuat-header.types';
|
|
5
|
+
export { shouldShowAppSwitcher, resolveAppSwitcherLabels, resolveHeaderLockup, } from './kuat-header.logic';
|
|
8
6
|
/**
|
|
9
7
|
* Equal Experts Logo component
|
|
10
8
|
* Source: https://github.com/EqualExperts/brand-assets/blob/main/logo/logo-colour.svg
|
|
11
9
|
*/
|
|
12
|
-
export interface EELogoProps {
|
|
13
|
-
className?: string;
|
|
14
|
-
/** Text color variant - grey for default, white for bold */
|
|
15
|
-
textColor?: EELogoTextColor;
|
|
16
|
-
}
|
|
17
10
|
declare function EELogo({ className, textColor }: EELogoProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
-
export interface KuatHeaderProps extends React.HTMLAttributes<HTMLElement> {
|
|
19
|
-
/** Logo element - defaults to EE logo if not provided. Set to `null` to hide. */
|
|
20
|
-
logo?: React.ReactNode;
|
|
21
|
-
/** Page or application title */
|
|
22
|
-
title?: string;
|
|
23
|
-
/** Navigation items or legacy navigation node. */
|
|
24
|
-
navigation?: React.ReactNode | KuatHeaderNavItem[];
|
|
25
|
-
/** Right-side actions or legacy action node. */
|
|
26
|
-
actions?: React.ReactNode | KuatHeaderActionItem[];
|
|
27
|
-
/** Mobile menu trigger button (e.g., hamburger icon) */
|
|
28
|
-
mobileMenuTrigger?: React.ReactNode;
|
|
29
|
-
/** Mobile menu content (typically a Sheet or Drawer) */
|
|
30
|
-
mobileMenu?: React.ReactNode;
|
|
31
|
-
/** Hide the default EE logo */
|
|
32
|
-
hideLogo?: boolean;
|
|
33
|
-
/** Brand lockup layout in header. */
|
|
34
|
-
lockupVariant?: KuatHeaderLockupVariant;
|
|
35
|
-
variant?: KuatHeaderVariant;
|
|
36
|
-
}
|
|
37
|
-
export interface KuatHeaderSubItem {
|
|
38
|
-
label: string;
|
|
39
|
-
url: string;
|
|
40
|
-
}
|
|
41
|
-
export interface KuatHeaderNavItem extends KuatHeaderSubItem {
|
|
42
|
-
items?: KuatHeaderSubItem[];
|
|
43
|
-
}
|
|
44
|
-
export interface KuatHeaderActionItem extends KuatHeaderSubItem {
|
|
45
|
-
icon?: React.ReactNode;
|
|
46
|
-
items?: KuatHeaderSubItem[];
|
|
47
|
-
}
|
|
48
11
|
declare const KuatHeader: React.ForwardRefExoticComponent<KuatHeaderProps & React.RefAttributes<HTMLElement>>;
|
|
49
12
|
/** Returns class string for header variant (backward compatibility). */
|
|
50
13
|
export declare function kuatHeaderVariants(options?: {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { KuatHeaderAccountConfig, KuatHeaderAppSwitcherConfig, KuatHeaderAppSwitcherLabels, KuatHeaderLockupConfig, KuatHeaderLockupVariant, KuatHeaderSubItem } from './kuat-header.types';
|
|
3
|
+
|
|
4
|
+
export declare function shouldShowAppSwitcher(config?: KuatHeaderAppSwitcherConfig): boolean;
|
|
5
|
+
export declare function resolveAppSwitcherLabels(config?: KuatHeaderAppSwitcherConfig): Required<KuatHeaderAppSwitcherLabels>;
|
|
6
|
+
export declare function resolveAppSwitcherEmptyMessage(config?: KuatHeaderAppSwitcherConfig): string;
|
|
7
|
+
export declare function shouldShowAccountMobileTier(account?: KuatHeaderAccountConfig): boolean;
|
|
8
|
+
export declare function hasStructuredAccount(account?: KuatHeaderAccountConfig): boolean;
|
|
9
|
+
/** Menu rows for the desktop account dropdown (from `account.mobile.items`). */
|
|
10
|
+
export declare function resolveDesktopAccountMenuItems(account?: KuatHeaderAccountConfig): KuatHeaderSubItem[];
|
|
11
|
+
/** Single primary row + mobile menu items → desktop shows a dropdown, not a direct link. */
|
|
12
|
+
export declare function shouldUseDesktopAccountDropdown(account?: KuatHeaderAccountConfig): boolean;
|
|
13
|
+
export declare function resolveAccountLabels(account?: KuatHeaderAccountConfig): {
|
|
14
|
+
teaserTitle: string;
|
|
15
|
+
teaserDescription: string;
|
|
16
|
+
nav: string;
|
|
17
|
+
title: string;
|
|
18
|
+
};
|
|
19
|
+
export type HeaderLockupMode = "hidden" | "custom" | "builtin";
|
|
20
|
+
export declare function resolveHeaderLockup(options: {
|
|
21
|
+
logo?: ReactNode | null;
|
|
22
|
+
lockup?: KuatHeaderLockupConfig;
|
|
23
|
+
}): {
|
|
24
|
+
mode: HeaderLockupMode;
|
|
25
|
+
lockupVariant: KuatHeaderLockupVariant;
|
|
26
|
+
};
|
|
27
|
+
export declare function resolveMobileSheetAriaLabel(options: {
|
|
28
|
+
mobileMenuAriaLabel?: string;
|
|
29
|
+
showAppSwitcher: boolean;
|
|
30
|
+
hasStructuredNavigation: boolean;
|
|
31
|
+
hasAccountMobileTier: boolean;
|
|
32
|
+
}): string;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
export declare const KUAT_HEADER_VARIANTS: readonly ["default", "bold"];
|
|
3
|
+
export type KuatHeaderVariant = (typeof KUAT_HEADER_VARIANTS)[number];
|
|
4
|
+
export declare const KUAT_HEADER_LOCKUP_VARIANTS: readonly ["default", "demo"];
|
|
5
|
+
export type KuatHeaderLockupVariant = (typeof KUAT_HEADER_LOCKUP_VARIANTS)[number];
|
|
6
|
+
export declare const EE_LOGO_TEXT_COLORS: readonly ["grey", "white"];
|
|
7
|
+
export type EELogoTextColor = (typeof EE_LOGO_TEXT_COLORS)[number];
|
|
8
|
+
export declare const KUAT_HEADER_APP_SWITCHER_EMPTY: readonly ["hide", "message"];
|
|
9
|
+
export type KuatHeaderAppSwitcherEmpty = (typeof KUAT_HEADER_APP_SWITCHER_EMPTY)[number];
|
|
10
|
+
export interface KuatHeaderApp {
|
|
11
|
+
id: string;
|
|
12
|
+
label: string;
|
|
13
|
+
href: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
icon?: React.ReactNode;
|
|
16
|
+
}
|
|
17
|
+
export interface KuatHeaderAppSwitcherLabels {
|
|
18
|
+
trigger?: string;
|
|
19
|
+
nav?: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
teaserTitle?: string;
|
|
22
|
+
teaserDescription?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface KuatHeaderAppSwitcherConfig {
|
|
25
|
+
apps: KuatHeaderApp[];
|
|
26
|
+
loading?: boolean;
|
|
27
|
+
empty?: KuatHeaderAppSwitcherEmpty;
|
|
28
|
+
emptyMessage?: string;
|
|
29
|
+
linkTarget?: React.HTMLAttributeAnchorTarget;
|
|
30
|
+
labels?: KuatHeaderAppSwitcherLabels;
|
|
31
|
+
onOpen?: () => void;
|
|
32
|
+
onSelect?: (app: KuatHeaderApp) => void;
|
|
33
|
+
}
|
|
34
|
+
export interface KuatHeaderAccountItem {
|
|
35
|
+
label: string;
|
|
36
|
+
href: string;
|
|
37
|
+
icon?: React.ReactNode;
|
|
38
|
+
}
|
|
39
|
+
export interface KuatHeaderAccountMobileTier {
|
|
40
|
+
heading: string;
|
|
41
|
+
subtitle?: string;
|
|
42
|
+
items: KuatHeaderAccountItem[];
|
|
43
|
+
}
|
|
44
|
+
export interface KuatHeaderAccountLabels {
|
|
45
|
+
teaserTitle?: string;
|
|
46
|
+
teaserDescription?: string;
|
|
47
|
+
nav?: string;
|
|
48
|
+
title?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface KuatHeaderAccountConfig {
|
|
51
|
+
items: KuatHeaderAccountItem[];
|
|
52
|
+
mobile?: KuatHeaderAccountMobileTier;
|
|
53
|
+
labels?: KuatHeaderAccountLabels;
|
|
54
|
+
}
|
|
55
|
+
export interface KuatHeaderLockupConfig {
|
|
56
|
+
variant: KuatHeaderLockupVariant;
|
|
57
|
+
}
|
|
58
|
+
export interface KuatHeaderSubItem {
|
|
59
|
+
label: string;
|
|
60
|
+
url: string;
|
|
61
|
+
}
|
|
62
|
+
export interface KuatHeaderNavItem extends KuatHeaderSubItem {
|
|
63
|
+
items?: KuatHeaderSubItem[];
|
|
64
|
+
}
|
|
65
|
+
/** @deprecated Use `KuatHeaderAccountItem` with `href`. */
|
|
66
|
+
export interface KuatHeaderActionItem {
|
|
67
|
+
label: string;
|
|
68
|
+
url: string;
|
|
69
|
+
icon?: React.ReactNode;
|
|
70
|
+
items?: KuatHeaderSubItem[];
|
|
71
|
+
}
|
|
72
|
+
export interface KuatHeaderProps extends React.HTMLAttributes<HTMLElement> {
|
|
73
|
+
variant?: KuatHeaderVariant;
|
|
74
|
+
title?: string;
|
|
75
|
+
/** Custom logo node. `null` hides logo. Built-in EE logo only when `lockup` is set. */
|
|
76
|
+
logo?: React.ReactNode | null;
|
|
77
|
+
lockup?: KuatHeaderLockupConfig;
|
|
78
|
+
navigation?: React.ReactNode | KuatHeaderNavItem[];
|
|
79
|
+
/** Structured account chrome (desktop links + optional mobile tier). */
|
|
80
|
+
account?: KuatHeaderAccountConfig;
|
|
81
|
+
/** Custom account / actions markup (escape hatch). */
|
|
82
|
+
accountMarkup?: React.ReactNode;
|
|
83
|
+
appSwitcher?: KuatHeaderAppSwitcherConfig;
|
|
84
|
+
mobileMenuTrigger?: React.ReactNode;
|
|
85
|
+
mobileMenu?: React.ReactNode;
|
|
86
|
+
mobileMenuAriaLabel?: string;
|
|
87
|
+
}
|
|
88
|
+
export interface EELogoProps {
|
|
89
|
+
className?: string;
|
|
90
|
+
textColor?: EELogoTextColor;
|
|
91
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsx as I } from "react/jsx-runtime";
|
|
2
|
+
import * as N from "react";
|
|
3
|
+
import { Slot as v } from "@radix-ui/react-slot";
|
|
4
|
+
import { c as s } from "./utils-DLUjLwnh.js";
|
|
5
|
+
const B = "default", $ = ["mini", "small", "regular", "large"], C = "sm", U = "lg", y = ["default", "round"];
|
|
6
|
+
function l(t) {
|
|
7
|
+
return t === "default" ? "primary" : t ?? "primary";
|
|
8
|
+
}
|
|
9
|
+
function i(t) {
|
|
10
|
+
return t === "sm" ? "small" : t === "lg" ? "large" : t ?? "regular";
|
|
11
|
+
}
|
|
12
|
+
const S = N.forwardRef(
|
|
13
|
+
({
|
|
14
|
+
className: t,
|
|
15
|
+
variant: r = "primary",
|
|
16
|
+
size: e = "regular",
|
|
17
|
+
color: n = "ee-blue",
|
|
18
|
+
roundness: u = "default",
|
|
19
|
+
asChild: a = !1,
|
|
20
|
+
type: c = "button",
|
|
21
|
+
...m
|
|
22
|
+
}, f) => {
|
|
23
|
+
const b = a ? v : "button", o = l(r), d = i(e), _ = o === "destructive" ? void 0 : `button--color-${n}`;
|
|
24
|
+
return /* @__PURE__ */ I(
|
|
25
|
+
b,
|
|
26
|
+
{
|
|
27
|
+
ref: f,
|
|
28
|
+
type: a ? void 0 : c,
|
|
29
|
+
className: s(
|
|
30
|
+
"button",
|
|
31
|
+
"icon-button",
|
|
32
|
+
`button--variant-${o}`,
|
|
33
|
+
_,
|
|
34
|
+
`icon-button--size-${d}`,
|
|
35
|
+
`icon-button--roundness-${u}`,
|
|
36
|
+
t
|
|
37
|
+
),
|
|
38
|
+
...m
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
S.displayName = "IconButton";
|
|
44
|
+
function z(t) {
|
|
45
|
+
const r = l((t == null ? void 0 : t.variant) ?? "primary"), e = i((t == null ? void 0 : t.size) ?? "regular"), n = (t == null ? void 0 : t.color) ?? "ee-blue", u = (t == null ? void 0 : t.roundness) ?? "default", c = r === "destructive" ? void 0 : `button--color-${n}`;
|
|
46
|
+
return s(
|
|
47
|
+
"button",
|
|
48
|
+
"icon-button",
|
|
49
|
+
`button--variant-${r}`,
|
|
50
|
+
c,
|
|
51
|
+
`icon-button--size-${e}`,
|
|
52
|
+
`icon-button--roundness-${u}`
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
S as I,
|
|
57
|
+
$ as a,
|
|
58
|
+
y as b,
|
|
59
|
+
B as c,
|
|
60
|
+
C as d,
|
|
61
|
+
U as e,
|
|
62
|
+
z as i
|
|
63
|
+
};
|