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