django-unfold 0.42.0__py3-none-any.whl → 0.44.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. {django_unfold-0.42.0.dist-info → django_unfold-0.44.0.dist-info}/METADATA +1 -1
  2. django_unfold-0.44.0.dist-info/RECORD +227 -0
  3. {django_unfold-0.42.0.dist-info → django_unfold-0.44.0.dist-info}/WHEEL +1 -1
  4. unfold/admin.py +2 -0
  5. unfold/components.py +47 -0
  6. unfold/contrib/filters/admin.py +5 -5
  7. unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +1 -1
  8. unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +1 -1
  9. unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +1 -1
  10. unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +1 -1
  11. unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +3 -3
  12. unfold/contrib/forms/templates/unfold/forms/array.html +3 -3
  13. unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +25 -25
  14. unfold/contrib/forms/widgets.py +5 -5
  15. unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +1 -1
  16. unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +2 -2
  17. unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +2 -2
  18. unfold/contrib/guardian/templates/unfold/guardian/group_form.html +8 -8
  19. unfold/contrib/guardian/templates/unfold/guardian/user_form.html +8 -8
  20. unfold/contrib/import_export/templates/admin/import_export/change_form.html +1 -1
  21. unfold/contrib/import_export/templates/admin/import_export/export.html +4 -4
  22. unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +4 -4
  23. unfold/contrib/import_export/templates/admin/import_export/import_errors.html +2 -2
  24. unfold/contrib/import_export/templates/admin/import_export/import_form.html +2 -2
  25. unfold/contrib/import_export/templates/admin/import_export/import_preview.html +5 -5
  26. unfold/contrib/import_export/templates/admin/import_export/import_validation.html +30 -25
  27. unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html +5 -3
  28. unfold/contrib/simple_history/templates/simple_history/object_history.html +2 -2
  29. unfold/contrib/simple_history/templates/simple_history/object_history_form.html +1 -1
  30. unfold/contrib/simple_history/templates/simple_history/object_history_list.html +9 -9
  31. unfold/contrib/simple_history/templates/simple_history/submit_line.html +4 -4
  32. unfold/forms.py +13 -2
  33. unfold/settings.py +20 -7
  34. unfold/sites.py +23 -8
  35. unfold/static/admin/js/inlines.js +2 -2
  36. unfold/static/unfold/css/styles.css +1 -1
  37. unfold/static/unfold/js/alpine.resize.js +1 -0
  38. unfold/static/unfold/js/app.js +52 -71
  39. unfold/static/unfold/js/htmx.js +1 -1
  40. unfold/styles.css +67 -71
  41. unfold/templates/admin/actions.html +19 -17
  42. unfold/templates/admin/app_list.html +3 -3
  43. unfold/templates/admin/auth/user/add_form.html +1 -1
  44. unfold/templates/admin/auth/user/change_password.html +2 -2
  45. unfold/templates/admin/base.html +1 -1
  46. unfold/templates/admin/change_form.html +8 -0
  47. unfold/templates/admin/change_list.html +24 -30
  48. unfold/templates/admin/change_list_results.html +40 -6
  49. unfold/templates/admin/date_hierarchy.html +1 -1
  50. unfold/templates/admin/delete_confirmation.html +7 -7
  51. unfold/templates/admin/delete_selected_confirmation.html +7 -7
  52. unfold/templates/admin/edit_inline/stacked.html +4 -4
  53. unfold/templates/admin/edit_inline/tabular.html +8 -151
  54. unfold/templates/admin/filter.html +7 -7
  55. unfold/templates/admin/includes/fieldset.html +2 -2
  56. unfold/templates/admin/includes/object_delete_summary.html +1 -1
  57. unfold/templates/admin/login.html +4 -4
  58. unfold/templates/admin/nav_sidebar.html +1 -17
  59. unfold/templates/admin/object_history.html +7 -7
  60. unfold/templates/admin/pagination.html +36 -30
  61. unfold/templates/admin/search_form.html +11 -9
  62. unfold/templates/admin/submit_line.html +11 -11
  63. unfold/templates/auth/widgets/read_only_password_hash.html +1 -1
  64. unfold/templates/registration/logged_out.html +3 -3
  65. unfold/templates/registration/password_change_done.html +1 -1
  66. unfold/templates/registration/password_change_form.html +1 -1
  67. unfold/templates/unfold/components/button.html +1 -1
  68. unfold/templates/unfold/components/card.html +4 -4
  69. unfold/templates/unfold/components/chart/cohort.html +59 -0
  70. unfold/templates/unfold/components/navigation.html +2 -2
  71. unfold/templates/unfold/components/separator.html +1 -1
  72. unfold/templates/unfold/components/table.html +6 -6
  73. unfold/templates/unfold/components/tracker.html +5 -0
  74. unfold/templates/unfold/helpers/account_links.html +6 -6
  75. unfold/templates/unfold/helpers/actions_row.html +5 -5
  76. unfold/templates/unfold/helpers/add_link.html +1 -1
  77. unfold/templates/unfold/helpers/app_list.html +10 -10
  78. unfold/templates/unfold/helpers/app_list_default.html +10 -10
  79. unfold/templates/unfold/helpers/boolean.html +1 -1
  80. unfold/templates/unfold/helpers/breadcrumb_item.html +1 -1
  81. unfold/templates/unfold/helpers/change_list_actions.html +13 -0
  82. unfold/templates/unfold/helpers/change_list_filter.html +31 -0
  83. unfold/templates/unfold/helpers/change_list_filter_actions.html +23 -0
  84. unfold/templates/unfold/helpers/delete_submit_line.html +2 -2
  85. unfold/templates/unfold/helpers/display_header.html +3 -3
  86. unfold/templates/unfold/helpers/edit_inline/tabular_delete.html +13 -0
  87. unfold/templates/unfold/helpers/edit_inline/tabular_error.html +8 -0
  88. unfold/templates/unfold/helpers/edit_inline/tabular_field.html +25 -0
  89. unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +25 -0
  90. unfold/templates/unfold/helpers/edit_inline/tabular_row.html +27 -0
  91. unfold/templates/unfold/helpers/edit_inline/tabular_title.html +49 -0
  92. unfold/templates/unfold/helpers/field_readonly.html +1 -1
  93. unfold/templates/unfold/helpers/field_readonly_value.html +1 -1
  94. unfold/templates/unfold/helpers/fieldset_row.html +5 -73
  95. unfold/templates/unfold/helpers/fieldset_row_checkbox.html +45 -0
  96. unfold/templates/unfold/helpers/fieldset_row_field.html +21 -0
  97. unfold/templates/unfold/helpers/fieldsets_tabs.html +2 -2
  98. unfold/templates/unfold/helpers/header.html +1 -1
  99. unfold/templates/unfold/helpers/history.html +4 -4
  100. unfold/templates/unfold/helpers/label.html +1 -1
  101. unfold/templates/unfold/helpers/language_switch.html +3 -3
  102. unfold/templates/unfold/helpers/messages/debug.html +3 -0
  103. unfold/templates/unfold/helpers/messages/error.html +5 -3
  104. unfold/templates/unfold/helpers/messages/errornote.html +1 -1
  105. unfold/templates/unfold/helpers/messages/info.html +2 -2
  106. unfold/templates/unfold/helpers/messages/success.html +3 -0
  107. unfold/templates/unfold/helpers/messages/warning.html +3 -0
  108. unfold/templates/unfold/helpers/messages.html +13 -14
  109. unfold/templates/unfold/helpers/navigation.html +3 -11
  110. unfold/templates/unfold/helpers/navigation_header.html +13 -0
  111. unfold/templates/unfold/helpers/pagination_ellipsis.html +1 -1
  112. unfold/templates/unfold/helpers/search.html +5 -5
  113. unfold/templates/unfold/helpers/search_results.html +2 -2
  114. unfold/templates/unfold/helpers/site_icon.html +7 -5
  115. unfold/templates/unfold/helpers/site_logo.html +1 -1
  116. unfold/templates/unfold/helpers/submit.html +1 -1
  117. unfold/templates/unfold/helpers/tab_action.html +2 -2
  118. unfold/templates/unfold/helpers/tab_list.html +9 -9
  119. unfold/templates/unfold/helpers/theme_switch.html +5 -5
  120. unfold/templates/unfold/helpers/userlinks.html +4 -0
  121. unfold/templates/unfold/helpers/welcomemsg.html +13 -1
  122. unfold/templates/unfold/layouts/base_simple.html +2 -2
  123. unfold/templates/unfold/layouts/skeleton.html +12 -6
  124. unfold/templates/unfold/widgets/clearable_file_input.html +6 -6
  125. unfold/templates/unfold/widgets/clearable_file_input_small.html +7 -7
  126. unfold/templates/unfold/widgets/foreign_key_raw_id.html +1 -1
  127. unfold/templates/unfold/widgets/radio.html +1 -1
  128. unfold/templates/unfold/widgets/range.html +1 -1
  129. unfold/templates/unfold/widgets/related_widget_wrapper.html +4 -4
  130. unfold/templates/unfold/widgets/textarea_expandable.html +1 -1
  131. unfold/templatetags/unfold.py +130 -7
  132. unfold/templatetags/unfold_list.py +9 -4
  133. unfold/widgets.py +31 -28
  134. django_unfold-0.42.0.dist-info/RECORD +0 -209
  135. unfold/templates/unfold/change_list_filter.html +0 -59
  136. {django_unfold-0.42.0.dist-info → django_unfold-0.44.0.dist-info}/LICENSE.md +0 -0
