winduum 0.1.17 → 0.2.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 (94) hide show
  1. package/dist/main.css +1 -1
  2. package/dist/tailwind.css +1 -1
  3. package/package.json +15 -16
  4. package/src/base/config.css +0 -10
  5. package/src/base/default.css +23 -10
  6. package/src/base/icons.css +0 -3
  7. package/src/base/index.css +2 -0
  8. package/src/base/keyframes.css +0 -118
  9. package/src/base/reset.css +27 -15
  10. package/src/base/tailwind/utilities.css +3 -3
  11. package/src/base/theme/dark-rgb.css +5 -0
  12. package/src/base/theme/dark.css +5 -7
  13. package/src/base/theme/default-rgb.css +14 -0
  14. package/src/base/theme/default.css +19 -14
  15. package/src/components/dialog.css +2 -2
  16. package/src/components/field.css +3 -3
  17. package/src/libraries/dialog.css +2 -2
  18. package/src/libraries/dialog.js +7 -9
  19. package/src/libraries/ripple.css +2 -2
  20. package/src/libraries/ripple.js +3 -5
  21. package/src/main-rgb.css +1 -0
  22. package/src/main.css +1 -1
  23. package/src/main.js +1 -0
  24. package/src/ui/badge/bordered.css +8 -0
  25. package/src/ui/badge/circle.css +5 -0
  26. package/src/ui/badge/default.css +40 -0
  27. package/src/ui/badge/group.css +16 -0
  28. package/src/ui/badge/index.css +8 -0
  29. package/src/ui/badge/lg.css +3 -0
  30. package/src/ui/badge/muted.css +3 -0
  31. package/src/ui/badge/sm.css +4 -0
  32. package/src/ui/badge/square.css +4 -0
  33. package/src/ui/badge.css +1 -109
  34. package/src/ui/btn/bordered-rgb.css +3 -0
  35. package/src/ui/btn/bordered.css +8 -0
  36. package/src/ui/btn/circle.css +5 -0
  37. package/src/ui/btn/default-rgb.css +9 -0
  38. package/src/ui/btn/default.css +97 -0
  39. package/src/ui/btn/ghosted.css +4 -0
  40. package/src/ui/btn/gradient-bordered.css +27 -0
  41. package/src/ui/btn/gradient.css +10 -0
  42. package/src/ui/btn/group.css +18 -0
  43. package/src/ui/btn/hover-fill.css +8 -0
  44. package/src/ui/btn/index.css +15 -0
  45. package/src/ui/btn/lg.css +4 -0
  46. package/src/ui/btn/loading.css +24 -0
  47. package/src/ui/btn/muted.css +4 -0
  48. package/src/ui/btn/raised.css +8 -0
  49. package/src/ui/btn/sm.css +4 -0
  50. package/src/ui/btn/square.css +4 -0
  51. package/src/ui/btn/wide.css +4 -0
  52. package/src/ui/btn.css +1 -234
  53. package/src/ui/check.css +130 -0
  54. package/src/ui/control/default-rgb.css +18 -0
  55. package/src/ui/control/default.css +94 -0
  56. package/src/ui/control/floating-focus.css +8 -0
  57. package/src/ui/control/floating.css +31 -0
  58. package/src/ui/control/group.css +22 -0
  59. package/src/ui/control/icon.css +66 -0
  60. package/src/ui/control/index.css +6 -0
  61. package/src/ui/control/select.css +27 -0
  62. package/src/ui/heading/default.css +12 -0
  63. package/src/ui/heading/index.css +3 -0
  64. package/src/ui/heading/lg.css +3 -0
  65. package/src/ui/heading/sm.css +4 -0
  66. package/src/ui/heading.css +1 -21
  67. package/src/ui/image.css +4 -4
  68. package/src/ui/{+.css → index.css} +2 -4
  69. package/src/ui/info.css +1 -1
  70. package/src/ui/input.css +1 -226
  71. package/src/ui/label.css +1 -1
  72. package/src/ui/link/default.css +33 -0
  73. package/src/ui/link/index.css +2 -0
  74. package/src/ui/link/underlined.css +47 -0
  75. package/src/ui/link.css +1 -45
  76. package/src/ui/notice.css +9 -22
  77. package/src/ui/progress/default.css +39 -0
  78. package/src/ui/progress/index.css +3 -0
  79. package/src/ui/progress/lg.css +3 -0
  80. package/src/ui/progress/sm.css +3 -0
  81. package/src/ui/progress.css +1 -50
  82. package/src/ui/switch.css +23 -28
  83. package/src/ui/text.css +15 -15
  84. package/src/ui/title/default.css +12 -0
  85. package/src/ui/title/index.css +3 -0
  86. package/src/ui/title/lg.css +3 -0
  87. package/src/ui/title/sm.css +3 -0
  88. package/src/ui/title.css +1 -20
  89. package/tailwind.config.cjs +1 -1
  90. package/utils/tailwind.cjs +42 -27
  91. package/utils/tailwind.js +36 -23
  92. package/src/ui/checkbox.css +0 -106
  93. package/src/ui/radio.css +0 -4
  94. package/src/ui/select.css +0 -27
