fastapi-admin-kit 0.1.0__py3-none-any.whl

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 (163) hide show
  1. fastapi_admin_kit/__init__.py +73 -0
  2. fastapi_admin_kit/actions/__init__.py +63 -0
  3. fastapi_admin_kit/actions/base.py +68 -0
  4. fastapi_admin_kit/actions/registry.py +43 -0
  5. fastapi_admin_kit/admin/__init__.py +17 -0
  6. fastapi_admin_kit/admin/admin_config.py +95 -0
  7. fastapi_admin_kit/admin/admin_database.py +138 -0
  8. fastapi_admin_kit/admin/admin_router.py +74 -0
  9. fastapi_admin_kit/admin/admin_template.py +203 -0
  10. fastapi_admin_kit/admin/builtin_models.py +284 -0
  11. fastapi_admin_kit/admin/core.py +1036 -0
  12. fastapi_admin_kit/admin/decorators.py +70 -0
  13. fastapi_admin_kit/admin/state.py +76 -0
  14. fastapi_admin_kit/admin.py +728 -0
  15. fastapi_admin_kit/api/__init__.py +44 -0
  16. fastapi_admin_kit/api/auth.py +342 -0
  17. fastapi_admin_kit/api/crud.py +128 -0
  18. fastapi_admin_kit/api/deps.py +79 -0
  19. fastapi_admin_kit/api/roles.py +128 -0
  20. fastapi_admin_kit/api/schema_generator.py +171 -0
  21. fastapi_admin_kit/api/schemas.py +81 -0
  22. fastapi_admin_kit/api/search.py +132 -0
  23. fastapi_admin_kit/audit/__init__.py +36 -0
  24. fastapi_admin_kit/audit/context.py +62 -0
  25. fastapi_admin_kit/audit/diff.py +77 -0
  26. fastapi_admin_kit/audit/event_bus.py +96 -0
  27. fastapi_admin_kit/audit/events.py +48 -0
  28. fastapi_admin_kit/audit/listener.py +159 -0
  29. fastapi_admin_kit/audit/logger.py +28 -0
  30. fastapi_admin_kit/audit/middleware.py +39 -0
  31. fastapi_admin_kit/audit/models.py +53 -0
  32. fastapi_admin_kit/audit/sqlalchemy_logger.py +58 -0
  33. fastapi_admin_kit/auth/__init__.py +34 -0
  34. fastapi_admin_kit/auth/backend.py +95 -0
  35. fastapi_admin_kit/auth/csrf.py +240 -0
  36. fastapi_admin_kit/auth/dependencies.py +150 -0
  37. fastapi_admin_kit/auth/identity.py +181 -0
  38. fastapi_admin_kit/auth/models.py +246 -0
  39. fastapi_admin_kit/auth/password.py +35 -0
  40. fastapi_admin_kit/auth/permissions.py +205 -0
  41. fastapi_admin_kit/auth/protocol.py +22 -0
  42. fastapi_admin_kit/auth/ratelimit.py +88 -0
  43. fastapi_admin_kit/auth/router.py +10 -0
  44. fastapi_admin_kit/auth/session.py +79 -0
  45. fastapi_admin_kit/auth/totp.py +83 -0
  46. fastapi_admin_kit/auth/views.py +165 -0
  47. fastapi_admin_kit/cli.py +229 -0
  48. fastapi_admin_kit/config/__init__.py +19 -0
  49. fastapi_admin_kit/config/audit.py +18 -0
  50. fastapi_admin_kit/config/auth.py +54 -0
  51. fastapi_admin_kit/config/behavior.py +27 -0
  52. fastapi_admin_kit/config/nav.py +32 -0
  53. fastapi_admin_kit/config/storage.py +22 -0
  54. fastapi_admin_kit/config/theme.py +215 -0
  55. fastapi_admin_kit/config/ui.py +147 -0
  56. fastapi_admin_kit/dashboard/__init__.py +64 -0
  57. fastapi_admin_kit/db.py +133 -0
  58. fastapi_admin_kit/exceptions.py +5 -0
  59. fastapi_admin_kit/field_types.py +81 -0
  60. fastapi_admin_kit/filters/__init__.py +21 -0
  61. fastapi_admin_kit/filters/base.py +170 -0
  62. fastapi_admin_kit/filters/registry.py +68 -0
  63. fastapi_admin_kit/flash.py +45 -0
  64. fastapi_admin_kit/form/__init__.py +1 -0
  65. fastapi_admin_kit/form/pipeline.py +106 -0
  66. fastapi_admin_kit/inspection/__init__.py +117 -0
  67. fastapi_admin_kit/inspection/registry.py +253 -0
  68. fastapi_admin_kit/inspection.py +115 -0
  69. fastapi_admin_kit/modeladmin.py +375 -0
  70. fastapi_admin_kit/models/__init__.py +7 -0
  71. fastapi_admin_kit/models/base.py +7 -0
  72. fastapi_admin_kit/nav.py +208 -0
  73. fastapi_admin_kit/pagination/__init__.py +14 -0
  74. fastapi_admin_kit/pagination/base.py +40 -0
  75. fastapi_admin_kit/pagination/cursor.py +97 -0
  76. fastapi_admin_kit/pagination/dynamic.py +48 -0
  77. fastapi_admin_kit/pagination/offset.py +42 -0
  78. fastapi_admin_kit/plugins/__init__.py +1 -0
  79. fastapi_admin_kit/py.typed +0 -0
  80. fastapi_admin_kit/registry/__init__.py +5 -0
  81. fastapi_admin_kit/registry/core.py +287 -0
  82. fastapi_admin_kit/registry/validation.py +107 -0
  83. fastapi_admin_kit/registry.py +15 -0
  84. fastapi_admin_kit/router.py +335 -0
  85. fastapi_admin_kit/static/css/admin.css +4736 -0
  86. fastapi_admin_kit/static/css/presets.css +317 -0
  87. fastapi_admin_kit/static/css/tokens.css +217 -0
  88. fastapi_admin_kit/static/css/variables.css +74 -0
  89. fastapi_admin_kit/static/icons/heroicons.svg +160 -0
  90. fastapi_admin_kit/static/js/admin.js +692 -0
  91. fastapi_admin_kit/static/js/htmx-config.js +42 -0
  92. fastapi_admin_kit/storage/__init__.py +6 -0
  93. fastapi_admin_kit/storage/base.py +48 -0
  94. fastapi_admin_kit/storage/local.py +73 -0
  95. fastapi_admin_kit/templates/base.html +142 -0
  96. fastapi_admin_kit/templates/macros/form_fields.html +660 -0
  97. fastapi_admin_kit/templates/macros/icons.html +50 -0
  98. fastapi_admin_kit/templates/macros/table.html +108 -0
  99. fastapi_admin_kit/templates/macros/widgets.html +159 -0
  100. fastapi_admin_kit/templates/pages/2fa/setup.html +122 -0
  101. fastapi_admin_kit/templates/pages/2fa/verify.html +55 -0
  102. fastapi_admin_kit/templates/pages/audit_detail.html +122 -0
  103. fastapi_admin_kit/templates/pages/audit_log.html +102 -0
  104. fastapi_admin_kit/templates/pages/dashboard.html +295 -0
  105. fastapi_admin_kit/templates/pages/detail.html +183 -0
  106. fastapi_admin_kit/templates/pages/form.html +119 -0
  107. fastapi_admin_kit/templates/pages/list.html +277 -0
  108. fastapi_admin_kit/templates/pages/login.html +85 -0
  109. fastapi_admin_kit/templates/pages/profile/password.html +78 -0
  110. fastapi_admin_kit/templates/pages/profile/profile.html +73 -0
  111. fastapi_admin_kit/templates/pages/role_form.html +75 -0
  112. fastapi_admin_kit/templates/pages/roles/form.html +117 -0
  113. fastapi_admin_kit/templates/pages/roles/list.html +69 -0
  114. fastapi_admin_kit/templates/pages/roles.html +77 -0
  115. fastapi_admin_kit/templates/pages/settings/theme.html +255 -0
  116. fastapi_admin_kit/templates/pages/users/form.html +229 -0
  117. fastapi_admin_kit/templates/pages/users/list.html +83 -0
  118. fastapi_admin_kit/templates/partials/command_palette.html +52 -0
  119. fastapi_admin_kit/templates/partials/field_wrapper.html +2 -0
  120. fastapi_admin_kit/templates/partials/flash_messages.html +39 -0
  121. fastapi_admin_kit/templates/partials/head.html +21 -0
  122. fastapi_admin_kit/templates/partials/head_minimal.html +18 -0
  123. fastapi_admin_kit/templates/partials/list_table.html +178 -0
  124. fastapi_admin_kit/templates/partials/mobile_backdrop.html +2 -0
  125. fastapi_admin_kit/templates/partials/pagination.html +82 -0
  126. fastapi_admin_kit/templates/partials/permission_widget.html +86 -0
  127. fastapi_admin_kit/templates/partials/scripts.html +13 -0
  128. fastapi_admin_kit/templates/partials/sidebar.html +94 -0
  129. fastapi_admin_kit/templates/partials/topbar.html +95 -0
  130. fastapi_admin_kit/types.py +145 -0
  131. fastapi_admin_kit/validation.py +43 -0
  132. fastapi_admin_kit/views/__init__.py +78 -0
  133. fastapi_admin_kit/views/audit.py +134 -0
  134. fastapi_admin_kit/views/bulk.py +28 -0
  135. fastapi_admin_kit/views/class_views.py +1040 -0
  136. fastapi_admin_kit/views/context.py +588 -0
  137. fastapi_admin_kit/views/dashboard.py +162 -0
  138. fastapi_admin_kit/views/delete.py +31 -0
  139. fastapi_admin_kit/views/extra.py +65 -0
  140. fastapi_admin_kit/views/factory.py +667 -0
  141. fastapi_admin_kit/views/form.py +159 -0
  142. fastapi_admin_kit/views/list.py +28 -0
  143. fastapi_admin_kit/views/profile.py +219 -0
  144. fastapi_admin_kit/views/protocols.py +54 -0
  145. fastapi_admin_kit/views/renderers.py +634 -0
  146. fastapi_admin_kit/views/roles.py +230 -0
  147. fastapi_admin_kit/views/search.py +31 -0
  148. fastapi_admin_kit/views/settings.py +31 -0
  149. fastapi_admin_kit/views/sidebar.py +101 -0
  150. fastapi_admin_kit/views/totp.py +249 -0
  151. fastapi_admin_kit/views/users.py +347 -0
  152. fastapi_admin_kit/views.py +117 -0
  153. fastapi_admin_kit/widgets/__init__.py +44 -0
  154. fastapi_admin_kit/widgets/base.py +44 -0
  155. fastapi_admin_kit/widgets/inputs.py +363 -0
  156. fastapi_admin_kit/widgets/registry.py +110 -0
  157. fastapi_admin_kit/widgets/relation.py +70 -0
  158. fastapi_admin_kit/widgets/resolver.py +102 -0
  159. fastapi_admin_kit-0.1.0.dist-info/METADATA +210 -0
  160. fastapi_admin_kit-0.1.0.dist-info/RECORD +163 -0
  161. fastapi_admin_kit-0.1.0.dist-info/WHEEL +4 -0
  162. fastapi_admin_kit-0.1.0.dist-info/entry_points.txt +3 -0
  163. fastapi_admin_kit-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,317 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ Theme Presets — named visual identities
