@fxlt/common-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BeVietnamPro-Regular.ttf +0 -0
- package/README.md +63 -0
- package/SpaceMono-Regular.ttf +0 -0
- package/animations.css +115 -0
- package/components.css +383 -0
- package/dialogs.css +116 -0
- package/fesm2022/fxlt-common-ui.mjs +2439 -0
- package/fesm2022/fxlt-common-ui.mjs.map +1 -0
- package/fonts.css +13 -0
- package/index.d.ts +739 -0
- package/package.json +53 -0
- package/src/lib/styles/animations.css +115 -0
- package/src/lib/styles/components.css +383 -0
- package/src/lib/styles/dialogs.css +116 -0
- package/src/lib/styles/fonts.css +13 -0
- package/src/lib/styles/tailwind.css +18 -0
- package/src/lib/styles/theme.css +63 -0
- package/src/lib/ui/components/button/button.component.html +223 -0
- package/src/lib/ui/components/chart/chart.component.html +13 -0
- package/src/lib/ui/components/checkbox/checkbox.component.html +43 -0
- package/src/lib/ui/components/datetime-picker/datetime-picker.component.html +25 -0
- package/src/lib/ui/components/dnd-upload/dnd-upload.component.html +34 -0
- package/src/lib/ui/components/hero-icon/hero-icon.component.html +8 -0
- package/src/lib/ui/components/input/input.component.css +0 -0
- package/src/lib/ui/components/input/input.component.html +46 -0
- package/src/lib/ui/components/loading-panel/loading-panel.component.html +51 -0
- package/src/lib/ui/components/radio-button/radio-button.component.css +0 -0
- package/src/lib/ui/components/radio-button/radio-button.component.html +35 -0
- package/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.html +34 -0
- package/src/lib/ui/components/search-bar/search-bar.component.html +22 -0
- package/src/lib/ui/components/select/select.component.css +80 -0
- package/src/lib/ui/components/select/select.component.html +25 -0
- package/src/lib/ui/components/slider/slider.component.html +54 -0
- package/src/lib/ui/components/switch/switch.component.html +21 -0
- package/src/lib/ui/components/tab-component/tab.component.html +1 -0
- package/src/lib/ui/components/tab-group/tab-group.component.html +75 -0
- package/src/lib/ui/components/tag/tag.component.html +43 -0
- package/src/lib/ui/components/toast/toast.component.html +48 -0
- package/src/lib/ui/components/toast-container/toast-container.component.html +12 -0
- package/src/lib/ui/dialogs/confirmation/confirmation.component.html +10 -0
- package/tailwind-config.d.ts +4 -0
- package/tailwind.config.js +69 -0
- package/tailwind.css +18 -0
- package/theme.css +63 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
::ng-deep .fx-select-field {
|
|
2
|
+
display: block !important;
|
|
3
|
+
width: 100% !important;
|
|
4
|
+
margin: 0 !important;
|
|
5
|
+
padding: 0 !important;
|
|
6
|
+
border-radius: 0.75rem;
|
|
7
|
+
box-shadow: 0 1px 1px rgb(var(--border-default));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
::ng-deep .fx-select-field .mat-mdc-form-field-wrapper,
|
|
11
|
+
::ng-deep .fx-select-field .mat-mdc-text-field-wrapper {
|
|
12
|
+
padding: 0 !important;
|
|
13
|
+
margin: 0 !important;
|
|
14
|
+
width: 100% !important;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
::ng-deep .fx-select-field .mdc-text-field {
|
|
18
|
+
width: 100% !important;
|
|
19
|
+
margin: 0 !important;
|
|
20
|
+
padding: 0 !important;
|
|
21
|
+
--mdc-shape-small: 0 !important;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
::ng-deep .fx-select-field .mat-mdc-form-field-flex {
|
|
25
|
+
width: 100% !important;
|
|
26
|
+
margin: 0 !important;
|
|
27
|
+
padding: 0 0.75rem !important;
|
|
28
|
+
border: 1px solid rgb(var(--border-default));
|
|
29
|
+
border-radius: 0.5rem;
|
|
30
|
+
height: 36px !important;
|
|
31
|
+
align-items: center;
|
|
32
|
+
background-color: rgb(var(--bg-primary));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
::ng-deep .fx-select-field .mdc-notched-outline,
|
|
36
|
+
::ng-deep .fx-select-field .mat-mdc-form-field-subscript-wrapper {
|
|
37
|
+
display: none !important;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
::ng-deep .fx-select-field.mat-focused .mat-mdc-form-field-flex {
|
|
41
|
+
border: 2px solid rgb(var(--border-interactive)) !important;
|
|
42
|
+
outline: none !important;
|
|
43
|
+
border-radius: 0.5rem;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
::ng-deep .fx-select-field.mat-form-field-invalid .mat-mdc-form-field-flex {
|
|
47
|
+
border-color: #ef4444 !important;
|
|
48
|
+
box-shadow: none !important;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
::ng-deep .fx-select-field .mat-mdc-select-trigger {
|
|
52
|
+
padding: 0 !important;
|
|
53
|
+
margin: 0 !important;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
::ng-deep .fx-select-field .mat-mdc-select-arrow-wrapper {
|
|
57
|
+
margin-right: 0 !important;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
::ng-deep .fx-select-field .mat-mdc-select-arrow-wrapper {
|
|
61
|
+
color: rgb(var(--text-primary));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
::ng-deep .mat-mdc-select-panel {
|
|
65
|
+
background-color: rgb(var(--bg-primary)) !important;
|
|
66
|
+
border: 1px solid rgb(var(--border-default)) !important;
|
|
67
|
+
border-radius: 0.5rem !important;
|
|
68
|
+
box-shadow: 0 2px 4px rgb(0 0 0 / 0.1) !important;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
::ng-deep .fx-select-field .mat-mdc-select-placeholder {
|
|
72
|
+
color: rgb(var(--text-placeholder)) !important;
|
|
73
|
+
font-size: 14px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
::ng-deep .fx-select-field .mat-mdc-select-value {
|
|
77
|
+
color: rgb(var(--text-primary)) !important;
|
|
78
|
+
font-size: 14px;
|
|
79
|
+
font-weight: 400;
|
|
80
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<div class="mb-4 text-left w-full" [class]="class">
|
|
2
|
+
<label *ngIf="label" class="block txt-field-label">
|
|
3
|
+
{{ label }}
|
|
4
|
+
@if(required) {<span class="txt-required">*</span>}
|
|
5
|
+
</label>
|
|
6
|
+
|
|
7
|
+
<mat-form-field class="fx-select-field w-full shadow-sm" appearance="fill">
|
|
8
|
+
<mat-select
|
|
9
|
+
[placeholder]="placeholder"
|
|
10
|
+
[disabled]="disabled"
|
|
11
|
+
[multiple]="multiple"
|
|
12
|
+
[value]="value"
|
|
13
|
+
(selectionChange)="onSelectionChange($event.value)"
|
|
14
|
+
(blur)="onTouched()"
|
|
15
|
+
>
|
|
16
|
+
<mat-option *ngFor="let option of options" [value]="option.value">
|
|
17
|
+
<span class="txt-default">{{ option.label }}</span>
|
|
18
|
+
</mat-option>
|
|
19
|
+
</mat-select>
|
|
20
|
+
</mat-form-field>
|
|
21
|
+
|
|
22
|
+
<div *ngIf="invalid" class="txt-invalid text-left">
|
|
23
|
+
{{ getErrorMessage(label) }}
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<div
|
|
2
|
+
class="w-full select-none"
|
|
3
|
+
[class.cursor-not-allowed]="disabled"
|
|
4
|
+
[class.opacity-60]="disabled"
|
|
5
|
+
role="group"
|
|
6
|
+
>
|
|
7
|
+
<div
|
|
8
|
+
#track
|
|
9
|
+
class="relative touch-none py-4"
|
|
10
|
+
(click)="onTrackClick($event)"
|
|
11
|
+
[attr.aria-disabled]="disabled"
|
|
12
|
+
[attr.aria-orientation]="vertical ? 'vertical' : 'horizontal'"
|
|
13
|
+
>
|
|
14
|
+
<div
|
|
15
|
+
class="relative flex items-center"
|
|
16
|
+
[ngClass]="{ 'flex-col h-48': vertical }"
|
|
17
|
+
>
|
|
18
|
+
<div
|
|
19
|
+
class="relative flex-1 rounded-full bg-gray-600 h-2"
|
|
20
|
+
[ngClass]="{ 'w-1 rotate-0 h-full w-auto bg-border-gray-700': vertical }"
|
|
21
|
+
>
|
|
22
|
+
<div
|
|
23
|
+
class="absolute left-0 top-0 h-full rounded-full bg-primary"
|
|
24
|
+
*ngIf="!vertical"
|
|
25
|
+
[style.width.%]="percent"
|
|
26
|
+
></div>
|
|
27
|
+
|
|
28
|
+
<div
|
|
29
|
+
class="absolute bottom-0 left-0 w-full rounded-full bg-primary"
|
|
30
|
+
*ngIf="vertical"
|
|
31
|
+
[style.height.%]="percent"
|
|
32
|
+
style="transform-origin: bottom;"
|
|
33
|
+
></div>
|
|
34
|
+
|
|
35
|
+
<button
|
|
36
|
+
#thumb
|
|
37
|
+
type="button"
|
|
38
|
+
class="absolute -mt-1 -ml-1.5 w-4 h-4 rounded-full shadow focus:ring-primary bg-primary border-2 border-text-primary"
|
|
39
|
+
[ngStyle]="thumbStyle()"
|
|
40
|
+
role="slider"
|
|
41
|
+
[attr.aria-valuemin]="min"
|
|
42
|
+
[attr.aria-valuemax]="max"
|
|
43
|
+
[attr.aria-valuenow]="value"
|
|
44
|
+
[attr.aria-disabled]="disabled"
|
|
45
|
+
tabindex="0"
|
|
46
|
+
(pointerdown)="onPointerDown($event)"
|
|
47
|
+
(pointermove)="onPointerMove($event)"
|
|
48
|
+
(pointerup)="onPointerUp($event)"
|
|
49
|
+
[disabled]="disabled"
|
|
50
|
+
></button>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<div
|
|
2
|
+
class="relative inline-flex items-center w-10 h-5 rounded-full transition-colors duration-300 cursor-pointer"
|
|
3
|
+
[ngClass]="{
|
|
4
|
+
'bg-success': value && !disabled,
|
|
5
|
+
'bg-button-default': !value && !disabled,
|
|
6
|
+
'bg-bg-hover': disabled
|
|
7
|
+
}"
|
|
8
|
+
(click)="toggle()"
|
|
9
|
+
>
|
|
10
|
+
@if(value) {
|
|
11
|
+
<i style="font-size: 20px;" class="material-symbols-outlined absolute left-0.5 top-0 text-text-inverse">check</i>
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
@if(!value) {
|
|
15
|
+
<i style="font-size: 20px;" class="material-symbols-outlined absolute right-0.5 top-0 text-text-inverse">close</i>
|
|
16
|
+
}
|
|
17
|
+
<div
|
|
18
|
+
class="absolute top-0.5 left-0.5 w-4 h-4 bg-text-inverse rounded-full shadow-md transform transition-transform duration-300"
|
|
19
|
+
[ngClass]="{ 'translate-x-5': value }"
|
|
20
|
+
></div>
|
|
21
|
+
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<ng-template><ng-content></ng-content></ng-template>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<div class="relative">
|
|
2
|
+
<!-- Left scroll button -->
|
|
3
|
+
<button
|
|
4
|
+
class="left-scroll-button"
|
|
5
|
+
type="button"
|
|
6
|
+
(click)="scroll('left')"
|
|
7
|
+
[style.opacity]="canScrollLeft ? 1 : 0"
|
|
8
|
+
[style.pointerEvents]="canScrollLeft ? 'auto' : 'none'"
|
|
9
|
+
>
|
|
10
|
+
<svg
|
|
11
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
12
|
+
class="h-5 w-5 text-text-primary"
|
|
13
|
+
fill="none"
|
|
14
|
+
viewBox="0 0 24 24"
|
|
15
|
+
stroke="currentColor"
|
|
16
|
+
>
|
|
17
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
|
|
18
|
+
</svg>
|
|
19
|
+
</button>
|
|
20
|
+
|
|
21
|
+
<div
|
|
22
|
+
#tabList
|
|
23
|
+
class="relative flex overflow-x-auto no-scrollbar scroll-smooth"
|
|
24
|
+
(scroll)="onScroll()"
|
|
25
|
+
>
|
|
26
|
+
<button
|
|
27
|
+
*ngFor="let tab of tabs.toArray(); let i = index"
|
|
28
|
+
(click)="selectTab(i)"
|
|
29
|
+
class="tab-btn tab-bar-btn"
|
|
30
|
+
>
|
|
31
|
+
<div class="flex flex-row items-center justify-center">
|
|
32
|
+
@if(tab.icon) {<fx-ui-hero-icon
|
|
33
|
+
[icon]="tab.icon"
|
|
34
|
+
[size]="20"
|
|
35
|
+
class="flex mr-[2px]"
|
|
36
|
+
[ngClass]="{
|
|
37
|
+
'text-primary mb-small': i === activeIndex,
|
|
38
|
+
'text-text-placeholder': i !== activeIndex
|
|
39
|
+
}"
|
|
40
|
+
></fx-ui-hero-icon
|
|
41
|
+
>}
|
|
42
|
+
<div [ngClass]="i === activeIndex ? 'txt-field-label text-primary' : 'txt-placeholder'">{{ tab.label }}</div>
|
|
43
|
+
</div>
|
|
44
|
+
</button>
|
|
45
|
+
|
|
46
|
+
<span #underline class="underline" style="width: 0; transform: translateX(0)"></span>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<button
|
|
50
|
+
class="right-scroll-button"
|
|
51
|
+
type="button"
|
|
52
|
+
(click)="scroll('right')"
|
|
53
|
+
[style.opacity]="canScrollRight ? 1 : 0"
|
|
54
|
+
[style.pointerEvents]="canScrollRight ? 'auto' : 'none'"
|
|
55
|
+
>
|
|
56
|
+
<svg
|
|
57
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
58
|
+
class="h-5 w-5 text-text-primary"
|
|
59
|
+
fill="none"
|
|
60
|
+
viewBox="0 0 24 24"
|
|
61
|
+
stroke="currentColor"
|
|
62
|
+
>
|
|
63
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
|
64
|
+
</svg>
|
|
65
|
+
</button>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<!-- Tab content -->
|
|
69
|
+
<div class="transition-all duration-300 ease-in-out mt-4">
|
|
70
|
+
<ng-container *ngFor="let tab of tabs.toArray(); let i = index">
|
|
71
|
+
<div *ngIf="i === activeIndex" class="animate-fadeIn">
|
|
72
|
+
<ng-container *ngTemplateOutlet="tab.content"></ng-container>
|
|
73
|
+
</div>
|
|
74
|
+
</ng-container>
|
|
75
|
+
</div>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<div
|
|
2
|
+
class="flex flex-row gap-1"
|
|
3
|
+
[class]="rounded ? 'tag-round' : 'tag-square'"
|
|
4
|
+
[ngClass]="{
|
|
5
|
+
'tag-critical': type === 'critical',
|
|
6
|
+
'tag-success': type === 'success',
|
|
7
|
+
'tag-warning': type === 'warning',
|
|
8
|
+
'tag-information': type === 'information',
|
|
9
|
+
'tag-discovery': type === 'discovery',
|
|
10
|
+
'tag-danger': type === 'danger',
|
|
11
|
+
'tag-default': type === 'default'
|
|
12
|
+
}"
|
|
13
|
+
>
|
|
14
|
+
@if(icon){<fx-ui-hero-icon
|
|
15
|
+
class="flex"
|
|
16
|
+
[icon]="icon"
|
|
17
|
+
[size]="18"
|
|
18
|
+
[ngClass]="{
|
|
19
|
+
'text-critical': type === 'critical',
|
|
20
|
+
'text-success': type === 'success',
|
|
21
|
+
'text-warning': type === 'warning',
|
|
22
|
+
'text-information': type === 'information',
|
|
23
|
+
'text-discovery': type === 'discovery',
|
|
24
|
+
'text-danger': type === 'danger',
|
|
25
|
+
'text-text-primary': type === 'default',
|
|
26
|
+
}"
|
|
27
|
+
></fx-ui-hero-icon
|
|
28
|
+
>}
|
|
29
|
+
|
|
30
|
+
<div
|
|
31
|
+
[ngClass]="{
|
|
32
|
+
'txt-tag-critical': type === 'critical',
|
|
33
|
+
'txt-tag-success': type === 'success',
|
|
34
|
+
'txt-tag-warning': type === 'warning',
|
|
35
|
+
'txt-tag-information': type === 'information',
|
|
36
|
+
'txt-tag-discovery': type === 'discovery',
|
|
37
|
+
'txt-tag-danger': type === 'danger',
|
|
38
|
+
'txt-tag-default': type === 'default',
|
|
39
|
+
}"
|
|
40
|
+
>
|
|
41
|
+
{{ label }}
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<div
|
|
2
|
+
animate.enter="horizontal-fade-in-animation"
|
|
3
|
+
animate.leave="horizontal-fade-out-animation"
|
|
4
|
+
class="flex border-l-[3px] items-center bg-bg-primary gap-semi min-w-[250px] max-w-[320px] px-large py-semi rounded shadow-lg transition-all duration-300 ease-in-out transform opacity-100 translate-y-0"
|
|
5
|
+
[ngClass]="{
|
|
6
|
+
'border-success': type === 'success',
|
|
7
|
+
'border-critical': type === 'error',
|
|
8
|
+
'border-warning': type === 'warning',
|
|
9
|
+
'border-information': type === 'info'
|
|
10
|
+
}"
|
|
11
|
+
>
|
|
12
|
+
<div class="">
|
|
13
|
+
@switch (type) { @case('success') {
|
|
14
|
+
<fx-ui-hero-icon
|
|
15
|
+
icon="check-circle"
|
|
16
|
+
[solid]="true"
|
|
17
|
+
[size]="30"
|
|
18
|
+
class="text-success"
|
|
19
|
+
></fx-ui-hero-icon>
|
|
20
|
+
} @case('error') {
|
|
21
|
+
<fx-ui-hero-icon
|
|
22
|
+
icon="exclamation-circle"
|
|
23
|
+
[solid]="true"
|
|
24
|
+
[size]="30"
|
|
25
|
+
class="text-critical"
|
|
26
|
+
></fx-ui-hero-icon>
|
|
27
|
+
} @case('warning') {
|
|
28
|
+
<fx-ui-hero-icon
|
|
29
|
+
icon="exclamation-triangle"
|
|
30
|
+
[solid]="true"
|
|
31
|
+
[size]="30"
|
|
32
|
+
class="text-warning"
|
|
33
|
+
></fx-ui-hero-icon>
|
|
34
|
+
} @default {
|
|
35
|
+
<fx-ui-hero-icon
|
|
36
|
+
icon="information-circle"
|
|
37
|
+
[solid]="true"
|
|
38
|
+
[size]="30"
|
|
39
|
+
class="text-information"
|
|
40
|
+
></fx-ui-hero-icon>
|
|
41
|
+
} }
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div class="flex flex-col">
|
|
45
|
+
<strong *ngIf="title" class="txt-field-label">{{ title }}</strong>
|
|
46
|
+
<p class="txt-default">{{ message }}</p>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<div
|
|
2
|
+
class="fixed top-5 right-5 flex flex-col items-end gap-3 z-[10000] pointer-events-none"
|
|
3
|
+
>
|
|
4
|
+
@for (toast of toasts; track toast) {
|
|
5
|
+
<fx-ui-toast
|
|
6
|
+
class="pointer-events-auto"
|
|
7
|
+
[message]="toast.message"
|
|
8
|
+
[title]="toast.title"
|
|
9
|
+
[type]="toast.type"
|
|
10
|
+
></fx-ui-toast>
|
|
11
|
+
}
|
|
12
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<div animate.enter="fade-in-animation">
|
|
2
|
+
<div class="txt-section-header px-2xl py-semi">{{title}}</div>
|
|
3
|
+
<mat-dialog-content>
|
|
4
|
+
<div class="txt-default">{{message}}</div>
|
|
5
|
+
</mat-dialog-content>
|
|
6
|
+
<mat-dialog-actions align="end">
|
|
7
|
+
<fx-ui-button class="mr-1" [label]="cancelLabel" (clicked)="cancel()"></fx-ui-button>
|
|
8
|
+
<fx-ui-button buttonVariant="primary" class="mr-1" [label]="confirmLabel" (clicked)="accept()"></fx-ui-button>
|
|
9
|
+
</mat-dialog-actions>
|
|
10
|
+
</div>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
theme: {
|
|
3
|
+
extend: {
|
|
4
|
+
colors: {
|
|
5
|
+
primary: 'rgb(var(--primary) / <alpha-value>)',
|
|
6
|
+
success: 'rgb(var(--success) / <alpha-value>)',
|
|
7
|
+
danger: 'rgb(var(--danger) / <alpha-value>)',
|
|
8
|
+
warning: 'rgb(var(--warning) / <alpha-value>)',
|
|
9
|
+
critical: 'rgb(var(--critical) / <alpha-value>)',
|
|
10
|
+
discovery: 'rgb(var(--discovery) / <alpha-value>)',
|
|
11
|
+
information: 'rgb(var(--information) / <alpha-value>)',
|
|
12
|
+
bg: {
|
|
13
|
+
primary: 'rgb(var(--bg-primary) / <alpha-value>)',
|
|
14
|
+
hover: 'rgb(var(--bg-primary-hover) / <alpha-value>)',
|
|
15
|
+
error: 'rgb(var(--bg-error-bold) / <alpha-value>)',
|
|
16
|
+
hover2: 'rgb(var(--bg-secondary-hover) / <alpha-value>)',
|
|
17
|
+
},
|
|
18
|
+
text: {
|
|
19
|
+
primary: 'rgb(var(--text-primary) / <alpha-value>)',
|
|
20
|
+
secondary: 'rgb(var(--text-secondary) / <alpha-value>)',
|
|
21
|
+
placeholder: 'rgb(var(--text-placeholder) / <alpha-value>)',
|
|
22
|
+
selected: 'rgb(var(--text-selected-primary) / <alpha-value>)',
|
|
23
|
+
focus: 'rgb(var(--text-focus) / <alpha-value>)',
|
|
24
|
+
inverse: 'rgb(var(--text-inverse) / <alpha-value>)',
|
|
25
|
+
error: 'rgb(var(--text-error) / <alpha-value>)',
|
|
26
|
+
link: 'rgb(var(--text-link-primary) / <alpha-value>)',
|
|
27
|
+
},
|
|
28
|
+
border: {
|
|
29
|
+
default: 'rgb(var(--border-default) / <alpha-value>)',
|
|
30
|
+
interactive: 'rgb(var(--border-interactive) / <alpha-value>)',
|
|
31
|
+
selected: 'rgb(var(--border-selected) / <alpha-value>)',
|
|
32
|
+
strong: 'rgb(var(--border-strong) / <alpha-value>)',
|
|
33
|
+
hover2: 'rgb(var(--border-secondary-hover) / <alpha-value>)'
|
|
34
|
+
},
|
|
35
|
+
button: {
|
|
36
|
+
default: 'rgb(var(--button-default) / <alpha-value>)',
|
|
37
|
+
primary: 'rgb(var(--button-primary) / <alpha-value>)',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
screens: {
|
|
41
|
+
sm: '640px',
|
|
42
|
+
md: '960px',
|
|
43
|
+
lg: '1280px',
|
|
44
|
+
},
|
|
45
|
+
boxShadow: {
|
|
46
|
+
sm: '0 1px 2px 0 rgb(var(--shadow-color) / 0.05)',
|
|
47
|
+
DEFAULT: '0 1px 3px 0 rgb(var(--shadow-color) / 0.1), 0 1px 2px -1px rgb(var(--shadow-color) / 0.1)',
|
|
48
|
+
md: '0 4px 6px -1px rgb(var(--shadow-color) / 0.1), 0 2px 4px -2px rgb(var(--shadow-color) / 0.1)',
|
|
49
|
+
lg: '0 10px 15px -3px rgb(var(--shadow-color) / 0.1), 0 4px 6px -4px rgb(var(--shadow-color) / 0.1)',
|
|
50
|
+
xl: '0 20px 25px -5px rgb(var(--shadow-color) / 0.1), 0 10px 10px -5px rgb(var(--shadow-color) / 0.1)',
|
|
51
|
+
'2xl': '0 25px 50px -12px rgb(var(--shadow-color) / 0.25)',
|
|
52
|
+
inner: 'inset 0 2px 4px 0 rgb(var(--shadow-color) / 0.05)',
|
|
53
|
+
},
|
|
54
|
+
spacing: {
|
|
55
|
+
xs: '0.125rem',
|
|
56
|
+
small: '0.25rem',
|
|
57
|
+
normal: '0.5rem',
|
|
58
|
+
semi: '0.75rem',
|
|
59
|
+
large: '1rem',
|
|
60
|
+
xl: '1.25rem',
|
|
61
|
+
'2xl': '1.5rem',
|
|
62
|
+
},
|
|
63
|
+
fontFamily:{
|
|
64
|
+
spmono: ['SpaceMonoRegular', 'monospace'],
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
plugins: [],
|
|
69
|
+
};
|
package/tailwind.css
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
@import './theme.css';
|
|
2
|
+
@import './components.css';
|
|
3
|
+
@import './dialogs.css';
|
|
4
|
+
@import './fonts.css';
|
|
5
|
+
@import './animations.css';
|
|
6
|
+
@import '@danielmoncada/angular-datetime-picker/assets/style/picker.min.css';
|
|
7
|
+
@tailwind base;
|
|
8
|
+
@tailwind component;
|
|
9
|
+
@tailwind utilities;
|
|
10
|
+
|
|
11
|
+
html, body {
|
|
12
|
+
font-family: 'BeVietnamProRegular';
|
|
13
|
+
margin: 0;
|
|
14
|
+
padding: 0;
|
|
15
|
+
height: 100%;
|
|
16
|
+
width: 100%;
|
|
17
|
+
background: rgb(var(--bg-primary));
|
|
18
|
+
}
|
package/theme.css
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
.light_theme {
|
|
2
|
+
--bg-primary: 255 255 255;
|
|
3
|
+
--primary: 236 25 56;
|
|
4
|
+
--success: 15 140 96;
|
|
5
|
+
--warning: 255 188 59;
|
|
6
|
+
--critical: 236 25 56;
|
|
7
|
+
--danger: 249 133 7;
|
|
8
|
+
--discovery: 119 113 227;
|
|
9
|
+
--information: 62 175 240;
|
|
10
|
+
--text-primary: 12 14 18;
|
|
11
|
+
--text-secondary: 97 101 108;
|
|
12
|
+
--border-default: 236 236 236;
|
|
13
|
+
--text-placeholder:148 151 156;
|
|
14
|
+
--step-bg: 12 14 18;
|
|
15
|
+
--text-link-primary: 29 122 252;
|
|
16
|
+
--bg-primary-hover: 247 247 247;
|
|
17
|
+
--text-focus: 255 255 255;
|
|
18
|
+
--bg-primary-neutral: 12 14 18;
|
|
19
|
+
--text-selected-primary: 199 14 41;
|
|
20
|
+
--button-default: 34 38 47;
|
|
21
|
+
--text-inverse: 255 255 255;
|
|
22
|
+
--bg-error-bold: 215 0 68;
|
|
23
|
+
--text-error: 215 0 68;
|
|
24
|
+
--border-interactive: 236 25 56;
|
|
25
|
+
--border-selected: 254 53 83;
|
|
26
|
+
--button-primary: 236 25 56;
|
|
27
|
+
--border-strong: 206 207 210;
|
|
28
|
+
--border-secondary-hover: 0 199 205;
|
|
29
|
+
--bg-secondary-hover: 6 59 70;
|
|
30
|
+
--shadow-color: 0 0 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
:root {
|
|
34
|
+
--bg-primary: 12 14 18;
|
|
35
|
+
--primary: 236 25 56;
|
|
36
|
+
--success: 76 175 80;
|
|
37
|
+
--warning: 255 188 59;
|
|
38
|
+
--critical: 236 25 56;
|
|
39
|
+
--danger: 249 133 7;
|
|
40
|
+
--discovery: 119 113 227;
|
|
41
|
+
--information: 62 175 240;
|
|
42
|
+
--text-primary: 247 247 247;
|
|
43
|
+
--text-secondary: 148 151 156;
|
|
44
|
+
--border-default: 55 58 65;
|
|
45
|
+
--text-placeholder: 133 136 142;
|
|
46
|
+
--step-bg: 255 255 255;
|
|
47
|
+
--text-link-primary: 87 157 255;
|
|
48
|
+
--bg-primary-hover: 34 38 47;
|
|
49
|
+
--text-focus: 255 255 255;
|
|
50
|
+
--bg-primary-neutral: 12 14 18;
|
|
51
|
+
--text-selected-primary: 254 53 83;
|
|
52
|
+
--button-default: 236 236 236;
|
|
53
|
+
--text-inverse: 12 14 18;
|
|
54
|
+
--bg-error-bold: 215 0 68;
|
|
55
|
+
--text-error: 255 0 81;
|
|
56
|
+
--border-interactive: 236 25 56;
|
|
57
|
+
--border-selected: 254 53 83;
|
|
58
|
+
--button-primary: 236 25 56;
|
|
59
|
+
--border-strong: 97 101 108;
|
|
60
|
+
--border-secondary-hover: 0 199 205;
|
|
61
|
+
--bg-secondary-hover: 6 59 70;
|
|
62
|
+
--shadow-color: 255 255 255;
|
|
63
|
+
}
|