lion-make 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/components/footer/Disclosure.d.ts +3 -2
  2. package/dist/components/footer/DisclosureToggleOpen.d.ts +13 -0
  3. package/dist/components/footer/LegalLinks.d.ts +16 -0
  4. package/dist/components/footer/LinksAndSocial.d.ts +25 -0
  5. package/dist/components/header/HeaderCTA.d.ts +9 -0
  6. package/dist/components/header/HeaderLogo.d.ts +10 -0
  7. package/dist/components/header/HeaderProduct.d.ts +10 -0
  8. package/dist/components/header/HeaderSectionNavigation.d.ts +12 -0
  9. package/dist/components/header/HeaderSectionTitle.d.ts +8 -0
  10. package/dist/components/header/HeaderUnderwriter.d.ts +9 -0
  11. package/dist/components/header/TopLevelNavigation.d.ts +13 -0
  12. package/dist/components/hero/CTAHeroBlock.d.ts +24 -0
  13. package/dist/components/hero/HeroBlock.d.ts +18 -0
  14. package/dist/components/hero/MultiHero.d.ts +25 -0
  15. package/dist/components/hero/NotAvailableHeroBlock.d.ts +22 -0
  16. package/dist/index.d.ts +28 -0
  17. package/dist/lion-make.js +991 -633
  18. package/dist/lion-make.umd.cjs +10 -10
  19. package/guidelines/Guidelines.md +45 -49
  20. package/guidelines/composition/constraints.md +40 -8
  21. package/guidelines/composition/zones.md +49 -11
  22. package/guidelines/content-types/footer/anklet.md +62 -0
  23. package/guidelines/content-types/footer/compliance.md +49 -0
  24. package/guidelines/content-types/footer/disclaimers.md +48 -0
  25. package/guidelines/content-types/footer/disclosure-toggle-open.md +51 -0
  26. package/guidelines/content-types/footer/disclosures.md +50 -0
  27. package/guidelines/content-types/footer/legal-links.md +59 -0
  28. package/guidelines/content-types/footer/links-and-social.md +94 -0
  29. package/guidelines/content-types/footer/overview.md +73 -16
  30. package/guidelines/content-types/general/accordion-block.md +42 -0
  31. package/guidelines/content-types/general/all-blogs-post-block.md +52 -0
  32. package/guidelines/content-types/general/background-color-block.md +42 -0
  33. package/guidelines/content-types/general/basic-content-block.md +43 -0
  34. package/guidelines/content-types/general/body-text-copy-block.md +38 -0
  35. package/guidelines/content-types/general/content-image-block.md +37 -0
  36. package/guidelines/content-types/general/cross-sell-card-block.md +45 -0
  37. package/guidelines/content-types/general/decorative-list-block.md +40 -0
  38. package/guidelines/content-types/general/email-callout-block.md +38 -0
  39. package/guidelines/content-types/general/embedded-video-block.md +36 -0
  40. package/guidelines/content-types/general/full-size-image-with-highlight-box.md +52 -0
  41. package/guidelines/content-types/general/horizontal-rule.md +35 -0
  42. package/guidelines/content-types/general/hot-jobs-block.md +52 -0
  43. package/guidelines/content-types/general/inline-message.md +36 -0
  44. package/guidelines/content-types/general/last-chance-block.md +40 -0
  45. package/guidelines/content-types/general/multi-step-lead-form.md +60 -0
  46. package/guidelines/content-types/general/multi-testimonial.md +49 -0
  47. package/guidelines/content-types/general/opt-in.md +42 -0
  48. package/guidelines/content-types/general/overview.md +134 -24
  49. package/guidelines/content-types/general/product-block.md +43 -0
  50. package/guidelines/content-types/general/pull-quote.md +36 -0
  51. package/guidelines/content-types/general/recent-blog-posts-block.md +48 -0
  52. package/guidelines/content-types/general/resource-spotlight.md +44 -0
  53. package/guidelines/content-types/general/rtb-descriptive.md +53 -0
  54. package/guidelines/content-types/general/rtb-dynamic.md +55 -0
  55. package/guidelines/content-types/general/rtb-highlight.md +50 -0
  56. package/guidelines/content-types/general/side-menu-explorer.md +62 -0
  57. package/guidelines/content-types/general/simple-cta-block.md +44 -0
  58. package/guidelines/content-types/general/spacing-block.md +40 -0
  59. package/guidelines/content-types/general/speed-bump.md +45 -0
  60. package/guidelines/content-types/general/table-block.md +55 -0
  61. package/guidelines/content-types/general/wahfu.md +66 -0
  62. package/guidelines/content-types/header/header-cta.md +41 -0
  63. package/guidelines/content-types/header/header-logo.md +45 -0
  64. package/guidelines/content-types/header/header-product.md +45 -0
  65. package/guidelines/content-types/header/header-section-navigation.md +55 -0
  66. package/guidelines/content-types/header/header-section-title.md +43 -0
  67. package/guidelines/content-types/header/header-underwriter.md +46 -0
  68. package/guidelines/content-types/header/overview.md +61 -15
  69. package/guidelines/content-types/header/top-level-navigation.md +70 -0
  70. package/guidelines/content-types/hero/cta-hero-block.md +70 -0
  71. package/guidelines/content-types/hero/hero-block.md +56 -0
  72. package/guidelines/content-types/hero/multi-hero.md +78 -0
  73. package/guidelines/content-types/hero/not-available-hero-block.md +64 -0
  74. package/guidelines/content-types/hero/overview.md +53 -18
  75. package/guidelines/content-types/overview.md +86 -29
  76. package/guidelines/discovery.md +158 -0
  77. package/guidelines/setup.md +90 -16
  78. package/package.json +3 -3
