diff --git a/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.css b/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.css new file mode 100644 index 0000000..5392357 --- /dev/null +++ b/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.css @@ -0,0 +1,191 @@ +.feedback-button { + background: #ecf3fa; + color: #083b7d; + padding: 8px; + border-radius: 8px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + transform: rotate(270deg); + cursor: pointer; + display: flex; + align-items: center; + gap: 8px; + + margin-right: -35px; + position: fixed; + right: 0; + top: 240px; + z-index: 100; + + &:hover { + background: #d9e8f6; + } + + i { + font-size: 16px; + } +} + +// Modal styles + .feedback-modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + } + +.feedback-modal { + background: white; + border-radius: 8px; + width: 90%; + max-width: 500px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); + display: flex; + flex-direction: column; + max-height: 90vh; + overflow: hidden; +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px 20px; + border-bottom: 1px solid #eee; + + h3 { + margin: 0; + font-size: 18px; + font-weight: 600; + color: #083b7d; + } + + .close-button { + background: none; + border: none; + cursor: pointer; + font-size: 20px; + color: #666; + padding: 4px; + + &:hover { + color: #333; + } + } +} + +.modal-body { + padding: 20px; + overflow-y: auto; + + .modal-description { + margin-bottom: 16px; + color: #555; + } + + textarea { + width: 100%; + padding: 12px; + border: 1px solid #ddd; + border-radius: 4px; + resize: vertical; + font-family: inherit; + font-size: 14px; + + &:focus { + outline: none; + border-color: #083b7d; + } + + &:disabled { + background-color: #f5f5f5; + cursor: not-allowed; + } + } + + .success-message, .error-message { + margin-top: 16px; + padding: 10px; + border-radius: 4px; + display: flex; + align-items: center; + gap: 8px; + + i { + font-size: 18px; + } + } + + .success-message { + background-color: #e6f7e6; + color: #2e7d32; + } + + .error-message { + background-color: #fdecea; + color: #d32f2f; + } +} + +.modal-footer { + padding: 16px 20px; + border-top: 1px solid #eee; + display: flex; + justify-content: flex-end; + gap: 12px; + + button { + padding: 8px 16px; + border-radius: 4px; + font-weight: 500; + cursor: pointer; + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } + } + + .cancel-button { + background: none; + border: 1px solid #ddd; + color: #555; + + &:hover:not(:disabled) { + background-color: #f5f5f5; + } + } + + .submit-button { + background-color: #083b7d; + color: white; + border: none; + display: flex; + align-items: center; + gap: 8px; + + &:hover:not(:disabled) { + background-color: #062c5e; + } + } +} + +// Spinner animation + .spinning { + animation: spin 1s linear infinite; + } + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.html b/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.html new file mode 100644 index 0000000..fedcd4d --- /dev/null +++ b/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.html @@ -0,0 +1,67 @@ + + + +@if (isModalOpen) { +
+} diff --git a/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.scss b/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.scss new file mode 100644 index 0000000..3eebdf1 --- /dev/null +++ b/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.scss @@ -0,0 +1,192 @@ +.feedback-button { + background: #ecf3fa; + color: #083b7d; + padding: 8px; + border-radius: 8px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + transform: rotate(270deg); + cursor: pointer; + display: flex; + align-items: center; + gap: 8px; + + margin-right: -35px; + position: fixed; + right: 0; + top: 240px; + z-index: 100; + + &:hover { + background: #d9e8f6; + } + + i { + font-size: 16px; + } +} + +// Modal styles +.feedback-modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + +} + +.feedback-modal { + background: white; + border-radius: 8px; + width: 90%; + max-width: 500px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); + display: flex; + flex-direction: column; + max-height: 90vh; + overflow: hidden; +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px 20px; + border-bottom: 1px solid #eee; + + h3 { + margin: 0; + font-size: 18px; + font-weight: 600; + color: #083b7d; + } + + .close-button { + background: none; + border: none; + cursor: pointer; + font-size: 20px; + color: #666; + padding: 4px; + + &:hover { + color: #333; + } + } +} + +.modal-body { + padding: 20px; + overflow-y: auto; + + .modal-description { + margin-bottom: 16px; + color: #555; + } + + textarea { + width: 100%; + padding: 12px; + border: 1px solid #ddd; + border-radius: 4px; + resize: vertical; + font-family: inherit; + font-size: 14px; + + &:focus { + outline: none; + border-color: #083b7d; + } + + &:disabled { + background-color: #f5f5f5; + cursor: not-allowed; + } + } + + .success-message, .error-message { + margin-top: 16px; + padding: 10px; + border-radius: 4px; + display: flex; + align-items: center; + gap: 8px; + + i { + font-size: 18px; + } + } + + .success-message { + background-color: #e6f7e6; + color: #2e7d32; + } + + .error-message { + background-color: #fdecea; + color: #d32f2f; + } +} + +.modal-footer { + padding: 16px 20px; + border-top: 1px solid #eee; + display: flex; + justify-content: flex-end; + gap: 12px; + + button { + padding: 8px 16px; + border-radius: 4px; + font-weight: 500; + cursor: pointer; + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } + } + + .cancel-button { + background: none; + border: 1px solid #ddd; + color: #555; + + &:hover:not(:disabled) { + background-color: #f5f5f5; + } + } + + .submit-button { + background-color: #083b7d; + color: white; + border: none; + display: flex; + align-items: center; + gap: 8px; + + &:hover:not(:disabled) { + background-color: #062c5e; + } + } +} + +// Spinner animation +.spinning { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.spec.ts b/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.spec.ts new file mode 100644 index 0000000..6416212 --- /dev/null +++ b/my-workspace/projects/sae-lib/buttons/feedback-button/feedback-button.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FeedbackButton } from './feedback-button'; + +describe('FeedbackButton', () => { + let component: FeedbackButton; + let fixture: ComponentFixture