@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
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/* Screen reader only utility class */
|
|
2
|
+
.sr-only {
|
|
3
|
+
position: absolute;
|
|
4
|
+
width: 1px;
|
|
5
|
+
height: 1px;
|
|
6
|
+
padding: 0;
|
|
7
|
+
margin: -1px;
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
clip: rect(0, 0, 0, 0);
|
|
10
|
+
white-space: nowrap;
|
|
11
|
+
border-width: 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
[role="alert"] {
|
|
15
|
+
/* Success colors */
|
|
16
|
+
--alert-success-bg: #e6f4ea;
|
|
17
|
+
--alert-success-border: #34a853;
|
|
18
|
+
--alert-success-text: #1e4620;
|
|
19
|
+
|
|
20
|
+
/* Error colors */
|
|
21
|
+
--alert-error-bg: #fdeded;
|
|
22
|
+
--alert-error-border: #d32f2f;
|
|
23
|
+
--alert-error-text: #5f2120;
|
|
24
|
+
|
|
25
|
+
/* Warning colors */
|
|
26
|
+
--alert-warning-bg: #fff4e5;
|
|
27
|
+
--alert-warning-border: #ff9800;
|
|
28
|
+
--alert-warning-text: #663c00;
|
|
29
|
+
|
|
30
|
+
/* Info colors */
|
|
31
|
+
--alert-info-bg: #e5f6fd;
|
|
32
|
+
--alert-info-border: #0288d1;
|
|
33
|
+
--alert-info-text: #084154;
|
|
34
|
+
|
|
35
|
+
/* Animation */
|
|
36
|
+
--alert-transition-duration: 0.3s;
|
|
37
|
+
|
|
38
|
+
--alert-border: thin solid currentColor;
|
|
39
|
+
|
|
40
|
+
background-color: var(--alert-bg, whitesmoke);
|
|
41
|
+
border: var(--alert-border, currentColor);
|
|
42
|
+
color: var(--alert-color, currentColor);
|
|
43
|
+
padding: var(--alert-padding, var(--spc-4));
|
|
44
|
+
margin-block-end: var(--alert-margin-block-end);
|
|
45
|
+
font-size: var(--fs-0);
|
|
46
|
+
line-height: 1.6;
|
|
47
|
+
display: flex;
|
|
48
|
+
flex-direction: row;
|
|
49
|
+
border-radius: var(--alert-border-radius, var(--border-radius));
|
|
50
|
+
gap: var(--alert-gap, var(--spc-4));
|
|
51
|
+
|
|
52
|
+
/* Exit animations */
|
|
53
|
+
transition:
|
|
54
|
+
opacity var(--alert-transition-duration) ease,
|
|
55
|
+
transform var(--alert-transition-duration) ease;
|
|
56
|
+
opacity: 1;
|
|
57
|
+
transform: translateY(0);
|
|
58
|
+
|
|
59
|
+
&:not([data-visible="true"]) {
|
|
60
|
+
opacity: 0;
|
|
61
|
+
transform: translateY(-0.5rem);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@media (prefers-reduced-motion: reduce) {
|
|
65
|
+
transition-duration: 0.01ms;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Focus indicators for keyboard navigation (WCAG 2.4.7) */
|
|
69
|
+
&:focus {
|
|
70
|
+
outline: 2px solid currentColor;
|
|
71
|
+
outline-offset: 2px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* Hide focus outline for mouse clicks, keep for keyboard */
|
|
75
|
+
&:focus:not(:focus-visible) {
|
|
76
|
+
outline: none;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.alert-icon {
|
|
80
|
+
margin-block-start: 0;
|
|
81
|
+
align-items: center;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.alert-message {
|
|
85
|
+
flex: 2;
|
|
86
|
+
margin-block-start: 0;
|
|
87
|
+
|
|
88
|
+
/* Title styles for both heading and strong elements */
|
|
89
|
+
.alert-title {
|
|
90
|
+
margin-block-end: var(--spc-1, 0.25rem);
|
|
91
|
+
margin-block-start: 0;
|
|
92
|
+
font-weight: var(--alert-title-weight, 600);
|
|
93
|
+
font-size: var(--alert-title-size, inherit);
|
|
94
|
+
line-height: 1.4;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* Reset heading-specific styles */
|
|
98
|
+
h2.alert-title,
|
|
99
|
+
h3.alert-title,
|
|
100
|
+
h4.alert-title,
|
|
101
|
+
h5.alert-title,
|
|
102
|
+
h6.alert-title {
|
|
103
|
+
margin: 0;
|
|
104
|
+
margin-block-end: var(--spc-1, 0.25rem);
|
|
105
|
+
font-size: inherit;
|
|
106
|
+
font-weight: var(--alert-title-weight, 600);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
&[data-alert~="info"] {
|
|
111
|
+
--alert-bg: var(--alert-info-bg);
|
|
112
|
+
--alert-color: var(--alert-info-text);
|
|
113
|
+
border-color: var(--alert-info-border);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
&[data-alert~="warning"] {
|
|
117
|
+
--alert-bg: var(--alert-warning-bg);
|
|
118
|
+
--alert-color: var(--alert-warning-text);
|
|
119
|
+
border-color: var(--alert-warning-border);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
&[data-alert~="error"] {
|
|
123
|
+
--alert-bg: var(--alert-error-bg);
|
|
124
|
+
--alert-color: var(--alert-error-text);
|
|
125
|
+
border-color: var(--alert-error-border);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
&[data-alert~="success"] {
|
|
129
|
+
--alert-bg: var(--alert-success-bg);
|
|
130
|
+
--alert-color: var(--alert-success-text);
|
|
131
|
+
border-color: var(--alert-success-border);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
button {
|
|
135
|
+
&[data-btn~="icon"] {
|
|
136
|
+
--btn-bg: transparent;
|
|
137
|
+
align-items: flex-start;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* Variant: Filled - Solid colored background */
|
|
142
|
+
&[data-variant="filled"] {
|
|
143
|
+
border: none;
|
|
144
|
+
|
|
145
|
+
&[data-alert~="info"] {
|
|
146
|
+
--alert-bg: var(--alert-info-border);
|
|
147
|
+
--alert-color: white;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
&[data-alert~="warning"] {
|
|
151
|
+
--alert-bg: var(--alert-warning-border);
|
|
152
|
+
--alert-color: white;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
&[data-alert~="error"] {
|
|
156
|
+
--alert-bg: var(--alert-error-border);
|
|
157
|
+
--alert-color: white;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
&[data-alert~="success"] {
|
|
161
|
+
--alert-bg: var(--alert-success-border);
|
|
162
|
+
--alert-color: white;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
&[data-alert~="default"] {
|
|
166
|
+
--alert-bg: #757575;
|
|
167
|
+
--alert-color: white;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Variant: Soft - No border, subtle background */
|
|
172
|
+
&[data-variant="soft"] {
|
|
173
|
+
border: none;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Variant: Outlined - Default with border (no additional styles needed) */
|
|
177
|
+
&[data-variant="outlined"] {
|
|
178
|
+
/* This is the default variant, styles already applied above */
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
p {
|
|
182
|
+
font-size: 0.875rem;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -41,8 +41,59 @@ const meta: Meta<typeof Alert> = {
|
|
|
41
41
|
parameters: {
|
|
42
42
|
docs: {
|
|
43
43
|
description: {
|
|
44
|
-
component:
|
|
45
|
-
|
|
44
|
+
component: `The Alert component is used to display important messages to users with support for multiple severity levels, variants, and accessibility features.
|
|
45
|
+
|
|
46
|
+
## CSS Variables
|
|
47
|
+
|
|
48
|
+
Customize the Alert appearance using CSS custom properties:
|
|
49
|
+
|
|
50
|
+
### Layout & Structure
|
|
51
|
+
- \`--alert-bg\`: Background color (default: \`whitesmoke\`)
|
|
52
|
+
- \`--alert-color\`: Text color (default: \`currentColor\`)
|
|
53
|
+
- \`--alert-border\`: Border style (default: \`thin solid currentColor\`)
|
|
54
|
+
- \`--alert-radius\`: Border radius (default: \`var(--border-radius)\`)
|
|
55
|
+
- \`--alert-padding\`: Internal padding (default: \`var(--spc-4)\`)
|
|
56
|
+
- \`--alert-margin-block-end\`: Bottom margin (default: none)
|
|
57
|
+
- \`--alert-gap\`: Gap between icon and content (default: \`var(--spc-4)\`)
|
|
58
|
+
|
|
59
|
+
### Severity Colors (Success)
|
|
60
|
+
- \`--alert-success-bg\`: Success background (default: \`#e6f4ea\`)
|
|
61
|
+
- \`--alert-success-border\`: Success border (default: \`#34a853\`)
|
|
62
|
+
- \`--alert-success-text\`: Success text (default: \`#1e4620\`)
|
|
63
|
+
|
|
64
|
+
### Severity Colors (Error)
|
|
65
|
+
- \`--alert-error-bg\`: Error background (default: \`#fdeded\`)
|
|
66
|
+
- \`--alert-error-border\`: Error border (default: \`#d32f2f\`)
|
|
67
|
+
- \`--alert-error-text\`: Error text (default: \`#5f2120\`)
|
|
68
|
+
|
|
69
|
+
### Severity Colors (Warning)
|
|
70
|
+
- \`--alert-warning-bg\`: Warning background (default: \`#fff4e5\`)
|
|
71
|
+
- \`--alert-warning-border\`: Warning border (default: \`#ff9800\`)
|
|
72
|
+
- \`--alert-warning-text\`: Warning text (default: \`#663c00\`)
|
|
73
|
+
|
|
74
|
+
### Severity Colors (Info)
|
|
75
|
+
- \`--alert-info-bg\`: Info background (default: \`#e5f6fd\`)
|
|
76
|
+
- \`--alert-info-border\`: Info border (default: \`#0288d1\`)
|
|
77
|
+
- \`--alert-info-text\`: Info text (default: \`#084154\`)
|
|
78
|
+
|
|
79
|
+
### Typography
|
|
80
|
+
- \`--alert-title-fw\`: Title font weight (default: \`600\`)
|
|
81
|
+
- \`--alert-title-fs\`: Title font size (default: \`inherit\`)
|
|
82
|
+
|
|
83
|
+
### Animation
|
|
84
|
+
- \`--alert-transition-duration\`: Animation timing (default: \`0.3s\`)
|
|
85
|
+
|
|
86
|
+
**Example:**
|
|
87
|
+
\`\`\`css
|
|
88
|
+
[role="alert"] {
|
|
89
|
+
--alert-radius: 0.5rem;
|
|
90
|
+
--alert-padding: 1.5rem;
|
|
91
|
+
--alert-gap: 1rem;
|
|
92
|
+
--alert-title-fw: 700;
|
|
93
|
+
--alert-success-bg: #d4edda;
|
|
94
|
+
--alert-success-border: #28a745;
|
|
95
|
+
}
|
|
96
|
+
\`\`\``,
|
|
46
97
|
},
|
|
47
98
|
},
|
|
48
99
|
},
|
|
@@ -3,13 +3,13 @@ sup:has(> span) {
|
|
|
3
3
|
--badge-color: currentColor;
|
|
4
4
|
--badge-radius: 0.5rem;
|
|
5
5
|
--badge-padding: 0.3rem;
|
|
6
|
-
--badge-
|
|
6
|
+
--badge-vertical-align: 0.5rem;
|
|
7
7
|
--badge-fs: var(--fs-1);
|
|
8
8
|
background-color: var(--badge-bg);
|
|
9
9
|
color: var(--badge-color);
|
|
10
10
|
padding: var(--badge-padding);
|
|
11
11
|
border-radius: var(--badge-radius);
|
|
12
|
-
vertical-align: var(--badge-
|
|
12
|
+
vertical-align: var(--badge-vertical-align);
|
|
13
13
|
font-size: var(--badge-fs);
|
|
14
14
|
span {
|
|
15
15
|
color: inherit;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
sup:has(> span) {
|
|
2
|
+
--badge-bg: lightgray;
|
|
3
|
+
--badge-color: currentColor;
|
|
4
|
+
--badge-radius: 0.5rem;
|
|
5
|
+
--badge-padding: 0.3rem;
|
|
6
|
+
--badge-v-align: 0.5rem;
|
|
7
|
+
--badge-fs: var(--fs-1);
|
|
8
|
+
background-color: var(--badge-bg);
|
|
9
|
+
color: var(--badge-color);
|
|
10
|
+
padding: var(--badge-padding);
|
|
11
|
+
border-radius: var(--badge-radius);
|
|
12
|
+
vertical-align: var(--badge-v-align);
|
|
13
|
+
font-size: var(--badge-fs);
|
|
14
|
+
span {
|
|
15
|
+
color: inherit;
|
|
16
|
+
}
|
|
17
|
+
&[data-badge~="rounded"] {
|
|
18
|
+
--badge-radius: 50%;
|
|
19
|
+
--badge-padding: 0;
|
|
20
|
+
--badge-size: 1.5625rem;
|
|
21
|
+
width: var(--badge-size);
|
|
22
|
+
height: var(--badge-size);
|
|
23
|
+
display: inline-flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
justify-content: center;
|
|
26
|
+
line-height: 1;
|
|
27
|
+
font-size: 0.6875rem;
|
|
28
|
+
font-weight: 700;
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
span {
|
|
32
|
+
max-width: 100%;
|
|
33
|
+
overflow: hidden;
|
|
34
|
+
text-overflow: clip;
|
|
35
|
+
white-space: nowrap;
|
|
36
|
+
padding: 0 0.125rem;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -8,6 +8,46 @@ const meta: Meta<typeof Badge> = {
|
|
|
8
8
|
title: "FP.REACT Components/Badge",
|
|
9
9
|
component: Badge,
|
|
10
10
|
tags: ["beta", "accessible"],
|
|
11
|
+
parameters: {
|
|
12
|
+
docs: {
|
|
13
|
+
description: {
|
|
14
|
+
component: `A notification badge component for displaying counts or status indicators with accessibility support.
|
|
15
|
+
|
|
16
|
+
## CSS Variables
|
|
17
|
+
|
|
18
|
+
Customize the Badge appearance using CSS custom properties:
|
|
19
|
+
|
|
20
|
+
### Layout & Structure
|
|
21
|
+
- \`--badge-bg\`: Background color (default: \`lightgray\`)
|
|
22
|
+
- \`--badge-color\`: Text color (default: \`currentColor\`)
|
|
23
|
+
- \`--badge-radius\`: Border radius (default: \`0.5rem\`)
|
|
24
|
+
- \`--badge-padding\`: Internal padding (default: \`0.3rem\`)
|
|
25
|
+
- \`--badge-vertical-align\`: Vertical alignment (default: \`0.5rem\`)
|
|
26
|
+
|
|
27
|
+
### Typography
|
|
28
|
+
- \`--badge-fs\`: Font size (default: \`var(--fs-1)\`)
|
|
29
|
+
|
|
30
|
+
### Rounded Variant
|
|
31
|
+
When using \`variant="rounded"\`:
|
|
32
|
+
- \`--badge-size\`: Fixed circular size (default: \`1.5625rem\`)
|
|
33
|
+
- Border radius automatically becomes \`50%\`
|
|
34
|
+
- Padding becomes \`0\`
|
|
35
|
+
- Content truncated with ellipsis if too long
|
|
36
|
+
|
|
37
|
+
**Example:**
|
|
38
|
+
\`\`\`css
|
|
39
|
+
sup:has(> span) {
|
|
40
|
+
--badge-bg: #ef4444;
|
|
41
|
+
--badge-color: white;
|
|
42
|
+
--badge-radius: 0.25rem;
|
|
43
|
+
--badge-padding: 0.5rem;
|
|
44
|
+
--badge-vertical-align: 0.75rem;
|
|
45
|
+
--badge-fs: 0.875rem;
|
|
46
|
+
}
|
|
47
|
+
\`\`\``,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
11
51
|
args: {
|
|
12
52
|
children: "5",
|
|
13
53
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
nav:not(body > nav),
|
|
2
2
|
nav[data-breadcrumb] {
|
|
3
|
-
--breadcrumb-
|
|
4
|
-
--breadcrumb-
|
|
3
|
+
--breadcrumb-padding-inline: unset;
|
|
4
|
+
--breadcrumb-display: flex;
|
|
5
5
|
--breadcrumb-gap: 0.5rem;
|
|
6
6
|
--breadcrumb-color: currentColor;
|
|
7
7
|
--breadcrumb-current-color: rgb(46, 46, 46);
|
|
@@ -9,12 +9,12 @@ nav[data-breadcrumb] {
|
|
|
9
9
|
margin-inline: unset;
|
|
10
10
|
padding-inline: unset;
|
|
11
11
|
ol {
|
|
12
|
-
padding-inline: var(--breadcrumb-
|
|
13
|
-
display: var(--breadcrumb-
|
|
12
|
+
padding-inline: var(--breadcrumb-padding-inline);
|
|
13
|
+
display: var(--breadcrumb-display);
|
|
14
14
|
gap: var(--breadcrumb-gap);
|
|
15
15
|
li {
|
|
16
16
|
padding-inline: unset;
|
|
17
|
-
width: var(--breadcrumb-
|
|
17
|
+
width: var(--breadcrumb-width, fit-content);
|
|
18
18
|
text-transform: capitalize;
|
|
19
19
|
display: flex;
|
|
20
20
|
color: var(--breadcrumb-color);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
nav:not(body > nav),
|
|
2
|
+
nav[data-breadcrumb] {
|
|
3
|
+
--breadcrumb-px: unset;
|
|
4
|
+
--breadcrumb-dsp: flex;
|
|
5
|
+
--breadcrumb-gap: 0.5rem;
|
|
6
|
+
--breadcrumb-color: currentColor;
|
|
7
|
+
--breadcrumb-current-color: rgb(46, 46, 46);
|
|
8
|
+
--breadcrumb-fs: var(--fs-3);
|
|
9
|
+
margin-inline: unset;
|
|
10
|
+
padding-inline: unset;
|
|
11
|
+
ol {
|
|
12
|
+
padding-inline: var(--breadcrumb-px);
|
|
13
|
+
display: var(--breadcrumb-dsp);
|
|
14
|
+
gap: var(--breadcrumb-gap);
|
|
15
|
+
li {
|
|
16
|
+
padding-inline: unset;
|
|
17
|
+
width: var(--breadcrumb-w, fit-content);
|
|
18
|
+
text-transform: capitalize;
|
|
19
|
+
display: flex;
|
|
20
|
+
color: var(--breadcrumb-color);
|
|
21
|
+
gap: 0.5rem;
|
|
22
|
+
font-size: var(--breadcrumb-fs);
|
|
23
|
+
span[aria-hidden="true"] {
|
|
24
|
+
opacity: 0.6;
|
|
25
|
+
}
|
|
26
|
+
a[href] {
|
|
27
|
+
font-size: var(--breadcrumb-fs);
|
|
28
|
+
&[aria-current] {
|
|
29
|
+
color: var(--breadcrumb-current-color);
|
|
30
|
+
text-decoration: none;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -17,7 +17,23 @@ const meta: Meta<typeof Breadcrumb> = {
|
|
|
17
17
|
|
|
18
18
|
**Features:** Automatic path parsing, custom route naming, text truncation, full accessibility support, and performance optimized with memoization.
|
|
19
19
|
|
|
20
|
-
**Accessibility:** Semantic HTML (\`<nav>\`, \`<ol>\`), proper ARIA labels, current page marked with \`aria-current="page"\`, and truncated text includes full text in \`aria-label
|
|
20
|
+
**Accessibility:** Semantic HTML (\`<nav>\`, \`<ol>\`), proper ARIA labels, current page marked with \`aria-current="page"\`, and truncated text includes full text in \`aria-label\`.
|
|
21
|
+
|
|
22
|
+
## CSS Variables
|
|
23
|
+
|
|
24
|
+
### Layout & Display
|
|
25
|
+
- \`--breadcrumb-display\`: Display mode for breadcrumb list (default: flex)
|
|
26
|
+
- \`--breadcrumb-width\`: Width of list items (default: fit-content)
|
|
27
|
+
|
|
28
|
+
### Spacing
|
|
29
|
+
- \`--breadcrumb-padding-inline\`: Horizontal padding (default: unset)
|
|
30
|
+
- \`--breadcrumb-gap\`: Gap between breadcrumb items (default: 0.5rem)
|
|
31
|
+
|
|
32
|
+
### Typography & Color
|
|
33
|
+
- \`--breadcrumb-fs\`: Font size (default: var(--fs-3))
|
|
34
|
+
- \`--breadcrumb-color\`: Text color (default: currentColor)
|
|
35
|
+
- \`--breadcrumb-current-color\`: Current page color (default: rgb(46, 46, 46))
|
|
36
|
+
`,
|
|
21
37
|
},
|
|
22
38
|
},
|
|
23
39
|
},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
button {
|
|
2
|
-
|
|
3
|
-
--btn-
|
|
4
|
-
--btn-
|
|
5
|
-
--btn-
|
|
2
|
+
// Size tokens - renamed for clarity
|
|
3
|
+
--btn-size-xs: 0.6875rem;
|
|
4
|
+
--btn-size-sm: 0.8125rem;
|
|
5
|
+
--btn-size-md: 0.9375rem;
|
|
6
|
+
--btn-size-lg: 1.125rem;
|
|
6
7
|
--btn-pill: 100rem;
|
|
7
|
-
--btn-fs: var(--btn-md);
|
|
8
|
+
--btn-fs: var(--btn-size-md);
|
|
8
9
|
--btn-height: calc(var(--btn-fs) * 2.25);
|
|
9
10
|
--btn-bg: lightgray;
|
|
10
11
|
--btn-width: max-content;
|
|
@@ -13,16 +14,16 @@ button {
|
|
|
13
14
|
font-weight: var(--btn-fw, 500);
|
|
14
15
|
height: var(--btn-height);
|
|
15
16
|
place-items: var(--btn-place, center);
|
|
16
|
-
padding-inline: var(--btn-
|
|
17
|
-
padding-block: var(--btn-
|
|
18
|
-
border: var(--btn-
|
|
19
|
-
border-radius: var(--btn-
|
|
17
|
+
padding-inline: var(--btn-padding-inline, calc(var(--btn-fs) * 1.5));
|
|
18
|
+
padding-block: var(--btn-padding-block, calc(var(--btn-fs) * 0.5));
|
|
19
|
+
border: var(--btn-border, none);
|
|
20
|
+
border-radius: var(--btn-radius, calc(6rem / 16));
|
|
20
21
|
text-decoration: var(--btn-deco, none);
|
|
21
|
-
color: var(--btn-
|
|
22
|
-
display: var(--btn-
|
|
22
|
+
color: var(--btn-color, currentColor);
|
|
23
|
+
display: var(--btn-display, inline-flex);
|
|
23
24
|
gap: var(--btn-gap, 0.2rem);
|
|
24
|
-
white-space: var(--btn-
|
|
25
|
-
margin: var(--btn-
|
|
25
|
+
white-space: var(--btn-whitespace, inherit);
|
|
26
|
+
margin: var(--btn-spacing, 0);
|
|
26
27
|
transition: var(
|
|
27
28
|
--btn-transition,
|
|
28
29
|
var(--tran-all, all 0.3s cubic-bezier(0.4, 0, 0.2, 1))
|
|
@@ -36,7 +37,7 @@ button {
|
|
|
36
37
|
|
|
37
38
|
&[type] {
|
|
38
39
|
background-color: var(--btn-bg, var(--neutral-300));
|
|
39
|
-
--btn-
|
|
40
|
+
--btn-border: solid var(--btn-sg);
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
&[type="submit"],
|
|
@@ -76,13 +77,12 @@ button {
|
|
|
76
77
|
&[type="reset"] {
|
|
77
78
|
--btn-bg: transparent;
|
|
78
79
|
--btn-color: gray;
|
|
79
|
-
--btn-
|
|
80
|
+
--btn-border: gray thin solid;
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
&[type="submit"] {
|
|
83
84
|
--btn-bg: var(--primary-700, blue);
|
|
84
|
-
--btn-
|
|
85
|
-
--btn-color: rgb(231, 231, 231);
|
|
85
|
+
--btn-color: #fff;
|
|
86
86
|
--btn-border: none;
|
|
87
87
|
}
|
|
88
88
|
|
|
@@ -94,23 +94,23 @@ button {
|
|
|
94
94
|
|
|
95
95
|
&[data-btn~="xs"],
|
|
96
96
|
.btn-xs {
|
|
97
|
-
--btn-fs: var(--btn-xs);
|
|
97
|
+
--btn-fs: var(--btn-size-xs);
|
|
98
98
|
text-transform: uppercase;
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
&[data-btn~="sm"],
|
|
102
102
|
.btn-sm {
|
|
103
|
-
--btn-fs: var(--btn-sm);
|
|
103
|
+
--btn-fs: var(--btn-size-sm);
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
&[data-btn~="md"],
|
|
107
107
|
.btn-md {
|
|
108
|
-
--btn-fs: var(--btn-md);
|
|
108
|
+
--btn-fs: var(--btn-size-md);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
&[data-btn~="lg"],
|
|
112
112
|
.btn-lg {
|
|
113
|
-
--btn-fs: var(--btn-lg);
|
|
113
|
+
--btn-fs: var(--btn-size-lg);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
&[data-btn~="icon"],
|
|
@@ -129,15 +129,15 @@ button {
|
|
|
129
129
|
&[data-btn~="text"],
|
|
130
130
|
.btn-text {
|
|
131
131
|
--btn-bg: transparent;
|
|
132
|
-
--btn-
|
|
133
|
-
--btn-
|
|
132
|
+
--btn-color: currentColor;
|
|
133
|
+
--btn-border: none;
|
|
134
134
|
--btn-height: unset;
|
|
135
135
|
--btn-width: unset;
|
|
136
|
-
--btn-
|
|
137
|
-
--btn-
|
|
136
|
+
--btn-padding-block: 0.75rem;
|
|
137
|
+
--btn-padding-inline: 0.75rem;
|
|
138
138
|
&:is(:hover, :focus) {
|
|
139
|
-
background-color: color-mix(in srgb, var(--btn-
|
|
140
|
-
outline: 0.025rem solid var(--btn-
|
|
139
|
+
background-color: color-mix(in srgb, var(--btn-color) 10%, transparent);
|
|
140
|
+
outline: 0.025rem solid var(--btn-color);
|
|
141
141
|
outline-offset: 0;
|
|
142
142
|
filter: none; // Override parent filter
|
|
143
143
|
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
button {
|
|
2
|
+
--btn-xs: 0.6875rem;
|
|
3
|
+
--btn-sm: 0.8125rem;
|
|
4
|
+
--btn-md: 0.9375rem;
|
|
5
|
+
--btn-lg: 1.125rem;
|
|
6
|
+
--btn-pill: 100rem;
|
|
7
|
+
--btn-fs: var(--btn-md);
|
|
8
|
+
--btn-height: calc(var(--btn-fs) * 2.25);
|
|
9
|
+
--btn-bg: lightgray;
|
|
10
|
+
--btn-width: max-content;
|
|
11
|
+
|
|
12
|
+
font-size: var(--btn-fs);
|
|
13
|
+
font-weight: var(--btn-fw, 500);
|
|
14
|
+
height: var(--btn-height);
|
|
15
|
+
place-items: var(--btn-place, center);
|
|
16
|
+
padding-inline: var(--btn-px, calc(var(--btn-fs) * 1.5));
|
|
17
|
+
padding-block: var(--btn-py, calc(var(--btn-fs) * 0.5));
|
|
18
|
+
border: var(--btn-bdr, none);
|
|
19
|
+
border-radius: var(--btn-rds, calc(6rem / 16));
|
|
20
|
+
text-decoration: var(--btn-deco, none);
|
|
21
|
+
color: var(--btn-cl, currentColor);
|
|
22
|
+
display: var(--btn-dsp, inline-flex);
|
|
23
|
+
gap: var(--btn-gap, 0.2rem);
|
|
24
|
+
white-space: var(--btn-wspc, inherit);
|
|
25
|
+
margin: var(--btn-spc, 0);
|
|
26
|
+
transition: var(
|
|
27
|
+
--btn-transition,
|
|
28
|
+
var(--tran-all, all 0.3s cubic-bezier(0.4, 0, 0.2, 1))
|
|
29
|
+
);
|
|
30
|
+
background-color: var(--btn-bg, var(--btn));
|
|
31
|
+
outline: none;
|
|
32
|
+
width: var(--btn-width);
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
line-height: 0cap;
|
|
36
|
+
|
|
37
|
+
&[type] {
|
|
38
|
+
background-color: var(--btn-bg, var(--neutral-300));
|
|
39
|
+
--btn-bdr: solid var(--btn-sg);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
&[type="submit"],
|
|
43
|
+
&[style*="submit"] {
|
|
44
|
+
--btn-bg: var(--primary-500, royal-blue);
|
|
45
|
+
--btn-color: white;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
&[disabled],
|
|
49
|
+
&[aria-disabled="true"] {
|
|
50
|
+
cursor: var(--btn-cursor, not-allowed);
|
|
51
|
+
// opacity: var(--btn-opacity, 0.5);
|
|
52
|
+
|
|
53
|
+
&:is(:hover, :focus) {
|
|
54
|
+
transform: none;
|
|
55
|
+
// background-color: var(--btn-bg, lightgray);
|
|
56
|
+
// opacity: var(--btn-opacity, 0.5);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// TODO: add hover/focus with :if()
|
|
61
|
+
&:is(:hover, :focus) {
|
|
62
|
+
// Darken the background on hover by reducing brightness
|
|
63
|
+
filter: var(--btn-hover-filter, brightness(0.85));
|
|
64
|
+
transform: var(--btn-hover-transform, scale(1.03));
|
|
65
|
+
outline: var(--btn-hover-outline, thin);
|
|
66
|
+
outline-offset: var(--line-offset, 1px);
|
|
67
|
+
// outline-style: var(--line-style, solid);
|
|
68
|
+
|
|
69
|
+
&[aria-disabled="true"] {
|
|
70
|
+
transform: none;
|
|
71
|
+
opacity: var(--btn-opacity, 0.5);
|
|
72
|
+
filter: none;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
&[type="reset"] {
|
|
77
|
+
--btn-bg: transparent;
|
|
78
|
+
--btn-color: gray;
|
|
79
|
+
--btn-bdr: gray thin solid;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&[type="submit"] {
|
|
83
|
+
--btn-bg: var(--primary-700, blue);
|
|
84
|
+
--btn-cl: #fff;
|
|
85
|
+
--btn-color: rgb(231, 231, 231);
|
|
86
|
+
--btn-border: none;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
&[data-fp-btn~="pill"],
|
|
90
|
+
&[data-btn~="pill"],
|
|
91
|
+
&[data-style~="pill"] {
|
|
92
|
+
border-radius: var(--btn-pill, 100rem);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&[data-btn~="xs"],
|
|
96
|
+
.btn-xs {
|
|
97
|
+
--btn-fs: var(--btn-xs);
|
|
98
|
+
text-transform: uppercase;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
&[data-btn~="sm"],
|
|
102
|
+
.btn-sm {
|
|
103
|
+
--btn-fs: var(--btn-sm);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
&[data-btn~="md"],
|
|
107
|
+
.btn-md {
|
|
108
|
+
--btn-fs: var(--btn-md);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
&[data-btn~="lg"],
|
|
112
|
+
.btn-lg {
|
|
113
|
+
--btn-fs: var(--btn-lg);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
&[data-btn~="icon"],
|
|
117
|
+
.btn-icon {
|
|
118
|
+
padding: unset;
|
|
119
|
+
height: unset;
|
|
120
|
+
--btn-bg: transparent;
|
|
121
|
+
min-width: 1.5rem;
|
|
122
|
+
min-height: 1.5rem;
|
|
123
|
+
text-align: center;
|
|
124
|
+
display: inline-flex;
|
|
125
|
+
align-items: center;
|
|
126
|
+
justify-content: center;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
&[data-btn~="text"],
|
|
130
|
+
.btn-text {
|
|
131
|
+
--btn-bg: transparent;
|
|
132
|
+
--btn-cl: currentColor;
|
|
133
|
+
--btn-bdr: none;
|
|
134
|
+
--btn-height: unset;
|
|
135
|
+
--btn-width: unset;
|
|
136
|
+
--btn-py: 0.75rem;
|
|
137
|
+
--btn-px: 0.75rem;
|
|
138
|
+
&:is(:hover, :focus) {
|
|
139
|
+
background-color: color-mix(in srgb, var(--btn-cl) 10%, transparent);
|
|
140
|
+
outline: 0.025rem solid var(--btn-cl);
|
|
141
|
+
outline-offset: 0;
|
|
142
|
+
filter: none; // Override parent filter
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|