opui-css 3.2.0 → 3.3.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opui-css",
3
- "version": "3.2.0",
3
+ "version": "3.3.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -65,8 +65,8 @@
65
65
  &::before {
66
66
  background-color: var(--_accent-color);
67
67
  border-color: var(--_accent-color);
68
- transition: background-color var(--_transition-time)
69
- var(--_transition-tf),
68
+ transition:
69
+ background-color var(--_transition-time) var(--_transition-tf),
70
70
  border-color var(--_transition-time) var(--_transition-tf);
71
71
  }
72
72
 
@@ -85,8 +85,8 @@
85
85
  @media (prefers-reduced-motion: no-preference) {
86
86
  /* Track */
87
87
  &::before {
88
- transition: background-color var(--_transition-time)
89
- var(--_transition-tf),
88
+ transition:
89
+ background-color var(--_transition-time) var(--_transition-tf),
90
90
  border-color var(--_transition-time) var(--_transition-tf);
91
91
  }
92
92
 
@@ -107,6 +107,42 @@
107
107
  }
108
108
  }
109
109
 
110
+ /* Icons */
111
+ &:has(.icon-checked, .icon-unchecked) {
112
+ [role="switch"] {
113
+ grid-column: 1 / -1;
114
+ grid-row: 1;
115
+ }
116
+
117
+ &:has([role="switch"]:checked) {
118
+ .icon-unchecked {
119
+ display: none;
120
+ }
121
+ .icon-checked {
122
+ display: block;
123
+ }
124
+ }
125
+
126
+ .icon-checked {
127
+ display: none;
128
+ }
129
+
130
+ svg {
131
+ grid-column: 1;
132
+ grid-row: 1;
133
+ inline-size: var(--_dot-size);
134
+ margin-inline-start: calc(
135
+ var(--_track-width) - var(--_dot-size) - var(--size-1)
136
+ );
137
+ pointer-events: none;
138
+ z-index: 1;
139
+
140
+ &.icon-checked {
141
+ margin-inline-start: var(--size-1);
142
+ }
143
+ }
144
+ }
145
+
110
146
  /* Required dot */
