adminita 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.
@@ -0,0 +1,370 @@
1
+ /* Adminita - Django Admin Theme using Tailwind CSS v4 */
2
+
3
+ @import "tailwindcss";
4
+
5
+ /* Theme customization for Adminita */
6
+ @theme {
7
+ /* Primary colors - Blue theme for admin */
8
+ --color-primary-50: #eff6ff;
9
+ --color-primary-100: #dbeafe;
10
+ --color-primary-200: #bfdbfe;
11
+ --color-primary-300: #93c5fd;
12
+ --color-primary-400: #60a5fa;
13
+ --color-primary-500: #3b82f6;
14
+ --color-primary-600: #2563eb;
15
+ --color-primary-700: #1d4ed8;
16
+ --color-primary-800: #1e40af;
17
+ --color-primary-900: #1e3a8a;
18
+ --color-primary-950: #172554;
19
+
20
+ /* Custom gray shades for better dark mode */
21
+ --color-gray-750: #2d3748;
22
+ }
23
+
24
+ /* Custom component styles */
25
+ @layer components {
26
+
27
+ /* Django admin form field overrides */
28
+ .admin-input {
29
+ @apply w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400 focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-colors;
30
+ }
31
+
32
+ .admin-textarea {
33
+ @apply w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400 focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-colors min-h-24;
34
+ }
35
+
36
+ .admin-select {
37
+ @apply w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-colors;
38
+ }
39
+
40
+ .admin-checkbox {
41
+ @apply rounded border-gray-300 dark:border-gray-600 text-primary-600 focus:ring-primary-500 focus:ring-offset-0;
42
+ }
43
+
44
+ .admin-radio {
45
+ @apply border-gray-300 dark:border-gray-600 text-primary-600 focus:ring-primary-500 focus:ring-offset-0;
46
+ }
47
+
48
+ .admin-link {
49
+ @apply text-primary-600 dark:text-primary-400 hover:text-primary-800 dark:hover:text-primary-300 underline transition-colors;
50
+ }
51
+
52
+ .admin-btn-primary {
53
+ @apply inline-flex items-center px-6 py-2.5 bg-primary-600 hover:bg-primary-700 text-white rounded-lg font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-primary-500;
54
+ }
55
+
56
+ .admin-btn-secondary {
57
+ @apply inline-flex items-center px-4 py-2.5 bg-gray-600 hover:bg-gray-700 text-white rounded-lg font-medium transition-colors;
58
+ }
59
+
60
+ .admin-btn-danger {
61
+ @apply inline-flex items-center px-4 py-2.5 bg-red-600 hover:bg-red-700 text-white rounded-lg font-medium transition-colors;
62
+ }
63
+
64
+ .admin-btn-outline {
65
+ @apply inline-flex items-center px-4 py-2.5 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 rounded-lg font-medium transition-colors;
66
+ }
67
+
68
+ .admin-card {
69
+ @apply bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700;
70
+ }
71
+
72
+ .errorlist {
73
+ @apply text-red-600 dark:text-red-400 text-sm mt-1;
74
+ }
75
+
76
+ .errorlist li {
77
+ @apply mb-1;
78
+ }
79
+
80
+ .help,
81
+ .helptext {
82
+ @apply text-sm text-gray-600 dark:text-gray-400 mt-1 block;
83
+ }
84
+
85
+ /* Django admin specific class mappings */
86
+ .vTextField,
87
+ .vURLField,
88
+ .vIntegerField,
89
+ .vBigIntegerField,
90
+ .vPositiveIntegerField,
91
+ .vSmallIntegerField,
92
+ .vEmailField {
93
+ @apply max-w-lg px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400 focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-colors;
94
+ }
95
+
96
+ .vLargeTextField,
97
+ .vXMLLargeTextField {
98
+ @apply max-w-3xl px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400 focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-colors min-h-24;
99
+ }
100
+
101
+ select:not([multiple]) {
102
+ @apply max-w-md px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-colors;
103
+ }
104
+
105
+ input[type="checkbox"]:not(.action-select) {
106
+ @apply rounded border-gray-300 dark:border-gray-600 text-primary-600 focus:ring-primary-500 focus:ring-offset-0;
107
+ }
108
+
109
+ input[type="radio"] {
110
+ @apply border-gray-300 dark:border-gray-600 text-primary-600 focus:ring-primary-500 focus:ring-offset-0;
111
+ }
112
+
113
+ .action-select {
114
+ @apply rounded border-gray-300 dark:border-gray-600 text-primary-600 focus:ring-primary-500 focus:ring-offset-0;
115
+ }
116
+
117
+ .submit-row {
118
+ @apply flex items-center justify-between bg-gray-50 dark:bg-gray-800 px-6 py-4 rounded-lg border border-gray-200 dark:border-gray-700;
119
+ }
120
+
121
+ .deletelink {
122
+ @apply inline-flex items-center px-4 py-2.5 bg-red-600 hover:bg-red-700 text-white rounded-lg font-medium transition-colors;
123
+ }
124
+
125
+ .addlink {
126
+ @apply inline-flex items-center px-6 py-2.5 bg-primary-600 hover:bg-primary-700 text-white rounded-lg font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-primary-500;
127
+ }
128
+
129
+ .changelink,
130
+ .viewlink {
131
+ @apply text-primary-600 dark:text-primary-400 hover:text-primary-800 dark:hover:text-primary-300 underline transition-colors;
132
+ }
133
+ }
134
+
135
+ /* Result list table styling */
136
+ @layer components {
137
+ #result_list {
138
+ @apply w-full border-collapse;
139
+ }
140
+
141
+ #result_list thead th {
142
+ @apply px-4 py-3 text-left text-xs font-semibold text-gray-700 dark:text-gray-300 uppercase tracking-wider bg-gray-50 dark:bg-gray-750 border-b border-gray-200 dark:border-gray-700;
143
+ }
144
+
145
+ #result_list thead th a {
146
+ @apply text-gray-700 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400 no-underline;
147
+ }
148
+
149
+ #result_list tbody tr {
150
+ @apply border-b border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-750 transition-colors;
151
+ }
152
+
153
+ #result_list tbody td {
154
+ @apply px-4 py-3 text-sm text-gray-900 dark:text-gray-100;
155
+ text-align: left !important;
156
+ }
157
+
158
+ #result_list tbody td a {
159
+ @apply text-primary-600 dark:text-primary-400 hover:text-primary-800 dark:hover:text-primary-300 no-underline;
160
+ }
161
+
162
+ /* Action checkboxes column */
163
+ #result_list .action-checkbox {
164
+ @apply w-10;
165
+ }
166
+
167
+ /* Make thumbnail images smaller */
168
+ #result_list img {
169
+ @apply max-w-[60px] max-h-[60px] rounded;
170
+ }
171
+
172
+ /* Inline form thumbnails (TabularInline, StackedInline) */
173
+ .inline-related img,
174
+ .tabular td img {
175
+ @apply max-h-[80px] w-auto rounded;
176
+ }
177
+
178
+ /* Stacked inline thumbnails */
179
+ .inline-stacked img {
180
+ @apply max-h-[100px] w-auto rounded;
181
+ }
182
+
183
+ /* Readonly field images in change forms */
184
+ .readonly img,
185
+ .field-box img {
186
+ @apply max-h-[120px] w-auto rounded;
187
+ }
188
+
189
+ /* Related widget wrapper (add/edit/delete icons next to ForeignKey fields) */
190
+ .related-widget-wrapper {
191
+ @apply flex items-center gap-2;
192
+ }
193
+
194
+ .related-widget-wrapper select {
195
+ @apply flex-1;
196
+ }
197
+
198
+ .related-widget-wrapper-link {
199
+ @apply inline-flex items-center justify-center w-6 h-6 text-gray-500 hover:text-primary-600 dark:text-gray-400 dark:hover:text-primary-400 transition-colors;
200
+ }
201
+
202
+ .related-widget-wrapper-link img {
203
+ @apply w-4 h-4;
204
+ }
205
+
206
+ /* Django admin date/time picker icons */
207
+ .datetimeshortcuts {
208
+ @apply inline-flex items-center gap-1 ml-2;
209
+ }
210
+
211
+ .datetimeshortcuts a {
212
+ @apply text-primary-600 dark:text-primary-400 hover:text-primary-800 dark:hover:text-primary-300;
213
+ }
214
+
215
+ .datetimeshortcuts img {
216
+ @apply inline-block w-4 h-4;
217
+ }
218
+
219
+ /* File input styling */
220
+ input[type="file"] {
221
+ @apply block w-full text-sm text-gray-500 dark:text-gray-400 file:mr-4 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-medium file:bg-primary-50 file:text-primary-700 dark:file:bg-gray-700 dark:file:text-primary-400 file:cursor-pointer hover:file:bg-primary-100 dark:hover:file:bg-gray-600 file:transition-colors;
222
+ }
223
+
224
+
225
+ /* Hide TinyMCE metadata / helper blocks under ProseEditorField */
226
+ .tox-tinymce+div {
227
+ display: none !important;
228
+ }
229
+
230
+ /* Hide django-prose-editor toolbar labels/metadata */
231
+ .ProseMirror-menubar-wrapper .ProseMirror-menuitem-label,
232
+ .prose-editor-wrapper [class*="format_"],
233
+ .prose-editor [class*="format_"],
234
+ [data-prose-editor] [class*="format_"],
235
+ .field-description [class*="format_"],
236
+ .form-row [class*="format_"] {
237
+ display: none !important;
238
+ }
239
+
240
+ /* Alternative: hide any stray text nodes that look like toolbar labels */
241
+ .form-row>div:not([class]) {
242
+ font-size: 0;
243
+ }
244
+
245
+ .form-row>div:not([class]) * {
246
+ font-size: 0.875rem;
247
+ }
248
+
249
+ /* Django admin calendar widget styling */
250
+ .calendarbox,
251
+ .clockbox {
252
+ @apply bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg z-50;
253
+ }
254
+
255
+ .calendar {
256
+ @apply bg-white dark:bg-gray-800;
257
+ }
258
+
259
+ .calendar caption {
260
+ @apply bg-primary-600 text-white font-semibold py-2 px-3;
261
+ }
262
+
263
+ .calendar th {
264
+ @apply text-xs font-medium text-gray-600 dark:text-gray-400 py-1;
265
+ }
266
+
267
+ .calendar td {
268
+ @apply text-center;
269
+ }
270
+
271
+ .calendar td a {
272
+ @apply block px-2 py-1 text-sm text-gray-700 dark:text-gray-300 hover:bg-primary-100 dark:hover:bg-primary-900 rounded;
273
+ }
274
+
275
+ .calendar td.today a {
276
+ @apply bg-primary-500 text-white font-bold;
277
+ }
278
+
279
+ .calendar-shortcuts {
280
+ @apply bg-gray-50 dark:bg-gray-750 px-3 py-2 border-t border-gray-200 dark:border-gray-700;
281
+ }
282
+
283
+ .calendar-shortcuts a {
284
+ @apply text-sm text-primary-600 dark:text-primary-400 hover:underline mr-3;
285
+ }
286
+
287
+ .calendar-cancel {
288
+ @apply bg-gray-50 dark:bg-gray-750 px-3 py-2 border-t border-gray-200 dark:border-gray-700 text-center;
289
+ }
290
+
291
+ .calendar-cancel a {
292
+ @apply text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900;
293
+ }
294
+
295
+ /* Clock widget */
296
+ .clockbox h2 {
297
+ @apply bg-primary-600 text-white font-semibold py-2 px-3;
298
+ }
299
+
300
+ .clockbox .timelist {
301
+ @apply py-2;
302
+ }
303
+
304
+ .clockbox .timelist li a {
305
+ @apply block px-3 py-1 text-sm text-gray-700 dark:text-gray-300 hover:bg-primary-100 dark:hover:bg-primary-900;
306
+ }
307
+
308
+ /* Date/time shortcut icons */
309
+ .datetimeshortcuts a {
310
+ @apply text-primary-600 dark:text-primary-400;
311
+ }
312
+
313
+ .date-icon,
314
+ .clock-icon {
315
+ @apply inline-block w-4 h-4 cursor-pointer;
316
+ }
317
+
318
+ /* Boolean field icons */
319
+ .field-__str__ img,
320
+ img[src*="icon-yes"],
321
+ img[src*="icon-no"],
322
+ img[src*="icon-unknown"] {
323
+ @apply w-4 h-4 inline-block;
324
+ }
325
+
326
+ /* Many-to-many selector (filter_horizontal/filter_vertical) */
327
+ .selector {
328
+ @apply flex gap-2;
329
+ }
330
+
331
+ .selector select {
332
+ @apply min-h-[150px] border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700;
333
+ }
334
+
335
+ .selector-chooser {
336
+ @apply flex flex-col justify-center gap-1;
337
+ }
338
+
339
+ .selector-chooser a {
340
+ @apply px-2 py-1 bg-gray-100 dark:bg-gray-700 rounded hover:bg-gray-200 dark:hover:bg-gray-600;
341
+ }
342
+
343
+ /* Action bar above results */
344
+ .actions {
345
+ @apply flex items-center gap-3 px-4 py-3 bg-gray-50 dark:bg-gray-750 border-b border-gray-200 dark:border-gray-700;
346
+ }
347
+
348
+ .actions select {
349
+ @apply max-w-xs;
350
+ }
351
+
352
+ .actions button {
353
+ @apply px-4 py-2 bg-primary-600 hover:bg-primary-700 text-white rounded-lg font-medium transition-colors;
354
+ }
355
+
356
+ /* Sortable column indicators */
357
+ th.sorted a {
358
+ @apply font-bold;
359
+ }
360
+
361
+ th.ascending a::after {
362
+ content: " ▲";
363
+ @apply text-xs;
364
+ }
365
+
366
+ th.descending a::after {
367
+ content: " ▼";
368
+ @apply text-xs;
369
+ }
370
+ }
@@ -0,0 +1,173 @@
1
+ {% load i18n static %}
2
+ <!DOCTYPE html>
3
+ <html lang="{{ LANGUAGE_CODE|default:"en-us" }}" class="h-full">
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>{% block title %}{% endblock %}</title>
8
+
9
+ <link rel="stylesheet" href="{% static 'adminita/adminita-tailwind.css' %}">
10
+ <script src="{% static 'adminita/adminita-tailwind.js' %}" defer></script>
11
+ <link rel="stylesheet" href="{% static 'admin/css/widgets.css' %}">
12
+
13
+ </head>
14
+ {% block dark_mode_vars %}
15
+ <script>
16
+ // Dark mode handling
17
+ if (localStorage.getItem('darkMode') === 'true' ||
18
+ (!localStorage.getItem('darkMode') && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
19
+ document.documentElement.classList.add('dark');
20
+ }
21
+ </script>
22
+ {% endblock %}
23
+
24
+ {% block extrastyle %}{% endblock %}
25
+ {% block extra_head %}{% endblock %}
26
+ </head>
27
+
28
+ <body class="min-h-full bg-gray-50 text-gray-900 dark:bg-gray-900 dark:text-gray-100">
29
+ <div class="flex min-h-screen">
30
+
31
+ <!-- Sidebar -->
32
+ {% block sidebar %}
33
+ <aside id="sidebar" class="w-64 bg-white dark:bg-gray-800 shadow-sm border-r border-gray-200 dark:border-gray-700 fixed h-full z-40 transform md:transform-none transition-transform duration-300 ease-in-out -translate-x-full md:translate-x-0">
34
+
35
+ {% block branding %}
36
+ <div class="h-16 px-6 flex items-center justify-between border-b border-gray-200 dark:border-gray-700">
37
+ <a href="{% url 'admin:index' %}" class="text-sm font-normal text-gray-900 dark:text-white hover:text-primary-600 dark:hover:text-primary-400 transition-colors">
38
+ {{ site_header|default:_('Django administration') }}
39
+ </a>
40
+ </div>
41
+ {% endblock %}
42
+
43
+ {% block nav-global %}{% endblock %}
44
+
45
+ <nav class="px-4 py-6 overflow-y-auto h-[calc(100vh-4rem)]">
46
+ {% block sidebar_content %}
47
+ {% if app_list %}
48
+ <div class="space-y-6">
49
+ {% for app in app_list %}
50
+ <div>
51
+ <h3 class="px-3 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2">
52
+ {{ app.name }}
53
+ </h3>
54
+ <div class="space-y-1">
55
+ {% for model in app.models %}
56
+ <a href="{{ model.admin_url }}"
57
+ class="flex items-center px-3 py-2 text-sm font-medium rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors {% if request.path == model.admin_url %}bg-gray-100 dark:bg-gray-700 text-primary-600 dark:text-primary-400{% else %}text-gray-700 dark:text-gray-300{% endif %}">
58
+ <span>{{ model.name }}</span>
59
+ </a>
60
+ {% endfor %}
61
+ </div>
62
+ </div>
63
+ {% endfor %}
64
+ </div>
65
+ {% endif %}
66
+ {% endblock %}
67
+ </nav>
68
+ </aside>
69
+
70
+ <!-- Overlay for mobile -->
71
+ <div id="sidebar-overlay" class="fixed inset-0 bg-black/50 z-30 hidden md:hidden"></div>
72
+ {% endblock %}
73
+
74
+ <!-- Main Content -->
75
+ <div class="flex-1 flex flex-col md:ml-64 transition-all duration-300" id="main-content">
76
+
77
+ <!-- Top Bar -->
78
+ {% block header %}
79
+ <header class="h-16 bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between px-6 sticky top-0 z-20">
80
+
81
+ <div class="flex items-center space-x-4">
82
+ <!-- Mobile menu button - hidden on desktop -->
83
+ <button id="sidebar-toggle" type="button" class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors md:hidden">
84
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
85
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
86
+ </svg>
87
+ </button>
88
+
89
+ {% block page_title %}
90
+ <h1 class="text-xl font-semibold text-gray-900 dark:text-white">
91
+ {% block content_title %}{% endblock %}
92
+ </h1>
93
+ {% endblock %}
94
+ </div>
95
+
96
+ <div class="flex items-center space-x-4">
97
+ <!-- Dark mode toggle -->
98
+ <button id="dark-mode-toggle" type="button" class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors" title="Toggle dark mode">
99
+ <svg class="w-5 h-5 hidden dark:block" fill="currentColor" viewBox="0 0 20 20">
100
+ <path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/>
101
+ </svg>
102
+ <svg class="w-5 h-5 block dark:hidden" fill="currentColor" viewBox="0 0 20 20">
103
+ <path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/>
104
+ </svg>
105
+ </button>
106
+
107
+ {% block usertools %}
108
+ {% if user.is_active and user.is_staff %}
109
+ <div class="flex items-center space-x-3 text-sm">
110
+ <span class="text-gray-700 dark:text-gray-300 hidden sm:inline">
111
+ {% trans 'Welcome,' %} <strong>{{ user.get_username }}</strong>
112
+ </span>
113
+ <a href="{% url 'admin:password_change' %}" class="text-gray-600 dark:text-gray-400 hover:text-primary-600 dark:hover:text-primary-400 transition-colors hidden sm:inline">
114
+ {% trans 'Change password' %}
115
+ </a>
116
+ <span class="text-gray-400 hidden sm:inline">/</span>
117
+ <form method="post" action="{% url 'admin:logout' %}" style="display: inline;">
118
+ {% csrf_token %}
119
+ <button type="submit" class="text-gray-600 dark:text-gray-400 hover:text-primary-600 dark:hover:text-primary-400 transition-colors bg-transparent border-0 cursor-pointer">
120
+ {% trans 'Log out' %}
121
+ </button>
122
+ </form>
123
+ </div>
124
+ {% endif %}
125
+ {% endblock %}
126
+ </div>
127
+ </header>
128
+ {% endblock %}
129
+
130
+ <!-- Main Content Area with Max Width Container -->
131
+ <main class="flex-1 p-6">
132
+ <!-- Container with max-width to prevent super-wide content -->
133
+ <div class="max-w-7xl mx-auto">
134
+ {% block messages %}
135
+ {% if messages %}
136
+ <div class="mb-6 space-y-2">
137
+ {% for message in messages %}
138
+ <div class="rounded-lg p-4 {% if message.tags %}{{ message.tags }}{% endif %}
139
+ {% if 'error' in message.tags %}bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 text-red-800 dark:text-red-200
140
+ {% elif 'warning' in message.tags %}bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 text-yellow-800 dark:text-yellow-200
141
+ {% elif 'success' in message.tags %}bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 text-green-800 dark:text-green-200
142
+ {% else %}bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 text-blue-800 dark:text-blue-200{% endif %}">
143
+ {{ message|capfirst }}
144
+ </div>
145
+ {% endfor %}
146
+ </div>
147
+ {% endif %}
148
+ {% endblock messages %}
149
+
150
+ {% block content %}
151
+ {% endblock %}
152
+
153
+ {% block sidebar_right %}{% endblock %}
154
+ </div>
155
+ </main>
156
+
157
+ {% block footer %}
158
+ <footer class="px-6 py-4 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800">
159
+ <div class="text-sm text-gray-600 dark:text-gray-400 text-center max-w-7xl mx-auto">
160
+ {% block footer_content %}
161
+ Powered by <a href="https://github.com/djangify/adminita" class="text-primary-600 dark:text-primary-400 hover:underline" target="_blank">Adminita</a>
162
+ {% endblock %}
163
+ </div>
164
+ </footer>
165
+ {% endblock %}
166
+ </div>
167
+ </div>
168
+
169
+
170
+
171
+ {% block extrajs %}{% endblock %}
172
+ </body>
173
+ </html>