@@ -54,16 +54,32 @@
54
54
  {% endblock %}
55
55
 
56
56
  {% block content %}
57
- <div id="content-main">
57
+ <div id="content-main" x-data="{ filterOpen: false }">
58
58
  {% if cl.formset and cl.formset.errors %}
59
59
  {% include "unfold/helpers/messages/errornote.html" with errors=cl.formset.errors %}
60
60
 
61
61
  {{ cl.formset.non_form_errors }}
62
62
  {% endif %}
63
63
 
64
- <div class="flex -mx-4 module{% if cl.has_filters %} filtered{% endif %}" id="changelist">
65
- <div class="changelist-form-container flex flex-row flex-grow gap-4 min-w-0 px-4" x-data="{ filterOpen: false }">
66
- <div class="flex-grow min-w-0">
64
+ <div class="flex flex-col gap-4 mb-4 sm:flex-row">
65
+ {% block search %}
66
+ {% search_form cl %}
67
+ {% endblock %}
68
+
69
+ {% block filters %}
70
+ {% if cl.has_filters %}
71
+ <a class="{% if cl.has_active_filters %}bg-primary-600 border-primary-600 text-white{% else %}bg-white border-base-200 dark:bg-base-900 dark:border-base-700{% endif %} border cursor-pointer flex font-medium group items-center px-3 py-2 rounded shadow-sm text-sm lg:ml-auto md:mt-0 {% if not cl.model_admin.list_filter_sheet %}2xl:hidden{% endif %}" x-on:click="filterOpen = true" x-on:keydown.escape.window="filterOpen = false">
72
+ {% trans "Filters" %}
73
+
74
+ <span class="material-symbols-outlined md-18 ml-auto -mr-1 pl-4 {% if cl.has_active_filters %}text-white{% else %}text-base-400 group-hover:text-base-500 dark:group-hover:text-base-400 dark:text-base-500{% endif %}">filter_list</span>
75
+ </a>
76
+ {% endif %}
77
+ {% endblock %}
78
+ </div>
79
+
80
+ <div class="flex -mx-4 module{% if cl.has_filters %} filtered{% endif %}" id="changelist" x-data="{ changeListWidth: 0 }">
81
+ <div class="changelist-form-container flex flex-row flex-grow gap-6 min-w-0 px-4">
82
+ <div class="flex-grow min-w-0 lg:pb-16" x-resize="changeListWidth = $width">
67
83
  {% block date_hierarchy %}
