element and JS to swap the theme name on [data-theme] attribute */
-
-[data-theme="dark"] {
- color-scheme: dark;
-
- /* Basis */
- --surfaceElevation0: var(--stone900);
- --surfaceElevation1: var(--stone800);
- --surfaceElevation2: var(--stone700);
- --surfaceBackdrop: rgba(0, 0, 0, 0.72);
- --textPrimary: #FBFBFB;
- --textSecondary: rgba(251, 251, 251, 0.72);
- --textDisabled: rgba(251, 251, 251, 0.40);
-
- /* Lines */
- --lineDivider: rgba(255, 255, 255, 0.25);
- --lineDividerStrong: rgba(255, 255, 255, 0.50);
- --lineDividerStronger: #fff;
- --lineContour: rgba(255, 255, 255, 0.08);
- --lineFocus: var(--sky600);
-
- /* Primary */
- --primaryMain: var(--sunset300);
- --primaryLight: var(--sunset200);
- --primaryDark: var(--sunset400);
- --primaryContrast: var(--black);
- --primaryHover: rgba(245, 106, 51, 0.08);
- --primarySelected: rgba(245, 106, 51, 0.12);
- --primaryFocus: rgba(245, 106, 51, 0.15);
-
- /* Action */
- --actionHover: rgba(240, 241, 244, 0.08);
- --actionDisabled: rgba(240, 241, 244, 0.15);
- --actionFocus: rgba(240, 241, 244, 0.15);
-
- /* Success */
- --successMain: var(--green400);
- --successLight: var(--green300);
- --successDark: var(--green500);
- --successContrast: var(--white);
- --successSurface: var(--successDark);
-
- /* Warning */
- --warningMain: var(--sunset400);
- --warningLight: var(--sunset300);
- --warningDark: var(--sunset500);
- --warningContrast: var(--white);
- --warningSurface: var(--warningDark);
-
- /* Info */
- --infoMain: var(--sky400);
- --infoLight: var(--sky300);
- --infoDark: var(--sky500);
- --infoContrast: var(--white);
- --infoSurface: var(--infoDark);
-
- /* Error */
- --errorMain: var(--red300);
- --errorLight: var(--red200);
- --errorDark: var(--red400);
- --errorContrast: var(--white);
- --errorSurface: var(--errorDark);
-
- /* Stopped */
- --stoppedContrast: var(--white);
- --stoppedSurface: var(--stone500);
-
- /* Lost */
- --lostContrast: var(--white);
- --lostSurface: var(--sunset500);
-
- /* Stale */
- --staleContrast: var(--warningContrast);
- --staleSurface: var(--warningSurface);
-}
-
-body[data-theme="dark"] .theme-change.dark,
-body[data-theme="light"] .theme-change.light {
- display: none;
-}
-
-/*=============================================*/
-/* Setting the stage and the layout */
-/*=============================================*/
-
-html {
- font-size: 100%;
-}
-
-html:not(.fonts-loaded) body {
- opacity: 0;
-}
-
-html.fonts-loaded body {
- opacity: 1;
-}
-
-html,
-body {
- height: 100%;
- margin: 0;
- overflow: hidden;
-}
-
-body {
- display: grid;
- grid-template-rows: auto 1fr;
- font-family: 'Roboto', sans-serif;
- font-weight: 400;
- font-size: 1em;
- line-height: 1.375;
- margin: 0;
- color: var(--textPrimary);
- background: var(--surfaceElevation0);
- transition: opacity .05s ease-out .05s;
-}
-
-body[data-theme="dark"] {
- font-weight: 350;
-}
-
-/*=============================================*/
-/* Typography styling */
-/*=============================================*/
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-family: 'Poppins', sans-serif;
- font-weight: 600;
- line-height: 1.0625;
- margin: 0.75em 0 0.25em;
-}
-
-h1 {
- margin-top: 0 !important;
-}
-
-h1,
-.h1 {
- font-size: 3em;
- letter-spacing: -0.03125em;
-}
-
-h2,
-.h2 {
- font-size: 2.5em;
- letter-spacing: -0.015625em;
-}
-
-h3,
-.h3,
-.app-content h1,
-.app-content h2 {
- font-size: 2.0625em;
-}
-
-h4,
-.h4 {
- font-size: 1.75em;
-}
-
-h5,
-.h5 {
- font-size: 1.4375em;
- line-height: 1.125;
-}
-
-h6,
-.h6 {
- font-size: 1.1875em;
- line-height: 1.25;
-}
-
-p {
- line-height: 1.375em;
- margin: 0 0 1.375em;
-}
-
-sup {
- margin-top: -0.5em;
-}
-
-pre {
- font-family: 'Roboto Mono', monospace;
- font-size: 1em;
- line-height: 1.25;
- margin: 0;
-}
-
-.soft-wrap {
- white-space: pre-wrap;
- word-wrap: break-word;
-}
-
-/*=============================================*/
-/* Brand assets */
-/*=============================================*/
-
-#perconaLogo #wordmark {
- fill: var(--textPrimary);
-}
-
-#githubLogo {
- fill: currentColor;
-}
-
-/*=============================================*/
-/* Interaction touchpoints like links and buttons */
-/*=============================================*/
-
-:focus-visible,
-input[type="checkbox"]:focus-visible~.checkmark {
- outline: 0.1875rem solid var(--lineFocus);
- outline-offset: 0.125rem;
-}
-
-/* Links */
-
-a {
- color: inherit;
- cursor: pointer;
- transition: opacity .2s, color .2s, outline .1s;
-}
-
-a:link {
- color: var(--primaryMain);
- text-decoration: underline;
-}
-
-a:visited {
- color: var(--primaryMain);
-}
-
-a:hover,
-a:active {
- color: var(--primaryLight);
-}
-
-/* Buttons */
-
-/* Base styling */
-
-button {
- font-family: 'Poppins', sans-serif;
- font-size: 0.8125em;
- font-weight: 600;
- line-height: 1.0625;
- display: flex;
- justify-content: center;
- align-items: center;
- gap: 0.25rem;
- background: none;
- border: none;
- border-radius: var(--cornerFull);
- cursor: pointer;
- color: var(--textPrimary)
-}
-
-button[disabled] {
- color: var(--textDisabled);
- box-shadow: none;
- cursor: not-allowed;
-}
-
-/* Base sizes */
-
-button.large {
- font-size: 0.9375em;
- padding: 1rem 1.5rem;
-}
-
-button.medium {
- padding: 0.6875rem 1rem;
- min-width: 6rem;
-}
-
-button.small {
- padding: 0.5rem 0.9375rem;
-}
-
-/* Button Contained variant */
-
-button.contained {
- color: var(--primaryContrast);
- background: var(--primaryMain);
- box-shadow: var(--elevation2);
- transition: background .2s, box-shadow .2s;
-}
-
-button.contained:hover:not([disabled]),
-button.contained:active:not([disabled]),
-button.contained:focus:not([disabled]) {
- background: var(--primaryDark);
- box-shadow: var(--elevation4);
-}
-
-button.contained[disabled] {
- background: var(--actionDisabled);
-}
-
-/* Button Outlined variant */
-
-button.outlined {
- color: var(--primaryMain);
- border: 0.125rem solid var(--primaryMain);
- transition: border .2s, color .2s, background .2s;
-}
-
-button.outlined:hover:not([disabled]),
-button.outlined:active:not([disabled]),
-button.outlined:focus:not([disabled]) {
- color: var(--primaryDark);
- background: var(--primaryHover);
- border-color: var(--primaryDark);
-}
-
-button.outlined:focus:not([disabled]) {
- background: var(--primaryFocus);
-}
-
-button.outlined[disabled] {
- color: var(--textDisabled);
- border-color: var(--textDisabled);
-}
-
-button.text {
- color: var(--primaryMain);
- transition: background .2s, color .2s;
-}
-
-button.text.large {
- padding: 0.5rem 0.6875rem;
-}
-
-button.text.medium {
- padding: 0.375rem 0.5rem;
-}
-
-button.text.small {
- padding: 0.25rem 0.3125rem;
-}
-
-button.text:hover:not([disabled]),
-button.text:active:not([disabled]),
-button.text:focus:not([disabled]) {
- color: var(--primaryDark);
- background: var(--primaryHover);
-}
-
-button.text[disabled] {
- color: var(--textDisabled);
-}
-
-/* Button Icon variant */
-
-button.icon {
- color: var(--textPrimary);
- transition: background .2s, color .2s;
-}
-
-button.icon:hover:not([disabled]),
-button.icon:active:not([disabled]),
-button.icon:focus:not([disabled]) {
- color: var(--primaryMain);
- background: var(--primaryHover);
-}
-
-button.icon.large {
- padding: 0.75rem;
-}
-
-button.icon.large .material-symbols-outlined {
- font-size: 2.5rem;
-}
-
-button.icon.medium {
- padding: 0.5rem;
-}
-
-button.icon.medium .material-symbols-outlined {
- font-size: 1.5rem;
-}
-
-button.icon.small {
- padding: 0.6875rem;
-}
-
-button.icon.small .material-symbols-outlined {
- font-size: 1.25rem;
-}
-
-button.icon[disabled] {
- color: var(--textDisabled);
-}
-
-/* Interactivity behaviors and utility classes */
-
-[aria-hidden="true"],
-.visually-hidden {
- display: none;
-}
-
-[aria-hidden="false"] {
- display: block;
-}
-
-.flex {
- display: flex;
-}
-
-.text-align-right {
- text-align: right !important;
-}
-
-/* Tabs */
-/* Layout */
-
-.tabs {
- display: flex;
- flex-wrap: wrap;
- border-bottom: 0.0625rem solid var(--lineDivider);
-}
-
-.tabs-container.card {
- padding: 1em;
- outline: 0.0625rem solid var(--lineDivider);
- border-radius: var(--cornerSmall);
- background: var(--surfaceElevation1);
-}
-
-/* Button Tab variant */
-
-button[role="tab"],
-button[role="log-tab"] {
- display: flex;
- width: fit-content;
- gap: 0.375rem;
- min-height: 3rem;
- padding: 0.5rem 1rem 0.25rem;
- border-bottom: 0.25rem solid transparent;
- border-radius: 0;
- color: var(--textSecondary);
- transition: background .2s, color .2s, border-color .2s;
-}
-
-button[role="tab"]:hover,
-button[role="log-tab"]:hover {
- color: var(--primaryLight);
- background: var(--primaryHover);
-}
-
-button[role="tab"][aria-selected="true"],
-button[role="log-tab"][aria-selected="true"] {
- color: var(--textPrimary);
- background: none;
- border-color: var(--primaryMain);
- cursor: default;
-}
-
-button[role="tab"][aria-selected="true"]:focus-visible,
-button[role="log-tab"][aria-selected="true"]:focus-visible {
- outline-style: dashed;
-}
-
-dialog div.window footer button {
- width: fit-content;
-}
-
-/* Inputs global */
-
-label+input {
- margin-top: 0.5em;
-}
-
-input[type="search"],
-input[type="datetime-local"],
-select,
-.datatable-selector {
- font-family: 'Roboto', sans-serif;
- font-weight: 400;
- font-size: 1em;
- line-height: 1.5;
- box-sizing: border-box;
- height: 2.5em;
- padding: 0.375em 0.75em;
- border: 0.125rem solid var(--lineDivider);
- border-radius: var(--cornerExtraSmall);
- color: var(--textPrimary);
- background: var(--surfaceElevation1);
- transition: border-color .1s;
-}
-
-input[type="search"]:hover,
-input[type="datetime-local"]:hover,
-select:not(:disabled):hover {
- border-color: var(--lineDividerStrong);
- cursor: pointer;
-}
-
-input[type="search"]:focus,
-input[type="datetime-local"]:focus,
-select:focus {
- border-color: var(--lineDividerStronger);
-}
-
-select {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- width: -webkit-fit-content;
- width: -moz-fit-content;
- width: fit-content;
-}
-
-select[multiple] {
- display: flex;
- flex-direction: column;
- gap: 0.25em;
- height: fit-content;
- max-height: 10em;
- padding: 0.25em;
-}
-
-select[multiple] option {
- padding: 0.25em 0.5em;
- border-radius: var(--cornerExtraSmall);
-}
-
-select[multiple] option+option {
- margin-top: 0.25em;
-}
-
-select:disabled {
- color: var(--textDisabled);
- background: var(--actionDisabled);
-}
-
-.input .material-symbols-outlined,
-.select .material-symbols-outlined {
- font-size: 1.5rem;
- pointer-events: none;
-}
-
-.input,
-.select>* {
- display: inline-block;
- position: relative;
- max-width: 100%;
-}
-
-.input.icon-left .material-symbols-outlined {
- position: absolute;
- top: 0.5rem;
- left: 0.75rem;
-}
-
-.select .material-symbols-outlined,
-.input.icon-right .material-symbols-outlined {
- position: absolute;
- top: 0.5rem;
- right: 0.75rem;
-}
-
-.select select:not([multiple]),
-.input.icon-right {
- padding-right: 2.625em;
-}
-
-.input.icon-left input {
- padding-left: 2.625em;
-}
-
-.select .label {
- color: var(--textSecondary);
- pointer-events: none;
-}
-
-.checkbox {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- user-select: none;
- cursor: pointer;
-}
-
-.checkbox.disabled {
- cursor: not-allowed;
- opacity: 0.5;
-}
-
-input[type="checkbox"] {
- opacity: 0;
- height: 0;
- width: 0;
- cursor: pointer;
-}
-
-.checkmark {
- display: flex;
- justify-content: center;
- align-items: center;
- width: 2.5rem;
- height: 2.5rem;
- border-radius: var(--cornerFull);
- transition: background .2s;
-}
-
-.checkbox:not(.disabled):hover .checkmark {
- background: var(--primaryHover);
-}
-
-.checkmark .checked {
- color: var(--primaryMain);
-}
-
-input[type="checkbox"]:focus-visible~.checkmark {
- background: var(--primaryFocus);
- outline-offset: -0.1875rem;
-}
-
-input[type="checkbox"]~.checkmark .checked,
-input[type="checkbox"]:checked~.checkmark .unchecked {
- display: none;
-}
-
-input[type="checkbox"]~.checkmark .unchecked,
-input[type="checkbox"]:checked~.checkmark .checked {
- display: block;
-}
-
-/*=============================================*/
-/* Header */
-/*=============================================*/
-
-header.topnav {
- position: -webkit-sticky;
- position: sticky;
- display: flex;
- justify-content: space-between;
- flex-wrap: wrap;
- gap: 0.25rem;
- top: 0;
- z-index: 2;
- padding: 0.75em;
- background: var(--surfaceElevation1);
- outline: 0.0625rem solid var(--lineDivider);
-}
-
-.app-logo {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- gap: 0.5rem;
- padding: 0.25em;
-}
-
-.app-logo:hover {
- opacity: 0.7;
-}
-
-a.app-logo:link,
-a.app-logo:visited,
-a.app-logo:hover,
-a.app-logo:active {
- color: var(--primaryMain);
- text-decoration: none;
-}
-
-.app-logo svg {
- height: 1.75em;
-}
-
-.app-logo .label {
- font-family: 'Poppins', sans-serif;
- font-weight: 600;
- font-size: 1.0625em;
-}
-
-.app-logo .label.acronym {
- display: none;
-}
-
-.app-breadcrumbs {
- font-family: 'Poppins', sans-serif;
- font-weight: 500;
- font-size: 0.8125em;
- line-height: 1.0625;
- flex: 1 0 100%;
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- gap: 0.5rem;
- padding: 0.25rem;
- color: var(--textSecondary);
- transition: -webkit-text-decoration .2s;
- transition: text-decoration .2s;
- transition: text-decoration .2s, -webkit-text-decoration .2s;
-}
-
-.app-breadcrumbs>* {
- flex-grow: 0;
-}
-
-.app-breadcrumbs a:link {
- text-decoration: none;
- transition: -webkit-text-decoration .2s;
- transition: text-decoration .2s;
- transition: text-decoration .2s, -webkit-text-decoration .2s;
-}
-
-.app-breadcrumbs a:hover,
-.app-breadcrumbs a:active {
- text-decoration: underline;
-}
-
-.app-breadcrumbs .separator {
- font-size: 1.25rem;
-}
-
-.app-nav {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- gap: 1rem;
-}
-
-@media (max-width: 560px) {
- .app-logo .label {
- display: none;
- }
-
- .app-logo .label.acronym {
- display: unset;
- }
-}
-
-/*=============================================*/
-/* Menu component */
-/*=============================================*/
-
-.menu .content {
- position: absolute;
- top: 0;
- left: 0;
- width: 16em;
- max-width: calc(100vw - 2em);
- background: var(--surfaceElevation1);
- border-radius: var(--cornerExtraSmall);
- outline: 0.0625rem solid var(--lineContour);
- box-shadow: var(--elevation8);
- z-index: 13;
-}
-
-.menu ul {
- list-style: none;
- padding: 0.5em 0;
- margin: 0;
-}
-
-.menu ul:not(:first-of-type) {
- border-top: 0.0625rem solid var(--lineDivider);
-}
-
-/*=============================================*/
-/* Tooltip */
-/*=============================================*/
-
-.tooltip {
- font-size: 0.875em;
- text-align: center;
- max-width: 15rem;
- padding: 0.375em 0.5em;
- color: var(--stone50);
- background: var(--stone900);
- border: 0.0625rem solid var(--lineDivider);
- border-radius: var(--cornerExtraSmall);
- box-shadow: var(--elevation4);
-}
-
-/*=============================================*/
-/* Modal overlay dialog */
-/*=============================================*/
-
-dialog {
- position: relative;
- text-align: initial;
- color: var(--textPrimary);
- background: var(--surfaceElevation1);
- width: calc(100vw - 2em);
- height: -webkit-fit-content;
- height: -moz-fit-content;
- height: fit-content;
- max-height: calc(100vh - 2em);
- padding: 0;
- border: 0.0625rem solid var(--lineDivider);
- border-radius: var(--cornerSmall);
- box-shadow: var(--elevation24);
- z-index: 34;
-}
-
-dialog.large {
- max-width: 50em;
-}
-
-dialog.medium {
- max-width: 40em;
-}
-
-dialog.small {
- max-width: 30em;
-}
-
-dialog.fullwidth {
- height: 87.5vh;
- max-width: 100vw;
-}
-
-dialog::-webkit-backdrop {
- background: var(--surfaceBackdrop);
-}
-
-dialog::backdrop {
- background: var(--surfaceBackdrop);
-}
-
-dialog .window {
- box-sizing: border-box;
- display: flex;
- flex-direction: column;
- width: 100%;
- height: 100%;
-}
-
-dialog header,
-dialog section,
-dialog footer {
- display: flex;
- flex-wrap: wrap;
-}
-
-dialog header,
-dialog footer {
- flex: 0 0 auto;
-}
-
-dialog header {
- justify-content: space-between;
- gap: 0.5em;
- padding: 1em 1em 0;
-}
-
-dialog footer {
- justify-content: flex-end;
- gap: 0.5em;
- padding: 1em;
-}
-
-dialog section {
- flex: 1 1 auto;
- box-sizing: border-box;
- flex-direction: column;
- padding: 1em;
- overflow-y: auto;
-}
-
-input:disabled {
- display: none;
-}
-
-dialog .title {
- margin: 0;
-}
-
-dialog section> :last-child {
- margin-bottom: 0;
-}
-
-dialog button[role="tab"]:focus-visible,
-dialog button[role="log-tab"]:focus-visible {
- outline-offset: -0.1875rem;
-}
-
-/*=============================================*/
-/* Interactive List Item for menus and other navigation lists */
-/*=============================================*/
-
-a.list-item,
-button.list-item {
- font-size: 1em;
- text-align: left;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- width: 100%;
- padding: 0.5rem 1rem;
- border-radius: 0;
- box-sizing: border-box;
- color: var(--textPrimary);
- text-decoration: none;
- transition: background .2s, color .2s;
- cursor: pointer;
-}
-
-a.list-item:hover,
-button.list-item:hover {
- color: var(--primaryLight);
- background: var(--primaryHover);
-}
-
-a.list-item.active,
-button.list-item.active {
- color: var(--primaryMain);
- background: var(--primarySelected);
-}
-
-a.list-item:focus-visible,
-button.list-item:focus-visible {
- outline-offset: -0.1875rem;
-}
-
-.list-item .label {
- flex: 1 1 auto;
- font-family: 'Poppins', sans-serif;
- font-weight: 600;
- font-size: 0.875em;
- line-height: 1.375;
-}
-
-.list-item .icon::before {
- display: block;
-}
-
-.list-item.alters .icon::before {
- content: "table_edit";
-}
-
-.list-item.archive .icon::before {
- content: "archive";
-}
-
-.list-item.backups .icon::before {
- content: "history";
-}
-
-.list-item.mysql_backups .icon::before {
- content: "history";
-}
-
-.list-item.restores .icon::before {
- content: "refresh";
-}
-
-.list-item.checksums .icon::before {
- content: "new_releases";
-}
-
-.list-item.backup_mongo .icon::before {
- content: "nature";
-}
-
-.list-item.backup_pg .icon::before {
- content: "backup";
-}
-
-.list-item.inventory .icon::before {
- content: "graph_4";
-}
-
-.list-item.tasks .icon::before {
- content: "assignment_turned_in";
-}
-
-.list-item.snippets .icon::before {
- content: "snippet_folder";
-}
-
-.list-item.atw .icon::before {
- content: "support";
-}
-
-.list-item.dipper .icon::before {
- content: "science";
-}
-
-.list-item.alerts .icon::before {
- content: "notifications";
-}
-
-.list-item.alert-troubleshooting .icon::before {
- content: "troubleshoot";
-}
-
-.list-item.report .icon::before {
- content: "assignment";
-}
-
-/*=============================================*/
-/* Foundations for the sidebar type of layout */
-/*=============================================*/
-
-.sidebar-layout {
- display: flex;
- align-items: stretch;
- overflow: hidden;
-}
-
-.sidebar {
- position: -webkit-sticky;
- position: sticky;
- flex: 0 0 16em;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- top: 0;
- z-index: 1;
- overflow-y: auto;
- padding: 0.5em 0;
-}
-
-.app-content {
- flex: 1 1 auto;
- padding: 1em;
- overflow-y: auto;
-}
-
-.vr {
- width: 0.0625rem;
- background: var(--lineDivider);
- margin: 1em 0;
-}
-
-/* Sidebar component */
-
-.sidebar ul {
- list-style: none;
- padding: 0.5em 0;
- margin: 0;
-}
-
-footer {
- padding: 0 1em;
-}
-
-footer ul {
- display: flex;
- flex-direction: column;
- gap: 0.5em;
-}
-
-footer li {
- font-size: 0.875em;
-}
-
-footer .link {
- display: flex;
- gap: 0.25rem;
-}
-
-footer a:link {
- text-decoration: none;
-}
-
-footer a:link .label {
- text-decoration: underline;
-}
-
-footer .link .material-symbols-outlined {
- font-size: 1.25rem;
-}
-
-footer .link svg {
- width: 1.25rem;
- height: 1.125rem;
-}
-
-/*=============================================*/
-/* Messaging components */
-/*=============================================*/
-
-/* Badge */
-
-.status .badge {
- vertical-align: -0.25rem;
- font-size: 1.25em;
- padding: 0.1875rem;
- border: 0.0625rem solid var(--lineContour);
- border-radius: var(--cornerFull);
-}
-
-.status .success {
- color: var(--successContrast);
-}
-
-.status .error,
-.status .failed {
- color: var(--errorContrast);
-}
-
-.status .stopped {
- color: var(--stoppedContrast);
-}
-
-.status .lost {
- color: var(--lostContrast);
-}
-
-.status .stale {
- color: var(--staleContrast);
-}
-
-.success .badge {
- background: var(--successSurface);
-}
-
-.error .badge,
-.failed .badge {
- background: var(--errorSurface);
-}
-
-.stopped .badge {
- background: var(--stoppedSurface);
-}
-
-.lost .badge {
- background: var(--lostSurface);
-}
-
-.stale .badge {
- background: var(--staleSurface);
-}
-
-/*=============================================*/
-/* Global styling for plugins apps */
-/*=============================================*/
-
-.app-intro {
- max-width: 50em;
- padding: 0.375em 1em 1em;
-}
-
-.app-intro :first-child {
- margin-top: 0;
-}
-
-.app-intro :last-child {
- margin-bottom: 0;
-}
-
-.app-stage>.tabs {
- margin: 0 1em 0.0625em;
- border: none;
-}
-
-/*=============================================*/
-/* Simple-DataTables styling and overrides */
-/*=============================================*/
-
-/* Simple-DataTables layout and global */
-
-.datatable-container {
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- width: 100%;
-}
-
-.datatable-table {
- width: auto;
- min-width: 100%;
-}
-
-.datatable-top::after,
-.datatable-bottom::after {
- display: none;
-}
-
-.datatable-top,
-.datatable-bottom {
- display: flex;
- flex-wrap: wrap;
- justify-content: space-between;
- gap: 1.5em;
- padding: 0.5em;
-}
-
-.datatable-top {
- padding-bottom: 1.5em;
-}
-
-.datatable-bottom {
- padding-top: 1em;
-}
-
-.datatable-wrapper.no-footer .datatable-container {
- border-top: 0.0625rem solid var(--lineDivider);
- border-bottom: 0.0625rem solid var(--lineDivider);
-}
-
-tbody tr:not(:last-child) td {
- border-bottom: 0.0625rem solid var(--lineDivider);
-}
-
-/* Simple-DataTables header components */
-
-.datatable-search .datatable-input {
- width: 20em;
- max-width: 100%;
-}
-
-.datatable-dropdown .datatable-selector {
- margin-left: 0.25em;
-}
-
-/* Simple-DataTables footer components */
-
-.datatable-info {
- color: var(--textSecondary);
- padding: 0.5625em 0;
- margin: 0;
-}
-
-.datatable-pagination-list {
- display: flex;
- flex-wrap: wrap;
-}
-
-.datatable-pagination-list-item:first-child,
-.datatable-pagination-list-item:last-child {
- order: 2;
-}
-
-.datatable-pagination li.datatable-hidden {
- visibility: visible;
-}
-
-.datatable-pagination-list button {
- display: block;
- font-family: 'Poppins', sans-serif;
- font-weight: 600;
- font-size: 0.9375em;
- line-height: 1.0625;
- text-align: center;
- min-width: 2.5rem;
- min-height: 2.5rem;
- padding: 0.5rem 0.6875rem;
- margin: 0;
- color: var(--textSecondary);
- background: none;
- transition: background .2s, color .2s;
-}
-
-.datatable-pagination-list button:hover {
- color: var(--primaryLight);
- background: var(--primaryHover);
-}
-
-.datatable-pagination .datatable-active a,
-.datatable-pagination .datatable-active a:focus,
-.datatable-pagination .datatable-active a:hover,
-.datatable-pagination .datatable-active button,
-.datatable-pagination .datatable-active button:focus,
-.datatable-pagination .datatable-active button:hover {
- color: var(--primaryMain);
- background: var(--primarySelected);
- transition: background .2s;
-}
-
-.datatable-pagination-list-item:last-child .datatable-pagination-list-item-link,
-.datatable-pagination-list-item:first-child .datatable-pagination-list-item-link {
- display: flex;
- font-family: 'Material Symbols Outlined';
- font-weight: 400;
- font-size: 1.5em;
- width: 2.5rem;
- height: 2.5rem;
-}
-
-/* Simple-DataTables table styling */
-
-.datatable-table>thead>tr>th {
- border-bottom: 0.0625rem solid var(--lineDivider);
-}
-
-.datatable-table>tbody>tr>th,
-.datatable-table>tfoot>tr>th,
-.datatable-table>thead>tr>th,
-.datatable-sorter {
- font-weight: 500;
- line-height: 1.25;
- padding: 0.875em 0.5em;
- vertical-align: middle;
-}
-
-.datatable-table>tbody>tr>th[data-sortable="true"],
-.datatable-table>tfoot>tr>th[data-sortable="true"],
-.datatable-table>thead>tr>th[data-sortable="true"] {
- padding: 0;
-}
-
-.datatable-table>tbody>tr>td,
-.datatable-table>tfoot>tr>td,
-.datatable-table>thead>tr>td {
- line-height: 1.375;
- padding: 0.8125em 0.5em;
-}
-
-.datatable-sorter {
- display: flex;
- justify-content: flex-start;
- align-items: center;
- gap: 0.25em;
- border-radius: 0;
- transition: background .2s, color .2s;
-}
-
-.datatable-sorter:hover {
- color: var(--primaryLight);
- background: var(--primaryHover);
-}
-
-.datatable-sorter:focus-visible {
- outline-offset: -0.1875rem;
-}
-
-.datatable-sorter::before,
-.datatable-sorter::after {
- position: initial;
- display: none;
- order: 2;
- font-family: 'Material Symbols Outlined';
- font-weight: 400;
- font-size: 1.25rem;
- line-height: 1;
- height: auto;
- width: auto;
- top: auto;
- right: auto;
- bottom: auto;
- max-height: 2.5rem;
- border: none;
- opacity: 1;
-}
-
-.datatable-sorter::before {
- content: "south";
-}
-
-.datatable-sorter::after {
- content: "north";
-}
-
-.datatable-ascending .datatable-sorter::after,
-.datatable-descending .datatable-sorter::before,
-.datatable-ascending .datatable-filter::after,
-.datatable-descending .datatable-filter::before {
- display: flex;
- opacity: 1;
-}
-
-/* Simple-DataTables SEP styling flavors */
-
-.datatable-table>thead>tr>th.options,
-.datatable-table>tbody>tr>td.options {
- text-align: right;
- padding-top: 0.25em;
- padding-bottom: 0.25em;
-}
-
-.datatable-table>thead>tr>th.number,
-.datatable-table>tbody>tr>td.number {
- text-align: right;
-}
-
-th.options .datatable-sorter,
-th.number .datatable-sorter {
- justify-content: flex-end;
-}
-
-button.icon:focus-visible {
- outline-offset: 0;
-}
-
-th.options>*:not(dialog),
-td.options>*:not(dialog) {
- display: inline-flex;
-}
-
-.datatable-table>tbody>tr>td.code {
- font-family: 'Roboto Mono', monospace;
- font-size: 1em;
- line-height: 1;
- padding-top: 1em;
- padding-bottom: 1em;
-}
-
-.datatable-table>tbody>tr>td.status {
- padding: 0.625em 0.5em;
-}
-
-td.errors ul {
- padding: 0 0 0 1.375em;
- margin: 0;
-}
-
-/*=============================================*/
-/* Log Containers */
-/*=============================================*/
-
-.modal-log header {
- flex-direction: column;
- padding: 0;
-}
-
-.modal-log header .title {
- padding: 1rem 1rem 0;
-}
-
-.modal-log header .tabs {
- align-items: center;
- flex-wrap: wrap-reverse;
-}
-
-.modal-log header .checkbox {
- order: 3;
- margin: 0 1rem 0 auto;
-}
-
-.modal-log footer {
- border-top: 0.0625rem solid var(--lineDivider);
-}
-
-.log-content {
- width: 100%;
- color: var(--textPrimary);
- background: var(--surfaceElevation0);
-}
-
-.log-content>* {
- width: 100%;
-}
-
-/* Monospace like ; headings are h4/h5 so override global Poppins on h4–h6 */
-.log-events-view {
- box-sizing: border-box;
- width: 100%;
- min-height: 12rem;
- padding: 0.75rem 1rem 1rem;
- overflow: auto;
- font-family: 'Roboto Mono', ui-monospace, monospace;
- font-size: 1em;
- line-height: 1.4;
- color: var(--textPrimary);
- background: var(--surfaceElevation0);
-}
-
-.log-events-view__title {
- margin: 0 0 0.75rem;
- font-size: 1em;
- font-weight: 600;
- font-family: 'Roboto Mono', ui-monospace, monospace;
-}
-
-.log-events-view h4.log-events-view__title,
-.log-events-view h5.log-events-step__title {
- font-family: 'Roboto Mono', ui-monospace, monospace;
-}
-
-.log-events-step {
- margin: 0 0 1rem;
- padding: 0 0 0.5rem;
-}
-
-.log-events-step:last-child {
- border-bottom: none;
- margin-bottom: 0;
-}
-
-.log-events-step__title {
- margin: 0 0 0.5rem;
- font-size: 1em;
- font-weight: 600;
- font-family: 'Roboto Mono', ui-monospace, monospace;
-}
-
-.log-events-step__list {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-
-.log-events-step__item {
- margin: 0 0 0.65rem;
-}
-
-.log-events-step__time {
- display: block;
- margin-bottom: 0.15rem;
- opacity: 0.88;
- font-size: 0.875em;
- font-family: inherit;
-}
-
-.log-events-step__body {
- white-space: pre-wrap;
- word-break: break-word;
-}
-
-.log-events-step-panels .log-events-step-panel {
- display: none;
-}
-
-.log-events-step-missing {
- display: none;
- margin: 0.5rem 0 0;
- padding: 0.75rem 0;
- opacity: 0.85;
- font-family: inherit;
-}
-
-.sep-stream-error {
- box-sizing: border-box;
- padding: 1rem 1.25rem;
- margin-bottom: 0.75rem;
- border-radius: var(--cornerExtraSmall, 0.25rem);
- border: 0.0625rem solid var(--lineDivider, #ccc);
- background: var(--surfaceElevation1, #f5f5f5);
- font-family: 'Poppins', sans-serif;
- font-size: 0.875rem;
- line-height: 1.45;
-}
-
-.sep-stream-error--gone {
- border-color: var(--errorMain, #c62828);
- background: color-mix(in srgb, var(--errorMain, #c62828) 8%, var(--surfaceElevation0, #fff));
-}
-
-.sep-stream-error__summary {
- margin: 0 0 0.5rem;
- font-weight: 600;
- color: var(--textPrimary, #1a1a1a);
-}
-
-.sep-stream-error__meta {
- margin: 0.25rem 0 0;
- padding-left: 1.25rem;
- color: var(--textSecondary, #444);
-}
-
-.sep-stream-error__meta li {
- margin: 0.2em 0;
-}
-
-.sep-stream-error__nomad,
-.sep-stream-error__raw {
- margin: 0.5rem 0 0;
- font-size: 0.8125rem;
- color: var(--textSecondary, #555);
- white-space: pre-wrap;
- word-break: break-word;
-}
-
-.sep-stream-error__raw {
- margin: 0;
- font-family: ui-monospace, monospace;
-}
-
-.log-tabs {
- display: flex;
- flex-wrap: wrap;
- gap: 0.5em;
-}
-
-/*=============================================*/
-/* Toggle Buttons */
-/*=============================================*/
-
-.toggle-btn-group {
- display: inline-flex;
- border: 0.0625rem solid var(--lineDivider);
- border-radius: var(--cornerExtraSmall);
- overflow: hidden;
- margin-bottom: 1.5rem;
- background-color: var(--surfaceElevation0);
-}
-
-.toggle-btn {
- font-family: 'Poppins', sans-serif;
- font-weight: 500;
- font-size: 0.9375em;
- padding: 0.5em 1.25em;
- text-align: center;
- text-decoration: none;
- color: var(--textSecondary);
- background: var(--surfaceElevation1);
- border-right: 0.0625rem solid var(--lineDivider);
- transition: background 0.2s, color 0.2s;
-}
-
-.toggle-btn:last-child {
- border-right: none;
-}
-
-.toggle-btn:hover {
- background: var(--primaryHover);
- color: var(--primaryLight);
-}
-
-.toggle-btn.active {
- background: var(--primarySelected);
- color: var(--primaryMain);
- cursor: default;
-}
-
-.toggle-btn-group .toggle-btn {
- text-decoration: none;
-}
-
-/*=============================================*/
-/* Sticky Header */
-/*=============================================*/
-.sticky-header {
- position: sticky;
- top: 0;
- z-index: 10;
-}
-
-.unselectable {
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-.iconTextLine>* {
- vertical-align: middle;
-}
-
-.hidden {
- display: none;
-}
diff --git a/static/css/chain-builder.css b/static/css/chain-builder.css
deleted file mode 100644
index 962a29273c..0000000000
--- a/static/css/chain-builder.css
+++ /dev/null
@@ -1,189 +0,0 @@
-/* Copyright (C) 2026 Percona LLC */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU Affero General Public License as published by */
-/* the Free Software Foundation, either version 3 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU Affero General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU Affero General Public License */
-/* along with this program. If not, see . */
-
-/* Chain Builder Component */
-
-.chain-builder {
- margin-bottom: 15px;
- width: 100%;
-}
-
-.chain-builder .form-label {
- margin-bottom: 0.5rem;
-}
-
-.chain-sequence {
- display: flex;
- align-items: center;
- gap: 0.375rem;
- flex-wrap: wrap;
- min-height: 2.25rem;
- padding: 0.375rem 0.5rem;
- border: 1px solid var(--lineDivider);
- border-radius: var(--cornerSmall);
- background: var(--lineContour);
- margin-bottom: 0.5rem;
-}
-
-.chain-sequence:empty::after {
- content: 'No tasks chained';
- color: var(--textDisabled);
- font-style: italic;
- font-size: 0.8125rem;
-}
-
-.chain-item {
- display: inline-flex;
- align-items: center;
- gap: 0.25rem;
-}
-
-.chain-chip {
- display: inline-flex;
- align-items: center;
- gap: 0.25rem;
- padding: 0.1875rem 0.5rem;
- background: var(--primarySelected);
- border: 1px solid var(--primaryMain);
- border-radius: var(--cornerFull);
- font-size: 0.8125rem;
- color: var(--primaryMain);
- white-space: nowrap;
- line-height: 1.4;
-}
-
-.chain-chip-remove {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 1.125rem;
- height: 1.125rem;
- padding: 0;
- border: none;
- background: none;
- cursor: pointer;
- border-radius: var(--cornerFull);
- color: var(--primaryMain);
- transition: background-color 0.15s;
-}
-
-.chain-chip-remove:hover {
- background: var(--primaryFocus);
-}
-
-.chain-chip-remove .material-symbols-outlined {
- font-size: 0.875rem;
-}
-
-.chain-arrow {
- color: var(--textSecondary);
- font-size: 1rem;
-}
-
-.chain-item:last-child .chain-arrow {
- display: none;
-}
-
-.chain-add-controls {
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.chain-task-select {
- min-width: 200px;
- max-width: 300px;
-}
-
-.chain-options {
- margin-top: 0.5rem;
- font-size: 0.8125rem;
-}
-
-/* Compact variant for periodic task table cells */
-
-.chain-builder--compact {
- margin-bottom: 0;
-}
-
-.chain-builder--compact .form-label {
- display: none;
-}
-
-.chain-builder--compact .chain-sequence {
- min-height: 1.75rem;
- padding: 0.25rem 0.375rem;
- margin-bottom: 0.25rem;
-}
-
-.chain-builder--compact .chain-chip {
- padding: 0.125rem 0.375rem;
- font-size: 0.75rem;
-}
-
-.chain-builder--compact .chain-chip-remove .material-symbols-outlined {
- font-size: 0.75rem;
-}
-
-.chain-builder--compact .chain-arrow {
- font-size: 0.875rem;
-}
-
-.chain-builder--compact .chain-task-select {
- min-width: 140px;
- max-width: 200px;
- font-size: 0.8125rem;
- padding: 0.25rem;
-}
-
-/* Chain display (read-only, for tables) */
-
-.chain-display {
- display: inline-flex;
- align-items: center;
- gap: 0.25rem;
- flex-wrap: wrap;
-}
-
-.chain-display--compact {
- font-size: 0.8125rem;
-}
-
-.chain-chip--small {
- display: inline-flex;
- padding: 0.125rem 0.375rem;
- background: var(--primarySelected);
- border-radius: var(--cornerFull);
- font-size: 0.75rem;
- color: var(--primaryMain);
- white-space: nowrap;
-}
-
-.chain-arrow-small {
- color: var(--textSecondary);
- font-size: 0.75rem;
-}
-
-.chain-depth-indicator {
- display: inline-flex;
- align-items: center;
- gap: 0.125rem;
- color: var(--textSecondary);
- font-size: 0.75rem;
-}
-
-.chain-depth-indicator .material-symbols-outlined {
- font-size: 0.875rem;
-}
diff --git a/static/css/homepage.css b/static/css/homepage.css
deleted file mode 100644
index 6e9c415822..0000000000
--- a/static/css/homepage.css
+++ /dev/null
@@ -1,108 +0,0 @@
-/* Copyright (C) 2026 Percona LLC */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU Affero General Public License as published by */
-/* the Free Software Foundation, either version 3 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU Affero General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU Affero General Public License */
-/* along with this program. If not, see . */
-
-.tasks-table-container {
- border: 1px solid var(--lineDivider);
- border-radius: 10px;
-}
-
-.tasks-table {
- border: none;
- margin-bottom: 0;
-}
-
-.tasks-table td,
-.tasks-table th {
- padding: 0.8em 1em;
-}
-
-.tasks-table th {
- font-weight: 600;
-}
-
-.no-tasks {
- text-align: center;
-}
-
-.previous-log-row {
- border-bottom: none;
-}
-
-.previous-log-row td {
- padding-bottom: .4em !important;
-}
-
-.log-row td {
- padding: 0 0 .2em .8em !important
-}
-
-.scheduled-tasks-table-container {
- border: 1px solid var(--lineDivider);
- border-radius: 10px;
-}
-
-#scheduled-tasks-table {
- border: none;
- margin-bottom: 0;
-}
-
-#scheduled-tasks-table td,
-#scheduled-tasks-table th {
- padding: 0.8em 1em;
-}
-
-#scheduled-tasks-table th {
- font-weight: 600;
-}
-
-#inventories {
- width: 40%;
- float: left;
-}
-
-.inventories-container {
- border-radius: 10px;
- border: 1px solid var(--lineDivider);
- width: 90%;
-}
-
-.inventories-table {
- margin: 0;
-}
-
-.inventories-table td,
-.inventories-table th {
- padding: 0.8em 1em;
-}
-
-#targets {
- width: 60%;
- float: left;
-}
-
-.targets-container {
- border-radius: 10px;
- border: 1px solid var(--lineDivider);
- width: 90%;
-}
-
-.targets-table {
- margin: 0;
-}
-
-.targets-table td,
-.targets-table th {
- padding: 0.8em 1em;
-}
diff --git a/static/css/login.css b/static/css/login.css
deleted file mode 100644
index ef76051b6d..0000000000
--- a/static/css/login.css
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright (C) 2026 Percona LLC */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU Affero General Public License as published by */
-/* the Free Software Foundation, either version 3 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU Affero General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU Affero General Public License */
-/* along with this program. If not, see . */
-
-body {
- grid-template-areas: "head head" "main main" "foot foot";
-}
-
-#login-form {
- max-width: 400px;
- margin: 1em auto;
-}
-
-#login-form fieldset {
- border: 0.2em solid var(--lineDivider);
- border-radius: 1em;
- padding: 1em;
-}
-
-#login-form legend {
- font-weight: 600;
- font-size: 1.2em;
-}
-
-#login-form label {
- display: inline-block;
- width: 100px;
- text-align: left;
- margin-bottom: 0.5em;
-}
-
-#login-form input[type="text"],
-#login-form input[type="password"] {
- width: 200px;
- padding: 0.5em;
- margin-bottom: 1em;
- border: 0.2em solid var(--lineDivider);
- border-radius: 0.4em;
- font-size: 1em;
-}
-
-#login-form button {
- background-color: var(--primaryMain);
- color: var(--primaryContrast);
- border: none;
- border-radius: 2em;
- font-weight: bolder;
- font-size: 1.1em;
- padding: 0.5em 1em;
- margin-top: 1em;
- cursor: pointer;
-}
-
-#login-form button:not([disabled]):hover {
- background-color: var(--primaryLight);
- color: var(--primaryContrast);
-}
diff --git a/static/css/logs.css b/static/css/logs.css
deleted file mode 100644
index 22c6bf07a5..0000000000
--- a/static/css/logs.css
+++ /dev/null
@@ -1,187 +0,0 @@
-/* Copyright (C) 2026 Percona LLC */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU Affero General Public License as published by */
-/* the Free Software Foundation, either version 3 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU Affero General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU Affero General Public License */
-/* along with this program. If not, see . */
-
-/*
-.log-console {
- border: 1px solid #333;
- font-family: monospace;
- background-color: #1e1e1e;
- color: #d4d4d4;
-}
-
-.logs-footer {
- display: flex;
- align-items: center;
- background-color: #f5f5f5;
-}
-
-.logs-footer {
- border-top: 1px solid #444;
- padding: 0.5em;
-}
-
-.log-tabs {
- display: flex;
-}
-
-.log-tabs a {
- text-decoration: none;
- font-weight: bold;
- padding: 0.5em 1em;
- border: 1px solid transparent;
- border-bottom: none;
- background-color: #fff;
- margin-right: 0.5em;
-}
-
-.log-tabs a.selected {
- color: #fff;
- background-color: #93C7FF;
- border: 1px solid #444;
- border-bottom: 1px solid #1e1e1e;
-}
-
-.toggle-row {
- display: flex;
- align-items: center;
- margin-left: auto;
-}
-
-.decrypt-toggle {
- display: flex;
- align-items: center;
- margin-left: auto;
-}
-
-.word-wrap-toggle {
- display: flex;
- align-items: center;
- margin-left: 1em;
-}
-
-.toggle-label {
- margin-left: 0.5em;
- color: #2C323E;
- font-weight: bold;
- font-size: 1em;
- cursor: default;
-}
-
-.switch {
- position: relative;
- display: inline-block;
- width: 50px;
- height: 24px;
-}
-
-.switch input {
- display: none;
-}
-
-.slider {
- position: absolute;
- cursor: pointer;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: #ccc;
- transition: 0.1s;
- border-radius: 24px;
-}
-
-.slider:before {
- position: absolute;
- content: "";
- height: 18px;
- width: 18px;
- left: 3px;
- bottom: 3px;
- background-color: white;
- transition: 0.2s;
- border-radius: 50%;
-}
-
-input:checked+.slider {
- background-color: #1060FF;
-}
-
-input:focus+.slider {
- box-shadow: 0 0 1px #1060FF;
-}
-
-input:checked+.slider:before {
- transform: translateX(26px);
-}
-
-.logs-content {
- max-height: 400px;
- overflow: auto;
-}
-
-.log-output {
- display: none;
- padding: 1em;
- white-space: pre;
- font-size: 1em;
- line-height: 1.4em;
-}
-
-.log-output.word-wrap {
- white-space: pre-wrap;
-}
-
-.logs-button {
- width: 2em;
-}
-
-.log-step-tab:hover,
-.log-type-tab:hover {
- border: 1px solid #444;
- border-bottom: 1px solid #1e1e1e;
-}
-
-.log-console.completed {
- border: 2px solid #8ACE00;
-}
-
-.log-console.failed {
- border: 2px solid #CE2900;
-}
-
-.tab-notification {
- position: relative;
-}
-
-.tab-notification::after {
- content: '';
- display: block;
- position: absolute;
- top: 5px;
- right: -5px;
- height: 8px;
- width: 8px;
- background-color: red;
- border-radius: 50%;
-}
-
-.unselectable {
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-} */
diff --git a/static/css/messages.css b/static/css/messages.css
deleted file mode 100644
index 9f03d8ae3c..0000000000
--- a/static/css/messages.css
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Copyright (C) 2026 Percona LLC */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU Affero General Public License as published by */
-/* the Free Software Foundation, either version 3 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU Affero General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU Affero General Public License */
-/* along with this program. If not, see . */
-
-#messages {
- position: absolute;
- width: 65%;
- left: 50%;
- transform: translate(-50%);
- z-index: 9999;
-}
-
-.message {
- position: relative;
- margin-bottom: 0.5em;
- padding: 1em 2em 1em 1em;
- border-radius: 0.3em;
- font-weight: 500;
-}
-
-.close-button {
- position: absolute;
- top: 0.4em;
- right: 1em;
- background: none !important;
- color: inherit !important;
- border: 0 !important;
- margin-top: 0;
-}
-
-.message[data-level="info"] {
- background-color: var(--infoSurface);
- color: var(--infoContrast);
-}
-
-.message[data-level="success"] {
- background-color: var(--successSurface);
- color: var(--successContrast);
-}
-
-.message[data-level="warning"] {
- background-color: var(--warningSurface);
- color: var(--warningContrast);
-}
-
-.message[data-level="error"] {
- background-color: var(--errorSurface);
- color: var(--errorContrast);
-}
diff --git a/static/css/mysql_backups-docs.css b/static/css/mysql_backups-docs.css
deleted file mode 100644
index 38bd1947fb..0000000000
--- a/static/css/mysql_backups-docs.css
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * Copyright (C) 2026 Percona LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-article.backup-docs {
- max-width: 960px;
- margin: 0 auto 4rem;
- display: grid;
- gap: 2.5rem;
-}
-
-.backup-docs__header {
- display: flex;
- justify-content: space-between;
- align-items: flex-start;
- gap: 1rem;
- padding: 2.5rem 2rem 2rem;
- border-radius: 12px;
- background: var(--surfaceElevation1);
- box-shadow: var(--elevation2);
- border: 1px solid var(--lineDivider);
-}
-
-.backup-docs__header-actions {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- gap: 0.75rem;
-}
-
-.backup-docs__header-actions a {
- display: inline-flex;
- align-items: center;
- gap: 0.35rem;
- font-weight: 600;
- color: var(--primaryMain);
- text-decoration: none;
-}
-
-.backup-docs__header-actions a:hover,
-.backup-docs__header-actions a:focus-visible {
- text-decoration: underline;
-}
-
-.backup-docs__section {
- background: var(--surfaceElevation1);
- border-radius: 12px;
- border: 1px solid var(--lineDivider);
- box-shadow: var(--elevation1);
- padding: 2rem;
- display: grid;
- gap: 1.5rem;
-}
-
-.backup-docs__section h2 {
- margin: 0;
-}
-
-.backup-docs__section ul,
-.backup-docs__section ol {
- margin: 0;
- padding-left: 1.5rem;
-}
-
-.backup-docs__section li+li {
- margin-top: 0.5rem;
-}
-
-.backup-docs__section dl {
- margin: 0;
- display: grid;
- gap: 1rem;
-}
-
-.backup-docs__section dt {
- font-weight: 600;
- color: var(--textPrimary);
-}
-
-.backup-docs__section dd {
- margin: 0.25rem 0 0 0;
- color: var(--textSecondary);
-}
-
-.backup-docs__section .field-grid {
- display: grid;
- gap: 1rem;
-}
-
-.backup-docs__section .field-grid>div {
- display: grid;
- gap: 0.35rem;
-}
-
-@media (min-width: 720px) {
- .backup-docs__section .field-grid {
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
- }
-}
-
-@media (max-width: 576px) {
-
- .backup-docs__header,
- .backup-docs__section {
- padding: 1.5rem;
- }
-}
diff --git a/static/css/report.css b/static/css/report.css
deleted file mode 100644
index 17bf85142f..0000000000
--- a/static/css/report.css
+++ /dev/null
@@ -1,293 +0,0 @@
-/* Copyright (C) 2026 Percona LLC
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see . */
-
-/* Report plugin styles */
-
-.report-layout {
- max-width: 80rem;
- margin: 0 auto;
-}
-
-.report-header {
- margin-bottom: 2rem;
-}
-
-.report-header h1 {
- margin-bottom: 0.25rem;
-}
-
-.report-header .subtitle {
- color: var(--textSecondary);
- margin: 0.15rem 0;
- font-size: 0.95rem;
-}
-
-.report-intro {
- margin-bottom: 2rem;
- line-height: 1.6;
-}
-
-.report-form fieldset {
- border: 0.1rem solid var(--lineDivider);
- border-radius: 1rem;
- padding: 1.5rem;
- margin-bottom: 1.5rem;
-}
-
-.report-form legend {
- font-weight: 600;
- padding: 0 0.5rem;
-}
-
-.report-form .form-row {
- display: flex;
- align-items: center;
- gap: 1rem;
- margin-bottom: 0.75rem;
-}
-
-.report-form .form-row label {
- min-width: 4rem;
- font-weight: 500;
-}
-
-.report-form .form-row select,
-.report-form .form-row input {
- flex: 1;
- max-width: 20rem;
-}
-
-.report-layout .form-actions {
- display: flex;
- flex-wrap: wrap;
- gap: 1rem;
- align-items: center;
-}
-
-/* Anchor-as-button: mirrors button styles from base.css */
-
-a.btn,
-a.btn:link,
-a.btn:visited {
- font-family: 'Poppins', sans-serif;
- font-weight: 600;
- line-height: 1.0625;
- display: inline-flex;
- justify-content: center;
- align-items: center;
- gap: 0.25rem;
- border-radius: var(--cornerFull);
- text-decoration: none;
- cursor: pointer;
-}
-
-.btn.large {
- font-size: 0.9375em;
- padding: 1rem 1.5rem;
-}
-
-a.btn.contained,
-a.btn.contained:link,
-a.btn.contained:visited {
- color: var(--primaryContrast);
- background: var(--primaryMain);
- border: none;
- box-shadow: var(--elevation2);
- transition: background .2s, box-shadow .2s;
-}
-
-a.btn.contained:hover {
- background: var(--primaryDark);
- box-shadow: var(--elevation4);
-}
-
-a.btn.outlined,
-a.btn.outlined:link,
-a.btn.outlined:visited {
- color: var(--primaryMain);
- border: 0.125rem solid var(--primaryMain);
- background: none;
- transition: border .2s, color .2s, background .2s;
-}
-
-a.btn.outlined:hover {
- color: var(--primaryDark);
- background: var(--primaryHover);
- border-color: var(--primaryDark);
-}
-
-/* Report result */
-
-.report-toc {
- border: 0.1rem solid var(--lineDivider);
- border-radius: 1rem;
- padding: 1.5rem;
- margin-bottom: 2rem;
-}
-
-.report-toc h2 {
- margin-top: 0;
- font-size: 1.1rem;
-}
-
-.report-toc ul {
- list-style: none;
- padding: 0;
- margin: 0;
- display: flex;
- flex-direction: column;
- gap: 0.25rem;
-}
-
-.report-toc a {
- display: block;
- padding: 0.5rem 0.75rem;
- border-radius: 0.5rem;
- text-decoration: none;
- font-weight: 500;
- transition: background-color 0.2s;
-}
-
-.report-toc a:hover {
- background-color: var(--actionHover);
-}
-
-.report-section {
- border: 0.1rem solid var(--lineDivider);
- border-radius: 1rem;
- padding: 1.5rem;
- margin-bottom: 2rem;
-}
-
-.report-section h2 {
- margin-top: 0;
- font-size: 1.4rem;
- border-bottom: 0.1rem dotted var(--lineDivider);
- padding-bottom: 0.5rem;
-}
-
-.report-section h3 {
- font-size: 1.1rem;
- border-bottom: 0.1rem dotted var(--lineDivider);
- padding-bottom: 0.3rem;
-}
-
-.report-grid {
- display: grid;
- grid-template-columns: auto 1fr;
- gap: 0.25rem 1.5rem;
- margin-bottom: 1.5rem;
-}
-
-.report-grid dt {
- font-weight: 500;
-}
-
-.report-section table {
- width: 100%;
- margin-bottom: 1.5rem;
-}
-
-.report-section caption {
- text-align: left;
- font-weight: 600;
- font-size: 1rem;
- padding-bottom: 0.5rem;
-}
-
-.report-section th,
-.report-section td {
- text-align: left;
- padding: 0.5rem;
- vertical-align: top;
-}
-
-.report-section thead th {
- background-color: var(--surfaceElevation2);
- border-radius: 0.5rem;
-}
-
-.report-section th.status,
-.report-section td.status {
- max-width: 5rem;
- text-align: center;
-}
-
-.report-footer {
- text-align: center;
- padding: 1.5rem 0;
- border-top: 0.1rem solid var(--lineDivider);
- margin-top: 2rem;
-}
-
-.report-footer p {
- color: var(--textSecondary);
- font-size: 0.9rem;
-}
-
-/* Radio buttons - mirrors .checkbox / .checkmark pattern from base.css */
-.radio-group {
- display: flex;
- flex-wrap: wrap;
- gap: 0 1.5rem;
-}
-
-.radio {
- display: flex;
- align-items: center;
- user-select: none;
- cursor: pointer;
-}
-
-input[type="radio"] {
- opacity: 0;
- height: 0;
- width: 0;
- cursor: pointer;
-}
-
-.radiomark {
- display: flex;
- justify-content: center;
- align-items: center;
- width: 2.5rem;
- height: 2.5rem;
- border-radius: var(--cornerFull);
- transition: background 0.2s;
-}
-
-.radio:hover .radiomark {
- background: var(--primaryHover);
-}
-
-.radiomark .checked {
- color: var(--primaryMain);
-}
-
-input[type="radio"]~.radiomark .checked,
-input[type="radio"]:checked~.radiomark .unchecked {
- display: none;
-}
-
-input[type="radio"]~.radiomark .unchecked,
-input[type="radio"]:checked~.radiomark .checked {
- display: block;
-}
-
-input[type="radio"]:focus-visible~.radiomark {
- background: var(--primaryFocus);
- outline: 0.1875rem solid var(--lineFocus);
- outline-offset: -0.1875rem;
-}
diff --git a/static/css/saved.css b/static/css/saved.css
deleted file mode 100644
index 687474af18..0000000000
--- a/static/css/saved.css
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 2026 Percona LLC */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU Affero General Public License as published by */
-/* the Free Software Foundation, either version 3 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU Affero General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU Affero General Public License */
-/* along with this program. If not, see . */
-
-/* .schedule-button.toggled-on {
- background-color: #93C7FF;
- color: #2C323E;
-}
-
-.eta-input {
- width: 0;
- padding: 0;
- margin-right: 0;
- opacity: 0;
- border: 0.2em solid #F0F1F4;
- border-radius: 2em;
- overflow: hidden;
- font-size: 1em;
-}
-
-.send-form.expanded .eta-input {
- width: 210px;
- padding: 0.5em;
- margin-right: 0.5em;
- opacity: 1;
- transition: width 0.5s ease, padding 0.5s ease, margin-right 0.5s ease, opacity 0.5s ease;
-} */
diff --git a/static/css/scheduled.css b/static/css/scheduled.css
deleted file mode 100644
index be392af533..0000000000
--- a/static/css/scheduled.css
+++ /dev/null
@@ -1,246 +0,0 @@
-/* Copyright (C) 2026 Percona LLC */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU Affero General Public License as published by */
-/* the Free Software Foundation, either version 3 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU Affero General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU Affero General Public License */
-/* along with this program. If not, see . */
-
-#period-header {
- width: 250px;
-}
-
-#scheduled-tasks-table select {
- margin-top: 0;
-}
-
-#start-time-header {
- width: 225px;
-}
-
-#scheduled-tasks-table.create-mode #start-time-header,
-#scheduled-tasks-table.create-mode #expires-header {
- width: 225px;
-}
-
-#last-run-at-header {
- width: 200px;
-}
-
-#scheduled-tasks-table.create-mode #last-run-at-header {
- width: 200px;
-}
-
-#scheduled-tasks-table.create-mode .hide-on-create-mode {
- display: none;
-}
-
-#scheduled-tasks-table:not(.create-mode) .show-on-create-mode {
- display: none;
-}
-
-.period-inputs select {
- height: 28px;
-}
-
-.period-inputs input {
- height: 28px;
- margin-right: 10px;
-}
-
-.actions-cell {
- align-items: center;
-}
-
-.enable-toggle {
- display: flex;
- align-items: center;
-}
-
-.enable-form {
- padding-left: 0.5em;
- padding-top: 0.5em;
-}
-
-.delete-form {
- padding-top: 0.5em;
-}
-
-.toggle-label {
- margin-left: 0.5em;
- color: var(--textPrimary);
- font-weight: bold;
- font-size: 1em;
- cursor: default;
-}
-
-.switch {
- position: relative;
- display: inline-block;
- width: 50px;
- height: 24px;
-}
-
-.switch input {
- display: none;
-}
-
-.slider {
- position: absolute;
- cursor: pointer;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: var(--actionDisabled);
- transition: 0.1s;
- border-radius: 24px;
-}
-
-.slider.round {
- border-radius: 24px;
-}
-
-.slider:before {
- position: absolute;
- content: "";
- height: 18px;
- width: 18px;
- left: 3px;
- bottom: 3px;
- background-color: var(--surfaceElevation1);
- transition: 0.2s;
- border-radius: 50%;
-}
-
-input:checked+.slider {
- background-color: var(--primaryMain);
-}
-
-input:focus+.slider {
- box-shadow: 0 0 1px var(--primaryMain);
-}
-
-input:checked+.slider:before {
- transform: translateX(26px);
-}
-
-.period-cell {
- position: relative;
-}
-
-.new-periodic-task-form {
- margin: 0;
- padding: 0;
-}
-
-.new-periodic-task-row input,
-.new-periodic-task-row select,
-.edit-periodic-task-row input,
-.edit-periodic-task-row select {
- max-width: 100%;
- box-sizing: border-box;
- margin-top: 0;
-}
-
-.new-periodic-task-row .actions-cell,
-.edit-periodic-task-row .actions-cell,
-#add-periodic-task-row .actions-cell {
- display: flex;
- align-items: center;
- padding: 1em;
- padding-top: .5em;
-}
-
-.new-periodic-task-row .save-button,
-.new-periodic-task-row .discard-button,
-.edit-periodic-task-row .save-edit-button,
-.edit-periodic-task-row .cancel-edit-button {
- margin-right: 0.5em;
-}
-
-.edit-button {
- margin-right: 0.5em;
- padding-top: 0.5em;
-}
-
-.edit-periodic-task-row {
- background-color: var(--primarySelected);
-}
-
-.edit-periodic-task-row td {
- padding: 1em 0.5em;
-}
-
-.start-time-input {
- padding: 0.5em;
- margin-right: 0.5em;
- border: 0.2em solid var(--lineDivider);
- border-radius: 2em;
- font-size: 1em;
-}
-
-.interval-inputs {
- display: flex;
-}
-
-.cron-inputs {
- display: flex;
- flex-direction: column;
-}
-
-.interval-inputs input[type="number"],
-.cron-inputs input[type="text"] {
- width: 100px;
- margin-bottom: 0.5em;
-}
-
-.cron-description {
- font-style: italic;
- font-size: 10px;
- color: var(--textSecondary);
-}
-
-.invalid {
- border-color: red;
-}
-
-.change-to-cron,
-.change-to-interval {
- font-size: 0.9em;
- color: var(--primaryMain);
- cursor: pointer;
- text-decoration: underline;
- margin-top: 0.5em;
- display: inline-block;
-}
-
-.highlighted-row {
- animation: highlight-animation 3s ease-in-out;
-}
-
-@keyframes highlight-animation {
- 0% {
- background-color: var(--primarySelected);
- }
-
- 100% {
- background-color: transparent;
- }
-}
-
-
-.hidden {
- display: none;
-}
-
-.select2-container {
- font-size: 10px;
-}
diff --git a/static/css/simple-datatables-style.css b/static/css/simple-datatables-style.css
deleted file mode 100644
index 2791ebaa9a..0000000000
--- a/static/css/simple-datatables-style.css
+++ /dev/null
@@ -1,502 +0,0 @@
-/* Copyright (C) 2026 Percona LLC */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU Affero General Public License as published by */
-/* the Free Software Foundation, either version 3 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU Affero General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU Affero General Public License */
-/* along with this program. If not, see . */
-
-.datatable-wrapper.no-header .datatable-container {
- border-top: 1px solid var(--lineDivider);
-}
-
-.datatable-wrapper.no-footer .datatable-container {
- border-bottom: 1px solid var(--lineDivider);
-}
-
-.datatable-top,
-.datatable-bottom {
- padding: 8px 10px;
-}
-
-.datatable-top>nav:first-child,
-.datatable-top>div:first-child,
-.datatable-bottom>nav:first-child,
-.datatable-bottom>div:first-child {
- float: left;
-}
-
-.datatable-top>nav:last-child,
-.datatable-top>div:not(first-child),
-.datatable-bottom>nav:last-child,
-.datatable-bottom>div:last-child {
- float: right;
-}
-
-.datatable-selector {
- padding: 6px;
-}
-
-.datatable-input {
- padding: 6px 12px;
-}
-
-.datatable-info {
- margin: 7px 0;
-}
-
-/* PAGER */
-.datatable-pagination ul {
- margin: 0;
- padding-left: 0;
-}
-
-.datatable-pagination li {
- list-style: none;
- float: left;
-}
-
-.datatable-pagination li.datatable-hidden {
- visibility: hidden;
-}
-
-.datatable-pagination a,
-.datatable-pagination button {
- border: 1px solid transparent;
- float: left;
- margin-left: 2px;
- padding: 6px 12px;
- position: relative;
- text-decoration: none;
- color: var(--textPrimary);
- cursor: pointer;
-}
-
-.datatable-pagination a:hover,
-.datatable-pagination button:hover {
- background-color: var(--actionHover);
-}
-
-.datatable-pagination .datatable-active a,
-.datatable-pagination .datatable-active a:focus,
-.datatable-pagination .datatable-active a:hover,
-.datatable-pagination .datatable-active button,
-.datatable-pagination .datatable-active button:focus,
-.datatable-pagination .datatable-active button:hover {
- background-color: var(--actionHover);
- cursor: default;
-}
-
-.datatable-pagination .datatable-ellipsis a,
-.datatable-pagination .datatable-disabled a,
-.datatable-pagination .datatable-disabled a:focus,
-.datatable-pagination .datatable-disabled a:hover,
-.datatable-pagination .datatable-ellipsis button,
-.datatable-pagination .datatable-disabled button,
-.datatable-pagination .datatable-disabled button:focus,
-.datatable-pagination .datatable-disabled button:hover {
- pointer-events: none;
- cursor: default;
-}
-
-.datatable-pagination .datatable-disabled a,
-.datatable-pagination .datatable-disabled a:focus,
-.datatable-pagination .datatable-disabled a:hover,
-.datatable-pagination .datatable-disabled button,
-.datatable-pagination .datatable-disabled button:focus,
-.datatable-pagination .datatable-disabled button:hover {
- cursor: not-allowed;
- opacity: 0.4;
-}
-
-.datatable-pagination .datatable-pagination a,
-.datatable-pagination .datatable-pagination button {
- font-weight: bold;
-}
-
-/* TABLE */
-.datatable-table {
- max-width: 100%;
- width: 100%;
- border-spacing: 0;
- border-collapse: separate;
-}
-
-.datatable-table>tbody>tr>td,
-.datatable-table>tbody>tr>th,
-.datatable-table>tfoot>tr>td,
-.datatable-table>tfoot>tr>th,
-.datatable-table>thead>tr>td,
-.datatable-table>thead>tr>th {
- vertical-align: top;
- padding: 8px 10px;
-}
-
-.datatable-table>thead>tr>th {
- vertical-align: bottom;
- text-align: left;
- border-bottom: 1px solid var(--lineDivider);
-}
-
-.datatable-table>tfoot>tr>th {
- vertical-align: bottom;
- text-align: left;
- border-top: 1px solid var(--lineDivider);
-}
-
-.datatable-table th {
- vertical-align: bottom;
- text-align: left;
-}
-
-.datatable-table th a {
- text-decoration: none;
- color: inherit;
-}
-
-.datatable-table th button,
-.datatable-pagination-list button {
- color: inherit;
- border: 0;
- background-color: inherit;
- cursor: pointer;
- text-align: inherit;
- font-family: inherit;
- font-weight: inherit;
- font-size: inherit;
-}
-
-.datatable-sorter,
-.datatable-filter {
- display: inline-block;
- height: 100%;
- position: relative;
- width: 100%;
-}
-
-.datatable-sorter::before,
-.datatable-sorter::after {
- content: "";
- height: 0;
- width: 0;
- position: absolute;
- right: 4px;
- border-left: 4px solid transparent;
- border-right: 4px solid transparent;
- opacity: 0.2;
-}
-
-
-.datatable-sorter::before {
- border-top: 4px solid var(--textPrimary);
- bottom: 0px;
-}
-
-.datatable-sorter::after {
- border-bottom: 4px solid var(--textPrimary);
- border-top: 4px solid transparent;
- top: 0px;
-}
-
-.datatable-ascending .datatable-sorter::after,
-.datatable-descending .datatable-sorter::before,
-.datatable-ascending .datatable-filter::after,
-.datatable-descending .datatable-filter::before {
- opacity: 0.6;
-}
-
-.datatable-filter::before {
- content: "";
- position: absolute;
- right: 4px;
- opacity: 0.2;
- width: 0;
- height: 0;
- border-left: 7px solid transparent;
- border-right: 7px solid transparent;
- border-radius: 50%;
- border-top: 10px solid var(--textPrimary);
- top: 25%;
-}
-
-.datatable-filter-active .datatable-filter::before {
- opacity: 0.6;
-}
-
-.datatable-empty {
- text-align: center;
-}
-
-.datatable-top::after,
-.datatable-bottom::after {
- clear: both;
- content: " ";
- display: table;
-}
-
-table.datatable-table:focus tr.datatable-cursor>td:first-child {
- border-left: 3px var(--lineFocus) solid;
-}
-
-table.datatable-table:focus {
- outline: solid 1px var(--lineDividerStronger);
- outline-offset: -1px;
-}
-
-/* Editing.css */
-
-.datatable-editor-modal {
- position: absolute;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- background-color: rgba(0, 0, 0, 0.6);
- -webkit-animation: 250ms ease 0ms fadeIn;
- animation: 250ms ease 0ms fadeIn;
-}
-
-.datatable-editor-modal.closed {
- -webkit-animation: 250ms ease 0ms fadeIn;
- animation: 250ms ease 0ms fadeIn;
-}
-
-.datatable-editor-modal.closed .datatable-editor-inner {
- -webkit-animation: 250ms ease 0ms slideIn;
- animation: 250ms ease 0ms slideIn;
-}
-
-.datatable-editor-inner {
- width: 30%;
- margin: 10% auto;
- background-color: var(--surfaceElevation1);
- border-radius: 5px;
- -webkit-animation: 250ms ease 0ms slideIn;
- animation: 250ms ease 0ms slideIn;
-}
-
-.datatable-editor-header {
- position: relative;
- border-bottom: 1px solid var(--lineDivider);
-}
-
-.datatable-editor-header h4 {
- font-size: 20px;
- margin: 0;
-}
-
-.datatable-editor-header button {
- position: absolute;
- right: 10px;
- top: 10px;
- background-color: transparent;
- border: none;
- cursor: pointer;
- font-size: 24px;
- padding: 5px;
- line-height: 1;
- opacity: 0.6;
-}
-
-.datatable-editor-header button:hover {
- opacity: 1;
-}
-
-.datatable-editor-header {
- padding: 15px 30px;
-}
-
-.datatable-editor-block {
- padding: 15px 60px;
-}
-
-.datatable-editor-row {
- margin: 0 0 15px;
-}
-
-.datatable-editor-row:last-child {
- margin: 0 0 5px;
-}
-
-.datatable-editor-row:last-child {
- text-align: right;
-}
-
-.datatable-editor-label {
- width: 25%;
- text-align: right;
- padding: 0 15px;
-}
-
-.datatable-editor-label,
-.datatable-editor-input {
- display: inline-block;
-}
-
-.datatable-editor-input {
- padding: 4px 6px;
- border: 1px solid var(--lineDivider);
- width: 100%;
- box-sizing: border-box;
- margin: -5px 0;
- font-size: inherit;
- font-family: inherit;
- font-weight: inherit;
- color: inherit;
-}
-
-.datatable-editor-row .datatable-editor-input {
- margin: 0;
- width: 75%;
-}
-
-.datatable-editor-save,
-.datatable-editor-cancel {
- padding: 6px 12px;
- font-size: inherit;
- font-family: inherit;
- font-weight: inherit;
- cursor: pointer;
- border-radius: 3px;
-}
-
-.datatable-editor-save {
- background-color: var(--successMain);
- border: 1px solid var(--successMain);
- color: var(--white);
-}
-
-.datatable-editor-save:hover {
- background-color: var(--successLight);
- border-color: var(--successLight);
-}
-
-/* ContextMenu */
-.datatable-editor-wrapper {
- position: absolute;
-}
-
-.datatable-editor-menu {
- background: var(--surfaceElevation1) none repeat scroll 0 0;
- border-radius: 3px;
- margin: 0;
- min-width: 220px;
- padding: 5px 0;
- box-shadow: var(--elevation8);
-}
-
-.datatable-editor-menu li {
- list-style: none;
-}
-
-.datatable-editor-menu a {
- box-sizing: border-box;
- color: inherit;
- display: block;
- padding: 5px 15px;
- text-decoration: none;
- width: 100%;
-}
-
-.datatable-editor-menu a:hover {
- background-color: var(--actionHover);
-}
-
-.datatable-editor-separator {
- border-bottom: 1px solid var(--lineDivider);
- margin: 5px 0;
-}
-
-@-webkit-keyframes fadeIn {
- from {
- opacity: 0;
- }
-
- to {
- opacity: 1;
- }
-}
-
-@keyframes fadeIn {
- from {
- opacity: 0;
- }
-
- to {
- opacity: 1;
- }
-}
-
-@-webkit-keyframes slideIn {
- from {
- opacity: 0;
- -webkit-transform: translate3d(0, -10%, 0);
- transform: translate3d(0, -10%, 0);
- }
-
- to {
- opacity: 1;
- -webkit-transform: translate3d(0, 0%, 0);
- transform: translate3d(0, 0%, 0);
- }
-}
-
-@keyframes slideIn {
- from {
- opacity: 0;
- -webkit-transform: translate3d(0, -10%, 0);
- transform: translate3d(0, -10%, 0);
- }
-
- to {
- opacity: 1;
- -webkit-transform: translate3d(0, 0%, 0);
- transform: translate3d(0, 0%, 0);
- }
-}
-
-.datatable-editor-action .mdi {
- margin-right: 5px;
- color: var(--textSecondary);
-}
-
-/* Column Filter */
-
-.datatable-column-filter-button {
- cursor: pointer;
-}
-
-button.datatable-column-filter-button {
- padding: 6px 12px;
-}
-
-/* Menu */
-
-.datatable-column-filter-wrapper {
- position: absolute;
-}
-
-.datatable-column-filter-menu {
- background: var(--surfaceElevation1) none repeat scroll 0 0;
- border-radius: 3px;
- margin: 0;
- min-width: 220px;
- padding: 5px 0;
- box-shadow: var(--elevation8);
-}
-
-.datatable-column-filter-menu>li {
- list-style: none;
-}
-
-.datatable-column-filter-menu>li,
-.datatable-column-filter-menu>li>label {
- cursor: pointer;
-}
diff --git a/static/css/snippets-details.css b/static/css/snippets-details.css
deleted file mode 100644
index d7b24aaee0..0000000000
--- a/static/css/snippets-details.css
+++ /dev/null
@@ -1,285 +0,0 @@
-/**
- * Copyright (C) 2026 Percona LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-.highlight {
- width: 90%;
-}
-
-.highlight pre {
- max-height: 400px;
-}
-
-.highlight-wrapper {
- width: 90%;
- max-height: 400px;
- overflow: auto;
-}
-
-[data-theme="light"] .highlight-wrapper {
- background: #ffffff;
- color: #000000;
-}
-
-[data-theme="dark"] .highlight-wrapper {
- background: #272822;
- color: #F8F8F2;
-}
-
-.highlight-wrapper .highlight {
- width: 100%;
- background: transparent;
-}
-
-.highlight-wrapper .highlight pre {
- max-height: none;
-}
-
-.highlighttable td {
- vertical-align: top;
-}
-
-.linenodiv {
- line-height: 125%;
-}
-
-.highlighttable pre code {
- font-size: inherit;
- font-family: inherit;
-}
-
-.highlight-wrapper .highlighttable {
- table-layout: fixed;
- width: 100%;
-}
-
-.highlight-wrapper .linenos {
- width: calc(var(--linenos-width, 3ch) + 20px);
-}
-
-.highlight-wrapper .linenos pre {
- text-align: right;
-}
-
-.frontmatter-toggle {
- border: none;
- margin: 0;
- padding: 0;
-}
-
-.frontmatter-toggle summary {
- cursor: pointer;
- padding: 2px 10px;
- font-family: monospace;
- font-size: 0.85em;
- list-style: none;
- user-select: none;
-}
-
-[data-theme="light"] .frontmatter-toggle summary {
- color: #6e7781;
-}
-
-[data-theme="dark"] .frontmatter-toggle summary {
- color: #90918B;
-}
-
-.frontmatter-toggle summary::-webkit-details-marker {
- display: none;
-}
-
-td.code {
- width: calc(70vw + 40px);
- max-width: calc(70vw + 40px);
-}
-
-.linenos {
- width: max-content;
- padding-right: 15px;
-}
-
-.linenos pre {
- overflow: hidden;
- color: var(--textSecondary);
-}
-
-.code div {
- margin-right: 10px;
-}
-
-.code pre {
- overflow: auto;
- margin-right: 10px;
-}
-
-#actions form {
- padding: 0;
-}
-
-#actions {
- display: inline-flex;
- gap: 1em;
-}
-
-label {
- display: flex;
- align-items: center;
- width: max-content;
-}
-
-label>span:first-child {
- width: 200px;
- display: inline-block;
-}
-
-label:has(> select)>.material-symbols-outlined {
- position: absolute;
- top: 0.5rem;
- right: 0.75rem;
- z-index: 9999;
- pointer-events: none;
-}
-
-label:has(> select) {
- position: relative;
- display: inline-block;
-}
-
-select {
- padding-right: 2.625em;
-}
-
-fieldset {
- display: grid;
- gap: 0.625em;
-}
-
-fieldset:disabled,
-fieldset:disabled * {
- color: var(--textDisabled);
- cursor: not-allowed;
-}
-
-label:has(> input[type="checkbox"]:not(:disabled)) {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- user-select: none;
- cursor: pointer;
-}
-
-label:has(> input[type="checkbox"]:disabled)>.checkmark {
- opacity: 0.5;
-}
-
-.checkmark {
- margin-left: -10px;
- justify-content: left;
-}
-
-#snippetExecuteForm input:disabled {
- display: initial;
-}
-
-.snippetDisabledWarning {
- color: var(--errorMain);
- font-weight: 600;
-}
-
-.sudoAlways {
- color: var(--errorMain);
- font-weight: 600;
-}
-
-.sudoOptional {
- color: var(--warningMain);
- font-weight: 500;
-}
-
-.download-file-button.loading {
- opacity: 0.75;
- cursor: not-allowed;
-}
-
-.download-file-button.loading .material-symbols-outlined {
- animation: pulse 1s infinite ease-in-out;
- display: initial;
-}
-
-@keyframes pulse {
- 0% {
- opacity: .5
- }
-
- 50% {
- opacity: 1
- }
-
- 100% {
- opacity: .5
- }
-}
-
-.info-icon {
- display: inline-flex;
- align-items: center;
- cursor: help;
- margin-left: 0.25em;
- vertical-align: middle;
- color: var(--textSecondary, #666);
- opacity: 0.25;
- transition: opacity 0.15s ease;
-}
-
-.info-icon:hover,
-.info-icon:focus-visible {
- opacity: 1;
-}
-
-.info-icon:focus-visible {
- outline: 2px solid currentColor;
- outline-offset: 2px;
-}
-
-.info-icon .material-symbols-outlined {
- font-size: 1.1rem;
-}
-
-.info-tooltip-floating {
- position: fixed;
- z-index: 2147483647;
- min-width: 180px;
- max-width: 200px;
- padding: 0.5em 0.75em;
- border-radius: 6px;
- background: var(--surfaceElevation1, #fff);
- color: var(--textPrimary, #333);
- font-size: 0.875rem;
- line-height: 1.4;
- border: 1px solid var(--lineDivider, #ddd);
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
- pointer-events: none;
- white-space: normal;
- word-wrap: break-word;
- opacity: 0;
- visibility: hidden;
- transition: opacity 0.15s ease, visibility 0.15s ease;
-}
-
-.info-tooltip-floating.visible {
- opacity: 1;
- visibility: visible;
-}
diff --git a/static/css/snippets.css b/static/css/snippets.css
deleted file mode 100644
index 373de9f305..0000000000
--- a/static/css/snippets.css
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Copyright (C) 2026 Percona LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-.snippets-tbl .approval-icon-cell>i {
- font-size: 1.5em;
- vertical-align: middle;
-}
-
-.snippets-tbl td {
- padding: 10px;
-}
-
-.snippet-description-col {
- max-width: 450px;
-}
diff --git a/static/css/tasks.css b/static/css/tasks.css
deleted file mode 100644
index f495c1aad6..0000000000
--- a/static/css/tasks.css
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 2026 Percona LLC */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU Affero General Public License as published by */
-/* the Free Software Foundation, either version 3 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU Affero General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU Affero General Public License */
-/* along with this program. If not, see . */
-
-.tasks-table-container {
- border: 1px solid var(--lineDivider);
- border-radius: 10px;
-}
-
-.tasks-table {
- border: none;
- margin-bottom: 0;
-}
-
-.tasks-table td,
-.tasks-table th {
- padding: 0.8em 1em;
-}
-
-.tasks-table th {
- font-weight: 600;
-}
-
-.previous-log-row {
- border-bottom: none;
-}
-
-.previous-log-row td {
- padding-bottom: .4em !important;
-}
-
-.log-row td {
- padding: 0 0 .2em .8em !important
-}
-
-.no-tasks {
- text-align: center;
-}
diff --git a/static/css/vendor/select2.min.css b/static/css/vendor/select2.min.css
deleted file mode 100644
index 7c18ad59df..0000000000
--- a/static/css/vendor/select2.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
diff --git a/static/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].ttf b/static/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].ttf
deleted file mode 100644
index 2bc9005f5a..0000000000
Binary files a/static/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].ttf and /dev/null differ
diff --git a/static/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].woff2 b/static/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].woff2
deleted file mode 100644
index 8c20aac9fb..0000000000
Binary files a/static/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].woff2 and /dev/null differ
diff --git a/static/fonts/Poppins-Black.ttf b/static/fonts/Poppins-Black.ttf
deleted file mode 100644
index 71c0f995ee..0000000000
Binary files a/static/fonts/Poppins-Black.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-BlackItalic.ttf b/static/fonts/Poppins-BlackItalic.ttf
deleted file mode 100644
index 7aeb58bd1b..0000000000
Binary files a/static/fonts/Poppins-BlackItalic.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-Bold.ttf b/static/fonts/Poppins-Bold.ttf
deleted file mode 100644
index 00559eeb29..0000000000
Binary files a/static/fonts/Poppins-Bold.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-BoldItalic.ttf b/static/fonts/Poppins-BoldItalic.ttf
deleted file mode 100644
index e61e8e88bd..0000000000
Binary files a/static/fonts/Poppins-BoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-ExtraBold.ttf b/static/fonts/Poppins-ExtraBold.ttf
deleted file mode 100644
index df7093608a..0000000000
Binary files a/static/fonts/Poppins-ExtraBold.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-ExtraBoldItalic.ttf b/static/fonts/Poppins-ExtraBoldItalic.ttf
deleted file mode 100644
index 14d2b375dc..0000000000
Binary files a/static/fonts/Poppins-ExtraBoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-ExtraLight.ttf b/static/fonts/Poppins-ExtraLight.ttf
deleted file mode 100644
index e76ec69a65..0000000000
Binary files a/static/fonts/Poppins-ExtraLight.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-ExtraLightItalic.ttf b/static/fonts/Poppins-ExtraLightItalic.ttf
deleted file mode 100644
index 89513d9469..0000000000
Binary files a/static/fonts/Poppins-ExtraLightItalic.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-Italic.ttf b/static/fonts/Poppins-Italic.ttf
deleted file mode 100644
index 12b7b3c40b..0000000000
Binary files a/static/fonts/Poppins-Italic.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-Light.ttf b/static/fonts/Poppins-Light.ttf
deleted file mode 100644
index bc36bcc242..0000000000
Binary files a/static/fonts/Poppins-Light.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-LightItalic.ttf b/static/fonts/Poppins-LightItalic.ttf
deleted file mode 100644
index 9e70be6a9e..0000000000
Binary files a/static/fonts/Poppins-LightItalic.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-Medium.ttf b/static/fonts/Poppins-Medium.ttf
deleted file mode 100644
index 6bcdcc27f2..0000000000
Binary files a/static/fonts/Poppins-Medium.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-MediumItalic.ttf b/static/fonts/Poppins-MediumItalic.ttf
deleted file mode 100644
index be67410fd0..0000000000
Binary files a/static/fonts/Poppins-MediumItalic.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-Regular.ttf b/static/fonts/Poppins-Regular.ttf
deleted file mode 100644
index 9f0c71b70a..0000000000
Binary files a/static/fonts/Poppins-Regular.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-SemiBold.ttf b/static/fonts/Poppins-SemiBold.ttf
deleted file mode 100644
index 74c726e327..0000000000
Binary files a/static/fonts/Poppins-SemiBold.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-SemiBoldItalic.ttf b/static/fonts/Poppins-SemiBoldItalic.ttf
deleted file mode 100644
index 3e6c942233..0000000000
Binary files a/static/fonts/Poppins-SemiBoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-Thin.ttf b/static/fonts/Poppins-Thin.ttf
deleted file mode 100644
index 03e736613a..0000000000
Binary files a/static/fonts/Poppins-Thin.ttf and /dev/null differ
diff --git a/static/fonts/Poppins-ThinItalic.ttf b/static/fonts/Poppins-ThinItalic.ttf
deleted file mode 100644
index e26db5dd3d..0000000000
Binary files a/static/fonts/Poppins-ThinItalic.ttf and /dev/null differ
diff --git a/static/fonts/Roboto-Italic-VariableFont_wdth,wght.ttf b/static/fonts/Roboto-Italic-VariableFont_wdth,wght.ttf
deleted file mode 100644
index 978e53a7de..0000000000
Binary files a/static/fonts/Roboto-Italic-VariableFont_wdth,wght.ttf and /dev/null differ
diff --git a/static/fonts/Roboto-VariableFont_wdth,wght.ttf b/static/fonts/Roboto-VariableFont_wdth,wght.ttf
deleted file mode 100644
index bba55f616c..0000000000
Binary files a/static/fonts/Roboto-VariableFont_wdth,wght.ttf and /dev/null differ
diff --git a/static/fonts/RobotoMono-Italic-VariableFont_wght.ttf b/static/fonts/RobotoMono-Italic-VariableFont_wght.ttf
deleted file mode 100644
index 1a4d6948d6..0000000000
Binary files a/static/fonts/RobotoMono-Italic-VariableFont_wght.ttf and /dev/null differ
diff --git a/static/fonts/RobotoMono-VariableFont_wght.ttf b/static/fonts/RobotoMono-VariableFont_wght.ttf
deleted file mode 100644
index fc02de43ec..0000000000
Binary files a/static/fonts/RobotoMono-VariableFont_wght.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-Black.ttf b/static/fonts/roboto static/Roboto-Black.ttf
deleted file mode 100644
index d51221af2b..0000000000
Binary files a/static/fonts/roboto static/Roboto-Black.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-BlackItalic.ttf b/static/fonts/roboto static/Roboto-BlackItalic.ttf
deleted file mode 100644
index c71c549d3f..0000000000
Binary files a/static/fonts/roboto static/Roboto-BlackItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-Bold.ttf b/static/fonts/roboto static/Roboto-Bold.ttf
deleted file mode 100644
index 9d7cf220f9..0000000000
Binary files a/static/fonts/roboto static/Roboto-Bold.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-BoldItalic.ttf b/static/fonts/roboto static/Roboto-BoldItalic.ttf
deleted file mode 100644
index f73d681263..0000000000
Binary files a/static/fonts/roboto static/Roboto-BoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-ExtraBold.ttf b/static/fonts/roboto static/Roboto-ExtraBold.ttf
deleted file mode 100644
index 7092a880bb..0000000000
Binary files a/static/fonts/roboto static/Roboto-ExtraBold.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-ExtraBoldItalic.ttf b/static/fonts/roboto static/Roboto-ExtraBoldItalic.ttf
deleted file mode 100644
index a5536f5d54..0000000000
Binary files a/static/fonts/roboto static/Roboto-ExtraBoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-ExtraLight.ttf b/static/fonts/roboto static/Roboto-ExtraLight.ttf
deleted file mode 100644
index 75608c6642..0000000000
Binary files a/static/fonts/roboto static/Roboto-ExtraLight.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-ExtraLightItalic.ttf b/static/fonts/roboto static/Roboto-ExtraLightItalic.ttf
deleted file mode 100644
index 23dbbef7ad..0000000000
Binary files a/static/fonts/roboto static/Roboto-ExtraLightItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-Italic.ttf b/static/fonts/roboto static/Roboto-Italic.ttf
deleted file mode 100644
index c3abaefb28..0000000000
Binary files a/static/fonts/roboto static/Roboto-Italic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-Light.ttf b/static/fonts/roboto static/Roboto-Light.ttf
deleted file mode 100644
index 6fcd5f964d..0000000000
Binary files a/static/fonts/roboto static/Roboto-Light.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-LightItalic.ttf b/static/fonts/roboto static/Roboto-LightItalic.ttf
deleted file mode 100644
index a6e504709f..0000000000
Binary files a/static/fonts/roboto static/Roboto-LightItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-Medium.ttf b/static/fonts/roboto static/Roboto-Medium.ttf
deleted file mode 100644
index d629e98489..0000000000
Binary files a/static/fonts/roboto static/Roboto-Medium.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-MediumItalic.ttf b/static/fonts/roboto static/Roboto-MediumItalic.ttf
deleted file mode 100644
index ef9ed1b441..0000000000
Binary files a/static/fonts/roboto static/Roboto-MediumItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-Regular.ttf b/static/fonts/roboto static/Roboto-Regular.ttf
deleted file mode 100644
index 7e3bb2f8ce..0000000000
Binary files a/static/fonts/roboto static/Roboto-Regular.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-SemiBold.ttf b/static/fonts/roboto static/Roboto-SemiBold.ttf
deleted file mode 100644
index 3f348341cb..0000000000
Binary files a/static/fonts/roboto static/Roboto-SemiBold.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-SemiBoldItalic.ttf b/static/fonts/roboto static/Roboto-SemiBoldItalic.ttf
deleted file mode 100644
index 132cca1602..0000000000
Binary files a/static/fonts/roboto static/Roboto-SemiBoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-Thin.ttf b/static/fonts/roboto static/Roboto-Thin.ttf
deleted file mode 100644
index 6ee97b8895..0000000000
Binary files a/static/fonts/roboto static/Roboto-Thin.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto-ThinItalic.ttf b/static/fonts/roboto static/Roboto-ThinItalic.ttf
deleted file mode 100644
index 0381198d34..0000000000
Binary files a/static/fonts/roboto static/Roboto-ThinItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-Black.ttf b/static/fonts/roboto static/Roboto_Condensed-Black.ttf
deleted file mode 100644
index 7529d1b905..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-Black.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-BlackItalic.ttf b/static/fonts/roboto static/Roboto_Condensed-BlackItalic.ttf
deleted file mode 100644
index 0c31e9f57c..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-BlackItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-Bold.ttf b/static/fonts/roboto static/Roboto_Condensed-Bold.ttf
deleted file mode 100644
index c3ccd49158..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-Bold.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-BoldItalic.ttf b/static/fonts/roboto static/Roboto_Condensed-BoldItalic.ttf
deleted file mode 100644
index d269187b4b..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-BoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-ExtraBold.ttf b/static/fonts/roboto static/Roboto_Condensed-ExtraBold.ttf
deleted file mode 100644
index 782442a747..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-ExtraBold.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-ExtraBoldItalic.ttf b/static/fonts/roboto static/Roboto_Condensed-ExtraBoldItalic.ttf
deleted file mode 100644
index aeff7c299f..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-ExtraBoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-ExtraLight.ttf b/static/fonts/roboto static/Roboto_Condensed-ExtraLight.ttf
deleted file mode 100644
index 16a1560e8d..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-ExtraLight.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-ExtraLightItalic.ttf b/static/fonts/roboto static/Roboto_Condensed-ExtraLightItalic.ttf
deleted file mode 100644
index 0f6fe709cd..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-ExtraLightItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-Italic.ttf b/static/fonts/roboto static/Roboto_Condensed-Italic.ttf
deleted file mode 100644
index 3b387eb859..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-Italic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-Light.ttf b/static/fonts/roboto static/Roboto_Condensed-Light.ttf
deleted file mode 100644
index e70c357377..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-Light.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-LightItalic.ttf b/static/fonts/roboto static/Roboto_Condensed-LightItalic.ttf
deleted file mode 100644
index 9f623e0021..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-LightItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-Medium.ttf b/static/fonts/roboto static/Roboto_Condensed-Medium.ttf
deleted file mode 100644
index dd2842b549..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-Medium.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-MediumItalic.ttf b/static/fonts/roboto static/Roboto_Condensed-MediumItalic.ttf
deleted file mode 100644
index 80ff64eca9..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-MediumItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-Regular.ttf b/static/fonts/roboto static/Roboto_Condensed-Regular.ttf
deleted file mode 100644
index 5af42d4733..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-Regular.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-SemiBold.ttf b/static/fonts/roboto static/Roboto_Condensed-SemiBold.ttf
deleted file mode 100644
index 4297f17386..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-SemiBold.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-SemiBoldItalic.ttf b/static/fonts/roboto static/Roboto_Condensed-SemiBoldItalic.ttf
deleted file mode 100644
index 6cb4656c66..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-SemiBoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-Thin.ttf b/static/fonts/roboto static/Roboto_Condensed-Thin.ttf
deleted file mode 100644
index 1ccebccfea..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-Thin.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_Condensed-ThinItalic.ttf b/static/fonts/roboto static/Roboto_Condensed-ThinItalic.ttf
deleted file mode 100644
index e58e966e13..0000000000
Binary files a/static/fonts/roboto static/Roboto_Condensed-ThinItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-Black.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-Black.ttf
deleted file mode 100644
index 8eedb64afa..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-Black.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-BlackItalic.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-BlackItalic.ttf
deleted file mode 100644
index 19a509641c..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-BlackItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-Bold.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-Bold.ttf
deleted file mode 100644
index 98d7b0d5ad..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-Bold.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-BoldItalic.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-BoldItalic.ttf
deleted file mode 100644
index 8604aee4a8..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-BoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-ExtraBold.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-ExtraBold.ttf
deleted file mode 100644
index 36423c33fb..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-ExtraBold.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-ExtraBoldItalic.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-ExtraBoldItalic.ttf
deleted file mode 100644
index b40ce774d1..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-ExtraBoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-ExtraLight.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-ExtraLight.ttf
deleted file mode 100644
index e1c25a01c0..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-ExtraLight.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-ExtraLightItalic.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-ExtraLightItalic.ttf
deleted file mode 100644
index 929a0938bf..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-ExtraLightItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-Italic.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-Italic.ttf
deleted file mode 100644
index 23454ff1d8..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-Italic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-Light.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-Light.ttf
deleted file mode 100644
index b9aedcd49d..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-Light.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-LightItalic.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-LightItalic.ttf
deleted file mode 100644
index c096473e92..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-LightItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-Medium.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-Medium.ttf
deleted file mode 100644
index e9c34d6dd9..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-Medium.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-MediumItalic.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-MediumItalic.ttf
deleted file mode 100644
index ab34b70cdb..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-MediumItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-Regular.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-Regular.ttf
deleted file mode 100644
index 36109bacf2..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-Regular.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-SemiBold.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-SemiBold.ttf
deleted file mode 100644
index 6d10b333a0..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-SemiBold.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-SemiBoldItalic.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-SemiBoldItalic.ttf
deleted file mode 100644
index e88bc4af43..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-SemiBoldItalic.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-Thin.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-Thin.ttf
deleted file mode 100644
index 8ed8d79cb8..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-Thin.ttf and /dev/null differ
diff --git a/static/fonts/roboto static/Roboto_SemiCondensed-ThinItalic.ttf b/static/fonts/roboto static/Roboto_SemiCondensed-ThinItalic.ttf
deleted file mode 100644
index 81afeea53c..0000000000
Binary files a/static/fonts/roboto static/Roboto_SemiCondensed-ThinItalic.ttf and /dev/null differ
diff --git a/static/img/percona-fav.svg b/static/img/percona-fav.svg
deleted file mode 100755
index e671a464bb..0000000000
--- a/static/img/percona-fav.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/static/js/alert-troubleshooting.js b/static/js/alert-troubleshooting.js
deleted file mode 100644
index ab980cd239..0000000000
--- a/static/js/alert-troubleshooting.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (C) 2026 Percona LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-/* Animate accordion sections via grid-template-rows transitions. */
-
-document.addEventListener("DOMContentLoaded", function() {
- document.querySelectorAll(".at-section").forEach(function(details) {
- var summary = details.querySelector(".at-section-header");
- var body = details.querySelector(".at-section-body");
- if (!summary || !body) return;
-
- summary.addEventListener("click", function(e) {
- e.preventDefault();
-
- if (details.open) {
- // Collapse: animate grid rows to 0fr, then remove open
- body.style.gridTemplateRows = "0fr";
- body.addEventListener(
- "transitionend",
- function() {
- details.open = false;
- body.style.gridTemplateRows = "";
- }, {
- once: true
- }
- );
- } else {
- // Expand: set open, force 0fr, then animate to 1fr
- details.open = true;
- body.style.gridTemplateRows = "0fr";
- requestAnimationFrame(function() {
- requestAnimationFrame(function() {
- body.style.gridTemplateRows = "1fr";
- body.addEventListener(
- "transitionend",
- function() {
- body.style.gridTemplateRows = "";
- }, {
- once: true
- }
- );
- });
- });
- }
- });
- });
-});
diff --git a/static/js/alerts.js b/static/js/alerts.js
deleted file mode 100644
index 308d861ae4..0000000000
--- a/static/js/alerts.js
+++ /dev/null
@@ -1,625 +0,0 @@
-/*
- * Copyright (C) 2026 Percona LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- */
-
-document.addEventListener('DOMContentLoaded', function() {
- var buttons = document.querySelectorAll('.toggle-btn-group .toggle-btn');
- var rows = document.querySelectorAll('.alerts-table tbody tr');
- var selectAll = document.getElementById('select-all-alerts');
- var pushBtn = document.getElementById('push-to-pmm');
- var resultsContainer = document.getElementById('push-results');
-
- buttons.forEach(function(btn) {
- btn.addEventListener('click', function() {
- buttons.forEach(function(b) {
- b.classList.remove('active');
- });
- btn.classList.add('active');
-
- var filter = btn.getAttribute('data-filter');
- rows.forEach(function(row) {
- if (filter === 'all' || row.getAttribute('data-service-type') === filter) {
- row.style.display = '';
- } else {
- row.style.display = 'none';
- }
- });
-
- if (selectAll) selectAll.checked = false;
- updatePushButton();
- });
- });
-
- if (selectAll) {
- selectAll.addEventListener('change', function() {
- var checked = selectAll.checked;
- rows.forEach(function(row) {
- if (row.style.display !== 'none') {
- var cb = row.querySelector('.alert-checkbox');
- if (cb) cb.checked = checked;
- }
- });
- updatePushButton();
- });
-
- function updateSelectAll() {
- var visible = [];
- rows.forEach(function(row) {
- if (row.style.display !== 'none') {
- var cb = row.querySelector('.alert-checkbox');
- if (cb) visible.push(cb);
- }
- });
- var allChecked = visible.length > 0 && visible.every(function(cb) {
- return cb.checked;
- });
- var someChecked = visible.some(function(cb) {
- return cb.checked;
- });
- selectAll.checked = allChecked;
- selectAll.indeterminate = !allChecked && someChecked;
- }
-
- rows.forEach(function(row) {
- var cb = row.querySelector('.alert-checkbox');
- if (cb) {
- cb.addEventListener('change', function() {
- updateSelectAll();
- updatePushButton();
- });
- }
- });
- }
-
- function getSelectedNames() {
- var names = [];
- rows.forEach(function(row) {
- var cb = row.querySelector('.alert-checkbox');
- if (cb && cb.checked) names.push(cb.value);
- });
- return names;
- }
-
- function updatePushButton() {
- if (!pushBtn) return;
- var selected = getSelectedNames();
- if (selected.length > 0) {
- pushBtn.style.display = '';
- pushBtn.disabled = false;
- } else {
- pushBtn.style.display = 'none';
- pushBtn.disabled = true;
- }
- }
-
- function getCsrfToken() {
- var input = document.querySelector('input[name="csrf-token"]');
- if (input) return input.value;
- return '';
- }
-
- function updateBadge(templateName, newStatus) {
- rows.forEach(function(row) {
- var cb = row.querySelector('.alert-checkbox');
- if (cb && cb.value === templateName) {
- var badges = row.querySelectorAll('.alert-badge');
- badges.forEach(function(badge) {
- if (badge.classList.contains('badge-absent') ||
- badge.classList.contains('badge-unknown')) {
- if (newStatus === 'success') {
- badge.className = 'alert-badge badge-present';
- badge.textContent = 'Present';
- }
- }
- });
- }
- });
- }
-
- function clearChildren(node) {
- while (node.firstChild) node.removeChild(node.firstChild);
- }
-
- function clearResults() {
- if (!resultsContainer) return;
- clearChildren(resultsContainer);
- }
-
- function showResults(results) {
- if (!resultsContainer) return;
- clearResults();
- results.forEach(function(r) {
- var el = document.createElement('div');
- el.className = 'push-result push-result-' + r.status;
- el.textContent = r.name + ': ' + r.message;
- resultsContainer.appendChild(el);
- });
- resultsContainer.style.display = '';
- }
-
- if (pushBtn) {
- pushBtn.addEventListener('click', function() {
- var selected = getSelectedNames();
- if (selected.length === 0) return;
-
- pushBtn.disabled = true;
- pushBtn.textContent = 'Pushing...';
-
- var formData = new FormData();
- selected.forEach(function(name) {
- formData.append('selected_templates', name);
- });
- formData.append('csrf-token', getCsrfToken());
-
- fetch('/alerts/push', {
- method: 'POST',
- body: formData,
- }).then(function(response) {
- return response.json();
- }).then(function(data) {
- if (data.results) {
- showResults(data.results);
- data.results.forEach(function(r) {
- if (r.status === 'success') {
- updateBadge(r.name, 'success');
- }
- });
- } else if (data.error || data.detail) {
- showResults([{
- name: 'Error',
- status: 'error',
- message: data.error || data.detail
- }]);
- }
- }).catch(function(err) {
- showResults([{
- name: 'Error',
- status: 'error',
- message: 'Network error: ' + err.message
- }]);
- }).finally(function() {
- pushBtn.disabled = false;
- pushBtn.textContent = 'Push to PMM';
- updatePushButton();
- });
- });
- }
-
- updatePushButton();
-
- // PagerDuty widget
- var pdWidget = document.getElementById('pagerduty-widget');
-
- function showFeedback(message, isError) {
- var feedback = document.getElementById('pd-feedback');
- if (!feedback) return;
- feedback.textContent = message;
- feedback.className = 'pd-feedback ' + (isError ? 'error' : 'success');
- }
-
- function getPdCsrfToken() {
- var input = pdWidget.querySelector('[name="csrf-token"]');
- return input ? input.value : '';
- }
-
- function el(tag, attrs, children) {
- var node = document.createElement(tag);
- if (attrs) {
- Object.keys(attrs).forEach(function(k) {
- if (k === 'className') {
- node.className = attrs[k];
- } else if (k === 'textContent') {
- node.textContent = attrs[k];
- } else {
- node.setAttribute(k, attrs[k]);
- }
- });
- }
- (children || []).forEach(function(c) {
- node.appendChild(c);
- });
- return node;
- }
-
- function buildFeedbackDiv() {
- return el('div', {
- id: 'pd-feedback',
- className: 'pd-feedback'
- });
- }
-
- function buildCsrfInput(csrfToken) {
- return el('input', {
- type: 'hidden',
- name: 'csrf-token',
- value: csrfToken
- });
- }
-
- function renderConfigured(csrfToken) {
- clearChildren(pdWidget);
-
- pdWidget.appendChild(el('h4', {
- textContent: 'PagerDuty Integration'
- }));
-
- var badge = el('span', {
- className: 'alert-badge badge-present',
- textContent: 'Configured'
- });
- pdWidget.appendChild(el('div', {
- className: 'pd-status'
- }, [badge]));
-
- var form = el('form', {
- id: 'pd-form',
- className: 'pd-form'
- }, [
- buildCsrfInput(csrfToken),
- el('label', {
- for: 'pd-integration-key',
- textContent: 'Update Integration Key'
- }),
- el('input', {
- type: 'password',
- id: 'pd-integration-key',
- name: 'integration_key',
- placeholder: 'Enter new PagerDuty key'
- }),
- el('div', {
- className: 'pd-form-actions'
- }, [
- el('button', {
- type: 'submit',
- className: 'contained small',
- textContent: 'Update'
- }),
- el('button', {
- type: 'button',
- className: 'text small pd-delete-btn',
- id: 'pd-delete-btn',
- textContent: 'Delete'
- })
- ])
- ]);
- pdWidget.appendChild(form);
- pdWidget.appendChild(buildFeedbackDiv());
-
- bindPdEvents();
- }
-
- function renderNotConfigured(csrfToken) {
- clearChildren(pdWidget);
-
- pdWidget.appendChild(el('h4', {
- textContent: 'PagerDuty Integration'
- }));
- pdWidget.appendChild(el('span', {
- className: 'alert-badge badge-absent',
- textContent: 'Not Configured'
- }));
-
- var form = el('form', {
- id: 'pd-form',
- className: 'pd-form'
- }, [
- buildCsrfInput(csrfToken),
- el('label', {
- for: 'pd-integration-key',
- textContent: 'Integration Key'
- }),
- el('input', {
- type: 'password',
- id: 'pd-integration-key',
- name: 'integration_key',
- placeholder: 'Enter PagerDuty integration key',
- required: 'required'
- }),
- el('button', {
- type: 'submit',
- className: 'contained small',
- textContent: 'Create'
- })
- ]);
- pdWidget.appendChild(form);
- pdWidget.appendChild(buildFeedbackDiv());
-
- bindPdEvents();
- }
-
- function bindPdEvents() {
- var form = document.getElementById('pd-form');
- var deleteBtn = document.getElementById('pd-delete-btn');
-
- if (form) {
- form.addEventListener('submit', handleSave);
- }
- if (deleteBtn) {
- deleteBtn.addEventListener('click', handleDelete);
- }
- }
-
- function handleSave(e) {
- e.preventDefault();
- var form = document.getElementById('pd-form');
- var csrfToken = getPdCsrfToken();
- var integrationKey = form.querySelector('[name="integration_key"]').value;
-
- if (!integrationKey) {
- showFeedback('Integration key is required.', true);
- return;
- }
-
- var formData = new FormData();
- formData.append('integration_key', integrationKey);
- formData.append('csrf-token', csrfToken);
-
- fetch('/alerts/pagerduty', {
- method: 'POST',
- headers: {
- 'X-CSRF-Token': csrfToken
- },
- body: formData
- }).then(function(response) {
- return response.json().then(function(data) {
- return {
- ok: response.ok,
- data: data
- };
- });
- }).then(function(result) {
- if (result.ok) {
- renderConfigured(csrfToken);
- showFeedback('PagerDuty integration ' + result.data.status + ' successfully.', false);
- } else {
- showFeedback(result.data.error || 'An error occurred.', true);
- }
- }).catch(function() {
- showFeedback('Network error. Please try again.', true);
- });
- }
-
- function handleDelete() {
- if (!confirm('Are you sure you want to delete the PagerDuty integration?')) {
- return;
- }
-
- var csrfToken = getPdCsrfToken();
- var formData = new FormData();
- formData.append('csrf-token', csrfToken);
-
- fetch('/alerts/pagerduty/delete', {
- method: 'POST',
- headers: {
- 'X-CSRF-Token': csrfToken
- },
- body: formData
- }).then(function(response) {
- return response.json().then(function(data) {
- return {
- ok: response.ok,
- data: data
- };
- });
- }).then(function(result) {
- if (result.ok) {
- renderNotConfigured(csrfToken);
- showFeedback('PagerDuty integration deleted.', false);
- } else {
- showFeedback(result.data.error || 'An error occurred.', true);
- }
- }).catch(function() {
- showFeedback('Network error. Please try again.', true);
- });
- }
-
- if (pdWidget) {
- bindPdEvents();
- }
-
- // Backup detail & restore functionality
- var restoreDialog = document.getElementById('dialog-restore-confirm');
- var detailDialog = document.getElementById('dialog-backup-detail');
- var feedback = document.getElementById('restore-feedback');
- var pendingRestoreId = null;
-
- function getBackupCsrfToken() {
- var input = document.getElementById('backup-csrf-token');
- return input ? input.value : '';
- }
-
- function buildDetailSection(title, items, renderItem) {
- var section = el('div', {
- className: 'backup-detail-section'
- }, [
- el('h4', {
- textContent: title + ' (' + items.length + ')'
- })
- ]);
- var list = el('ul');
- items.forEach(function(item) {
- list.appendChild(renderItem(item));
- });
- section.appendChild(list);
- return section;
- }
-
- document.querySelectorAll('.backup-detail-btn').forEach(function(btn) {
- btn.addEventListener('click', function() {
- var backupId = btn.getAttribute('data-backup-id');
- var backupDate = btn.getAttribute('data-backup-date');
- var dateSpan = document.getElementById('detail-date');
- var content = document.getElementById('detail-content');
-
- dateSpan.textContent = backupDate;
- clearChildren(content);
- content.appendChild(el('p', {
- className: 'text-muted',
- textContent: 'Loading\u2026'
- }));
- detailDialog.showModal();
-
- fetch('/alerts/backups/' + backupId).then(function(response) {
- if (!response.ok) throw new Error('Failed to load backup details');
- return response.json();
- }).then(function(data) {
- clearChildren(content);
-
- if (data.templates.length) {
- content.appendChild(buildDetailSection('Templates', data.templates, function(t) {
- var li = el('li', {
- textContent: t.name
- });
- if (t.summary) {
- li.appendChild(el('span', {
- className: 'detail-type',
- textContent: ' \u2014 ' + t.summary
- }));
- }
- return li;
- }));
- }
-
- if (data.rules.length) {
- content.appendChild(buildDetailSection('Rules', data.rules, function(r) {
- return el('li', {
- textContent: r.title
- });
- }));
- }
-
- if (data.contact_points.length) {
- content.appendChild(buildDetailSection('Contact Points', data.contact_points, function(cp) {
- var li = el('li', {
- textContent: cp.name
- });
- if (cp.type) {
- li.appendChild(el('span', {
- className: 'detail-type',
- textContent: ' (' + cp.type + ')'
- }));
- }
- return li;
- }));
- }
-
- if (data.folders.length) {
- content.appendChild(buildDetailSection('Folders', data.folders, function(f) {
- return el('li', {
- textContent: f.title
- });
- }));
- }
-
- if (data.notification_policy_receiver) {
- var policySection = el('div', {
- className: 'backup-detail-section'
- }, [
- el('h4', {
- textContent: 'Notification Policy'
- })
- ]);
- var policyList = el('ul');
- var policyItem = el('li');
- policyItem.appendChild(document.createTextNode('Receiver: '));
- policyItem.appendChild(el('strong', {
- textContent: data.notification_policy_receiver
- }));
- policyList.appendChild(policyItem);
- policySection.appendChild(policyList);
- content.appendChild(policySection);
- }
-
- if (!content.hasChildNodes()) {
- content.appendChild(el('p', {
- className: 'text-muted',
- textContent: 'This backup is empty.'
- }));
- }
- }).catch(function(err) {
- clearChildren(content);
- content.appendChild(el('p', {
- className: 'text-muted',
- textContent: 'Error: ' + err.message
- }));
- });
- });
- });
-
- document.querySelectorAll('.backup-restore-btn').forEach(function(btn) {
- btn.addEventListener('click', function() {
- pendingRestoreId = btn.getAttribute('data-backup-id');
- var backupDate = btn.getAttribute('data-backup-date');
- document.getElementById('restore-confirm-date').textContent = backupDate;
- restoreDialog.showModal();
- });
- });
-
- var confirmBtn = document.getElementById('restore-confirm-btn');
- if (confirmBtn) {
- confirmBtn.addEventListener('click', function() {
- if (!pendingRestoreId) return;
- restoreDialog.close();
-
- feedback.textContent = 'Restoring\u2026';
- feedback.className = 'restore-feedback';
-
- var csrfToken = getBackupCsrfToken();
- var formData = new FormData();
- formData.append('backup_id', pendingRestoreId);
- formData.append('csrf-token', csrfToken);
-
- fetch('/alerts/restore', {
- method: 'POST',
- body: formData,
- headers: {
- 'X-CSRF-Token': csrfToken
- },
- }).then(function(response) {
- if (!response.ok) {
- return response.json().catch(function() {
- return {
- status: 'error',
- message: 'Request failed with status ' + response.status
- };
- }).then(function(data) {
- if (data.status === 'error') return data;
- return {
- status: 'error',
- message: data.message || data.error || 'Request failed'
- };
- });
- }
- return response.json();
- }).then(function(data) {
- if (data.status === 'success') {
- var d = data.details;
- feedback.className = 'restore-feedback feedback-success';
- var msg = 'Restore complete: ' +
- d.rules_deleted + ' rules deleted, ' +
- d.rules_created + ' created';
- if (d.rules_skipped > 0) {
- msg += ', ' + d.rules_skipped + ' skipped';
- }
- msg += '. ' +
- d.templates.created + ' templates created, ' +
- d.templates.skipped + ' skipped.';
- feedback.textContent = msg;
- } else {
- feedback.className = 'restore-feedback feedback-error';
- feedback.textContent = 'Restore failed: ' + (data.message || data.error || 'Unknown error');
- }
- }).catch(function(err) {
- feedback.className = 'restore-feedback feedback-error';
- feedback.textContent = 'Restore failed: ' + err.message;
- }).finally(function() {
- pendingRestoreId = null;
- });
- });
- }
-});
diff --git a/static/js/app.js b/static/js/app.js
deleted file mode 100644
index 2c8a6e7374..0000000000
--- a/static/js/app.js
+++ /dev/null
@@ -1,641 +0,0 @@
-/**
- * Copyright (C) 2026 Percona LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-document.addEventListener('DOMContentLoaded', () => {
-
- const body = document.body;
-
- // =============================================
- // Sidebar behaviors
- // =============================================
- // Select all sidebar links
- const sidebarLinks = document.querySelectorAll('.sidebar .list-item');
- const currentPath = window.location.pathname;
-
- // Set the active sidebar link
- sidebarLinks.forEach(link => {
- if (link.target === '_blank') return;
-
- const linkPath = new URL(link.href, window.location.origin).pathname;
- const currentPath = window.location.pathname;
-
- if (linkPath === '/' && currentPath === '/') {
- link.classList.add('active');
- console.log("rool")
- } else if (
- linkPath !== '/' &&
- (currentPath === linkPath || currentPath.startsWith(linkPath))
- ) {
- link.classList.add('active');
- console.log("herer")
- }
- });
-
- // =============================================
- // GUI theme toggle
- // =============================================
- // Read localstorage to set the theme
- const storedTheme = localStorage.getItem('theme');
- const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
-
- // Set theme: use stored theme if available, otherwise use system preference.
- const theme = storedTheme ? storedTheme : (systemPrefersDark ? 'dark' : 'light');
- body.setAttribute('data-theme', theme);
-
- // Select the theme toggle buttons.
- // Give each toggle a distinguishing class (or data attribute).
- const darkToggle = document.querySelector('.theme-change.dark');
- const lightToggle = document.querySelector('.theme-change.light');
-
- if (darkToggle) {
- darkToggle.addEventListener('click', (e) => {
- e.preventDefault();
- body.setAttribute('data-theme', 'dark');
- localStorage.setItem('theme', 'dark');
- });
- }
-
- if (lightToggle) {
- lightToggle.addEventListener('click', (e) => {
- e.preventDefault();
- body.setAttribute('data-theme', 'light');
- localStorage.setItem('theme', 'light');
- });
- }
-
- // =============================================
- // Tab functionality
- // =============================================
- // Select all tab buttons and tab panels
- function initTabs(tabsContainer, panelsContainer, storageKey) {
- const tabButtons = tabsContainer.querySelectorAll('[role="tab"]');
- const tabPanels = panelsContainer.querySelectorAll('[role="tabpanel"]');
-
- // Restore stored state for this container
- const savedTabId = localStorage.getItem(storageKey);
- if (savedTabId) {
- const savedTab = tabsContainer.querySelector(`[role="tab"][aria-controls="${savedTabId}"]`);
- const savedPanel = panelsContainer.querySelector(`#${savedTabId}`);
- if (savedTab && savedPanel) {
- tabButtons.forEach(btn => btn.setAttribute('aria-selected', 'false'));
- tabPanels.forEach(panel => panel.setAttribute('aria-hidden', 'true'));
- savedTab.setAttribute('aria-selected', 'true');
- savedPanel.setAttribute('aria-hidden', 'false');
- }
- } else if (tabButtons.length > 0) {
- // If no saved state, activate the first tab.
- tabButtons.forEach(btn => btn.setAttribute('aria-selected', 'false'));
- tabPanels.forEach(panel => panel.setAttribute('aria-hidden', 'true'));
- const defaultTab = tabButtons[0];
- defaultTab.setAttribute('aria-selected', 'true');
- const targetId = defaultTab.getAttribute('aria-controls');
- const defaultPanel = panelsContainer.querySelector(`#${targetId}`);
- if (defaultPanel) {
- defaultPanel.setAttribute('aria-hidden', 'false');
- }
- localStorage.setItem(storageKey, targetId);
- }
-
- // Attach click handlers to each tab button.
- tabButtons.forEach(button => {
- button.addEventListener('click', () => {
-
- // Reset selected state and hide panels within this container only
- tabButtons.forEach(btn => btn.setAttribute('aria-selected', 'false'));
- tabPanels.forEach(panel => panel.setAttribute('aria-hidden', 'true'));
-
- // Activate the clicked tab and its associated panel
- button.setAttribute('aria-selected', 'true');
- const targetId = button.getAttribute('aria-controls');
- const targetPanel = panelsContainer.querySelector(`#${targetId}`);
- if (targetPanel) {
- targetPanel.setAttribute('aria-hidden', 'false');
- }
- localStorage.setItem(storageKey, targetId);
- });
- });
- }
-
- const appAltersStageTabs = document.querySelector('.app-stage.tabs-wrapper');
- if (appAltersStageTabs) {
- initTabs(appAltersStageTabs, appAltersStageTabs, 'appAltersStageTabsId');
- }
-
- document.querySelectorAll('.modal-log.tabs-wrapper').forEach(container => {
- if (!container.id) {
- container.id = 'modalTabs_' + Math.random().toString(36).substr(2, 9);
- }
- const storageKey = 'modalActiveTab_' + container.id;
- const tabsContainer = container.querySelector('nav.tabs');
- const panelsContainer = container;
- initTabs(tabsContainer, panelsContainer, storageKey);
- });
-
- // =============================================
- // Moment.js
- // =============================================
- // For dates
- // Note: Relative time formatting is possible, consult documentation
- document.querySelectorAll('.date').forEach(el => {
- const originalDate = el.textContent.trim();
- const mDate = moment(originalDate);
- if (mDate.isValid()) {
- el.textContent = mDate.format('YYYY-MM-DD HH:mm:ss'); // MySQL format
- } else {
- console.warn('Invalid date:', originalDate);
- }
- });
-
- // =============================================
- // Simple-DataTables
- // Documentation: fiduswriter.github.io/simple-datatables/documentation
- // =============================================
- // Templating
- const templateBase = (options, dom) => `
-
- ${options.searchable ? `
-
- pageview
-
-
` : ""}
- ${options.paging && options.perPageSelect ? `
-
-
-
` : ""}
-
-
-
- ${options.paging ? `
-
` : ""}
-
-
`;
-
- // Base configuration
- const tableDefault = {
- perPageSelect: [10, 20, 50, 100],
- prevText: "chevron_left",
- nextText: "chevron_right",
- searchable: true,
- template: templateBase,
- labels: {
- placeholder: "Search in table...",
- searchTitle: "Search in table",
- pageTitle: "Page {page}",
- perPage: "Entries per page: ",
- noRows: "No entries found",
- info: "{start}–{end} entries of {rows}",
- noResults: "No results match your search query",
- },
- columns: [{
- select: 0,
- sort: "asc"
- }, ],
- };
-
- // Applying the previous configurations...
- document.querySelectorAll('[data-table]').forEach(table => {
- let config = {
- ...tableDefault
- };
-
- const tableId = table.getAttribute('data-table') || 'default';
-
- // Special configuration for completed-tasks table: sort by "Started at" column (index 2) descending
- const defaultSort = tableId === 'completed-tasks' ? {
- select: 2, // "Started at" column
- sort: "desc"
- } : config.columns[0];
-
- // Check for saved sort preference in sessionStorage
- const sortStorageKey = `datatable-sort-${tableId}`;
- const savedSort = sessionStorage.getItem(sortStorageKey);
-
- if (savedSort) {
- try {
- const {
- column,
- direction
- } = JSON.parse(savedSort);
- config.columns = [{
- select: column,
- sort: direction
- }];
- } catch (e) {
- // If parsing fails, use default sort
- config.columns = [defaultSort];
- }
- } else {
- config.columns = [defaultSort];
- }
-
- const dataTable = new simpleDatatables.DataTable(table, config);
- if (typeof dataTable.on === 'function') {
- // Save sort preference to sessionStorage when user changes sort
- dataTable.on('datatable.sort', (column, direction) => {
- sessionStorage.setItem(sortStorageKey, JSON.stringify({
- column: column,
- direction: direction
- }));
- });
-
- dataTable.on('datatable.update', () => {
- table.querySelectorAll('.menu').forEach(setupExpandable);
- table.querySelectorAll('[data-tooltip]').forEach(trigger => {
- if (!trigger._tooltipBound) {
- bindTooltip(trigger);
- }
- });
- table.querySelectorAll('[data-modal="trigger"]').forEach(trigger => {
- if (!trigger._modalBound) {
- bindModalTrigger(trigger);
- }
- });
- });
- }
- });
-
- // =============================================
- // Dropdown menus with Floating UI
- // =============================================
- let openMenu = null;
-
- function setupExpandable(container) {
- // Prevent duplicate binding:
- if (container._expandableBound) return;
-
- // Ensure the container has the necessary elements.
- const trigger = container.querySelector('.trigger');
- const content = container.querySelector('.content');
- if (!trigger || !content) return;
-
- // Initially hide the content.
- content.style.display = 'none';
- trigger.setAttribute('aria-expanded', 'false');
- content.setAttribute('aria-hidden', 'true');
-
- // Function to update the position using Floating UI.
- function updatePosition() {
- FloatingUIDOM.computePosition(trigger, content, {
- placement: 'bottom',
- middleware: [
- FloatingUIDOM.offset(4),
- FloatingUIDOM.flip(),
- FloatingUIDOM.shift({
- padding: 16
- }),
- ],
- }).then(({
- x,
- y
- }) => {
- Object.assign(content.style, {
- position: 'absolute',
- left: `${x}px`,
- top: `${y}px`,
- });
- });
- }
-
- let cleanupAutoUpdate = null;
-
- function show() {
- content.style.display = 'block';
- updatePosition();
- cleanupAutoUpdate = FloatingUIDOM.autoUpdate(trigger, content, updatePosition);
- trigger.setAttribute('aria-expanded', 'true');
- content.setAttribute('aria-hidden', 'false');
- openMenu = container;
- }
-
- function hide() {
- content.style.display = 'none';
- if (cleanupAutoUpdate) {
- cleanupAutoUpdate();
- cleanupAutoUpdate = null;
- }
- trigger.setAttribute('aria-expanded', 'false');
- content.setAttribute('aria-hidden', 'true');
- if (openMenu === container) {
- openMenu = null;
- }
- }
-
- // Attach the hide and show functions
- container.hideExpandable = hide;
- container.showExpandable = show;
-
- // Toggle the expandable element when clicking on the trigger
- trigger.addEventListener('click', (e) => {
- e.stopPropagation();
- if (openMenu && openMenu !== container) {
- openMenu.hideExpandable();
- }
- const computedDisplay = window.getComputedStyle(content).display;
- if (computedDisplay === 'block') {
- hide();
- } else {
- show();
- }
- });
-
- // Mark that binding is complete.
- container._expandableBound = true;
- }
-
- // Apply this to all elements that need the expandable behavior.
- const expandables = document.querySelectorAll('.menu');
- expandables.forEach(setupExpandable);
-
- // Attach a single document-level listener to hide the open menu if the click is outside the open menu.
- document.addEventListener('click', (e) => {
- if (openMenu && !openMenu.contains(e.target)) {
- openMenu.hideExpandable();
- }
- });
-
- // =============================================
- // Tooltip functionality with Floating UI
- // =============================================
- // Elements with a "data-tooltip" attribute will show a tooltip on hover.
- function bindTooltip(trigger) {
- // If already bound, skip re‑binding.
- if (trigger._tooltipBound) return;
-
- let tooltipElem = null;
- let cleanupAutoUpdate = null;
- let tooltipTimeout = null;
-
- function showTooltip() {
- const hasAriaLabel = trigger.hasAttribute('aria-label');
- const tooltipText = hasAriaLabel ? trigger.getAttribute('aria-label') : trigger.getAttribute('data-tooltip');
- let delay = parseInt(trigger.getAttribute('data-tooltip'), 10);
- if (isNaN(delay) || delay === 0) {
- delay = 200;
- }
- tooltipTimeout = setTimeout(() => {
- tooltipElem = document.createElement('div');
- tooltipElem.className = 'tooltip';
- tooltipElem.innerText = tooltipText;
- tooltipElem.style.opacity = '0';
- tooltipElem.style.transition = 'opacity 50ms ease-out';
- document.body.appendChild(tooltipElem);
- FloatingUIDOM.computePosition(trigger, tooltipElem, {
- placement: 'top',
- middleware: [
- FloatingUIDOM.offset(8),
- FloatingUIDOM.flip(),
- FloatingUIDOM.shift({
- padding: 5
- }),
- ],
- }).then(({
- x,
- y
- }) => {
- Object.assign(tooltipElem.style, {
- position: 'absolute',
- left: `${x}px`,
- top: `${y}px`,
- });
- });
- requestAnimationFrame(() => {
- tooltipElem.style.opacity = '1';
- });
- cleanupAutoUpdate = FloatingUIDOM.autoUpdate(trigger, tooltipElem, () => {
- FloatingUIDOM.computePosition(trigger, tooltipElem, {
- placement: 'top',
- middleware: [
- FloatingUIDOM.offset(8),
- FloatingUIDOM.flip(),
- FloatingUIDOM.shift({
- padding: 5
- }),
- ],
- }).then(({
- x,
- y
- }) => {
- Object.assign(tooltipElem.style, {
- position: 'absolute',
- left: `${x}px`,
- top: `${y}px`,
- });
- });
- });
- }, delay);
- }
-
- function hideTooltip() {
- clearTimeout(tooltipTimeout);
- if (tooltipElem) {
- tooltipElem.style.opacity = '0';
- setTimeout(() => {
- if (tooltipElem && tooltipElem.parentNode) {
- tooltipElem.parentNode.removeChild(tooltipElem);
- tooltipElem = null;
- }
- }, 100);
- }
- if (cleanupAutoUpdate) {
- cleanupAutoUpdate();
- cleanupAutoUpdate = null;
- }
- }
- trigger.addEventListener('mouseenter', showTooltip);
- trigger.addEventListener('mouseleave', hideTooltip);
-
- // Mark that we've bound tooltip events to this element.
- trigger._tooltipBound = true;
- }
-
- // =============================================
- // Soft wrapping for log output - Global behavior
- // =============================================
- // Select all triggers and containers based on the data attributes
- const softWrapTriggers = document.querySelectorAll('[data-soft-wrap="trigger"]');
- const softWrapContainers = document.querySelectorAll('[data-soft-wrap="container"]');
-
- // Function to update all triggers and containers based on the given state
- function setGlobalSoftWrapState(state) {
- // Update every trigger to match the new state
- softWrapTriggers.forEach(trigger => {
- trigger.checked = state;
- });
- // Add or remove the .soft-wrap class on every container
- softWrapContainers.forEach(container => {
- if (state) {
- container.classList.add('soft-wrap');
- } else {
- container.classList.remove('soft-wrap');
- }
- });
- }
-
- // Attach a change listener to each trigger
- softWrapTriggers.forEach(trigger => {
- trigger.addEventListener('change', function() {
- // When one trigger is changed, update all triggers and containers to match its state
- setGlobalSoftWrapState(this.checked);
- });
- });
-
- // =============================================
- // Modal logic using