vibecodeagent 0.0.0-stage → 0.1.65
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/LICENSE +21 -0
- package/README.md +46 -2
- package/THIRD-PARTY-NOTICES.txt +1427 -0
- package/dist/agen.js +138920 -0
- package/dist/bin.js +1245 -0
- package/dist/daemon.js +163701 -0
- package/dist/node_modules/node-ensure/index.js +10 -0
- package/dist/node_modules/node-ensure/package.json +31 -0
- package/dist/node_modules/pdf-parse/lib/pdf-parse.js +102 -0
- package/dist/node_modules/pdf-parse/lib/pdf.js/v1.10.100/build/pdf.js +18538 -0
- package/dist/node_modules/pdf-parse/lib/pdf.js/v1.10.100/build/pdf.worker.js +45507 -0
- package/dist/node_modules/pdf-parse/package.json +49 -0
- package/dist/node_modules/sql.js/dist/sql-wasm.js +186 -0
- package/dist/node_modules/sql.js/dist/sql-wasm.wasm +0 -0
- package/dist/node_modules/sql.js/package.json +58 -0
- package/dist/resources/skills/builtin/.gitkeep +0 -0
- package/dist/resources/skills/builtin/NOTICE.md +35 -0
- package/dist/resources/skills/builtin/README.md +74 -0
- package/dist/resources/skills/builtin/backend-engineering/SKILL.md +102 -0
- package/dist/resources/skills/builtin/backend-engineering/references/api-contracts.md +320 -0
- package/dist/resources/skills/builtin/backend-engineering/references/auth-and-secrets.md +268 -0
- package/dist/resources/skills/builtin/backend-engineering/references/concurrency-and-jobs.md +386 -0
- package/dist/resources/skills/builtin/backend-engineering/references/data-modelling.md +367 -0
- package/dist/resources/skills/builtin/backend-engineering/references/deploy-and-config.md +228 -0
- package/dist/resources/skills/builtin/backend-engineering/references/migrations.md +320 -0
- package/dist/resources/skills/builtin/backend-engineering/references/observability.md +301 -0
- package/dist/resources/skills/builtin/backend-engineering/references/plan-template.md +152 -0
- package/dist/resources/skills/builtin/backend-engineering/references/review-audit.md +213 -0
- package/dist/resources/skills/builtin/backend-engineering/references/security.md +251 -0
- package/dist/resources/skills/builtin/backend-engineering/references/stack-go.md +238 -0
- package/dist/resources/skills/builtin/backend-engineering/references/stack-node.md +274 -0
- package/dist/resources/skills/builtin/backend-engineering/references/stack-python.md +296 -0
- package/dist/resources/skills/builtin/backend-engineering/references/testing-and-perf.md +298 -0
- package/dist/resources/skills/builtin/backend-engineering/references/validation-and-errors.md +266 -0
- package/dist/resources/skills/builtin/dasar-vibecode/SKILL.md +312 -0
- package/dist/resources/skills/builtin/excel-maker/SKILL.md +71 -0
- package/dist/resources/skills/builtin/frontend-design/SKILL.md +131 -0
- package/dist/resources/skills/builtin/frontend-design/data/app-interface.csv +33 -0
- package/dist/resources/skills/builtin/frontend-design/data/catalog-summary.json +78 -0
- package/dist/resources/skills/builtin/frontend-design/data/charts.csv +26 -0
- package/dist/resources/skills/builtin/frontend-design/data/colors.csv +193 -0
- package/dist/resources/skills/builtin/frontend-design/data/data-provenance.json +1348 -0
- package/dist/resources/skills/builtin/frontend-design/data/google-font-licenses.json +20185 -0
- package/dist/resources/skills/builtin/frontend-design/data/google-fonts.csv +1935 -0
- package/dist/resources/skills/builtin/frontend-design/data/icons.csv +106 -0
- package/dist/resources/skills/builtin/frontend-design/data/landing.csv +35 -0
- package/dist/resources/skills/builtin/frontend-design/data/motion.csv +18 -0
- package/dist/resources/skills/builtin/frontend-design/data/phosphor-icons-upstream.json +32582 -0
- package/dist/resources/skills/builtin/frontend-design/data/products.csv +193 -0
- package/dist/resources/skills/builtin/frontend-design/data/react-performance.csv +45 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/angular.csv +51 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/astro.csv +54 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/avalonia.csv +57 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/flutter.csv +53 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/html-tailwind.csv +60 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/javafx.csv +76 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/jetpack-compose.csv +53 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/laravel.csv +51 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/nextjs.csv +62 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/nuxt-ui.csv +71 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/nuxtjs.csv +68 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/react-native.csv +52 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/react.csv +62 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/shadcn.csv +69 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/svelte.csv +56 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/swiftui.csv +51 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/threejs.csv +54 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/uno.csv +60 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/uwp.csv +56 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/vue.csv +50 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/winui.csv +60 -0
- package/dist/resources/skills/builtin/frontend-design/data/stacks/wpf.csv +57 -0
- package/dist/resources/skills/builtin/frontend-design/data/styles.csv +89 -0
- package/dist/resources/skills/builtin/frontend-design/data/typography.csv +75 -0
- package/dist/resources/skills/builtin/frontend-design/data/ui-reasoning.csv +193 -0
- package/dist/resources/skills/builtin/frontend-design/data/ux-guidelines.csv +120 -0
- package/dist/resources/skills/builtin/frontend-design/references/animation-patterns.md +705 -0
- package/dist/resources/skills/builtin/frontend-design/references/app-polish.md +117 -0
- package/dist/resources/skills/builtin/frontend-design/references/apple-fluid.md +278 -0
- package/dist/resources/skills/builtin/frontend-design/references/art-direction.md +280 -0
- package/dist/resources/skills/builtin/frontend-design/references/case-studies.md +599 -0
- package/dist/resources/skills/builtin/frontend-design/references/craft.md +128 -0
- package/dist/resources/skills/builtin/frontend-design/references/expo.md +251 -0
- package/dist/resources/skills/builtin/frontend-design/references/layout-systems.md +533 -0
- package/dist/resources/skills/builtin/frontend-design/references/libraries.md +72 -0
- package/dist/resources/skills/builtin/frontend-design/references/motion.md +222 -0
- package/dist/resources/skills/builtin/frontend-design/references/picker.md +197 -0
- package/dist/resources/skills/builtin/frontend-design/references/plan-template.md +73 -0
- package/dist/resources/skills/builtin/frontend-design/references/prototype.md +85 -0
- package/dist/resources/skills/builtin/frontend-design/references/recipes-expo.md +385 -0
- package/dist/resources/skills/builtin/frontend-design/references/recipes-web.md +421 -0
- package/dist/resources/skills/builtin/frontend-design/references/review-audit.md +107 -0
- package/dist/resources/skills/builtin/frontend-design/references/sonner.md +143 -0
- package/dist/resources/skills/builtin/frontend-design/references/technical-stack.md +543 -0
- package/dist/resources/skills/builtin/frontend-design/references/theming.md +60 -0
- package/dist/resources/skills/builtin/frontend-design/references/typography.md +393 -0
- package/dist/resources/skills/builtin/frontend-design/references/ux-rules.md +256 -0
- package/dist/resources/skills/builtin/frontend-design/references/vocabulary.md +169 -0
- package/dist/resources/skills/builtin/frontend-design/scripts/core.py +993 -0
- package/dist/resources/skills/builtin/frontend-design/scripts/design_system.py +1643 -0
- package/dist/resources/skills/builtin/frontend-design/scripts/reasoning_contract.py +123 -0
- package/dist/resources/skills/builtin/frontend-design/scripts/search.py +171 -0
- package/dist/resources/skills/builtin/frontend-design/scripts/validate_data.py +1091 -0
- package/dist/resources/skills/builtin/kerja-agentik/SKILL.md +117 -0
- package/dist/resources/skills/builtin/pdf-maker/SKILL.md +51 -0
- package/dist/resources/skills/builtin/tinjau-keamanan/SKILL.md +53 -0
- package/dist/resources/skills/builtin/word-maker/SKILL.md +58 -0
- package/dist/resources/skills/builtin/write-swift/SKILL.md +388 -0
- package/package.json +35 -4
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
# Layout Systems Reference
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
1. Grid Frameworks
|
|
5
|
+
2. Breakpoint Strategy
|
|
6
|
+
3. Compositional Techniques
|
|
7
|
+
4. Responsive Patterns
|
|
8
|
+
5. Scroll-Based Layouts
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Grid Frameworks
|
|
13
|
+
|
|
14
|
+
### Base Grid System
|
|
15
|
+
|
|
16
|
+
```css
|
|
17
|
+
/* 12-column fluid grid */
|
|
18
|
+
:root {
|
|
19
|
+
--grid-columns: 12;
|
|
20
|
+
--grid-gutter: clamp(1rem, 2vw, 2rem);
|
|
21
|
+
--grid-margin: clamp(1rem, 5vw, 6rem);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.grid {
|
|
25
|
+
display: grid;
|
|
26
|
+
grid-template-columns: repeat(var(--grid-columns), 1fr);
|
|
27
|
+
gap: var(--grid-gutter);
|
|
28
|
+
padding-inline: var(--grid-margin);
|
|
29
|
+
max-width: 1800px;
|
|
30
|
+
margin-inline: auto;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* Span utilities */
|
|
34
|
+
.col-1 { grid-column: span 1; }
|
|
35
|
+
.col-2 { grid-column: span 2; }
|
|
36
|
+
.col-3 { grid-column: span 3; }
|
|
37
|
+
.col-4 { grid-column: span 4; }
|
|
38
|
+
.col-5 { grid-column: span 5; }
|
|
39
|
+
.col-6 { grid-column: span 6; }
|
|
40
|
+
.col-7 { grid-column: span 7; }
|
|
41
|
+
.col-8 { grid-column: span 8; }
|
|
42
|
+
.col-9 { grid-column: span 9; }
|
|
43
|
+
.col-10 { grid-column: span 10; }
|
|
44
|
+
.col-11 { grid-column: span 11; }
|
|
45
|
+
.col-12 { grid-column: span 12; }
|
|
46
|
+
|
|
47
|
+
/* Start position */
|
|
48
|
+
.start-1 { grid-column-start: 1; }
|
|
49
|
+
.start-2 { grid-column-start: 2; }
|
|
50
|
+
.start-3 { grid-column-start: 3; }
|
|
51
|
+
.start-4 { grid-column-start: 4; }
|
|
52
|
+
.start-5 { grid-column-start: 5; }
|
|
53
|
+
.start-6 { grid-column-start: 6; }
|
|
54
|
+
.start-7 { grid-column-start: 7; }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Swiss/Modular Grid
|
|
58
|
+
|
|
59
|
+
```css
|
|
60
|
+
/* Swiss-style asymmetric grid */
|
|
61
|
+
.swiss-grid {
|
|
62
|
+
display: grid;
|
|
63
|
+
grid-template-columns:
|
|
64
|
+
[full-start] var(--grid-margin)
|
|
65
|
+
[content-start] 2fr
|
|
66
|
+
[sidebar-start] 1fr
|
|
67
|
+
[sidebar-end] var(--grid-margin)
|
|
68
|
+
[full-end];
|
|
69
|
+
gap: var(--grid-gutter);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* Named grid areas for Swiss compositions */
|
|
73
|
+
.swiss-layout {
|
|
74
|
+
display: grid;
|
|
75
|
+
grid-template-columns: 1fr 1fr 2fr;
|
|
76
|
+
grid-template-rows: auto 1fr auto;
|
|
77
|
+
grid-template-areas:
|
|
78
|
+
"header header header"
|
|
79
|
+
"nav main main"
|
|
80
|
+
"footer footer footer";
|
|
81
|
+
min-height: 100vh;
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Editorial Grid
|
|
86
|
+
|
|
87
|
+
```css
|
|
88
|
+
/* Magazine-style editorial grid */
|
|
89
|
+
.editorial-grid {
|
|
90
|
+
display: grid;
|
|
91
|
+
grid-template-columns:
|
|
92
|
+
[full-start] minmax(var(--grid-margin), 1fr)
|
|
93
|
+
[wide-start] minmax(0, 200px)
|
|
94
|
+
[content-start] min(65ch, 100%)
|
|
95
|
+
[content-end] minmax(0, 200px)
|
|
96
|
+
[wide-end] minmax(var(--grid-margin), 1fr)
|
|
97
|
+
[full-end];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.editorial-grid > * {
|
|
101
|
+
grid-column: content;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.editorial-grid > .wide {
|
|
105
|
+
grid-column: wide;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.editorial-grid > .full {
|
|
109
|
+
grid-column: full;
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 2. Breakpoint Strategy
|
|
116
|
+
|
|
117
|
+
### Fluid-First Approach
|
|
118
|
+
|
|
119
|
+
```css
|
|
120
|
+
/* Minimal breakpoints - rely on fluid sizing */
|
|
121
|
+
:root {
|
|
122
|
+
/* Only break when necessary */
|
|
123
|
+
--bp-sm: 640px; /* Mobile landscape */
|
|
124
|
+
--bp-md: 768px; /* Tablet */
|
|
125
|
+
--bp-lg: 1024px; /* Desktop */
|
|
126
|
+
--bp-xl: 1280px; /* Large desktop */
|
|
127
|
+
--bp-2xl: 1536px; /* Ultra-wide */
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Media query mixins (conceptual) */
|
|
131
|
+
@media (min-width: 768px) { /* Tablet and up */ }
|
|
132
|
+
@media (min-width: 1024px) { /* Desktop and up */ }
|
|
133
|
+
@media (min-width: 1280px) { /* Large screens */ }
|
|
134
|
+
|
|
135
|
+
/* Container queries for component-level responsiveness */
|
|
136
|
+
.card-container {
|
|
137
|
+
container-type: inline-size;
|
|
138
|
+
container-name: card;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@container card (min-width: 400px) {
|
|
142
|
+
.card {
|
|
143
|
+
flex-direction: row;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Responsive Grid Columns
|
|
149
|
+
|
|
150
|
+
```css
|
|
151
|
+
/* Responsive column spans */
|
|
152
|
+
.responsive-grid {
|
|
153
|
+
display: grid;
|
|
154
|
+
grid-template-columns: repeat(4, 1fr);
|
|
155
|
+
gap: var(--grid-gutter);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@media (min-width: 768px) {
|
|
159
|
+
.responsive-grid {
|
|
160
|
+
grid-template-columns: repeat(8, 1fr);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
@media (min-width: 1024px) {
|
|
165
|
+
.responsive-grid {
|
|
166
|
+
grid-template-columns: repeat(12, 1fr);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* Responsive item */
|
|
171
|
+
.grid-item {
|
|
172
|
+
grid-column: span 4; /* Full width mobile */
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@media (min-width: 768px) {
|
|
176
|
+
.grid-item {
|
|
177
|
+
grid-column: span 4; /* Half width tablet */
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
@media (min-width: 1024px) {
|
|
182
|
+
.grid-item {
|
|
183
|
+
grid-column: span 3; /* Quarter width desktop */
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 3. Compositional Techniques
|
|
191
|
+
|
|
192
|
+
### Asymmetric Balance
|
|
193
|
+
|
|
194
|
+
```css
|
|
195
|
+
/* Intentionally unbalanced layout */
|
|
196
|
+
.asymmetric-hero {
|
|
197
|
+
display: grid;
|
|
198
|
+
grid-template-columns: 2fr 3fr;
|
|
199
|
+
gap: var(--grid-gutter);
|
|
200
|
+
align-items: end;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.asymmetric-hero .title {
|
|
204
|
+
grid-column: 1;
|
|
205
|
+
/* Offset from grid alignment */
|
|
206
|
+
margin-left: -5%;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.asymmetric-hero .media {
|
|
210
|
+
grid-column: 2;
|
|
211
|
+
/* Extend beyond grid */
|
|
212
|
+
margin-right: calc(var(--grid-margin) * -1);
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Overlap & Layer
|
|
217
|
+
|
|
218
|
+
```css
|
|
219
|
+
/* Overlapping elements */
|
|
220
|
+
.overlap-composition {
|
|
221
|
+
display: grid;
|
|
222
|
+
grid-template-columns: repeat(12, 1fr);
|
|
223
|
+
grid-template-rows: repeat(6, 1fr);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.overlap-composition .image {
|
|
227
|
+
grid-column: 1 / 8;
|
|
228
|
+
grid-row: 1 / 5;
|
|
229
|
+
z-index: 1;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.overlap-composition .text-block {
|
|
233
|
+
grid-column: 6 / 13;
|
|
234
|
+
grid-row: 3 / 7;
|
|
235
|
+
z-index: 2;
|
|
236
|
+
background: var(--color-surface);
|
|
237
|
+
padding: 2rem;
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Bleeding Elements
|
|
242
|
+
|
|
243
|
+
```css
|
|
244
|
+
/* Elements that break container */
|
|
245
|
+
.bleed-container {
|
|
246
|
+
max-width: 1200px;
|
|
247
|
+
margin-inline: auto;
|
|
248
|
+
padding-inline: var(--grid-margin);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.bleed-left {
|
|
252
|
+
margin-left: calc(var(--grid-margin) * -1);
|
|
253
|
+
padding-left: var(--grid-margin);
|
|
254
|
+
/* Or extend to viewport edge */
|
|
255
|
+
margin-left: calc(-50vw + 50%);
|
|
256
|
+
padding-left: calc(50vw - 50%);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.bleed-right {
|
|
260
|
+
margin-right: calc(var(--grid-margin) * -1);
|
|
261
|
+
padding-right: var(--grid-margin);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.bleed-full {
|
|
265
|
+
width: 100vw;
|
|
266
|
+
margin-left: calc(-50vw + 50%);
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Diagonal/Angular Layouts
|
|
271
|
+
|
|
272
|
+
```css
|
|
273
|
+
/* Angled section divider */
|
|
274
|
+
.angled-section {
|
|
275
|
+
position: relative;
|
|
276
|
+
padding: 8rem 0;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.angled-section::before {
|
|
280
|
+
content: '';
|
|
281
|
+
position: absolute;
|
|
282
|
+
top: 0;
|
|
283
|
+
left: 0;
|
|
284
|
+
right: 0;
|
|
285
|
+
height: 100%;
|
|
286
|
+
background: var(--color-accent);
|
|
287
|
+
clip-path: polygon(0 10%, 100% 0, 100% 90%, 0 100%);
|
|
288
|
+
z-index: -1;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/* Skewed container */
|
|
292
|
+
.skewed-container {
|
|
293
|
+
transform: skewY(-3deg);
|
|
294
|
+
padding: 6rem 0;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.skewed-container > * {
|
|
298
|
+
transform: skewY(3deg); /* Counter-skew content */
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## 4. Responsive Patterns
|
|
305
|
+
|
|
306
|
+
### Mobile-First Hero
|
|
307
|
+
|
|
308
|
+
```css
|
|
309
|
+
/* Hero that works mobile-first */
|
|
310
|
+
.hero {
|
|
311
|
+
min-height: 100svh;
|
|
312
|
+
display: flex;
|
|
313
|
+
flex-direction: column;
|
|
314
|
+
justify-content: flex-end;
|
|
315
|
+
padding: var(--grid-margin);
|
|
316
|
+
padding-bottom: 15vh;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.hero-title {
|
|
320
|
+
font-size: clamp(3rem, 10vw, 12rem);
|
|
321
|
+
line-height: 0.9;
|
|
322
|
+
margin-bottom: 1rem;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.hero-media {
|
|
326
|
+
position: absolute;
|
|
327
|
+
inset: 0;
|
|
328
|
+
z-index: -1;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
@media (min-width: 1024px) {
|
|
332
|
+
.hero {
|
|
333
|
+
display: grid;
|
|
334
|
+
grid-template-columns: 1fr 1fr;
|
|
335
|
+
align-items: end;
|
|
336
|
+
gap: var(--grid-gutter);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.hero-title {
|
|
340
|
+
grid-column: 1 / -1;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Responsive Card Grid
|
|
346
|
+
|
|
347
|
+
```css
|
|
348
|
+
/* Auto-fit responsive grid */
|
|
349
|
+
.card-grid {
|
|
350
|
+
display: grid;
|
|
351
|
+
grid-template-columns: repeat(
|
|
352
|
+
auto-fit,
|
|
353
|
+
minmax(min(100%, 300px), 1fr)
|
|
354
|
+
);
|
|
355
|
+
gap: var(--grid-gutter);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/* Or with explicit breakpoints for control */
|
|
359
|
+
.card-grid-controlled {
|
|
360
|
+
display: grid;
|
|
361
|
+
gap: var(--grid-gutter);
|
|
362
|
+
grid-template-columns: 1fr; /* Mobile: 1 column */
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
@media (min-width: 640px) {
|
|
366
|
+
.card-grid-controlled {
|
|
367
|
+
grid-template-columns: repeat(2, 1fr);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
@media (min-width: 1024px) {
|
|
372
|
+
.card-grid-controlled {
|
|
373
|
+
grid-template-columns: repeat(3, 1fr);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
@media (min-width: 1280px) {
|
|
378
|
+
.card-grid-controlled {
|
|
379
|
+
grid-template-columns: repeat(4, 1fr);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### Responsive Typography Layout
|
|
385
|
+
|
|
386
|
+
```css
|
|
387
|
+
/* Two-column text layout */
|
|
388
|
+
.text-columns {
|
|
389
|
+
columns: 1;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
@media (min-width: 768px) {
|
|
393
|
+
.text-columns {
|
|
394
|
+
columns: 2;
|
|
395
|
+
column-gap: var(--grid-gutter);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/* Prevent breaks */
|
|
400
|
+
.text-columns h2,
|
|
401
|
+
.text-columns h3,
|
|
402
|
+
.text-columns figure {
|
|
403
|
+
break-inside: avoid;
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## 5. Scroll-Based Layouts
|
|
410
|
+
|
|
411
|
+
### Horizontal Scroll Section
|
|
412
|
+
|
|
413
|
+
```css
|
|
414
|
+
.horizontal-scroll {
|
|
415
|
+
display: flex;
|
|
416
|
+
overflow-x: auto;
|
|
417
|
+
scroll-snap-type: x mandatory;
|
|
418
|
+
scrollbar-width: none;
|
|
419
|
+
-ms-overflow-style: none;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
.horizontal-scroll::-webkit-scrollbar {
|
|
423
|
+
display: none;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.horizontal-scroll-item {
|
|
427
|
+
flex: 0 0 80vw;
|
|
428
|
+
scroll-snap-align: center;
|
|
429
|
+
padding: 0 2vw;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
@media (min-width: 1024px) {
|
|
433
|
+
.horizontal-scroll-item {
|
|
434
|
+
flex: 0 0 40vw;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### Sticky Sidebar
|
|
440
|
+
|
|
441
|
+
```css
|
|
442
|
+
.sticky-layout {
|
|
443
|
+
display: grid;
|
|
444
|
+
grid-template-columns: 1fr 300px;
|
|
445
|
+
gap: var(--grid-gutter);
|
|
446
|
+
align-items: start;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
.sticky-sidebar {
|
|
450
|
+
position: sticky;
|
|
451
|
+
top: var(--grid-margin);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/* Full-height sticky */
|
|
455
|
+
.sticky-full {
|
|
456
|
+
position: sticky;
|
|
457
|
+
top: 0;
|
|
458
|
+
height: 100vh;
|
|
459
|
+
overflow-y: auto;
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### Scroll-Triggered Layout Changes
|
|
464
|
+
|
|
465
|
+
```css
|
|
466
|
+
/* Layout shifts based on scroll position */
|
|
467
|
+
.scroll-layout {
|
|
468
|
+
--scroll-progress: 0;
|
|
469
|
+
|
|
470
|
+
display: grid;
|
|
471
|
+
grid-template-columns:
|
|
472
|
+
calc(30% + (20% * var(--scroll-progress)))
|
|
473
|
+
1fr;
|
|
474
|
+
transition: grid-template-columns 0.1s;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/* JS updates --scroll-progress from 0 to 1 */
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Pinned Section with Content Scroll
|
|
481
|
+
|
|
482
|
+
```css
|
|
483
|
+
/* Two-panel layout with one side pinned */
|
|
484
|
+
.pinned-layout {
|
|
485
|
+
display: grid;
|
|
486
|
+
grid-template-columns: 1fr 1fr;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
.pinned-panel {
|
|
490
|
+
position: sticky;
|
|
491
|
+
top: 0;
|
|
492
|
+
height: 100vh;
|
|
493
|
+
display: flex;
|
|
494
|
+
align-items: center;
|
|
495
|
+
justify-content: center;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
.scrolling-panel {
|
|
499
|
+
/* Content scrolls naturally */
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
.scrolling-panel section {
|
|
503
|
+
min-height: 100vh;
|
|
504
|
+
display: flex;
|
|
505
|
+
flex-direction: column;
|
|
506
|
+
justify-content: center;
|
|
507
|
+
padding: var(--grid-margin);
|
|
508
|
+
}
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
## Layout Anti-Patterns
|
|
514
|
+
|
|
515
|
+
```
|
|
516
|
+
AVOID THESE:
|
|
517
|
+
✗ Fixed pixel widths (use max-width instead)
|
|
518
|
+
✗ Magic numbers without explanation
|
|
519
|
+
✗ Breaking grid without clear purpose
|
|
520
|
+
✗ Horizontal scroll without indication
|
|
521
|
+
✗ Content touching viewport edges on mobile
|
|
522
|
+
✗ Equal margins everywhere (creates boredom)
|
|
523
|
+
✗ Centered everything (lacks visual tension)
|
|
524
|
+
|
|
525
|
+
PREFER THESE:
|
|
526
|
+
✓ Fluid units (%, vw, clamp())
|
|
527
|
+
✓ CSS custom properties for spacing
|
|
528
|
+
✓ Intentional grid breaks with rationale
|
|
529
|
+
✓ Touch-friendly scroll indicators
|
|
530
|
+
✓ Consistent edge margins with breathing room
|
|
531
|
+
✓ Varied spacing for rhythm
|
|
532
|
+
✓ Asymmetric compositions for interest
|
|
533
|
+
```
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
|
|
2
|
+
# Picking The Right Library
|
|
3
|
+
|
|
4
|
+
A lookup reference. When the task needs a library ("I need toasts", "what should I use for drag and drop?"), match the task to the curated list below and recommend the library. These are deliberate, taste-driven picks — don't substitute alternatives outside this list unless the user asks for one or the task genuinely isn't covered.
|
|
5
|
+
|
|
6
|
+
## How to use this
|
|
7
|
+
|
|
8
|
+
1. **Identify the task**, not the library the user named. "I need to show a dropdown" is a UI-primitives task (base-ui), even if they asked about something else.
|
|
9
|
+
2. **Check what's already installed.** Look at `package.json` first. If the project already uses a listed library, use it. If it uses a competitor (e.g. react-window instead of Virtuoso), flag the recommendation but don't churn the dependency without being asked.
|
|
10
|
+
3. **Recommend one library**, state what it's for in one sentence, and install/wire it up if that's part of the request. Don't present a menu of options when the list has a clear answer.
|
|
11
|
+
4. If the task isn't covered by the list, say so explicitly and recommend from your own knowledge — but be clear you've left the curated list.
|
|
12
|
+
|
|
13
|
+
## The list
|
|
14
|
+
|
|
15
|
+
### UI components & primitives
|
|
16
|
+
|
|
17
|
+
| Task | Library |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| Unstyled, accessible UI components (dialogs, popovers, menus, selects…) | [base-ui](https://base-ui.com) |
|
|
20
|
+
| Command menus (⌘K palettes) | [cmdk](https://cmdk.paco.me) |
|
|
21
|
+
| Toasts / notifications | [Sonner](https://sonner.emilkowal.ski) — usage guide in [sonner.md](sonner.md) |
|
|
22
|
+
| One-time password / verification code inputs | [input-otp](https://input-otp.rodz.dev) |
|
|
23
|
+
| Customizable GUIs / control panels | [Leva](https://github.com/pmndrs/leva) — [dialkit](https://joshpuckett.me/dialkit) is an alternative |
|
|
24
|
+
|
|
25
|
+
### Motion & visuals
|
|
26
|
+
|
|
27
|
+
| Task | Library |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| General-purpose animation (springs, layout animations, enter/exit) | [motion](https://motion.dev) (Framer Motion) |
|
|
30
|
+
| Animating numbers (counters, prices, stats) | [NumberFlow](https://number-flow.barvian.me) |
|
|
31
|
+
| Animated text components | [torph](https://torph.lochie.me/) |
|
|
32
|
+
| 3D globes | [Cobe](https://cobe.vercel.app) |
|
|
33
|
+
| Dynamic OG images (HTML/CSS → SVG/PNG) | [Satori](https://github.com/vercel/satori) |
|
|
34
|
+
| Syntax highlighting | [shiki](https://shiki.style) |
|
|
35
|
+
|
|
36
|
+
Reach for motion when you need springs, layout animations, exit animations, or gesture-driven values. A simple hover or fade doesn't need it — plain CSS transitions are the right tool there.
|
|
37
|
+
|
|
38
|
+
### Charts
|
|
39
|
+
|
|
40
|
+
| Task | Library |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| Real-time / streaming charts | [Liveline](https://github.com/benjitaylor/liveline) |
|
|
43
|
+
| General charts (static or interactive dashboards) | [recharts](https://recharts.org) |
|
|
44
|
+
|
|
45
|
+
The split: if data points arrive live and the chart scrolls with time, use Liveline. Everything else is recharts.
|
|
46
|
+
|
|
47
|
+
### Interaction & performance
|
|
48
|
+
|
|
49
|
+
| Task | Library |
|
|
50
|
+
| --- | --- |
|
|
51
|
+
| Drag and drop | [dnd kit](https://dndkit.com) |
|
|
52
|
+
| Virtualization (long lists, large tables) | [Virtuoso](https://virtuoso.dev) |
|
|
53
|
+
|
|
54
|
+
### State & styling
|
|
55
|
+
|
|
56
|
+
| Task | Library |
|
|
57
|
+
| --- | --- |
|
|
58
|
+
| State management | [zustand](https://zustand.docs.pmnd.rs) |
|
|
59
|
+
| Constructing `className` strings conditionally | [clsx](https://github.com/lukeed/clsx) |
|
|
60
|
+
| Type-safe, variant-driven styling for Tailwind | [cva](https://cva.style) |
|
|
61
|
+
| Theme switching / dark mode (no flash on load) | [next-themes](https://github.com/pacocoursey/next-themes) |
|
|
62
|
+
|
|
63
|
+
The styling split: clsx for ad-hoc conditional classes; cva when a component has real variants (size, intent, state) that deserve a typed API. They compose — cva uses clsx-style inputs internally.
|
|
64
|
+
|
|
65
|
+
## Common mismatches to catch
|
|
66
|
+
|
|
67
|
+
- **Toasts built by hand or with a modal library** → Sonner exists for exactly this.
|
|
68
|
+
- **A `<div>`-based dropdown/dialog with manual focus handling** → base-ui, which handles accessibility, focus trapping, and dismissal.
|
|
69
|
+
- **Animating a number by re-rendering text** → NumberFlow handles digit transitions properly.
|
|
70
|
+
- **Rendering a 1,000+ row list directly** → Virtuoso before reaching for pagination hacks.
|
|
71
|
+
- **A `useState`-per-component web of props for shared state** → zustand.
|
|
72
|
+
- **Template-literal className ternaries three conditions deep** → clsx (or cva if it's variant-shaped).
|