@forumone/throughline-reference-ds 0.0.2 → 0.2.0

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 (177) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +102 -28
  4. package/dist/components/CTASection/CTASection.contract.d.ts +3 -0
  5. package/dist/components/CTASection/CTASection.contract.d.ts.map +1 -0
  6. package/dist/components/CTASection/CTASection.contract.js +117 -0
  7. package/dist/components/CTASection/CTASection.contract.js.map +1 -0
  8. package/dist/components/CTASection/CTASection.d.ts +17 -0
  9. package/dist/components/CTASection/CTASection.d.ts.map +1 -0
  10. package/dist/components/CTASection/CTASection.js +7 -0
  11. package/dist/components/CTASection/CTASection.js.map +1 -0
  12. package/dist/components/CTASection/index.d.ts +3 -0
  13. package/dist/components/CTASection/index.d.ts.map +1 -0
  14. package/dist/components/CTASection/index.js +3 -0
  15. package/dist/components/CTASection/index.js.map +1 -0
  16. package/dist/components/Card/Card.contract.d.ts +3 -0
  17. package/dist/components/Card/Card.contract.d.ts.map +1 -0
  18. package/dist/components/Card/Card.contract.js +111 -0
  19. package/dist/components/Card/Card.contract.js.map +1 -0
  20. package/dist/components/Card/Card.d.ts +16 -0
  21. package/dist/components/Card/Card.d.ts.map +1 -0
  22. package/dist/components/Card/Card.js +11 -0
  23. package/dist/components/Card/Card.js.map +1 -0
  24. package/dist/components/Card/index.d.ts +3 -0
  25. package/dist/components/Card/index.d.ts.map +1 -0
  26. package/dist/components/Card/index.js +3 -0
  27. package/dist/components/Card/index.js.map +1 -0
  28. package/dist/components/CardGrid/CardGrid.contract.d.ts +3 -0
  29. package/dist/components/CardGrid/CardGrid.contract.d.ts.map +1 -0
  30. package/dist/components/CardGrid/CardGrid.contract.js +67 -0
  31. package/dist/components/CardGrid/CardGrid.contract.js.map +1 -0
  32. package/dist/components/CardGrid/CardGrid.d.ts +9 -0
  33. package/dist/components/CardGrid/CardGrid.d.ts.map +1 -0
  34. package/dist/components/CardGrid/CardGrid.js +7 -0
  35. package/dist/components/CardGrid/CardGrid.js.map +1 -0
  36. package/dist/components/CardGrid/index.d.ts +3 -0
  37. package/dist/components/CardGrid/index.d.ts.map +1 -0
  38. package/dist/components/CardGrid/index.js +3 -0
  39. package/dist/components/CardGrid/index.js.map +1 -0
  40. package/dist/components/Divider/Divider.contract.d.ts +3 -0
  41. package/dist/components/Divider/Divider.contract.d.ts.map +1 -0
  42. package/dist/components/Divider/Divider.contract.js +77 -0
  43. package/dist/components/Divider/Divider.contract.js.map +1 -0
  44. package/dist/components/Divider/Divider.d.ts +8 -0
  45. package/dist/components/Divider/Divider.d.ts.map +1 -0
  46. package/dist/components/Divider/Divider.js +10 -0
  47. package/dist/components/Divider/Divider.js.map +1 -0
  48. package/dist/components/Divider/index.d.ts +3 -0
  49. package/dist/components/Divider/index.d.ts.map +1 -0
  50. package/dist/components/Divider/index.js +3 -0
  51. package/dist/components/Divider/index.js.map +1 -0
  52. package/dist/components/FAQ/FAQ.contract.d.ts +3 -0
  53. package/dist/components/FAQ/FAQ.contract.d.ts.map +1 -0
  54. package/dist/components/FAQ/FAQ.contract.js +93 -0
  55. package/dist/components/FAQ/FAQ.contract.js.map +1 -0
  56. package/dist/components/FAQ/FAQ.d.ts +14 -0
  57. package/dist/components/FAQ/FAQ.d.ts.map +1 -0
  58. package/dist/components/FAQ/FAQ.js +7 -0
  59. package/dist/components/FAQ/FAQ.js.map +1 -0
  60. package/dist/components/FAQ/index.d.ts +3 -0
  61. package/dist/components/FAQ/index.d.ts.map +1 -0
  62. package/dist/components/FAQ/index.js +3 -0
  63. package/dist/components/FAQ/index.js.map +1 -0
  64. package/dist/components/Hero/Hero.contract.d.ts +3 -0
  65. package/dist/components/Hero/Hero.contract.d.ts.map +1 -0
  66. package/dist/components/Hero/Hero.contract.js +171 -0
  67. package/dist/components/Hero/Hero.contract.js.map +1 -0
  68. package/dist/components/Hero/Hero.d.ts +24 -0
  69. package/dist/components/Hero/Hero.d.ts.map +1 -0
  70. package/dist/components/Hero/Hero.js +7 -0
  71. package/dist/components/Hero/Hero.js.map +1 -0
  72. package/dist/components/Hero/index.d.ts +3 -0
  73. package/dist/components/Hero/index.d.ts.map +1 -0
  74. package/dist/components/Hero/index.js +3 -0
  75. package/dist/components/Hero/index.js.map +1 -0
  76. package/dist/components/MediaBlock/MediaBlock.contract.d.ts +3 -0
  77. package/dist/components/MediaBlock/MediaBlock.contract.d.ts.map +1 -0
  78. package/dist/components/MediaBlock/MediaBlock.contract.js +83 -0
  79. package/dist/components/MediaBlock/MediaBlock.contract.js.map +1 -0
  80. package/dist/components/MediaBlock/MediaBlock.d.ts +23 -0
  81. package/dist/components/MediaBlock/MediaBlock.d.ts.map +1 -0
  82. package/dist/components/MediaBlock/MediaBlock.js +8 -0
  83. package/dist/components/MediaBlock/MediaBlock.js.map +1 -0
  84. package/dist/components/MediaBlock/index.d.ts +3 -0
  85. package/dist/components/MediaBlock/index.d.ts.map +1 -0
  86. package/dist/components/MediaBlock/index.js +3 -0
  87. package/dist/components/MediaBlock/index.js.map +1 -0
  88. package/dist/components/Prose/Prose.contract.d.ts +3 -0
  89. package/dist/components/Prose/Prose.contract.d.ts.map +1 -0
  90. package/dist/components/Prose/Prose.contract.js +95 -0
  91. package/dist/components/Prose/Prose.contract.js.map +1 -0
  92. package/dist/components/Prose/Prose.d.ts +9 -0
  93. package/dist/components/Prose/Prose.d.ts.map +1 -0
  94. package/dist/components/Prose/Prose.js +7 -0
  95. package/dist/components/Prose/Prose.js.map +1 -0
  96. package/dist/components/Prose/index.d.ts +3 -0
  97. package/dist/components/Prose/index.d.ts.map +1 -0
  98. package/dist/components/Prose/index.js +3 -0
  99. package/dist/components/Prose/index.js.map +1 -0
  100. package/dist/components/Quote/Quote.contract.d.ts +3 -0
  101. package/dist/components/Quote/Quote.contract.d.ts.map +1 -0
  102. package/dist/components/Quote/Quote.contract.js +90 -0
  103. package/dist/components/Quote/Quote.contract.js.map +1 -0
  104. package/dist/components/Quote/Quote.d.ts +16 -0
  105. package/dist/components/Quote/Quote.d.ts.map +1 -0
  106. package/dist/components/Quote/Quote.js +7 -0
  107. package/dist/components/Quote/Quote.js.map +1 -0
  108. package/dist/components/Quote/index.d.ts +3 -0
  109. package/dist/components/Quote/index.d.ts.map +1 -0
  110. package/dist/components/Quote/index.js +3 -0
  111. package/dist/components/Quote/index.js.map +1 -0
  112. package/dist/components/SectionIntro/SectionIntro.contract.d.ts +3 -0
  113. package/dist/components/SectionIntro/SectionIntro.contract.d.ts.map +1 -0
  114. package/dist/components/SectionIntro/SectionIntro.contract.js +97 -0
  115. package/dist/components/SectionIntro/SectionIntro.contract.js.map +1 -0
  116. package/dist/components/SectionIntro/SectionIntro.d.ts +10 -0
  117. package/dist/components/SectionIntro/SectionIntro.d.ts.map +1 -0
  118. package/dist/components/SectionIntro/SectionIntro.js +7 -0
  119. package/dist/components/SectionIntro/SectionIntro.js.map +1 -0
  120. package/dist/components/SectionIntro/index.d.ts +3 -0
  121. package/dist/components/SectionIntro/index.d.ts.map +1 -0
  122. package/dist/components/SectionIntro/index.js +3 -0
  123. package/dist/components/SectionIntro/index.js.map +1 -0
  124. package/dist/components/Spacer/Spacer.contract.d.ts +3 -0
  125. package/dist/components/Spacer/Spacer.contract.d.ts.map +1 -0
  126. package/dist/components/Spacer/Spacer.contract.js +66 -0
  127. package/dist/components/Spacer/Spacer.contract.js.map +1 -0
  128. package/dist/components/Spacer/Spacer.d.ts +7 -0
  129. package/dist/components/Spacer/Spacer.d.ts.map +1 -0
  130. package/dist/components/Spacer/Spacer.js +7 -0
  131. package/dist/components/Spacer/Spacer.js.map +1 -0
  132. package/dist/components/Spacer/index.d.ts +3 -0
  133. package/dist/components/Spacer/index.d.ts.map +1 -0
  134. package/dist/components/Spacer/index.js +3 -0
  135. package/dist/components/Spacer/index.js.map +1 -0
  136. package/dist/components/Stats/Stats.contract.d.ts +3 -0
  137. package/dist/components/Stats/Stats.contract.d.ts.map +1 -0
  138. package/dist/components/Stats/Stats.contract.js +92 -0
  139. package/dist/components/Stats/Stats.contract.js.map +1 -0
  140. package/dist/components/Stats/Stats.d.ts +13 -0
  141. package/dist/components/Stats/Stats.d.ts.map +1 -0
  142. package/dist/components/Stats/Stats.js +7 -0
  143. package/dist/components/Stats/Stats.js.map +1 -0
  144. package/dist/components/Stats/index.d.ts +3 -0
  145. package/dist/components/Stats/index.d.ts.map +1 -0
  146. package/dist/components/Stats/index.js +3 -0
  147. package/dist/components/Stats/index.js.map +1 -0
  148. package/dist/index.d.ts +14 -0
  149. package/dist/index.d.ts.map +1 -0
  150. package/dist/index.js +14 -0
  151. package/dist/index.js.map +1 -0
  152. package/dist/manifest.json +2014 -0
  153. package/dist/styles/base.css +55 -0
  154. package/dist/styles/index.css +213 -0
  155. package/dist/styles/reset.css +48 -0
  156. package/dist/styles/tokens.css +105 -0
  157. package/dist/tokens/colors.d.ts +48 -0
  158. package/dist/tokens/colors.d.ts.map +1 -0
  159. package/dist/tokens/colors.js +47 -0
  160. package/dist/tokens/colors.js.map +1 -0
  161. package/dist/tokens/index.d.ts +99 -0
  162. package/dist/tokens/index.d.ts.map +1 -0
  163. package/dist/tokens/index.js +21 -0
  164. package/dist/tokens/index.js.map +1 -0
  165. package/dist/tokens/radii.d.ts +11 -0
  166. package/dist/tokens/radii.d.ts.map +1 -0
  167. package/dist/tokens/radii.js +10 -0
  168. package/dist/tokens/radii.js.map +1 -0
  169. package/dist/tokens/spacing.d.ts +26 -0
  170. package/dist/tokens/spacing.d.ts.map +1 -0
  171. package/dist/tokens/spacing.js +25 -0
  172. package/dist/tokens/spacing.js.map +1 -0
  173. package/dist/tokens/typography.d.ts +28 -0
  174. package/dist/tokens/typography.d.ts.map +1 -0
  175. package/dist/tokens/typography.js +27 -0
  176. package/dist/tokens/typography.js.map +1 -0
  177. package/package.json +88 -7
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from 'react';
2
+ export type CardGridColumns = 2 | 3 | 4;
3
+ export interface CardGridProps {
4
+ children: ReactNode;
5
+ columns?: CardGridColumns;
6
+ className?: string;
7
+ }
8
+ export declare function CardGrid({ children, columns, className }: CardGridProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=CardGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardGrid.d.ts","sourceRoot":"","sources":["../../../src/components/CardGrid/CardGrid.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAEvC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,SAAS,CAAA;IACnB,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAW,EAAE,SAAS,EAAE,EAAE,aAAa,2CAM3E"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { clsx } from 'clsx';
3
+ import styles from './CardGrid.module.css';
4
+ export function CardGrid({ children, columns = 3, className }) {
5
+ return (_jsx("div", { className: clsx(styles.grid, styles[`cols-${columns}`], className), children: children }));
6
+ }
7
+ //# sourceMappingURL=CardGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardGrid.js","sourceRoot":"","sources":["../../../src/components/CardGrid/CardGrid.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,MAAM,MAAM,uBAAuB,CAAA;AAU1C,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC,EAAE,SAAS,EAAiB;IAC1E,OAAO,CACL,cAAK,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,YACpE,QAAQ,GACL,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { CardGrid, type CardGridProps, type CardGridColumns } from './CardGrid.js';
2
+ export { contract as cardGridContract } from './CardGrid.contract.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CardGrid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAClF,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { CardGrid } from './CardGrid.js';
2
+ export { contract as cardGridContract } from './CardGrid.contract.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CardGrid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA4C,MAAM,eAAe,CAAA;AAClF,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ComponentContract } from '@forumone/throughline-design-contract';
2
+ export declare const contract: ComponentContract;
3
+ //# sourceMappingURL=Divider.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.contract.d.ts","sourceRoot":"","sources":["../../../src/components/Divider/Divider.contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAE9E,eAAO,MAAM,QAAQ,EAAE,iBAoFtB,CAAA"}
@@ -0,0 +1,77 @@
1
+ export const contract = {
2
+ name: 'Divider',
3
+ category: 'utility',
4
+ description: 'A horizontal rule for separating sections of content.',
5
+ intent: 'Mark a visual pause between two blocks of content without introducing a new section header. Use sparingly — a SectionIntro is usually a better signal of a new topic. Divider is for rhythm, not hierarchy.',
6
+ composition: {
7
+ placement: ['page', 'section', 'inline'],
8
+ maxPerPage: null,
9
+ requiredSiblings: [],
10
+ forbiddenAdjacent: ['Divider'],
11
+ },
12
+ content: {
13
+ fields: [
14
+ {
15
+ name: 'spacing',
16
+ type: 'select',
17
+ required: false,
18
+ constraints: 'compact | default | spacious',
19
+ },
20
+ {
21
+ name: 'decorative',
22
+ type: 'boolean',
23
+ required: false,
24
+ constraints: 'When true (default), the divider is aria-hidden',
25
+ },
26
+ ],
27
+ variants: [
28
+ { name: 'compact', description: 'Small vertical margin', whenToUse: 'Between tight pieces of content inside a list' },
29
+ { name: 'default', description: 'Standard vertical margin', whenToUse: 'Most cases' },
30
+ { name: 'spacious', description: 'Large vertical margin', whenToUse: 'Between major sections of a page' },
31
+ ],
32
+ },
33
+ tokens: {
34
+ consumes: [
35
+ 'color.border.default',
36
+ 'spacing.24',
37
+ 'spacing.12',
38
+ 'spacing.6',
39
+ ],
40
+ configurable: [
41
+ { prop: 'spacing', tokenGroup: 'spacing', allowedValues: ['compact', 'default', 'spacious'] },
42
+ ],
43
+ },
44
+ accessibility: {
45
+ role: 'separator',
46
+ keyboardSupport: [],
47
+ screenReaderBehavior: 'When decorative=true (default) the divider is marked aria-hidden and assistive tech skips it. When decorative=false it announces as a separator.',
48
+ contentWarnings: [
49
+ 'Do not stack two Dividers in a row',
50
+ ],
51
+ },
52
+ examples: [
53
+ { label: 'Default', intent: 'Standard section break', storyId: 'divider--default' },
54
+ { label: 'Compact', intent: 'Between related list items', storyId: 'divider--compact' },
55
+ { label: 'Spacious', intent: 'Between major page sections', storyId: 'divider--spacious' },
56
+ { label: 'Meaningful', intent: 'Semantic section break announced by screen readers', storyId: 'divider--meaningful' },
57
+ ],
58
+ antiExamples: [
59
+ {
60
+ label: 'Using Divider instead of SectionIntro',
61
+ why: 'Dividers carry no semantic meaning; readers cannot tell a new section has started without the accompanying headline',
62
+ useInstead: 'SectionIntro',
63
+ },
64
+ {
65
+ label: 'Decorative dividers announced to screen readers',
66
+ why: 'Adds noise without value',
67
+ useInstead: 'Leave decorative=true (the default)',
68
+ },
69
+ ],
70
+ behavior: {
71
+ fetchesData: false,
72
+ hasClientState: false,
73
+ animates: false,
74
+ requiresAnalytics: false,
75
+ },
76
+ };
77
+ //# sourceMappingURL=Divider.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.contract.js","sourceRoot":"","sources":["../../../src/components/Divider/Divider.contract.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAsB;IACzC,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,uDAAuD;IACpE,MAAM,EACJ,6MAA6M;IAE/M,WAAW,EAAE;QACX,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;QACxC,UAAU,EAAE,IAAI;QAChB,gBAAgB,EAAE,EAAE;QACpB,iBAAiB,EAAE,CAAC,SAAS,CAAC;KAC/B;IAED,OAAO,EAAE;QACP,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,8BAA8B;aAC5C;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,iDAAiD;aAC/D;SACF;QACD,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uBAAuB,EAAE,SAAS,EAAE,+CAA+C,EAAE;YACrH,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0BAA0B,EAAE,SAAS,EAAE,YAAY,EAAE;YACrF,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,uBAAuB,EAAE,SAAS,EAAE,kCAAkC,EAAE;SAC1G;KACF;IAED,MAAM,EAAE;QACN,QAAQ,EAAE;YACR,sBAAsB;YACtB,YAAY;YACZ,YAAY;YACZ,WAAW;SACZ;QACD,YAAY,EAAE;YACZ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE;SAC9F;KACF;IAED,aAAa,EAAE;QACb,IAAI,EAAE,WAAW;QACjB,eAAe,EAAE,EAAE;QACnB,oBAAoB,EAClB,kJAAkJ;QACpJ,eAAe,EAAE;YACf,oCAAoC;SACrC;KACF;IAED,QAAQ,EAAE;QACR,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,wBAAwB,EAAE,OAAO,EAAE,kBAAkB,EAAE;QACnF,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,4BAA4B,EAAE,OAAO,EAAE,kBAAkB,EAAE;QACvF,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,6BAA6B,EAAE,OAAO,EAAE,mBAAmB,EAAE;QAC1F,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,oDAAoD,EAAE,OAAO,EAAE,qBAAqB,EAAE;KACtH;IAED,YAAY,EAAE;QACZ;YACE,KAAK,EAAE,uCAAuC;YAC9C,GAAG,EAAE,qHAAqH;YAC1H,UAAU,EAAE,cAAc;SAC3B;QACD;YACE,KAAK,EAAE,iDAAiD;YACxD,GAAG,EAAE,0BAA0B;YAC/B,UAAU,EAAE,qCAAqC;SAClD;KACF;IAED,QAAQ,EAAE;QACR,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,KAAK;QACrB,QAAQ,EAAE,KAAK;QACf,iBAAiB,EAAE,KAAK;KACzB;CACF,CAAA"}
@@ -0,0 +1,8 @@
1
+ export type DividerSpacing = 'compact' | 'default' | 'spacious';
2
+ export interface DividerProps {
3
+ spacing?: DividerSpacing;
4
+ decorative?: boolean;
5
+ className?: string;
6
+ }
7
+ export declare function Divider({ spacing, decorative, className }: DividerProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=Divider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.d.ts","sourceRoot":"","sources":["../../../src/components/Divider/Divider.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAA;AAE/D,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAmB,EAAE,UAAiB,EAAE,SAAS,EAAE,EAAE,YAAY,2CAK1F"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { clsx } from 'clsx';
3
+ import styles from './Divider.module.css';
4
+ export function Divider({ spacing = 'default', decorative = true, className }) {
5
+ const ariaProps = decorative
6
+ ? { role: 'presentation', 'aria-hidden': true }
7
+ : {};
8
+ return _jsx("hr", { ...ariaProps, className: clsx(styles.divider, styles[spacing], className) });
9
+ }
10
+ //# sourceMappingURL=Divider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.js","sourceRoot":"","sources":["../../../src/components/Divider/Divider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,MAAM,MAAM,sBAAsB,CAAA;AAUzC,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE,UAAU,GAAG,IAAI,EAAE,SAAS,EAAgB;IACzF,MAAM,SAAS,GAAG,UAAU;QAC1B,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,IAAa,EAAE;QACxD,CAAC,CAAC,EAAE,CAAA;IACN,OAAO,gBAAQ,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,GAAI,CAAA;AAC3F,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { Divider, type DividerProps, type DividerSpacing } from './Divider.js';
2
+ export { contract as dividerContract } from './Divider.contract.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Divider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { Divider } from './Divider.js';
2
+ export { contract as dividerContract } from './Divider.contract.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Divider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA0C,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ComponentContract } from '@forumone/throughline-design-contract';
2
+ export declare const contract: ComponentContract;
3
+ //# sourceMappingURL=FAQ.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FAQ.contract.d.ts","sourceRoot":"","sources":["../../../src/components/FAQ/FAQ.contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAE9E,eAAO,MAAM,QAAQ,EAAE,iBAqGtB,CAAA"}
@@ -0,0 +1,93 @@
1
+ export const contract = {
2
+ name: 'FAQ',
3
+ category: 'data',
4
+ description: 'A disclosure-style question and answer list using native <details>/<summary> for keyboard accessibility with no JavaScript.',
5
+ intent: 'Answer the predictable questions readers arrive with. Use for program applications, purchase funnels, onboarding pages — anywhere the same three to ten questions come up repeatedly. Not for searchable knowledge bases (those need their own search UI).',
6
+ composition: {
7
+ placement: ['section'],
8
+ maxPerPage: 2,
9
+ requiredSiblings: [],
10
+ forbiddenAdjacent: [],
11
+ },
12
+ content: {
13
+ fields: [
14
+ {
15
+ name: 'headline',
16
+ type: 'text',
17
+ required: false,
18
+ maxLength: 100,
19
+ },
20
+ {
21
+ name: 'items',
22
+ type: 'array',
23
+ required: true,
24
+ constraints: 'Three to ten items; more than that needs its own dedicated page',
25
+ of: [
26
+ { name: 'question', type: 'text', required: true, maxLength: 200 },
27
+ { name: 'answer', type: 'richtext', required: true },
28
+ ],
29
+ },
30
+ {
31
+ name: 'defaultOpenFirst',
32
+ type: 'boolean',
33
+ required: false,
34
+ constraints: 'Set true when the first question is one readers always ask',
35
+ },
36
+ ],
37
+ },
38
+ tokens: {
39
+ consumes: [
40
+ 'color.bg.primary',
41
+ 'color.text.primary',
42
+ 'color.text.secondary',
43
+ 'color.border.default',
44
+ 'color.border.strong',
45
+ 'spacing.16',
46
+ 'spacing.8',
47
+ 'spacing.5',
48
+ 'spacing.4',
49
+ 'spacing.2',
50
+ 'spacing.container',
51
+ 'font.size.3xl',
52
+ 'font.size.xl',
53
+ 'font.weight.semibold',
54
+ 'line.height.relaxed',
55
+ 'radius.md',
56
+ ],
57
+ },
58
+ accessibility: {
59
+ keyboardSupport: [
60
+ 'Tab to each question summary',
61
+ 'Enter or Space opens/closes the current item',
62
+ ],
63
+ screenReaderBehavior: 'Each question is a <summary> inside <details>, so screen readers announce open/closed state natively. The answer becomes available to assistive tech when the item is expanded.',
64
+ contentWarnings: [
65
+ 'Keep answers short and scannable — a paragraph at most',
66
+ 'Do not nest FAQs inside FAQs',
67
+ ],
68
+ },
69
+ examples: [
70
+ { label: 'Default', intent: 'Program application FAQ', storyId: 'faq--default' },
71
+ { label: 'First item open', intent: 'Lead with the most common question already answered', storyId: 'faq--open-first' },
72
+ { label: 'Without headline', intent: 'Inline FAQ under a larger section', storyId: 'faq--no-headline' },
73
+ ],
74
+ antiExamples: [
75
+ {
76
+ label: 'Twenty-question FAQ',
77
+ why: 'Past about ten items the disclosure pattern breaks down; readers cannot scan the list',
78
+ useInstead: 'Split into topic-specific FAQs across multiple pages, or build a searchable knowledge base',
79
+ },
80
+ {
81
+ label: 'Using FAQ to hide primary content',
82
+ why: 'Important content should be visible by default, not hidden behind a click',
83
+ useInstead: 'Prose or a proper section with a SectionIntro',
84
+ },
85
+ ],
86
+ behavior: {
87
+ fetchesData: false,
88
+ hasClientState: true,
89
+ animates: false,
90
+ requiresAnalytics: false,
91
+ },
92
+ };
93
+ //# sourceMappingURL=FAQ.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FAQ.contract.js","sourceRoot":"","sources":["../../../src/components/FAQ/FAQ.contract.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAsB;IACzC,IAAI,EAAE,KAAK;IACX,QAAQ,EAAE,MAAM;IAChB,WAAW,EACT,6HAA6H;IAC/H,MAAM,EACJ,4PAA4P;IAE9P,WAAW,EAAE;QACX,SAAS,EAAE,CAAC,SAAS,CAAC;QACtB,UAAU,EAAE,CAAC;QACb,gBAAgB,EAAE,EAAE;QACpB,iBAAiB,EAAE,EAAE;KACtB;IAED,OAAO,EAAE;QACP,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,KAAK;gBACf,SAAS,EAAE,GAAG;aACf;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,iEAAiE;gBAC9E,EAAE,EAAE;oBACF,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;oBAClE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;iBACrD;aACF;YACD;gBACE,IAAI,EAAE,kBAAkB;gBACxB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,4DAA4D;aAC1E;SACF;KACF;IAED,MAAM,EAAE;QACN,QAAQ,EAAE;YACR,kBAAkB;YAClB,oBAAoB;YACpB,sBAAsB;YACtB,sBAAsB;YACtB,qBAAqB;YACrB,YAAY;YACZ,WAAW;YACX,WAAW;YACX,WAAW;YACX,WAAW;YACX,mBAAmB;YACnB,eAAe;YACf,cAAc;YACd,sBAAsB;YACtB,qBAAqB;YACrB,WAAW;SACZ;KACF;IAED,aAAa,EAAE;QACb,eAAe,EAAE;YACf,8BAA8B;YAC9B,8CAA8C;SAC/C;QACD,oBAAoB,EAClB,iLAAiL;QACnL,eAAe,EAAE;YACf,wDAAwD;YACxD,8BAA8B;SAC/B;KACF;IAED,QAAQ,EAAE;QACR,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,cAAc,EAAE;QAChF,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,qDAAqD,EAAE,OAAO,EAAE,iBAAiB,EAAE;QACvH,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,mCAAmC,EAAE,OAAO,EAAE,kBAAkB,EAAE;KACxG;IAED,YAAY,EAAE;QACZ;YACE,KAAK,EAAE,qBAAqB;YAC5B,GAAG,EAAE,uFAAuF;YAC5F,UAAU,EAAE,4FAA4F;SACzG;QACD;YACE,KAAK,EAAE,mCAAmC;YAC1C,GAAG,EAAE,2EAA2E;YAChF,UAAU,EAAE,+CAA+C;SAC5D;KACF;IAED,QAAQ,EAAE;QACR,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,KAAK;QACf,iBAAiB,EAAE,KAAK;KACzB;CACF,CAAA"}
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface FAQItem {
3
+ question: string;
4
+ answer: ReactNode;
5
+ }
6
+ export interface FAQProps {
7
+ headline?: string;
8
+ items: FAQItem[];
9
+ /** If true, the first item is open by default. */
10
+ defaultOpenFirst?: boolean;
11
+ className?: string;
12
+ }
13
+ export declare function FAQ({ headline, items, defaultOpenFirst, className }: FAQProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=FAQ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FAQ.d.ts","sourceRoot":"","sources":["../../../src/components/FAQ/FAQ.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,SAAS,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAwB,EAAE,SAAS,EAAE,EAAE,QAAQ,2CAuBrF"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { clsx } from 'clsx';
3
+ import styles from './FAQ.module.css';
4
+ export function FAQ({ headline, items, defaultOpenFirst = false, className }) {
5
+ return (_jsx("section", { className: clsx(styles.faq, className), children: _jsxs("div", { className: styles.container, children: [headline ? _jsx("h2", { className: styles.headline, children: headline }) : null, _jsx("ul", { className: styles.list, children: items.map((item, index) => (_jsx("li", { children: _jsxs("details", { className: styles.item, open: defaultOpenFirst && index === 0, children: [_jsxs("summary", { className: styles.question, children: [_jsx("span", { children: item.question }), _jsx("span", { "aria-hidden": "true", className: styles.chevron, children: "+" })] }), _jsx("div", { className: styles.answer, children: item.answer })] }) }, item.question))) })] }) }));
6
+ }
7
+ //# sourceMappingURL=FAQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FAQ.js","sourceRoot":"","sources":["../../../src/components/FAQ/FAQ.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,MAAM,MAAM,kBAAkB,CAAA;AAerC,MAAM,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,GAAG,KAAK,EAAE,SAAS,EAAY;IACpF,OAAO,CACL,kBAAS,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,YAC7C,eAAK,SAAS,EAAE,MAAM,CAAC,SAAS,aAC7B,QAAQ,CAAC,CAAC,CAAC,aAAI,SAAS,EAAE,MAAM,CAAC,QAAQ,YAAG,QAAQ,GAAM,CAAC,CAAC,CAAC,IAAI,EAClE,aAAI,SAAS,EAAE,MAAM,CAAC,IAAI,YACvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1B,uBACE,mBAAS,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,IAAI,KAAK,KAAK,CAAC,aACpE,mBAAS,SAAS,EAAE,MAAM,CAAC,QAAQ,aACjC,yBAAO,IAAI,CAAC,QAAQ,GAAQ,EAC5B,8BAAkB,MAAM,EAAC,SAAS,EAAE,MAAM,CAAC,OAAO,kBAE3C,IACC,EACV,cAAK,SAAS,EAAE,MAAM,CAAC,MAAM,YAAG,IAAI,CAAC,MAAM,GAAO,IAC1C,IATH,IAAI,CAAC,QAAQ,CAUjB,CACN,CAAC,GACC,IACD,GACE,CACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { FAQ, type FAQProps, type FAQItem } from './FAQ.js';
2
+ export { contract as faqContract } from './FAQ.contract.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FAQ/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { FAQ } from './FAQ.js';
2
+ export { contract as faqContract } from './FAQ.contract.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/FAQ/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAA+B,MAAM,UAAU,CAAA;AAC3D,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ComponentContract } from '@forumone/throughline-design-contract';
2
+ export declare const contract: ComponentContract;
3
+ //# sourceMappingURL=Hero.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hero.contract.d.ts","sourceRoot":"","sources":["../../../src/components/Hero/Hero.contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAE9E,eAAO,MAAM,QAAQ,EAAE,iBAmLtB,CAAA"}
@@ -0,0 +1,171 @@
1
+ export const contract = {
2
+ name: 'Hero',
3
+ category: 'hero',
4
+ description: 'A page opener with prominent headline, supporting copy, and primary call to action.',
5
+ intent: 'Establish what a page is about within the first viewport. Use when the page introduces a new topic, program, or initiative that deserves prominent editorial framing. Typically appears once at the top of a page.',
6
+ composition: {
7
+ placement: ['page'],
8
+ maxPerPage: 1,
9
+ requiredSiblings: [],
10
+ forbiddenAdjacent: ['Hero', 'SectionIntro'],
11
+ },
12
+ content: {
13
+ fields: [
14
+ {
15
+ name: 'eyebrow',
16
+ type: 'text',
17
+ required: false,
18
+ maxLength: 40,
19
+ constraints: 'Short kicker label, typically the section or program name',
20
+ },
21
+ {
22
+ name: 'headline',
23
+ type: 'text',
24
+ required: true,
25
+ maxLength: 80,
26
+ constraints: 'Sentence case; avoid all caps; keep scannable',
27
+ },
28
+ {
29
+ name: 'body',
30
+ type: 'text',
31
+ required: false,
32
+ maxLength: 240,
33
+ constraints: 'Two to three sentences that support the headline without repeating it',
34
+ },
35
+ {
36
+ name: 'cta',
37
+ type: 'group',
38
+ required: false,
39
+ of: [
40
+ { name: 'label', type: 'text', required: true, maxLength: 30 },
41
+ { name: 'url', type: 'link', required: true },
42
+ ],
43
+ },
44
+ {
45
+ name: 'secondaryCta',
46
+ type: 'group',
47
+ required: false,
48
+ of: [
49
+ { name: 'label', type: 'text', required: true, maxLength: 30 },
50
+ { name: 'url', type: 'link', required: true },
51
+ ],
52
+ },
53
+ {
54
+ name: 'media',
55
+ type: 'image',
56
+ required: false,
57
+ constraints: 'Required when variant is "split"; otherwise optional',
58
+ },
59
+ ],
60
+ variants: [
61
+ {
62
+ name: 'default',
63
+ description: 'Centered text, no media',
64
+ whenToUse: 'Editorial pages and mission statements where content carries the weight',
65
+ },
66
+ {
67
+ name: 'compact',
68
+ description: 'Reduced vertical padding',
69
+ whenToUse: 'Subpages where the hero is contextual framing rather than primary introduction',
70
+ },
71
+ {
72
+ name: 'split',
73
+ description: 'Text on one side, media on the other',
74
+ whenToUse: 'Program pages or anywhere a single supporting image carries meaning',
75
+ },
76
+ ],
77
+ },
78
+ tokens: {
79
+ consumes: [
80
+ 'color.bg.primary',
81
+ 'color.bg.secondary',
82
+ 'color.bg.inverse',
83
+ 'color.text.primary',
84
+ 'color.text.secondary',
85
+ 'color.text.inverse',
86
+ 'color.brand.primary',
87
+ 'color.brand.primaryHover',
88
+ 'color.border.strong',
89
+ 'spacing.section',
90
+ 'spacing.container',
91
+ 'spacing.12',
92
+ 'spacing.8',
93
+ 'spacing.6',
94
+ 'spacing.4',
95
+ 'spacing.3',
96
+ 'font.size.5xl',
97
+ 'font.size.4xl',
98
+ 'font.size.xl',
99
+ 'font.size.sm',
100
+ 'font.weight.bold',
101
+ 'font.weight.semibold',
102
+ 'line.height.tight',
103
+ 'line.height.relaxed',
104
+ 'letter.spacing.tight',
105
+ 'letter.spacing.wide',
106
+ 'radius.md',
107
+ 'radius.lg',
108
+ ],
109
+ configurable: [
110
+ {
111
+ prop: 'background',
112
+ tokenGroup: 'color.bg',
113
+ allowedValues: ['primary', 'secondary', 'inverse'],
114
+ },
115
+ ],
116
+ },
117
+ accessibility: {
118
+ keyboardSupport: ['Tab to primary CTA', 'Tab to secondary CTA'],
119
+ screenReaderBehavior: 'The headline is announced as an h1 element. The eyebrow is read as supplementary text before the headline. Decorative media is treated as presentational when the alt attribute is empty.',
120
+ contentWarnings: [
121
+ 'Avoid text overlay on busy images',
122
+ 'Ensure sufficient color contrast between headline and background',
123
+ ],
124
+ },
125
+ examples: [
126
+ {
127
+ label: 'Default',
128
+ intent: 'Standard editorial page opener with CTA',
129
+ storyId: 'hero--default',
130
+ },
131
+ {
132
+ label: 'Program landing page',
133
+ intent: 'Introduce a new fellowship program',
134
+ storyId: 'hero--program-landing',
135
+ },
136
+ {
137
+ label: 'Compact subpage',
138
+ intent: 'Open a secondary page with light framing',
139
+ storyId: 'hero--compact',
140
+ },
141
+ {
142
+ label: 'Split with media',
143
+ intent: 'Open a content page with supporting visual context',
144
+ storyId: 'hero--split',
145
+ },
146
+ ],
147
+ antiExamples: [
148
+ {
149
+ label: 'Multiple heroes on one page',
150
+ why: 'A page should have a single primary opener; multiple heroes flatten hierarchy and confuse screen readers with multiple h1s',
151
+ useInstead: 'Use SectionIntro for secondary section headers',
152
+ },
153
+ {
154
+ label: 'Hero at the bottom of a page',
155
+ why: 'Heroes are editorial openers, not closers',
156
+ useInstead: 'Use CTASection for page-bottom calls to action',
157
+ },
158
+ {
159
+ label: 'Split variant without media',
160
+ why: 'The split layout allocates half the space for media; leaving it empty creates awkward whitespace',
161
+ useInstead: 'Use the default variant when media is not available',
162
+ },
163
+ ],
164
+ behavior: {
165
+ fetchesData: false,
166
+ hasClientState: false,
167
+ animates: false,
168
+ requiresAnalytics: false,
169
+ },
170
+ };
171
+ //# sourceMappingURL=Hero.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hero.contract.js","sourceRoot":"","sources":["../../../src/components/Hero/Hero.contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type HeroVariant = 'default' | 'compact' | 'split';
2
+ export type HeroBackground = 'primary' | 'secondary' | 'inverse';
3
+ export interface HeroProps {
4
+ eyebrow?: string;
5
+ headline: string;
6
+ body?: string;
7
+ cta?: {
8
+ label: string;
9
+ url: string;
10
+ };
11
+ secondaryCta?: {
12
+ label: string;
13
+ url: string;
14
+ };
15
+ media?: {
16
+ url: string;
17
+ alt: string;
18
+ };
19
+ variant?: HeroVariant;
20
+ background?: HeroBackground;
21
+ className?: string;
22
+ }
23
+ export declare function Hero({ eyebrow, headline, body, cta, secondaryCta, media, variant, background, className, }: HeroProps): import("react/jsx-runtime").JSX.Element;
24
+ //# sourceMappingURL=Hero.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hero.d.ts","sourceRoot":"","sources":["../../../src/components/Hero/Hero.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;AACzD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAA;AAEhE,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,YAAY,EACZ,KAAK,EACL,OAAmB,EACnB,UAAsB,EACtB,SAAS,GACV,EAAE,SAAS,2CAsCX"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { clsx } from 'clsx';
3
+ import styles from './Hero.module.css';
4
+ export function Hero({ eyebrow, headline, body, cta, secondaryCta, media, variant = 'default', background = 'primary', className, }) {
5
+ return (_jsx("section", { className: clsx(styles.hero, styles[variant], styles[`bg-${background}`], className), children: _jsxs("div", { className: styles.container, children: [_jsxs("div", { className: styles.content, children: [eyebrow ? _jsx("p", { className: styles.eyebrow, children: eyebrow }) : null, _jsx("h1", { className: styles.headline, children: headline }), body ? _jsx("p", { className: styles.body, children: body }) : null, cta || secondaryCta ? (_jsxs("div", { className: styles.actions, children: [cta ? (_jsx("a", { href: cta.url, className: styles.primaryCta, children: cta.label })) : null, secondaryCta ? (_jsx("a", { href: secondaryCta.url, className: styles.secondaryCta, children: secondaryCta.label })) : null] })) : null] }), variant === 'split' && media ? (_jsx("div", { className: styles.media, children: _jsx("img", { src: media.url, alt: media.alt }) })) : null] }) }));
6
+ }
7
+ //# sourceMappingURL=Hero.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hero.js","sourceRoot":"","sources":["../../../src/components/Hero/Hero.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,MAAM,MAAM,mBAAmB,CAAA;AAiBtC,MAAM,UAAU,IAAI,CAAC,EACnB,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,YAAY,EACZ,KAAK,EACL,OAAO,GAAG,SAAS,EACnB,UAAU,GAAG,SAAS,EACtB,SAAS,GACC;IACV,OAAO,CACL,kBACE,SAAS,EAAE,IAAI,CACb,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,OAAO,CAAC,EACf,MAAM,CAAC,MAAM,UAAU,EAAE,CAAC,EAC1B,SAAS,CACV,YAED,eAAK,SAAS,EAAE,MAAM,CAAC,SAAS,aAC9B,eAAK,SAAS,EAAE,MAAM,CAAC,OAAO,aAC3B,OAAO,CAAC,CAAC,CAAC,YAAG,SAAS,EAAE,MAAM,CAAC,OAAO,YAAG,OAAO,GAAK,CAAC,CAAC,CAAC,IAAI,EAC7D,aAAI,SAAS,EAAE,MAAM,CAAC,QAAQ,YAAG,QAAQ,GAAM,EAC9C,IAAI,CAAC,CAAC,CAAC,YAAG,SAAS,EAAE,MAAM,CAAC,IAAI,YAAG,IAAI,GAAK,CAAC,CAAC,CAAC,IAAI,EACnD,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CACrB,eAAK,SAAS,EAAE,MAAM,CAAC,OAAO,aAC3B,GAAG,CAAC,CAAC,CAAC,CACL,YAAG,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,YAC3C,GAAG,CAAC,KAAK,GACR,CACL,CAAC,CAAC,CAAC,IAAI,EACP,YAAY,CAAC,CAAC,CAAC,CACd,YAAG,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,YACtD,YAAY,CAAC,KAAK,GACjB,CACL,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,OAAO,KAAK,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAC9B,cAAK,SAAS,EAAE,MAAM,CAAC,KAAK,YAC1B,cAAK,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,GAAI,GACnC,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,GACE,CACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { Hero, type HeroProps, type HeroVariant, type HeroBackground } from './Hero.js';
2
+ export { contract as heroContract } from './Hero.contract.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Hero/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AACvF,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { Hero } from './Hero.js';
2
+ export { contract as heroContract } from './Hero.contract.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Hero/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAyD,MAAM,WAAW,CAAA;AACvF,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ComponentContract } from '@forumone/throughline-design-contract';
2
+ export declare const contract: ComponentContract;
3
+ //# sourceMappingURL=MediaBlock.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaBlock.contract.d.ts","sourceRoot":"","sources":["../../../src/components/MediaBlock/MediaBlock.contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAE9E,eAAO,MAAM,QAAQ,EAAE,iBA2FtB,CAAA"}