@nimblegiant/stilts 0.2.0-alpha.3 → 0.2.0-alpha.5
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 +734 -107
- package/dist/index.cjs +125 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +56 -5
- package/dist/index.d.ts +56 -5
- package/dist/index.js +124 -13
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/components/layout/MainNav.tsx +39 -18
- package/src/components/patterns/ContentPage.tsx +15 -6
- package/src/components/patterns/ListCard.tsx +136 -0
- package/src/components/patterns/index.ts +26 -20
- package/src/components/ui/AuthorMeta.tsx +44 -0
- package/src/components/ui/index.ts +3 -1
package/README.md
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Stilts Design System
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@nimblegiant/stilts)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
|
|
6
|
+
Nimble Giant's whimsical yet disciplined design system — a collection of reusable React components and design tokens built for flexibility and delight.
|
|
4
7
|
|
|
5
8
|
## Overview
|
|
6
9
|
|
|
7
|
-
Stilts is a framework-agnostic design system
|
|
10
|
+
Stilts is a framework-agnostic design system built with React, TypeScript, and Tailwind CSS. It provides:
|
|
8
11
|
|
|
9
|
-
-
|
|
10
|
-
- Comprehensive design tokens (colors, spacing,
|
|
11
|
-
- Full TypeScript support
|
|
12
|
+
- 32 production-ready React components across 4 categories
|
|
13
|
+
- Comprehensive design tokens (colors, spacing, animations)
|
|
14
|
+
- Full TypeScript support with exported types
|
|
12
15
|
- Tree-shakable ESM and CJS builds
|
|
13
|
-
- Tailwind CSS integration
|
|
16
|
+
- Tailwind CSS 4 integration
|
|
17
|
+
|
|
18
|
+
**See it in action:** [nimble-giant.com](https://nimble-giant.com)
|
|
14
19
|
|
|
15
20
|
## Installation
|
|
16
21
|
|
|
@@ -22,6 +27,8 @@ bun add @nimblegiant/stilts
|
|
|
22
27
|
yarn add @nimblegiant/stilts
|
|
23
28
|
```
|
|
24
29
|
|
|
30
|
+
**Peer dependencies:** React 18+ and React DOM 18+. Tailwind CSS 4.1+ is optional.
|
|
31
|
+
|
|
25
32
|
## Quick Start
|
|
26
33
|
|
|
27
34
|
### 1. Import Styles
|
|
@@ -44,7 +51,7 @@ function App() {
|
|
|
44
51
|
subtitle="A whimsical yet disciplined design system"
|
|
45
52
|
align="center"
|
|
46
53
|
/>
|
|
47
|
-
<TeamGrid
|
|
54
|
+
<TeamGrid members={teamMembers} />
|
|
48
55
|
</>
|
|
49
56
|
);
|
|
50
57
|
}
|
|
@@ -53,19 +60,20 @@ function App() {
|
|
|
53
60
|
### 3. Access Design Tokens
|
|
54
61
|
|
|
55
62
|
```typescript
|
|
56
|
-
import { colors, spacing,
|
|
63
|
+
import { colors, spacing, durations, easings } from '@nimblegiant/stilts/tokens';
|
|
57
64
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
65
|
+
colors.primary.DEFAULT // '#02aec2'
|
|
66
|
+
spacing[4] // '1rem'
|
|
67
|
+
easings.spring // 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'
|
|
61
68
|
```
|
|
62
69
|
|
|
63
70
|
## Components
|
|
64
71
|
|
|
65
|
-
### Layout
|
|
72
|
+
### Layout (2)
|
|
66
73
|
|
|
67
74
|
#### MainNav
|
|
68
|
-
|
|
75
|
+
|
|
76
|
+
Responsive navigation with theme toggle, mobile menu, and active link indicator.
|
|
69
77
|
|
|
70
78
|
```tsx
|
|
71
79
|
import { MainNav } from '@nimblegiant/stilts';
|
|
@@ -73,30 +81,56 @@ import { MainNav } from '@nimblegiant/stilts';
|
|
|
73
81
|
<MainNav currentPath="/about" isPortfolioPage={false} />
|
|
74
82
|
```
|
|
75
83
|
|
|
76
|
-
|
|
84
|
+
| Prop | Type | Default | Description |
|
|
85
|
+
|------|------|---------|-------------|
|
|
86
|
+
| `currentPath` | `string` | required | Current page path for active link highlighting |
|
|
87
|
+
| `isPortfolioPage` | `boolean` | `false` | Light text mode for dark backgrounds |
|
|
88
|
+
|
|
89
|
+
#### TopBanner
|
|
90
|
+
|
|
91
|
+
Dismissible announcement banner with gradient background. Persists dismissal state in session storage.
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
import { TopBanner } from '@nimblegiant/stilts';
|
|
95
|
+
|
|
96
|
+
<TopBanner />
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
No props — self-contained component.
|
|
100
|
+
|
|
101
|
+
### UI (1)
|
|
77
102
|
|
|
78
103
|
#### Toast
|
|
79
|
-
|
|
104
|
+
|
|
105
|
+
Global toast notification system with four types and auto-dismissal.
|
|
80
106
|
|
|
81
107
|
```tsx
|
|
82
108
|
import { Toast } from '@nimblegiant/stilts';
|
|
83
109
|
|
|
84
|
-
//
|
|
110
|
+
// Mount the container
|
|
85
111
|
<Toast />
|
|
86
112
|
|
|
87
|
-
//
|
|
113
|
+
// Trigger from anywhere
|
|
88
114
|
window.showToast({
|
|
89
115
|
type: 'success',
|
|
90
|
-
title: '
|
|
116
|
+
title: 'Saved',
|
|
91
117
|
message: 'Your changes have been saved.',
|
|
92
118
|
duration: 3000
|
|
93
119
|
});
|
|
94
120
|
```
|
|
95
121
|
|
|
96
|
-
|
|
122
|
+
| Prop (via `showToast`) | Type | Default | Description |
|
|
123
|
+
|------|------|---------|-------------|
|
|
124
|
+
| `type` | `"success" \| "error" \| "info" \| "warning"` | `"info"` | Toast variant |
|
|
125
|
+
| `title` | `string` | — | Bold heading |
|
|
126
|
+
| `message` | `string` | — | Body text |
|
|
127
|
+
| `duration` | `number` | `5000` | Auto-dismiss ms (0 = never) |
|
|
128
|
+
|
|
129
|
+
### Patterns (14)
|
|
97
130
|
|
|
98
131
|
#### PageHero
|
|
99
|
-
|
|
132
|
+
|
|
133
|
+
Hero section with animated entrance, optional background image, and eyebrow text.
|
|
100
134
|
|
|
101
135
|
```tsx
|
|
102
136
|
import { PageHero } from '@nimblegiant/stilts';
|
|
@@ -111,28 +145,54 @@ import { PageHero } from '@nimblegiant/stilts';
|
|
|
111
145
|
/>
|
|
112
146
|
```
|
|
113
147
|
|
|
148
|
+
| Prop | Type | Default | Description |
|
|
149
|
+
|------|------|---------|-------------|
|
|
150
|
+
| `title` | `string` | required | Main heading |
|
|
151
|
+
| `subtitle` | `string` | — | Secondary heading |
|
|
152
|
+
| `description` | `string` | — | Body text |
|
|
153
|
+
| `eyebrow` | `string` | — | Label above title with gradient |
|
|
154
|
+
| `backgroundImage` | `string` | — | Background image URL (25% opacity) |
|
|
155
|
+
| `align` | `"left" \| "center" \| "right"` | `"left"` | Layout alignment |
|
|
156
|
+
|
|
114
157
|
#### VideoHero
|
|
115
|
-
|
|
158
|
+
|
|
159
|
+
Full-screen hero with video background and optional service cards grid.
|
|
116
160
|
|
|
117
161
|
```tsx
|
|
118
162
|
import { VideoHero } from '@nimblegiant/stilts';
|
|
119
163
|
|
|
120
164
|
<VideoHero
|
|
121
165
|
title="Transform Your Business"
|
|
122
|
-
|
|
166
|
+
eyebrow="Digital Solutions"
|
|
123
167
|
description="We build products that scale"
|
|
124
|
-
|
|
168
|
+
videoSrc="/hero.mp4"
|
|
169
|
+
serviceCards={[
|
|
170
|
+
{ href: "/services", icon: svgString, title: "Development", description: "..." }
|
|
171
|
+
]}
|
|
125
172
|
/>
|
|
126
173
|
```
|
|
127
174
|
|
|
175
|
+
| Prop | Type | Default | Description |
|
|
176
|
+
|------|------|---------|-------------|
|
|
177
|
+
| `videoSrc` | `string` | — | MP4 video source |
|
|
178
|
+
| `fallbackImage` | `string` | — | Fallback if video fails |
|
|
179
|
+
| `title` | `string` | — | Main heading |
|
|
180
|
+
| `eyebrow` | `string` | — | Label above title |
|
|
181
|
+
| `subtitle` | `string` | — | Secondary heading |
|
|
182
|
+
| `description` | `string` | — | Body text |
|
|
183
|
+
| `serviceCards` | `ServiceCard[]` | `[]` | Cards with href, icon, title, description |
|
|
184
|
+
| `showScrollIndicator` | `boolean` | `true` | Animated scroll arrow |
|
|
185
|
+
| `scrollTarget` | `string` | `"#work"` | Scroll target anchor |
|
|
186
|
+
|
|
128
187
|
#### TeamGrid
|
|
129
|
-
|
|
188
|
+
|
|
189
|
+
Responsive team member grid with social links and hover effects.
|
|
130
190
|
|
|
131
191
|
```tsx
|
|
132
192
|
import { TeamGrid } from '@nimblegiant/stilts';
|
|
133
193
|
|
|
134
194
|
<TeamGrid
|
|
135
|
-
|
|
195
|
+
members={[
|
|
136
196
|
{
|
|
137
197
|
name: "Jane Doe",
|
|
138
198
|
role: "Engineering",
|
|
@@ -142,11 +202,19 @@ import { TeamGrid } from '@nimblegiant/stilts';
|
|
|
142
202
|
linkedin: "https://linkedin.com/in/jane"
|
|
143
203
|
}
|
|
144
204
|
]}
|
|
205
|
+
cols={3}
|
|
145
206
|
/>
|
|
146
207
|
```
|
|
147
208
|
|
|
209
|
+
| Prop | Type | Default | Description |
|
|
210
|
+
|------|------|---------|-------------|
|
|
211
|
+
| `members` | `TeamMember[]` | required | Array of team members |
|
|
212
|
+
| `cols` | `2 \| 3 \| 4` | `3` | Grid columns |
|
|
213
|
+
| `title` | `string` | — | Section title |
|
|
214
|
+
|
|
148
215
|
#### ServiceSection
|
|
149
|
-
|
|
216
|
+
|
|
217
|
+
Feature grid section with title and description.
|
|
150
218
|
|
|
151
219
|
```tsx
|
|
152
220
|
import { ServiceSection } from '@nimblegiant/stilts';
|
|
@@ -155,65 +223,594 @@ import { ServiceSection } from '@nimblegiant/stilts';
|
|
|
155
223
|
id="services"
|
|
156
224
|
title="Our Services"
|
|
157
225
|
description="What we offer"
|
|
158
|
-
features={
|
|
226
|
+
features={[
|
|
227
|
+
{ title: "Development", description: "Full-stack web development" }
|
|
228
|
+
]}
|
|
159
229
|
/>
|
|
160
230
|
```
|
|
161
231
|
|
|
232
|
+
| Prop | Type | Default | Description |
|
|
233
|
+
|------|------|---------|-------------|
|
|
234
|
+
| `id` | `string` | required | Section ID |
|
|
235
|
+
| `title` | `string` | required | Section heading |
|
|
236
|
+
| `description` | `string` | required | Section description |
|
|
237
|
+
| `features` | `Feature[]` | required | Array with title and description |
|
|
238
|
+
|
|
162
239
|
#### ProcessSteps
|
|
163
|
-
|
|
240
|
+
|
|
241
|
+
Process timeline in horizontal or vertical layout.
|
|
164
242
|
|
|
165
243
|
```tsx
|
|
166
244
|
import { ProcessSteps } from '@nimblegiant/stilts';
|
|
167
245
|
|
|
168
246
|
<ProcessSteps
|
|
169
247
|
steps={[
|
|
170
|
-
{ title: "
|
|
171
|
-
{ title: "
|
|
248
|
+
{ title: "Discovery", description: "Understanding the problem" },
|
|
249
|
+
{ title: "Design", description: "Creating the solution" }
|
|
172
250
|
]}
|
|
173
|
-
|
|
251
|
+
variant="horizontal"
|
|
174
252
|
/>
|
|
175
253
|
```
|
|
176
254
|
|
|
255
|
+
| Prop | Type | Default | Description |
|
|
256
|
+
|------|------|---------|-------------|
|
|
257
|
+
| `steps` | `Step[]` | required | Steps with title, description, optional number |
|
|
258
|
+
| `title` | `string` | — | Section title |
|
|
259
|
+
| `variant` | `"horizontal" \| "vertical"` | `"horizontal"` | Layout direction |
|
|
260
|
+
| `background` | `"default" \| "muted"` | `"muted"` | Background style |
|
|
261
|
+
|
|
177
262
|
#### StatBar
|
|
178
|
-
|
|
263
|
+
|
|
264
|
+
Statistics display with large numbers, optional prefix/suffix.
|
|
179
265
|
|
|
180
266
|
```tsx
|
|
181
267
|
import { StatBar } from '@nimblegiant/stilts';
|
|
182
268
|
|
|
183
269
|
<StatBar
|
|
184
270
|
stats={[
|
|
185
|
-
{ value: "100+", label: "Projects" },
|
|
186
|
-
{ value: "50+", label: "Clients" }
|
|
271
|
+
{ value: "100", suffix: "+", label: "Projects" },
|
|
272
|
+
{ value: "50", suffix: "+", label: "Clients" }
|
|
187
273
|
]}
|
|
188
274
|
/>
|
|
189
275
|
```
|
|
190
276
|
|
|
277
|
+
| Prop | Type | Default | Description |
|
|
278
|
+
|------|------|---------|-------------|
|
|
279
|
+
| `stats` | `StatData[]` | required | Stats with value, label, optional prefix/suffix |
|
|
280
|
+
| `title` | `string` | — | Section title |
|
|
281
|
+
| `description` | `string \| string[]` | — | Description text(s) |
|
|
282
|
+
| `centered` | `boolean` | `true` | Center alignment |
|
|
283
|
+
| `background` | `"default" \| "muted"` | `"muted"` | Background style |
|
|
284
|
+
|
|
191
285
|
#### IndustryGrid
|
|
192
|
-
|
|
286
|
+
|
|
287
|
+
Industry card grid layout.
|
|
193
288
|
|
|
194
289
|
```tsx
|
|
195
290
|
import { IndustryGrid } from '@nimblegiant/stilts';
|
|
196
291
|
|
|
197
292
|
<IndustryGrid
|
|
198
293
|
industries={[
|
|
199
|
-
{
|
|
200
|
-
{
|
|
294
|
+
{ title: "Healthcare", description: "Digital health solutions" },
|
|
295
|
+
{ title: "Finance", description: "Fintech products" }
|
|
201
296
|
]}
|
|
297
|
+
cols={3}
|
|
202
298
|
/>
|
|
203
299
|
```
|
|
204
300
|
|
|
301
|
+
| Prop | Type | Default | Description |
|
|
302
|
+
|------|------|---------|-------------|
|
|
303
|
+
| `industries` | `Industry[]` | required | Array with title and description |
|
|
304
|
+
| `title` | `string` | — | Section title |
|
|
305
|
+
| `cols` | `2 \| 3` | `3` | Grid columns |
|
|
306
|
+
|
|
205
307
|
#### ContentPage
|
|
206
|
-
|
|
308
|
+
|
|
309
|
+
Page wrapper for MDX/prose content with metadata.
|
|
207
310
|
|
|
208
311
|
```tsx
|
|
209
312
|
import { ContentPage } from '@nimblegiant/stilts';
|
|
210
313
|
|
|
211
|
-
<ContentPage>
|
|
212
|
-
<h1>Page Title</h1>
|
|
314
|
+
<ContentPage title="Privacy Policy" subtitle="Legal" lastUpdated="Jan 15, 2024">
|
|
213
315
|
<p>Content goes here...</p>
|
|
214
316
|
</ContentPage>
|
|
215
317
|
```
|
|
216
318
|
|
|
319
|
+
| Prop | Type | Default | Description |
|
|
320
|
+
|------|------|---------|-------------|
|
|
321
|
+
| `title` | `string` | required | Page heading |
|
|
322
|
+
| `subtitle` | `string` | — | Secondary heading |
|
|
323
|
+
| `lastUpdated` | `string` | — | Update timestamp |
|
|
324
|
+
| `children` | `ReactNode` | required | Page content |
|
|
325
|
+
|
|
326
|
+
#### TerminalWindow
|
|
327
|
+
|
|
328
|
+
Animated terminal with typewriter effect, triggered on viewport entry.
|
|
329
|
+
|
|
330
|
+
```tsx
|
|
331
|
+
import { TerminalWindow } from '@nimblegiant/stilts';
|
|
332
|
+
|
|
333
|
+
<TerminalWindow
|
|
334
|
+
filename="getting-started"
|
|
335
|
+
lines={[
|
|
336
|
+
{ text: "npm install @nimblegiant/stilts", type: "command" },
|
|
337
|
+
{ text: "added 1 package", type: "success" },
|
|
338
|
+
{ text: "Ready to build!", type: "highlight" }
|
|
339
|
+
]}
|
|
340
|
+
/>
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
| Prop | Type | Default | Description |
|
|
344
|
+
|------|------|---------|-------------|
|
|
345
|
+
| `lines` | `TerminalLine[]` | required | Lines with text, type, optional delay |
|
|
346
|
+
| `filename` | `string` | `"terminal"` | Title bar text |
|
|
347
|
+
| `typingSpeed` | `number` | `20` | Typing speed (ms per char) |
|
|
348
|
+
| `initialDelay` | `number` | `800` | Delay before animation starts (ms) |
|
|
349
|
+
| `title` | `string` | — | Heading above terminal |
|
|
350
|
+
|
|
351
|
+
Line types: `"command"`, `"output"`, `"highlight"`, `"success"`, `"muted"`
|
|
352
|
+
|
|
353
|
+
#### TerminalChrome
|
|
354
|
+
|
|
355
|
+
Terminal window frame without animation — for wrapping custom content.
|
|
356
|
+
|
|
357
|
+
```tsx
|
|
358
|
+
import { TerminalChrome } from '@nimblegiant/stilts';
|
|
359
|
+
|
|
360
|
+
<TerminalChrome filename="example.tsx">
|
|
361
|
+
<pre><code>const hello = "world";</code></pre>
|
|
362
|
+
</TerminalChrome>
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
| Prop | Type | Default | Description |
|
|
366
|
+
|------|------|---------|-------------|
|
|
367
|
+
| `filename` | `string` | — | Title bar text |
|
|
368
|
+
| `children` | `ReactNode` | required | Content inside the frame |
|
|
369
|
+
| `footer` | `ReactNode` | — | Optional footer element |
|
|
370
|
+
|
|
371
|
+
#### TerminalHero
|
|
372
|
+
|
|
373
|
+
Two-column hero with profile image in terminal frame, typewriter animation, and CTA buttons.
|
|
374
|
+
|
|
375
|
+
```tsx
|
|
376
|
+
import { TerminalHero } from '@nimblegiant/stilts';
|
|
377
|
+
|
|
378
|
+
<TerminalHero
|
|
379
|
+
greeting="Hello, World."
|
|
380
|
+
name="Jane Doe"
|
|
381
|
+
tagline="Engineer + Designer"
|
|
382
|
+
terminalText="Building great products..."
|
|
383
|
+
button1={{ text: "View Work", href: "/projects" }}
|
|
384
|
+
button2={{ text: "Contact", href: "/contact" }}
|
|
385
|
+
image={{ src: "/profile.jpg", alt: "Jane Doe" }}
|
|
386
|
+
/>
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
| Prop | Type | Default | Description |
|
|
390
|
+
|------|------|---------|-------------|
|
|
391
|
+
| `greeting` | `string` | `"Hello, World."` | Status badge text |
|
|
392
|
+
| `name` | `string` | — | Large gradient heading |
|
|
393
|
+
| `tagline` | `string` | — | Subheading |
|
|
394
|
+
| `terminalText` | `string` | `""` | Typewriter animation text |
|
|
395
|
+
| `button1` | `{ text, href }` | — | Primary CTA |
|
|
396
|
+
| `button2` | `{ text, href }` | — | Secondary CTA |
|
|
397
|
+
| `image` | `{ src, alt, height?, width? }` | — | Profile image |
|
|
398
|
+
|
|
399
|
+
#### CTAButton
|
|
400
|
+
|
|
401
|
+
Call-to-action button with three variants and framework-agnostic link support.
|
|
402
|
+
|
|
403
|
+
```tsx
|
|
404
|
+
import { CTAButton } from '@nimblegiant/stilts';
|
|
405
|
+
|
|
406
|
+
<CTAButton href="/contact" variant="primary">
|
|
407
|
+
Get in Touch
|
|
408
|
+
</CTAButton>
|
|
409
|
+
|
|
410
|
+
// With a framework link component (e.g., Next.js)
|
|
411
|
+
<CTAButton href="/about" LinkComponent={Link}>
|
|
412
|
+
Learn More
|
|
413
|
+
</CTAButton>
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
| Prop | Type | Default | Description |
|
|
417
|
+
|------|------|---------|-------------|
|
|
418
|
+
| `href` | `string` | required | Link destination |
|
|
419
|
+
| `children` | `ReactNode` | required | Button label |
|
|
420
|
+
| `variant` | `"primary" \| "secondary" \| "outline"` | `"primary"` | Visual style |
|
|
421
|
+
| `external` | `boolean` | `false` | Opens in new tab |
|
|
422
|
+
| `icon` | `"arrow" \| "external" \| "none"` | `"arrow"` | Trailing icon |
|
|
423
|
+
| `LinkComponent` | `ElementType` | `"a"` | Custom link element |
|
|
424
|
+
|
|
425
|
+
#### ProductCard
|
|
426
|
+
|
|
427
|
+
Product listing card with thumbnail, tags, and hover effects.
|
|
428
|
+
|
|
429
|
+
```tsx
|
|
430
|
+
import { ProductCard } from '@nimblegiant/stilts';
|
|
431
|
+
|
|
432
|
+
<ProductCard
|
|
433
|
+
name="My Product"
|
|
434
|
+
tagline="A great product"
|
|
435
|
+
description="Description of the product..."
|
|
436
|
+
thumbnail="/products/thumb.jpg"
|
|
437
|
+
href="/products/my-product"
|
|
438
|
+
tags={["React", "TypeScript"]}
|
|
439
|
+
/>
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
| Prop | Type | Default | Description |
|
|
443
|
+
|------|------|---------|-------------|
|
|
444
|
+
| `name` | `string` | required | Product name |
|
|
445
|
+
| `tagline` | `string` | required | Short tagline |
|
|
446
|
+
| `description` | `string` | required | Product description |
|
|
447
|
+
| `thumbnail` | `string` | required | Image URL |
|
|
448
|
+
| `href` | `string` | required | Link destination |
|
|
449
|
+
| `tags` | `string[]` | required | Category tags |
|
|
450
|
+
| `LinkComponent` | `ElementType` | `"a"` | Custom link element |
|
|
451
|
+
|
|
452
|
+
#### CodeBlock
|
|
453
|
+
|
|
454
|
+
Code display with syntax styling, optional line numbers, and copy-to-clipboard.
|
|
455
|
+
|
|
456
|
+
```tsx
|
|
457
|
+
import { CodeBlock } from '@nimblegiant/stilts';
|
|
458
|
+
|
|
459
|
+
<CodeBlock
|
|
460
|
+
code={`import { MainNav } from '@nimblegiant/stilts';`}
|
|
461
|
+
language="typescript"
|
|
462
|
+
filename="App.tsx"
|
|
463
|
+
showLineNumbers
|
|
464
|
+
/>
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
| Prop | Type | Default | Description |
|
|
468
|
+
|------|------|---------|-------------|
|
|
469
|
+
| `code` | `string` | required | Code content |
|
|
470
|
+
| `language` | `string` | `"bash"` | Language label |
|
|
471
|
+
| `filename` | `string` | — | Filename in header |
|
|
472
|
+
| `showLineNumbers` | `boolean` | `false` | Show line numbers |
|
|
473
|
+
|
|
474
|
+
#### FeatureShowcase
|
|
475
|
+
|
|
476
|
+
Feature grid or list with icons, title, and description.
|
|
477
|
+
|
|
478
|
+
```tsx
|
|
479
|
+
import { FeatureShowcase } from '@nimblegiant/stilts';
|
|
480
|
+
|
|
481
|
+
<FeatureShowcase
|
|
482
|
+
title="Why Stilts?"
|
|
483
|
+
subtitle="Built for real projects"
|
|
484
|
+
features={[
|
|
485
|
+
{ icon: <IconComponent />, title: "TypeScript", description: "Full type safety" },
|
|
486
|
+
{ icon: <IconComponent />, title: "Tailwind", description: "Utility-first styling" }
|
|
487
|
+
]}
|
|
488
|
+
layout="grid"
|
|
489
|
+
/>
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
| Prop | Type | Default | Description |
|
|
493
|
+
|------|------|---------|-------------|
|
|
494
|
+
| `features` | `Feature[]` | required | Features with icon (ReactNode), title, description |
|
|
495
|
+
| `title` | `string` | — | Section title |
|
|
496
|
+
| `subtitle` | `string` | — | Section subtitle |
|
|
497
|
+
| `layout` | `"grid" \| "list"` | `"grid"` | Display layout |
|
|
498
|
+
| `background` | `"default" \| "muted"` | `"default"` | Background style |
|
|
499
|
+
|
|
500
|
+
### Sections (15)
|
|
501
|
+
|
|
502
|
+
Section components are designed for building case study pages and rich content layouts. They accept structured data props and handle their own layout and styling.
|
|
503
|
+
|
|
504
|
+
#### BeforeAfter
|
|
505
|
+
|
|
506
|
+
Interactive image comparison slider with drag/touch support.
|
|
507
|
+
|
|
508
|
+
```tsx
|
|
509
|
+
import { BeforeAfter } from '@nimblegiant/stilts';
|
|
510
|
+
|
|
511
|
+
<BeforeAfter
|
|
512
|
+
data={{
|
|
513
|
+
before_image: "/before.jpg",
|
|
514
|
+
after_image: "/after.jpg",
|
|
515
|
+
title: "Redesign",
|
|
516
|
+
content: "A complete visual overhaul...",
|
|
517
|
+
before_label: "Before",
|
|
518
|
+
after_label: "After"
|
|
519
|
+
}}
|
|
520
|
+
/>
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
#### CaseStudyBreakdown
|
|
524
|
+
|
|
525
|
+
Three-column breakdown with metrics, services used, and optional results.
|
|
526
|
+
|
|
527
|
+
```tsx
|
|
528
|
+
import { CaseStudyBreakdown } from '@nimblegiant/stilts';
|
|
529
|
+
|
|
530
|
+
<CaseStudyBreakdown
|
|
531
|
+
data={{
|
|
532
|
+
title: "Project Results",
|
|
533
|
+
what_we_did: "<p>Built a new platform...</p>",
|
|
534
|
+
how_we_did_it: "<p>Using React and Node...</p>",
|
|
535
|
+
services_used: ["Development", "Design", "Strategy"],
|
|
536
|
+
metrics: [
|
|
537
|
+
{ value: "40", suffix: "%", label: "Faster", trend: "up" }
|
|
538
|
+
]
|
|
539
|
+
}}
|
|
540
|
+
/>
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
#### ContactForm
|
|
544
|
+
|
|
545
|
+
Full contact form with service selection, budget dropdown, and HubSpot integration.
|
|
546
|
+
|
|
547
|
+
```tsx
|
|
548
|
+
import { ContactForm } from '@nimblegiant/stilts';
|
|
549
|
+
|
|
550
|
+
// With HubSpot
|
|
551
|
+
<ContactForm portalId="12345" formId="abc-123" />
|
|
552
|
+
|
|
553
|
+
// With custom handler
|
|
554
|
+
<ContactForm
|
|
555
|
+
onSubmit={async (data) => { /* handle submission */ }}
|
|
556
|
+
onSuccess={(res) => { /* success callback */ }}
|
|
557
|
+
submitButtonText="Send Message"
|
|
558
|
+
/>
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
Fields: name, email, company, services (multi-select), budget (dropdown), project description.
|
|
562
|
+
|
|
563
|
+
#### CompactContactForm
|
|
564
|
+
|
|
565
|
+
Minimal inline form with name and email fields.
|
|
566
|
+
|
|
567
|
+
```tsx
|
|
568
|
+
import { CompactContactForm } from '@nimblegiant/stilts';
|
|
569
|
+
|
|
570
|
+
<CompactContactForm
|
|
571
|
+
onSubmit={async (data) => { /* { firstname, email } */ }}
|
|
572
|
+
submitButtonText="Subscribe"
|
|
573
|
+
namePlaceholder="Your Name"
|
|
574
|
+
emailPlaceholder="Your Email"
|
|
575
|
+
/>
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
#### FullWidthImage
|
|
579
|
+
|
|
580
|
+
Full-width image with optional overlay and caption.
|
|
581
|
+
|
|
582
|
+
```tsx
|
|
583
|
+
import { FullWidthImage } from '@nimblegiant/stilts';
|
|
584
|
+
|
|
585
|
+
<FullWidthImage
|
|
586
|
+
data={{
|
|
587
|
+
image: "/hero-shot.jpg",
|
|
588
|
+
alt: "Product screenshot",
|
|
589
|
+
caption: "The new dashboard in action"
|
|
590
|
+
}}
|
|
591
|
+
/>
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
#### ImageGrid
|
|
595
|
+
|
|
596
|
+
Responsive image grid with three layout options.
|
|
597
|
+
|
|
598
|
+
```tsx
|
|
599
|
+
import { ImageGrid } from '@nimblegiant/stilts';
|
|
600
|
+
|
|
601
|
+
<ImageGrid
|
|
602
|
+
data={{
|
|
603
|
+
title: "Screenshots",
|
|
604
|
+
grid_type: "2x2",
|
|
605
|
+
images: [
|
|
606
|
+
{ src: "/img1.jpg", alt: "Screenshot 1", caption: "Home page" },
|
|
607
|
+
{ src: "/img2.jpg", alt: "Screenshot 2", caption: "Dashboard" }
|
|
608
|
+
]
|
|
609
|
+
}}
|
|
610
|
+
/>
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
Grid types: `"50-50"`, `"2x2"`, `"3x3"`
|
|
614
|
+
|
|
615
|
+
#### ImageGridModal
|
|
616
|
+
|
|
617
|
+
Clickable image grid with lightbox modal, navigation arrows, and image counter.
|
|
618
|
+
|
|
619
|
+
```tsx
|
|
620
|
+
import { ImageGridModal } from '@nimblegiant/stilts';
|
|
621
|
+
|
|
622
|
+
<ImageGridModal
|
|
623
|
+
data={{
|
|
624
|
+
title: "Gallery",
|
|
625
|
+
grid_type: "mixed",
|
|
626
|
+
images: [
|
|
627
|
+
{ src: "/img1.jpg", alt: "Photo 1", layout: "landscape" },
|
|
628
|
+
{ src: "/img2.jpg", alt: "Photo 2", layout: "portrait" }
|
|
629
|
+
]
|
|
630
|
+
}}
|
|
631
|
+
/>
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
Layouts: `"landscape"`, `"portrait"`, `"square"`, `"wide"`
|
|
635
|
+
|
|
636
|
+
#### ProblemStatement
|
|
637
|
+
|
|
638
|
+
Structured challenge/background/goals breakdown with optional stakeholders.
|
|
639
|
+
|
|
640
|
+
```tsx
|
|
641
|
+
import { ProblemStatement } from '@nimblegiant/stilts';
|
|
642
|
+
|
|
643
|
+
<ProblemStatement
|
|
644
|
+
data={{
|
|
645
|
+
title: "The Challenge",
|
|
646
|
+
problem: "<p>Users were struggling with...</p>",
|
|
647
|
+
context: "<p>The existing system was built in...</p>",
|
|
648
|
+
goals: ["Improve load time by 50%", "Reduce support tickets", "Modernize the stack"],
|
|
649
|
+
stakeholders: [
|
|
650
|
+
{ role: "Product Manager", description: "Owns the roadmap" }
|
|
651
|
+
]
|
|
652
|
+
}}
|
|
653
|
+
/>
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
#### ProcessTimeline
|
|
657
|
+
|
|
658
|
+
Detailed process timeline with phases, deliverables, and duration.
|
|
659
|
+
|
|
660
|
+
```tsx
|
|
661
|
+
import { ProcessTimeline } from '@nimblegiant/stilts';
|
|
662
|
+
|
|
663
|
+
<ProcessTimeline
|
|
664
|
+
data={{
|
|
665
|
+
title: "Our Process",
|
|
666
|
+
layout: "vertical",
|
|
667
|
+
style: "cards",
|
|
668
|
+
steps: [
|
|
669
|
+
{
|
|
670
|
+
phase: "Phase 1",
|
|
671
|
+
title: "Discovery",
|
|
672
|
+
description: "Research and planning...",
|
|
673
|
+
deliverables: ["User research report", "Technical audit"],
|
|
674
|
+
duration: "2 weeks"
|
|
675
|
+
}
|
|
676
|
+
]
|
|
677
|
+
}}
|
|
678
|
+
/>
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
Layouts: `"vertical"`, `"horizontal"`. Styles: `"default"`, `"minimal"`, `"cards"`.
|
|
682
|
+
|
|
683
|
+
#### RelatedProjects
|
|
684
|
+
|
|
685
|
+
Project cards with grid, list, or carousel layout.
|
|
686
|
+
|
|
687
|
+
```tsx
|
|
688
|
+
import { RelatedProjects } from '@nimblegiant/stilts';
|
|
689
|
+
|
|
690
|
+
<RelatedProjects
|
|
691
|
+
data={{
|
|
692
|
+
title: "Related Work",
|
|
693
|
+
layout: "grid",
|
|
694
|
+
projects: ["project-slug-1", "project-slug-2"]
|
|
695
|
+
}}
|
|
696
|
+
allProjects={projectsMap}
|
|
697
|
+
/>
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
Layouts: `"grid"`, `"list"`, `"carousel"`
|
|
701
|
+
|
|
702
|
+
#### SolutionSummary
|
|
703
|
+
|
|
704
|
+
Solution overview with approach steps, key features, tech tags, and optional quote.
|
|
705
|
+
|
|
706
|
+
```tsx
|
|
707
|
+
import { SolutionSummary } from '@nimblegiant/stilts';
|
|
708
|
+
|
|
709
|
+
<SolutionSummary
|
|
710
|
+
data={{
|
|
711
|
+
title: "Our Solution",
|
|
712
|
+
overview: "<p>We built a modern platform...</p>",
|
|
713
|
+
technologies: ["React", "Node.js", "PostgreSQL"],
|
|
714
|
+
key_features: [
|
|
715
|
+
{ title: "Real-time", description: "Live updates via WebSockets" }
|
|
716
|
+
]
|
|
717
|
+
}}
|
|
718
|
+
/>
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
#### TeamCredits
|
|
722
|
+
|
|
723
|
+
Team credits section with photos, roles, and social links.
|
|
724
|
+
|
|
725
|
+
```tsx
|
|
726
|
+
import { TeamCredits } from '@nimblegiant/stilts';
|
|
727
|
+
|
|
728
|
+
<TeamCredits
|
|
729
|
+
data={{
|
|
730
|
+
title: "The Team",
|
|
731
|
+
layout: "grid",
|
|
732
|
+
members: [
|
|
733
|
+
{ name: "Jane", role: "Lead Engineer", photo: "/jane.jpg" }
|
|
734
|
+
]
|
|
735
|
+
}}
|
|
736
|
+
/>
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
Layouts: `"grid"`, `"list"`, `"carousel"`. Social links: LinkedIn, Twitter, GitHub, Dribbble, Behance.
|
|
740
|
+
|
|
741
|
+
#### Testimonial
|
|
742
|
+
|
|
743
|
+
Single featured quote or multi-testimonial grid with ratings.
|
|
744
|
+
|
|
745
|
+
```tsx
|
|
746
|
+
import { Testimonial } from '@nimblegiant/stilts';
|
|
747
|
+
|
|
748
|
+
// Single quote
|
|
749
|
+
<Testimonial
|
|
750
|
+
data={{
|
|
751
|
+
type: "testimonial",
|
|
752
|
+
title: "What They Say",
|
|
753
|
+
single_quote: {
|
|
754
|
+
text: "Stilts transformed our workflow.",
|
|
755
|
+
author: "Jane Doe",
|
|
756
|
+
title: "CTO",
|
|
757
|
+
company: "Acme Inc."
|
|
758
|
+
}
|
|
759
|
+
}}
|
|
760
|
+
/>
|
|
761
|
+
|
|
762
|
+
// Multi-testimonial grid
|
|
763
|
+
<Testimonial
|
|
764
|
+
data={{
|
|
765
|
+
type: "testimonial",
|
|
766
|
+
title: "Reviews",
|
|
767
|
+
testimonials: [
|
|
768
|
+
{ quote: "Amazing!", name: "John", rating: 5 }
|
|
769
|
+
]
|
|
770
|
+
}}
|
|
771
|
+
/>
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
#### TextBlock
|
|
775
|
+
|
|
776
|
+
Rich text section with layout options, lists, quotes, and CTA.
|
|
777
|
+
|
|
778
|
+
```tsx
|
|
779
|
+
import { TextBlock } from '@nimblegiant/stilts';
|
|
780
|
+
|
|
781
|
+
<TextBlock
|
|
782
|
+
data={{
|
|
783
|
+
type: "text_block",
|
|
784
|
+
layout: "centered",
|
|
785
|
+
title: "Our Mission",
|
|
786
|
+
content: "<p>Building tools that empower teams...</p>",
|
|
787
|
+
lists: [
|
|
788
|
+
{ title: "Values", style: "checkmarks", items: ["Quality", "Speed", "Craft"] }
|
|
789
|
+
],
|
|
790
|
+
cta: { text: "Learn More", url: "/about", style: "primary" }
|
|
791
|
+
}}
|
|
792
|
+
/>
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
Layouts: `"standard"`, `"centered"`, `"wide"`. List styles: `"bullets"`, `"checkmarks"`, `"numbered"`.
|
|
796
|
+
|
|
797
|
+
#### VideoSection
|
|
798
|
+
|
|
799
|
+
Video player with optional device frame overlay and caption.
|
|
800
|
+
|
|
801
|
+
```tsx
|
|
802
|
+
import { VideoSection } from '@nimblegiant/stilts';
|
|
803
|
+
|
|
804
|
+
<VideoSection
|
|
805
|
+
data={{
|
|
806
|
+
type: "video_hero",
|
|
807
|
+
video: "/demo.mp4",
|
|
808
|
+
title: "Product Demo",
|
|
809
|
+
content: "<p>See the platform in action.</p>"
|
|
810
|
+
}}
|
|
811
|
+
/>
|
|
812
|
+
```
|
|
813
|
+
|
|
217
814
|
## Design Tokens
|
|
218
815
|
|
|
219
816
|
### Colors
|
|
@@ -221,21 +818,42 @@ import { ContentPage } from '@nimblegiant/stilts';
|
|
|
221
818
|
```typescript
|
|
222
819
|
import { colors } from '@nimblegiant/stilts/tokens';
|
|
223
820
|
|
|
224
|
-
|
|
225
|
-
colors.primary
|
|
226
|
-
colors.
|
|
227
|
-
colors.
|
|
228
|
-
|
|
821
|
+
// Primary
|
|
822
|
+
colors.primary.DEFAULT // '#02aec2' (teal)
|
|
823
|
+
colors.primary[50] // Lightest shade
|
|
824
|
+
colors.primary[900] // Darkest shade
|
|
825
|
+
|
|
826
|
+
// Accents
|
|
827
|
+
colors.accent.warm // Warm accent palette
|
|
828
|
+
colors.accent.violet // Violet accent palette
|
|
829
|
+
colors.accent.emerald // Emerald accent palette
|
|
830
|
+
colors.accent.rose // Rose accent palette
|
|
831
|
+
|
|
832
|
+
// Semantic
|
|
833
|
+
colors.semantic.success // Green
|
|
834
|
+
colors.semantic.warning // Amber
|
|
835
|
+
colors.semantic.error // Red
|
|
836
|
+
colors.semantic.info // Blue
|
|
837
|
+
|
|
838
|
+
// Neutrals
|
|
839
|
+
colors.gray[50] // Near white
|
|
840
|
+
colors.gray[950] // Near black
|
|
229
841
|
```
|
|
230
842
|
|
|
231
843
|
### Spacing
|
|
232
844
|
|
|
845
|
+
4px base unit system with 40+ predefined sizes.
|
|
846
|
+
|
|
233
847
|
```typescript
|
|
234
848
|
import { spacing } from '@nimblegiant/stilts/tokens';
|
|
235
849
|
|
|
236
|
-
spacing
|
|
237
|
-
spacing[
|
|
238
|
-
spacing[
|
|
850
|
+
spacing.px // '1px'
|
|
851
|
+
spacing[0] // '0'
|
|
852
|
+
spacing[1] // '0.25rem' (4px)
|
|
853
|
+
spacing[4] // '1rem' (16px)
|
|
854
|
+
spacing[8] // '2rem' (32px)
|
|
855
|
+
spacing[16] // '4rem' (64px)
|
|
856
|
+
spacing[64] // '16rem' (256px)
|
|
239
857
|
```
|
|
240
858
|
|
|
241
859
|
### Animations
|
|
@@ -243,15 +861,31 @@ spacing[16] // '4rem' (64px)
|
|
|
243
861
|
```typescript
|
|
244
862
|
import { durations, easings } from '@nimblegiant/stilts/tokens';
|
|
245
863
|
|
|
246
|
-
|
|
247
|
-
durations.
|
|
248
|
-
|
|
249
|
-
|
|
864
|
+
// Durations
|
|
865
|
+
durations.instant // '0ms'
|
|
866
|
+
durations.fast // '100ms'
|
|
867
|
+
durations.normal // '200ms'
|
|
868
|
+
durations.moderate // '300ms'
|
|
869
|
+
durations.slow // '400ms'
|
|
870
|
+
durations.slower // '600ms'
|
|
871
|
+
durations.slowest // '800ms'
|
|
872
|
+
durations.glacial // '1000ms'
|
|
873
|
+
|
|
874
|
+
// Easings
|
|
875
|
+
easings.linear // 'linear'
|
|
876
|
+
easings.spring // 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'
|
|
877
|
+
easings.bounce // 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'
|
|
878
|
+
easings.smooth // 'cubic-bezier(0.4, 0, 0.2, 1)'
|
|
879
|
+
easings.snappy // 'cubic-bezier(0.2, 0, 0, 1)'
|
|
250
880
|
```
|
|
251
881
|
|
|
252
|
-
|
|
882
|
+
### TypeScript Types
|
|
253
883
|
|
|
254
|
-
|
|
884
|
+
```typescript
|
|
885
|
+
import type { ColorToken, SpacingToken, DurationToken, EasingToken } from '@nimblegiant/stilts/tokens';
|
|
886
|
+
```
|
|
887
|
+
|
|
888
|
+
## Tailwind CSS Integration
|
|
255
889
|
|
|
256
890
|
### Option 1: Use Pre-compiled CSS
|
|
257
891
|
|
|
@@ -272,90 +906,83 @@ export default {
|
|
|
272
906
|
extend: {
|
|
273
907
|
colors: {
|
|
274
908
|
primary: 'var(--color-primary)',
|
|
275
|
-
// ... map other CSS variables
|
|
276
909
|
},
|
|
277
910
|
},
|
|
278
911
|
},
|
|
279
912
|
};
|
|
280
913
|
```
|
|
281
914
|
|
|
282
|
-
## TypeScript Support
|
|
283
|
-
|
|
284
|
-
Stilts is built with TypeScript and includes full type definitions.
|
|
285
|
-
|
|
286
|
-
```typescript
|
|
287
|
-
import type { ColorToken, SpacingToken } from '@nimblegiant/stilts/tokens';
|
|
288
|
-
|
|
289
|
-
const myColor: ColorToken = colors.primary;
|
|
290
|
-
const mySpacing: SpacingToken = spacing;
|
|
291
|
-
```
|
|
292
|
-
|
|
293
915
|
## Framework Compatibility
|
|
294
916
|
|
|
295
|
-
Stilts components are
|
|
917
|
+
Stilts components are React components with no framework-specific dependencies. They work with:
|
|
296
918
|
|
|
297
|
-
- **React**
|
|
298
|
-
- **Next.js**
|
|
299
|
-
- **Astro**
|
|
300
|
-
- **
|
|
301
|
-
- **
|
|
919
|
+
- **React** — Direct usage
|
|
920
|
+
- **Next.js** — Works out of the box
|
|
921
|
+
- **Astro** — Via `@astrojs/react`
|
|
922
|
+
- **Remix** — Direct usage
|
|
923
|
+
- **Gatsby** — Direct usage
|
|
302
924
|
- Any other React-based framework
|
|
303
925
|
|
|
304
|
-
|
|
926
|
+
Components that accept a `LinkComponent` prop (CTAButton, ProductCard) can integrate with framework-specific routers.
|
|
305
927
|
|
|
306
|
-
|
|
928
|
+
## Browser Support
|
|
307
929
|
|
|
308
|
-
|
|
309
|
-
- Firefox (last 2 versions)
|
|
310
|
-
- Safari (last 2 versions)
|
|
311
|
-
- Edge (last 2 versions)
|
|
930
|
+
All modern browsers (last 2 versions): Chrome, Firefox, Safari, Edge.
|
|
312
931
|
|
|
313
932
|
## Development
|
|
314
933
|
|
|
315
|
-
### Build
|
|
316
|
-
|
|
317
934
|
```bash
|
|
318
|
-
bun install
|
|
319
|
-
bun run build
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
```bash
|
|
325
|
-
bun run typecheck
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
### Watch Mode
|
|
329
|
-
|
|
330
|
-
```bash
|
|
331
|
-
bun run dev
|
|
935
|
+
bun install # Install dependencies
|
|
936
|
+
bun run build # Build ESM + CJS bundles
|
|
937
|
+
bun run dev # Watch mode
|
|
938
|
+
bun run typecheck # Type checking
|
|
939
|
+
bun run lint # Lint source
|
|
332
940
|
```
|
|
333
941
|
|
|
334
942
|
## Package Structure
|
|
335
943
|
|
|
336
944
|
```
|
|
337
945
|
stilts/
|
|
338
|
-
├── dist/
|
|
339
|
-
│ ├── index.js
|
|
340
|
-
│ ├── index.cjs
|
|
341
|
-
│
|
|
946
|
+
├── dist/
|
|
947
|
+
│ ├── index.js # ESM bundle
|
|
948
|
+
│ ├── index.cjs # CJS bundle
|
|
949
|
+
│ ├── index.d.ts # Type definitions
|
|
950
|
+
│ ├── styles/ # CSS files
|
|
951
|
+
│ ├── tokens/ # Token bundles
|
|
952
|
+
│ └── components/ # Individual component bundles
|
|
342
953
|
├── src/
|
|
343
|
-
│ ├── components/
|
|
344
|
-
│ ├──
|
|
345
|
-
│ ├──
|
|
346
|
-
│
|
|
954
|
+
│ ├── components/
|
|
955
|
+
│ │ ├── layout/ # MainNav, TopBanner
|
|
956
|
+
│ │ ├── ui/ # Toast
|
|
957
|
+
│ │ ├── patterns/ # 14 pattern components
|
|
958
|
+
│ │ └── sections/ # 15 section components
|
|
959
|
+
│ ├── styles/ # CSS design tokens
|
|
960
|
+
│ ├── tokens/ # TypeScript token definitions
|
|
961
|
+
│ └── types/ # Shared type definitions
|
|
347
962
|
└── package.json
|
|
348
963
|
```
|
|
349
964
|
|
|
350
|
-
##
|
|
965
|
+
## Changelog
|
|
351
966
|
|
|
352
|
-
|
|
967
|
+
See [CHANGELOG.md](./CHANGELOG.md) for release history.
|
|
353
968
|
|
|
354
969
|
## Contributing
|
|
355
970
|
|
|
356
|
-
|
|
971
|
+
Stilts is open source under the MIT license. Contributions are welcome.
|
|
972
|
+
|
|
973
|
+
1. Fork the repository
|
|
974
|
+
2. Create a feature branch (`git checkout -b feat/my-feature`)
|
|
975
|
+
3. Make your changes and ensure `bun run typecheck` and `bun run build` pass
|
|
976
|
+
4. Submit a pull request
|
|
977
|
+
|
|
978
|
+
For questions or issues, please [open an issue](https://github.com/nimble-giant/giantkit/issues).
|
|
979
|
+
|
|
980
|
+
## License
|
|
981
|
+
|
|
982
|
+
MIT - see [LICENSE](./LICENSE)
|
|
357
983
|
|
|
358
984
|
## Links
|
|
359
985
|
|
|
360
|
-
- [
|
|
986
|
+
- [Live Demo](https://nimble-giant.com) — Stilts components in production
|
|
361
987
|
- [GitHub Repository](https://github.com/nimble-giant/giantkit)
|
|
988
|
+
- [npm Package](https://www.npmjs.com/package/@nimblegiant/stilts)
|