diff --git a/src/app/app.component.html b/src/app/app.component.html index 212aabf..b166914 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,3 +1,5 @@ + +
Textbox:
diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 3b39e6d..7289a64 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -4,10 +4,11 @@ import { CommentBoxComponent } from "./comment-box/comment-box.component"; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { FormControl, ReactiveFormsModule } from '@angular/forms'; +import { ProgressStepperComponent } from "./progress-stepper/progress-stepper.component"; @Component({ selector: 'app-root', - imports: [RouterOutlet, CommentBoxComponent, MatFormFieldModule, MatInputModule, ReactiveFormsModule], + imports: [RouterOutlet, CommentBoxComponent, MatFormFieldModule, MatInputModule, ReactiveFormsModule, ProgressStepperComponent], templateUrl: './app.component.html', styleUrl: './app.component.scss' }) diff --git a/src/app/progress-stepper/progress-stepper.component.html b/src/app/progress-stepper/progress-stepper.component.html new file mode 100644 index 0000000..09b75b2 --- /dev/null +++ b/src/app/progress-stepper/progress-stepper.component.html @@ -0,0 +1,44 @@ +
+
+ @for (item of [{status: 'completed'}, {status: 'in progress'}, {status: 'Offen'}]; track item; let i = + $index) { + +
+ + + + + + @if (item.status == 'in progress') { + + } + + + +
+
+
+
+ step {{ i + 1 }} + {{ item.status }} +
+
+
+ } +
+
\ No newline at end of file diff --git a/src/app/progress-stepper/progress-stepper.component.scss b/src/app/progress-stepper/progress-stepper.component.scss new file mode 100644 index 0000000..5be864c --- /dev/null +++ b/src/app/progress-stepper/progress-stepper.component.scss @@ -0,0 +1,138 @@ +.step-progress { + margin-bottom: 1rem; +} + +.container { + display: inline-flex; + padding: 30px; + position: relative; + + svg#checkbox { + width: 28px; + height: 28px; + stroke: #23c274; + stroke-width: 6; + + .circle { + stroke-dasharray: 320; + stroke-dashoffset: 320; + fill: #d2d2d2; + transition: + stroke-dashoffset 0.5s, + fill 0.5s 0.3s cubic-bezier(0.45, 0, 0.55, 1); + } + + .inner-circle { + stroke-dasharray: 320; + stroke-dashoffset: 320; + fill: #fff; + transition: + stroke-dashoffset 0.5s, + fill 0.5s 0.3s cubic-bezier(0.45, 0, 0.55, 1); + } + + .check { + stroke-dasharray: 70; + stroke-dashoffset: 70; + stroke: #fff; + fill: none; + transition: all 0.5s 0.5s cubic-bezier(0.45, 0, 0.55, 1); + } + } +} + +.check-box { + display: flex; + align-items: center; + position: relative; + + .info { + position: absolute; + bottom: -40px; + display: grid; + grid-template-columns: max-content; + + span.progress-info { + text-transform: capitalize; + font-size: 11px; + display: inline-block; + margin-left: 5px; + padding: 2px 10px; + transform: translateY(6px); + font-weight: 500; + color: currentColor; + background: #eee; + border-radius: 20px; + transition: background-color 0.1s ease-in-out; + } + + span.progress-info.in-progress { + background-color: #234dc2; + color: #fff; + } + + span.progress-info.completed { + background-color: #23c274; + color: #fff; + } + + span.step { + margin-left: 10px; + text-transform: uppercase; + font-weight: normal; + letter-spacing: 0.5px; + font-size: 11px; + color: #777; + } + } +} + +.progress-line { + width: 140px; + margin: 0 10px; + height: 4px; + overflow: hidden; + display: inline-block; + background: #d2d2d2; + border-radius: 10px; + + .progress-percent { + height: inherit; + width: 0%; + transition: all 0.5s 0.5s cubic-bezier(0.45, 0, 0.55, 1); + } +} + +.progress-line.active { + .progress-percent { + background: #234dc2; + width: 50%; + } +} + +.progress-line.complete { + .progress-percent { + width: 100%; + background: #23c274; + } +} + +.check-box.active { + svg#checkbox { + .circle { + fill: #234dc2; + } + } +} +.check-box.complete { + svg#checkbox { + .circle { + stroke-dashoffset: 0; + fill: #23c274; + } + + .check { + stroke-dashoffset: 0; + } + } +} diff --git a/src/app/progress-stepper/progress-stepper.component.spec.ts b/src/app/progress-stepper/progress-stepper.component.spec.ts new file mode 100644 index 0000000..e6a987f --- /dev/null +++ b/src/app/progress-stepper/progress-stepper.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProgressStepperComponent } from './progress-stepper.component'; + +describe('ProgressStepperComponent', () => { + let component: ProgressStepperComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProgressStepperComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ProgressStepperComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/progress-stepper/progress-stepper.component.ts b/src/app/progress-stepper/progress-stepper.component.ts new file mode 100644 index 0000000..3392492 --- /dev/null +++ b/src/app/progress-stepper/progress-stepper.component.ts @@ -0,0 +1,12 @@ +import { NgClass } from '@angular/common'; +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-progress-stepper', + imports: [NgClass], + templateUrl: './progress-stepper.component.html', + styleUrl: './progress-stepper.component.scss' +}) +export class ProgressStepperComponent { + +}