@nexgrid/react 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/styles.css ADDED
@@ -0,0 +1,931 @@
1
+ /* ==========================================================================
2
+ NexGrid — shared theme
3
+ ==========================================================================
4
+ One stylesheet for every adapter (React, Angular, vanilla / ASP.NET), so a
5
+ grid looks and behaves identically on every platform.
6
+
7
+ Theming: every color/shape below reads a `--nxg-*` custom property, so a
8
+ host app can re-skin the grid by overriding tokens — no class overrides
9
+ needed. Dark mode: add `.nxg-dark` on the root (or any ancestor), or use
10
+ `.nxg-auto` to follow the OS preference.
11
+ ========================================================================== */
12
+
13
+ .nxg-root {
14
+ /* ---- Design tokens (light defaults) ---- */
15
+ --nxg-font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
16
+ "Helvetica Neue", Arial, sans-serif;
17
+ --nxg-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
18
+ --nxg-bg: #ffffff;
19
+ --nxg-card: #ffffff;
20
+ --nxg-card-2: #f8fafc;
21
+ --nxg-border: #e2e8f0;
22
+ --nxg-fg: #0f172a;
23
+ --nxg-muted: #f1f5f9;
24
+ --nxg-muted-fg: #64748b;
25
+ --nxg-primary: #2563eb;
26
+ --nxg-primary-fg: #ffffff;
27
+ --nxg-danger: #dc2626;
28
+ --nxg-radius: 12px;
29
+ --nxg-radius-sm: 8px;
30
+ --nxg-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
31
+ --nxg-focus-ring: 0 0 0 2px color-mix(in srgb, var(--nxg-primary) 35%, transparent);
32
+
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 14px;
36
+ width: 100%;
37
+ font-family: var(--nxg-font);
38
+ color: var(--nxg-fg);
39
+ box-sizing: border-box;
40
+ }
41
+
42
+ .nxg-root *,
43
+ .nxg-root *::before,
44
+ .nxg-root *::after {
45
+ box-sizing: inherit;
46
+ }
47
+
48
+ /* ---- Dark theme ---- */
49
+ .nxg-dark .nxg-root,
50
+ .nxg-root.nxg-dark {
51
+ --nxg-bg: #0b1220;
52
+ --nxg-card: #0f172a;
53
+ --nxg-card-2: #16213a;
54
+ --nxg-border: #253352;
55
+ --nxg-fg: #e2e8f0;
56
+ --nxg-muted: #1e293b;
57
+ --nxg-muted-fg: #94a3b8;
58
+ --nxg-primary: #3b82f6;
59
+ --nxg-primary-fg: #ffffff;
60
+ --nxg-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.4);
61
+ }
62
+
63
+ @media (prefers-color-scheme: dark) {
64
+ .nxg-auto .nxg-root,
65
+ .nxg-root.nxg-auto {
66
+ --nxg-bg: #0b1220;
67
+ --nxg-card: #0f172a;
68
+ --nxg-card-2: #16213a;
69
+ --nxg-border: #253352;
70
+ --nxg-fg: #e2e8f0;
71
+ --nxg-muted: #1e293b;
72
+ --nxg-muted-fg: #94a3b8;
73
+ --nxg-primary: #3b82f6;
74
+ --nxg-primary-fg: #ffffff;
75
+ --nxg-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.4);
76
+ }
77
+ }
78
+
79
+ /* ==========================================================================
80
+ Toolbar
81
+ ========================================================================== */
82
+
83
+ .nxg-toolbar {
84
+ display: flex;
85
+ flex-direction: column;
86
+ align-items: stretch;
87
+ justify-content: space-between;
88
+ gap: 12px;
89
+ padding: 12px;
90
+ background: var(--nxg-card);
91
+ border: 1px solid var(--nxg-border);
92
+ border-radius: var(--nxg-radius);
93
+ box-shadow: var(--nxg-shadow);
94
+ }
95
+
96
+ @media (min-width: 640px) {
97
+ .nxg-toolbar {
98
+ flex-direction: row;
99
+ align-items: center;
100
+ }
101
+ }
102
+
103
+ .nxg-toolbar-group {
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 8px;
107
+ flex-wrap: wrap;
108
+ min-width: 0;
109
+ }
110
+
111
+ .nxg-toolbar-group--end {
112
+ justify-content: flex-end;
113
+ }
114
+
115
+ /* ---- Search ---- */
116
+
117
+ .nxg-search {
118
+ position: relative;
119
+ width: 100%;
120
+ }
121
+
122
+ @media (min-width: 640px) {
123
+ .nxg-search {
124
+ width: auto;
125
+ min-width: 220px;
126
+ max-width: 320px;
127
+ }
128
+ }
129
+
130
+ .nxg-search-icon {
131
+ position: absolute;
132
+ left: 12px;
133
+ top: 50%;
134
+ transform: translateY(-50%);
135
+ width: 16px;
136
+ height: 16px;
137
+ color: var(--nxg-primary);
138
+ pointer-events: none;
139
+ }
140
+
141
+ .nxg-search-input {
142
+ height: 36px;
143
+ width: 100%;
144
+ padding: 0 32px 0 36px;
145
+ font-size: 12px;
146
+ font-family: inherit;
147
+ color: var(--nxg-fg);
148
+ background: var(--nxg-bg);
149
+ border: 1px solid var(--nxg-border);
150
+ border-radius: var(--nxg-radius-sm);
151
+ box-shadow: var(--nxg-shadow);
152
+ outline: none;
153
+ }
154
+
155
+ .nxg-search-input::placeholder {
156
+ color: var(--nxg-muted-fg);
157
+ }
158
+
159
+ .nxg-search-input:focus {
160
+ border-color: var(--nxg-primary);
161
+ box-shadow: var(--nxg-focus-ring);
162
+ }
163
+
164
+ .nxg-search-clear {
165
+ position: absolute;
166
+ right: 10px;
167
+ top: 50%;
168
+ transform: translateY(-50%);
169
+ display: inline-flex;
170
+ padding: 2px;
171
+ border: 0;
172
+ border-radius: 6px;
173
+ background: transparent;
174
+ color: var(--nxg-muted-fg);
175
+ cursor: pointer;
176
+ }
177
+
178
+ .nxg-search-clear:hover {
179
+ color: var(--nxg-fg);
180
+ }
181
+
182
+ /* ---- Buttons ---- */
183
+
184
+ .nxg-btn {
185
+ display: inline-flex;
186
+ align-items: center;
187
+ gap: 6px;
188
+ height: 36px;
189
+ padding: 0 12px;
190
+ font-size: 12px;
191
+ font-weight: 500;
192
+ font-family: inherit;
193
+ color: var(--nxg-fg);
194
+ background: var(--nxg-bg);
195
+ border: 1px solid var(--nxg-border);
196
+ border-radius: var(--nxg-radius-sm);
197
+ box-shadow: var(--nxg-shadow);
198
+ cursor: pointer;
199
+ white-space: nowrap;
200
+ transition: background-color 120ms ease, color 120ms ease;
201
+ }
202
+
203
+ .nxg-btn:hover {
204
+ background: var(--nxg-muted);
205
+ }
206
+
207
+ .nxg-btn:focus-visible {
208
+ outline: none;
209
+ box-shadow: var(--nxg-focus-ring);
210
+ }
211
+
212
+ .nxg-btn:disabled {
213
+ opacity: 0.5;
214
+ cursor: not-allowed;
215
+ }
216
+
217
+ .nxg-btn .nxg-icon {
218
+ color: var(--nxg-primary);
219
+ }
220
+
221
+ .nxg-btn--export {
222
+ font-weight: 600;
223
+ color: var(--nxg-primary);
224
+ border-color: color-mix(in srgb, var(--nxg-primary) 30%, transparent);
225
+ }
226
+
227
+ .nxg-btn--export:hover {
228
+ background: color-mix(in srgb, var(--nxg-primary) 10%, transparent);
229
+ }
230
+
231
+ .nxg-btn--export .nxg-icon {
232
+ color: currentColor;
233
+ }
234
+
235
+ .nxg-icon {
236
+ width: 14px;
237
+ height: 14px;
238
+ flex-shrink: 0;
239
+ }
240
+
241
+ .nxg-capitalize {
242
+ text-transform: capitalize;
243
+ }
244
+
245
+ /* ---- Dropdown menus ---- */
246
+
247
+ .nxg-menu-wrap {
248
+ position: relative;
249
+ display: inline-flex;
250
+ }
251
+
252
+ .nxg-menu {
253
+ position: absolute;
254
+ top: calc(100% + 6px);
255
+ left: 0;
256
+ z-index: 50;
257
+ min-width: 208px;
258
+ padding: 4px;
259
+ background: var(--nxg-card);
260
+ border: 1px solid var(--nxg-border);
261
+ border-radius: var(--nxg-radius-sm);
262
+ box-shadow: 0 8px 24px rgb(0 0 0 / 0.12), var(--nxg-shadow);
263
+ }
264
+
265
+ .nxg-menu--end {
266
+ left: auto;
267
+ right: 0;
268
+ min-width: 224px;
269
+ }
270
+
271
+ .nxg-menu-label {
272
+ padding: 6px 8px;
273
+ font-size: 11px;
274
+ color: var(--nxg-muted-fg);
275
+ }
276
+
277
+ .nxg-menu-separator {
278
+ height: 1px;
279
+ margin: 4px 0;
280
+ background: var(--nxg-border);
281
+ }
282
+
283
+ .nxg-menu-item {
284
+ display: flex;
285
+ align-items: center;
286
+ gap: 10px;
287
+ width: 100%;
288
+ padding: 8px;
289
+ font-size: 12px;
290
+ font-family: inherit;
291
+ text-align: left;
292
+ color: var(--nxg-fg);
293
+ background: transparent;
294
+ border: 0;
295
+ border-radius: 6px;
296
+ cursor: pointer;
297
+ }
298
+
299
+ .nxg-menu-item:hover {
300
+ background: var(--nxg-muted);
301
+ }
302
+
303
+ .nxg-menu-item .nxg-check {
304
+ width: 14px;
305
+ height: 14px;
306
+ flex-shrink: 0;
307
+ color: var(--nxg-primary);
308
+ visibility: hidden;
309
+ }
310
+
311
+ .nxg-menu-item[aria-checked="true"] .nxg-check {
312
+ visibility: visible;
313
+ }
314
+
315
+ .nxg-menu-item-title {
316
+ display: flex;
317
+ flex-direction: column;
318
+ line-height: 1.3;
319
+ }
320
+
321
+ .nxg-menu-item-title strong {
322
+ font-weight: 600;
323
+ color: var(--nxg-fg);
324
+ }
325
+
326
+ .nxg-menu-item-title small {
327
+ font-size: 10px;
328
+ color: var(--nxg-muted-fg);
329
+ }
330
+
331
+ .nxg-icon--excel {
332
+ color: #10b981;
333
+ width: 16px;
334
+ height: 16px;
335
+ }
336
+
337
+ .nxg-icon--csv {
338
+ color: #06b6d4;
339
+ width: 16px;
340
+ height: 16px;
341
+ }
342
+
343
+ /* ==========================================================================
344
+ Table (>= 768px)
345
+ ========================================================================== */
346
+
347
+ .nxg-table-wrap {
348
+ position: relative;
349
+ display: none;
350
+ overflow-x: auto;
351
+ touch-action: pan-x;
352
+ background: var(--nxg-card);
353
+ border: 1px solid var(--nxg-border);
354
+ border-radius: var(--nxg-radius);
355
+ box-shadow: var(--nxg-shadow);
356
+ }
357
+
358
+ @media (min-width: 768px) {
359
+ .nxg-table-wrap {
360
+ display: block;
361
+ }
362
+ }
363
+
364
+ .nxg-table {
365
+ width: 100%;
366
+ text-align: left;
367
+ border-collapse: collapse;
368
+ font-size: 14px;
369
+ color: var(--nxg-fg);
370
+ }
371
+
372
+ .nxg-table thead tr {
373
+ border-bottom: 1px solid var(--nxg-border);
374
+ background: var(--nxg-card-2);
375
+ font-size: 12px;
376
+ font-weight: 600;
377
+ color: var(--nxg-muted-fg);
378
+ white-space: nowrap;
379
+ }
380
+
381
+ .nxg-th {
382
+ padding: 12px 16px;
383
+ font-weight: 600;
384
+ user-select: none;
385
+ }
386
+
387
+ .nxg-th--serial {
388
+ width: 48px;
389
+ padding: 12px;
390
+ text-align: center;
391
+ font-weight: 700;
392
+ font-size: 12px;
393
+ text-transform: uppercase;
394
+ }
395
+
396
+ .nxg-th--select {
397
+ width: 40px;
398
+ padding: 12px;
399
+ text-align: center;
400
+ }
401
+
402
+ .nxg-th--sortable {
403
+ cursor: pointer;
404
+ transition: background-color 120ms ease, color 120ms ease;
405
+ }
406
+
407
+ .nxg-th--sortable:hover {
408
+ color: var(--nxg-fg);
409
+ background: var(--nxg-muted);
410
+ }
411
+
412
+ .nxg-th-inner {
413
+ display: inline-flex;
414
+ align-items: center;
415
+ gap: 6px;
416
+ }
417
+
418
+ .nxg-th-inner--center {
419
+ justify-content: center;
420
+ }
421
+
422
+ .nxg-th-inner--right {
423
+ justify-content: flex-end;
424
+ }
425
+
426
+ .nxg-sort-icon {
427
+ width: 14px;
428
+ height: 14px;
429
+ flex-shrink: 0;
430
+ color: var(--nxg-primary);
431
+ }
432
+
433
+ .nxg-sort-icon--idle {
434
+ opacity: 0.4;
435
+ }
436
+
437
+ .nxg-th--sortable:hover .nxg-sort-icon--idle {
438
+ opacity: 1;
439
+ }
440
+
441
+ .nxg-table tbody {
442
+ background: var(--nxg-card);
443
+ }
444
+
445
+ .nxg-row {
446
+ border-bottom: 1px solid var(--nxg-border);
447
+ white-space: nowrap;
448
+ transition: background-color 120ms ease;
449
+ }
450
+
451
+ .nxg-row:last-child {
452
+ border-bottom: 0;
453
+ }
454
+
455
+ .nxg-row:hover {
456
+ background: color-mix(in srgb, var(--nxg-muted) 50%, transparent);
457
+ }
458
+
459
+ .nxg-row--selected {
460
+ background: color-mix(in srgb, var(--nxg-primary) 10%, transparent);
461
+ }
462
+
463
+ .nxg-row--selected:hover {
464
+ background: color-mix(in srgb, var(--nxg-primary) 15%, transparent);
465
+ }
466
+
467
+ .nxg-row--clickable {
468
+ cursor: pointer;
469
+ }
470
+
471
+ .nxg-td {
472
+ padding: 12px 16px;
473
+ }
474
+
475
+ .nxg-td--serial {
476
+ width: 48px;
477
+ padding: 0 12px;
478
+ text-align: center;
479
+ font-weight: 700;
480
+ font-size: 12px;
481
+ color: var(--nxg-muted-fg);
482
+ font-family: var(--nxg-font-mono);
483
+ user-select: none;
484
+ }
485
+
486
+ .nxg-td--select {
487
+ width: 40px;
488
+ padding: 12px;
489
+ text-align: center;
490
+ }
491
+
492
+ /* Density: padding + font-size on data cells */
493
+ .nxg-root[data-density="compact"] .nxg-td {
494
+ padding-top: 8px;
495
+ padding-bottom: 8px;
496
+ font-size: 12px;
497
+ }
498
+
499
+ .nxg-root[data-density="default"] .nxg-td {
500
+ padding-top: 12px;
501
+ padding-bottom: 12px;
502
+ font-size: 14px;
503
+ }
504
+
505
+ .nxg-root[data-density="comfortable"] .nxg-td {
506
+ padding-top: 16px;
507
+ padding-bottom: 16px;
508
+ font-size: 14px;
509
+ }
510
+
511
+ /* ---- Checkbox ---- */
512
+
513
+ .nxg-checkbox {
514
+ appearance: none;
515
+ width: 16px;
516
+ height: 16px;
517
+ margin: 0;
518
+ border: 1px solid var(--nxg-border);
519
+ border-radius: 4px;
520
+ background: var(--nxg-bg);
521
+ cursor: pointer;
522
+ display: inline-block;
523
+ vertical-align: middle;
524
+ position: relative;
525
+ }
526
+
527
+ .nxg-checkbox:checked {
528
+ background: var(--nxg-primary);
529
+ border-color: var(--nxg-primary);
530
+ }
531
+
532
+ .nxg-checkbox:checked::after {
533
+ content: "";
534
+ position: absolute;
535
+ left: 4.5px;
536
+ top: 1.5px;
537
+ width: 4px;
538
+ height: 8px;
539
+ border: solid var(--nxg-primary-fg);
540
+ border-width: 0 2px 2px 0;
541
+ transform: rotate(45deg);
542
+ }
543
+
544
+ .nxg-checkbox:focus-visible {
545
+ outline: none;
546
+ box-shadow: var(--nxg-focus-ring);
547
+ }
548
+
549
+ /* ==========================================================================
550
+ Empty / loading / error states
551
+ ========================================================================== */
552
+
553
+ .nxg-state {
554
+ padding: 48px 16px;
555
+ text-align: center;
556
+ color: var(--nxg-muted-fg);
557
+ font-size: 14px;
558
+ }
559
+
560
+ .nxg-state-card {
561
+ background: var(--nxg-card);
562
+ border: 1px solid var(--nxg-border);
563
+ border-radius: var(--nxg-radius);
564
+ box-shadow: var(--nxg-shadow);
565
+ padding: 32px;
566
+ text-align: center;
567
+ }
568
+
569
+ .nxg-state-card .nxg-state-text {
570
+ font-size: 14px;
571
+ font-weight: 500;
572
+ color: var(--nxg-muted-fg);
573
+ margin: 0;
574
+ }
575
+
576
+ .nxg-state-card .nxg-btn {
577
+ margin-top: 12px;
578
+ }
579
+
580
+ .nxg-spinner {
581
+ display: inline-block;
582
+ width: 22px;
583
+ height: 22px;
584
+ margin-bottom: 8px;
585
+ border: 2.5px solid var(--nxg-border);
586
+ border-top-color: var(--nxg-primary);
587
+ border-radius: 50%;
588
+ animation: nxg-spin 700ms linear infinite;
589
+ }
590
+
591
+ @keyframes nxg-spin {
592
+ to {
593
+ transform: rotate(360deg);
594
+ }
595
+ }
596
+
597
+ /* ==========================================================================
598
+ Card list (< 768px)
599
+ ========================================================================== */
600
+
601
+ .nxg-cards {
602
+ display: flex;
603
+ flex-direction: column;
604
+ gap: 10px;
605
+ }
606
+
607
+ @media (min-width: 768px) {
608
+ .nxg-cards {
609
+ display: none;
610
+ }
611
+ }
612
+
613
+ .nxg-card {
614
+ background: var(--nxg-card);
615
+ border: 1px solid var(--nxg-border);
616
+ border-radius: var(--nxg-radius);
617
+ box-shadow: var(--nxg-shadow);
618
+ padding: 14px;
619
+ transition: background-color 120ms ease, border-color 120ms ease;
620
+ }
621
+
622
+ .nxg-card--selected {
623
+ border-color: color-mix(in srgb, var(--nxg-primary) 40%, transparent);
624
+ background: color-mix(in srgb, var(--nxg-primary) 5%, var(--nxg-card));
625
+ }
626
+
627
+ .nxg-card--clickable {
628
+ cursor: pointer;
629
+ }
630
+
631
+ .nxg-card--clickable:active {
632
+ background: color-mix(in srgb, var(--nxg-muted) 50%, var(--nxg-card));
633
+ }
634
+
635
+ .nxg-card-head {
636
+ display: flex;
637
+ align-items: center;
638
+ gap: 8px;
639
+ margin-bottom: 10px;
640
+ padding-bottom: 8px;
641
+ border-bottom: 1px solid color-mix(in srgb, var(--nxg-border) 70%, transparent);
642
+ }
643
+
644
+ .nxg-card-serial {
645
+ font-family: var(--nxg-font-mono);
646
+ font-size: 12px;
647
+ font-weight: 700;
648
+ color: var(--nxg-muted-fg);
649
+ }
650
+
651
+ .nxg-card-select {
652
+ margin-inline-start: auto;
653
+ }
654
+
655
+ .nxg-card-rows {
656
+ display: flex;
657
+ flex-direction: column;
658
+ gap: 8px;
659
+ margin: 0;
660
+ }
661
+
662
+ .nxg-card-row {
663
+ display: flex;
664
+ align-items: flex-start;
665
+ justify-content: space-between;
666
+ gap: 12px;
667
+ }
668
+
669
+ .nxg-card-row dt {
670
+ flex-shrink: 0;
671
+ font-size: 12px;
672
+ font-weight: 500;
673
+ color: var(--nxg-muted-fg);
674
+ }
675
+
676
+ .nxg-card-row dd {
677
+ min-width: 0;
678
+ margin: 0;
679
+ overflow-wrap: break-word;
680
+ text-align: end;
681
+ font-size: 14px;
682
+ color: var(--nxg-fg);
683
+ }
684
+
685
+ /* ==========================================================================
686
+ Footer / pagination
687
+ ========================================================================== */
688
+
689
+ .nxg-footer {
690
+ display: flex;
691
+ flex-direction: column;
692
+ align-items: center;
693
+ justify-content: space-between;
694
+ gap: 14px;
695
+ width: 100%;
696
+ padding: 14px;
697
+ background: var(--nxg-card);
698
+ border: 1px solid var(--nxg-border);
699
+ border-radius: var(--nxg-radius);
700
+ box-shadow: var(--nxg-shadow);
701
+ font-size: 12px;
702
+ font-weight: 500;
703
+ }
704
+
705
+ @media (min-width: 768px) {
706
+ .nxg-footer {
707
+ flex-direction: row;
708
+ }
709
+ }
710
+
711
+ .nxg-range {
712
+ display: flex;
713
+ flex-wrap: wrap;
714
+ align-items: center;
715
+ justify-content: center;
716
+ gap: 8px;
717
+ color: var(--nxg-muted-fg);
718
+ text-align: center;
719
+ }
720
+
721
+ @media (min-width: 768px) {
722
+ .nxg-range {
723
+ justify-content: flex-start;
724
+ text-align: left;
725
+ }
726
+ }
727
+
728
+ .nxg-range strong {
729
+ font-weight: 700;
730
+ color: var(--nxg-fg);
731
+ padding: 2px 6px;
732
+ border-radius: 4px;
733
+ background: var(--nxg-muted);
734
+ border: 1px solid var(--nxg-border);
735
+ box-shadow: var(--nxg-shadow);
736
+ }
737
+
738
+ .nxg-range strong.nxg-range-total {
739
+ color: var(--nxg-primary);
740
+ background: color-mix(in srgb, var(--nxg-primary) 10%, transparent);
741
+ border-color: color-mix(in srgb, var(--nxg-primary) 20%, transparent);
742
+ }
743
+
744
+ .nxg-selected-badge {
745
+ display: inline-flex;
746
+ align-items: center;
747
+ padding: 2px 8px;
748
+ border-radius: 6px;
749
+ font-weight: 700;
750
+ color: var(--nxg-primary);
751
+ background: color-mix(in srgb, var(--nxg-primary) 15%, transparent);
752
+ border: 1px solid color-mix(in srgb, var(--nxg-primary) 30%, transparent);
753
+ }
754
+
755
+ .nxg-pagination {
756
+ display: flex;
757
+ flex-wrap: wrap;
758
+ align-items: center;
759
+ justify-content: center;
760
+ gap: 10px;
761
+ max-width: 100%;
762
+ }
763
+
764
+ @media (min-width: 768px) {
765
+ .nxg-pagination {
766
+ justify-content: flex-end;
767
+ }
768
+ }
769
+
770
+ .nxg-rows-per-page {
771
+ display: flex;
772
+ align-items: center;
773
+ gap: 6px;
774
+ font-size: 12px;
775
+ color: var(--nxg-muted-fg);
776
+ font-weight: 500;
777
+ }
778
+
779
+ .nxg-rows-select {
780
+ height: 32px;
781
+ min-width: 64px;
782
+ padding: 0 8px;
783
+ font-size: 12px;
784
+ font-weight: 700;
785
+ font-family: inherit;
786
+ color: var(--nxg-fg);
787
+ background: var(--nxg-bg);
788
+ border: 1px solid var(--nxg-border);
789
+ border-radius: var(--nxg-radius-sm);
790
+ box-shadow: var(--nxg-shadow);
791
+ cursor: pointer;
792
+ outline: none;
793
+ }
794
+
795
+ .nxg-rows-select:focus {
796
+ border-color: var(--nxg-primary);
797
+ box-shadow: var(--nxg-focus-ring);
798
+ }
799
+
800
+ .nxg-pager {
801
+ display: inline-flex;
802
+ align-items: center;
803
+ max-width: 100%;
804
+ overflow-x: auto;
805
+ background: var(--nxg-bg);
806
+ border: 1px solid var(--nxg-border);
807
+ border-radius: var(--nxg-radius-sm);
808
+ box-shadow: var(--nxg-shadow);
809
+ }
810
+
811
+ .nxg-pager > * + * {
812
+ border-left: 1px solid var(--nxg-border);
813
+ }
814
+
815
+ .nxg-page-btn,
816
+ .nxg-page-nav {
817
+ padding: 6px 12px;
818
+ min-width: 32px;
819
+ font-size: 12px;
820
+ font-weight: 700;
821
+ font-family: inherit;
822
+ text-align: center;
823
+ color: var(--nxg-fg);
824
+ background: transparent;
825
+ border: 0;
826
+ cursor: pointer;
827
+ flex-shrink: 0;
828
+ transition: background-color 120ms ease, color 120ms ease;
829
+ }
830
+
831
+ .nxg-page-nav {
832
+ display: inline-flex;
833
+ align-items: center;
834
+ padding: 6px 10px;
835
+ color: var(--nxg-muted-fg);
836
+ }
837
+
838
+ .nxg-page-btn:hover,
839
+ .nxg-page-nav:hover {
840
+ background: var(--nxg-muted);
841
+ color: var(--nxg-fg);
842
+ }
843
+
844
+ .nxg-page-btn--current {
845
+ background: var(--nxg-primary);
846
+ color: var(--nxg-primary-fg);
847
+ box-shadow: var(--nxg-shadow);
848
+ }
849
+
850
+ .nxg-page-btn--current:hover {
851
+ background: var(--nxg-primary);
852
+ color: var(--nxg-primary-fg);
853
+ }
854
+
855
+ .nxg-page-nav:disabled {
856
+ opacity: 0.3;
857
+ cursor: not-allowed;
858
+ background: transparent;
859
+ }
860
+
861
+ .nxg-page-ellipsis {
862
+ padding: 6px 10px;
863
+ color: var(--nxg-muted-fg);
864
+ user-select: none;
865
+ flex-shrink: 0;
866
+ }
867
+
868
+ .nxg-jump {
869
+ display: flex;
870
+ align-items: center;
871
+ gap: 6px;
872
+ }
873
+
874
+ .nxg-jump-label {
875
+ font-size: 12px;
876
+ font-weight: 700;
877
+ color: var(--nxg-fg);
878
+ cursor: pointer;
879
+ white-space: nowrap;
880
+ }
881
+
882
+ .nxg-jump-input {
883
+ width: 48px;
884
+ height: 32px;
885
+ text-align: center;
886
+ font-size: 12px;
887
+ font-weight: 700;
888
+ font-family: inherit;
889
+ color: var(--nxg-primary);
890
+ background: var(--nxg-bg);
891
+ border: 1px solid var(--nxg-border);
892
+ border-radius: var(--nxg-radius-sm);
893
+ box-shadow: var(--nxg-shadow);
894
+ outline: none;
895
+ -moz-appearance: textfield;
896
+ }
897
+
898
+ .nxg-jump-input::-webkit-outer-spin-button,
899
+ .nxg-jump-input::-webkit-inner-spin-button {
900
+ -webkit-appearance: none;
901
+ margin: 0;
902
+ }
903
+
904
+ .nxg-jump-input:focus {
905
+ border-color: var(--nxg-primary);
906
+ box-shadow: var(--nxg-focus-ring);
907
+ }
908
+
909
+ /* ==========================================================================
910
+ Utilities
911
+ ========================================================================== */
912
+
913
+ .nxg-sr-only {
914
+ position: absolute;
915
+ width: 1px;
916
+ height: 1px;
917
+ padding: 0;
918
+ margin: -1px;
919
+ overflow: hidden;
920
+ clip: rect(0, 0, 0, 0);
921
+ white-space: nowrap;
922
+ border: 0;
923
+ }
924
+
925
+ .nxg-align-center {
926
+ text-align: center;
927
+ }
928
+
929
+ .nxg-align-right {
930
+ text-align: right;
931
+ }