68
84
  {% if cl.date_hierarchy %}
69
85
  {% date_hierarchy cl %}
@@ -74,37 +90,15 @@
74
90
  {% include cl.model_admin.list_before_template %}
75
91
  {% endif %}
76
92
 
77
- <form id="changelist-form" method="post"{% if cl.formset and cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %} novalidate>
93
+ <form id="changelist-form" class="group" method="post"{% if cl.formset and cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %} novalidate>
78
94
  {% csrf_token %}
79
95
 
80
96
  {% if cl.formset %}
81
- <div>{{ cl.formset.management_form }}</div>
97
+ {{ cl.formset.management_form }}
82
98
  {% endif %}
83
99
 
84
100
  {% block result_list %}
85
- {% if actions_on_top %}
86
- {% if cl.search_fields or action_form or cl.has_filters %}
87
- <div class="bg-gray-50 flex flex-col gap-3 mb-4 p-3 rounded-md lg:flex-row dark:bg-gray-800">
88
- {% block search %}
89
- {% search_form cl %}
90
- {% endblock %}
91
-
92
- {% if action_form %}
93
- {% admin_actions %}
94
- {% endif %}
95
-
96
- {% block filters %}
97
- {% if cl.has_filters %}
98
- <a class="{% if cl.has_active_filters %}bg-primary-600 border-primary-600 text-white{% else %}bg-white dark:bg-gray-900 dark:border-gray-700{% endif %} border cursor-pointer flex font-medium group items-center px-3 py-2 rounded-md shadow-sm text-sm lg:ml-auto md:mt-0 {% if not cl.model_admin.list_filter_sheet %}2xl:hidden{% endif %}" x-on:click="filterOpen = true" x-on:keydown.escape.window="filterOpen = false">
99
- {% trans "Filters" %}
100
-
101
- <span class="material-symbols-outlined md-18 ml-auto -mr-1 pl-4 {% if cl.has_active_filters %}text-white{% else %}text-gray-400 group-hover:text-gray-500 dark:group-hover:text-gray-400 dark:text-gray-500{% endif %}">filter_list</span>
102
- </a>
103
- {% endif %}
104
- {% endblock %}
105
- </div>
106
- {% endif %}
107
- {% endif %}
101
+ {% include "unfold/helpers/change_list_actions.html" %}
108
102
 
109
103
  {% unfold_result_list cl %}
110
104
 
@@ -120,7 +114,7 @@
120
114
  </div>
121
115
 
122
116
  {% if cl.has_filters %}
123
- {% include "unfold/change_list_filter.html" %}
117
+ {% include "unfold/helpers/change_list_filter.html" %}
124
118
  {% endif %}
125
119
  </div>
126
120
  </div>
@@ -1,4 +1,4 @@
1
- {% load i18n %}
1
+ {% load admin_urls i18n %}
2
2
 
3
3
  {% if result_hidden_fields %}
4
4
  <div class="hiddenfields">
@@ -7,8 +7,8 @@
7
7
  {% endif %}
8
8
 
9
9
  {% if results %}
10
- <div class="overflow-x-auto lg:border lg:rounded-md lg:shadow-sm lg:dark:border-gray-800 {% if cl.model_admin.list_horizontal_scrollbar_top %}simplebar-horizontal-scrollbar-top{% endif %}" data-simplebar data-simplebar-auto-hide="false">
11
- <table id="result_list" class="block border-gray-200 border-spacing-none border-separate w-full lg:table">
10
+ <div class="-mx-1 px-1 overflow-x-auto lg:border lg:border-base-200 lg:mx-0 lg:px-0 lg:rounded lg:shadow-sm lg:dark:border-base-800 {% if cl.model_admin.list_horizontal_scrollbar_top %}simplebar-horizontal-scrollbar-top{% endif %}" data-simplebar data-simplebar-auto-hide="false">
11
+ <table id="result_list" class="block border-base-200 border-spacing-none border-separate w-full lg:table">
12
12
  <thead>
13
13
  <tr>
14
14
  {% for header in result_headers %}
@@ -39,7 +39,7 @@
39
39
  {% if header.sortable %}
40
40
  {% if header.sort_priority > 0 %}
41
41
  <div class="sortoptions flex items-center ml-2">
42
- <a href="{{ header.url_toggle }}" class="flex items-center leading-none text-gray-400 hover:text-gray-500 dark:text-gray-500 dark:hover:text-gray-400 toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% translate "Toggle sorting" %}">
42
+ <a href="{{ header.url_toggle }}" class="flex items-center leading-none text-base-400 hover:text-base-500 dark:text-base-500 dark:hover:text-base-400 toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% translate "Toggle sorting" %}">
43
43
  {% if header.ascending %}
44
44
  <span class="block material-symbols-outlined">arrow_circle_down</span>
45
45
  {% else %}
@@ -47,7 +47,7 @@
47
47
  {% endif %}
48
48
  </a>
49
49
 
50
- <a class="sortremove flex items-center leading-none ml-1 text-gray-400 dark:text-gray-500 transition-all hover:text-red-700 dark:hover:text-red-500" href="{{ header.url_remove }}" title="{% translate "Remove from sorting" %}">
50
+ <a class="sortremove flex items-center leading-none ml-1 text-base-400 dark:text-base-500 transition-all hover:text-red-700 dark:hover:text-red-500" href="{{ header.url_remove }}" title="{% translate "Remove from sorting" %}">
51
51
  <span class="block material-symbols-outlined">cancel</span>
52
52
  </a>
53
53
  </div>
@@ -75,7 +75,7 @@
75
75
  </tr>
76
76
  {% endif %}
77
77
 
78
- <tr class="{% cycle '' 'bg-gray-50 dark:bg-white/[.02]' %} block border mb-3 rounded-md shadow-sm lg:table-row lg:border-none lg:mb-0 lg:shadow-none dark:border-gray-800">
78
+ <tr class="{% cycle '' 'bg-base-50 dark:bg-white/[.02]' %} block border mb-3 rounded shadow-sm lg:table-row lg:border-none lg:mb-0 lg:shadow-none dark:border-base-800">
79
79
  {% for item in result %}
