diff --git a/app/assets/css/app.css b/app/assets/css/app.css
index 14112535a..1dec9f844 100644
--- a/app/assets/css/app.css
+++ b/app/assets/css/app.css
@@ -40,6 +40,12 @@ body,
position: relative;
}
+.logo {
+ display: inline;
+ max-width: 155px;
+ max-height: 55px;
+}
+
.white-space-normal {
white-space: normal !important;
}
@@ -76,10 +82,6 @@ body,
font-size: 18px;
}
-.header_title_content {
- margin-left: 5px;
-}
-
.form-section-title {
@apply text-gray-9;
@apply th-dark:text-gray-5;
diff --git a/app/assets/css/bootstrap-override.css b/app/assets/css/bootstrap-override.css
index fd0c99306..501508817 100644
--- a/app/assets/css/bootstrap-override.css
+++ b/app/assets/css/bootstrap-override.css
@@ -329,25 +329,6 @@ input:checked + .slider:before {
border: 0px;
}
-/* Databatle Setting Menu */
-
-.tableMenu {
- border: 1px solid var(--border-bootbox);
- border-radius: 8px;
-}
-
-[data-reach-menu-list],
-[data-reach-menu-items] {
- background: none;
-}
-
-.dropdown-menu {
- border-radius: 8px;
-}
-.dropdown-menu .tableMenu {
- border: 0px;
-}
-
/* Status Indicator Inside Table Section Label Style */
.table .label {
border-radius: 8px !important;
diff --git a/app/assets/css/button.css b/app/assets/css/button.css
index de76ce96f..e83b9b873 100644
--- a/app/assets/css/button.css
+++ b/app/assets/css/button.css
@@ -1,17 +1,24 @@
.btn {
- @apply disabled:opacity-60;
@apply !outline-none;
@apply border border-solid border-transparent;
- border-radius: 5px;
+ border-radius: 8px;
display: inline-flex;
justify-content: space-around;
align-items: center;
gap: 5px;
}
-.btn-group {
- display: inline-flex;
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+ @apply opacity-40;
+ pointer-events: none;
+ touch-action: none;
+}
+
+.btn:hover {
+ color: var(--text-button-hover-color);
}
.btn.active {
@@ -19,12 +26,11 @@
}
.btn-primary {
- @apply bg-blue-8 border-blue-8;
- @apply hover:bg-blue-9 hover:border-blue-9;
+ @apply text-white bg-blue-8 border-blue-8;
+ @apply hover:text-white hover:bg-blue-9 hover:border-blue-9;
@apply th-dark:hover:bg-blue-7 th-dark:hover:border-blue-7;
}
-.btn-primary:focus,
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
@@ -40,20 +46,17 @@
/* Button Secondary */
.btn-secondary {
@apply border border-solid;
- @apply disabled:border-transparent;
@apply text-blue-9 bg-blue-2 border-blue-8;
- @apply hover:bg-blue-3 focus:bg-blue-3;
+ @apply hover:bg-blue-3;
@apply th-dark:text-blue-3 th-dark:bg-gray-10 th-dark:border-blue-7;
@apply th-dark:hover:bg-blue-11;
- @apply th-dark:focus:bg-gray-10 th-dark:focus:border-blue-5;
}
.btn-danger {
@apply bg-error-8 border-error-8;
@apply hover:bg-error-7 hover:border-error-7 hover:text-white;
- @apply focus:bg-error-8 focus:text-white focus:border-blue-5;
}
.btn-danger:active,
@@ -68,19 +71,25 @@
@apply hover:bg-error-2 th-dark:hover:bg-error-11;
@apply border-error-5 th-dark:border-error-7 th-highcontrast:border-error-7;
@apply border border-solid;
-
- @apply focus:border-blue-5;
}
.btn-success {
background-color: var(--ui-success-7);
}
+.btn-success:hover {
+ color: var(--white-color);
+}
+
+/* secondary-grey */
+.btn-default,
.btn-light {
- @apply hover:bg-gray-2 th-dark:hover:bg-gray-9;
- background-color: var(--bg-button-group-color);
- border: 1px solid var(--border-button-group);
- color: var(--text-button-group-color);
+ @apply bg-white border-gray-5 text-gray-9;
+ @apply hover:bg-gray-3 hover:border-gray-5 hover:text-gray-10;
+
+ /* dark mode */
+ @apply th-dark:bg-gray-warm-10 th-dark:border-gray-warm-7 th-dark:text-gray-warm-4;
+ @apply th-dark:hover:bg-gray-warm-9 th-dark:hover:border-gray-6 th-dark:hover:text-gray-warm-4;
}
.btn-light:active,
@@ -89,15 +98,51 @@
background-color: var(--ui-gray-3);
}
-form a,
-.form-group a,
.hyperlink {
color: var(--ui-blue-8);
}
-form a:hover,
-.form-group a:hover,
.hyperlink:hover {
text-decoration: underline;
color: var(--ui-blue-9);
}
+
+.btn-group {
+ display: inline-flex;
+}
+
+.input-group-btn .btn.active,
+.btn-group .btn.active {
+ @apply bg-blue-2 text-blue-10 border-blue-5;
+ @apply th-dark:bg-blue-11 th-dark:text-blue-2 th-dark:border-blue-9;
+}
+
+/* focus */
+
+.btn-primary:focus,
+.btn-secondary:focus,
+.btn-light:focus {
+ @apply border-blue-5;
+}
+
+.btn-danger:focus,
+.btn-dangerlight:focus {
+ @apply border-blue-6;
+}
+
+.btn-primary:focus,
+.btn-secondary:focus,
+.btn-light:focus,
+.btn-danger:focus,
+.btn-dangerlight:focus {
+ --btn-focus-color: var(--ui-blue-3);
+ box-shadow: 0px 0px 0px 4px var(--btn-focus-color);
+}
+
+[theme='dark'] .btn-primary:focus,
+[theme='dark'] .btn-secondary:focus,
+[theme='dark'] .btn-light:focus,
+[theme='dark'] .btn-danger:focus,
+[theme='dark'] .btn-dangerlight:focus {
+ --btn-focus-color: var(--ui-blue-11);
+}
diff --git a/app/assets/css/theme.css b/app/assets/css/theme.css
index e50508f98..150e891c5 100644
--- a/app/assets/css/theme.css
+++ b/app/assets/css/theme.css
@@ -93,10 +93,9 @@
--bg-main-color: var(--white-color);
--bg-body-color: var(--grey-9);
--bg-checkbox-border-color: var(--grey-49);
- --bg-sidebar-header-color: var(--grey-37);
--bg-widget-color: var(--white-color);
--bg-widget-header-color: var(--grey-10);
- --bg-widget-table-color: var(--grey-13);
+ --bg-widget-table-color: var(--ui-gray-3);
--bg-header-color: var(--white-color);
--bg-hover-table-color: var(--grey-14);
--bg-switch-box-color: var(--ui-gray-5);
@@ -111,6 +110,7 @@
--bg-navtabs-color: var(--white-color);
--bg-navtabs-hover-color: var(--grey-16);
--bg-table-selected-color: var(--grey-14);
+ --bg-codemirror-color: var(--white-color);
--bg-codemirror-gutters-color: var(--grey-17);
--bg-dropdown-menu-color: var(--white-color);
--bg-log-viewer-color: var(--white-color);
@@ -126,11 +126,7 @@
--bg-motd-body-color: var(--grey-20);
--bg-item-highlighted-color: var(--grey-21);
--bg-item-highlighted-null-color: var(--grey-14);
- --bg-row-header-color: var(--white-color);
- --bg-image-multiselect-button: linear-gradient(var(--white-color), var(--grey-17));
- --bg-multiselect-checkbox-color: var(--white-color);
--bg-panel-body-color: var(--white-color);
- --bg-codemirror-color: var(--white-color);
--bg-codemirror-selected-color: var(--grey-22);
--bg-tooltip-color: var(--ui-gray-11);
--bg-input-sm-color: var(--white-color);
@@ -149,8 +145,6 @@
--bg-btn-focus: var(--grey-59);
--bg-boxselector-disabled-color: var(--white-color);
--bg-small-select-color: var(--white-color);
- --bg-app-datatable-thead: var(--grey-23);
- --bg-app-datatable-tbody: var(--grey-24);
--bg-stepper-item-active: var(--white-color);
--bg-stepper-item-counter: var(--grey-61);
--bg-sortbutton-color: var(--white-color);
@@ -176,7 +170,6 @@
--text-link-color: var(--blue-2);
--text-link-hover-color: var(--blue-4);
--text-input-group-addon-color: var(--grey-25);
- --text-btn-default-color: var(--grey-6);
--text-blocklist-hover-color: var(--grey-37);
--text-dashboard-item-color: var(--grey-32);
--text-danger-color: var(--red-1);
@@ -230,23 +223,18 @@
--border-md-checkbox-color: var(--grey-19);
--border-modal-header-color: var(--grey-45);
--border-navtabs-color: var(--ui-white);
- --border-form-section-title-color: var(--grey-33);
--border-codemirror-cursor-color: var(--black-color);
- --border-codemirror-gutters-color: var(--grey-19);
--border-pre-color: var(--grey-43);
--border-blocklist-item-selected-color: var(--grey-46);
- --border-pagination-color: var(--ui-white);
--border-pagination-span-color: var(--ui-white);
--border-pagination-hover-color: var(--ui-white);
- --border-multiselect-button-color: var(--grey-48);
- --border-searchbar-color: var(--grey-10);
--border-panel-color: var(--white-color);
+ --border-input-sm-color: var(--grey-47);
--border-daterangepicker-color: var(--grey-19);
--border-calendar-table: var(--white-color);
--border-daterangepicker: var(--grey-19);
--border-pre-next-month: var(--black-color);
--border-daterangepicker-after: var(--white-color);
- --border-tooltip-color: var(--grey-47);
--border-modal: 0px;
--border-sortbutton: var(--grey-8);
--border-bootbox: var(--ui-gray-5);
@@ -261,7 +249,6 @@
--button-close-color: var(--black-color);
--button-opacity: 0.2;
--button-opacity-hover: 0.5;
- --bg-boxselector-wrapper-color: var(--grey-6);
--bg-image-multiselect: linear-gradient(var(--blue-2), var(--blue-2));
--bg-image-multiselect-button: linear-gradient(var(--white-color), var(--grey-17));
@@ -286,33 +273,27 @@
--text-button-group: var(--ui-gray-9);
}
+/* Dark Theme */
[theme='dark'] {
- --bg-card-color: var(--grey-1);
- --bg-main-color: var(--grey-2);
--bg-body-color: var(--grey-2);
--bg-btn-default-color: var(--grey-3);
- --bg-blocklist-hover-color: var(--grey-iron-10);
- --bg-boxselector-color: var(--grey-iron-10);
+ --bg-blocklist-hover-color: var(--ui-gray-iron-10);
+ --bg-boxselector-color: var(--ui-gray-iron-10);
--bg-blocklist-item-selected-color: var(--grey-3);
- --bg-boxselector-wrapper-disabled-color: var(--grey-39);
--bg-card-color: var(--grey-1);
--bg-checkbox-border-color: var(--grey-8);
--bg-code-color: var(--ui-gray-warm-11);
--bg-codemirror-color: var(--ui-gray-warm-11);
--bg-codemirror-gutters-color: var(--ui-gray-warm-8);
--bg-codemirror-selected-color: var(--ui-gray-warm-7);
- --bg-dropdown-menu-color: var(--grey-1);
+ --bg-dropdown-menu-color: var(--ui-gray-7);
--bg-main-color: var(--grey-2);
--bg-widget-color: var(--ui-gray-warm-10);
--bg-widget-header-color: var(--grey-1);
- --bg-widget-table-color: var(--grey-1);
+ --bg-widget-table-color: var(--ui-gray-warm-9);
--bg-header-color: var(--grey-2);
--bg-hover-table-color: var(--grey-3);
--bg-switch-box-color: var(--grey-53);
- --bg-input-group-addon-color: var(--grey-3);
- --bg-btn-default-color: var(--grey-3);
- --bg-blocklist-hover-color: var(--grey-3);
- --bg-boxselector-color: var(--grey-54);
--bg-table-color: var(--grey-1);
--bg-md-checkbox-color: var(--grey-31);
--bg-form-control-disabled-color: var(--grey-3);
@@ -320,14 +301,9 @@
--bg-navtabs-color: var(--ui-gray-warm-11);
--bg-navtabs-hover-color: var(--grey-3);
--bg-table-selected-color: var(--grey-3);
- --bg-codemirror-color: var(--ui-gray-warm-11);
- --bg-codemirror-gutters-color: var(--ui-gray-warm-8);
- --bg-codemirror-selected-color: var(--ui-gray-warm-7);
- --bg-dropdown-menu-color: var(--grey-1);
--bg-log-viewer-color: var(--grey-2);
--bg-log-line-selected-color: var(--grey-3);
--bg-pre-color: var(--grey-2);
- --bg-blocklist-item-selected-color: var(--grey-3);
--bg-progress-color: var(--grey-3);
--bg-pagination-color: var(--grey-3);
--bg-pagination-span-color: var(--grey-1);
@@ -336,13 +312,15 @@
--bg-motd-body-color: var(--grey-1);
--bg-item-highlighted-color: var(--grey-2);
--bg-item-highlighted-null-color: var(--grey-2);
- --bg-row-header-color: var(--grey-2);
- --bg-multiselect-button-color: var(--grey-3);
- --bg-image-multiselect-button: none !important;
- --bg-multiselect-checkbox-color: var(--grey-3);
--bg-panel-body-color: var(--grey-1);
- --bg-boxselector-wrapper-disabled-color: var(--grey-39);
- --bg-sidebar-header-color: var(--grey-1);
+ --bg-input-group-addon-color: var(--grey-3);
+ --bg-tooltip-color: var(--grey-3);
+ --bg-input-sm-color: var(--grey-1);
+ --bg-service-datatable-thead: var(--grey-1);
+ --bg-inner-datatable-thead: var(--grey-1);
+ --bg-app-datatable-thead: var(--grey-1);
+ --bg-service-datatable-tbody: var(--grey-1);
+ --bg-app-datatable-tbody: var(--grey-1);
--bg-multiselect-color: var(--grey-1);
--bg-daterangepicker-color: var(--grey-3);
--bg-calendar-color: var(--grey-3);
@@ -351,19 +329,16 @@
--bg-daterangepicker-hover: var(--grey-4);
--bg-daterangepicker-in-range: var(--ui-gray-warm-11);
--bg-daterangepicker-active: var(--blue-14);
- --bg-tooltip-color: var(--grey-3);
--bg-input-autofill-color: var(--grey-2);
--bg-btn-default-hover-color: var(--grey-3);
--bg-btn-focus: var(--grey-3);
--bg-boxselector-disabled-color: var(--grey-54);
--bg-small-select-color: var(--grey-2);
- --bg-app-datatable-thead: var(--grey-1);
- --bg-app-datatable-tbody: var(--grey-1);
--bg-stepper-item-active: var(--grey-1);
--bg-stepper-item-counter: var(--grey-7);
--bg-sortbutton-color: var(--grey-1);
--bg-dashboard-item: var(--grey-3);
- --bg-searchbar: var(--grey-2);
+ --bg-searchbar: var(--ui-grey-warm-11);
--bg-inputbox: var(--grey-2);
--bg-dropdown-hover: var(--grey-3);
--bg-webeditor-color: var(--ui-gray-warm-9);
@@ -383,7 +358,6 @@
--text-link-color: var(--blue-9);
--text-link-hover-color: var(--blue-2);
--text-input-group-addon-color: var(--grey-8);
- --text-btn-default-color: var(--grey-8);
--text-blocklist-hover-color: var(--white-color);
--text-dashboard-item-color: var(--blue-2);
--text-danger-color: var(--red-4);
@@ -408,14 +382,13 @@
--text-ui-select-color: var(--white-color);
--text-ui-select-hover-color: var(--white-color);
--text-summary-color: var(--white-color);
- --text-multiselect-button-color: var(--white-color);
- --text-multiselect-item-color: var(--white-color);
--text-boxselector-wrapper-color: var(--white-color);
+ --text-tooltip-color: var(--white-color);
+ --text-rzslider-color: var(--white-color);
+ --text-rzslider-limit-color: var(--white-color);
--text-daterangepicker-end-date: var(--grey-7);
--text-daterangepicker-in-range: var(--white-color);
--text-daterangepicker-active: var(--white-color);
- --text-tooltip-color: var(--white-color);
- --text-btn-default-color: var(--white-color);
--text-input-autofill-color: var(--grey-8);
--text-button-hover-color: var(--white-color);
--text-small-select-color: var(--grey-7);
@@ -439,21 +412,18 @@
--border-md-checkbox-color: var(--grey-41);
--border-modal-header-color: var(--grey-1);
--border-navtabs-color: var(--grey-38);
- --border-form-section-title-color: var(--grey-8);
--border-codemirror-cursor-color: var(--white-color);
- --border-codemirror-gutters-color: var(--grey-26);
--border-pre-color: var(--grey-3);
--border-blocklist-item-selected-color: var(--grey-38);
--border-pagination-span-color: var(--grey-1);
--border-pagination-hover-color: var(--grey-3);
- --border-boxselector-wrapper-hover: 3px solid var(--blue-8);
--border-panel-color: var(--grey-2);
+ --border-input-sm-color: var(--grey-3);
--border-daterangepicker-color: var(--grey-3);
--border-calendar-table: var(--grey-3);
--border-daterangepicker: var(--grey-4);
--border-pre-next-month: var(--white-color);
--border-daterangepicker-after: var(--grey-3);
- --border-tooltip-color: var(--grey-3);
--border-modal: 0px;
--border-sortbutton: var(--grey-3);
--border-bootbox: var(--ui-gray-9);
@@ -486,12 +456,13 @@
--sort-icon: var(--ui-gray-3);
--border-checkbox: var(--ui-gray-5);
--bg-checkbox: var(--white-color);
- --border-searchbar: var(--grey-54);
+ --border-searchbar: var(--ui-gray-warm-9);
--bg-button-group: var(--white-color);
--border-button-group: var(--ui-gray-5);
--text-button-group: var(--ui-gray-9);
}
+/* High Contrast Theme */
[theme='highcontrast'] {
--bg-card-color: var(--black-color);
--bg-main-color: var(--black-color);
@@ -504,10 +475,8 @@
--bg-hover-table-color: var(--grey-3);
--bg-switch-box-color: var(--grey-53);
--bg-panel-body-color: var(--black-color);
- --bg-boxselector-wrapper-disabled-color: var(--grey-39);
--bg-dropdown-menu-color: var(--black-color);
--bg-codemirror-selected-color: var(--grey-3);
- --bg-row-header-color: var(--black-color);
--bg-motd-body-color: var(--black-color);
--bg-blocklist-hover-color: var(--black-color);
--bg-blocklist-item-selected-color: var(--black-color);
@@ -518,11 +487,15 @@
--bg-codemirror-selected-color: var(--grey-3);
--bg-log-viewer-color: var(--black-color);
--bg-log-line-selected-color: var(--grey-3);
- --bg-sidebar-header-color: var(--black-color);
--bg-modal-content-color: var(--black-color);
--bg-form-control-disabled-color: var(--grey-1);
--bg-input-sm-color: var(--black-color);
--bg-item-highlighted-color: var(--black-color);
+ --bg-service-datatable-thead: var(--black-color);
+ --bg-inner-datatable-thead: var(--black-color);
+ --bg-app-datatable-thead: var(--black-color);
+ --bg-service-datatable-tbody: var(--black-color);
+ --bg-app-datatable-tbody: var(--black-color);
--bg-pagination-color: var(--grey-3);
--bg-pagination-span-color: var(--ui-black);
--bg-multiselect-color: var(--grey-1);
@@ -548,8 +521,6 @@
--bg-boxselector-color: var(--black-color);
--bg-boxselector-disabled-color: var(--black-color);
--bg-small-select-color: var(--black-color);
- --bg-app-datatable-thead: var(--black-color);
- --bg-app-datatable-tbody: var(--black-color);
--bg-stepper-item-active: var(--black-color);
--bg-stepper-item-counter: var(--grey-3);
--bg-sortbutton-color: var(--grey-1);
@@ -591,7 +562,6 @@
--text-daterangepicker-in-range: var(--white-color);
--text-daterangepicker-active: var(--white-color);
--text-ui-select-color: var(--white-color);
- --text-btn-default-color: var(--white-color);
--text-json-tree-color: var(--white-color);
--text-json-tree-leaf-color: var(--white-color);
--text-json-tree-branch-preview-color: var(--white-color);
@@ -600,9 +570,7 @@
--text-input-autofill-color: var(--white-color);
--text-navtabs-color: var(--white-color);
--text-button-hover-color: var(--white-color);
- --text-btn-default-color: var(--white-color);
--text-small-select-color: var(--white-color);
- --text-multiselect-item-color: var(--white-color);
--text-pagination-span-color: var(--ui-white);
--text-bootbox: var(--white-color);
--text-pagination-span-hover-color: var(--ui-white);
@@ -618,8 +586,6 @@
--border-datatable-top-color: var(--grey-55);
--border-sidebar-high-contrast: 1px solid var(--blue-9);
--border-code-high-contrast: 1px solid var(--white-color);
- --border-boxselector-wrapper: 3px solid var(--blue-2);
- --border-boxselector-wrapper-hover: 3px solid var(--blue-8);
--border-panel-color: var(--white-color);
--border-input-group-addon-color: var(--grey-54);
--border-modal-header-color: var(--grey-3);
@@ -631,7 +597,6 @@
--border-daterangepicker: var(--black-color);
--border-pre-next-month: var(--white-color);
--border-daterangepicker-after: var(--black-color);
- --border-tooltip-color: var(--white-color);
--border-pre-color: var(--grey-3);
--border-codemirror-cursor-color: var(--white-color);
--border-modal: 1px solid var(--white-color);
diff --git a/app/assets/css/vendor-override.css b/app/assets/css/vendor-override.css
index 2c0ded0ec..f2636fec0 100644
--- a/app/assets/css/vendor-override.css
+++ b/app/assets/css/vendor-override.css
@@ -48,12 +48,6 @@ a:focus {
border: 1px solid var(--border-input-group-addon-color);
}
-.btn-default {
- color: var(--text-btn-default-color);
- background-color: var(--bg-btn-default-color);
- border-color: var(--border-btn-default-color);
-}
-
.text-danger {
color: var(--ui-error-9);
}
@@ -207,6 +201,7 @@ code {
.dropdown-menu {
background: var(--bg-dropdown-menu-color);
+ border-radius: 8px;
}
.dropdown-menu > li > a {
@@ -397,31 +392,8 @@ input:-webkit-autofill {
-webkit-text-fill-color: var(--text-input-autofill-color) !important;
}
-.btn:hover {
- color: var(--text-button-hover-color);
-}
-
-.btn-default:hover {
- background-color: var(--bg-btn-default-hover-color);
-}
-
-.btn-primary:hover {
- color: var(--white-color) !important;
-}
-
-.btn-success:hover {
- color: var(--white-color);
-}
-
/* Overide Vendor CSS */
-.btn.disabled,
-.btn[disabled],
-fieldset[disabled] .btn {
- pointer-events: none;
- touch-action: none;
-}
-
.multiSelect.inlineBlock button {
margin: 0;
}
diff --git a/app/docker/components/datatables/images-datatable/imagesDatatable.html b/app/docker/components/datatables/images-datatable/imagesDatatable.html
index b5ac08aa2..bfde8badd 100644
--- a/app/docker/components/datatables/images-datatable/imagesDatatable.html
+++ b/app/docker/components/datatables/images-datatable/imagesDatatable.html
@@ -48,19 +48,11 @@
Force Remove
-
+
+
+
+ Build a new image
+
diff --git a/app/docker/views/services/edit/includes/constraints.html b/app/docker/views/services/edit/includes/constraints.html
index 46a6a4ddb..ab4e4a227 100644
--- a/app/docker/views/services/edit/includes/constraints.html
+++ b/app/docker/views/services/edit/includes/constraints.html
@@ -2,8 +2,8 @@
diff --git a/app/docker/views/services/edit/includes/containerlabels.html b/app/docker/views/services/edit/includes/containerlabels.html
index 87842ef02..1e800af6f 100644
--- a/app/docker/views/services/edit/includes/containerlabels.html
+++ b/app/docker/views/services/edit/includes/containerlabels.html
@@ -2,7 +2,7 @@
diff --git a/app/docker/views/services/edit/includes/environmentvariables.html b/app/docker/views/services/edit/includes/environmentvariables.html
index 2b81c3c5c..996a0e38a 100644
--- a/app/docker/views/services/edit/includes/environmentvariables.html
+++ b/app/docker/views/services/edit/includes/environmentvariables.html
@@ -2,7 +2,7 @@
diff --git a/app/docker/views/services/edit/includes/hosts.html b/app/docker/views/services/edit/includes/hosts.html
index f98c7c7ad..1e3823343 100644
--- a/app/docker/views/services/edit/includes/hosts.html
+++ b/app/docker/views/services/edit/includes/hosts.html
@@ -2,8 +2,8 @@
diff --git a/app/docker/views/services/edit/includes/mounts.html b/app/docker/views/services/edit/includes/mounts.html
index a0a9c512c..167364d2d 100644
--- a/app/docker/views/services/edit/includes/mounts.html
+++ b/app/docker/views/services/edit/includes/mounts.html
@@ -2,7 +2,7 @@
diff --git a/app/docker/views/services/edit/includes/networks.html b/app/docker/views/services/edit/includes/networks.html
index 645d7192a..28995a7b3 100644
--- a/app/docker/views/services/edit/includes/networks.html
+++ b/app/docker/views/services/edit/includes/networks.html
@@ -2,8 +2,8 @@
diff --git a/app/docker/views/services/edit/includes/placementPreferences.html b/app/docker/views/services/edit/includes/placementPreferences.html
index 639e7381c..08b82592e 100644
--- a/app/docker/views/services/edit/includes/placementPreferences.html
+++ b/app/docker/views/services/edit/includes/placementPreferences.html
@@ -2,8 +2,8 @@
diff --git a/app/docker/views/services/edit/includes/ports.html b/app/docker/views/services/edit/includes/ports.html
index 98c2bd660..23d565fbc 100644
--- a/app/docker/views/services/edit/includes/ports.html
+++ b/app/docker/views/services/edit/includes/ports.html
@@ -2,8 +2,8 @@
diff --git a/app/docker/views/services/edit/includes/servicelabels.html b/app/docker/views/services/edit/includes/servicelabels.html
index 2c7e93f16..dbdd784fb 100644
--- a/app/docker/views/services/edit/includes/servicelabels.html
+++ b/app/docker/views/services/edit/includes/servicelabels.html
@@ -2,8 +2,8 @@
diff --git a/app/portainer/components/PageHeader/HeaderContainer.html b/app/portainer/components/PageHeader/HeaderContainer.html
deleted file mode 100644
index b3e309b92..000000000
--- a/app/portainer/components/PageHeader/HeaderContainer.html
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/app/portainer/components/PageHeader/HeaderContainer.ts b/app/portainer/components/PageHeader/HeaderContainer.ts
deleted file mode 100644
index 260074ac4..000000000
--- a/app/portainer/components/PageHeader/HeaderContainer.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export const Header = {
- transclude: true,
- templateUrl: './HeaderContainer.html',
-};
diff --git a/app/portainer/components/PageHeader/HeaderContent.controller.js b/app/portainer/components/PageHeader/HeaderContent.controller.js
deleted file mode 100644
index 7392c6be5..000000000
--- a/app/portainer/components/PageHeader/HeaderContent.controller.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export default class HeaderContentController {
- /* @ngInject */
- constructor(Authentication) {
- this.Authentication = Authentication;
- this.display = !window.ddExtension;
- this.username = null;
- }
-
- $onInit() {
- const userDetails = this.Authentication.getUserDetails();
- if (userDetails) {
- this.username = userDetails.username;
- }
- }
-}
diff --git a/app/portainer/components/PageHeader/HeaderContent.html b/app/portainer/components/PageHeader/HeaderContent.html
deleted file mode 100644
index a31ac2848..000000000
--- a/app/portainer/components/PageHeader/HeaderContent.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/app/portainer/components/PageHeader/HeaderContent.ts b/app/portainer/components/PageHeader/HeaderContent.ts
deleted file mode 100644
index f66fc11ea..000000000
--- a/app/portainer/components/PageHeader/HeaderContent.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import controller from './HeaderContent.controller';
-
-export const HeaderContent = {
- requires: '^rdHeader',
- transclude: true,
- templateUrl: './HeaderContent.html',
- controller,
-};
diff --git a/app/portainer/components/PageHeader/HeaderTitle.controller.js b/app/portainer/components/PageHeader/HeaderTitle.controller.js
deleted file mode 100644
index eb19086fe..000000000
--- a/app/portainer/components/PageHeader/HeaderTitle.controller.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export default class HeaderTitle {
- /* @ngInject */
- constructor(Authentication) {
- this.Authentication = Authentication;
- this.display = !window.ddExtension;
- this.username = null;
- }
-
- $onInit() {
- const userDetails = this.Authentication.getUserDetails();
- if (userDetails) {
- this.username = userDetails.username;
- }
- }
-}
diff --git a/app/portainer/components/PageHeader/HeaderTitle.html b/app/portainer/components/PageHeader/HeaderTitle.html
deleted file mode 100644
index cbbb616bf..000000000
--- a/app/portainer/components/PageHeader/HeaderTitle.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
- {{ $ctrl.titleText }}
-
-
-
-
-
-
- {{ $ctrl.username }}
-
-
-
-
diff --git a/app/portainer/components/PageHeader/HeaderTitle.ts b/app/portainer/components/PageHeader/HeaderTitle.ts
deleted file mode 100644
index 7cd135876..000000000
--- a/app/portainer/components/PageHeader/HeaderTitle.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import controller from './HeaderTitle.controller';
-
-export const HeaderTitle = {
- requires: '^rdHeader',
- bindings: {
- titleText: '@',
- },
- transclude: true,
- templateUrl: './HeaderTitle.html',
- controller,
-};
diff --git a/app/portainer/components/PageHeader/index.ts b/app/portainer/components/PageHeader/index.ts
deleted file mode 100644
index 55f1efc7c..000000000
--- a/app/portainer/components/PageHeader/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import angular from 'angular';
-
-import { Header } from './HeaderContainer';
-import { HeaderContent } from './HeaderContent';
-import { HeaderTitle } from './HeaderTitle';
-
-export const pageHeaderModule = angular
- .module('portainer.app.components.header', [])
-
- .component('rdHeader', Header)
- .component('rdHeaderContent', HeaderContent)
- .component('rdHeaderTitle', HeaderTitle).name;
diff --git a/app/portainer/components/datatables/datatable.css b/app/portainer/components/datatables/datatable.css
index 3b64ced6c..79268a91a 100644
--- a/app/portainer/components/datatables/datatable.css
+++ b/app/portainer/components/datatables/datatable.css
@@ -39,12 +39,12 @@
@apply text-blue-7;
}
-.datatable tr > td a {
+.datatable tr > td a:not(.btn) {
color: var(--ui-blue-8);
}
-.datatable tr > td a:hover,
-.datatable tr > td a:focus {
+.datatable tr > td a:not(.btn):hover,
+.datatable tr > td a:not(.btn):focus {
text-decoration: underline;
}
@@ -84,10 +84,13 @@
.datatable .searchBar input[type='text'] {
border: 0px !important;
+ @apply placeholder:text-gray-7;
+ @apply th-dark:placeholder:text-gray-warm-7;
}
.datatable .searchIcon {
- color: #767676;
+ @apply text-gray-7;
+ @apply th-dark:text-gray-warm-5;
margin-right: 5px;
}
@@ -165,31 +168,6 @@
vertical-align: middle;
}
-[data-reach-menu-list],
-[data-reach-menu-items] {
- padding: 0px;
- border: 1px var(--bg-dropdown-menu-color);
-}
-
-.tableMenu {
- color: #767676;
- padding: 15px;
- background-color: var(--bg-dropdown-menu-color) !important;
-}
-
-.tableMenu .menuHeader {
- font-size: 16px;
-}
-
-.tableMenu .menuContent {
- font-size: 12px;
- margin: 10px 0;
-}
-
-.tableMenu .menuContent .md-radio:first-child {
- margin: 0;
-}
-
.datatable thead tr > th {
white-space: nowrap;
vertical-align: middle;
@@ -362,3 +340,37 @@
border-radius: 8px;
flex-grow: 2;
}
+
+/* Databatle Setting Menu */
+
+.tableMenu {
+ border: 1px solid var(--border-bootbox);
+ border-radius: 8px;
+
+ color: var(--text-dropdown-menu-color);
+ padding: 15px;
+ background-color: var(--bg-dropdown-menu-color) !important;
+}
+
+[data-reach-menu-list],
+[data-reach-menu-items] {
+ padding: 0px;
+ border: 1px var(--bg-dropdown-menu-color);
+}
+
+.dropdown-menu .tableMenu {
+ border: 0px;
+}
+
+.tableMenu .menuHeader {
+ font-size: 16px;
+}
+
+.tableMenu .menuContent {
+ font-size: 12px;
+ margin: 10px 0;
+}
+
+.tableMenu .menuContent .md-radio:first-child {
+ margin: 0;
+}
diff --git a/app/portainer/components/index.js b/app/portainer/components/index.js
index 5938abdd0..0c07d58c7 100644
--- a/app/portainer/components/index.js
+++ b/app/portainer/components/index.js
@@ -5,12 +5,11 @@ import gitFormModule from './forms/git-form';
import porAccessManagementModule from './accessManagement';
import widgetModule from './widget';
import { boxSelectorModule } from './BoxSelector';
-import { pageHeaderModule } from './PageHeader';
import { beFeatureIndicator } from './BEFeatureIndicator';
import { InformationPanelAngular } from './InformationPanel';
export default angular
- .module('portainer.app.components', [pageHeaderModule, boxSelectorModule, widgetModule, gitFormModule, porAccessManagementModule, formComponentsModule])
+ .module('portainer.app.components', [boxSelectorModule, widgetModule, gitFormModule, porAccessManagementModule, formComponentsModule])
.component('informationPanel', InformationPanelAngular)
.component('beFeatureIndicator', beFeatureIndicator).name;
diff --git a/app/react/components/BoxSelector/BoxSelector.css b/app/react/components/BoxSelector/BoxSelector.css
index b846b152b..03657e86a 100644
--- a/app/react/components/BoxSelector/BoxSelector.css
+++ b/app/react/components/BoxSelector/BoxSelector.css
@@ -12,8 +12,3 @@
flex-direction: column;
}
}
-
-.row.header {
- background-color: var(--bg-body-color) !important;
- margin-bottom: 5px !important;
-}
diff --git a/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.css b/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.css
deleted file mode 100644
index f64c861a9..000000000
--- a/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.breadcrumb-links {
- font-size: 10px;
-}
-
-.breadcrumb-links a {
- color: var(--ui-blue-8);
-}
-
-.breadcrumb-links a:hover {
- text-decoration: underline;
- color: var(--ui-blue-9);
-}
diff --git a/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.test.tsx b/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.test.tsx
index cb128b903..a9e6608b7 100644
--- a/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.test.tsx
+++ b/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.test.tsx
@@ -8,8 +8,9 @@ test('should display a Breadcrumbs, breadcrumbs should be separated by >', async
{ label: 'bread2' },
{ label: 'bread3' },
];
- const { queryByText } = render();
+ const { container } = render();
- const heading = queryByText(breadcrumbs.map((b) => b.label).join(' > '));
- expect(heading).toBeVisible();
+ expect(container.firstChild?.textContent).toEqual(
+ breadcrumbs.map((b) => b.label).join('>')
+ );
});
diff --git a/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.tsx b/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.tsx
index 3a7b32f1c..d7c46f33b 100644
--- a/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.tsx
+++ b/app/react/components/PageHeader/Breadcrumbs/Breadcrumbs.tsx
@@ -2,8 +2,6 @@ import { Fragment } from 'react';
import { Link } from '@@/Link';
-import './Breadcrumbs.css';
-
export interface Crumb {
label: string;
link?: string;
@@ -19,11 +17,11 @@ export function Breadcrumbs({ breadcrumbs }: Props) {
: [breadcrumbs];
return (
-
+
{breadcrumbsArray.map((crumb, index) => (
- {renderCrumb(crumb)}
- {index !== breadcrumbsArray.length - 1 ? ' > ' : ''}
+ {renderCrumb(crumb)}
+ {index !== breadcrumbsArray.length - 1 && >}
))}
@@ -44,7 +42,7 @@ function renderCrumb(crumb: Crumb | string) {
{crumb.label}
diff --git a/app/react/components/PageHeader/HeaderContainer.css b/app/react/components/PageHeader/HeaderContainer.module.css
similarity index 65%
rename from app/react/components/PageHeader/HeaderContainer.css
rename to app/react/components/PageHeader/HeaderContainer.module.css
index d5a58e20d..6a23e673b 100644
--- a/app/react/components/PageHeader/HeaderContainer.css
+++ b/app/react/components/PageHeader/HeaderContainer.module.css
@@ -1,33 +1,29 @@
-.row.header .meta .page {
- padding-top: 7px;
+.header {
+ min-height: 60px;
+ margin-bottom: 15px;
+
+ background-color: var(--bg-body-color);
+ margin-bottom: 5px !important;
}
-.row.header {
- min-height: 60px;
- background: var(--bg-row-header-color);
- margin-bottom: 15px;
-}
-.row.header > div:last-child {
+.header > div:last-child {
padding-right: 0;
}
-.row.header .meta .page {
- font-size: 17px;
- padding-top: 11px;
-}
-.row.header .meta div {
+.header .meta div {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
-.row.header .login a {
+
+.header .login a {
padding: 18px;
display: block;
}
-.row.header .user {
+.header .user {
min-width: 130px;
}
-.row.header .user > .item {
+.header .user > .item {
width: 65px;
height: 60px;
float: right;
@@ -35,36 +31,36 @@
text-align: center;
vertical-align: middle;
}
-.row.header .user > .item a {
+.header .user > .item a {
color: #919191;
display: block;
}
-.row.header .user > .item i {
+.header .user > .item i {
font-size: 20px;
line-height: 55px;
}
-.row.header .user > .item img {
+.header .user > .item img {
width: 40px;
height: 40px;
margin-top: 10px;
border-radius: 2px;
}
-.row.header .user > .item ul.dropdown-menu {
+.header .user > .item ul.dropdown-menu {
border-radius: 2px;
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.05);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.05);
}
-.row.header .user > .item ul.dropdown-menu .dropdown-header {
+.header .user > .item ul.dropdown-menu .dropdown-header {
text-align: center;
}
-.row.header .user > .item ul.dropdown-menu li.link {
+.header .user > .item ul.dropdown-menu li.link {
text-align: left;
}
-.row.header .user > .item ul.dropdown-menu li.link a {
+.header .user > .item ul.dropdown-menu li.link a {
padding-left: 7px;
padding-right: 7px;
}
-.row.header .user > .item ul.dropdown-menu:before {
+.header .user > .item ul.dropdown-menu:before {
position: absolute;
top: -7px;
right: 23px;
@@ -74,7 +70,7 @@
border-left: 7px solid transparent;
content: '';
}
-.row.header .user > .item ul.dropdown-menu:after {
+.header .user > .item ul.dropdown-menu:after {
position: absolute;
top: -6px;
right: 24px;
diff --git a/app/react/components/PageHeader/HeaderContainer.stories.tsx b/app/react/components/PageHeader/HeaderContainer.stories.tsx
index 8b3bc7faf..e870c6188 100644
--- a/app/react/components/PageHeader/HeaderContainer.stories.tsx
+++ b/app/react/components/PageHeader/HeaderContainer.stories.tsx
@@ -7,7 +7,6 @@ import { UserViewModel } from '@/portainer/models/user';
import { HeaderContainer } from './HeaderContainer';
import { Breadcrumbs } from './Breadcrumbs';
import { HeaderTitle } from './HeaderTitle';
-import { HeaderContent } from './HeaderContent';
export default {
component: HeaderContainer,
@@ -28,14 +27,13 @@ function Template({ title }: StoryProps) {
-
-
-
+
+
);
diff --git a/app/react/components/PageHeader/HeaderContainer.tsx b/app/react/components/PageHeader/HeaderContainer.tsx
index 12bb1595f..acc840dad 100644
--- a/app/react/components/PageHeader/HeaderContainer.tsx
+++ b/app/react/components/PageHeader/HeaderContainer.tsx
@@ -1,6 +1,7 @@
import { PropsWithChildren, createContext, useContext } from 'react';
+import clsx from 'clsx';
-import './HeaderContainer.css';
+import styles from './HeaderContainer.module.css';
const Context = createContext
(null);
@@ -15,10 +16,10 @@ export function useHeaderContext() {
export function HeaderContainer({ children }: PropsWithChildren) {
return (
-
+
-
{children}
+
{children}
diff --git a/app/react/components/PageHeader/HeaderContent.test.tsx b/app/react/components/PageHeader/HeaderContent.test.tsx
deleted file mode 100644
index e43ac28e0..000000000
--- a/app/react/components/PageHeader/HeaderContent.test.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { renderWithQueryClient } from '@/react-tools/test-utils';
-
-import { HeaderContainer } from './HeaderContainer';
-import { HeaderContent } from './HeaderContent';
-
-test('should not render without a wrapping HeaderContainer', async () => {
- const consoleErrorFn = jest
- .spyOn(console, 'error')
- .mockImplementation(() => jest.fn());
-
- function renderComponent() {
- return renderWithQueryClient(
);
- }
-
- expect(renderComponent).toThrowErrorMatchingSnapshot();
-
- consoleErrorFn.mockRestore();
-});
-
-test('should display a HeaderContent', async () => {
- const content = 'content';
-
- const { queryByText } = renderWithQueryClient(
-
- {content}
-
- );
-
- const contentElement = queryByText(content);
- expect(contentElement).toBeVisible();
-});
diff --git a/app/react/components/PageHeader/HeaderContent.tsx b/app/react/components/PageHeader/HeaderContent.tsx
deleted file mode 100644
index 7a327a34c..000000000
--- a/app/react/components/PageHeader/HeaderContent.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { PropsWithChildren } from 'react';
-
-import { useHeaderContext } from './HeaderContainer';
-
-export function HeaderContent({ children }: PropsWithChildren
) {
- useHeaderContext();
-
- return (
-
- );
-}
diff --git a/app/react/components/PageHeader/HeaderTitle.tsx b/app/react/components/PageHeader/HeaderTitle.tsx
index 90dd8e575..006b5db1a 100644
--- a/app/react/components/PageHeader/HeaderTitle.tsx
+++ b/app/react/components/PageHeader/HeaderTitle.tsx
@@ -24,13 +24,17 @@ export function HeaderTitle({ title, children }: PropsWithChildren) {
const { user } = useUser();
return (
-
- {title}
-
{children}
+
+
+
+ {title}
+
+ {children &&
{children}}
+