@auronui/styles 1.0.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/DATA_ATTRIBUTES.md +163 -0
- package/LICENSE +21 -0
- package/README.md +54 -0
- package/base/base.css +40 -0
- package/components/accordion.css +201 -0
- package/components/alert-dialog.css +307 -0
- package/components/alert.css +143 -0
- package/components/aspect-ratio.css +8 -0
- package/components/autocomplete.css +685 -0
- package/components/avatar.css +78 -0
- package/components/badge.css +186 -0
- package/components/breadcrumbs.css +76 -0
- package/components/button-group.css +126 -0
- package/components/button.css +282 -0
- package/components/calendar-year-picker.css +193 -0
- package/components/calendar.css +332 -0
- package/components/card.css +225 -0
- package/components/checkbox-group.css +7 -0
- package/components/checkbox.css +268 -0
- package/components/chip.css +227 -0
- package/components/close-button.css +65 -0
- package/components/collapsible-group.css +7 -0
- package/components/collapsible.css +74 -0
- package/components/color-area.css +81 -0
- package/components/color-field.css +99 -0
- package/components/color-input-group.css +153 -0
- package/components/color-picker.css +121 -0
- package/components/color-slider.css +266 -0
- package/components/color-swatch-picker.css +247 -0
- package/components/color-swatch.css +42 -0
- package/components/combo-box.css +203 -0
- package/components/date-input-group.css +125 -0
- package/components/date-input.css +529 -0
- package/components/date-picker.css +86 -0
- package/components/date-range-field.css +538 -0
- package/components/date-range-picker.css +93 -0
- package/components/description.css +4 -0
- package/components/drawer.css +222 -0
- package/components/dropdown.css +67 -0
- package/components/empty-state.css +4 -0
- package/components/error-message.css +13 -0
- package/components/field-error.css +19 -0
- package/components/fieldset.css +39 -0
- package/components/header.css +7 -0
- package/components/index.css +164 -0
- package/components/input-otp.css +124 -0
- package/components/input.css +603 -0
- package/components/kbd.css +27 -0
- package/components/label.css +28 -0
- package/components/link.css +144 -0
- package/components/list-box-item.css +29 -0
- package/components/list-box-section.css +13 -0
- package/components/list-box.css +11 -0
- package/components/menu-item.css +68 -0
- package/components/menu-section.css +18 -0
- package/components/menu.css +7 -0
- package/components/meter.css +104 -0
- package/components/modal.css +335 -0
- package/components/number-field.css +395 -0
- package/components/pagination.css +157 -0
- package/components/popover.css +96 -0
- package/components/progress-bar.css +126 -0
- package/components/progress-circle.css +82 -0
- package/components/radio-group.css +47 -0
- package/components/radio.css +157 -0
- package/components/range-calendar.css +402 -0
- package/components/scroll-area.css +70 -0
- package/components/scroll-shadow.css +77 -0
- package/components/select.css +649 -0
- package/components/separator.css +59 -0
- package/components/skeleton.css +48 -0
- package/components/slider.css +155 -0
- package/components/spinner.css +42 -0
- package/components/splitter.css +74 -0
- package/components/stepper.css +160 -0
- package/components/surface.css +23 -0
- package/components/switch-group.css +17 -0
- package/components/switch.css +194 -0
- package/components/table.css +341 -0
- package/components/tabs.css +262 -0
- package/components/tag-group.css +66 -0
- package/components/tag.css +99 -0
- package/components/textarea.css +536 -0
- package/components/time-field.css +530 -0
- package/components/toast.css +267 -0
- package/components/toggle-button-group.css +174 -0
- package/components/toggle-button.css +149 -0
- package/components/toolbar.css +32 -0
- package/components/tooltip.css +47 -0
- package/components/tree.css +81 -0
- package/index.css +29 -0
- package/package.json +415 -0
- package/src/components/accordion/accordion.styles.ts +46 -0
- package/src/components/accordion/index.ts +1 -0
- package/src/components/alert/alert.styles.ts +37 -0
- package/src/components/alert/index.ts +1 -0
- package/src/components/alert-dialog/alert-dialog.styles.ts +72 -0
- package/src/components/alert-dialog/index.ts +1 -0
- package/src/components/aspect-ratio/aspect-ratio.styles.ts +10 -0
- package/src/components/aspect-ratio/index.ts +1 -0
- package/src/components/autocomplete/autocomplete.styles.ts +86 -0
- package/src/components/autocomplete/index.ts +1 -0
- package/src/components/avatar/avatar.styles.ts +53 -0
- package/src/components/avatar/index.ts +1 -0
- package/src/components/badge/badge.styles.ts +77 -0
- package/src/components/badge/index.ts +1 -0
- package/src/components/breadcrumbs/breadcrumbs.styles.ts +14 -0
- package/src/components/breadcrumbs/index.ts +1 -0
- package/src/components/button/__tests__/button.styles.test.ts +79 -0
- package/src/components/button/button.styles.ts +65 -0
- package/src/components/button/index.ts +1 -0
- package/src/components/button-group/button-group.styles.ts +32 -0
- package/src/components/button-group/index.ts +1 -0
- package/src/components/calendar/calendar.styles.ts +60 -0
- package/src/components/calendar/index.ts +1 -0
- package/src/components/calendar-year-picker/calendar-year-picker.styles.ts +15 -0
- package/src/components/calendar-year-picker/index.ts +1 -0
- package/src/components/card/card.styles.ts +65 -0
- package/src/components/card/index.ts +1 -0
- package/src/components/checkbox/checkbox.styles.ts +27 -0
- package/src/components/checkbox/index.ts +1 -0
- package/src/components/checkbox-group/checkbox-group.styles.ts +18 -0
- package/src/components/checkbox-group/index.ts +1 -0
- package/src/components/chip/chip.styles.ts +65 -0
- package/src/components/chip/index.ts +1 -0
- package/src/components/close-button/close-button.styles.ts +17 -0
- package/src/components/close-button/index.ts +1 -0
- package/src/components/collapsible/collapsible.styles.ts +25 -0
- package/src/components/collapsible/index.ts +1 -0
- package/src/components/collapsible-group/collapsible-group.styles.ts +13 -0
- package/src/components/collapsible-group/index.ts +1 -0
- package/src/components/color-area/color-area.styles.ts +23 -0
- package/src/components/color-area/index.ts +1 -0
- package/src/components/color-field/color-field.styles.ts +18 -0
- package/src/components/color-field/index.ts +1 -0
- package/src/components/color-input-group/color-input-group.styles.ts +34 -0
- package/src/components/color-input-group/index.ts +1 -0
- package/src/components/color-picker/color-picker.styles.ts +13 -0
- package/src/components/color-picker/index.ts +1 -0
- package/src/components/color-slider/color-slider.styles.ts +14 -0
- package/src/components/color-slider/index.ts +1 -0
- package/src/components/color-swatch/color-swatch.styles.ts +26 -0
- package/src/components/color-swatch/index.ts +1 -0
- package/src/components/color-swatch-picker/color-swatch-picker.styles.ts +54 -0
- package/src/components/color-swatch-picker/index.ts +1 -0
- package/src/components/combo-box/combo-box.styles.ts +26 -0
- package/src/components/combo-box/index.ts +1 -0
- package/src/components/date-input/date-input.styles.ts +86 -0
- package/src/components/date-input/index.ts +1 -0
- package/src/components/date-picker/date-picker.styles.ts +14 -0
- package/src/components/date-picker/index.ts +1 -0
- package/src/components/date-range-field/date-range-field.styles.ts +87 -0
- package/src/components/date-range-field/index.ts +1 -0
- package/src/components/date-range-picker/date-range-picker.styles.ts +14 -0
- package/src/components/date-range-picker/index.ts +1 -0
- package/src/components/description/description.styles.ts +9 -0
- package/src/components/description/index.ts +1 -0
- package/src/components/drawer/drawer.styles.ts +55 -0
- package/src/components/drawer/index.ts +1 -0
- package/src/components/dropdown/dropdown.styles.ts +14 -0
- package/src/components/dropdown/index.ts +1 -0
- package/src/components/empty-state/empty-state.styles.ts +9 -0
- package/src/components/empty-state/index.ts +1 -0
- package/src/components/error-message/error-message.styles.ts +9 -0
- package/src/components/error-message/index.ts +1 -0
- package/src/components/fieldset/fieldset.styles.ts +29 -0
- package/src/components/fieldset/index.ts +1 -0
- package/src/components/header/header.styles.ts +5 -0
- package/src/components/header/index.ts +1 -0
- package/src/components/index.ts +84 -0
- package/src/components/input/index.ts +1 -0
- package/src/components/input/input.styles.ts +87 -0
- package/src/components/input-otp/index.ts +1 -0
- package/src/components/input-otp/input-otp.styles.ts +30 -0
- package/src/components/kbd/index.ts +1 -0
- package/src/components/kbd/kbd.styles.ts +20 -0
- package/src/components/label/index.ts +1 -0
- package/src/components/label/label.styles.ts +25 -0
- package/src/components/link/index.ts +1 -0
- package/src/components/link/link.styles.ts +38 -0
- package/src/components/list-box/index.ts +1 -0
- package/src/components/list-box/list-box.styles.ts +18 -0
- package/src/components/list-box-item/index.ts +1 -0
- package/src/components/list-box-item/list-box-item.styles.ts +25 -0
- package/src/components/list-box-section/index.ts +1 -0
- package/src/components/list-box-section/list-box-section.styles.ts +13 -0
- package/src/components/menu/index.ts +1 -0
- package/src/components/menu/menu.styles.ts +9 -0
- package/src/components/menu-item/index.ts +1 -0
- package/src/components/menu-item/menu-item.styles.ts +26 -0
- package/src/components/menu-section/index.ts +1 -0
- package/src/components/menu-section/menu-section.styles.ts +14 -0
- package/src/components/meter/index.ts +1 -0
- package/src/components/meter/meter.styles.ts +48 -0
- package/src/components/modal/index.ts +1 -0
- package/src/components/modal/modal.styles.ts +70 -0
- package/src/components/number-field/index.ts +1 -0
- package/src/components/number-field/number-field.styles.ts +80 -0
- package/src/components/pagination/index.ts +1 -0
- package/src/components/pagination/pagination.styles.ts +32 -0
- package/src/components/popover/index.ts +1 -0
- package/src/components/popover/popover.styles.ts +14 -0
- package/src/components/progress-bar/index.ts +1 -0
- package/src/components/progress-bar/progress-bar.styles.ts +97 -0
- package/src/components/progress-circle/index.ts +1 -0
- package/src/components/progress-circle/progress-circle.styles.ts +74 -0
- package/src/components/radio/index.ts +1 -0
- package/src/components/radio/radio.styles.ts +14 -0
- package/src/components/radio-group/index.ts +1 -0
- package/src/components/radio-group/radio-group.styles.ts +18 -0
- package/src/components/range-calendar/index.ts +1 -0
- package/src/components/range-calendar/range-calendar.styles.ts +60 -0
- package/src/components/scroll-shadow/index.ts +1 -0
- package/src/components/scroll-shadow/scroll-shadow.styles.ts +37 -0
- package/src/components/select/index.ts +1 -0
- package/src/components/select/select.styles.ts +86 -0
- package/src/components/separator/index.ts +1 -0
- package/src/components/separator/separator.styles.ts +25 -0
- package/src/components/skeleton/index.ts +1 -0
- package/src/components/skeleton/skeleton.styles.ts +21 -0
- package/src/components/slider/index.ts +1 -0
- package/src/components/slider/slider.styles.ts +40 -0
- package/src/components/spinner/index.ts +1 -0
- package/src/components/spinner/spinner.styles.ts +28 -0
- package/src/components/splitter/index.ts +1 -0
- package/src/components/splitter/splitter.styles.ts +28 -0
- package/src/components/stepper/index.ts +1 -0
- package/src/components/stepper/stepper.styles.ts +57 -0
- package/src/components/surface/index.ts +1 -0
- package/src/components/surface/surface.styles.ts +20 -0
- package/src/components/switch/index.ts +1 -0
- package/src/components/switch/switch.styles.ts +31 -0
- package/src/components/switch-group/index.ts +1 -0
- package/src/components/switch-group/switch-group.styles.ts +25 -0
- package/src/components/table/index.ts +1 -0
- package/src/components/table/table.styles.ts +47 -0
- package/src/components/tabs/index.ts +1 -0
- package/src/components/tabs/tabs.styles.ts +31 -0
- package/src/components/tag/index.ts +1 -0
- package/src/components/tag/tag.styles.ts +37 -0
- package/src/components/tag-group/index.ts +1 -0
- package/src/components/tag-group/tag-group.styles.ts +12 -0
- package/src/components/text/index.ts +1 -0
- package/src/components/text/text.styles.ts +29 -0
- package/src/components/textarea/index.ts +1 -0
- package/src/components/textarea/textarea.styles.ts +86 -0
- package/src/components/time-field/index.ts +1 -0
- package/src/components/time-field/time-field.styles.ts +86 -0
- package/src/components/toast/index.ts +1 -0
- package/src/components/toast/toast.styles.ts +67 -0
- package/src/components/toggle-button/index.ts +1 -0
- package/src/components/toggle-button/toggle-button.styles.ts +28 -0
- package/src/components/toggle-button-group/index.ts +1 -0
- package/src/components/toggle-button-group/toggle-button-group.styles.ts +39 -0
- package/src/components/toolbar/index.ts +1 -0
- package/src/components/toolbar/toolbar.styles.ts +23 -0
- package/src/components/tooltip/index.ts +1 -0
- package/src/components/tooltip/tooltip.styles.ts +12 -0
- package/src/components/tree/index.ts +1 -0
- package/src/components/tree/tree.styles.ts +33 -0
- package/src/index.ts +5 -0
- package/src/utils/index.ts +15 -0
- package/themes/default/components/index.css +6 -0
- package/themes/default/index.css +8 -0
- package/themes/default/variables.css +168 -0
- package/themes/shared/theme.css +196 -0
- package/utilities/index.css +244 -0
- package/variants/index.css +106 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
Table — Data display component for structured tabular data.
|
|
3
|
+
==========================================================================
|
|
4
|
+
|
|
5
|
+
Reka UI data-attribute mapping (Phase 8 audit):
|
|
6
|
+
- table__row[data-state="checked"] ← Reka UI Checkbox emits data-state="checked" — already correct
|
|
7
|
+
- table__column[data-allows-sorting="true"] ← custom attribute emitted by Vue component — keep
|
|
8
|
+
- table__column-resizer[data-resizing="true"] ← custom attribute emitted by Vue component — keep
|
|
9
|
+
- :focus-visible paired with [data-focus-visible="true"] on column, row, cell, column-resizer
|
|
10
|
+
- :hover paired with [data-resizing="true"] on column-resizer (expand hit area on hover)
|
|
11
|
+
- [data-disabled] / [aria-disabled="true"] paired on rows for Reka UI + ARIA compat
|
|
12
|
+
========================================================================== */
|
|
13
|
+
|
|
14
|
+
/* --------------------------------------------------------------------------
|
|
15
|
+
Table Root — Outer container for table + optional footer.
|
|
16
|
+
Primary variant: gray background with the table body as a white card inside.
|
|
17
|
+
-------------------------------------------------------------------------- */
|
|
18
|
+
.table-root {
|
|
19
|
+
@apply relative grid w-full overflow-clip;
|
|
20
|
+
grid-template-columns: minmax(0, 1fr);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* --------------------------------------------------------------------------
|
|
24
|
+
Scroll Container — Allows the table to scroll horizontally while the
|
|
25
|
+
wrapper and footer remain at full width. The parent grid with
|
|
26
|
+
minmax(0, 1fr) creates a hard width boundary that table layout
|
|
27
|
+
cannot push beyond.
|
|
28
|
+
-------------------------------------------------------------------------- */
|
|
29
|
+
.table__scroll-container {
|
|
30
|
+
@apply overflow-x-auto;
|
|
31
|
+
/* Custom scrollbar */
|
|
32
|
+
scrollbar-width: thin;
|
|
33
|
+
scrollbar-color: oklch(0% 0 0 / 0.15) transparent;
|
|
34
|
+
|
|
35
|
+
&::-webkit-scrollbar {
|
|
36
|
+
width: 6px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&::-webkit-scrollbar-track {
|
|
40
|
+
background: transparent;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
&::-webkit-scrollbar-thumb {
|
|
44
|
+
background: oklch(0% 0 0 / 0.15);
|
|
45
|
+
border-radius: 3px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
&::-webkit-scrollbar-thumb:hover {
|
|
49
|
+
background: oklch(0% 0 0 / 0.25);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* Dark mode scrollbar */
|
|
53
|
+
:is([data-theme="dark"], .dark) & {
|
|
54
|
+
scrollbar-color: oklch(100% 0 0 / 0.15) transparent;
|
|
55
|
+
|
|
56
|
+
&::-webkit-scrollbar-thumb {
|
|
57
|
+
background: oklch(100% 0 0 / 0.15);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
&::-webkit-scrollbar-thumb:hover {
|
|
61
|
+
background: oklch(100% 0 0 / 0.25);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.table-root--primary {
|
|
67
|
+
@apply bg-surface-secondary px-1 pb-1;
|
|
68
|
+
border-radius: calc(var(--radius) * 2.5);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.table-root--secondary {
|
|
72
|
+
/* No background, padding, or rounding on the root */
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Secondary: header is a standalone rounded card.
|
|
76
|
+
Background is on cells (not <thead>) because Firefox does not support */
|
|
77
|
+
.table-root--secondary .table__header {
|
|
78
|
+
@apply border-b-0 bg-transparent;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.table-root--secondary .table__column {
|
|
82
|
+
@apply bg-surface-secondary;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.table-root--secondary .table__column:first-child {
|
|
86
|
+
@apply rounded-tl-2xl rounded-bl-2xl;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.table-root--secondary .table__column:last-child {
|
|
90
|
+
@apply rounded-tr-2xl rounded-br-2xl;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Secondary: body has no shadow or rounded corners */
|
|
94
|
+
.table-root--secondary .table__body {
|
|
95
|
+
@apply shadow-none;
|
|
96
|
+
|
|
97
|
+
/* Non-virtualized */
|
|
98
|
+
& tr:first-child td:first-child,
|
|
99
|
+
& tr:first-child td:last-child,
|
|
100
|
+
& tr:last-child td:first-child,
|
|
101
|
+
& tr:last-child td:last-child {
|
|
102
|
+
@apply rounded-none;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Virtualized: undo the rounding applied by .table__body:not(tbody) */
|
|
106
|
+
&:not(tbody) {
|
|
107
|
+
@apply overflow-visible rounded-none;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Secondary: rows are transparent and keep bottom border on every row */
|
|
112
|
+
.table-root--secondary .table__row {
|
|
113
|
+
.table__cell {
|
|
114
|
+
@apply border-b border-separator-tertiary/50 bg-transparent;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@media (hover: hover) {
|
|
118
|
+
&:hover .table__cell,
|
|
119
|
+
.table__cell {
|
|
120
|
+
@apply bg-default/50;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* --------------------------------------------------------------------------
|
|
126
|
+
Table Content (<table> element) — the white card inside the root
|
|
127
|
+
-------------------------------------------------------------------------- */
|
|
128
|
+
.table__content {
|
|
129
|
+
@apply w-full border-separate border-spacing-0 text-sm;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* Primary variant: table gets the white surface card look */
|
|
133
|
+
.table-root--primary .table__content {
|
|
134
|
+
@apply overflow-clip;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* --------------------------------------------------------------------------
|
|
138
|
+
Table Header (<thead>)
|
|
139
|
+
-------------------------------------------------------------------------- */
|
|
140
|
+
.table__header {
|
|
141
|
+
@apply border-b border-separator/50 bg-surface-secondary;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* --------------------------------------------------------------------------
|
|
145
|
+
Table Column (<th>)
|
|
146
|
+
-------------------------------------------------------------------------- */
|
|
147
|
+
.table__column {
|
|
148
|
+
@apply relative px-4 py-2.5 text-left text-xs font-medium text-muted;
|
|
149
|
+
|
|
150
|
+
/* Separator between columns — a short vertical line on the right edge */
|
|
151
|
+
&::after {
|
|
152
|
+
content: "";
|
|
153
|
+
@apply pointer-events-none absolute top-1/2 right-0 h-4 w-px -translate-y-1/2 rounded-sm bg-separator;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
&:last-child:not(:only-child)::after {
|
|
157
|
+
content: none;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Sortable columns */
|
|
161
|
+
&[data-allows-sorting="true"] {
|
|
162
|
+
cursor: var(--cursor-interactive);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
@media (hover: hover) {
|
|
166
|
+
&[data-allows-sorting="true"]:hover,
|
|
167
|
+
&[data-allows-sorting="true"]:hover {
|
|
168
|
+
@apply text-foreground;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Focus visible — inset shadow for consistent table focus styling */
|
|
173
|
+
&:focus-visible,
|
|
174
|
+
&[data-focus-visible="true"] {
|
|
175
|
+
@apply rounded-lg outline-none;
|
|
176
|
+
box-shadow: inset 0 0 0 2px var(--color-focus);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* --------------------------------------------------------------------------
|
|
181
|
+
Table Body (<tbody>)
|
|
182
|
+
-------------------------------------------------------------------------- */
|
|
183
|
+
.table__body {
|
|
184
|
+
/* Non-virtualized: round corners via first/last cells
|
|
185
|
+
(border-radius on <tbody> itself has no effect) */
|
|
186
|
+
& tr:first-child td:first-child {
|
|
187
|
+
@apply rounded-tl-2xl;
|
|
188
|
+
}
|
|
189
|
+
& tr:first-child td:last-child {
|
|
190
|
+
@apply rounded-tr-2xl;
|
|
191
|
+
}
|
|
192
|
+
& tr:last-child td:first-child {
|
|
193
|
+
@apply rounded-bl-2xl;
|
|
194
|
+
}
|
|
195
|
+
& tr:last-child td:last-child {
|
|
196
|
+
@apply rounded-br-2xl;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* Virtualized: elements are divs, not tr/td. VirtualizerItem wrappers
|
|
200
|
+
break :first-child/:last-child on rows and cells, so round the body
|
|
201
|
+
itself and clip overflow instead. */
|
|
202
|
+
&:not(tbody) {
|
|
203
|
+
@apply relative h-full overflow-clip rounded-2xl;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* --------------------------------------------------------------------------
|
|
208
|
+
Table Row (<tr>)
|
|
209
|
+
-------------------------------------------------------------------------- */
|
|
210
|
+
.table__row {
|
|
211
|
+
@apply relative h-full;
|
|
212
|
+
|
|
213
|
+
/* Bottom separator */
|
|
214
|
+
@apply border-b border-separator/50;
|
|
215
|
+
|
|
216
|
+
/* Last row in body has no bottom border */
|
|
217
|
+
&:last-child {
|
|
218
|
+
@apply border-b-0;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/* Hover state — applied to cells so Firefox clips bg to border-radius */
|
|
222
|
+
@media (hover: hover) {
|
|
223
|
+
&:hover .table__cell,
|
|
224
|
+
.table__cell {
|
|
225
|
+
@apply bg-surface/40;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/* Selected state */
|
|
230
|
+
&[data-state="checked"] .table__cell {
|
|
231
|
+
@apply bg-surface/10;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* Disabled state */
|
|
235
|
+
&[aria-disabled="true"],
|
|
236
|
+
&[data-disabled] {
|
|
237
|
+
@apply status-disabled;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* Focus visible — use outline instead of ring for better table row rendering */
|
|
241
|
+
&:focus-visible,
|
|
242
|
+
&[data-focus-visible="true"] {
|
|
243
|
+
@apply outline-none;
|
|
244
|
+
box-shadow: inset 0 0 0 2px var(--color-focus);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/* Dragging state */
|
|
248
|
+
&[data-dragging="true"] {
|
|
249
|
+
@apply opacity-50;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* Drop target state */
|
|
253
|
+
&[data-drop-target="true"] .table__cell {
|
|
254
|
+
@apply bg-accent-soft;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* --------------------------------------------------------------------------
|
|
259
|
+
Table Cell (<td>)
|
|
260
|
+
-------------------------------------------------------------------------- */
|
|
261
|
+
.table__cell {
|
|
262
|
+
@apply h-full bg-surface px-4 py-3 align-middle text-sm text-foreground;
|
|
263
|
+
|
|
264
|
+
@apply border-b border-separator-tertiary/50;
|
|
265
|
+
|
|
266
|
+
/* Focus visible — inset shadow so focus stays within the cell boundaries */
|
|
267
|
+
&:focus-visible,
|
|
268
|
+
&[data-focus-visible="true"] {
|
|
269
|
+
@apply rounded-lg outline-none;
|
|
270
|
+
box-shadow: inset 0 0 0 2px var(--color-focus);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/* --------------------------------------------------------------------------
|
|
275
|
+
Table Footer (div outside <table>, sits on gray bg)
|
|
276
|
+
-------------------------------------------------------------------------- */
|
|
277
|
+
.table__footer {
|
|
278
|
+
@apply flex items-center px-4 py-2.5;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/* --------------------------------------------------------------------------
|
|
282
|
+
Resizable Container — wraps table to enable column resizing via React Aria.
|
|
283
|
+
-------------------------------------------------------------------------- */
|
|
284
|
+
.table__resizable-container {
|
|
285
|
+
@apply relative overflow-auto;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/* --------------------------------------------------------------------------
|
|
289
|
+
Column Resizer — drag handle between resizable columns.
|
|
290
|
+
Replaces the ::after separator when present.
|
|
291
|
+
-------------------------------------------------------------------------- */
|
|
292
|
+
.table__column-resizer {
|
|
293
|
+
/* Match the ::after separator: absolute, right edge, short vertical line */
|
|
294
|
+
@apply absolute top-1/2 right-0 h-4 w-px -translate-y-1/2 rounded-sm bg-separator;
|
|
295
|
+
/* Make it interactive — wider hit area with transparent padding */
|
|
296
|
+
@apply box-content translate-x-1/2 cursor-col-resize touch-none px-2;
|
|
297
|
+
/* Reset appearance */
|
|
298
|
+
@apply border-none bg-clip-content outline-none;
|
|
299
|
+
|
|
300
|
+
&:hover,
|
|
301
|
+
&[data-resizing="true"] {
|
|
302
|
+
@apply h-full w-0.5 bg-accent;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
&[data-resizing="true"] {
|
|
306
|
+
@apply h-full w-0.5 bg-accent;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
&:focus-visible,
|
|
310
|
+
&[data-focus-visible="true"] {
|
|
311
|
+
@apply h-full w-0.5 bg-focus;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/* Hide the ::after separator when a resizer is present in the column */
|
|
316
|
+
.table__column:has(.table__column-resizer)::after {
|
|
317
|
+
content: none;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/* --------------------------------------------------------------------------
|
|
321
|
+
Load More Item — sentinel row for infinite scrolling.
|
|
322
|
+
Non-virtualized: <tr> with <td colSpan=N> inside.
|
|
323
|
+
Virtualized: <div> with <div role="rowheader"> inside.
|
|
324
|
+
-------------------------------------------------------------------------- */
|
|
325
|
+
.table__load-more {
|
|
326
|
+
& td,
|
|
327
|
+
& [role="rowheader"] {
|
|
328
|
+
@apply py-3 text-center;
|
|
329
|
+
& > * {
|
|
330
|
+
@apply mx-auto;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/* --------------------------------------------------------------------------
|
|
336
|
+
Load More Content — styled container for the loading indicator inside
|
|
337
|
+
the load-more sentinel row.
|
|
338
|
+
-------------------------------------------------------------------------- */
|
|
339
|
+
.table__load-more-content {
|
|
340
|
+
@apply flex items-center justify-center gap-2 py-2;
|
|
341
|
+
}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/* Base tabs component */
|
|
2
|
+
.tabs {
|
|
3
|
+
@apply flex gap-2;
|
|
4
|
+
|
|
5
|
+
/* Orientation styles */
|
|
6
|
+
&[data-orientation="horizontal"] {
|
|
7
|
+
@apply flex-col;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
&[data-orientation="vertical"] {
|
|
11
|
+
@apply flex-row;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Tab list container */
|
|
16
|
+
.tabs__list-container {
|
|
17
|
+
@apply relative;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Tab list */
|
|
21
|
+
.tabs__list {
|
|
22
|
+
@apply relative inline-flex bg-default p-1;
|
|
23
|
+
|
|
24
|
+
border-radius: calc(var(--radius-2xl) + 0.25rem);
|
|
25
|
+
|
|
26
|
+
/* Horizontal orientation */
|
|
27
|
+
&[data-orientation="horizontal"] {
|
|
28
|
+
@apply w-full flex-row;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Vertical orientation */
|
|
32
|
+
&[data-orientation="vertical"] {
|
|
33
|
+
@apply flex-col gap-1;
|
|
34
|
+
|
|
35
|
+
.tabs__tab {
|
|
36
|
+
@apply min-w-20;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Individual tab */
|
|
42
|
+
.tabs__tab {
|
|
43
|
+
position: relative;
|
|
44
|
+
z-index: 1;
|
|
45
|
+
cursor: var(--cursor-interactive);
|
|
46
|
+
|
|
47
|
+
@apply flex h-8 w-full items-center justify-center rounded-3xl px-4 text-center text-sm font-medium outline-none no-highlight;
|
|
48
|
+
@apply text-foreground/50;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Transitions
|
|
52
|
+
* CRITICAL: motion-reduce must be AFTER transition for correct override specificity
|
|
53
|
+
*/
|
|
54
|
+
transition:
|
|
55
|
+
color 300ms var(--ease-smooth),
|
|
56
|
+
opacity 300ms var(--ease-smooth);
|
|
57
|
+
@apply motion-reduce:transition-none;
|
|
58
|
+
|
|
59
|
+
/* Selected state */
|
|
60
|
+
&[data-state="active"] {
|
|
61
|
+
@apply text-segment-foreground font-semibold opacity-100;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* Hide separator when this tab is selected */
|
|
65
|
+
&[data-state="active"] .tabs__separator {
|
|
66
|
+
opacity: 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* Hide separator when previous sibling is selected */
|
|
70
|
+
&[data-state="active"] + .tabs__tab .tabs__separator {
|
|
71
|
+
opacity: 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* Disabled state */
|
|
75
|
+
&:disabled,
|
|
76
|
+
&[data-disabled],
|
|
77
|
+
&[aria-disabled="true"] {
|
|
78
|
+
@apply status-disabled;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Hover: brighten inactive tabs only */
|
|
82
|
+
@media (hover: hover) {
|
|
83
|
+
&:not([data-state="active"]):not([data-disabled]):hover {
|
|
84
|
+
@apply text-foreground/75;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Focus states */
|
|
89
|
+
&:focus-visible,
|
|
90
|
+
&[data-focus-visible="true"] {
|
|
91
|
+
@apply status-focused;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Tab separator */
|
|
96
|
+
.tabs__separator {
|
|
97
|
+
@apply bg-muted/25;
|
|
98
|
+
|
|
99
|
+
border-radius: 4px;
|
|
100
|
+
position: absolute;
|
|
101
|
+
pointer-events: none;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Transitions
|
|
105
|
+
* CRITICAL: motion-reduce must be AFTER transition for correct override specificity
|
|
106
|
+
*/
|
|
107
|
+
transition: opacity 300ms var(--ease-smooth);
|
|
108
|
+
@apply motion-reduce:transition-none;
|
|
109
|
+
|
|
110
|
+
/* Horizontal tabs - vertical separator */
|
|
111
|
+
.tabs__list[data-orientation="horizontal"] & {
|
|
112
|
+
left: 0;
|
|
113
|
+
top: 25%;
|
|
114
|
+
width: 1px;
|
|
115
|
+
height: 50%;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Vertical tabs - horizontal separator */
|
|
119
|
+
.tabs__list[data-orientation="vertical"] & {
|
|
120
|
+
top: 0;
|
|
121
|
+
left: 5%;
|
|
122
|
+
width: 90%;
|
|
123
|
+
height: 1px;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* Tab panel */
|
|
128
|
+
.tabs__panel {
|
|
129
|
+
@apply w-full p-2 outline-none;
|
|
130
|
+
|
|
131
|
+
&[data-state="active"] {
|
|
132
|
+
animation: tabs-panel-enter 200ms var(--ease-smooth) both;
|
|
133
|
+
@apply motion-reduce:animate-none;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* Orientation spacing */
|
|
137
|
+
&[data-orientation="horizontal"] {
|
|
138
|
+
@apply mt-4;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
&[data-orientation="vertical"] {
|
|
142
|
+
@apply ml-4;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
@keyframes tabs-panel-enter {
|
|
147
|
+
from {
|
|
148
|
+
opacity: 0;
|
|
149
|
+
translate: 0 6px;
|
|
150
|
+
}
|
|
151
|
+
to {
|
|
152
|
+
opacity: 1;
|
|
153
|
+
translate: 0 0;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* Tab indicator - driven by Reka UI's CSS custom properties */
|
|
158
|
+
.tabs__indicator {
|
|
159
|
+
box-shadow: var(--shadow-surface);
|
|
160
|
+
position: absolute;
|
|
161
|
+
/* inset matches the list's p-1 (0.25rem) so the pill gap is consistent on all sides */
|
|
162
|
+
top: 0.25rem;
|
|
163
|
+
left: 0;
|
|
164
|
+
z-index: 0;
|
|
165
|
+
border-radius: var(--radius-3xl);
|
|
166
|
+
|
|
167
|
+
/* Horizontal (default): Reka sets --reka-tabs-indicator-size = tab width,
|
|
168
|
+
--reka-tabs-indicator-position = tab offsetLeft */
|
|
169
|
+
width: var(--reka-tabs-indicator-size, 0px);
|
|
170
|
+
height: calc(100% - 0.5rem);
|
|
171
|
+
translate: var(--reka-tabs-indicator-position, 0px) 0;
|
|
172
|
+
|
|
173
|
+
@apply bg-segment;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Transitions
|
|
177
|
+
* CRITICAL: motion-reduce must be AFTER transition for correct override specificity
|
|
178
|
+
*/
|
|
179
|
+
transition-duration: 300ms;
|
|
180
|
+
transition-property: translate, width, height;
|
|
181
|
+
transition-timing-function: var(--ease-out-fluid);
|
|
182
|
+
@apply motion-reduce:transition-none;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/* Vertical orientation: size = height, position = offsetTop */
|
|
186
|
+
.tabs[data-orientation="vertical"] .tabs__indicator {
|
|
187
|
+
top: 0;
|
|
188
|
+
left: 0.25rem;
|
|
189
|
+
width: calc(100% - 0.5rem);
|
|
190
|
+
height: var(--reka-tabs-indicator-size, 0px);
|
|
191
|
+
translate: 0 var(--reka-tabs-indicator-position, 0px);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* ==========================================================================
|
|
195
|
+
Secondary Variant
|
|
196
|
+
========================================================================== */
|
|
197
|
+
|
|
198
|
+
.tabs--secondary {
|
|
199
|
+
/* Tab list - remove background, add bottom/left border */
|
|
200
|
+
.tabs__list {
|
|
201
|
+
@apply bg-transparent p-0;
|
|
202
|
+
|
|
203
|
+
border-radius: 0;
|
|
204
|
+
|
|
205
|
+
/* Horizontal orientation - bottom border, scrollable */
|
|
206
|
+
&[data-orientation="horizontal"] {
|
|
207
|
+
@apply border-b border-border;
|
|
208
|
+
|
|
209
|
+
max-width: 100%;
|
|
210
|
+
overflow-x: auto;
|
|
211
|
+
overflow-y: clip;
|
|
212
|
+
scrollbar-width: none;
|
|
213
|
+
|
|
214
|
+
&::-webkit-scrollbar {
|
|
215
|
+
display: none;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* Vertical orientation - left border */
|
|
220
|
+
&[data-orientation="vertical"] {
|
|
221
|
+
@apply border-l border-border;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* Tab - adjust for secondary variant */
|
|
226
|
+
.tabs__tab {
|
|
227
|
+
@apply rounded-none;
|
|
228
|
+
|
|
229
|
+
/* Selected state - use text-foreground */
|
|
230
|
+
&[data-state="active"] {
|
|
231
|
+
@apply text-foreground;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* Hide separators in secondary variant */
|
|
236
|
+
.tabs__separator {
|
|
237
|
+
display: none;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* Tab indicator - line style */
|
|
241
|
+
.tabs__indicator {
|
|
242
|
+
@apply bg-accent;
|
|
243
|
+
|
|
244
|
+
box-shadow: none;
|
|
245
|
+
border-radius: 0;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/* Horizontal orientation - bottom line indicator */
|
|
249
|
+
&[data-orientation="horizontal"] .tabs__indicator {
|
|
250
|
+
top: auto;
|
|
251
|
+
bottom: 0;
|
|
252
|
+
height: 2px;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* Vertical orientation - left line indicator */
|
|
256
|
+
&[data-orientation="vertical"] .tabs__indicator {
|
|
257
|
+
left: 0;
|
|
258
|
+
top: 0;
|
|
259
|
+
width: 2px;
|
|
260
|
+
height: 100%;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/* Base styles */
|
|
2
|
+
.tag-group {
|
|
3
|
+
@apply relative flex flex-col gap-1.5;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.tag-group__list {
|
|
7
|
+
@apply relative flex flex-wrap items-center gap-1.5 rounded-field border bg-field px-3 py-2;
|
|
8
|
+
|
|
9
|
+
min-height: 2.5rem;
|
|
10
|
+
border-width: var(--border-width-field);
|
|
11
|
+
border-color: var(--color-field-border);
|
|
12
|
+
|
|
13
|
+
transition:
|
|
14
|
+
background-color 300ms var(--ease-smooth),
|
|
15
|
+
border-color 300ms var(--ease-smooth),
|
|
16
|
+
box-shadow 300ms var(--ease-out);
|
|
17
|
+
@apply motion-reduce:transition-none;
|
|
18
|
+
|
|
19
|
+
@media (hover: hover) {
|
|
20
|
+
&:hover:not(:focus-within):not([data-disabled]) {
|
|
21
|
+
@apply bg-field-hover;
|
|
22
|
+
border-color: var(--color-field-border-hover);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&:focus-within {
|
|
27
|
+
@apply status-focused-field;
|
|
28
|
+
border-color: var(--color-field-border-focus);
|
|
29
|
+
background-color: var(--color-field-focus);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&[data-invalid] {
|
|
33
|
+
@apply status-invalid-field;
|
|
34
|
+
border-color: var(--color-field-border-invalid);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&[data-disabled] {
|
|
38
|
+
@apply status-disabled;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Seamless text input inside the tag list */
|
|
43
|
+
.tag-group [data-slot="input"] {
|
|
44
|
+
flex: 1;
|
|
45
|
+
min-width: 8rem;
|
|
46
|
+
background: transparent;
|
|
47
|
+
border: none;
|
|
48
|
+
outline: none;
|
|
49
|
+
font-size: 0.875rem;
|
|
50
|
+
line-height: 1.25rem;
|
|
51
|
+
color: inherit;
|
|
52
|
+
padding: 0;
|
|
53
|
+
|
|
54
|
+
&::placeholder {
|
|
55
|
+
color: var(--color-field-placeholder);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
&:disabled {
|
|
59
|
+
cursor: not-allowed;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.tag-group [data-slot="description"],
|
|
64
|
+
.tag-group [data-slot="error-message"] {
|
|
65
|
+
@apply px-1;
|
|
66
|
+
}
|