@@ -0,0 +1,36 @@
1
+ # Inline Message
2
+
3
+ **Zone:** General — Primary Column, Sideburn, Outro.
4
+
5
+ ## Description
6
+
7
+ A contextual alert or status message placed within the content flow. Used to surface important information, warnings, or errors at the point of relevance — not as a page-wide banner.
8
+
9
+ ## Props
10
+
11
+ | Prop | Type | Required | Default | Description |
12
+ |---|---|---|---|---|
13
+ | `type` | `'info' \| 'warning' \| 'success' \| 'error'` | Yes | — | Message severity |
14
+ | `message` | `string` | Yes | — | Message body |
15
+ | `heading` | `string` | No | — | Optional bold heading |
16
+ | `dismissible` | `boolean` | No | `false` | Show a dismiss (×) button |
17
+ | `className` | `string` | No | — | Additional CSS class |
18
+
19
+ ## Usage
20
+
21
+ ```tsx
22
+ import { InlineMessage } from 'lion-make'
23
+
24
+ <InlineMessage type="warning" heading="Open enrollment closes soon" message="You have 7 days left to make changes to your coverage." dismissible />
25
+
26
+ <InlineMessage type="success" message="Your application has been submitted successfully." />
27
+ ```
28
+
29
+ ## Design Token Map
30
+
31
+ | Type | Background | Text/border color |
32
+ |---|---|---|
33
+ | `info` | `--color-teal-tint` | `--color-teal-dark` / `--color-teal` |
34
+ | `warning` | `--color-yellow-light` | `--color-yellow` |
35
+ | `success` | `--color-green-light` | `--color-green` |
36
+ | `error` | `--color-red-light` | `--color-red` |
@@ -0,0 +1,40 @@
1
+ # Last Chance Block
2
+
3
+ **Zone:** General — Primary Column, Outro only. Not valid in Sideburn.
4
+
5
+ ## Description
6
+
7
+ A high-visual-weight urgency block for enrollment deadlines or limited-time offers. Uses the blue-to-teal gradient. Use once per page maximum — high frequency dilutes impact.
8
+
9
+ ## Props
10
+
11
+ | Prop | Type | Required | Description |
12
+ |---|---|---|---|
13
+ | `heading` | `string` | Yes | Main urgency message |
14
+ | `body` | `string` | Yes | Supporting copy |
15
+ | `ctaLabel` | `string` | Yes | CTA button label |
16
+ | `ctaHref` | `string` | Yes | CTA destination |
17
+ | `deadline` | `string` | No | Deadline label (e.g., "December 7") |
18
+ | `className` | `string` | No | Additional CSS class |
19
+
20
+ ## Usage
21
+
22
+ ```tsx
23
+ import { LastChanceBlock } from 'lion-make'
24
+
25
+ <LastChanceBlock
26
+ deadline="December 7"
27
+ heading="Medicare Open Enrollment ends soon"
28
+ body="Review your plan options and make changes before the deadline."
29
+ ctaLabel="Compare plans now"
30
+ ctaHref="/medicare/compare"
31
+ />
32
+ ```
33
+
34
+ ## Design Tokens
35
+
36
+ - Background: `var(--gradient-blue-to-teal)`
37
+ - Text: `var(--color-white)`
38
+ - Heading: `var(--h1-font-size)`, `var(--font-weight-700)`
39
+ - CTA: `var(--color-white)` background, `var(--color-brand)` text
40
+ - Deadline label: uppercase, `var(--font-weight-600)`
@@ -0,0 +1,60 @@
1
+ # Multi-Step Lead Form
2
+
3
+ **Zone:** General — Primary Column, Outro only. Not valid in Sideburn.
4
+
5
+ ## Description
6
+
7
+ A guided multi-step form that breaks a long lead capture flow into smaller steps. Each step shows a subset of fields and a progress bar. Use when LeadForm would have more than 5–6 fields.
8
+
9
+ ## Props
10
+
11
+ | Prop | Type | Required | Description |
12
+ |---|---|---|---|
13
+ | `steps` | `FormStep[]` | Yes | Array of steps, each with a title and fields |
14
+ | `submitLabel` | `string` | No | Final step submit button label (default: "Submit") |
15
+ | `onSubmit` | `(data: Record<string, string>) => void` | No | Called on final step submission with all collected data |
16
+ | `mediaCode` | `string` | No | Campaign tracking code for attribution |
17
+ | `className` | `string` | No | Additional CSS class |
18
+
19
+ ### FormStep
20
+
21
+ | Prop | Type | Required | Description |
22
+ |---|---|---|---|
23
+ | `title` | `string` | Yes | Step label shown above the form |
24
+ | `fields` | `LeadFormField[]` | Yes | Fields to show on this step (same type as `LeadForm`) |
25
+
26
+ ## Usage
27
+
28
+ ```tsx
29
+ import { MultiStepLeadForm } from 'lion-make'
30
+
31
+ <MultiStepLeadForm
32
+ steps={[
33
+ {
34
+ title: 'About you',
35
+ fields: [
36
+ { name: 'firstName', label: 'First Name', type: 'text', required: true },
37
+ { name: 'lastName', label: 'Last Name', type: 'text', required: true },
38
+ { name: 'dob', label: 'Date of Birth', type: 'text', required: true },
39
+ ],
40
+ },
41
+ {
42
+ title: 'Contact info',
43
+ fields: [
44
+ { name: 'email', label: 'Email', type: 'email', required: true },
45
+ { name: 'phone', label: 'Phone', type: 'tel' },
46
+ { name: 'state', label: 'State', type: 'select', required: true, options: ['NE', 'IA', 'KS'] },
47
+ ],
48
+ },
49
+ ]}
50
+ submitLabel="Get my quote"
51
+ mediaCode="CAMP-2024-Q1"
52
+ onSubmit={(data) => submitLead(data)}
53
+ />
54
+ ```
55
+
56
+ ## Design Tokens
57
+
58
+ - Progress bar active: `var(--color-brand)`
59
+ - Progress bar inactive: `var(--color-gray-light)`
60
+ - Submit button: `var(--color-brand)` background, `var(--color-white)` text
@@ -0,0 +1,49 @@
1
+ # Multi-Testimonial
2
+
3
+ **Zone:** General — Primary Column, Outro only. Not valid in Sideburn.
4
+
5
+ ## Description
6
+
7
+ A responsive grid of customer or member testimonials. Supports optional star ratings, author photos, and role attribution. Use to build social proof near conversion points.
8
+
9
+ ## Props
10
+
11
+ | Prop | Type | Required | Description |
12
+ |---|---|---|---|
13
+ | `testimonials` | `Testimonial[]` | Yes | Array of testimonials (recommended: 2–6) |
14
+ | `heading` | `string` | No | Optional section heading |
15
+ | `className` | `string` | No | Additional CSS class |
16
+
17
+ ### Testimonial
18
+
19
+ | Prop | Type | Required | Description |
20
+ |---|---|---|---|
21
+ | `quote` | `string` | Yes | The testimonial text |
22
+ | `author` | `string` | Yes | Name of the person |
23
+ | `role` | `string` | No | Job title, location, or product context |
24
+ | `imageSrc` | `string` | No | Author photo URL |
25
+ | `imageAlt` | `string` | No | Photo alt text (defaults to author name) |
26
+ | `rating` | `1 \| 2 \| 3 \| 4 \| 5` | No | Star rating |
27
+
28
+ ## Usage
29
+
30
+ ```tsx
31
+ import { MultiTestimonial } from 'lion-make'
32
+
33
+ <MultiTestimonial
34
+ heading="What our customers say"
35
+ testimonials={[
36
+ { quote: 'Getting coverage was easier than I expected.', author: 'Sarah M.', role: 'Term Life customer', rating: 5 },
37
+ { quote: 'The price was right and the process was simple.', author: 'James T.', role: 'Whole Life customer', rating: 5 },
38
+ { quote: 'Finally found a plan that fits my budget.', author: 'Linda K.', role: 'Medicare Supplement customer', rating: 4 },
39
+ ]}
40
+ />
41
+ ```
42
+
43
+ ## Design Tokens
44
+
45
+ - Card background: `var(--color-gray-lightest)`
46
+ - Card border radius: `var(--border-radius-base)`
47
+ - Star color: `var(--color-gold)`
48
+ - Quote: italic, `var(--font-size-base)`
49
+ - Author: `var(--font-weight-600)`
@@ -0,0 +1,42 @@
1
+ # Opt-In
2
+
3
+ **Zone:** General — Primary Column, Outro only. Not valid in Sideburn.
4
+
5
+ ## Description
6
+
7
+ Email marketing opt-in block. Captures an email address with explicit consent checkbox. Distinct from `EmailCalloutBlock` (no consent) and `LeadForm` (multi-field, sales intent). Use when CAN-SPAM/TCPA compliance requires a documented opt-in.
8
+
9
+ ## Props
10
+
11
+ | Prop | Type | Required | Default | Description |
12
+ |---|---|---|---|---|
13
+ | `heading` | `string` | Yes | — | Block headline |
14
+ | `body` | `string` | No | — | Supporting copy |
15
+ | `emailLabel` | `string` | No | `'Email address'` | Field label |
16
+ | `submitLabel` | `string` | No | `'Sign me up'` | Submit button label |
17
+ | `onSubmit` | `(email: string, optedIn: boolean) => void` | No | — | Submission callback |
18
+ | `defaultChecked` | `boolean` | No | `false` | Pre-check the consent box |
19
+ | `className` | `string` | No | — | Additional CSS class |
20
+
21
+ ## Usage
22
+
23
+ ```tsx
24
+ import { OptIn } from 'lion-make'
25
+
26
+ <OptIn
27
+ heading="Get coverage tips in your inbox"
28
+ body="Monthly guidance on protecting your family — unsubscribe anytime."
29
+ submitLabel="Sign me up"
30
+ onSubmit={(email, optedIn) => { if (optedIn) subscribeToMarketing(email) }}
31
+ />
32
+ ```
33
+
34
+ ## Compliance Note
35
+
36
+ The `optedIn` boolean in the callback is the user's explicit consent. Do not add them to marketing lists if `optedIn` is `false`.
37
+
38
+ ## Design Tokens
39
+
40
+ - Submit: `var(--color-brand)` background, `var(--color-white)` text
41
+ - Input border: `var(--border-width-base)` solid `var(--color-line)`
42
+ - Consent text: `var(--h6-font-size)`, `var(--color-gray-dark)`
@@ -8,39 +8,149 @@ General content types make up the bulk of page body content. They are the most v
8
8
 