80
80
  {{ item }}
81
81
  {% endfor %}
@@ -85,4 +85,38 @@
85
85
  </tbody>
86
86
  </table>
87
87
  </div>
88
+ {% else %}
89
+ {% url cl.opts|admin_urlname:"add" as add_url %}
90
+ {% blocktranslate with name=cl.opts.verbose_name asvar title %}Add {{ name }}{% endblocktranslate %}
91
+
92
+ <div class="border border-base-200 flex flex-col items-center px-8 py-24 rounded shadow-sm dark:border-base-800">
93
+ <div class="bg-base-100 flex h-24 items-center justify-center mb-8 rounded-full w-24 dark:bg-base-800">
94
+ <span class="material-symbols-outlined text-base-500 !text-5xl dark:text-base-400">inbox</span>
95
+ </div>
96
+
97
+ <h2 class="font-semibold mb-1 text-xl text-font-important-light dark:text-font-important-dark">
98
+ {% trans "No results found" %}
99
+ </h2>
100
+
101
+ <p class="mb-6 text-center">
102
+ {% trans "This page yielded into no results. Create a new item or reset your filters." %}
103
+ </p>
104
+
105
+ {% if has_add_permission or cl.has_filters %}
106
+ <div class="flex flex-col gap-4 justify-center w-full lg:flex-row">
107
+ {% if has_add_permission %}
108
+ <a href="{% add_preserved_filters add_url is_popup to_field %}" class="bg-primary-600 flex flex-row font-medium gap-2 items-center h-9.5 justify-center px-3 py-2 rounded text-white w-full lg:w-auto">
109
+ <span class="material-symbols-outlined text-white">add</span> {{ title }}
110
+ </a>
111
+ {% endif %}
112
+
113
+
114
+ {% if cl.has_filters %}
115
+ <a href="{{ cl.clear_all_filters_qs }}" class="border border-base-200 flex flex-row font-medium gap-2 group/button h-9.5 items-center justify-center px-3 py-2 rounded transition-all w-full hover:text-primary-600 lg:w-auto dark:border-base-700 dark:hover:bg-base-900 dark:hover:text-primary-500">
116
+ <span class="material-symbols-outlined group-hover/button:text-primary-600 dark:group-hover/button:text-base-500 text-base-400 dark:text-base-500">filter_list_off</span> {% trans "Reset filters" %}
117
+ </a>
118
+ {% endif %}
119
+ </div>
120
+ {% endif %}
121
+ </div>
88
122
  {% endif %}
@@ -6,7 +6,7 @@
6
6
  {% if back %}
7
7
  <li class="date-back px-2">
8
8
  <a href="{{ back.link }}" class="flex group items-center hover:text-primary-600 dark:hover:text-primary-500">
9
- <span class="material-symbols-outlined md-16 mr-2 text-gray-400 group-hover:text-primary-600 dark:group-hover:text-primary-500">arrow_back</span> {{ back.title }}
9
+ <span class="material-symbols-outlined md-16 mr-2 text-base-400 group-hover:text-primary-600 dark:group-hover:text-primary-500">arrow_back</span> {{ back.title }}
10
10
  </a>
11
11
  </li>
12
12
  {% endif %}
@@ -32,12 +32,12 @@
32
32
 
33
33
  {% block content %}
34
34
  {% if perms_lacking %}
35
- <div class="border border-gray-200 rounded-md shadow-sm dark:border-gray-800">
35
+ <div class="border border-base-200 rounded shadow-sm dark:border-base-800">
36
36
  <p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
37
37
  {% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}
38
38
  </p>
39
39
 
40
- <div class="border-gray-200 border-t p-4 dark:border-gray-800">
40
+ <div class="border-base-200 border-t p-4 dark:border-base-800">
41
41
  <ul class="leading-relaxed">
42
42
  {% for obj in perms_lacking %}
43
43
  <li>
@@ -48,12 +48,12 @@
48
48
  </div>
49
49
  </div>
50
50
  {% elif protected %}
51
- <div class="border border-gray-200 rounded-md shadow-sm dark:border-gray-800">
51
+ <div class="border border-base-200 rounded shadow-sm dark:border-base-800">
52
52
  <p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
53
53
  {% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktranslate %}
54
54
  </p>
55
55
 
56
- <div class="border-t border-gray-200 order-t p-4 dark:border-gray-800">
56
+ <div class="border-t border-base-200 order-t p-4 dark:border-base-800">
57
57
  <ul class="leading-relaxed">
58
58
  {% for obj in protected %}
59
59
  <li>
@@ -64,14 +64,14 @@
64
64
  </div>
65
65
  </div>
66
66
  {% else %}
67
- <div class="border border-gray-200 rounded-md shadow-sm dark:border-gray-800">
67
+ <div class="border border-base-200 rounded shadow-sm dark:border-base-800">
68
68
  <p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
69
69
  {% blocktranslate with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktranslate %}
70
70
  </p>
71
71
 
72
72
  {% include "admin/includes/object_delete_summary.html" %}
73
73
 
74
- <div class="border-gray-200 border-t p-4 dark:border-gray-800">
74
+ <div class="border-base-200 border-t p-4 dark:border-base-800">
75
75
  <h2 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">
76
76
  {% translate "Objects" %}
77
77
  </h2>
@@ -81,7 +81,7 @@
81
81
  </ul>
82
82
  </div>
83
83
 
84
- <form method="post" class="border-gray-200 border-t px-4 py-3 dark:border-gray-800">
84
+ <form method="post" class="border-base-200 border-t px-4 py-3 dark:border-base-800">
85
85
  {% csrf_token %}
86
86
 
87
87
  <div class="flex items-center">
@@ -37,20 +37,20 @@
37
37
  {% blocktranslate %}Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}
