rails_admin_next 1.0.0

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 (184) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +46 -0
  3. data/LICENSE.md +21 -0
  4. data/README.md +317 -0
  5. data/Rakefile +25 -0
  6. data/app/assets/javascripts/rails_admin/custom/ui.js +1 -0
  7. data/app/assets/stylesheets/rails_admin/framework.css +2375 -0
  8. data/app/assets/stylesheets/rails_admin/skin.css +472 -0
  9. data/app/assets/stylesheets/rails_admin/tokens.css +281 -0
  10. data/app/assets/stylesheets/rails_admin.css +47 -0
  11. data/app/controllers/rails_admin_next/application_controller.rb +98 -0
  12. data/app/controllers/rails_admin_next/main_controller.rb +185 -0
  13. data/app/helpers/rails_admin_next/application_helper.rb +254 -0
  14. data/app/helpers/rails_admin_next/form_builder.rb +173 -0
  15. data/app/helpers/rails_admin_next/main_helper.rb +63 -0
  16. data/app/views/layouts/rails_admin_next/_head.html.erb +29 -0
  17. data/app/views/layouts/rails_admin_next/_navigation.html.erb +18 -0
  18. data/app/views/layouts/rails_admin_next/_secondary_navigation.html.erb +27 -0
  19. data/app/views/layouts/rails_admin_next/_sidebar_navigation.html.erb +6 -0
  20. data/app/views/layouts/rails_admin_next/application.html.erb +42 -0
  21. data/app/views/layouts/rails_admin_next/content.html.erb +22 -0
  22. data/app/views/layouts/rails_admin_next/modal.js.erb +7 -0
  23. data/app/views/rails_admin_next/main/_dashboard_history.html.erb +46 -0
  24. data/app/views/rails_admin_next/main/_delete_notice.html.erb +36 -0
  25. data/app/views/rails_admin_next/main/_form_action_text.html.erb +2 -0
  26. data/app/views/rails_admin_next/main/_form_boolean.html.erb +15 -0
  27. data/app/views/rails_admin_next/main/_form_colorpicker.html.erb +6 -0
  28. data/app/views/rails_admin_next/main/_form_datetime.html.erb +14 -0
  29. data/app/views/rails_admin_next/main/_form_enumeration.html.erb +26 -0
  30. data/app/views/rails_admin_next/main/_form_field.html.erb +2 -0
  31. data/app/views/rails_admin_next/main/_form_file_upload.html.erb +18 -0
  32. data/app/views/rails_admin_next/main/_form_filtering_multiselect.html.erb +20 -0
  33. data/app/views/rails_admin_next/main/_form_filtering_select.html.erb +22 -0
  34. data/app/views/rails_admin_next/main/_form_multiple_file_upload.html.erb +21 -0
  35. data/app/views/rails_admin_next/main/_form_nested_many.html.erb +20 -0
  36. data/app/views/rails_admin_next/main/_form_nested_one.html.erb +19 -0
  37. data/app/views/rails_admin_next/main/_form_polymorphic_association.html.erb +24 -0
  38. data/app/views/rails_admin_next/main/_form_text.html.erb +2 -0
  39. data/app/views/rails_admin_next/main/_pagination.html.erb +54 -0
  40. data/app/views/rails_admin_next/main/_submit_buttons.html.erb +26 -0
  41. data/app/views/rails_admin_next/main/bulk_delete.html.erb +19 -0
  42. data/app/views/rails_admin_next/main/dashboard.html.erb +64 -0
  43. data/app/views/rails_admin_next/main/delete.html.erb +21 -0
  44. data/app/views/rails_admin_next/main/edit.html.erb +3 -0
  45. data/app/views/rails_admin_next/main/export.html.erb +149 -0
  46. data/app/views/rails_admin_next/main/history.html.erb +80 -0
  47. data/app/views/rails_admin_next/main/index.html.erb +186 -0
  48. data/app/views/rails_admin_next/main/new.html.erb +3 -0
  49. data/app/views/rails_admin_next/main/show.html.erb +30 -0
  50. data/config/brakeman.ignore +145 -0
  51. data/config/importmap.rails_admin.rb +29 -0
  52. data/config/initializers/active_record_extensions.rb +21 -0
  53. data/config/locales/rails_admin_next.en.yml +158 -0
  54. data/config/routes.rb +14 -0
  55. data/lib/generators/rails_admin_next/install_generator.rb +39 -0
  56. data/lib/generators/rails_admin_next/templates/initializer.erb +40 -0
  57. data/lib/generators/rails_admin_next/utils.rb +21 -0
  58. data/lib/rails_admin_next/abstract_model.rb +266 -0
  59. data/lib/rails_admin_next/adapters/active_record/association.rb +130 -0
  60. data/lib/rails_admin_next/adapters/active_record/object_extension.rb +13 -0
  61. data/lib/rails_admin_next/adapters/active_record/property.rb +58 -0
  62. data/lib/rails_admin_next/adapters/active_record.rb +371 -0
  63. data/lib/rails_admin_next/config/actions/base.rb +160 -0
  64. data/lib/rails_admin_next/config/actions/bulk_delete.rb +67 -0
  65. data/lib/rails_admin_next/config/actions/dashboard.rb +62 -0
  66. data/lib/rails_admin_next/config/actions/delete.rb +58 -0
  67. data/lib/rails_admin_next/config/actions/edit.rb +56 -0
  68. data/lib/rails_admin_next/config/actions/export.rb +47 -0
  69. data/lib/rails_admin_next/config/actions/history_index.rb +40 -0
  70. data/lib/rails_admin_next/config/actions/history_show.rb +40 -0
  71. data/lib/rails_admin_next/config/actions/index.rb +108 -0
  72. data/lib/rails_admin_next/config/actions/new.rb +69 -0
  73. data/lib/rails_admin_next/config/actions/show.rb +36 -0
  74. data/lib/rails_admin_next/config/actions/show_in_app.rb +37 -0
  75. data/lib/rails_admin_next/config/actions.rb +122 -0
  76. data/lib/rails_admin_next/config/configurable.rb +107 -0
  77. data/lib/rails_admin_next/config/const_load_suppressor.rb +78 -0
  78. data/lib/rails_admin_next/config/fields/association.rb +169 -0
  79. data/lib/rails_admin_next/config/fields/base.rb +391 -0
  80. data/lib/rails_admin_next/config/fields/collection_association.rb +90 -0
  81. data/lib/rails_admin_next/config/fields/factories/action_text.rb +14 -0
  82. data/lib/rails_admin_next/config/fields/factories/active_storage.rb +34 -0
  83. data/lib/rails_admin_next/config/fields/factories/association.rb +32 -0
  84. data/lib/rails_admin_next/config/fields/factories/encrypted_password.rb +28 -0
  85. data/lib/rails_admin_next/config/fields/factories/enum.rb +23 -0
  86. data/lib/rails_admin_next/config/fields/factories/password.rb +19 -0
  87. data/lib/rails_admin_next/config/fields/group.rb +77 -0
  88. data/lib/rails_admin_next/config/fields/singular_association.rb +62 -0
  89. data/lib/rails_admin_next/config/fields/types/action_text.rb +20 -0
  90. data/lib/rails_admin_next/config/fields/types/active_record_enum.rb +62 -0
  91. data/lib/rails_admin_next/config/fields/types/active_storage.rb +70 -0
  92. data/lib/rails_admin_next/config/fields/types/all.rb +32 -0
  93. data/lib/rails_admin_next/config/fields/types/belongs_to_association.rb +48 -0
  94. data/lib/rails_admin_next/config/fields/types/boolean.rb +70 -0
  95. data/lib/rails_admin_next/config/fields/types/citext.rb +15 -0
  96. data/lib/rails_admin_next/config/fields/types/color.rb +43 -0
  97. data/lib/rails_admin_next/config/fields/types/date.rb +38 -0
  98. data/lib/rails_admin_next/config/fields/types/datetime.rb +79 -0
  99. data/lib/rails_admin_next/config/fields/types/decimal.rb +23 -0
  100. data/lib/rails_admin_next/config/fields/types/enum.rb +52 -0
  101. data/lib/rails_admin_next/config/fields/types/file_upload.rb +87 -0
  102. data/lib/rails_admin_next/config/fields/types/float.rb +23 -0
  103. data/lib/rails_admin_next/config/fields/types/has_and_belongs_to_many_association.rb +16 -0
  104. data/lib/rails_admin_next/config/fields/types/has_many_association.rb +16 -0
  105. data/lib/rails_admin_next/config/fields/types/has_one_association.rb +35 -0
  106. data/lib/rails_admin_next/config/fields/types/hidden.rb +31 -0
  107. data/lib/rails_admin_next/config/fields/types/inet.rb +15 -0
  108. data/lib/rails_admin_next/config/fields/types/integer.rb +20 -0
  109. data/lib/rails_admin_next/config/fields/types/json.rb +37 -0
  110. data/lib/rails_admin_next/config/fields/types/multiple_active_storage.rb +82 -0
  111. data/lib/rails_admin_next/config/fields/types/multiple_file_upload.rb +134 -0
  112. data/lib/rails_admin_next/config/fields/types/numeric.rb +24 -0
  113. data/lib/rails_admin_next/config/fields/types/password.rb +45 -0
  114. data/lib/rails_admin_next/config/fields/types/polymorphic_association.rb +118 -0
  115. data/lib/rails_admin_next/config/fields/types/serialized.rb +28 -0
  116. data/lib/rails_admin_next/config/fields/types/string.rb +50 -0
  117. data/lib/rails_admin_next/config/fields/types/string_like.rb +25 -0
  118. data/lib/rails_admin_next/config/fields/types/text.rb +28 -0
  119. data/lib/rails_admin_next/config/fields/types/time.rb +39 -0
  120. data/lib/rails_admin_next/config/fields/types/timestamp.rb +16 -0
  121. data/lib/rails_admin_next/config/fields/types/uuid.rb +15 -0
  122. data/lib/rails_admin_next/config/fields/types.rb +29 -0
  123. data/lib/rails_admin_next/config/fields.rb +88 -0
  124. data/lib/rails_admin_next/config/groupable.rb +20 -0
  125. data/lib/rails_admin_next/config/has_description.rb +14 -0
  126. data/lib/rails_admin_next/config/has_fields.rb +144 -0
  127. data/lib/rails_admin_next/config/has_groups.rb +27 -0
  128. data/lib/rails_admin_next/config/hideable.rb +30 -0
  129. data/lib/rails_admin_next/config/inspectable.rb +39 -0
  130. data/lib/rails_admin_next/config/lazy_model.rb +74 -0
  131. data/lib/rails_admin_next/config/model.rb +126 -0
  132. data/lib/rails_admin_next/config/proxyable/proxy.rb +42 -0
  133. data/lib/rails_admin_next/config/proxyable.rb +26 -0
  134. data/lib/rails_admin_next/config/sections/base.rb +36 -0
  135. data/lib/rails_admin_next/config/sections/create.rb +13 -0
  136. data/lib/rails_admin_next/config/sections/edit.rb +13 -0
  137. data/lib/rails_admin_next/config/sections/export.rb +13 -0
  138. data/lib/rails_admin_next/config/sections/list.rb +63 -0
  139. data/lib/rails_admin_next/config/sections/modal.rb +12 -0
  140. data/lib/rails_admin_next/config/sections/nested.rb +12 -0
  141. data/lib/rails_admin_next/config/sections/show.rb +12 -0
  142. data/lib/rails_admin_next/config/sections/update.rb +12 -0
  143. data/lib/rails_admin_next/config/sections.rb +39 -0
  144. data/lib/rails_admin_next/config.rb +436 -0
  145. data/lib/rails_admin_next/engine.rb +91 -0
  146. data/lib/rails_admin_next/extension.rb +35 -0
  147. data/lib/rails_admin_next/extensions/cancancan/authorization_adapter.rb +90 -0
  148. data/lib/rails_admin_next/extensions/cancancan.rb +5 -0
  149. data/lib/rails_admin_next/extensions/controller_extension.rb +8 -0
  150. data/lib/rails_admin_next/extensions/paper_trail/auditing_adapter.rb +192 -0
  151. data/lib/rails_admin_next/extensions/paper_trail.rb +5 -0
  152. data/lib/rails_admin_next/extensions/pundit/authorization_adapter.rb +72 -0
  153. data/lib/rails_admin_next/extensions/pundit.rb +5 -0
  154. data/lib/rails_admin_next/extensions/url_for_extension.rb +15 -0
  155. data/lib/rails_admin_next/icons.rb +143 -0
  156. data/lib/rails_admin_next/support/composite_keys_serializer.rb +15 -0
  157. data/lib/rails_admin_next/support/csv_converter.rb +100 -0
  158. data/lib/rails_admin_next/support/hash_helper.rb +31 -0
  159. data/lib/rails_admin_next/support/paginated_collection.rb +79 -0
  160. data/lib/rails_admin_next/version.rb +17 -0
  161. data/lib/rails_admin_next.rb +72 -0
  162. data/lib/tasks/rails_admin.rake +40 -0
  163. data/src/rails_admin/application.js +15 -0
  164. data/src/rails_admin/base.js +12 -0
  165. data/src/rails_admin/controllers/alert_controller.js +28 -0
  166. data/src/rails_admin/controllers/collapse_controller.js +16 -0
  167. data/src/rails_admin/controllers/dropdown_controller.js +110 -0
  168. data/src/rails_admin/controllers/feedback_controller.js +73 -0
  169. data/src/rails_admin/controllers/filter_box_controller.js +346 -0
  170. data/src/rails_admin/controllers/filtering_multiselect_controller.js +386 -0
  171. data/src/rails_admin/controllers/filtering_select_controller.js +509 -0
  172. data/src/rails_admin/controllers/index.js +31 -0
  173. data/src/rails_admin/controllers/modal_controller.js +142 -0
  174. data/src/rails_admin/controllers/nested_form_controller.js +117 -0
  175. data/src/rails_admin/controllers/polymorphic_controller.js +26 -0
  176. data/src/rails_admin/controllers/remote_form_controller.js +173 -0
  177. data/src/rails_admin/controllers/sidescroll_controller.js +23 -0
  178. data/src/rails_admin/dom-ready.js +20 -0
  179. data/src/rails_admin/dom.js +19 -0
  180. data/src/rails_admin/i18n.js +20 -0
  181. data/src/rails_admin/icons.js +64 -0
  182. data/src/rails_admin/interactions.js +221 -0
  183. data/src/rails_admin/select_query.js +65 -0
  184. metadata +346 -0