9
9
  | Content Type | Component | Primary Column | Sideburn | Outro |
10
10
  |---|---|---|---|---|
11
- | CTA | `CTA` | Yes | Yes | Yes |
12
- | Call-Out | `CallOut` | Yes | Yes | Yes |
13
- | RTBs | `RTBs` | Yes | Yes | Yes |
11
+ | Accordion Block | `AccordionBlock` | Yes | Yes | Yes |
12
+ | All Blogs Post Block | `AllBlogsPostBlock` | Yes | No | No |
13
+ | Background Color Block | `BackgroundColorBlock` | Yes | Yes | Yes |
14
+ | Basic Content Block | `BasicContentBlock` | Yes | Yes | Yes |
15
+ | Body Text Copy Block | `BodyTextCopyBlock` | Yes | Yes | Yes |
16
+ | Call-Out Block | `CallOut` | Yes | Yes | Yes |
14
17
  | Confidence Tags | `ConfidenceTags` | Yes | Yes | Yes |
18
+ | Content Image Block | `ContentImageBlock` | Yes | Yes | Yes |
19
+ | Cross-Sell Card Block | `CrossSellCardBlock` | Yes | No | Yes |
20
+ | CTA | `CTA` | Yes | Yes | Yes |
21
+ | Decorative List Block | `DecorativeListBlock` | Yes | Yes | Yes |
22
+ | Email Call-out Block | `EmailCalloutBlock` | Yes | No | Yes |
23
+ | Embedded Video Block | `EmbeddedVideoBlock` | Yes | No | Yes |
24
+ | Full Size Image with Highlight Box | `FullSizeImageWithHighlightBox` | Yes | No | No |
25
+ | Horizontal Rule | `HorizontalRule` | Yes | Yes | Yes |
26
+ | Hot Jobs Block | `HotJobsBlock` | Yes | No | Yes |
27
+ | Inline Message | `InlineMessage` | Yes | Yes | Yes |
28
+ | Last Chance Block | `LastChanceBlock` | Yes | No | Yes |
15
29
  | Lead Form | `LeadForm` | Yes | No | Yes |