3
+ Applied via data-preset attribute on <html>
4
+ ═══════════════════════════════════════════════════════════════════════════ */
5
+
6
+ /* Default: Warm Editorial Brutalism (current design) */
7
+ [data-preset="editorial"] {
8
+ --surface-base: #FAF8F5;
9
+ --surface-raised: #FFFFFF;
10
+ --surface-overlay: #FFFFFF;
11
+ --surface-border: #E8E4DE;
12
+ --surface-inset: #F3F0EB;
13
+ --text-primary: #1C1917;
14
+ --text-secondary: #78716C;
15
+ --text-disabled: #A8A29E;
16
+ --text-inverse: #FAF8F5;
17
+ --primary-50: #ECFDF5;
18
+ --primary-100: #D1FAE5;
19
+ --primary-200: #A7F3D0;
20
+ --primary-300: #6EE7B7;
21
+ --primary-400: #34D399;
22
+ --primary-500: #059669;
23
+ --primary-600: #047857;
24
+ --primary-700: #065F46;
25
+ --primary-800: #064E3B;
26
+ --primary-900: #022C22;
27
+ --font-display: 'Poppins', Georgia, 'Times New Roman', serif;
28
+ --font-body: 'Poppins', system-ui, -apple-system, sans-serif;
29
+ --font-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
30
+ --radius-sm: 3px;
31
+ --radius-md: 5px;
32
+ --radius-lg: 8px;
33
+ --shadow-xs: 0 1px 2px rgba(28, 25, 23, 0.04);
34
+ --shadow-sm: 0 1px 3px rgba(28, 25, 23, 0.06), 0 1px 2px rgba(28, 25, 23, 0.04);
35
+ --shadow-md: 0 4px 12px rgba(28, 25, 23, 0.08), 0 2px 4px rgba(28, 25, 23, 0.04);
36
+ --shadow-lg: 0 12px 32px rgba(28, 25, 23, 0.12), 0 4px 8px rgba(28, 25, 23, 0.06);
37
+ --admin-grain-opacity: 0.025;
38
+ --admin-accent-line-opacity: 0.4;
39
+ }
40
+
41
+ /* Clean Modern — crisp whites, indigo accent, rounded corners */
42
+ [data-preset="modern"] {
43
+ --surface-base: #F8FAFC;
44
+ --surface-raised: #FFFFFF;
45
+ --surface-overlay: #FFFFFF;
46
+ --surface-border: #E2E8F0;
47
+ --surface-inset: #F1F5F9;
48
+ --text-primary: #0F172A;
49
+ --text-secondary: #64748B;
50
+ --text-disabled: #94A3B8;
51
+ --text-inverse: #FFFFFF;
52
+ --primary-50: #EEF2FF;
53
+ --primary-100: #E0E7FF;
54
+ --primary-200: #C7D2FE;
55
+ --primary-300: #A5B4FC;
56
+ --primary-400: #818CF8;
57
+ --primary-500: #6366F1;
58
+ --primary-600: #4F46E5;
59
+ --primary-700: #4338CA;
60
+ --primary-800: #3730A3;
61
+ --primary-900: #312E81;
62
+ --font-display: 'Poppins', system-ui, sans-serif;
63
+ --font-body: 'Poppins', system-ui, sans-serif;
64
+ --font-mono: 'JetBrains Mono', ui-monospace, monospace;
65
+ --radius-sm: 6px;
66
+ --radius-md: 8px;
67
+ --radius-lg: 12px;
68
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);
69
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
70
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
71
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
72
+ --admin-grain-opacity: 0;
73
+ --admin-accent-line-opacity: 0;
74
+ }
75
+
76
+ /* Midnight — deep dark with violet accent */
77
+ [data-preset="midnight"] {
78
+ --surface-base: #0B0F19;
79
+ --surface-raised: #151B2B;
80
+ --surface-overlay: #1E2538;
81
+ --surface-border: #2A3248;
82
+ --surface-inset: #111726;
83
+ --text-primary: #E2E8F0;
84
+ --text-secondary: #94A3B8;
85
+ --text-disabled: #475569;
86
+ --text-inverse: #0B0F19;
87
+ --primary-50: #1E1B4B;
88
+ --primary-100: #2E1065;
89
+ --primary-200: #3B0764;
90
+ --primary-300: #581C87;
91
+ --primary-400: #7C3AED;
92
+ --primary-500: #818CF8;
93
+ --primary-600: #A78BFA;
94
+ --primary-700: #C4B5FD;
95
+ --primary-800: #DDD6FE;
96
+ --primary-900: #EDE9FE;
97
+ --font-display: 'Poppins', system-ui, sans-serif;
98
+ --font-body: 'Poppins', system-ui, sans-serif;
99
+ --font-mono: 'JetBrains Mono', ui-monospace, monospace;
100
+ --radius-sm: 4px;
101
+ --radius-md: 6px;
102
+ --radius-lg: 10px;
103
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.3);
104
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.3);
105
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.5), 0 2px 4px rgba(0, 0, 0, 0.3);
106
+ --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.6), 0 4px 8px rgba(0, 0, 0, 0.3);
107
+ --admin-grain-opacity: 0;
108
+ --admin-accent-line-opacity: 0.2;
109
+ }
110
+
111
+ /* Paper — warm off-white, emerald accent (matches current default) */
112
+ [data-preset="paper"] {
113
+ --surface-base: #FAF8F5;
114
+ --surface-raised: #FFFFFF;
115
+ --surface-overlay: #FFFFFF;
116
+ --surface-border: #E8E4DE;
117
+ --surface-inset: #F3F0EB;
118
+ --text-primary: #1C1917;
119
+ --text-secondary: #78716C;
120
+ --text-disabled: #A8A29E;
121
+ --text-inverse: #FAF8F5;
122
+ --primary-50: #ECFDF5;
123
+ --primary-100: #D1FAE5;
124
+ --primary-200: #A7F3D0;
125
+ --primary-300: #6EE7B7;
126
+ --primary-400: #34D399;
127
+ --primary-500: #059669;
128
+ --primary-600: #047857;
129
+ --primary-700: #065F46;
130
+ --primary-800: #064E3B;
131
+ --primary-900: #022C22;
132
+ --font-display: 'Poppins', Georgia, serif;
133
+ --font-body: 'Poppins', system-ui, sans-serif;
134
+ --font-mono: 'JetBrains Mono', monospace;
135
+ --radius-sm: 3px;
136
+ --radius-md: 5px;
137
+ --radius-lg: 8px;
138
+ --admin-grain-opacity: 0.025;
139
+ --admin-accent-line-opacity: 0.4;
140
+ }
141
+
142
+ /* Forest — deep green, organic feel */
143
+ [data-preset="forest"] {
144
+ --surface-base: #F0FDF4;
145
+ --surface-raised: #FFFFFF;
146
+ --surface-overlay: #FFFFFF;
147
+ --surface-border: #BBF7D0;
148
+ --surface-inset: #DCFCE7;
149
+ --text-primary: #14532D;
150
+ --text-secondary: #166534;
151
+ --text-disabled: #86EFAC;
152
+ --text-inverse: #F0FDF4;
153
+ --primary-50: #F0FDF4;
154
+ --primary-100: #DCFCE7;
155
+ --primary-200: #BBF7D0;
156
+ --primary-300: #86EFAC;
157
+ --primary-400: #4ADE80;
158
+ --primary-500: #22C55E;
159
+ --primary-600: #16A34A;
160
+ --primary-700: #15803D;
161
+ --primary-800: #166534;
162
+ --primary-900: #14532D;
163
+ --font-display: 'Poppins', Georgia, serif;
164
+ --font-body: 'Poppins', system-ui, sans-serif;
165
+ --font-mono: 'JetBrains Mono', monospace;
166
+ --radius-sm: 4px;
167
+ --radius-md: 6px;
168
+ --radius-lg: 10px;
169
+ --admin-grain-opacity: 0.03;
170
+ --admin-accent-line-opacity: 0.3;
171
+ }
172
+
173
+ /* Minimal — extreme simplicity, neutral tones */
174
+ [data-preset="minimal"] {
175
+ --surface-base: #FFFFFF;
176
+ --surface-raised: #FFFFFF;
177
+ --surface-overlay: #FFFFFF;
178
+ --surface-border: #E5E5E5;
179
+ --surface-inset: #F5F5F5;
180
+ --text-primary: #171717;
181
+ --text-secondary: #737373;
182
+ --text-disabled: #A3A3A3;
183
+ --text-inverse: #FFFFFF;
184
+ --primary-50: #F5F5F5;
185
+ --primary-100: #E5E5E5;
186
+ --primary-200: #D4D4D4;
187
+ --primary-300: #A3A3A3;
188
+ --primary-400: #737373;
189
+ --primary-500: #404040;
190
+ --primary-600: #262626;
191
+ --primary-700: #171717;
192
+ --primary-800: #0A0A0A;
193
+ --primary-900: #000000;
194
+ --font-display: 'Poppins', system-ui, sans-serif;
195
+ --font-body: 'Poppins', system-ui, sans-serif;
196
+ --font-mono: 'JetBrains Mono', ui-monospace, monospace;
197
+ --radius-sm: 0px;
198
+ --radius-md: 0px;
199
+ --radius-lg: 0px;
200
+ --shadow-xs: none;
201
+ --shadow-sm: none;
202
+ --shadow-md: 0 1px 2px rgba(0,0,0,0.05);
203
+ --shadow-lg: 0 4px 8px rgba(0,0,0,0.08);
204
+ --admin-grain-opacity: 0;
205
+ --admin-accent-line-opacity: 0;
206
+ }
207
+
208
+ /* Dark mode overrides per preset */
209
+ [data-preset="editorial"][data-theme="dark"] {
210
+ --surface-base: #141210;
211
+ --surface-raised: #1C1A17;
212
+ --surface-overlay: #242220;
213
+ --surface-border: #33302D;
214
+ --surface-inset: #1A1816;
215
+ --text-primary: #F5F0EB;
216
+ --text-secondary: #9C9590;
217
+ --text-disabled: #5C5752;
218
+ --text-inverse: #141210;
219
+ --primary-50: #022C22;
220
+ --primary-100: #064E3B;
221
+ --primary-200: #065F46;
222
+ --primary-300: #047857;
223
+ --primary-400: #059669;
224
+ --primary-500: #10B981;
225
+ --primary-600: #34D399;
226
+ --primary-700: #6EE7B7;
227
+ --primary-800: #A7F3D0;
228
+ --primary-900: #D1FAE5;
229
+ }
230
+
231
+ [data-preset="modern"][data-theme="dark"] {
232
+ --surface-base: #0F172A;
233
+ --surface-raised: #1E293B;
234
+ --surface-overlay: #334155;
235
+ --surface-border: #334155;
236
+ --surface-inset: #1E293B;
237
+ --text-primary: #F1F5F9;
238
+ --text-secondary: #94A3B8;
239
+ --text-disabled: #475569;
240
+ --text-inverse: #0F172A;
241
+ --primary-50: #1E1B4B;
242
+ --primary-100: #312E81;
243
+ --primary-200: #3730A3;
244
+ --primary-300: #4F46E5;
245
+ --primary-400: #6366F1;
246
+ --primary-500: #818CF8;
247
+ --primary-600: #A5B4FC;
248
+ --primary-700: #C7D2FE;
249
+ --primary-800: #E0E7FF;
250
+ --primary-900: #EEF2FF;
251
+ }
252
+
253
+ [data-preset="paper"][data-theme="dark"] {
254
+ --surface-base: #141210;
255
+ --surface-raised: #1C1A17;
256
+ --surface-overlay: #242220;
257
+ --surface-border: #33302D;
258
+ --surface-inset: #1A1816;
259
+ --text-primary: #F5F0EB;
260
+ --text-secondary: #9C9590;
261
+ --text-disabled: #5C5752;
262
+ --text-inverse: #141210;
263
+ --primary-50: #022C22;
264
+ --primary-100: #064E3B;
265
+ --primary-200: #065F46;
266
+ --primary-300: #047857;
267
+ --primary-400: #059669;
268
+ --primary-500: #10B981;
269
+ --primary-600: #34D399;
270
+ --primary-700: #6EE7B7;
271
+ --primary-800: #A7F3D0;
272
+ --primary-900: #D1FAE5;
273
+ }
274
+
275
+ [data-preset="forest"][data-theme="dark"] {
276
+ --surface-base: #052E16;
277
+ --surface-raised: #14532D;
278
+ --surface-overlay: #166534;
279
+ --surface-border: #166534;
280
+ --surface-inset: #0D3320;
281
+ --text-primary: #F0FDF4;
282
+ --text-secondary: #86EFAC;
283
+ --text-disabled: #22C55E;
284
+ --text-inverse: #052E16;
285
+ --primary-50: #052E16;
286
+ --primary-100: #14532D;
287
+ --primary-200: #166534;
288
+ --primary-300: #15803D;
289
+ --primary-400: #16A34A;
290
+ --primary-500: #22C55E;
291
+ --primary-600: #4ADE80;
292
+ --primary-700: #86EFAC;
293
+ --primary-800: #BBF7D0;
294
+ --primary-900: #DCFCE7;
295
+ }
296
+
297
+ [data-preset="minimal"][data-theme="dark"] {
298
+ --surface-base: #0A0A0A;
299
+ --surface-raised: #171717;
300
+ --surface-overlay: #262626;
301
+ --surface-border: #262626;
302
+ --surface-inset: #171717;
303
+ --text-primary: #F5F5F5;
304
+ --text-secondary: #A3A3A3;
305
+ --text-disabled: #525252;
306
+ --text-inverse: #0A0A0A;
307
+ --primary-50: #171717;
308
+ --primary-100: #262626;
309
+ --primary-200: #404040;
310
+ --primary-300: #525252;
311
+ --primary-400: #737373;
312
+ --primary-500: #A3A3A3;
313
+ --primary-600: #D4D4D4;
314
+ --primary-700: #E5E5E5;
315
+ --primary-800: #F5F5F5;
316
+ --primary-900: #FAFAFA;
317
+ }
@@ -0,0 +1,217 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ FastAPI Admin Kit — Design Tokens
3
+ Clean Modern UI — matching reference design
4
+ ═══════════════════════════════════════════════════════════════════════════ */
5
+
6
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
7
+
8
+ [x-cloak] { display: none !important; }
9
+
10
+ :root {
11
+ /* ── Surfaces — clean neutral palette ──────────────────────────────────── */
12
+ --surface-base: #F8FAFC;
13
+ --surface-raised: #FFFFFF;
14
+ --surface-overlay: #FFFFFF;
15
+ --surface-border: #E2E8F0;
16
+ --surface-inset: #F1F5F9;
17
+
18
+ /* ── Text — slate hierarchy ────────────────────────────────────────────── */
19
+ --text-primary: #0F172A;
20
+ --text-secondary: #64748B;
21
+ --text-disabled: #94A3B8;
22
+ --text-inverse: #FFFFFF;
23
+
24
+ /* ── Primary — emerald (the signature accent from reference) ───────────── */
25
+ --primary-50: #ECFDF5;
26
+ --primary-100: #D1FAE5;
27
+ --primary-200: #A7F3D0;
28
+ --primary-300: #6EE7B7;
29
+ --primary-400: #34D399;
30
+ --primary-500: #10B981;
31
+ --primary-600: #059669;
32
+ --primary-700: #047857;
33
+ --primary-800: #065F46;
34
+ --primary-900: #064E3B;
35
+
36
+ /* ── Semantic colours ──────────────────────────────────────────────────── */
37
+ --success-50: #F0FDF4;
38
+ --success-500: #22C55E;
39
+ --success-700: #15803D;
40
+
41
+ --warning-50: #FFFBEB;
42
+ --warning-500: #F59E0B;
43
+ --warning-700: #B45309;
44
+
45
+ --danger-50: #FEF2F2;
46
+ --danger-500: #EF4444;
47
+ --danger-700: #B91C1C;
48
+
49
+ --info-50: #F0F9FF;
50
+ --info-500: #3B82F6;
51
+ --info-700: #1D4ED8;
52
+
53
+ /* ── Mono accent — emerald for data values ─────────────────────────────── */
54
+ --mono-accent: #059669;
55
+ --mono-accent-muted: #047857;
56
+
57
+ /* ── Typography ────────────────────────────────────────────────────────── */
58
+ --font-display: 'Poppins', system-ui, -apple-system, sans-serif;
59
+ --font-body: 'Poppins', system-ui, -apple-system, sans-serif;
60
+ --font-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
61
+
62
+ /* Type scale */
63
+ --text-2xs: 0.6875rem;
64
+ --text-xs: 0.75rem;
65
+ --text-sm: 0.8125rem;
66
+ --text-base: 0.9375rem;
67
+ --text-md: 1.0625rem;
68
+ --text-lg: 1.25rem;
69
+ --text-xl: 1.5rem;
70
+ --text-2xl: 1.875rem;
71
+ --text-3xl: 2.25rem;
72
+
73
+ --font-normal: 400;
74
+ --font-medium: 500;
75
+ --font-semibold: 600;
76
+
77
+ /* ── Spacing — 4px base ────────────────────────────────────────────────── */
78
+ --space-1: 0.25rem;
79
+ --space-2: 0.5rem;
80
+ --space-3: 0.75rem;
81
+ --space-4: 1rem;
82
+ --space-5: 1.25rem;
83
+ --space-6: 1.5rem;
84
+ --space-8: 2rem;
85
+ --space-10: 2.5rem;
86
+ --space-12: 3rem;
87
+ --space-16: 4rem;
88
+
89
+ /* ── Layout ────────────────────────────────────────────────────────────── */
90
+ --topbar-height: 64px;
91
+ --sidebar-width: 260px;
92
+ --sidebar-collapsed: 64px;
93
+ --content-padding: 32px;
94
+ --content-max-width: 1400px;
95
+ --form-max-width: 860px;
96
+
97
+ /* ── Border & Radius ───────────────────────────────────────────────────── */
98
+ --radius-sm: 6px;
99
+ --radius-md: 8px;
100
+ --radius-lg: 12px;
101
+ --radius-xl: 16px;
102
+ --radius-full: 9999px;
103
+
104
+ --border-width: 1px;
105
+ --border-color: var(--surface-border);
106
+
107
+ /* ── Shadows — clean and subtle ────────────────────────────────────────── */
108
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);
109
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.04);
110
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.04);
111
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04);
112
+ --shadow-focus: 0 0 0 3px rgba(16, 185, 129, 0.2);
113
+ --shadow-focus-error:0 0 0 3px rgba(239, 68, 68, 0.2);
114
+
115
+ /* ── Motion ────────────────────────────────────────────────────────────── */
116
+ --duration-instant: 50ms;
117
+ --duration-fast: 150ms;
118
+ --duration-base: 200ms;
119
+ --duration-slow: 300ms;
120
+ --duration-slower: 400ms;
121
+
122
+ --easing-out: cubic-bezier(0.16, 1, 0.3, 1);
123
+ --easing-in: cubic-bezier(0.4, 0, 1, 1);
124
+ --easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
125
+
126
+ /* ── Admin-overrideable layer ── */
127
+ --admin-font-display: var(--font-display);
128
+ --admin-font-body: var(--font-body);
129
+ --admin-font-mono: var(--font-mono);
130
+ --admin-font-size-base: var(--text-base);
131
+ --admin-font-size-sm: var(--text-sm);
132
+ --admin-font-size-xs: var(--text-xs);
133
+ --admin-topbar-height: var(--topbar-height);
134
+ --admin-sidebar-width: var(--sidebar-width);
135
+ --admin-sidebar-collapsed: var(--sidebar-collapsed);
136
+ --admin-content-max-width: var(--content-max-width);
137
+ --admin-content-padding: var(--content-padding);
138
+ --admin-radius-sm: var(--radius-sm);
139
+ --admin-radius-md: var(--radius-md);
140
+ --admin-radius-lg: var(--radius-lg);
141
+ --admin-shadow-xs: var(--shadow-xs);
142
+ --admin-shadow-sm: var(--shadow-sm);
143
+ --admin-shadow-md: var(--shadow-md);
144
+ --admin-shadow-lg: var(--shadow-lg);
145
+ --admin-shadow-focus: var(--shadow-focus);
146
+ --admin-shadow-focus-error: var(--shadow-focus-error);
147
+ --admin-duration-fast: var(--duration-fast);
148
+ --admin-duration-base: var(--duration-base);
149
+ --admin-duration-slow: var(--duration-slow);
150
+ --admin-easing: var(--easing-out);
151
+ --admin-easing-spring: var(--easing-spring);
152
+ --admin-grain-opacity: 0;
153
+ --admin-accent-line-opacity: 0;
154
+ }
155
+
156
+ /* ═══════════════════════════════════════════════════════════════════════════
157
+ Dark mode — matching reference dark theme
158
+ ═══════════════════════════════════════════════════════════════════════════ */
159
+
160
+ [data-theme="dark"] {
161
+ --surface-base: #0F172A;
162
+ --surface-raised: #1E293B;
163
+ --surface-overlay: #1E293B;
164
+ --surface-border: #334155;
165
+ --surface-inset: #1E293B;
166
+
167
+ --text-primary: #F1F5F9;
168
+ --text-secondary: #94A3B8;
169
+ --text-disabled: #64748B;
170
+ --text-inverse: #0F172A;
171
+
172
+ --primary-50: #022C22;
173
+ --primary-100: #064E3B;
174
+ --primary-200: #065F46;
175
+ --primary-300: #047857;
176
+ --primary-400: #059669;
177
+ --primary-500: #10B981;
178
+ --primary-600: #34D399;
179
+ --primary-700: #6EE7B7;
180
+ --primary-800: #A7F3D0;
181
+ --primary-900: #D1FAE5;
182
+
183
+ --success-50: #052E16;
184
+ --success-500: #4ADE80;
185
+ --success-700: #86EFAC;
186
+
187
+ --warning-50: #451A03;
188
+ --warning-500: #FBBF24;
189
+ --warning-700: #FCD34D;
190
+
191
+ --danger-50: #450A0A;
192
+ --danger-500: #F87171;
193
+ --danger-700: #FCA5A5;
194
+
195
+ --info-50: #172554;
196
+ --info-500: #60A5FA;
197
+ --info-700: #93C5FD;
198
+
199
+ --mono-accent: #34D399;
200
+ --mono-accent-muted: #6EE7B7;
201
+
202
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.3);
203
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.3);
204
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
205
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -4px rgba(0, 0, 0, 0.4);
206
+ --shadow-focus: 0 0 0 3px rgba(16, 185, 129, 0.3);
207
+ --shadow-focus-error:0 0 0 3px rgba(248, 113, 113, 0.3);
208
+ }
209
+
210
+ /* ── Admin dark-mode overrides ── */
211
+ [data-theme="dark"] {
212
+ --admin-surface-base: var(--surface-base);
213
+ --admin-surface-raised: var(--surface-raised);
214
+ --admin-surface-border: var(--surface-border);
215
+ --admin-text-primary: var(--text-primary);
216
+ --admin-text-secondary: var(--text-secondary);
217
+ }
@@ -0,0 +1,74 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ FastAPI Admin Kit — CSS Custom Properties
3
+ ═══════════════════════════════════════════════════════════════════════════ */
4
+
5
+ :root {
6
+ /* ── Primary colour scale ─────────────────────────────────────────────── */
7
+ --color-primary-50: #eff6ff;
8
+ --color-primary-100: #dbeafe;
9
+ --color-primary-200: #bfdbfe;
10
+ --color-primary-300: #93c5fd;
11
+ --color-primary-400: #60a5fa;
12
+ --color-primary-500: #6366f1;
13
+ --color-primary-600: #4f46e5;
14
+ --color-primary-700: #4338ca;
15
+ --color-primary-800: #3730a3;
16
+ --color-primary-900: #312e81;
17
+
18
+ /* ── Neutral greys ────────────────────────────────────────────────────── */
19
+ --color-gray-50: #f9fafb;
20
+ --color-gray-100: #f3f4f6;
21
+ --color-gray-200: #e5e7eb;
22
+ --color-gray-300: #d1d5db;
23
+ --color-gray-400: #9ca3af;
24
+ --color-gray-500: #6b7280;
25
+ --color-gray-600: #4b5563;
26
+ --color-gray-700: #374151;
27
+ --color-gray-800: #1f2937;
28
+ --color-gray-900: #111827;
29
+
30
+ /* ── Semantic colours ─────────────────────────────────────────────────── */
31
+ --color-success: #059669;
32
+ --color-warning: #d97706;
33
+ --color-danger: #dc2626;
34
+ --color-info: #2563eb;
35
+
36
+ /* ── Layout dimensions ────────────────────────────────────────────────── */
37
+ --sidebar-width: 256px;
38
+ --sidebar-collapsed: 0;
39
+ --topbar-height: 64px;
40
+ --content-max-width: 1280px;
41
+ }
42
+
43
+ /* ═══════════════════════════════════════════════════════════════════════════
44
+ Dark mode
45
+ ═══════════════════════════════════════════════════════════════════════════ */
46
+
47
+ [data-theme="dark"] {
48
+ --color-primary-50: #1e1b4b;
49
+ --color-primary-100: #312e81;
50
+ --color-primary-200: #3730a3;
51
+ --color-primary-300: #4338ca;
52
+ --color-primary-400: #4f46e5;
53
+ --color-primary-500: #6366f1;
54
+ --color-primary-600: #818cf8;
55
+ --color-primary-700: #a5b4fc;
56
+ --color-primary-800: #c7d2fe;
57
+ --color-primary-900: #eef2ff;
58
+
59
+ --color-gray-50: #111827;
60
+ --color-gray-100: #1f2937;
61
+ --color-gray-200: #374151;
62
+ --color-gray-300: #4b5563;
63
+ --color-gray-400: #6b7280;
64
+ --color-gray-500: #9ca3af;
65
+ --color-gray-600: #d1d5db;
66
+ --color-gray-700: #e5e7eb;
67
+ --color-gray-800: #f3f4f6;
68
+ --color-gray-900: #f9fafb;
69
+
70
+ --color-success: #34d399;
71
+ --color-warning: #fbbf24;
72
+ --color-danger: #f87171;
73
+ --color-info: #60a5fa;
74
+ }