winduum 0.4.0 → 0.5.0-next.10

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 (85) hide show
  1. package/dist/main.css +1 -1
  2. package/dist/tailwind.css +1 -1
  3. package/package.json +19 -19
  4. package/src/base/config/font.css +11 -0
  5. package/src/base/{icons.css → config/mask.css} +4 -4
  6. package/src/base/config/rounded.css +14 -0
  7. package/src/base/config/spacing.css +15 -0
  8. package/src/base/config/text.css +15 -0
  9. package/src/base/config/transition.css +19 -0
  10. package/src/base/config/z.css +7 -0
  11. package/src/base/config.css +7 -81
  12. package/src/base/default.css +5 -1
  13. package/src/base/index.css +0 -3
  14. package/src/base/reset.css +11 -8
  15. package/src/base/tailwind/container.css +28 -0
  16. package/src/base/tailwind/utilities.css +39 -10
  17. package/src/base/theme/dark-rgb.css +3 -0
  18. package/src/base/theme/dark.css +3 -4
  19. package/src/base/theme/default-rgb.css +25 -0
  20. package/src/base/theme/default.css +21 -22
  21. package/src/components/dialog.css +4 -9
  22. package/src/components/field.css +1 -3
  23. package/src/libraries/dialog.css +14 -15
  24. package/src/libraries/dialog.d.ts +2 -0
  25. package/src/libraries/dialog.js +13 -4
  26. package/src/libraries/ripple.css +2 -5
  27. package/src/main-rgb.css +2 -0
  28. package/src/tailwind.css +1 -1
  29. package/src/ui/badge/bordered-rgb.css +1 -1
  30. package/src/ui/badge/bordered.css +9 -8
  31. package/src/ui/badge/circle.css +1 -1
  32. package/src/ui/badge/default.css +9 -13
  33. package/src/ui/badge/lg.css +1 -1
  34. package/src/ui/badge/muted.css +1 -1
  35. package/src/ui/badge/sm.css +1 -1
  36. package/src/ui/badge/square.css +1 -1
  37. package/src/ui/btn/bordered.css +14 -13
  38. package/src/ui/btn/circle.css +1 -1
  39. package/src/ui/btn/default.css +13 -58
  40. package/src/ui/btn/ghosted.css +1 -1
  41. package/src/ui/btn/gradient-bordered-rgb.css +1 -1
  42. package/src/ui/btn/gradient-bordered.css +27 -21
  43. package/src/ui/btn/hover-fill.css +1 -1
  44. package/src/ui/btn/index.css +1 -0
  45. package/src/ui/btn/interactive.css +35 -0
  46. package/src/ui/btn/lg.css +1 -1
  47. package/src/ui/btn/muted.css +1 -1
  48. package/src/ui/btn/raised.css +9 -6
  49. package/src/ui/btn/sm.css +1 -1
  50. package/src/ui/btn/square.css +1 -1
  51. package/src/ui/btn/wide.css +1 -2
  52. package/src/ui/check.css +27 -53
  53. package/src/ui/control/color.css +5 -8
  54. package/src/ui/control/default.css +27 -42
  55. package/src/ui/control/file.css +7 -13
  56. package/src/ui/control/floating-interactive.css +12 -0
  57. package/src/ui/control/floating.css +22 -26
  58. package/src/ui/control/icon.css +4 -5
  59. package/src/ui/control/index.css +1 -1
  60. package/src/ui/control/select.css +4 -4
  61. package/src/ui/heading/default.css +5 -10
  62. package/src/ui/heading/lg.css +2 -2
  63. package/src/ui/heading/sm.css +2 -3
  64. package/src/ui/image.css +8 -19
  65. package/src/ui/index.css +0 -1
  66. package/src/ui/info.css +6 -5
  67. package/src/ui/label.css +6 -5
  68. package/src/ui/notice.css +7 -15
  69. package/src/ui/progress/default.css +4 -8
  70. package/src/ui/progress/lg.css +1 -1
  71. package/src/ui/progress/sm.css +1 -1
  72. package/src/ui/switch.css +28 -41
  73. package/src/ui/text.css +102 -113
  74. package/src/ui/title/default.css +5 -12
  75. package/src/ui/title/lg.css +2 -2
  76. package/src/ui/title/sm.css +2 -2
  77. package/tailwind.config.js +5 -1
  78. package/utils/tailwind.cjs +3 -0
  79. package/utils/tailwind.js +51 -8
  80. package/src/base/tailwind/gutters.css +0 -343
  81. package/src/ui/control/floating-focus.css +0 -12
  82. package/src/ui/link/default.css +0 -39
  83. package/src/ui/link/index.css +0 -2
  84. package/src/ui/link/underlined.css +0 -51
  85. package/src/ui/link.css +0 -1
