@livenetworks/ashlar 2.1.12 → 2.2.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 (108) hide show
  1. package/README.md +25 -2
  2. package/components/COMPONENTS.md +29 -25
  3. package/components/ln-api-connector/ln-api-connector.schema.json +105 -105
  4. package/components/ln-chart/ln-chart-dev.scss +0 -4
  5. package/components/ln-core/README.md +16 -60
  6. package/components/ln-core/index.js +1 -1
  7. package/components/ln-core/ln-core.schema.json +120 -120
  8. package/components/ln-core/query.js +113 -113
  9. package/components/ln-core/reactive.js +0 -59
  10. package/components/ln-data-coordinator/README.md +2 -0
  11. package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
  12. package/components/ln-data-coordinator/ln-data-coordinator.schema.json +196 -196
  13. package/components/ln-data-coordinator/src/ln-data-coordinator.js +457 -432
  14. package/components/ln-data-store/ln-data-store.schema.json +92 -92
  15. package/components/ln-date/ln-date.js +1 -1
  16. package/components/ln-date/src/ln-date.js +1 -1
  17. package/components/ln-debug/ln-debug.js +1 -1
  18. package/components/ln-debug/ln-debug.schema.json +28 -28
  19. package/components/ln-debug/src/generated-attributes.js +304 -302
  20. package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
  21. package/components/ln-external-links/README.md +19 -19
  22. package/components/ln-external-links/ln-external-links.js +1 -1
  23. package/components/ln-external-links/ln-external-links.schema.json +9 -0
  24. package/components/ln-external-links/ln-external-links.scss +12 -0
  25. package/components/ln-external-links/src/ln-external-links.js +3 -2
  26. package/components/ln-filter/README.md +2 -1
  27. package/components/ln-filter/ln-filter.js +1 -1
  28. package/components/ln-filter/ln-filter.schema.json +157 -169
  29. package/components/ln-filter/src/ln-filter.js +4 -4
  30. package/components/ln-form/ln-form.schema.json +57 -57
  31. package/components/ln-key/ln-key.js +1 -1
  32. package/components/ln-key/ln-key.schema.json +8 -0
  33. package/components/ln-key/src/ln-key.js +8 -5
  34. package/components/ln-obfuscator/ln-obfuscator.js +1 -1
  35. package/components/ln-obfuscator/ln-obfuscator.schema.json +6 -0
  36. package/components/ln-obfuscator/src/ln-obfuscator.js +2 -2
  37. package/components/ln-options/ln-options.schema.json +47 -47
  38. package/components/ln-popover/ln-popover.schema.json +82 -82
  39. package/components/ln-progress/ln-progress.schema.json +0 -13
  40. package/components/ln-search/ln-search.schema.json +111 -111
  41. package/components/ln-sort/README.md +1 -0
  42. package/components/ln-sort/ln-sort.js +1 -1
  43. package/components/ln-sort/ln-sort.schema.json +100 -112
  44. package/components/ln-sort/src/sort-model.js +1 -6
  45. package/components/ln-sortable/ln-sortable.schema.json +38 -38
  46. package/components/ln-sortable/ln-sortable.scss +25 -25
  47. package/components/ln-table/README.md +8 -1
  48. package/components/ln-table/ln-table.js +1 -1
  49. package/components/ln-table/ln-table.schema.json +195 -195
  50. package/components/ln-table/src/ln-table.js +43 -7
  51. package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
  52. package/components/ln-table-coordinator/ln-table-coordinator.schema.json +18 -0
  53. package/components/ln-table-coordinator/src/ln-table-coordinator.js +104 -2
  54. package/components/ln-toast/README.md +1 -1
  55. package/components/ln-toast/ln-toast.js +1 -1
  56. package/components/ln-toast/ln-toast.schema.json +6 -0
  57. package/components/ln-toast/src/ln-toast.js +1 -1
  58. package/components/ln-validate/README.md +6 -6
  59. package/components/ln-validate/ln-validate-dev.scss +0 -5
  60. package/components/ln-validate/ln-validate.js +1 -1
  61. package/components/ln-validate/ln-validate.schema.json +0 -6
  62. package/components/ln-validate/src/ln-validate.js +48 -29
  63. package/ln-ashlar.html-data.json +1824 -1814
  64. package/package.json +15 -5
  65. package/theme/README.md +74 -0
  66. package/theme/base/_global.scss +2 -2
  67. package/theme/base/_reset.scss +11 -0
  68. package/theme/components/_app-shell.scss +0 -8
  69. package/theme/components/_form.scss +6 -6
  70. package/theme/components/_ln-table.scss +6 -3
  71. package/theme/components/_scrollbar.scss +5 -4
  72. package/theme/components/_sortable.scss +19 -19
  73. package/theme/components/_stat-card.scss +1 -0
  74. package/theme/components/_table.scss +11 -35
  75. package/theme/config/_density.scss +110 -65
  76. package/theme/config/_palette.scss +71 -49
  77. package/theme/config/_theme.scss +27 -31
  78. package/theme/config/_tokens.scss +28 -26
  79. package/theme/config/mixins/_app-shell.scss +17 -21
  80. package/theme/config/mixins/_avatar.scss +2 -2
  81. package/theme/config/mixins/_btn.scss +4 -2
  82. package/theme/config/mixins/_card.scss +88 -71
  83. package/theme/config/mixins/_colors.scss +2 -1
  84. package/theme/config/mixins/_display.scss +12 -0
  85. package/theme/config/mixins/_footer.scss +3 -1
  86. package/theme/config/mixins/_form.scss +74 -55
  87. package/theme/config/mixins/_layout.scss +9 -0
  88. package/theme/config/mixins/_ln-table.scss +22 -15
  89. package/theme/config/mixins/_modal.scss +3 -0
  90. package/theme/config/mixins/_nav.scss +31 -8
  91. package/theme/config/mixins/_sidebar.scss +2 -1
  92. package/theme/config/mixins/_spacing.scss +4 -4
  93. package/theme/config/mixins/_stat-card.scss +33 -2
  94. package/theme/config/mixins/_status-badge.scss +1 -0
  95. package/theme/config/mixins/_table.scss +87 -69
  96. package/theme/config/mixins/_tabs.scss +31 -0
  97. package/theme/config/mixins/_toast.scss +0 -1
  98. package/theme/designs/relaxed/_card.scss +12 -0
  99. package/theme/designs/relaxed/_layout.scss +24 -0
  100. package/theme/ln-ashlar-core.scss +1 -0
  101. package/theme/ln-ashlar-dev.scss +0 -1
  102. package/theme/ln-ashlar-relaxed.scss +67 -0
  103. package/theme/tailwind/components.css +2198 -0
  104. package/theme/tailwind/entry.css +3 -0
  105. package/theme/tailwind/theme.css +23 -0
  106. package/theme/utilities/_utilities.scss +1 -11
  107. package/web-types.json +2351 -2337
  108. package/components/ln-progress/ln-progress-dev.scss +0 -8