111
147
  &:has([required]:not(:checked)) {
112
148
  .label:after {
@@ -1,189 +1,225 @@
1
- @layer components.root {
2
- :where(.switch) {
3
- --_accent-color: var(--primary);
4
- --_accent-contrast: var(--primary-contrast);
5
1
 
6
- --_dot-bg-color: light-dark(var(--gray-11), var(--gray-14));
7
- --_dot-inset: var(--size-1) auto auto var(--size-1);
8
- --_dot-outline-size: 0;
9
- --_dot-size: var(--size-3);
10
2
 
11
- --_track-bg-color: light-dark(var(--gray-3), var(--gray-8));
12
- --_track-height: var(--size-5);
13
- --_track-width: var(--size-8);
14
- --_transition-tf: var(--ease-4);
15
- --_transition-time: 0.2s;
16
3
 
17
- align-items: center;
18
- color: var(--text-color-1);
19
- display: inline-grid;
20
- gap: 0 var(--size-2);
21
- grid-auto-columns: auto;
22
- grid-auto-flow: column;
23
- inline-size: fit-content;
24
4
 
25
- input[type="checkbox"][role="switch"] {
26
- appearance: none;
27
- block-size: var(--_track-height);
28
- cursor: pointer;
29
- inline-size: var(--_track-width);
30
- margin: 0;
31
- position: relative;
32
5
 
33
- /* Track */
34
- &::before {
35
- background-color: var(--_track-bg-color);
36
- block-size: var(--_track-height);
37
- border: 1px solid var(--_dot-bg-color);
38
- border-radius: 100vmax;
39
- content: "";
40
- inline-size: var(--_track-width);
41
- inset: 0;
42
- position: absolute;
43
- }
44
6
 
45
- &:focus-visible {
46
- outline-offset: 2px;
47
- outline: 2px solid currentColor;
48
- }
49
7
 
50
- /* Dot */
51
- &::after {
52
- background-color: var(--_dot-bg-color);
53
- block-size: var(--_dot-size);
54
- border-radius: 100vmax;
55
- content: "";
56
- inline-size: var(--_dot-size);
57
- inset: var(--_dot-inset);
58
- outline-offset: -1px;
59
- outline: var(--_dot-outline-size) solid var(--_dot-bg-color);
60
- position: absolute;
61
- }
62
8
 
63
- /* Checked */
64
- &:checked {
65
- &::before {
66
- background-color: var(--_accent-color);
67
- border-color: var(--_accent-color);
68
- transition: background-color var(--_transition-time)
69
- var(--_transition-tf),
70
- border-color var(--_transition-time) var(--_transition-tf);
71
- }
72
9
 
73
- /* Dot */
74
- &::after {
75
- --_dot-bg-color: var(--_accent-contrast);
76
- --_dot-outline-size: calc(var(--size-1) - 1px);
77
10
 
78
- inset-inline-start: calc(
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+ --_dot-outline-size: calc(var(--size-1) + 1px);
32
+ background-color var(--_transition-time) var(--_transition-tf),
33
+ background-color var(--_transition-time) var(--_transition-tf),
34
+ border-color var(--_transition-time) var(--_transition-tf);
35
+ border-color var(--_transition-time) var(--_transition-tf);
79
36
  var(--_track-width) - var(--_dot-size) - var(--size-1)
37
+ --_dot-bg-color: var(--_accent-contrast);
38
+ --_dot-outline-size: calc(var(--size-1) - 1px);
39
+ --_dot-outline-size: calc(var(--size-1) + 1px);
80
40
  );
41
+ }
42
+ &:active:after {
43
+ background-color: var(--_accent-color);
44
+ border-color: var(--_accent-color);
45
+ display: block;
46
+ display: none;
47
+ inset-inline-start: calc(
48
+ margin-inline-start: var(--size-1);
49
+ transition:
50
+ transition:
51
+ transition: all var(--_transition-time) var(--_transition-tf);
52
+ var(--_track-width) - var(--_dot-size) - var(--size-1)
53
+ .icon-checked {
54
+ .icon-unchecked {
55
+ );
81
56
  }
82
- }
83
-
84
- /* Animation */
85
- @media (prefers-reduced-motion: no-preference) {
86
- /* Track */
87
- &::before {
88
- transition: background-color var(--_transition-time)
89
- var(--_transition-tf),
90
- border-color var(--_transition-time) var(--_transition-tf);
91
57
  }
92
-
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ /* Dot */
93
66
  /* Dot */
67
+ /* Track */
94
68
  &::after {
95
- transition: all var(--_transition-time) var(--_transition-tf);
96
- }
97
-
69
+ &::after {
70
+ &::before {
71
+ &::before {
98
72
  &:active:after {
99
- --_dot-outline-size: calc(var(--size-1) + 1px);
100
- }
101
-
102
73
  &:checked {
103
- &:active:after {
104
- --_dot-outline-size: calc(var(--size-1) + 1px);
105
- }
106
- }
107
- }
108
- }
109
-
110
- /* Required dot */
111
- &:has([required]:not(:checked)) {
112
- .label:after {
74
+ &.icon-checked {
75
+ background-color: var(--_dot-bg-color);
76
+ background-color: var(--_track-bg-color);
77
+ block-size: var(--_dot-size);
78
+ block-size: var(--_track-height);
79
+ border-radius: 100vmax;
80
+ border-radius: 100vmax;
81
+ border-radius: var(--radius-round);
82
+ border: 1px solid var(--_dot-bg-color);
83
+ color: var(--color-9);
113
84
  color: var(--red);
85
+ content: "";
86
+ content: "";
114
87
  content: "*";
88
+ cursor: not-allowed;
89
+ display: none;
90
+ grid-column: 1 / -1;
91
+ grid-column: 1;
92
+ grid-column: 1/-1;
93
+ grid-column: 1/-1;
94
+ grid-row: 1;
95
+ grid-row: 1;
96
+ grid-row: 2;
97
+ grid-row: 3;
98
+ inline-size: var(--_dot-size);
99
+ inline-size: var(--_dot-size);
100
+ inline-size: var(--_track-width);
115
101
  inset: 0 -0.25ex auto auto;
102
+ inset: 0;
103
+ inset: var(--_dot-inset);
104
+ margin-block-start: var(--size-1);
105
+ margin-inline-start: calc(
106
+ outline-offset: -1px;
107
+ outline-offset: 2px;
108
+ outline: 2px solid currentColor;
109
+ outline: 2px solid var(--color-9);
110
+ outline: var(--_dot-outline-size) solid var(--_dot-bg-color);
111
+ padding-inline: 1ex;
112
+ pointer-events: none;
113
+ position: absolute;
114
+ position: absolute;
116
115
  position: absolute;
116
+ z-index: 1;
117
+ --_dot-size: 0.75rem;
118
+ --_track-height: var(--size-4);
119
+ --_track-width: 2.5rem;
120
+ .icon-checked {
121
+ .label {
122
+ .label,
123
+ .label:after {
124
+ .supporting-text {
125
+ .supporting-text {
126
+ [role="switch"] {
117
127
  }
118
- }
119
-
120
- /* Disabled */
121
- &:has([disabled]) {
122
- cursor: not-allowed;
123
- opacity: 0.64;
124
- user-select: none;
125
-
126
- input {
127
- cursor: not-allowed;
128
128
  }
129
- }
130
-
131
- /* Label */
132
- .label {
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
142
+ @media (prefers-reduced-motion: no-preference) {
143
+ /* Animation */
144
+ /* Checked */
145
+ /* Dot */
146
+ /* Track */
147
+ &::after {
148
+ &::before {
149
+ &:checked {
150
+ &:focus-visible {
151
+ &:has([role="switch"]:checked) {
152
+ appearance: none;
153
+ block-size: var(--_track-height);
154
+ color: var(--text-color-2);
155
+ cursor: not-allowed;
156
+ cursor: pointer;
157
+ font-size: var(--font-size-xs);
158
+ grid-auto-columns: unset;
159
+ grid-column: 2;
133
160
  grid-column: 2;
134
161
  grid-row: 1;
162
+ grid-row: 2;
163
+ inline-size: var(--_track-width);
164
+ input {
165
+ input {
166
+ justify-items: center;
167
+ line-height: 1.5;
168
+ margin: 0;
135
169
  min-width: 0;
170
+ opacity: 0.64;
136
171
  padding-inline: 0 1ex;
137
172
  position: relative;
173
+ position: relative;
174
+ svg {
175
+ user-select: none;
138
176
  user-select: none;
139
- }
140
-
141
- /* Supporting text */
142
- .supporting-text {
143
- color: var(--text-color-2);
144
- font-size: var(--font-size-xs);
145
- grid-column: 2;
146
- grid-row: 2;
147
- line-height: 1.5;
148
177
  z-index: 1;
178
+ --_accent-color: var(--primary);
179
+ --_accent-contrast: var(--primary-contrast);
180
+ --_dot-bg-color: light-dark(var(--gray-11), var(--gray-14));
181
+ --_dot-inset: var(--size-1) auto auto var(--size-1);
182
+ --_dot-outline-size: 0;
183
+ --_dot-size: var(--size-3);
184
+ --_track-bg-color: light-dark(var(--gray-3), var(--gray-8));
185
+ --_track-height: var(--size-5);
186
+ --_track-width: var(--size-8);
187
+ --_transition-tf: var(--ease-4);
188
+ --_transition-time: 0.2s;
189
+ .label {
190
+ .supporting-text {
149
191
  }
150
-
151
- /* Size */
152
- &.small {
153
- --_dot-size: 0.75rem;
154
- --_track-height: var(--size-4);
155
- --_track-width: 2.5rem;
156
192
  }
157
-
158
- /* Stacked layout */
159
- &.stack {
160
- justify-items: center;
161
- grid-auto-columns: unset;
162
-
163
- .label {
164
- grid-column: 1/-1;
165
- grid-row: 2;
166
- margin-block-start: var(--size-1);
167
- padding-inline: 1ex;
168
- }
169
-
170
- .supporting-text {
171
- grid-column: 1/-1;
172
- grid-row: 3;
173
- }
174
193
  }
175
-
194
+ }
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+ /* Disabled */
201
+ /* Icons */
202
+ /* Label */
203
+ /* Required dot */
204
+ /* Size */
205
+ /* Stacked layout */
206
+ /* Supporting text */
176
207
  /* Validation */
208
+ &:has(.icon-checked, .icon-unchecked) {
209
+ &:has([disabled]) {
210
+ &:has([required]:not(:checked)) {
177
211
  &.error {
178
- input {
179
- outline: 2px solid var(--color-9);
180
- border-radius: var(--radius-round);
181
- }
182
-
183
- .label,
184
- .supporting-text {
185
- color: var(--color-9);
186
- }
187
- }
212
+ &.small {
213
+ &.stack {
214
+ align-items: center;
215
+ color: var(--text-color-1);
216
+ display: inline-grid;
217
+ gap: 0 var(--size-2);
218
+ grid-auto-columns: auto;
219
+ grid-auto-flow: column;
220
+ inline-size: fit-content;
221
+ input[type="checkbox"][role="switch"] {
222
+ :where(.switch) {
188
223
  }
189
224
  }
225
+ @layer components.root {