@plexui/styles 0.0.0-stage → 0.1.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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +28 -2
  3. package/dist/es/components/Accordion/Accordion.module.css +89 -0
  4. package/dist/es/components/Alert/Alert.module.css +210 -0
  5. package/dist/es/components/Avatar/Avatar.module.css +168 -0
  6. package/dist/es/components/Avatar/AvatarGroup.module.css +26 -0
  7. package/dist/es/components/Badge/Badge.module.css +196 -0
  8. package/dist/es/components/Breadcrumb/Breadcrumb.module.css +59 -0
  9. package/dist/es/components/Button/Button.module.css +863 -0
  10. package/dist/es/components/ButtonGroup/ButtonGroup.module.css +158 -0
  11. package/dist/es/components/Card/Card.module.css +125 -0
  12. package/dist/es/components/Checkbox/Checkbox.module.css +225 -0
  13. package/dist/es/components/CodeBlock/CodeBlock.module.css +139 -0
  14. package/dist/es/components/DataTable/DataTable.module.css +117 -0
  15. package/dist/es/components/DatePicker/Calendar.module.css +271 -0
  16. package/dist/es/components/DateRangePicker/Calendar.module.css +295 -0
  17. package/dist/es/components/DateRangePicker/Trigger.module.css +25 -0
  18. package/dist/es/components/Dialog/Dialog.module.css +240 -0
  19. package/dist/es/components/EmptyMessage/EmptyMessage.module.css +116 -0
  20. package/dist/es/components/Field/Field.module.css +152 -0
  21. package/dist/es/components/FieldError/FieldError.module.css +28 -0
  22. package/dist/es/components/FileUpload/FileUpload.module.css +133 -0
  23. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.module.css +220 -0
  24. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.module.css +152 -0
  25. package/dist/es/components/Image/Image.module.css +9 -0
  26. package/dist/es/components/Indicator/CircularProgress.module.css +28 -0
  27. package/dist/es/components/Indicator/LoadingDots.module.css +35 -0
  28. package/dist/es/components/Indicator/LoadingIndicator.module.css +41 -0
  29. package/dist/es/components/Input/Input.module.css +519 -0
  30. package/dist/es/components/InputGroup/InputGroup.module.css +309 -0
  31. package/dist/es/components/Kbd/Kbd.module.css +47 -0
  32. package/dist/es/components/Label/Label.module.css +16 -0
  33. package/dist/es/components/Markdown/Markdown.module.css +233 -0
  34. package/dist/es/components/MarkdownEditor/MarkdownEditor.module.css +297 -0
  35. package/dist/es/components/Menu/Menu.module.css +386 -0
  36. package/dist/es/components/OTPInput/OTPInput.module.css +70 -0
  37. package/dist/es/components/Popover/Popover.module.css +82 -0
  38. package/dist/es/components/Progress/Progress.module.css +34 -0
  39. package/dist/es/components/ProgressSteps/ProgressSteps.module.css +246 -0
  40. package/dist/es/components/RadioGroup/RadioGroup.module.css +159 -0
  41. package/dist/es/components/Select/Select.module.css +338 -0
  42. package/dist/es/components/SelectControl/SelectControl.module.css +558 -0
  43. package/dist/es/components/Separator/Separator.module.css +16 -0
  44. package/dist/es/components/ShimmerText/ShimmerText.module.css +43 -0
  45. package/dist/es/components/Sidebar/Sidebar.module.css +913 -0
  46. package/dist/es/components/Skeleton/Skeleton.module.css +17 -0
  47. package/dist/es/components/Slider/Slider.module.css +199 -0
  48. package/dist/es/components/StatCard/StatCard.module.css +234 -0
  49. package/dist/es/components/Switch/Switch.module.css +121 -0
  50. package/dist/es/components/Table/Table.module.css +56 -0
  51. package/dist/es/components/Tabs/Tabs.module.css +688 -0
  52. package/dist/es/components/TagInput/TagInput.module.css +320 -0
  53. package/dist/es/components/TextLink/TextLink.module.css +50 -0
  54. package/dist/es/components/Textarea/Textarea.module.css +272 -0
  55. package/dist/es/components/Toast/Toast.module.css +99 -0
  56. package/dist/es/components/Tooltip/Tooltip.module.css +91 -0
  57. package/dist/es/components/Transition/Animate.module.css +54 -0
  58. package/dist/es/components/Transition/AnimateLayout.module.css +101 -0
  59. package/dist/es/components/Transition/AnimateLayoutGroup.module.css +88 -0
  60. package/dist/es/components/Transition/TransitionGroup.module.css +4 -0
  61. package/dist/es/styles/base.css +102 -0
  62. package/dist/es/styles/globals.css +50 -0
  63. package/dist/es/styles/index.css +22 -0
  64. package/dist/es/styles/katex.min.css +1296 -0
  65. package/dist/es/styles/tailwind-utilities.css +1316 -0
  66. package/dist/es/styles/variables-components.css +626 -0
  67. package/dist/es/styles/variables-primitive.css +327 -0
  68. package/dist/es/styles/variables-semantic.css +629 -0
  69. package/dist/es/styles/variables-tailwind-theme.css +34 -0
  70. package/dist/es/styles/variables-tokens-root.css +40 -0
  71. package/dist/es/types.js +4 -0
  72. package/dist/es/types.js.map +1 -0
  73. package/dist/es/vite/index.js +54 -0
  74. package/dist/es/vite/index.js.map +1 -0
  75. package/dist/types/types.d.ts +15 -0
  76. package/dist/types/vite/index.d.ts +55 -0
  77. package/package.json +109 -4
  78. package/postcss/functions.mjs +23 -0
  79. package/postcss/injectBreakpoints.mjs +47 -0
  80. package/postcss/mixins.mjs +100 -0
  81. package/postcss/parseLightDark.mjs +174 -0
  82. package/postcss/wrapModulesInLayer.mjs +21 -0
  83. package/postcss.config.mjs +52 -0