@@ -0,0 +1,2198 @@
1
+ /* ==========================================================================
2
+ ln-ashlar Tailwind v4 Component Layer
3
+ ==========================================================================
4
+ Clean, modern Tailwind UI style definitions for Ashlar components.
5
+ Styled with pure Tailwind aesthetics (Inter / Slate / Indigo).
6
+ ========================================================================== */
7
+
8
+ /* --------------------------------------------------------------------------
9
+ 0. Base Typography, Resets & Icons
10
+ -------------------------------------------------------------------------- */
11
+ body {
12
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
13
+ background-color: #f8fafc; /* slate-50 */
14
+ color: #0f172a; /* slate-900 */
15
+ line-height: 1.5;
16
+ -webkit-font-smoothing: antialiased;
17
+ }
18
+
19
+ [data-mode="dark"] body,
20
+ body.dark {
21
+ background-color: #020617; /* slate-950 */
22
+ color: #f8fafc; /* slate-50 */
23
+ }
24
+
25
+ code, kbd, samp, pre {
26
+ font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
27
+ }
28
+
29
+ code {
30
+ font-size: 0.8125rem;
31
+ background-color: #f1f5f9;
32
+ color: #4f46e5;
33
+ padding: 0.125rem 0.375rem;
34
+ border-radius: 0.25rem;
35
+ border: 1px solid #e2e8f0;
36
+ }
37
+
38
+ [data-mode="dark"] code {
39
+ background-color: #1e293b;
40
+ color: #818cf8;
41
+ border-color: #334155;
42
+ }
43
+
44
+ .ln-icon {
45
+ width: 1.25rem;
46
+ height: 1.25rem;
47
+ display: inline-block;
48
+ vertical-align: middle;
49
+ stroke: currentColor;
50
+ fill: none;
51
+ stroke-width: 2;
52
+ stroke-linecap: round;
53
+ stroke-linejoin: round;
54
+ flex-shrink: 0;
55
+ }
56
+
57
+ svg.ln-icon.ln-icon--sm, .ln-icon--sm, .icon-sm {
58
+ width: 1rem;
59
+ height: 1rem;
60
+ }
61
+
62
+ svg.ln-icon.ln-icon--lg, .ln-icon--lg, .icon-lg {
63
+ width: 1.5rem;
64
+ height: 1.5rem;
65
+ }
66
+
67
+ svg.ln-icon.ln-icon--xl, .ln-icon--xl, .icon-xl {
68
+ width: 4rem;
69
+ height: 4rem;
70
+ }
71
+
72
+ svg.ln-icon.ln-icon--2xl, .ln-icon--2xl, .icon-2xl {
73
+ width: 5rem;
74
+ height: 5rem;
75
+ }
76
+
77
+ /* --------------------------------------------------------------------------
78
+ 1. App Shell, Header, Sidebar & Footer
79
+ -------------------------------------------------------------------------- */
80
+ html:has(.app-wrapper),
81
+ body:has(.app-wrapper) {
82
+ height: 100%;
83
+ overflow: hidden;
84
+ }
85
+
86
+ .app-wrapper {
87
+ display: flex;
88
+ flex-direction: column;
89
+ height: 100dvh;
90
+ overflow: hidden;
91
+ background-color: #f8fafc;
92
+ }
93
+
94
+ [data-mode="dark"] .app-wrapper {
95
+ background-color: #020617;
96
+ }
97
+
98
+ .app-header {
99
+ position: fixed;
100
+ top: 0;
101
+ left: 0;
102
+ right: 0;
103
+ height: 3.5rem;
104
+ z-index: 40;
105
+ display: flex;
106
+ align-items: center;
107
+ justify-content: space-between;
108
+ padding: 0 1.25rem;
109
+ background-color: rgba(255, 255, 255, 0.88);
110
+ backdrop-filter: blur(8px);
111
+ border-bottom: 1px solid #e2e8f0; /* slate-200 */
112
+ }
113
+
114
+ [data-mode="dark"] .app-header {
115
+ background-color: rgba(15, 23, 42, 0.88); /* slate-900 */
116
+ border-bottom-color: #1e293b; /* slate-800 */
117
+ }
118
+
119
+ .app-header .header-left {
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 0.75rem;
123
+ }
124
+
125
+ .app-header .header-left h1 {
126
+ font-size: 1.125rem;
127
+ font-weight: 700;
128
+ color: #0f172a;
129
+ margin: 0;
130
+ letter-spacing: -0.02em;
131
+ }
132
+
133
+ [data-mode="dark"] .app-header .header-left h1 {
134
+ color: #f8fafc;
135
+ }
136
+
137
+ .app-header .header-right {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: 0.75rem;
141
+ }
142
+
143
+ .app-header .header-actions {
144
+ display: flex;
145
+ align-items: center;
146
+ gap: 0.5rem;
147
+ position: relative;
148
+ }
149
+
150
+ .app-header .header-actions button:has(> .ln-icon:only-child),
151
+ .app-header .header-actions button:has(> .ln-icon):not(:has(span)),
152
+ .app-header .menu-toggle {
153
+ width: 2.25rem;
154
+ height: 2.25rem;
155
+ padding: 0;
156
+ display: inline-flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ border-radius: 0.5rem;
160
+ }
161
+
162
+ /* Main inner viewport */
163
+ .app-main {
164
+ display: flex;
165
+ flex-direction: column;
166
+ flex: 1 1 0%;
167
+ margin-top: 3.5rem;
168
+ height: calc(100dvh - 3.5rem);
169
+ overflow: hidden;
170
+ transition: padding 0.2s ease;
171
+ }
172
+
173
+ @media (min-width: 768px) {
174
+ .app-main:has(.app-sidebar[data-ln-toggle="open"]) {
175
+ padding-left: 16rem;
176
+ }
177
+ }
178
+
179
+ .app-main > section {
180
+ flex: 1 1 0%;
181
+ min-height: 0;
182
+ overflow-y: auto;
183
+ padding: 1.5rem;
184
+ width: 100%;
185
+ }
186
+
187
+ .app-content-wrapper {
188
+ max-width: 1200px;
189
+ margin: 0 auto;
190
+ display: flex;
191
+ flex-direction: column;
192
+ gap: 1.5rem;
193
+ }
194
+
195
+ .app-footer {
196
+ height: 2.5rem;
197
+ display: flex;
198
+ align-items: center;
199
+ justify-content: space-between;
200
+ padding: 0 1.5rem;
201
+ border-top: 1px solid #e2e8f0;
202
+ background-color: #ffffff;
203
+ font-size: 0.75rem;
204
+ color: #64748b;
205
+ flex-shrink: 0;
206
+ }
207
+
208
+ [data-mode="dark"] .app-footer {
209
+ background-color: #0f172a;
210
+ border-top-color: #1e293b;
211
+ color: #94a3b8;
212
+ }
213
+
214
+ /* Sidebar */
215
+ .app-sidebar, aside.app-sidebar {
216
+ position: fixed;
217
+ top: 3.5rem;
218
+ left: 0;
219
+ bottom: 0;
220
+ width: 16rem;
221
+ z-index: 30;
222
+ display: flex;
223
+ flex-direction: column;
224
+ background-color: #ffffff;
225
+ border-right: 1px solid #e2e8f0;
226
+ padding: 1rem;
227
+ gap: 1rem;
228
+ overflow-y: auto;
229
+ transform: translateX(-100%);
230
+ transition: transform 0.2s ease;
231
+ }
232
+
233
+ [data-mode="dark"] .app-sidebar,
234
+ [data-mode="dark"] aside.app-sidebar {
235
+ background-color: #0f172a; /* slate-900 */
236
+ border-right-color: #1e293b;
237
+ }
238
+
239
+ .app-sidebar[data-ln-toggle="open"],
240
+ aside.app-sidebar[data-ln-toggle="open"] {
241
+ transform: translateX(0);
242
+ }
243
+
244
+ .app-sidebar[data-ln-toggle="close"],
245
+ aside.app-sidebar[data-ln-toggle="close"] {
246
+ transform: translateX(-100%);
247
+ }
248
+
249
+ @media (max-width: 767px) {
250
+ .app-sidebar,
251
+ aside.app-sidebar {
252
+ z-index: 45;
253
+ }
254
+ }
255
+
256
+ /* Scrim overlay for mobile drawer */
257
+ .app-scrim {
258
+ position: fixed;
259
+ inset: 0;
260
+ background-color: rgba(0, 0, 0, 0.4);
261
+ z-index: 40;
262
+ opacity: 0;
263
+ pointer-events: none;
264
+ transition: opacity 0.2s ease;
265
+ cursor: pointer;
266
+ }
267
+
268
+ aside[data-ln-toggle="open"] ~ .app-scrim,
269
+ .app-sidebar[data-ln-toggle="open"] ~ .app-scrim {
270
+ opacity: 1;
271
+ pointer-events: auto;
272
+ }
273
+
274
+ @media (min-width: 768px) {
275
+ .app-scrim {
276
+ display: none;
277
+ }
278
+ }
279
+
280
+ .app-sidebar header {
281
+ position: relative;
282
+ display: flex;
283
+ flex-direction: column;
284
+ gap: 0.75rem;
285
+ padding-bottom: 0.75rem;
286
+ border-bottom: 1px solid #e2e8f0;
287
+ }
288
+
289
+ .app-sidebar header [data-ln-toggle-action="close"] {
290
+ position: absolute;
291
+ top: 0;
292
+ right: 0;
293
+ width: 1.75rem;
294
+ height: 1.75rem;
295
+ padding: 0;
296
+ display: inline-flex;
297
+ align-items: center;
298
+ justify-content: center;
299
+ background: transparent;
300
+ border: none;
301
+ border-radius: 0.375rem;
302
+ color: #64748b;
303
+ cursor: pointer;
304
+ box-shadow: none;
305
+ }
306
+
307
+ .app-sidebar header [data-ln-toggle-action="close"]:hover {
308
+ background-color: #f1f5f9;
309
+ color: #0f172a;
310
+ }
311
+
312
+ [data-mode="dark"] .app-sidebar header [data-ln-toggle-action="close"] {
313
+ color: #94a3b8;
314
+ }
315
+
316
+ [data-mode="dark"] .app-sidebar header [data-ln-toggle-action="close"]:hover {
317
+ background-color: #1e293b;
318
+ color: #f8fafc;
319
+ }
320
+
321
+ [data-mode="dark"] .app-sidebar header {
322
+ border-bottom-color: #1e293b;
323
+ }
324
+
325
+ .app-sidebar header .app-name {
326
+ font-size: 0.875rem;
327
+ font-weight: 700;
328
+ color: #0f172a;
329
+ letter-spacing: -0.02em;
330
+ }
331
+
332
+ [data-mode="dark"] .app-sidebar header .app-name {
333
+ color: #f8fafc;
334
+ }
335
+
336
+ .app-sidebar header .logo {
337
+ height: 2rem;
338
+ width: auto;
339
+ align-self: flex-start;
340
+ }
341
+
342
+ .logo-dark { display: block; }
343
+ .logo-light { display: none; }
344
+ [data-mode="dark"] .logo-dark { display: none; }
345
+ [data-mode="dark"] .logo-light { display: block; }
346
+
347
+ .app-sidebar header search,
348
+ .app-sidebar header label.search {
349
+ display: flex;
350
+ align-items: center;
351
+ gap: 0.375rem;
352
+ padding: 0.375rem 0.625rem;
353
+ background-color: #f1f5f9; /* slate-100 */
354
+ border: 1px solid #e2e8f0;
355
+ border-radius: 0.5rem;
356
+ color: #64748b;
357
+ width: 100%;
358
+ box-sizing: border-box;
359
+ transition: all 0.15s ease-in-out;
360
+ }
361
+
362
+ [data-mode="dark"] .app-sidebar header search,
363
+ [data-mode="dark"] .app-sidebar header label.search {
364
+ background-color: #1e293b;
365
+ border-color: #334155;
366
+ color: #94a3b8;
367
+ }
368
+
369
+ .app-sidebar header search:focus-within,
370
+ .app-sidebar header label.search:focus-within {
371
+ border-color: #4f46e5;
372
+ background-color: #ffffff;
373
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);
374
+ }
375
+
376
+ [data-mode="dark"] .app-sidebar header search:focus-within,
377
+ [data-mode="dark"] .app-sidebar header label.search:focus-within {
378
+ border-color: #818cf8;
379
+ background-color: #0f172a;
380
+ box-shadow: 0 0 0 3px rgba(129, 140, 248, 0.2);
381
+ }
382
+
383
+ .app-sidebar header search input {
384
+ border: none !important;
385
+ background: transparent !important;
386
+ font-size: 0.8125rem !important;
387
+ outline: none !important;
388
+ box-shadow: none !important;
389
+ flex: 1 1 0% !important;
390
+ min-width: 0 !important;
391
+ width: 100% !important;
392
+ color: inherit !important;
393
+ padding: 0 !important;
394
+ }
395
+
396
+ .app-sidebar footer {
397
+ margin-top: auto;
398
+ padding-top: 0.75rem;
399
+ border-top: 1px solid #e2e8f0;
400
+ font-size: 0.75rem;
401
+ color: #94a3b8;
402
+ }
403
+
404
+ [data-mode="dark"] .app-sidebar footer {
405
+ border-top-color: #1e293b;
406
+ color: #64748b;
407
+ }
408
+
409
+ /* --------------------------------------------------------------------------
410
+ 2. Navigation Menu
411
+ -------------------------------------------------------------------------- */
412
+ nav.nav .nav-section {
413
+ font-size: 0.6875rem;
414
+ text-transform: uppercase;
415
+ letter-spacing: 0.05em;
416
+ font-weight: 700;
417
+ color: #94a3b8;
418
+ margin: 1.25rem 0 0.5rem 0.75rem;
419
+ }
420
+
421
+ [data-mode="dark"] nav.nav .nav-section {
422
+ color: #64748b;
423
+ }
424
+
425
+ nav.nav ul,
426
+ .app-sidebar nav ul {
427
+ list-style: none;
428
+ padding: 0;
429
+ margin: 0;
430
+ display: flex;
431
+ flex-direction: column;
432
+ gap: 0.125rem;
433
+ }
434
+
435
+ nav.nav a,
436
+ .app-sidebar nav a {
437
+ display: flex;
438
+ align-items: center;
439
+ gap: 0.625rem;
440
+ padding: 0.4375rem 0.75rem;
441
+ border-radius: 0.5rem;
442
+ font-size: 0.8125rem;
443
+ font-weight: 500;
444
+ color: #475569; /* slate-600 */
445
+ text-decoration: none;
446
+ transition: all 0.15s ease;
447
+ }
448
+
449
+ [data-mode="dark"] nav.nav a,
450
+ [data-mode="dark"] .app-sidebar nav a {
451
+ color: #94a3b8; /* slate-400 */
452
+ }
453
+
454
+ nav.nav a:hover,
455
+ .app-sidebar nav a:hover {
456
+ background-color: #f1f5f9;
457
+ color: #0f172a;
458
+ }
459
+
460
+ [data-mode="dark"] nav.nav a:hover,
461
+ [data-mode="dark"] .app-sidebar nav a:hover {
462
+ background-color: #1e293b;
463
+ color: #f8fafc;
464
+ }
465
+
466
+ nav.nav a[aria-current="page"],
467
+ nav.nav a.active,
468
+ .app-sidebar nav a[aria-current="page"],
469
+ .app-sidebar nav a.active {
470
+ background-color: #eef2ff; /* indigo-50 */
471
+ color: #4f46e5; /* indigo-600 */
472
+ font-weight: 600;
473
+ }
474
+
475
+ [data-mode="dark"] nav.nav a[aria-current="page"],
476
+ [data-mode="dark"] nav.nav a.active,
477
+ [data-mode="dark"] .app-sidebar nav a[aria-current="page"],
478
+ [data-mode="dark"] .app-sidebar nav a.active {
479
+ background-color: rgba(79, 70, 229, 0.15);
480
+ color: #818cf8; /* indigo-400 */
481
+ }
482
+
483
+ /* --------------------------------------------------------------------------
484
+ 3. Buttons & Interactive Controls
485
+ -------------------------------------------------------------------------- */
486
+ .btn, button.btn, button[type="button"], button[type="submit"] {
487
+ display: inline-flex;
488
+ align-items: center;
489
+ justify-content: center;
490
+ gap: 0.5rem;
491
+ padding: 0.5rem 0.875rem;
492
+ font-size: 0.875rem;
493
+ font-weight: 500;
494
+ border-radius: 0.5rem;
495
+ border: 1px solid #cbd5e1; /* slate-300 */
496
+ background-color: #ffffff;
497
+ color: #334155; /* slate-700 */
498
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
499
+ cursor: pointer;
500
+ user-select: none;
501
+ transition: all 0.15s ease;
502
+ }
503
+
504
+ [data-mode="dark"] .btn,
505
+ [data-mode="dark"] button.btn,
506
+ [data-mode="dark"] button[type="button"],
507
+ [data-mode="dark"] button[type="submit"] {
508
+ background-color: #1e293b;
509
+ border-color: #334155;
510
+ color: #e2e8f0;
511
+ }
512
+
513
+ .btn:hover, button.btn:hover, button[type="button"]:hover, button[type="submit"]:hover {
514
+ background-color: #f8fafc;
515
+ border-color: #94a3b8;
516
+ color: #0f172a;
517
+ }
518
+
519
+ [data-mode="dark"] .btn:hover,
520
+ [data-mode="dark"] button.btn:hover,
521
+ [data-mode="dark"] button[type="button"]:hover,
522
+ [data-mode="dark"] button[type="submit"]:hover {
523
+ background-color: #334155;
524
+ color: #ffffff;
525
+ }
526
+
527
+ .btn:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible {
528
+ outline: 2px solid #4f46e5;
529
+ outline-offset: 2px;
530
+ }
531
+
532
+ /* Primary Button */
533
+ .btn-primary, button.btn-primary, button.btn.btn-primary {
534
+ background-color: #4f46e5; /* indigo-600 */
535
+ color: #ffffff;
536
+ border-color: #4f46e5;
537
+ }
538
+ .btn-primary:hover, button.btn-primary:hover {
539
+ background-color: #4338ca; /* indigo-700 */
540
+ border-color: #4338ca;
541
+ color: #ffffff;
542
+ }
543
+
544
+ /* Secondary Button */
545
+ .btn-secondary, button.btn-secondary {
546
+ background-color: #f1f5f9;
547
+ color: #334155;
548
+ border-color: #e2e8f0;
549
+ }
550
+ .btn-secondary:hover, button.btn-secondary:hover {
551
+ background-color: #e2e8f0;
552
+ color: #0f172a;
553
+ }
554
+
555
+ /* Danger Button */
556
+ .btn-danger, button.btn-danger, .btn-error, button.btn-error {
557
+ background-color: #ef4444; /* red-500 */
558
+ color: #ffffff;
559
+ border-color: #ef4444;
560
+ }
561
+ .btn-danger:hover, button.btn-danger:hover {
562
+ background-color: #dc2626; /* red-600 */
563
+ border-color: #dc2626;
564
+ color: #ffffff;
565
+ }
566
+
567
+ /* --------------------------------------------------------------------------
568
+ 4. Badges & Chips
569
+ -------------------------------------------------------------------------- */
570
+ .badge, span.badge, .chip, span.chip {
571
+ display: inline-flex;
572
+ align-items: center;
573
+ gap: 0.375rem;
574
+ padding: 0.125rem 0.625rem;
575
+ font-size: 0.75rem;
576
+ font-weight: 600;
577
+ border-radius: 9999px;
578
+ border: 1px solid #e2e8f0;
579
+ background-color: #f1f5f9;
580
+ color: #475569;
581
+ }
582
+
583
+ [data-mode="dark"] .badge,
584
+ [data-mode="dark"] span.badge,
585
+ [data-mode="dark"] .chip,
586
+ [data-mode="dark"] span.chip {
587
+ background-color: #1e293b;
588
+ border-color: #334155;
589
+ color: #94a3b8;
590
+ }
591
+
592
+ .badge.success, span.badge.success {
593
+ background-color: #ecfdf5; /* emerald-50 */
594
+ border-color: #a7f3d0;
595
+ color: #059669; /* emerald-600 */
596
+ }
597
+ [data-mode="dark"] .badge.success {
598
+ background-color: rgba(5, 150, 105, 0.15);
599
+ border-color: rgba(5, 150, 105, 0.3);
600
+ color: #34d399;
601
+ }
602
+
603
+ .badge.error, span.badge.error, .badge.danger {
604
+ background-color: #fef2f2; /* red-50 */
605
+ border-color: #fecaca;
606
+ color: #dc2626; /* red-600 */
607
+ }
608
+ [data-mode="dark"] .badge.error {
609
+ background-color: rgba(220, 38, 38, 0.15);
610
+ border-color: rgba(220, 38, 38, 0.3);
611
+ color: #f87171;
612
+ }
613
+
614
+ .badge.warning, span.badge.warning {
615
+ background-color: #fffbeb; /* amber-50 */
616
+ border-color: #fde68a;
617
+ color: #d97706; /* amber-600 */
618
+ }
619
+ [data-mode="dark"] .badge.warning {
620
+ background-color: rgba(217, 119, 6, 0.15);
621
+ border-color: rgba(217, 119, 6, 0.3);
622
+ color: #fbbf24;
623
+ }
624
+
625
+ .badge.info, span.badge.info {
626
+ background-color: #eff6ff; /* blue-50 */
627
+ border-color: #bfdbfe;
628
+ color: #2563eb; /* blue-600 */
629
+ }
630
+ [data-mode="dark"] .badge.info {
631
+ background-color: rgba(37, 99, 235, 0.15);
632
+ border-color: rgba(37, 99, 235, 0.3);
633
+ color: #60a5fa;
634
+ }
635
+
636
+ /* --------------------------------------------------------------------------
637
+ 5. Cards & Section Cards
638
+ -------------------------------------------------------------------------- */
639
+ .section-card, .card {
640
+ background-color: #ffffff;
641
+ border: 1px solid #e2e8f0;
642
+ border-radius: 0.75rem;
643
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);
644
+ margin-bottom: 1.5rem;
645
+ overflow: hidden;
646
+ }
647
+
648
+ [data-mode="dark"] .section-card,
649
+ [data-mode="dark"] .card {
650
+ background-color: #0f172a;
651
+ border-color: #1e293b;
652
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3);
653
+ }
654
+
655
+ .section-card > header,
656
+ .card > header {
657
+ display: flex;
658
+ align-items: center;
659
+ justify-content: space-between;
660
+ padding: 1rem 1.25rem;
661
+ border-bottom: 1px solid #f1f5f9;
662
+ font-weight: 600;
663
+ font-size: 0.9375rem;
664
+ color: #0f172a;
665
+ }
666
+
667
+ [data-mode="dark"] .section-card > header,
668
+ [data-mode="dark"] .card > header {
669
+ border-bottom-color: #1e293b;
670
+ color: #f8fafc;
671
+ }
672
+
673
+ .section-card > header h2,
674
+ .section-card > header h3,
675
+ .card > header h2,
676
+ .card > header h3 {
677
+ margin: 0;
678
+ font-size: 1rem;
679
+ font-weight: 600;
680
+ }
681
+
682
+ .section-card > header .btn-demo-code {
683
+ display: inline-flex;
684
+ align-items: center;
685
+ justify-content: center;
686
+ width: 1.875rem;
687
+ height: 1.875rem;
688
+ border-radius: 0.375rem;
689
+ border: 1px solid #e2e8f0;
690
+ background: transparent;
691
+ color: #64748b;
692
+ padding: 0;
693
+ cursor: pointer;
694
+ transition: all 0.15s ease;
695
+ }
696
+
697
+ [data-mode="dark"] .section-card > header .btn-demo-code {
698
+ border-color: #334155;
699
+ color: #94a3b8;
700
+ }
701
+
702
+ .section-card > header .btn-demo-code:hover {
703
+ background-color: #f1f5f9;
704
+ color: #0f172a;
705
+ border-color: #cbd5e1;
706
+ }
707
+
708
+ [data-mode="dark"] .section-card > header .btn-demo-code:hover {
709
+ background-color: #1e293b;
710
+ color: #ffffff;
711
+ }
712
+
713
+ .section-card > header .btn-demo-code[aria-expanded="true"] {
714
+ color: #4f46e5;
715
+ border-color: #a5b4fc;
716
+ background-color: #eef2ff;
717
+ }
718
+
719
+ .section-card > main,
720
+ .card > main,
721
+ .card-body {
722
+ padding: 1.25rem;
723
+ }
724
+
725
+ .section-card > footer,
726
+ .card > footer {
727
+ display: flex;
728
+ align-items: center;
729
+ justify-content: flex-end;
730
+ padding: 0.875rem 1.25rem;
731
+ background-color: #f8fafc;
732
+ border-top: 1px solid #f1f5f9;
733
+ }
734
+
735
+ [data-mode="dark"] .section-card > footer,
736
+ [data-mode="dark"] .card > footer {
737
+ background-color: #0b1120;
738
+ border-top-color: #1e293b;
739
+ }
740
+
741
+ .demo-note {
742
+ font-size: 0.75rem;
743
+ color: #64748b;
744
+ margin-top: 0.5rem;
745
+ }
746
+
747
+ /* --------------------------------------------------------------------------
748
+ 5. Toggles & Collapsibles ([data-ln-toggle])
749
+ -------------------------------------------------------------------------- */
750
+ .collapsible {
751
+ display: grid;
752
+ grid-template-rows: 0fr;
753
+ transition: grid-template-rows 0.25s ease-out;
754
+ overflow: hidden;
755
+ }
756
+
757
+ .collapsible.open,
758
+ .collapsible[data-ln-toggle="open"] {
759
+ grid-template-rows: 1fr;
760
+ }
761
+
762
+ .collapsible > .collapsible-body,
763
+ .collapsible > article {
764
+ min-height: 0;
765
+ overflow: hidden;
766
+ }
767
+
768
+ /* Any toggle panel that is not open, not a collapsible animation, and not an aside sidebar is hidden */
769
+ [data-ln-toggle]:not([data-ln-toggle="open"]):not(.collapsible):not(aside) {
770
+ display: none !important;
771
+ }
772
+
773
+ /* Demo Grid Containers & Cards Showcase */
774
+ [id^="demo-"][id$="-cards"],
775
+ [id^="demo-accent-"],
776
+ #demo-tinted,
777
+ #demo-stacked,
778
+ #demo-secondary,
779
+ #demo-full-cards,
780
+ #demo-card-fields > main > div,
781
+ .demo-grid-2 {
782
+ display: grid;
783
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
784
+ gap: 1rem;
785
+ margin-top: 0.5rem;
786
+ }
787
+
788
+ [id^="demo-"] > article {
789
+ background-color: #ffffff;
790
+ border: 1px solid #e2e8f0;
791
+ border-radius: 0.75rem;
792
+ padding: 1.25rem;
793
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
794
+ }
795
+
796
+ [data-mode="dark"] [id^="demo-"] > article {
797
+ background-color: #0f172a;
798
+ border-color: #1e293b;
799
+ }
800
+
801
+ [id^="demo-"] > article h3,
802
+ [id^="demo-"] > article h4 {
803
+ margin: 0 0 0.375rem 0;
804
+ font-size: 0.9375rem;
805
+ font-weight: 600;
806
+ }
807
+
808
+ [id^="demo-"] > article p {
809
+ margin: 0;
810
+ font-size: 0.8125rem;
811
+ color: #64748b;
812
+ }
813
+
814
+ [data-mode="dark"] [id^="demo-"] > article p {
815
+ color: #94a3b8;
816
+ }
817
+
818
+ /* Accent Borders */
819
+ #demo-accent-top article {
820
+ border-top: 4px solid #4f46e5;
821
+ }
822
+ #demo-accent-top article.success { border-top-color: #10b981; }
823
+ #demo-accent-top article.error { border-top-color: #ef4444; }
824
+ #demo-accent-top article.warning { border-top-color: #f59e0b; }
825
+
826
+ #demo-accent-left article {
827
+ border-left: 4px solid #4f46e5;
828
+ }
829
+ #demo-accent-left article.success { border-left-color: #10b981; }
830
+ #demo-accent-left article.error { border-left-color: #ef4444; }
831
+ #demo-accent-left article.warning { border-left-color: #f59e0b; }
832
+
833
+ #demo-accent-bottom article {
834
+ border-bottom: 4px solid #4f46e5;
835
+ }
836
+ #demo-accent-bottom article.success { border-bottom-color: #10b981; }
837
+ #demo-accent-bottom article.error { border-bottom-color: #ef4444; }
838
+ #demo-accent-bottom article.warning { border-bottom-color: #f59e0b; }
839
+
840
+ /* --------------------------------------------------------------------------
841
+ 6. Dashboard #stats & Progress Bars
842
+ -------------------------------------------------------------------------- */
843
+ #stats ul {
844
+ display: grid;
845
+ grid-template-columns: repeat(1, minmax(0, 1fr));
846
+ gap: 1rem;
847
+ list-style: none;
848
+ padding: 0;
849
+ margin: 0 0 1.5rem 0;
850
+ }
851
+
852
+ @media (min-width: 640px) {
853
+ #stats ul {
854
+ grid-template-columns: repeat(2, minmax(0, 1fr));
855
+ }
856
+ }
857
+
858
+ @media (min-width: 1024px) {
859
+ #stats ul {
860
+ grid-template-columns: repeat(4, minmax(0, 1fr));
861
+ }
862
+ }
863
+
864
+ #stats li {
865
+ background-color: #ffffff;
866
+ border: 1px solid #e2e8f0;
867
+ border-radius: 0.75rem;
868
+ padding: 1.25rem;
869
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);
870
+ }
871
+
872
+ [data-mode="dark"] #stats li {
873
+ background-color: #0f172a;
874
+ border-color: #1e293b;
875
+ }
876
+
877
+ #stats h3 {
878
+ font-size: 0.8125rem;
879
+ color: #64748b;
880
+ font-weight: 500;
881
+ margin: 0 0 0.25rem 0;
882
+ }
883
+
884
+ [data-mode="dark"] #stats h3 {
885
+ color: #94a3b8;
886
+ }
887
+
888
+ #stats strong {
889
+ font-size: 1.5rem;
890
+ font-weight: 700;
891
+ display: block;
892
+ color: #0f172a;
893
+ }
894
+
895
+ [data-mode="dark"] #stats strong {
896
+ color: #f8fafc;
897
+ }
898
+
899
+ .progress {
900
+ height: 0.375rem;
901
+ background-color: #f1f5f9;
902
+ border-radius: 9999px;
903
+ overflow: hidden;
904
+ margin-top: 0.625rem;
905
+ }
906
+
907
+ [data-mode="dark"] .progress {
908
+ background-color: #1e293b;
909
+ }
910
+
911
+ [data-ln-progress] {
912
+ height: 100%;
913
+ border-radius: 9999px;
914
+ background-color: #4f46e5;
915
+ transition: width 0.3s ease;
916
+ }
917
+
918
+ [data-ln-progress].success { background-color: #10b981; }
919
+ [data-ln-progress].warning { background-color: #f59e0b; }
920
+ [data-ln-progress].error { background-color: #ef4444; }
921
+
922
+ /* --------------------------------------------------------------------------
923
+ 7. Tables ([data-ln-table])
924
+ -------------------------------------------------------------------------- */
925
+ table, [data-ln-table] {
926
+ width: 100%;
927
+ border-collapse: collapse;
928
+ font-size: 0.875rem;
929
+ text-align: left;
930
+ }
931
+
932
+ table thead, [data-ln-table] thead {
933
+ background-color: #f8fafc;
934
+ border-bottom: 1px solid #e2e8f0;
935
+ }
936
+
937
+ [data-mode="dark"] table thead,
938
+ [data-mode="dark"] [data-ln-table] thead {
939
+ background-color: #1e293b;
940
+ border-bottom-color: #334155;
941
+ }
942
+
943
+ table th, [data-ln-table] th {
944
+ position: relative;
945
+ padding: 0.75rem 1rem;
946
+ font-size: 0.75rem;
947
+ font-weight: 600;
948
+ text-transform: uppercase;
949
+ letter-spacing: 0.05em;
950
+ color: #64748b;
951
+ vertical-align: middle;
952
+ white-space: nowrap;
953
+ }
954
+
955
+ [data-mode="dark"] table th,
956
+ [data-mode="dark"] [data-ln-table] th {
957
+ color: #94a3b8;
958
+ }
959
+
960
+ /* Allocate header space when sort and/or filter controls are present */
961
+ table th:has(:is([data-ln-sort], [data-ln-table-col-filter])),
962
+ [data-ln-table] th:has(:is([data-ln-sort], [data-ln-table-col-filter])) {
963
+ min-width: 6.25rem;
964
+ padding-inline-end: 2.75rem;
965
+ }
966
+
967
+ table th:has([data-ln-sort]):has([data-ln-table-col-filter]),
968
+ [data-ln-table] th:has([data-ln-sort]):has([data-ln-table-col-filter]) {
969
+ min-width: 8.5rem;
970
+ padding-inline-end: 4.5rem;
971
+ }
972
+
973
+ /* Position action buttons inside th */
974
+ table th [data-ln-table-col-filter],
975
+ table th [data-ln-sort],
976
+ [data-ln-table] th [data-ln-table-col-filter],
977
+ [data-ln-table] th [data-ln-sort] {
978
+ position: absolute;
979
+ top: 50%;
980
+ transform: translateY(-50%);
981
+ right: 0.75rem;
982
+ margin: 0;
983
+ }
984
+
985
+ /* When both sort and filter exist: sort button sits to the left of the filter button */
986
+ table th:has([data-ln-table-col-filter]) [data-ln-sort],
987
+ [data-ln-table] th:has([data-ln-table-col-filter]) [data-ln-sort] {
988
+ right: 2.5rem;
989
+ }
990
+
991
+ /* --------------------------------------------------------------------------
992
+ Table Column Sort ([data-ln-sort])
993
+ -------------------------------------------------------------------------- */
994
+ [data-ln-sort] {
995
+ display: inline-flex;
996
+ align-items: center;
997
+ list-style: none !important;
998
+ list-style-type: none !important;
999
+ margin: 0;
1000
+ padding: 0;
1001
+ vertical-align: middle;
1002
+ }
1003
+
1004
+ [data-ln-sort] li {
1005
+ list-style: none !important;
1006
+ list-style-type: none !important;
1007
+ margin: 0;
1008
+ padding: 0;
1009
+ display: contents;
1010
+ }
1011
+
1012
+ /* Base sort button styling — hidden by default so only active trigger shows */
1013
+ [data-ln-sort] button {
1014
+ display: none;
1015
+ width: 1.75rem;
1016
+ height: 1.75rem;
1017
+ padding: 0;
1018
+ border: none;
1019
+ background: transparent;
1020
+ box-shadow: none;
1021
+ border-radius: 9999px;
1022
+ cursor: pointer;
1023
+ color: #64748b;
1024
+ opacity: 0.45;
1025
+ transition: all 0.15s ease-in-out;
1026
+ align-items: center;
1027
+ justify-content: center;
1028
+ }
1029
+
1030
+ [data-mode="dark"] [data-ln-sort] button {
1031
+ color: #94a3b8;
1032
+ }
1033
+
1034
+ /* Hover reveals sort trigger button clearly */
1035
+ th:hover [data-ln-sort] button,
1036
+ [data-ln-table] th:hover [data-ln-sort] button {
1037
+ opacity: 0.75;
1038
+ }
1039
+
1040
+ [data-ln-sort] button:hover {
1041
+ opacity: 1 !important;
1042
+ background-color: rgba(79, 70, 229, 0.1);
1043
+ color: #4f46e5;
1044
+ }
1045
+
1046
+ [data-mode="dark"] [data-ln-sort] button:hover {
1047
+ background-color: rgba(129, 140, 248, 0.15);
1048
+ color: #818cf8;
1049
+ }
1050
+
1051
+ /* Active 3-trigger cycle display rules (circular cycle: none -> asc -> desc -> none) */
1052
+ [data-ln-sort]:not([data-ln-sort-state]) [data-ln-sort-dir="asc"],
1053
+ [data-ln-sort][data-ln-sort-state="none"] [data-ln-sort-dir="asc"],
1054
+ [data-ln-sort][data-ln-sort-state="asc"] [data-ln-sort-dir="desc"],
1055
+ [data-ln-sort][data-ln-sort-state="desc"] [data-ln-sort-dir="none"] {
1056
+ display: inline-flex;
1057
+ }
1058
+
1059
+ /* When column is sorted (asc or desc), highlight the button */
1060
+ [data-ln-sort][data-ln-sort-state="asc"] button,
1061
+ [data-ln-sort][data-ln-sort-state="desc"] button {
1062
+ opacity: 1;
1063
+ color: #4f46e5;
1064
+ }
1065
+
1066
+ [data-mode="dark"] [data-ln-sort][data-ln-sort-state="asc"] button,
1067
+ [data-mode="dark"] [data-ln-sort][data-ln-sort-state="desc"] button {
1068
+ color: #818cf8;
1069
+ }
1070
+
1071
+ [data-ln-sort] .ln-icon {
1072
+ width: 1.125rem;
1073
+ height: 1.125rem;
1074
+ }
1075
+
1076
+ /* --------------------------------------------------------------------------
1077
+ Table Column Filter Button ([data-ln-table-col-filter])
1078
+ -------------------------------------------------------------------------- */
1079
+ [data-ln-table-col-filter] {
1080
+ width: 1.75rem;
1081
+ height: 1.75rem;
1082
+ display: inline-flex;
1083
+ align-items: center;
1084
+ justify-content: center;
1085
+ padding: 0;
1086
+ border: none;
1087
+ background: transparent;
1088
+ box-shadow: none;
1089
+ border-radius: 9999px;
1090
+ cursor: pointer;
1091
+ color: #64748b;
1092
+ opacity: 0.45;
1093
+ transition: all 0.15s ease-in-out;
1094
+ vertical-align: middle;
1095
+ position: relative;
1096
+ }
1097
+
1098
+ [data-mode="dark"] [data-ln-table-col-filter] {
1099
+ color: #94a3b8;
1100
+ }
1101
+
1102
+ th:hover [data-ln-table-col-filter],
1103
+ [data-ln-table] th:hover [data-ln-table-col-filter] {
1104
+ opacity: 0.75;
1105
+ }
1106
+
1107
+ [data-ln-table-col-filter]:hover {
1108
+ opacity: 1 !important;
1109
+ background-color: rgba(79, 70, 229, 0.1);
1110
+ color: #4f46e5;
1111
+ }
1112
+
1113
+ [data-mode="dark"] [data-ln-table-col-filter]:hover {
1114
+ background-color: rgba(129, 140, 248, 0.15);
1115
+ color: #818cf8;
1116
+ }
1117
+
1118
+ /* Active filter state indicator */
1119
+ [data-ln-table-col-filter].ln-filter-active {
1120
+ opacity: 1;
1121
+ color: #4f46e5;
1122
+ }
1123
+
1124
+ [data-mode="dark"] [data-ln-table-col-filter].ln-filter-active {
1125
+ color: #818cf8;
1126
+ }
1127
+
1128
+ [data-ln-table-col-filter].ln-filter-active::after {
1129
+ content: '';
1130
+ position: absolute;
1131
+ top: 0.125rem;
1132
+ right: 0.125rem;
1133
+ width: 0.375rem;
1134
+ height: 0.375rem;
1135
+ border-radius: 9999px;
1136
+ background-color: #4f46e5;
1137
+ }
1138
+
1139
+ [data-mode="dark"] [data-ln-table-col-filter].ln-filter-active::after {
1140
+ background-color: #818cf8;
1141
+ }
1142
+
1143
+ [data-ln-table-col-filter] .ln-icon {
1144
+ width: 1.125rem;
1145
+ height: 1.125rem;
1146
+ }
1147
+
1148
+ table td, [data-ln-table] td {
1149
+ padding: 0.875rem 1rem;
1150
+ border-bottom: 1px solid #f1f5f9;
1151
+ color: #334155;
1152
+ }
1153
+
1154
+ [data-mode="dark"] table td,
1155
+ [data-mode="dark"] [data-ln-table] td {
1156
+ border-bottom-color: #1e293b;
1157
+ color: #cbd5e1;
1158
+ }
1159
+
1160
+ table tbody tr:hover td,
1161
+ [data-ln-table] tbody tr:hover td {
1162
+ background-color: rgba(248, 250, 252, 0.75);
1163
+ }
1164
+
1165
+ [data-mode="dark"] table tbody tr:hover td,
1166
+ [data-mode="dark"] [data-ln-table] tbody tr:hover td {
1167
+ background-color: rgba(30, 41, 59, 0.5);
1168
+ }
1169
+
1170
+ /* Table Checkbox & Row Selection */
1171
+ table input[type="checkbox"],
1172
+ [data-ln-table] input[type="checkbox"] {
1173
+ accent-color: #4f46e5;
1174
+ cursor: pointer;
1175
+ width: 1rem;
1176
+ height: 1rem;
1177
+ border-radius: 0.25rem;
1178
+ vertical-align: middle;
1179
+ }
1180
+
1181
+ table tbody tr.selected td,
1182
+ table tbody tr.ln-row-selected td,
1183
+ table tbody tr:has(input[type="checkbox"]:checked) td,
1184
+ [data-ln-table] tbody tr.selected td,
1185
+ [data-ln-table] tbody tr.ln-row-selected td,
1186
+ [data-ln-table] tbody tr:has(input[type="checkbox"]:checked) td {
1187
+ background-color: rgba(79, 70, 229, 0.08);
1188
+ }
1189
+
1190
+ [data-mode="dark"] table tbody tr.selected td,
1191
+ [data-mode="dark"] table tbody tr.ln-row-selected td,
1192
+ [data-mode="dark"] table tbody tr:has(input[type="checkbox"]:checked) td,
1193
+ [data-mode="dark"] [data-ln-table] tbody tr.selected td,
1194
+ [data-mode="dark"] [data-ln-table] tbody tr.ln-row-selected td,
1195
+ [data-mode="dark"] [data-ln-table] tbody tr:has(input[type="checkbox"]:checked) td {
1196
+ background-color: rgba(129, 140, 248, 0.15);
1197
+ }
1198
+
1199
+ /* Table Row Actions */
1200
+ td:has(.table-row-actions) {
1201
+ position: relative;
1202
+ }
1203
+
1204
+ .table-row-actions {
1205
+ display: flex;
1206
+ align-items: center;
1207
+ gap: 0.5rem;
1208
+ position: absolute;
1209
+ right: 1rem;
1210
+ top: 50%;
1211
+ transform: translateY(-50%);
1212
+ opacity: 0;
1213
+ pointer-events: none;
1214
+ visibility: hidden;
1215
+ transition: opacity 0.15s ease-in-out, visibility 0.15s;
1216
+ }
1217
+
1218
+ tr:hover .table-row-actions {
1219
+ opacity: 1;
1220
+ pointer-events: auto;
1221
+ visibility: visible;
1222
+ }
1223
+
1224
+ .ln-table__toolbar,
1225
+ [data-ln-table] > header {
1226
+ display: flex;
1227
+ align-items: center;
1228
+ justify-content: space-between;
1229
+ gap: 0.75rem;
1230
+ padding: 0.75rem 1rem;
1231
+ border-bottom: 1px solid #e2e8f0;
1232
+ background-color: #ffffff;
1233
+ }
1234
+
1235
+ [data-mode="dark"] .ln-table__toolbar,
1236
+ [data-mode="dark"] [data-ln-table] > header {
1237
+ border-bottom-color: #334155;
1238
+ background-color: #0f172a;
1239
+ }
1240
+
1241
+ /* Unified search pill/box for search inputs in table toolbar */
1242
+ /* Unified search pill/box for search inputs in table toolbar */
1243
+ .ln-table__toolbar search,
1244
+ .ln-table__toolbar label:has(> input[type="search"]) {
1245
+ display: inline-flex;
1246
+ align-items: center;
1247
+ gap: 0.375rem;
1248
+ padding: 0.3125rem 0.625rem;
1249
+ background-color: #ffffff;
1250
+ border: 1px solid #cbd5e1;
1251
+ border-radius: 0.5rem;
1252
+ box-shadow: 0 1px 2px #0000000d;
1253
+ transition: all 0.15s ease-in-out;
1254
+ color: #64748b;
1255
+ width: 16rem;
1256
+ max-width: 24rem;
1257
+ box-sizing: border-box;
1258
+ }
1259
+
1260
+ [data-mode="dark"] .ln-table__toolbar search,
1261
+ [data-mode="dark"] .ln-table__toolbar label:has(> input[type="search"]) {
1262
+ background-color: #0f172a;
1263
+ border-color: #334155;
1264
+ color: #94a3b8;
1265
+ }
1266
+
1267
+ .ln-table__toolbar search:focus-within {
1268
+ border-color: #4f46e5;
1269
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);
1270
+ }
1271
+
1272
+ [data-mode="dark"] .ln-table__toolbar search:focus-within {
1273
+ border-color: #818cf8;
1274
+ box-shadow: 0 0 0 3px rgba(129, 140, 248, 0.2);
1275
+ }
1276
+
1277
+ .ln-table__toolbar search > .ln-icon,
1278
+ search:has(> input[type="search"]) > .ln-icon {
1279
+ width: 1rem;
1280
+ height: 1rem;
1281
+ flex-shrink: 0;
1282
+ color: #64748b;
1283
+ }
1284
+
1285
+ [data-mode="dark"] .ln-table__toolbar search > .ln-icon,
1286
+ [data-mode="dark"] search:has(> input[type="search"]) > .ln-icon {
1287
+ color: #94a3b8;
1288
+ }
1289
+
1290
+ .ln-table__toolbar search > input,
1291
+ .ln-table__toolbar search input[type="search"],
1292
+ search:has(> input[type="search"]) > input {
1293
+ border: none !important;
1294
+ outline: none !important;
1295
+ background: transparent !important;
1296
+ box-shadow: none !important;
1297
+ padding: 0.125rem 0.25rem !important;
1298
+ font-size: 0.8125rem !important;
1299
+ color: #0f172a !important;
1300
+ flex: 1 1 0% !important;
1301
+ min-width: 0 !important;
1302
+ width: 100% !important;
1303
+ }
1304
+
1305
+ [data-mode="dark"] .ln-table__toolbar search > input,
1306
+ [data-mode="dark"] .ln-table__toolbar search input[type="search"],
1307
+ [data-mode="dark"] search:has(> input[type="search"]) > input {
1308
+ color: #f8fafc !important;
1309
+ }
1310
+
1311
+ /* Clear search button inside search */
1312
+ search button[data-ln-search-clear],
1313
+ .app-sidebar header search button[data-ln-search-clear],
1314
+ .ln-table__toolbar button[data-ln-search-clear] {
1315
+ display: inline-flex;
1316
+ align-items: center;
1317
+ justify-content: center;
1318
+ width: 1.25rem;
1319
+ height: 1.25rem;
1320
+ padding: 0;
1321
+ border: none;
1322
+ background: transparent;
1323
+ box-shadow: none;
1324
+ border-radius: 9999px;
1325
+ color: #94a3b8;
1326
+ cursor: pointer;
1327
+ flex-shrink: 0;
1328
+ margin-left: auto;
1329
+ transition: all 0.15s;
1330
+ }
1331
+
1332
+ search button[data-ln-search-clear]:hover,
1333
+ .app-sidebar header search button[data-ln-search-clear]:hover,
1334
+ .ln-table__toolbar button[data-ln-search-clear]:hover {
1335
+ color: #0f172a;
1336
+ background-color: #e2e8f0;
1337
+ }
1338
+
1339
+ [data-mode="dark"] search button[data-ln-search-clear]:hover,
1340
+ [data-mode="dark"] .app-sidebar header search button[data-ln-search-clear]:hover,
1341
+ [data-mode="dark"] .ln-table__toolbar button[data-ln-search-clear]:hover {
1342
+ color: #f8fafc;
1343
+ background-color: #334155;
1344
+ }
1345
+
1346
+ search button[data-ln-search-clear] .ln-icon,
1347
+ .app-sidebar header search button[data-ln-search-clear] .ln-icon,
1348
+ .ln-table__toolbar button[data-ln-search-clear] .ln-icon {
1349
+ width: 0.875rem;
1350
+ height: 0.875rem;
1351
+ }
1352
+
1353
+ /* Hide clear button when input is empty / placeholder is shown */
1354
+ search:has(> input:placeholder-shown) button[data-ln-search-clear],
1355
+ search > input:placeholder-shown ~ button[data-ln-search-clear],
1356
+ .app-sidebar header search > input:placeholder-shown ~ button[data-ln-search-clear] {
1357
+ visibility: hidden;
1358
+ opacity: 0;
1359
+ pointer-events: none;
1360
+ }
1361
+
1362
+ /* Table footer */
1363
+ .ln-table__footer,
1364
+ [data-ln-table] > footer {
1365
+ display: flex;
1366
+ align-items: center;
1367
+ justify-content: space-between;
1368
+ padding: 0.75rem 1rem;
1369
+ border-top: 1px solid #e2e8f0;
1370
+ background-color: #f8fafc;
1371
+ font-size: 0.8125rem;
1372
+ color: #64748b;
1373
+ }
1374
+
1375
+ [data-mode="dark"] .ln-table__footer,
1376
+ [data-mode="dark"] [data-ln-table] > footer {
1377
+ border-top-color: #334155;
1378
+ background-color: #1e293b;
1379
+ color: #94a3b8;
1380
+ }
1381
+
1382
+ /* --------------------------------------------------------------------------
1383
+ 8. Forms & Inputs ([data-ln-form])
1384
+ -------------------------------------------------------------------------- */
1385
+ #demo-form-grid,
1386
+ #demo-auto-submit,
1387
+ #demo-input-states,
1388
+ #demo-select-textarea,
1389
+ #demo-focus-ring,
1390
+ #demo-focus-border-thicken,
1391
+ #demo-focus-combination,
1392
+ #demo-focus-background-shift,
1393
+ #demo-focus-accent-line,
1394
+ #demo-focus-inset-shadow,
1395
+ [id^="demo-focus-"],
1396
+ .form-grid {
1397
+ display: grid;
1398
+ grid-template-columns: repeat(6, minmax(0, 1fr));
1399
+ gap: 1rem;
1400
+ }
1401
+
1402
+ #demo-form-grid .form-element,
1403
+ #demo-auto-submit .form-element,
1404
+ #demo-input-states .form-element,
1405
+ #demo-select-textarea .form-element,
1406
+ [id^="demo-focus-"] .form-element,
1407
+ .form-grid .form-element {
1408
+ grid-column: span 3;
1409
+ }
1410
+
1411
+ #demo-form-grid .form-element:nth-child(8),
1412
+ #demo-form-grid .form-element:nth-child(10),
1413
+ #demo-form-grid > fieldset,
1414
+ #demo-form-grid .form-actions,
1415
+ [id^="demo-focus-"] .form-actions,
1416
+ .form-grid > fieldset,
1417
+ .form-grid .form-actions {
1418
+ grid-column: span 6;
1419
+ }
1420
+
1421
+ @media (max-width: 640px) {
1422
+ #demo-form-grid,
1423
+ #demo-auto-submit,
1424
+ #demo-input-states,
1425
+ #demo-select-textarea,
1426
+ [id^="demo-focus-"],
1427
+ .form-grid {
1428
+ grid-template-columns: 1fr;
1429
+ }
1430
+ #demo-form-grid .form-element,
1431
+ #demo-auto-submit .form-element,
1432
+ #demo-input-states .form-element,
1433
+ #demo-select-textarea .form-element,
1434
+ [id^="demo-focus-"] .form-element,
1435
+ .form-grid .form-element {
1436
+ grid-column: span 1;
1437
+ }
1438
+ }
1439
+
1440
+ input[type="text"],
1441
+ input[type="search"],
1442
+ input[type="email"],
1443
+ input[type="password"],
1444
+ input[type="number"],
1445
+ input[type="tel"],
1446
+ input[type="url"],
1447
+ select,
1448
+ textarea {
1449
+ display: block;
1450
+ width: 100%;
1451
+ padding: 0.5rem 0.75rem;
1452
+ font-size: 0.875rem;
1453
+ border-radius: 0.5rem;
1454
+ border: 1px solid #cbd5e1;
1455
+ background-color: #ffffff;
1456
+ color: #0f172a;
1457
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
1458
+ transition: all 0.15s ease;
1459
+ }
1460
+
1461
+ [data-mode="dark"] input[type="text"],
1462
+ [data-mode="dark"] input[type="search"],
1463
+ [data-mode="dark"] input[type="email"],
1464
+ [data-mode="dark"] input[type="password"],
1465
+ [data-mode="dark"] input[type="number"],
1466
+ [data-mode="dark"] select,
1467
+ [data-mode="dark"] textarea {
1468
+ background-color: #0f172a;
1469
+ border-color: #334155;
1470
+ color: #f8fafc;
1471
+ }
1472
+
1473
+ input:focus, select:focus, textarea:focus {
1474
+ outline: none;
1475
+ border-color: #4f46e5;
1476
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);
1477
+ }
1478
+
1479
+ label {
1480
+ display: block;
1481
+ font-size: 0.8125rem;
1482
+ font-weight: 500;
1483
+ color: #334155;
1484
+ margin-bottom: 0.375rem;
1485
+ }
1486
+
1487
+ [data-mode="dark"] label {
1488
+ color: #cbd5e1;
1489
+ }
1490
+
1491
+ /* --------------------------------------------------------------------------
1492
+ 9. Tabs Component ([data-ln-tabs])
1493
+ -------------------------------------------------------------------------- */
1494
+ [data-ln-tabs] nav ul {
1495
+ display: flex;
1496
+ border-bottom: 1px solid #e2e8f0;
1497
+ gap: 0.5rem;
1498
+ margin-bottom: 1rem;
1499
+ list-style: none;
1500
+ padding: 0;
1501
+ }
1502
+
1503
+ [data-mode="dark"] [data-ln-tabs] nav ul {
1504
+ border-bottom-color: #1e293b;
1505
+ }
1506
+
1507
+ [data-ln-tabs] nav a[data-ln-tab] {
1508
+ display: inline-flex;
1509
+ align-items: center;
1510
+ padding: 0.625rem 1rem;
1511
+ font-size: 0.875rem;
1512
+ font-weight: 500;
1513
+ color: #64748b;
1514
+ text-decoration: none;
1515
+ border-bottom: 2px solid transparent;
1516
+ margin-bottom: -1px;
1517
+ transition: all 0.15s ease;
1518
+ }
1519
+
1520
+ [data-ln-tabs] nav a[data-ln-tab]:hover {
1521
+ color: #0f172a;
1522
+ }
1523
+
1524
+ [data-mode="dark"] [data-ln-tabs] nav a[data-ln-tab]:hover {
1525
+ color: #f8fafc;
1526
+ }
1527
+
1528
+ [data-ln-tabs] nav a[data-ln-tab][aria-selected="true"] {
1529
+ color: #4f46e5;
1530
+ border-bottom-color: #4f46e5;
1531
+ font-weight: 600;
1532
+ }
1533
+
1534
+ [data-mode="dark"] [data-ln-tabs] nav a[data-ln-tab][aria-selected="true"] {
1535
+ color: #818cf8;
1536
+ border-bottom-color: #818cf8;
1537
+ }
1538
+
1539
+ /* --------------------------------------------------------------------------
1540
+ 10. Modals ([data-ln-modal])
1541
+ -------------------------------------------------------------------------- */
1542
+ [data-ln-modal]::backdrop {
1543
+ background-color: rgba(2, 6, 23, 0.5); /* slate-950/50 */
1544
+ backdrop-filter: blur(4px);
1545
+ }
1546
+
1547
+ [data-ln-modal] > form,
1548
+ [data-ln-modal] > .modal-container,
1549
+ [data-ln-modal] > article,
1550
+ [data-ln-modal] > section {
1551
+ background-color: #ffffff;
1552
+ border-radius: 1rem;
1553
+ border: 1px solid #e2e8f0;
1554
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
1555
+ max-width: 32rem;
1556
+ width: 90vw;
1557
+ max-height: 90vh;
1558
+ overflow: hidden;
1559
+ display: flex;
1560
+ flex-direction: column;
1561
+ }
1562
+
1563
+ [data-mode="dark"] [data-ln-modal] > form,
1564
+ [data-mode="dark"] [data-ln-modal] > .modal-container,
1565
+ [data-mode="dark"] [data-ln-modal] > article,
1566
+ [data-mode="dark"] [data-ln-modal] > section {
1567
+ background-color: #0f172a;
1568
+ border-color: #1e293b;
1569
+ color: #f8fafc;
1570
+ }
1571
+
1572
+ [data-ln-modal] header {
1573
+ display: flex;
1574
+ align-items: center;
1575
+ justify-content: space-between;
1576
+ padding: 1.125rem 1.25rem;
1577
+ border-bottom: 1px solid #f1f5f9;
1578
+ }
1579
+
1580
+ [data-mode="dark"] [data-ln-modal] header {
1581
+ border-bottom-color: #1e293b;
1582
+ }
1583
+
1584
+ [data-ln-modal] header h3 {
1585
+ margin: 0;
1586
+ font-size: 1.0625rem;
1587
+ font-weight: 600;
1588
+ color: #0f172a;
1589
+ }
1590
+
1591
+ [data-mode="dark"] [data-ln-modal] header h3 {
1592
+ color: #f8fafc;
1593
+ }
1594
+
1595
+ [data-ln-modal] header button[data-ln-modal-close] {
1596
+ border: none;
1597
+ background: transparent;
1598
+ color: #94a3b8;
1599
+ cursor: pointer;
1600
+ padding: 0.25rem;
1601
+ border-radius: 0.375rem;
1602
+ display: flex;
1603
+ align-items: center;
1604
+ justify-content: center;
1605
+ transition: all 0.15s ease;
1606
+ }
1607
+
1608
+ [data-ln-modal] header button[data-ln-modal-close]:hover {
1609
+ color: #0f172a;
1610
+ background-color: #f1f5f9;
1611
+ }
1612
+
1613
+ [data-mode="dark"] [data-ln-modal] header button[data-ln-modal-close]:hover {
1614
+ color: #ffffff;
1615
+ background-color: #1e293b;
1616
+ }
1617
+
1618
+ [data-ln-modal] main {
1619
+ padding: 1.25rem;
1620
+ overflow-y: auto;
1621
+ font-size: 0.875rem;
1622
+ color: #475569;
1623
+ line-height: 1.6;
1624
+ }
1625
+
1626
+ [data-mode="dark"] [data-ln-modal] main {
1627
+ color: #cbd5e1;
1628
+ }
1629
+
1630
+ [data-ln-modal] footer {
1631
+ display: flex;
1632
+ align-items: center;
1633
+ justify-content: flex-end;
1634
+ gap: 0.5rem;
1635
+ padding: 0.875rem 1.25rem;
1636
+ border-top: 1px solid #f1f5f9;
1637
+ background-color: #f8fafc;
1638
+ }
1639
+
1640
+ [data-mode="dark"] [data-ln-modal] footer {
1641
+ border-top-color: #1e293b;
1642
+ background-color: #0b1120;
1643
+ }
1644
+
1645
+ /* --------------------------------------------------------------------------
1646
+ 11. Toasts ([data-ln-toast])
1647
+ -------------------------------------------------------------------------- */
1648
+ ul[data-ln-toast] {
1649
+ position: fixed;
1650
+ bottom: 1.5rem;
1651
+ right: 1.5rem;
1652
+ z-index: 50;
1653
+ display: flex;
1654
+ flex-direction: column;
1655
+ gap: 0.5rem;
1656
+ list-style: none;
1657
+ padding: 0;
1658
+ margin: 0;
1659
+ pointer-events: none;
1660
+ }
1661
+
1662
+ ul[data-ln-toast] li[data-ln-toast-item],
1663
+ [data-ln-toast] > li {
1664
+ display: flex;
1665
+ align-items: stretch;
1666
+ min-width: 320px;
1667
+ max-width: 450px;
1668
+ gap: 0.75rem;
1669
+ padding: 0.875rem 1.25rem;
1670
+ background-color: #ffffff;
1671
+ border: 1px solid #e2e8f0;
1672
+ border-radius: 0.75rem;
1673
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
1674
+ font-size: 0.875rem;
1675
+ pointer-events: auto;
1676
+ animation: toast-slide-in 0.2s ease-out;
1677
+ }
1678
+
1679
+ [data-ln-toast] .content {
1680
+ flex: 1;
1681
+ display: flex;
1682
+ flex-direction: column;
1683
+ min-width: 0;
1684
+ }
1685
+
1686
+ [data-ln-toast] .content header {
1687
+ display: flex;
1688
+ align-items: center;
1689
+ justify-content: space-between;
1690
+ width: 100%;
1691
+ }
1692
+
1693
+ [data-mode="dark"] ul[data-ln-toast] li[data-ln-toast-item],
1694
+ [data-mode="dark"] [data-ln-toast] > li {
1695
+ background-color: #0f172a;
1696
+ border-color: #1e293b;
1697
+ color: #f8fafc;
1698
+ }
1699
+
1700
+ /* Demo Sidebar Toggle */
1701
+ .demo-toggle-sidebar {
1702
+ display: flex;
1703
+ gap: 1rem;
1704
+ min-height: 12rem;
1705
+ border: 1px solid #e2e8f0;
1706
+ border-radius: 0.5rem;
1707
+ overflow: hidden;
1708
+ }
1709
+
1710
+ .demo-toggle-sidebar aside {
1711
+ position: relative;
1712
+ padding: 1rem;
1713
+ background-color: #f8fafc;
1714
+ width: 12rem;
1715
+ border-right: 1px solid #e2e8f0;
1716
+ transition: all 0.2s ease;
1717
+ }
1718
+
1719
+ [data-mode="dark"] .demo-toggle-sidebar aside {
1720
+ background-color: #0b1120;
1721
+ border-right-color: #1e293b;
1722
+ }
1723
+
1724
+ .demo-toggle-sidebar aside:not(.open) {
1725
+ margin-left: -12rem;
1726
+ }
1727
+
1728
+ @keyframes toast-slide-in {
1729
+ from { transform: translateY(1rem); opacity: 0; }
1730
+ to { transform: translateY(0); opacity: 1; }
1731
+ }
1732
+
1733
+ /* --------------------------------------------------------------------------
1734
+ 12. Popovers, Pickers & Dropdowns
1735
+ -------------------------------------------------------------------------- */
1736
+ [data-ln-popover], [data-ln-dropdown] {
1737
+ background-color: #ffffff;
1738
+ border: 1px solid #e2e8f0;
1739
+ border-radius: 0.75rem;
1740
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
1741
+ padding: 0.5rem;
1742
+ z-index: 50;
1743
+ }
1744
+
1745
+ [data-mode="dark"] [data-ln-popover],
1746
+ [data-mode="dark"] [data-ln-dropdown] {
1747
+ background-color: #0f172a;
1748
+ border-color: #1e293b;
1749
+ }
1750
+
1751
+ [data-ln-popover] ul, [data-ln-dropdown] ul {
1752
+ list-style: none;
1753
+ padding: 0;
1754
+ margin: 0;
1755
+ display: flex;
1756
+ flex-direction: column;
1757
+ gap: 0.125rem;
1758
+ }
1759
+
1760
+ [data-ln-popover] button, [data-ln-dropdown] button {
1761
+ width: 100%;
1762
+ justify-content: flex-start;
1763
+ padding: 0.375rem 0.625rem;
1764
+ font-size: 0.8125rem;
1765
+ border: none;
1766
+ background: transparent;
1767
+ box-shadow: none;
1768
+ border-radius: 0.375rem;
1769
+ color: inherit;
1770
+ }
1771
+
1772
+ [data-ln-popover] button:hover, [data-ln-dropdown] button:hover {
1773
+ background-color: #f1f5f9;
1774
+ }
1775
+
1776
+ [data-mode="dark"] [data-ln-popover] button:hover,
1777
+ [data-mode="dark"] [data-ln-dropdown] button:hover {
1778
+ background-color: #1e293b;
1779
+ }
1780
+
1781
+ /* Popover Filter List Items & Labels */
1782
+ [data-ln-popover] ul[data-ln-filter],
1783
+ [data-ln-dropdown] ul[data-ln-filter] {
1784
+ min-width: 10rem;
1785
+ }
1786
+
1787
+ [data-ln-popover] ul[data-ln-filter] li,
1788
+ [data-ln-dropdown] ul[data-ln-filter] li {
1789
+ margin: 0;
1790
+ padding: 0;
1791
+ }
1792
+
1793
+ [data-ln-popover] label,
1794
+ [data-ln-dropdown] label {
1795
+ display: flex;
1796
+ align-items: center;
1797
+ gap: 0.5rem;
1798
+ padding: 0.375rem 0.625rem;
1799
+ border-radius: 0.375rem;
1800
+ font-size: 0.8125rem;
1801
+ font-weight: 500;
1802
+ color: #475569;
1803
+ cursor: pointer;
1804
+ margin-bottom: 0;
1805
+ transition: all 0.15s;
1806
+ user-select: none;
1807
+ }
1808
+
1809
+ [data-ln-popover] label:hover,
1810
+ [data-ln-dropdown] label:hover {
1811
+ background-color: #f1f5f9;
1812
+ color: #0f172a;
1813
+ }
1814
+
1815
+ [data-mode="dark"] [data-ln-popover] label,
1816
+ [data-mode="dark"] [data-ln-dropdown] label {
1817
+ color: #94a3b8;
1818
+ }
1819
+
1820
+ [data-mode="dark"] [data-ln-popover] label:hover,
1821
+ [data-mode="dark"] [data-ln-dropdown] label:hover {
1822
+ background-color: #1e293b;
1823
+ color: #f8fafc;
1824
+ }
1825
+
1826
+ [data-ln-popover] label:has(> input:checked),
1827
+ [data-ln-dropdown] label:has(> input:checked) {
1828
+ background-color: #eef2ff;
1829
+ color: #4f46e5;
1830
+ font-weight: 600;
1831
+ }
1832
+
1833
+ [data-mode="dark"] [data-ln-popover] label:has(> input:checked),
1834
+ [data-mode="dark"] [data-ln-dropdown] label:has(> input:checked) {
1835
+ background-color: rgba(79, 70, 229, 0.2);
1836
+ color: #818cf8;
1837
+ }
1838
+
1839
+ [data-ln-popover] input[type="checkbox"],
1840
+ [data-ln-dropdown] input[type="checkbox"] {
1841
+ accent-color: #4f46e5;
1842
+ width: 1rem;
1843
+ height: 1rem;
1844
+ border-radius: 0.25rem;
1845
+ cursor: pointer;
1846
+ vertical-align: middle;
1847
+ margin: 0;
1848
+ }
1849
+
1850
+ /* --------------------------------------------------------------------------
1851
+ 13. Code Inspector Collapsible Panel
1852
+ -------------------------------------------------------------------------- */
1853
+ .demo-code-container {
1854
+ border-top: 1px solid #e2e8f0;
1855
+ background-color: #f8fafc;
1856
+ }
1857
+
1858
+ [data-mode="dark"] .demo-code-container {
1859
+ border-top-color: #1e293b;
1860
+ background-color: #0b1120;
1861
+ }
1862
+
1863
+ .demo-code-header {
1864
+ display: flex;
1865
+ align-items: center;
1866
+ justify-content: space-between;
1867
+ padding: 0.5rem 1rem;
1868
+ border-bottom: 1px solid #e2e8f0;
1869
+ font-size: 0.75rem;
1870
+ }
1871
+
1872
+ [data-mode="dark"] .demo-code-header {
1873
+ border-bottom-color: #1e293b;
1874
+ }
1875
+
1876
+ .demo-code-title {
1877
+ font-weight: 600;
1878
+ color: #64748b;
1879
+ text-transform: uppercase;
1880
+ letter-spacing: 0.05em;
1881
+ }
1882
+
1883
+ .btn-copy-code {
1884
+ display: inline-flex;
1885
+ align-items: center;
1886
+ gap: 0.375rem;
1887
+ padding: 0.25rem 0.5rem;
1888
+ font-size: 0.75rem;
1889
+ border-radius: 0.375rem;
1890
+ border: 1px solid #cbd5e1;
1891
+ background-color: #ffffff;
1892
+ color: #475569;
1893
+ cursor: pointer;
1894
+ }
1895
+
1896
+ [data-mode="dark"] .btn-copy-code {
1897
+ background-color: #1e293b;
1898
+ border-color: #334155;
1899
+ color: #cbd5e1;
1900
+ }
1901
+
1902
+ .demo-code-body pre {
1903
+ margin: 0;
1904
+ padding: 1rem;
1905
+ font-size: 0.75rem;
1906
+ line-height: 1.6;
1907
+ overflow-x: auto;
1908
+ }
1909
+
1910
+ /* --------------------------------------------------------------------------
1911
+ 14. Empty State ([data-ln-empty-state])
1912
+ -------------------------------------------------------------------------- */
1913
+ [data-ln-empty-state] {
1914
+ display: flex;
1915
+ flex-direction: column;
1916
+ align-items: center;
1917
+ justify-content: center;
1918
+ gap: 1rem;
1919
+ padding: 2rem;
1920
+ text-align: center;
1921
+ max-width: 28rem;
1922
+ margin-inline: auto;
1923
+ }
1924
+
1925
+ [data-ln-empty-state] svg.ln-icon,
1926
+ [data-ln-empty-state] svg.ln-icon--xl {
1927
+ width: 4rem;
1928
+ height: 4rem;
1929
+ color: #64748b;
1930
+ }
1931
+
1932
+ [data-mode="dark"] [data-ln-empty-state] svg.ln-icon,
1933
+ [data-mode="dark"] [data-ln-empty-state] svg.ln-icon--xl {
1934
+ color: #94a3b8;
1935
+ }
1936
+
1937
+ [data-ln-empty-state] h3 {
1938
+ margin: 0;
1939
+ font-size: 1.125rem;
1940
+ font-weight: 600;
1941
+ color: #0f172a;
1942
+ }
1943
+
1944
+ [data-mode="dark"] [data-ln-empty-state] h3 {
1945
+ color: #f8fafc;
1946
+ }
1947
+
1948
+ [data-ln-empty-state] p {
1949
+ margin: 0;
1950
+ font-size: 0.875rem;
1951
+ color: #64748b;
1952
+ }
1953
+
1954
+ [data-mode="dark"] [data-ln-empty-state] p {
1955
+ color: #94a3b8;
1956
+ }
1957
+
1958
+ [data-ln-empty-state] button,
1959
+ [data-ln-empty-state] a {
1960
+ margin-top: 0.5rem;
1961
+ }
1962
+
1963
+ #demo-empty-variants {
1964
+ display: grid;
1965
+ grid-template-columns: 1fr;
1966
+ gap: 1.5rem;
1967
+ }
1968
+
1969
+ @media (min-width: 768px) {
1970
+ #demo-empty-variants {
1971
+ grid-template-columns: repeat(2, 1fr);
1972
+ }
1973
+ }
1974
+
1975
+ /* --------------------------------------------------------------------------
1976
+ 15. Prose (.prose)
1977
+ -------------------------------------------------------------------------- */
1978
+ .prose {
1979
+ max-width: 65ch;
1980
+ }
1981
+
1982
+ /* --------------------------------------------------------------------------
1983
+ 16. Layout Grids & Scoped Wrappers
1984
+ -------------------------------------------------------------------------- */
1985
+ .grid-2 {
1986
+ display: grid;
1987
+ grid-template-columns: repeat(1, minmax(0, 1fr));
1988
+ gap: 1.5rem;
1989
+ }
1990
+
1991
+ @media (min-width: 768px) {
1992
+ .grid-2 {
1993
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1994
+ }
1995
+ }
1996
+
1997
+ .grid-4 {
1998
+ display: grid;
1999
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2000
+ gap: 1.5rem;
2001
+ }
2002
+
2003
+ @media (min-width: 768px) {
2004
+ .grid-4 {
2005
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2006
+ }
2007
+ }
2008
+
2009
+ @media (min-width: 1024px) {
2010
+ .grid-4 {
2011
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2012
+ }
2013
+ }
2014
+
2015
+ #demo-input-components {
2016
+ display: grid;
2017
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2018
+ gap: 1.5rem;
2019
+ }
2020
+
2021
+ @media (min-width: 768px) {
2022
+ #demo-input-components {
2023
+ grid-template-columns: repeat(2, 1fr);
2024
+ }
2025
+ }
2026
+
2027
+ [data-ln-picklist] {
2028
+ display: grid;
2029
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2030
+ gap: 1rem;
2031
+ }
2032
+
2033
+ @media (min-width: 768px) {
2034
+ [data-ln-picklist] {
2035
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2036
+ }
2037
+ }
2038
+
2039
+ .ph-wrap--narrow {
2040
+ max-width: 600px;
2041
+ }
2042
+
2043
+ .demo-number-cards,
2044
+ .demo-date-cards {
2045
+ display: flex;
2046
+ flex-wrap: wrap;
2047
+ gap: 1rem;
2048
+ margin-top: 0.5rem;
2049
+ }
2050
+
2051
+ .demo-number-cards .card,
2052
+ .demo-date-cards .card {
2053
+ flex: 1 1 14rem;
2054
+ }
2055
+
2056
+ /* --------------------------------------------------------------------------
2057
+ 17. Circular Progress ([data-ln-circular-progress])
2058
+ -------------------------------------------------------------------------- */
2059
+ [data-ln-circular-progress] {
2060
+ position: relative;
2061
+ display: inline-flex;
2062
+ align-items: center;
2063
+ justify-content: center;
2064
+ width: 4rem;
2065
+ height: 4rem;
2066
+ }
2067
+
2068
+ [data-ln-circular-progress] svg {
2069
+ width: 100%;
2070
+ height: 100%;
2071
+ }
2072
+
2073
+ [data-ln-circular-progress].sm {
2074
+ width: 2.5rem;
2075
+ height: 2.5rem;
2076
+ }
2077
+
2078
+ [data-ln-circular-progress].lg {
2079
+ width: 6rem;
2080
+ height: 6rem;
2081
+ }
2082
+
2083
+ [data-ln-circular-progress].xl {
2084
+ width: 8rem;
2085
+ height: 8rem;
2086
+ }
2087
+
2088
+ [data-ln-circular-progress] .ln-circular-progress__track {
2089
+ stroke: #e2e8f0;
2090
+ }
2091
+
2092
+ [data-mode="dark"] [data-ln-circular-progress] .ln-circular-progress__track {
2093
+ stroke: #334155;
2094
+ }
2095
+
2096
+ [data-ln-circular-progress] .ln-circular-progress__fill {
2097
+ stroke: #4f46e5;
2098
+ transition: stroke-dashoffset 0.2s ease;
2099
+ }
2100
+
2101
+ [data-ln-circular-progress].success .ln-circular-progress__fill {
2102
+ stroke: #10b981;
2103
+ }
2104
+
2105
+ [data-ln-circular-progress].warning .ln-circular-progress__fill {
2106
+ stroke: #f59e0b;
2107
+ }
2108
+
2109
+ [data-ln-circular-progress].error .ln-circular-progress__fill {
2110
+ stroke: #ef4444;
2111
+ }
2112
+
2113
+ [data-ln-circular-progress] .ln-circular-progress__label {
2114
+ position: absolute;
2115
+ font-size: 0.75rem;
2116
+ font-weight: 600;
2117
+ color: #0f172a;
2118
+ }
2119
+
2120
+ [data-mode="dark"] [data-ln-circular-progress] .ln-circular-progress__label {
2121
+ color: #f8fafc;
2122
+ }
2123
+
2124
+ [data-ln-circular-progress].sm .ln-circular-progress__label {
2125
+ font-size: 0.625rem;
2126
+ line-height: 0.75rem;
2127
+ }
2128
+
2129
+ [data-ln-circular-progress].lg .ln-circular-progress__label {
2130
+ font-size: 1rem;
2131
+ }
2132
+
2133
+ [data-ln-circular-progress].xl .ln-circular-progress__label {
2134
+ font-size: 1.25rem;
2135
+ }
2136
+
2137
+ /* --------------------------------------------------------------------------
2138
+ 18. List & Virtual Scroll Container (#hybrid-list)
2139
+ -------------------------------------------------------------------------- */
2140
+ #hybrid-list {
2141
+ height: 400px;
2142
+ overflow-y: auto;
2143
+ border: 1px solid #cbd5e1;
2144
+ padding: 1rem;
2145
+ background: #f8fafc;
2146
+ list-style: none;
2147
+ border-radius: 0.5rem;
2148
+ margin-block: 1rem;
2149
+ display: grid;
2150
+ grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
2151
+ gap: 1rem;
2152
+ align-content: start;
2153
+ }
2154
+
2155
+ [data-mode="dark"] #hybrid-list {
2156
+ border-color: #334155;
2157
+ background: #0b1120;
2158
+ }
2159
+
2160
+ #hybrid-list > li {
2161
+ display: flex;
2162
+ flex-direction: column;
2163
+ gap: 0.25rem;
2164
+ padding: 1rem;
2165
+ overflow: hidden;
2166
+ height: 9rem;
2167
+ margin-block: 0;
2168
+ background: #ffffff;
2169
+ border: 1px solid #e2e8f0;
2170
+ border-radius: 0.375rem;
2171
+ }
2172
+
2173
+ [data-mode="dark"] #hybrid-list > li {
2174
+ background: #0f172a;
2175
+ border-color: #334155;
2176
+ }
2177
+
2178
+ #hybrid-list > li > header.card-tile-top {
2179
+ display: flex;
2180
+ align-items: center;
2181
+ justify-content: space-between;
2182
+ gap: 0.5rem;
2183
+ }
2184
+
2185
+ #hybrid-list > li > footer.card-tile-actions {
2186
+ display: flex;
2187
+ margin-top: auto;
2188
+ justify-content: flex-end;
2189
+ }
2190
+
2191
+ #hybrid-list .ln-list__spacer {
2192
+ padding: 0;
2193
+ border: none;
2194
+ margin: 0;
2195
+ background: none;
2196
+ box-shadow: none;
2197
+ height: auto;
2198
+ }