38
38
  </p>
39
39
 
40
- <div class="border-t border-gray-200 p-4 dark:border-gray-800">
41
- <ul class="leading-relaxed dark:border-gray-800">
40
+ <div class="border-t border-base-200 p-4 dark:border-base-800">
41
+ <ul class="leading-relaxed dark:border-base-800">
42
42
  {% for obj in perms_lacking %}
43
43
  <li>{{ obj }}</li>
44
44
  {% endfor %}
45
45
  </ul>
46
46
  </div>
47
47
  {% elif protected %}
48
- <div class="border border-gray-200 rounded-md shadow-sm dark:border-gray-800">
48
+ <div class="border border-base-200 rounded shadow-sm dark:border-base-800">
49
49
  <p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
50
50
  {% blocktranslate %}Deleting the selected {{ objects_name }} would require deleting the following protected related objects:{% endblocktranslate %}
51
51
  </p>
52
52
 
53
- <div class="border-t border-gray-200 p-4 dark:border-gray-800">
53
+ <div class="border-t border-base-200 p-4 dark:border-base-800">
54
54
  <ul class="leading-relaxed">
55
55
  {% for obj in protected %}
56
56
  <li>{{ obj }}</li>
@@ -59,14 +59,14 @@
59
59
  </div>
60
60
  </div>
61
61
  {% else %}
62
- <div class="border border-gray-200 rounded-md shadow-sm dark:border-gray-800">
62
+ <div class="border border-base-200 rounded shadow-sm dark:border-base-800">
63
63
  <p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
64
64
  {% blocktranslate %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktranslate %}
65
65
  </p>
66
66
 
67
67
  {% include "admin/includes/object_delete_summary.html" %}
68
68
 
69
- <div class="border-t border-gray-200 p-4 dark:border-gray-800">
69
+ <div class="border-t border-base-200 p-4 dark:border-base-800">
70
70
  <h2 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">
71
71
  {% translate "Objects" %}
72
72
  </h2>
@@ -78,7 +78,7 @@
78
78
  {% endfor %}
79
79
  </div>
80
80
 
81
- <form method="post" class="border-t border-gray-200 px-4 py-3 dark:border-gray-800">
81
+ <form method="post" class="border-t border-base-200 px-4 py-3 dark:border-base-800">
82
82
  {% csrf_token %}
83
83
 
84
84
  <div class="flex items-center">
@@ -4,7 +4,7 @@
4
4
  <fieldset class="module relative {{ inline_admin_formset.classes }}" aria-labelledby="{{ inline_admin_formset.formset.prefix }}-heading">
5
5
  {% if inline_admin_formset.is_collapsible %}<details><summary>{% endif %}
6
6
 
7
- <h2 id="{{ inline_admin_formset.formset.prefix }}-heading" class="inline-heading bg-gray-100 border border-transparent font-semibold mb-6 px-4 py-3 rounded-md text-font-important-light text-sm lg:-mx-4 dark:bg-white/[.02] dark:border dark:border-gray-800 dark:text-font-important-dark {% if inline_admin_formset.opts.tab %}hidden{% endif %} {% if inline_admin_formset.is_collapsible %} cursor-pointer{% endif %}">
7
+ <h2 id="{{ inline_admin_formset.formset.prefix }}-heading" class="inline-heading bg-base-100 font-semibold mb-6 px-4 py-3 rounded text-font-important-light lg:-mx-4 dark:bg-white/[.02] dark:text-font-important-dark {% if inline_admin_formset.opts.tab %}hidden{% endif %} {% if inline_admin_formset.is_collapsible %} cursor-pointer{% endif %}">
8
8
  {% if inline_admin_formset.formset.max_num == 1 %}
9
9
  {{ inline_admin_formset.opts.verbose_name|capfirst }}
10
10
  {% else %}
@@ -17,7 +17,7 @@
17
17
  {{ inline_admin_formset.formset.management_form }}
18
18
  {% include "unfold/helpers/messages/error.html" with errors=inline_admin_formset.formset.non_form_errors %}
19
19
 
20
- <div class="border border-gray-200 mb-6 overflow-hidden rounded-md shadow-sm w-full dark:border-gray-800 *:border-t first:*:border-t-0 *:border-gray-200 dark:*:border-gray-800"
20
+ <div class="border border-base-200 mb-6 overflow-hidden rounded shadow-sm w-full dark:border-base-800 *:border-t first:*:border-t-0 *:border-base-200 dark:*:border-base-800"
21
21
  {% if inline_admin_formset.opts.ordering_field %}
22
22
  data-ordering-field="{{ inline_admin_formset.opts.ordering_field }}" x-on:end="sortRecords" x-sort.ghost
23
23
  {% endif %}>
@@ -25,7 +25,7 @@
25
25
  {% for inline_admin_form in inline_admin_formset %}
26
26
  <div x-sort:item class="inline-related group inline-stacked {% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
