@buildcanada/components 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/content/Card/Card.d.ts +62 -0
  2. package/dist/content/Card/Card.d.ts.map +1 -0
  3. package/dist/content/Card/Card.js +45 -0
  4. package/dist/content/Card/Card.scss +281 -0
  5. package/dist/content/Card/index.d.ts +3 -0
  6. package/dist/content/Card/index.d.ts.map +1 -0
  7. package/dist/content/Card/index.js +2 -0
  8. package/dist/content/Hero/Hero.d.ts +28 -0
  9. package/dist/content/Hero/Hero.d.ts.map +1 -0
  10. package/dist/content/Hero/Hero.js +16 -0
  11. package/dist/content/Hero/Hero.scss +150 -0
  12. package/dist/content/Hero/index.d.ts +3 -0
  13. package/dist/content/Hero/index.d.ts.map +1 -0
  14. package/dist/content/Hero/index.js +2 -0
  15. package/dist/content/StatBlock/StatBlock.d.ts +15 -0
  16. package/dist/content/StatBlock/StatBlock.d.ts.map +1 -0
  17. package/dist/content/StatBlock/StatBlock.js +10 -0
  18. package/dist/content/StatBlock/StatBlock.scss +83 -0
  19. package/dist/content/StatBlock/index.d.ts +3 -0
  20. package/dist/content/StatBlock/index.d.ts.map +1 -0
  21. package/dist/content/StatBlock/index.js +2 -0
  22. package/dist/feedback/Dialog/Dialog.d.ts +18 -0
  23. package/dist/feedback/Dialog/Dialog.d.ts.map +1 -0
  24. package/dist/feedback/Dialog/Dialog.js +33 -0
  25. package/dist/feedback/Dialog/Dialog.scss +158 -0
  26. package/dist/feedback/Dialog/index.d.ts +2 -0
  27. package/dist/feedback/Dialog/index.d.ts.map +1 -0
  28. package/dist/feedback/Dialog/index.js +1 -0
  29. package/dist/feedback/PopupForm/PopupForm.d.ts +24 -0
  30. package/dist/feedback/PopupForm/PopupForm.d.ts.map +1 -0
  31. package/dist/feedback/PopupForm/PopupForm.js +13 -0
  32. package/dist/feedback/PopupForm/PopupForm.scss +34 -0
  33. package/dist/feedback/PopupForm/index.d.ts +2 -0
  34. package/dist/feedback/PopupForm/index.d.ts.map +1 -0
  35. package/dist/feedback/PopupForm/index.js +1 -0
  36. package/dist/index.d.ts +21 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +25 -0
  39. package/dist/layout/Container/Container.d.ts +11 -0
  40. package/dist/layout/Container/Container.d.ts.map +1 -0
  41. package/dist/layout/Container/Container.js +7 -0
  42. package/dist/layout/Container/Container.scss +40 -0
  43. package/dist/layout/Container/index.d.ts +3 -0
  44. package/dist/layout/Container/index.d.ts.map +1 -0
  45. package/dist/layout/Container/index.js +2 -0
  46. package/dist/layout/Divider/Divider.d.ts +12 -0
  47. package/dist/layout/Divider/Divider.d.ts.map +1 -0
  48. package/dist/layout/Divider/Divider.js +7 -0
  49. package/dist/layout/Divider/Divider.scss +117 -0
  50. package/dist/layout/Divider/index.d.ts +3 -0
  51. package/dist/layout/Divider/index.d.ts.map +1 -0
  52. package/dist/layout/Divider/index.js +2 -0
  53. package/dist/layout/Grid/Grid.d.ts +24 -0
  54. package/dist/layout/Grid/Grid.d.ts.map +1 -0
  55. package/dist/layout/Grid/Grid.js +11 -0
  56. package/dist/layout/Grid/Grid.scss +81 -0
  57. package/dist/layout/Grid/index.d.ts +3 -0
  58. package/dist/layout/Grid/index.d.ts.map +1 -0
  59. package/dist/layout/Grid/index.js +2 -0
  60. package/dist/layout/Section/Section.d.ts +13 -0
  61. package/dist/layout/Section/Section.d.ts.map +1 -0
  62. package/dist/layout/Section/Section.js +7 -0
  63. package/dist/layout/Section/Section.scss +74 -0
  64. package/dist/layout/Section/index.d.ts +3 -0
  65. package/dist/layout/Section/index.d.ts.map +1 -0
  66. package/dist/layout/Section/index.js +2 -0
  67. package/dist/layout/Stack/Stack.d.ts +18 -0
  68. package/dist/layout/Stack/Stack.d.ts.map +1 -0
  69. package/dist/layout/Stack/Stack.js +7 -0
  70. package/dist/layout/Stack/Stack.scss +61 -0
  71. package/dist/layout/Stack/index.d.ts +3 -0
  72. package/dist/layout/Stack/index.d.ts.map +1 -0
  73. package/dist/layout/Stack/index.js +2 -0
  74. package/dist/navigation/Footer/Footer.d.ts +31 -0
  75. package/dist/navigation/Footer/Footer.d.ts.map +1 -0
  76. package/dist/navigation/Footer/Footer.js +21 -0
  77. package/dist/navigation/Footer/Footer.scss +233 -0
  78. package/dist/navigation/Footer/index.d.ts +3 -0
  79. package/dist/navigation/Footer/index.d.ts.map +1 -0
  80. package/dist/navigation/Footer/index.js +2 -0
  81. package/dist/navigation/Header/Header.d.ts +23 -0
  82. package/dist/navigation/Header/Header.d.ts.map +1 -0
  83. package/dist/navigation/Header/Header.js +16 -0
  84. package/dist/navigation/Header/Header.scss +325 -0
  85. package/dist/navigation/Header/index.d.ts +3 -0
  86. package/dist/navigation/Header/index.d.ts.map +1 -0
  87. package/dist/navigation/Header/index.js +2 -0
  88. package/dist/primitives/Button/Button.d.ts +31 -0
  89. package/dist/primitives/Button/Button.d.ts.map +1 -0
  90. package/dist/primitives/Button/Button.js +36 -0
  91. package/dist/primitives/Button/Button.scss +218 -0
  92. package/dist/primitives/Button/index.d.ts +3 -0
  93. package/dist/primitives/Button/index.d.ts.map +1 -0
  94. package/dist/primitives/Button/index.js +2 -0
  95. package/dist/primitives/Checkbox/Checkbox.d.ts +13 -0
  96. package/dist/primitives/Checkbox/Checkbox.d.ts.map +1 -0
  97. package/dist/primitives/Checkbox/Checkbox.js +10 -0
  98. package/dist/primitives/Checkbox/Checkbox.scss +114 -0
  99. package/dist/primitives/Checkbox/index.d.ts +3 -0
  100. package/dist/primitives/Checkbox/index.d.ts.map +1 -0
  101. package/dist/primitives/Checkbox/index.js +2 -0
  102. package/dist/primitives/TextField/TextField.d.ts +22 -0
  103. package/dist/primitives/TextField/TextField.d.ts.map +1 -0
  104. package/dist/primitives/TextField/TextField.js +14 -0
  105. package/dist/primitives/TextField/TextField.scss +93 -0
  106. package/dist/primitives/TextField/index.d.ts +3 -0
  107. package/dist/primitives/TextField/index.d.ts.map +1 -0
  108. package/dist/primitives/TextField/index.js +2 -0
  109. package/dist/styles/fonts.scss +27 -0
  110. package/dist/styles/main.scss +36 -0
  111. package/dist/styles/tokens.scss +301 -0
  112. package/dist/styles/typography.scss +232 -0
  113. package/package.json +12 -11
  114. package/src/content/Card/Card.stories.tsx +389 -0
  115. package/src/content/Card/index.ts +2 -2
  116. package/src/content/Hero/Hero.stories.tsx +299 -0
  117. package/src/content/Hero/index.ts +2 -2
  118. package/src/content/StatBlock/StatBlock.stories.tsx +331 -0
  119. package/src/content/StatBlock/index.ts +2 -2
  120. package/src/feedback/Dialog/Dialog.stories.tsx +286 -0
  121. package/src/feedback/Dialog/index.ts +1 -1
  122. package/src/feedback/PopupForm/PopupForm.stories.tsx +341 -0
  123. package/src/feedback/PopupForm/PopupForm.tsx +2 -2
  124. package/src/feedback/PopupForm/index.ts +1 -1
  125. package/src/index.ts +15 -15
  126. package/src/layout/Container/Container.stories.tsx +153 -0
  127. package/src/layout/Container/index.ts +2 -2
  128. package/src/layout/Divider/Divider.stories.tsx +204 -0
  129. package/src/layout/Divider/index.ts +2 -2
  130. package/src/layout/Grid/Grid.stories.tsx +263 -0
  131. package/src/layout/Grid/index.ts +2 -2
  132. package/src/layout/Section/Section.stories.tsx +173 -0
  133. package/src/layout/Section/index.ts +2 -2
  134. package/src/layout/Stack/Stack.stories.tsx +342 -0
  135. package/src/layout/Stack/index.ts +2 -2
  136. package/src/navigation/Footer/Footer.stories.tsx +351 -0
  137. package/src/navigation/Footer/index.ts +2 -2
  138. package/src/navigation/Header/Header.stories.tsx +346 -0
  139. package/src/navigation/Header/index.ts +2 -2
  140. package/src/primitives/Button/Button.stories.tsx +300 -0
  141. package/src/primitives/Button/index.ts +2 -2
  142. package/src/primitives/Checkbox/Checkbox.stories.tsx +204 -0
  143. package/src/primitives/Checkbox/index.ts +2 -2
  144. package/src/primitives/TextField/TextField.stories.tsx +265 -0
  145. package/src/primitives/TextField/index.ts +2 -2