@@ -0,0 +1,2375 @@
1
+ /*
2
+ * rails_admin_next — trimmed ex-Bootstrap 5.1.3 component CSS (owned, not vendored).
3
+ * Loaded by rails_admin.css into the ra.framework cascade layer; see that file's header for the
4
+ * browser floor and the styled-vocabulary contract.
5
+ */
6
+
7
+ /* === Reboot ============================================================= */
8
+ *,
9
+ *::before,
10
+ *::after {
11
+ box-sizing: border-box;
12
+ }
13
+ @media (prefers-reduced-motion: no-preference) {
14
+ :root {
15
+ scroll-behavior: smooth;
16
+ }
17
+ }
18
+ body {
19
+ margin: 0;
20
+ font-family: var(--ra-body-font-family);
21
+ font-size: var(--ra-body-font-size);
22
+ font-weight: var(--ra-body-font-weight);
23
+ line-height: var(--ra-body-line-height);
24
+ color: var(--ra-body-color);
25
+ text-align: var(--ra-body-text-align);
26
+ background-color: var(--ra-body-bg);
27
+ -webkit-text-size-adjust: 100%;
28
+ -webkit-tap-highlight-color: transparent;
29
+ }
30
+ hr {
31
+ margin: 1rem 0;
32
+ color: inherit;
33
+ background-color: currentColor;
34
+ border: 0;
35
+ opacity: 0.25;
36
+ }
37
+ hr:not([size]) {
38
+ height: 1px;
39
+ }
40
+ h6,
41
+ .h6,
42
+ h5,
43
+ .h5,
44
+ h4,
45
+ .h4,
46
+ h3,
47
+ .h3,
48
+ h2,
49
+ .h2,
50
+ h1,
51
+ .h1 {
52
+ margin-top: 0;
53
+ margin-bottom: 0.5rem;
54
+ font-weight: 500;
55
+ line-height: 1.2;
56
+ }
57
+ h1,
58
+ .h1 {
59
+ font-size: calc(1.3375rem + 1.05vw);
60
+ }
61
+ @media (min-width: 1200px) {
62
+ h1,
63
+ .h1 {
64
+ font-size: 2.125rem;
65
+ }
66
+ }
67
+ h2,
68
+ .h2 {
69
+ font-size: calc(1.295rem + 0.54vw);
70
+ }
71
+ @media (min-width: 1200px) {
72
+ h2,
73
+ .h2 {
74
+ font-size: 1.7rem;
75
+ }
76
+ }
77
+ h3,
78
+ .h3 {
79
+ font-size: calc(1.27375rem + 0.285vw);
80
+ }
81
+ @media (min-width: 1200px) {
82
+ h3,
83
+ .h3 {
84
+ font-size: 1.4875rem;
85
+ }
86
+ }
87
+ h4,
88
+ .h4 {
89
+ font-size: calc(1.2525rem + 0.03vw);
90
+ }
91
+ @media (min-width: 1200px) {
92
+ h4,
93
+ .h4 {
94
+ font-size: 1.275rem;
95
+ }
96
+ }
97
+ h5,
98
+ .h5 {
99
+ font-size: 1.0625rem;
100
+ }
101
+ h6,
102
+ .h6 {
103
+ font-size: 0.85rem;
104
+ }
105
+ p {
106
+ margin-top: 0;
107
+ margin-bottom: 1rem;
108
+ }
109
+ abbr[title],
110
+ abbr[data-bs-original-title] {
111
+ text-decoration: underline dotted;
112
+ cursor: help;
113
+ text-decoration-skip-ink: none;
114
+ }
115
+ address {
116
+ margin-bottom: 1rem;
117
+ font-style: normal;
118
+ line-height: inherit;
119
+ }
120
+ ol,
121
+ ul {
122
+ padding-left: 2rem;
123
+ }
124
+ ol,
125
+ ul,
126
+ dl {
127
+ margin-top: 0;
128
+ margin-bottom: 1rem;
129
+ }
130
+ ol ol,
131
+ ul ul,
132
+ ol ul,
133
+ ul ol {
134
+ margin-bottom: 0;
135
+ }
136
+ dt {
137
+ font-weight: 700;
138
+ }
139
+ dd {
140
+ margin-bottom: 0.5rem;
141
+ margin-left: 0;
142
+ }
143
+ blockquote {
144
+ margin: 0 0 1rem;
145
+ }
146
+ b,
147
+ strong {
148
+ font-weight: bolder;
149
+ }
150
+ small,
151
+ .small {
152
+ font-size: 0.875em;
153
+ }
154
+ mark,
155
+ .mark {
156
+ padding: 0.2em;
157
+ background-color: var(--ra-mark-bg);
158
+ }
159
+ sub,
160
+ sup {
161
+ position: relative;
162
+ font-size: 0.75em;
163
+ line-height: 0;
164
+ vertical-align: baseline;
165
+ }
166
+ sub {
167
+ bottom: -0.25em;
168
+ }
169
+ sup {
170
+ top: -0.5em;
171
+ }
172
+ a {
173
+ color: var(--ra-link-color);
174
+ text-decoration: underline;
175
+ }
176
+ a:hover {
177
+ color: var(--ra-link-hover-color);
178
+ }
179
+ a:not([href]):not([class]),
180
+ a:not([href]):not([class]):hover {
181
+ color: inherit;
182
+ text-decoration: none;
183
+ }
184
+ pre,
185
+ code,
186
+ kbd,
187
+ samp {
188
+ font-family: var(--ra-font-monospace);
189
+ font-size: 1em;
190
+ direction: ltr;
191
+ unicode-bidi: bidi-override;
192
+ }
193
+ pre {
194
+ display: block;
195
+ margin-top: 0;
196
+ margin-bottom: 1rem;
197
+ overflow: auto;
198
+ font-size: 0.875em;
199
+ }
200
+ pre code {
201
+ font-size: inherit;
202
+ color: inherit;
203
+ word-break: normal;
204
+ }
205
+ code {
206
+ font-size: 0.875em;
207
+ color: var(--ra-code-color);
208
+ word-wrap: break-word;
209
+ }
210
+ a > code {
211
+ color: inherit;
212
+ }
213
+ kbd {
214
+ padding: 0.2rem 0.4rem;
215
+ font-size: 0.875em;
216
+ /* The inverted-chip look in both schemes: page-bg text on the gray-900 chip is
217
+ white-on-near-black in light (--ra-body-bg is white there, same as --ra-white)
218
+ and near-black-on-light-gray in dark, where gray-900's arm inverts. */
219
+ color: var(--ra-body-bg);
220
+ background-color: var(--ra-gray-900);
221
+ border-radius: 0.2rem;
222
+ }
223
+ kbd kbd {
224
+ padding: 0;
225
+ font-size: 1em;
226
+ font-weight: 700;
227
+ }
228
+ figure {
229
+ margin: 0 0 1rem;
230
+ }
231
+ img,
232
+ svg {
233
+ vertical-align: middle;
234
+ }
235
+ table {
236
+ caption-side: bottom;
237
+ border-collapse: collapse;
238
+ }
239
+ caption {
240
+ padding-top: 0.5rem;
241
+ padding-bottom: 0.5rem;
242
+ color: var(--ra-gray-600);
243
+ text-align: left;
244
+ }
245
+ th {
246
+ text-align: inherit;
247
+ text-align: -webkit-match-parent;
248
+ }
249
+ thead,
250
+ tbody,
251
+ tfoot,
252
+ tr,
253
+ td,
254
+ th {
255
+ border-color: inherit;
256
+ border-style: solid;
257
+ border-width: 0;
258
+ }
259
+ label {
260
+ display: inline-block;
261
+ }
262
+ button {
263
+ border-radius: 0;
264
+ }
265
+ button:focus:not(:focus-visible) {
266
+ outline: 0;
267
+ }
268
+ input,
269
+ button,
270
+ select,
271
+ optgroup,
272
+ textarea {
273
+ margin: 0;
274
+ font-family: inherit;
275
+ font-size: inherit;
276
+ line-height: inherit;
277
+ }
278
+ button,
279
+ select {
280
+ text-transform: none;
281
+ }
282
+ [role="button"] {
283
+ cursor: pointer;
284
+ }
285
+ select {
286
+ word-wrap: normal;
287
+ }
288
+ select:disabled {
289
+ opacity: 1;
290
+ }
291
+ [list]::-webkit-calendar-picker-indicator {
292
+ display: none;
293
+ }
294
+ button,
295
+ [type="button"],
296
+ [type="reset"],
297
+ [type="submit"] {
298
+ -webkit-appearance: button;
299
+ }
300
+ button:not(:disabled),
301
+ [type="button"]:not(:disabled),
302
+ [type="reset"]:not(:disabled),
303
+ [type="submit"]:not(:disabled) {
304
+ cursor: pointer;
305
+ }
306
+ ::-moz-focus-inner {
307
+ padding: 0;
308
+ border-style: none;
309
+ }
310
+ textarea {
311
+ resize: vertical;
312
+ }
313
+ fieldset {
314
+ min-width: 0;
315
+ padding: 0;
316
+ margin: 0;
317
+ border: 0;
318
+ }
319
+ legend {
320
+ float: left;
321
+ width: 100%;
322
+ padding: 0;
323
+ margin-bottom: 0.5rem;
324
+ font-size: calc(1.275rem + 0.3vw);
325
+ line-height: inherit;
326
+ }
327
+ @media (min-width: 1200px) {
328
+ legend {
329
+ font-size: 1.5rem;
330
+ }
331
+ }
332
+ legend + * {
333
+ clear: left;
334
+ }
335
+ ::-webkit-datetime-edit-fields-wrapper,
336
+ ::-webkit-datetime-edit-text,
337
+ ::-webkit-datetime-edit-minute,
338
+ ::-webkit-datetime-edit-hour-field,
339
+ ::-webkit-datetime-edit-day-field,
340
+ ::-webkit-datetime-edit-month-field,
341
+ ::-webkit-datetime-edit-year-field {
342
+ padding: 0;
343
+ }
344
+ ::-webkit-inner-spin-button {
345
+ height: auto;
346
+ }
347
+ [type="search"] {
348
+ outline-offset: -2px;
349
+ -webkit-appearance: textfield;
350
+ }
351
+ ::-webkit-search-decoration {
352
+ -webkit-appearance: none;
353
+ }
354
+ ::-webkit-color-swatch-wrapper {
355
+ padding: 0;
356
+ }
357
+ ::file-selector-button {
358
+ font: inherit;
359
+ }
360
+ ::-webkit-file-upload-button {
361
+ font: inherit;
362
+ -webkit-appearance: button;
363
+ }
364
+ output {
365
+ display: inline-block;
366
+ }
367
+ iframe {
368
+ border: 0;
369
+ }
370
+ summary {
371
+ display: list-item;
372
+ cursor: pointer;
373
+ }
374
+ progress {
375
+ vertical-align: baseline;
376
+ }
377
+ [hidden] {
378
+ display: none !important;
379
+ }
380
+
381
+ /* === Typography ========================================================= */
382
+ .list-unstyled {
383
+ padding-left: 0;
384
+ list-style: none;
385
+ }
386
+ .list-inline {
387
+ padding-left: 0;
388
+ list-style: none;
389
+ }
390
+
391
+ /* === Images and figures ================================================= */
392
+ .img-thumbnail {
393
+ padding: 0.25rem;
394
+ background-color: var(--ra-body-bg);
395
+ border: 1px solid var(--ra-border-color);
396
+ border-radius: 0.25rem;
397
+ max-width: 100%;
398
+ height: auto;
399
+ }
400
+
401
+ /* === Containers ========================================================= */
402
+ .container-fluid {
403
+ width: 100%;
404
+ padding-right: var(--ra-gutter-x, 0.75rem);
405
+ padding-left: var(--ra-gutter-x, 0.75rem);
406
+ margin-right: auto;
407
+ margin-left: auto;
408
+ }
409
+
410
+ /* === Grid =============================================================== */
411
+ .row {
412
+ --ra-gutter-x: 1.5rem;
413
+ --ra-gutter-y: 0;
414
+ display: flex;
415
+ flex-wrap: wrap;
416
+ margin-top: calc(-1 * var(--ra-gutter-y));
417
+ margin-right: calc(-0.5 * var(--ra-gutter-x));
418
+ margin-left: calc(-0.5 * var(--ra-gutter-x));
419
+ }
420
+ .row > * {
421
+ flex-shrink: 0;
422
+ width: 100%;
423
+ max-width: 100%;
424
+ padding-right: calc(var(--ra-gutter-x) * 0.5);
425
+ padding-left: calc(var(--ra-gutter-x) * 0.5);
426
+ margin-top: var(--ra-gutter-y);
427
+ }
428
+ .col-auto {
429
+ flex: 0 0 auto;
430
+ width: auto;
431
+ }
432
+ @media (min-width: 576px) {
433
+ .col-sm-2 {
434
+ flex: 0 0 auto;
435
+ width: 16.66666667%;
436
+ }
437
+ .col-sm-3 {
438
+ flex: 0 0 auto;
439
+ width: 25%;
440
+ }
441
+ .col-sm-4 {
442
+ flex: 0 0 auto;
443
+ width: 33.33333333%;
444
+ }
445
+ .col-sm-6 {
446
+ flex: 0 0 auto;
447
+ width: 50%;
448
+ }
449
+ .col-sm-8 {
450
+ flex: 0 0 auto;
451
+ width: 66.66666667%;
452
+ }
453
+ .col-sm-9 {
454
+ flex: 0 0 auto;
455
+ width: 75%;
456
+ }
457
+ .col-sm-10 {
458
+ flex: 0 0 auto;
459
+ width: 83.33333333%;
460
+ }
461
+ .col-sm-12 {
462
+ flex: 0 0 auto;
463
+ width: 100%;
464
+ }
465
+ }
466
+ @media (min-width: 768px) {
467
+ .col-md-2 {
468
+ flex: 0 0 auto;
469
+ width: 16.66666667%;
470
+ }
471
+ .col-md-6 {
472
+ flex: 0 0 auto;
473
+ width: 50%;
474
+ }
475
+ .col-md-10 {
476
+ flex: 0 0 auto;
477
+ width: 83.33333333%;
478
+ }
479
+ }
480
+ /* === Tables ============================================================= */
481
+ .table {
482
+ --ra-table-bg: transparent;
483
+ --ra-table-accent-bg: transparent;
484
+ --ra-table-striped-color: var(--ra-body-color);
485
+ --ra-table-striped-bg: color-mix(
486
+ in srgb,
487
+ var(--ra-shade-target) 5%,
488
+ transparent
489
+ );
490
+ --ra-table-active-color: var(--ra-body-color);
491
+ --ra-table-active-bg: color-mix(
492
+ in srgb,
493
+ var(--ra-shade-target) 10%,
494
+ transparent
495
+ );
496
+ --ra-table-hover-color: var(--ra-body-color);
497
+ --ra-table-hover-bg: color-mix(
498
+ in srgb,
499
+ var(--ra-shade-target) 7.5%,
500
+ transparent
501
+ );
502
+ width: 100%;
503
+ margin-bottom: 1rem;
504
+ color: var(--ra-body-color);
505
+ vertical-align: top;
506
+ border-color: var(--ra-border-color);
507
+ }
508
+ .table > :not(caption) > * > * {
509
+ padding: 0.5rem 0.5rem;
510
+ background-color: var(--ra-table-bg);
511
+ border-bottom-width: 1px;
512
+ box-shadow: inset 0 0 0 9999px var(--ra-table-accent-bg);
513
+ }
514
+ .table > tbody {
515
+ vertical-align: inherit;
516
+ }
517
+ .table > thead {
518
+ vertical-align: bottom;
519
+ }
520
+ .table > :not(:first-child) {
521
+ border-top: 2px solid currentColor;
522
+ }
523
+ .table-striped > tbody > tr:nth-of-type(odd) > * {
524
+ --ra-table-accent-bg: var(--ra-table-striped-bg);
525
+ color: var(--ra-table-striped-color);
526
+ }
527
+ .table-active {
528
+ --ra-table-accent-bg: var(--ra-table-active-bg);
529
+ color: var(--ra-table-active-color);
530
+ }
531
+ .table-hover > tbody > tr:hover > * {
532
+ --ra-table-accent-bg: var(--ra-table-hover-bg);
533
+ color: var(--ra-table-hover-color);
534
+ }
535
+ /* Contextual variants set a base tint (theme color mixed 80% toward the tint
536
+ target — Bootstrap 5.1.3's shift-color(-80%) — except light/dark, which use
537
+ the theme color as-is) plus a contrast color; the grouped rule derives the
538
+ striped/active/hover accents by mixing 5%/10%/7.5% of the contrast color in,
539
+ and the border matches the active accent, all per Bootstrap's table-variant(). */
540
+ .table-primary {
541
+ --ra-table-variant-bg: color-mix(
542
+ in srgb,
543
+ var(--ra-tint-target) 80%,
544
+ var(--ra-primary)
545
+ );
546
+ --ra-table-variant-contrast: var(--ra-shade-target);
547
+ }
548
+ .table-secondary {
549
+ --ra-table-variant-bg: color-mix(
550
+ in srgb,
551
+ var(--ra-tint-target) 80%,
552
+ var(--ra-secondary)
553
+ );
554
+ --ra-table-variant-contrast: var(--ra-shade-target);
555
+ }
556
+ .table-success {
557
+ --ra-table-variant-bg: color-mix(
558
+ in srgb,
559
+ var(--ra-tint-target) 80%,
560
+ var(--ra-success)
561
+ );
562
+ --ra-table-variant-contrast: var(--ra-shade-target);
563
+ }
564
+ .table-info {
565
+ --ra-table-variant-bg: color-mix(
566
+ in srgb,
567
+ var(--ra-tint-target) 80%,
568
+ var(--ra-info)
569
+ );
570
+ --ra-table-variant-contrast: var(--ra-shade-target);
571
+ }
572
+ .table-warning {
573
+ --ra-table-variant-bg: color-mix(
574
+ in srgb,
575
+ var(--ra-tint-target) 80%,
576
+ var(--ra-warning)
577
+ );
578
+ --ra-table-variant-contrast: var(--ra-shade-target);
579
+ }
580
+ .table-danger {
581
+ --ra-table-variant-bg: color-mix(
582
+ in srgb,
583
+ var(--ra-tint-target) 80%,
584
+ var(--ra-danger)
585
+ );
586
+ --ra-table-variant-contrast: var(--ra-shade-target);
587
+ }
588
+ /* The light/dark variant bgs are scheme-locked absolutes, so their contrast
589
+ colors are the locked neutrals — identical to the shade/tint targets under
590
+ the light scheme, but they must not flip to white-on-light/black-on-dark
591
+ when the dark scheme lands. */
592
+ .table-light {
593
+ --ra-table-variant-bg: var(--ra-light);
594
+ --ra-table-variant-contrast: var(--ra-black);
595
+ }
596
+ .table-dark {
597
+ --ra-table-variant-bg: var(--ra-dark);
598
+ --ra-table-variant-contrast: var(--ra-white);
599
+ }
600
+ .table-primary,
601
+ .table-secondary,
602
+ .table-success,
603
+ .table-info,
604
+ .table-warning,
605
+ .table-danger,
606
+ .table-light,
607
+ .table-dark {
608
+ --ra-table-bg: var(--ra-table-variant-bg);
609
+ --ra-table-striped-bg: color-mix(
610
+ in srgb,
611
+ var(--ra-table-variant-contrast) 5%,
612
+ var(--ra-table-variant-bg)
613
+ );
614
+ --ra-table-striped-color: var(--ra-table-variant-contrast);
615
+ --ra-table-active-bg: color-mix(
616
+ in srgb,
617
+ var(--ra-table-variant-contrast) 10%,
618
+ var(--ra-table-variant-bg)
619
+ );
620
+ --ra-table-active-color: var(--ra-table-variant-contrast);
621
+ --ra-table-hover-bg: color-mix(
622
+ in srgb,
623
+ var(--ra-table-variant-contrast) 7.5%,
624
+ var(--ra-table-variant-bg)
625
+ );
626
+ --ra-table-hover-color: var(--ra-table-variant-contrast);
627
+ color: var(--ra-table-variant-contrast);
628
+ border-color: var(--ra-table-active-bg);
629
+ }
630
+
631
+ /* === Forms: labels and help text ======================================== */
632
+ .col-form-label {
633
+ padding-top: calc(0.375rem + 1px);
634
+ padding-bottom: calc(0.375rem + 1px);
635
+ margin-bottom: 0;
636
+ font-size: inherit;
637
+ line-height: 1.5;
638
+ }
639
+ .form-text {
640
+ margin-top: 0.25rem;
641
+ font-size: 0.875em;
642
+ color: var(--ra-gray-600);
643
+ }
644
+
645
+ /* === Forms: controls ==================================================== */
646
+ .form-control {
647
+ display: block;
648
+ width: 100%;
649
+ padding: 0.375rem 0.75rem;
650
+ font-size: 0.85rem;
651
+ font-weight: 400;
652
+ line-height: 1.5;
653
+ color: var(--ra-body-color);
654
+ background-color: var(--ra-body-bg);
655
+ background-clip: padding-box;
656
+ border: 1px solid var(--ra-gray-400);
657
+ appearance: none;
658
+ border-radius: 0.25rem;
659
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
660
+ }
661
+ @media (prefers-reduced-motion: reduce) {
662
+ .form-control {
663
+ transition: none;
664
+ }
665
+ }
666
+ .form-control[type="file"] {
667
+ overflow: hidden;
668
+ }
669
+ .form-control[type="file"]:not(:disabled):not([readonly]) {
670
+ cursor: pointer;
671
+ }
672
+ .form-control:focus {
673
+ color: var(--ra-body-color);
674
+ background-color: var(--ra-body-bg);
675
+ border-color: var(--ra-input-focus-border-color);
676
+ outline: 0;
677
+ box-shadow: 0 0 0 0.25rem var(--ra-focus-ring-color);
678
+ }
679
+ .form-control::-webkit-date-and-time-value {
680
+ height: 1.5em;
681
+ }
682
+ .form-control::placeholder {
683
+ color: var(--ra-gray-600);
684
+ opacity: 1;
685
+ }
686
+ .form-control:disabled,
687
+ .form-control[readonly] {
688
+ background-color: var(--ra-gray-200);
689
+ opacity: 1;
690
+ }
691
+ .form-control::file-selector-button {
692
+ padding: 0.375rem 0.75rem;
693
+ margin: -0.375rem -0.75rem;
694
+ margin-inline-end: 0.75rem;
695
+ color: var(--ra-body-color);
696
+ background-color: var(--ra-gray-200);
697
+ pointer-events: none;
698
+ border-color: inherit;
699
+ border-style: solid;
700
+ border-width: 0;
701
+ border-inline-end-width: 1px;
702
+ border-radius: 0;
703
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
704
+ border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
705
+ }
706
+ @media (prefers-reduced-motion: reduce) {
707
+ .form-control::file-selector-button {
708
+ transition: none;
709
+ }
710
+ }
711
+ .form-control:hover:not(:disabled):not([readonly])::file-selector-button {
712
+ background-color: color-mix(
713
+ in srgb,
714
+ var(--ra-shade-target) 5%,
715
+ var(--ra-gray-200)
716
+ );
717
+ }
718
+ .form-control::-webkit-file-upload-button {
719
+ padding: 0.375rem 0.75rem;
720
+ margin: -0.375rem -0.75rem;
721
+ margin-inline-end: 0.75rem;
722
+ color: var(--ra-body-color);
723
+ background-color: var(--ra-gray-200);
724
+ pointer-events: none;
725
+ border-color: inherit;
726
+ border-style: solid;
727
+ border-width: 0;
728
+ border-inline-end-width: 1px;
729
+ border-radius: 0;
730
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
731
+ border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
732
+ }
733
+ @media (prefers-reduced-motion: reduce) {
734
+ .form-control::-webkit-file-upload-button {
735
+ transition: none;
736
+ }
737
+ }
738
+ .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
739
+ background-color: color-mix(
740
+ in srgb,
741
+ var(--ra-shade-target) 5%,
742
+ var(--ra-gray-200)
743
+ );
744
+ }
745
+ .form-control-sm {
746
+ min-height: calc(1.5em + 0.5rem + 2px);
747
+ padding: 0.25rem 0.5rem;
748
+ font-size: 0.74375rem;
749
+ border-radius: 0.2rem;
750
+ }
751
+ .form-control-sm::file-selector-button {
752
+ padding: 0.25rem 0.5rem;
753
+ margin: -0.25rem -0.5rem;
754
+ margin-inline-end: 0.5rem;
755
+ }
756
+ .form-control-sm::-webkit-file-upload-button {
757
+ padding: 0.25rem 0.5rem;
758
+ margin: -0.25rem -0.5rem;
759
+ margin-inline-end: 0.5rem;
760
+ }
761
+ textarea.form-control {
762
+ min-height: calc(1.5em + 0.75rem + 2px);
763
+ }
764
+ textarea.form-control-sm {
765
+ min-height: calc(1.5em + 0.5rem + 2px);
766
+ }
767
+ /* Chromium-only progressive enhancement: textareas grow with their content.
768
+ Safari fails the @supports probe and keeps rows-attribute sizing; where
769
+ field-sizing applies, the min-heights above still floor the empty box and
770
+ the max-height cap keeps huge content from swallowing the form. */
771
+ @supports (field-sizing: content) {
772
+ textarea.form-control {
773
+ field-sizing: content;
774
+ max-height: 50vh;
775
+ }
776
+ }
777
+
778
+ /* === Forms: select ====================================================== */
779
+ .form-select {
780
+ display: block;
781
+ width: 100%;
782
+ padding: 0.375rem 2.25rem 0.375rem 0.75rem;
783
+ -moz-padding-start: calc(0.75rem - 3px);
784
+ font-size: 0.85rem;
785
+ font-weight: 400;
786
+ line-height: 1.5;
787
+ color: var(--ra-body-color);
788
+ background-color: var(--ra-body-bg);
789
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
790
+ background-repeat: no-repeat;
791
+ background-position: right 0.75rem center;
792
+ background-size: 16px 12px;
793
+ border: 1px solid var(--ra-gray-400);
794
+ border-radius: 0.25rem;
795
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
796
+ appearance: none;
797
+ }
798
+ @media (prefers-reduced-motion: reduce) {
799
+ .form-select {
800
+ transition: none;
801
+ }
802
+ }
803
+ /* Scheme-adaptive caret. A background url() can't hold a light-dark() pair and a
804
+ mask would clip the select's own text, so the dark scheme swaps the data-URI
805
+ via a style query on the registered scheme probe (tokens.css/rails_admin.css).
806
+ Light rendering never leaves the original declaration above; the dark stroke
807
+ is the dark arm of the body color. The [multiple]/[size] image-none rule below
808
+ out-specifies this in both schemes. */
809
+ @container style(--ra-scheme-probe: black) {
810
+ .form-select {
811
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
812
+ }
813
+ }
814
+ .form-select:focus {
815
+ border-color: var(--ra-input-focus-border-color);
816
+ outline: 0;
817
+ box-shadow: 0 0 0 0.25rem var(--ra-focus-ring-color);
818
+ }
819
+ .form-select[multiple],
820
+ .form-select[size]:not([size="1"]) {
821
+ padding-right: 0.75rem;
822
+ background-image: none;
823
+ }
824
+ .form-select:disabled {
825
+ background-color: var(--ra-gray-200);
826
+ }
827
+ .form-select:-moz-focusring {
828
+ color: transparent;
829
+ text-shadow: 0 0 0 var(--ra-body-color);
830
+ }
831
+ .form-select-sm {
832
+ padding-top: 0.25rem;
833
+ padding-bottom: 0.25rem;
834
+ padding-left: 0.5rem;
835
+ font-size: 0.74375rem;
836
+ border-radius: 0.2rem;
837
+ }
838
+
839
+ /* === Forms: checks and switches ========================================= */
840
+ /* Native checkboxes/radios tinted via accent-color: the platform draws the
841
+ box, glyphs and checked/indeterminate states. The focus ring is
842
+ keyboard-only (:focus-visible); outline: 0 swaps the UA ring for the token
843
+ one. */
844
+ .form-check-input {
845
+ width: 1em;
846
+ height: 1em;
847
+ margin-top: 0.25em;
848
+ vertical-align: top;
849
+ accent-color: var(--ra-primary);
850
+ print-color-adjust: exact;
851
+ }
852
+ .form-check-input:active {
853
+ filter: brightness(90%);
854
+ }
855
+ .form-check-input:focus-visible {
856
+ outline: 0;
857
+ box-shadow: 0 0 0 0.25rem var(--ra-focus-ring-color);
858
+ }
859
+ .form-check-input:disabled {
860
+ pointer-events: none;
861
+ filter: none;
862
+ opacity: 0.5;
863
+ }
864
+ .btn-check {
865
+ position: absolute;
866
+ clip: rect(0, 0, 0, 0);
867
+ pointer-events: none;
868
+ }
869
+ .btn-check[disabled] + .btn,
870
+ .btn-check:disabled + .btn {
871
+ pointer-events: none;
872
+ filter: none;
873
+ opacity: 0.65;
874
+ }
875
+
876
+ /* === Forms: input group ================================================= */
877
+ .input-group {
878
+ position: relative;
879
+ display: flex;
880
+ flex-wrap: wrap;
881
+ align-items: stretch;
882
+ width: 100%;
883
+ }
884
+ .input-group > .form-control,
885
+ .input-group > .form-select {
886
+ position: relative;
887
+ flex: 1 1 auto;
888
+ width: 1%;
889
+ min-width: 0;
890
+ }
891
+ .input-group > .form-control:focus,
892
+ .input-group > .form-select:focus {
893
+ z-index: 3;
894
+ }
895
+ .input-group .btn {
896
+ position: relative;
897
+ z-index: 2;
898
+ }
899
+ .input-group .btn:focus {
900
+ z-index: 3;
901
+ }
902
+ .input-group:not(.has-validation)
903
+ > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),
904
+ .input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3) {
905
+ border-top-right-radius: 0;
906
+ border-bottom-right-radius: 0;
907
+ }
908
+ .input-group
909
+ > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(
910
+ .valid-feedback
911
+ ):not(.invalid-tooltip):not(.invalid-feedback) {
912
+ margin-left: -1px;
913
+ border-top-left-radius: 0;
914
+ border-bottom-left-radius: 0;
915
+ }
916
+
917
+ /* === Buttons ============================================================ */
918
+ /* Solid variants set --ra-btn-* custom properties; the grouped state rules
919
+ derive hover/focus/active/disabled colors from them by mixing toward the
920
+ scheme-aware shade/tint targets (Bootstrap 5.1.3 amounts: hover bg 15%,
921
+ active bg 20%; hover/active border 20%/25% when shading — dark-on-light
922
+ text — or 10%/10% when tinting). The focus ring is the button's text color
923
+ mixed 15% into its background, at 50% opacity (Bootstrap's
924
+ $btn-focus-box-shadow with color-contrast() resolved per variant) — shown
925
+ only for keyboard focus (:focus-visible), so mouse clicks leave no ring.
926
+ The primary/danger label color is --ra-tint-target (white in light, black
927
+ in dark): the dark arms of the fills are lightened for the dark surface,
928
+ and black labels are what keep them at AA contrast. */
929
+ .btn {
930
+ display: inline-block;
931
+ font-weight: 400;
932
+ line-height: 1.5;
933
+ color: var(--ra-body-color);
934
+ text-align: center;
935
+ text-decoration: none;
936
+ vertical-align: middle;
937
+ cursor: pointer;
938
+ user-select: none;
939
+ background-color: transparent;
940
+ border: 1px solid transparent;
941
+ padding: 0.375rem 0.75rem;
942
+ font-size: 0.85rem;
943
+ border-radius: 0.25rem;
944
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
945
+ border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
946
+ }
947
+ @media (prefers-reduced-motion: reduce) {
948
+ .btn {
949
+ transition: none;
950
+ }
951
+ }
952
+ .btn:hover {
953
+ color: var(--ra-body-color);
954
+ }
955
+ .btn-check:focus-visible + .btn,
956
+ .btn:focus-visible {
957
+ outline: 0;
958
+ box-shadow: 0 0 0 0.25rem var(--ra-focus-ring-color);
959
+ }
960
+ .btn:disabled,
961
+ .btn.disabled,
962
+ fieldset:disabled .btn {
963
+ pointer-events: none;
964
+ opacity: 0.65;
965
+ }
966
+ .btn-primary {
967
+ --ra-btn-color: var(--ra-tint-target);
968
+ --ra-btn-bg: var(--ra-primary);
969
+ --ra-btn-border: var(--ra-primary);
970
+ --ra-btn-state-target: var(--ra-shade-target);
971
+ --ra-btn-hover-border-mix: 20%;
972
+ --ra-btn-active-border-mix: 25%;
973
+ }
974
+ .btn-info {
975
+ --ra-btn-color: var(--ra-black);
976
+ --ra-btn-bg: var(--ra-info);
977
+ --ra-btn-border: var(--ra-info);
978
+ --ra-btn-state-target: var(--ra-tint-target);
979
+ --ra-btn-hover-border-mix: 10%;
980
+ --ra-btn-active-border-mix: 10%;
981
+ }
982
+ .btn-danger {
983
+ --ra-btn-color: var(--ra-tint-target);
984
+ --ra-btn-bg: var(--ra-danger);
985
+ --ra-btn-border: var(--ra-danger);
986
+ --ra-btn-state-target: var(--ra-shade-target);
987
+ --ra-btn-hover-border-mix: 20%;
988
+ --ra-btn-active-border-mix: 25%;
989
+ }
990
+ .btn-light {
991
+ --ra-btn-color: var(--ra-black);
992
+ --ra-btn-bg: var(--ra-light);
993
+ --ra-btn-border: var(--ra-light);
994
+ --ra-btn-state-target: var(--ra-tint-target);
995
+ --ra-btn-hover-border-mix: 10%;
996
+ --ra-btn-active-border-mix: 10%;
997
+ }
998
+ .btn-primary,
999
+ .btn-info,
1000
+ .btn-danger,
1001
+ .btn-light {
1002
+ color: var(--ra-btn-color);
1003
+ background-color: var(--ra-btn-bg);
1004
+ border-color: var(--ra-btn-border);
1005
+ }
1006
+ .btn-primary:hover,
1007
+ .btn-info:hover,
1008
+ .btn-danger:hover,
1009
+ .btn-light:hover {
1010
+ color: var(--ra-btn-color);
1011
+ background-color: color-mix(
1012
+ in srgb,
1013
+ var(--ra-btn-state-target) 15%,
1014
+ var(--ra-btn-bg)
1015
+ );
1016
+ border-color: color-mix(
1017
+ in srgb,
1018
+ var(--ra-btn-state-target) var(--ra-btn-hover-border-mix),
1019
+ var(--ra-btn-border)
1020
+ );
1021
+ }
1022
+ .btn-check:focus-visible + .btn-primary,
1023
+ .btn-primary:focus-visible,
1024
+ .btn-check:focus-visible + .btn-info,
1025
+ .btn-info:focus-visible,
1026
+ .btn-check:focus-visible + .btn-danger,
1027
+ .btn-danger:focus-visible,
1028
+ .btn-check:focus-visible + .btn-light,
1029
+ .btn-light:focus-visible {
1030
+ color: var(--ra-btn-color);
1031
+ background-color: color-mix(
1032
+ in srgb,
1033
+ var(--ra-btn-state-target) 15%,
1034
+ var(--ra-btn-bg)
1035
+ );
1036
+ border-color: color-mix(
1037
+ in srgb,
1038
+ var(--ra-btn-state-target) var(--ra-btn-hover-border-mix),
1039
+ var(--ra-btn-border)
1040
+ );
1041
+ box-shadow: 0 0 0 0.25rem
1042
+ color-mix(
1043
+ in srgb,
1044
+ color-mix(in srgb, var(--ra-btn-color) 15%, var(--ra-btn-bg)) 50%,
1045
+ transparent
1046
+ );
1047
+ }
1048
+ .btn-check:checked + .btn-primary,
1049
+ .btn-check:active + .btn-primary,
1050
+ .btn-primary:active,
1051
+ .btn-primary.active,
1052
+ .show > .btn-primary.dropdown-toggle,
1053
+ .btn-check:checked + .btn-info,
1054
+ .btn-check:active + .btn-info,
1055
+ .btn-info:active,
1056
+ .btn-info.active,
1057
+ .show > .btn-info.dropdown-toggle,
1058
+ .btn-check:checked + .btn-danger,
1059
+ .btn-check:active + .btn-danger,
1060
+ .btn-danger:active,
1061
+ .btn-danger.active,
1062
+ .show > .btn-danger.dropdown-toggle,
1063
+ .btn-check:checked + .btn-light,
1064
+ .btn-check:active + .btn-light,
1065
+ .btn-light:active,
1066
+ .btn-light.active,
1067
+ .show > .btn-light.dropdown-toggle {
1068
+ color: var(--ra-btn-color);
1069
+ background-color: color-mix(
1070
+ in srgb,
1071
+ var(--ra-btn-state-target) 20%,
1072
+ var(--ra-btn-bg)
1073
+ );
1074
+ border-color: color-mix(
1075
+ in srgb,
1076
+ var(--ra-btn-state-target) var(--ra-btn-active-border-mix),
1077
+ var(--ra-btn-border)
1078
+ );
1079
+ }
1080
+ .btn-check:checked + .btn-primary:focus-visible,
1081
+ .btn-check:active + .btn-primary:focus-visible,
1082
+ .btn-primary:active:focus-visible,
1083
+ .btn-primary.active:focus-visible,
1084
+ .show > .btn-primary.dropdown-toggle:focus-visible,
1085
+ .btn-check:checked + .btn-info:focus-visible,
1086
+ .btn-check:active + .btn-info:focus-visible,
1087
+ .btn-info:active:focus-visible,
1088
+ .btn-info.active:focus-visible,
1089
+ .show > .btn-info.dropdown-toggle:focus-visible,
1090
+ .btn-check:checked + .btn-danger:focus-visible,
1091
+ .btn-check:active + .btn-danger:focus-visible,
1092
+ .btn-danger:active:focus-visible,
1093
+ .btn-danger.active:focus-visible,
1094
+ .show > .btn-danger.dropdown-toggle:focus-visible,
1095
+ .btn-check:checked + .btn-light:focus-visible,
1096
+ .btn-check:active + .btn-light:focus-visible,
1097
+ .btn-light:active:focus-visible,
1098
+ .btn-light.active:focus-visible,
1099
+ .show > .btn-light.dropdown-toggle:focus-visible {
1100
+ box-shadow: 0 0 0 0.25rem
1101
+ color-mix(
1102
+ in srgb,
1103
+ color-mix(in srgb, var(--ra-btn-color) 15%, var(--ra-btn-bg)) 50%,
1104
+ transparent
1105
+ );
1106
+ }
1107
+ .btn-primary:disabled,
1108
+ .btn-primary.disabled,
1109
+ .btn-info:disabled,
1110
+ .btn-info.disabled,
1111
+ .btn-danger:disabled,
1112
+ .btn-danger.disabled,
1113
+ .btn-light:disabled,
1114
+ .btn-light.disabled {
1115
+ color: var(--ra-btn-color);
1116
+ background-color: var(--ra-btn-bg);
1117
+ border-color: var(--ra-btn-border);
1118
+ }
1119
+ /* Outline variants: hover/active fill with the variant color (white text);
1120
+ the focus ring is the variant color at 50% opacity. */
1121
+ .btn-outline-secondary {
1122
+ --ra-btn-outline-color: var(--ra-secondary);
1123
+ }
1124
+ .btn-outline-success {
1125
+ --ra-btn-outline-color: var(--ra-success);
1126
+ }
1127
+ .btn-outline-danger {
1128
+ --ra-btn-outline-color: var(--ra-danger);
1129
+ }
1130
+ .btn-outline-secondary,
1131
+ .btn-outline-success,
1132
+ .btn-outline-danger {
1133
+ color: var(--ra-btn-outline-color);
1134
+ border-color: var(--ra-btn-outline-color);
1135
+ }
1136
+ .btn-outline-secondary:hover,
1137
+ .btn-outline-success:hover,
1138
+ .btn-outline-danger:hover {
1139
+ color: var(--ra-tint-target);
1140
+ background-color: var(--ra-btn-outline-color);
1141
+ border-color: var(--ra-btn-outline-color);
1142
+ }
1143
+ .btn-check:focus-visible + .btn-outline-secondary,
1144
+ .btn-outline-secondary:focus-visible,
1145
+ .btn-check:focus-visible + .btn-outline-success,
1146
+ .btn-outline-success:focus-visible,
1147
+ .btn-check:focus-visible + .btn-outline-danger,
1148
+ .btn-outline-danger:focus-visible {
1149
+ box-shadow: 0 0 0 0.25rem
1150
+ color-mix(in srgb, var(--ra-btn-outline-color) 50%, transparent);
1151
+ }
1152
+ .btn-check:checked + .btn-outline-secondary,
1153
+ .btn-check:active + .btn-outline-secondary,
1154
+ .btn-outline-secondary:active,
1155
+ .btn-outline-secondary.active,
1156
+ .btn-outline-secondary.dropdown-toggle.show,
1157
+ .btn-check:checked + .btn-outline-success,
1158
+ .btn-check:active + .btn-outline-success,
1159
+ .btn-outline-success:active,
1160
+ .btn-outline-success.active,
1161
+ .btn-outline-success.dropdown-toggle.show,
1162
+ .btn-check:checked + .btn-outline-danger,
1163
+ .btn-check:active + .btn-outline-danger,
1164
+ .btn-outline-danger:active,
1165
+ .btn-outline-danger.active,
1166
+ .btn-outline-danger.dropdown-toggle.show {
1167
+ color: var(--ra-tint-target);
1168
+ background-color: var(--ra-btn-outline-color);
1169
+ border-color: var(--ra-btn-outline-color);
1170
+ }
1171
+ .btn-check:checked + .btn-outline-secondary:focus-visible,
1172
+ .btn-check:active + .btn-outline-secondary:focus-visible,
1173
+ .btn-outline-secondary:active:focus-visible,
1174
+ .btn-outline-secondary.active:focus-visible,
1175
+ .btn-outline-secondary.dropdown-toggle.show:focus-visible,
1176
+ .btn-check:checked + .btn-outline-success:focus-visible,
1177
+ .btn-check:active + .btn-outline-success:focus-visible,
1178
+ .btn-outline-success:active:focus-visible,
1179
+ .btn-outline-success.active:focus-visible,
1180
+ .btn-outline-success.dropdown-toggle.show:focus-visible,
1181
+ .btn-check:checked + .btn-outline-danger:focus-visible,
1182
+ .btn-check:active + .btn-outline-danger:focus-visible,
1183
+ .btn-outline-danger:active:focus-visible,
1184
+ .btn-outline-danger.active:focus-visible,
1185
+ .btn-outline-danger.dropdown-toggle.show:focus-visible {
1186
+ box-shadow: 0 0 0 0.25rem
1187
+ color-mix(in srgb, var(--ra-btn-outline-color) 50%, transparent);
1188
+ }
1189
+ .btn-outline-secondary:disabled,
1190
+ .btn-outline-secondary.disabled,
1191
+ .btn-outline-success:disabled,
1192
+ .btn-outline-success.disabled,
1193
+ .btn-outline-danger:disabled,
1194
+ .btn-outline-danger.disabled {
1195
+ color: var(--ra-btn-outline-color);
1196
+ background-color: transparent;
1197
+ }
1198
+ .btn-link {
1199
+ font-weight: 400;
1200
+ color: var(--ra-link-color);
1201
+ text-decoration: underline;
1202
+ }
1203
+ .btn-link:hover {
1204
+ color: var(--ra-link-hover-color);
1205
+ }
1206
+ .btn-link:disabled,
1207
+ .btn-link.disabled {
1208
+ color: var(--ra-gray-600);
1209
+ }
1210
+ .btn-sm {
1211
+ padding: 0.25rem 0.5rem;
1212
+ font-size: 0.74375rem;
1213
+ border-radius: 0.2rem;
1214
+ }
1215
+
1216
+ /* === Transitions and collapse =========================================== */
1217
+ .fade {
1218
+ transition: opacity 0.15s linear;
1219
+ }
1220
+ @media (prefers-reduced-motion: reduce) {
1221
+ .fade {
1222
+ transition: none;
1223
+ }
1224
+ }
1225
+ .fade:not(.show) {
1226
+ opacity: 0;
1227
+ }
1228
+ .collapse:not(.show) {
1229
+ display: none;
1230
+ }
1231
+
1232
+ /* === Dropdowns ========================================================== */
1233
+ /* Native popovers — [popover="auto"] menus toggled by [popovertarget]
1234
+ buttons: the platform owns the top layer, click-to-toggle, and
1235
+ outside-click/Escape light dismissal, so there is no display toggling here.
1236
+ The menu resets the popover UA styles (inset: 0 / margin: auto / border /
1237
+ padding / colors) back to the .dropdown-menu box, and CSS anchor
1238
+ positioning alone places it against its toggle — verified in Safari as
1239
+ well as Chromium. */
1240
+ .dropdown-toggle {
1241
+ white-space: nowrap;
1242
+ }
1243
+ .dropdown-toggle::after {
1244
+ display: inline-block;
1245
+ margin-left: 0.255em;
1246
+ vertical-align: 0.255em;
1247
+ content: "";
1248
+ border-top: 0.3em solid;
1249
+ border-right: 0.3em solid transparent;
1250
+ border-bottom: 0;
1251
+ border-left: 0.3em solid transparent;
1252
+ }
1253
+ .dropdown-toggle:empty::after {
1254
+ margin-left: 0;
1255
+ }
1256
+ /* The toggles are <button>s in nav chrome; strip the UA button box so they
1257
+ render like the nav links around them. */
1258
+ button.nav-link {
1259
+ background: none;
1260
+ border: 0;
1261
+ }
1262
+ .dropdown-menu {
1263
+ min-width: 10rem;
1264
+ padding: 0.5rem 0;
1265
+ margin: 0;
1266
+ font-size: 0.85rem;
1267
+ color: var(--ra-body-color);
1268
+ text-align: left;
1269
+ list-style: none;
1270
+ background-color: var(--ra-body-bg);
1271
+ background-clip: padding-box;
1272
+ border: 1px solid color-mix(in srgb, var(--ra-shade-target) 15%, transparent);
1273
+ border-radius: 0.25rem;
1274
+ }
1275
+ .dropdown-menu[popover] {
1276
+ inset: auto;
1277
+ }
1278
+ @supports (position-try-fallbacks: flip-block) {
1279
+ /* Anchor names must be unique per toggle/menu pair: a positioned element
1280
+ resolves a shared anchor-name to the LAST same-named anchor in the
1281
+ document, so the filter menu would attach to the bulk toggle whenever
1282
+ both toggles render on the same screen. */
1283
+ #filters_toggle {
1284
+ anchor-name: --ra-filters-toggle;
1285
+ }
1286
+ #bulk_menu_toggle {
1287
+ anchor-name: --ra-bulk-toggle;
1288
+ }
1289
+ /* Last-resort clamp for menus taller than the space below AND above (e.g.
1290
+ Field test's ~30-item filter menu): pin to the viewport bottom and let
1291
+ overflow-y scroll instead of clipping. Tried only after flip-block fails,
1292
+ so short menus and the flip-above behavior are untouched. */
1293
+ @position-try --ra-menu-clamp {
1294
+ top: anchor(bottom);
1295
+ bottom: 0.5rem;
1296
+ /* The popover UA height: fit-content keeps the content height (block-axis
1297
+ fit-content cannot shrink), so the pinned box would "overflow" and the
1298
+ try option would be rejected; auto stretches to the top/bottom gap. */
1299
+ height: auto;
1300
+ }
1301
+ .dropdown-menu[popover] {
1302
+ top: anchor(bottom);
1303
+ left: anchor(left);
1304
+ position-try-fallbacks: flip-block, --ra-menu-clamp;
1305
+ overflow-y: auto;
1306
+ }
1307
+ #filters[popover] {
1308
+ position-anchor: --ra-filters-toggle;
1309
+ }
1310
+ #bulk_menu[popover] {
1311
+ position-anchor: --ra-bulk-toggle;
1312
+ }
1313
+ .dropdown-menu-end[popover] {
1314
+ left: auto;
1315
+ right: anchor(right);
1316
+ }
1317
+ }
1318
+ .dropdown-item {
1319
+ display: block;
1320
+ width: 100%;
1321
+ padding: 0.25rem 1rem;
1322
+ clear: both;
1323
+ font-weight: 400;
1324
+ color: var(--ra-body-color);
1325
+ text-align: inherit;
1326
+ text-decoration: none;
1327
+ white-space: nowrap;
1328
+ background-color: transparent;
1329
+ border: 0;
1330
+ }
1331
+ .dropdown-item:hover,
1332
+ .dropdown-item:focus-visible {
1333
+ color: color-mix(in srgb, var(--ra-shade-target) 10%, var(--ra-gray-900));
1334
+ background-color: var(--ra-gray-200);
1335
+ }
1336
+ .dropdown-item.active,
1337
+ .dropdown-item:active {
1338
+ color: var(--ra-tint-target);
1339
+ text-decoration: none;
1340
+ background-color: var(--ra-primary);
1341
+ }
1342
+ .dropdown-item.disabled,
1343
+ .dropdown-item:disabled {
1344
+ color: var(--ra-gray-500);
1345
+ pointer-events: none;
1346
+ background-color: transparent;
1347
+ }
1348
+
1349
+ /* === Button group ======================================================= */
1350
+ .btn-group {
1351
+ position: relative;
1352
+ display: inline-flex;
1353
+ vertical-align: middle;
1354
+ }
1355
+ .btn-group > .btn {
1356
+ position: relative;
1357
+ flex: 1 1 auto;
1358
+ }
1359
+ .btn-group > .btn-check:checked + .btn,
1360
+ .btn-group > .btn-check:focus + .btn,
1361
+ .btn-group > .btn:hover,
1362
+ .btn-group > .btn:focus,
1363
+ .btn-group > .btn:active,
1364
+ .btn-group > .btn.active {
1365
+ z-index: 1;
1366
+ }
1367
+ .btn-group > .btn:not(:first-child),
1368
+ .btn-group > .btn-group:not(:first-child) {
1369
+ margin-left: -1px;
1370
+ }
1371
+ .btn-group > .btn:not(:last-child):not(.dropdown-toggle),
1372
+ .btn-group > .btn-group:not(:last-child) > .btn {
1373
+ border-top-right-radius: 0;
1374
+ border-bottom-right-radius: 0;
1375
+ }
1376
+ .btn-group > .btn:nth-child(n + 3),
1377
+ .btn-group > :not(.btn-check) + .btn,
1378
+ .btn-group > .btn-group:not(:first-child) > .btn {
1379
+ border-top-left-radius: 0;
1380
+ border-bottom-left-radius: 0;
1381
+ }
1382
+
1383
+ /* === Nav ================================================================ */
1384
+ .nav {
1385
+ display: flex;
1386
+ flex-wrap: wrap;
1387
+ padding-left: 0;
1388
+ margin-bottom: 0;
1389
+ list-style: none;
1390
+ }
1391
+ .nav-link {
1392
+ display: block;
1393
+ padding: 0.5rem 1rem;
1394
+ color: var(--ra-link-color);
1395
+ text-decoration: none;
1396
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
1397
+ border-color 0.15s ease-in-out;
1398
+ }
1399
+ @media (prefers-reduced-motion: reduce) {
1400
+ .nav-link {
1401
+ transition: none;
1402
+ }
1403
+ }
1404
+ .nav-link:hover,
1405
+ .nav-link:focus {
1406
+ color: var(--ra-link-hover-color);
1407
+ }
1408
+ .nav-link.disabled {
1409
+ color: var(--ra-gray-600);
1410
+ pointer-events: none;
1411
+ cursor: default;
1412
+ }
1413
+ .nav-tabs {
1414
+ border-bottom: 1px solid var(--ra-border-color);
1415
+ }
1416
+ .nav-tabs .nav-link {
1417
+ margin-bottom: -1px;
1418
+ background: none;
1419
+ border: 1px solid transparent;
1420
+ border-top-left-radius: 0.25rem;
1421
+ border-top-right-radius: 0.25rem;
1422
+ }
1423
+ .nav-tabs .nav-link:hover,
1424
+ .nav-tabs .nav-link:focus {
1425
+ border-color: var(--ra-gray-200) var(--ra-gray-200) var(--ra-gray-300);
1426
+ isolation: isolate;
1427
+ }
1428
+ .nav-tabs .nav-link.disabled {
1429
+ color: var(--ra-gray-600);
1430
+ background-color: transparent;
1431
+ border-color: transparent;
1432
+ }
1433
+ .nav-tabs .nav-link.active,
1434
+ .nav-tabs .nav-item.show .nav-link {
1435
+ color: var(--ra-gray-700);
1436
+ background-color: var(--ra-body-bg);
1437
+ border-color: var(--ra-gray-300) var(--ra-gray-300) var(--ra-body-bg);
1438
+ }
1439
+ .nav-tabs .dropdown-menu {
1440
+ margin-top: -1px;
1441
+ border-top-left-radius: 0;
1442
+ border-top-right-radius: 0;
1443
+ }
1444
+ .tab-content > .tab-pane {
1445
+ display: none;
1446
+ }
1447
+ .tab-content > .active {
1448
+ display: block;
1449
+ }
1450
+
1451
+ /* === Navbar ============================================================= */
1452
+ .navbar {
1453
+ /* Scheme freeze: navbar_css_classes express host intent — .navbar-light must
1454
+ stay light-looking and .navbar-dark dark-looking in BOTH page schemes. The
1455
+ skins' own ladders mix from the scheme-locked --ra-black/--ra-white, and
1456
+ pinning the subtree's used scheme keeps every other token a host may hang
1457
+ on the nav (bg-primary, bg-light, ...) resolving its light arm too. A no-op
1458
+ under the light scheme. */
1459
+ color-scheme: light;
1460
+ position: relative;
1461
+ display: flex;
1462
+ flex-wrap: wrap;
1463
+ align-items: center;
1464
+ justify-content: space-between;
1465
+ padding-top: 0.5rem;
1466
+ padding-bottom: 0.5rem;
1467
+ }
1468
+ .navbar > .container-fluid {
1469
+ display: flex;
1470
+ flex-wrap: inherit;
1471
+ align-items: center;
1472
+ justify-content: space-between;
1473
+ }
1474
+ .navbar-brand {
1475
+ padding-top: 0.340625rem;
1476
+ padding-bottom: 0.340625rem;
1477
+ margin-right: 1rem;
1478
+ font-size: 1.0625rem;
1479
+ text-decoration: none;
1480
+ white-space: nowrap;
1481
+ }
1482
+ .navbar-nav {
1483
+ display: flex;
1484
+ flex-direction: column;
1485
+ padding-left: 0;
1486
+ margin-bottom: 0;
1487
+ list-style: none;
1488
+ }
1489
+ .navbar-nav .nav-link {
1490
+ padding-right: 0;
1491
+ padding-left: 0;
1492
+ }
1493
+ .navbar-nav .dropdown-menu {
1494
+ position: static;
1495
+ }
1496
+ .navbar-collapse {
1497
+ flex-basis: 100%;
1498
+ flex-grow: 1;
1499
+ align-items: center;
1500
+ }
1501
+ .navbar-toggler {
1502
+ padding: 0.25rem 0.75rem;
1503
+ font-size: 1.0625rem;
1504
+ line-height: 1;
1505
+ background-color: transparent;
1506
+ border: 1px solid transparent;
1507
+ border-radius: 0.25rem;
1508
+ transition: box-shadow 0.15s ease-in-out;
1509
+ }
1510
+ @media (prefers-reduced-motion: reduce) {
1511
+ .navbar-toggler {
1512
+ transition: none;
1513
+ }
1514
+ }
1515
+ .navbar-toggler:hover {
1516
+ text-decoration: none;
1517
+ }
1518
+ .navbar-toggler:focus {
1519
+ text-decoration: none;
1520
+ outline: 0;
1521
+ box-shadow: 0 0 0 0.25rem;
1522
+ }
1523
+ /* The hamburger paints as background-color through an alpha mask (the same
1524
+ three-bar SVG shape, without a baked-in color), so it follows the toggler's
1525
+ currentColor: the .navbar-light/.navbar-dark toggler colors are 55%-alpha
1526
+ black/white, matching what each per-skin data-URI would render, so the
1527
+ per-skin image rules are redundant. The mask stroke is opaque; all
1528
+ translucency comes from the color. */
1529
+ .navbar-toggler-icon {
1530
+ display: inline-block;
1531
+ width: 1.5em;
1532
+ height: 1.5em;
1533
+ vertical-align: middle;
1534
+ background-color: currentColor;
1535
+ mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23000' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
1536
+ mask-repeat: no-repeat;
1537
+ mask-position: center;
1538
+ mask-size: 100%;
1539
+ }
1540
+ @media (min-width: 768px) {
1541
+ .navbar-expand-md {
1542
+ flex-wrap: nowrap;
1543
+ justify-content: flex-start;
1544
+ }
1545
+ .navbar-expand-md .navbar-nav {
1546
+ flex-direction: row;
1547
+ }
1548
+ .navbar-expand-md .navbar-nav .dropdown-menu {
1549
+ position: absolute;
1550
+ }
1551
+ .navbar-expand-md .navbar-nav .nav-link {
1552
+ padding-right: 0.5rem;
1553
+ padding-left: 0.5rem;
1554
+ }
1555
+ .navbar-expand-md .navbar-nav-scroll {
1556
+ overflow: visible;
1557
+ }
1558
+ .navbar-expand-md .navbar-collapse {
1559
+ display: flex !important;
1560
+ flex-basis: auto;
1561
+ }
1562
+ .navbar-expand-md .navbar-toggler {
1563
+ display: none;
1564
+ }
1565
+ }
1566
+ .navbar-light .navbar-brand {
1567
+ color: color-mix(in srgb, var(--ra-black) 90%, transparent);
1568
+ }
1569
+ .navbar-light .navbar-brand:hover,
1570
+ .navbar-light .navbar-brand:focus {
1571
+ color: color-mix(in srgb, var(--ra-black) 90%, transparent);
1572
+ }
1573
+ .navbar-light .navbar-nav .nav-link {
1574
+ color: color-mix(in srgb, var(--ra-black) 55%, transparent);
1575
+ }
1576
+ .navbar-light .navbar-nav .nav-link:hover,
1577
+ .navbar-light .navbar-nav .nav-link:focus {
1578
+ color: color-mix(in srgb, var(--ra-black) 70%, transparent);
1579
+ }
1580
+ .navbar-light .navbar-nav .nav-link.disabled {
1581
+ color: color-mix(in srgb, var(--ra-black) 30%, transparent);
1582
+ }
1583
+ .navbar-light .navbar-nav .show > .nav-link,
1584
+ .navbar-light .navbar-nav .nav-link.active {
1585
+ color: color-mix(in srgb, var(--ra-black) 90%, transparent);
1586
+ }
1587
+ .navbar-light .navbar-toggler {
1588
+ color: color-mix(in srgb, var(--ra-black) 55%, transparent);
1589
+ border-color: color-mix(in srgb, var(--ra-black) 10%, transparent);
1590
+ }
1591
+ .navbar-light .navbar-text {
1592
+ color: color-mix(in srgb, var(--ra-black) 55%, transparent);
1593
+ }
1594
+ .navbar-light .navbar-text a,
1595
+ .navbar-light .navbar-text a:hover,
1596
+ .navbar-light .navbar-text a:focus {
1597
+ color: color-mix(in srgb, var(--ra-black) 90%, transparent);
1598
+ }
1599
+ .navbar-dark .navbar-brand {
1600
+ color: var(--ra-white);
1601
+ }
1602
+ .navbar-dark .navbar-brand:hover,
1603
+ .navbar-dark .navbar-brand:focus {
1604
+ color: var(--ra-white);
1605
+ }
1606
+ .navbar-dark .navbar-nav .nav-link {
1607
+ color: color-mix(in srgb, var(--ra-white) 55%, transparent);
1608
+ }
1609
+ .navbar-dark .navbar-nav .nav-link:hover,
1610
+ .navbar-dark .navbar-nav .nav-link:focus {
1611
+ color: color-mix(in srgb, var(--ra-white) 75%, transparent);
1612
+ }
1613
+ .navbar-dark .navbar-nav .nav-link.disabled {
1614
+ color: color-mix(in srgb, var(--ra-white) 25%, transparent);
1615
+ }
1616
+ .navbar-dark .navbar-nav .show > .nav-link,
1617
+ .navbar-dark .navbar-nav .nav-link.active {
1618
+ color: var(--ra-white);
1619
+ }
1620
+ .navbar-dark .navbar-toggler {
1621
+ color: color-mix(in srgb, var(--ra-white) 55%, transparent);
1622
+ border-color: color-mix(in srgb, var(--ra-white) 10%, transparent);
1623
+ }
1624
+ .navbar-dark .navbar-text {
1625
+ color: color-mix(in srgb, var(--ra-white) 55%, transparent);
1626
+ }
1627
+ .navbar-dark .navbar-text a,
1628
+ .navbar-dark .navbar-text a:hover,
1629
+ .navbar-dark .navbar-text a:focus {
1630
+ color: var(--ra-white);
1631
+ }
1632
+
1633
+ /* === Card =============================================================== */
1634
+ .card {
1635
+ position: relative;
1636
+ display: flex;
1637
+ flex-direction: column;
1638
+ min-width: 0;
1639
+ word-wrap: break-word;
1640
+ background-color: var(--ra-body-bg);
1641
+ background-clip: border-box;
1642
+ border: 1px solid
1643
+ color-mix(in srgb, var(--ra-shade-target) 12.5%, transparent);
1644
+ border-radius: 0.25rem;
1645
+ }
1646
+ .card > hr {
1647
+ margin-right: 0;
1648
+ margin-left: 0;
1649
+ }
1650
+ .card > .list-group {
1651
+ border-top: inherit;
1652
+ border-bottom: inherit;
1653
+ }
1654
+ .card > .list-group:first-child {
1655
+ border-top-width: 0;
1656
+ border-top-left-radius: calc(0.25rem - 1px);
1657
+ border-top-right-radius: calc(0.25rem - 1px);
1658
+ }
1659
+ .card > .list-group:last-child {
1660
+ border-bottom-width: 0;
1661
+ border-bottom-right-radius: calc(0.25rem - 1px);
1662
+ border-bottom-left-radius: calc(0.25rem - 1px);
1663
+ }
1664
+ .card > .card-header + .list-group {
1665
+ border-top: 0;
1666
+ }
1667
+ .card-body {
1668
+ flex: 1 1 auto;
1669
+ padding: 1rem 1rem;
1670
+ }
1671
+ .card-header {
1672
+ padding: 0.5rem 1rem;
1673
+ margin-bottom: 0;
1674
+ background-color: color-mix(in srgb, var(--ra-shade-target) 3%, transparent);
1675
+ border-bottom: 1px solid
1676
+ color-mix(in srgb, var(--ra-shade-target) 12.5%, transparent);
1677
+ }
1678
+ .card-header:first-child {
1679
+ border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
1680
+ }
1681
+
1682
+ /* === Breadcrumb ========================================================= */
1683
+ .breadcrumb {
1684
+ display: flex;
1685
+ flex-wrap: wrap;
1686
+ padding: 0 0;
1687
+ margin-bottom: 1rem;
1688
+ list-style: none;
1689
+ }
1690
+ .breadcrumb-item + .breadcrumb-item {
1691
+ padding-left: 0.5rem;
1692
+ }
1693
+ .breadcrumb-item + .breadcrumb-item::before {
1694
+ float: left;
1695
+ padding-right: 0.5rem;
1696
+ color: var(--ra-gray-600);
1697
+ content: var(
1698
+ --ra-breadcrumb-divider,
1699
+ "/"
1700
+ ); /* rtl: var(--ra-breadcrumb-divider, "/") */
1701
+ }
1702
+ .breadcrumb-item.active {
1703
+ color: var(--ra-gray-600);
1704
+ }
1705
+
1706
+ /* === Pagination ========================================================= */
1707
+ .pagination {
1708
+ display: flex;
1709
+ padding-left: 0;
1710
+ list-style: none;
1711
+ }
1712
+ .page-link {
1713
+ position: relative;
1714
+ display: block;
1715
+ color: var(--ra-link-color);
1716
+ text-decoration: none;
1717
+ background-color: var(--ra-body-bg);
1718
+ border: 1px solid var(--ra-border-color);
1719
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
1720
+ border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
1721
+ }
1722
+ @media (prefers-reduced-motion: reduce) {
1723
+ .page-link {
1724
+ transition: none;
1725
+ }
1726
+ }
1727
+ .page-link:hover {
1728
+ z-index: 2;
1729
+ color: var(--ra-link-hover-color);
1730
+ background-color: var(--ra-gray-200);
1731
+ border-color: var(--ra-border-color);
1732
+ }
1733
+ .page-link:focus-visible {
1734
+ z-index: 3;
1735
+ color: var(--ra-link-hover-color);
1736
+ background-color: var(--ra-gray-200);
1737
+ outline: 0;
1738
+ box-shadow: 0 0 0 0.25rem var(--ra-focus-ring-color);
1739
+ }
1740
+ .page-item:not(:first-child) .page-link {
1741
+ margin-left: -1px;
1742
+ }
1743
+ .page-item.active .page-link {
1744
+ z-index: 3;
1745
+ color: var(--ra-tint-target);
1746
+ background-color: var(--ra-primary);
1747
+ border-color: var(--ra-primary);
1748
+ }
1749
+ .page-item.disabled .page-link {
1750
+ color: var(--ra-gray-600);
1751
+ pointer-events: none;
1752
+ background-color: var(--ra-body-bg);
1753
+ border-color: var(--ra-border-color);
1754
+ }
1755
+ .page-link {
1756
+ padding: 0.375rem 0.75rem;
1757
+ }
1758
+ .page-item:first-child .page-link {
1759
+ border-top-left-radius: 0.25rem;
1760
+ border-bottom-left-radius: 0.25rem;
1761
+ }
1762
+ .page-item:last-child .page-link {
1763
+ border-top-right-radius: 0.25rem;
1764
+ border-bottom-right-radius: 0.25rem;
1765
+ }
1766
+
1767
+ /* === Badge ============================================================== */
1768
+ .badge {
1769
+ display: inline-block;
1770
+ padding: 0.35em 0.65em;
1771
+ font-size: 0.75em;
1772
+ font-weight: 700;
1773
+ line-height: 1;
1774
+ /* white in light, black in dark — AA on the lightened dark
1775
+ bg-* fills */
1776
+ color: var(--ra-tint-target);
1777
+ text-align: center;
1778
+ white-space: nowrap;
1779
+ vertical-align: baseline;
1780
+ border-radius: 0.25rem;
1781
+ }
1782
+ .badge:empty {
1783
+ display: none;
1784
+ }
1785
+ .btn .badge {
1786
+ position: relative;
1787
+ top: -1px;
1788
+ }
1789
+
1790
+ /* === Alerts ============================================================= */
1791
+ .alert {
1792
+ position: relative;
1793
+ padding: 1rem 1rem;
1794
+ margin-bottom: 1rem;
1795
+ border: 1px solid transparent;
1796
+ border-radius: 0.25rem;
1797
+ }
1798
+ .alert-heading {
1799
+ color: inherit;
1800
+ }
1801
+ .alert-link {
1802
+ font-weight: 700;
1803
+ }
1804
+ .alert-dismissible {
1805
+ padding-right: 3rem;
1806
+ }
1807
+ .alert-dismissible .btn-close {
1808
+ position: absolute;
1809
+ top: 0;
1810
+ right: 0;
1811
+ z-index: 2;
1812
+ padding: 1.25rem 1rem;
1813
+ }
1814
+ /* Variants set the theme color they tint from plus how far the text color is
1815
+ shaded; the grouped rules derive bg (tint 80%) and border (tint 70%) per
1816
+ Bootstrap 5.1.3's alert-variant(). The text is shaded 40% — or 60% for the
1817
+ variants (info/warning/light) whose 40% shade failed Bootstrap's contrast
1818
+ check and fell back to mix($color, black, 40%). Links shade the text 20%
1819
+ further. */
1820
+ .alert-primary {
1821
+ --ra-alert-base: var(--ra-primary);
1822
+ --ra-alert-color-mix: 40%;
1823
+ }
1824
+ .alert-secondary {
1825
+ --ra-alert-base: var(--ra-secondary);
1826
+ --ra-alert-color-mix: 40%;
1827
+ }
1828
+ .alert-success {
1829
+ --ra-alert-base: var(--ra-success);
1830
+ --ra-alert-color-mix: 40%;
1831
+ }
1832
+ .alert-info {
1833
+ --ra-alert-base: var(--ra-info);
1834
+ --ra-alert-color-mix: 60%;
1835
+ }
1836
+ .alert-warning {
1837
+ --ra-alert-base: var(--ra-warning);
1838
+ --ra-alert-color-mix: 60%;
1839
+ }
1840
+ .alert-danger {
1841
+ --ra-alert-base: var(--ra-danger);
1842
+ --ra-alert-color-mix: 40%;
1843
+ }
1844
+ .alert-light {
1845
+ --ra-alert-base: var(--ra-light);
1846
+ --ra-alert-color-mix: 60%;
1847
+ }
1848
+ .alert-dark {
1849
+ --ra-alert-base: var(--ra-dark);
1850
+ --ra-alert-color-mix: 40%;
1851
+ }
1852
+ .alert-primary,
1853
+ .alert-secondary,
1854
+ .alert-success,
1855
+ .alert-info,
1856
+ .alert-warning,
1857
+ .alert-danger,
1858
+ .alert-light,
1859
+ .alert-dark {
1860
+ --ra-alert-color: color-mix(
1861
+ in srgb,
1862
+ var(--ra-shade-target) var(--ra-alert-color-mix),
1863
+ var(--ra-alert-base)
1864
+ );
1865
+ color: var(--ra-alert-color);
1866
+ background-color: color-mix(
1867
+ in srgb,
1868
+ var(--ra-tint-target) 80%,
1869
+ var(--ra-alert-base)
1870
+ );
1871
+ border-color: color-mix(
1872
+ in srgb,
1873
+ var(--ra-tint-target) 70%,
1874
+ var(--ra-alert-base)
1875
+ );
1876
+ }
1877
+ .alert-primary .alert-link,
1878
+ .alert-secondary .alert-link,
1879
+ .alert-success .alert-link,
1880
+ .alert-info .alert-link,
1881
+ .alert-warning .alert-link,
1882
+ .alert-danger .alert-link,
1883
+ .alert-light .alert-link,
1884
+ .alert-dark .alert-link {
1885
+ color: color-mix(in srgb, var(--ra-shade-target) 20%, var(--ra-alert-color));
1886
+ }
1887
+
1888
+ /* === Progress =========================================================== */
1889
+ @keyframes progress-bar-stripes {
1890
+ 0% {
1891
+ background-position-x: 1rem;
1892
+ }
1893
+ }
1894
+ .progress {
1895
+ display: flex;
1896
+ height: 1rem;
1897
+ overflow: hidden;
1898
+ font-size: 0.6375rem;
1899
+ background-color: var(--ra-gray-200);
1900
+ border-radius: 0.25rem;
1901
+ }
1902
+ .progress-bar {
1903
+ display: flex;
1904
+ flex-direction: column;
1905
+ justify-content: center;
1906
+ overflow: hidden;
1907
+ color: var(--ra-tint-target);
1908
+ text-align: center;
1909
+ white-space: nowrap;
1910
+ background-color: var(--ra-primary);
1911
+ transition: width 0.6s ease;
1912
+ }
1913
+ @media (prefers-reduced-motion: reduce) {
1914
+ .progress-bar {
1915
+ transition: none;
1916
+ }
1917
+ }
1918
+ .progress-bar-striped {
1919
+ background-image: linear-gradient(
1920
+ 45deg,
1921
+ color-mix(in srgb, var(--ra-white) 15%, transparent) 25%,
1922
+ transparent 25%,
1923
+ transparent 50%,
1924
+ color-mix(in srgb, var(--ra-white) 15%, transparent) 50%,
1925
+ color-mix(in srgb, var(--ra-white) 15%, transparent) 75%,
1926
+ transparent 75%,
1927
+ transparent
1928
+ );
1929
+ background-size: 1rem 1rem;
1930
+ }
1931
+ .progress-bar-animated {
1932
+ animation: 1s linear infinite progress-bar-stripes;
1933
+ }
1934
+ @media (prefers-reduced-motion: reduce) {
1935
+ .progress-bar-animated {
1936
+ animation: none;
1937
+ }
1938
+ }
1939
+
1940
+ /* === List group ========================================================= */
1941
+ .list-group {
1942
+ display: flex;
1943
+ flex-direction: column;
1944
+ padding-left: 0;
1945
+ margin-bottom: 0;
1946
+ border-radius: 0.25rem;
1947
+ }
1948
+ .list-group-item {
1949
+ position: relative;
1950
+ display: block;
1951
+ padding: 0.5rem 1rem;
1952
+ color: var(--ra-body-color);
1953
+ text-decoration: none;
1954
+ background-color: var(--ra-body-bg);
1955
+ border: 1px solid
1956
+ color-mix(in srgb, var(--ra-shade-target) 12.5%, transparent);
1957
+ }
1958
+ .list-group-item:first-child {
1959
+ border-top-left-radius: inherit;
1960
+ border-top-right-radius: inherit;
1961
+ }
1962
+ .list-group-item:last-child {
1963
+ border-bottom-right-radius: inherit;
1964
+ border-bottom-left-radius: inherit;
1965
+ }
1966
+ .list-group-item.disabled,
1967
+ .list-group-item:disabled {
1968
+ color: var(--ra-gray-600);
1969
+ pointer-events: none;
1970
+ background-color: var(--ra-body-bg);
1971
+ }
1972
+ .list-group-item.active {
1973
+ z-index: 2;
1974
+ color: var(--ra-tint-target);
1975
+ background-color: var(--ra-primary);
1976
+ border-color: var(--ra-primary);
1977
+ }
1978
+ .list-group-item + .list-group-item {
1979
+ border-top-width: 0;
1980
+ }
1981
+ .list-group-item + .list-group-item.active {
1982
+ margin-top: -1px;
1983
+ border-top-width: 1px;
1984
+ }
1985
+
1986
+ /* === Close button ======================================================= */
1987
+ /* The X paints as background-color through an alpha mask (Bootstrap 5.1.3's
1988
+ background-image SVG path), so it follows --ra-icon-close — pure black in
1989
+ light, white in dark. The mask lives on a pseudo-element: masking the
1990
+ button itself would clip its focus-ring box-shadow. The 1em-square
1991
+ ::before is the button's content box, which is where a padding-box-centered
1992
+ 1em image would land (the padding is symmetric), so light geometry is
1993
+ unchanged. */
1994
+ .btn-close {
1995
+ box-sizing: content-box;
1996
+ width: 1em;
1997
+ height: 1em;
1998
+ padding: 0.25em 0.25em;
1999
+ color: var(--ra-icon-close);
2000
+ background: transparent;
2001
+ border: 0;
2002
+ border-radius: 0.25rem;
2003
+ opacity: 0.5;
2004
+ }
2005
+ .btn-close::before {
2006
+ content: "";
2007
+ display: block;
2008
+ width: 1em;
2009
+ height: 1em;
2010
+ background-color: currentColor;
2011
+ mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e");
2012
+ mask-repeat: no-repeat;
2013
+ mask-position: center;
2014
+ mask-size: 1em auto;
2015
+ }
2016
+ .btn-close:hover {
2017
+ color: var(--ra-icon-close);
2018
+ text-decoration: none;
2019
+ opacity: 0.75;
2020
+ }
2021
+ .btn-close:focus-visible {
2022
+ outline: 0;
2023
+ box-shadow: 0 0 0 0.25rem var(--ra-focus-ring-color);
2024
+ opacity: 1;
2025
+ }
2026
+ .btn-close:disabled,
2027
+ .btn-close.disabled {
2028
+ pointer-events: none;
2029
+ user-select: none;
2030
+ opacity: 0.25;
2031
+ }
2032
+
2033
+ /* === Modal ============================================================== */
2034
+ /* Native <dialog> — the platform owns the top layer, focus trap, Escape and
2035
+ (via closedby="any") backdrop light-dismissal; CSS supplies the box
2036
+ metrics, the backdrop tint, the entry transition, and the body scroll
2037
+ lock. */
2038
+ dialog#modal {
2039
+ width: calc(100% - 1rem);
2040
+ max-height: calc(100vh - 3.5rem);
2041
+ padding: 0;
2042
+ margin: 0.5rem auto auto;
2043
+ color: inherit;
2044
+ background-color: var(--ra-body-bg);
2045
+ background-clip: padding-box;
2046
+ border: 1px solid color-mix(in srgb, var(--ra-shade-target) 20%, transparent);
2047
+ border-radius: 0.3rem;
2048
+ outline: 0;
2049
+ }
2050
+ dialog#modal[open] {
2051
+ display: flex;
2052
+ flex-direction: column;
2053
+ opacity: 1;
2054
+ transform: none;
2055
+ transition: opacity 0.15s linear, transform 0.3s ease-out,
2056
+ overlay 0.3s ease-out allow-discrete, display 0.3s ease-out allow-discrete;
2057
+ }
2058
+ dialog#modal::backdrop {
2059
+ background-color: color-mix(in srgb, var(--ra-black) 50%, transparent);
2060
+ transition: background-color 0.15s linear;
2061
+ }
2062
+ @starting-style {
2063
+ dialog#modal[open] {
2064
+ opacity: 0;
2065
+ transform: translate(0, -50px);
2066
+ }
2067
+ dialog#modal[open]::backdrop {
2068
+ background-color: transparent;
2069
+ }
2070
+ }
2071
+ @media (prefers-reduced-motion: reduce) {
2072
+ dialog#modal[open],
2073
+ dialog#modal::backdrop {
2074
+ transition: none;
2075
+ }
2076
+ }
2077
+ /* Native <dialog> leaves page scroll unlocked; lock it while any dialog is open. */
2078
+ body:has(dialog[open]) {
2079
+ overflow: hidden;
2080
+ }
2081
+ .modal-header {
2082
+ display: flex;
2083
+ flex-shrink: 0;
2084
+ align-items: center;
2085
+ justify-content: space-between;
2086
+ padding: 1rem 1rem;
2087
+ border-bottom: 1px solid var(--ra-border-color);
2088
+ border-top-left-radius: calc(0.3rem - 1px);
2089
+ border-top-right-radius: calc(0.3rem - 1px);
2090
+ }
2091
+ .modal-header .btn-close {
2092
+ padding: 0.5rem 0.5rem;
2093
+ margin: -0.5rem -0.5rem -0.5rem auto;
2094
+ }
2095
+ .modal-body {
2096
+ position: relative;
2097
+ flex: 1 1 auto;
2098
+ padding: 1rem;
2099
+ overflow-y: auto;
2100
+ }
2101
+ .modal-footer {
2102
+ display: flex;
2103
+ flex-wrap: wrap;
2104
+ flex-shrink: 0;
2105
+ align-items: center;
2106
+ justify-content: flex-end;
2107
+ padding: 0.75rem;
2108
+ border-top: 1px solid var(--ra-border-color);
2109
+ border-bottom-right-radius: calc(0.3rem - 1px);
2110
+ border-bottom-left-radius: calc(0.3rem - 1px);
2111
+ }
2112
+ .modal-footer > * {
2113
+ margin: 0.25rem;
2114
+ }
2115
+ @media (min-width: 576px) {
2116
+ dialog#modal {
2117
+ max-width: 500px;
2118
+ margin-top: 1.75rem;
2119
+ }
2120
+ }
2121
+ @media (min-width: 992px) {
2122
+ dialog#modal {
2123
+ max-width: 800px;
2124
+ }
2125
+ }
2126
+
2127
+ /* === Helpers ============================================================ */
2128
+ .clearfix::after {
2129
+ display: block;
2130
+ clear: both;
2131
+ content: "";
2132
+ }
2133
+ .fixed-top {
2134
+ position: fixed;
2135
+ top: 0;
2136
+ right: 0;
2137
+ left: 0;
2138
+ z-index: 1030;
2139
+ }
2140
+ .visually-hidden {
2141
+ position: absolute !important;
2142
+ width: 1px !important;
2143
+ height: 1px !important;
2144
+ padding: 0 !important;
2145
+ margin: -1px !important;
2146
+ overflow: hidden !important;
2147
+ clip: rect(0, 0, 0, 0) !important;
2148
+ white-space: nowrap !important;
2149
+ border: 0 !important;
2150
+ }
2151
+
2152
+ /* === Utilities ========================================================== */
2153
+ .d-inline {
2154
+ display: inline !important;
2155
+ }
2156
+ .d-inline-block {
2157
+ display: inline-block !important;
2158
+ }
2159
+ .border-0 {
2160
+ border: 0 !important;
2161
+ }
2162
+ .border-bottom {
2163
+ border-bottom: 1px solid var(--ra-border-color) !important;
2164
+ }
2165
+ .w-50 {
2166
+ width: 50% !important;
2167
+ }
2168
+ .flex-column {
2169
+ flex-direction: column !important;
2170
+ }
2171
+ .flex-wrap {
2172
+ flex-wrap: wrap !important;
2173
+ }
2174
+ .flex-nowrap {
2175
+ flex-wrap: nowrap !important;
2176
+ }
2177
+ .justify-content-end {
2178
+ justify-content: flex-end !important;
2179
+ }
2180
+ .align-items-center {
2181
+ align-items: center !important;
2182
+ }
2183
+ .m-2 {
2184
+ margin: 0.5rem !important;
2185
+ }
2186
+ .my-1 {
2187
+ margin-top: 0.25rem !important;
2188
+ margin-bottom: 0.25rem !important;
2189
+ }
2190
+ .my-2 {
2191
+ margin-top: 0.5rem !important;
2192
+ margin-bottom: 0.5rem !important;
2193
+ }
2194
+ .my-3 {
2195
+ margin-top: 1rem !important;
2196
+ margin-bottom: 1rem !important;
2197
+ }
2198
+ .mt-2 {
2199
+ margin-top: 0.5rem !important;
2200
+ }
2201
+ .mb-1 {
2202
+ margin-bottom: 0.25rem !important;
2203
+ }
2204
+ .mb-2 {
2205
+ margin-bottom: 0.5rem !important;
2206
+ }
2207
+ .mb-3 {
2208
+ margin-bottom: 1rem !important;
2209
+ }
2210
+ .ms-2 {
2211
+ margin-left: 0.5rem !important;
2212
+ }
2213
+ .ms-auto {
2214
+ margin-left: auto !important;
2215
+ }
2216
+ .p-0 {
2217
+ padding: 0 !important;
2218
+ }
2219
+ .p-2 {
2220
+ padding: 0.5rem !important;
2221
+ }
2222
+ .p-3 {
2223
+ padding: 1rem !important;
2224
+ }
2225
+ .py-2 {
2226
+ padding-top: 0.5rem !important;
2227
+ padding-bottom: 0.5rem !important;
2228
+ }
2229
+ .pb-1 {
2230
+ padding-bottom: 0.25rem !important;
2231
+ }
2232
+ .fw-normal {
2233
+ font-weight: 400 !important;
2234
+ }
2235
+ .text-end {
2236
+ text-align: right !important;
2237
+ }
2238
+ /* Color/background utilities derive their translucency by mixing the semantic
2239
+ token toward transparent directly, with no separate rgb channel triplet.
2240
+ The opacity knobs are percentages: --ra-bg-opacity / --ra-text-opacity. */
2241
+ .text-danger {
2242
+ --ra-text-opacity: 100%;
2243
+ color: color-mix(
2244
+ in srgb,
2245
+ var(--ra-danger) var(--ra-text-opacity),
2246
+ transparent
2247
+ ) !important;
2248
+ }
2249
+ .bg-primary {
2250
+ --ra-bg-opacity: 100%;
2251
+ background-color: color-mix(
2252
+ in srgb,
2253
+ var(--ra-primary) var(--ra-bg-opacity),
2254
+ transparent
2255
+ ) !important;
2256
+ }
2257
+ .bg-secondary {
2258
+ --ra-bg-opacity: 100%;
2259
+ background-color: color-mix(
2260
+ in srgb,
2261
+ var(--ra-secondary) var(--ra-bg-opacity),
2262
+ transparent
2263
+ ) !important;
2264
+ }
2265
+ .bg-success {
2266
+ --ra-bg-opacity: 100%;
2267
+ background-color: color-mix(
2268
+ in srgb,
2269
+ var(--ra-success) var(--ra-bg-opacity),
2270
+ transparent
2271
+ ) !important;
2272
+ }
2273
+ .bg-info {
2274
+ --ra-bg-opacity: 100%;
2275
+ background-color: color-mix(
2276
+ in srgb,
2277
+ var(--ra-info) var(--ra-bg-opacity),
2278
+ transparent
2279
+ ) !important;
2280
+ }
2281
+ .bg-warning {
2282
+ --ra-bg-opacity: 100%;
2283
+ background-color: color-mix(
2284
+ in srgb,
2285
+ var(--ra-warning) var(--ra-bg-opacity),
2286
+ transparent
2287
+ ) !important;
2288
+ }
2289
+ .bg-danger {
2290
+ --ra-bg-opacity: 100%;
2291
+ background-color: color-mix(
2292
+ in srgb,
2293
+ var(--ra-danger) var(--ra-bg-opacity),
2294
+ transparent
2295
+ ) !important;
2296
+ }
2297
+ /* .bg-light maps to the semantic muted surface (sidebar, filter cards, show
2298
+ card headers) so those surfaces follow the scheme. Its light arm equals
2299
+ --ra-light, which itself stays a scheme-locked absolute for
2300
+ btn-light/table-light/alert-light. */
2301
+ .bg-light {
2302
+ --ra-bg-opacity: 100%;
2303
+ background-color: color-mix(
2304
+ in srgb,
2305
+ var(--ra-surface-muted) var(--ra-bg-opacity),
2306
+ transparent
2307
+ ) !important;
2308
+ }
2309
+ .bg-dark {
2310
+ --ra-bg-opacity: 100%;
2311
+ background-color: color-mix(
2312
+ in srgb,
2313
+ var(--ra-dark) var(--ra-bg-opacity),
2314
+ transparent
2315
+ ) !important;
2316
+ }
2317
+ .bg-black {
2318
+ --ra-bg-opacity: 100%;
2319
+ background-color: color-mix(
2320
+ in srgb,
2321
+ var(--ra-black) var(--ra-bg-opacity),
2322
+ transparent
2323
+ ) !important;
2324
+ }
2325
+ .bg-white {
2326
+ --ra-bg-opacity: 100%;
2327
+ background-color: color-mix(
2328
+ in srgb,
2329
+ var(--ra-white) var(--ra-bg-opacity),
2330
+ transparent
2331
+ ) !important;
2332
+ }
2333
+ .bg-body {
2334
+ --ra-bg-opacity: 100%;
2335
+ background-color: color-mix(
2336
+ in srgb,
2337
+ var(--ra-body-bg) var(--ra-bg-opacity),
2338
+ transparent
2339
+ ) !important;
2340
+ }
2341
+ .bg-transparent {
2342
+ --ra-bg-opacity: 100%;
2343
+ background-color: transparent !important;
2344
+ }
2345
+ .bg-opacity-10 {
2346
+ --ra-bg-opacity: 10%;
2347
+ }
2348
+ .bg-opacity-25 {
2349
+ --ra-bg-opacity: 25%;
2350
+ }
2351
+ .bg-opacity-50 {
2352
+ --ra-bg-opacity: 50%;
2353
+ }
2354
+ .bg-opacity-75 {
2355
+ --ra-bg-opacity: 75%;
2356
+ }
2357
+ .bg-opacity-100 {
2358
+ --ra-bg-opacity: 100%;
2359
+ }
2360
+ .bg-gradient {
2361
+ background-image: var(--ra-gradient) !important;
2362
+ }
2363
+ .rounded {
2364
+ border-radius: 0.25rem !important;
2365
+ }
2366
+
2367
+ /* === Utilities: md (>= 768px) =========================================== */
2368
+ @media (min-width: 768px) {
2369
+ .mt-md-0 {
2370
+ margin-top: 0 !important;
2371
+ }
2372
+ .text-md-end {
2373
+ text-align: right !important;
2374
+ }
2375
+ }