diff --git a/booklore-ui/src/app/features/book/components/shelf-assigner/shelf-assigner.component.scss b/booklore-ui/src/app/features/book/components/shelf-assigner/shelf-assigner.component.scss
index 3bc58203f..6773e4516 100644
--- a/booklore-ui/src/app/features/book/components/shelf-assigner/shelf-assigner.component.scss
+++ b/booklore-ui/src/app/features/book/components/shelf-assigner/shelf-assigner.component.scss
@@ -1,3 +1,5 @@
+@use '../../../../shared/styles/panel-shared' as panel;
+
.shelf-assigner {
width: 550px;
max-width: 550px;
@@ -11,81 +13,8 @@
}
.panel-header {
- position: relative;
- display: flex;
- align-items: center;
- gap: 1rem;
- padding: 1.5rem 1.5rem 1.25rem 1.5rem;
- border-radius: 10px 10px 0 0;
- border: 1px solid var(--border-color);
+ @include panel.panel-header;
border-bottom: none;
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
-
- .header-icon-wrapper {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 48px;
- height: 48px;
- background: var(--primary-color);
- border-radius: 10px;
-
-
- .header-icon {
- font-size: 1.5rem;
- color: var(--primary-contrast-color);
- }
- }
-
- .header-text {
- flex: 1;
-
- .panel-title {
- margin: 0 0 0.25rem 0;
- font-size: 1.25rem;
- font-weight: 600;
- color: var(--text-color);
- }
-
- .panel-description {
- margin: 0;
- font-size: 0.875rem;
- color: var(--text-secondary-color);
- }
- }
-
- @media (max-width: 480px) {
- padding: 1rem 3rem 1rem 1rem;
-
- .header-icon-wrapper {
- width: 40px;
- height: 40px;
-
- .header-icon {
- font-size: 1.25rem;
- }
- }
-
- .header-text {
- .panel-title {
- font-size: 1.125rem;
- }
-
- .panel-description {
- font-size: 0.8rem;
- }
- }
-
- ::ng-deep .close-button {
- top: 0.5rem;
- right: 0.5rem;
-
- .p-button {
- width: 2rem;
- height: 2rem;
- }
- }
- }
}
.shelves-container {
@@ -339,31 +268,6 @@
}
.dialog-footer {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: 0.75rem;
- padding: 1.25rem 1.5rem;
- background: var(--card-background);
- border: 1px solid var(--border-color);
+ @include panel.dialog-footer;
border-top: none;
- border-radius: 0 0 10px 10px;
- box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06);
-
- .footer-actions {
- display: flex;
- gap: 0.75rem;
- }
-
- @media (max-width: 480px) {
- flex-direction: column;
- padding: 1rem;
- gap: 0.5rem;
-
- .footer-actions {
- width: 100%;
- justify-content: flex-end;
- gap: 0.5rem;
- }
- }
}
diff --git a/booklore-ui/src/app/features/book/components/shelf-creator/shelf-creator.component.scss b/booklore-ui/src/app/features/book/components/shelf-creator/shelf-creator.component.scss
index 45f04e7ff..ea549d8eb 100644
--- a/booklore-ui/src/app/features/book/components/shelf-creator/shelf-creator.component.scss
+++ b/booklore-ui/src/app/features/book/components/shelf-creator/shelf-creator.component.scss
@@ -1,3 +1,5 @@
+@use '../../../../shared/styles/panel-shared' as panel;
+
.shelf-creator {
display: flex;
flex-direction: column;
@@ -10,80 +12,7 @@
}
.panel-header {
- position: relative;
- display: flex;
- align-items: center;
- gap: 1rem;
- padding: 1.5rem 1.5rem 1.25rem 1.5rem;
- border-radius: 10px 10px 0 0;
- border: 1px solid var(--border-color);
-
- .header-icon-wrapper {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 48px;
- height: 48px;
- background: var(--primary-color);
- border-radius: 10px;
- box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2);
-
- .header-icon {
- font-size: 1.5rem;
- color: var(--primary-contrast-color);
- }
- }
-
- .header-text {
- flex: 1;
-
- .panel-title {
- margin: 0 0 0.25rem 0;
- font-size: 1.25rem;
- font-weight: 600;
- color: var(--text-color);
- }
-
- .panel-description {
- margin: 0;
- font-size: 0.875rem;
- color: var(--text-secondary-color);
- }
- }
-
- .close-button {
- position: absolute;
- top: 0.75rem;
- right: 0.75rem;
- }
-
- @media (max-width: 480px) {
- padding: 1rem;
-
- .header-icon-wrapper {
- width: 40px;
- height: 40px;
-
- .header-icon {
- font-size: 1.25rem;
- }
- }
-
- .header-text {
- .panel-title {
- font-size: 1.125rem;
- }
-
- .panel-description {
- font-size: 0.8rem;
- }
- }
-
- .close-button {
- top: 0.5rem;
- right: 0.5rem;
- }
- }
+ @include panel.panel-header;
}
.form-container {
@@ -306,88 +235,10 @@
}
.dialog-footer {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: 1rem;
- padding: 1.25rem 1.5rem;
- background: var(--card-background);
- border: 1px solid var(--border-color);
+ @include panel.dialog-footer;
border-top: none;
- border-radius: 0 0 10px 10px;
- box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06);
-
- .validation-status {
- flex: 1;
- min-width: 0;
- }
-
- .footer-actions {
- display: flex;
- gap: 0.75rem;
- flex-shrink: 0;
- }
-
- @media (max-width: 640px) {
- flex-direction: column;
- align-items: stretch;
- padding: 1rem;
- gap: 0.75rem;
-
- .validation-status {
- width: 100%;
- }
-
- .footer-actions {
- width: 100%;
- justify-content: flex-end;
- gap: 0.5rem;
- }
- }
}
.validation-message {
- display: flex;
- align-items: center;
- gap: 0.375rem;
- padding: 0.25rem 0.5rem;
- font-weight: 500;
- border-radius: 6px;
- font-size: 0.875rem;
- width: fit-content;
- max-width: 100%;
-
- i {
- font-size: 0.95rem;
- }
-
- &.error {
- background: rgba(239, 68, 68, 0.1);
- color: rgb(239, 68, 68);
- border: 1px solid rgba(239, 68, 68, 0.3);
-
- i {
- color: rgb(239, 68, 68);
- }
- }
-
- &.success {
- background: rgba(34, 197, 94, 0.1);
- color: rgb(34, 197, 94);
- border: 1px solid rgba(34, 197, 94, 0.3);
-
- i {
- color: rgb(34, 197, 94);
- }
- }
-
- @media (max-width: 640px) {
- font-size: 0.8rem;
- padding: 0.375rem 0.5rem;
- width: 100%;
-
- i {
- font-size: 0.875rem;
- }
- }
+ @include panel.validation-message;
}
diff --git a/booklore-ui/src/app/features/book/components/shelf-edit-dialog/shelf-edit-dialog.component.scss b/booklore-ui/src/app/features/book/components/shelf-edit-dialog/shelf-edit-dialog.component.scss
index 9b4a187e2..e3f3dfe78 100644
--- a/booklore-ui/src/app/features/book/components/shelf-edit-dialog/shelf-edit-dialog.component.scss
+++ b/booklore-ui/src/app/features/book/components/shelf-edit-dialog/shelf-edit-dialog.component.scss
@@ -1,3 +1,5 @@
+@use '../../../../shared/styles/panel-shared' as panel;
+
.shelf-form {
width: 550px;
max-width: 550px;
@@ -11,80 +13,8 @@
}
.panel-header {
- position: relative;
- display: flex;
- align-items: center;
- gap: 1rem;
- padding: 1.5rem 1.5rem 1.25rem 1.5rem;
- border-radius: 10px 10px 0 0;
- border: 1px solid var(--border-color);
+ @include panel.panel-header;
border-bottom: none;
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
-
- .header-icon-wrapper {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 48px;
- height: 48px;
- background: var(--primary-color);
- border-radius: 10px;
-
- .header-icon {
- font-size: 1.5rem;
- color: var(--primary-contrast-color);
- }
- }
-
- .header-text {
- flex: 1;
-
- .panel-title {
- margin: 0 0 0.25rem 0;
- font-size: 1.25rem;
- font-weight: 600;
- color: var(--text-color);
- }
-
- .panel-description {
- margin: 0;
- font-size: 0.875rem;
- color: var(--text-secondary-color);
- }
- }
-
- @media (max-width: 480px) {
- padding: 1rem 3rem 1rem 1rem;
-
- .header-icon-wrapper {
- width: 40px;
- height: 40px;
-
- .header-icon {
- font-size: 1.25rem;
- }
- }
-
- .header-text {
- .panel-title {
- font-size: 1.125rem;
- }
-
- .panel-description {
- font-size: 0.8rem;
- }
- }
-
- ::ng-deep .close-button {
- top: 0.5rem;
- right: 0.5rem;
-
- .p-button {
- width: 2rem;
- height: 2rem;
- }
- }
- }
}
.shelf-container {
@@ -173,31 +103,6 @@
}
.dialog-footer {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: 0.75rem;
- padding: 1.25rem 1.5rem;
- background: var(--card-background);
- border: 1px solid var(--border-color);
+ @include panel.dialog-footer;
border-top: none;
- border-radius: 0 0 10px 10px;
- box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06);
-
- .footer-actions {
- display: flex;
- gap: 0.75rem;
- }
-
- @media (max-width: 480px) {
- flex-direction: column;
- padding: 1rem;
- gap: 0.5rem;
-
- .footer-actions {
- width: 100%;
- justify-content: flex-end;
- gap: 0.5rem;
- }
- }
}
diff --git a/booklore-ui/src/app/features/dashboard/components/dashboard-settings/dashboard-settings.component.scss b/booklore-ui/src/app/features/dashboard/components/dashboard-settings/dashboard-settings.component.scss
index e3023e426..48b2d02a7 100644
--- a/booklore-ui/src/app/features/dashboard/components/dashboard-settings/dashboard-settings.component.scss
+++ b/booklore-ui/src/app/features/dashboard/components/dashboard-settings/dashboard-settings.component.scss
@@ -1,3 +1,5 @@
+@use '../../../../shared/styles/panel-shared' as panel;
+
.dashboard-settings {
width: 1000px;
max-width: 1000px;
@@ -11,81 +13,7 @@
}
.panel-header {
- position: relative;
- display: flex;
- align-items: center;
- gap: 1rem;
- padding: 1.5rem 1.5rem 1.25rem 1.5rem;
- border-radius: 10px 10px 0 0;
- border: 1px solid var(--border-color);
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
-
- .header-icon-wrapper {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 48px;
- height: 48px;
- background: var(--primary-color);
- border-radius: 10px;
- box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2);
-
- .header-icon {
- font-size: 1.5rem;
- color: var(--primary-contrast-color);
- }
- }
-
- .header-text {
- flex: 1;
-
- .panel-title {
- margin: 0 0 0.25rem 0;
- font-size: 1.25rem;
- font-weight: 600;
- color: var(--text-color);
- }
-
- .panel-description {
- margin: 0;
- font-size: 0.875rem;
- color: var(--text-secondary-color);
- }
- }
-
- ::ng-deep .close-button {
- position: absolute;
- top: 0.75rem;
- right: 0.75rem;
- }
-
- @media (max-width: 480px) {
- padding: 1rem;
-
- .header-icon-wrapper {
- width: 40px;
- height: 40px;
-
- .header-icon {
- font-size: 1.25rem;
- }
- }
-
- .header-text {
- .panel-title {
- font-size: 1.125rem;
- }
-
- .panel-description {
- font-size: 0.8rem;
- }
- }
-
- ::ng-deep .close-button {
- top: 0.5rem;
- right: 0.5rem;
- }
- }
+ @include panel.panel-header;
}
.settings-controls {
@@ -267,36 +195,17 @@ label {
}
.dialog-footer {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: 1rem;
- padding: 1.25rem 1.5rem;
- background: var(--card-background);
- border: 1px solid var(--border-color);
+ @include panel.dialog-footer;
border-top: none;
- border-radius: 0 0 10px 10px;
- box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06);
.footer-left {
display: flex;
align-items: center;
gap: 0.5rem;
- flex: 1;
- }
-
- .footer-actions {
- display: flex;
- gap: 0.75rem;
}
@media (max-width: 640px) {
- flex-direction: column;
- padding: 1rem;
- gap: 0.75rem;
-
.footer-left {
- width: 100%;
flex-direction: column;
gap: 0.5rem;
@@ -306,8 +215,6 @@ label {
}
.footer-actions {
- width: 100%;
-
::ng-deep .p-button {
flex: 1;
}
diff --git a/booklore-ui/src/app/features/library-creator/library-creator.component.html b/booklore-ui/src/app/features/library-creator/library-creator.component.html
index 2ed127d64..7da35faa2 100644
--- a/booklore-ui/src/app/features/library-creator/library-creator.component.html
+++ b/booklore-ui/src/app/features/library-creator/library-creator.component.html
@@ -1,13 +1,13 @@