30
+ | Multi-Step Lead Form | `MultiStepLeadForm` | Yes | No | Yes |
31
+ | Multi-Testimonial | `MultiTestimonial` | Yes | No | Yes |
32
+ | Opt-In | `OptIn` | Yes | No | Yes |
33
+ | Product Block | `ProductBlock` | Yes | Yes | Yes |
34
+ | Pull Quote | `PullQuote` | Yes | Yes | Yes |
35
+ | Recent Blog Posts Block | `RecentBlogPostsBlock` | Yes | No | Yes |
36
+ | Resource Spotlight | `ResourceSpotlight` | Yes | No | Yes |
16
37
  | Rich Text | `RichText` | Yes | Yes | Yes |
38
+ | RTB - Descriptive | `RTBDescriptive` | Yes | Yes | Yes |
39
+ | RTB - Dynamic | `RTBDynamic` | Yes | No | Yes |
40
+ | RTB - Highlight | `RTBHighlight` | Yes | No | Yes |
41
+ | RTBs | `RTBs` | Yes | Yes | Yes |
42
+ | Side Menu Explorer | `SideMenuExplorer` | Yes | No | No |
43
+ | Simple CTA Block | `SimpleCTABlock` | Yes | Yes | Yes |
44
+ | Spacing Block | `SpacingBlock` | Yes | Yes | Yes |
45
+ | Speed Bump | `SpeedBump` | Yes | Yes | Yes |
46
+ | Table Block | `TableBlock` | Yes | No | Yes |
47
+ | WAHFU | `WAHFU` | Yes | No | Yes |
48
+
49
+ **Sideburn column restriction:** Wide, multi-column, or form-heavy content types are not allowed in the narrow 4-col Sideburn column. Use it for compact supporting content only.
50
+
51
+ ## Decision Tree: Which general content type?
17
52
 
