+
+
+
diff --git a/templates/partials/app-main-aside.phtml b/templates/partials/app-main-aside.phtml
index 60007d3..56d7edb 100644
--- a/templates/partials/app-main-aside.phtml
+++ b/templates/partials/app-main-aside.phtml
@@ -420,27 +420,38 @@ $csrfToken = (string) ($layoutNav['csrfToken'] ?? '');
-
-
+
-
- >
-
-
-
-
+ t('No departments'),
+ 'size' => 'small',
+ 'align' => 'center',
+ ];
+ require templatePath('partials/app-empty-state.phtml');
+ ?>
-
+
+
+
+ -
+ >
+
+
+
+
+
diff --git a/web/css/base/variables.base.css b/web/css/base/variables.base.css
index e4d36c8..bcf6b60 100644
--- a/web/css/base/variables.base.css
+++ b/web/css/base/variables.base.css
@@ -70,6 +70,10 @@
--tooltip-radius: 8px;
--tooltip-offset: 8px;
--app-badge-background-color: coral;
+ --app-empty-border-color: var(--app-muted-border-color);
+ --app-empty-bg: var(--app-card-background-color);
+ --app-empty-text: var(--app-color);
+ --app-empty-hint: var(--app-muted-color);
}
/* Icons */
@@ -293,6 +297,20 @@
--app-notice-error-color: var(--app-form-element-invalid-border-color);
--app-notice-error-border-color: var(--app-form-element-invalid-border-color);
--app-notice-error-background-color: rgb(255 0 0 / 13%);
+ --app-action-success-background: #1f7a45;
+ --app-action-success-border: #1f7a45;
+ --app-action-success-color: #fff;
+ --app-action-success-hover-background: #176238;
+ --app-action-success-hover-border: #176238;
+ --app-action-success-focus-color: rgba(31, 122, 69, 0.45);
+ --app-action-success-outline-background: rgba(31, 122, 69, 0.14);
+ --app-action-danger-background: #b33636;
+ --app-action-danger-border: #b33636;
+ --app-action-danger-color: #fff;
+ --app-action-danger-hover-background: #952d2d;
+ --app-action-danger-hover-border: #952d2d;
+ --app-action-danger-focus-color: rgba(179, 54, 54, 0.45);
+ --app-action-danger-outline-background: rgba(179, 54, 54, 0.14);
--app-switch-background-color: #bfc7d9;
--app-switch-checked-background-color: var(--app-primary-background);
--app-switch-color: #fff;
@@ -311,10 +329,6 @@
--app-card-box-shadow: var(--app-box-shadow);
--app-card-sectioning-background-color: rgb(251, 251.5, 252.25);
--app-details-card-open-summary-bg: var(--app-card-sectioning-background-color);
- --app-empty-border-color: var(--app-muted-border-color);
- --app-empty-bg: var(--app-card-background-color);
- --app-empty-text: var(--app-color);
- --app-empty-hint: var(--app-muted-color);
--app-dropdown-background-color: #fff;
--app-dropdown-border-color: #eff1f4;
--app-dropdown-box-shadow: var(--app-box-shadow);
@@ -531,6 +545,20 @@
--app-form-element-valid-focus-color: var(
--app-form-element-valid-active-border-color
);
+ --app-action-success-background: #1f7a45;
+ --app-action-success-border: #1f7a45;
+ --app-action-success-color: #fff;
+ --app-action-success-hover-background: #176238;
+ --app-action-success-hover-border: #176238;
+ --app-action-success-focus-color: rgba(31, 122, 69, 0.5);
+ --app-action-success-outline-background: rgba(31, 122, 69, 0.2);
+ --app-action-danger-background: #b33636;
+ --app-action-danger-border: #b33636;
+ --app-action-danger-color: #fff;
+ --app-action-danger-hover-background: #952d2d;
+ --app-action-danger-hover-border: #952d2d;
+ --app-action-danger-focus-color: rgba(179, 54, 54, 0.5);
+ --app-action-danger-outline-background: rgba(179, 54, 54, 0.2);
--app-switch-background-color: #333c4e;
--app-switch-checked-background-color: var(--app-primary-background);
--app-switch-color: #fff;
@@ -766,6 +794,20 @@
--app-notice-error-color: var(--app-form-element-invalid-border-color);
--app-notice-error-border-color: var(--app-form-element-invalid-border-color);
--app-notice-error-background-color: rgba(149.5, 74, 80, 0.2);
+ --app-action-success-background: #1f7a45;
+ --app-action-success-border: #1f7a45;
+ --app-action-success-color: #fff;
+ --app-action-success-hover-background: #176238;
+ --app-action-success-hover-border: #176238;
+ --app-action-success-focus-color: rgba(31, 122, 69, 0.5);
+ --app-action-success-outline-background: rgba(31, 122, 69, 0.2);
+ --app-action-danger-background: #b33636;
+ --app-action-danger-border: #b33636;
+ --app-action-danger-color: #fff;
+ --app-action-danger-hover-background: #952d2d;
+ --app-action-danger-hover-border: #952d2d;
+ --app-action-danger-focus-color: rgba(179, 54, 54, 0.5);
+ --app-action-danger-outline-background: rgba(179, 54, 54, 0.2);
--app-switch-background-color: #333c4e;
--app-switch-checked-background-color: var(--app-primary-background);
--app-switch-color: #fff;
diff --git a/web/css/base/variables.contrast.css b/web/css/base/variables.contrast.css
index 5f5d2ab..6b16da2 100644
--- a/web/css/base/variables.contrast.css
+++ b/web/css/base/variables.contrast.css
@@ -21,6 +21,20 @@ html[data-contrast="high"][data-theme="light"],
--app-blockquote-border-color: var(--app-muted-border-color);
--app-tooltip-background-color: #000;
--app-tooltip-color: #fff;
+ --app-action-success-background: #0f5f00;
+ --app-action-success-border: #0f5f00;
+ --app-action-success-color: #fff;
+ --app-action-success-hover-background: #084700;
+ --app-action-success-hover-border: #084700;
+ --app-action-success-focus-color: rgba(15, 95, 0, 0.65);
+ --app-action-success-outline-background: rgba(15, 95, 0, 0.2);
+ --app-action-danger-background: #8f0000;
+ --app-action-danger-border: #8f0000;
+ --app-action-danger-color: #fff;
+ --app-action-danger-hover-background: #6f0000;
+ --app-action-danger-hover-border: #6f0000;
+ --app-action-danger-focus-color: rgba(143, 0, 0, 0.65);
+ --app-action-danger-outline-background: rgba(143, 0, 0, 0.2);
}
html[data-contrast="high"][data-theme^="dark"],
@@ -42,5 +56,19 @@ html[data-contrast="high"][data-theme^="dark"],
--app-blockquote-border-color: var(--app-muted-border-color);
--app-tooltip-background-color: #fff;
--app-tooltip-color: #0b0f14;
+ --app-action-success-background: #0f5f00;
+ --app-action-success-border: #0f5f00;
+ --app-action-success-color: #fff;
+ --app-action-success-hover-background: #084700;
+ --app-action-success-hover-border: #084700;
+ --app-action-success-focus-color: rgba(15, 95, 0, 0.7);
+ --app-action-success-outline-background: rgba(15, 95, 0, 0.24);
+ --app-action-danger-background: #8f0000;
+ --app-action-danger-border: #8f0000;
+ --app-action-danger-color: #fff;
+ --app-action-danger-hover-background: #6f0000;
+ --app-action-danger-hover-border: #6f0000;
+ --app-action-danger-focus-color: rgba(143, 0, 0, 0.7);
+ --app-action-danger-outline-background: rgba(143, 0, 0, 0.24);
}
}
diff --git a/web/css/components/app-buttons.css b/web/css/components/app-buttons.css
index 78c36db..3dd50b0 100644
--- a/web/css/components/app-buttons.css
+++ b/web/css/components/app-buttons.css
@@ -1,8 +1,54 @@
@layer components {
-.danger:is(button, [type="submit"], [type="button"], [role="button"]) {
- --app-background-color: var(--app-notice-error-border-color);
- --app-border-color: var(--app-notice-error-border-color);
- --app-color: var(--app-secondary-inverse);
+.app-action-success:is(button, [type="submit"], [type="button"], [role="button"]) {
+ --app-background-color: var(--app-action-success-background);
+ --app-border-color: var(--app-action-success-border);
+ --app-color: var(--app-action-success-color);
+}
+
+.app-action-success:is(button, [type="submit"], [type="button"], [role="button"]):is(
+ [aria-current]:not([aria-current="false"]),
+ :hover,
+ :active,
+ :focus
+ ) {
+ --app-background-color: var(--app-action-success-hover-background);
+ --app-border-color: var(--app-action-success-hover-border);
+ --app-color: var(--app-action-success-color);
+}
+
+.app-action-success:is(button, [type="submit"], [type="button"], [role="button"]).outline {
+ --app-background-color: transparent;
+ --app-border-color: var(--app-action-success-border);
+ --app-color: var(--app-action-success-border);
+}
+
+.app-action-success:is(
+ button,
+ [type="submit"],
+ [type="button"],
+ [role="button"]
+ ).outline:is(
+ [aria-current]:not([aria-current="false"]),
+ :hover,
+ :active,
+ :focus
+ ) {
+ --app-background-color: var(--app-action-success-outline-background);
+ --app-border-color: var(--app-action-success-border);
+ --app-color: var(--app-action-success-border);
+}
+
+.app-action-success:is(button, [type="submit"], [type="button"], [role="button"]):focus {
+ --app-box-shadow:
+ var(--app-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
+ 0 0 0 var(--app-outline-width) var(--app-action-success-focus-color);
+}
+
+.danger:is(button, [type="submit"], [type="button"], [role="button"]),
+.app-action-danger:is(button, [type="submit"], [type="button"], [role="button"]) {
+ --app-background-color: var(--app-action-danger-background);
+ --app-border-color: var(--app-action-danger-border);
+ --app-color: var(--app-action-danger-color);
}
.danger:is(button, [type="submit"], [type="button"], [role="button"]):is(
@@ -10,16 +56,23 @@
:hover,
:active,
:focus
+ ),
+.app-action-danger:is(button, [type="submit"], [type="button"], [role="button"]):is(
+ [aria-current]:not([aria-current="false"]),
+ :hover,
+ :active,
+ :focus
) {
- --app-background-color: var(--app-form-element-invalid-active-border-color);
- --app-border-color: var(--app-form-element-invalid-active-border-color);
- --app-color: var(--app-secondary-inverse);
+ --app-background-color: var(--app-action-danger-hover-background);
+ --app-border-color: var(--app-action-danger-hover-border);
+ --app-color: var(--app-action-danger-color);
}
-.danger:is(button, [type="submit"], [type="button"], [role="button"]).outline {
+.danger:is(button, [type="submit"], [type="button"], [role="button"]).outline,
+.app-action-danger:is(button, [type="submit"], [type="button"], [role="button"]).outline {
--app-background-color: transparent;
- --app-border-color: var(--app-notice-error-border-color);
- --app-color: var(--app-notice-error-border-color);
+ --app-border-color: var(--app-action-danger-border);
+ --app-color: var(--app-action-danger-border);
}
.danger:is(
@@ -32,15 +85,27 @@
:hover,
:active,
:focus
+ ),
+.app-action-danger:is(
+ button,
+ [type="submit"],
+ [type="button"],
+ [role="button"]
+ ).outline:is(
+ [aria-current]:not([aria-current="false"]),
+ :hover,
+ :active,
+ :focus
) {
- --app-background-color: var(--app-notice-error-background-color);
- --app-border-color: var(--app-notice-error-border-color);
- --app-color: var(--app-notice-error-border-color);
+ --app-background-color: var(--app-action-danger-outline-background);
+ --app-border-color: var(--app-action-danger-border);
+ --app-color: var(--app-action-danger-border);
}
-.danger:is(button, [type="submit"], [type="button"], [role="button"]):focus {
+.danger:is(button, [type="submit"], [type="button"], [role="button"]):focus,
+.app-action-danger:is(button, [type="submit"], [type="button"], [role="button"]):focus {
--app-box-shadow:
var(--app-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
- 0 0 0 var(--app-outline-width) var(--app-form-element-invalid-focus-color);
+ 0 0 0 var(--app-outline-width) var(--app-action-danger-focus-color);
}
}
diff --git a/web/css/components/app-empty-state.css b/web/css/components/app-empty-state.css
index ee2b5f4..38dd9e6 100644
--- a/web/css/components/app-empty-state.css
+++ b/web/css/components/app-empty-state.css
@@ -4,25 +4,43 @@
border-radius: var(--app-border-radius);
background: var(--app-empty-bg);
color: var(--app-empty-text);
- padding: calc(var(--app-spacing) * 0.875) var(--app-spacing);
+ padding: calc(var(--app-spacing) * 1.5) var(--app-spacing);
display: grid;
gap: calc(var(--app-spacing) * 0.35);
text-align: center;
+ justify-items: center;
}
.app-empty-state[data-size="compact"] {
- padding: calc(var(--app-spacing) * 0.625) calc(var(--app-spacing) * 0.75);
+ padding: calc(var(--app-spacing) * 0.75) calc(var(--app-spacing) * 0.75);
gap: calc(var(--app-spacing) * 0.25);
}
+ .app-empty-state[data-size="small"] {
+ padding: calc(var(--app-spacing) * 0.5) calc(var(--app-spacing) * 0.5);
+ gap: calc(var(--app-spacing) * 0.15);
+ }
.app-empty-state[data-align="left"] {
text-align: left;
+ justify-items: start;
+ }
+
+ .app-empty-state-icon {
+ color: var(--app-empty-hint);
+ opacity: 0.5;
+ margin-bottom: calc(var(--app-spacing) * 0.15);
+ }
+
+ .app-empty-state[data-size="compact"] .app-empty-state-icon {
+ width: 28px;
+ height: 28px;
+ margin-bottom: 0;
}
.app-empty-state-message {
margin: 0;
- color: var(--app-empty-text);
- font-size: 0.95rem;
+ color: var(--app-empty-hint);
+ font-size: 12px;
line-height: 1.4;
}
@@ -31,11 +49,12 @@
color: var(--app-empty-hint);
font-size: 0.85rem;
line-height: 1.3;
+ opacity: 0.75;
}
.app-empty-state-action {
justify-self: center;
- margin-top: calc(var(--app-spacing) * 0.15);
+ margin-top: calc(var(--app-spacing) * 0.25);
}
.app-empty-state[data-align="left"] .app-empty-state-action {