@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.
Files changed (109) hide show
  1. package/libs/components/alert/alert.css +1 -1
  2. package/libs/components/alert/alert.css.map +1 -1
  3. package/libs/components/alert/alert.min.css +2 -2
  4. package/libs/components/badge/badge.css +1 -1
  5. package/libs/components/badge/badge.css.map +1 -1
  6. package/libs/components/badge/badge.min.css +2 -2
  7. package/libs/components/breadcrumbs/breadcrumb.css +1 -1
  8. package/libs/components/breadcrumbs/breadcrumb.css.map +1 -1
  9. package/libs/components/breadcrumbs/breadcrumb.min.css +2 -2
  10. package/libs/components/buttons/button.css +1 -1
  11. package/libs/components/buttons/button.css.map +1 -1
  12. package/libs/components/buttons/button.min.css +2 -2
  13. package/libs/components/cards/card.css +1 -1
  14. package/libs/components/cards/card.css.map +1 -1
  15. package/libs/components/cards/card.min.css +2 -2
  16. package/libs/components/details/details.css +1 -1
  17. package/libs/components/details/details.css.map +1 -1
  18. package/libs/components/details/details.min.css +2 -2
  19. package/libs/components/dialog/dialog.css +1 -1
  20. package/libs/components/dialog/dialog.css.map +1 -1
  21. package/libs/components/dialog/dialog.min.css +2 -2
  22. package/libs/components/form/form.css +1 -1
  23. package/libs/components/form/form.css.map +1 -1
  24. package/libs/components/form/form.min.css +2 -2
  25. package/libs/components/icons/icon.d.cts +32 -32
  26. package/libs/components/icons/icon.d.ts +32 -32
  27. package/libs/components/images/img.css +1 -1
  28. package/libs/components/images/img.css.map +1 -1
  29. package/libs/components/images/img.min.css +2 -2
  30. package/libs/components/layout/landmarks.css +1 -1
  31. package/libs/components/layout/landmarks.css.map +1 -1
  32. package/libs/components/layout/landmarks.min.css +2 -2
  33. package/libs/components/link/link.css +1 -1
  34. package/libs/components/link/link.css.map +1 -1
  35. package/libs/components/link/link.min.css +2 -2
  36. package/libs/components/nav/nav.css +1 -1
  37. package/libs/components/nav/nav.css.map +1 -1
  38. package/libs/components/nav/nav.min.css +2 -2
  39. package/libs/components/progress/progress.css +1 -1
  40. package/libs/components/progress/progress.css.map +1 -1
  41. package/libs/components/progress/progress.min.css +2 -2
  42. package/libs/components/tag/tag.css +1 -1
  43. package/libs/components/tag/tag.css.map +1 -1
  44. package/libs/components/tag/tag.min.css +2 -2
  45. package/libs/index.css +1 -1
  46. package/libs/index.css.map +1 -1
  47. package/package.json +1 -1
  48. package/src/components/alert/alert.scss +4 -4
  49. package/src/components/alert/alert.scss.backup +184 -0
  50. package/src/components/alert/alert.stories.tsx +53 -2
  51. package/src/components/badge/badge.scss +2 -2
  52. package/src/components/badge/badge.scss.backup +39 -0
  53. package/src/components/badge/badge.stories.tsx +40 -0
  54. package/src/components/breadcrumbs/breadcrumb.scss +5 -5
  55. package/src/components/breadcrumbs/breadcrumb.scss.backup +35 -0
  56. package/src/components/breadcrumbs/breadcrumb.stories.tsx +17 -1
  57. package/src/components/buttons/button.scss +27 -27
  58. package/src/components/buttons/button.scss.backup +145 -0
  59. package/src/components/buttons/button.stories.tsx +188 -2
  60. package/src/components/cards/card.scss +39 -5
  61. package/src/components/cards/card.scss.backup +67 -0
  62. package/src/components/cards/card.stories.tsx +183 -0
  63. package/src/components/details/details.scss +14 -14
  64. package/src/components/details/details.scss.backup +126 -0
  65. package/src/components/details/details.stories.tsx +40 -0
  66. package/src/components/dialog/dialog.scss +3 -3
  67. package/src/components/dialog/dialog.scss.backup +126 -0
  68. package/src/components/form/form.scss +25 -9
  69. package/src/components/form/form.scss.backup +87 -0
  70. package/src/components/form/form.stories.tsx +271 -0
  71. package/src/components/form/input.stories.tsx +158 -0
  72. package/src/components/images/figure.stories.tsx +41 -1
  73. package/src/components/images/img.scss +8 -8
  74. package/src/components/images/img.scss.backup +59 -0
  75. package/src/components/layout/_header.scss +14 -14
  76. package/src/components/layout/_header.scss.backup +72 -0
  77. package/src/components/layout/landmarks.scss +7 -7
  78. package/src/components/layout/landmarks.scss.backup +51 -0
  79. package/src/components/layout/landmarks.stories.tsx +42 -0
  80. package/src/components/link/link.scss +5 -5
  81. package/src/components/link/link.scss.backup +145 -0
  82. package/src/components/link/link.stories.tsx +38 -2
  83. package/src/components/nav/nav.scss +17 -17
  84. package/src/components/nav/nav.scss.backup +123 -0
  85. package/src/components/nav/nav.stories.tsx +35 -1
  86. package/src/components/progress/progress.scss +7 -7
  87. package/src/components/progress/progress.scss.backup +70 -0
  88. package/src/components/tag/tag.scss +10 -10
  89. package/src/components/tag/tag.scss.backup +130 -0
  90. package/src/components/tag/tag.stories.tsx +23 -2
  91. package/src/styles/alert/alert.css +4 -4
  92. package/src/styles/badge/badge.css +2 -2
  93. package/src/styles/breadcrumbs/breadcrumb.css +5 -5
  94. package/src/styles/buttons/button.css +26 -27
  95. package/src/styles/buttons/button.css.map +1 -1
  96. package/src/styles/cards/card.css +35 -5
  97. package/src/styles/cards/card.css.map +1 -1
  98. package/src/styles/details/details.css +14 -14
  99. package/src/styles/dialog/dialog.css +3 -3
  100. package/src/styles/form/form.css +20 -10
  101. package/src/styles/form/form.css.map +1 -1
  102. package/src/styles/images/img.css +8 -8
  103. package/src/styles/index.css +170 -131
  104. package/src/styles/index.css.map +1 -1
  105. package/src/styles/layout/landmarks.css +21 -21
  106. package/src/styles/link/link.css +5 -5
  107. package/src/styles/nav/nav.css +17 -17
  108. package/src/styles/progress/progress.css +6 -6
  109. 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
