@uncinq/css-components 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,9 @@
1
1
  /* components/alert.css */
2
2
  @layer components {
3
3
  .alert {
4
+ --color-link: var(--alert-color-text);
4
5
  background-color: var(--alert-color-bg);
6
+ border: var(--alert-border);
5
7
  border-radius: var(--alert-border-radius);
6
8
  color: var(--alert-color-text);
7
9
  display: flex;
@@ -17,6 +19,7 @@
17
19
 
18
20
  .alert-heading {
19
21
  align-items: center;
22
+ color: var(--alert-color-text);
20
23
  display: flex;
21
24
  font-weight: var(--font-weight-semibold);
22
25
  gap: var(--alert-gap);
@@ -9,15 +9,55 @@
9
9
  font-size: var(--badge-font-size);
10
10
  font-weight: var(--badge-font-weight);
11
11
  padding: var(--badge-padding-y) var(--badge-padding-x);
12
+ text-decoration: none;
13
+ }
14
+
15
+ @media (hover: hover) and (pointer: fine) {
16
+ a.badge:hover {
17
+ background-color: var(--badge-color-bg-hover, var(--badge-color-bg));
18
+ color: var(--badge-color-text-hover, var(--badge-color-text));
19
+ }
12
20
  }
13
21
 
14
22
  /* Variants */
15
- .badge-danger { --badge-color-bg: var(--color-danger-muted); --badge-color-text: var(--color-danger-strong); }
16
- .badge-dark { --badge-color-bg: var(--color-dark-muted); --badge-color-text: var(--color-dark-strong); }
17
- .badge-info { --badge-color-bg: var(--color-info-muted); --badge-color-text: var(--color-info-strong); }
18
- .badge-light { --badge-color-bg: var(--color-light-muted); --badge-color-text: var(--color-light-strong); }
19
- .badge-primary { --badge-color-bg: var(--color-primary-muted); --badge-color-text: var(--color-primary-strong); }
20
- .badge-secondary { --badge-color-bg: var(--color-secondary-muted); --badge-color-text: var(--color-secondary-strong); }
21
- .badge-success { --badge-color-bg: var(--color-success-muted); --badge-color-text: var(--color-success-strong); }
22
- .badge-warning { --badge-color-bg: var(--color-warning-muted); --badge-color-text: var(--color-warning-strong); }
23
+ .badge-danger {
24
+ --badge-color-bg: var(--color-danger);
25
+ --badge-color-bg-hover: var(--color-danger-strong);
26
+ --badge-color-text: var(--color-text-on-danger);
27
+ }
28
+ .badge-dark {
29
+ --badge-color-bg: var(--color-dark);
30
+ --badge-color-bg-hover: var(--color-dark-strong);
31
+ --badge-color-text: var(--color-text-on-dark);
32
+ }
33
+ .badge-info {
34
+ --badge-color-bg: var(--color-info);
35
+ --badge-color-bg-hover: var(--color-info-strong);
36
+ --badge-color-text: var(--color-text-on-info);
37
+ }
38
+ .badge-light {
39
+ --badge-color-bg: var(--color-light);
40
+ --badge-color-bg-hover: var(--color-light-strong);
41
+ --badge-color-text: var(--color-text-on-light);
42
+ }
43
+ .badge-primary {
44
+ --badge-color-bg: var(--color-primary);
45
+ --badge-color-bg-hover: var(--color-primary-strong);
46
+ --badge-color-text: var(--color-text-on-primary);
47
+ }
48
+ .badge-secondary {
49
+ --badge-color-bg: var(--color-secondary);
50
+ --badge-color-bg-hover: var(--color-secondary-strong);
51
+ --badge-color-text: var(--color-text-on-secondary);
52
+ }
53
+ .badge-success {
54
+ --badge-color-bg: var(--color-success);
55
+ --badge-color-bg-hover: var(--color-success-strong);
56
+ --badge-color-text: var(--color-text-on-success);
57
+ }
58
+ .badge-warning {
59
+ --badge-color-bg: var(--color-warning);
60
+ --badge-color-bg-hover: var(--color-warning-strong);
61
+ --badge-color-text: var(--color-text-on-warning);
62
+ }
23
63
  }
@@ -1,6 +1,7 @@
1
1
  /* components/banner.css */
2
2
  @layer components {
3
3
  .banner {
4
+ --color-link: var(--alert-color-text);
4
5
  background-color: var(--alert-color-bg);
5
6
  border-radius: var(--alert-border-radius);
6
7
  color: var(--alert-color-text);
@@ -1,8 +1,8 @@
1
1
  /* components/breadcrumb.css */
2
2
  @layer components {
3
3
  .breadcrumb-wrapper {
4
- border-bottom: var(--breadcrumb-border-width) solid var(--breadcrumb-color-border);
5
- border-top: var(--breadcrumb-border-width) solid var(--breadcrumb-color-border);
4
+ border-bottom: var(--breadcrumb-border);
5
+ border-top: var(--breadcrumb-border);
6
6
  padding-block: var(--breadcrumb-padding);
7
7
 
8
8
  ol {
@@ -0,0 +1,44 @@
1
+ /* component/btn-close.css */
2
+ /* Close button */
3
+ @layer components {
4
+ .btn-close {
5
+ align-items: center;
6
+ appearance: none;
7
+ background-color: var(--btn-close-color-bg, var(--btn-control-color-bg));
8
+ border: var(--btn-close-border-width, var(--btn-border-width)) var(--btn-close-border-style, var(--btn-border-style)) var(--btn-close-color-border, var(--btn-control-color-border));
9
+ border-radius: var(--btn-close-border-radius, var(--btn-border-radius));
10
+ color: var(--btn-close-color-text, var(--btn-control-color-text));
11
+ cursor: pointer;
12
+ display: inline-flex;
13
+ font-size: var(--btn-close-font-size, var(--btn-font-size));
14
+ font-weight: var(--btn-close-font-weight, var(--btn-font-weight));
15
+ gap: var(--btn-close-gap, var(--btn-gap));
16
+ padding: var(--btn-close-padding-y, var(--btn-padding-y)) var(--btn-close-padding-x, var(--btn-padding-x));
17
+ text-decoration-color: var(--btn-close-color-text-decoration, var(--btn-color-text-decoration));
18
+ text-decoration-line: var(--btn-text-decoration-line);
19
+ text-decoration-thickness: var(--text-decoration-thickness);
20
+ text-transform: var(--btn-text-transform);
21
+ text-underline-offset: var(--text-decoration-offset);
22
+
23
+ &::before {
24
+ background-color: currentColor;
25
+ content: '';
26
+ flex-shrink: 0;
27
+ height: var(--icon-size);
28
+ mask: var(--icon-close) center / var(--icon-size) no-repeat;
29
+ width: var(--icon-size);
30
+ }
31
+
32
+ @media (hover: hover) and (pointer: fine) {
33
+ &:hover {
34
+ background-color: var(--btn-close-color-bg-hover, var(--btn-control-color-bg-hover));
35
+ color: var(--btn-close-color-text-hover, var(--btn-control-color-text-hover));
36
+ text-decoration-color: var(--btn-close-color-text-decoration-hover, var(--btn-color-text-decoration-hover));
37
+ }
38
+ }
39
+
40
+ @media (prefers-reduced-motion: no-preference) {
41
+ transition: var(--btn-transition);
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,22 @@
1
+ /* component/btn-filter.css */
2
+ /* Filters toggle button — requires .btn base class */
3
+ @layer components {
4
+ .btn-filter {
5
+ /* Scope --btn-color-* to control values, allow per-button overrides */
6
+ --btn-color-bg: var(--btn-filter-color-bg, var(--btn-control-color-bg));
7
+ --btn-color-bg-hover: var(--btn-filter-color-bg-hover, var(--btn-control-color-bg-hover));
8
+ --btn-color-border: var(--btn-filter-color-border, var(--btn-control-color-border));
9
+ --btn-color-border-hover: var(--btn-filter-color-border-hover, var(--btn-control-color-border-hover));
10
+ --btn-color-text: var(--btn-filter-color-text, var(--btn-control-color-text));
11
+ --btn-color-text-hover: var(--btn-filter-color-text-hover, var(--btn-control-color-text-hover));
12
+
13
+ &::before {
14
+ background-color: currentColor;
15
+ content: '';
16
+ flex-shrink: 0;
17
+ height: var(--icon-size);
18
+ mask: var(--icon-filter) center / var(--icon-size) no-repeat;
19
+ width: var(--icon-size);
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,45 @@
1
+ /* component/btn-menu.css */
2
+ /* Menu toggle button */
3
+ @layer components {
4
+ .btn-menu {
5
+ align-items: center;
6
+ appearance: none;
7
+ background-color: var(--btn-menu-color-bg, var(--btn-control-color-bg));
8
+ border: var(--btn-menu-border-width, var(--btn-border-width)) var(--btn-menu-border-style, var(--btn-border-style)) var(--btn-menu-color-border, var(--btn-control-color-border));
9
+ border-radius: var(--btn-menu-border-radius, var(--btn-border-radius));
10
+ color: var(--btn-menu-color-text, var(--btn-control-color-text));
11
+ cursor: pointer;
12
+ display: inline-flex;
13
+ font-size: var(--btn-menu-font-size, var(--btn-font-size));
14
+ font-weight: var(--btn-menu-font-weight, var(--btn-font-weight));
15
+ gap: var(--btn-menu-gap, var(--btn-gap));
16
+ padding-block: var(--btn-menu-padding-y, var(--btn-padding-y));
17
+ padding-inline: var(--btn-menu-padding-x, var(--btn-padding-x));
18
+ text-decoration-color: var(--btn-menu-color-text-decoration, var(--btn-color-text-decoration));
19
+ text-decoration-line: var(--btn-text-decoration-line);
20
+ text-decoration-thickness: var(--text-decoration-thickness);
21
+ text-transform: var(--btn-text-transform);
22
+ text-underline-offset: var(--text-decoration-offset);
23
+
24
+ &::before {
25
+ background-color: currentColor;
26
+ content: '';
27
+ flex-shrink: 0;
28
+ height: var(--icon-size);
29
+ mask: var(--icon-menu) center / var(--icon-size) no-repeat;
30
+ width: var(--icon-size);
31
+ }
32
+
33
+ @media (hover: hover) and (pointer: fine) {
34
+ &:hover {
35
+ background-color: var(--btn-menu-color-bg-hover, var(--btn-control-color-bg-hover));
36
+ color: var(--btn-menu-color-text-hover, var(--btn-control-color-text-hover));
37
+ text-decoration-color: var(--btn-menu-color-text-decoration-hover, var(--btn-color-text-decoration-hover));
38
+ }
39
+ }
40
+
41
+ @media (prefers-reduced-motion: no-preference) {
42
+ transition: var(--btn-transition);
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,22 @@
1
+ /* component/btn-search.css */
2
+ /* Search button — requires .btn base class */
3
+ @layer components {
4
+ .btn-search {
5
+ /* Scope --btn-color-* to control values, allow per-button overrides */
6
+ --btn-color-bg: var(--btn-search-color-bg, var(--btn-control-color-bg));
7
+ --btn-color-bg-hover: var(--btn-search-color-bg-hover, var(--btn-control-color-bg-hover));
8
+ --btn-color-border: var(--btn-search-color-border, var(--btn-control-color-border));
9
+ --btn-color-border-hover: var(--btn-search-color-border-hover, var(--btn-control-color-border-hover));
10
+ --btn-color-text: var(--btn-search-color-text, var(--btn-control-color-text));
11
+ --btn-color-text-hover: var(--btn-search-color-text-hover, var(--btn-control-color-text-hover));
12
+
13
+ &::before {
14
+ background-color: currentColor;
15
+ content: '';
16
+ flex-shrink: 0;
17
+ height: var(--icon-size);
18
+ mask: var(--icon-search) center / var(--icon-size) no-repeat;
19
+ width: var(--icon-size);
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,22 @@
1
+ /* component/btn-share.css */
2
+ /* Share button — requires .btn base class */
3
+ @layer components {
4
+ .btn-share {
5
+ /* Scope --btn-color-* to control values, allow per-button overrides */
6
+ --btn-color-bg: var(--btn-share-color-bg, var(--btn-control-color-bg));
7
+ --btn-color-bg-hover: var(--btn-share-color-bg-hover, var(--btn-control-color-bg-hover));
8
+ --btn-color-border: var(--btn-share-color-border, var(--btn-control-color-border));
9
+ --btn-color-border-hover: var(--btn-share-color-border-hover, var(--btn-control-color-border-hover));
10
+ --btn-color-text: var(--btn-share-color-text, var(--btn-control-color-text));
11
+ --btn-color-text-hover: var(--btn-share-color-text-hover, var(--btn-control-color-text-hover));
12
+
13
+ &::before {
14
+ background-color: currentColor;
15
+ content: '';
16
+ flex-shrink: 0;
17
+ height: var(--icon-size);
18
+ mask: var(--icon-share) center / var(--icon-size) no-repeat;
19
+ width: var(--icon-size);
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,22 @@
1
+ /* component/btn-toc.css */
2
+ /* Table of contents toggle button — requires .btn base class */
3
+ @layer components {
4
+ .btn-toc {
5
+ /* Scope --btn-color-* to control values, allow per-button overrides */
6
+ --btn-color-bg: var(--btn-toc-color-bg, var(--btn-control-color-bg));
7
+ --btn-color-bg-hover: var(--btn-toc-color-bg-hover, var(--btn-control-color-bg-hover));
8
+ --btn-color-border: var(--btn-toc-color-border, var(--btn-control-color-border));
9
+ --btn-color-border-hover: var(--btn-toc-color-border-hover, var(--btn-control-color-border-hover));
10
+ --btn-color-text: var(--btn-toc-color-text, var(--btn-control-color-text));
11
+ --btn-color-text-hover: var(--btn-toc-color-text-hover, var(--btn-control-color-text-hover));
12
+
13
+ &::before {
14
+ background-color: currentColor;
15
+ content: '';
16
+ flex-shrink: 0;
17
+ height: var(--icon-size);
18
+ mask: var(--icon-toc) center / var(--icon-size) no-repeat;
19
+ width: var(--icon-size);
20
+ }
21
+ }
22
+ }
@@ -6,6 +6,7 @@
6
6
  background-color: var(--btn-color-bg);
7
7
  border: var(--btn-border-width) var(--btn-border-style) var(--btn-color-border);
8
8
  border-radius: var(--btn-border-radius);
9
+ box-shadow: var(--btn-shadow);
9
10
  color: var(--btn-color-text);
10
11
  cursor: pointer;
11
12
  display: inline-flex;
@@ -13,7 +14,8 @@
13
14
  font-weight: var(--btn-font-weight);
14
15
  gap: var(--btn-gap);
15
16
  justify-content: center;
16
- padding: var(--btn-padding-y) var(--btn-padding-x);
17
+ padding-block: var(--btn-padding-y);
18
+ padding-inline: var(--btn-padding-x);
17
19
  text-decoration-color: var(--btn-color-text-decoration);
18
20
  text-decoration-line: var(--btn-text-decoration-line);
19
21
  text-decoration-thickness: var(--text-decoration-thickness);
@@ -21,19 +23,21 @@
21
23
  text-underline-offset: var(--text-decoration-offset);
22
24
 
23
25
  &:focus-visible {
24
- outline: var(--focus-outline-width, 2px) solid var(--color-focus);
26
+ outline: var(--focus);
25
27
  outline-offset: var(--focus-outline-offset, 2px);
26
28
  }
27
29
 
28
30
  &:disabled,
29
31
  &[aria-disabled='true'] {
30
32
  cursor: not-allowed;
31
- opacity: 0.5;
33
+ opacity: var(--opacity-disabled);
32
34
  }
33
35
 
34
36
  @media (hover: hover) and (pointer: fine) {
35
37
  &:hover {
36
38
  background-color: var(--btn-color-bg-hover);
39
+ border-color: var(--btn-color-border-hover);
40
+ box-shadow: var(--btn-shadow-hover);
37
41
  color: var(--btn-color-text-hover);
38
42
  text-decoration-color: var(--btn-color-text-decoration-hover);
39
43
  }
@@ -45,36 +49,104 @@
45
49
  }
46
50
 
47
51
  /* Variants */
52
+ .btn-control {
53
+ --btn-color-bg: var(--btn-control-color-bg);
54
+ --btn-color-bg-hover: var(--btn-control-color-bg-hover);
55
+ --btn-color-border: var(--btn-control-color-border);
56
+ --btn-color-border-hover: var(--btn-control-color-border-hover);
57
+ --btn-color-text: var(--btn-control-color-text);
58
+ --btn-color-text-hover: var(--btn-control-color-text-hover);
59
+ }
60
+
48
61
  .btn-danger {
49
62
  --btn-color-bg: var(--color-danger);
63
+ --btn-color-bg-hover: var(--color-danger-strong);
50
64
  --btn-color-border: var(--color-danger);
65
+ --btn-color-border-hover: var(--color-danger-strong);
51
66
  --btn-color-text: var(--color-text-on-danger);
52
67
  }
53
68
 
69
+ .btn-dark {
70
+ --btn-color-bg: var(--color-dark);
71
+ --btn-color-bg-hover: var(--color-dark-strong);
72
+ --btn-color-border: var(--color-dark);
73
+ --btn-color-border-hover: var(--color-dark-strong);
74
+ --btn-color-text: var(--color-text-on-dark);
75
+ }
76
+
54
77
  .btn-ghost {
55
78
  --btn-color-bg: transparent;
79
+ --btn-color-bg-hover: transparent;
80
+ --btn-color-border: transparent;
81
+ --btn-color-border-hover: transparent;
82
+ --btn-color-text: var(--color-text);
83
+ --btn-color-text-hover: var(--color-text-hover);
84
+ }
85
+
86
+ .btn-info {
87
+ --btn-color-bg: var(--color-info);
88
+ --btn-color-bg-hover: var(--color-info-strong);
89
+ --btn-color-border: var(--color-info);
90
+ --btn-color-border-hover: var(--color-info-strong);
91
+ --btn-color-text: var(--color-text-on-info);
92
+ }
93
+
94
+ .btn-light {
95
+ --btn-color-bg: var(--color-light);
96
+ --btn-color-bg-hover: var(--color-light-strong);
97
+ --btn-color-border: var(--color-light);
98
+ --btn-color-border-hover: var(--color-light-strong);
99
+ --btn-color-text: var(--color-text-on-light);
100
+ }
101
+
102
+ .btn-link {
103
+ --btn-color-bg: transparent;
104
+ --btn-color-bg-hover: transparent;
56
105
  --btn-color-border: transparent;
106
+ --btn-color-border-hover: transparent;
57
107
  --btn-color-text: var(--color-text);
108
+ --btn-color-text-hover: var(--color-text);
109
+ --btn-color-text-decoration: initial;
110
+
111
+ @media (hover: hover) and (pointer: fine) {
112
+ &:hover {
113
+ --btn-color-text-decoration: transparent;
114
+ }
115
+ }
58
116
  }
59
117
 
60
118
  .btn-primary {
61
119
  --btn-color-bg: var(--color-brand);
120
+ --btn-color-bg-hover: var(--color-brand-strong);
62
121
  --btn-color-border: var(--color-brand);
122
+ --btn-color-border-hover: var(--color-brand-strong);
63
123
  --btn-color-text: var(--color-text-on-brand);
64
124
  }
65
125
 
66
126
  .btn-secondary {
67
127
  --btn-color-bg: var(--color-secondary);
128
+ --btn-color-bg-hover: var(--color-secondary-strong);
68
129
  --btn-color-border: var(--color-secondary);
130
+ --btn-color-border-hover: var(--color-secondary-strong);
69
131
  --btn-color-text: var(--color-text-on-secondary);
70
132
  }
71
133
 
72
134
  .btn-success {
73
135
  --btn-color-bg: var(--color-success);
136
+ --btn-color-bg-hover: var(--color-success-strong);
74
137
  --btn-color-border: var(--color-success);
138
+ --btn-color-border-hover: var(--color-success-strong);
75
139
  --btn-color-text: var(--color-text-on-success);
76
140
  }
77
141
 
142
+ .btn-warning {
143
+ --btn-color-bg: var(--color-warning);
144
+ --btn-color-bg-hover: var(--color-warning-strong);
145
+ --btn-color-border: var(--color-warning);
146
+ --btn-color-border-hover: var(--color-warning-strong);
147
+ --btn-color-text: var(--color-text-on-warning);
148
+ }
149
+
78
150
  /* Sizes */
79
151
  .btn-xs {
80
152
  --btn-font-size: var(--font-size-xs);
@@ -17,7 +17,7 @@
17
17
  @layer components {
18
18
  .card {
19
19
  background-color: var(--card-color-bg);
20
- border: var(--card-border-width) solid var(--card-color-border);
20
+ border: var(--card-border);
21
21
  border-radius: var(--card-border-radius);
22
22
  box-shadow: var(--card-shadow);
23
23
  color: var(--card-color-text);
@@ -30,8 +30,24 @@
30
30
  flex-direction: column;
31
31
  flex: 1;
32
32
  gap: var(--card-gap);
33
- padding: var(--card-padding);
33
+ padding-block: var(--card-padding-y);
34
+ padding-inline: var(--card-padding-x);
34
35
  text-decoration: none;
36
+
37
+ > * {
38
+ margin-block: 0;
39
+ }
40
+ }
41
+
42
+ a.content {
43
+ &::before {
44
+ content: '';
45
+ inset: 0;
46
+ position: absolute;
47
+ }
48
+ &:focus-visible {
49
+ outline: none;
50
+ }
35
51
  }
36
52
 
37
53
  .name {
@@ -48,7 +64,24 @@
48
64
  .media {
49
65
  --media-ratio: var(--card-media-ratio);
50
66
  --media-color-bg: var(--card-media-color-bg);
51
- order: -1;
67
+ order: var(--card-media-order, -1);
68
+ }
69
+
70
+ /* Focus */
71
+ &:has(a.content:focus-visible) {
72
+ outline: var(--focus);
73
+ outline-offset: var(--focus-outline-offset);
74
+ }
75
+
76
+ /* Hover */
77
+ @media (hover: hover) and (pointer: fine) {
78
+ &:hover {
79
+ --card-shadow: var(--card-shadow-hover);
80
+ }
81
+ }
82
+
83
+ @media (prefers-reduced-motion: no-preference) {
84
+ transition: var(--card-transition);
52
85
  }
53
86
  }
54
87
  }
@@ -34,20 +34,23 @@
34
34
  color: var(--drawer-color-text);
35
35
  display: flex;
36
36
  flex-direction: column;
37
- inset-inline-start: var(--drawer-start);
38
- inset-inline-end: var(--drawer-end);
37
+ inset-inline-start: var(--drawer-start, auto);
38
+ inset-inline-end: var(--drawer-end, 0);
39
39
  max-width: 100%;
40
40
  overflow: hidden;
41
41
  position: fixed;
42
42
  top: var(--drawer-top, 0);
43
- transform: var(--drawer-translate);
44
- transition-duration: var(--drawer-transition-duration);
45
- transition-property: transform, visibility;
46
- transition-timing-function: var(--drawer-transition-easing);
43
+ transform: var(--drawer-translate, translateX(100%));
47
44
  visibility: hidden;
48
45
  width: var(--drawer-width);
49
46
  z-index: var(--drawer-z-index);
50
47
 
48
+ @media (prefers-reduced-motion: no-preference) {
49
+ transition-duration: var(--drawer-transition-duration);
50
+ transition-property: transform, visibility;
51
+ transition-timing-function: var(--drawer-transition-easing);
52
+ }
53
+
51
54
  /* Visible during transitions and when open */
52
55
  &.show,
53
56
  &.showing,
@@ -154,6 +157,7 @@
154
157
  /* ── Backdrop ────────────────────────────────────────────────────── */
155
158
 
156
159
  .drawer-backdrop {
160
+ backdrop-filter: blur(var(--drawer-backdrop-blur));
157
161
  background-color: var(--drawer-backdrop-color);
158
162
  inset: 0;
159
163
  position: fixed;
@@ -161,7 +165,10 @@
161
165
 
162
166
  &.fade {
163
167
  opacity: 0;
164
- transition: opacity var(--drawer-transition-duration) var(--drawer-transition-easing);
168
+
169
+ @media (prefers-reduced-motion: no-preference) {
170
+ transition: opacity var(--drawer-transition-duration) var(--drawer-transition-easing);
171
+ }
165
172
  }
166
173
 
167
174
  &.show {
@@ -57,6 +57,11 @@
57
57
  width: var(--dropdown-icon-size);
58
58
  }
59
59
 
60
+ &:focus-visible {
61
+ outline: var(--focus);
62
+ outline-offset: var(--focus-outline-offset);
63
+ }
64
+
60
65
  &[aria-expanded="true"]::after {
61
66
  rotate: 180deg;
62
67
  }
@@ -78,12 +83,15 @@
78
83
  position: absolute;
79
84
  top: 100%;
80
85
  transform: translateY(var(--dropdown-translate-y));
81
- transition-duration: var(--dropdown-transition-duration);
82
- transition-property: opacity, transform, visibility;
83
- transition-timing-function: var(--dropdown-transition-easing);
84
86
  visibility: hidden;
85
87
  z-index: var(--dropdown-z-index);
86
88
 
89
+ @media (prefers-reduced-motion: no-preference) {
90
+ transition-duration: var(--dropdown-transition-duration);
91
+ transition-property: opacity, transform, visibility;
92
+ transition-timing-function: var(--dropdown-transition-easing);
93
+ }
94
+
87
95
  /* Visible during all transition phases */
88
96
  &.show,
89
97
  &.showing,
@@ -105,7 +113,8 @@
105
113
  color: var(--dropdown-color-text);
106
114
  font-size: var(--dropdown-item-font-size);
107
115
  display: block;
108
- padding: var(--dropdown-item-padding);
116
+ padding-block: var(--dropdown-item-padding-y);
117
+ padding-inline: var(--dropdown-item-padding-x);
109
118
  text-decoration: none;
110
119
  white-space: nowrap;
111
120
 
@@ -10,7 +10,7 @@
10
10
  @layer components {
11
11
  .embed {
12
12
  aspect-ratio: var(--embed-ratio);
13
- border: var(--embed-border-width) var(--embed-border-style) var(--embed-color-border);
13
+ border: var(--embed-border);
14
14
  border-radius: var(--embed-border-radius);
15
15
  box-shadow: var(--embed-box-shadow);
16
16
  overflow: hidden;
@@ -0,0 +1,24 @@
1
+ /* components/form.css */
2
+ @layer components {
3
+ .form {
4
+ display: grid;
5
+ gap: var(--gap);
6
+ grid-template-columns: repeat(auto-fill, minmax(max(var(--form-col-min-width, 25ch), calc(50% - var(--gap) / 2)), 1fr));
7
+
8
+ .help {
9
+ color: var(--help-color-text);
10
+ font-size: var(--help-font-size);
11
+ font-weight: var(--help-font-weight);
12
+ margin: var(--help-margin);
13
+ }
14
+
15
+ .actions,
16
+ .full {
17
+ grid-column: 1 / -1;
18
+ }
19
+ }
20
+
21
+ .form-check {
22
+ display: flex;
23
+ }
24
+ }
@@ -0,0 +1,18 @@
1
+ /* components/items.css */
2
+ /*
3
+ * .items — responsive grid.
4
+ *
5
+ * Structure:
6
+ * .items
7
+ * .item
8
+ */
9
+ @layer components {
10
+ .items {
11
+ container-type: inline-size;
12
+ container-name: items;
13
+ display: grid;
14
+ gap: var(--items-gap);
15
+ grid-template-columns: repeat(var(--items-cols, auto-fill), minmax(var(--items-min-width, 30ch), 1fr));
16
+ justify-content: start;
17
+ }
18
+ }
@@ -12,25 +12,18 @@
12
12
  .list {
13
13
  p {
14
14
  font-weight: var(--list-label-font-weight);
15
- margin-bottom: var(--list-label-margin-bottom);
15
+ margin-block-end: var(--list-label-margin-bottom);
16
16
  }
17
17
 
18
18
  &,
19
19
  ul,
20
20
  ol {
21
- list-style: none;
22
- margin-bottom: 0;
23
- padding-inline-start: 0;
21
+ margin-block-end: 0;
24
22
  }
25
23
 
26
24
  li {
27
25
  font-size: var(--list-item-font-size);
28
26
  margin-block: var(--list-item-gap);
29
-
30
- &::before {
31
- content: var(--list-item-marker);
32
- margin-inline-end: var(--list-item-marker-gap);
33
- }
34
27
  }
35
28
  }
36
29
  }
@@ -12,7 +12,7 @@
12
12
  margin-block: var(--map-margin-block);
13
13
  overflow: hidden;
14
14
 
15
- @media (--mobile-only) {
15
+ @media not (--tablet) {
16
16
  --map-ratio: var(--map-ratio-mobile);
17
17
  .container & {
18
18
  margin-inline: calc(-1 * var(--gutter));
@@ -20,13 +20,16 @@
20
20
  overflow: hidden;
21
21
  position: absolute;
22
22
  transform: translateY(-100%);
23
- transition: transform var(--duration-fast) var(--easing-out);
24
23
  z-index: 300;
25
24
 
26
25
  &:focus-within {
27
26
  transform: translateY(0);
28
27
  }
29
28
 
29
+ @media (prefers-reduced-motion: no-preference) {
30
+ transition: transform var(--duration-fast) var(--easing-out);
31
+ }
32
+
30
33
  a {
31
34
  background: var(--color-bg);
32
35
  &:focus {
@@ -7,6 +7,7 @@
7
7
  font-size: var(--nav-font-size-title);
8
8
  font-weight: var(--nav-font-weight-title);
9
9
  margin: 0;
10
- padding: var(--nav-padding-y) var(--nav-padding-x);
10
+ padding-block: var(--nav-padding-y);
11
+ padding-inline: var(--nav-padding-x);
11
12
  }
12
13
  }
@@ -14,8 +14,7 @@
14
14
  @layer components {
15
15
  .nav {
16
16
  &,
17
- ul,
18
- ol {
17
+ :is(ul, ol) {
19
18
  display: flex;
20
19
  flex-direction: var(--nav-direction, column);
21
20
  gap: var(--nav-gap);
@@ -23,9 +22,16 @@
23
22
  margin: 0;
24
23
  }
25
24
 
25
+ &,
26
+ &:is(ul, ol) {
27
+ padding-inline-start: 0;
28
+ }
29
+
26
30
  /* ── Nav item ────────────────────────────────────────────────── */
27
31
 
28
32
  li {
33
+ margin-block: var(--nav-margin-y, 0);
34
+ margin-inline: var(--nav-margin-x, 0);
29
35
  position: relative;
30
36
  }
31
37
 
@@ -53,14 +59,8 @@
53
59
  /* ── Item highlighted ───────────────────────────────────────────────────── */
54
60
 
55
61
  .nav-item-highlighted {
56
- line-height: 1.2;
62
+ line-height: var(--line-height-snug);
57
63
  margin-inline: var(--nav-padding-x);
58
- &:first-child {
59
- margin-inline-start: 0;
60
- }
61
- &:last-child {
62
- margin-inline-end: 0;
63
- }
64
64
  }
65
65
  }
66
66
  }
@@ -19,6 +19,7 @@
19
19
  display: flex;
20
20
  flex-wrap: wrap;
21
21
  gap: var(--pagination-gap);
22
+ justify-content: center;
22
23
  list-style: none;
23
24
  margin-block: 0;
24
25
  padding-inline-start: 0;
@@ -61,8 +62,36 @@
61
62
  pointer-events: none;
62
63
  }
63
64
 
65
+ :is(.first, .previous, .next, .last) {
66
+ &::after {
67
+ background-color: currentColor;
68
+ content: '';
69
+ flex-shrink: 0;
70
+ height: var(--pagination-icon-size);
71
+ width: var(--pagination-icon-size);
72
+ }
73
+ }
74
+
75
+ .first::after {
76
+ mask: var(--pagination-icon-first) center / var(--pagination-icon-size) no-repeat;
77
+ rotate: 180deg;
78
+ }
79
+
80
+ .previous::after {
81
+ mask: var(--pagination-icon-previous) center / var(--pagination-icon-size) no-repeat;
82
+ rotate: 180deg;
83
+ }
84
+
85
+ .next::after {
86
+ mask: var(--pagination-icon-next) center / var(--pagination-icon-size) no-repeat;
87
+ }
88
+
89
+ .last::after {
90
+ mask: var(--pagination-icon-last) center / var(--pagination-icon-size) no-repeat;
91
+ }
92
+
64
93
  /* On small screens: hide first/last controls and non-adjacent page numbers */
65
- @media (--mobile-only) {
94
+ @media not (--tablet) {
66
95
  .first,
67
96
  .last,
68
97
  li:has(.first),
package/css/index.css CHANGED
@@ -4,10 +4,18 @@
4
4
  @import 'component/banner.css';
5
5
  @import 'component/breadcrumb.css';
6
6
  @import 'component/button.css';
7
+ @import 'component/btn-close.css';
8
+ @import 'component/btn-filter.css';
9
+ @import 'component/btn-menu.css';
10
+ @import 'component/btn-search.css';
11
+ @import 'component/btn-share.css';
12
+ @import 'component/btn-toc.css';
7
13
  @import 'component/card.css';
8
14
  @import 'component/drawer.css';
9
15
  @import 'component/dropdown.css';
10
16
  @import 'component/embed.css';
17
+ @import 'component/form.css';
18
+ @import 'component/items.css';
11
19
  @import 'component/list.css';
12
20
  @import 'component/map.css';
13
21
  @import 'component/media.css';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uncinq/css-components",
3
- "version": "0.2.2",
3
+ "version": "0.4.0",
4
4
  "description": "Framework-agnostic CSS component implementations.",
5
5
  "license": "MIT",
6
6
  "repository": {