@@ -0,0 +1,220 @@
1
+ @layer components {.Root {
2
+ position: relative;
3
+ }.Root:has(:disabled) {
4
+ --cursor: not-allowed;
5
+ opacity: 0.5;
6
+ }.FieldFootprint {
7
+ position: relative;
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: stretch;
11
+ height: var(--floating-input-height);
12
+ border-radius: var(--floating-input-border-radius);
13
+ line-height: 1.5rem;
14
+ color: var(--color-text);
15
+ font-size: 1rem;
16
+ width: 100%;
17
+ border: 1px solid var(--input-state-color, var(--floating-input-border-color));
18
+ padding: 0 var(--floating-input-gutter);
19
+ background-color: var(--floating-input-background);
20
+ cursor: var(--cursor, text);
21
+ transition: border-color var(--floating-input-transition-duration) ease-in-out;
22
+ }.FieldFootprint:hover:not([data-disabled]) {
23
+ border-color: var(--input-state-color, var(--floating-input-border-color-hover));
24
+ }.FieldFootprint[data-focused] {
25
+ --input-state-color: var(--floating-input-border-color-focus);
26
+ }.FieldFootprint[data-invalid] {
27
+ --input-state-color: var(--floating-input-border-color-invalid);
28
+ }/* Label container - positioned absolutely */.TypeableLabel {
29
+ cursor: var(--cursor, text);
30
+ position: absolute;
31
+ inset: 0;
32
+ }/* Label background overlay - covers input when not focused */.TypeableLabel::before {
33
+ content: "";
34
+ display: block;
35
+ position: absolute;
36
+ inset: 0;
37
+ border-radius: var(--floating-input-border-radius);
38
+ background-color: var(--floating-input-background);
39
+ }/* Label text positioner */.LabelPositioner {
40
+ --placeholder-transition: transform var(--floating-input-transition-duration) ease-in-out;
41
+ position: absolute;
42
+ inset: 0;
43
+ padding: 0 var(--floating-input-gutter);
44
+ display: flex;
45
+ align-items: center;
46
+ transition: var(--placeholder-transition);
47
+ pointer-events: none;
48
+ }/* Label text */.LabelText {
49
+ --horizontal-padding: 6px;
50
+ background-color: var(--floating-input-background);
51
+ padding: 1px var(--horizontal-padding);
52
+ transition: var(--placeholder-transition);
53
+ color: var(--input-state-color, var(--floating-input-label-color));
54
+ font-size: 1rem;
55
+ line-height: 1;
56
+ cursor: var(--cursor, text);
57
+ transform: translate(calc(-1 * var(--horizontal-padding)));
58
+ white-space: nowrap;
59
+ overflow: hidden;
60
+ text-overflow: ellipsis;
61
+ max-width: calc(100% - var(--floating-input-gutter) * 2);
62
+ }/* Focused state - label floats up */.FieldFootprint[data-focused] .TypeableLabel,
63
+ .FieldFootprint[data-invalid] .TypeableLabel,
64
+ .HasValue .TypeableLabel {
65
+ pointer-events: none;
66
+ }.FieldFootprint[data-focused] .TypeableLabel::before,
67
+ .FieldFootprint[data-invalid] .TypeableLabel::before,
68
+ .HasValue .TypeableLabel::before {
69
+ display: none;
70
+ }.FieldFootprint[data-focused] .LabelPositioner,
71
+ .FieldFootprint[data-invalid] .LabelPositioner,
72
+ .HasValue .LabelPositioner {
73
+ transform: translateY(-50%);
74
+ }.FieldFootprint[data-focused] .LabelText,
75
+ .FieldFootprint[data-invalid] .LabelText,
76
+ .HasValue .LabelText {
77
+ transform: translate(calc(-1 * var(--horizontal-padding))) scale(var(--floating-input-label-scale));
78
+ transform-origin: left center;
79
+ max-width: 133%;
80
+ }/* Focus label color */.FieldFootprint[data-focused] .LabelText {
81
+ color: var(--floating-input-label-color-focus);
82
+ }/* Invalid label color */.FieldFootprint[data-invalid] .LabelText {
83
+ color: var(--floating-input-label-color-invalid);
84
+ }.StartAdornment {
85
+ display: flex;
86
+ align-items: center;
87
+ flex-shrink: 0;
88
+ position: relative;
89
+ z-index: 1;
90
+ }/* Input element */.Input {
91
+ background-color: transparent;
92
+ outline: none;
93
+ border: 0;
94
+ font: inherit;
95
+ width: 100%;
96
+ padding: 0;
97
+ color: inherit;
98
+ position: relative;
99
+ z-index: 1;
100
+ }.Input::-moz-placeholder {
101
+ opacity: 0;
102
+ }.Input::placeholder {
103
+ opacity: 0;
104
+ }.FieldFootprint[data-focused] .Input::-moz-placeholder {
105
+ opacity: 1;
106
+ color: var(--color-text-tertiary);
107
+ }.FieldFootprint[data-focused] .Input::placeholder {
108
+ opacity: 1;
109
+ color: var(--color-text-tertiary);
110
+ }.Input:disabled {
111
+ cursor: not-allowed;
112
+ }/* Clear button */.ClearButton {
113
+ display: flex;
114
+ align-items: center;
115
+ justify-content: center;
116
+ padding: 0;
117
+ margin: 0;
118
+ border: none;
119
+ background: none;
120
+ cursor: pointer;
121
+ color: var(--color-text-tertiary);
122
+ font-size: 1rem;
123
+ position: relative;
124
+ z-index: 1;
125
+ transition: color 150ms ease;
126
+ }.ClearButton:hover {
127
+ color: var(--color-text);
128
+ }/* Password reveal toggle — circular ghost button hugging the right edge */.RevealButton {
129
+ display: flex;
130
+ align-items: center;
131
+ justify-content: center;
132
+ flex-shrink: 0;
133
+ width: 32px;
134
+ height: 32px;
135
+ margin: 0 -10px 0 0;
136
+ padding: 0;
137
+ border: none;
138
+ border-radius: 50%;
139
+ background-color: transparent;
140
+ color: var(--color-text-tertiary);
141
+ font-size: 1rem;
142
+ cursor: pointer;
143
+ position: relative;
144
+ z-index: 1;
145
+ transition:
146
+ color 150ms ease,
147
+ background-color 150ms ease;
148
+ }.RevealButton:hover {
149
+ color: var(--color-text);
150
+ background-color: var(--color-background-secondary-ghost-hover);
151
+ }/* End adornment slot */.EndAdornment {
152
+ display: flex;
153
+ align-items: center;
154
+ flex-shrink: 0;
155
+ position: relative;
156
+ z-index: 1;
157
+ }.ErrorMessage {
158
+ color: var(--field-error-color);
159
+ font-size: var(--field-error-font-size);
160
+ line-height: var(--field-error-line-height);
161
+ margin-top: 0.25rem;
162
+ padding-inline-start: var(--floating-input-gutter);
163
+ }.Description {
164
+ color: var(--color-text-secondary);
165
+ font-size: var(--field-error-font-size);
166
+ line-height: var(--field-error-line-height);
167
+ margin-top: 0.25rem;
168
+ padding-inline-start: var(--floating-input-gutter);
169
+ }.ErrorMessage + .Description {
170
+ margin-top: 0;
171
+ }.ErrorMessage:last-child,
172
+ .Description:last-child {
173
+ margin-bottom: 0.5rem;
174
+ }/* =============================================
175
+ Multiline (textarea) variant
176
+ ============================================= */.FieldFootprint[data-multiline] {
177
+ height: auto;
178
+ min-height: var(--floating-input-height);
179
+ align-items: flex-start;
180
+ border-radius: calc(var(--floating-input-height) / 2);
181
+ }.FieldFootprint[data-multiline] .LabelPositioner {
182
+ align-items: flex-start;
183
+ padding-top: calc((var(--floating-input-height) - 4px - 1rem) / 2);
184
+ }.FieldFootprint[data-multiline][data-focused] .LabelPositioner,
185
+ .FieldFootprint[data-multiline][data-invalid] .LabelPositioner,
186
+ .FieldFootprint[data-multiline].HasValue .LabelPositioner {
187
+ transform: translateY(calc(var(--floating-input-height) / -2));
188
+ }.Textarea {
189
+ background-color: transparent;
190
+ outline: none;
191
+ border: 0;
192
+ font: inherit;
193
+ width: 100%;
194
+ padding: calc((var(--floating-input-height) - 2px - 1.5rem) / 2) 0;
195
+ color: inherit;
196
+ position: relative;
197
+ z-index: 1;
198
+ resize: none;
199
+ line-height: 1.5rem;
200
+ overflow: hidden;
201
+ }.Textarea::-moz-placeholder {
202
+ opacity: 0;
203
+ }.Textarea::placeholder {
204
+ opacity: 0;
205
+ }.FieldFootprint[data-focused] .Textarea::-moz-placeholder {
206
+ opacity: 1;
207
+ color: var(--color-text-tertiary);
208
+ }.FieldFootprint[data-focused] .Textarea::placeholder {
209
+ opacity: 1;
210
+ color: var(--color-text-tertiary);
211
+ }.Textarea:disabled {
212
+ cursor: not-allowed;
213
+ }/* Reduced motion preference */@media (prefers-reduced-motion: reduce) {
214
+ .FieldFootprint,
215
+ .LabelPositioner,
216
+ .LabelText {
217
+ transition: none;
218
+ }
219
+ }
220
+ }
@@ -0,0 +1,152 @@
1
+ @layer components {.Root {
2
+ position: relative;
3
+ --field-error-padding-inline: 0;
4
+ --field-error-margin-top: 0.25rem;
5
+ }.Root:has([data-disabled]) {
6
+ --cursor: not-allowed;
7
+ opacity: 0.5;
8
+ }.FieldFootprint {
9
+ position: relative;
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: stretch;
13
+ height: var(--floating-input-height);
14
+ border-radius: var(--floating-input-border-radius);
15
+ line-height: 1.5rem;
16
+ color: var(--color-text);
17
+ font-size: 1rem;
18
+ width: 100%;
19
+ border: 1px solid var(--input-state-color, var(--floating-input-border-color));
20
+ padding: 0 var(--floating-input-gutter);
21
+ background-color: var(--floating-input-background);
22
+ cursor: var(--cursor, pointer);
23
+ transition: border-color var(--floating-input-transition-duration) ease-in-out;
24
+ -webkit-user-select: none;
25
+ -moz-user-select: none;
26
+ user-select: none;
27
+ }.FieldFootprint:hover:not([data-disabled]) {
28
+ border-color: var(--input-state-color, var(--floating-input-border-color-hover));
29
+ }.FieldFootprint[data-focused] {
30
+ --input-state-color: var(--floating-input-border-color-focus);
31
+ }.FieldFootprint[data-open] {
32
+ --input-state-color: var(--floating-input-border-color-focus);
33
+ }.FieldFootprint[data-invalid] {
34
+ --input-state-color: var(--floating-input-border-color-invalid);
35
+ }/* Focus ring */.FieldFootprint:focus-visible {
36
+ outline: 2px solid var(--color-ring);
37
+ outline-offset: 1px;
38
+ }/* Label container - positioned absolutely */.TypeableLabel {
39
+ cursor: var(--cursor, pointer);
40
+ position: absolute;
41
+ inset: 0;
42
+ pointer-events: none;
43
+ }/* Label background overlay - covers content when not selected */.TypeableLabel::before {
44
+ content: "";
45
+ display: block;
46
+ position: absolute;
47
+ inset: 0;
48
+ border-radius: var(--floating-input-border-radius);
49
+ background-color: var(--floating-input-background);
50
+ }/* Label text positioner */.LabelPositioner {
51
+ --placeholder-transition: transform var(--floating-input-transition-duration) ease-in-out;
52
+ position: absolute;
53
+ inset: 0;
54
+ padding: 0 var(--floating-input-gutter);
55
+ display: flex;
56
+ align-items: center;
57
+ transition: var(--placeholder-transition);
58
+ pointer-events: none;
59
+ }/* Label text */.LabelText {
60
+ --horizontal-padding: 6px;
61
+ background-color: var(--floating-input-background);
62
+ padding: 1px var(--horizontal-padding);
63
+ transition: var(--placeholder-transition);
64
+ color: var(--input-state-color, var(--floating-input-label-color));
65
+ font-size: 1rem;
66
+ line-height: 1;
67
+ cursor: var(--cursor, pointer);
68
+ transform: translate(calc(-1 * var(--horizontal-padding)));
69
+ white-space: nowrap;
70
+ overflow: hidden;
71
+ text-overflow: ellipsis;
72
+ max-width: calc(100% - var(--floating-input-gutter) * 2);
73
+ }/* Float state - label moves up */.FieldFootprint[data-open] .TypeableLabel,
74
+ .FieldFootprint[data-invalid] .TypeableLabel,
75
+ .HasValue .TypeableLabel {
76
+ pointer-events: none;
77
+ }.FieldFootprint[data-open] .TypeableLabel::before,
78
+ .FieldFootprint[data-invalid] .TypeableLabel::before,
79
+ .HasValue .TypeableLabel::before {
80
+ display: none;
81
+ }.FieldFootprint[data-open] .LabelPositioner,
82
+ .FieldFootprint[data-invalid] .LabelPositioner,
83
+ .HasValue .LabelPositioner {
84
+ transform: translateY(-50%);
85
+ }.FieldFootprint[data-open] .LabelText,
86
+ .FieldFootprint[data-invalid] .LabelText,
87
+ .HasValue .LabelText {
88
+ transform: translate(calc(-1 * var(--horizontal-padding))) scale(var(--floating-input-label-scale));
89
+ transform-origin: left center;
90
+ max-width: 133%;
91
+ }/* Focus/open label color */.FieldFootprint[data-focused] .LabelText,
92
+ .FieldFootprint[data-open] .LabelText {
93
+ color: var(--floating-input-label-color-focus);
94
+ }/* Invalid label color */.FieldFootprint[data-invalid] .LabelText {
95
+ color: var(--floating-input-label-color-invalid);
96
+ }/* Content area (selected value) */.Content {
97
+ position: relative;
98
+ z-index: 1;
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 8px;
102
+ flex: 1;
103
+ min-width: 0;
104
+ overflow-x: clip;
105
+ text-overflow: ellipsis;
106
+ white-space: nowrap;
107
+ color: inherit;
108
+ }/* Indicator wrapper — mirrors SelectControl IndicatorWrapper at 3xl size */.IndicatorWrapper {
109
+ position: relative;
110
+ z-index: 1;
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 6px;
114
+ padding-left: 4px;
115
+ }/* Clear button — using Button component, sizing matches SelectControl 3xl */.Clear {
116
+ --button-size: 24px;
117
+ --button-icon-size: 16px;
118
+
119
+ position: relative;
120
+ opacity: 0.75;
121
+ }.FieldFootprint:hover:not([data-disabled]) .Clear,
122
+ .FieldFootprint[data-open] .Clear,
123
+ .Clear:focus-visible {
124
+ opacity: 1;
125
+ }/* Dropdown icon — matches SelectControl 3xl: 9×13 */.DropdownIcon {
126
+ position: relative;
127
+ flex-shrink: 0;
128
+ width: 9px;
129
+ height: 13px;
130
+ color: var(--color-text-secondary);
131
+ opacity: 0.75;
132
+ transition: opacity var(--floating-input-transition-duration) ease-in-out;
133
+ }.FieldFootprint:hover:not([data-disabled]) .DropdownIcon {
134
+ opacity: 1;
135
+ }.FieldFootprint[data-open] .DropdownIcon {
136
+ opacity: 1;
137
+ }/* Error message: the same plain line as FloatingLabelInput's */.ErrorMessage {
138
+ color: var(--field-error-color);
139
+ font-size: var(--field-error-font-size);
140
+ line-height: var(--field-error-line-height);
141
+ margin-top: 0.25rem;
142
+ padding-inline-start: var(--floating-input-gutter);
143
+ }.ErrorMessage:last-child {
144
+ margin-bottom: 0.5rem;
145
+ }/* Reduced motion preference */@media (prefers-reduced-motion: reduce) {
146
+ .FieldFootprint,
147
+ .LabelPositioner,
148
+ .LabelText {
149
+ transition: none;
150
+ }
151
+ }
152
+ }
@@ -0,0 +1,9 @@
1
+ @layer components {.Image {
2
+ opacity: 0;
3
+ transition: opacity 0.3s var(--transition-ease-basic);
4
+ }
5
+
6
+ .Image[data-loaded] {
7
+ opacity: 1;
8
+ }
9
+ }
@@ -0,0 +1,28 @@
1
+ @layer components {.Container {
2
+ position: relative;
3
+ width: var(--circular-progress-size, 28px);
4
+ height: var(--circular-progress-size, 28px);
5
+ }
6
+
7
+ .Container circle {
8
+ stroke-width: var(--circular-progress-stroke, 2px);
9
+ }.Track {
10
+ position: absolute;
11
+ top: 0;
12
+ left: 0;
13
+ stroke: var(--circular-progress-track-color, light-dark(#deede9, var(--green-a50)));
14
+ transition: stroke 0.15s ease;
15
+ }.TrackProgress {
16
+ position: absolute;
17
+ top: 0;
18
+ left: 0;
19
+ z-index: 2;
20
+ stroke: var(--circular-progress-track-active-color, var(--green-500));
21
+ stroke-dasharray: 50px;
22
+ stroke-dashoffset: 50px;
23
+ stroke-linecap: round;
24
+ transform: rotate(-90deg);
25
+ transition: stroke-dashoffset 0.3s ease;
26
+ will-change: transform;
27
+ }
28
+ }
@@ -0,0 +1,35 @@
1
+ @layer components {.LoadingDots {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: flex-start;
5
+ gap: 4px;
6
+ /* Match line-height of message to avoid reflow when swapped with text */
7
+ height: var(--font-text-md-line-height);
8
+ }.Dot {
9
+ width: 8px;
10
+ height: 8px;
11
+ border-radius: 100%;
12
+ animation: pulse 1s infinite both;
13
+ background-color: currentcolor;
14
+ }
15
+
16
+ .Dot:nth-child(2) {
17
+ animation-delay: 0.2s;
18
+ }
19
+
20
+ .Dot:nth-child(3) {
21
+ animation-delay: 0.4s;
22
+ }@keyframes pulse {
23
+ 0% {
24
+ opacity: 0.15;
25
+ }
26
+
27
+ 20% {
28
+ opacity: 0.4;
29
+ }
30
+
31
+ 100% {
32
+ opacity: 0.15;
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,41 @@
1
+ @layer components {.LoadingIndicator {
2
+ display: inline-block;
3
+ position: relative;
4
+ width: var(--indicator-size, 1em);
5
+ height: var(--indicator-size, 1em);
6
+ animation: rotate var(--indicator-rotate-duration, 0.8s) linear infinite;
7
+ transition: opacity 0.15s ease;
8
+ }
9
+
10
+ .LoadingIndicator::before {
11
+ position: absolute;
12
+ inset: 0;
13
+ display: block;
14
+ border: var(--indicator-stroke, 2px) solid var(--indicator-color, currentcolor);
15
+ border-radius: 50%;
16
+ content: "";
17
+ -webkit-mask-image: conic-gradient(rgb(0 0 0 / 0%), rgb(0 0 0));
18
+ mask-image: conic-gradient(rgb(0 0 0 / 0%), rgb(0 0 0));
19
+ }
20
+
21
+ .LoadingIndicator::after {
22
+ position: absolute;
23
+ top: 0;
24
+ left: 50%;
25
+ display: block;
26
+ width: var(--indicator-stroke, 2px);
27
+ height: var(--indicator-stroke, 2px);
28
+ border-radius: 100%;
29
+ margin-left: calc(var(--indicator-stroke, 2px) * -1 / 2);
30
+ background-color: var(--indicator-color, currentcolor);
31
+ content: "";
32
+ }@keyframes rotate {
33
+ 0% {
34
+ transform: rotate(0deg);
35
+ }
36
+
37
+ 100% {
38
+ transform: rotate(1turn);
39
+ }
40
+ }
41
+ }