@nimblegiant/stilts 0.2.0-alpha.3 → 0.2.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,16 +1,21 @@
1
- # 🦒 Stilts Design System
1
+ # Stilts Design System
2
2
 
3
- Nimble Giant's whimsical yet disciplined design system - a collection of reusable React components and design tokens built for flexibility and delight.
3
+ [![npm version](https://img.shields.io/npm/v/@nimblegiant/stilts)](https://www.npmjs.com/package/@nimblegiant/stilts)
4
+ [![license](https://img.shields.io/npm/l/@nimblegiant/stilts)](./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 extracted from Nimble Giant's website. It provides:
10
+ Stilts is a framework-agnostic design system built with React, TypeScript, and Tailwind CSS. It provides:
8
11
 
9
- - 10 production-ready React components
10
- - Comprehensive design tokens (colors, spacing, typography, animations)
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 team={teamMembers} />
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, animations } from '@nimblegiant/stilts/tokens';
63
+ import { colors, spacing, durations, easings } from '@nimblegiant/stilts/tokens';
57
64
 
58
- const primaryColor = colors.primary.DEFAULT; // '#02aec2'
59
- const space4 = spacing[4]; // '1rem'
60
- const springEasing = animations.easings.spring; // 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'
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 Components
72
+ ### Layout (2)
66
73
 
67
74
  #### MainNav
68
- Responsive navigation with theme toggle and mobile menu.
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
- ### UI Components
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
- Global toast notification system.
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
- // Component usage
110
+ // Mount the container
85
111
  <Toast />
86
112
 
87
- // Programmatic usage (global)
113
+ // Trigger from anywhere
88
114
  window.showToast({
89
115
  type: 'success',
90
- title: 'Success!',
116
+ title: 'Saved',
91
117
  message: 'Your changes have been saved.',
92
118
  duration: 3000
93
119
  });
94
120
  ```
95
121
 
96
- ### Pattern Components
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
- Simple hero section with optional background image.
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
- Full-screen hero with video background and service cards.
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
- tagline="Digital Solutions"
166
+ eyebrow="Digital Solutions"
123
167
  description="We build products that scale"
124
- cards={serviceCards}
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
- Display team members in a responsive grid.
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
- team={[
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
- Service features section with grid layout.
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={featuresList}
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
- Horizontal or vertical process timeline.
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: "Step 1", description: "First step" },
171
- { title: "Step 2", description: "Second step" }
248
+ { title: "Discovery", description: "Understanding the problem" },
249
+ { title: "Design", description: "Creating the solution" }
172
250
  ]}
173
- orientation="horizontal"
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
- Statistics display bar.
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
- Industry showcase grid.
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
- { name: "Healthcare", icon: "🏥" },
200
- { name: "Finance", icon: "💰" }
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
- MDX content page wrapper.
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
- colors.primary.DEFAULT // '#02aec2'
225
- colors.primary[500] // Shade variants
226
- colors.accent.violet // Brand accents
227
- colors.semantic.success // Semantic colors
228
- colors.gray[500] // Neutral scale
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[4] // '1rem' (16px)
237
- spacing[8] // '2rem' (32px)
238
- spacing[16] // '4rem' (64px)
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
- durations.fast // '100ms'
247
- durations.normal // '200ms'
248
- easings.spring // Bouncy easing
249
- easings.smooth // Smooth easing
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
- ## Tailwind CSS Integration
882
+ ### TypeScript Types
253
883
 
254
- Stilts works seamlessly with Tailwind CSS. The design system uses CSS variables that can be integrated into your Tailwind configuration.
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 pure React components with no framework-specific dependencies. They work with:
917
+ Stilts components are React components with no framework-specific dependencies. They work with:
296
918
 
297
- - **React**
298
- - **Next.js**
299
- - **Astro** (with @astrojs/react)
300
- - **Gatsby**
301
- - **Remix**
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
- ## Browser Support
926
+ Components that accept a `LinkComponent` prop (CTAButton, ProductCard) can integrate with framework-specific routers.
305
927
 
306
- Stilts supports all modern browsers:
928
+ ## Browser Support
307
929
 
308
- - Chrome (last 2 versions)
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
- ### Type Check
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/ # Built files
339
- │ ├── index.js # ESM bundle
340
- │ ├── index.cjs # CommonJS bundle
341
- └── index.d.ts # TypeScript definitions
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/ # React components
344
- │ ├── styles/ # CSS design tokens
345
- │ ├── tokens/ # TypeScript tokens
346
- └── types/ # Shared types
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
- ## License
965
+ ## Changelog
351
966
 
352
- MIT © Nimble Giant
967
+ See [CHANGELOG.md](./CHANGELOG.md) for release history.
353
968
 
354
969
  ## Contributing
355
970
 
356
- This package is currently maintained internally by Nimble Giant. For questions or issues, please contact the team.
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
- - [Nimble Giant Website](https://nimble-giant.com)
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)