- "The Alert component is used to display important messages to users. It can be dismissible and supports various interaction tests",
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-v-align: 0.5rem;
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-v-align);
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-px: unset;
4
- --breadcrumb-dsp: flex;
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-px);
13
- display: var(--breadcrumb-dsp);
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-w, fit-content);
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
- --btn-xs: 0.6875rem;
3
- --btn-sm: 0.8125rem;
4
- --btn-md: 0.9375rem;
5
- --btn-lg: 1.125rem;
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-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));
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-cl, currentColor);
22
- display: var(--btn-dsp, inline-flex);
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-wspc, inherit);
25
- margin: var(--btn-spc, 0);
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-bdr: solid var(--btn-sg);
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-bdr: gray thin solid;
80
+ --btn-border: gray thin solid;
80
81
  }
81
82
 
82
83
  &[type="submit"] {
83
84
  --btn-bg: var(--primary-700, blue);
84
- --btn-cl: #fff;
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-cl: currentColor;
133
- --btn-bdr: none;
132
+ --btn-color: currentColor;
133
+ --btn-border: none;
134
134
  --btn-height: unset;
135
135
  --btn-width: unset;
136
- --btn-py: 0.75rem;
137
- --btn-px: 0.75rem;
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-cl) 10%, transparent);
140
- outline: 0.025rem solid var(--btn-cl);
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
+ }