@svadmin/lite 0.3.7 → 0.3.10

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 (172) hide show
  1. package/README.md +19 -13
  2. package/dist/components/LiteAlert.svelte +19 -0
  3. package/dist/components/LiteAlert.svelte.d.ts +11 -0
  4. package/dist/components/LiteArrayField.svelte +60 -0
  5. package/dist/components/LiteArrayField.svelte.d.ts +17 -0
  6. package/dist/components/LiteArrayItem.svelte +146 -0
  7. package/dist/components/LiteArrayItem.svelte.d.ts +13 -0
  8. package/dist/components/LiteAuditLog.svelte +104 -0
  9. package/dist/components/LiteAuditLog.svelte.d.ts +23 -0
  10. package/dist/components/LiteBreadcrumbs.svelte +39 -0
  11. package/dist/components/LiteBreadcrumbs.svelte.d.ts +16 -0
  12. package/dist/components/LiteChatDialog.svelte +101 -0
  13. package/dist/components/LiteChatDialog.svelte.d.ts +20 -0
  14. package/dist/components/LiteConfirmDialog.svelte +60 -0
  15. package/dist/components/LiteConfirmDialog.svelte.d.ts +22 -0
  16. package/dist/components/LiteEmptyState.svelte +39 -0
  17. package/dist/components/LiteEmptyState.svelte.d.ts +16 -0
  18. package/dist/components/LiteForm.svelte +165 -0
  19. package/dist/components/LiteForm.svelte.d.ts +26 -0
  20. package/dist/components/LiteLayout.svelte +147 -0
  21. package/dist/components/LiteLayout.svelte.d.ts +19 -0
  22. package/dist/components/LiteLogin.svelte +41 -0
  23. package/dist/components/LiteLogin.svelte.d.ts +8 -0
  24. package/dist/components/LitePagination.svelte +73 -0
  25. package/dist/components/LitePagination.svelte.d.ts +11 -0
  26. package/dist/components/LitePermissionMatrix.svelte +147 -0
  27. package/dist/components/LitePermissionMatrix.svelte.d.ts +32 -0
  28. package/dist/components/LiteSearch.svelte +41 -0
  29. package/dist/components/LiteSearch.svelte.d.ts +9 -0
  30. package/dist/components/LiteShow.svelte +61 -0
  31. package/dist/components/LiteShow.svelte.d.ts +14 -0
  32. package/dist/components/LiteShowField.svelte +62 -0
  33. package/dist/components/LiteShowField.svelte.d.ts +12 -0
  34. package/dist/components/LiteStatsCard.svelte +70 -0
  35. package/dist/components/LiteStatsCard.svelte.d.ts +24 -0
  36. package/dist/components/LiteTable.svelte +132 -0
  37. package/dist/components/LiteTable.svelte.d.ts +19 -0
  38. package/dist/components/LiteTabs.svelte +57 -0
  39. package/dist/components/LiteTabs.svelte.d.ts +16 -0
  40. package/dist/components/advanced/LiteAutoSaveIndicator.svelte +26 -0
  41. package/dist/components/advanced/LiteAutoSaveIndicator.svelte.d.ts +12 -0
  42. package/dist/components/advanced/LiteDraggableHeader.svelte +33 -0
  43. package/dist/components/advanced/LiteDraggableHeader.svelte.d.ts +15 -0
  44. package/dist/components/advanced/LiteDrawerForm.svelte +42 -0
  45. package/dist/components/advanced/LiteDrawerForm.svelte.d.ts +16 -0
  46. package/dist/components/advanced/LiteInlineEdit.svelte +32 -0
  47. package/dist/components/advanced/LiteInlineEdit.svelte.d.ts +15 -0
  48. package/dist/components/advanced/LiteModalForm.svelte +44 -0
  49. package/dist/components/advanced/LiteModalForm.svelte.d.ts +17 -0
  50. package/dist/components/advanced/LiteToast.svelte +34 -0
  51. package/dist/components/advanced/LiteToast.svelte.d.ts +14 -0
  52. package/dist/components/advanced/LiteUndoableNotification.svelte +25 -0
  53. package/dist/components/advanced/LiteUndoableNotification.svelte.d.ts +13 -0
  54. package/dist/components/advanced/LiteVirtualTable.svelte +44 -0
  55. package/dist/components/advanced/LiteVirtualTable.svelte.d.ts +20 -0
  56. package/dist/components/advanced/index.js +8 -0
  57. package/dist/components/buttons/LiteCloneButton.svelte +33 -0
  58. package/dist/components/buttons/LiteCloneButton.svelte.d.ts +11 -0
  59. package/dist/components/buttons/LiteCreateButton.svelte +31 -0
  60. package/dist/components/buttons/LiteCreateButton.svelte.d.ts +10 -0
  61. package/dist/components/buttons/LiteDeleteButton.svelte +57 -0
  62. package/dist/components/buttons/LiteDeleteButton.svelte.d.ts +12 -0
  63. package/dist/components/buttons/LiteEditButton.svelte +33 -0
  64. package/dist/components/buttons/LiteEditButton.svelte.d.ts +11 -0
  65. package/dist/components/buttons/LiteExportButton.svelte +31 -0
  66. package/dist/components/buttons/LiteExportButton.svelte.d.ts +10 -0
  67. package/dist/components/buttons/LiteImportButton.svelte +50 -0
  68. package/dist/components/buttons/LiteImportButton.svelte.d.ts +10 -0
  69. package/dist/components/buttons/LiteListButton.svelte +31 -0
  70. package/dist/components/buttons/LiteListButton.svelte.d.ts +10 -0
  71. package/dist/components/buttons/LiteRefreshButton.svelte +34 -0
  72. package/dist/components/buttons/LiteRefreshButton.svelte.d.ts +8 -0
  73. package/dist/components/buttons/LiteSaveButton.svelte +27 -0
  74. package/dist/components/buttons/LiteSaveButton.svelte.d.ts +8 -0
  75. package/dist/components/buttons/LiteShowButton.svelte +33 -0
  76. package/dist/components/buttons/LiteShowButton.svelte.d.ts +11 -0
  77. package/dist/components/buttons/index.js +10 -0
  78. package/dist/components/fields/LiteBooleanField.svelte +42 -0
  79. package/dist/components/fields/LiteBooleanField.svelte.d.ts +10 -0
  80. package/dist/components/fields/LiteDateField.svelte +51 -0
  81. package/dist/components/fields/LiteDateField.svelte.d.ts +10 -0
  82. package/dist/components/fields/LiteEmailField.svelte +41 -0
  83. package/dist/components/fields/LiteEmailField.svelte.d.ts +10 -0
  84. package/dist/components/fields/LiteFileField.svelte +59 -0
  85. package/dist/components/fields/LiteFileField.svelte.d.ts +10 -0
  86. package/dist/components/fields/LiteImageField.svelte +57 -0
  87. package/dist/components/fields/LiteImageField.svelte.d.ts +10 -0
  88. package/dist/components/fields/LiteJsonField.svelte +43 -0
  89. package/dist/components/fields/LiteJsonField.svelte.d.ts +10 -0
  90. package/dist/components/fields/LiteMarkdownField.svelte +33 -0
  91. package/dist/components/fields/LiteMarkdownField.svelte.d.ts +10 -0
  92. package/dist/components/fields/LiteMultiSelectField.svelte +57 -0
  93. package/dist/components/fields/LiteMultiSelectField.svelte.d.ts +10 -0
  94. package/dist/components/fields/LiteNumberField.svelte +35 -0
  95. package/dist/components/fields/LiteNumberField.svelte.d.ts +10 -0
  96. package/dist/components/fields/LiteRelationField.svelte +67 -0
  97. package/dist/components/fields/LiteRelationField.svelte.d.ts +10 -0
  98. package/dist/components/fields/LiteRichTextField.svelte +44 -0
  99. package/dist/components/fields/LiteRichTextField.svelte.d.ts +10 -0
  100. package/dist/components/fields/LiteSelectField.svelte +47 -0
  101. package/dist/components/fields/LiteSelectField.svelte.d.ts +10 -0
  102. package/dist/components/fields/LiteTagField.svelte +44 -0
  103. package/dist/components/fields/LiteTagField.svelte.d.ts +10 -0
  104. package/dist/components/fields/LiteTextField.svelte +35 -0
  105. package/dist/components/fields/LiteTextField.svelte.d.ts +10 -0
  106. package/dist/components/fields/LiteUrlField.svelte +52 -0
  107. package/dist/components/fields/LiteUrlField.svelte.d.ts +10 -0
  108. package/dist/components/fields/index.js +15 -0
  109. package/dist/components/layout/LiteAuthenticated.svelte +23 -0
  110. package/dist/components/layout/LiteAuthenticated.svelte.d.ts +10 -0
  111. package/dist/components/layout/LiteCanAccess.svelte +27 -0
  112. package/dist/components/layout/LiteCanAccess.svelte.d.ts +10 -0
  113. package/dist/components/layout/LiteCatchAllNavigate.svelte +20 -0
  114. package/dist/components/layout/LiteCatchAllNavigate.svelte.d.ts +7 -0
  115. package/dist/components/layout/LiteErrorBoundary.svelte +20 -0
  116. package/dist/components/layout/LiteErrorBoundary.svelte.d.ts +13 -0
  117. package/dist/components/layout/LiteErrorComponent.svelte +37 -0
  118. package/dist/components/layout/LiteErrorComponent.svelte.d.ts +9 -0
  119. package/dist/components/layout/LiteHeader.svelte +19 -0
  120. package/dist/components/layout/LiteHeader.svelte.d.ts +8 -0
  121. package/dist/components/layout/LiteNavigateToResource.svelte +25 -0
  122. package/dist/components/layout/LiteNavigateToResource.svelte.d.ts +7 -0
  123. package/dist/components/layout/LiteSidebar.svelte +93 -0
  124. package/dist/components/layout/LiteSidebar.svelte.d.ts +12 -0
  125. package/dist/components/layout/index.js +8 -0
  126. package/dist/components/pages/LiteCreatePage.svelte +39 -0
  127. package/dist/components/pages/LiteCreatePage.svelte.d.ts +10 -0
  128. package/dist/components/pages/LiteEditPage.svelte +54 -0
  129. package/dist/components/pages/LiteEditPage.svelte.d.ts +12 -0
  130. package/dist/components/pages/LiteForgotPasswordPage.svelte +60 -0
  131. package/dist/components/pages/LiteForgotPasswordPage.svelte.d.ts +11 -0
  132. package/dist/components/pages/LiteListPage.svelte +81 -0
  133. package/dist/components/pages/LiteListPage.svelte.d.ts +20 -0
  134. package/dist/components/pages/LiteProfilePage.svelte +61 -0
  135. package/dist/components/pages/LiteProfilePage.svelte.d.ts +14 -0
  136. package/dist/components/pages/LiteRegisterPage.svelte +63 -0
  137. package/dist/components/pages/LiteRegisterPage.svelte.d.ts +10 -0
  138. package/dist/components/pages/LiteShowPage.svelte +61 -0
  139. package/dist/components/pages/LiteShowPage.svelte.d.ts +11 -0
  140. package/dist/components/pages/LiteUpdatePasswordPage.svelte +51 -0
  141. package/dist/components/pages/LiteUpdatePasswordPage.svelte.d.ts +9 -0
  142. package/dist/components/pages/index.js +8 -0
  143. package/dist/components/widgets/LiteAnomalyBadge.svelte +40 -0
  144. package/dist/components/widgets/LiteAnomalyBadge.svelte.d.ts +15 -0
  145. package/dist/components/widgets/LiteBarChart.svelte +45 -0
  146. package/dist/components/widgets/LiteBarChart.svelte.d.ts +17 -0
  147. package/dist/components/widgets/LiteInsightCard.svelte +31 -0
  148. package/dist/components/widgets/LiteInsightCard.svelte.d.ts +13 -0
  149. package/dist/components/widgets/LiteLineChart.svelte +48 -0
  150. package/dist/components/widgets/LiteLineChart.svelte.d.ts +17 -0
  151. package/dist/components/widgets/LitePieChart.svelte +44 -0
  152. package/dist/components/widgets/LitePieChart.svelte.d.ts +17 -0
  153. package/dist/components/widgets/index.js +5 -0
  154. package/dist/enhance.js +112 -0
  155. package/dist/index.d.ts +27 -0
  156. package/{src/index.ts → dist/index.js} +3 -26
  157. package/dist/lite.css +817 -0
  158. package/dist/schema-generator.d.ts +29 -0
  159. package/dist/schema-generator.js +226 -0
  160. package/dist/security.d.ts +14 -0
  161. package/dist/security.js +59 -0
  162. package/dist/server-adapter.d.ts +111 -0
  163. package/dist/server-adapter.js +422 -0
  164. package/package.json +55 -18
  165. package/src/schema-generator.ts +0 -147
  166. package/src/server-adapter.ts +0 -307
  167. /package/{src/components/advanced/index.ts → dist/components/advanced/index.d.ts} +0 -0
  168. /package/{src/components/buttons/index.ts → dist/components/buttons/index.d.ts} +0 -0
  169. /package/{src/components/fields/index.ts → dist/components/fields/index.d.ts} +0 -0
  170. /package/{src/components/layout/index.ts → dist/components/layout/index.d.ts} +0 -0
  171. /package/{src/components/pages/index.ts → dist/components/pages/index.d.ts} +0 -0
  172. /package/{src/components/widgets/index.ts → dist/components/widgets/index.d.ts} +0 -0
