@lancar/lxui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/LICENSE +21 -0
  3. package/README.md +5072 -0
  4. package/css/base/reset.css +91 -0
  5. package/css/base/tokens-extended.css +119 -0
  6. package/css/base/tokens.css +105 -0
  7. package/css/base/typography.css +35 -0
  8. package/css/base/utils.css +26 -0
  9. package/css/components/accordion.css +25 -0
  10. package/css/components/alert.css +22 -0
  11. package/css/components/animations.css +26 -0
  12. package/css/components/avatar.css +38 -0
  13. package/css/components/back-top.css +32 -0
  14. package/css/components/badge.css +37 -0
  15. package/css/components/breadcrumb.css +13 -0
  16. package/css/components/button.css +103 -0
  17. package/css/components/callout.css +20 -0
  18. package/css/components/card.css +42 -0
  19. package/css/components/carousel.css +31 -0
  20. package/css/components/chip.css +52 -0
  21. package/css/components/code-block.css +22 -0
  22. package/css/components/collapse.css +6 -0
  23. package/css/components/compat.css +27 -0
  24. package/css/components/dark-mode.css +35 -0
  25. package/css/components/divider.css +36 -0
  26. package/css/components/dropdown.css +39 -0
  27. package/css/components/empty.css +34 -0
  28. package/css/components/fab.css +28 -0
  29. package/css/components/file-drop.css +47 -0
  30. package/css/components/forms.css +107 -0
  31. package/css/components/kbd.css +5 -0
  32. package/css/components/list-group.css +17 -0
  33. package/css/components/modal.css +50 -0
  34. package/css/components/nav.css +25 -0
  35. package/css/components/navbar.css +44 -0
  36. package/css/components/number-input.css +52 -0
  37. package/css/components/offcanvas.css +25 -0
  38. package/css/components/pagination.css +17 -0
  39. package/css/components/popover.css +12 -0
  40. package/css/components/progress.css +26 -0
  41. package/css/components/rating.css +28 -0
  42. package/css/components/section.css +18 -0
  43. package/css/components/skeleton.css +19 -0
  44. package/css/components/spinner.css +38 -0
  45. package/css/components/stat.css +58 -0
  46. package/css/components/steps.css +76 -0
  47. package/css/components/table.css +29 -0
  48. package/css/components/tag.css +29 -0
  49. package/css/components/timeline.css +11 -0
  50. package/css/components/toast.css +14 -0
  51. package/css/components/toggler.css +20 -0
  52. package/css/components/tooltip.css +10 -0
  53. package/css/index.css +59 -0
  54. package/css/layout/grid.css +71 -0
  55. package/css/layout/utilities.css +257 -0
  56. package/js/breakpoint.js +13 -0
  57. package/js/carousel.js +62 -0
  58. package/js/clipboard.js +28 -0
  59. package/js/collapse.js +36 -0
  60. package/js/counter.js +38 -0
  61. package/js/dropdown.js +27 -0
  62. package/js/index.js +19 -0
  63. package/js/init.js +89 -0
  64. package/js/modal.js +44 -0
  65. package/js/number-input.js +44 -0
  66. package/js/offcanvas.js +28 -0
  67. package/js/popover.js +39 -0
  68. package/js/rating.js +39 -0
  69. package/js/scrollspy.js +24 -0
  70. package/js/tab.js +18 -0
  71. package/js/theme.js +9 -0
  72. package/js/toast.js +73 -0
  73. package/js/tooltip.js +39 -0
  74. package/js/utils.js +20 -0
  75. package/lx-grid.min.css +2 -0
  76. package/lx-utilities.min.css +2 -0
  77. package/lxeditor.min.css +2 -0
  78. package/lxfonts.min.css +2 -0
  79. package/lxicons.min.css +2 -0
  80. package/lxmarked.js +276 -0
  81. package/lxthemes.min.css +2 -0
  82. package/lxui.bundle.js +540 -0
  83. package/lxui.bundle.min.js +13 -0
  84. package/lxui.css +2163 -0
  85. package/lxui.esm.js +669 -0
  86. package/lxui.esm.min.js +8 -0
  87. package/lxui.js +859 -0
  88. package/lxui.min.css +2 -0
  89. package/lxui.min.js +7 -0
  90. package/lxui.rtl.css +2466 -0
  91. package/lxui.rtl.min.css +2 -0
  92. package/marked.min.js +69 -0
  93. package/package.json +183 -0
  94. package/types/index.d.ts +284 -0
