@lancar/lxui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/LICENSE +21 -0
  3. package/README.md +5072 -0
  4. package/css/base/reset.css +91 -0
  5. package/css/base/tokens-extended.css +119 -0
  6. package/css/base/tokens.css +105 -0
  7. package/css/base/typography.css +35 -0
  8. package/css/base/utils.css +26 -0
  9. package/css/components/accordion.css +25 -0
  10. package/css/components/alert.css +22 -0
  11. package/css/components/animations.css +26 -0
  12. package/css/components/avatar.css +38 -0
  13. package/css/components/back-top.css +32 -0
  14. package/css/components/badge.css +37 -0
  15. package/css/components/breadcrumb.css +13 -0
  16. package/css/components/button.css +103 -0
  17. package/css/components/callout.css +20 -0
  18. package/css/components/card.css +42 -0
  19. package/css/components/carousel.css +31 -0
  20. package/css/components/chip.css +52 -0
  21. package/css/components/code-block.css +22 -0
  22. package/css/components/collapse.css +6 -0
  23. package/css/components/compat.css +27 -0
  24. package/css/components/dark-mode.css +35 -0
  25. package/css/components/divider.css +36 -0
  26. package/css/components/dropdown.css +39 -0
  27. package/css/components/empty.css +34 -0
  28. package/css/components/fab.css +28 -0
  29. package/css/components/file-drop.css +47 -0
  30. package/css/components/forms.css +107 -0
  31. package/css/components/kbd.css +5 -0
  32. package/css/components/list-group.css +17 -0
  33. package/css/components/modal.css +50 -0
  34. package/css/components/nav.css +25 -0
  35. package/css/components/navbar.css +44 -0
  36. package/css/components/number-input.css +52 -0
  37. package/css/components/offcanvas.css +25 -0
  38. package/css/components/pagination.css +17 -0
  39. package/css/components/popover.css +12 -0
  40. package/css/components/progress.css +26 -0
  41. package/css/components/rating.css +28 -0
  42. package/css/components/section.css +18 -0
  43. package/css/components/skeleton.css +19 -0
  44. package/css/components/spinner.css +38 -0
  45. package/css/components/stat.css +58 -0
  46. package/css/components/steps.css +76 -0
  47. package/css/components/table.css +29 -0
  48. package/css/components/tag.css +29 -0
  49. package/css/components/timeline.css +11 -0
  50. package/css/components/toast.css +14 -0
  51. package/css/components/toggler.css +20 -0
  52. package/css/components/tooltip.css +10 -0
  53. package/css/index.css +59 -0
  54. package/css/layout/grid.css +71 -0
  55. package/css/layout/utilities.css +257 -0
  56. package/js/breakpoint.js +13 -0
  57. package/js/carousel.js +62 -0
  58. package/js/clipboard.js +28 -0
  59. package/js/collapse.js +36 -0
  60. package/js/counter.js +38 -0
  61. package/js/dropdown.js +27 -0
  62. package/js/index.js +19 -0
  63. package/js/init.js +89 -0
  64. package/js/modal.js +44 -0
  65. package/js/number-input.js +44 -0
  66. package/js/offcanvas.js +28 -0
  67. package/js/popover.js +39 -0
  68. package/js/rating.js +39 -0
  69. package/js/scrollspy.js +24 -0
  70. package/js/tab.js +18 -0
  71. package/js/theme.js +9 -0
  72. package/js/toast.js +73 -0
  73. package/js/tooltip.js +39 -0
  74. package/js/utils.js +20 -0
  75. package/lx-grid.min.css +2 -0
  76. package/lx-utilities.min.css +2 -0
  77. package/lxeditor.min.css +2 -0
  78. package/lxfonts.min.css +2 -0
  79. package/lxicons.min.css +2 -0
  80. package/lxmarked.js +276 -0
  81. package/lxthemes.min.css +2 -0
  82. package/lxui.bundle.js +540 -0
  83. package/lxui.bundle.min.js +13 -0
  84. package/lxui.css +2163 -0
  85. package/lxui.esm.js +669 -0
  86. package/lxui.esm.min.js +8 -0
  87. package/lxui.js +859 -0
  88. package/lxui.min.css +2 -0
  89. package/lxui.min.js +7 -0
  90. package/lxui.rtl.css +2466 -0
  91. package/lxui.rtl.min.css +2 -0
  92. package/marked.min.js +69 -0
  93. package/package.json +183 -0
  94. package/types/index.d.ts +284 -0
