@lancar/lxui 1.0.0 → 1.0.2

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