|
1 | 1 | @use '../../styles/mixins' as *; |
2 | 2 |
|
| 3 | +/* --- Screen reader only --- */ |
| 4 | + |
| 5 | +.srOnly { |
| 6 | + @include sr-only; |
| 7 | +} |
| 8 | + |
| 9 | +/* --- Wrapper --- */ |
| 10 | + |
3 | 11 | .wrapper { |
4 | 12 | display: flex; |
5 | 13 | flex-direction: column; |
|
50 | 58 |
|
51 | 59 | .thead { |
52 | 60 | border-bottom: 2px solid var(--table-accent, var(--color-border)); |
53 | | - background-color: var(--table-header-bg, transparent); |
| 61 | + background-color: var(--table-header-bg, var(--color-surface)); |
54 | 62 | color: var(--table-header-color, inherit); |
55 | 63 | } |
56 | 64 |
|
|
89 | 97 | } |
90 | 98 |
|
91 | 99 | .sortIcon { |
92 | | - font-size: var(--font-size-xs); |
93 | | - line-height: 1; |
94 | | - opacity: 0.6; |
| 100 | + display: inline-flex; |
| 101 | + align-items: center; |
| 102 | + flex-shrink: 0; |
95 | 103 | } |
96 | 104 |
|
| 105 | +/* Resize handle — 8px hit target centered on the column boundary */ |
| 106 | + |
97 | 107 | .resizeHandle { |
98 | 108 | position: absolute; |
99 | 109 | right: 0; |
100 | 110 | top: 0; |
101 | 111 | bottom: 0; |
102 | | - width: 4px; |
| 112 | + width: 8px; |
103 | 113 | cursor: col-resize; |
104 | 114 | background: transparent; |
| 115 | + border: none; |
| 116 | + padding: 0; |
105 | 117 |
|
106 | | - &:hover, |
107 | | - &:active { |
| 118 | + /* Visible indicator line */ |
| 119 | + &::after { |
| 120 | + content: ''; |
| 121 | + position: absolute; |
| 122 | + right: 3px; |
| 123 | + top: 20%; |
| 124 | + bottom: 20%; |
| 125 | + width: 2px; |
| 126 | + border-radius: 1px; |
| 127 | + background: var(--color-border); |
| 128 | + transition: background-color var(--transition-fast); |
| 129 | + } |
| 130 | + |
| 131 | + &:hover::after, |
| 132 | + &:active::after { |
108 | 133 | background: var(--color-primary); |
109 | | - opacity: 0.3; |
110 | 134 | } |
111 | 135 | } |
112 | 136 |
|
|
133 | 157 | color: var(--color-text-secondary); |
134 | 158 | } |
135 | 159 |
|
| 160 | +/* Inline "Clear search" link inside the empty state */ |
| 161 | + |
| 162 | +.clearSearchButton { |
| 163 | + background: none; |
| 164 | + border: none; |
| 165 | + padding: 0; |
| 166 | + color: var(--color-primary); |
| 167 | + cursor: pointer; |
| 168 | + font: inherit; |
| 169 | + text-decoration: underline; |
| 170 | + text-underline-offset: 2px; |
| 171 | + |
| 172 | + @include focus-ring; |
| 173 | + |
| 174 | + &:hover { |
| 175 | + color: var(--color-primary-hover); |
| 176 | + } |
| 177 | +} |
| 178 | + |
136 | 179 | .selectable { |
137 | 180 | cursor: pointer; |
138 | 181 | } |
|
141 | 184 | background-color: color-mix(in srgb, var(--table-accent, var(--color-primary)) 12%, transparent) !important; |
142 | 185 | } |
143 | 186 |
|
| 187 | +/* Focus ring on selectable rows */ |
| 188 | + |
| 189 | +.selectable:focus-visible { |
| 190 | + outline: var(--focus-ring-width) solid var(--focus-ring-color); |
| 191 | + outline-offset: -2px; |
| 192 | +} |
| 193 | + |
| 194 | +/* --- Skeleton loading --- */ |
| 195 | + |
| 196 | +@keyframes skeleton-shimmer { |
| 197 | + 0% { |
| 198 | + background-position: -200% 0; |
| 199 | + } |
| 200 | + |
| 201 | + 100% { |
| 202 | + background-position: 200% 0; |
| 203 | + } |
| 204 | +} |
| 205 | + |
| 206 | +.skeletonRow { |
| 207 | + pointer-events: none; |
| 208 | +} |
| 209 | + |
| 210 | +.skeletonCell { |
| 211 | + display: block; |
| 212 | + height: 1rem; |
| 213 | + border-radius: var(--radius-sm); |
| 214 | + background: linear-gradient( |
| 215 | + 90deg, |
| 216 | + var(--color-surface) 25%, |
| 217 | + var(--color-border) 50%, |
| 218 | + var(--color-surface) 75% |
| 219 | + ); |
| 220 | + background-size: 200% 100%; |
| 221 | + animation: skeleton-shimmer 1.5s ease-in-out infinite; |
| 222 | + |
| 223 | + @include reduced-motion { |
| 224 | + animation: none; |
| 225 | + background: var(--color-surface); |
| 226 | + } |
| 227 | +} |
| 228 | + |
144 | 229 | /* --- Striping --- */ |
145 | 230 |
|
146 | 231 | .stripedRows .tbody .tr:nth-child(even) { |
|
170 | 255 | .pagination { |
171 | 256 | display: flex; |
172 | 257 | align-items: center; |
173 | | - justify-content: center; |
| 258 | + justify-content: space-between; |
174 | 259 | gap: var(--space-4); |
175 | 260 | padding: var(--space-2) 0; |
176 | 261 | } |
177 | 262 |
|
178 | 263 | .pageButton { |
179 | 264 | display: inline-flex; |
180 | 265 | align-items: center; |
| 266 | + gap: var(--space-1); |
181 | 267 | border: 1px solid var(--color-border); |
182 | 268 | border-radius: var(--radius-md); |
183 | 269 | background: transparent; |
|
204 | 290 | } |
205 | 291 |
|
206 | 292 | .pageInfo { |
| 293 | + display: flex; |
| 294 | + align-items: center; |
| 295 | + gap: var(--space-2); |
207 | 296 | font-size: var(--font-size-sm); |
208 | 297 | color: var(--color-text-secondary); |
209 | 298 | } |
210 | 299 |
|
| 300 | +.showingInfo { |
| 301 | + color: var(--color-text-secondary); |
| 302 | +} |
| 303 | + |
0 commit comments