package/dist/lite.css ADDED
@@ -0,0 +1,817 @@
1
+ /**
2
+ * @svadmin/lite — lightweight server-rendered admin CSS
3
+ *
4
+ * Baseline: modern evergreen browsers with a conservative flexbox layout.
5
+ * Color system: Aligned with @svadmin/ui (Indigo primary / Slate neutrals)
6
+ *
7
+ * RULES:
8
+ * - No CSS variables (var(--x))
9
+ * - No color-mix(), :is(), :where(), :has(), :focus-visible
10
+ * - No CSS Grid (flexbox only)
11
+ * - No flexbox `gap` (use margins)
12
+ * - No backdrop-filter, appearance
13
+ * - No oklch() / hsl() — hardcoded hex only
14
+ * - All colors directly aligned with @svadmin/ui Shadcn Slate/Indigo palette
15
+ */
16
+
17
+ /* ─── Reset & Base ─────────────────────────────────────────── */
18
+ *, *::before, *::after {
19
+ box-sizing: border-box;
20
+ }
21
+
22
+ html, body {
23
+ margin: 0;
24
+ padding: 0;
25
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
26
+ font-size: 14px;
27
+ line-height: 1.5;
28
+ color: #0f172a; /* slate-900 — aligned with --foreground */
29
+ background: #f8fafc; /* slate-50 — aligned with --background */
30
+ -webkit-font-smoothing: antialiased;
31
+ -moz-osx-font-smoothing: grayscale;
32
+ }
33
+
34
+ a {
35
+ color: #4f46e5; /* indigo-600 — aligned with --primary */
36
+ text-decoration: none;
37
+ transition: color 0.15s ease;
38
+ }
39
+ a:hover {
40
+ color: #4338ca; /* indigo-700 */
41
+ text-decoration: underline;
42
+ }
43
+
44
+ /* ─── Layout ───────────────────────────────────────────────── */
45
+ .lite-wrapper {
46
+ display: flex;
47
+ min-height: 100vh;
48
+ }
49
+
50
+ .lite-sidebar {
51
+ width: 230px;
52
+ background: #ffffff;
53
+ color: #0f172a;
54
+ padding: 16px 0;
55
+ flex-shrink: 0;
56
+ border-right: 1px solid #e2e8f0;
57
+ }
58
+
59
+ .lite-mobile-nav {
60
+ display: none;
61
+ background: #fff;
62
+ border-bottom: 1px solid #e2e8f0;
63
+ }
64
+
65
+ .lite-mobile-nav summary {
66
+ cursor: pointer;
67
+ padding: 14px 16px;
68
+ font-weight: 700;
69
+ }
70
+
71
+ .lite-mobile-nav-links {
72
+ padding: 0 16px 12px;
73
+ }
74
+
75
+ .lite-mobile-nav-links > a {
76
+ display: block;
77
+ padding: 9px 0;
78
+ border-top: 1px solid #f1f5f9;
79
+ }
80
+
81
+ .lite-mobile-nav-links > a.active {
82
+ color: #0f172a;
83
+ font-weight: 600;
84
+ }
85
+
86
+ .lite-mobile-user {
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: space-between;
90
+ padding-top: 12px;
91
+ border-top: 1px solid #e2e8f0;
92
+ }
93
+
94
+ .lite-mobile-user form {
95
+ display: inline;
96
+ margin: 0;
97
+ }
98
+
99
+ .lite-sidebar-brand {
100
+ padding: 0 16px 16px;
101
+ font-size: 16px;
102
+ font-weight: 700;
103
+ color: #0f172a;
104
+ letter-spacing: -0.025em;
105
+ border-bottom: 1px solid #f1f5f9;
106
+ margin-bottom: 8px;
107
+ }
108
+
109
+ .lite-sidebar a {
110
+ display: block;
111
+ position: relative;
112
+ padding: 8px 16px;
113
+ color: #64748b;
114
+ font-size: 13px;
115
+ font-weight: 500;
116
+ transition: background 0.15s ease, color 0.15s ease;
117
+ }
118
+ .lite-sidebar a:hover {
119
+ background: #f8fafc;
120
+ color: #0f172a;
121
+ text-decoration: none;
122
+ }
123
+ .lite-sidebar a.active {
124
+ background: #f8fafc;
125
+ color: #0f172a;
126
+ text-decoration: none;
127
+ }
128
+ .lite-sidebar a.active::before {
129
+ content: '';
130
+ position: absolute;
131
+ left: 0;
132
+ top: 50%;
133
+ transform: translateY(-50%);
134
+ width: 3px;
135
+ height: 60%;
136
+ border-radius: 0 3px 3px 0;
137
+ background: #4f46e5;
138
+ }
139
+
140
+ /* ─── Multi-Level Menu (details/summary) ──────────────────── */
141
+ .lite-menu-group {
142
+ margin: 0;
143
+ border: none;
144
+ }
145
+ .lite-menu-group summary {
146
+ list-style: none;
147
+ cursor: pointer;
148
+ padding: 8px 16px;
149
+ color: #64748b;
150
+ font-size: 11px;
151
+ font-weight: 700;
152
+ text-transform: uppercase;
153
+ letter-spacing: 0.06em;
154
+ transition: color 0.15s ease, background 0.15s ease;
155
+ }
156
+ .lite-menu-group summary::-webkit-details-marker {
157
+ display: none;
158
+ }
159
+ .lite-menu-group summary:hover {
160
+ color: #0f172a;
161
+ background: #f8fafc;
162
+ }
163
+ .lite-menu-group[open] > summary {
164
+ color: #0f172a;
165
+ }
166
+ .lite-menu-group[open] > summary::after {
167
+ content: " \25BE";
168
+ }
169
+ .lite-menu-group:not([open]) > summary::after {
170
+ content: " \25B8";
171
+ }
172
+
173
+ .lite-main {
174
+ flex: 1;
175
+ padding: 28px 32px;
176
+ min-width: 0;
177
+ background: #f8fafc;
178
+ }
179
+
180
+ .lite-header {
181
+ display: flex;
182
+ align-items: center;
183
+ justify-content: space-between;
184
+ margin-bottom: 24px;
185
+ }
186
+
187
+ .lite-header h1 {
188
+ font-size: 22px;
189
+ font-weight: 600;
190
+ margin: 0;
191
+ color: #0f172a;
192
+ letter-spacing: -0.025em;
193
+ }
194
+
195
+ /* ─── Cards ────────────────────────────────────────────────── */
196
+ .lite-card {
197
+ background: #fff;
198
+ border: 1px solid #e2e8f0;
199
+ border-radius: 8px;
200
+ padding: 24px;
201
+ margin-bottom: 16px;
202
+ box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 4px 16px -4px rgba(0, 0, 0, 0.02);
203
+ transition: box-shadow 0.2s ease, transform 0.2s ease;
204
+ }
205
+ .lite-card:hover {
206
+ box-shadow: 0 4px 12px -2px rgba(0, 0, 0, 0.08), 0 8px 24px -6px rgba(0, 0, 0, 0.04);
207
+ transform: translateY(-1px);
208
+ }
209
+
210
+ /* ─── Table ────────────────────────────────────────────────── */
211
+ .lite-table {
212
+ width: 100%;
213
+ border-collapse: collapse;
214
+ background: #fff;
215
+ border: 1px solid #e2e8f0;
216
+ border-radius: 8px;
217
+ }
218
+
219
+ .lite-table th {
220
+ text-align: left;
221
+ padding: 10px 14px;
222
+ font-weight: 600;
223
+ font-size: 11px;
224
+ text-transform: uppercase;
225
+ letter-spacing: 0.05em;
226
+ color: #64748b; /* slate-500 — aligned with --muted-foreground */
227
+ background: #f8fafc; /* slate-50 */
228
+ border-bottom: 1px solid #e2e8f0;
229
+ }
230
+
231
+ .lite-table th a {
232
+ color: #64748b;
233
+ transition: color 0.15s ease;
234
+ }
235
+ .lite-table th a:hover {
236
+ color: #0f172a;
237
+ text-decoration: none;
238
+ }
239
+ .lite-table th .sort-indicator {
240
+ font-size: 10px;
241
+ margin-left: 4px;
242
+ }
243
+
244
+ .lite-table td {
245
+ padding: 10px 14px;
246
+ border-bottom: 1px solid #f1f5f9; /* slate-100 — softer row divider */
247
+ color: #334155; /* slate-700 */
248
+ font-size: 13px;
249
+ transition: background 0.12s ease;
250
+ }
251
+
252
+ .lite-table tr:hover td {
253
+ background: #f8f7fd;
254
+ }
255
+
256
+ .lite-table td.actions {
257
+ text-align: right;
258
+ white-space: nowrap;
259
+ }
260
+
261
+ /* ─── Buttons ──────────────────────────────────────────────── */
262
+ .lite-btn {
263
+ display: inline-block;
264
+ padding: 7px 16px;
265
+ font-size: 13px;
266
+ font-weight: 500;
267
+ border: 1px solid #e2e8f0;
268
+ border-radius: 6px;
269
+ background: #fff;
270
+ color: #334155;
271
+ cursor: pointer;
272
+ text-decoration: none;
273
+ vertical-align: middle;
274
+ line-height: 1.5;
275
+ transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, color 0.15s ease, transform 0.1s cubic-bezier(0.16, 1, 0.3, 1);
276
+ }
277
+ .lite-btn:hover {
278
+ background: #f8fafc;
279
+ border-color: #cbd5e1;
280
+ text-decoration: none;
281
+ }
282
+ .lite-btn:focus {
283
+ outline: none;
284
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15); /* indigo ring */
285
+ }
286
+ .lite-btn:active:not(:disabled) {
287
+ transform: scale(0.97);
288
+ }
289
+
290
+ .lite-btn-primary {
291
+ background: #4f46e5; /* indigo-600 */
292
+ border-color: #4f46e5;
293
+ color: #fff;
294
+ }
295
+ .lite-btn-primary:hover {
296
+ background: #4338ca; /* indigo-700 */
297
+ border-color: #4338ca;
298
+ }
299
+ .lite-btn-primary:focus {
300
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.3);
301
+ }
302
+
303
+ .lite-btn-danger {
304
+ background: #fff;
305
+ border-color: #fecaca; /* red-200 */
306
+ color: #dc2626; /* red-600 */
307
+ }
308
+ .lite-btn-danger:hover {
309
+ background: #fef2f2; /* red-50 */
310
+ border-color: #fca5a5;
311
+ }
312
+ .lite-btn-danger:focus {
313
+ box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);
314
+ }
315
+
316
+ .lite-btn-sm {
317
+ padding: 3px 10px;
318
+ font-size: 12px;
319
+ border-radius: 4px;
320
+ }
321
+
322
+ /* ─── Forms — Text Inputs ─────────────────────────────────── */
323
+ .lite-form-group {
324
+ margin-bottom: 18px;
325
+ }
326
+
327
+ .lite-array-field {
328
+ border: 2px dashed #e2e8f0;
329
+ border-radius: 8px;
330
+ padding: 16px;
331
+ margin: 0;
332
+ }
333
+
334
+ .lite-array-field legend {
335
+ padding: 0 8px;
336
+ font-weight: 600;
337
+ font-size: 14px;
338
+ }
339
+
340
+ .lite-array-item {
341
+ border: 1px solid #e2e8f0;
342
+ border-radius: 6px;
343
+ padding: 12px;
344
+ margin-bottom: 8px;
345
+ background: #f8fafc;
346
+ }
347
+
348
+ .lite-array-item-header {
349
+ display: flex;
350
+ justify-content: space-between;
351
+ align-items: center;
352
+ margin-bottom: 8px;
353
+ }
354
+
355
+ .lite-array-item-number {
356
+ font-size: 12px;
357
+ font-weight: 600;
358
+ color: #94a3b8;
359
+ }
360
+
361
+ .lite-array-remove,
362
+ .lite-array-remove-nojs {
363
+ color: #dc2626;
364
+ }
365
+
366
+ .lite-array-remove-nojs input {
367
+ margin-right: 4px;
368
+ }
369
+
370
+ .lite-js .lite-array-remove-nojs {
371
+ display: none;
372
+ }
373
+
374
+ .lite-array-subfield {
375
+ margin-bottom: 8px;
376
+ }
377
+
378
+ .lite-array-subfield > label {
379
+ display: block;
380
+ font-size: 13px;
381
+ font-weight: 500;
382
+ color: #374151;
383
+ margin-bottom: 4px;
384
+ }
385
+
386
+ .lite-array-field [data-lite-array-add] {
387
+ margin-top: 4px;
388
+ }
389
+
390
+ .lite-form-group label {
391
+ display: block;
392
+ font-size: 13px;
393
+ font-weight: 500;
394
+ color: #334155;
395
+ margin-bottom: 6px;
396
+ }
397
+
398
+ .lite-form-group label .required {
399
+ color: #ef4444; /* red-500 */
400
+ margin-left: 2px;
401
+ }
402
+
403
+ .lite-input {
404
+ display: block;
405
+ width: 100%;
406
+ padding: 8px 12px;
407
+ font-size: 14px;
408
+ font-family: inherit;
409
+ border: 1px solid #cbd5e1; /* slate-300 — slightly more visible */
410
+ border-radius: 6px;
411
+ background: #fff;
412
+ color: #0f172a;
413
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
414
+ }
415
+ .lite-input:focus {
416
+ outline: none;
417
+ border-color: #4f46e5;
418
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgba(79, 70, 229, 0.3);
419
+ }
420
+
421
+ .lite-input-error {
422
+ border-color: #ef4444;
423
+ }
424
+ .lite-input-error:focus {
425
+ box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.12);
426
+ }
427
+
428
+ .lite-error-text {
429
+ color: #ef4444;
430
+ font-size: 12px;
431
+ margin-top: 4px;
432
+ }
433
+
434
+ textarea.lite-input {
435
+ min-height: 100px;
436
+ resize: vertical;
437
+ }
438
+
439
+ /* ─── Forms — Custom Select ───────────────────────────────── */
440
+ .lite-select {
441
+ display: block;
442
+ width: 100%;
443
+ padding: 8px 36px 8px 12px;
444
+ font-size: 14px;
445
+ font-family: inherit;
446
+ border: 1px solid #cbd5e1;
447
+ border-radius: 6px;
448
+ background: #fff;
449
+ color: #0f172a;
450
+ cursor: pointer;
451
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
452
+ /* Custom dropdown arrow via base64 SVG chevron */
453
+ background-image: url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L5 5L9 1' stroke='%2364748b' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
454
+ background-repeat: no-repeat;
455
+ background-position: right 12px center;
456
+ background-size: 10px 6px;
457
+ }
458
+ /* IE11: hide the native dropdown arrow */
459
+ .lite-select::-ms-expand {
460
+ display: none;
461
+ }
462
+ .lite-select:focus {
463
+ outline: none;
464
+ border-color: #4f46e5;
465
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgba(79, 70, 229, 0.3);
466
+ }
467
+
468
+ /* ─── Forms — Custom Checkbox ─────────────────────────────── */
469
+ .lite-checkbox-group {
470
+ display: flex;
471
+ align-items: flex-start;
472
+ position: relative;
473
+ }
474
+ .lite-checkbox-group input[type="checkbox"] {
475
+ /* Visually hide the native checkbox, but remain accessible */
476
+ position: absolute;
477
+ opacity: 0;
478
+ width: 0;
479
+ height: 0;
480
+ pointer-events: none;
481
+ }
482
+ .lite-checkbox-group label {
483
+ display: inline-block;
484
+ position: relative;
485
+ padding-left: 28px;
486
+ cursor: pointer;
487
+ font-size: 14px;
488
+ color: #334155;
489
+ line-height: 20px;
490
+ margin-bottom: 0;
491
+ -webkit-user-select: none;
492
+ -moz-user-select: none;
493
+ -ms-user-select: none;
494
+ user-select: none;
495
+ }
496
+ /* Unchecked box */
497
+ .lite-checkbox-group label::before {
498
+ content: '';
499
+ position: absolute;
500
+ left: 0;
501
+ top: 0;
502
+ width: 18px;
503
+ height: 18px;
504
+ border: 2px solid #cbd5e1;
505
+ border-radius: 4px;
506
+ background: #fff;
507
+ transition: background 0.15s ease, border-color 0.15s ease;
508
+ }
509
+ /* Checkmark (hidden by default) */
510
+ .lite-checkbox-group label::after {
511
+ content: '';
512
+ position: absolute;
513
+ left: 6px;
514
+ top: 2px;
515
+ width: 6px;
516
+ height: 10px;
517
+ border: solid #fff;
518
+ border-width: 0 2px 2px 0;
519
+ transform: rotate(45deg);
520
+ opacity: 0;
521
+ transition: opacity 0.1s ease;
522
+ }
523
+ /* Checked state */
524
+ .lite-checkbox-group input[type="checkbox"]:checked + label::before {
525
+ background: #4f46e5;
526
+ border-color: #4f46e5;
527
+ }
528
+ .lite-checkbox-group input[type="checkbox"]:checked + label::after {
529
+ opacity: 1;
530
+ }
531
+ /* Focus ring on keyboard navigation */
532
+ .lite-checkbox-group input[type="checkbox"]:focus + label::before {
533
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);
534
+ }
535
+
536
+ /* ─── Forms — Custom Radio ────────────────────────────────── */
537
+ .lite-radio-group {
538
+ display: flex;
539
+ align-items: flex-start;
540
+ position: relative;
541
+ }
542
+ .lite-radio-group input[type="radio"] {
543
+ position: absolute;
544
+ opacity: 0;
545
+ width: 0;
546
+ height: 0;
547
+ pointer-events: none;
548
+ }
549
+ .lite-radio-group label {
550
+ display: inline-block;
551
+ position: relative;
552
+ padding-left: 28px;
553
+ cursor: pointer;
554
+ font-size: 14px;
555
+ color: #334155;
556
+ line-height: 20px;
557
+ margin-bottom: 0;
558
+ -webkit-user-select: none;
559
+ -moz-user-select: none;
560
+ -ms-user-select: none;
561
+ user-select: none;
562
+ }
563
+ /* Unchecked circle */
564
+ .lite-radio-group label::before {
565
+ content: '';
566
+ position: absolute;
567
+ left: 0;
568
+ top: 0;
569
+ width: 18px;
570
+ height: 18px;
571
+ border: 2px solid #cbd5e1;
572
+ border-radius: 50%;
573
+ background: #fff;
574
+ transition: border-color 0.15s ease;
575
+ }
576
+ /* Inner dot (hidden by default) */
577
+ .lite-radio-group label::after {
578
+ content: '';
579
+ position: absolute;
580
+ left: 5px;
581
+ top: 5px;
582
+ width: 8px;
583
+ height: 8px;
584
+ border-radius: 50%;
585
+ background: #4f46e5;
586
+ opacity: 0;
587
+ transition: opacity 0.1s ease;
588
+ }
589
+ /* Checked state */
590
+ .lite-radio-group input[type="radio"]:checked + label::before {
591
+ border-color: #4f46e5;
592
+ }
593
+ .lite-radio-group input[type="radio"]:checked + label::after {
594
+ opacity: 1;
595
+ }
596
+ /* Focus ring */
597
+ .lite-radio-group input[type="radio"]:focus + label::before {
598
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);
599
+ }
600
+
601
+ /* ─── Pagination ───────────────────────────────────────────── */
602
+ .lite-pagination {
603
+ display: flex;
604
+ align-items: center;
605
+ margin-top: 16px;
606
+ }
607
+
608
+ .lite-pagination a,
609
+ .lite-pagination span {
610
+ display: inline-block;
611
+ padding: 6px 12px;
612
+ margin-right: 4px;
613
+ border: 1px solid #e2e8f0;
614
+ border-radius: 6px;
615
+ font-size: 13px;
616
+ color: #334155;
617
+ transition: background 0.15s ease, border-color 0.15s ease;
618
+ }
619
+ .lite-pagination a:hover {
620
+ background: #f1f5f9;
621
+ border-color: #cbd5e1;
622
+ text-decoration: none;
623
+ }
624
+ .lite-pagination span.active {
625
+ background: #4f46e5;
626
+ border-color: #4f46e5;
627
+ color: #fff;
628
+ }
629
+ .lite-pagination span.disabled {
630
+ color: #94a3b8;
631
+ cursor: default;
632
+ background: #f8fafc;
633
+ }
634
+
635
+ .lite-pagination-info {
636
+ margin-left: auto;
637
+ font-size: 13px;
638
+ color: #64748b;
639
+ }
640
+
641
+ /* ─── Search Bar ───────────────────────────────────────────── */
642
+ .lite-search {
643
+ display: flex;
644
+ margin-bottom: 16px;
645
+ }
646
+ .lite-search input {
647
+ flex: 1;
648
+ margin-right: 8px;
649
+ }
650
+
651
+ /* ─── Alerts / Messages ────────────────────────────────────── */
652
+ .lite-alert {
653
+ padding: 12px 16px;
654
+ border-radius: 6px;
655
+ margin-bottom: 16px;
656
+ font-size: 13px;
657
+ font-weight: 500;
658
+ }
659
+ .lite-alert-success {
660
+ background: #f0fdf4; /* green-50 */
661
+ border: 1px solid #bbf7d0; /* green-200 */
662
+ color: #166534; /* green-800 */
663
+ }
664
+ .lite-alert-error {
665
+ background: #fef2f2; /* red-50 */
666
+ border: 1px solid #fecaca; /* red-200 */
667
+ color: #991b1b; /* red-900 */
668
+ }
669
+
670
+ /* ─── Delete Confirmation ──────────────────────────────────── */
671
+ .lite-confirm {
672
+ display: inline;
673
+ }
674
+ .lite-confirm-details {
675
+ position: relative;
676
+ display: inline-block;
677
+ }
678
+ .lite-confirm-details summary {
679
+ cursor: pointer;
680
+ list-style: none;
681
+ }
682
+ .lite-confirm-details summary::-webkit-details-marker {
683
+ display: none;
684
+ }
685
+ .lite-confirm-panel {
686
+ position: absolute;
687
+ right: 0;
688
+ top: 100%;
689
+ z-index: 10;
690
+ background: #fff;
691
+ border: 1px solid #e2e8f0;
692
+ border-radius: 8px;
693
+ padding: 14px;
694
+ box-shadow:
695
+ 0 4px 6px rgba(15, 23, 42, 0.05),
696
+ 0 10px 20px rgba(15, 23, 42, 0.08);
697
+ white-space: nowrap;
698
+ margin-top: 4px;
699
+ }
700
+
701
+ /* ─── Login Page ───────────────────────────────────────────── */
702
+ .lite-login-wrapper {
703
+ display: flex;
704
+ align-items: center;
705
+ justify-content: center;
706
+ min-height: 100vh;
707
+ background: #f1f5f9;
708
+ }
709
+
710
+ .lite-login-card {
711
+ width: 400px;
712
+ max-width: 90%;
713
+ }
714
+ .lite-login-card .lite-card {
715
+ box-shadow:
716
+ 0 4px 6px rgba(15, 23, 42, 0.04),
717
+ 0 10px 30px rgba(15, 23, 42, 0.06);
718
+ }
719
+
720
+ /* ─── Badge / Tag ──────────────────────────────────────────── */
721
+ .lite-badge {
722
+ display: inline-block;
723
+ padding: 2px 8px;
724
+ font-size: 11px;
725
+ font-weight: 600;
726
+ border-radius: 12px;
727
+ background: #f1f5f9;
728
+ color: #475569;
729
+ border: 1px solid #e2e8f0;
730
+ margin-right: 4px;
731
+ }
732
+
733
+ .lite-badge-success {
734
+ background: #f0fdf4;
735
+ color: #166534;
736
+ border-color: #bbf7d0;
737
+ }
738
+
739
+ .lite-badge-danger {
740
+ background: #fef2f2;
741
+ color: #dc2626;
742
+ border-color: #fecaca;
743
+ }
744
+
745
+ .lite-badge-warning {
746
+ background: #fffbeb;
747
+ color: #92400e;
748
+ border-color: #fde68a;
749
+ }
750
+
751
+ /* ─── Boolean indicator ────────────────────────────────────── */
752
+ .lite-bool {
753
+ display: inline-block;
754
+ width: 10px;
755
+ height: 10px;
756
+ border-radius: 50%;
757
+ background: #cbd5e1;
758
+ }
759
+ .lite-bool-true {
760
+ background: #22c55e;
761
+ }
762
+
763
+ /* ─── Utility classes ──────────────────────────────────────── */
764
+ .lite-text-muted {
765
+ color: #64748b;
766
+ }
767
+ .lite-text-sm {
768
+ font-size: 12px;
769
+ }
770
+ .lite-mt-0 { margin-top: 0; }
771
+ .lite-mb-lg { margin-bottom: 24px; }
772
+
773
+ /* ─── Responsive ───────────────────────────────────────────── */
774
+ @media (max-width: 768px) {
775
+ .lite-wrapper {
776
+ display: block;
777
+ }
778
+ .lite-sidebar {
779
+ display: none;
780
+ }
781
+ .lite-mobile-nav {
782
+ display: block;
783
+ }
784
+ .lite-main {
785
+ padding: 16px;
786
+ }
787
+ .lite-table {
788
+ font-size: 12px;
789
+ }
790
+ .lite-header {
791
+ flex-direction: column;
792
+ align-items: flex-start;
793
+ }
794
+ .lite-header h1 {
795
+ margin-bottom: 12px;
796
+ }
797
+ }
798
+
799
+ /* ─── Print ────────────────────────────────────────────────── */
800
+ @media print {
801
+ .lite-sidebar,
802
+ .lite-search,
803
+ .lite-pagination,
804
+ .lite-btn,
805
+ .lite-confirm {
806
+ display: none !important;
807
+ }
808
+ .lite-main {
809
+ padding: 0;
810
+ }
811
+ .lite-table {
812
+ border: 1px solid #000;
813
+ }
814
+ .lite-table th {
815
+ background: #eee !important;
816
+ }
817
+ }