27
27
  {% if not inline_admin_formset.opts.hide_title or inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
28
- <h3 class="bg-gray-50 border-b border-gray-200 flex font-medium items-center gap-2 mb-3 px-3 py-2 text-sm dark:bg-white/[.02] dark:border-gray-800">
28
+ <h3 class="bg-base-50 border-b border-base-200 flex font-medium items-center gap-2 px-3 py-2 text-sm dark:bg-white/[.02] dark:border-base-800">
29
29
  {% if inline_admin_formset.opts.ordering_field %}
30
30
  {% if inline_admin_form.original %}
31
31
  <span class="material-symbols-outlined cursor-pointer" x-sort:handle>drag_indicator</span>
@@ -83,7 +83,7 @@
83
83
  {% include "unfold/helpers/messages/error.html" with errors=inline_admin_form.form.non_field_errors %}
84
84
 
85
85
  {% for fieldset in inline_admin_form %}
86
- <div class="px-3 -mb-5 {% if inline_admin_formset.opts.hide_title %}{% if not inline_admin_formset.formset.can_delete or not inline_admin_formset.has_delete_permission %}pt-3{% endif %}{% endif %}">
86
+ <div class="{% if inline_admin_formset.opts.hide_title %}{% if not inline_admin_formset.formset.can_delete or not inline_admin_formset.has_delete_permission %}pt-3{% endif %}{% endif %}">
87
87
  {% include 'admin/includes/fieldset.html' with stacked=1 %}
88
88
  </div>
89
89
  {% endfor %}
@@ -7,7 +7,7 @@
7
7
  <fieldset class="module relative {{ inline_admin_formset.classes }} min-w-0" aria-labelledby="{{ inline_admin_formset.formset.prefix }}-heading">
8
8
  {% if inline_admin_formset.is_collapsible %}<details><summary>{% endif %}
9
9
 
10
- <h2 id="{{ inline_admin_formset.formset.prefix }}-heading" class="bg-gray-100 border border-transparent font-semibold mb-6 px-4 py-3 rounded-md text-font-important-light text-sm lg:-mx-4 dark:bg-white/[.02] dark:border dark:border-gray-800 dark:text-font-important-dark {% if inline_admin_formset.opts.tab %}hidden{% endif %} {% if inline_admin_formset.is_collapsible %} cursor-pointer{% endif %}">
10
+ <h2 id="{{ inline_admin_formset.formset.prefix }}-heading" class="bg-base-100 border border-transparent font-semibold mb-6 px-4 py-3 rounded text-font-important-light text-sm lg:-mx-4 dark:bg-white/[.02] dark:text-font-important-dark {% if inline_admin_formset.opts.tab %}hidden{% endif %} {% if inline_admin_formset.is_collapsible %} cursor-pointer{% endif %}">
11
11
  {% if inline_admin_formset.formset.max_num == 1 %}
12
12
  {{ inline_admin_formset.opts.verbose_name|capfirst }}
13
13
  {% else %}
@@ -19,160 +19,17 @@
19
19
 
20
20
  {{ inline_admin_formset.formset.non_form_errors }}
21
21
 
22
- <div class="border border-gray-200 mb-6 overflow-x-auto rounded-md shadow-sm dark:border-gray-800" data-simplebar data-simplebar-auto-hide="false">
23
- <table class="border-spacing-none border-separate w-full"
24
- {% if inline_admin_formset.opts.ordering_field %}
25
- data-ordering-field="{{ inline_admin_formset.opts.ordering_field }}"
26
- x-on:end="sortRecords"
27
- x-sort.ghost
28
- {% endif %}>
29
- <thead class="hidden lg:table-header-group">
30
- <tr>
31
- {% for field in inline_admin_formset.fields %}
32
- {% if not field.widget.is_hidden %}
33
- <th class="column-{{ field.name }}{% if field.required %} required{% endif %} align-middle border-b border-gray-200 font-semibold px-3 py-2 text-left text-font-important-light text-sm whitespace-nowrap dark:text-font-important-dark dark:border-gray-800 {% if inline_admin_formset.opts.ordering_field and field.name == inline_admin_formset.opts.ordering_field and inline_admin_formset.opts.hide_ordering_field %}hidden{% endif %}">
34
- <span class="flex flex-row items-center">
35
- {{ field.label|capfirst }}
36
-
37
- {% if field.help_text %}
38
- <span class="cursor-pointer material-symbols-outlined ml-2 text-gray-400 dark:text-gray-500" title="{{ field.help_text|striptags }}">help</span>
39
- {% endif %}
40
- </span>
41
- </th>
42
- {% endif %}
43
- {% endfor %}
44
-
45
- {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
46
- <th class="align-middle border-b border-gray-200 font-semibold px-3 py-2 text-left text-font-important-light text-sm whitespace-nowrap lg:w-px dark:border-gray-800 dark:text-font-important-dark">
47
- {% translate "Delete?" %}
48
- </th>
49
- {% endif %}
50
- </tr>
51
- </thead>
22
+ <div class="border border-base-200 mb-6 overflow-x-auto rounded shadow-sm dark:border-base-800" data-simplebar data-simplebar-auto-hide="false">
23
+ <table class="tabular-table w-full" {% if inline_admin_formset.opts.ordering_field %}data-ordering-field="{{ inline_admin_formset.opts.ordering_field }}" x-on:end="sortRecords" x-sort.ghost{% endif %}>
24
+ {% include "unfold/helpers/edit_inline/tabular_heading.html" %}
52
25
 
53
26
  {% for inline_admin_form in inline_admin_formset %}
54
- <tbody x-sort:item>
55
- {% if inline_admin_form.form.non_field_errors %}
56
- <tr class="row-form-errors group inline-tabular">
57
- <td colspan="{{ inline_admin_form|cell_count }}">
58
- {% include "unfold/helpers/messages/error.html" with errors=inline_admin_form.form.non_field_errors %}
59
- </td>
60
- </tr>
61
- {% endif %}
62
-
63
- {% if inline_admin_form.original or inline_admin_form.show_url %}
64
- <tr>
65
- <td class="original" colspan="{{ inline_admin_form|cell_count }}">
66
- {% if not inline_admin_formset.opts.hide_title %}
67
- {% if inline_admin_form.original or inline_admin_form.show_url %}
68
- <p class="flex font-medium items-center px-3 pt-2 text-xs">
69
- {% if inline_admin_form.original %}
70
- <span>
71
- {% with inline_title=inline_admin_form.original.get_inline_title %}
72
- {% if inline_title %}
73
- {{ inline_title }}
74
- {% else %}
75
- {{ inline_admin_form.original }}
76
- {% endif %}
77
- {% endwith %}
78
- </span>
79
-
80
- {% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}
81
- <a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="{{ inline_admin_formset.has_change_permission|yesno:'inlinechangelink,inlineviewlink' }} ml-2 text-primary-600 dark:text-primary-500">
82
- {% if inline_admin_formset.has_change_permission %}
83
- {% translate "Change" %}
84
- {% else %}
85
- {% translate "View" %}
86
- {% endif %}
87
- </a>
88
- {% endif %}
89
- {% endif %}
90
-
91
- {% if inline_admin_form.show_url %}
92
- <a href="{{ inline_admin_form.absolute_url }}" class="font-medium ml-2 text-primary-600 dark:text-primary-500">
93
- {% translate "View on site" %}
94
- </a>
95
- {% endif %}
96
- </p>
97
- {% endif %}
98
- {% endif %}
99
-
100
- {% if inline_admin_form.needs_explicit_pk_field %}
101
- {{ inline_admin_form.pk_field.field }}
102
- {% endif %}
103
-
104
- {% if inline_admin_form.fk_field %}
105
- {{ inline_admin_form.fk_field.field }}
106
- {% endif %}
107
- </td>
108
- </tr>
109
- {% endif %}
110
-
111
- <tr class="lg:border-b-0 form-row {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
112
- {% spaceless %}
113
- {% for fieldset in inline_admin_form %}
114
- {% for line in fieldset %}
115
- {% for field in line %}
116
- {% if not field.is_readonly and field.field.is_hidden %}
117
- {{ field.field }}
118
- {% endif %}
119
- {% endfor %}
120
- {% endfor %}
121
- {% endfor %}
122
- {% endspaceless %}
123
-
124
- {% with is_last_row=forloop.last %}
125
- {% for fieldset in inline_admin_form %}
126
- {% for line in fieldset %}
127
- {% with is_last_col=forloop.last %}
128
- {% for field in line %}
129
- {% if field.is_readonly or not field.field.is_hidden %}
130
- <td{% if field.field.name %} class="field-{{ field.field.name }} group field-tabular {% if field.field.errors|length > 0 %} errors{% endif %}{% if inline_admin_form.original %} p-3 lg:py-3{% else %} py-3{% endif %}{% if field.is_checkbox %} align-middle{% else %} align-top{% endif %} {% if is_last_row and not inline_admin_formset.has_add_permission %}{% if is_last_col %}border-0 {% else %}border-b lg:border-0{% endif %}{% else %}border-b{% endif %} border-gray-200 flex items-center before:capitalize before:content-[attr(data-label)] before:mr-auto before:text-gray-500 before:pr-4 lg:before:hidden font-normal px-3 text-left text-sm lg:table-cell dark:border-gray-800 {% if field.field.is_hidden %} !hidden{% endif %} {% if inline_admin_formset.opts.ordering_field and field.field.name == inline_admin_formset.opts.ordering_field and inline_admin_formset.opts.hide_ordering_field %}!hidden{% endif %}"{% endif %} data-label="{{ field.field.label }}">
131
- <div class="flex flex-row gap-3 items-center">
132
- {% if forloop.parentloop.counter == 1 and forloop.counter == 1 %}
133
- {% if inline_admin_formset.opts.ordering_field %}
134
- {% if inline_admin_form.original %}
135
- <span class="material-symbols-outlined cursor-pointer" x-sort:handle>drag_indicator</span>
136
- {% else %}
137
- <span class="-mr-3" x-sort:handle></span>
138
- {% endif %}
139
- {% endif %}
140
- {% endif %}
141
-
142
- {% if field.is_readonly %}
143
- {% include "unfold/helpers/field_readonly_value.html" with tabular=1 %}
144
- {% else %}
145
- {{ field.field }}
27
+ <tbody class="{% if inline_admin_form.original or inline_admin_form.show_url %}has_original {% else %}template{% endif %}" x-sort:item>
28
+ {% include "unfold/helpers/edit_inline/tabular_error.html" %}
146
29
 
147
- {% if field.field.errors|length > 0 %}
148
- <div class="mt-1 text-red-600 text-sm dark:text-red-500">
149
- {% for error in field.field.errors %}
150
- {{ error }}
151
- {% endfor %}
152
- </div>
153
- {% endif %}
154
- {% endif %}
155
- </div>
156
- </td>
157
- {% endif %}
158
- {% endfor %}
159
- {% endwith %}
160
- {% endfor %}
161
- {% endfor %}
30
+ {% include "unfold/helpers/edit_inline/tabular_title.html" %}
162
31
 
163
- {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
164
- <td class="delete {% if inline_admin_form.original %}p-3 lg:py-3{% else %}py-3{% endif %} text-left text-red-600 border-b border-gray-200 flex items-center before:capitalize before:content-[attr(data-label)] before:mr-auto before:text-gray-500 before:pr-4 lg:before:hidden font-normal px-3 text-sm lg:align-top lg:table-cell lg:w-px dark:border-gray-800" data-label="{% trans "Remove" %}">
165
- {% if inline_admin_form.original %}
166
- <div class="flex flex-row lg:mt-3">
167
- <div class="ml-auto">
168
- {{ inline_admin_form.deletion_field.field|add_css_class:form_classes.checkbox }}
169
- </div>
170
- </div>
171
- {% endif %}
172
- </td>
173
- {% endif %}
174
- {% endwith %}
175
- </tr>
32
+ {% include "unfold/helpers/edit_inline/tabular_row.html" %}
176
33
  </tbody>
177
34
  {% endfor %}
178
35
  </table>
@@ -1,6 +1,6 @@
1
1
  {% load i18n unfold %}
2
2
 
3
- <div class="mb-6">
3
+ <div>
4
4
  <h3 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">
5
5
  {% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %}
6
6
  </h3>
@@ -12,20 +12,20 @@
12
12
  {% endfor %}
13
13
 
14
14
  {% if spec|class_name == "BooleanFieldListFilter" %}
15
- <ul class="border-l-4 border-gray-200 flex pl-4 py-2 dark:border-gray-700">
15
+ <ul class="flex border min-w-20 rounded shadow-sm text-font-default-light dark:border-base-700 dark:text-font-default-dark w-full">
16
16
  {% for choice in choices %}
17
- <li class="{% if choice.selected %}font-medium text-primary-600 dark:text-primary-500 dark{% else %}hover:text-gray-700 dark:hover:text-gray-200{% endif %} pr-4">
18
- <a href="{{ choice.query_string|iriencode }}" title="{{ choice.display }}">
17
+ <li class="basis-1/3 border-r border-base-200 flex-grow truncate last:border-r-0 dark:border-base-700 {% if choice.selected %}font-semibold text-primary-600 dark:text-primary-500 {% else %}hover:text-base-700 dark:hover:text-base-200{% endif %}">
18
+ <a href="{{ choice.query_string|iriencode }}" title="{{ choice.display }}" class="block px-3 py-2 text-center hover:text-primary-600 dark:hover:text-primary-500">
19
19
  {{ choice.display }}
20
20
  </a>
21
21
  </li>
22
22
  {% endfor %}
23
23
  </ul>
24
24
  {% else %}
25
- <ul class="border-l-4 border-gray-200 flex flex-col pl-4 py-4 dark:border-gray-700">
25
+ <ul class="border flex flex-col rounded shadow-sm dark:border-base-700">
26
26
  {% for choice in choices %}
27
- <li class="mb-4 last:mb-0 {% if choice.selected %}font-medium text-primary-600 dark:text-primary-500 {% else %}hover:text-gray-700 dark:hover:text-gray-200{% endif %}">
28
- <a href="{{ choice.query_string|iriencode }}" title="{{ choice.display }}">
27
+ <li class="border-b border-base-200 last:border-b-0 dark:border-base-700 {% if choice.selected %}font-semibold text-primary-600 dark:text-primary-500 {% else %}hover:text-base-700 dark:hover:text-base-200{% endif %}">
28
+ <a href="{{ choice.query_string|iriencode }}" title="{{ choice.display }}" class="block px-3 py-2 hover:text-primary-600 dark:hover:text-primary-500">
29
29
  {{ choice.display }}
30
30
  </a>
31
31
  </li>
@@ -2,7 +2,7 @@
2
2
 
3
3
  <fieldset class="module{% if fieldset.classes %} {{ fieldset.classes }}{% endif %}" {% if stacked != 1 %}x-show="activeTab == 'general'"{% endif %}>
4
4
  {% if fieldset.name and "tab" not in fieldset.classes %}
5
- <h2 class="bg-gray-100 border border-transparent font-semibold mb-6 px-4 py-3 rounded-md text-font-important-light text-sm lg:-mx-4 dark:bg-white/[.02] dark:border dark:border-gray-800 dark:text-font-important-dark">
5
+ <h2 class="bg-base-100 font-semibold mb-6 px-4 py-3 rounded text-font-important-light text-sm lg:-mx-4 dark:bg-white/[.02] dark:text-font-important-dark">
6
6
  {{ fieldset.name }}
7
7
  </h2>
8
8
  {% endif %}
@@ -13,7 +13,7 @@
13
13
  </div>
14
14
  {% endif %}
15
15
 
16
- <div class="aligned {% if stacked %}mb-5{% else %}border border-gray-200 mb-8 rounded-md pt-3 px-3 shadow-sm dark:border-gray-800{% endif %}">
16
+ <div class="{% fieldset_rows_classes %}">
17
17
  {% for line in fieldset %}
18
18
  {% include "unfold/helpers/fieldset_row.html" %}
19
19
  {% endfor %}
@@ -1,6 +1,6 @@
1
1
  {% load i18n %}
2
2
 
3
- <div class="border-gray-200 border-t p-4 dark:border-gray-800">
3
+ <div class="border-base-200 border-t p-4 dark:border-base-800">
4
4
  <h2 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">
5
5
  {% translate "Summary" %}
6
6
  </h2>
@@ -7,7 +7,7 @@
7
7
  {{ form.media }}
8
8
  {% endblock %}
9
9
 
10
- {% block bodyclass %}{{ block.super }}bg-gray-50 login dark:bg-gray-900{% endblock %}
10
+ {% block bodyclass %}{{ block.super }}bg-base-50 login dark:bg-base-900{% endblock %}
11
11
 
12
12
  {% block usertools %}{% endblock %}
13
13
 
@@ -24,7 +24,7 @@
24
24
  {% endblock %}
25
25
 
26
26
  {% block base %}
27
- <div class="flex min-h-screen">
27
+ <div id="page" class="flex min-h-screen">
28
28
  <div class="flex flex-grow items-center justify-center mx-auto px-4 relative">
29
29
  <div class="w-full sm:w-96">
30
30
  <h1 class="font-semibold mb-10">
@@ -59,7 +59,7 @@
59
59
  {% url 'admin_password_reset' as password_reset_url %}
60
60
 
61
61
  <div class="submit-row">
62
- <button type="submit" class="bg-primary-600 border border-transparent flex flex-row font-semibold group items-center justify-center py-2 rounded-md text-sm text-white w-full">
62
+ <button type="submit" class="bg-primary-600 border border-transparent flex flex-row font-semibold group items-center justify-center py-2 rounded text-sm text-white w-full">
63
63
  {% translate 'Log in' %}
64
64
 
65
65
  <i class="material-symbols-outlined ml-2 relative right-0 text-lg transition-all group-hover:-right-1">arrow_forward</i>
@@ -68,7 +68,7 @@
68
68
 
69
69
  {% if password_reset_url %}
70
70
  <div class="password-reset-link">
71
- <a href="{{ password_reset_url }}" class="border font-medium hidden mt-4 px-3 py-2 rounded-md text-center text-sm text-gray-500 transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:text-font-default-dark dark:hover:text-gray-200 dark:hover:bg-gray-900">
71
+ <a href="{{ password_reset_url }}" class="border border-base-200 font-medium hidden mt-4 px-3 py-2 rounded text-center text-sm text-base-500 transition-all w-full hover:bg-base-50 lg:block lg:w-auto dark:border-base-700 dark:text-font-default-dark dark:hover:text-base-200 dark:hover:bg-base-900">
72
72
  {% translate 'Forgotten your password or username?' %}
73
73
  </a>
74
74
  </div>