administratum 0.3.0 → 0.4.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.
- checksums.yaml +4 -4
- data/DESIGN.md +1 -0
- data/README.md +25 -1
- data/app/assets/builds/administratum.css +1 -1
- data/app/assets/tailwind/administratum/components.css +12 -0
- data/app/helpers/administratum/resource_helper.rb +44 -5
- data/app/views/administratum/resources/edit.html.erb +3 -1
- data/app/views/administratum/resources/index.html.erb +4 -2
- data/app/views/administratum/resources/new.html.erb +3 -1
- data/app/views/administratum/resources/show.html.erb +3 -1
- data/lib/administratum/definition.rb +26 -5
- data/lib/administratum/dsl.rb +21 -0
- data/lib/administratum/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: afdcb241448cb659281eb3e38c1d8a3a812cd706cb1a9e957c8f3f00bb75ee42
|
|
4
|
+
data.tar.gz: d28ae61196c80497d0b84a828753bb5b1fe1df0ce2aa70e81a91ec273d8741bf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c0addf08a68ad56884493489f1679a3d97297f16f4b6a14578ad668a95c804f4d29fa19616090ce64e8cc8a3ac4bd6c6c56f948435254968c33ffbb731f280b8
|
|
7
|
+
data.tar.gz: 7edd174c8c5afa2d6f8dffb8c6f6f9f1d40bb3a47263b61b48247bbb7e8aeddd22d229381e1fbfbf25699968e1ba315ea73ad9647d79df6ee4bd350fb5a91c91
|
data/DESIGN.md
CHANGED
|
@@ -51,6 +51,7 @@ Overrides, in order of precedence:
|
|
|
51
51
|
| Buttons | `adm-btn` plus one of `adm-btn-primary`, `-secondary`, `-danger`, `-ghost`; sizes `adm-btn-sm`, `adm-btn-block`; `adm-btn-group`, `adm-icon-btn`, `adm-link` |
|
|
52
52
|
| Tables | `adm-table-wrap`, `adm-table`, `adm-table-actions`, `adm-table-footer`, `adm-empty`, `adm-pagy` |
|
|
53
53
|
| Show page | `adm-attributes`, `adm-attribute` |
|
|
54
|
+
| Aside menus | `adm-with-aside`, `adm-with-aside-main`, `adm-aside`, `adm-menu`, `adm-menu-form`, `adm-menu-item`, `adm-menu-item-primary`, `adm-menu-item-danger` (rendered by `with_asides`) |
|
|
54
55
|
| Forms | `adm-form`, `adm-field`, `adm-field-horizontal`, `adm-field-control`, `adm-label`, `adm-input`, `adm-checkbox`, `adm-check`, `adm-hint`, `adm-error`, `adm-form-footer` |
|
|
55
56
|
| Feedback | `adm-alert` (see below), `adm-badge` (see below), `adm-flash`, `adm-flash-notice`, `adm-flash-alert` |
|
|
56
57
|
| Searchable select | `adm-combobox`, `adm-combobox-input`, `adm-combobox-listbox`, `adm-combobox-group`, `adm-combobox-option`, `adm-combobox-option-active`, `adm-combobox-empty` (built by `administratum.js`) |
|
data/README.md
CHANGED
|
@@ -250,7 +250,7 @@ Path helpers:
|
|
|
250
250
|
- `resource_form_path(record)`, `action_path(:write, record)`, `parent_path`
|
|
251
251
|
- `paths_for(OtherAdmin).index`, for paths to another resource
|
|
252
252
|
|
|
253
|
-
Layout helpers: `card(title:) { }`, `island`, `record_title`, `format_value`. Reordering: `reorder_form`,
|
|
253
|
+
Layout helpers: `card(title:) { }`, `with_asides(page) { }`, `island`, `record_title`, `format_value`. Reordering: `reorder_form`,
|
|
254
254
|
`reorder_controls`, `reorder_save_button` (see below). Searchable selects: `adm_combobox_data`.
|
|
255
255
|
|
|
256
256
|
### Nested resources
|
|
@@ -313,6 +313,30 @@ Non-GET buttons render as small forms, so no rails-ujs is needed.
|
|
|
313
313
|
|
|
314
314
|
A panel partial receives `resource:` and `button:`.
|
|
315
315
|
|
|
316
|
+
#### Asides
|
|
317
|
+
|
|
318
|
+
When a page has more actions than fit in the header, move the minor ones into an aside: a menu in a
|
|
319
|
+
column beside the content (below it on narrow screens).
|
|
320
|
+
|
|
321
|
+
```ruby
|
|
322
|
+
class PostAdmin < Administratum::Resource
|
|
323
|
+
button :write, on: :show, style: :primary # stays in the header
|
|
324
|
+
|
|
325
|
+
aside on: :show, title: "Maintenance" do # title defaults to "Actions"
|
|
326
|
+
button :reindex
|
|
327
|
+
button :history, to: ->(post) { post_versions_path(post) }
|
|
328
|
+
button :purge, style: :danger, confirm: "Purge?", if: ->(post) { post.archived? }
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
- `on:` takes `:index`, `:show`, `:new` or `:edit`, or several of them. A page can have more than one aside.
|
|
334
|
+
- Buttons inside take the same options as `button`, except `on:`. They render as menu items, and `style:` only
|
|
335
|
+
colours them (`:primary` and `:danger`).
|
|
336
|
+
- An aside whose buttons are all hidden by `if:` isn't rendered, and the page keeps its full width.
|
|
337
|
+
- In your own templates, wrap the content in `<%= with_asides(:show) do %> … <% end %>`, or render just the
|
|
338
|
+
menus with `asides_for(:show)`.
|
|
339
|
+
|
|
316
340
|
### Ordering records
|
|
317
341
|
|
|
318
342
|
```ruby
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-duration:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-3xl:48rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-relaxed:1.625;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-adm-bg:oklch(97.5% .004 255);--color-adm-surface:oklch(100% 0 0);--color-adm-surface-muted:oklch(96.5% .006 255);--color-adm-border:oklch(91% .008 255);--color-adm-text:oklch(24% .02 260);--color-adm-muted:oklch(52% .02 260);--color-adm-primary:oklch(52% .18 262);--color-adm-primary-fg:oklch(99% 0 0);--color-adm-danger:oklch(54% .2 25);--color-adm-danger-fg:oklch(99% 0 0);--color-adm-success:oklch(52% .14 155);--color-adm-warning:oklch(52% .13 70);--color-adm-ring:oklch(52% .18 262/.35);--color-adm-overlay:oklch(20% .02 260/.45);--radius-adm:.5rem;--font-adm:ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-adm-mono:ui-monospace, SFMono-Regular, Menlo, monospace}:root{color-scheme:light dark}:root.light{color-scheme:light}:root.dark{color-scheme:dark;--color-adm-bg:oklch(18% .012 260);--color-adm-surface:oklch(23% .014 260);--color-adm-surface-muted:oklch(27% .014 260);--color-adm-border:oklch(33% .014 260);--color-adm-text:oklch(93% .008 260);--color-adm-muted:oklch(70% .015 260);--color-adm-primary:oklch(68% .15 262);--color-adm-primary-fg:oklch(16% .02 260);--color-adm-danger:oklch(80% .13 25);--color-adm-danger-fg:oklch(16% .02 260);--color-adm-success:oklch(78% .14 155);--color-adm-warning:oklch(82% .14 80);--color-adm-ring:oklch(68% .15 262/.4);--color-adm-overlay:oklch(5% 0 0/.6)}@media (prefers-color-scheme:dark){:root:not(.light){--color-adm-bg:oklch(18% .012 260);--color-adm-surface:oklch(23% .014 260);--color-adm-surface-muted:oklch(27% .014 260);--color-adm-border:oklch(33% .014 260);--color-adm-text:oklch(93% .008 260);--color-adm-muted:oklch(70% .015 260);--color-adm-primary:oklch(68% .15 262);--color-adm-primary-fg:oklch(16% .02 260);--color-adm-danger:oklch(80% .13 25);--color-adm-danger-fg:oklch(16% .02 260);--color-adm-success:oklch(78% .14 155);--color-adm-warning:oklch(82% .14 80);--color-adm-ring:oklch(68% .15 262/.4);--color-adm-overlay:oklch(5% 0 0/.6)}}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.adm-body{background-color:var(--color-adm-bg);min-height:100vh;font-family:var(--font-adm);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-adm-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.adm-scroll-lock{overflow:hidden}}@layer components{.adm-container{width:100%;max-width:var(--container-7xl);padding-inline:calc(var(--spacing) * 4);margin-inline:auto}@media (min-width:40rem){.adm-container{padding-inline:calc(var(--spacing) * 6)}}@media (min-width:64rem){.adm-container{padding-inline:calc(var(--spacing) * 8)}}.adm-main{padding-bottom:calc(var(--spacing) * 12);flex-direction:column;display:flex}.adm-page-body{gap:calc(var(--spacing) * 6);padding-top:calc(var(--spacing) * 6);flex-direction:column;display:flex}.adm-grid{gap:calc(var(--spacing) * 4);display:grid}@media (min-width:40rem){.adm-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:64rem){.adm-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}.adm-sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.adm-muted{color:var(--color-adm-muted)}.adm-topbar{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface)}.adm-topbar-inner{height:calc(var(--spacing) * 14);align-items:center;gap:calc(var(--spacing) * 3);display:flex}.adm-brand{align-items:center;gap:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text);text-decoration-line:none;display:flex}.adm-brand-name{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.adm-logo{height:calc(var(--spacing) * 7);width:auto}.adm-topbar-actions{align-items:center;gap:var(--spacing);margin-left:auto;display:flex}.adm-nav{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);display:none}@media (min-width:48rem){.adm-nav{display:block}}.adm-nav.adm-open{display:block}.adm-nav-list{gap:var(--spacing);padding-block:calc(var(--spacing) * 2);flex-direction:column;margin-bottom:-1px;display:flex}@media (min-width:48rem){.adm-nav-list{gap:calc(var(--spacing) * 6);flex-direction:row;padding-block:0}}.adm-nav-link{border-bottom-style:var(--tw-border-style);padding-block:calc(var(--spacing) * 3);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-color:#0000;border-bottom-width:2px;text-decoration-line:none;display:block}@media (hover:hover){.adm-nav-link:hover{color:var(--color-adm-text)}}.adm-nav-link-active{border-color:var(--color-adm-primary);color:var(--color-adm-text)}.adm-dropdown{position:relative}.adm-dropdown-menu{z-index:30;margin-top:calc(var(--spacing) * 2);min-width:calc(var(--spacing) * 44);border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);padding-block:var(--spacing);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);position:absolute;right:0;overflow:hidden}.adm-dropdown-item{cursor:pointer;width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);text-align:left;color:var(--color-adm-text);display:block}@media (hover:hover){.adm-dropdown-item:hover{background-color:var(--color-adm-surface-muted)}}.adm-page-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface)}.adm-page-header-inner{align-items:flex-end;gap:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 5);flex-wrap:wrap;display:flex}.adm-page-heading{flex:1;min-width:0}.adm-page-title{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--color-adm-text);overflow:hidden}.adm-page-actions{align-items:center;gap:calc(var(--spacing) * 2);flex-wrap:wrap;display:flex}.adm-breadcrumb{margin-bottom:var(--spacing);align-items:center;gap:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-adm-muted);flex-wrap:wrap;display:flex}.adm-breadcrumb-item a{color:var(--color-adm-muted);text-decoration-line:none}@media (hover:hover){.adm-breadcrumb-item a:hover{color:var(--color-adm-text)}}.adm-breadcrumb-item+.adm-breadcrumb-item:before{content:"/";margin-right:calc(var(--spacing) * 1.5);color:var(--color-adm-border)}.adm-card{border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);overflow:hidden}.adm-card-header{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 4);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);padding-inline:calc(var(--spacing) * 5);padding-block:calc(var(--spacing) * 3.5);display:flex}.adm-card-title{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text)}.adm-card-body{padding:calc(var(--spacing) * 5)}.adm-card-footer{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 5);padding-block:calc(var(--spacing) * 3)}.adm-tile{gap:var(--spacing);padding:calc(var(--spacing) * 5);transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex-direction:column;text-decoration-line:none;display:flex}@media (hover:hover){.adm-tile:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.adm-tile-label{color:var(--color-adm-muted)}.adm-tile-value{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.adm-btn{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-adm);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 3.5);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-width:1px;text-decoration-line:none;display:inline-flex}.adm-btn:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:var(--color-adm-ring);--tw-outline-style:none;outline-style:none}.adm-btn:disabled{cursor:not-allowed;opacity:.5}.adm-btn-primary{border-color:var(--color-adm-primary);background-color:var(--color-adm-primary);color:var(--color-adm-primary-fg)}@media (hover:hover){.adm-btn-primary:hover{opacity:.9}}.adm-btn-secondary{border-color:var(--color-adm-border);background-color:var(--color-adm-surface);color:var(--color-adm-text)}@media (hover:hover){.adm-btn-secondary:hover{background-color:var(--color-adm-surface-muted)}}.adm-btn-danger{border-color:var(--color-adm-border);background-color:var(--color-adm-surface);color:var(--color-adm-danger)}@media (hover:hover){.adm-btn-danger:hover{border-color:var(--color-adm-danger);background-color:var(--color-adm-danger);color:var(--color-adm-danger-fg)}}.adm-btn-ghost{color:var(--color-adm-text);background-color:#0000;border-color:#0000}@media (hover:hover){.adm-btn-ghost:hover{background-color:var(--color-adm-surface-muted)}}.adm-btn-sm{padding-inline:calc(var(--spacing) * 2.5);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.adm-btn-block{width:100%}.adm-btn-group{justify-content:flex-end;align-items:center;gap:var(--spacing);display:flex}.adm-inline-form{display:inline-flex}.adm-icon-btn{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9);cursor:pointer;border-radius:var(--radius-adm);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));color:var(--color-adm-muted);justify-content:center;align-items:center;display:inline-flex}@media (hover:hover){.adm-icon-btn:hover{background-color:var(--color-adm-surface-muted);color:var(--color-adm-text)}}.adm-icon-btn:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:var(--color-adm-ring);--tw-outline-style:none;outline-style:none}.adm-icon{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.adm-link{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-primary);text-decoration-line:none}@media (hover:hover){.adm-link:hover{text-decoration-line:underline}}.adm-table-wrap{overflow-x:auto}.adm-table{border-collapse:collapse;text-align:left;width:100%}.adm-table th{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide);white-space:nowrap;color:var(--color-adm-muted);text-transform:uppercase}.adm-table th a{color:var(--color-adm-muted);text-decoration-line:none}@media (hover:hover){.adm-table th a:hover{color:var(--color-adm-text)}}.adm-table td{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);vertical-align:middle}.adm-table tbody tr:last-child td{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.adm-table tbody tr:hover td{background-color:var(--color-adm-surface-muted)}.adm-table-actions{text-align:right;white-space:nowrap;width:1px}.adm-table-footer{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 3);flex-wrap:wrap;display:flex}.adm-empty{padding-block:calc(var(--spacing) * 10);text-align:center;color:var(--color-adm-muted)}.adm-tabs{margin-bottom:calc(var(--spacing) * -2);column-gap:calc(var(--spacing) * 6);row-gap:var(--spacing);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);flex-wrap:wrap;display:flex}.adm-tab{align-items:center;gap:calc(var(--spacing) * 2);border-bottom-style:var(--tw-border-style);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-muted);border-color:#0000;border-bottom-width:2px;margin-bottom:-1px;text-decoration-line:none;display:inline-flex}@media (hover:hover){.adm-tab:hover{color:var(--color-adm-text)}}.adm-tab-active{border-color:var(--color-adm-primary);color:var(--color-adm-text)}.adm-tab-count{background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-adm-muted);border-radius:3.40282e38px}.adm-pagy .pagy{align-items:center;gap:var(--spacing);display:flex}.adm-pagy .pagy a{border-radius:var(--radius-adm);padding-inline:calc(var(--spacing) * 2.5);padding-block:var(--spacing);color:var(--color-adm-text);text-decoration-line:none}@media (hover:hover){.adm-pagy .pagy a:hover{background-color:var(--color-adm-surface)}}.adm-pagy .pagy a.current,.adm-pagy .pagy a[aria-current=page]{background-color:var(--color-adm-primary);color:var(--color-adm-primary-fg)}.adm-pagy .pagy a:not([href]){color:var(--color-adm-muted)}:where(.adm-attributes>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-adm-border)}.adm-attribute{gap:var(--spacing);padding-inline:calc(var(--spacing) * 5);padding-block:calc(var(--spacing) * 3);display:grid}@media (min-width:40rem){.adm-attribute{gap:calc(var(--spacing) * 6);grid-template-columns:12rem 1fr}}.adm-attribute dt{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-muted)}.adm-attribute dd{overflow-wrap:break-word;min-width:0;color:var(--color-adm-text)}.adm-form{gap:calc(var(--spacing) * 5);flex-direction:column;display:flex}.adm-form-flush{gap:0}.adm-form .field_with_errors{display:contents}.adm-form-errors{padding-inline:calc(var(--spacing) * 6);padding-top:calc(var(--spacing) * 6)}.adm-form-body{gap:calc(var(--spacing) * 6);padding:calc(var(--spacing) * 6);flex-direction:column;display:flex}.adm-field{gap:calc(var(--spacing) * 2);flex-direction:column;display:flex}.adm-field-horizontal{gap:calc(var(--spacing) * 2)}@media (min-width:40rem){.adm-field-horizontal{column-gap:calc(var(--spacing) * 8);grid-template-columns:minmax(0,13rem) minmax(0,1fr);display:grid}}.adm-field-label{flex-direction:column;display:flex}@media (min-width:40rem){.adm-field-label{padding-top:calc(var(--spacing) * 2.5)}}.adm-field-control{width:100%;max-width:var(--container-3xl);gap:calc(var(--spacing) * 2);flex-direction:column;min-width:0;display:flex}.adm-field-row{gap:calc(var(--spacing) * 2);display:flex}.adm-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-text)}.adm-required{margin-left:calc(var(--spacing) * .5);color:var(--color-adm-danger)}.adm-hint{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed);color:var(--color-adm-muted)}.adm-error{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-danger)}.adm-input{min-height:calc(var(--spacing) * 10);border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);width:100%;padding-inline:calc(var(--spacing) * 3.5);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-adm-text);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));display:block}.adm-input::placeholder{color:#626975b3}@supports (color:color-mix(in lab, red, red)){.adm-input::placeholder{color:color-mix(in oklab, var(--color-adm-muted) 70%, transparent)}}.adm-input:focus{border-color:var(--color-adm-primary);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:var(--color-adm-ring);--tw-outline-style:none;outline-style:none}textarea.adm-input{min-height:calc(var(--spacing) * 24);--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}select[multiple].adm-input{padding-block:calc(var(--spacing) * 1.5)}select.adm-input:not([multiple]),.adm-combobox-input{appearance:none;padding-right:calc(var(--spacing) * 9);background-repeat:no-repeat;background-image:linear-gradient(45deg, transparent 50%, var(--color-adm-muted) 50%), linear-gradient(135deg, var(--color-adm-muted) 50%, transparent 50%);background-position:calc(100% - 1.125rem) 52%,calc(100% - .8125rem) 52%;background-size:.3125rem .3125rem}.adm-field-invalid .adm-input{border-color:var(--color-adm-danger)}.adm-checkbox{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5);accent-color:var(--color-adm-primary);border-radius:.25rem}@media (min-width:40rem){.adm-field-horizontal .adm-field-control>.adm-checkbox{margin-top:calc(var(--spacing) * 3)}}.adm-form-actions{align-items:center;gap:calc(var(--spacing) * 2);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 6);padding-block:calc(var(--spacing) * 4);flex-wrap:wrap;display:flex}@media (min-width:40rem){.adm-form-actions{padding-left:16.5rem}}.adm-combobox{position:relative}.adm-combobox-listbox{z-index:30;margin-top:var(--spacing);max-height:calc(var(--spacing) * 72);border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);padding-block:var(--spacing);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);inset-inline:0;position:absolute;top:100%;overflow-y:auto}.adm-combobox-group{padding-inline:calc(var(--spacing) * 3.5);padding-top:calc(var(--spacing) * 2.5);padding-bottom:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide);color:var(--color-adm-muted);text-transform:uppercase}.adm-combobox-option{cursor:pointer;padding-inline:calc(var(--spacing) * 3.5);padding-block:calc(var(--spacing) * 1.5);color:var(--color-adm-text)}.adm-combobox-option[aria-selected=true]{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.adm-combobox-option-active,.adm-combobox-option:hover{background-color:var(--color-adm-surface-muted)}.adm-combobox-option-active{--tw-shadow:inset 2px 0 0 var(--tw-shadow-color,var(--color-adm-primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.adm-combobox-empty{padding-inline:calc(var(--spacing) * 3.5);padding-block:calc(var(--spacing) * 2);color:var(--color-adm-muted)}.adm-sortable-controls{align-items:center;gap:var(--spacing);display:inline-flex}.adm-sortable-handle{cursor:grab;touch-action:none}.adm-sortable-controls .adm-icon-btn:disabled{cursor:not-allowed;opacity:.4}@media (hover:hover){.adm-sortable-controls .adm-icon-btn:disabled:hover{background-color:#0000}}.adm-sortable-position{width:calc(var(--spacing) * 20)}.adm-sortable-dragging{z-index:10;opacity:.8;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);position:relative}.adm-sortable-dragging>td{background-color:var(--color-adm-surface-muted)}.adm-check{align-items:center;gap:calc(var(--spacing) * 2);color:var(--color-adm-text);display:flex}.adm-code{font-family:var(--font-adm-mono);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.adm-form-footer{align-items:center;gap:calc(var(--spacing) * 2);flex-wrap:wrap;display:flex}.adm-alert{border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:#c9222b66}@supports (color:color-mix(in lab, red, red)){.adm-alert{border-color:color-mix(in oklab, var(--color-adm-danger) 40%, transparent)}}.adm-alert{background-color:#c9222b1a}@supports (color:color-mix(in lab, red, red)){.adm-alert{background-color:color-mix(in oklab, var(--color-adm-danger) 10%, transparent)}}.adm-alert{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);color:var(--color-adm-text)}.adm-alert-title{margin-bottom:var(--spacing);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-danger)}.adm-alert ul{padding-left:calc(var(--spacing) * 5);list-style-type:disc}.adm-alert-danger{border-color:#c9222b66}@supports (color:color-mix(in lab, red, red)){.adm-alert-danger{border-color:color-mix(in oklab, var(--color-adm-danger) 40%, transparent)}}.adm-alert-danger{background-color:#c9222b1a}@supports (color:color-mix(in lab, red, red)){.adm-alert-danger{background-color:color-mix(in oklab, var(--color-adm-danger) 10%, transparent)}}.adm-alert-danger .adm-alert-title{color:var(--color-adm-danger)}.adm-alert-warning{border-color:#925b0066}@supports (color:color-mix(in lab, red, red)){.adm-alert-warning{border-color:color-mix(in oklab, var(--color-adm-warning) 40%, transparent)}}.adm-alert-warning{background-color:#925b001a}@supports (color:color-mix(in lab, red, red)){.adm-alert-warning{background-color:color-mix(in oklab, var(--color-adm-warning) 10%, transparent)}}.adm-alert-warning .adm-alert-title{color:var(--color-adm-warning)}.adm-alert-info{border-color:var(--color-adm-border);background-color:var(--color-adm-surface-muted)}.adm-alert-info .adm-alert-title{color:var(--color-adm-text)}.adm-badge{background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-muted);border-radius:3.40282e38px;align-items:center;display:inline-flex}.adm-badge-success{background-color:#007e461a}@supports (color:color-mix(in lab, red, red)){.adm-badge-success{background-color:color-mix(in oklab, var(--color-adm-success) 10%, transparent)}}.adm-badge-success{color:var(--color-adm-success)}.adm-badge-warning{background-color:#925b001a}@supports (color:color-mix(in lab, red, red)){.adm-badge-warning{background-color:color-mix(in oklab, var(--color-adm-warning) 10%, transparent)}}.adm-badge-warning{color:var(--color-adm-warning)}.adm-badge-danger{background-color:#c9222b1a}@supports (color:color-mix(in lab, red, red)){.adm-badge-danger{background-color:color-mix(in oklab, var(--color-adm-danger) 10%, transparent)}}.adm-badge-danger{color:var(--color-adm-danger)}.adm-offcanvas{z-index:40;position:fixed;inset:0}.adm-offcanvas-backdrop{background-color:var(--color-adm-overlay);opacity:0;transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;transition-duration:.2s;position:absolute;inset:0}.adm-offcanvas-panel{width:100%;max-width:var(--container-sm);--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y);background-color:var(--color-adm-surface);--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;inset-block:0;flex-direction:column;transition-duration:.2s;display:flex;position:absolute;right:0}.adm-offcanvas-open .adm-offcanvas-backdrop{opacity:1}.adm-offcanvas-open .adm-offcanvas-panel{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.adm-offcanvas-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);padding-inline:calc(var(--spacing) * 5);padding-block:calc(var(--spacing) * 3.5);justify-content:space-between;align-items:center;display:flex}.adm-offcanvas-body{padding:calc(var(--spacing) * 5);flex:1;overflow-y:auto}.adm-flash-stack{pointer-events:none;inset-inline:0;top:calc(var(--spacing) * 4);z-index:50;align-items:center;gap:calc(var(--spacing) * 2);padding-inline:calc(var(--spacing) * 4);flex-direction:column;display:flex;position:fixed}.adm-flash{pointer-events:auto;max-width:var(--container-lg);align-items:center;gap:calc(var(--spacing) * 3);border-radius:var(--radius-adm);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2.5);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);border-width:1px;display:flex}.adm-flash-notice{border-color:var(--color-adm-border);background-color:var(--color-adm-text);color:var(--color-adm-surface)}.adm-flash-alert{border-color:var(--color-adm-danger);background-color:var(--color-adm-danger);color:var(--color-adm-danger-fg)}.adm-flash-close{cursor:pointer;font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-leading:1;opacity:.7;line-height:1}@media (hover:hover){.adm-flash-close:hover{opacity:1}}.adm-auth{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 16);justify-content:center;align-items:center;display:flex}.adm-auth-panel{width:100%;max-width:var(--container-sm);gap:calc(var(--spacing) * 6);flex-direction:column;display:flex}.adm-auth-brand{text-align:center;font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text)}.adm-auth-title{margin-bottom:calc(var(--spacing) * 4);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text)}.adm-auth-lead{margin-bottom:calc(var(--spacing) * 4)}.adm-auth-footer{margin-top:calc(var(--spacing) * 4);text-align:center}}@layer utilities{.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.block{display:block}.hidden{display:none}.table{display:table}.w-px{width:1px}.whitespace-nowrap{white-space:nowrap}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}@media (min-width:48rem){.md\:hidden{display:none}}}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-duration:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-3xl:48rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-relaxed:1.625;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-adm-bg:oklch(97.5% .004 255);--color-adm-surface:oklch(100% 0 0);--color-adm-surface-muted:oklch(96.5% .006 255);--color-adm-border:oklch(91% .008 255);--color-adm-text:oklch(24% .02 260);--color-adm-muted:oklch(52% .02 260);--color-adm-primary:oklch(52% .18 262);--color-adm-primary-fg:oklch(99% 0 0);--color-adm-danger:oklch(54% .2 25);--color-adm-danger-fg:oklch(99% 0 0);--color-adm-success:oklch(52% .14 155);--color-adm-warning:oklch(52% .13 70);--color-adm-ring:oklch(52% .18 262/.35);--color-adm-overlay:oklch(20% .02 260/.45);--radius-adm:.5rem;--font-adm:ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-adm-mono:ui-monospace, SFMono-Regular, Menlo, monospace}:root{color-scheme:light dark}:root.light{color-scheme:light}:root.dark{color-scheme:dark;--color-adm-bg:oklch(18% .012 260);--color-adm-surface:oklch(23% .014 260);--color-adm-surface-muted:oklch(27% .014 260);--color-adm-border:oklch(33% .014 260);--color-adm-text:oklch(93% .008 260);--color-adm-muted:oklch(70% .015 260);--color-adm-primary:oklch(68% .15 262);--color-adm-primary-fg:oklch(16% .02 260);--color-adm-danger:oklch(80% .13 25);--color-adm-danger-fg:oklch(16% .02 260);--color-adm-success:oklch(78% .14 155);--color-adm-warning:oklch(82% .14 80);--color-adm-ring:oklch(68% .15 262/.4);--color-adm-overlay:oklch(5% 0 0/.6)}@media (prefers-color-scheme:dark){:root:not(.light){--color-adm-bg:oklch(18% .012 260);--color-adm-surface:oklch(23% .014 260);--color-adm-surface-muted:oklch(27% .014 260);--color-adm-border:oklch(33% .014 260);--color-adm-text:oklch(93% .008 260);--color-adm-muted:oklch(70% .015 260);--color-adm-primary:oklch(68% .15 262);--color-adm-primary-fg:oklch(16% .02 260);--color-adm-danger:oklch(80% .13 25);--color-adm-danger-fg:oklch(16% .02 260);--color-adm-success:oklch(78% .14 155);--color-adm-warning:oklch(82% .14 80);--color-adm-ring:oklch(68% .15 262/.4);--color-adm-overlay:oklch(5% 0 0/.6)}}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.adm-body{background-color:var(--color-adm-bg);min-height:100vh;font-family:var(--font-adm);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-adm-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.adm-scroll-lock{overflow:hidden}}@layer components{.adm-container{width:100%;max-width:var(--container-7xl);padding-inline:calc(var(--spacing) * 4);margin-inline:auto}@media (min-width:40rem){.adm-container{padding-inline:calc(var(--spacing) * 6)}}@media (min-width:64rem){.adm-container{padding-inline:calc(var(--spacing) * 8)}}.adm-main{padding-bottom:calc(var(--spacing) * 12);flex-direction:column;display:flex}.adm-page-body{gap:calc(var(--spacing) * 6);padding-top:calc(var(--spacing) * 6);flex-direction:column;display:flex}.adm-grid{gap:calc(var(--spacing) * 4);display:grid}@media (min-width:40rem){.adm-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:64rem){.adm-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}.adm-sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.adm-muted{color:var(--color-adm-muted)}.adm-topbar{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface)}.adm-topbar-inner{height:calc(var(--spacing) * 14);align-items:center;gap:calc(var(--spacing) * 3);display:flex}.adm-brand{align-items:center;gap:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text);text-decoration-line:none;display:flex}.adm-brand-name{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.adm-logo{height:calc(var(--spacing) * 7);width:auto}.adm-topbar-actions{align-items:center;gap:var(--spacing);margin-left:auto;display:flex}.adm-nav{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);display:none}@media (min-width:48rem){.adm-nav{display:block}}.adm-nav.adm-open{display:block}.adm-nav-list{gap:var(--spacing);padding-block:calc(var(--spacing) * 2);flex-direction:column;margin-bottom:-1px;display:flex}@media (min-width:48rem){.adm-nav-list{gap:calc(var(--spacing) * 6);flex-direction:row;padding-block:0}}.adm-nav-link{border-bottom-style:var(--tw-border-style);padding-block:calc(var(--spacing) * 3);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-color:#0000;border-bottom-width:2px;text-decoration-line:none;display:block}@media (hover:hover){.adm-nav-link:hover{color:var(--color-adm-text)}}.adm-nav-link-active{border-color:var(--color-adm-primary);color:var(--color-adm-text)}.adm-dropdown{position:relative}.adm-dropdown-menu{z-index:30;margin-top:calc(var(--spacing) * 2);min-width:calc(var(--spacing) * 44);border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);padding-block:var(--spacing);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);position:absolute;right:0;overflow:hidden}.adm-dropdown-item{cursor:pointer;width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);text-align:left;color:var(--color-adm-text);display:block}@media (hover:hover){.adm-dropdown-item:hover{background-color:var(--color-adm-surface-muted)}}.adm-page-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface)}.adm-page-header-inner{align-items:flex-end;gap:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 5);flex-wrap:wrap;display:flex}.adm-page-heading{flex:1;min-width:0}.adm-page-title{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--color-adm-text);overflow:hidden}.adm-page-actions{align-items:center;gap:calc(var(--spacing) * 2);flex-wrap:wrap;display:flex}.adm-breadcrumb{margin-bottom:var(--spacing);align-items:center;gap:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-adm-muted);flex-wrap:wrap;display:flex}.adm-breadcrumb-item a{color:var(--color-adm-muted);text-decoration-line:none}@media (hover:hover){.adm-breadcrumb-item a:hover{color:var(--color-adm-text)}}.adm-breadcrumb-item+.adm-breadcrumb-item:before{content:"/";margin-right:calc(var(--spacing) * 1.5);color:var(--color-adm-border)}.adm-card{border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);overflow:hidden}.adm-card-header{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 4);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);padding-inline:calc(var(--spacing) * 5);padding-block:calc(var(--spacing) * 3.5);display:flex}.adm-card-title{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text)}.adm-card-body{padding:calc(var(--spacing) * 5)}.adm-card-footer{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 5);padding-block:calc(var(--spacing) * 3)}.adm-tile{gap:var(--spacing);padding:calc(var(--spacing) * 5);transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex-direction:column;text-decoration-line:none;display:flex}@media (hover:hover){.adm-tile:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.adm-tile-label{color:var(--color-adm-muted)}.adm-tile-value{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.adm-btn{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-adm);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 3.5);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-width:1px;text-decoration-line:none;display:inline-flex}.adm-btn:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:var(--color-adm-ring);--tw-outline-style:none;outline-style:none}.adm-btn:disabled{cursor:not-allowed;opacity:.5}.adm-btn-primary{border-color:var(--color-adm-primary);background-color:var(--color-adm-primary);color:var(--color-adm-primary-fg)}@media (hover:hover){.adm-btn-primary:hover{opacity:.9}}.adm-btn-secondary{border-color:var(--color-adm-border);background-color:var(--color-adm-surface);color:var(--color-adm-text)}@media (hover:hover){.adm-btn-secondary:hover{background-color:var(--color-adm-surface-muted)}}.adm-btn-danger{border-color:var(--color-adm-border);background-color:var(--color-adm-surface);color:var(--color-adm-danger)}@media (hover:hover){.adm-btn-danger:hover{border-color:var(--color-adm-danger);background-color:var(--color-adm-danger);color:var(--color-adm-danger-fg)}}.adm-btn-ghost{color:var(--color-adm-text);background-color:#0000;border-color:#0000}@media (hover:hover){.adm-btn-ghost:hover{background-color:var(--color-adm-surface-muted)}}.adm-btn-sm{padding-inline:calc(var(--spacing) * 2.5);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.adm-btn-block{width:100%}.adm-btn-group{justify-content:flex-end;align-items:center;gap:var(--spacing);display:flex}.adm-inline-form{display:inline-flex}.adm-icon-btn{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9);cursor:pointer;border-radius:var(--radius-adm);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));color:var(--color-adm-muted);justify-content:center;align-items:center;display:inline-flex}@media (hover:hover){.adm-icon-btn:hover{background-color:var(--color-adm-surface-muted);color:var(--color-adm-text)}}.adm-icon-btn:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:var(--color-adm-ring);--tw-outline-style:none;outline-style:none}.adm-icon{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.adm-link{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-primary);text-decoration-line:none}@media (hover:hover){.adm-link:hover{text-decoration-line:underline}}.adm-with-aside{align-items:flex-start;gap:calc(var(--spacing) * 6);display:grid}@media (min-width:64rem){.adm-with-aside{grid-template-columns:minmax(0,1fr) 16rem}}.adm-with-aside-main{gap:calc(var(--spacing) * 6);flex-direction:column;min-width:0;display:flex}.adm-aside{gap:calc(var(--spacing) * 6);flex-direction:column;display:flex}.adm-menu{padding-block:var(--spacing)}.adm-menu-form{display:block}.adm-menu-item{cursor:pointer;width:100%;padding-inline:calc(var(--spacing) * 5);padding-block:calc(var(--spacing) * 2);text-align:left;color:var(--color-adm-text);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));text-decoration-line:none;display:block}@media (hover:hover){.adm-menu-item:hover{background-color:var(--color-adm-surface-muted)}}.adm-menu-item:focus-visible{background-color:var(--color-adm-surface-muted);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:var(--color-adm-ring);--tw-outline-style:none;--tw-ring-inset:inset;outline-style:none}.adm-menu-item-primary{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-primary)}.adm-menu-item-danger{color:var(--color-adm-danger)}@media (hover:hover){.adm-menu-item-danger:hover{background-color:#c9222b1a}@supports (color:color-mix(in lab, red, red)){.adm-menu-item-danger:hover{background-color:color-mix(in oklab, var(--color-adm-danger) 10%, transparent)}}}.adm-table-wrap{overflow-x:auto}.adm-table{border-collapse:collapse;text-align:left;width:100%}.adm-table th{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide);white-space:nowrap;color:var(--color-adm-muted);text-transform:uppercase}.adm-table th a{color:var(--color-adm-muted);text-decoration-line:none}@media (hover:hover){.adm-table th a:hover{color:var(--color-adm-text)}}.adm-table td{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);vertical-align:middle}.adm-table tbody tr:last-child td{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.adm-table tbody tr:hover td{background-color:var(--color-adm-surface-muted)}.adm-table-actions{text-align:right;white-space:nowrap;width:1px}.adm-table-footer{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 3);flex-wrap:wrap;display:flex}.adm-empty{padding-block:calc(var(--spacing) * 10);text-align:center;color:var(--color-adm-muted)}.adm-tabs{margin-bottom:calc(var(--spacing) * -2);column-gap:calc(var(--spacing) * 6);row-gap:var(--spacing);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);flex-wrap:wrap;display:flex}.adm-tab{align-items:center;gap:calc(var(--spacing) * 2);border-bottom-style:var(--tw-border-style);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-muted);border-color:#0000;border-bottom-width:2px;margin-bottom:-1px;text-decoration-line:none;display:inline-flex}@media (hover:hover){.adm-tab:hover{color:var(--color-adm-text)}}.adm-tab-active{border-color:var(--color-adm-primary);color:var(--color-adm-text)}.adm-tab-count{background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-adm-muted);border-radius:3.40282e38px}.adm-pagy .pagy{align-items:center;gap:var(--spacing);display:flex}.adm-pagy .pagy a{border-radius:var(--radius-adm);padding-inline:calc(var(--spacing) * 2.5);padding-block:var(--spacing);color:var(--color-adm-text);text-decoration-line:none}@media (hover:hover){.adm-pagy .pagy a:hover{background-color:var(--color-adm-surface)}}.adm-pagy .pagy a.current,.adm-pagy .pagy a[aria-current=page]{background-color:var(--color-adm-primary);color:var(--color-adm-primary-fg)}.adm-pagy .pagy a:not([href]){color:var(--color-adm-muted)}:where(.adm-attributes>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-adm-border)}.adm-attribute{gap:var(--spacing);padding-inline:calc(var(--spacing) * 5);padding-block:calc(var(--spacing) * 3);display:grid}@media (min-width:40rem){.adm-attribute{gap:calc(var(--spacing) * 6);grid-template-columns:12rem 1fr}}.adm-attribute dt{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-muted)}.adm-attribute dd{overflow-wrap:break-word;min-width:0;color:var(--color-adm-text)}.adm-form{gap:calc(var(--spacing) * 5);flex-direction:column;display:flex}.adm-form-flush{gap:0}.adm-form .field_with_errors{display:contents}.adm-form-errors{padding-inline:calc(var(--spacing) * 6);padding-top:calc(var(--spacing) * 6)}.adm-form-body{gap:calc(var(--spacing) * 6);padding:calc(var(--spacing) * 6);flex-direction:column;display:flex}.adm-field{gap:calc(var(--spacing) * 2);flex-direction:column;display:flex}.adm-field-horizontal{gap:calc(var(--spacing) * 2)}@media (min-width:40rem){.adm-field-horizontal{column-gap:calc(var(--spacing) * 8);grid-template-columns:minmax(0,13rem) minmax(0,1fr);display:grid}}.adm-field-label{flex-direction:column;display:flex}@media (min-width:40rem){.adm-field-label{padding-top:calc(var(--spacing) * 2.5)}}.adm-field-control{width:100%;max-width:var(--container-3xl);gap:calc(var(--spacing) * 2);flex-direction:column;min-width:0;display:flex}.adm-field-row{gap:calc(var(--spacing) * 2);display:flex}.adm-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-text)}.adm-required{margin-left:calc(var(--spacing) * .5);color:var(--color-adm-danger)}.adm-hint{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed);color:var(--color-adm-muted)}.adm-error{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-danger)}.adm-input{min-height:calc(var(--spacing) * 10);border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);width:100%;padding-inline:calc(var(--spacing) * 3.5);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-adm-text);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));display:block}.adm-input::placeholder{color:#626975b3}@supports (color:color-mix(in lab, red, red)){.adm-input::placeholder{color:color-mix(in oklab, var(--color-adm-muted) 70%, transparent)}}.adm-input:focus{border-color:var(--color-adm-primary);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:var(--color-adm-ring);--tw-outline-style:none;outline-style:none}textarea.adm-input{min-height:calc(var(--spacing) * 24);--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}select[multiple].adm-input{padding-block:calc(var(--spacing) * 1.5)}select.adm-input:not([multiple]),.adm-combobox-input{appearance:none;padding-right:calc(var(--spacing) * 9);background-repeat:no-repeat;background-image:linear-gradient(45deg, transparent 50%, var(--color-adm-muted) 50%), linear-gradient(135deg, var(--color-adm-muted) 50%, transparent 50%);background-position:calc(100% - 1.125rem) 52%,calc(100% - .8125rem) 52%;background-size:.3125rem .3125rem}.adm-field-invalid .adm-input{border-color:var(--color-adm-danger)}.adm-checkbox{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5);accent-color:var(--color-adm-primary);border-radius:.25rem}@media (min-width:40rem){.adm-field-horizontal .adm-field-control>.adm-checkbox{margin-top:calc(var(--spacing) * 3)}}.adm-form-actions{align-items:center;gap:calc(var(--spacing) * 2);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 6);padding-block:calc(var(--spacing) * 4);flex-wrap:wrap;display:flex}@media (min-width:40rem){.adm-form-actions{padding-left:16.5rem}}.adm-combobox{position:relative}.adm-combobox-listbox{z-index:30;margin-top:var(--spacing);max-height:calc(var(--spacing) * 72);border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-adm-border);background-color:var(--color-adm-surface);padding-block:var(--spacing);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);inset-inline:0;position:absolute;top:100%;overflow-y:auto}.adm-combobox-group{padding-inline:calc(var(--spacing) * 3.5);padding-top:calc(var(--spacing) * 2.5);padding-bottom:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide);color:var(--color-adm-muted);text-transform:uppercase}.adm-combobox-option{cursor:pointer;padding-inline:calc(var(--spacing) * 3.5);padding-block:calc(var(--spacing) * 1.5);color:var(--color-adm-text)}.adm-combobox-option[aria-selected=true]{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.adm-combobox-option-active,.adm-combobox-option:hover{background-color:var(--color-adm-surface-muted)}.adm-combobox-option-active{--tw-shadow:inset 2px 0 0 var(--tw-shadow-color,var(--color-adm-primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.adm-combobox-empty{padding-inline:calc(var(--spacing) * 3.5);padding-block:calc(var(--spacing) * 2);color:var(--color-adm-muted)}.adm-sortable-controls{align-items:center;gap:var(--spacing);display:inline-flex}.adm-sortable-handle{cursor:grab;touch-action:none}.adm-sortable-controls .adm-icon-btn:disabled{cursor:not-allowed;opacity:.4}@media (hover:hover){.adm-sortable-controls .adm-icon-btn:disabled:hover{background-color:#0000}}.adm-sortable-position{width:calc(var(--spacing) * 20)}.adm-sortable-dragging{z-index:10;opacity:.8;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);position:relative}.adm-sortable-dragging>td{background-color:var(--color-adm-surface-muted)}.adm-check{align-items:center;gap:calc(var(--spacing) * 2);color:var(--color-adm-text);display:flex}.adm-code{font-family:var(--font-adm-mono);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.adm-form-footer{align-items:center;gap:calc(var(--spacing) * 2);flex-wrap:wrap;display:flex}.adm-alert{border-radius:var(--radius-adm);border-style:var(--tw-border-style);border-width:1px;border-color:#c9222b66}@supports (color:color-mix(in lab, red, red)){.adm-alert{border-color:color-mix(in oklab, var(--color-adm-danger) 40%, transparent)}}.adm-alert{background-color:#c9222b1a}@supports (color:color-mix(in lab, red, red)){.adm-alert{background-color:color-mix(in oklab, var(--color-adm-danger) 10%, transparent)}}.adm-alert{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);color:var(--color-adm-text)}.adm-alert-title{margin-bottom:var(--spacing);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-danger)}.adm-alert ul{padding-left:calc(var(--spacing) * 5);list-style-type:disc}.adm-alert-danger{border-color:#c9222b66}@supports (color:color-mix(in lab, red, red)){.adm-alert-danger{border-color:color-mix(in oklab, var(--color-adm-danger) 40%, transparent)}}.adm-alert-danger{background-color:#c9222b1a}@supports (color:color-mix(in lab, red, red)){.adm-alert-danger{background-color:color-mix(in oklab, var(--color-adm-danger) 10%, transparent)}}.adm-alert-danger .adm-alert-title{color:var(--color-adm-danger)}.adm-alert-warning{border-color:#925b0066}@supports (color:color-mix(in lab, red, red)){.adm-alert-warning{border-color:color-mix(in oklab, var(--color-adm-warning) 40%, transparent)}}.adm-alert-warning{background-color:#925b001a}@supports (color:color-mix(in lab, red, red)){.adm-alert-warning{background-color:color-mix(in oklab, var(--color-adm-warning) 10%, transparent)}}.adm-alert-warning .adm-alert-title{color:var(--color-adm-warning)}.adm-alert-info{border-color:var(--color-adm-border);background-color:var(--color-adm-surface-muted)}.adm-alert-info .adm-alert-title{color:var(--color-adm-text)}.adm-badge{background-color:var(--color-adm-surface-muted);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-adm-muted);border-radius:3.40282e38px;align-items:center;display:inline-flex}.adm-badge-success{background-color:#007e461a}@supports (color:color-mix(in lab, red, red)){.adm-badge-success{background-color:color-mix(in oklab, var(--color-adm-success) 10%, transparent)}}.adm-badge-success{color:var(--color-adm-success)}.adm-badge-warning{background-color:#925b001a}@supports (color:color-mix(in lab, red, red)){.adm-badge-warning{background-color:color-mix(in oklab, var(--color-adm-warning) 10%, transparent)}}.adm-badge-warning{color:var(--color-adm-warning)}.adm-badge-danger{background-color:#c9222b1a}@supports (color:color-mix(in lab, red, red)){.adm-badge-danger{background-color:color-mix(in oklab, var(--color-adm-danger) 10%, transparent)}}.adm-badge-danger{color:var(--color-adm-danger)}.adm-offcanvas{z-index:40;position:fixed;inset:0}.adm-offcanvas-backdrop{background-color:var(--color-adm-overlay);opacity:0;transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;transition-duration:.2s;position:absolute;inset:0}.adm-offcanvas-panel{width:100%;max-width:var(--container-sm);--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y);background-color:var(--color-adm-surface);--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;inset-block:0;flex-direction:column;transition-duration:.2s;display:flex;position:absolute;right:0}.adm-offcanvas-open .adm-offcanvas-backdrop{opacity:1}.adm-offcanvas-open .adm-offcanvas-panel{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.adm-offcanvas-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-adm-border);padding-inline:calc(var(--spacing) * 5);padding-block:calc(var(--spacing) * 3.5);justify-content:space-between;align-items:center;display:flex}.adm-offcanvas-body{padding:calc(var(--spacing) * 5);flex:1;overflow-y:auto}.adm-flash-stack{pointer-events:none;inset-inline:0;top:calc(var(--spacing) * 4);z-index:50;align-items:center;gap:calc(var(--spacing) * 2);padding-inline:calc(var(--spacing) * 4);flex-direction:column;display:flex;position:fixed}.adm-flash{pointer-events:auto;max-width:var(--container-lg);align-items:center;gap:calc(var(--spacing) * 3);border-radius:var(--radius-adm);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2.5);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);border-width:1px;display:flex}.adm-flash-notice{border-color:var(--color-adm-border);background-color:var(--color-adm-text);color:var(--color-adm-surface)}.adm-flash-alert{border-color:var(--color-adm-danger);background-color:var(--color-adm-danger);color:var(--color-adm-danger-fg)}.adm-flash-close{cursor:pointer;font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-leading:1;opacity:.7;line-height:1}@media (hover:hover){.adm-flash-close:hover{opacity:1}}.adm-auth{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 16);justify-content:center;align-items:center;display:flex}.adm-auth-panel{width:100%;max-width:var(--container-sm);gap:calc(var(--spacing) * 6);flex-direction:column;display:flex}.adm-auth-brand{text-align:center;font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text)}.adm-auth-title{margin-bottom:calc(var(--spacing) * 4);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-adm-text)}.adm-auth-lead{margin-bottom:calc(var(--spacing) * 4)}.adm-auth-footer{margin-top:calc(var(--spacing) * 4);text-align:center}}@layer utilities{.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.block{display:block}.hidden{display:none}.table{display:table}.w-px{width:1px}.whitespace-nowrap{white-space:nowrap}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}@media (min-width:48rem){.md\:hidden{display:none}}}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}
|
|
@@ -81,6 +81,18 @@
|
|
|
81
81
|
.adm-icon { @apply size-5; }
|
|
82
82
|
.adm-link { @apply font-medium text-adm-primary no-underline hover:underline; }
|
|
83
83
|
|
|
84
|
+
/* Aside menus (`aside` DSL): content beside a column of menu cards. */
|
|
85
|
+
.adm-with-aside { @apply grid items-start gap-6 lg:grid-cols-[minmax(0,1fr)_16rem]; }
|
|
86
|
+
.adm-with-aside-main { @apply flex min-w-0 flex-col gap-6; }
|
|
87
|
+
.adm-aside { @apply flex flex-col gap-6; }
|
|
88
|
+
.adm-menu { @apply py-1; }
|
|
89
|
+
.adm-menu-form { @apply block; }
|
|
90
|
+
.adm-menu-item {
|
|
91
|
+
@apply block w-full cursor-pointer px-5 py-2 text-left text-adm-text no-underline transition-colors hover:bg-adm-surface-muted focus-visible:bg-adm-surface-muted focus-visible:outline-none focus-visible:ring-3 focus-visible:ring-adm-ring focus-visible:ring-inset;
|
|
92
|
+
}
|
|
93
|
+
.adm-menu-item-primary { @apply font-medium text-adm-primary; }
|
|
94
|
+
.adm-menu-item-danger { @apply text-adm-danger hover:bg-adm-danger/10; }
|
|
95
|
+
|
|
84
96
|
/* Tables ---------------------------------------------------------------- */
|
|
85
97
|
.adm-table-wrap { @apply overflow-x-auto; }
|
|
86
98
|
.adm-table { @apply w-full border-collapse text-left; }
|
|
@@ -9,6 +9,13 @@ module Administratum
|
|
|
9
9
|
ghost: "adm-btn adm-btn-ghost"
|
|
10
10
|
}.freeze
|
|
11
11
|
|
|
12
|
+
MENU_STYLES = {
|
|
13
|
+
primary: "adm-menu-item adm-menu-item-primary",
|
|
14
|
+
secondary: "adm-menu-item",
|
|
15
|
+
danger: "adm-menu-item adm-menu-item-danger",
|
|
16
|
+
ghost: "adm-menu-item"
|
|
17
|
+
}.freeze
|
|
18
|
+
|
|
12
19
|
# The display name of any record: its resource's title attribute, else to_s.
|
|
13
20
|
def record_title(record)
|
|
14
21
|
return "" if record.nil?
|
|
@@ -86,28 +93,49 @@ module Administratum
|
|
|
86
93
|
safe_join(buttons, " ")
|
|
87
94
|
end
|
|
88
95
|
|
|
89
|
-
|
|
96
|
+
# `menu: true` renders it as an item of an aside menu instead of a button.
|
|
97
|
+
def render_button(button, record = @resource, menu: false)
|
|
90
98
|
return unless button_visible?(button, record)
|
|
91
99
|
|
|
92
100
|
label = button.label || t("administratum.actions.#{button.name}", default: button.name.to_s.humanize)
|
|
93
|
-
|
|
101
|
+
styles = menu ? MENU_STYLES : BUTTON_STYLES
|
|
102
|
+
classes = styles.fetch(button.style, styles[:secondary])
|
|
94
103
|
|
|
95
104
|
return panel_button(button, label, classes, record) if button.panel || button.upload
|
|
96
105
|
|
|
97
106
|
url, http_method = button_target(button, record)
|
|
98
|
-
administratum_button(label, url, method: http_method, confirm: button.confirm, class: classes
|
|
107
|
+
administratum_button(label, url, method: http_method, confirm: button.confirm, class: classes,
|
|
108
|
+
form_class: (menu ? "adm-menu-form" : "adm-inline-form"))
|
|
99
109
|
end
|
|
100
110
|
|
|
101
111
|
# A link for GET, otherwise a one-button form (no rails-ujs needed).
|
|
102
|
-
def administratum_button(label, url, method: :get, confirm: nil, **options)
|
|
112
|
+
def administratum_button(label, url, method: :get, confirm: nil, form_class: "adm-inline-form", **options)
|
|
103
113
|
if method.to_sym == :get
|
|
104
114
|
link_to label, url, **options
|
|
105
115
|
else
|
|
106
116
|
form = { data: confirm ? { adm_confirm: confirm } : {} }
|
|
107
|
-
button_to label, url, method:, form:, form_class
|
|
117
|
+
button_to label, url, method:, form:, form_class:, **options
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Lays the block out beside the page's asides, or returns it as is when the
|
|
122
|
+
# page has none (or every button in them is hidden by `if:`).
|
|
123
|
+
def with_asides(page, record = @resource, &)
|
|
124
|
+
content = capture(&)
|
|
125
|
+
asides = asides_for(page, record)
|
|
126
|
+
return content if asides.blank?
|
|
127
|
+
|
|
128
|
+
tag.div(class: "adm-with-aside") do
|
|
129
|
+
tag.div(content, class: "adm-with-aside-main") + tag.aside(asides, class: "adm-aside")
|
|
108
130
|
end
|
|
109
131
|
end
|
|
110
132
|
|
|
133
|
+
# The aside menus for a page, without the surrounding layout.
|
|
134
|
+
def asides_for(page, record = @resource)
|
|
135
|
+
menus = definition.asides_for(page).filter_map { |aside| render_aside(aside, record) }
|
|
136
|
+
safe_join(menus) if menus.any?
|
|
137
|
+
end
|
|
138
|
+
|
|
111
139
|
# Tabs for the resource's index scopes. Switching tab keeps filters and sorting
|
|
112
140
|
# but goes back to the first page.
|
|
113
141
|
def index_scope_tabs
|
|
@@ -169,6 +197,17 @@ module Administratum
|
|
|
169
197
|
class: class_names("adm-btn adm-btn-danger", "adm-btn-sm" => small))
|
|
170
198
|
end
|
|
171
199
|
|
|
200
|
+
def render_aside(aside, record)
|
|
201
|
+
items = aside.buttons.filter_map { |button| render_button(button, record, menu: true) }
|
|
202
|
+
return if items.empty?
|
|
203
|
+
|
|
204
|
+
title = aside.title || t("administratum.actions.title")
|
|
205
|
+
tag.nav(class: "adm-card", "aria-label": title) do
|
|
206
|
+
tag.header(tag.h2(title, class: "adm-card-title"), class: "adm-card-header") +
|
|
207
|
+
tag.ul(safe_join(items.map { |item| tag.li(item) }), class: "adm-menu")
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
172
211
|
def button_visible?(button, record)
|
|
173
212
|
condition_met?(button.condition, record)
|
|
174
213
|
end
|
|
@@ -87,6 +87,9 @@ module Administratum
|
|
|
87
87
|
Button = Struct.new(:name, :label, :pages, :action, :to, :http_method, :confirm, :condition, :style, :panel, :upload,
|
|
88
88
|
keyword_init: true)
|
|
89
89
|
|
|
90
|
+
# A side menu of buttons beside a page's content, for actions that don't belong in the header.
|
|
91
|
+
Aside = Struct.new(:pages, :title, :buttons, keyword_init: true)
|
|
92
|
+
|
|
90
93
|
Parent = Struct.new(:name, :class_name, :shallow, :association, keyword_init: true) do
|
|
91
94
|
def model = class_name.constantize
|
|
92
95
|
def param = :"#{name}_id"
|
|
@@ -102,7 +105,8 @@ module Administratum
|
|
|
102
105
|
|
|
103
106
|
attr_accessor :model, :title_attribute, :permitted, :parent, :form_template, :scope_block, :route_key, :label,
|
|
104
107
|
:plural_label, :per_page, :default_sort, :csv, :reorder_column
|
|
105
|
-
attr_reader :fields, :columns, :custom_actions, :buttons, :show_attributes, :enabled_actions, :menu,
|
|
108
|
+
attr_reader :fields, :columns, :custom_actions, :buttons, :asides, :show_attributes, :enabled_actions, :menu,
|
|
109
|
+
:index_scopes
|
|
106
110
|
|
|
107
111
|
def initialize
|
|
108
112
|
@fields = []
|
|
@@ -110,6 +114,7 @@ module Administratum
|
|
|
110
114
|
@filters = nil
|
|
111
115
|
@custom_actions = {}
|
|
112
116
|
@buttons = []
|
|
117
|
+
@asides = []
|
|
113
118
|
@show_attributes = []
|
|
114
119
|
@index_scopes = []
|
|
115
120
|
@enabled_actions = BUILT_IN_ACTIONS.dup
|
|
@@ -124,6 +129,7 @@ module Administratum
|
|
|
124
129
|
@filters = source.declared_filters && rebind(source.declared_filters)
|
|
125
130
|
@custom_actions = source.custom_actions.dup
|
|
126
131
|
@buttons = source.buttons.map(&:dup)
|
|
132
|
+
@asides = source.asides.map { |aside| aside.dup.tap { |copy| copy.buttons = aside.buttons.map(&:dup) } }
|
|
127
133
|
@show_attributes = rebind(source.show_attributes)
|
|
128
134
|
@index_scopes = source.index_scopes.dup
|
|
129
135
|
@enabled_actions = source.enabled_actions.dup
|
|
@@ -240,16 +246,31 @@ module Administratum
|
|
|
240
246
|
enabled_actions.include?(name.to_sym)
|
|
241
247
|
end
|
|
242
248
|
|
|
243
|
-
def add_button(name, on:,
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
249
|
+
def add_button(name, on:, **)
|
|
250
|
+
buttons << build_button(name, on:, **)
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def build_button(name, on:, label: nil, action: nil, to: nil, method: nil, confirm: nil, condition: nil,
|
|
254
|
+
style: :secondary, panel: nil, upload: false)
|
|
255
|
+
Button.new(name: name.to_sym, label:, pages: Array(on).map(&:to_sym), action: (action || name).to_sym, to:,
|
|
256
|
+
http_method: method&.to_sym, confirm:, condition:, style: style.to_sym, panel:, upload:)
|
|
247
257
|
end
|
|
248
258
|
|
|
249
259
|
def buttons_for(page)
|
|
250
260
|
buttons.select { |button| button.pages.include?(page.to_sym) }
|
|
251
261
|
end
|
|
252
262
|
|
|
263
|
+
def add_aside(on:, title: nil)
|
|
264
|
+
pages = Array(on).map(&:to_sym)
|
|
265
|
+
raise Administratum::Error, "An aside can't go on :row" if pages.include?(:row)
|
|
266
|
+
|
|
267
|
+
Aside.new(pages:, title:, buttons: []).tap { |aside| asides << aside }
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def asides_for(page)
|
|
271
|
+
asides.select { |aside| aside.pages.include?(page.to_sym) }
|
|
272
|
+
end
|
|
273
|
+
|
|
253
274
|
def add_index_scope(name, label: nil, default: false, count: true, &block)
|
|
254
275
|
index_scopes.reject! { |index_scope| index_scope.name == name.to_sym }
|
|
255
276
|
index_scopes << IndexScope.new(name: name.to_sym, label:, block:, default:, count:)
|
data/lib/administratum/dsl.rb
CHANGED
|
@@ -35,6 +35,21 @@ module Administratum
|
|
|
35
35
|
|
|
36
36
|
include Common
|
|
37
37
|
|
|
38
|
+
# Builds `aside do ... end` button lists. Buttons take the same options as
|
|
39
|
+
# `button`, except `on:`, which comes from the aside.
|
|
40
|
+
class AsideBuilder
|
|
41
|
+
def initialize(definition, aside)
|
|
42
|
+
@definition = definition
|
|
43
|
+
@aside = aside
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def button(name, label: nil, action: nil, to: nil, method: nil, confirm: nil, if: nil, style: :secondary, panel: nil,
|
|
47
|
+
upload: false)
|
|
48
|
+
@aside.buttons << @definition.build_button(name, on: @aside.pages, label:, action:, to:, method:, confirm:,
|
|
49
|
+
condition: binding.local_variable_get(:if), style:, panel:, upload:)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
38
53
|
# Builds `form do ... end` field lists.
|
|
39
54
|
class FormBuilder
|
|
40
55
|
def initialize(definition)
|
|
@@ -124,6 +139,12 @@ module Administratum
|
|
|
124
139
|
ShowBuilder.new(definition).instance_eval(&)
|
|
125
140
|
end
|
|
126
141
|
|
|
142
|
+
# A menu of buttons beside the content of :index, :show, :new or :edit,
|
|
143
|
+
# for actions too minor for the page header. `title:` defaults to "Actions".
|
|
144
|
+
def aside(on:, title: nil, &)
|
|
145
|
+
AsideBuilder.new(definition, definition.add_aside(on:, title:)).instance_eval(&)
|
|
146
|
+
end
|
|
147
|
+
|
|
127
148
|
# Strong-params style list of writable attributes. Defaults to the form fields.
|
|
128
149
|
def permit(*attributes)
|
|
129
150
|
definition.permitted = attributes
|