@@ -0,0 +1,62 @@
1
+ export type CardVariant = "default" | "project" | "memo" | "feature" | "stat" | "profile";
2
+ export interface CardProps {
3
+ children: React.ReactNode;
4
+ className?: string;
5
+ style?: React.CSSProperties;
6
+ variant?: CardVariant;
7
+ href?: string;
8
+ onClick?: () => void;
9
+ }
10
+ export declare function Card({ children, className, style, variant, href, onClick, }: CardProps): import("react/jsx-runtime").JSX.Element;
11
+ /*******************************************************************************
12
+ * Card Subcomponents
13
+ ******************************************************************************/
14
+ export interface CardImageProps {
15
+ src: string;
16
+ alt: string;
17
+ className?: string;
18
+ }
19
+ export declare function CardImage({ src, alt, className }: CardImageProps): import("react/jsx-runtime").JSX.Element;
20
+ export interface CardIconProps {
21
+ children: React.ReactNode;
22
+ className?: string;
23
+ }
24
+ export declare function CardIcon({ children, className }: CardIconProps): import("react/jsx-runtime").JSX.Element;
25
+ export interface CardContentProps {
26
+ children: React.ReactNode;
27
+ className?: string;
28
+ }
29
+ export declare function CardContent({ children, className }: CardContentProps): import("react/jsx-runtime").JSX.Element;
30
+ export interface CardTitleProps {
31
+ children: React.ReactNode;
32
+ className?: string;
33
+ as?: "h2" | "h3" | "h4" | "h5" | "h6";
34
+ }
35
+ export declare function CardTitle({ children, className, as: Component }: CardTitleProps): import("react/jsx-runtime").JSX.Element;
36
+ export interface CardDescriptionProps {
37
+ children: React.ReactNode;
38
+ className?: string;
39
+ }
40
+ export declare function CardDescription({ children, className }: CardDescriptionProps): import("react/jsx-runtime").JSX.Element;
41
+ export interface CardMetaProps {
42
+ children: React.ReactNode;
43
+ className?: string;
44
+ }
45
+ export declare function CardMeta({ children, className }: CardMetaProps): import("react/jsx-runtime").JSX.Element;
46
+ export interface CardStatProps {
47
+ value: string | number;
48
+ label: string;
49
+ change?: string;
50
+ changeDirection?: "up" | "down" | "neutral";
51
+ className?: string;
52
+ }
53
+ export declare function CardStat({ value, label, change, changeDirection, className }: CardStatProps): import("react/jsx-runtime").JSX.Element;
54
+ export interface CardAuthorProps {
55
+ name: string;
56
+ role?: string;
57
+ avatar?: string;
58
+ className?: string;
59
+ }
60
+ export declare function CardAuthor({ name, role, avatar, className }: CardAuthorProps): import("react/jsx-runtime").JSX.Element;
61
+ export default Card;
62
+ //# sourceMappingURL=Card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../src/content/Card/Card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import cx from "classnames";
3
+ export function Card({ children, className, style, variant = "default", href, onClick, }) {
4
+ const isInteractive = Boolean(href || onClick);
5
+ const isButton = Boolean(onClick);
6
+ const classes = cx("bc-card", `bc-card--${variant}`, {
7
+ "bc-card--interactive": isInteractive,
8
+ "bc-card--button": isButton,
9
+ }, className);
10
+ if (href) {
11
+ return (_jsx("a", { href: href, className: classes, style: style, children: children }));
12
+ }
13
+ if (onClick) {
14
+ return (_jsx("button", { type: "button", className: classes, style: style, onClick: onClick, children: children }));
15
+ }
16
+ return (_jsx("div", { className: classes, style: style, children: children }));
17
+ }
18
+ export function CardImage({ src, alt, className }) {
19
+ return (_jsx("div", { className: cx("bc-card__image", className), children: _jsx("img", { src: src, alt: alt }) }));
20
+ }
21
+ export function CardIcon({ children, className }) {
22
+ return _jsx("div", { className: cx("bc-card__icon", className), children: children });
23
+ }
24
+ export function CardContent({ children, className }) {
25
+ return _jsx("div", { className: cx("bc-card__content", className), children: children });
26
+ }
27
+ export function CardTitle({ children, className, as: Component = "h3" }) {
28
+ return _jsx(Component, { className: cx("bc-card__title", className), children: children });
29
+ }
30
+ export function CardDescription({ children, className }) {
31
+ return _jsx("p", { className: cx("bc-card__description", className), children: children });
32
+ }
33
+ export function CardMeta({ children, className }) {
34
+ return _jsx("div", { className: cx("bc-card__meta", className), children: children });
35
+ }
36
+ export function CardStat({ value, label, change, changeDirection, className }) {
37
+ return (_jsxs("div", { className: cx("bc-card__stat", className), children: [_jsx("span", { className: "bc-card__stat-value", children: value }), _jsx("span", { className: "bc-card__stat-label", children: label }), change && (_jsx("span", { className: cx("bc-card__stat-change", {
38
+ "bc-card__stat-change--up": changeDirection === "up",
39
+ "bc-card__stat-change--down": changeDirection === "down",
40
+ }), children: change }))] }));
41
+ }
42
+ export function CardAuthor({ name, role, avatar, className }) {
43
+ return (_jsxs("div", { className: cx("bc-card__author", className), children: [avatar && (_jsx("img", { src: avatar, alt: name, className: "bc-card__author-avatar" })), _jsxs("div", { className: "bc-card__author-info", children: [_jsx("span", { className: "bc-card__author-name", children: name }), role && _jsx("span", { className: "bc-card__author-role", children: role })] })] }));
44
+ }
45
+ export default Card;
@@ -0,0 +1,281 @@
1
+ @use "../../styles/tokens" as *;
2
+ @use "../../styles/typography" as *;
3
+
4
+ /*******************************************************************************
5
+ * Card Component
6
+ ******************************************************************************/
7
+
8
+ .bc-card {
9
+ display: flex;
10
+ flex-direction: column;
11
+ background-color: $white;
12
+ border: 1px solid $border-muted;
13
+ border-radius: $radius-none;
14
+ overflow: hidden;
15
+ text-decoration: none;
16
+ color: inherit;
17
+ transition: box-shadow $transition-fast, transform $transition-fast;
18
+
19
+ /***************************************************************************
20
+ * Variant: Default Card
21
+ ***************************************************************************/
22
+
23
+ &--default {
24
+ .bc-card__content {
25
+ padding: $space-3;
26
+ }
27
+
28
+ .bc-card__title {
29
+ @include h3;
30
+ margin: 0 0 $space-1;
31
+ }
32
+
33
+ .bc-card__description {
34
+ @include body-2;
35
+ color: $text-secondary;
36
+ margin: 0;
37
+ }
38
+
39
+ .bc-card__meta {
40
+ @include micro;
41
+ color: $text-muted;
42
+ margin-top: $space-2;
43
+ }
44
+ }
45
+
46
+ // Interactive cards (when rendered as a or button)
47
+ &--interactive {
48
+ cursor: pointer;
49
+
50
+ &:hover {
51
+ box-shadow: $shadow-md;
52
+ transform: translateY(-2px);
53
+ }
54
+
55
+ &:focus-visible {
56
+ outline: 2px solid $auburn;
57
+ outline-offset: 2px;
58
+ }
59
+ }
60
+
61
+ // Button-specific styles
62
+ &--button {
63
+ border: 1px solid $border-muted;
64
+ text-align: left;
65
+ width: 100%;
66
+ }
67
+
68
+ /***************************************************************************
69
+ * Variant: Project Card
70
+ ***************************************************************************/
71
+
72
+ &--project {
73
+ .bc-card__image {
74
+ aspect-ratio: 16 / 9;
75
+ }
76
+
77
+ .bc-card__content {
78
+ padding: $space-3;
79
+ }
80
+
81
+ .bc-card__title {
82
+ @include h3;
83
+ margin: 0 0 $space-1;
84
+ }
85
+
86
+ .bc-card__description {
87
+ @include body-3;
88
+ color: $text-secondary;
89
+ margin: 0;
90
+ }
91
+ }
92
+
93
+ /***************************************************************************
94
+ * Variant: Memo Card
95
+ ***************************************************************************/
96
+
97
+ &--memo {
98
+ .bc-card__content {
99
+ padding: $space-3;
100
+ }
101
+
102
+ .bc-card__title {
103
+ @include h3;
104
+ margin: 0 0 $space-1;
105
+ }
106
+
107
+ .bc-card__description {
108
+ @include body-2;
109
+ color: $text-secondary;
110
+ margin: 0 0 $space-2;
111
+ display: -webkit-box;
112
+ -webkit-line-clamp: 3;
113
+ -webkit-box-orient: vertical;
114
+ overflow: hidden;
115
+ }
116
+ }
117
+
118
+ /***************************************************************************
119
+ * Variant: Feature Card
120
+ ***************************************************************************/
121
+
122
+ &--feature {
123
+ text-align: center;
124
+ padding: $space-4;
125
+
126
+ .bc-card__icon {
127
+ display: flex;
128
+ align-items: center;
129
+ justify-content: center;
130
+ width: 64px;
131
+ height: 64px;
132
+ margin: 0 auto $space-2;
133
+ background-color: $linen;
134
+ border-radius: $radius-none;
135
+ color: $auburn;
136
+ font-size: 1.5rem;
137
+ }
138
+
139
+ .bc-card__title {
140
+ @include h4;
141
+ margin: 0 0 $space-1;
142
+ }
143
+
144
+ .bc-card__description {
145
+ @include body-3;
146
+ color: $text-secondary;
147
+ margin: 0;
148
+ }
149
+ }
150
+
151
+ /***************************************************************************
152
+ * Variant: Stat Card
153
+ ***************************************************************************/
154
+
155
+ &--stat {
156
+ padding: $space-3;
157
+ background-color: $linen;
158
+ border: none;
159
+
160
+ .bc-card__stat {
161
+ display: flex;
162
+ flex-direction: column;
163
+ gap: calc($space-1 / 2);
164
+ }
165
+
166
+ .bc-card__stat-value {
167
+ @include display-2;
168
+ color: $charcoal;
169
+ }
170
+
171
+ .bc-card__stat-label {
172
+ @include label;
173
+ color: $text-secondary;
174
+ }
175
+
176
+ .bc-card__stat-change {
177
+ @include mono-sm;
178
+ color: $text-secondary;
179
+
180
+ &--up {
181
+ color: $emerald-600;
182
+ }
183
+
184
+ &--down {
185
+ color: $auburn;
186
+ }
187
+ }
188
+ }
189
+
190
+ /***************************************************************************
191
+ * Variant: Profile Card
192
+ ***************************************************************************/
193
+
194
+ &--profile {
195
+ text-align: center;
196
+ padding: $space-4;
197
+
198
+ .bc-card__image {
199
+ width: 120px;
200
+ height: 120px;
201
+ margin: 0 auto $space-2;
202
+ border-radius: $radius-full;
203
+ overflow: hidden;
204
+
205
+ img {
206
+ width: 100%;
207
+ height: 100%;
208
+ object-fit: cover;
209
+ }
210
+ }
211
+
212
+ .bc-card__title {
213
+ @include h4;
214
+ margin: 0 0 calc($space-1 / 2);
215
+ }
216
+
217
+ .bc-card__description {
218
+ @include body-3;
219
+ color: $text-secondary;
220
+ margin: 0;
221
+ }
222
+
223
+ .bc-card__meta {
224
+ display: flex;
225
+ justify-content: center;
226
+ gap: $space-1;
227
+ margin-top: $space-2;
228
+ }
229
+ }
230
+
231
+ /***************************************************************************
232
+ * Subcomponents
233
+ ***************************************************************************/
234
+
235
+ &__image {
236
+ width: 100%;
237
+ overflow: hidden;
238
+
239
+ img {
240
+ width: 100%;
241
+ height: 100%;
242
+ object-fit: cover;
243
+ }
244
+ }
245
+
246
+ &__content {
247
+ flex: 1;
248
+ display: flex;
249
+ flex-direction: column;
250
+ }
251
+
252
+ &__author {
253
+ display: flex;
254
+ align-items: center;
255
+ gap: $space-1;
256
+ margin-top: auto;
257
+ padding-top: $space-2;
258
+ }
259
+
260
+ &__author-avatar {
261
+ width: 40px;
262
+ height: 40px;
263
+ border-radius: $radius-full;
264
+ object-fit: cover;
265
+ }
266
+
267
+ &__author-info {
268
+ display: flex;
269
+ flex-direction: column;
270
+ }
271
+
272
+ &__author-name {
273
+ @include label-sm;
274
+ color: $text-primary;
275
+ }
276
+
277
+ &__author-role {
278
+ @include body-3;
279
+ color: $text-secondary;
280
+ }
281
+ }
@@ -0,0 +1,3 @@
1
+ export { Card, CardImage, CardIcon, CardContent, CardTitle, CardDescription, CardMeta, CardStat, CardAuthor, type CardProps, type CardVariant, type CardImageProps, type CardIconProps, type CardContentProps, type CardTitleProps, type CardDescriptionProps, type CardMetaProps, type CardStatProps, type CardAuthorProps, } from "./Card.js";
2
+ export { default } from "./Card.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/content/Card/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,WAAW,EACX,SAAS,EACT,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,eAAe,GACvB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { Card, CardImage, CardIcon, CardContent, CardTitle, CardDescription, CardMeta, CardStat, CardAuthor, } from "./Card.js";
2
+ export { default } from "./Card.js";
@@ -0,0 +1,28 @@
1
+ export type HeroVariant = "home" | "page" | "centered";
2
+ export type HeroBackground = "white" | "linen" | "charcoal";
3
+ export interface HeroProps {
4
+ children: React.ReactNode;
5
+ className?: string;
6
+ style?: React.CSSProperties;
7
+ variant?: HeroVariant;
8
+ background?: HeroBackground;
9
+ }
10
+ export declare function Hero({ children, className, style, variant, background, }: HeroProps): import("react/jsx-runtime").JSX.Element;
11
+ export interface HeroTitleProps {
12
+ children: React.ReactNode;
13
+ className?: string;
14
+ as?: "h1" | "h2";
15
+ }
16
+ export declare function HeroTitle({ children, className, as: Component }: HeroTitleProps): import("react/jsx-runtime").JSX.Element;
17
+ export interface HeroSubtitleProps {
18
+ children: React.ReactNode;
19
+ className?: string;
20
+ }
21
+ export declare function HeroSubtitle({ children, className }: HeroSubtitleProps): import("react/jsx-runtime").JSX.Element;
22
+ export interface HeroActionsProps {
23
+ children: React.ReactNode;
24
+ className?: string;
25
+ }
26
+ export declare function HeroActions({ children, className }: HeroActionsProps): import("react/jsx-runtime").JSX.Element;
27
+ export default Hero;
28
+ //# sourceMappingURL=Hero.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hero.d.ts","sourceRoot":"","sources":["../../../src/content/Hero/Hero.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAA;AACtD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAA;AAE3D,MAAM,WAAW,SAAS;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,UAAU,CAAC,EAAE,cAAc,CAAA;CAC9B;AAED,wBAAgB,IAAI,CAAC,EACjB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,OAAgB,EAChB,UAAoB,GACvB,EAAE,SAAS,2CAaX;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,SAAgB,EAAE,EAAE,cAAc,2CAEtF;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAEtE;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAEpE;AAED,eAAe,IAAI,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import cx from "classnames";
3
+ export function Hero({ children, className, style, variant = "page", background = "linen", }) {
4
+ const classes = cx("bc-hero", `bc-hero--${variant}`, `bc-hero--bg-${background}`, className);
5
+ return (_jsx("div", { className: classes, style: style, children: _jsx("div", { className: "bc-hero__inner", children: children }) }));
6
+ }
7
+ export function HeroTitle({ children, className, as: Component = "h1" }) {
8
+ return _jsx(Component, { className: cx("bc-hero__title", className), children: children });
9
+ }
10
+ export function HeroSubtitle({ children, className }) {
11
+ return _jsx("p", { className: cx("bc-hero__subtitle", className), children: children });
12
+ }
13
+ export function HeroActions({ children, className }) {
14
+ return _jsx("div", { className: cx("bc-hero__actions", className), children: children });
15
+ }
16
+ export default Hero;
@@ -0,0 +1,150 @@
1
+ @use "../../styles/tokens" as *;
2
+ @use "../../styles/typography" as *;
3
+
4
+ /*******************************************************************************
5
+ * Hero Component
6
+ ******************************************************************************/
7
+
8
+ .bc-hero {
9
+ width: 100%;
10
+ padding: $space-8 0;
11
+
12
+ @include md-up {
13
+ padding: $space-10 0;
14
+ }
15
+
16
+ /***************************************************************************
17
+ * Background Variants
18
+ ***************************************************************************/
19
+
20
+ &--bg-white {
21
+ background-color: $white;
22
+ color: $text-primary;
23
+ }
24
+
25
+ &--bg-linen {
26
+ background-color: $linen;
27
+ color: $text-primary;
28
+ }
29
+
30
+ &--bg-charcoal {
31
+ background-color: $charcoal;
32
+ color: $text-inverse;
33
+
34
+ .bc-hero__subtitle {
35
+ color: rgba($white, 0.8);
36
+ }
37
+ }
38
+
39
+ /***************************************************************************
40
+ * Inner Container
41
+ ***************************************************************************/
42
+
43
+ &__inner {
44
+ max-width: 1024px;
45
+ margin: 0 auto;
46
+ padding: 0 $space-3;
47
+
48
+ @include md-up {
49
+ padding: 0 $space-5;
50
+ }
51
+ }
52
+
53
+ /***************************************************************************
54
+ * Variant: Home (large, centered)
55
+ ***************************************************************************/
56
+
57
+ &--home {
58
+ padding: $space-10 0;
59
+
60
+ @include md-up {
61
+ padding: $space-16 0;
62
+ }
63
+
64
+ .bc-hero__inner {
65
+ text-align: center;
66
+ max-width: 900px;
67
+ }
68
+
69
+ .bc-hero__title {
70
+ @include display-1;
71
+ margin: 0 0 $space-3;
72
+ }
73
+
74
+ .bc-hero__subtitle {
75
+ @include body-lg;
76
+ max-width: 640px;
77
+ margin: 0 auto $space-4;
78
+ }
79
+ }
80
+
81
+ /***************************************************************************
82
+ * Variant: Page (standard page header)
83
+ ***************************************************************************/
84
+
85
+ &--page {
86
+ padding: $space-6 0;
87
+
88
+ @include md-up {
89
+ padding: $space-8 0;
90
+ }
91
+
92
+ .bc-hero__title {
93
+ @include display-2;
94
+ margin: 0 0 $space-2;
95
+ }
96
+
97
+ .bc-hero__subtitle {
98
+ @include body-1;
99
+ color: $text-secondary;
100
+ margin: 0;
101
+ max-width: 640px;
102
+ }
103
+ }
104
+
105
+ /***************************************************************************
106
+ * Variant: Centered
107
+ ***************************************************************************/
108
+
109
+ &--centered {
110
+ .bc-hero__inner {
111
+ text-align: center;
112
+ }
113
+
114
+ .bc-hero__title {
115
+ @include display-2;
116
+ margin: 0 0 $space-2;
117
+ }
118
+
119
+ .bc-hero__subtitle {
120
+ @include body-1;
121
+ color: $text-secondary;
122
+ margin: 0 auto;
123
+ max-width: 640px;
124
+ }
125
+ }
126
+
127
+ /***************************************************************************
128
+ * Subcomponents
129
+ ***************************************************************************/
130
+
131
+ &__title {
132
+ color: inherit;
133
+ }
134
+
135
+ &__subtitle {
136
+ color: $text-secondary;
137
+ }
138
+
139
+ &__actions {
140
+ display: flex;
141
+ flex-wrap: wrap;
142
+ gap: $space-2;
143
+ margin-top: $space-4;
144
+
145
+ .bc-hero--home &,
146
+ .bc-hero--centered & {
147
+ justify-content: center;
148
+ }
149
+ }
150
+ }
@@ -0,0 +1,3 @@
1
+ export { Hero, HeroTitle, HeroSubtitle, HeroActions, type HeroProps, type HeroVariant, type HeroBackground, type HeroTitleProps, type HeroSubtitleProps, type HeroActionsProps, } from "./Hero.js";
2
+ export { default } from "./Hero.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/content/Hero/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACxB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { Hero, HeroTitle, HeroSubtitle, HeroActions, } from "./Hero.js";
2
+ export { default } from "./Hero.js";
@@ -0,0 +1,15 @@
1
+ export type StatBlockSize = "sm" | "md" | "lg";
2
+ export type StatBlockTrend = "up" | "down" | "neutral";
3
+ export interface StatBlockProps {
4
+ value: string | number;
5
+ label: string;
6
+ description?: string;
7
+ change?: string;
8
+ trend?: StatBlockTrend;
9
+ size?: StatBlockSize;
10
+ className?: string;
11
+ style?: React.CSSProperties;
12
+ }
13
+ export declare function StatBlock({ value, label, description, change, trend, size, className, style, }: StatBlockProps): import("react/jsx-runtime").JSX.Element;
14
+ export default StatBlock;
15
+ //# sourceMappingURL=StatBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatBlock.d.ts","sourceRoot":"","sources":["../../../src/content/StatBlock/StatBlock.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC9C,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAA;AAEtD,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC9B;AAED,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,KAAK,EACL,WAAW,EACX,MAAM,EACN,KAAK,EACL,IAAW,EACX,SAAS,EACT,KAAK,GACR,EAAE,cAAc,2CAwBhB;AAED,eAAe,SAAS,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import cx from "classnames";
3
+ export function StatBlock({ value, label, description, change, trend, size = "md", className, style, }) {
4
+ const classes = cx("bc-stat-block", `bc-stat-block--${size}`, className);
5
+ return (_jsxs("div", { className: classes, style: style, children: [_jsx("span", { className: "bc-stat-block__value", children: value }), _jsx("span", { className: "bc-stat-block__label", children: label }), description && (_jsx("span", { className: "bc-stat-block__description", children: description })), change && (_jsxs("span", { className: cx("bc-stat-block__change", {
6
+ "bc-stat-block__change--up": trend === "up",
7
+ "bc-stat-block__change--down": trend === "down",
8
+ }), children: [trend === "up" && "↑ ", trend === "down" && "↓ ", change] }))] }));
9
+ }
10
+ export default StatBlock;