@fpkit/acss 0.6.2 → 1.0.0-beta.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.
- package/libs/components/alert/alert.css +1 -1
- package/libs/components/alert/alert.css.map +1 -1
- package/libs/components/alert/alert.min.css +2 -2
- package/libs/components/badge/badge.css +1 -1
- package/libs/components/badge/badge.css.map +1 -1
- package/libs/components/badge/badge.min.css +2 -2
- package/libs/components/breadcrumbs/breadcrumb.css +1 -1
- package/libs/components/breadcrumbs/breadcrumb.css.map +1 -1
- package/libs/components/breadcrumbs/breadcrumb.min.css +2 -2
- package/libs/components/buttons/button.css +1 -1
- package/libs/components/buttons/button.css.map +1 -1
- package/libs/components/buttons/button.min.css +2 -2
- package/libs/components/cards/card.css +1 -1
- package/libs/components/cards/card.css.map +1 -1
- package/libs/components/cards/card.min.css +2 -2
- package/libs/components/details/details.css +1 -1
- package/libs/components/details/details.css.map +1 -1
- package/libs/components/details/details.min.css +2 -2
- package/libs/components/dialog/dialog.css +1 -1
- package/libs/components/dialog/dialog.css.map +1 -1
- package/libs/components/dialog/dialog.min.css +2 -2
- package/libs/components/form/form.css +1 -1
- package/libs/components/form/form.css.map +1 -1
- package/libs/components/form/form.min.css +2 -2
- package/libs/components/icons/icon.d.cts +32 -32
- package/libs/components/icons/icon.d.ts +32 -32
- package/libs/components/images/img.css +1 -1
- package/libs/components/images/img.css.map +1 -1
- package/libs/components/images/img.min.css +2 -2
- package/libs/components/layout/landmarks.css +1 -1
- package/libs/components/layout/landmarks.css.map +1 -1
- package/libs/components/layout/landmarks.min.css +2 -2
- package/libs/components/link/link.css +1 -1
- package/libs/components/link/link.css.map +1 -1
- package/libs/components/link/link.min.css +2 -2
- package/libs/components/nav/nav.css +1 -1
- package/libs/components/nav/nav.css.map +1 -1
- package/libs/components/nav/nav.min.css +2 -2
- package/libs/components/progress/progress.css +1 -1
- package/libs/components/progress/progress.css.map +1 -1
- package/libs/components/progress/progress.min.css +2 -2
- package/libs/components/tag/tag.css +1 -1
- package/libs/components/tag/tag.css.map +1 -1
- package/libs/components/tag/tag.min.css +2 -2
- package/libs/index.css +1 -1
- package/libs/index.css.map +1 -1
- package/package.json +1 -1
- package/src/components/alert/alert.scss +4 -4
- package/src/components/alert/alert.scss.backup +184 -0
- package/src/components/alert/alert.stories.tsx +53 -2
- package/src/components/badge/badge.scss +2 -2
- package/src/components/badge/badge.scss.backup +39 -0
- package/src/components/badge/badge.stories.tsx +40 -0
- package/src/components/breadcrumbs/breadcrumb.scss +5 -5
- package/src/components/breadcrumbs/breadcrumb.scss.backup +35 -0
- package/src/components/breadcrumbs/breadcrumb.stories.tsx +17 -1
- package/src/components/buttons/button.scss +27 -27
- package/src/components/buttons/button.scss.backup +145 -0
- package/src/components/buttons/button.stories.tsx +188 -2
- package/src/components/cards/card.scss +39 -5
- package/src/components/cards/card.scss.backup +67 -0
- package/src/components/cards/card.stories.tsx +183 -0
- package/src/components/details/details.scss +14 -14
- package/src/components/details/details.scss.backup +126 -0
- package/src/components/details/details.stories.tsx +40 -0
- package/src/components/dialog/dialog.scss +3 -3
- package/src/components/dialog/dialog.scss.backup +126 -0
- package/src/components/form/form.scss +25 -9
- package/src/components/form/form.scss.backup +87 -0
- package/src/components/form/form.stories.tsx +271 -0
- package/src/components/form/input.stories.tsx +158 -0
- package/src/components/images/figure.stories.tsx +41 -1
- package/src/components/images/img.scss +8 -8
- package/src/components/images/img.scss.backup +59 -0
- package/src/components/layout/_header.scss +14 -14
- package/src/components/layout/_header.scss.backup +72 -0
- package/src/components/layout/landmarks.scss +7 -7
- package/src/components/layout/landmarks.scss.backup +51 -0
- package/src/components/layout/landmarks.stories.tsx +42 -0
- package/src/components/link/link.scss +5 -5
- package/src/components/link/link.scss.backup +145 -0
- package/src/components/link/link.stories.tsx +38 -2
- package/src/components/nav/nav.scss +17 -17
- package/src/components/nav/nav.scss.backup +123 -0
- package/src/components/nav/nav.stories.tsx +35 -1
- package/src/components/progress/progress.scss +7 -7
- package/src/components/progress/progress.scss.backup +70 -0
- package/src/components/tag/tag.scss +10 -10
- package/src/components/tag/tag.scss.backup +130 -0
- package/src/components/tag/tag.stories.tsx +23 -2
- package/src/styles/alert/alert.css +4 -4
- package/src/styles/badge/badge.css +2 -2
- package/src/styles/breadcrumbs/breadcrumb.css +5 -5
- package/src/styles/buttons/button.css +26 -27
- package/src/styles/buttons/button.css.map +1 -1
- package/src/styles/cards/card.css +35 -5
- package/src/styles/cards/card.css.map +1 -1
- package/src/styles/details/details.css +14 -14
- package/src/styles/dialog/dialog.css +3 -3
- package/src/styles/form/form.css +20 -10
- package/src/styles/form/form.css.map +1 -1
- package/src/styles/images/img.css +8 -8
- package/src/styles/index.css +170 -131
- package/src/styles/index.css.map +1 -1
- package/src/styles/layout/landmarks.css +21 -21
- package/src/styles/link/link.css +5 -5
- package/src/styles/nav/nav.css +17 -17
- package/src/styles/progress/progress.css +6 -6
- package/src/styles/tag/tag.css +4 -4
|
@@ -181,8 +181,8 @@ export const DisabledCustom: Story = {
|
|
|
181
181
|
classes: "my-custom-button",
|
|
182
182
|
styles: {
|
|
183
183
|
"--btn-fs": "1.25rem",
|
|
184
|
-
"--btn-
|
|
185
|
-
"--btn-
|
|
184
|
+
"--btn-padding-block": "0.75rem",
|
|
185
|
+
"--btn-padding-inline": "1.5rem",
|
|
186
186
|
},
|
|
187
187
|
children: "Custom Disabled",
|
|
188
188
|
},
|
|
@@ -225,3 +225,189 @@ Try clicking - only enabled button responds.
|
|
|
225
225
|
},
|
|
226
226
|
},
|
|
227
227
|
} as Story;
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* CSS Variable Customization
|
|
231
|
+
*
|
|
232
|
+
* Demonstrates how to customize button appearance using the new standardized
|
|
233
|
+
* CSS custom property naming convention.
|
|
234
|
+
*
|
|
235
|
+
* New variable naming patterns:
|
|
236
|
+
* - Size tokens: `--btn-size-{xs|sm|md|lg}`
|
|
237
|
+
* - Logical properties: `--btn-padding-inline`, `--btn-padding-block`
|
|
238
|
+
* - Full property names: `--btn-radius`, `--btn-color`, `--btn-display`, `--btn-border`
|
|
239
|
+
* - Approved abbreviations: `--btn-fs` (font-size), `--btn-bg` (background), `--btn-fw` (font-weight)
|
|
240
|
+
*/
|
|
241
|
+
export const Customization: Story = {
|
|
242
|
+
render: () => (
|
|
243
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "2rem" }}>
|
|
244
|
+
{/* Custom brand colors */}
|
|
245
|
+
<div>
|
|
246
|
+
<h4>Custom Brand Colors</h4>
|
|
247
|
+
<Button
|
|
248
|
+
type="button"
|
|
249
|
+
styles={{
|
|
250
|
+
"--btn-bg": "#0066cc",
|
|
251
|
+
"--btn-color": "white",
|
|
252
|
+
"--btn-radius": "0.5rem",
|
|
253
|
+
"--btn-padding-inline": "2rem",
|
|
254
|
+
"--btn-padding-block": "0.75rem",
|
|
255
|
+
}}
|
|
256
|
+
>
|
|
257
|
+
Brand Button
|
|
258
|
+
</Button>
|
|
259
|
+
</div>
|
|
260
|
+
|
|
261
|
+
{/* Custom sizes using logical properties */}
|
|
262
|
+
<div>
|
|
263
|
+
<h4>Custom Padding (Logical Properties)</h4>
|
|
264
|
+
<div style={{ display: "flex", gap: "1rem", flexWrap: "wrap" }}>
|
|
265
|
+
<Button
|
|
266
|
+
type="button"
|
|
267
|
+
styles={{
|
|
268
|
+
"--btn-padding-inline": "0.5rem",
|
|
269
|
+
"--btn-padding-block": "0.25rem",
|
|
270
|
+
"--btn-fs": "0.875rem",
|
|
271
|
+
}}
|
|
272
|
+
>
|
|
273
|
+
Compact
|
|
274
|
+
</Button>
|
|
275
|
+
<Button
|
|
276
|
+
type="button"
|
|
277
|
+
styles={{
|
|
278
|
+
"--btn-padding-inline": "3rem",
|
|
279
|
+
"--btn-padding-block": "1rem",
|
|
280
|
+
"--btn-fs": "1.125rem",
|
|
281
|
+
}}
|
|
282
|
+
>
|
|
283
|
+
Spacious
|
|
284
|
+
</Button>
|
|
285
|
+
</div>
|
|
286
|
+
</div>
|
|
287
|
+
|
|
288
|
+
{/* Custom hover effects */}
|
|
289
|
+
<div>
|
|
290
|
+
<h4>Custom Hover Effects</h4>
|
|
291
|
+
<Button
|
|
292
|
+
type="button"
|
|
293
|
+
styles={{
|
|
294
|
+
"--btn-bg": "#28a745",
|
|
295
|
+
"--btn-color": "white",
|
|
296
|
+
"--btn-hover-filter": "brightness(1.1)",
|
|
297
|
+
"--btn-hover-transform": "translateY(-2px)",
|
|
298
|
+
}}
|
|
299
|
+
>
|
|
300
|
+
Hover Me
|
|
301
|
+
</Button>
|
|
302
|
+
</div>
|
|
303
|
+
|
|
304
|
+
{/* Custom borders and shapes */}
|
|
305
|
+
<div>
|
|
306
|
+
<h4>Custom Borders & Shapes</h4>
|
|
307
|
+
<div style={{ display: "flex", gap: "1rem", flexWrap: "wrap" }}>
|
|
308
|
+
<Button
|
|
309
|
+
type="button"
|
|
310
|
+
styles={{
|
|
311
|
+
"--btn-bg": "transparent",
|
|
312
|
+
"--btn-color": "#0066cc",
|
|
313
|
+
"--btn-border": "2px solid currentColor",
|
|
314
|
+
"--btn-radius": "0",
|
|
315
|
+
}}
|
|
316
|
+
>
|
|
317
|
+
Square Outline
|
|
318
|
+
</Button>
|
|
319
|
+
<Button
|
|
320
|
+
type="button"
|
|
321
|
+
styles={{
|
|
322
|
+
"--btn-bg": "#dc3545",
|
|
323
|
+
"--btn-color": "white",
|
|
324
|
+
"--btn-radius": "100rem",
|
|
325
|
+
"--btn-padding-inline": "2rem",
|
|
326
|
+
}}
|
|
327
|
+
>
|
|
328
|
+
Pill Shape
|
|
329
|
+
</Button>
|
|
330
|
+
</div>
|
|
331
|
+
</div>
|
|
332
|
+
|
|
333
|
+
{/* Dark theme example */}
|
|
334
|
+
<div
|
|
335
|
+
style={{
|
|
336
|
+
background: "#1a1a1a",
|
|
337
|
+
padding: "1.5rem",
|
|
338
|
+
borderRadius: "0.5rem",
|
|
339
|
+
}}
|
|
340
|
+
>
|
|
341
|
+
<h4 style={{ color: "white", marginTop: 0 }}>Dark Theme Example</h4>
|
|
342
|
+
<div style={{ display: "flex", gap: "1rem", flexWrap: "wrap" }}>
|
|
343
|
+
<Button
|
|
344
|
+
type="button"
|
|
345
|
+
styles={{
|
|
346
|
+
"--btn-bg": "#3b82f6",
|
|
347
|
+
"--btn-color": "white",
|
|
348
|
+
"--btn-hover-filter": "brightness(1.2)",
|
|
349
|
+
}}
|
|
350
|
+
>
|
|
351
|
+
Primary
|
|
352
|
+
</Button>
|
|
353
|
+
<Button
|
|
354
|
+
type="button"
|
|
355
|
+
styles={{
|
|
356
|
+
"--btn-bg": "transparent",
|
|
357
|
+
"--btn-color": "#e5e7eb",
|
|
358
|
+
"--btn-border": "1px solid #4b5563",
|
|
359
|
+
"--btn-hover-filter": "brightness(1.3)",
|
|
360
|
+
}}
|
|
361
|
+
>
|
|
362
|
+
Secondary
|
|
363
|
+
</Button>
|
|
364
|
+
</div>
|
|
365
|
+
</div>
|
|
366
|
+
</div>
|
|
367
|
+
),
|
|
368
|
+
parameters: {
|
|
369
|
+
docs: {
|
|
370
|
+
description: {
|
|
371
|
+
story: `
|
|
372
|
+
## Available CSS Variables
|
|
373
|
+
|
|
374
|
+
### Size Tokens
|
|
375
|
+
- \`--btn-size-xs\`: 0.6875rem (11px)
|
|
376
|
+
- \`--btn-size-sm\`: 0.8125rem (13px)
|
|
377
|
+
- \`--btn-size-md\`: 0.9375rem (15px)
|
|
378
|
+
- \`--btn-size-lg\`: 1.125rem (18px)
|
|
379
|
+
|
|
380
|
+
### Base Properties
|
|
381
|
+
- \`--btn-padding-inline\`: Horizontal padding (logical property)
|
|
382
|
+
- \`--btn-padding-block\`: Vertical padding (logical property)
|
|
383
|
+
- \`--btn-radius\`: Border radius
|
|
384
|
+
- \`--btn-color\`: Text color
|
|
385
|
+
- \`--btn-bg\`: Background color
|
|
386
|
+
- \`--btn-border\`: Border style
|
|
387
|
+
- \`--btn-display\`: Display property
|
|
388
|
+
- \`--btn-whitespace\`: White-space handling
|
|
389
|
+
- \`--btn-spacing\`: Margin/spacing
|
|
390
|
+
|
|
391
|
+
### Typography (Approved Abbreviations)
|
|
392
|
+
- \`--btn-fs\`: Font size
|
|
393
|
+
- \`--btn-fw\`: Font weight
|
|
394
|
+
|
|
395
|
+
### State Variables
|
|
396
|
+
- \`--btn-hover-filter\`: Filter on hover
|
|
397
|
+
- \`--btn-hover-transform\`: Transform on hover
|
|
398
|
+
- \`--btn-hover-outline\`: Outline on hover
|
|
399
|
+
|
|
400
|
+
### Migration from Old Names
|
|
401
|
+
- ❌ \`--btn-px\` → ✅ \`--btn-padding-inline\`
|
|
402
|
+
- ❌ \`--btn-py\` → ✅ \`--btn-padding-block\`
|
|
403
|
+
- ❌ \`--btn-rds\` → ✅ \`--btn-radius\`
|
|
404
|
+
- ❌ \`--btn-cl\` → ✅ \`--btn-color\`
|
|
405
|
+
- ❌ \`--btn-dsp\` → ✅ \`--btn-display\`
|
|
406
|
+
- ❌ \`--btn-bdr\` → ✅ \`--btn-border\`
|
|
407
|
+
- ❌ \`--btn-wspc\` → ✅ \`--btn-whitespace\`
|
|
408
|
+
- ❌ \`--btn-spc\` → ✅ \`--btn-spacing\`
|
|
409
|
+
`,
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
} as Story;
|
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
:root {
|
|
2
|
-
|
|
2
|
+
// Base card properties
|
|
3
|
+
--card-padding: 2rem;
|
|
3
4
|
--card-bg: #fff;
|
|
4
|
-
--card-radius: calc(var(--card-
|
|
5
|
+
--card-radius: calc(var(--card-padding) / 4);
|
|
5
6
|
--card-position: relative;
|
|
6
7
|
--card-display: flex;
|
|
7
8
|
--card-direction: column;
|
|
8
9
|
--card-gap: 1rem;
|
|
10
|
+
|
|
11
|
+
// Element-specific variables (NEW - for complex card layouts)
|
|
12
|
+
--card-header-padding: 1rem 1.5rem;
|
|
13
|
+
--card-header-bg: #f8f9fa;
|
|
14
|
+
--card-header-border-bottom: 1px solid #dee2e6;
|
|
15
|
+
|
|
16
|
+
--card-body-padding: 1.5rem;
|
|
17
|
+
|
|
18
|
+
--card-footer-padding: 1rem 1.5rem;
|
|
19
|
+
--card-footer-bg: #f8f9fa;
|
|
20
|
+
--card-footer-border-top: 1px solid #dee2e6;
|
|
9
21
|
}
|
|
10
22
|
|
|
11
23
|
[data-card],
|
|
@@ -32,14 +44,36 @@
|
|
|
32
44
|
}
|
|
33
45
|
|
|
34
46
|
> *:not(img) {
|
|
35
|
-
padding-inline: var(--card-
|
|
47
|
+
padding-inline: var(--card-padding);
|
|
36
48
|
}
|
|
37
49
|
> *:last-child:not(img) {
|
|
38
50
|
// margin-block-end: 0;
|
|
39
|
-
padding-block-end: var(--card-
|
|
51
|
+
padding-block-end: var(--card-padding);
|
|
40
52
|
}
|
|
41
53
|
> *:first-child:not(img) {
|
|
42
|
-
padding-block-start: calc(var(--card-
|
|
54
|
+
padding-block-start: calc(var(--card-padding) - 0.5rem);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Element-specific styling (using new scoped variables)
|
|
58
|
+
> header,
|
|
59
|
+
> [data-card-header] {
|
|
60
|
+
padding: var(--card-header-padding);
|
|
61
|
+
background-color: var(--card-header-bg);
|
|
62
|
+
border-bottom: var(--card-header-border-bottom);
|
|
63
|
+
border-radius: var(--card-radius) var(--card-radius) 0 0;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
> [data-card-body] {
|
|
67
|
+
padding: var(--card-body-padding);
|
|
68
|
+
flex: 1;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
> footer,
|
|
72
|
+
> [data-card-footer] {
|
|
73
|
+
padding: var(--card-footer-padding);
|
|
74
|
+
background-color: var(--card-footer-bg);
|
|
75
|
+
border-top: var(--card-footer-border-top);
|
|
76
|
+
border-radius: 0 0 var(--card-radius) var(--card-radius);
|
|
43
77
|
}
|
|
44
78
|
}
|
|
45
79
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--card-p: 2rem;
|
|
3
|
+
--card-bg: #fff;
|
|
4
|
+
--card-radius: calc(var(--card-p) / 4);
|
|
5
|
+
--card-position: relative;
|
|
6
|
+
--card-display: flex;
|
|
7
|
+
--card-direction: column;
|
|
8
|
+
--card-gap: 1rem;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
[data-card],
|
|
12
|
+
[data-component~='card'] {
|
|
13
|
+
display: var(--card-display);
|
|
14
|
+
flex-direction: var(--card-direction);
|
|
15
|
+
gap: var(--card-gap);
|
|
16
|
+
border-radius: var(--card-radius);
|
|
17
|
+
background-color: var(--card-bg);
|
|
18
|
+
text-align: var(--card-align, left);
|
|
19
|
+
|
|
20
|
+
h3,
|
|
21
|
+
h2 {
|
|
22
|
+
margin-block-end: 0;
|
|
23
|
+
padding-block-end: 0;
|
|
24
|
+
}
|
|
25
|
+
+ div {
|
|
26
|
+
margin-block-start: 0;
|
|
27
|
+
}
|
|
28
|
+
> article {
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
flex: 2;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
> *:not(img) {
|
|
35
|
+
padding-inline: var(--card-p);
|
|
36
|
+
}
|
|
37
|
+
> *:last-child:not(img) {
|
|
38
|
+
// margin-block-end: 0;
|
|
39
|
+
padding-block-end: var(--card-p);
|
|
40
|
+
}
|
|
41
|
+
> *:first-child:not(img) {
|
|
42
|
+
padding-block-start: calc(var(--card-p) - 0.5rem);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Interactive card styles - WCAG 2.4.7 compliant focus indicators
|
|
47
|
+
[data-card="interactive"] {
|
|
48
|
+
cursor: pointer;
|
|
49
|
+
transition: box-shadow 0.2s ease, transform 0.2s ease;
|
|
50
|
+
|
|
51
|
+
&:hover {
|
|
52
|
+
transform: translateY(-2px);
|
|
53
|
+
box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.15);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Visible focus indicator with 3:1 minimum contrast (WCAG 2.4.7)
|
|
57
|
+
&:focus-visible {
|
|
58
|
+
outline: 0.125rem solid var(--focus-color, #0066CC);
|
|
59
|
+
outline-offset: 0.125rem;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Hide outline for mouse users (modern browsers)
|
|
63
|
+
&:focus:not(:focus-visible) {
|
|
64
|
+
outline: none;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
@@ -307,3 +307,186 @@ export const CustomHeadingLevels: Story = {
|
|
|
307
307
|
},
|
|
308
308
|
},
|
|
309
309
|
} as Story;
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* CSS Variable Customization
|
|
313
|
+
*
|
|
314
|
+
* Demonstrates how to customize card appearance using the new standardized
|
|
315
|
+
* CSS custom property naming convention.
|
|
316
|
+
*
|
|
317
|
+
* New variable naming patterns:
|
|
318
|
+
* - Base properties: `--card-padding`, `--card-radius`, `--card-bg`, `--card-gap`
|
|
319
|
+
* - Element-specific: `--card-header-*`, `--card-body-*`, `--card-footer-*`
|
|
320
|
+
* - Full property names (no single-letter abbreviations)
|
|
321
|
+
*/
|
|
322
|
+
export const Customization: Story = {
|
|
323
|
+
render: () => (
|
|
324
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
|
325
|
+
{/* Custom padding and spacing */}
|
|
326
|
+
<div>
|
|
327
|
+
<h4>Custom Padding & Spacing</h4>
|
|
328
|
+
<Card styles={{
|
|
329
|
+
"--card-padding": "3rem",
|
|
330
|
+
"--card-radius": "1rem",
|
|
331
|
+
"--card-gap": "1.5rem",
|
|
332
|
+
}}>
|
|
333
|
+
<Card.Title>Spacious Card</Card.Title>
|
|
334
|
+
<Card.Content>
|
|
335
|
+
<p>This card uses custom padding (3rem) and larger border radius (1rem).</p>
|
|
336
|
+
</Card.Content>
|
|
337
|
+
</Card>
|
|
338
|
+
</div>
|
|
339
|
+
|
|
340
|
+
{/* Compact card */}
|
|
341
|
+
<div>
|
|
342
|
+
<h4>Compact Card</h4>
|
|
343
|
+
<Card styles={{
|
|
344
|
+
"--card-padding": "1rem",
|
|
345
|
+
"--card-radius": "0.25rem",
|
|
346
|
+
"--card-gap": "0.5rem",
|
|
347
|
+
}}>
|
|
348
|
+
<Card.Title>Compact Card</Card.Title>
|
|
349
|
+
<Card.Content>
|
|
350
|
+
<p>This card uses minimal padding and smaller gaps for a compact layout.</p>
|
|
351
|
+
</Card.Content>
|
|
352
|
+
</Card>
|
|
353
|
+
</div>
|
|
354
|
+
|
|
355
|
+
{/* Custom header/footer styling */}
|
|
356
|
+
<div>
|
|
357
|
+
<h4>Element-Specific Customization (Header, Body, Footer)</h4>
|
|
358
|
+
<div style={{ display: 'flex', gap: '1rem', flexWrap: 'wrap' }}>
|
|
359
|
+
<Card styles={{
|
|
360
|
+
"--card-header-padding": "1.5rem 2rem",
|
|
361
|
+
"--card-header-bg": "#0066cc",
|
|
362
|
+
"--card-header-border-bottom": "none",
|
|
363
|
+
"--card-body-padding": "2rem",
|
|
364
|
+
"--card-footer-padding": "1rem 2rem",
|
|
365
|
+
"--card-footer-bg": "#f0f0f0",
|
|
366
|
+
"--card-footer-border-top": "2px solid #ddd",
|
|
367
|
+
}}>
|
|
368
|
+
<header data-card-header style={{ color: 'white' }}>
|
|
369
|
+
<h3 style={{ margin: 0 }}>Custom Header</h3>
|
|
370
|
+
</header>
|
|
371
|
+
<div data-card-body>
|
|
372
|
+
<p>This card demonstrates element-specific customization using the new scoped variables.</p>
|
|
373
|
+
<p>Header has custom blue background, body has custom padding, footer has custom gray background.</p>
|
|
374
|
+
</div>
|
|
375
|
+
<footer data-card-footer>
|
|
376
|
+
<small>Custom Footer Content</small>
|
|
377
|
+
</footer>
|
|
378
|
+
</Card>
|
|
379
|
+
|
|
380
|
+
<Card styles={{
|
|
381
|
+
"--card-header-padding": "0.75rem 1.25rem",
|
|
382
|
+
"--card-header-bg": "#28a745",
|
|
383
|
+
"--card-header-border-bottom": "3px solid #1e7e34",
|
|
384
|
+
"--card-body-padding": "1.25rem",
|
|
385
|
+
"--card-footer-padding": "0.75rem 1.25rem",
|
|
386
|
+
"--card-footer-bg": "#e7f5ea",
|
|
387
|
+
}}>
|
|
388
|
+
<header data-card-header style={{ color: 'white' }}>
|
|
389
|
+
<h3 style={{ margin: 0 }}>Green Theme</h3>
|
|
390
|
+
</header>
|
|
391
|
+
<div data-card-body>
|
|
392
|
+
<p>Another example with green theme and custom element spacing.</p>
|
|
393
|
+
</div>
|
|
394
|
+
<footer data-card-footer>
|
|
395
|
+
<small>Footer with light green background</small>
|
|
396
|
+
</footer>
|
|
397
|
+
</Card>
|
|
398
|
+
</div>
|
|
399
|
+
</div>
|
|
400
|
+
|
|
401
|
+
{/* Dark theme card */}
|
|
402
|
+
<div
|
|
403
|
+
style={{
|
|
404
|
+
background: "#1a1a1a",
|
|
405
|
+
padding: "1.5rem",
|
|
406
|
+
borderRadius: "0.5rem",
|
|
407
|
+
}}
|
|
408
|
+
>
|
|
409
|
+
<h4 style={{ color: "white", marginTop: 0 }}>Dark Theme Example</h4>
|
|
410
|
+
<Card styles={{
|
|
411
|
+
"--card-bg": "#2a2a2a",
|
|
412
|
+
"--card-padding": "2rem",
|
|
413
|
+
"--card-radius": "0.75rem",
|
|
414
|
+
"--card-header-bg": "#3a3a3a",
|
|
415
|
+
"--card-header-border-bottom": "1px solid #4a4a4a",
|
|
416
|
+
"--card-footer-bg": "#3a3a3a",
|
|
417
|
+
"--card-footer-border-top": "1px solid #4a4a4a",
|
|
418
|
+
}}>
|
|
419
|
+
<header data-card-header>
|
|
420
|
+
<h3 style={{ margin: 0, color: 'white' }}>Dark Mode Card</h3>
|
|
421
|
+
</header>
|
|
422
|
+
<div data-card-body style={{ color: '#e5e7eb' }}>
|
|
423
|
+
<p>This card demonstrates dark theme customization with all element-specific variables.</p>
|
|
424
|
+
</div>
|
|
425
|
+
<footer data-card-footer style={{ color: '#9ca3af' }}>
|
|
426
|
+
<small>Styled with CSS custom properties</small>
|
|
427
|
+
</footer>
|
|
428
|
+
</Card>
|
|
429
|
+
</div>
|
|
430
|
+
|
|
431
|
+
{/* Brand card */}
|
|
432
|
+
<div>
|
|
433
|
+
<h4>Brand Card (No Radius, Custom Colors)</h4>
|
|
434
|
+
<Card styles={{
|
|
435
|
+
"--card-bg": "#fff5e6",
|
|
436
|
+
"--card-radius": "0",
|
|
437
|
+
"--card-padding": "2.5rem",
|
|
438
|
+
"--card-gap": "2rem",
|
|
439
|
+
"--card-header-bg": "#ff9800",
|
|
440
|
+
"--card-header-border-bottom": "4px solid #f57c00",
|
|
441
|
+
}}>
|
|
442
|
+
<header data-card-header>
|
|
443
|
+
<h3 style={{ margin: 0, color: 'white' }}>Brand Card</h3>
|
|
444
|
+
</header>
|
|
445
|
+
<div data-card-body>
|
|
446
|
+
<p>This card uses brand colors and no border radius for a distinct look.</p>
|
|
447
|
+
</div>
|
|
448
|
+
</Card>
|
|
449
|
+
</div>
|
|
450
|
+
</div>
|
|
451
|
+
),
|
|
452
|
+
parameters: {
|
|
453
|
+
docs: {
|
|
454
|
+
description: {
|
|
455
|
+
story: `
|
|
456
|
+
## Available CSS Variables
|
|
457
|
+
|
|
458
|
+
### Base Properties
|
|
459
|
+
- \`--card-padding\`: Main card padding (default: 2rem)
|
|
460
|
+
- \`--card-bg\`: Background color (default: #fff)
|
|
461
|
+
- \`--card-radius\`: Border radius (default: calc(var(--card-padding) / 4))
|
|
462
|
+
- \`--card-display\`: Display property (default: flex)
|
|
463
|
+
- \`--card-direction\`: Flex direction (default: column)
|
|
464
|
+
- \`--card-gap\`: Gap between child elements (default: 1rem)
|
|
465
|
+
|
|
466
|
+
### Element-Specific Variables (NEW)
|
|
467
|
+
#### Header
|
|
468
|
+
- \`--card-header-padding\`: Header padding (default: 1rem 1.5rem)
|
|
469
|
+
- \`--card-header-bg\`: Header background color (default: #f8f9fa)
|
|
470
|
+
- \`--card-header-border-bottom\`: Header bottom border (default: 1px solid #dee2e6)
|
|
471
|
+
|
|
472
|
+
#### Body
|
|
473
|
+
- \`--card-body-padding\`: Body content padding (default: 1.5rem)
|
|
474
|
+
|
|
475
|
+
#### Footer
|
|
476
|
+
- \`--card-footer-padding\`: Footer padding (default: 1rem 1.5rem)
|
|
477
|
+
- \`--card-footer-bg\`: Footer background color (default: #f8f9fa)
|
|
478
|
+
- \`--card-footer-border-top\`: Footer top border (default: 1px solid #dee2e6)
|
|
479
|
+
|
|
480
|
+
### Migration from Old Names
|
|
481
|
+
- ❌ \`--card-p\` → ✅ \`--card-padding\`
|
|
482
|
+
|
|
483
|
+
### Usage with Element Selectors
|
|
484
|
+
Element-specific variables work with:
|
|
485
|
+
- \`<header>\` or \`[data-card-header]\`
|
|
486
|
+
- \`[data-card-body]\`
|
|
487
|
+
- \`<footer>\` or \`[data-card-footer]\`
|
|
488
|
+
`,
|
|
489
|
+
},
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
} as Story;
|
|
@@ -3,14 +3,14 @@ details {
|
|
|
3
3
|
--details-direction: column;
|
|
4
4
|
--details-display: flex;
|
|
5
5
|
--details-gap: 0rem;
|
|
6
|
-
--details-
|
|
6
|
+
--details-height: max-content;
|
|
7
7
|
--details-justify: flex-start;
|
|
8
|
-
--details-
|
|
9
|
-
--details-
|
|
8
|
+
--details-padding-inline: 1.5rem;
|
|
9
|
+
--details-padding-block: 1rem;
|
|
10
10
|
--details-radius: 0;
|
|
11
|
-
--details-
|
|
12
|
-
--max-
|
|
13
|
-
--max-
|
|
11
|
+
--details-width: 100%;
|
|
12
|
+
--details-max-height-closed: 6.25rem;
|
|
13
|
+
--details-max-height-open: 50rem;
|
|
14
14
|
--summary-align: center;
|
|
15
15
|
--summary-cursor: pointer;
|
|
16
16
|
--summary-display: flex;
|
|
@@ -23,12 +23,12 @@ details {
|
|
|
23
23
|
flex-direction: var(--details-direction);
|
|
24
24
|
justify-content: var(--details-justify);
|
|
25
25
|
gap: var(--details-gap);
|
|
26
|
-
width: var(--details-
|
|
26
|
+
width: var(--details-width);
|
|
27
27
|
border: var(--details-border);
|
|
28
28
|
border-left: none;
|
|
29
29
|
border-right: none;
|
|
30
30
|
transition: var(--summary-transitions);
|
|
31
|
-
max-height: var(--max-
|
|
31
|
+
max-height: var(--details-max-height-closed);
|
|
32
32
|
overflow: clip;
|
|
33
33
|
|
|
34
34
|
@starting-style {
|
|
@@ -62,8 +62,8 @@ details {
|
|
|
62
62
|
display: var(--summary-display);
|
|
63
63
|
justify-content: var(--summary-justify);
|
|
64
64
|
align-items: var(--summary-align);
|
|
65
|
-
padding-inline: var(--summary-
|
|
66
|
-
padding-block: var(--summary-
|
|
65
|
+
padding-inline: var(--summary-padding-inline, var(--details-padding-inline));
|
|
66
|
+
padding-block: var(--summary-padding-block, var(--details-padding-block));
|
|
67
67
|
gap: var(--summary-gap);
|
|
68
68
|
list-style: none;
|
|
69
69
|
border-top-left-radius: var(--details-radius);
|
|
@@ -85,7 +85,7 @@ details {
|
|
|
85
85
|
cursor: var(--summary-cursor);
|
|
86
86
|
}
|
|
87
87
|
> section {
|
|
88
|
-
width: var(--details-
|
|
88
|
+
width: var(--details-width);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
|
|
@@ -97,8 +97,8 @@ details {
|
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
> section {
|
|
100
|
-
padding-inline: var(--details-
|
|
101
|
-
padding-block: var(--details-
|
|
100
|
+
padding-inline: var(--details-padding-inline);
|
|
101
|
+
padding-block: var(--details-padding-block);
|
|
102
102
|
margin-block-start: 0;
|
|
103
103
|
border: 1px transparent solid;
|
|
104
104
|
}
|
|
@@ -110,7 +110,7 @@ details {
|
|
|
110
110
|
border-bottom: var(--details-border);
|
|
111
111
|
}
|
|
112
112
|
> section {
|
|
113
|
-
max-height: var(--max-
|
|
113
|
+
max-height: var(--details-max-height-open);
|
|
114
114
|
@starting-style {
|
|
115
115
|
max-height: 0;
|
|
116
116
|
}
|