@@ -1,4 +1,4 @@
1
- :is(.ui-btn.gradient-bordered) {
1
+ .ui-btn:is(.gradient-bordered) {
2
2
  --color-current-rgb: var(--color-current-rgb);
3
3
 
4
4
  &::before {
@@ -1,28 +1,34 @@
1
- :is(.ui-btn.gradient-bordered) {
2
- --ui-btn-border-width: 2px;
3
- --ui-btn-hover-bg-mix: transparent;
4
- --ui-btn-hover-bg-opacity: 10%;
5
- --ui-btn-active-bg-mix: transparent;
6
- --ui-btn-active-bg-opacity: 20%;
7
- --ui-btn-focus-outline-offset: 0;
8
- --ui-btn-bg-opacity: 0%;
9
- --color-current: var(--color-main);
1
+ .ui-btn {
2
+ &:where(.gradient-bordered) {
3
+ &::before {
4
+ content: "";
5
+ position: absolute;
6
+ background-color: color-mix(in sRGB, var(--color-body) calc(100% - var(--ui-btn-bg-opacity)), transparent);
7
+ inset: var(--ui-btn-border-width);
8
+ border-radius: calc(var(--ui-btn-border-radius, var(--rounded)) / 1.25);
9
+ z-index: -1;
10
+ transition: var(--transition-background);
11
+ }
10
12
 
11
- &::before {
12
- content: "";
13
- position: absolute;
14
- background-color: color-mix(in sRGB, var(--color-body) calc(100% - var(--ui-btn-bg-opacity)), transparent);
15
- inset: var(--ui-btn-border-width);
16
- border-radius: calc(var(--ui-btn-border-radius) / 1.25);
17
- z-index: -1;
18
- transition: var(--transition-background);
13
+ &:where(.hover-fill) {
14
+ &::before {
15
+ background-color: color-mix(in sRGB, var(--color-body) var(--ui-btn-bg-opacity), transparent);
16
+ }
17
+ }
19
18
  }
20
19
 
21
- &:where(.hover-fill) {
22
- --ui-btn-bg-opacity: 100%;
20
+ &:is(.gradient-bordered) {
21
+ --ui-btn-border-width: 2px;
22
+ --ui-btn-hover-bg-mix: transparent;
23
+ --ui-btn-hover-bg-opacity: 10%;
24
+ --ui-btn-active-bg-mix: transparent;
25
+ --ui-btn-active-bg-opacity: 20%;
26
+ --ui-btn-focus-outline-offset: 0;
27
+ --ui-btn-bg-opacity: 0%;
28
+ --color-current: var(--color-main);
23
29
 
24
- &::before {
25
- background-color: color-mix(in sRGB, var(--color-body) var(--ui-btn-bg-opacity), transparent);
30
+ &:is(.hover-fill) {
31
+ --ui-btn-bg-opacity: 100%;
26
32
  }
27
33
  }
28
34
  }
@@ -1,4 +1,4 @@
1
- .ui-btn:where(.hover-fill) {
1
+ .ui-btn:is(.hover-fill) {
2
2
  --ui-btn-hover-bg-mix: black;
3
3
  --ui-btn-hover-bg-opacity: 100%;
4
4
  --ui-btn-active-bg-mix: black;
@@ -1,4 +1,5 @@
1
1
  @import "default.css";
2
+ @import "interactive.css";
2
3
  @import "sm.css";
3
4
  @import "lg.css";
4
5
  @import "loading.css";
@@ -0,0 +1,35 @@
1
+ .ui-btn {
2
+ transition-property: var(--transition);
3
+ transition-timing-function: var(--ease-in-out);
4
+ transition-duration: var(--duration);
5
+
6
+ &:is([href], button, [role="button"], input, .interactive) {
7
+ cursor: pointer;
8
+
9
+ &:disabled {
10
+ opacity: var(--ui-btn-disabled-opacity, 0.7);
11
+ cursor: not-allowed;
12
+ }
13
+
14
+ &:not(:disabled) {
15
+ &:hover {
16
+ @media (hover: hover) and (pointer: fine) {
17
+ --ui-btn-color: var(--ui-btn-hover-color, var(--color-current));
18
+ --ui-btn-bg-mix: var(--ui-btn-hover-bg-mix, black);
19
+ --ui-btn-bg-opacity: var(--ui-btn-hover-bg-opacity, 80%);
20
+ }
21
+ }
22
+
23
+ &:focus {
24
+ outline-color: color-mix(in sRGB, var(--color-accent) var(--ui-btn-focus-outline-color-opacity, 50%), var(--ui-btn-focus-outline-color-mix, transparent));
25
+ outline-offset: var(--ui-btn-focus-outline-offset, 2px);
26
+ }
27
+
28
+ &:is(:active, :checked, .active) {
29
+ --ui-btn-color: var(--ui-btn-active-color, var(--color-current));
30
+ --ui-btn-bg-mix: var(--ui-btn-active-bg-mix, black);
31
+ --ui-btn-bg-opacity: var(--ui-btn-active-bg-opacity, 90%);
32
+ }
33
+ }
34
+ }
35
+ }
package/src/ui/btn/lg.css CHANGED
@@ -1,4 +1,4 @@
1
- .ui-btn:where(.lg) {
1
+ .ui-btn:is(.lg) {
2
2
  --ui-btn-height: 3rem;
3
3
  --ui-btn-px: 1.75rem;
4
4
  }
@@ -1,4 +1,4 @@
1
- .ui-btn:where(.muted) {
1
+ .ui-btn:is(.muted) {
2
2
  --color-current: var(--color-accent);
3
3
  --ui-btn-hover-bg-mix: transparent;
4
4
  --ui-btn-active-bg-mix: transparent;
@@ -1,8 +1,11 @@
1
- .ui-btn:where(.raised) {
2
- --ui-btn-border-width: 2px;
3
- --ui-btn-border-opacity: calc(var(--tw-border-opacity, 0.85) * 100%);
1
+ .ui-btn {
2
+ &:where(.raised) {
3
+ border: var(--ui-btn-border-width) solid color-mix(in sRGB, var(--color-accent) var(--ui-btn-border-opacity), var(--color-current));
4
+ padding-inline: calc(var(--ui-btn-px) - var(--ui-btn-border-width));
5
+ }
4
6
 
5
- border: var(--ui-btn-border-width) solid color-mix(in sRGB, var(--color-accent) var(--ui-btn-border-opacity), var(--color-current));
6
- padding-left: calc(var(--ui-btn-px) - var(--ui-btn-border-width));
7
- padding-right: calc(var(--ui-btn-px) - var(--ui-btn-border-width));
7
+ &:is(.raised) {
8
+ --ui-btn-border-width: 2px;
9
+ --ui-btn-border-opacity: calc(var(--tw-border-opacity, 0.85) * 100%);
10
+ }
8
11
  }
package/src/ui/btn/sm.css CHANGED
@@ -1,4 +1,4 @@
1
- .ui-btn:where(.sm) {
1
+ .ui-btn:is(.sm) {
2
2
  --ui-btn-height: 2rem;
3
3
  --ui-btn-px: 1rem;
4
4
  }
@@ -1,4 +1,4 @@
1
- .ui-btn:where(.square) {
1
+ .ui-btn:is(.square) {
2
2
  --ui-btn-px: var(--ui-btn-py);
3
3
  --ui-btn-width: var(--ui-btn-height);
4
4
  }
@@ -1,4 +1,3 @@
1
1
  .ui-btn:where(.wide) {
2
- padding-left: calc(var(--ui-btn-px) * 1.5);
3
- padding-right: calc(var(--ui-btn-px) * 1.5);
2
+ padding-inline: calc(var(--ui-btn-px) * 1.5);
4
3
  }
package/src/ui/check.css CHANGED
@@ -1,33 +1,18 @@
1
1
  .ui-check {
2
- --ui-check-width: 1.375rem;
3
- --ui-check-font-size: 0.875rem;
4
- --ui-check-gap: 0.625rem;
5
- --ui-check-bg: transparent;
6
- --ui-check-bg-mix: transparent;
7
- --ui-check-bg-opacity: calc(var(--tw-bg-opacity, 0.1) * 100%);
8
- --ui-check-border-color: var(--color-current);
9
- --ui-check-border-mix: transparent;
10
- --ui-check-border-opacity: calc(var(--tw-border-opacity, 0.2) * 100%);
11
- --ui-check-border-width: 1px;
2
+ --ui-check-width: 1.25rem;
12
3
  --ui-check-checked-bg: var(--color-accent);
13
- --ui-check-radius: 0.5rem;
14
- --ui-check-icon: var(--icon-check);
15
- --ui-check-icon-font-size: 1.125rem;
16
- --ui-check-box-shadow: none;
17
- --ui-check-outline-width: 3px;
18
- --ui-check-outline-offset: 0;
19
- --ui-check-outline-opacity: 20%;
20
- --ui-check-disabled-opacity: 50%;
21
-
22
- display: flex;
23
- align-items: center;
24
- gap: 0 var(--ui-check-gap);
25
- width: fit-content;
26
- font-size: var(--ui-check-font-size);
4
+ --ui-check-icon-width: 1.125rem;
5
+
6
+ display: inline-flex;
7
+ gap: var(--ui-check-gap, 0.75rem);
8
+ font-weight: var(--ui-check-font-weight, var(--font-normal));
9
+ font-size: var(--ui-check-font-size, var(--text-sm));
10
+ line-height: var(--ui-check-line-height, calc(1em + var(--ui-check-line-height-ratio, 0.25lh)));
11
+ letter-spacing: var(--ui-check-letter-spacing, inherit);
27
12
  text-wrap: balance;
28
13
 
29
14
  &:has([type="radio"]) {
30
- --ui-check-icon: var(--icon-radio);
15
+ --ui-check-icon: var(--mask-radio);
31
16
  --ui-check-radius: 50%;
32
17
  }
33
18
 
@@ -44,37 +29,28 @@
44
29
  display: flex;
45
30
  width: var(--ui-check-width);
46
31
  height: var(--ui-check-width);
47
- background-color: color-mix(in sRGB, var(--ui-check-bg) var(--ui-check-bg-opacity), var(--ui-check-bg-mix));
48
- border: var(--ui-check-border-width) solid color-mix(in sRGB, var(--ui-check-border-color) var(--ui-check-border-opacity), var(--ui-check-border-mix));
49
- border-radius: var(--ui-check-radius);
50
- user-select: none;
51
- outline: var(--ui-check-outline-width) solid transparent;
32
+ background-color: var(--ui-check-bg, color-mix(in sRGB, var(--color-current) var(--ui-check-bg-opacity, 0), var(--ui-check-bg-mix, transparent)));
33
+ border: var(--ui-check-border-width, 1px) solid color-mix(in sRGB, var(--ui-check-border-color, var(--color-current)) var(--ui-check-border-opacity, calc(var(--tw-border-opacity, 0.2) * 100%)), var(--ui-check-border-mix, transparent));
34
+ border-radius: var(--ui-check-radius, var(--rounded-md));
35
+ outline: var(--ui-check-outline-width, 3px) solid transparent;
52
36
  outline-offset: 0;
53
- justify-content: center;
54
- align-items: center;
55
- transition:
56
- var(--transition-border),
57
- var(--transition-background),
58
- outline-color var(--transition-duration),
59
- outline-offset var(--transition-duration);
60
- font-size: var(--ui-check-icon-font-size);
61
- cursor: pointer;
37
+ transition-property: var(--transition);
38
+ transition-timing-function: var(--ease-in-out);
39
+ transition-duration: var(--duration);
62
40
  flex-shrink: 0;
63
41
 
64
42
  &::before {
65
- line-height: var(--ui-check-icon-font-size);
66
- text-indent: 0;
67
- display: block;
68
43
  transition: var(--transition-color), var(--transition-opacity), var(--transition-transform);
69
44
  color: var(--color-accent-fg);
70
45
  content: "";
71
46
  background-color: currentColor;
72
- mask: var(--ui-check-icon);
47
+ mask: var(--ui-check-icon, var(--mask-check));
73
48
  opacity: 0;
74
49
  transform: scale(0);
75
50
  will-change: transform;
76
- width: 1em;
77
- height: 1em;
51
+ width: var(--ui-check-icon-width);
52
+ height: var(--ui-check-icon-width);
53
+ margin: auto;
78
54
  }
79
55
 
80
56
  &:where(:required) {
@@ -86,7 +62,7 @@
86
62
 
87
63
  &:not(:disabled) {
88
64
  &:is(:hover, :focus-visible) {
89
- --ui-check-bg: var(--ui-check-checked-bg);
65
+ --color-current: var(--ui-check-checked-bg);
90
66
  --ui-check-border-color: var(--ui-check-checked-bg);
91
67
  --ui-check-border-opacity: 75%;
92
68
  --ui-check-bg-opacity: 10%;
@@ -96,23 +72,21 @@
96
72
  --ui-check-border-color: var(--ui-check-checked-bg);
97
73
  --ui-check-border-opacity: 75%;
98
74
 
99
- outline-color: color-mix(in sRGB, var(--ui-check-checked-bg) var(--ui-check-outline-opacity), transparent);
100
- outline-offset: var(--ui-check-outline-offset);
75
+ outline-color: color-mix(in sRGB, var(--ui-check-checked-bg) var(--ui-check-outline-opacity, 20%), transparent);
76
+ outline-offset: var(--ui-check-outline-offset, 0);
101
77
  }
102
78
  }
103
79
 
104
80
  &:disabled {
105
81
  --ui-check-bg-opacity: 15%;
106
- --ui-check-bg: var(--color-current);
107
82
 
108
83
  cursor: not-allowed;
109
- opacity: var(--ui-check-disabled-opacity);
84
+ opacity: var(--ui-check-disabled-opacity, 0.5);
110
85
  }
111
86
 
112
87
  &:checked {
113
88
  --ui-check-border-opacity: 0%;
114
-
115
- background-color: var(--ui-check-checked-bg);
89
+ --ui-check-bg: var(--ui-check-checked-bg);
116
90
 
117
91
  &::before {
118
92
  opacity: 1;
@@ -122,7 +96,7 @@
122
96
  }
123
97
 
124
98
  &.invalid, .validated & :where(input):invalid {
125
- --ui-check-bg: var(--color-error);
99
+ --color-current: var(--color-error);
126
100
  --ui-check-border-color: var(--color-error);
127
101
  --ui-check-checked-bg: var(--color-error);
128
102
  --ui-check-border-opacity: 100%;
@@ -1,9 +1,9 @@
1
1
  .ui-control {
2
2
  --ui-control-color-swatch-width: 1.25rem;
3
3
  --ui-control-color-swatch-height: 1.25rem;
4
- --ui-control-color-swatch-px: 2rem;
4
+ --ui-control-color-swatch-border-radius: var(--rounded-full);
5
5
 
6
- & :where(input, textarea, select) {
6
+ & :where(input) {
7
7
  &::-webkit-color-swatch-wrapper {
8
8
  width: var(--ui-control-color-swatch-width);
9
9
  height: var(--ui-control-color-swatch-height);
@@ -13,19 +13,16 @@
13
13
  &::-moz-color-swatch {
14
14
  width: var(--ui-control-color-swatch-width);
15
15
  height: var(--ui-control-color-swatch-height);
16
- border-radius: var(--ui-control-border-radius);
16
+ border-radius: var(--ui-control-color-swatch-border-radius);
17
17
  margin: 0;
18
18
  }
19
19
 
20
20
  &::-webkit-color-swatch {
21
- border-radius: var(--ui-control-border-radius);
21
+ border-radius: var(--ui-control-color-swatch-border-radius);
22
22
  }
23
23
 
24
24
  &[type="color"] ~ label {
25
- height: 100%;
26
- display: flex;
27
- align-items: center;
28
- padding-inline: calc(var(--ui-control-px) + var(--ui-control-color-swatch-px)) var(--ui-control-px);
25
+ margin-inline-start: calc(var(--ui-control-px) + var(--ui-control-color-swatch-width));
29
26
  }
30
27
  }
31
28
  }
@@ -2,69 +2,54 @@
2
2
  --ui-control-height: 3rem;
3
3
  --ui-control-height-textarea: 8rem;
4
4
  --ui-control-px: 0.75rem;
5
- --ui-control-ps: 0rem;
6
- --ui-control-pe: 0rem;
7
- --ui-control-bg: transparent;
8
- --ui-control-color: currentColor;
9
- --ui-control-placeholder-color: currentColor;
10
- --ui-control-placeholder-opacity: 0.5;
11
- --ui-control-font-size: 0.875rem;
12
- --ui-control-font-weight: var(--font-medium);
5
+ --ui-control-py: 0.75rem;
13
6
  --ui-control-border-width: 1px;
14
- --ui-control-border-color: var(--color-current);
15
- --ui-control-border-mix: transparent;
16
- --ui-control-border-opacity: 15%;
17
- --ui-control-border-radius: var(--rounded);
18
- --ui-control-outline-width: 3px;
19
- --ui-control-outline-offset: 0;
20
- --ui-control-outline-opacity: 20%;
21
- --ui-control-disabled-opacity: 5%;
22
- --ui-control-invalid-bg-opacity: 10%;
23
7
 
24
8
  display: grid;
25
- grid-template-areas: "body";
26
- position: relative;
27
- font-size: var(--ui-control-font-size);
28
- border-radius: var(--ui-control-border-radius);
29
- background-color: var(--ui-control-bg);
30
- transition:
31
- var(--transition-border),
32
- outline-color var(--transition-duration),
33
- outline-offset var(--transition-duration);
34
- font-weight: var(--ui-control-font-weight);
35
- color: var(--ui-control-color);
36
- border: var(--ui-control-border-width) solid color-mix(in sRGB, var(--ui-control-border-color) var(--ui-control-border-opacity), var(--ui-control-border-mix));
37
- outline: var(--ui-control-outline-width) solid transparent;
38
- outline-offset: 0;
39
9
  height: var(--ui-control-height);
10
+ font-family: var(--ui-contro-font-family, var(--font-primary));
11
+ font-weight: var(--ui-control-font-weight, var(--font-medium));
12
+ font-size: var(--ui-control-font-size, var(--text-sm));
13
+ letter-spacing: var(--ui-control-letter-spacing, inherit);
14
+ background-color: var(--ui-control-bg, transparent);
15
+ color: var(--ui-control-color, currentColor);
16
+ border-radius: var(--ui-control-border-radius, var(--rounded));
17
+ border: var(--ui-control-border-width) solid color-mix(in sRGB, var(--ui-control-border-color, var(--color-current)) var(--ui-control-border-opacity, 15%), var(--ui-control-border-mix, transparent));
18
+ outline: var(--ui-control-outline-width, 3px) solid transparent;
19
+ outline-offset: 0;
20
+ transition-property: var(--transition);
21
+ transition-timing-function: var(--ease-in-out);
22
+ transition-duration: var(--duration);
23
+ padding-inline: var(--ui-control-px);
40
24
 
41
25
  &:has(textarea) {
42
26
  height: auto;
43
27
  }
44
28
 
45
29
  & > * {
46
- grid-area: body;
30
+ grid-area: 1/-1;
31
+ margin-block: auto;
47
32
  }
48
33
 
49
34
  & :where(input, textarea, select) {
50
- place-self: stretch;
51
- padding-top: var(--ui-control-pt, 0);
52
- padding-inline: calc(var(--ui-control-px) + var(--ui-control-ps)) calc(var(--ui-control-px) + var(--ui-control-pe));
53
35
  text-overflow: ellipsis;
54
- overflow: hidden;
36
+ overflow: clip;
55
37
  display: flex;
56
38
  align-items: center;
39
+ padding-block: var(--ui-control-py);
40
+ padding-inline: calc(var(--ui-control-px) + var(--ui-control-ps, 0rem)) calc(var(--ui-control-px) + var(--ui-control-pe, 0rem));
41
+ margin-inline: calc(var(--ui-control-px) * -1);
57
42
 
58
43
  &:disabled {
59
44
  cursor: not-allowed;
60
- background-color: color-mix(in sRGB, var(--color-current) var(--ui-control-disabled-opacity), var(--ui-control-bg));
45
+ background-color: color-mix(in sRGB, var(--color-current) var(--ui-control-disabled-opacity, 5%), var(--ui-control-bg, transparent));
61
46
  }
62
47
  }
63
48
 
64
49
  & :where(input, textarea) {
65
50
  &::placeholder {
66
- color: var(--ui-control-placeholder-color);
67
- opacity: var(--ui-control-placeholder-opacity);
51
+ color: var(--ui-control-placeholder-color, currentColor);
52
+ opacity: var(--ui-control-placeholder-opacity, 0.5);
68
53
  }
69
54
  }
70
55
 
@@ -77,8 +62,8 @@
77
62
  --ui-control-border-opacity: 100%;
78
63
  --ui-control-border-color: var(--color-accent);
79
64
 
80
- outline-color: color-mix(in sRGB, var(--color-accent) var(--ui-control-outline-opacity), transparent);
81
- outline-offset: var(--ui-control-outline-offset);
65
+ outline-color: color-mix(in sRGB, var(--color-accent) var(--ui-control-outline-opacity, 20%), transparent);
66
+ outline-offset: var(--ui-control-outline-offset, 0);
82
67
  }
83
68
 
84
69
  &.invalid, .validated &:has(:invalid) {
@@ -87,6 +72,6 @@
87
72
  --ui-control-color: var(--color-error);
88
73
  --color-accent: var(--color-error);
89
74
 
90
- background-color: color-mix(in sRGB, var(--color-error) var(--ui-control-invalid-bg-opacity), var(--ui-control-bg));
75
+ background-color: color-mix(in sRGB, var(--color-error) var(--ui-control-invalid-bg-opacity, 10%), var(--ui-control-bg));
91
76
  }
92
77
  }
@@ -1,25 +1,19 @@
1
1
  .ui-control:has([type="file"]) {
2
- overflow: hidden;
3
-
4
2
  :where([type="file"]) {
5
- --file-selector-button-bg-opacity: 15%;
6
-
7
3
  &:is(:hover, :focus) {
8
- --file-selector-button-bg-opacity: 20%;
4
+ --ui-control-file-selector-button-bg-opacity: 20%;
9
5
  }
10
6
 
11
7
  &::file-selector-button {
12
8
  all: unset;
13
- background-color: color-mix(in sRGB, var(--color-current) var(--file-selector-button-bg-opacity), transparent);
9
+ background-color: color-mix(in sRGB, var(--color-current) var(--ui-control-file-selector-button-bg-opacity, 15%), transparent);
14
10
  height: calc(var(--ui-control-height) - var(--ui-control-border-width) * 2);
15
- padding: 0 1rem;
16
- margin-right: var(--ui-control-px);
17
- border-top-right-radius: var(--rounded);
18
- border-bottom-right-radius: var(--rounded);
19
- cursor: pointer;
20
- margin-top: calc(var(--ui-control-py) * -1);
21
- margin-left: calc(var(--ui-control-px) * -1);
11
+ padding-inline: var(--ui-control-px);
12
+ margin-inline: calc(var(--ui-control-px) * -1) var(--ui-control-px);
13
+ margin-block-start: calc(var(--ui-control-py) * -1);
14
+ border-radius: var(--ui-control-border-radius, var(--rounded));
22
15
  transition: var(--transition-background);
16
+ cursor: pointer;
23
17
  }
24
18
  }
25
19
  }
@@ -0,0 +1,12 @@
1
+ .ui-control:where(:has(:not([type="color"]) ~ label)) {
2
+ --ui-control-placeholder-color: transparent;
3
+
4
+ & :where(input, textarea, select) {
5
+ &:is(:focus, :not(:placeholder-shown)) {
6
+ ~ label {
7
+ transform: translateY(calc(var(--ui-control-label-translate-y) * -1)) scale(var(--ui-control-label-scale));
8
+ opacity: var(--ui-control-label-focus-opacity, 0.5);
9
+ }
10
+ }
11
+ }
12
+ }
@@ -1,43 +1,39 @@
1
- .ui-control:has(:not([type="color"]) ~ label) {
2
- --ui-control-pt: 0.875rem;
3
- --ui-control-label-font-size: 0.875rem;
4
- --ui-control-label-font-weight: var(--font-medium);
5
- --ui-control-label-transition-duration: 0.4s;
1
+ .ui-control:where(:has(:not([type="color"]) ~ label)) {
2
+ --ui-control-label-translate-y: 0.625rem;
3
+ --ui-control-label-scale: 0.8;
6
4
 
7
5
  & :where(label) {
8
- align-self: start;
9
6
  pointer-events: none;
10
- transition: transform var(--ui-control-label-transition-duration) cubic-bezier(0.25, 0.8, 0.25, 1), var(--transition-color), var(--transition-opacity);
7
+ transition: var(--transition-transform), var(--transition-color), var(--transition-opacity);
11
8
  transform-origin: 0 50%;
12
9
  white-space: nowrap;
13
10
  text-overflow: ellipsis;
14
- overflow: hidden;
15
- transform: perspective(100px);
11
+ overflow: clip;
16
12
  will-change: transform;
17
- font-weight: var(--ui-control-label-font-weight);
18
- line-height: var(--ui-control-label-font-size);
19
- margin-top: calc(var(--ui-control-height) / 2 - (var(--ui-control-font-size) / 2));
20
- margin-inline: calc(var(--ui-control-px) + var(--ui-control-ps)) calc(var(--ui-control-px) + var(--ui-control-pe));
13
+ margin-inline: var(--ui-control-ps, 0) var(--ui-control-pe, 0);
21
14
  }
22
15
 
23
- &:has(:required) label {
24
- &::after {
25
- color: var(--color-error);
26
- content: " *";
27
- }
16
+ &:where(:has(:required)) :where(label)::after {
17
+ color: var(--color-error);
18
+ content: " *";
28
19
  }
29
20
 
30
- & :where(input) {
31
- &::-webkit-calendar-picker-indicator {
32
- margin-top: calc(var(--ui-control-pt) * -1);
33
- }
21
+ & :where(textarea) {
22
+ padding-block-start: calc(var(--ui-control-py) + var(--ui-control-label-translate-y) * var(--ui-control-label-scale));
34
23
 
35
- &::-webkit-search-cancel-button {
36
- transform: translateY(calc(var(--ui-control-pt) / 2 * -1));
24
+ & + :where(label) {
25
+ margin-block-start: var(--ui-control-py);
37
26
  }
38
27
  }
39
28
 
40
- & :where(textarea) {
41
- padding-top: calc(var(--ui-control-pt) + calc(var(--ui-control-height) / 2 - (var(--ui-control-font-size))));
29
+ & :where(input, select) {
30
+ padding-block: calc(var(--ui-control-py) + var(--ui-control-label-translate-y) * var(--ui-control-label-scale)) calc(var(--ui-control-py) - var(--ui-control-label-translate-y) * var(--ui-control-label-scale));
31
+
32
+ &::-webkit-calendar-picker-indicator,
33
+ &::-webkit-search-cancel-button,
34
+ &::-webkit-outer-spin-button,
35
+ &::-webkit-inner-spin-button {
36
+ transform: translateY(calc(var(--ui-control-label-translate-y) * var(--ui-control-label-scale) * -1));
37
+ }
42
38
  }
43
39
  }
@@ -21,21 +21,20 @@
21
21
  }
22
22
 
23
23
  & :where(.icon-l) {
24
- inset-inline-start: var(--ui-control-px);
25
24
  margin-inline-end: auto;
26
25
  }
27
26
 
28
27
  & :where(.icon-r) {
29
- inset-inline-end: var(--ui-control-px);
30
28
  margin-inline-start: auto;
31
29
  }
32
30
 
33
31
  & :where(.icon-l, .icon-r) {
34
- position: relative;
35
32
  display: flex;
36
- flex-direction: row;
37
33
  align-items: center;
38
- align-self: center;
39
34
  gap: var(--ui-control-icon-gap);
40
35
  }
36
+
37
+ &:has(textarea) :where(.icon-l, .icon-r) {
38
+ margin-block-start: var(--ui-control-py);
39
+ }
41
40
  }
@@ -3,5 +3,5 @@
3
3
  @import "icon.css";
4
4
  @import "file.css";
5
5
  @import "floating.css";
6
- @import "floating-focus.css";
6
+ @import "floating-interactive.css";
7
7
  @import "select.css";
@@ -1,7 +1,7 @@
1
1
  .ui-control:has(select) {
2
2
  --ui-control-select-icon-size: 1.5rem;
3
- --ui-control-select-icon-me: calc(var(--ui-control-px) - 0.25rem);
4
- --ui-control-pe: calc(var(--ui-control-select-icon-size) + 0.25rem);
3
+ --ui-control-select-icon-me: -0.25rem;
4
+ --ui-control-pe: calc(var(--ui-control-select-icon-size) + var(--ui-control-select-icon-me));
5
5
 
6
6
  &:has(.icon-r) {
7
7
  --ui-control-icon-count-e: 2;
@@ -16,9 +16,9 @@
16
16
  width: var(--ui-control-select-icon-size);
17
17
  height: var(--ui-control-select-icon-size);
18
18
  background-color: currentColor;
19
- mask: var(--icon-angle-down);
19
+ mask: var(--mask-angle-down);
20
20
  pointer-events: none;
21
- grid-area: body;
21
+ grid-area: 1/-1;
22
22
  align-self: center;
23
23
  margin-inline: auto var(--ui-control-select-icon-me);
24
24
  }
@@ -1,13 +1,8 @@
1
1
  .ui-heading {
2
- --ui-heading-font-family: var(--font-primary);
3
- --ui-heading-font-weight: var(--font-semibold);
4
- --ui-heading-font-size: 1.25rem;
5
- --ui-heading-line-height: calc(var(--ui-heading-font-size) + var(--ui-heading-line-height-ratio));
6
- --ui-heading-line-height-ratio: 0.375rem;
7
-
8
- font-family: var(--ui-heading-font-family);
9
- font-size: var(--ui-heading-font-size);
10
- line-height: var(--ui-heading-line-height);
11
- font-weight: var(--ui-heading-font-weight);
2
+ font-family: var(--ui-heading-font-family, var(--font-primary));
3
+ font-weight: var(--ui-heading-font-weight, var(--font-semibold));
4
+ font-size: var(--ui-heading-font-size, var(--text-xl));
5
+ line-height: var(--ui-heading-line-height, calc(1em + var(--ui-heading-line-height-ratio, 0.25lh)));
6
+ letter-spacing: var(--ui-heading-letter-spacing, 0);
12
7
  text-wrap: balance;
13
8
  }
@@ -1,3 +1,3 @@
1
- .ui-heading:where(.lg) {
2
- --ui-heading-font-size: 1.875rem;
1
+ .ui-heading:is(.lg) {
2
+ --ui-heading-font-size: var(--text-3xl);
3
3
  }
@@ -1,4 +1,3 @@
1
- .ui-heading:where(.sm) {
2
- --ui-heading-font-size: 1.125rem;
3
- --ui-heading-line-height-ratio: 0.125rem;
1
+ .ui-heading:is(.sm) {
2
+ --ui-heading-font-size: var(--text-lg);
4
3
  }