18
- **Note:** Lead Form is not allowed in the Sideburn column — use it in Primary Column or Outro only.
19
-
20
- ## Placement Example
21
-
22
- ```tsx
23
- import { Section, Container, CTA, RTBs } from 'lion-make'
24
-
25
- <Section zone="primary-column">
26
- <Container type="single">
27
- <RTBs items={[
28
- { heading: 'Affordable', body: 'Plans starting at $0.99 per month.' },
29
- { heading: 'No pressure', body: 'No sales calls. Cancel anytime.' },
30
- { heading: 'Real data', body: 'Actual coach contacts and roster openings.' },
31
- ]} />
32
- </Container>
33
- <Container type="single">
34
- <CTA type="button" label="Start for $0.99" href="/start" variant="primary" />
35
- </Container>
36
- </Section>
37
53
  ```
54
+ Is it a form collecting user data?
55
+ → Single-field email → EmailCalloutBlock
56
+ → Multi-field → LeadForm
57
+ → Multi-step guided → MultiStepLeadForm
58
+ → Email opt-in consent → OptIn
59
+
60
+ Is it a CTA (button/link/phone)?
61
+ → Standalone with context → SimpleCTABlock
62
+ → Pure CTA element → CTA
63
+ → Highlighted block → CallOut
64
+
65
+ Is it a value proposition list?
66
+ → Long explanatory copy → RTBDescriptive
67
+ → Stat/number callouts → RTBHighlight
68
+ → Data-driven grid → RTBDynamic
69
+ → Illustration list → RTBs
70
+
71
+ Is it a trust signal?
72
+ → Badge trio → ConfidenceTags
73
+ → Customer quotes → MultiTestimonial
74
+ → Single pull quote → PullQuote
75
+ → Empathy/support → WAHFU
76
+
77
+ Is it media content?
78
+ → Image → ContentImageBlock
79
+ → Full-width image + overlay → FullSizeImageWithHighlightBox
80
+ → Video → EmbeddedVideoBlock
81
+
82
+ Is it structured or reference content?
83
+ → Collapsible Q&A → AccordionBlock
84
+ → Tabbed explorer → SideMenuExplorer
85
+ → Data table → TableBlock
86
+ → Styled list → DecorativeListBlock
87
+
88
+ Is it a product or cross-sell?
89
+ → Single product → ProductBlock
90
+ → Multiple products → CrossSellCardBlock
91
+ → Related resource → ResourceSpotlight
92
+
93
+ Is it urgency-driven?
94
+ → Deadline/enrollment → LastChanceBlock
95
+
96
+ Is it platform-specific?
97
+ → Blog post list → AllBlogsPostBlock / RecentBlogPostsBlock
98
+ → Job listings → HotJobsBlock
99
+
100
+ Is it layout/utility?
101
+ → Vertical whitespace → SpacingBlock
102
+ → Divider → HorizontalRule
103
+ → Background color wrapper → BackgroundColorBlock
104
+ → External link warning → SpeedBump
105
+ → Body prose → BodyTextCopyBlock / RichText
106
+ ```
107
+
108
+ ## Platform-Specific Content Types
109
+
110
+ Some general content types are restricted to specific platforms:
111
+
112
+ | Content Type | Platform restriction |
113
+ |---|---|
114
+ | `AllBlogsPostBlock` | Marketing - Blog only |
115
+ | `RecentBlogPostsBlock` | Marketing - Blog only |
116
+ | `HotJobsBlock` | Marketing - Careers only |
38
117
 
39
118
  ## Files in This Section
40
119
 
41
- - [cta.md](./cta.md)
120
+ - [accordion-block.md](./accordion-block.md)
121
+ - [all-blogs-post-block.md](./all-blogs-post-block.md)
122
+ - [background-color-block.md](./background-color-block.md)
123
+ - [basic-content-block.md](./basic-content-block.md)
124
+ - [body-text-copy-block.md](./body-text-copy-block.md)
42
125
  - [callout.md](./callout.md)
43
- - [rtbs.md](./rtbs.md)
44
126
  - [confidence-tags.md](./confidence-tags.md)
127
+ - [content-image-block.md](./content-image-block.md)
128
+ - [cross-sell-card-block.md](./cross-sell-card-block.md)
129
+ - [cta.md](./cta.md)
130
+ - [decorative-list-block.md](./decorative-list-block.md)
131
+ - [email-callout-block.md](./email-callout-block.md)
132
+ - [embedded-video-block.md](./embedded-video-block.md)
133
+ - [full-size-image-with-highlight-box.md](./full-size-image-with-highlight-box.md)
134
+ - [horizontal-rule.md](./horizontal-rule.md)
135
+ - [hot-jobs-block.md](./hot-jobs-block.md)
136
+ - [inline-message.md](./inline-message.md)
137
+ - [last-chance-block.md](./last-chance-block.md)
45
138
  - [lead-form.md](./lead-form.md)
139
+ - [multi-step-lead-form.md](./multi-step-lead-form.md)
140
+ - [multi-testimonial.md](./multi-testimonial.md)
141
+ - [opt-in.md](./opt-in.md)
142
+ - [product-block.md](./product-block.md)
143
+ - [pull-quote.md](./pull-quote.md)
144
+ - [recent-blog-posts-block.md](./recent-blog-posts-block.md)
145
+ - [resource-spotlight.md](./resource-spotlight.md)
46
146
  - [rich-text.md](./rich-text.md)
147
+ - [rtb-descriptive.md](./rtb-descriptive.md)
148
+ - [rtb-dynamic.md](./rtb-dynamic.md)
149
+ - [rtb-highlight.md](./rtb-highlight.md)
150
+ - [rtbs.md](./rtbs.md)
151
+ - [side-menu-explorer.md](./side-menu-explorer.md)
152
+ - [simple-cta-block.md](./simple-cta-block.md)
153
+ - [spacing-block.md](./spacing-block.md)
154
+ - [speed-bump.md](./speed-bump.md)
155
+ - [table-block.md](./table-block.md)
156
+ - [wahfu.md](./wahfu.md)
@@ -0,0 +1,43 @@
1
+ # Product Block
2
+
3
+ **Zone:** General — Primary Column, Sideburn, Outro.
4
+
5
+ ## Description
6
+
7
+ A product feature card combining an image, heading, body description, optional badge, and CTA. Use to highlight a single product or coverage option.
8
+
9
+ ## Props
10
+
11
+ | Prop | Type | Required | Description |
12
+ |---|---|---|---|
13
+ | `heading` | `string` | Yes | Product name or title |
14
+ | `body` | `string` | Yes | Short product description |
15
+ | `imageSrc` | `string` | No | Product image URL |
16
+ | `imageAlt` | `string` | No | Image alt text |
17
+ | `badgeLabel` | `string` | No | Small badge (e.g., "Most popular", "New") |
18
+ | `ctaLabel` | `string` | No | CTA text |
19
+ | `ctaHref` | `string` | No | CTA destination |
20
+ | `className` | `string` | No | Additional CSS class |
21
+
22
+ ## Usage
23
+
24
+ ```tsx
25
+ import { ProductBlock } from 'lion-make'
26
+
27
+ <ProductBlock
28
+ imageSrc="/img/term-life.jpg"
29
+ imageAlt=""
30
+ badgeLabel="Most popular"
31
+ heading="Term Life Insurance"
32
+ body="Affordable coverage for 10, 20, or 30 years. Premiums never increase."
33
+ ctaLabel="Get a quote"
34
+ ctaHref="/term-life/quote"
35
+ />
36
+ ```
37
+
38
+ ## Design Tokens
39
+
40
+ - Border radius: `var(--border-radius-base)`
41
+ - Badge background: `var(--color-teal-opaque)`, text: `var(--color-brand)`
42
+ - Heading: `var(--h2-font-size)`, `var(--font-weight-700)`
43
+ - CTA: `var(--color-brand)` background, `var(--color-white)` text
@@ -0,0 +1,36 @@
1
+ # Pull Quote
2
+
3
+ **Zone:** General — Primary Column, Sideburn, Outro.
4
+
5
+ ## Description
6
+
7
+ A typographically prominent quote extracted from surrounding content. Used to add editorial emphasis or break up long-form copy. Attribution is optional.
8
+
9
+ ## Props
10
+
11
+ | Prop | Type | Required | Description |
12
+ |---|---|---|---|
13
+ | `quote` | `string` | Yes | The quoted text (without quotation marks — they are added by the component) |
14
+ | `attribution` | `string` | No | Name of the person being quoted |
15
+ | `role` | `string` | No | Title, role, or context for the attribution |
16
+ | `className` | `string` | No | Additional CSS class |
17
+
18
+ ## Usage
19
+
20
+ ```tsx
21
+ import { PullQuote } from 'lion-make'
22
+
23
+ <PullQuote
24
+ quote="The claims process was handled with such care and speed. It made a difficult time a little easier."
25
+ attribution="Patricia H."
26
+ role="Term Life policyholder, Nebraska"
27
+ />
28
+ ```
29
+
30
+ ## Design Tokens
31
+
32
+ - Left border: `var(--border-width-thick)` solid `var(--color-brand)`
33
+ - Quote font size: `var(--h2-font-size)`, weight `var(--font-weight-300)`, italic
34
+ - Line height: `var(--h2-line-height)`
35
+ - Attribution: `var(--font-weight-600)`, `var(--color-gray-dark)`
36
+ - Role: `var(--font-weight-400)`, `var(--color-gray)`
@@ -0,0 +1,48 @@
1
+ # Recent Blog Posts Block
2
+
3
+ **Zone:** General — Primary Column, Outro only. Not valid in Sideburn.
4
+
5
+ **Platform restriction:** Blog platform only (`data-platform="blog"`).
6
+
7
+ ## Description
8
+
9
+ Displays a curated or automatically-selected row of recent blog post cards. Use on product and landing pages to surface relevant content without leaving the page. Supports manual post selection or automatic "most recent N posts" mode.
10
+
11
+ Different from `AllBlogsPostBlock`, which is a full paginated listing view for the blog index.
12
+
13
+ ## Props
14
+
15
+ | Prop | Type | Required | Default | Description |
16
+ |---|---|---|---|---|
17
+ | `posts` | `BlogPostItem[]` | Yes | — | Posts to display |
18
+ | `heading` | `string` | No | `'Recent articles'` | Section heading |
19
+ | `count` | `number` | No | `3` | Number of posts to display (1–6) |
20
+ | `ctaLabel` | `string` | No | — | "View all" link label |
21
+ | `ctaHref` | `string` | No | — | "View all" link destination |
22
+ | `className` | `string` | No | — | Additional CSS class |
23
+
24
+ ### BlogPostItem
25
+
26
+ | Prop | Type | Description |
27
+ |---|---|---|
28
+ | `title` | `string` | Post title |
29
+ | `slug` | `string` | URL slug |
30
+ | `excerpt` | `string` | Short summary |
31
+ | `thumbnailSrc` | `string` | Card thumbnail URL |
32
+ | `thumbnailAlt` | `string` | Thumbnail alt text |
33
+ | `publishedAt` | `string` | ISO 8601 date |
34
+ | `category` | `string` | Primary category label |
35
+
36
+ ## Usage
37
+
38
+ ```tsx
39
+ import { RecentBlogPostsBlock } from 'lion-make'
40
+
41
+ <RecentBlogPostsBlock
42
+ heading="More on life insurance"
43
+ posts={recentLifePosts}
44
+ count={3}
45
+ ctaLabel="See all articles"
46
+ ctaHref="/blog"
47
+ />
48
+ ```
@@ -0,0 +1,44 @@
1
+ # Resource Spotlight
2
+
3
+ **Zone:** General — Primary Column, Outro only. Not valid in Sideburn.
4
+
5
+ ## Description
6
+
7
+ Highlights a featured resource — an article, video, PDF download, calculator, or tool. Used to drive content engagement and surface self-service resources near relevant content.
8
+
9
+ ## Props
10
+
11
+ | Prop | Type | Required | Description |
12
+ |---|---|---|---|
13
+ | `title` | `string` | Yes | Resource title |
14
+ | `description` | `string` | Yes | Short summary |
15
+ | `resourceType` | `'article' \| 'video' \| 'pdf' \| 'tool' \| 'calculator'` | Yes | Resource category (shown as a label) |
16
+ | `imageSrc` | `string` | No | Thumbnail image URL |
17
+ | `imageAlt` | `string` | No | Thumbnail alt text |
18
+ | `ctaLabel` | `string` | No | Link text (defaults to "Download" or "View resource") |
19
+ | `ctaHref` | `string` | No | Resource destination URL |
20
+ | `downloadUrl` | `string` | No | Forces a download link when provided (takes priority over ctaHref) |
21
+ | `className` | `string` | No | Additional CSS class |
22
+
23
+ ## Usage
24
+
25
+ ```tsx
26
+ import { ResourceSpotlight } from 'lion-make'
27
+
28
+ <ResourceSpotlight
29
+ resourceType="pdf"
30
+ title="Understanding Your Life Insurance Options"
31
+ description="A plain-language guide comparing term, whole, and universal life policies."
32
+ imageSrc="/img/guide-cover.jpg"
33
+ imageAlt=""
34
+ downloadUrl="/downloads/life-insurance-guide.pdf"
35
+ ctaLabel="Download guide (PDF)"
36
+ />
37
+ ```
38
+
39
+ ## Design Tokens
40
+
41
+ - Border: `var(--border-width-thin)` solid `var(--color-line)`
42
+ - Border radius: `var(--border-radius-base)`
43
+ - Type label: `var(--color-brand)`, uppercase, `var(--h6-font-size)`
44
+ - Title: `var(--h3-font-size)`, `var(--font-weight-600)`
@@ -0,0 +1,53 @@
1
+ # RTB - Descriptive
2
+
3
+ **Zone:** General — Primary Column, Sideburn, Outro.
4
+
5
+ ## Description
6
+
7
+ RTB (Reasons To Buy) variant with longer explanatory body copy per item. Use when each value proposition needs more context than a headline alone can carry. Renders as a vertical list with optional spot illustrations.
8
+
9
+ Compare with:
10
+ - `RTBHighlight` — large stat/number callouts for visual impact
11
+ - `RTBDynamic` — multi-column grid driven by a data source
12
+ - `RTBs` — original illustration + short text list
13
+
14
+ ## Props
15
+
16
+ | Prop | Type | Required | Description |
17
+ |---|---|---|---|
18
+ | `items` | `RTBDescriptiveItem[]` | Yes | Array of reasons (min 2) |
19
+ | `heading` | `string` | No | Optional section heading |
20
+ | `className` | `string` | No | Additional CSS class |
21
+
22
+ ### RTBDescriptiveItem
23
+
24
+ | Prop | Type | Required | Description |
25
+ |---|---|---|---|
26
+ | `heading` | `string` | Yes | Value proposition headline |
27
+ | `body` | `string` | Yes | Explanatory paragraph (2–4 sentences) |
28
+ | `illustrationSrc` | `string` | No | Spot illustration URL |
29
+ | `illustrationAlt` | `string` | No | Illustration alt text |
30
+
31
+ ## Usage
32
+
33
+ ```tsx
34
+ import { RTBDescriptive } from 'lion-make'
35
+
36
+ <RTBDescriptive
37
+ heading="Why families trust us"
38
+ items={[
39
+ {
40
+ heading: 'No hidden fees — ever',
41
+ body: 'Your premium is locked in on day one. It never increases for the life of your policy, regardless of age or health changes.',
42
+ illustrationSrc: '/icons/lock.svg',
43
+ illustrationAlt: '',
44
+ },
45
+ {
46
+ heading: 'Claims paid in days, not weeks',
47
+ body: 'Our claims team processes most straightforward claims within 5 business days. We assign a dedicated rep to every claim.',
48
+ illustrationSrc: '/icons/clock.svg',
49
+ illustrationAlt: '',
50
+ },
51
+ ]}
52
+ />
53
+ ```