Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Experimental Fullscreen Modal #2679

Merged
merged 86 commits into from
Jan 27, 2023
Merged
Show file tree
Hide file tree
Changes from 81 commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
e2b6954
Create package.json file for the modal module
mark-drastrup Nov 15, 2022
f441a19
Move the modal module into the designsystem folder
mark-drastrup Nov 16, 2022
6f74186
Create base setup for a cookbook page
mark-drastrup Nov 16, 2022
dd960e3
Export kirby-modal.module as a top level export instead of including …
mark-drastrup Nov 16, 2022
7276acf
Create base component for inline fullscreen modal
mark-drastrup Nov 16, 2022
e5b3898
Create base setup for the fullscreen modal cookbook example
mark-drastrup Nov 16, 2022
0f91358
Implement and emit lifecycle events
mark-drastrup Nov 17, 2022
251d292
Add slots for header start and footer
mark-drastrup Nov 17, 2022
178a8de
Implement functionality to enable/disable that the modal can be dismi…
mark-drastrup Nov 17, 2022
7e71d2e
Implement public methods to scroll to top and bottom
mark-drastrup Nov 17, 2022
c94865e
Replace the any type with OverlayEventDetail
mark-drastrup Nov 17, 2022
2ae0139
Change the hard coded title to an Input
mark-drastrup Nov 17, 2022
87e5e66
Add config options to the example
mark-drastrup Nov 18, 2022
a385ab7
Add functionality to disable scroll
mark-drastrup Nov 18, 2022
a9212fe
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Nov 18, 2022
82c387f
Create experimental modal footer component
mark-drastrup Nov 21, 2022
3aa2828
Create basic modal controller and modal wrapper component
mark-drastrup Nov 21, 2022
2427ca9
Create example for the experimental controller
mark-drastrup Nov 21, 2022
d0dddb8
Add styling to the wrapper component
mark-drastrup Nov 21, 2022
880fe21
Declare the experimental controller as a provioder instead of export
mark-drastrup Nov 21, 2022
6203bac
Add functionality to close the modal and return data from it
mark-drastrup Nov 22, 2022
0658da7
Return and log data in the programmatic example
mark-drastrup Nov 22, 2022
6f2c37c
Add more details to the cookbook page
mark-drastrup Nov 22, 2022
ff95387
Allow developers to provide a 'role' argument in the close method
mark-drastrup Nov 24, 2022
91173da
Create example components for experimental routing
mark-drastrup Nov 28, 2022
361e49a
Fix broken tests
mark-drastrup Dec 2, 2022
4de05e7
Copy existing modal-navigation.service and adapt it to the experiment…
mark-drastrup Dec 2, 2022
6054dfe
Re-enable the modalController.initialize call in kirby.module
mark-drastrup Dec 2, 2022
f07de37
Setup basic routing example
mark-drastrup Dec 2, 2022
374531a
Re-enable modalCongtroller.initialize
mark-drastrup Dec 2, 2022
9f6b882
Write more unit tests for the fullscreen modal
mark-drastrup Dec 6, 2022
3de71c7
Clean up unused styles in fullscreen.component.scss
mark-drastrup Dec 7, 2022
71a6b90
Refactor the showModal method to return the modal instance and an obs…
mark-drastrup Dec 7, 2022
e59912c
Remove console.logs from modal-navigation.service
mark-drastrup Dec 7, 2022
1f94b93
Update documentation
mark-drastrup Dec 7, 2022
0c67b5b
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Dec 7, 2022
2e076e1
Add logic to prevent opening multiple modals, when pressing button qu…
mark-drastrup Dec 8, 2022
8e2bee0
Remove focused test
mark-drastrup Dec 8, 2022
946d371
Add config to add custom css classes to the modal
mark-drastrup Dec 8, 2022
4666d74
Add canDismiss to the modal controller
mark-drastrup Dec 8, 2022
6728d60
Add property description for the modal controller
mark-drastrup Dec 8, 2022
d7a0a35
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Dec 9, 2022
a79e21b
Remove all routing from the experimental modal
mark-drastrup Dec 9, 2022
f7484e2
Add more properties to the ModalConfig type and add them to the docum…
mark-drastrup Dec 9, 2022
a48bab2
Add more documentation for the modal components
mark-drastrup Dec 12, 2022
a4a4988
Add more documentation for the modal controller
mark-drastrup Dec 12, 2022
933acbe
Fix wrong return type for the fullscreen events
mark-drastrup Dec 12, 2022
e56c25d
WIP: Wrap the modal logic in observables
mark-drastrup Dec 13, 2022
c4f4c96
Refactor the modal observable setup
mark-drastrup Dec 14, 2022
fc05794
Add early return to prevent instantiation of multiple modals when cl…
mark-drastrup Dec 14, 2022
e1475cb
Add genric type to the close modal function
mark-drastrup Dec 14, 2022
a08b8bc
Rename the ModalConfig to ModalExperimentalConfig
mark-drastrup Dec 14, 2022
e4842b7
Add documentation for subscriptions
mark-drastrup Dec 14, 2022
18c2ecd
Refine documentation
mark-drastrup Dec 14, 2022
1e5353a
Update interactive example of getting data out of the modal
mark-drastrup Dec 14, 2022
2c8b9aa
Create internal links in the documentation
mark-drastrup Dec 14, 2022
5837824
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Dec 14, 2022
0d60490
Add a list over the contents of the modal experimental page
mark-drastrup Dec 14, 2022
0eaecfb
Fix wrong type on the canDismiss input in the fullscreen modal
mark-drastrup Dec 14, 2022
27826ac
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Dec 15, 2022
d258c30
Refactor name of declarations and exports in Kirby Modal Module
mark-drastrup Dec 15, 2022
6790315
Export the experimental modal components from the components barrel file
mark-drastrup Dec 15, 2022
df51574
Fix broken unit tests
mark-drastrup Dec 15, 2022
cd0156c
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Jan 3, 2023
9d18949
Make changes to the documentation
mark-drastrup Jan 3, 2023
0851fa1
Refactor unit tests
mark-drastrup Jan 3, 2023
036efc1
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Jan 3, 2023
47f281a
Export ModalExperimentalController and Config
mark-drastrup Jan 5, 2023
00d1208
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Jan 5, 2023
b93b4e2
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Jan 10, 2023
4524105
Update documentation
mark-drastrup Jan 10, 2023
00eb835
Fix broken unit test
mark-drastrup Jan 10, 2023
a66fac8
Update apps/cookbook/src/app/showcase/modal-experimental-showcase/mod…
mark-drastrup Jan 12, 2023
87d15d2
Update apps/cookbook/src/app/showcase/modal-experimental-showcase/mod…
mark-drastrup Jan 12, 2023
b20c88b
Update apps/cookbook/src/app/showcase/modal-experimental-showcase/mod…
mark-drastrup Jan 12, 2023
d498735
Implement feedback on the documentation
mark-drastrup Jan 12, 2023
ef798d6
Merge branch 'component/2585-new-kirby-modal' of https://github.com/k…
mark-drastrup Jan 12, 2023
b30cf1c
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Jan 12, 2023
015a143
Fix broken imports of kirby icon
mark-drastrup Jan 12, 2023
ea9b9df
Remove router POC component
mark-drastrup Jan 12, 2023
664c26b
Change background color of the modal to gray
mark-drastrup Jan 12, 2023
15b9584
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Jan 17, 2023
8fe6ada
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Jan 23, 2023
bff4af4
Merge branch 'develop' into component/2585-new-kirby-modal
mark-drastrup Jan 25, 2023
b990ce3
Fix broken imports
mark-drastrup Jan 25, 2023
25569f7
Merge branch 'develop' into component/2585-new-kirby-modal
RasmusKjeldgaard Jan 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion apps/cookbook/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { FormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

import { KirbyExperimentalModule, KirbyModule } from '@kirbydesign/designsystem';
import { KirbyExperimentalModule, KirbyModalModule, KirbyModule } from '@kirbydesign/designsystem';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
Expand Down Expand Up @@ -41,6 +41,7 @@ registerLocaleData(localeData);
FormsModule,
KirbyModule,
KirbyExperimentalModule,
KirbyModalModule,
mark-drastrup marked this conversation as resolved.
Show resolved Hide resolved
],

