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