package/lxui.css ADDED
@@ -0,0 +1,2163 @@
1
+ /* ================================================================
2
+ * LxUI v1.0.0 — Modern CSS Framework
3
+ * https://ui.lancar.id
4
+ * CDN: https://cdn.lancar.id/ui/lxui.min.css
5
+ * Copyright (c) 2025 lancar.id — MIT License
6
+ *
7
+ * Components: Reset · Tokens · Grid · Layout · Utilities
8
+ * Typography · Forms · Components · Themes
9
+ *
10
+ * Usage:
11
+ * <link rel="stylesheet" href="https://cdn.lancar.id/ui/lxui.min.css">
12
+ * <html data-theme="lumen" data-mode="light">
13
+ * ================================================================ */
14
+
15
+ /* ================================================================
16
+ §1 RESET & BASE
17
+ ================================================================= */
18
+
19
+ *,
20
+ *::before,
21
+ *::after {
22
+ box-sizing: border-box;
23
+ }
24
+
25
+ html {
26
+ scroll-behavior: smooth;
27
+ -webkit-text-size-adjust: 100%;
28
+ tab-size: 4;
29
+ }
30
+
31
+ body {
32
+ margin: 0;
33
+ min-height: 100vh;
34
+ font-family: var(--font-default, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);
35
+ font-size: var(--lx-text-base, 1rem);
36
+ line-height: 1.6;
37
+ color: var(--text-primary, #111827);
38
+ background-color: var(--bg-primary, #ffffff);
39
+ -webkit-font-smoothing: antialiased;
40
+ -moz-osx-font-smoothing: grayscale;
41
+ text-rendering: optimizeLegibility;
42
+ }
43
+
44
+ h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd { margin: 0; }
45
+
46
+ img, svg, video, canvas, audio, iframe, embed, object { display: block; max-width: 100%; }
47
+
48
+ input, button, textarea, select { font: inherit; }
49
+
50
+ ul[role='list'], ol[role='list'] { list-style: none; }
51
+
52
+ h1, h2, h3, h4, h5, h6 {
53
+ font-family: var(--font-default);
54
+ font-weight: 700;
55
+ letter-spacing: -0.02em;
56
+ color: var(--text-primary, #111827);
57
+ margin-top: 1.5em;
58
+ margin-bottom: 0.5em;
59
+ }
60
+
61
+ h1 { font-size: clamp(1.75rem, 4vw + 1rem, 2.5rem); line-height: 1.2; }
62
+ h2 { font-size: clamp(1.5rem, 3vw + 0.8rem, 2rem); line-height: 1.3; }
63
+ h3 { font-size: clamp(1.25rem, 2.5vw + 0.6rem, 1.75rem); line-height: 1.3; }
64
+ h4 { font-size: clamp(1.125rem, 2vw + 0.5rem, 1.5rem); line-height: 1.4; }
65
+ h5 { font-size: clamp(1rem, 1.5vw + 0.4rem, 1.25rem); line-height: 1.4; }
66
+ h6 { font-size: 1rem; line-height: 1.5; font-weight: 600; }
67
+
68
+ p { margin-top: 0; margin-bottom: 1em; }
69
+
70
+ a { color: var(--accent, #3b82f6); text-decoration: none; transition: color 0.2s ease; }
71
+ a:hover { color: var(--accent-hover, #2563eb); text-decoration: underline; }
72
+ a:focus-visible { outline: 2px solid var(--accent, #3b82f6); outline-offset: 2px; border-radius: 3px; }
73
+
74
+ code, pre { font-family: var(--font-mono, "SFMono-Regular", Consolas, monospace); }
75
+ code { padding: 2px 6px; background: var(--bg-secondary, #f3f4f6); border: 1px solid var(--border-subtle, #e5e7eb); border-radius: 4px; font-size: 0.875em; }
76
+ pre { padding: 1rem; overflow-x: auto; line-height: 1.6; background: var(--bg-secondary, #f3f4f6); border: 1px solid var(--border-subtle, #e5e7eb); border-radius: 8px; }
77
+ pre code { background: none; border: none; padding: 0; }
78
+
79
+ kbd { font-family: var(--font-mono); font-size: 0.875em; padding: 0.125rem 0.375rem; background: var(--bg-tertiary, #e5e7eb); border: 1px solid var(--border-default, #d1d5db); border-radius: 4px; }
80
+
81
+ mark { background: #fef08a; padding: 0.1em 0.2em; border-radius: 2px; }
82
+
83
+ hr { border: none; border-top: 1px solid var(--border-subtle, #e5e7eb); margin: 1.5rem 0; }
84
+
85
+ ::selection { background: var(--accent-subtle, #dbeafe); color: var(--accent, #1d4ed8); }
86
+
87
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
88
+ ::-webkit-scrollbar-track { background: var(--bg-secondary, #f3f4f6); }
89
+ ::-webkit-scrollbar-thumb { background: var(--border-strong, #d1d5db); border-radius: 4px; }
90
+ ::-webkit-scrollbar-thumb:hover { background: var(--accent, #3b82f6); }
91
+
92
+ :focus-visible { outline: 2px solid var(--accent, #3b82f6); outline-offset: 2px; }
93
+ :focus:not(:focus-visible) { outline: none; }
94
+
95
+ @media (prefers-reduced-motion: reduce) {
96
+ *, *::before, *::after {
97
+ animation-duration: 0.01ms !important;
98
+ animation-iteration-count: 1 !important;
99
+ transition-duration: 0.01ms !important;
100
+ scroll-behavior: auto !important;
101
+ }
102
+ }
103
+
104
+ /* ================================================================
105
+ §2 DESIGN TOKENS
106
+ ================================================================= */
107
+
108
+ :root {
109
+ /* Font system */
110
+ --font-system: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
111
+ --font-default: "Plus Jakarta Sans", var(--font-system);
112
+ --font-modern: "Inter", var(--font-system);
113
+ --font-mono: "SFMono-Regular", "JetBrains Mono", Consolas, "Liberation Mono", Menlo, "Courier New", monospace;
114
+
115
+ /* Font sizes */
116
+ --lx-text-xs: 0.75rem;
117
+ --lx-text-sm: 0.875rem;
118
+ --lx-text-base: 1rem;
119
+ --lx-text-lg: 1.125rem;
120
+ --lx-text-xl: 1.25rem;
121
+ --lx-text-2xl: 1.5rem;
122
+ --lx-text-3xl: 1.875rem;
123
+ --lx-text-4xl: 2.25rem;
124
+ --lx-text-5xl: 3rem;
125
+
126
+ /* Spacing */
127
+ --lx-spacer: 1rem;
128
+ --lx-space-1: 0.25rem;
129
+ --lx-space-2: 0.5rem;
130
+ --lx-space-3: 0.75rem;
131
+ --lx-space-4: 1rem;
132
+ --lx-space-5: 1.25rem;
133
+ --lx-space-6: 1.5rem;
134
+ --lx-space-8: 2rem;
135
+ --lx-space-10: 2.5rem;
136
+ --lx-space-12: 3rem;
137
+ --lx-space-16: 4rem;
138
+
139
+ /* Border radius */
140
+ --lx-radius-none: 0;
141
+ --lx-radius-sm: 4px;
142
+ --lx-radius: 8px;
143
+ --lx-radius-md: 12px;
144
+ --lx-radius-lg: 16px;
145
+ --lx-radius-xl: 24px;
146
+ --lx-radius-full: 9999px;
147
+
148
+ /* Shadows */
149
+ --lx-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.04);
150
+ --lx-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
151
+ --lx-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
152
+ --lx-shadow-md: 0 8px 12px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.05);
153
+ --lx-shadow-lg: 0 16px 24px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.05);
154
+ --lx-shadow-xl: 0 24px 40px -8px rgba(0, 0, 0, 0.12), 0 12px 16px -8px rgba(0, 0, 0, 0.06);
155
+ --lx-shadow-2xl: 0 40px 60px -12px rgba(0, 0, 0, 0.18);
156
+
157
+ /* Transitions */
158
+ --lx-transition: all 0.2s ease;
159
+ --lx-transition-fast: all 0.1s ease;
160
+ --lx-transition-slow: all 0.4s ease;
161
+
162
+ /* Z-index */
163
+ --lx-z-dropdown: 1000;
164
+ --lx-z-sticky: 1020;
165
+ --lx-z-fixed: 1030;
166
+ --lx-z-offcanvas: 1040;
167
+ --lx-z-modal-bg: 1050;
168
+ --lx-z-modal: 1060;
169
+ --lx-z-popover: 1070;
170
+ --lx-z-tooltip: 1080;
171
+ --lx-z-toast: 1090;
172
+
173
+ /* Brand colors (fallback when no theme is active) */
174
+ --lx-primary: #3b82f6;
175
+ --lx-primary-dark: #2563eb;
176
+ --lx-primary-light: #93c5fd;
177
+ --lx-secondary: #6b7280;
178
+ --lx-success: #22c55e;
179
+ --lx-warning: #f59e0b;
180
+ --lx-danger: #ef4444;
181
+ --lx-info: #06b6d4;
182
+ --lx-dark: #1f2937;
183
+ --lx-light: #f9fafb;
184
+
185
+ /* Default semantic vars (overridden by UI themes) */
186
+ --bg-primary: #ffffff;
187
+ --bg-secondary: #f9fafb;
188
+ --bg-tertiary: #f3f4f6;
189
+ --surface: #ffffff;
190
+ --text-primary: #111827;
191
+ --text-secondary: #6b7280;
192
+ --text-muted: #9ca3af;
193
+ --border-strong: #d1d5db;
194
+ --border-default: #e5e7eb;
195
+ --border-subtle: #f3f4f6;
196
+ --accent: var(--lx-primary);
197
+ --accent-hover: var(--lx-primary-dark);
198
+ --accent-subtle: #dbeafe;
199
+ --accent-fg: #ffffff;
200
+
201
+ /* Container */
202
+ --lx-container-padding-x: 1rem;
203
+ }
204
+
205
+ @media (min-width: 768px) {
206
+ :root { --lx-container-padding-x: 1.5rem; }
207
+ }
208
+
209
+ /* ── Extended design tokens ── */
210
+ :root {
211
+ /* Semantic aliases */
212
+ --lx-font-sans: var(--font-default);
213
+ --lx-font-serif: "Source Serif Pro", Georgia, "Times New Roman", serif;
214
+ --lx-text: var(--text-primary, #111827);
215
+ --lx-text-secondary:var(--text-secondary, #6b7280);
216
+ --lx-text-muted: var(--text-muted, #9ca3af);
217
+ --lx-text-disabled: #d1d5db;
218
+ --lx-bg: var(--bg-primary, #ffffff);
219
+ --lx-bg-soft: var(--bg-secondary, #f9fafb);
220
+ --lx-bg-muted: var(--bg-tertiary, #f3f4f6);
221
+ --lx-border: var(--border-default, #e5e7eb);
222
+
223
+ /* Extended color variants */
224
+ --lx-primary-hover: var(--lx-primary-dark, #2563eb);
225
+ --lx-primary-subtle: var(--accent-subtle, #dbeafe);
226
+ --lx-primary-fg: var(--accent-fg, #ffffff);
227
+ --lx-secondary-hover: #4b5563;
228
+ --lx-secondary-subtle:#f9fafb;
229
+ --lx-secondary-fg: #ffffff;
230
+ --lx-success-hover: #16a34a;
231
+ --lx-success-subtle: #f0fdf4;
232
+ --lx-success-light: #86efac;
233
+ --lx-success-fg: #ffffff;
234
+ --lx-warning-hover: #d97706;
235
+ --lx-warning-subtle: #fffbeb;
236
+ --lx-warning-light: #fcd34d;
237
+ --lx-warning-fg: #ffffff;
238
+ --lx-danger-hover: #dc2626;
239
+ --lx-danger-subtle: #fef2f2;
240
+ --lx-danger-light: #fca5a5;
241
+ --lx-danger-fg: #ffffff;
242
+ --lx-info-hover: #0891b2;
243
+ --lx-info-subtle: #ecfeff;
244
+ --lx-info-light: #67e8f9;
245
+ --lx-info-fg: #ffffff;
246
+ --lx-white: #ffffff;
247
+ --lx-black: #000000;
248
+
249
+ /* Gray scale */
250
+ --lx-gray-50: #f9fafb;
251
+ --lx-gray-100: #f3f4f6;
252
+ --lx-gray-200: #e5e7eb;
253
+ --lx-gray-300: #d1d5db;
254
+ --lx-gray-400: #9ca3af;
255
+ --lx-gray-500: #6b7280;
256
+ --lx-gray-600: #4b5563;
257
+ --lx-gray-700: #374151;
258
+ --lx-gray-800: #1f2937;
259
+ --lx-gray-900: #111827;
260
+ --lx-gray-950: #030712;
261
+
262
+ /* Timing functions */
263
+ --lx-ease: cubic-bezier(0.4, 0, 0.2, 1);
264
+ --lx-ease-in: cubic-bezier(0.4, 0, 1, 1);
265
+ --lx-ease-out: cubic-bezier(0, 0, 0.2, 1);
266
+ --lx-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
267
+ --lx-duration-fast: 100ms;
268
+ --lx-duration: 200ms;
269
+ --lx-duration-slow: 300ms;
270
+
271
+ /* Component tokens */
272
+ --lx-btn-padding-y: 0.5rem;
273
+ --lx-btn-padding-x: 1rem;
274
+ --lx-btn-font-size: var(--lx-text-sm, 0.875rem);
275
+ --lx-btn-font-weight: 600;
276
+ --lx-btn-radius: var(--lx-radius, 8px);
277
+ --lx-btn-transition: var(--lx-transition);
278
+
279
+ --lx-card-padding: 1.5rem;
280
+ --lx-card-radius: var(--lx-radius-md, 12px);
281
+ --lx-card-shadow: var(--lx-shadow);
282
+ --lx-card-border: 1px solid var(--border-default, #e5e7eb);
283
+
284
+ --lx-input-padding-y: 0.5rem;
285
+ --lx-input-padding-x: 0.75rem;
286
+ --lx-input-font-size: var(--lx-text-sm, 0.875rem);
287
+ --lx-input-radius: var(--lx-radius, 8px);
288
+ --lx-input-border: 1px solid var(--border-strong, #d1d5db);
289
+ --lx-input-bg: var(--bg-primary, #ffffff);
290
+ --lx-input-focus-shadow: 0 0 0 3px rgba(59,130,246,.15);
291
+
292
+ --lx-modal-radius: var(--lx-radius-lg, 16px);
293
+ --lx-modal-shadow: var(--lx-shadow-xl);
294
+ --lx-modal-backdrop: rgba(0,0,0,.5);
295
+
296
+ --lx-tooltip-bg: #111827;
297
+ --lx-tooltip-color: #ffffff;
298
+ --lx-tooltip-radius: var(--lx-radius-sm, 4px);
299
+
300
+ --lx-badge-padding-y: 0.25em;
301
+ --lx-badge-padding-x: 0.6em;
302
+ --lx-badge-font-size: 0.75em;
303
+ --lx-badge-font-weight: 600;
304
+ --lx-badge-radius: var(--lx-radius-full, 9999px);
305
+
306
+ --lx-progress-height: 0.5rem;
307
+ --lx-progress-bg: var(--bg-tertiary, #f3f4f6);
308
+ --lx-progress-radius: var(--lx-radius-full, 9999px);
309
+
310
+ --lx-avatar-size: 2.5rem;
311
+ --lx-avatar-radius: 50%;
312
+ --lx-avatar-font-size: 0.875rem;
313
+
314
+ --lx-breadcrumb-sep: "/";
315
+
316
+ /* Container sizes */
317
+ --lx-container-sm: 640px;
318
+ --lx-container-md: 768px;
319
+ --lx-container-lg: 1024px;
320
+ --lx-container-xl: 1280px;
321
+ --lx-container-2xl: 1536px;
322
+ --lx-container-pad: var(--lx-container-padding-x, 1rem);
323
+ }
324
+
325
+ /* ================================================================
326
+ * LxUI — lx-grid.min.css
327
+ * Grid system only (12-column CSS Grid)
328
+ * https://ui.lancar.id | cdn: https://cdn.lancar.id/ui/lx-grid.min.css
329
+ * ================================================================ */
330
+ :root{--lx-gap:1rem;--lx-container-padding-x:1rem;--lx-grid-cols:12}
331
+ .lx-container{width:100%;margin-inline:auto;padding-inline:var(--lx-container-padding-x)}
332
+ .lx-container-fluid{width:100%;padding-inline:var(--lx-container-padding-x)}
333
+ .lx-container-sm{max-width:640px;margin-inline:auto;padding-inline:var(--lx-container-padding-x)}
334
+ .lx-container-md{max-width:768px;margin-inline:auto;padding-inline:var(--lx-container-padding-x)}
335
+ .lx-container-lg{max-width:1024px;margin-inline:auto;padding-inline:var(--lx-container-padding-x)}
336
+ .lx-container-xl{max-width:1280px;margin-inline:auto;padding-inline:var(--lx-container-padding-x)}
337
+ .lx-container-2xl{max-width:1536px;margin-inline:auto;padding-inline:var(--lx-container-padding-x)}
338
+ @media(min-width:640px){.lx-container{max-width:640px}}
339
+ @media(min-width:768px){.lx-container{max-width:768px}:root{--lx-container-padding-x:1.5rem}}
340
+ @media(min-width:1024px){.lx-container{max-width:1024px}}
341
+ @media(min-width:1280px){.lx-container{max-width:1280px}}
342
+ @media(min-width:1536px){.lx-container{max-width:1536px}}
343
+ .lx-grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:var(--lx-gap)}
344
+ .lx-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}
345
+ .lx-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}
346
+ .lx-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}
347
+ .lx-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}
348
+ .lx-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}
349
+ .lx-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}
350
+ .lx-cols-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}
351
+ .lx-col-1{grid-column:span 1/span 1}
352
+ .lx-col-2{grid-column:span 2/span 2}
353
+ .lx-col-3{grid-column:span 3/span 3}
354
+ .lx-col-4{grid-column:span 4/span 4}
355
+ .lx-col-5{grid-column:span 5/span 5}
356
+ .lx-col-6{grid-column:span 6/span 6}
357
+ .lx-col-7{grid-column:span 7/span 7}
358
+ .lx-col-8{grid-column:span 8/span 8}
359
+ .lx-col-9{grid-column:span 9/span 9}
360
+ .lx-col-10{grid-column:span 10/span 10}
361
+ .lx-col-11{grid-column:span 11/span 11}
362
+ .lx-col-12{grid-column:span 12/span 12}
363
+ .lx-col-offset-1{margin-inline-start:calc(100%/12*1)}
364
+ .lx-col-offset-2{margin-inline-start:calc(100%/12*2)}
365
+ .lx-col-offset-3{margin-inline-start:calc(100%/12*3)}
366
+ .lx-col-offset-4{margin-inline-start:calc(100%/12*4)}
367
+ .lx-col-offset-5{margin-inline-start:calc(100%/12*5)}
368
+ .lx-col-offset-6{margin-inline-start:calc(100%/12*6)}
369
+ .lx-order-first{order:-9999}.lx-order-last{order:9999}
370
+ .lx-order-1{order:1}.lx-order-2{order:2}.lx-order-3{order:3}
371
+ .lx-order-4{order:4}.lx-order-5{order:5}.lx-order-6{order:6}
372
+ .lx-gap-0{gap:0}.lx-gap-1{gap:.25rem}.lx-gap-2{gap:.5rem}
373
+ .lx-gap-3{gap:.75rem}.lx-gap-4{gap:1rem}.lx-gap-5{gap:1.25rem}
374
+ .lx-gap-6{gap:1.5rem}.lx-gap-8{gap:2rem}.lx-gap-10{gap:2.5rem}.lx-gap-12{gap:3rem}
375
+ .lx-gap-x-0{column-gap:0}.lx-gap-x-2{column-gap:.5rem}.lx-gap-x-4{column-gap:1rem}.lx-gap-x-6{column-gap:1.5rem}.lx-gap-x-8{column-gap:2rem}
376
+ .lx-gap-y-0{row-gap:0}.lx-gap-y-2{row-gap:.5rem}.lx-gap-y-4{row-gap:1rem}.lx-gap-y-6{row-gap:1.5rem}.lx-gap-y-8{row-gap:2rem}
377
+ @media(min-width:640px){
378
+ .lx-sm-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lx-sm-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lx-sm-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lx-sm-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}
379
+ .lx-sm-col-1{grid-column:span 1/span 1}.lx-sm-col-2{grid-column:span 2/span 2}.lx-sm-col-3{grid-column:span 3/span 3}.lx-sm-col-4{grid-column:span 4/span 4}.lx-sm-col-6{grid-column:span 6/span 6}.lx-sm-col-12{grid-column:span 12/span 12}
380
+ .lx-sm-gap-2{gap:.5rem}.lx-sm-gap-4{gap:1rem}.lx-sm-gap-6{gap:1.5rem}}
381
+ @media(min-width:768px){
382
+ .lx-md-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lx-md-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lx-md-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lx-md-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lx-md-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}
383
+ .lx-md-col-1{grid-column:span 1/span 1}.lx-md-col-2{grid-column:span 2/span 2}.lx-md-col-3{grid-column:span 3/span 3}.lx-md-col-4{grid-column:span 4/span 4}.lx-md-col-5{grid-column:span 5/span 5}.lx-md-col-6{grid-column:span 6/span 6}.lx-md-col-7{grid-column:span 7/span 7}.lx-md-col-8{grid-column:span 8/span 8}.lx-md-col-9{grid-column:span 9/span 9}.lx-md-col-10{grid-column:span 10/span 10}.lx-md-col-12{grid-column:span 12/span 12}
384
+ .lx-md-col-offset-3{margin-inline-start:25%}.lx-md-col-offset-4{margin-inline-start:33.333%}
385
+ .lx-md-gap-2{gap:.5rem}.lx-md-gap-4{gap:1rem}.lx-md-gap-6{gap:1.5rem}.lx-md-gap-8{gap:2rem}}
386
+ @media(min-width:1024px){
387
+ .lx-lg-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lx-lg-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lx-lg-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lx-lg-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lx-lg-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lx-lg-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}
388
+ .lx-lg-col-1{grid-column:span 1/span 1}.lx-lg-col-2{grid-column:span 2/span 2}.lx-lg-col-3{grid-column:span 3/span 3}.lx-lg-col-4{grid-column:span 4/span 4}.lx-lg-col-5{grid-column:span 5/span 5}.lx-lg-col-6{grid-column:span 6/span 6}.lx-lg-col-8{grid-column:span 8/span 8}.lx-lg-col-9{grid-column:span 9/span 9}.lx-lg-col-12{grid-column:span 12/span 12}
389
+ .lx-lg-gap-4{gap:1rem}.lx-lg-gap-6{gap:1.5rem}.lx-lg-gap-8{gap:2rem}}
390
+ @media(min-width:1280px){
391
+ .lx-xl-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lx-xl-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lx-xl-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}
392
+ .lx-xl-col-3{grid-column:span 3/span 3}.lx-xl-col-4{grid-column:span 4/span 4}.lx-xl-col-6{grid-column:span 6/span 6}}
393
+
394
+ /* ================================================================
395
+ * LxUI — lx-utilities.min.css
396
+ * Utility classes only (display, spacing, flex, text, color, etc.)
397
+ * https://ui.lancar.id | cdn: https://cdn.lancar.id/ui/lx-utilities.min.css
398
+ * ================================================================ */
399
+
400
+ /* Display */
401
+ .lx-block{display:block}.lx-inline{display:inline}.lx-inline-block{display:inline-block}
402
+ .lx-flex{display:flex}.lx-inline-flex{display:inline-flex}.lx-grid{display:grid}.lx-inline-grid{display:inline-grid}
403
+ .lx-table{display:table}.lx-table-row{display:table-row}.lx-table-cell{display:table-cell}
404
+ .lx-contents{display:contents}.lx-hidden{display:none}
405
+ @media print{.lx-print-hidden{display:none!important}.lx-print-block{display:block!important}}
406
+
407
+ /* Flex */
408
+ .lx-flex-row{flex-direction:row}.lx-flex-row-reverse{flex-direction:row-reverse}
409
+ .lx-flex-col{flex-direction:column}.lx-flex-col-reverse{flex-direction:column-reverse}
410
+ .lx-flex-wrap{flex-wrap:wrap}.lx-flex-nowrap{flex-wrap:nowrap}.lx-flex-wrap-reverse{flex-wrap:wrap-reverse}
411
+ .lx-justify-start{justify-content:flex-start}.lx-justify-end{justify-content:flex-end}
412
+ .lx-justify-center{justify-content:center}.lx-justify-between{justify-content:space-between}
413
+ .lx-justify-around{justify-content:space-around}.lx-justify-evenly{justify-content:space-evenly}
414
+ .lx-items-start{align-items:flex-start}.lx-items-end{align-items:flex-end}
415
+ .lx-items-center{align-items:center}.lx-items-baseline{align-items:baseline}.lx-items-stretch{align-items:stretch}
416
+ .lx-self-start{align-self:flex-start}.lx-self-end{align-self:flex-end}
417
+ .lx-self-center{align-self:center}.lx-self-stretch{align-self:stretch}.lx-self-auto{align-self:auto}
418
+ .lx-content-start{align-content:flex-start}.lx-content-end{align-content:flex-end}
419
+ .lx-content-center{align-content:center}.lx-content-between{align-content:space-between}
420
+ .lx-flex-1{flex:1 1 0%}.lx-flex-auto{flex:1 1 auto}.lx-flex-none{flex:none}
421
+ .lx-flex-shrink-0{flex-shrink:0}.lx-flex-shrink{flex-shrink:1}
422
+ .lx-grow{flex-grow:1}.lx-grow-0{flex-grow:0}
423
+
424
+ /* Stack layouts */
425
+ .lx-stack>*+*{margin-block-start:var(--lx-stack-gap,1rem)}
426
+ .lx-hstack{display:flex;align-items:center}
427
+
428
+ /* Spacing — Margin */
429
+ .lx-m-0{margin:0}.lx-m-1{margin:.25rem}.lx-m-2{margin:.5rem}.lx-m-3{margin:.75rem}
430
+ .lx-m-4{margin:1rem}.lx-m-5{margin:1.25rem}.lx-m-6{margin:1.5rem}.lx-m-8{margin:2rem}
431
+ .lx-m-10{margin:2.5rem}.lx-m-12{margin:3rem}.lx-m-16{margin:4rem}.lx-m-auto{margin:auto}
432
+ .lx-mt-0{margin-top:0}.lx-mt-1{margin-top:.25rem}.lx-mt-2{margin-top:.5rem}.lx-mt-3{margin-top:.75rem}.lx-mt-4{margin-top:1rem}.lx-mt-5{margin-top:1.25rem}.lx-mt-6{margin-top:1.5rem}.lx-mt-8{margin-top:2rem}.lx-mt-10{margin-top:2.5rem}.lx-mt-12{margin-top:3rem}.lx-mt-16{margin-top:4rem}.lx-mt-auto{margin-top:auto}
433
+ .lx-mb-0{margin-bottom:0}.lx-mb-1{margin-bottom:.25rem}.lx-mb-2{margin-bottom:.5rem}.lx-mb-3{margin-bottom:.75rem}.lx-mb-4{margin-bottom:1rem}.lx-mb-5{margin-bottom:1.25rem}.lx-mb-6{margin-bottom:1.5rem}.lx-mb-8{margin-bottom:2rem}.lx-mb-10{margin-bottom:2.5rem}.lx-mb-12{margin-bottom:3rem}.lx-mb-16{margin-bottom:4rem}.lx-mb-auto{margin-bottom:auto}
434
+ .lx-ms-0{margin-inline-start:0}.lx-ms-1{margin-inline-start:.25rem}.lx-ms-2{margin-inline-start:.5rem}.lx-ms-3{margin-inline-start:.75rem}.lx-ms-4{margin-inline-start:1rem}.lx-ms-5{margin-inline-start:1.25rem}.lx-ms-6{margin-inline-start:1.5rem}.lx-ms-8{margin-inline-start:2rem}.lx-ms-auto{margin-inline-start:auto}
435
+ .lx-me-0{margin-inline-end:0}.lx-me-1{margin-inline-end:.25rem}.lx-me-2{margin-inline-end:.5rem}.lx-me-3{margin-inline-end:.75rem}.lx-me-4{margin-inline-end:1rem}.lx-me-5{margin-inline-end:1.25rem}.lx-me-6{margin-inline-end:1.5rem}.lx-me-8{margin-inline-end:2rem}.lx-me-auto{margin-inline-end:auto}
436
+ .lx-mx-0{margin-inline:0}.lx-mx-1{margin-inline:.25rem}.lx-mx-2{margin-inline:.5rem}.lx-mx-3{margin-inline:.75rem}.lx-mx-4{margin-inline:1rem}.lx-mx-6{margin-inline:1.5rem}.lx-mx-8{margin-inline:2rem}.lx-mx-auto{margin-inline:auto}
437
+ .lx-my-0{margin-block:0}.lx-my-1{margin-block:.25rem}.lx-my-2{margin-block:.5rem}.lx-my-3{margin-block:.75rem}.lx-my-4{margin-block:1rem}.lx-my-6{margin-block:1.5rem}.lx-my-8{margin-block:2rem}.lx-my-auto{margin-block:auto}
438
+
439
+ /* Spacing — Padding */
440
+ .lx-p-0{padding:0}.lx-p-1{padding:.25rem}.lx-p-2{padding:.5rem}.lx-p-3{padding:.75rem}
441
+ .lx-p-4{padding:1rem}.lx-p-5{padding:1.25rem}.lx-p-6{padding:1.5rem}.lx-p-8{padding:2rem}
442
+ .lx-p-10{padding:2.5rem}.lx-p-12{padding:3rem}.lx-p-16{padding:4rem}
443
+ .lx-pt-0{padding-top:0}.lx-pt-1{padding-top:.25rem}.lx-pt-2{padding-top:.5rem}.lx-pt-3{padding-top:.75rem}.lx-pt-4{padding-top:1rem}.lx-pt-6{padding-top:1.5rem}.lx-pt-8{padding-top:2rem}.lx-pt-12{padding-top:3rem}.lx-pt-16{padding-top:4rem}
444
+ .lx-pb-0{padding-bottom:0}.lx-pb-1{padding-bottom:.25rem}.lx-pb-2{padding-bottom:.5rem}.lx-pb-3{padding-bottom:.75rem}.lx-pb-4{padding-bottom:1rem}.lx-pb-6{padding-bottom:1.5rem}.lx-pb-8{padding-bottom:2rem}.lx-pb-12{padding-bottom:3rem}.lx-pb-16{padding-bottom:4rem}
445
+ .lx-ps-0{padding-inline-start:0}.lx-ps-1{padding-inline-start:.25rem}.lx-ps-2{padding-inline-start:.5rem}.lx-ps-3{padding-inline-start:.75rem}.lx-ps-4{padding-inline-start:1rem}.lx-ps-5{padding-inline-start:1.25rem}.lx-ps-6{padding-inline-start:1.5rem}.lx-ps-8{padding-inline-start:2rem}
446
+ .lx-pe-0{padding-inline-end:0}.lx-pe-1{padding-inline-end:.25rem}.lx-pe-2{padding-inline-end:.5rem}.lx-pe-3{padding-inline-end:.75rem}.lx-pe-4{padding-inline-end:1rem}.lx-pe-5{padding-inline-end:1.25rem}.lx-pe-6{padding-inline-end:1.5rem}.lx-pe-8{padding-inline-end:2rem}
447
+ .lx-px-0{padding-inline:0}.lx-px-1{padding-inline:.25rem}.lx-px-2{padding-inline:.5rem}.lx-px-3{padding-inline:.75rem}.lx-px-4{padding-inline:1rem}.lx-px-5{padding-inline:1.25rem}.lx-px-6{padding-inline:1.5rem}.lx-px-8{padding-inline:2rem}
448
+ .lx-py-0{padding-block:0}.lx-py-1{padding-block:.25rem}.lx-py-2{padding-block:.5rem}.lx-py-3{padding-block:.75rem}.lx-py-4{padding-block:1rem}.lx-py-5{padding-block:1.25rem}.lx-py-6{padding-block:1.5rem}.lx-py-8{padding-block:2rem}
449
+
450
+ /* Text */
451
+ .lx-text-xs{font-size:.75rem}.lx-text-sm{font-size:.875rem}.lx-text-base{font-size:1rem}
452
+ .lx-text-lg{font-size:1.125rem}.lx-text-xl{font-size:1.25rem}.lx-text-2xl{font-size:1.5rem}
453
+ .lx-text-3xl{font-size:1.875rem}.lx-text-4xl{font-size:2.25rem}.lx-text-5xl{font-size:3rem}
454
+ .lx-text-left{text-align:left}.lx-text-center{text-align:center}.lx-text-right{text-align:right}
455
+ .lx-text-justify{text-align:justify}.lx-text-start{text-align:start}.lx-text-end{text-align:end}
456
+ .lx-font-thin{font-weight:100}.lx-font-extralight{font-weight:200}.lx-font-light{font-weight:300}
457
+ .lx-font-normal{font-weight:400}.lx-font-medium{font-weight:500}.lx-font-semibold{font-weight:600}
458
+ .lx-font-bold{font-weight:700}.lx-font-extrabold{font-weight:800}.lx-font-black{font-weight:900}
459
+ .lx-italic{font-style:italic}.lx-not-italic{font-style:normal}
460
+ .lx-uppercase{text-transform:uppercase}.lx-lowercase{text-transform:lowercase}
461
+ .lx-capitalize{text-transform:capitalize}.lx-normal-case{text-transform:none}
462
+ .lx-underline{text-decoration-line:underline}.lx-overline{text-decoration-line:overline}
463
+ .lx-line-through{text-decoration-line:line-through}.lx-no-underline{text-decoration:none}
464
+ .lx-tracking-tighter{letter-spacing:-.05em}.lx-tracking-tight{letter-spacing:-.025em}
465
+ .lx-tracking-normal{letter-spacing:0}.lx-tracking-wide{letter-spacing:.025em}
466
+ .lx-tracking-wider{letter-spacing:.05em}.lx-tracking-widest{letter-spacing:.1em}
467
+ .lx-leading-none{line-height:1}.lx-leading-tight{line-height:1.25}.lx-leading-snug{line-height:1.375}
468
+ .lx-leading-normal{line-height:1.6}.lx-leading-relaxed{line-height:1.75}.lx-leading-loose{line-height:2}
469
+ .lx-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
470
+ .lx-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
471
+ .lx-line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}
472
+ .lx-line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}
473
+ .lx-line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}
474
+ .lx-line-clamp-4{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4}
475
+ .lx-whitespace-nowrap{white-space:nowrap}.lx-whitespace-pre{white-space:pre}
476
+ .lx-whitespace-pre-wrap{white-space:pre-wrap}.lx-whitespace-normal{white-space:normal}
477
+ .lx-break-all{word-break:break-all}.lx-break-words{overflow-wrap:break-word}
478
+ .lx-word-break{word-break:break-all}
479
+
480
+ /* Colors */
481
+ .lx-text-primary{color:var(--lx-primary,#3b82f6)}.lx-text-secondary{color:var(--lx-secondary,#6b7280)}
482
+ .lx-text-success{color:var(--lx-success,#22c55e)}.lx-text-warning{color:var(--lx-warning,#f59e0b)}
483
+ .lx-text-danger{color:var(--lx-danger,#ef4444)}.lx-text-info{color:var(--lx-info,#06b6d4)}
484
+ .lx-text-dark{color:var(--lx-dark,#1f2937)}.lx-text-light{color:var(--lx-light,#f9fafb)}
485
+ .lx-text-white{color:#fff}.lx-text-black{color:#000}
486
+ .lx-text-muted{color:var(--text-muted,#9ca3af)}.lx-text-body{color:var(--text-primary,#111827)}
487
+ .lx-text-opacity-75{opacity:.75}.lx-text-opacity-50{opacity:.5}.lx-text-opacity-25{opacity:.25}
488
+ .lx-bg-primary{background-color:var(--lx-primary,#3b82f6)}.lx-bg-secondary{background-color:var(--lx-secondary,#6b7280)}
489
+ .lx-bg-success{background-color:var(--lx-success,#22c55e)}.lx-bg-warning{background-color:var(--lx-warning,#f59e0b)}
490
+ .lx-bg-danger{background-color:var(--lx-danger,#ef4444)}.lx-bg-info{background-color:var(--lx-info,#06b6d4)}
491
+ .lx-bg-dark{background-color:var(--lx-dark,#1f2937)}.lx-bg-light{background-color:var(--lx-light,#f9fafb)}
492
+ .lx-bg-white{background-color:#fff}.lx-bg-transparent{background-color:transparent}
493
+ .lx-bg-primary-soft{background-color:color-mix(in srgb,var(--lx-primary,#3b82f6) 12%,white)}
494
+ .lx-bg-success-soft{background-color:color-mix(in srgb,var(--lx-success,#22c55e) 12%,white)}
495
+ .lx-bg-warning-soft{background-color:color-mix(in srgb,var(--lx-warning,#f59e0b) 12%,white)}
496
+ .lx-bg-danger-soft{background-color:color-mix(in srgb,var(--lx-danger,#ef4444) 12%,white)}
497
+ .lx-bg-opacity-75{opacity:.75}.lx-bg-opacity-50{opacity:.5}.lx-bg-opacity-25{opacity:.25}.lx-bg-opacity-10{opacity:.1}
498
+
499
+ /* Sizing */
500
+ .lx-w-auto{width:auto}.lx-w-full{width:100%}.lx-w-screen{width:100vw}.lx-w-fit{width:fit-content}
501
+ .lx-w-1\/2{width:50%}.lx-w-1\/3{width:33.333%}.lx-w-2\/3{width:66.666%}
502
+ .lx-w-1\/4{width:25%}.lx-w-3\/4{width:75%}.lx-w-1\/5{width:20%}.lx-w-4\/5{width:80%}
503
+ .lx-w-4{width:1rem}.lx-w-6{width:1.5rem}.lx-w-8{width:2rem}.lx-w-12{width:3rem}.lx-w-16{width:4rem}.lx-w-24{width:6rem}.lx-w-32{width:8rem}.lx-w-48{width:12rem}.lx-w-64{width:16rem}
504
+ .lx-h-auto{height:auto}.lx-h-full{height:100%}.lx-h-screen{height:100vh}.lx-h-fit{height:fit-content}
505
+ .lx-h-4{height:1rem}.lx-h-6{height:1.5rem}.lx-h-8{height:2rem}.lx-h-12{height:3rem}.lx-h-16{height:4rem}.lx-h-24{height:6rem}.lx-h-32{height:8rem}
506
+ .lx-min-w-0{min-width:0}.lx-max-w-full{max-width:100%}.lx-max-w-screen-sm{max-width:640px}.lx-max-w-screen-md{max-width:768px}.lx-max-w-screen-lg{max-width:1024px}.lx-max-w-screen-xl{max-width:1280px}
507
+ .lx-min-h-screen{min-height:100vh}.lx-max-h-screen{max-height:100vh}.lx-max-h-64{max-height:16rem}
508
+ .lx-size-4{width:1rem;height:1rem}.lx-size-6{width:1.5rem;height:1.5rem}.lx-size-8{width:2rem;height:2rem}.lx-size-12{width:3rem;height:3rem}.lx-size-16{width:4rem;height:4rem}
509
+
510
+ /* Position */
511
+ .lx-static{position:static}.lx-relative{position:relative}.lx-absolute{position:absolute}
512
+ .lx-fixed{position:fixed}.lx-sticky{position:sticky}
513
+ .lx-top-0{top:0}.lx-top-50{top:50%}.lx-top-100{top:100%}.lx-top-auto{top:auto}
514
+ .lx-bottom-0{bottom:0}.lx-bottom-50{bottom:50%}.lx-bottom-auto{bottom:auto}
515
+ .lx-start-0{inset-inline-start:0}.lx-start-50{inset-inline-start:50%}.lx-start-auto{inset-inline-start:auto}
516
+ .lx-end-0{inset-inline-end:0}.lx-end-50{inset-inline-end:50%}.lx-end-auto{inset-inline-end:auto}
517
+ .lx-inset-0{inset:0}
518
+ .lx-translate-middle{transform:translate(-50%,-50%)}
519
+ .lx-translate-middle-x{transform:translateX(-50%)}
520
+ .lx-translate-middle-y{transform:translateY(-50%)}
521
+ .lx-sticky-top{position:sticky;top:0;z-index:var(--lx-z-sticky,1020)}
522
+
523
+ /* Border */
524
+ .lx-border{border:1px solid var(--border-default,#e5e7eb)}
525
+ .lx-border-0{border:0!important}.lx-border-2{border-width:2px}.lx-border-3{border-width:3px}
526
+ .lx-border-t{border-top:1px solid var(--border-default,#e5e7eb)}
527
+ .lx-border-b{border-bottom:1px solid var(--border-default,#e5e7eb)}
528
+ .lx-border-s{border-inline-start:1px solid var(--border-default,#e5e7eb)}
529
+ .lx-border-e{border-inline-end:1px solid var(--border-default,#e5e7eb)}
530
+ .lx-border-t-0{border-top:0}.lx-border-b-0{border-bottom:0}
531
+ .lx-border-primary{border-color:var(--lx-primary,#3b82f6)!important}
532
+ .lx-border-success{border-color:var(--lx-success,#22c55e)!important}
533
+ .lx-border-danger{border-color:var(--lx-danger,#ef4444)!important}
534
+ .lx-border-warning{border-color:var(--lx-warning,#f59e0b)!important}
535
+ .lx-border-white{border-color:#fff!important}
536
+ .lx-border-opacity-50{border-color:color-mix(in srgb,currentColor 50%,transparent)!important}
537
+ .lx-rounded-none{border-radius:0}.lx-rounded-sm{border-radius:4px}.lx-rounded{border-radius:8px}
538
+ .lx-rounded-md{border-radius:12px}.lx-rounded-lg{border-radius:16px}.lx-rounded-xl{border-radius:24px}
539
+ .lx-rounded-2xl{border-radius:32px}.lx-rounded-full{border-radius:9999px}
540
+ .lx-rounded-t{border-top-left-radius:8px;border-top-right-radius:8px}
541
+ .lx-rounded-b{border-bottom-left-radius:8px;border-bottom-right-radius:8px}
542
+ .lx-rounded-s{border-top-left-radius:8px;border-bottom-left-radius:8px}
543
+ .lx-rounded-e{border-top-right-radius:8px;border-bottom-right-radius:8px}
544
+
545
+ /* Shadow */
546
+ .lx-shadow-none{box-shadow:none!important}
547
+ .lx-shadow-xs{box-shadow:0 1px 2px rgba(0,0,0,.04)}
548
+ .lx-shadow-sm{box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04)}
549
+ .lx-shadow{box-shadow:0 4px 6px -1px rgba(0,0,0,.07),0 2px 4px -2px rgba(0,0,0,.05)}
550
+ .lx-shadow-md{box-shadow:0 8px 12px -3px rgba(0,0,0,.08),0 4px 6px -4px rgba(0,0,0,.05)}
551
+ .lx-shadow-lg{box-shadow:0 16px 24px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.05)}
552
+ .lx-shadow-xl{box-shadow:0 24px 40px -8px rgba(0,0,0,.12),0 12px 16px -8px rgba(0,0,0,.06)}
553
+ .lx-shadow-2xl{box-shadow:0 40px 60px -12px rgba(0,0,0,.18)}
554
+ .lx-shadow-inner{box-shadow:inset 0 2px 4px rgba(0,0,0,.06)}
555
+
556
+ /* Overflow */
557
+ .lx-overflow-auto{overflow:auto}.lx-overflow-hidden{overflow:hidden}
558
+ .lx-overflow-visible{overflow:visible}.lx-overflow-scroll{overflow:scroll}
559
+ .lx-overflow-x-auto{overflow-x:auto}.lx-overflow-y-auto{overflow-y:auto}
560
+ .lx-overflow-x-hidden{overflow-x:hidden}.lx-overflow-y-hidden{overflow-y:hidden}
561
+ .lx-overflow-x-scroll{overflow-x:scroll}.lx-overflow-y-scroll{overflow-y:scroll}
562
+
563
+ /* Visibility */
564
+ .lx-visible{visibility:visible}.lx-invisible{visibility:hidden}
565
+ .lx-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
566
+ .lx-sr-only-focusable:focus,.lx-sr-only-focusable:focus-within{position:static;width:auto;height:auto;padding:inherit;margin:inherit;overflow:visible;clip:auto;white-space:normal}
567
+
568
+ /* Interactions */
569
+ .lx-pointer-events-none{pointer-events:none}.lx-pointer-events-auto{pointer-events:auto}
570
+ .lx-select-none{user-select:none}.lx-select-all{user-select:all}.lx-select-text{user-select:text}
571
+ .lx-cursor-pointer{cursor:pointer}.lx-cursor-default{cursor:default}.lx-cursor-auto{cursor:auto}
572
+ .lx-cursor-not-allowed{cursor:not-allowed}.lx-cursor-wait{cursor:wait}
573
+ .lx-cursor-move{cursor:move}.lx-cursor-grab{cursor:grab}.lx-cursor-text{cursor:text}
574
+
575
+ /* Float */
576
+ .lx-float-start{float:inline-start}.lx-float-end{float:inline-end}.lx-float-none{float:none}
577
+ .lx-clearfix::after{content:"";display:table;clear:both}
578
+
579
+ /* Vertical align */
580
+ .lx-align-baseline{vertical-align:baseline}.lx-align-top{vertical-align:top}
581
+ .lx-align-middle{vertical-align:middle}.lx-align-bottom{vertical-align:bottom}
582
+ .lx-align-text-top{vertical-align:text-top}.lx-align-text-bottom{vertical-align:text-bottom}
583
+ .lx-align-sub{vertical-align:sub}.lx-align-super{vertical-align:super}
584
+
585
+ /* Object fit */
586
+ .lx-object-cover{object-fit:cover}.lx-object-contain{object-fit:contain}
587
+ .lx-object-fill{object-fit:fill}.lx-object-none{object-fit:none}
588
+ .lx-object-center{object-position:center}.lx-object-top{object-position:top}
589
+
590
+ /* Opacity */
591
+ .lx-opacity-0{opacity:0}.lx-opacity-25{opacity:.25}.lx-opacity-50{opacity:.5}
592
+ .lx-opacity-75{opacity:.75}.lx-opacity-100{opacity:1}
593
+
594
+ /* Text opacity helpers */
595
+ .lx-text-opacity-75{color:color-mix(in srgb,currentColor 75%,transparent)!important}
596
+ .lx-text-opacity-50{color:color-mix(in srgb,currentColor 50%,transparent)!important}
597
+ .lx-text-opacity-25{color:color-mix(in srgb,currentColor 25%,transparent)!important}
598
+ .lx-text-opacity-80{color:color-mix(in srgb,currentColor 80%,transparent)!important}
599
+
600
+ /* Z-index */
601
+ .lx-z-n1{z-index:-1}.lx-z-0{z-index:0}.lx-z-10{z-index:10}.lx-z-20{z-index:20}.lx-z-50{z-index:50}
602
+ .lx-z-dropdown{z-index:1000}.lx-z-sticky{z-index:1020}.lx-z-fixed{z-index:1030}
603
+ .lx-z-offcanvas{z-index:1040}.lx-z-modal-bg{z-index:1050}.lx-z-modal{z-index:1060}
604
+ .lx-z-popover{z-index:1070}.lx-z-tooltip{z-index:1080}.lx-z-toast{z-index:1090}
605
+
606
+ /* Ratio */
607
+ .lx-ratio{position:relative;width:100%}
608
+ .lx-ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}
609
+ .lx-ratio::before{display:block;content:"";padding-top:calc(var(--lx-aspect-ratio) * 100%)}
610
+ .lx-ratio-1x1{--lx-aspect-ratio:1}.lx-ratio-4x3{--lx-aspect-ratio:calc(3/4)}
611
+ .lx-ratio-16x9{--lx-aspect-ratio:calc(9/16)}.lx-ratio-21x9{--lx-aspect-ratio:calc(9/21)}
612
+
613
+ /* Stretched link */
614
+ .lx-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}
615
+
616
+ /* Responsive utilities */
617
+ @media(min-width:640px){
618
+ .lx-sm-block{display:block}.lx-sm-flex{display:flex}.lx-sm-grid{display:grid}.lx-sm-hidden{display:none}
619
+ .lx-sm-text-center{text-align:center}.lx-sm-text-left{text-align:left}
620
+ .lx-sm-w-full{width:100%}.lx-sm-w-auto{width:auto}}
621
+ @media(min-width:768px){
622
+ .lx-md-block{display:block}.lx-md-flex{display:flex}.lx-md-grid{display:grid}.lx-md-hidden{display:none}
623
+ .lx-md-inline-flex{display:inline-flex}.lx-md-inline-block{display:inline-block}
624
+ .lx-md-flex-row{flex-direction:row}.lx-md-flex-col{flex-direction:column}
625
+ .lx-md-justify-center{justify-content:center}.lx-md-justify-between{justify-content:space-between}
626
+ .lx-md-items-center{align-items:center}.lx-md-items-start{align-items:flex-start}
627
+ .lx-md-text-center{text-align:center}.lx-md-text-left{text-align:left}.lx-md-text-right{text-align:right}
628
+ .lx-md-text-sm{font-size:.875rem}.lx-md-text-base{font-size:1rem}.lx-md-text-lg{font-size:1.125rem}.lx-md-text-xl{font-size:1.25rem}.lx-md-text-2xl{font-size:1.5rem}.lx-md-text-3xl{font-size:1.875rem}
629
+ .lx-md-p-0{padding:0}.lx-md-p-2{padding:.5rem}.lx-md-p-4{padding:1rem}.lx-md-p-6{padding:1.5rem}.lx-md-p-8{padding:2rem}
630
+ .lx-md-px-4{padding-inline:1rem}.lx-md-px-6{padding-inline:1.5rem}.lx-md-px-8{padding-inline:2rem}
631
+ .lx-md-py-4{padding-block:1rem}.lx-md-py-6{padding-block:1.5rem}.lx-md-py-8{padding-block:2rem}
632
+ .lx-md-mt-0{margin-top:0}.lx-md-mt-4{margin-top:1rem}.lx-md-mt-8{margin-top:2rem}
633
+ .lx-md-w-full{width:100%}.lx-md-w-auto{width:auto}.lx-md-w-1\/2{width:50%}
634
+ .lx-md-float-start{float:inline-start}.lx-md-float-end{float:inline-end}.lx-md-float-none{float:none}}
635
+ @media(min-width:1024px){
636
+ .lx-lg-block{display:block}.lx-lg-flex{display:flex}.lx-lg-grid{display:grid}.lx-lg-hidden{display:none}
637
+ .lx-lg-inline-flex{display:inline-flex}.lx-lg-inline-block{display:inline-block}
638
+ .lx-lg-flex-row{flex-direction:row}.lx-lg-flex-col{flex-direction:column}
639
+ .lx-lg-justify-center{justify-content:center}.lx-lg-justify-between{justify-content:space-between}
640
+ .lx-lg-items-center{align-items:center}
641
+ .lx-lg-text-base{font-size:1rem}.lx-lg-text-lg{font-size:1.125rem}.lx-lg-text-xl{font-size:1.25rem}.lx-lg-text-2xl{font-size:1.5rem}.lx-lg-text-3xl{font-size:1.875rem}.lx-lg-text-4xl{font-size:2.25rem}
642
+ .lx-lg-p-4{padding:1rem}.lx-lg-p-6{padding:1.5rem}.lx-lg-p-8{padding:2rem}.lx-lg-p-12{padding:3rem}
643
+ .lx-lg-px-6{padding-inline:1.5rem}.lx-lg-px-8{padding-inline:2rem}.lx-lg-px-12{padding-inline:3rem}
644
+ .lx-lg-py-4{padding-block:1rem}.lx-lg-py-6{padding-block:1.5rem}.lx-lg-py-8{padding-block:2rem}
645
+ .lx-lg-w-auto{width:auto}.lx-lg-w-full{width:100%}}
646
+ @media(min-width:1280px){
647
+ .lx-xl-block{display:block}.lx-xl-flex{display:flex}.lx-xl-grid{display:grid}.lx-xl-hidden{display:none}}
648
+
649
+ /* ================================================================
650
+ §3 TYPOGRAPHY
651
+ ================================================================= */
652
+
653
+ h1, .lx-h1 { font-size: clamp(1.75rem,4vw + 1rem,2.5rem); font-weight: 700; line-height: 1.2; letter-spacing: -0.03em; }
654
+ h2, .lx-h2 { font-size: clamp(1.5rem,3vw + 0.8rem,2rem); font-weight: 700; line-height: 1.25; letter-spacing: -0.02em; }
655
+ h3, .lx-h3 { font-size: clamp(1.25rem,2.5vw + 0.6rem,1.75rem); font-weight: 700; line-height: 1.3; letter-spacing: -0.01em; }
656
+ h4, .lx-h4 { font-size: clamp(1.125rem,2vw + 0.5rem,1.5rem); font-weight: 600; line-height: 1.35; }
657
+ h5, .lx-h5 { font-size: clamp(1rem,1.5vw + 0.4rem,1.25rem); font-weight: 600; line-height: 1.4; }
658
+ h6, .lx-h6 { font-size: 1rem; font-weight: 600; line-height: 1.5; }
659
+
660
+ .lx-display-1 { font-size: clamp(2.5rem,8vw + 0.5rem,5rem); font-weight: 700; line-height: 1.1; letter-spacing: -0.04em; }
661
+ .lx-display-2 { font-size: clamp(2.2rem,7vw + 0.5rem,4.5rem); font-weight: 700; line-height: 1.1; letter-spacing: -0.04em; }
662
+ .lx-display-3 { font-size: clamp(2rem,6vw + 0.5rem,4rem); font-weight: 700; line-height: 1.15; letter-spacing: -0.03em; }
663
+ .lx-display-4 { font-size: clamp(1.8rem,5vw + 0.5rem,3.5rem); font-weight: 700; line-height: 1.2; letter-spacing: -0.03em; }
664
+
665
+ .lx-lead { font-size: var(--lx-text-lg,1.125rem); font-weight: 400; line-height: 1.7; color: var(--lx-text-secondary,#6b7280); }
666
+
667
+ small, .lx-small { font-size: var(--lx-text-xs,0.75rem); color: var(--lx-text-muted,#9ca3af); }
668
+
669
+ blockquote, .lx-blockquote {
670
+ border-left: 3px solid var(--accent,#3b82f6);
671
+ padding: 1rem 1.5rem;
672
+ margin: 1.5rem 0;
673
+ background: var(--accent-subtle,#dbeafe);
674
+ border-radius: 0 var(--lx-radius,8px) var(--lx-radius,8px) 0;
675
+ font-style: italic;
676
+ color: var(--lx-text-secondary,#6b7280);
677
+ }
678
+ .lx-blockquote-footer { font-size: var(--lx-text-sm,0.875rem); font-style: normal; font-weight: 600; color: var(--lx-text-muted,#9ca3af); margin-top: 0.5rem; }
679
+ .lx-blockquote-footer::before { content: "— "; }
680
+
681
+
682
+ /* ================================================================
683
+ §6 COMPONENTS
684
+ ================================================================= */
685
+
686
+ /* ── Button ── */
687
+ .lx-btn {
688
+ display: inline-flex;
689
+ align-items: center;
690
+ justify-content: center;
691
+ gap: 0.375rem;
692
+ padding: var(--lx-btn-padding-y) var(--lx-btn-padding-x);
693
+ font-size: var(--lx-btn-font-size);
694
+ font-weight: var(--lx-btn-font-weight);
695
+ line-height: 1.5;
696
+ border-radius: var(--lx-btn-radius);
697
+ border: 1px solid transparent;
698
+ background: transparent;
699
+ cursor: pointer;
700
+ text-decoration: none;
701
+ white-space: nowrap;
702
+ transition: var(--lx-btn-transition);
703
+ user-select: none;
704
+ -webkit-appearance: none;
705
+ }
706
+ .lx-btn:focus-visible { outline: 2px solid var(--lx-primary); outline-offset: 2px; }
707
+ .lx-btn:disabled, .lx-btn[aria-disabled="true"] { opacity: .55; cursor: not-allowed; pointer-events: none; }
708
+
709
+ .lx-btn-xs { padding: .2rem .5rem; font-size: .7rem; }
710
+ .lx-btn-sm { padding: .35rem .75rem; font-size: .8rem; }
711
+ .lx-btn-lg { padding: .65rem 1.25rem; font-size: 1rem; }
712
+ .lx-btn-xl { padding: .8rem 1.5rem; font-size: 1.1rem; }
713
+ .lx-btn-block { width: 100%; justify-content: center; }
714
+ .lx-btn-icon { padding: var(--lx-btn-padding-y); aspect-ratio: 1; }
715
+
716
+ .lx-btn-primary { background: var(--lx-primary,#3b82f6); color: var(--lx-primary-fg,#fff); border-color: var(--lx-primary,#3b82f6); }
717
+ .lx-btn-primary:hover { background: var(--lx-primary-hover,#2563eb); border-color: var(--lx-primary-hover,#2563eb); }
718
+ .lx-btn-secondary { background: var(--lx-secondary,#6b7280); color: var(--lx-secondary-fg,#fff); border-color: var(--lx-secondary,#6b7280); }
719
+ .lx-btn-secondary:hover { background: var(--lx-secondary-hover,#4b5563); border-color: var(--lx-secondary-hover,#4b5563); }
720
+ .lx-btn-success { background: var(--lx-success,#22c55e); color: var(--lx-success-fg,#fff); border-color: var(--lx-success,#22c55e); }
721
+ .lx-btn-success:hover { background: var(--lx-success-hover,#16a34a); border-color: var(--lx-success-hover,#16a34a); }
722
+ .lx-btn-warning { background: var(--lx-warning,#f59e0b); color: var(--lx-warning-fg,#fff); border-color: var(--lx-warning,#f59e0b); }
723
+ .lx-btn-warning:hover { background: var(--lx-warning-hover,#d97706); border-color: var(--lx-warning-hover,#d97706); }
724
+ .lx-btn-danger { background: var(--lx-danger,#ef4444); color: var(--lx-danger-fg,#fff); border-color: var(--lx-danger,#ef4444); }
725
+ .lx-btn-danger:hover { background: var(--lx-danger-hover,#dc2626); border-color: var(--lx-danger-hover,#dc2626); }
726
+ .lx-btn-info { background: var(--lx-info,#06b6d4); color: var(--lx-info-fg,#fff); border-color: var(--lx-info,#06b6d4); }
727
+ .lx-btn-info:hover { background: var(--lx-info-hover,#0891b2); border-color: var(--lx-info-hover,#0891b2); }
728
+ .lx-btn-dark { background: var(--lx-dark,#1f2937); color: #fff; border-color: var(--lx-dark,#1f2937); }
729
+ .lx-btn-dark:hover { background: var(--lx-gray-700,#374151); }
730
+ .lx-btn-light { background: var(--lx-light,#f9fafb); color: var(--lx-text,#111827); border-color: var(--border-default,#e5e7eb); }
731
+ .lx-btn-light:hover { background: var(--lx-gray-200,#e5e7eb); }
732
+
733
+ .lx-btn-outline-primary { border-color: var(--lx-primary,#3b82f6); color: var(--lx-primary,#3b82f6); }
734
+ .lx-btn-outline-primary:hover { background: var(--lx-primary,#3b82f6); color: #fff; }
735
+ .lx-btn-outline-secondary { border-color: var(--lx-secondary,#6b7280); color: var(--lx-secondary,#6b7280); }
736
+ .lx-btn-outline-secondary:hover { background: var(--lx-secondary,#6b7280); color: #fff; }
737
+ .lx-btn-outline-success { border-color: var(--lx-success,#22c55e); color: var(--lx-success,#22c55e); }
738
+ .lx-btn-outline-success:hover { background: var(--lx-success,#22c55e); color: #fff; }
739
+ .lx-btn-outline-warning { border-color: var(--lx-warning,#f59e0b); color: var(--lx-warning,#f59e0b); }
740
+ .lx-btn-outline-warning:hover { background: var(--lx-warning,#f59e0b); color: #fff; }
741
+ .lx-btn-outline-danger { border-color: var(--lx-danger,#ef4444); color: var(--lx-danger,#ef4444); }
742
+ .lx-btn-outline-danger:hover { background: var(--lx-danger,#ef4444); color: #fff; }
743
+ .lx-btn-outline-info { border-color: var(--lx-info,#06b6d4); color: var(--lx-info,#06b6d4); }
744
+ .lx-btn-outline-info:hover { background: var(--lx-info,#06b6d4); color: #fff; }
745
+
746
+ .lx-btn-ghost { color: var(--lx-text-secondary,#6b7280); }
747
+ .lx-btn-ghost:hover { background: var(--lx-bg-muted,#f3f4f6); color: var(--lx-text,#111827); }
748
+ .lx-btn-ghost-primary { color: var(--lx-primary,#3b82f6); }
749
+ .lx-btn-ghost-primary:hover { background: var(--lx-primary-subtle,#dbeafe); }
750
+
751
+ .lx-btn-link { color: var(--lx-primary,#3b82f6); text-decoration: underline; }
752
+ .lx-btn-link:hover { color: var(--lx-primary-hover,#2563eb); }
753
+
754
+ .lx-btn-group { display: inline-flex; border-radius: var(--lx-radius,8px); overflow: hidden; }
755
+ .lx-btn-group .lx-btn { border-radius: 0; border-inline-end-width: 0; }
756
+ .lx-btn-group .lx-btn:first-child { border-radius: var(--lx-radius,8px) 0 0 var(--lx-radius,8px); }
757
+ .lx-btn-group .lx-btn:last-child { border-radius: 0 var(--lx-radius,8px) var(--lx-radius,8px) 0; border-inline-end-width: 1px; }
758
+
759
+ .lx-btn-group-vertical { display: inline-flex; flex-direction: column; }
760
+ .lx-btn-group-vertical .lx-btn { border-radius: 0; border-bottom-width: 0; }
761
+ .lx-btn-group-vertical .lx-btn:first-child { border-radius: var(--lx-radius,8px) var(--lx-radius,8px) 0 0; }
762
+ .lx-btn-group-vertical .lx-btn:last-child { border-radius: 0 0 var(--lx-radius,8px) var(--lx-radius,8px); border-bottom-width: 1px; }
763
+
764
+ .lx-btn-toolbar { display: flex; flex-wrap: wrap; gap: .5rem; }
765
+ .lx-btn-check { position: absolute; clip: rect(0,0,0,0); pointer-events: none; }
766
+ .lx-btn-close {
767
+ display: flex;
768
+ align-items: center;
769
+ justify-content:center;
770
+ width: 2rem;
771
+ height: 2rem;
772
+ padding: 0;
773
+ background: transparent;
774
+ border: none;
775
+ border-radius: var(--lx-radius-full,9999px);
776
+ cursor: pointer;
777
+ opacity: .5;
778
+ transition: var(--lx-transition);
779
+ font-size: 1.2rem;
780
+ line-height: 1;
781
+ color: var(--lx-text,#111827);
782
+ }
783
+ .lx-btn-close::before { content: "×"; }
784
+ .lx-btn-close:hover { opacity: 1; background: var(--lx-bg-muted,#f3f4f6); }
785
+ .lx-btn-close-white { color: #fff; }
786
+ .lx-btn-close-white:hover { background: rgba(255,255,255,.15); }
787
+
788
+
789
+ /* ── Card ── */
790
+ .lx-card {
791
+ background: var(--lx-bg,#fff);
792
+ border: var(--lx-card-border);
793
+ border-radius: var(--lx-card-radius);
794
+ box-shadow: var(--lx-card-shadow);
795
+ overflow: hidden;
796
+ }
797
+ .lx-card-hover { -webkit-transition: var(--lx-transition); transition: var(--lx-transition); }
798
+ .lx-card-hover:hover { -webkit-transform: translateY(-2px); transform: translateY(-2px); -webkit-box-shadow: var(--lx-shadow-lg); box-shadow: var(--lx-shadow-lg); }
799
+
800
+ .lx-card-header {
801
+ padding: .875rem var(--lx-card-padding);
802
+ border-bottom: 1px solid var(--lx-border,#e5e7eb);
803
+ background: var(--lx-bg-soft,#f9fafb);
804
+ font-weight: 600;
805
+ font-size: var(--lx-text-sm,0.875rem);
806
+ color: var(--lx-text-secondary,#6b7280);
807
+ text-transform: uppercase;
808
+ letter-spacing: .05em;
809
+ }
810
+ .lx-card-body { padding: var(--lx-card-padding); }
811
+ .lx-card-footer { padding: .875rem var(--lx-card-padding); border-top: 1px solid var(--lx-border,#e5e7eb); background: var(--lx-bg-soft,#f9fafb); }
812
+ .lx-card-title { font-size: var(--lx-text-lg,1.125rem); font-weight: 600; margin-bottom: .5rem; color: var(--lx-text,#111827); }
813
+ .lx-card-subtitle{ font-size: var(--lx-text-sm,0.875rem); color: var(--lx-text-muted,#9ca3af); margin-top: -.25rem; margin-bottom: .75rem; }
814
+ .lx-card-text { color: var(--lx-text-secondary,#6b7280); line-height: 1.65; }
815
+
816
+ .lx-card-img-top { width: 100%; object-fit: cover; display: block; }
817
+ .lx-card-img-side { object-fit: cover; flex-shrink: 0; }
818
+ .lx-card-img { width: 100%; height: 100%; object-fit: cover; }
819
+ .lx-card-img-overlay-wrap { position: relative; }
820
+ .lx-card-img-overlay {
821
+ position: absolute;
822
+ inset: 0;
823
+ padding: var(--lx-card-padding);
824
+ display: flex;
825
+ flex-direction: column;
826
+ justify-content: flex-end;
827
+ background: linear-gradient(to top, rgba(0,0,0,.7) 0%, transparent 60%);
828
+ }
829
+
830
+
831
+ /* ── Badge ── */
832
+ .lx-badge {
833
+ display: inline-flex;
834
+ align-items: center;
835
+ padding: var(--lx-badge-padding-y) var(--lx-badge-padding-x);
836
+ font-size: var(--lx-badge-font-size);
837
+ font-weight: var(--lx-badge-font-weight);
838
+ line-height: 1;
839
+ border-radius: var(--lx-badge-radius);
840
+ white-space: nowrap;
841
+ }
842
+ .lx-badge-sm { font-size: .65em; }
843
+ .lx-badge-lg { font-size: .875em; padding: .35em .7em; }
844
+
845
+ .lx-badge-primary { background: var(--lx-primary,#3b82f6); color: var(--lx-primary-fg,#fff); }
846
+ .lx-badge-secondary { background: var(--lx-secondary,#6b7280); color: #fff; }
847
+ .lx-badge-success { background: var(--lx-success,#22c55e); color: #fff; }
848
+ .lx-badge-warning { background: var(--lx-warning,#f59e0b); color: #fff; }
849
+ .lx-badge-danger { background: var(--lx-danger,#ef4444); color: #fff; }
850
+ .lx-badge-info { background: var(--lx-info,#06b6d4); color: #fff; }
851
+ .lx-badge-dark { background: var(--lx-dark,#1f2937); color: #fff; }
852
+ .lx-badge-light { background: var(--lx-light,#f9fafb); color: var(--lx-text,#111827); border: 1px solid var(--border-default,#e5e7eb); }
853
+
854
+ .lx-badge-outline-primary { border: 1px solid var(--lx-primary,#3b82f6); color: var(--lx-primary,#3b82f6); background: transparent; }
855
+ .lx-badge-outline-secondary { border: 1px solid var(--lx-secondary,#6b7280); color: var(--lx-secondary,#6b7280); background: transparent; }
856
+ .lx-badge-outline-success { border: 1px solid var(--lx-success,#22c55e); color: var(--lx-success,#22c55e); background: transparent; }
857
+ .lx-badge-outline-danger { border: 1px solid var(--lx-danger,#ef4444); color: var(--lx-danger,#ef4444); background: transparent; }
858
+ .lx-badge-outline-warning { border: 1px solid var(--lx-warning,#f59e0b); color: var(--lx-warning,#f59e0b); background: transparent; }
859
+
860
+ .lx-badge-soft-primary { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); }
861
+ .lx-badge-soft-secondary { background: var(--lx-gray-100,#f3f4f6); color: var(--lx-secondary,#6b7280); }
862
+ .lx-badge-soft-success { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); }
863
+ .lx-badge-soft-warning { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); }
864
+ .lx-badge-soft-danger { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); }
865
+ .lx-badge-soft-info { background: var(--lx-info-subtle,#ecfeff); color: var(--lx-info-hover,#0891b2); }
866
+
867
+
868
+ /* ── Alert ── */
869
+ .lx-alert {
870
+ position: relative;
871
+ padding: .875rem 1.125rem;
872
+ border-radius: var(--lx-radius,8px);
873
+ border: 1px solid transparent;
874
+ font-size: var(--lx-text-sm,0.875rem);
875
+ line-height: 1.6;
876
+ }
877
+ .lx-alert-heading { font-weight: 700; font-size: var(--lx-text-base,1rem); margin-bottom: .375rem; }
878
+ .lx-alert-divider { border-color: currentColor; opacity: .2; margin: .75rem 0; }
879
+ .lx-alert-dismissible { padding-inline-end: 3rem; }
880
+ .lx-alert-close { position: absolute; top: .5rem; inset-inline-end: .5rem; }
881
+
882
+ .lx-alert-primary { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary-hover,#2563eb); border-color: var(--lx-primary-light,#93c5fd); }
883
+ .lx-alert-secondary { background: var(--lx-gray-100,#f3f4f6); color: var(--lx-gray-700,#374151); border-color: var(--lx-gray-300,#d1d5db); }
884
+ .lx-alert-success { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); border-color: var(--lx-success-light,#86efac); }
885
+ .lx-alert-warning { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); border-color: var(--lx-warning-light,#fcd34d); }
886
+ .lx-alert-danger { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); border-color: var(--lx-danger-light,#fca5a5); }
887
+ .lx-alert-info { background: var(--lx-info-subtle,#ecfeff); color: var(--lx-info-hover,#0891b2); border-color: var(--lx-info-light,#67e8f9); }
888
+
889
+
890
+ /* ── Progress ── */
891
+ .lx-progress {
892
+ height: var(--lx-progress-height);
893
+ background: var(--lx-progress-bg);
894
+ border-radius: var(--lx-progress-radius);
895
+ overflow: hidden;
896
+ }
897
+ .lx-progress-bar {
898
+ height: 100%;
899
+ background: var(--lx-primary,#3b82f6);
900
+ border-radius: inherit;
901
+ transition: width .4s ease;
902
+ display: flex;
903
+ align-items: center;
904
+ justify-content: center;
905
+ font-size: .65rem;
906
+ font-weight: 700;
907
+ color: white;
908
+ }
909
+ .lx-progress-bar-striped {
910
+ background-image: repeating-linear-gradient(45deg, rgba(255,255,255,.15) 0, rgba(255,255,255,.15) 10px, transparent 10px, transparent 20px);
911
+ }
912
+ .lx-progress-bar-animated { animation: lx-progress-stripes 1s linear infinite; }
913
+ @keyframes lx-progress-stripes { to { background-position-x: -20px; } }
914
+
915
+
916
+ /* ── Spinner ── */
917
+ .lx-spinner {
918
+ display: inline-block;
919
+ width: 1.5rem;
920
+ height: 1.5rem;
921
+ border: 2px solid currentColor;
922
+ border-right-color: transparent;
923
+ border-radius: 50%;
924
+ -webkit-animation: lx-spin .6s linear infinite;
925
+ animation: lx-spin .6s linear infinite;
926
+ vertical-align: -.125em;
927
+ color: var(--lx-primary,#3b82f6);
928
+ }
929
+ .lx-spinner-sm { width: 1rem; height: 1rem; border-width: 2px; }
930
+ .lx-spinner-lg { width: 2.25rem; height: 2.25rem; border-width: 3px; }
931
+ .lx-spinner-xl { width: 3rem; height: 3rem; border-width: 3px; }
932
+ .lx-spinner-grow { background: currentColor; border: none; animation: lx-grow .75s ease-in-out infinite; }
933
+ @-webkit-keyframes lx-spin { to { -webkit-transform: rotate(360deg); transform: rotate(360deg); } }
934
+ @keyframes lx-spin { to { -webkit-transform: rotate(360deg); transform: rotate(360deg); } }
935
+ @-webkit-keyframes lx-grow {
936
+ 0% { -webkit-transform: scale(0); transform: scale(0); opacity: 0; }
937
+ 50% { opacity: 1; }
938
+ 100% { -webkit-transform: scale(1); transform: scale(1); opacity: 0; }
939
+ }
940
+ @keyframes lx-grow {
941
+ 0% { -webkit-transform: scale(0); transform: scale(0); opacity: 0; }
942
+ 50% { opacity: 1; }
943
+ 100% { -webkit-transform: scale(1); transform: scale(1); opacity: 0; }
944
+ }
945
+ .lx-loading-overlay {
946
+ position: fixed; inset: 0; background: rgba(255,255,255,.8);
947
+ display: flex; align-items: center; justify-content: center;
948
+ z-index: var(--lx-z-toast,1090);
949
+ -webkit-backdrop-filter: blur(2px);
950
+ backdrop-filter: blur(2px);
951
+ }
952
+
953
+
954
+ /* ── Avatar ── */
955
+ .lx-avatar {
956
+ display: inline-flex;
957
+ align-items: center;
958
+ justify-content: center;
959
+ width: var(--lx-avatar-size);
960
+ height: var(--lx-avatar-size);
961
+ border-radius: var(--lx-avatar-radius);
962
+ font-size: var(--lx-avatar-font-size);
963
+ font-weight: 600;
964
+ background: var(--lx-gray-200,#e5e7eb);
965
+ color: var(--lx-gray-600,#4b5563);
966
+ overflow: hidden;
967
+ flex-shrink: 0;
968
+ user-select: none;
969
+ }
970
+ .lx-avatar img { width: 100%; height: 100%; object-fit: cover; }
971
+ .lx-avatar-xs { width: 1.5rem; height: 1.5rem; font-size: .55rem; }
972
+ .lx-avatar-sm { width: 2rem; height: 2rem; font-size: .7rem; }
973
+ .lx-avatar-lg { width: 3.5rem; height: 3.5rem; font-size: 1rem; }
974
+ .lx-avatar-xl { width: 4.5rem; height: 4.5rem; font-size: 1.25rem; }
975
+ .lx-avatar-2xl { width: 6rem; height: 6rem; font-size: 1.5rem; }
976
+ .lx-avatar-primary { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); }
977
+ .lx-avatar-success { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); }
978
+ .lx-avatar-warning { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); }
979
+ .lx-avatar-danger { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); }
980
+ .lx-avatar-info { background: var(--lx-info-subtle,#ecfeff); color: var(--lx-info-hover,#0891b2); }
981
+ .lx-avatar-wrapper { position: relative; display: inline-block; }
982
+ .lx-avatar-status { position: absolute; bottom: 0; inset-inline-end: 0; width: .75rem; height: .75rem; border-radius: 50%; border: 2px solid var(--lx-bg,#fff); }
983
+ .lx-avatar-status-online { background: var(--lx-success,#22c55e); }
984
+ .lx-avatar-status-busy { background: var(--lx-danger,#ef4444); }
985
+ .lx-avatar-status-away { background: var(--lx-warning,#f59e0b); }
986
+ .lx-avatar-status-offline { background: var(--lx-gray-400,#9ca3af); }
987
+ .lx-avatar-group { display: inline-flex; }
988
+ .lx-avatar-group .lx-avatar { margin-inline-start: -.5rem; border: 2px solid var(--lx-bg,#fff); }
989
+ .lx-avatar-group .lx-avatar:first-child { margin-inline-start: 0; }
990
+
991
+
992
+ /* ── Breadcrumb ── */
993
+ .lx-breadcrumb {
994
+ display: flex; flex-wrap: wrap; gap: .25rem;
995
+ list-style: none; padding: 0; margin: 0;
996
+ font-size: var(--lx-text-sm,0.875rem);
997
+ }
998
+ .lx-breadcrumb-item { display: flex; align-items: center; color: var(--lx-text-muted,#9ca3af); }
999
+ .lx-breadcrumb-item a { color: var(--lx-text-secondary,#6b7280); text-decoration: none; transition: color .1s ease; }
1000
+ .lx-breadcrumb-item a:hover { color: var(--lx-primary,#3b82f6); }
1001
+ .lx-breadcrumb-item.lx-active { color: var(--lx-text,#111827); font-weight: 500; }
1002
+ .lx-breadcrumb-item + .lx-breadcrumb-item::before { content: var(--lx-breadcrumb-sep); padding-inline: .4rem; color: var(--lx-text-muted,#9ca3af); }
1003
+
1004
+
1005
+ /* ── Utility: scroll lock & fade ── */
1006
+ body.lx-modal-open { overflow: hidden; }
1007
+ .lx-fade { animation: lx-fadein .2s ease; }
1008
+ .lx-offcanvas-backdrop {
1009
+ position: fixed;
1010
+ inset: 0;
1011
+ z-index: 1039;
1012
+ background: rgba(0,0,0,.5);
1013
+ -webkit-backdrop-filter: blur(2px);
1014
+ backdrop-filter: blur(2px);
1015
+ }
1016
+
1017
+ /* ── Modal ── */
1018
+ .lx-modal {
1019
+ display: none; position: fixed; inset: 0;
1020
+ z-index: var(--lx-z-modal,1060); overflow-x: hidden; overflow-y: auto;
1021
+ align-items: center; justify-content: center;
1022
+ }
1023
+ .lx-modal.lx-show { display: flex; }
1024
+ .lx-modal-backdrop {
1025
+ position: fixed; inset: 0;
1026
+ background: var(--lx-modal-backdrop,rgba(0,0,0,.5));
1027
+ z-index: var(--lx-z-modal-bg,1050);
1028
+ -webkit-backdrop-filter: blur(2px);
1029
+ backdrop-filter: blur(2px);
1030
+ }
1031
+ .lx-modal-dialog {
1032
+ position: relative; width: 100%; max-width: 500px;
1033
+ margin: auto; padding: 1rem; z-index: inherit;
1034
+ }
1035
+ .lx-modal-sm { max-width: 300px; }
1036
+ .lx-modal-lg { max-width: 800px; }
1037
+ .lx-modal-xl { max-width: 1100px; }
1038
+ .lx-modal-fullscreen { max-width: none; padding: 0; min-height: 100dvh; }
1039
+ .lx-modal-dialog-centered { display: flex; align-items: center; min-height: calc(100% - 2rem); }
1040
+ .lx-modal-dialog-scrollable .lx-modal-body { overflow-y: auto; max-height: 60vh; }
1041
+ .lx-modal-content {
1042
+ background: var(--lx-bg,#fff); border-radius: var(--lx-modal-radius,16px);
1043
+ box-shadow: var(--lx-modal-shadow); border: 1px solid var(--border-default,#e5e7eb); overflow: hidden;
1044
+ }
1045
+ .lx-modal-header {
1046
+ display: flex; align-items: center; justify-content: space-between;
1047
+ padding: 1.25rem var(--lx-card-padding); border-bottom: 1px solid var(--border-default,#e5e7eb);
1048
+ }
1049
+ .lx-modal-title { font-size: var(--lx-text-lg,1.125rem); font-weight: 600; color: var(--lx-text,#111827); }
1050
+ .lx-modal-body { padding: var(--lx-card-padding); }
1051
+ .lx-modal-footer {
1052
+ display: flex; align-items: center; justify-content: flex-end; gap: .5rem;
1053
+ padding: 1rem var(--lx-card-padding); border-top: 1px solid var(--border-default,#e5e7eb);
1054
+ background: var(--lx-bg-soft,#f9fafb);
1055
+ }
1056
+ .lx-modal.lx-fade .lx-modal-content { -webkit-animation: lx-modal-in .3s ease; animation: lx-modal-in .3s ease; }
1057
+ @-webkit-keyframes lx-modal-in {
1058
+ from { opacity: 0; -webkit-transform: scale(.96) translateY(-8px); }
1059
+ to { opacity: 1; -webkit-transform: scale(1) translateY(0); }
1060
+ }
1061
+ @keyframes lx-modal-in {
1062
+ from { opacity: 0; transform: scale(.96) translateY(-8px); }
1063
+ to { opacity: 1; transform: scale(1) translateY(0); }
1064
+ }
1065
+
1066
+
1067
+ /* ── Offcanvas / Drawer ── */
1068
+ .lx-offcanvas {
1069
+ position: fixed; z-index: var(--lx-z-offcanvas,1040);
1070
+ background: var(--lx-bg,#fff); box-shadow: var(--lx-shadow-xl);
1071
+ display: flex; flex-direction: column;
1072
+ visibility: hidden;
1073
+ transition: transform .3s ease, visibility .3s;
1074
+ }
1075
+ .lx-offcanvas.lx-show { visibility: visible; }
1076
+ .lx-offcanvas-start { top: 0; inset-inline-start: 0; height: 100%; width: min(80vw, 360px); transform: translateX(-100%); }
1077
+ .lx-offcanvas-end { top: 0; inset-inline-end: 0; height: 100%; width: min(80vw, 360px); transform: translateX(100%); }
1078
+ .lx-offcanvas-top { top: 0; inset-inline: 0; max-height: 80vh; transform: translateY(-100%); }
1079
+ .lx-offcanvas-bottom { bottom: 0; inset-inline: 0; max-height: 80vh; transform: translateY(100%); }
1080
+ .lx-offcanvas.lx-show.lx-offcanvas-start,
1081
+ .lx-offcanvas.lx-show.lx-offcanvas-end,
1082
+ .lx-offcanvas.lx-show.lx-offcanvas-top,
1083
+ .lx-offcanvas.lx-show.lx-offcanvas-bottom { transform: none; }
1084
+ .lx-offcanvas-header {
1085
+ display: flex; align-items: center; justify-content: space-between;
1086
+ padding: 1.25rem 1.5rem; border-bottom: 1px solid var(--border-default,#e5e7eb); flex-shrink: 0;
1087
+ }
1088
+ .lx-offcanvas-title { font-weight: 600; font-size: var(--lx-text-lg,1.125rem); color: var(--lx-text,#111827); }
1089
+ .lx-offcanvas-body { padding: 1.5rem; flex: 1; overflow-y: auto; }
1090
+
1091
+
1092
+ /* ── Dropdown ── */
1093
+ .lx-dropdown { position: relative; display: inline-block; }
1094
+ .lx-dropdown-toggle::after {
1095
+ content: ""; display: inline-block;
1096
+ width: .35em; height: .35em;
1097
+ border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
1098
+ transform: rotate(45deg) translateY(-.1em);
1099
+ margin-inline-start: .4em; vertical-align: .1em;
1100
+ }
1101
+ .lx-dropdown-menu {
1102
+ display: none; position: absolute;
1103
+ inset-block-start: calc(100% + .25rem); inset-inline-start: 0;
1104
+ min-width: 10rem; padding: .375rem;
1105
+ background: var(--lx-bg,#fff); border: 1px solid var(--border-default,#e5e7eb);
1106
+ border-radius: var(--lx-radius-md,12px); box-shadow: var(--lx-shadow-lg);
1107
+ z-index: var(--lx-z-dropdown,1000); list-style: none;
1108
+ animation: lx-dropdown-in .1s ease;
1109
+ }
1110
+ .lx-dropdown-menu.lx-show { display: block; }
1111
+ .lx-dropdown-menu.lx-dropdown-menu-end { inset-inline-start: auto; inset-inline-end: 0; }
1112
+ .lx-dropup .lx-dropdown-menu { top: auto; bottom: calc(100% + .25rem); }
1113
+ .lx-dropend .lx-dropdown-menu { top: 0; inset-inline-start: calc(100% + .25rem); }
1114
+ .lx-dropstart .lx-dropdown-menu { top: 0; inset-inline-start: auto; inset-inline-end: calc(100% + .25rem); }
1115
+ .lx-dropdown-item {
1116
+ display: flex; align-items: center; width: 100%; padding: .45rem .75rem;
1117
+ font-size: var(--lx-text-sm,0.875rem); color: var(--lx-text-secondary,#6b7280);
1118
+ background: transparent; border: none; border-radius: var(--lx-radius,8px);
1119
+ cursor: pointer; white-space: nowrap; text-decoration: none;
1120
+ transition: background .1s ease, color .1s ease;
1121
+ }
1122
+ .lx-dropdown-item:hover { background: var(--lx-bg-muted,#f3f4f6); color: var(--lx-text,#111827); }
1123
+ .lx-dropdown-item.lx-active { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); font-weight: 500; }
1124
+ .lx-dropdown-item.lx-disabled { opacity: .5; cursor: not-allowed; pointer-events: none; }
1125
+ .lx-dropdown-header { padding: .375rem .75rem; font-size: .7rem; font-weight: 700; color: var(--lx-text-muted,#9ca3af); text-transform: uppercase; letter-spacing: .05em; }
1126
+ .lx-dropdown-divider { border: none; border-top: 1px solid var(--border-default,#e5e7eb); margin: .375rem 0; }
1127
+ @-webkit-keyframes lx-dropdown-in { from { opacity: 0; -webkit-transform: translateY(-4px); } to { opacity: 1; -webkit-transform: translateY(0); } }
1128
+ @keyframes lx-dropdown-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } }
1129
+
1130
+
1131
+ /* ── Navbar ── */
1132
+ .lx-navbar {
1133
+ display: flex; align-items: center; flex-wrap: wrap;
1134
+ padding: .75rem 0; background: var(--lx-bg,#fff); border-bottom: 1px solid var(--border-default,#e5e7eb);
1135
+ }
1136
+ .lx-navbar-brand {
1137
+ display: flex; align-items: center; gap: .5rem;
1138
+ font-size: var(--lx-text-lg,1.125rem); font-weight: 700;
1139
+ color: var(--lx-text,#111827); text-decoration: none;
1140
+ margin-inline-end: 1.5rem; flex-shrink: 0;
1141
+ }
1142
+ .lx-navbar-brand img { height: 32px; width: auto; }
1143
+ .lx-navbar-nav { display: flex; align-items: center; gap: .125rem; list-style: none; padding: 0; margin: 0; }
1144
+ .lx-navbar-nav .lx-nav-link {
1145
+ font-size: var(--lx-text-sm,0.875rem); font-weight: 500;
1146
+ padding: .45rem .75rem; color: var(--lx-text-secondary,#6b7280);
1147
+ border-radius: var(--lx-radius,8px); text-decoration: none;
1148
+ transition: background .1s ease, color .1s ease;
1149
+ }
1150
+ .lx-navbar-nav .lx-nav-link:hover { background: var(--lx-bg-muted,#f3f4f6); color: var(--lx-text,#111827); }
1151
+ .lx-navbar-nav .lx-nav-link.lx-active { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); font-weight: 600; }
1152
+ .lx-navbar-dark { background: var(--lx-dark,#1f2937); border-color: transparent; }
1153
+ .lx-navbar-dark .lx-navbar-brand, .lx-navbar-dark .lx-nav-link { color: rgba(255,255,255,.85); }
1154
+ .lx-navbar-dark .lx-nav-link:hover { background: rgba(255,255,255,.1); color: #fff; }
1155
+ .lx-navbar-toggler {
1156
+ padding: .375rem .5rem; background: transparent;
1157
+ border: 1px solid var(--border-default,#e5e7eb); border-radius: var(--lx-radius,8px);
1158
+ cursor: pointer; display: none;
1159
+ }
1160
+ .lx-navbar-toggler-icon { display: block; width: 22px; height: 2px; background: currentColor; box-shadow: 0 5px 0 currentColor, 0 10px 0 currentColor; }
1161
+ .lx-navbar-collapse { display: flex; align-items: center; flex: 1; }
1162
+ .lx-navbar-expand-lg .lx-navbar-collapse { display: flex !important; }
1163
+ @media (max-width: 1023.98px) {
1164
+ .lx-navbar-expand-lg .lx-navbar-toggler { display: flex; }
1165
+ .lx-navbar-expand-lg .lx-navbar-collapse {
1166
+ display: none; width: 100%; flex-direction: column; align-items: flex-start;
1167
+ padding: .75rem 0; border-top: 1px solid var(--border-default,#e5e7eb); margin-top: .75rem;
1168
+ }
1169
+ .lx-navbar-expand-lg .lx-navbar-collapse.lx-show { display: flex; }
1170
+ .lx-navbar-expand-lg .lx-navbar-nav { flex-direction: column; width: 100%; gap: .125rem; }
1171
+ .lx-navbar-expand-lg .lx-navbar-nav .lx-nav-link { width: 100%; }
1172
+ }
1173
+
1174
+
1175
+ /* ── Navs & Tabs ── */
1176
+ .lx-nav { display: flex; flex-wrap: wrap; gap: .125rem; list-style: none; padding: 0; margin: 0; }
1177
+ .lx-nav-link {
1178
+ display: block; padding: .45rem .875rem;
1179
+ font-size: var(--lx-text-sm,0.875rem); font-weight: 500;
1180
+ color: var(--lx-text-secondary,#6b7280); border-radius: var(--lx-radius,8px);
1181
+ text-decoration: none; background: transparent; border: none; cursor: pointer;
1182
+ transition: var(--lx-transition);
1183
+ }
1184
+ .lx-nav-link:hover { background: var(--lx-bg-muted,#f3f4f6); color: var(--lx-text,#111827); }
1185
+ .lx-nav-link.lx-active { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); font-weight: 600; }
1186
+ .lx-nav-link.lx-disabled { opacity: .5; cursor: not-allowed; pointer-events: none; }
1187
+ .lx-nav-tabs { border-bottom: 1px solid var(--border-default,#e5e7eb); gap: 0; padding-bottom: 0; }
1188
+ .lx-nav-tabs .lx-nav-link { border-radius: var(--lx-radius,8px) var(--lx-radius,8px) 0 0; border: 1px solid transparent; margin-bottom: -1px; }
1189
+ .lx-nav-tabs .lx-nav-link.lx-active { background: var(--lx-bg,#fff); border-color: var(--border-default,#e5e7eb) var(--border-default,#e5e7eb) var(--lx-bg,#fff); color: var(--lx-text,#111827); font-weight: 600; }
1190
+ .lx-nav-pills .lx-nav-link { border-radius: var(--lx-radius-full,9999px); }
1191
+ .lx-nav-pills .lx-nav-link.lx-active { background: var(--lx-primary,#3b82f6); color: #fff; }
1192
+ .lx-nav-fill .lx-nav-item, .lx-nav-justified .lx-nav-item { flex: 1; }
1193
+ .lx-nav-fill .lx-nav-link, .lx-nav-justified .lx-nav-link { text-align: center; }
1194
+ .lx-tab-content .lx-tab-pane { display: none; }
1195
+ .lx-tab-content .lx-tab-pane.lx-active { display: block; -webkit-animation: lx-fadein .2s ease; animation: lx-fadein .2s ease; }
1196
+ @-webkit-keyframes lx-fadein { from { opacity: 0; } to { opacity: 1; } }
1197
+ @keyframes lx-fadein { from { opacity: 0; } to { opacity: 1; } }
1198
+
1199
+
1200
+ /* ── List Group ── */
1201
+ .lx-list-group { display: flex; flex-direction: column; border-radius: var(--lx-radius-md,12px); overflow: hidden; border: 1px solid var(--border-default,#e5e7eb); }
1202
+ .lx-list-group-item { padding: .75rem 1rem; font-size: var(--lx-text-sm,0.875rem); background: var(--lx-bg,#fff); color: var(--lx-text-secondary,#6b7280); border-bottom: 1px solid var(--border-default,#e5e7eb); }
1203
+ .lx-list-group-item:last-child { border-bottom: none; }
1204
+ .lx-list-group-item.lx-active { background: var(--lx-primary,#3b82f6); color: #fff; border-color: var(--lx-primary,#3b82f6); }
1205
+ .lx-list-group-item.lx-disabled { opacity: .55; cursor: not-allowed; pointer-events: none; }
1206
+ .lx-list-group-item-action { cursor: pointer; text-decoration: none; display: block; transition: background .1s ease; }
1207
+ .lx-list-group-item-action:hover { background: var(--lx-bg-muted,#f3f4f6); color: var(--lx-text,#111827); }
1208
+ .lx-list-group-item-success { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); border-color: var(--lx-success-light,#86efac); }
1209
+ .lx-list-group-item-warning { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); border-color: var(--lx-warning-light,#fcd34d); }
1210
+ .lx-list-group-item-danger { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); border-color: var(--lx-danger-light,#fca5a5); }
1211
+ .lx-list-group-item-info { background: var(--lx-info-subtle,#ecfeff); color: var(--lx-info-hover,#0891b2); border-color: var(--lx-info-light,#67e8f9); }
1212
+ .lx-list-group-horizontal { flex-direction: row; }
1213
+ .lx-list-group-horizontal .lx-list-group-item { border-bottom: none; border-inline-end: 1px solid var(--border-default,#e5e7eb); }
1214
+ .lx-list-group-horizontal .lx-list-group-item:last-child { border-inline-end: none; }
1215
+
1216
+
1217
+ /* ── Pagination ── */
1218
+ .lx-pagination { display: inline-flex; align-items: center; gap: .125rem; list-style: none; padding: 0; margin: 0; }
1219
+ .lx-page-link {
1220
+ display: flex; align-items: center; justify-content: center;
1221
+ min-width: 2rem; height: 2rem; padding: 0 .5rem;
1222
+ font-size: var(--lx-text-sm,0.875rem); font-weight: 500;
1223
+ color: var(--lx-text-secondary,#6b7280); background: var(--lx-bg,#fff);
1224
+ border: 1px solid var(--border-default,#e5e7eb); border-radius: var(--lx-radius,8px);
1225
+ text-decoration: none; cursor: pointer; transition: var(--lx-transition);
1226
+ }
1227
+ .lx-page-link:hover { background: var(--lx-bg-muted,#f3f4f6); color: var(--lx-text,#111827); }
1228
+ .lx-page-item.lx-active .lx-page-link { background: var(--lx-primary,#3b82f6); color: white; border-color: var(--lx-primary,#3b82f6); }
1229
+ .lx-page-item.lx-disabled .lx-page-link { opacity: .5; cursor: not-allowed; pointer-events: none; }
1230
+ .lx-pagination-sm .lx-page-link { min-width: 1.75rem; height: 1.75rem; font-size: .75rem; }
1231
+ .lx-pagination-lg .lx-page-link { min-width: 2.5rem; height: 2.5rem; font-size: 1rem; }
1232
+
1233
+
1234
+ /* ── Accordion ── */
1235
+ .lx-accordion { border: 1px solid var(--border-default,#e5e7eb); border-radius: var(--lx-radius-md,12px); overflow: hidden; }
1236
+ .lx-accordion-item { border-bottom: 1px solid var(--border-default,#e5e7eb); }
1237
+ .lx-accordion-item:last-child { border-bottom: none; }
1238
+ .lx-accordion-flush { border: none; border-radius: 0; }
1239
+ .lx-accordion-flush .lx-accordion-item { border-inline: none; }
1240
+ .lx-accordion-trigger {
1241
+ display: flex; align-items: center; justify-content: space-between;
1242
+ width: 100%; padding: 1rem 1.25rem;
1243
+ font-size: var(--lx-text-sm,0.875rem); font-weight: 600; color: var(--lx-text,#111827);
1244
+ background: var(--lx-bg,#fff); border: none; cursor: pointer; text-align: start;
1245
+ transition: background .1s ease;
1246
+ }
1247
+ .lx-accordion-trigger:hover { background: var(--lx-bg-soft,#f9fafb); }
1248
+ .lx-accordion-trigger.lx-active { color: var(--lx-primary,#3b82f6); background: var(--lx-primary-subtle,#dbeafe); }
1249
+ .lx-accordion-icon {
1250
+ width: .875rem; height: .875rem;
1251
+ border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
1252
+ transform: rotate(45deg); flex-shrink: 0; transition: transform .2s ease;
1253
+ }
1254
+ .lx-accordion-trigger.lx-active .lx-accordion-icon { transform: rotate(-135deg); }
1255
+ .lx-accordion-body { display: none; padding: 1rem 1.25rem; font-size: var(--lx-text-sm,0.875rem); color: var(--lx-text-secondary,#6b7280); line-height: 1.7; }
1256
+ .lx-accordion-body.lx-show { display: block; animation: lx-fadein .2s ease; }
1257
+
1258
+
1259
+ /* ── Collapse ── */
1260
+ .lx-collapse { display: none; }
1261
+ .lx-collapse.lx-show { display: block; animation: lx-fadein .2s ease; }
1262
+ .lx-collapsing { overflow: hidden; transition: height .3s ease; }
1263
+
1264
+
1265
+ /* ── Toast (CSS component) ── */
1266
+ .lx-toast-container { display: flex; flex-direction: column; gap: .5rem; }
1267
+ .lx-toast {
1268
+ min-width: 280px; max-width: 380px;
1269
+ background: var(--lx-bg,#fff); border: 1px solid var(--border-default,#e5e7eb);
1270
+ border-radius: var(--lx-radius-md,12px); box-shadow: var(--lx-shadow-lg);
1271
+ overflow: hidden; opacity: 0;
1272
+ transition: opacity .2s ease, transform .2s ease; transform: translateX(1rem);
1273
+ }
1274
+ .lx-toast.lx-show { opacity: 1; transform: translateX(0); }
1275
+ .lx-toast-header { display: flex; align-items: center; padding: .6rem .875rem; border-bottom: 1px solid var(--border-default,#e5e7eb); background: var(--lx-bg-soft,#f9fafb); font-size: var(--lx-text-sm,0.875rem); font-weight: 600; gap: .5rem; }
1276
+ .lx-toast-body { padding: .75rem .875rem; font-size: var(--lx-text-sm,0.875rem); color: var(--lx-text-secondary,#6b7280); }
1277
+
1278
+
1279
+ /* ── Tooltip (CSS component) ── */
1280
+ .lx-tooltip {
1281
+ position: absolute; z-index: var(--lx-z-tooltip,1080);
1282
+ background: var(--lx-tooltip-bg,#111827); color: var(--lx-tooltip-color,#fff);
1283
+ font-size: .75rem; padding: .3rem .6rem; border-radius: var(--lx-tooltip-radius,4px);
1284
+ pointer-events: none; max-width: 200px; white-space: normal; line-height: 1.4;
1285
+ animation: lx-fadein .1s ease;
1286
+ }
1287
+
1288
+
1289
+ /* ── Popover (CSS component) ── */
1290
+ .lx-popover {
1291
+ position: absolute; z-index: var(--lx-z-popover,1070);
1292
+ background: var(--lx-bg,#fff); border: 1px solid var(--border-default,#e5e7eb);
1293
+ border-radius: var(--lx-radius-md,12px); box-shadow: var(--lx-shadow-lg);
1294
+ max-width: 280px; font-size: var(--lx-text-sm,0.875rem);
1295
+ animation: lx-fadein .1s ease;
1296
+ }
1297
+ .lx-popover-header { padding: .6rem .875rem; font-weight: 600; border-bottom: 1px solid var(--border-default,#e5e7eb); background: var(--lx-bg-soft,#f9fafb); border-radius: var(--lx-radius-md,12px) var(--lx-radius-md,12px) 0 0; }
1298
+ .lx-popover-body { padding: .75rem .875rem; color: var(--lx-text-secondary,#6b7280); line-height: 1.6; }
1299
+
1300
+
1301
+ /* ── Carousel ── */
1302
+ .lx-carousel { position: relative; overflow: hidden; }
1303
+ .lx-carousel-inner {
1304
+ display: flex;
1305
+ -webkit-transition: -webkit-transform .35s ease;
1306
+ transition: transform .35s ease;
1307
+ will-change: transform;
1308
+ }
1309
+ .lx-carousel-item { min-width: 100%; flex-shrink: 0; }
1310
+ .lx-carousel-indicators {
1311
+ position: absolute; bottom: 1rem; inset-inline: 0;
1312
+ display: flex; justify-content: center; gap: .375rem;
1313
+ z-index: 2; list-style: none; padding: 0; margin: 0;
1314
+ }
1315
+ .lx-carousel-indicators button { width: 8px; height: 8px; border-radius: 50%; border: none; background: rgba(255,255,255,.5); cursor: pointer; padding: 0; transition: var(--lx-transition); }
1316
+ .lx-carousel-indicators button.lx-active { background: #fff; width: 20px; border-radius: 4px; }
1317
+ .lx-carousel-control {
1318
+ position: absolute; top: 50%; transform: translateY(-50%); z-index: 2;
1319
+ background: rgba(0,0,0,.35); border: none; color: white;
1320
+ width: 2.5rem; height: 2.5rem; border-radius: 50%; cursor: pointer;
1321
+ display: flex; align-items: center; justify-content: center; transition: var(--lx-transition);
1322
+ }
1323
+ .lx-carousel-control:hover { background: rgba(0,0,0,.6); }
1324
+ .lx-carousel-prev { inset-inline-start: 1rem; }
1325
+ .lx-carousel-next { inset-inline-end: 1rem; }
1326
+ .lx-carousel-prev-icon::before { content: "‹"; font-size: 1.5rem; line-height: 1; }
1327
+ .lx-carousel-next-icon::before { content: "›"; font-size: 1.5rem; line-height: 1; }
1328
+ .lx-carousel-caption { position: absolute; bottom: 3rem; inset-inline: 15%; text-align: center; color: white; text-shadow: 0 1px 3px rgba(0,0,0,.5); }
1329
+ .lx-carousel-caption h5 { font-size: var(--lx-text-xl,1.25rem); font-weight: 700; margin-bottom: .5rem; }
1330
+
1331
+
1332
+ /* ── Skeleton ── */
1333
+ .lx-skeleton {
1334
+ background: -webkit-linear-gradient(left, var(--lx-gray-100,#f3f4f6) 25%, var(--lx-gray-200,#e5e7eb) 50%, var(--lx-gray-100,#f3f4f6) 75%);
1335
+ background: linear-gradient(90deg, var(--lx-gray-100,#f3f4f6) 25%, var(--lx-gray-200,#e5e7eb) 50%, var(--lx-gray-100,#f3f4f6) 75%);
1336
+ background-size: 200% 100%; -webkit-animation: lx-skeleton-wave 1.5s ease-in-out infinite; animation: lx-skeleton-wave 1.5s ease-in-out infinite;
1337
+ border-radius: var(--lx-radius,8px);
1338
+ }
1339
+ .lx-skeleton-text { height: 1em; margin-bottom: .5em; }
1340
+ .lx-skeleton-img { width: 100%; border-radius: var(--lx-radius,8px); }
1341
+ .lx-skeleton-avatar { width: var(--lx-avatar-size,2.5rem); height: var(--lx-avatar-size,2.5rem); border-radius: 50%; }
1342
+ .lx-skeleton-btn { height: 2.25rem; width: 5rem; }
1343
+ .lx-skeleton-pulse { animation: lx-skeleton-pulse 1.5s ease-in-out infinite; background: var(--lx-gray-200,#e5e7eb); }
1344
+ .lx-skeleton-none { animation: none; background: var(--lx-gray-200,#e5e7eb); }
1345
+ @-webkit-keyframes lx-skeleton-wave { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
1346
+ @keyframes lx-skeleton-wave { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
1347
+ @-webkit-keyframes lx-skeleton-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .4; } }
1348
+ @keyframes lx-skeleton-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .4; } }
1349
+
1350
+
1351
+ /* ── Timeline ── */
1352
+ .lx-timeline { position: relative; padding-inline-start: 1.75rem; }
1353
+ .lx-timeline::before { content: ""; position: absolute; inset-inline-start: .55rem; top: 0; bottom: 0; width: 2px; background: var(--border-default,#e5e7eb); }
1354
+ .lx-timeline-item { position: relative; padding-bottom: 1.5rem; }
1355
+ .lx-timeline-item:last-child { padding-bottom: 0; }
1356
+ .lx-timeline-marker { position: absolute; inset-inline-start: -1.2rem; top: .25rem; width: .875rem; height: .875rem; border-radius: 50%; background: var(--lx-primary,#3b82f6); border: 2px solid var(--lx-bg,#fff); box-shadow: 0 0 0 2px var(--border-default,#e5e7eb); z-index: 1; }
1357
+ .lx-timeline-content { padding-inline-start: .25rem; }
1358
+ .lx-timeline-title { font-weight: 600; font-size: var(--lx-text-sm,0.875rem); color: var(--lx-text,#111827); margin: 0; }
1359
+ .lx-timeline-time { font-size: var(--lx-text-xs,0.75rem); color: var(--lx-text-muted,#9ca3af); white-space: nowrap; }
1360
+
1361
+
1362
+ /* ── Link helpers ── */
1363
+ .lx-link-primary { color: var(--lx-primary,#3b82f6); }
1364
+ .lx-link-secondary { color: var(--lx-secondary,#6b7280); }
1365
+ .lx-link-success { color: var(--lx-success,#22c55e); }
1366
+ .lx-link-warning { color: var(--lx-warning,#f59e0b); }
1367
+ .lx-link-danger { color: var(--lx-danger,#ef4444); }
1368
+ .lx-link-info { color: var(--lx-info,#06b6d4); }
1369
+ .lx-link-dark { color: var(--lx-dark,#1f2937); }
1370
+ [class^="lx-link-"]:hover { text-decoration: underline; }
1371
+
1372
+
1373
+ /* ================================================================
1374
+ §7 FORMS
1375
+ ================================================================= */
1376
+
1377
+ .lx-form-group { margin-bottom: 1.125rem; }
1378
+ .lx-form-group:last-child { margin-bottom: 0; }
1379
+ .lx-form-inline { display: flex; align-items: flex-end; flex-wrap: wrap; }
1380
+
1381
+ .lx-label { display: block; font-size: var(--lx-text-sm,0.875rem); font-weight: 500; color: var(--lx-text-secondary,#6b7280); margin-bottom: .375rem; }
1382
+ .lx-label.lx-required::after { content: " *"; color: var(--lx-danger,#ef4444); }
1383
+ .lx-form-hint { display: block; font-size: var(--lx-text-xs,0.75rem); color: var(--lx-text-muted,#9ca3af); margin-top: .3rem; }
1384
+
1385
+ /* ── Input / Textarea / Select ── */
1386
+ .lx-input,
1387
+ .lx-textarea,
1388
+ .lx-select {
1389
+ display: block; width: 100%;
1390
+ padding: var(--lx-input-padding-y) var(--lx-input-padding-x);
1391
+ font-size: var(--lx-input-font-size); font-family: var(--font-default,-apple-system,sans-serif);
1392
+ line-height: 1.5; color: var(--lx-text,#111827);
1393
+ background: var(--lx-input-bg); border: var(--lx-input-border);
1394
+ border-radius: var(--lx-input-radius); appearance: none; -webkit-appearance: none;
1395
+ transition: border-color .1s ease, box-shadow .1s ease;
1396
+ }
1397
+ .lx-input:focus, .lx-textarea:focus, .lx-select:focus {
1398
+ outline: none; border-color: var(--lx-primary,#3b82f6); box-shadow: var(--lx-input-focus-shadow);
1399
+ }
1400
+ .lx-input::placeholder, .lx-textarea::placeholder { color: var(--lx-text-muted,#9ca3af); }
1401
+ .lx-input:disabled, .lx-textarea:disabled, .lx-select:disabled { opacity: .55; cursor: not-allowed; background: var(--lx-bg-muted,#f3f4f6); }
1402
+ .lx-input[readonly] { background: var(--lx-bg-soft,#f9fafb); cursor: default; }
1403
+
1404
+ .lx-input-sm, .lx-textarea-sm, .lx-select-sm { padding: .3rem .65rem; font-size: .8rem; }
1405
+ .lx-input-lg, .lx-textarea-lg, .lx-select-lg { padding: .65rem 1rem; font-size: 1rem; }
1406
+
1407
+ .lx-input-success { border-color: var(--lx-success,#22c55e) !important; }
1408
+ .lx-input-success:focus { box-shadow: 0 0 0 3px rgba(34,197,94,.15); }
1409
+ .lx-input-warning { border-color: var(--lx-warning,#f59e0b) !important; }
1410
+ .lx-input-warning:focus { box-shadow: 0 0 0 3px rgba(245,158,11,.15); }
1411
+ .lx-input-error { border-color: var(--lx-danger,#ef4444) !important; }
1412
+ .lx-input-error:focus { box-shadow: 0 0 0 3px rgba(239,68,68,.15); }
1413
+
1414
+ .lx-input-color { height: 2.4rem; padding: .25rem .4rem; cursor: pointer; }
1415
+
1416
+ .lx-textarea { resize: vertical; min-height: 6rem; }
1417
+ .lx-textarea-auto { resize: none; overflow: hidden; }
1418
+
1419
+ /* ── Select ── */
1420
+ .lx-select {
1421
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
1422
+ background-repeat: no-repeat; background-position: right .75rem center; padding-right: 2.25rem; cursor: pointer;
1423
+ }
1424
+ .lx-select[multiple], .lx-select[size] { background-image: none; padding-right: var(--lx-input-padding-x); }
1425
+
1426
+ /* ── Input Group ── */
1427
+ .lx-input-group { display: flex; align-items: stretch; }
1428
+ .lx-input-group .lx-input, .lx-input-group .lx-select { flex: 1; border-radius: 0; }
1429
+ .lx-input-group .lx-input:first-child, .lx-input-group .lx-select:first-child { border-radius: var(--lx-input-radius,8px) 0 0 var(--lx-input-radius,8px); }
1430
+ .lx-input-group .lx-input:last-child, .lx-input-group .lx-select:last-child { border-radius: 0 var(--lx-input-radius,8px) var(--lx-input-radius,8px) 0; }
1431
+ .lx-input-group .lx-input:focus, .lx-input-group .lx-select:focus { z-index: 2; }
1432
+ .lx-input-addon {
1433
+ display: flex; align-items: center;
1434
+ padding: var(--lx-input-padding-y) var(--lx-input-padding-x);
1435
+ font-size: var(--lx-input-font-size); font-weight: 500;
1436
+ color: var(--lx-text-secondary,#6b7280); background: var(--lx-bg-muted,#f3f4f6);
1437
+ border: var(--lx-input-border); white-space: nowrap;
1438
+ }
1439
+ .lx-input-group .lx-input-addon:first-child { border-radius: var(--lx-input-radius,8px) 0 0 var(--lx-input-radius,8px); border-right: none; }
1440
+ .lx-input-group .lx-input-addon:last-child { border-radius: 0 var(--lx-input-radius,8px) var(--lx-input-radius,8px) 0; border-left: none; }
1441
+ .lx-input-group .lx-btn:first-child { border-radius: var(--lx-input-radius,8px) 0 0 var(--lx-input-radius,8px); }
1442
+ .lx-input-group .lx-btn:last-child { border-radius: 0 var(--lx-input-radius,8px) var(--lx-input-radius,8px) 0; }
1443
+
1444
+ /* ── Floating Label ── */
1445
+ .lx-form-floating { position: relative; }
1446
+ .lx-form-floating .lx-input, .lx-form-floating .lx-select, .lx-form-floating .lx-textarea { padding-top: 1.5rem; padding-bottom: .5rem; height: 3.25rem; }
1447
+ .lx-form-floating .lx-textarea { height: auto; padding-top: 1.75rem; }
1448
+ .lx-form-floating label { position: absolute; top: .875rem; inset-inline-start: var(--lx-input-padding-x,0.75rem); color: var(--lx-text-muted,#9ca3af); font-size: var(--lx-text-sm,0.875rem); font-weight: 400; pointer-events: none; transform-origin: 0 0; transition: transform .1s ease, font-size .1s ease, top .1s ease; }
1449
+ .lx-form-floating .lx-input:focus ~ label, .lx-form-floating .lx-input:not(:placeholder-shown) ~ label,
1450
+ .lx-form-floating .lx-textarea:focus ~ label, .lx-form-floating .lx-textarea:not(:placeholder-shown) ~ label,
1451
+ .lx-form-floating .lx-select:focus ~ label, .lx-form-floating .lx-select:not(:placeholder-shown) ~ label { top: .375rem; font-size: .7rem; font-weight: 600; color: var(--lx-primary,#3b82f6); }
1452
+
1453
+ /* ── Checkbox ── */
1454
+ .lx-checkbox, .lx-radio { display: inline-flex; align-items: flex-start; gap: .5rem; cursor: pointer; font-size: var(--lx-text-sm,0.875rem); color: var(--lx-text-secondary,#6b7280); user-select: none; line-height: 1.5; }
1455
+ .lx-checkbox input[type="checkbox"], .lx-radio input[type="radio"] { position: absolute; opacity: 0; width: 0; height: 0; }
1456
+ .lx-checkbox-mark { display: flex; align-items: center; justify-content: center; width: 1.125rem; height: 1.125rem; border: 1.5px solid var(--border-strong,#d1d5db); border-radius: var(--lx-radius-sm,4px); background: var(--lx-bg,#fff); flex-shrink: 0; margin-top: .125rem; transition: var(--lx-transition); }
1457
+ .lx-checkbox input:checked ~ .lx-checkbox-mark { background: var(--lx-primary,#3b82f6); border-color: var(--lx-primary,#3b82f6); }
1458
+ .lx-checkbox input:checked ~ .lx-checkbox-mark::after { content: ""; width: .3rem; height: .55rem; border-right: 2px solid white; border-bottom: 2px solid white; transform: rotate(45deg) translate(-.05rem, -.1rem); }
1459
+ .lx-checkbox input:disabled ~ .lx-checkbox-mark { opacity: .5; cursor: not-allowed; }
1460
+ .lx-radio-mark { width: 1.125rem; height: 1.125rem; border: 1.5px solid var(--border-strong,#d1d5db); border-radius: 50%; background: var(--lx-bg,#fff); flex-shrink: 0; margin-top: .125rem; display: flex; align-items: center; justify-content: center; transition: var(--lx-transition); }
1461
+ .lx-radio input:checked ~ .lx-radio-mark { border-color: var(--lx-primary,#3b82f6); }
1462
+ .lx-radio input:checked ~ .lx-radio-mark::after { content: ""; width: .45rem; height: .45rem; border-radius: 50%; background: var(--lx-primary,#3b82f6); }
1463
+
1464
+ /* ── Switch ── */
1465
+ .lx-switch { display: inline-flex; align-items: center; gap: .625rem; cursor: pointer; font-size: var(--lx-text-sm,0.875rem); color: var(--lx-text-secondary,#6b7280); user-select: none; }
1466
+ .lx-switch input[type="checkbox"] { position: absolute; opacity: 0; width: 0; height: 0; }
1467
+ .lx-switch-thumb { position: relative; width: 2.25rem; height: 1.25rem; background: var(--lx-gray-300,#d1d5db); border-radius: var(--lx-radius-full,9999px); flex-shrink: 0; transition: background .2s ease; }
1468
+ .lx-switch-thumb::before { content: ""; position: absolute; top: .1875rem; inset-inline-start: .1875rem; width: .875rem; height: .875rem; border-radius: 50%; background: white; box-shadow: var(--lx-shadow-sm); transition: transform .2s ease; }
1469
+ .lx-switch input:checked ~ .lx-switch-thumb { background: var(--lx-primary,#3b82f6); }
1470
+ .lx-switch input:checked ~ .lx-switch-thumb::before { transform: translateX(1rem); }
1471
+ .lx-switch-success input:checked ~ .lx-switch-thumb { background: var(--lx-success,#22c55e); }
1472
+ .lx-switch-danger input:checked ~ .lx-switch-thumb { background: var(--lx-danger,#ef4444); }
1473
+ .lx-switch-warning input:checked ~ .lx-switch-thumb { background: var(--lx-warning,#f59e0b); }
1474
+ .lx-switch input:disabled ~ .lx-switch-thumb { opacity: .5; cursor: not-allowed; }
1475
+
1476
+ /* ── Range ── */
1477
+ .lx-range { width: 100%; height: .375rem; appearance: none; -webkit-appearance: none; background: var(--border-default,#e5e7eb); border-radius: var(--lx-radius-full,9999px); cursor: pointer; outline: none; }
1478
+ .lx-range::-webkit-slider-thumb { appearance: none; width: 1.125rem; height: 1.125rem; border-radius: 50%; background: var(--lx-primary,#3b82f6); border: 2px solid white; box-shadow: var(--lx-shadow-sm); transition: transform .1s ease; }
1479
+ .lx-range::-webkit-slider-thumb:hover { transform: scale(1.1); }
1480
+ .lx-range::-moz-range-thumb { width: 1.125rem; height: 1.125rem; border-radius: 50%; background: var(--lx-primary,#3b82f6); border: 2px solid white; cursor: pointer; }
1481
+ .lx-range:disabled { opacity: .55; cursor: not-allowed; }
1482
+
1483
+ /* ── Validation ── */
1484
+ .lx-valid-feedback { display: none; font-size: var(--lx-text-xs,0.75rem); color: var(--lx-success-hover,#16a34a); margin-top: .3rem; }
1485
+ .lx-invalid-feedback { display: none; font-size: var(--lx-text-xs,0.75rem); color: var(--lx-danger-hover,#dc2626); margin-top: .3rem; }
1486
+ .lx-was-validated .lx-input:valid ~ .lx-valid-feedback,
1487
+ .lx-was-validated .lx-input:invalid ~ .lx-invalid-feedback { display: block; }
1488
+ .lx-was-validated .lx-input:valid { border-color: var(--lx-success,#22c55e); }
1489
+ .lx-was-validated .lx-input:invalid { border-color: var(--lx-danger,#ef4444); }
1490
+
1491
+ /* ── Table ── */
1492
+ .lx-table { width: 100%; caption-side: bottom; border-collapse: collapse; font-size: var(--lx-text-sm,0.875rem); }
1493
+ .lx-table th, .lx-table td { padding: .625rem .875rem; vertical-align: middle; border-bottom: 1px solid var(--border-default,#e5e7eb); color: var(--lx-text-secondary,#6b7280); }
1494
+ .lx-table th { font-weight: 600; font-size: .7rem; text-transform: uppercase; letter-spacing: .05em; color: var(--lx-text-muted,#9ca3af); background: var(--lx-bg-soft,#f9fafb); white-space: nowrap; }
1495
+ .lx-table tbody tr:last-child td { border-bottom: none; }
1496
+ .lx-table tbody tr:hover td { background: var(--lx-bg-soft,#f9fafb); }
1497
+ .lx-table-striped tbody tr:nth-child(even) td { background: var(--lx-bg-muted,#f3f4f6); }
1498
+ .lx-table-hover tbody tr:hover td { background: var(--lx-primary-subtle,#dbeafe); }
1499
+ .lx-table-bordered th, .lx-table-bordered td { border: 1px solid var(--border-default,#e5e7eb); }
1500
+ .lx-table-borderless th, .lx-table-borderless td { border: none; }
1501
+ .lx-table-compact th, .lx-table-compact td { padding: .35rem .75rem; }
1502
+ .lx-table-responsive { overflow-x: auto; -webkit-overflow-scrolling: touch; }
1503
+ .lx-table-primary td { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); }
1504
+ .lx-table-success td { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); }
1505
+ .lx-table-warning td { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); }
1506
+ .lx-table-danger td { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); }
1507
+ .lx-table-active td { background: var(--lx-bg-muted,#f3f4f6); }
1508
+
1509
+ /* ── Images & Figures ── */
1510
+ .lx-img-fluid { max-width: 100%; height: auto; display: block; }
1511
+ .lx-img-thumbnail { max-width: 100%; height: auto; border: 2px solid var(--border-default,#e5e7eb); border-radius: var(--lx-radius,8px); padding: .25rem; background: var(--lx-bg,#fff); }
1512
+ .lx-img-cover { width: 100%; height: 100%; object-fit: cover; display: block; }
1513
+ .lx-figure { margin: 0; }
1514
+ .lx-figure-caption { margin-top: .5rem; font-size: var(--lx-text-xs,0.75rem); color: var(--lx-text-muted,#9ca3af); }
1515
+
1516
+
1517
+ /* ================================================================
1518
+ §8 EXTENDED COMPONENTS
1519
+ ================================================================= */
1520
+
1521
+ /* ── Divider ── */
1522
+ .lx-divider {
1523
+ display: flex;
1524
+ align-items: center;
1525
+ gap: .75rem;
1526
+ border: none;
1527
+ margin: 1.5rem 0;
1528
+ color: var(--lx-text-muted,#9ca3af);
1529
+ font-size: var(--lx-text-xs,0.75rem);
1530
+ font-weight: 600;
1531
+ text-transform: uppercase;
1532
+ letter-spacing: .05em;
1533
+ white-space: nowrap;
1534
+ }
1535
+ .lx-divider::before,
1536
+ .lx-divider::after {
1537
+ content: "";
1538
+ flex: 1;
1539
+ height: 1px;
1540
+ background: var(--border-default,#e5e7eb);
1541
+ }
1542
+ .lx-divider-vertical {
1543
+ display: inline-flex;
1544
+ align-self: stretch;
1545
+ width: 1px;
1546
+ height: auto;
1547
+ background: var(--border-default,#e5e7eb);
1548
+ margin-inline: .75rem;
1549
+ }
1550
+ .lx-divider-primary { color: var(--lx-primary,#3b82f6); }
1551
+ .lx-divider-primary::before,
1552
+ .lx-divider-primary::after { background: var(--lx-primary,#3b82f6); }
1553
+ .lx-divider-dashed::before,
1554
+ .lx-divider-dashed::after { background: none; border-top: 1px dashed var(--border-default,#e5e7eb); }
1555
+
1556
+
1557
+ /* ── Chip / Tag ── */
1558
+ .lx-chip {
1559
+ display: inline-flex;
1560
+ align-items: center;
1561
+ gap: .375rem;
1562
+ padding: .25rem .625rem;
1563
+ font-size: var(--lx-text-xs,0.75rem);
1564
+ font-weight: 500;
1565
+ line-height: 1;
1566
+ border-radius: var(--lx-radius-full,9999px);
1567
+ border: 1px solid var(--border-default,#e5e7eb);
1568
+ background: var(--bg-secondary,#f9fafb);
1569
+ color: var(--lx-text-secondary,#6b7280);
1570
+ cursor: default;
1571
+ white-space: nowrap;
1572
+ transition: background .15s ease, border-color .15s ease;
1573
+ -webkit-user-select: none;
1574
+ user-select: none;
1575
+ }
1576
+ .lx-chip-dismiss {
1577
+ display: flex;
1578
+ align-items: center;
1579
+ justify-content: center;
1580
+ width: .875rem;
1581
+ height: .875rem;
1582
+ border-radius: 50%;
1583
+ background: transparent;
1584
+ border: none;
1585
+ cursor: pointer;
1586
+ padding: 0;
1587
+ font-size: .75rem;
1588
+ line-height: 1;
1589
+ color: inherit;
1590
+ opacity: .6;
1591
+ transition: opacity .15s ease, background .15s ease;
1592
+ }
1593
+ .lx-chip-dismiss:hover { opacity: 1; background: rgba(0,0,0,.1); }
1594
+ .lx-chip-dismiss::before { content: "×"; }
1595
+ .lx-chip-interactive { cursor: pointer; }
1596
+ .lx-chip-interactive:hover { background: var(--bg-tertiary,#f3f4f6); border-color: var(--border-strong,#d1d5db); }
1597
+ .lx-chip-selected { background: var(--lx-primary-subtle,#dbeafe); border-color: var(--lx-primary,#3b82f6); color: var(--lx-primary,#3b82f6); }
1598
+ .lx-chip-primary { background: var(--lx-primary-subtle,#dbeafe); border-color: var(--lx-primary,#3b82f6); color: var(--lx-primary,#3b82f6); }
1599
+ .lx-chip-success { background: var(--lx-success-subtle,#f0fdf4); border-color: var(--lx-success,#22c55e); color: var(--lx-success-hover,#16a34a); }
1600
+ .lx-chip-warning { background: var(--lx-warning-subtle,#fffbeb); border-color: var(--lx-warning,#f59e0b); color: var(--lx-warning-hover,#d97706); }
1601
+ .lx-chip-danger { background: var(--lx-danger-subtle,#fef2f2); border-color: var(--lx-danger,#ef4444); color: var(--lx-danger-hover,#dc2626); }
1602
+ .lx-chip-info { background: var(--lx-info-subtle,#ecfeff); border-color: var(--lx-info,#06b6d4); color: var(--lx-info-hover,#0891b2); }
1603
+ .lx-chip-dark { background: var(--lx-dark,#1f2937); border-color: var(--lx-dark,#1f2937); color: #fff; }
1604
+ .lx-chip-sm { padding: .15rem .5rem; font-size: .65rem; }
1605
+ .lx-chip-lg { padding: .375rem .875rem; font-size: .8rem; }
1606
+ .lx-chip-dot::before { content: ""; display: inline-block; width: .5rem; height: .5rem; border-radius: 50%; background: currentColor; }
1607
+
1608
+
1609
+ /* ── Steps / Stepper ── */
1610
+ .lx-steps {
1611
+ display: flex;
1612
+ align-items: flex-start;
1613
+ gap: 0;
1614
+ list-style: none;
1615
+ padding: 0;
1616
+ margin: 0;
1617
+ }
1618
+ .lx-steps-vertical { flex-direction: column; }
1619
+ .lx-step {
1620
+ display: flex;
1621
+ flex: 1;
1622
+ flex-direction: column;
1623
+ align-items: center;
1624
+ text-align: center;
1625
+ position: relative;
1626
+ }
1627
+ .lx-step:not(:last-child)::after {
1628
+ content: "";
1629
+ position: absolute;
1630
+ top: calc(1.25rem - 1px);
1631
+ inset-inline-start: calc(50% + 1.25rem);
1632
+ width: calc(100% - 2.5rem);
1633
+ height: 2px;
1634
+ background: var(--border-default,#e5e7eb);
1635
+ transition: background .3s ease;
1636
+ }
1637
+ .lx-step.lx-step-done:not(:last-child)::after { background: var(--lx-primary,#3b82f6); }
1638
+ .lx-step-icon {
1639
+ display: flex;
1640
+ align-items: center;
1641
+ justify-content: center;
1642
+ width: 2.5rem;
1643
+ height: 2.5rem;
1644
+ border-radius: 50%;
1645
+ border: 2px solid var(--border-default,#e5e7eb);
1646
+ background: var(--bg-primary,#fff);
1647
+ color: var(--lx-text-muted,#9ca3af);
1648
+ font-size: var(--lx-text-sm,0.875rem);
1649
+ font-weight: 600;
1650
+ flex-shrink: 0;
1651
+ z-index: 1;
1652
+ transition: border-color .3s ease, background .3s ease, color .3s ease;
1653
+ -webkit-transition: border-color .3s ease, background .3s ease, color .3s ease;
1654
+ }
1655
+ .lx-step.lx-step-active .lx-step-icon {
1656
+ border-color: var(--lx-primary,#3b82f6);
1657
+ background: var(--lx-primary,#3b82f6);
1658
+ color: #fff;
1659
+ -webkit-box-shadow: 0 0 0 4px var(--lx-primary-subtle,#dbeafe);
1660
+ box-shadow: 0 0 0 4px var(--lx-primary-subtle,#dbeafe);
1661
+ }
1662
+ .lx-step.lx-step-done .lx-step-icon {
1663
+ border-color: var(--lx-primary,#3b82f6);
1664
+ background: var(--lx-primary,#3b82f6);
1665
+ color: #fff;
1666
+ }
1667
+ .lx-step.lx-step-done .lx-step-icon::after { content: "✓"; font-size: .875rem; }
1668
+ .lx-step.lx-step-error .lx-step-icon { border-color: var(--lx-danger,#ef4444); background: var(--lx-danger,#ef4444); color: #fff; }
1669
+ .lx-step-label { margin-top: .5rem; }
1670
+ .lx-step-title { font-size: var(--lx-text-sm,0.875rem); font-weight: 600; color: var(--lx-text,#111827); }
1671
+ .lx-step-desc { font-size: var(--lx-text-xs,0.75rem); color: var(--lx-text-muted,#9ca3af); margin-top: .125rem; }
1672
+ .lx-step.lx-step-active .lx-step-title { color: var(--lx-primary,#3b82f6); }
1673
+ .lx-step.lx-step-done .lx-step-title { color: var(--lx-text-secondary,#6b7280); }
1674
+
1675
+ /* Vertical variant */
1676
+ .lx-steps-vertical .lx-step { flex-direction: row; align-items: flex-start; text-align: start; flex: none; width: 100%; padding-bottom: 1.5rem; }
1677
+ .lx-steps-vertical .lx-step:not(:last-child)::after { inset-inline-start: calc(1.25rem - 1px); top: 2.5rem; width: 2px; height: calc(100% - 2.5rem); }
1678
+ .lx-steps-vertical .lx-step-label { margin-top: 0; margin-inline-start: .875rem; }
1679
+
1680
+ /* Compact / mini steps */
1681
+ .lx-steps-sm .lx-step-icon { width: 1.75rem; height: 1.75rem; font-size: .7rem; }
1682
+ .lx-steps-sm .lx-step:not(:last-child)::after { top: calc(.875rem - 1px); inset-inline-start: calc(50% + .875rem); width: calc(100% - 1.75rem); }
1683
+
1684
+
1685
+ /* ── Stat / Metric Card ── */
1686
+ .lx-stat {
1687
+ background: var(--bg-primary,#fff);
1688
+ border: 1px solid var(--border-default,#e5e7eb);
1689
+ border-radius: var(--lx-radius-md,12px);
1690
+ padding: 1.25rem 1.5rem;
1691
+ -webkit-box-shadow: var(--lx-shadow-xs);
1692
+ box-shadow: var(--lx-shadow-xs);
1693
+ }
1694
+ .lx-stat-label {
1695
+ font-size: var(--lx-text-xs,0.75rem);
1696
+ font-weight: 700;
1697
+ text-transform: uppercase;
1698
+ letter-spacing: .05em;
1699
+ color: var(--lx-text-muted,#9ca3af);
1700
+ margin-bottom: .375rem;
1701
+ }
1702
+ .lx-stat-value {
1703
+ font-size: clamp(1.75rem,4vw,2.25rem);
1704
+ font-weight: 700;
1705
+ line-height: 1.1;
1706
+ color: var(--lx-text,#111827);
1707
+ letter-spacing: -0.02em;
1708
+ }
1709
+ .lx-stat-desc {
1710
+ font-size: var(--lx-text-sm,0.875rem);
1711
+ color: var(--lx-text-muted,#9ca3af);
1712
+ margin-top: .375rem;
1713
+ }
1714
+ .lx-stat-trend {
1715
+ display: inline-flex;
1716
+ align-items: center;
1717
+ gap: .25rem;
1718
+ font-size: var(--lx-text-xs,0.75rem);
1719
+ font-weight: 600;
1720
+ margin-top: .375rem;
1721
+ }
1722
+ .lx-stat-trend-up { color: var(--lx-success-hover,#16a34a); }
1723
+ .lx-stat-trend-down { color: var(--lx-danger-hover,#dc2626); }
1724
+ .lx-stat-trend-up::before { content: "▲"; font-size: .625rem; }
1725
+ .lx-stat-trend-down::before { content: "▼"; font-size: .625rem; }
1726
+ .lx-stat-icon {
1727
+ display: flex;
1728
+ align-items: center;
1729
+ justify-content: center;
1730
+ width: 2.75rem;
1731
+ height: 2.75rem;
1732
+ border-radius: var(--lx-radius-md,12px);
1733
+ font-size: 1.25rem;
1734
+ flex-shrink: 0;
1735
+ }
1736
+ .lx-stat-icon-primary { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); }
1737
+ .lx-stat-icon-success { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); }
1738
+ .lx-stat-icon-warning { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); }
1739
+ .lx-stat-icon-danger { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); }
1740
+ .lx-stat-icon-info { background: var(--lx-info-subtle,#ecfeff); color: var(--lx-info-hover,#0891b2); }
1741
+
1742
+
1743
+ /* ── File Drop Zone ── */
1744
+ .lx-file-drop {
1745
+ display: flex;
1746
+ flex-direction: column;
1747
+ align-items: center;
1748
+ justify-content: center;
1749
+ gap: .625rem;
1750
+ padding: 2.5rem 1.5rem;
1751
+ border: 2px dashed var(--border-strong,#d1d5db);
1752
+ border-radius: var(--lx-radius-lg,16px);
1753
+ background: var(--bg-secondary,#f9fafb);
1754
+ cursor: pointer;
1755
+ transition: border-color .2s ease, background .2s ease;
1756
+ text-align: center;
1757
+ outline: none;
1758
+ }
1759
+ .lx-file-drop:hover,
1760
+ .lx-file-drop:focus-visible {
1761
+ border-color: var(--lx-primary,#3b82f6);
1762
+ background: var(--lx-primary-subtle,#dbeafe);
1763
+ }
1764
+ .lx-file-drop.lx-drag-over {
1765
+ border-color: var(--lx-primary,#3b82f6);
1766
+ background: var(--lx-primary-subtle,#dbeafe);
1767
+ -webkit-box-shadow: 0 0 0 4px rgba(59,130,246,.15);
1768
+ box-shadow: 0 0 0 4px rgba(59,130,246,.15);
1769
+ }
1770
+ .lx-file-drop-icon { font-size: 2rem; color: var(--lx-text-muted,#9ca3af); line-height: 1; }
1771
+ .lx-file-drop-title { font-size: var(--lx-text-sm,0.875rem); font-weight: 600; color: var(--lx-text,#111827); }
1772
+ .lx-file-drop-hint { font-size: var(--lx-text-xs,0.75rem); color: var(--lx-text-muted,#9ca3af); }
1773
+ .lx-file-drop input[type="file"] { position: absolute; opacity: 0; width: 0; height: 0; }
1774
+ .lx-file-list { list-style: none; padding: 0; margin: .75rem 0 0; width: 100%; }
1775
+ .lx-file-list-item {
1776
+ display: flex;
1777
+ align-items: center;
1778
+ gap: .625rem;
1779
+ padding: .5rem .75rem;
1780
+ background: var(--bg-primary,#fff);
1781
+ border: 1px solid var(--border-default,#e5e7eb);
1782
+ border-radius: var(--lx-radius,8px);
1783
+ font-size: var(--lx-text-sm,0.875rem);
1784
+ }
1785
+ .lx-file-list-item + .lx-file-list-item { margin-top: .375rem; }
1786
+ .lx-file-list-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--lx-text,#111827); }
1787
+ .lx-file-list-size { font-size: var(--lx-text-xs,0.75rem); color: var(--lx-text-muted,#9ca3af); white-space: nowrap; }
1788
+
1789
+
1790
+ /* ── Empty State ── */
1791
+ .lx-empty {
1792
+ display: flex;
1793
+ flex-direction: column;
1794
+ align-items: center;
1795
+ justify-content: center;
1796
+ text-align: center;
1797
+ padding: 3rem 1.5rem;
1798
+ color: var(--lx-text-muted,#9ca3af);
1799
+ }
1800
+ .lx-empty-icon {
1801
+ font-size: 3rem;
1802
+ line-height: 1;
1803
+ margin-bottom: 1rem;
1804
+ opacity: .5;
1805
+ }
1806
+ .lx-empty-title {
1807
+ font-size: var(--lx-text-lg,1.125rem);
1808
+ font-weight: 600;
1809
+ color: var(--lx-text,#111827);
1810
+ margin-bottom: .375rem;
1811
+ }
1812
+ .lx-empty-desc {
1813
+ font-size: var(--lx-text-sm,0.875rem);
1814
+ color: var(--lx-text-muted,#9ca3af);
1815
+ max-width: 24rem;
1816
+ line-height: 1.65;
1817
+ margin-bottom: 1.25rem;
1818
+ }
1819
+ .lx-empty-sm { padding: 1.5rem 1rem; }
1820
+ .lx-empty-sm .lx-empty-icon { font-size: 2rem; margin-bottom: .625rem; }
1821
+ .lx-empty-sm .lx-empty-title { font-size: var(--lx-text-base,1rem); }
1822
+
1823
+
1824
+ /* ── Number Input ── */
1825
+ .lx-number-input {
1826
+ display: inline-flex;
1827
+ align-items: stretch;
1828
+ border: 1px solid var(--border-strong,#d1d5db);
1829
+ border-radius: var(--lx-radius,8px);
1830
+ overflow: hidden;
1831
+ background: var(--bg-primary,#fff);
1832
+ }
1833
+ .lx-number-input:focus-within {
1834
+ border-color: var(--lx-primary,#3b82f6);
1835
+ -webkit-box-shadow: 0 0 0 3px rgba(59,130,246,.15);
1836
+ box-shadow: 0 0 0 3px rgba(59,130,246,.15);
1837
+ }
1838
+ .lx-number-btn {
1839
+ display: flex;
1840
+ align-items: center;
1841
+ justify-content: center;
1842
+ width: 2.25rem;
1843
+ background: var(--bg-secondary,#f9fafb);
1844
+ border: none;
1845
+ cursor: pointer;
1846
+ font-size: 1rem;
1847
+ color: var(--lx-text-secondary,#6b7280);
1848
+ -webkit-transition: background .1s ease, color .1s ease;
1849
+ transition: background .1s ease, color .1s ease;
1850
+ line-height: 1;
1851
+ -webkit-user-select: none;
1852
+ user-select: none;
1853
+ }
1854
+ .lx-number-btn:hover { background: var(--bg-tertiary,#f3f4f6); color: var(--lx-text,#111827); }
1855
+ .lx-number-btn:active { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); }
1856
+ .lx-number-btn:disabled { opacity: .4; cursor: not-allowed; }
1857
+ .lx-number-input input[type="number"],
1858
+ .lx-number-input input[type="text"] {
1859
+ flex: 1;
1860
+ min-width: 3rem;
1861
+ border: none;
1862
+ padding: .5rem .375rem;
1863
+ font-size: var(--lx-text-sm,0.875rem);
1864
+ text-align: center;
1865
+ color: var(--lx-text,#111827);
1866
+ background: transparent;
1867
+ outline: none;
1868
+ -moz-appearance: textfield;
1869
+ -webkit-appearance: none;
1870
+ appearance: textfield;
1871
+ }
1872
+ .lx-number-input input[type="number"]::-webkit-inner-spin-button,
1873
+ .lx-number-input input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
1874
+
1875
+
1876
+ /* ── Rating / Stars ── */
1877
+ .lx-rating {
1878
+ display: inline-flex;
1879
+ align-items: center;
1880
+ gap: .125rem;
1881
+ direction: ltr;
1882
+ }
1883
+ .lx-rating-star {
1884
+ font-size: 1.25rem;
1885
+ line-height: 1;
1886
+ color: var(--border-strong,#d1d5db);
1887
+ cursor: pointer;
1888
+ -webkit-transition: color .15s ease, -webkit-transform .15s ease;
1889
+ transition: color .15s ease, transform .15s ease;
1890
+ -webkit-user-select: none;
1891
+ user-select: none;
1892
+ }
1893
+ .lx-rating-star::before { content: "★"; }
1894
+ .lx-rating-star.lx-filled,
1895
+ .lx-rating:not([data-readonly]) .lx-rating-star:hover,
1896
+ .lx-rating:not([data-readonly]) .lx-rating-star:hover ~ .lx-rating-star { color: var(--lx-warning,#f59e0b); }
1897
+ .lx-rating-star.lx-filled { color: var(--lx-warning,#f59e0b); }
1898
+ .lx-rating-star:hover { -webkit-transform: scale(1.15); transform: scale(1.15); }
1899
+ .lx-rating-sm .lx-rating-star { font-size: .875rem; }
1900
+ .lx-rating-lg .lx-rating-star { font-size: 1.75rem; }
1901
+ .lx-rating[data-readonly] .lx-rating-star { cursor: default; pointer-events: none; }
1902
+
1903
+
1904
+ /* ── Navbar Toggle (hamburger animation) ── */
1905
+ .lx-toggler-icon { position: relative; display: block; width: 22px; height: 2px; background: currentColor; -webkit-transition: background .2s ease; transition: background .2s ease; }
1906
+ .lx-toggler-icon::before,
1907
+ .lx-toggler-icon::after {
1908
+ content: "";
1909
+ position: absolute;
1910
+ width: 22px;
1911
+ height: 2px;
1912
+ background: currentColor;
1913
+ -webkit-transition: transform .3s ease;
1914
+ transition: transform .3s ease;
1915
+ left: 0;
1916
+ }
1917
+ .lx-toggler-icon::before { top: -6px; }
1918
+ .lx-toggler-icon::after { bottom: -6px; }
1919
+ .lx-toggler-open .lx-toggler-icon { background: transparent; }
1920
+ .lx-toggler-open .lx-toggler-icon::before { -webkit-transform: rotate(45deg) translate(4px, 4px); transform: rotate(45deg) translate(4px, 4px); }
1921
+ .lx-toggler-open .lx-toggler-icon::after { -webkit-transform: rotate(-45deg) translate(4px, -4px); transform: rotate(-45deg) translate(4px, -4px); }
1922
+
1923
+
1924
+ /* ── Floating Action Button ── */
1925
+ .lx-fab {
1926
+ position: fixed;
1927
+ inset-inline-end: 1.5rem;
1928
+ bottom: 1.5rem;
1929
+ z-index: var(--lx-z-fixed,1030);
1930
+ display: flex;
1931
+ align-items: center;
1932
+ justify-content: center;
1933
+ width: 3.5rem;
1934
+ height: 3.5rem;
1935
+ border-radius: 50%;
1936
+ background: var(--lx-primary,#3b82f6);
1937
+ color: #fff;
1938
+ border: none;
1939
+ cursor: pointer;
1940
+ -webkit-box-shadow: var(--lx-shadow-lg);
1941
+ box-shadow: var(--lx-shadow-lg);
1942
+ font-size: 1.5rem;
1943
+ -webkit-transition: -webkit-transform .2s ease, -webkit-box-shadow .2s ease;
1944
+ transition: transform .2s ease, box-shadow .2s ease;
1945
+ text-decoration: none;
1946
+ }
1947
+ .lx-fab:hover { -webkit-transform: scale(1.05); transform: scale(1.05); -webkit-box-shadow: var(--lx-shadow-xl); box-shadow: var(--lx-shadow-xl); }
1948
+ .lx-fab:active { -webkit-transform: scale(.96); transform: scale(.96); }
1949
+ .lx-fab-sm { width: 2.5rem; height: 2.5rem; font-size: 1.1rem; }
1950
+
1951
+
1952
+ /* ── Back To Top ── */
1953
+ .lx-back-top {
1954
+ position: fixed;
1955
+ inset-inline-end: 1.5rem;
1956
+ bottom: 5rem;
1957
+ z-index: var(--lx-z-fixed,1030);
1958
+ display: flex;
1959
+ align-items: center;
1960
+ justify-content: center;
1961
+ width: 2.5rem;
1962
+ height: 2.5rem;
1963
+ border-radius: 50%;
1964
+ background: var(--bg-primary,#fff);
1965
+ border: 1px solid var(--border-default,#e5e7eb);
1966
+ -webkit-box-shadow: var(--lx-shadow-md);
1967
+ box-shadow: var(--lx-shadow-md);
1968
+ cursor: pointer;
1969
+ opacity: 0;
1970
+ visibility: hidden;
1971
+ -webkit-transform: translateY(8px);
1972
+ transform: translateY(8px);
1973
+ -webkit-transition: opacity .25s ease, visibility .25s ease, -webkit-transform .25s ease;
1974
+ transition: opacity .25s ease, visibility .25s ease, transform .25s ease;
1975
+ font-size: 1.125rem;
1976
+ color: var(--lx-text-secondary,#6b7280);
1977
+ text-decoration: none;
1978
+ }
1979
+ .lx-back-top.lx-show { opacity: 1; visibility: visible; -webkit-transform: none; transform: none; }
1980
+ .lx-back-top:hover { background: var(--lx-primary,#3b82f6); color: #fff; border-color: var(--lx-primary,#3b82f6); }
1981
+ .lx-back-top::before { content: "↑"; font-weight: 700; }
1982
+
1983
+
1984
+ /* ── Code Block with Copy ── */
1985
+ .lx-code-block { position: relative; }
1986
+ .lx-code-block pre { margin: 0; }
1987
+ .lx-code-copy {
1988
+ position: absolute;
1989
+ top: .625rem;
1990
+ inset-inline-end: .625rem;
1991
+ padding: .25rem .625rem;
1992
+ font-size: .7rem;
1993
+ font-weight: 600;
1994
+ background: rgba(255,255,255,.1);
1995
+ border: 1px solid rgba(255,255,255,.15);
1996
+ border-radius: var(--lx-radius-sm,4px);
1997
+ color: rgba(255,255,255,.7);
1998
+ cursor: pointer;
1999
+ -webkit-transition: background .15s ease, color .15s ease;
2000
+ transition: background .15s ease, color .15s ease;
2001
+ }
2002
+ .lx-code-copy:hover { background: rgba(255,255,255,.2); color: #fff; }
2003
+ .lx-code-copy.lx-copied { background: var(--lx-success,#22c55e); border-color: var(--lx-success,#22c55e); color: #fff; }
2004
+
2005
+
2006
+ /* ── Notice / Callout ── */
2007
+ .lx-callout {
2008
+ display: flex;
2009
+ gap: .875rem;
2010
+ padding: 1rem 1.25rem;
2011
+ border-radius: var(--lx-radius,8px);
2012
+ border-inline-start: 4px solid var(--lx-primary,#3b82f6);
2013
+ background: var(--lx-primary-subtle,#dbeafe);
2014
+ font-size: var(--lx-text-sm,0.875rem);
2015
+ color: var(--lx-text,#111827);
2016
+ }
2017
+ .lx-callout-icon { flex-shrink: 0; font-size: 1.125rem; }
2018
+ .lx-callout-title { font-weight: 700; margin-bottom: .25rem; }
2019
+ .lx-callout-body { color: var(--lx-text-secondary,#6b7280); line-height: 1.6; }
2020
+ .lx-callout-success { border-color: var(--lx-success,#22c55e); background: var(--lx-success-subtle,#f0fdf4); }
2021
+ .lx-callout-warning { border-color: var(--lx-warning,#f59e0b); background: var(--lx-warning-subtle,#fffbeb); }
2022
+ .lx-callout-danger { border-color: var(--lx-danger,#ef4444); background: var(--lx-danger-subtle,#fef2f2); }
2023
+ .lx-callout-info { border-color: var(--lx-info,#06b6d4); background: var(--lx-info-subtle,#ecfeff); }
2024
+
2025
+
2026
+ /* ── Tag (different from chip — square, label-like) ── */
2027
+ .lx-tag {
2028
+ display: inline-flex;
2029
+ align-items: center;
2030
+ gap: .25rem;
2031
+ padding: .125rem .5rem;
2032
+ font-size: .7rem;
2033
+ font-weight: 700;
2034
+ text-transform: uppercase;
2035
+ letter-spacing: .04em;
2036
+ border-radius: var(--lx-radius-sm,4px);
2037
+ background: var(--bg-tertiary,#f3f4f6);
2038
+ color: var(--lx-text-secondary,#6b7280);
2039
+ white-space: nowrap;
2040
+ line-height: 1.5;
2041
+ }
2042
+ .lx-tag-primary { background: var(--lx-primary,#3b82f6); color: #fff; }
2043
+ .lx-tag-success { background: var(--lx-success,#22c55e); color: #fff; }
2044
+ .lx-tag-warning { background: var(--lx-warning,#f59e0b); color: #fff; }
2045
+ .lx-tag-danger { background: var(--lx-danger,#ef4444); color: #fff; }
2046
+ .lx-tag-info { background: var(--lx-info,#06b6d4); color: #fff; }
2047
+ .lx-tag-dark { background: var(--lx-dark,#1f2937); color: #fff; }
2048
+ .lx-tag-soft-primary { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); }
2049
+ .lx-tag-soft-success { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); }
2050
+ .lx-tag-soft-warning { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); }
2051
+ .lx-tag-soft-danger { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); }
2052
+ .lx-tag-soft-info { background: var(--lx-info-subtle,#ecfeff); color: var(--lx-info-hover,#0891b2); }
2053
+
2054
+
2055
+ /* ── Kbd Enhanced ── */
2056
+ .lx-shortcut { display: inline-flex; align-items: center; gap: .25rem; }
2057
+ .lx-shortcut kbd { font-family: var(--font-mono,"SFMono-Regular",Consolas,monospace); }
2058
+
2059
+
2060
+ /* ── Section / Hero helpers ── */
2061
+ .lx-section { padding-block: var(--lx-section-py,4rem); }
2062
+ .lx-section-sm { --lx-section-py: 2.5rem; }
2063
+ .lx-section-lg { --lx-section-py: 6rem; }
2064
+ .lx-section-xl { --lx-section-py: 8rem; }
2065
+
2066
+ .lx-gradient-text {
2067
+ background: linear-gradient(135deg, var(--lx-primary,#3b82f6), var(--lx-info,#06b6d4));
2068
+ -webkit-background-clip: text;
2069
+ background-clip: text;
2070
+ -webkit-text-fill-color: transparent;
2071
+ }
2072
+ .lx-gradient-primary { background: linear-gradient(135deg, var(--lx-primary,#3b82f6), var(--lx-primary-dark,#2563eb)); }
2073
+ .lx-gradient-warm { background: linear-gradient(135deg, #f59e0b, #ef4444); }
2074
+ .lx-gradient-cool { background: linear-gradient(135deg, #06b6d4, #3b82f6); }
2075
+ .lx-gradient-purple { background: linear-gradient(135deg, #8b5cf6, #ec4899); }
2076
+
2077
+
2078
+ /* ── Scroll-driven & animation helpers ── */
2079
+ @keyframes lx-slide-up { from { opacity:0; -webkit-transform:translateY(16px); transform:translateY(16px); } to { opacity:1; -webkit-transform:none; transform:none; } }
2080
+ @keyframes lx-slide-down { from { opacity:0; -webkit-transform:translateY(-16px); transform:translateY(-16px); } to { opacity:1; -webkit-transform:none; transform:none; } }
2081
+ @keyframes lx-slide-left { from { opacity:0; -webkit-transform:translateX(16px); transform:translateX(16px); } to { opacity:1; -webkit-transform:none; transform:none; } }
2082
+ @keyframes lx-slide-right{ from { opacity:0; -webkit-transform:translateX(-16px); transform:translateX(-16px); } to { opacity:1; -webkit-transform:none; transform:none; } }
2083
+ @keyframes lx-zoom-in { from { opacity:0; -webkit-transform:scale(.9); transform:scale(.9); } to { opacity:1; -webkit-transform:scale(1); transform:scale(1); } }
2084
+ @keyframes lx-bounce-in { 0%{opacity:0;-webkit-transform:scale(.3);transform:scale(.3)} 50%{opacity:1;-webkit-transform:scale(1.05);transform:scale(1.05)} 70%{-webkit-transform:scale(.9);transform:scale(.9)} 100%{-webkit-transform:scale(1);transform:scale(1)} }
2085
+ @keyframes lx-pulse-ring { 0%{-webkit-box-shadow:0 0 0 0 rgba(59,130,246,.4);box-shadow:0 0 0 0 rgba(59,130,246,.4)} 70%{-webkit-box-shadow:0 0 0 10px transparent;box-shadow:0 0 0 10px transparent} 100%{-webkit-box-shadow:0 0 0 0 transparent;box-shadow:0 0 0 0 transparent} }
2086
+ .lx-animate-slide-up { -webkit-animation: lx-slide-up .35s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; animation: lx-slide-up .35s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; }
2087
+ .lx-animate-slide-down { -webkit-animation: lx-slide-down .35s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; animation: lx-slide-down .35s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; }
2088
+ .lx-animate-slide-left { -webkit-animation: lx-slide-left .35s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; animation: lx-slide-left .35s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; }
2089
+ .lx-animate-slide-right { -webkit-animation: lx-slide-right.35s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; animation: lx-slide-right.35s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; }
2090
+ .lx-animate-zoom-in { -webkit-animation: lx-zoom-in .3s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; animation: lx-zoom-in .3s var(--lx-ease,cubic-bezier(.4,0,.2,1)) both; }
2091
+ .lx-animate-bounce-in { -webkit-animation: lx-bounce-in .5s both; animation: lx-bounce-in .5s both; }
2092
+ .lx-animate-pulse-ring { -webkit-animation: lx-pulse-ring 1.5s infinite; animation: lx-pulse-ring 1.5s infinite; }
2093
+ .lx-animate-spin { -webkit-animation: lx-spin .6s linear infinite; animation: lx-spin .6s linear infinite; }
2094
+ .lx-animate-ping { -webkit-animation: lx-grow 1s ease-in-out infinite; animation: lx-grow 1s ease-in-out infinite; }
2095
+
2096
+ /* Delay helpers */
2097
+ .lx-delay-100 { -webkit-animation-delay: .1s; animation-delay: .1s; }
2098
+ .lx-delay-200 { -webkit-animation-delay: .2s; animation-delay: .2s; }
2099
+ .lx-delay-300 { -webkit-animation-delay: .3s; animation-delay: .3s; }
2100
+ .lx-delay-500 { -webkit-animation-delay: .5s; animation-delay: .5s; }
2101
+ .lx-delay-700 { -webkit-animation-delay: .7s; animation-delay: .7s; }
2102
+
2103
+
2104
+ /* ── Dark mode semantic overrides ── */
2105
+ [data-mode="dark"],
2106
+ .dark {
2107
+ --bg-primary: #111827;
2108
+ --bg-secondary: #1f2937;
2109
+ --bg-tertiary: #374151;
2110
+ --surface: #1f2937;
2111
+ --text-primary: #f9fafb;
2112
+ --text-secondary: #d1d5db;
2113
+ --text-muted: #9ca3af;
2114
+ --border-strong: #4b5563;
2115
+ --border-default: #374151;
2116
+ --border-subtle: #1f2937;
2117
+ --accent-subtle: #1e3a5f;
2118
+ --lx-bg: #111827;
2119
+ --lx-bg-soft: #1f2937;
2120
+ --lx-bg-muted: #374151;
2121
+ --lx-text: #f9fafb;
2122
+ --lx-text-secondary: #d1d5db;
2123
+ --lx-text-muted: #9ca3af;
2124
+ --lx-border: #374151;
2125
+ --lx-border-strong: #4b5563;
2126
+ }
2127
+ [data-mode="dark"] .lx-card,
2128
+ .dark .lx-card { background: var(--bg-secondary,#1f2937); }
2129
+ [data-mode="dark"] .lx-modal-content,
2130
+ .dark .lx-modal-content { background: var(--bg-secondary,#1f2937); }
2131
+ [data-mode="dark"] .lx-dropdown-menu,
2132
+ .dark .lx-dropdown-menu { background: var(--bg-secondary,#1f2937); }
2133
+ [data-mode="dark"] .lx-stat,
2134
+ .dark .lx-stat { background: var(--bg-secondary,#1f2937); }
2135
+ [data-mode="dark"] .lx-file-drop,
2136
+ .dark .lx-file-drop { background: var(--bg-secondary,#1f2937); }
2137
+
2138
+
2139
+ /* ── Browser-compatibility patches ── */
2140
+ @supports not (aspect-ratio: 1) {
2141
+ /* Fallback for browsers without native aspect-ratio (Safari < 15) */
2142
+ .lx-ratio-1x1 { padding-top: 100%; }
2143
+ .lx-ratio-4x3 { padding-top: 75%; }
2144
+ .lx-ratio-16x9{ padding-top: 56.25%; }
2145
+ .lx-ratio-21x9{ padding-top: 42.857%; }
2146
+ }
2147
+ @supports not (inset: 0) {
2148
+ /* Fallback for inset shorthand (older Safari/Firefox) */
2149
+ .lx-modal { top:0; right:0; bottom:0; left:0; }
2150
+ .lx-modal-backdrop { top:0; right:0; bottom:0; left:0; }
2151
+ .lx-offcanvas-backdrop { top:0; right:0; bottom:0; left:0; }
2152
+ .lx-loading-overlay { top:0; right:0; bottom:0; left:0; }
2153
+ .lx-inset-0 { top:0; right:0; bottom:0; left:0; }
2154
+ }
2155
+ @supports not (gap: 1rem) {
2156
+ /* Fallback for flex gap (older browsers) */
2157
+ .lx-nav > * + * { margin-inline-start: .125rem; }
2158
+ .lx-pagination > * + * { margin-inline-start: .125rem; }
2159
+ }
2160
+ /* Smooth scroll polyfill flag */
2161
+ @media (prefers-reduced-motion: no-preference) {
2162
+ html { scroll-behavior: smooth; }
2163
+ }