@@ -0,0 +1,91 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* reset */
3
+ §1 RESET & BASE
4
+ ================================================================= */
5
+
6
+ *,
7
+ *::before,
8
+ *::after {
9
+ box-sizing: border-box;
10
+ }
11
+
12
+ html {
13
+ scroll-behavior: smooth;
14
+ -webkit-text-size-adjust: 100%;
15
+ tab-size: 4;
16
+ }
17
+
18
+ body {
19
+ margin: 0;
20
+ min-height: 100vh;
21
+ font-family: var(--font-default, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);
22
+ font-size: var(--lx-text-base, 1rem);
23
+ line-height: 1.6;
24
+ color: var(--text-primary, #111827);
25
+ background-color: var(--bg-primary, #ffffff);
26
+ -webkit-font-smoothing: antialiased;
27
+ -moz-osx-font-smoothing: grayscale;
28
+ text-rendering: optimizeLegibility;
29
+ }
30
+
31
+ h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd { margin: 0; }
32
+
33
+ img, svg, video, canvas, audio, iframe, embed, object { display: block; max-width: 100%; }
34
+
35
+ input, button, textarea, select { font: inherit; }
36
+
37
+ ul[role='list'], ol[role='list'] { list-style: none; }
38
+
39
+ h1, h2, h3, h4, h5, h6 {
40
+ font-family: var(--font-default);
41
+ font-weight: 700;
42
+ letter-spacing: -0.02em;
43
+ color: var(--text-primary, #111827);
44
+ margin-top: 1.5em;
45
+ margin-bottom: 0.5em;
46
+ }
47
+
48
+ h1 { font-size: clamp(1.75rem, 4vw + 1rem, 2.5rem); line-height: 1.2; }
49
+ h2 { font-size: clamp(1.5rem, 3vw + 0.8rem, 2rem); line-height: 1.3; }
50
+ h3 { font-size: clamp(1.25rem, 2.5vw + 0.6rem, 1.75rem); line-height: 1.3; }
51
+ h4 { font-size: clamp(1.125rem, 2vw + 0.5rem, 1.5rem); line-height: 1.4; }
52
+ h5 { font-size: clamp(1rem, 1.5vw + 0.4rem, 1.25rem); line-height: 1.4; }
53
+ h6 { font-size: 1rem; line-height: 1.5; font-weight: 600; }
54
+
55
+ p { margin-top: 0; margin-bottom: 1em; }
56
+
57
+ a { color: var(--accent, #3b82f6); text-decoration: none; transition: color 0.2s ease; }
58
+ a:hover { color: var(--accent-hover, #2563eb); text-decoration: underline; }
59
+ a:focus-visible { outline: 2px solid var(--accent, #3b82f6); outline-offset: 2px; border-radius: 3px; }
60
+
61
+ code, pre { font-family: var(--font-mono, "SFMono-Regular", Consolas, monospace); }
62
+ code { padding: 2px 6px; background: var(--bg-secondary, #f3f4f6); border: 1px solid var(--border-subtle, #e5e7eb); border-radius: 4px; font-size: 0.875em; }
63
+ 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; }
64
+ pre code { background: none; border: none; padding: 0; }
65
+
66
+ 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; }
67
+
68
+ mark { background: #fef08a; padding: 0.1em 0.2em; border-radius: 2px; }
69
+
70
+ hr { border: none; border-top: 1px solid var(--border-subtle, #e5e7eb); margin: 1.5rem 0; }
71
+
72
+ ::selection { background: var(--accent-subtle, #dbeafe); color: var(--accent, #1d4ed8); }
73
+
74
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
75
+ ::-webkit-scrollbar-track { background: var(--bg-secondary, #f3f4f6); }
76
+ ::-webkit-scrollbar-thumb { background: var(--border-strong, #d1d5db); border-radius: 4px; }
77
+ ::-webkit-scrollbar-thumb:hover { background: var(--accent, #3b82f6); }
78
+
79
+ :focus-visible { outline: 2px solid var(--accent, #3b82f6); outline-offset: 2px; }
80
+ :focus:not(:focus-visible) { outline: none; }
81
+
82
+ @media (prefers-reduced-motion: reduce) {
83
+ *, *::before, *::after {
84
+ animation-duration: 0.01ms !important;
85
+ animation-iteration-count: 1 !important;
86
+ transition-duration: 0.01ms !important;
87
+ scroll-behavior: auto !important;
88
+ }
89
+ }
90
+
91
+ /* ================================================================
@@ -0,0 +1,119 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* Extended design tokens */
3
+ /* ── Extended design tokens ── */
4
+ :root {
5
+ /* Semantic aliases */
6
+ --lx-font-sans: var(--font-default);
7
+ --lx-font-serif: "Source Serif Pro", Georgia, "Times New Roman", serif;
8
+ --lx-text: var(--text-primary, #111827);
9
+ --lx-text-secondary:var(--text-secondary, #6b7280);
10
+ --lx-text-muted: var(--text-muted, #9ca3af);
11
+ --lx-text-disabled: #d1d5db;
12
+ --lx-bg: var(--bg-primary, #ffffff);
13
+ --lx-bg-soft: var(--bg-secondary, #f9fafb);
14
+ --lx-bg-muted: var(--bg-tertiary, #f3f4f6);
15
+ --lx-border: var(--border-default, #e5e7eb);
16
+
17
+ /* Extended color variants */
18
+ --lx-primary-hover: var(--lx-primary-dark, #2563eb);
19
+ --lx-primary-subtle: var(--accent-subtle, #dbeafe);
20
+ --lx-primary-fg: var(--accent-fg, #ffffff);
21
+ --lx-secondary-hover: #4b5563;
22
+ --lx-secondary-subtle:#f9fafb;
23
+ --lx-secondary-fg: #ffffff;
24
+ --lx-success-hover: #16a34a;
25
+ --lx-success-subtle: #f0fdf4;
26
+ --lx-success-light: #86efac;
27
+ --lx-success-fg: #ffffff;
28
+ --lx-warning-hover: #d97706;
29
+ --lx-warning-subtle: #fffbeb;
30
+ --lx-warning-light: #fcd34d;
31
+ --lx-warning-fg: #ffffff;
32
+ --lx-danger-hover: #dc2626;
33
+ --lx-danger-subtle: #fef2f2;
34
+ --lx-danger-light: #fca5a5;
35
+ --lx-danger-fg: #ffffff;
36
+ --lx-info-hover: #0891b2;
37
+ --lx-info-subtle: #ecfeff;
38
+ --lx-info-light: #67e8f9;
39
+ --lx-info-fg: #ffffff;
40
+ --lx-white: #ffffff;
41
+ --lx-black: #000000;
42
+
43
+ /* Gray scale */
44
+ --lx-gray-50: #f9fafb;
45
+ --lx-gray-100: #f3f4f6;
46
+ --lx-gray-200: #e5e7eb;
47
+ --lx-gray-300: #d1d5db;
48
+ --lx-gray-400: #9ca3af;
49
+ --lx-gray-500: #6b7280;
50
+ --lx-gray-600: #4b5563;
51
+ --lx-gray-700: #374151;
52
+ --lx-gray-800: #1f2937;
53
+ --lx-gray-900: #111827;
54
+ --lx-gray-950: #030712;
55
+
56
+ /* Timing functions */
57
+ --lx-ease: cubic-bezier(0.4, 0, 0.2, 1);
58
+ --lx-ease-in: cubic-bezier(0.4, 0, 1, 1);
59
+ --lx-ease-out: cubic-bezier(0, 0, 0.2, 1);
60
+ --lx-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
61
+ --lx-duration-fast: 100ms;
62
+ --lx-duration: 200ms;
63
+ --lx-duration-slow: 300ms;
64
+
65
+ /* Component tokens */
66
+ --lx-btn-padding-y: 0.5rem;
67
+ --lx-btn-padding-x: 1rem;
68
+ --lx-btn-font-size: var(--lx-text-sm, 0.875rem);
69
+ --lx-btn-font-weight: 600;
70
+ --lx-btn-radius: var(--lx-radius, 8px);
71
+ --lx-btn-transition: var(--lx-transition);
72
+
73
+ --lx-card-padding: 1.5rem;
74
+ --lx-card-radius: var(--lx-radius-md, 12px);
75
+ --lx-card-shadow: var(--lx-shadow);
76
+ --lx-card-border: 1px solid var(--border-default, #e5e7eb);
77
+
78
+ --lx-input-padding-y: 0.5rem;
79
+ --lx-input-padding-x: 0.75rem;
80
+ --lx-input-font-size: var(--lx-text-sm, 0.875rem);
81
+ --lx-input-radius: var(--lx-radius, 8px);
82
+ --lx-input-border: 1px solid var(--border-strong, #d1d5db);
83
+ --lx-input-bg: var(--bg-primary, #ffffff);
84
+ --lx-input-focus-shadow: 0 0 0 3px rgba(59,130,246,.15);
85
+
86
+ --lx-modal-radius: var(--lx-radius-lg, 16px);
87
+ --lx-modal-shadow: var(--lx-shadow-xl);
88
+ --lx-modal-backdrop: rgba(0,0,0,.5);
89
+
90
+ --lx-tooltip-bg: #111827;
91
+ --lx-tooltip-color: #ffffff;
92
+ --lx-tooltip-radius: var(--lx-radius-sm, 4px);
93
+
94
+ --lx-badge-padding-y: 0.25em;
95
+ --lx-badge-padding-x: 0.6em;
96
+ --lx-badge-font-size: 0.75em;
97
+ --lx-badge-font-weight: 600;
98
+ --lx-badge-radius: var(--lx-radius-full, 9999px);
99
+
100
+ --lx-progress-height: 0.5rem;
101
+ --lx-progress-bg: var(--bg-tertiary, #f3f4f6);
102
+ --lx-progress-radius: var(--lx-radius-full, 9999px);
103
+
104
+ --lx-avatar-size: 2.5rem;
105
+ --lx-avatar-radius: 50%;
106
+ --lx-avatar-font-size: 0.875rem;
107
+
108
+ --lx-breadcrumb-sep: "/";
109
+
110
+ /* Container sizes */
111
+ --lx-container-sm: 640px;
112
+ --lx-container-md: 768px;
113
+ --lx-container-lg: 1024px;
114
+ --lx-container-xl: 1280px;
115
+ --lx-container-2xl: 1536px;
116
+ --lx-container-pad: var(--lx-container-padding-x, 1rem);
117
+ }
118
+
119
+ /* ================================================================
@@ -0,0 +1,105 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* tokens */
3
+ §2 DESIGN TOKENS
4
+ ================================================================= */
5
+
6
+ :root {
7
+ /* Font system */
8
+ --font-system: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
9
+ --font-default: "Plus Jakarta Sans", var(--font-system);
10
+ --font-modern: "Inter", var(--font-system);
11
+ --font-mono: "SFMono-Regular", "JetBrains Mono", Consolas, "Liberation Mono", Menlo, "Courier New", monospace;
12
+
13
+ /* Font sizes */
14
+ --lx-text-xs: 0.75rem;
15
+ --lx-text-sm: 0.875rem;
16
+ --lx-text-base: 1rem;
17
+ --lx-text-lg: 1.125rem;
18
+ --lx-text-xl: 1.25rem;
19
+ --lx-text-2xl: 1.5rem;
20
+ --lx-text-3xl: 1.875rem;
21
+ --lx-text-4xl: 2.25rem;
22
+ --lx-text-5xl: 3rem;
23
+
24
+ /* Spacing */
25
+ --lx-spacer: 1rem;
26
+ --lx-space-1: 0.25rem;
27
+ --lx-space-2: 0.5rem;
28
+ --lx-space-3: 0.75rem;
29
+ --lx-space-4: 1rem;
30
+ --lx-space-5: 1.25rem;
31
+ --lx-space-6: 1.5rem;
32
+ --lx-space-8: 2rem;
33
+ --lx-space-10: 2.5rem;
34
+ --lx-space-12: 3rem;
35
+ --lx-space-16: 4rem;
36
+
37
+ /* Border radius */
38
+ --lx-radius-none: 0;
39
+ --lx-radius-sm: 4px;
40
+ --lx-radius: 8px;
41
+ --lx-radius-md: 12px;
42
+ --lx-radius-lg: 16px;
43
+ --lx-radius-xl: 24px;
44
+ --lx-radius-full: 9999px;
45
+
46
+ /* Shadows */
47
+ --lx-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.04);
48
+ --lx-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
49
+ --lx-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
50
+ --lx-shadow-md: 0 8px 12px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.05);
51
+ --lx-shadow-lg: 0 16px 24px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.05);
52
+ --lx-shadow-xl: 0 24px 40px -8px rgba(0, 0, 0, 0.12), 0 12px 16px -8px rgba(0, 0, 0, 0.06);
53
+ --lx-shadow-2xl: 0 40px 60px -12px rgba(0, 0, 0, 0.18);
54
+
55
+ /* Transitions */
56
+ --lx-transition: all 0.2s ease;
57
+ --lx-transition-fast: all 0.1s ease;
58
+ --lx-transition-slow: all 0.4s ease;
59
+
60
+ /* Z-index */
61
+ --lx-z-dropdown: 1000;
62
+ --lx-z-sticky: 1020;
63
+ --lx-z-fixed: 1030;
64
+ --lx-z-offcanvas: 1040;
65
+ --lx-z-modal-bg: 1050;
66
+ --lx-z-modal: 1060;
67
+ --lx-z-popover: 1070;
68
+ --lx-z-tooltip: 1080;
69
+ --lx-z-toast: 1090;
70
+
71
+ /* Brand colors (fallback when no theme is active) */
72
+ --lx-primary: #3b82f6;
73
+ --lx-primary-dark: #2563eb;
74
+ --lx-primary-light: #93c5fd;
75
+ --lx-secondary: #6b7280;
76
+ --lx-success: #22c55e;
77
+ --lx-warning: #f59e0b;
78
+ --lx-danger: #ef4444;
79
+ --lx-info: #06b6d4;
80
+ --lx-dark: #1f2937;
81
+ --lx-light: #f9fafb;
82
+
83
+ /* Default semantic vars (overridden by UI themes) */
84
+ --bg-primary: #ffffff;
85
+ --bg-secondary: #f9fafb;
86
+ --bg-tertiary: #f3f4f6;
87
+ --surface: #ffffff;
88
+ --text-primary: #111827;
89
+ --text-secondary: #6b7280;
90
+ --text-muted: #9ca3af;
91
+ --border-strong: #d1d5db;
92
+ --border-default: #e5e7eb;
93
+ --border-subtle: #f3f4f6;
94
+ --accent: var(--lx-primary);
95
+ --accent-hover: var(--lx-primary-dark);
96
+ --accent-subtle: #dbeafe;
97
+ --accent-fg: #ffffff;
98
+
99
+ /* Container */
100
+ --lx-container-padding-x: 1rem;
101
+ }
102
+
103
+ @media (min-width: 768px) {
104
+ :root { --lx-container-padding-x: 1.5rem; }
105
+ }
@@ -0,0 +1,35 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* typography */
3
+ §3 TYPOGRAPHY
4
+ ================================================================= */
5
+
6
+ h1, .lx-h1 { font-size: clamp(1.75rem,4vw + 1rem,2.5rem); font-weight: 700; line-height: 1.2; letter-spacing: -0.03em; }
7
+ h2, .lx-h2 { font-size: clamp(1.5rem,3vw + 0.8rem,2rem); font-weight: 700; line-height: 1.25; letter-spacing: -0.02em; }
8
+ 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; }
9
+ h4, .lx-h4 { font-size: clamp(1.125rem,2vw + 0.5rem,1.5rem); font-weight: 600; line-height: 1.35; }
10
+ h5, .lx-h5 { font-size: clamp(1rem,1.5vw + 0.4rem,1.25rem); font-weight: 600; line-height: 1.4; }
11
+ h6, .lx-h6 { font-size: 1rem; font-weight: 600; line-height: 1.5; }
12
+
13
+ .lx-display-1 { font-size: clamp(2.5rem,8vw + 0.5rem,5rem); font-weight: 700; line-height: 1.1; letter-spacing: -0.04em; }
14
+ .lx-display-2 { font-size: clamp(2.2rem,7vw + 0.5rem,4.5rem); font-weight: 700; line-height: 1.1; letter-spacing: -0.04em; }
15
+ .lx-display-3 { font-size: clamp(2rem,6vw + 0.5rem,4rem); font-weight: 700; line-height: 1.15; letter-spacing: -0.03em; }
16
+ .lx-display-4 { font-size: clamp(1.8rem,5vw + 0.5rem,3.5rem); font-weight: 700; line-height: 1.2; letter-spacing: -0.03em; }
17
+
18
+ .lx-lead { font-size: var(--lx-text-lg,1.125rem); font-weight: 400; line-height: 1.7; color: var(--lx-text-secondary,#6b7280); }
19
+
20
+ small, .lx-small { font-size: var(--lx-text-xs,0.75rem); color: var(--lx-text-muted,#9ca3af); }
21
+
22
+ blockquote, .lx-blockquote {
23
+ border-left: 3px solid var(--accent,#3b82f6);
24
+ padding: 1rem 1.5rem;
25
+ margin: 1.5rem 0;
26
+ background: var(--accent-subtle,#dbeafe);
27
+ border-radius: 0 var(--lx-radius,8px) var(--lx-radius,8px) 0;
28
+ font-style: italic;
29
+ color: var(--lx-text-secondary,#6b7280);
30
+ }
31
+ .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; }
32
+ .lx-blockquote-footer::before { content: "— "; }
33
+
34
+
35
+ /* ================================================================
@@ -0,0 +1,26 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+
3
+ /* ── Utility: scroll lock & fade ── */
4
+ body.lx-modal-open { overflow: hidden; }
5
+ .lx-fade { animation: lx-fadein .2s ease; }
6
+ .lx-offcanvas-backdrop {
7
+ position: fixed;
8
+ inset: 0;
9
+ z-index: 1039;
10
+ background: rgba(0,0,0,.5);
11
+ -webkit-backdrop-filter: blur(2px);
12
+ backdrop-filter: blur(2px);
13
+ }
14
+
15
+ /* ── Link helpers ── */
16
+ .lx-link-primary { color: var(--lx-primary,#3b82f6); }
17
+ .lx-link-secondary { color: var(--lx-secondary,#6b7280); }
18
+ .lx-link-success { color: var(--lx-success,#22c55e); }
19
+ .lx-link-warning { color: var(--lx-warning,#f59e0b); }
20
+ .lx-link-danger { color: var(--lx-danger,#ef4444); }
21
+ .lx-link-info { color: var(--lx-info,#06b6d4); }
22
+ .lx-link-dark { color: var(--lx-dark,#1f2937); }
23
+ [class^="lx-link-"]:hover { text-decoration: underline; }
24
+
25
+
26
+ /* ================================================================
@@ -0,0 +1,25 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* Accordion */
3
+ /* ── Accordion ── */
4
+ .lx-accordion { border: 1px solid var(--border-default,#e5e7eb); border-radius: var(--lx-radius-md,12px); overflow: hidden; }
5
+ .lx-accordion-item { border-bottom: 1px solid var(--border-default,#e5e7eb); }
6
+ .lx-accordion-item:last-child { border-bottom: none; }
7
+ .lx-accordion-flush { border: none; border-radius: 0; }
8
+ .lx-accordion-flush .lx-accordion-item { border-inline: none; }
9
+ .lx-accordion-trigger {
10
+ display: flex; align-items: center; justify-content: space-between;
11
+ width: 100%; padding: 1rem 1.25rem;
12
+ font-size: var(--lx-text-sm,0.875rem); font-weight: 600; color: var(--lx-text,#111827);
13
+ background: var(--lx-bg,#fff); border: none; cursor: pointer; text-align: start;
14
+ transition: background .1s ease;
15
+ }
16
+ .lx-accordion-trigger:hover { background: var(--lx-bg-soft,#f9fafb); }
17
+ .lx-accordion-trigger.lx-active { color: var(--lx-primary,#3b82f6); background: var(--lx-primary-subtle,#dbeafe); }
18
+ .lx-accordion-icon {
19
+ width: .875rem; height: .875rem;
20
+ border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
21
+ transform: rotate(45deg); flex-shrink: 0; transition: transform .2s ease;
22
+ }
23
+ .lx-accordion-trigger.lx-active .lx-accordion-icon { transform: rotate(-135deg); }
24
+ .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; }
25
+ .lx-accordion-body.lx-show { display: block; animation: lx-fadein .2s ease; }
@@ -0,0 +1,22 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* Alert */
3
+ /* ── Alert ── */
4
+ .lx-alert {
5
+ position: relative;
6
+ padding: .875rem 1.125rem;
7
+ border-radius: var(--lx-radius,8px);
8
+ border: 1px solid transparent;
9
+ font-size: var(--lx-text-sm,0.875rem);
10
+ line-height: 1.6;
11
+ }
12
+ .lx-alert-heading { font-weight: 700; font-size: var(--lx-text-base,1rem); margin-bottom: .375rem; }
13
+ .lx-alert-divider { border-color: currentColor; opacity: .2; margin: .75rem 0; }
14
+ .lx-alert-dismissible { padding-inline-end: 3rem; }
15
+ .lx-alert-close { position: absolute; top: .5rem; inset-inline-end: .5rem; }
16
+
17
+ .lx-alert-primary { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary-hover,#2563eb); border-color: var(--lx-primary-light,#93c5fd); }
18
+ .lx-alert-secondary { background: var(--lx-gray-100,#f3f4f6); color: var(--lx-gray-700,#374151); border-color: var(--lx-gray-300,#d1d5db); }
19
+ .lx-alert-success { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); border-color: var(--lx-success-light,#86efac); }
20
+ .lx-alert-warning { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); border-color: var(--lx-warning-light,#fcd34d); }
21
+ .lx-alert-danger { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); border-color: var(--lx-danger-light,#fca5a5); }
22
+ .lx-alert-info { background: var(--lx-info-subtle,#ecfeff); color: var(--lx-info-hover,#0891b2); border-color: var(--lx-info-light,#67e8f9); }
@@ -0,0 +1,26 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* Scroll-driven & animation helpers */
3
+ /* ── Scroll-driven & animation helpers ── */
4
+ @keyframes lx-slide-up { from { opacity:0; -webkit-transform:translateY(16px); transform:translateY(16px); } to { opacity:1; -webkit-transform:none; transform:none; } }
5
+ @keyframes lx-slide-down { from { opacity:0; -webkit-transform:translateY(-16px); transform:translateY(-16px); } to { opacity:1; -webkit-transform:none; transform:none; } }
6
+ @keyframes lx-slide-left { from { opacity:0; -webkit-transform:translateX(16px); transform:translateX(16px); } to { opacity:1; -webkit-transform:none; transform:none; } }
7
+ @keyframes lx-slide-right{ from { opacity:0; -webkit-transform:translateX(-16px); transform:translateX(-16px); } to { opacity:1; -webkit-transform:none; transform:none; } }
8
+ @keyframes lx-zoom-in { from { opacity:0; -webkit-transform:scale(.9); transform:scale(.9); } to { opacity:1; -webkit-transform:scale(1); transform:scale(1); } }
9
+ @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)} }
10
+ @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} }
11
+ .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; }
12
+ .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; }
13
+ .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; }
14
+ .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; }
15
+ .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; }
16
+ .lx-animate-bounce-in { -webkit-animation: lx-bounce-in .5s both; animation: lx-bounce-in .5s both; }
17
+ .lx-animate-pulse-ring { -webkit-animation: lx-pulse-ring 1.5s infinite; animation: lx-pulse-ring 1.5s infinite; }
18
+ .lx-animate-spin { -webkit-animation: lx-spin .6s linear infinite; animation: lx-spin .6s linear infinite; }
19
+ .lx-animate-ping { -webkit-animation: lx-grow 1s ease-in-out infinite; animation: lx-grow 1s ease-in-out infinite; }
20
+
21
+ /* Delay helpers */
22
+ .lx-delay-100 { -webkit-animation-delay: .1s; animation-delay: .1s; }
23
+ .lx-delay-200 { -webkit-animation-delay: .2s; animation-delay: .2s; }
24
+ .lx-delay-300 { -webkit-animation-delay: .3s; animation-delay: .3s; }
25
+ .lx-delay-500 { -webkit-animation-delay: .5s; animation-delay: .5s; }
26
+ .lx-delay-700 { -webkit-animation-delay: .7s; animation-delay: .7s; }
@@ -0,0 +1,38 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* Avatar */
3
+ /* ── Avatar ── */
4
+ .lx-avatar {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ width: var(--lx-avatar-size);
9
+ height: var(--lx-avatar-size);
10
+ border-radius: var(--lx-avatar-radius);
11
+ font-size: var(--lx-avatar-font-size);
12
+ font-weight: 600;
13
+ background: var(--lx-gray-200,#e5e7eb);
14
+ color: var(--lx-gray-600,#4b5563);
15
+ overflow: hidden;
16
+ flex-shrink: 0;
17
+ user-select: none;
18
+ }
19
+ .lx-avatar img { width: 100%; height: 100%; object-fit: cover; }
20
+ .lx-avatar-xs { width: 1.5rem; height: 1.5rem; font-size: .55rem; }
21
+ .lx-avatar-sm { width: 2rem; height: 2rem; font-size: .7rem; }
22
+ .lx-avatar-lg { width: 3.5rem; height: 3.5rem; font-size: 1rem; }
23
+ .lx-avatar-xl { width: 4.5rem; height: 4.5rem; font-size: 1.25rem; }
24
+ .lx-avatar-2xl { width: 6rem; height: 6rem; font-size: 1.5rem; }
25
+ .lx-avatar-primary { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); }
26
+ .lx-avatar-success { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); }
27
+ .lx-avatar-warning { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); }
28
+ .lx-avatar-danger { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); }
29
+ .lx-avatar-info { background: var(--lx-info-subtle,#ecfeff); color: var(--lx-info-hover,#0891b2); }
30
+ .lx-avatar-wrapper { position: relative; display: inline-block; }
31
+ .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); }
32
+ .lx-avatar-status-online { background: var(--lx-success,#22c55e); }
33
+ .lx-avatar-status-busy { background: var(--lx-danger,#ef4444); }
34
+ .lx-avatar-status-away { background: var(--lx-warning,#f59e0b); }
35
+ .lx-avatar-status-offline { background: var(--lx-gray-400,#9ca3af); }
36
+ .lx-avatar-group { display: inline-flex; }
37
+ .lx-avatar-group .lx-avatar { margin-inline-start: -.5rem; border: 2px solid var(--lx-bg,#fff); }
38
+ .lx-avatar-group .lx-avatar:first-child { margin-inline-start: 0; }
@@ -0,0 +1,32 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* Back To Top */
3
+ /* ── Back To Top ── */
4
+ .lx-back-top {
5
+ position: fixed;
6
+ inset-inline-end: 1.5rem;
7
+ bottom: 5rem;
8
+ z-index: var(--lx-z-fixed,1030);
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ width: 2.5rem;
13
+ height: 2.5rem;
14
+ border-radius: 50%;
15
+ background: var(--bg-primary,#fff);
16
+ border: 1px solid var(--border-default,#e5e7eb);
17
+ -webkit-box-shadow: var(--lx-shadow-md);
18
+ box-shadow: var(--lx-shadow-md);
19
+ cursor: pointer;
20
+ opacity: 0;
21
+ visibility: hidden;
22
+ -webkit-transform: translateY(8px);
23
+ transform: translateY(8px);
24
+ -webkit-transition: opacity .25s ease, visibility .25s ease, -webkit-transform .25s ease;
25
+ transition: opacity .25s ease, visibility .25s ease, transform .25s ease;
26
+ font-size: 1.125rem;
27
+ color: var(--lx-text-secondary,#6b7280);
28
+ text-decoration: none;
29
+ }
30
+ .lx-back-top.lx-show { opacity: 1; visibility: visible; -webkit-transform: none; transform: none; }
31
+ .lx-back-top:hover { background: var(--lx-primary,#3b82f6); color: #fff; border-color: var(--lx-primary,#3b82f6); }
32
+ .lx-back-top::before { content: "↑"; font-weight: 700; }
@@ -0,0 +1,37 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* Badge */
3
+ /* ── Badge ── */
4
+ .lx-badge {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ padding: var(--lx-badge-padding-y) var(--lx-badge-padding-x);
8
+ font-size: var(--lx-badge-font-size);
9
+ font-weight: var(--lx-badge-font-weight);
10
+ line-height: 1;
11
+ border-radius: var(--lx-badge-radius);
12
+ white-space: nowrap;
13
+ }
14
+ .lx-badge-sm { font-size: .65em; }
15
+ .lx-badge-lg { font-size: .875em; padding: .35em .7em; }
16
+
17
+ .lx-badge-primary { background: var(--lx-primary,#3b82f6); color: var(--lx-primary-fg,#fff); }
18
+ .lx-badge-secondary { background: var(--lx-secondary,#6b7280); color: #fff; }
19
+ .lx-badge-success { background: var(--lx-success,#22c55e); color: #fff; }
20
+ .lx-badge-warning { background: var(--lx-warning,#f59e0b); color: #fff; }
21
+ .lx-badge-danger { background: var(--lx-danger,#ef4444); color: #fff; }
22
+ .lx-badge-info { background: var(--lx-info,#06b6d4); color: #fff; }
23
+ .lx-badge-dark { background: var(--lx-dark,#1f2937); color: #fff; }
24
+ .lx-badge-light { background: var(--lx-light,#f9fafb); color: var(--lx-text,#111827); border: 1px solid var(--border-default,#e5e7eb); }
25
+
26
+ .lx-badge-outline-primary { border: 1px solid var(--lx-primary,#3b82f6); color: var(--lx-primary,#3b82f6); background: transparent; }
27
+ .lx-badge-outline-secondary { border: 1px solid var(--lx-secondary,#6b7280); color: var(--lx-secondary,#6b7280); background: transparent; }
28
+ .lx-badge-outline-success { border: 1px solid var(--lx-success,#22c55e); color: var(--lx-success,#22c55e); background: transparent; }
29
+ .lx-badge-outline-danger { border: 1px solid var(--lx-danger,#ef4444); color: var(--lx-danger,#ef4444); background: transparent; }
30
+ .lx-badge-outline-warning { border: 1px solid var(--lx-warning,#f59e0b); color: var(--lx-warning,#f59e0b); background: transparent; }
31
+
32
+ .lx-badge-soft-primary { background: var(--lx-primary-subtle,#dbeafe); color: var(--lx-primary,#3b82f6); }
33
+ .lx-badge-soft-secondary { background: var(--lx-gray-100,#f3f4f6); color: var(--lx-secondary,#6b7280); }
34
+ .lx-badge-soft-success { background: var(--lx-success-subtle,#f0fdf4); color: var(--lx-success-hover,#16a34a); }
35
+ .lx-badge-soft-warning { background: var(--lx-warning-subtle,#fffbeb); color: var(--lx-warning-hover,#d97706); }
36
+ .lx-badge-soft-danger { background: var(--lx-danger-subtle,#fef2f2); color: var(--lx-danger-hover,#dc2626); }
37
+ .lx-badge-soft-info { background: var(--lx-info-subtle,#ecfeff); color: var(--lx-info-hover,#0891b2); }
@@ -0,0 +1,13 @@
1
+ /*! LxUI v1.0.0 | MIT License | https://ui.lancar.id */
2
+ /* Breadcrumb */
3
+ /* ── Breadcrumb ── */
4
+ .lx-breadcrumb {
5
+ display: flex; flex-wrap: wrap; gap: .25rem;
6
+ list-style: none; padding: 0; margin: 0;
7
+ font-size: var(--lx-text-sm,0.875rem);
8
+ }
9
+ .lx-breadcrumb-item { display: flex; align-items: center; color: var(--lx-text-muted,#9ca3af); }
10
+ .lx-breadcrumb-item a { color: var(--lx-text-secondary,#6b7280); text-decoration: none; transition: color .1s ease; }
11
+ .lx-breadcrumb-item a:hover { color: var(--lx-primary,#3b82f6); }
12
+ .lx-breadcrumb-item.lx-active { color: var(--lx-text,#111827); font-weight: 500; }
13
+ .lx-breadcrumb-item + .lx-breadcrumb-item::before { content: var(--lx-breadcrumb-sep); padding-inline: .4rem; color: var(--lx-text-muted,#9ca3af); }