@@ -1,17 +1,17 @@
1
1
  @layer utilities {
2
- :where(.animate) {
2
+ .animate {
3
3
  animation-duration: var(--transition-duration);
4
4
  animation-fill-mode: both;
5
5
  }
6
6
 
7
- :where(.container) {
7
+ .container {
8
8
  margin-left: auto;
9
9
  margin-right: auto;
10
10
  padding-left: var(--container-padding);
11
11
  padding-right: var(--container-padding);
12
12
  max-width: var(--container-width);
13
13
 
14
- &:where(.is-sm) {
14
+ &:where(.sm) {
15
15
  --container-width: var(--container-width-sm);
16
16
  }
17
17
  }
@@ -0,0 +1,5 @@
1
+ :root.dark {
2
+ --color-secondary-rgb: 39 41 46;
3
+ --color-base-rgb: 201 209 217;
4
+ --color-body-rgb: 25 26 27;
5
+ }
@@ -1,9 +1,7 @@
1
1
  :root.dark {
2
- --color-default: 201 209 217;
3
- --color-invert: 14 17 22;
4
- --color-secondary: 39 41 46;
5
- --color-background: 25 26 27;
6
- --color-background-100: 14 15 16;
7
- --color-background-200: 26 32 38;
8
- --color-background-300: 30 36 46;
2
+ --color-base-mix: black;
3
+ --color-body-mix: white;
4
+ --color-secondary: rgb(var(--color-secondary-rgb));
5
+ --color-base: rgb(var(--color-base-rgb));
6
+ --color-body: rgb(var(--color-body-rgb));
9
7
  }
@@ -0,0 +1,14 @@
1
+ :root {
2
+ --color-primary-rgb: 3 138 255;
3
+ --color-secondary-rgb: 69 71 72;
4
+ --color-base-rgb: 17 19 21;
5
+ --color-body-rgb: 255 255 255;
6
+ --color-success-rgb: 33 154 67;
7
+ --color-error-rgb: 254 50 75;
8
+ --color-warning-rgb: 254 179 53;
9
+ --color-info-rgb: 45 168 234;
10
+ --color-light-rgb: 255 255 255;
11
+ --color-dark-rgb: 17 19 21;
12
+ --color-accent-rgb: var(--color-primary-rgb);
13
+ --color-current-rgb: var(--color-base-rgb);
14
+ }
@@ -1,17 +1,22 @@
1
1
  :root {
2
+ --color-primary: rgb(var(--color-primary-rgb));
3
+ --color-secondary: rgb(var(--color-secondary-rgb));
4
+ --color-success: rgb(var(--color-success-rgb));
5
+ --color-error: rgb(var(--color-error-rgb));
6
+ --color-warning: rgb(var(--color-warning-rgb));
7
+ --color-info: rgb(var(--color-info-rgb));
8
+ --color-base: var(--color-base-primary);
9
+ --color-base-mix: white;
10
+ --color-base-primary: rgb(var(--color-base-rgb));
11
+ --color-base-secondary: color-mix(in sRGB, var(--color-base) 75%, var(--color-base-mix));
12
+ --color-base-tertiary: color-mix(in sRGB, var(--color-base) 50%, var(--color-base-mix));
13
+ --color-body: var(--color-body-primary);
14
+ --color-body-mix: black;
15
+ --color-body-primary: rgb(var(--color-body-rgb));
16
+ --color-body-secondary: color-mix(in sRGB, var(--color-body) 95%, var(--color-body-mix));
17
+ --color-body-tertiary: color-mix(in sRGB, var(--color-body) 90%, var(--color-body-mix));
18
+ --color-light: rgb(var(--color-light-rgb));
19
+ --color-dark: rgb(var(--color-dark-rgb));
2
20
  --color-accent: var(--color-primary);
3
- --color-current: var(--color-default);
4
- --color-default: 17 19 21;
5
- --color-primary: 3 138 255;
6
- --color-secondary: 69 71 72;
7
- --color-light: 255 255 255;
8
- --color-dark: 17 19 21;
9
- --color-success: 33 154 67;
10
- --color-error: 254 50 75;
11
- --color-warning: 254 179 53;
12
- --color-info: 45 168 234;
13
- --color-background: 255 255 255;
14
- --color-background-100: 249 250 252;
15
- --color-background-200: 235 235 235;
16
- --color-background-300: 225 225 225;
21
+ --color-current: var(--color-base);
17
22
  }
@@ -1,4 +1,4 @@
1
- :where(.c-dialog) {
1
+ .c-dialog {
2
2
  --c-dialog-py: 1.5rem;
3
3
  --c-dialog-px: 1.5rem;
4
4
  --c-dialog-width: 35rem;
@@ -8,7 +8,7 @@
8
8
  position: relative;
9
9
  z-index: var(--z-20);
10
10
  margin: auto;
11
- background-color: rgb(var(--color-background));
11
+ background-color: var(--color-body-primary);
12
12
  width: 100%;
13
13
  max-width: var(--c-dialog-width);
14
14
  border-radius: var(--rounded-md);
@@ -1,11 +1,11 @@
1
- :where(.c-field) {
1
+ .c-field {
2
2
  --c-field-gap: 0.5rem;
3
3
 
4
4
  display: flex;
5
5
  flex-direction: column;
6
6
  gap: var(--c-field-gap);
7
7
 
8
- .is-validated &:has(:invalid) {
8
+ .validated &:has(:invalid) {
9
9
  & :where(.ui-info[hidden]) {
10
10
  display: block;
11
11
  }
@@ -13,7 +13,7 @@
13
13
 
14
14
  &:has([required]) :where(.ui-label) {
15
15
  &::after {
16
- color: rgb(var(--color-error));
16
+ color: var(--color-error);
17
17
  content: " *";
18
18
  }
19
19
  }
@@ -1,5 +1,5 @@
1
- :where(.lib-dialog) {
2
- --lib-ripple-bg: rgb(var(--color-dark) / var(--tw-bg-opacity, 0.8));
1
+ .lib-dialog {
2
+ --lib-ripple-bg: rgb(var(--color-dark-rgb) / var(--tw-bg-opacity, 0.8));
3
3
  --lib-dialog-py: 2rem;
4
4
  --lib-dialog-px: 1.5rem;
5
5
  --lib-dialog-animation-duration: var(--transition-duration);
@@ -1,4 +1,4 @@
1
- const defaultOptions = {
1
+ export const defaultOptions = {
2
2
  openClass: 'is-lib-dialog-open',
3
3
  scrollbarWidthProperty: '--lib-dialog-scrollbar-width',
4
4
  show: {
@@ -15,7 +15,7 @@ const defaultOptions = {
15
15
  }
16
16
  }
17
17
 
18
- const dialogSelector = selector => document.querySelectorAll(selector)[document.querySelectorAll(selector).length - 1]
18
+ export const dialogSelector = selector => document.querySelectorAll(selector)[document.querySelectorAll(selector).length - 1]
19
19
 
20
20
  /**
21
21
  * Dismisses a dialog.
@@ -23,7 +23,7 @@ const dialogSelector = selector => document.querySelectorAll(selector)[document.
23
23
  * @param selector - The dialog element to dismiss.
24
24
  * @param options - The options for closing the dialog.
25
25
  */
26
- const dismissDialog = async (selector, options = defaultOptions.close) => {
26
+ export const dismissDialog = async (selector, options = defaultOptions.close) => {
27
27
  await Promise.allSettled(selector.getAnimations().map(animation => animation.finished))
28
28
  selector.setAttribute('inert', '')
29
29
  options.remove && selector.remove()
@@ -39,7 +39,7 @@ const dismissDialog = async (selector, options = defaultOptions.close) => {
39
39
  * @param selector - The dialog element to show.
40
40
  * @param options - The options for showing the dialog.
41
41
  */
42
- const showDialog = async (selector, options = defaultOptions.show) => {
42
+ export const showDialog = async (selector, options = defaultOptions.show) => {
43
43
  options = Object.assign({}, defaultOptions.show, options)
44
44
 
45
45
  document.documentElement.style.setProperty(defaultOptions.scrollbarWidthProperty, `${window.innerWidth - document.body.clientWidth}px`)
@@ -75,7 +75,7 @@ const showDialog = async (selector, options = defaultOptions.show) => {
75
75
  * @param selector - The dialog element to dismiss.
76
76
  * @param options - The options for closing the dialog.
77
77
  */
78
- const closeDialog = async (selector, options = defaultOptions.close) => {
78
+ export const closeDialog = async (selector, options = defaultOptions.close) => {
79
79
  options = Object.assign({}, defaultOptions.close, options)
80
80
 
81
81
  window.HTMLDialogElement
@@ -91,7 +91,7 @@ const closeDialog = async (selector, options = defaultOptions.close) => {
91
91
  * @param content - The HTML content to insert into the dialog.
92
92
  * @param options - The options for inserting the dialog.
93
93
  */
94
- const insertDialog = async (content, options = defaultOptions.insert) => {
94
+ export const insertDialog = async (content, options = defaultOptions.insert) => {
95
95
  options = Object.assign({}, defaultOptions.insert, options)
96
96
 
97
97
  if (!dialogSelector(options.selector) || options.append) {
@@ -109,14 +109,12 @@ const insertDialog = async (content, options = defaultOptions.insert) => {
109
109
  * @type {typeof import("./dialog").fetchDialog}
110
110
  * @param options - The options for fetching and inserting the dialog.
111
111
  */
112
- const fetchDialog = async ({ url, insertOptions = {} }) => {
112
+ export const fetchDialog = async ({ url, insertOptions = {} }) => {
113
113
  await fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest' } })
114
114
  .then(response => response.json())
115
115
  .then(async ({ content }) => await insertDialog(content, insertOptions))
116
116
  }
117
117
 
118
- export { showDialog, closeDialog, insertDialog, fetchDialog, dialogSelector, dismissDialog }
119
-
120
118
  export default {
121
119
  defaults: defaultOptions,
122
120
  dismiss: dismissDialog,
@@ -1,6 +1,6 @@
1
- :where(.lib-ripple) {
1
+ .lib-ripple {
2
2
  --lib-ripple-animation-duration: 1s;
3
- --lib-ripple-bg: rgb(var(--color-background) / var(--tw-bg-opacity, 0.4));
3
+ --lib-ripple-bg: rgb(var(--color-body-rgb) / var(--tw-bg-opacity, 0.4));
4
4
 
5
5
  position: absolute;
6
6
  background: var(--lib-ripple-bg);
@@ -2,7 +2,7 @@
2
2
  * Shows a ripple effect.
3
3
  * @type {typeof import("./ripple").showRipple}
4
4
  */
5
- const showRipple = ({ currentTarget, layerX, layerY }, selector = currentTarget.querySelector('.lib-ripple')) => {
5
+ export const showRipple = ({ currentTarget, layerX, layerY }, selector = currentTarget.querySelector('.lib-ripple')) => {
6
6
  if (!selector) {
7
7
  currentTarget.insertAdjacentHTML('beforeend', "<div class='lib-ripple'></div>")
8
8
  selector = currentTarget.querySelector('.lib-ripple')
@@ -17,13 +17,11 @@ const showRipple = ({ currentTarget, layerX, layerY }, selector = currentTarget.
17
17
  selector.style.height = d + 'px'
18
18
  }
19
19
 
20
- selector.style.top = layerX - (selector.clientWidth / 2) + 'px'
21
- selector.style.left = layerY - (selector.clientHeight / 2) + 'px'
20
+ selector.style.top = layerY - (selector.clientHeight / 2) + 'px'
21
+ selector.style.left = layerX - (selector.clientWidth / 2) + 'px'
22
22
  selector.classList.add('animation-ripple')
23
23
  }
24
24
 
25
- export { showRipple }
26
-
27
25
  export default {
28
26
  show: showRipple
29
27
  }
@@ -0,0 +1 @@
1
+ @import "ui/control/default-rgb.css"
package/src/main.css CHANGED
@@ -1,4 +1,4 @@
1
1
  @import "base/index.css";
2
- @import "ui/+.css";
2
+ @import "ui/index.css";
3
3
  @import "components/+.css";
4
4
  @import "libraries/+.css";
package/src/main.js CHANGED
@@ -0,0 +1 @@
1
+ !CSS.supports('selector(:has(*))') && (async () => (await import('css-has-pseudo/browser')).default(document))()
@@ -0,0 +1,8 @@
1
+ .ui-badge:where(.bordered) {
2
+ --ui-badge-border-width: 2px;
3
+ --ui-badge-border-opacity: calc(var(--tw-border-opacity, 1) * 100%);
4
+
5
+ border: var(--ui-badge-border-width) solid color-mix(in sRGB, var(--color-accent) var(--ui-badge-border-opacity), transparent);
6
+ padding-left: calc(var(--ui-badge-px) - var(--ui-badge-border-width));
7
+ padding-right: calc(var(--ui-badge-px) - var(--ui-badge-border-width));
8
+ }
@@ -0,0 +1,5 @@
1
+ .ui-badge:where(.circle) {
2
+ --ui-badge-px: var(--ui-badge-py);
3
+ --ui-badge-width: var(--ui-badge-height);
4
+ --ui-badge-border-radius: var(--rounded-full);
5
+ }
@@ -0,0 +1,40 @@
1
+ .ui-badge {
2
+ --color-current: var(--color-light);
3
+ --ui-badge-width: max-content;
4
+ --ui-badge-height: 1.5rem;
5
+ --ui-badge-py: 0;
6
+ --ui-badge-px: 0.5rem;
7
+ --ui-badge-border-radius: var(--rounded-xs);
8
+ --ui-badge-font-size: 0.75rem;
9
+ --ui-badge-font-weight: var(--font-normal);
10
+ --ui-badge-bg: color-mix(in sRGB, var(--color-accent) var(--ui-badge-bg-opacity), var(--ui-badge-bg-mix));
11
+ --ui-badge-bg-mix: transparent;
12
+ --ui-badge-bg-opacity: calc(var(--tw-bg-opacity, 1) * 100%);
13
+ --ui-badge-color: color-mix(in sRGB, var(--color-current) var(--ui-badge-color-opacity), transparent);
14
+ --ui-badge-color-opacity: calc(var(--tw-text-opacity, 1) * 100%);
15
+ --ui-badge-gap: 0.25rem;
16
+
17
+ width: var(--ui-badge-width);
18
+ height: var(--ui-badge-height);
19
+ padding: var(--ui-badge-py) var(--ui-badge-px);
20
+ border-radius: var(--ui-badge-border-radius);
21
+ font-size: var(--ui-badge-font-size);
22
+ font-weight: var(--ui-badge-font-weight);
23
+ background-color: var(--ui-badge-bg);
24
+ color: var(--ui-badge-color);
25
+ display: inline-flex;
26
+ align-items: center;
27
+ text-align: center;
28
+ justify-content: center;
29
+ white-space: nowrap;
30
+ flex-shrink: 0;
31
+ position: relative;
32
+ z-index: 0;
33
+ gap: var(--ui-badge-gap);
34
+ transition: var(--transition-opacity);
35
+
36
+ &:where(.bordered, .muted) {
37
+ --color-current: var(--color-accent);
38
+ --ui-badge-bg-opacity: 0%;
39
+ }
40
+ }
@@ -0,0 +1,16 @@
1
+ .ui-badge-group {
2
+ display: flex;
3
+
4
+ & :where(.ui-badge) {
5
+ &:not(:first-child) {
6
+ border-top-left-radius: 0;
7
+ border-bottom-left-radius: 0;
8
+ border-left: 0;
9
+ }
10
+
11
+ &:not(:last-child) {
12
+ border-top-right-radius: 0;
13
+ border-bottom-right-radius: 0;
14
+ }
15
+ }
16
+ }
@@ -0,0 +1,8 @@
1
+ @import "default.css";
2
+ @import "sm.css";
3
+ @import "lg.css";
4
+ @import "bordered.css";
5
+ @import "muted.css";
6
+ @import "square.css";
7
+ @import "circle.css";
8
+ @import "group.css";
@@ -0,0 +1,3 @@
1
+ .ui-badge:where(.lg) {
2
+ --ui-badge-height: 1.75rem;
3
+ }
@@ -0,0 +1,3 @@
1
+ .ui-badge:where(.muted) {
2
+ --ui-badge-bg-opacity: 10%;
3
+ }
@@ -0,0 +1,4 @@
1
+ .ui-badge:where(.sm) {
2
+ --ui-badge-height: 1.25rem;
3
+ --ui-badge-font-size: 0.625rem;
4
+ }
@@ -0,0 +1,4 @@
1
+ .ui-badge:where(.square) {
2
+ --ui-badge-px: var(--ui-badge-py);
3
+ --ui-badge-width: var(--ui-badge-height);
4
+ }
package/src/ui/badge.css CHANGED
@@ -1,109 +1 @@
1
- :where(.ui-badge) {
2
- --color-current: var(--color-light);
3
- --ui-badge-width: max-content;
4
- --ui-badge-height: 1.5rem;
5
- --ui-badge-py: 0;
6
- --ui-badge-px: 0.5rem;
7
- --ui-badge-border-radius: var(--rounded-xs);
8
- --ui-badge-font-size: 0.75rem;
9
- --ui-badge-font-weight: var(--font-normal);
10
- --ui-badge-bg: rgb(var(--color-accent) / var(--ui-badge-bg-opacity));
11
- --ui-badge-bg-opacity: var(--tw-bg-opacity, 1);
12
- --ui-badge-color: rgb(var(--color-current) / var(--ui-badge-color-opacity));
13
- --ui-badge-color-opacity: var(--tw-text-opacity, 1);
14
- --ui-badge-outline-width: 1px;
15
- --ui-badge-outline-opacity: 0.75;
16
- --ui-badge-icon-font-size: 0.875rem;
17
- --ui-badge-gap: 0.25rem;
18
- --ui-badge-focus-opacity: 0.3;
19
- --ui-badge-hover-opacity: 0.8;
20
-
21
- width: var(--ui-badge-width);
22
- height: var(--ui-badge-height);
23
- padding: var(--ui-badge-py) var(--ui-badge-px);
24
- border-radius: var(--ui-badge-border-radius);
25
- font-size: var(--ui-badge-font-size);
26
- font-weight: var(--ui-badge-font-weight);
27
- background-color: var(--ui-badge-bg);
28
- color: var(--ui-badge-color);
29
- display: inline-flex;
30
- align-items: center;
31
- text-align: center;
32
- justify-content: center;
33
- white-space: nowrap;
34
- flex-shrink: 0;
35
- position: relative;
36
- z-index: 0;
37
- gap: var(--ui-badge-gap);
38
- transition: var(--transition-opacity);
39
-
40
- & :where(svg) {
41
- width: 1em;
42
- height: 1em;
43
- font-size: var(--ui-badge-icon-font-size);
44
- }
45
-
46
- &:where(.is-sm) {
47
- --ui-badge-height: 1.25rem;
48
- --ui-badge-font-size: 0.625rem;
49
- }
50
-
51
- &:where(.is-lg) {
52
- --ui-badge-height: 1.75rem;
53
- }
54
-
55
- &:where(.is-outline) {
56
- outline: var(--ui-badge-outline-width) solid rgb(var(--color-accent) / var(--ui-badge-outline-opacity));
57
- outline-offset: calc(var(--ui-badge-outline-width) * -1);
58
- }
59
-
60
- &:where(.is-outline, .is-muted) {
61
- --color-current: var(--color-accent);
62
- --ui-badge-bg: transparent;
63
- }
64
-
65
- &:where(.is-muted) {
66
- background-color: rgb(var(--color-current) / 0.1);
67
- }
68
-
69
- &:where(.is-square, .is-circle) {
70
- --ui-badge-px: var(--ui-badge-py);
71
- --ui-badge-width: var(--ui-badge-height);
72
- }
73
-
74
- &:where(.is-circle) {
75
- --ui-badge-border-radius: var(--rounded-full);
76
- }
77
-
78
- &:where([href], button) {
79
- &:hover {
80
- @media (hover: hover) and (pointer: fine) {
81
- opacity: var(--ui-badge-hover-opacity);
82
- }
83
- }
84
-
85
- &:focus-visible {
86
- z-index: 2;
87
- box-shadow:
88
- 0 0 0 0 rgb(var(--color-current)),
89
- 0 0 0 max(2px, var(--ui-badge-outline-width)) rgb(var(--color-accent) / var(--ui-badge-focus-opacity));
90
- }
91
- }
92
- }
93
-
94
- :where(.ui-badge-group) {
95
- display: flex;
96
-
97
- & :where(.ui-badge) {
98
- &:not(:first-child) {
99
- border-top-left-radius: 0;
100
- border-bottom-left-radius: 0;
101
- margin-left: calc(var(--ui-badge-outline-width) * -1);
102
- }
103
-
104
- &:not(:last-child) {
105
- border-top-right-radius: 0;
106
- border-bottom-right-radius: 0;
107
- }
108
- }
109
- }
1
+ @import "badge/index.css";
@@ -0,0 +1,3 @@
1
+ .ui-btn:where(.bordered) {
2
+ border: var(--ui-btn-border-width) solid rgb(var(--color-accent-rgb) / var(--ui-btn-border-opacity));
3
+ }
@@ -0,0 +1,8 @@
1
+ .ui-btn:where(.bordered) {
2
+ --ui-btn-border-width: 2px;
3
+ --ui-btn-border-opacity: calc(var(--tw-border-opacity, 1) * 100%);
4
+
5
+ border: var(--ui-btn-border-width) solid color-mix(in sRGB, var(--color-accent) var(--ui-btn-border-opacity), transparent);
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));
8
+ }
@@ -0,0 +1,5 @@
1
+ .ui-btn:where(.circle) {
2
+ --ui-btn-px: var(--ui-btn-py);
3
+ --ui-btn-width: var(--ui-btn-height);
4
+ --ui-btn-border-radius: var(--rounded-full);
5
+ }
@@ -0,0 +1,9 @@
1
+ .ui-btn {
2
+ --color-current-rgb: var(--color-light-rgb);
3
+ --ui-btn-bg: rgb(var(--color-accent-rgb) / var(--ui-btn-bg-opacity));
4
+ --ui-btn-color: rgb(var(--color-current-rgb) / var(--ui-btn-color-opacity));
5
+
6
+ &:where(.bordered, .muted, .ghosted) {
7
+ --color-current-rgb: var(--color-accent-rgb);
8
+ }
9
+ }
@@ -0,0 +1,97 @@
1
+ .ui-btn {
2
+ --color-current: var(--color-light);
3
+ --ui-btn-width: max-content;
4
+ --ui-btn-height: 2.25rem;
5
+ --ui-btn-gap: 0.375rem;
6
+ --ui-btn-py: 0.375rem;
7
+ --ui-btn-px: 0.75rem;
8
+ --ui-btn-border-radius: var(--rounded);
9
+ --ui-btn-font-size: 0.875rem;
10
+ --ui-btn-font-weight: var(--font-semibold);
11
+ --ui-btn-letter-spacing: 0;
12
+ --ui-btn-bg: color-mix(in sRGB, var(--color-accent) var(--ui-btn-bg-opacity), var(--ui-btn-bg-mix));
13
+ --ui-btn-bg-mix: transparent;
14
+ --ui-btn-bg-opacity: calc(var(--tw-bg-opacity, 1) * 100%);
15
+ --ui-btn-color: color-mix(in sRGB, var(--color-current) var(--ui-btn-color-opacity), transparent);
16
+ --ui-btn-color-opacity: calc(var(--tw-text-opacity, 1) * 100%);
17
+ --ui-btn-outline-width: 2px;
18
+ --ui-btn-outline-offset: 2px;
19
+ --ui-btn-outline-opacity: 50%;
20
+ --ui-btn-hover-mix: black;
21
+ --ui-btn-hover-opacity: 80%;
22
+ --ui-btn-hover-color: var(--color-current);
23
+ --ui-btn-active-mix: black;
24
+ --ui-btn-active-opacity: 90%;
25
+ --ui-btn-active-color: var(--color-current);
26
+ --ui-btn-focus-mix: transparent;
27
+ --ui-btn-focus-opacity: 50%;
28
+ --ui-btn-disabled-opacity: 70%;
29
+ --ui-btn-loading-width: 1rem;
30
+ --ui-btn-loading-border-width: 2px;
31
+
32
+ max-width: var(--ui-btn-width);
33
+ width: var(--ui-btn-width);
34
+ height: var(--ui-btn-height);
35
+ padding: var(--ui-btn-py) var(--ui-btn-px);
36
+ border-radius: var(--ui-btn-border-radius);
37
+ font-size: var(--ui-btn-font-size);
38
+ font-weight: var(--ui-btn-font-weight);
39
+ letter-spacing: var(--ui-btn-letter-spacing);
40
+ background-color: var(--ui-btn-bg);
41
+ color: var(--ui-btn-color);
42
+ user-select: none;
43
+ overflow: hidden;
44
+ display: inline-flex;
45
+ align-items: center;
46
+ text-align: center;
47
+ justify-content: center;
48
+ white-space: nowrap;
49
+ flex-shrink: 0;
50
+ position: relative;
51
+ z-index: 0;
52
+ transition:
53
+ var(--transition-background),
54
+ var(--transition-color),
55
+ outline-color var(--transition-duration),
56
+ outline-offset var(--transition-duration);
57
+ gap: var(--ui-btn-gap);
58
+ outline: var(--ui-btn-outline-width) solid transparent;
59
+ outline-offset: 0;
60
+
61
+ &:where(.bordered, .muted, .ghosted) {
62
+ --ui-btn-hover-mix: transparent;
63
+ --ui-btn-hover-opacity: 10%;
64
+ --ui-btn-active-mix: transparent;
65
+ --ui-btn-active-opacity: 20%;
66
+ --color-current: var(--color-accent);
67
+ --ui-btn-bg-opacity: 0%;
68
+ }
69
+
70
+ &:is([href], button, [role="button"]) {
71
+ &:disabled {
72
+ opacity: var(--ui-btn-disabled-opacity);
73
+ cursor: not-allowed;
74
+ }
75
+
76
+ &:not(:disabled) {
77
+ &:hover {
78
+ @media (hover: hover) and (pointer: fine) {
79
+ --ui-btn-color: var(--ui-btn-hover-color);
80
+ --ui-btn-bg-mix: var(--ui-btn-hover-mix);
81
+ --ui-btn-bg-opacity: var(--ui-btn-hover-opacity);
82
+ }
83
+ }
84
+
85
+ &:focus {
86
+ outline-color: color-mix(in sRGB, var(--color-accent) var(--ui-btn-focus-opacity), var(--ui-btn-focus-mix));
87
+ outline-offset: var(--ui-btn-outline-offset);
88
+ }
89
+
90
+ &:is(:active, .active) {
91
+ --ui-btn-color: var(--ui-btn-active-color);
92
+ --ui-btn-bg-mix: var(--ui-btn-active-mix);
93
+ --ui-btn-bg-opacity: var(--ui-btn-active-opacity);
94
+ }
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,4 @@
1
+ .ui-btn:where(.ghosted) {
2
+ --ui-btn-outline-width: 2px;
3
+ --ui-btn-outline-offset: -2px;
4
+ }
@@ -0,0 +1,27 @@
1
+ :is(.ui-btn.gradient-bordered) {
2
+ --ui-btn-border-width: 2px;
3
+ --ui-btn-hover-mix: transparent;
4
+ --ui-btn-hover-opacity: 10%;
5
+ --ui-btn-active-mix: transparent;
6
+ --ui-btn-active-opacity: 20%;
7
+ --ui-btn-bg-opacity: 0%;
8
+ --color-current: var(--color-base);
9
+
10
+ &::before {
11
+ content: "";
12
+ position: absolute;
13
+ background-color: color-mix(in sRGB, var(--color-body) calc(100% - var(--ui-btn-bg-opacity)), transparent);
14
+ inset: var(--ui-btn-border-width);
15
+ border-radius: calc(var(--ui-btn-border-radius) / 1.25);
16
+ z-index: -1;
17
+ transition: var(--transition-background);
18
+ }
19
+
20
+ &:where(.hover-fill) {
21
+ --ui-btn-bg-opacity: 100%;
22
+
23
+ &::before {
24
+ background-color: color-mix(in sRGB, var(--color-body) var(--ui-btn-bg-opacity), transparent);
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,10 @@
1
+ .ui-btn:where(.gradient) {
2
+ &::before {
3
+ content: "";
4
+ position: absolute;
5
+ inset: 0;
6
+ background-color: color-mix(in sRGB, var(--ui-btn-bg-mix) calc(100% - var(--ui-btn-bg-opacity)), transparent);
7
+ z-index: -1;
8
+ transition: var(--transition-background);
9
+ }
10
+ }
@@ -0,0 +1,18 @@
1
+ .ui-btn-group {
2
+ display: flex;
3
+
4
+ & :where(.ui-btn) {
5
+ --ui-btn-outline-offset: 0;
6
+
7
+ &:not(:first-child) {
8
+ border-top-left-radius: 0;
9
+ border-bottom-left-radius: 0;
10
+ border-left: 0;
11
+ }
12
+
13
+ &:not(:last-child) {
14
+ border-top-right-radius: 0;
15
+ border-bottom-right-radius: 0;
16
+ }
17
+ }
18
+ }