@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.
- package/LICENSE +21 -0
- package/README.md +28 -2
- package/dist/es/components/Accordion/Accordion.module.css +89 -0
- package/dist/es/components/Alert/Alert.module.css +210 -0
- package/dist/es/components/Avatar/Avatar.module.css +168 -0
- package/dist/es/components/Avatar/AvatarGroup.module.css +26 -0
- package/dist/es/components/Badge/Badge.module.css +196 -0
- package/dist/es/components/Breadcrumb/Breadcrumb.module.css +59 -0
- package/dist/es/components/Button/Button.module.css +863 -0
- package/dist/es/components/ButtonGroup/ButtonGroup.module.css +158 -0
- package/dist/es/components/Card/Card.module.css +125 -0
- package/dist/es/components/Checkbox/Checkbox.module.css +225 -0
- package/dist/es/components/CodeBlock/CodeBlock.module.css +139 -0
- package/dist/es/components/DataTable/DataTable.module.css +117 -0
- package/dist/es/components/DatePicker/Calendar.module.css +271 -0
- package/dist/es/components/DateRangePicker/Calendar.module.css +295 -0
- package/dist/es/components/DateRangePicker/Trigger.module.css +25 -0
- package/dist/es/components/Dialog/Dialog.module.css +240 -0
- package/dist/es/components/EmptyMessage/EmptyMessage.module.css +116 -0
- package/dist/es/components/Field/Field.module.css +152 -0
- package/dist/es/components/FieldError/FieldError.module.css +28 -0
- package/dist/es/components/FileUpload/FileUpload.module.css +133 -0
- package/dist/es/components/FloatingLabelInput/FloatingLabelInput.module.css +220 -0
- package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.module.css +152 -0
- package/dist/es/components/Image/Image.module.css +9 -0
- package/dist/es/components/Indicator/CircularProgress.module.css +28 -0
- package/dist/es/components/Indicator/LoadingDots.module.css +35 -0
- package/dist/es/components/Indicator/LoadingIndicator.module.css +41 -0
- package/dist/es/components/Input/Input.module.css +519 -0
- package/dist/es/components/InputGroup/InputGroup.module.css +309 -0
- package/dist/es/components/Kbd/Kbd.module.css +47 -0
- package/dist/es/components/Label/Label.module.css +16 -0
- package/dist/es/components/Markdown/Markdown.module.css +233 -0
- package/dist/es/components/MarkdownEditor/MarkdownEditor.module.css +297 -0
- package/dist/es/components/Menu/Menu.module.css +386 -0
- package/dist/es/components/OTPInput/OTPInput.module.css +70 -0
- package/dist/es/components/Popover/Popover.module.css +82 -0
- package/dist/es/components/Progress/Progress.module.css +34 -0
- package/dist/es/components/ProgressSteps/ProgressSteps.module.css +246 -0
- package/dist/es/components/RadioGroup/RadioGroup.module.css +159 -0
- package/dist/es/components/Select/Select.module.css +338 -0
- package/dist/es/components/SelectControl/SelectControl.module.css +558 -0
- package/dist/es/components/Separator/Separator.module.css +16 -0
- package/dist/es/components/ShimmerText/ShimmerText.module.css +43 -0
- package/dist/es/components/Sidebar/Sidebar.module.css +913 -0
- package/dist/es/components/Skeleton/Skeleton.module.css +17 -0
- package/dist/es/components/Slider/Slider.module.css +199 -0
- package/dist/es/components/StatCard/StatCard.module.css +234 -0
- package/dist/es/components/Switch/Switch.module.css +121 -0
- package/dist/es/components/Table/Table.module.css +56 -0
- package/dist/es/components/Tabs/Tabs.module.css +688 -0
- package/dist/es/components/TagInput/TagInput.module.css +320 -0
- package/dist/es/components/TextLink/TextLink.module.css +50 -0
- package/dist/es/components/Textarea/Textarea.module.css +272 -0
- package/dist/es/components/Toast/Toast.module.css +99 -0
- package/dist/es/components/Tooltip/Tooltip.module.css +91 -0
- package/dist/es/components/Transition/Animate.module.css +54 -0
- package/dist/es/components/Transition/AnimateLayout.module.css +101 -0
- package/dist/es/components/Transition/AnimateLayoutGroup.module.css +88 -0
- package/dist/es/components/Transition/TransitionGroup.module.css +4 -0
- package/dist/es/styles/base.css +102 -0
- package/dist/es/styles/globals.css +50 -0
- package/dist/es/styles/index.css +22 -0
- package/dist/es/styles/katex.min.css +1296 -0
- package/dist/es/styles/tailwind-utilities.css +1316 -0
- package/dist/es/styles/variables-components.css +626 -0
- package/dist/es/styles/variables-primitive.css +327 -0
- package/dist/es/styles/variables-semantic.css +629 -0
- package/dist/es/styles/variables-tailwind-theme.css +34 -0
- package/dist/es/styles/variables-tokens-root.css +40 -0
- package/dist/es/types.js +4 -0
- package/dist/es/types.js.map +1 -0
- package/dist/es/vite/index.js +54 -0
- package/dist/es/vite/index.js.map +1 -0
- package/dist/types/types.d.ts +15 -0
- package/dist/types/vite/index.d.ts +55 -0
- package/package.json +109 -4
- package/postcss/functions.mjs +23 -0
- package/postcss/injectBreakpoints.mjs +47 -0
- package/postcss/mixins.mjs +100 -0
- package/postcss/parseLightDark.mjs +174 -0
- package/postcss/wrapModulesInLayer.mjs +21 -0
- package/postcss.config.mjs +52 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
@layer components {/* =============================================
|
|
2
|
+
Custom Select
|
|
3
|
+
============================================= */.Menu {
|
|
4
|
+
/* Top-level selector needs to exist */
|
|
5
|
+
}.MenuList {
|
|
6
|
+
z-index: 50;
|
|
7
|
+
/* Default to the width of the trigger */
|
|
8
|
+
width: var(--select-list-width, var(--radix-popover-trigger-width));
|
|
9
|
+
min-width: var(--select-list-min-width, var(--radix-popover-trigger-width));
|
|
10
|
+
max-width: var(--select-list-max-width, none);
|
|
11
|
+
border-radius: var(--menu-radius);
|
|
12
|
+
background: var(--color-surface-elevated);
|
|
13
|
+
box-shadow: var(--shadow), var(--shadow-hairline);
|
|
14
|
+
font-size: var(--menu-font-size);
|
|
15
|
+
line-height: var(--menu-line-height);
|
|
16
|
+
/* The transform-origin computed from the content and arrow positions/offsets */
|
|
17
|
+
transform-origin: var(--radix-popover-content-transform-origin);
|
|
18
|
+
-webkit-user-select: none;
|
|
19
|
+
-moz-user-select: none;
|
|
20
|
+
user-select: none;
|
|
21
|
+
will-change: opacity, transform;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Animation states applied to a wrapping parent */
|
|
25
|
+
.Menu[data-entering] .MenuList {
|
|
26
|
+
opacity: 0;
|
|
27
|
+
transform: scale(0.95);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.Menu[data-entering-active] .MenuList,
|
|
31
|
+
.Menu[data-entering][data-interrupted] .MenuList {
|
|
32
|
+
opacity: 1;
|
|
33
|
+
transform: scale(1);
|
|
34
|
+
transition-duration: 0.35s;
|
|
35
|
+
transition-property: opacity, transform;
|
|
36
|
+
transition-timing-function: var(--cubic-enter);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.Menu[data-exiting] .MenuList {
|
|
40
|
+
opacity: 1;
|
|
41
|
+
transform: scale(1);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.Menu[data-exiting-active] .MenuList,
|
|
45
|
+
.Menu[data-exiting][data-interrupted] .MenuList {
|
|
46
|
+
opacity: 0;
|
|
47
|
+
transform: scale(0.95);
|
|
48
|
+
transition-duration: 0.2s;
|
|
49
|
+
transition-property: opacity, transform;
|
|
50
|
+
transition-timing-function: var(--cubic-exit);
|
|
51
|
+
}.MenuInner {
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
/* The remaining height between the trigger and the boundary edge */
|
|
55
|
+
max-height: min(
|
|
56
|
+
var(--select-list-max-height, 400px),
|
|
57
|
+
var(--radix-popover-content-available-height)
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.MenuInner:focus {
|
|
62
|
+
outline: 0;
|
|
63
|
+
}/* =============================================
|
|
64
|
+
Options
|
|
65
|
+
============================================= */.OptionsList {
|
|
66
|
+
overflow: auto;
|
|
67
|
+
flex: 1;
|
|
68
|
+
padding: var(--menu-gutter);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Focused without search: the highlighted option shows where the keys go */
|
|
72
|
+
.OptionsList:focus {
|
|
73
|
+
outline: 0;
|
|
74
|
+
}.Option {
|
|
75
|
+
position: relative;
|
|
76
|
+
padding: var(--menu-item-padding);
|
|
77
|
+
cursor: pointer;
|
|
78
|
+
overflow-wrap: anywhere;
|
|
79
|
+
/* When keyboard navigation snaps item into scrollable view, ensure 20px of spacing to show additional items below */
|
|
80
|
+
scroll-margin: 15px 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.Option::before {
|
|
84
|
+
position: absolute;
|
|
85
|
+
inset: 0;
|
|
86
|
+
display: block;
|
|
87
|
+
border-radius: calc(var(--menu-radius) - var(--menu-gutter));
|
|
88
|
+
background: var(--menu-item-background-color);
|
|
89
|
+
content: "";
|
|
90
|
+
opacity: 0;
|
|
91
|
+
transform: scale(var(--scale, 0.98));
|
|
92
|
+
transition-duration: var(--transition-duration-basic);
|
|
93
|
+
transition-property: opacity, background-color, transform;
|
|
94
|
+
transition-timing-function: var(--cubic-enter);
|
|
95
|
+
will-change: opacity, transform;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.Option[data-selected] {
|
|
99
|
+
font-weight: var(--font-weight-semibold);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Options with a description automatically keep their title semibold in
|
|
103
|
+
every state (highlighted, selected, idle). This is the "item + subtitle"
|
|
104
|
+
pattern — don't make consumers (or AI generating demos) remember to pass
|
|
105
|
+
`optionClassName="font-semibold"`. OptionDescription's own rule below
|
|
106
|
+
keeps the description text at normal weight. */
|
|
107
|
+
.Option:has(.OptionDescription) {
|
|
108
|
+
font-weight: var(--font-weight-semibold);
|
|
109
|
+
}
|
|
110
|
+
.Option[data-highlight]::before {
|
|
111
|
+
opacity: 1;
|
|
112
|
+
transform: scale(1);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.Option[data-highlight]:active::before {
|
|
116
|
+
transform: scale(var(--scale, 0.98));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.Option[data-disabled] {
|
|
120
|
+
cursor: not-allowed;
|
|
121
|
+
opacity: 0.5;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.Option[data-disabled]::before {
|
|
125
|
+
display: none;
|
|
126
|
+
}/* Option layout — three-column flex row so title+description stack as a
|
|
127
|
+
leading group, and the indicator (start or end) sits as a dedicated
|
|
128
|
+
trailing/leading column. This is what makes description never leak under
|
|
129
|
+
the end-position checkmark column. Do not inline indicators inside
|
|
130
|
+
`.OptionInner` again — it breaks the layout contract consumers rely on. */.PressableInner {
|
|
131
|
+
position: relative;
|
|
132
|
+
display: flex;
|
|
133
|
+
align-items: flex-start;
|
|
134
|
+
gap: var(--menu-item-gap);
|
|
135
|
+
}.OptionLeading {
|
|
136
|
+
display: flex;
|
|
137
|
+
flex: 1;
|
|
138
|
+
min-width: 0;
|
|
139
|
+
flex-direction: column;
|
|
140
|
+
}.OptionInner {
|
|
141
|
+
display: flex;
|
|
142
|
+
align-items: center;
|
|
143
|
+
justify-content: flex-start;
|
|
144
|
+
gap: var(--menu-item-gap);
|
|
145
|
+
}/* End-position indicator gets pushed against the right edge of PressableInner.
|
|
146
|
+
Start-position sits at the natural first column. */.PressableInner > .OptionIndicatorSlot[data-position="end"] {
|
|
147
|
+
margin-left: auto;
|
|
148
|
+
}.OptionCheck {
|
|
149
|
+
display: block;
|
|
150
|
+
flex-shrink: 0;
|
|
151
|
+
width: 16px;
|
|
152
|
+
height: 16px;
|
|
153
|
+
}.OptionIndicatorSlot {
|
|
154
|
+
display: flex;
|
|
155
|
+
align-items: center;
|
|
156
|
+
flex-grow: 0;
|
|
157
|
+
flex-shrink: 0;
|
|
158
|
+
width: 16px;
|
|
159
|
+
/* Follow the title's first line box, independently of description height. */
|
|
160
|
+
height: 1lh;
|
|
161
|
+
}.OptionDescription {
|
|
162
|
+
font-weight: var(--font-weight-normal);
|
|
163
|
+
color: var(--color-text-secondary);
|
|
164
|
+
}/* Option group: the `group` around a heading and its rows. No box of its own:
|
|
165
|
+
a plain block in the list's block flow, with no padding or border, so the
|
|
166
|
+
rows sit exactly where they would as the list's own children and the
|
|
167
|
+
heading's top margin collapses through it. The heading always opens its
|
|
168
|
+
group, so "first section" is the group's position, not the heading's. */.OptionGroup {
|
|
169
|
+
display: block;
|
|
170
|
+
}/* Group heading — a section label, not an option. Same size and weight as the
|
|
171
|
+
options made it read as a disabled row, so it carries its own type level:
|
|
172
|
+
smaller, semibold, secondary color. A rule between sections and the extra
|
|
173
|
+
space above it do the separating, the way a grouped menu does it on GitHub
|
|
174
|
+
(Sort by / Order). The rule bleeds past the list gutter to the popover edge
|
|
175
|
+
and the first section never gets one. */.OptionGroupHeading {
|
|
176
|
+
position: relative;
|
|
177
|
+
display: flex;
|
|
178
|
+
align-items: center;
|
|
179
|
+
justify-content: flex-start;
|
|
180
|
+
gap: var(--menu-item-gap);
|
|
181
|
+
padding: var(--menu-item-padding);
|
|
182
|
+
margin-top: calc(var(--spacing) * 2);
|
|
183
|
+
font-size: var(--font-text-xs-size);
|
|
184
|
+
line-height: var(--font-text-xs-line-height);
|
|
185
|
+
font-weight: var(--font-weight-semibold);
|
|
186
|
+
color: var(--color-text-secondary);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.OptionGroup:not(:first-child) > .OptionGroupHeading::before {
|
|
190
|
+
position: absolute;
|
|
191
|
+
top: calc(calc(var(--spacing) * 1) * -1);
|
|
192
|
+
inset-inline: calc(var(--menu-gutter) * -1);
|
|
193
|
+
border-top: 1px solid var(--menu-separator-background-color);
|
|
194
|
+
content: "";
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.OptionGroup:first-child > .OptionGroupHeading {
|
|
198
|
+
margin-top: 0;
|
|
199
|
+
}.OptionHardLimitHeading {
|
|
200
|
+
display: flex;
|
|
201
|
+
align-items: center;
|
|
202
|
+
justify-content: flex-start;
|
|
203
|
+
gap: var(--menu-item-gap);
|
|
204
|
+
padding: var(--menu-item-padding);
|
|
205
|
+
color: var(--color-text-secondary);
|
|
206
|
+
}.OptionsLimit {
|
|
207
|
+
color: var(--link-primary-text-color);
|
|
208
|
+
font-weight: var(--font-weight-medium);
|
|
209
|
+
}/* =============================================
|
|
210
|
+
Action
|
|
211
|
+
============================================= */.Action {
|
|
212
|
+
position: relative;
|
|
213
|
+
padding: var(--menu-item-padding);
|
|
214
|
+
border-radius: calc(var(--menu-radius) - var(--menu-gutter));
|
|
215
|
+
cursor: pointer;
|
|
216
|
+
transition: background-color 0.15s ease;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* Background shape */
|
|
220
|
+
.Action::before {
|
|
221
|
+
position: absolute;
|
|
222
|
+
inset: 0;
|
|
223
|
+
display: block;
|
|
224
|
+
border-radius: calc(var(--menu-radius) - var(--menu-gutter));
|
|
225
|
+
content: "";
|
|
226
|
+
opacity: 0;
|
|
227
|
+
transform: scale(var(--scale, 0.98));
|
|
228
|
+
transition-duration: 0.15s;
|
|
229
|
+
transition-property: opacity, background-color, transform;
|
|
230
|
+
transition-timing-function: var(--cubic-enter);
|
|
231
|
+
will-change: opacity, transform;
|
|
232
|
+
}
|
|
233
|
+
.Action::before, :where([data-theme="light"]) .Action::before {
|
|
234
|
+
background: var(--gray-100);
|
|
235
|
+
}
|
|
236
|
+
:where([data-theme="dark"]) .Action::before {
|
|
237
|
+
background: var(--gray-25);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* Focus ring */
|
|
241
|
+
.Action::after {
|
|
242
|
+
position: absolute;
|
|
243
|
+
inset: 0;
|
|
244
|
+
display: block;
|
|
245
|
+
border-radius: calc(var(--menu-radius) - var(--menu-gutter));
|
|
246
|
+
content: "";
|
|
247
|
+
pointer-events: none;
|
|
248
|
+
transition-duration: 0.15s;
|
|
249
|
+
transition-property: box-shadow, transform;
|
|
250
|
+
transition-timing-function: var(--cubic-enter);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
@media (hover: hover) and (pointer: fine) {
|
|
254
|
+
.Action:hover::before {
|
|
255
|
+
opacity: 1;
|
|
256
|
+
transform: scale(1);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.Action:focus {
|
|
261
|
+
outline: none;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.Action:focus-visible::after {
|
|
265
|
+
box-shadow: 0 0 0 2px var(--color-ring);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.Action:active::before,
|
|
269
|
+
.Action:active::after {
|
|
270
|
+
transform: scale(var(--scale, 0.98));
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.Action svg {
|
|
274
|
+
flex-shrink: 0;
|
|
275
|
+
width: 16px;
|
|
276
|
+
height: 16px;
|
|
277
|
+
}.ActionInner {
|
|
278
|
+
position: relative;
|
|
279
|
+
display: flex;
|
|
280
|
+
align-items: center;
|
|
281
|
+
justify-content: flex-start;
|
|
282
|
+
gap: var(--menu-item-gap);
|
|
283
|
+
}.ActionsContainer {
|
|
284
|
+
position: relative;
|
|
285
|
+
padding: var(--menu-gutter);
|
|
286
|
+
border-top: 1px solid var(--menu-separator-background-color);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.ActionsContainer::before {
|
|
290
|
+
position: absolute;
|
|
291
|
+
bottom: 100%;
|
|
292
|
+
left: 0;
|
|
293
|
+
width: 100%;
|
|
294
|
+
height: 9px;
|
|
295
|
+
margin-bottom: 1px;
|
|
296
|
+
background: var(--color-surface-elevated);
|
|
297
|
+
content: "";
|
|
298
|
+
-webkit-mask-image: linear-gradient(180deg, rgb(0 0 0 / 0%), rgb(0 0 0 / 100%));
|
|
299
|
+
mask-image: linear-gradient(180deg, rgb(0 0 0 / 0%), rgb(0 0 0 / 100%));
|
|
300
|
+
pointer-events: none;
|
|
301
|
+
}/* =============================================
|
|
302
|
+
Search
|
|
303
|
+
============================================= */.Search {
|
|
304
|
+
position: relative;
|
|
305
|
+
padding: var(--menu-gutter) var(--menu-gutter) 0;
|
|
306
|
+
}/* Override fill for Search icon to apply fill-secondary class correctly *//* Need !important to override fill="currentColor" attribute in SVG path *//* Target SVG with fill prop and its path children */.Search svg[fill],
|
|
307
|
+
.Search svg[fill] path {
|
|
308
|
+
fill: var(--color-text-secondary) !important;
|
|
309
|
+
}/* Also target by class for fallback */.Search svg.fill-secondary,
|
|
310
|
+
.Search svg.fill-secondary path {
|
|
311
|
+
fill: var(--color-text-secondary) !important;
|
|
312
|
+
}.SearchEmpty {
|
|
313
|
+
padding: var(--menu-gutter);
|
|
314
|
+
margin: calc(var(--spacing) * 4) 0;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.SearchEmpty[data-text-only] {
|
|
318
|
+
color: var(--color-text-secondary);
|
|
319
|
+
text-align: center;
|
|
320
|
+
}/* The hidden input that submits and validates the value. Its own class, not
|
|
321
|
+
Tailwind utilities: an app that does not generate `sr-only` (or orders
|
|
322
|
+
`w-full` after it) would otherwise lay it out at full width next to the
|
|
323
|
+
trigger text. Full width and no height at the bottom of the trigger, so the
|
|
324
|
+
browser's "required" bubble points at the control. */.FormInput {
|
|
325
|
+
position: absolute;
|
|
326
|
+
bottom: 0;
|
|
327
|
+
left: 0;
|
|
328
|
+
width: 100%;
|
|
329
|
+
height: 0;
|
|
330
|
+
padding: 0;
|
|
331
|
+
margin: 0;
|
|
332
|
+
border: 0;
|
|
333
|
+
overflow: hidden;
|
|
334
|
+
clip-path: inset(50%);
|
|
335
|
+
white-space: nowrap;
|
|
336
|
+
pointer-events: none;
|
|
337
|
+
}
|
|
338
|
+
}
|