providers: [
Expand Down
2 changes: 2 additions & 0 deletions apps/cookbook/src/app/examples/examples.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import { LinkExampleModule } from './link-example/link-example.module';
import { ListExamplesModule } from './list-example/list-example.module';
import { ListExperimentalExampleModule } from './list-experimental-example/list-experimental-example.module';
import { ModalExampleModule } from './modal-example/modal-example.module';
import { ModalExperimentalExampleModule } from './modal-experimental-example/modal-experimental-example.module';
import { ProgressCircleExampleModule } from './progress-circle-example/progress-circle-example.module';
import { RadioExampleModule } from './radio-example/radio-example.module';
import { RangeExampleModule } from './range-example/range-example.module';
Expand Down Expand Up @@ -60,6 +61,7 @@ const IMPORTS = [
RangeExampleModule,
LinkExampleModule,
ModalExampleModule,
ModalExperimentalExampleModule,
GridLayoutExamplesModule,
SectionHeaderExampleModule,
ItemGroupExampleModule,
Expand Down
5 changes: 5 additions & 0 deletions apps/cookbook/src/app/examples/examples.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import { ListNoShapeExampleComponent } from './list-no-shape-example/list-no-sha
import { ListSwipeExampleComponent } from './list-swipe-example/list-swipe-example.component';
import { LoadingOverlayExampleComponent } from './loading-overlay-example/loading-overlay-example.component';
import { ModalExampleComponent } from './modal-example/modal-example.component';
import { FullscreenModalExperimentalExampleComponent } from './modal-experimental-example/fullscreen/fullscreen-experimental-example.component';
import { ModalRoutePage1ExampleComponent } from './modal-example/modal-route-example/modal-route-page1-example.component';
import { ModalRoutePage2ExampleComponent } from './modal-example/modal-route-example/modal-route-page2-example.component';
import { PageAdvancedExampleComponent } from './page-example/advanced/page-advanced-example.component';
Expand Down Expand Up @@ -242,6 +243,10 @@ export const routes: Routes = [
},
],
},
{
path: 'modal-experimental-fullscreen',
component: FullscreenModalExperimentalExampleComponent,
},
{
path: 'form-field',
children: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';

import { KirbyModule } from '@kirbydesign/designsystem';
import { KirbyModalModule, KirbyModule } from '@kirbydesign/designsystem';

import { ExamplesSharedModule } from '../examples.shared.module';

Expand All @@ -27,7 +27,7 @@ const COMPONENT_DECLARATIONS = [
];

@NgModule({
imports: [CommonModule, RouterModule, KirbyModule, ExamplesSharedModule],
imports: [CommonModule, RouterModule, KirbyModule, KirbyModalModule, ExamplesSharedModule],
declarations: COMPONENT_DECLARATIONS,
exports: COMPONENT_DECLARATIONS,
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<kirby-modal-wrapper-experimental [title]="title">
<p>
Edit the title below and see the output in the console, when clicking "cancel" or "submit". The
output comes from subscribing to <code>onWillDismiss</code> and
<code>onDidDismiss</code> events.
mark-drastrup marked this conversation as resolved.
Show resolved Hide resolved
</p>
<input kirby-input [(ngModel)]="title" />

<br />

<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse non justo mollis, gravida
nisl sit amet, blandit nulla. Proin eget posuere nibh. Pellentesque hendrerit sapien id
venenatis porttitor. Donec laoreet laoreet dui, nec luctus elit accumsan eu. Nullam placerat sem
libero, quis laoreet magna egestas lobortis. Vivamus condimentum suscipit nisl a elementum.
Aliquam in mi mauris. Etiam finibus, felis non venenatis volutpat, metus leo vulputate enim, id
porttitor mi arcu vel urna. Quisque a sollicitudin turpis, non egestas urna. Aliquam ac leo a
quam rhoncus efficitur. Aliquam maximus varius tellus malesuada vehicula. Cras bibendum elit
tempor tellus pellentesque finibus. Maecenas iaculis enim vitae ex varius, id commodo lectus
porta. Donec quis dui aliquet, elementum magna sed, mollis mi. Ut sed nisi ut mauris maximus
gravida at eu purus. Mauris a diam nulla. Morbi sit amet lobortis risus. Ut maximus rutrum
turpis tempor finibus. Nam et pretium arcu, ac placerat arcu. Fusce eu leo vel enim bibendum
porttitor. Suspendisse potenti. Etiam maximus erat id magna vulputate, id eleifend neque
aliquam. Quisque ut nunc suscipit, semper lectus at, suscipit urna. Nulla mollis tellus nunc,
finibus iaculis lectus fringilla et. Vestibulum ante ipsum primis in faucibus orci luctus et
ultrices posuere cubilia curae; Suspendisse dictum accumsan ipsum, dictum consectetur sapien
dapibus eget. Aenean mattis turpis eu dolor tincidunt, sit amet mollis arcu fermentum. Maecenas
sagittis et mauris sit amet condimentum. Maecenas pulvinar non turpis sed pellentesque.
Vestibulum ac ornare ipsum. Pellentesque ac ante nec ex ornare pharetra. Nulla non neque eget
est convallis vulputate. Quisque imperdiet suscipit ligula, sit amet egestas diam semper
tristique. Etiam ut quam enim. Quisque nec faucibus tortor. Morbi consectetur ultricies lorem,
tempus posuere est tempor vitae. Aenean eget magna quam. Praesent volutpat arcu a efficitur
faucibus. Nulla non mauris sed mauris gravida rutrum. Ut eu ullamcorper lacus, ac varius tellus.
Proin convallis interdum nulla vitae pharetra. Fusce enim ex, cursus eget est sed, fringilla
fringilla diam. Maecenas aliquam aliquam libero, ut auctor eros rhoncus quis. Sed auctor vitae
libero id posuere. Integer mollis mollis arcu ac vestibulum. Suspendisse at viverra leo. Nulla
ac semper augue. Aenean consequat purus eget convallis cursus. Aliquam facilisis nisl massa, vel
imperdiet ante dictum eleifend. Morbi ut nibh in elit venenatis semper.
</p>

<kirby-modal-footer-experimental footer>
<button kirby-button (click)="close('cancel')" attentionLevel="3">Cancel</button>
<button kirby-button (click)="close('submit')">Submit</button>
</kirby-modal-footer-experimental>
</kirby-modal-wrapper-experimental>
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { Component, Input } from '@angular/core';
import { ModalExperimentalController } from '@kirbydesign/designsystem/components/modal-experimental/services/modal.controller';

export const showModalCodeSnippet = `constructor(private modalController: ModalExperimentalController) {}

showModal() {
const config: ModalExperimentalConfig = {
flavor: 'modal',
component: YourEmbeddedModalComponent,
};
this.modalController.showModal(config);
}`;

export const observableCodeSnippet = `constructor(private modalController: ModalExperimentalController) {}

showModal() {
const config: ModalExperimentalConfig = {
flavor: 'modal',
component: YourEmbeddedModalComponent,
};

const modal = this.modalController.showModal(config);

modal?.onWillDismiss.subscribe((response) => {
const { role, data } = response;

// role is: 'confirm'
// data is: {
// title: 'myTitle',
// items: [{id: 1}, {id: 2}]
}
});

modal?.onDidDismiss.subscribe((response) => {
const { role, data } = response;

// role is: 'confirm'
// data is: {
// title: 'myTitle',
// items: [{id: 1}, {id: 2}]
}
});


// Inside the embedded component

constructor(private modalController: ModalExperimentalController) {}

close() {
this.modalController.closeModal({
title: 'myTitle',
items: [{id: 1}, {id: 2}]
}, 'confirm');
}
}`;
@Component({
templateUrl: './modal-controller-experimental-example.component.html',
})
export class ModalControllerExperimentalExampleComponent {
constructor(private modalController: ModalExperimentalController) {}

@Input() title = '';

close(role: string) {
this.modalController.closeModal({ title: this.title }, role);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<div class="fullscreen-example">
<h1>Fullscreen modal</h1>

<div class="config">
<h2>Config</h2>

<kirby-checkbox
[checked]="showFooter"
(checkedChange)="toggleFooter()"
text="Show footer"
></kirby-checkbox>

<kirby-checkbox
[checked]="isInlineFooter"
(checkedChange)="toggleIsInlineFooter()"
text="Inline footer"
></kirby-checkbox>

<kirby-checkbox
[checked]="showPageProgress"
(checkedChange)="togglePageProgress()"
text="Show page progress"
></kirby-checkbox>

<kirby-checkbox
[checked]="collapseTitle"
(checkedChange)="toggleCollapseTitle()"
text="Collapse title"
></kirby-checkbox>

<kirby-checkbox
[checked]="scrollDisabled"
(checkedChange)="toggleScrollDisabled()"
text="Scroll disabled"
></kirby-checkbox>
</div>

<button kirby-button (click)="openModal()">Open Modal</button>
mark-drastrup marked this conversation as resolved.
Show resolved Hide resolved

<kirby-fullscreen-modal-experimental
[open]="open"
[title]="'Modal title'"
[hasCollapsibleTitle]="collapseTitle"
[scrollDisabled]="scrollDisabled"
[canDismiss]="canDismiss"
(willDismiss)="closeModal()"
>
<!-- HEADER SLOT -->
<kirby-page-progress *ngIf="showPageProgress" header-start>
<kirby-progress-circle themeColor="warning" value="25" size="sm" class="kirby-text-xsmall">
1/4
</kirby-progress-circle>
</kirby-page-progress>

<!-- DEFAULT SLOT -->
<div>
<button kirby-button attentionLevel="3" (click)="scrollToBottom()">
Scroll to bottom
<kirby-icon name="arrow-down"></kirby-icon>
</button>

<button kirby-button attentionLevel="3" (click)="toggleCanDismiss()">
Can dismiss: {{ canDismiss }}
</button>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris nunc eros, fermentum sed
ligula ac, placerat porta est. Cras luctus mi et aliquam semper. Sed urna leo, gravida
accumsan vulputate in, viverra at neque. Cras in nisi ac orci venenatis semper scelerisque
ullamcorper libero. Donec ornare accumsan massa, at eleifend lorem sollicitudin ut. Donec
vitae malesuada neque. Morbi ultricies urna ac dignissim blandit. Duis sollicitudin tellus
ligula, sit amet congue augue blandit et. Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Aenean cursus laoreet diam sed elementum. In justo est, aliquet sed placerat quis,
tincidunt rhoncus augue. Donec vulputate suscipit nulla, quis consectetur dolor congue
vitae. Fusce felis ex, ornare id finibus vel, tempus vel tellus. Vestibulum cursus nulla et
sem fermentum pulvinar. Curabitur ac odio vulputate, condimentum nulla non, vestibulum sem.
Praesent semper sodales nisi, quis ornare nisi vehicula pellentesque. Duis nulla felis,
sollicitudin vitae eleifend a, mollis eu elit. Nulla aliquam, diam eget cursus pellentesque,
nulla dui elementum risus, in sodales dolor mauris sit amet magna. Praesent nec metus a
massa elementum eleifend nec vulputate est. Nullam blandit lorem et tortor semper, tempus
tempor ipsum varius. Etiam et laoreet massa. Nam lacinia purus a lorem pellentesque varius.
Donec vel dui tincidunt, efficitur dui a, rhoncus nisi. Sed id lectus libero. Duis turpis
lorem, placerat eu tortor vel, tempor luctus enim. Donec pulvinar odio at fringilla
ultricies. Aliquam erat volutpat. Cras eget elit eleifend, lacinia sapien sit amet, mattis
orci. Fusce ac scelerisque est. Nulla orci dui, placerat fringilla felis vitae, cursus
facilisis est. Aenean consectetur, dui ut scelerisque lacinia, ante arcu laoreet ligula,
vitae congue ex nulla consequat purus. Maecenas sit amet velit eget dui sodales iaculis nec
nec ante. Morbi bibendum sapien et pulvinar ornare. Nullam commodo varius mi, ac tincidunt
lectus vulputate nec. Orci varius natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Quisque ac orci libero. Nulla facilisi. Nullam quis lacinia elit.
Morbi tempus, lacus ac vehicula finibus, urna mi viverra nulla, quis malesuada mi magna eu
libero. Aliquam consectetur neque sed nisi vestibulum posuere. Nam viverra nisl varius
placerat sagittis. Pellentesque velit nisl, blandit nec laoreet at, tincidunt quis augue.
Nunc ultrices lacinia est, eu lacinia felis fermentum vel. Sed a quam lobortis, facilisis
nunc vitae, faucibus sapien. Sed et orci vitae leo consequat consectetur non eu mauris. Nunc
non vulputate diam. Sed ultricies arcu et mattis ullamcorper. Curabitur vel massa enim. In
venenatis augue eu lectus scelerisque egestas. Duis dignissim at augue non semper. Integer
lectus mi, pulvinar porta velit ac, interdum consequat felis. Vestibulum vitae ipsum
viverra, egestas neque et, efficitur velit. Aenean ac facilisis velit. Ut imperdiet, lacus
nec tempor ornare, sem odio pulvinar justo, in pellentesque orci lacus non mauris. Sed
aliquam neque vel mauris consequat, elementum lacinia ex convallis. In nec dui vitae quam
sodales venenatis. Aenean lacus purus, iaculis sed sollicitudin vitae, consequat ut magna.
Suspendisse malesuada justo quis ante sollicitudin blandit elementum sit amet dolor.
</p>
</div>

<!-- FOOTER SLOT -->
<kirby-modal-footer-experimental
*ngIf="showFooter"
[type]="isInlineFooter ? 'inline' : 'fixed'"
themeColor="white"
footer
>
<button kirby-button attentionLevel="3" (click)="scrollToTop()">
To top
<kirby-icon name="arrow-up"></kirby-icon>
</button>
<button kirby-button (click)="close()">Close</button>
</kirby-modal-footer-experimental>
</kirby-fullscreen-modal-experimental>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
.fullscreen-example {
height: 100%;
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
padding: 20px 0;

.config {
display: flex;
flex-direction: column;
align-items: flex-start;
}
}
Loading