dasar-ui 1.1.0 → 1.3.0

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.
Files changed (116) hide show
  1. package/README.md +19 -14
  2. package/fesm2022/dasar-ui.mjs +9664 -0
  3. package/fesm2022/dasar-ui.mjs.map +1 -0
  4. package/package.json +39 -42
  5. package/types/dasar-ui.d.ts +2114 -0
  6. package/.editorconfig +0 -17
  7. package/.nvmrc +0 -1
  8. package/.prettierrc +0 -12
  9. package/.vscode/extensions.json +0 -4
  10. package/.vscode/launch.json +0 -20
  11. package/.vscode/settings.json +0 -4
  12. package/.vscode/tasks.json +0 -42
  13. package/CHANGELOG.md +0 -18
  14. package/angular.json +0 -37
  15. package/projects/dasar-ui/README.md +0 -64
  16. package/projects/dasar-ui/ng-package.json +0 -10
  17. package/projects/dasar-ui/package.json +0 -27
  18. package/projects/dasar-ui/src/lib/components/dasar-button/dasar-button.html +0 -9
  19. package/projects/dasar-ui/src/lib/components/dasar-button/dasar-button.scss +0 -352
  20. package/projects/dasar-ui/src/lib/components/dasar-button/dasar-button.spec.ts +0 -21
  21. package/projects/dasar-ui/src/lib/components/dasar-button/dasar-button.ts +0 -154
  22. package/projects/dasar-ui/src/lib/components/dasar-button-group/dasar-button-group.html +0 -1
  23. package/projects/dasar-ui/src/lib/components/dasar-button-group/dasar-button-group.scss +0 -69
  24. package/projects/dasar-ui/src/lib/components/dasar-button-group/dasar-button-group.spec.ts +0 -21
  25. package/projects/dasar-ui/src/lib/components/dasar-button-group/dasar-button-group.ts +0 -30
  26. package/projects/dasar-ui/src/lib/components/dasar-calendar/dasar-calendar.html +0 -158
  27. package/projects/dasar-ui/src/lib/components/dasar-calendar/dasar-calendar.scss +0 -371
  28. package/projects/dasar-ui/src/lib/components/dasar-calendar/dasar-calendar.spec.ts +0 -21
  29. package/projects/dasar-ui/src/lib/components/dasar-calendar/dasar-calendar.ts +0 -458
  30. package/projects/dasar-ui/src/lib/components/dasar-card/dasar-card.html +0 -80
  31. package/projects/dasar-ui/src/lib/components/dasar-card/dasar-card.scss +0 -184
  32. package/projects/dasar-ui/src/lib/components/dasar-card/dasar-card.spec.ts +0 -21
  33. package/projects/dasar-ui/src/lib/components/dasar-card/dasar-card.ts +0 -294
  34. package/projects/dasar-ui/src/lib/components/dasar-chip/dasar-chip.html +0 -42
  35. package/projects/dasar-ui/src/lib/components/dasar-chip/dasar-chip.scss +0 -38
  36. package/projects/dasar-ui/src/lib/components/dasar-chip/dasar-chip.ts +0 -207
  37. package/projects/dasar-ui/src/lib/components/dasar-datepicker/dasar-datepicker.html +0 -102
  38. package/projects/dasar-ui/src/lib/components/dasar-datepicker/dasar-datepicker.scss +0 -301
  39. package/projects/dasar-ui/src/lib/components/dasar-datepicker/dasar-datepicker.spec.ts +0 -21
  40. package/projects/dasar-ui/src/lib/components/dasar-datepicker/dasar-datepicker.ts +0 -527
  41. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.html +0 -1
  42. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.registry.ts +0 -5089
  43. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.scss +0 -24
  44. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.spec.ts +0 -21
  45. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.ts +0 -97
  46. package/projects/dasar-ui/src/lib/components/dasar-input/dasar-input.html +0 -54
  47. package/projects/dasar-ui/src/lib/components/dasar-input/dasar-input.scss +0 -281
  48. package/projects/dasar-ui/src/lib/components/dasar-input/dasar-input.spec.ts +0 -21
  49. package/projects/dasar-ui/src/lib/components/dasar-input/dasar-input.ts +0 -323
  50. package/projects/dasar-ui/src/lib/components/dasar-menu/dasar-menu.html +0 -63
  51. package/projects/dasar-ui/src/lib/components/dasar-menu/dasar-menu.scss +0 -195
  52. package/projects/dasar-ui/src/lib/components/dasar-menu/dasar-menu.spec.ts +0 -21
  53. package/projects/dasar-ui/src/lib/components/dasar-menu/dasar-menu.ts +0 -240
  54. package/projects/dasar-ui/src/lib/components/dasar-number-input/dasar-number-input.html +0 -90
  55. package/projects/dasar-ui/src/lib/components/dasar-number-input/dasar-number-input.scss +0 -358
  56. package/projects/dasar-ui/src/lib/components/dasar-number-input/dasar-number-input.spec.ts +0 -21
  57. package/projects/dasar-ui/src/lib/components/dasar-number-input/dasar-number-input.ts +0 -337
  58. package/projects/dasar-ui/src/lib/components/dasar-pagination/dasar-pagination.html +0 -98
  59. package/projects/dasar-ui/src/lib/components/dasar-pagination/dasar-pagination.scss +0 -51
  60. package/projects/dasar-ui/src/lib/components/dasar-pagination/dasar-pagination.spec.ts +0 -21
  61. package/projects/dasar-ui/src/lib/components/dasar-pagination/dasar-pagination.ts +0 -99
  62. package/projects/dasar-ui/src/lib/components/dasar-pin/dasar-pin.css +0 -0
  63. package/projects/dasar-ui/src/lib/components/dasar-pin/dasar-pin.html +0 -1
  64. package/projects/dasar-ui/src/lib/components/dasar-pin/dasar-pin.spec.ts +0 -21
  65. package/projects/dasar-ui/src/lib/components/dasar-pin/dasar-pin.ts +0 -9
  66. package/projects/dasar-ui/src/lib/components/dasar-pivot-table/dasar-pivot-table.html +0 -163
  67. package/projects/dasar-ui/src/lib/components/dasar-pivot-table/dasar-pivot-table.scss +0 -283
  68. package/projects/dasar-ui/src/lib/components/dasar-pivot-table/dasar-pivot-table.ts +0 -230
  69. package/projects/dasar-ui/src/lib/components/dasar-radio/dasar-radio.css +0 -0
  70. package/projects/dasar-ui/src/lib/components/dasar-radio/dasar-radio.html +0 -1
  71. package/projects/dasar-ui/src/lib/components/dasar-radio/dasar-radio.spec.ts +0 -21
  72. package/projects/dasar-ui/src/lib/components/dasar-radio/dasar-radio.ts +0 -9
  73. package/projects/dasar-ui/src/lib/components/dasar-select/dasar-select.html +0 -185
  74. package/projects/dasar-ui/src/lib/components/dasar-select/dasar-select.scss +0 -347
  75. package/projects/dasar-ui/src/lib/components/dasar-select/dasar-select.spec.ts +0 -21
  76. package/projects/dasar-ui/src/lib/components/dasar-select/dasar-select.ts +0 -497
  77. package/projects/dasar-ui/src/lib/components/dasar-slider/dasar-slider.css +0 -0
  78. package/projects/dasar-ui/src/lib/components/dasar-slider/dasar-slider.html +0 -1
  79. package/projects/dasar-ui/src/lib/components/dasar-slider/dasar-slider.spec.ts +0 -21
  80. package/projects/dasar-ui/src/lib/components/dasar-slider/dasar-slider.ts +0 -9
  81. package/projects/dasar-ui/src/lib/components/dasar-table/dasar-table.html +0 -162
  82. package/projects/dasar-ui/src/lib/components/dasar-table/dasar-table.scss +0 -283
  83. package/projects/dasar-ui/src/lib/components/dasar-table/dasar-table.spec.ts +0 -21
  84. package/projects/dasar-ui/src/lib/components/dasar-table/dasar-table.ts +0 -380
  85. package/projects/dasar-ui/src/lib/components/dasar-tabs/dasar-tabs.html +0 -41
  86. package/projects/dasar-ui/src/lib/components/dasar-tabs/dasar-tabs.scss +0 -126
  87. package/projects/dasar-ui/src/lib/components/dasar-tabs/dasar-tabs.spec.ts +0 -21
  88. package/projects/dasar-ui/src/lib/components/dasar-tabs/dasar-tabs.ts +0 -72
  89. package/projects/dasar-ui/src/lib/components/dasar-textarea/dasar-textarea.html +0 -43
  90. package/projects/dasar-ui/src/lib/components/dasar-textarea/dasar-textarea.scss +0 -189
  91. package/projects/dasar-ui/src/lib/components/dasar-textarea/dasar-textarea.spec.ts +0 -21
  92. package/projects/dasar-ui/src/lib/components/dasar-textarea/dasar-textarea.ts +0 -139
  93. package/projects/dasar-ui/src/lib/components/dasar-theme-provider/dasar-theme-provider.ts +0 -286
  94. package/projects/dasar-ui/src/lib/components/dasar-toast/dasar-toast.css +0 -0
  95. package/projects/dasar-ui/src/lib/components/dasar-toast/dasar-toast.html +0 -1
  96. package/projects/dasar-ui/src/lib/components/dasar-toast/dasar-toast.spec.ts +0 -21
  97. package/projects/dasar-ui/src/lib/components/dasar-toast/dasar-toast.ts +0 -9
  98. package/projects/dasar-ui/src/lib/components/dasar-toggle/dasar-toggle.css +0 -0
  99. package/projects/dasar-ui/src/lib/components/dasar-toggle/dasar-toggle.html +0 -1
  100. package/projects/dasar-ui/src/lib/components/dasar-toggle/dasar-toggle.spec.ts +0 -21
  101. package/projects/dasar-ui/src/lib/components/dasar-toggle/dasar-toggle.ts +0 -9
  102. package/projects/dasar-ui/src/lib/components/dasar-tooltip/dasar-tooltip.css +0 -0
  103. package/projects/dasar-ui/src/lib/components/dasar-tooltip/dasar-tooltip.html +0 -1
  104. package/projects/dasar-ui/src/lib/components/dasar-tooltip/dasar-tooltip.spec.ts +0 -21
  105. package/projects/dasar-ui/src/lib/components/dasar-tooltip/dasar-tooltip.ts +0 -9
  106. package/projects/dasar-ui/src/lib/models/theme.model.ts +0 -643
  107. package/projects/dasar-ui/src/lib/models/type.model.ts +0 -11
  108. package/projects/dasar-ui/src/lib/services/theme.service.ts +0 -643
  109. package/projects/dasar-ui/src/lib/styles/theme.ts +0 -70
  110. package/projects/dasar-ui/src/lib/utils/common.ts +0 -175
  111. package/projects/dasar-ui/src/public-api.ts +0 -23
  112. package/projects/dasar-ui/tsconfig.lib.json +0 -21
  113. package/projects/dasar-ui/tsconfig.lib.prod.json +0 -11
  114. package/projects/dasar-ui/tsconfig.spec.json +0 -11
  115. package/tsconfig.json +0 -37
  116. /package/{projects/dasar-ui/src/lib/styles → styles}/theme.scss +0 -0
@@ -1,41 +0,0 @@
1
- <div
2
- class="dasar-tabs-container appearance-{{ appearance }} size-{{ size }}"
3
- [class.fluid]="fluid"
4
- [ngClass]="containerClass"
5
- [ngStyle]="containerStyle"
6
- >
7
- <div class="dasar-tabs-list" [ngClass]="listClass" [ngStyle]="listStyle">
8
- @if (items.length > 0) {
9
- @for (item of items; track item; let i = $index) {
10
- <dasar-button
11
- [variant]="activeIndex === i && appearance !== 'outline' ? 'primary' : 'ghost'"
12
- [radius]="appearance === 'outline' ? 'none' : radius"
13
- [size]="size === 'compact' ? 'sm' : 'md'"
14
- [class.active]="activeIndex === i"
15
- [fluid]="fluid"
16
- (click)="selectTab(i)"
17
- class="dasar-tab-trigger-btn"
18
- >
19
- {{ item }}
20
- </dasar-button>
21
- }
22
- } @else {
23
- @for (tabSlotDirective of tabItemSlotDirectives; track tabSlotDirective; let i = $index) {
24
- <dasar-button
25
- [variant]="activeIndex === i && appearance !== 'outline' ? 'primary' : 'ghost'"
26
- [radius]="appearance === 'outline' ? 'none' : radius"
27
- [size]="size === 'compact' ? 'sm' : 'md'"
28
- [class.active]="activeIndex === i"
29
- (click)="selectTab(i)"
30
- [fluid]="fluid"
31
- class="dasar-tab-trigger-btn"
32
- >
33
- <ng-container *ngTemplateOutlet="tabSlotDirective.templateRef"></ng-container>
34
- </dasar-button>
35
- }
36
- }
37
- </div>
38
- <div class="dasar-tabs-content" [ngClass]="contentClass" [ngStyle]="contentStyle">
39
- <ng-content></ng-content>
40
- </div>
41
- </div>
@@ -1,126 +0,0 @@
1
- @use '../../styles/theme.scss' as *;
2
-
3
- .dasar-tabs {
4
- display: block;
5
- width: 100%;
6
- }
7
-
8
- .dasar-tabs-container {
9
- display: flex;
10
- flex-direction: column;
11
- width: 100%;
12
-
13
- &.fluid {
14
- background-color: transparent;
15
- border: none;
16
- box-shadow: none;
17
-
18
- .dasar-tabs-list {
19
- display: flex;
20
- background-color: transparent !important;
21
- border: none !important;
22
- box-shadow: none !important;
23
- padding: 0 !important;
24
- }
25
- }
26
- }
27
-
28
- .dasar-tabs-list {
29
- font-size: var(--font-size-base);
30
- -ms-overflow-style: none;
31
- scroll-behavior: smooth;
32
- scrollbar-width: none;
33
- display: inline-flex;
34
- flex-wrap: nowrap;
35
- overflow-x: auto;
36
- padding: var(--space-1);
37
- gap: var(--space-1);
38
- &::-webkit-scrollbar {
39
- display: none;
40
- }
41
- }
42
-
43
- .dasar-tabs-container.appearance-subtle .dasar-tabs-list {
44
- background-color: var(--theme-bg-hover-color);
45
- border-radius: var(--radius-md);
46
- transition: background-color 0.3s ease;
47
- }
48
-
49
- .dasar-tabs-container.appearance-solid .dasar-tabs-list {
50
- background-color: var(--theme-bg-surface-color);
51
- border: 1px solid var(--theme-border-strong-color);
52
- border-radius: var(--radius-md);
53
- transition:
54
- background-color 0.3s ease,
55
- border-color 0.3s ease;
56
- }
57
-
58
- .dasar-tabs-container.appearance-outline .dasar-tabs-list {
59
- border-bottom: 1px solid var(--theme-border-subtle-color);
60
- margin-bottom: calc(var(--space-0-5) * -1);
61
- background-color: transparent;
62
- border-radius: 0;
63
- padding: 0;
64
- gap: 0;
65
- }
66
-
67
- .dasar-tabs-container.appearance-outline {
68
- .dasar-tabs-list {
69
- background-color: transparent;
70
- box-shadow: inset 0 -1px 0 0 var(--theme-border-subtle-color);
71
- border-radius: 0;
72
- border: none;
73
- padding: 0;
74
- gap: 0;
75
- }
76
-
77
- .dasar-tab-trigger-btn {
78
- border-bottom: none;
79
- margin-bottom: 0;
80
- transition: box-shadow 0.3s ease-in-out;
81
-
82
- ::ng-deep .dasar-button-native {
83
- padding-left: var(--space-4);
84
- padding-right: var(--space-4);
85
- background-color: transparent !important;
86
- border-color: transparent !important;
87
- transition:
88
- color 0.3s ease-in-out,
89
- font-weight 0.3s ease;
90
- &:hover {
91
- color: var(--theme-primary-color);
92
- background-color: var(--theme-bg-hover-color) !important;
93
- }
94
- }
95
-
96
- &.active {
97
- box-shadow: inset 0 -1px 0 0 var(--theme-primary-color);
98
- // ::ng-deep .dasar-button-native {
99
- // color: var(--theme-primary-color) !important;
100
- // font-weight: var(--font-weight-semibold);
101
- // background-color: transparent !important;
102
- // }
103
- }
104
- }
105
- }
106
-
107
- .dasar-tabs-content {
108
- padding-top: var(--space-4);
109
- color: var(--theme-text-primary-color);
110
-
111
- > * {
112
- animation: dasarTabFadeIn 0.3s ease-in-out forwards;
113
- display: block;
114
- }
115
- }
116
-
117
- @keyframes dasarTabFadeIn {
118
- from {
119
- opacity: 0;
120
- transform: translateY(4px);
121
- }
122
- to {
123
- opacity: 1;
124
- transform: translateY(0);
125
- }
126
- }
@@ -1,21 +0,0 @@
1
- import { ComponentFixture, TestBed } from '@angular/core/testing';
2
- import { DasarTabs } from './dasar-tabs';
3
-
4
- describe('DasarTabs', () => {
5
- let component: DasarTabs;
6
- let fixture: ComponentFixture<DasarTabs>;
7
-
8
- beforeEach(async () => {
9
- await TestBed.configureTestingModule({
10
- imports: [DasarTabs],
11
- }).compileComponents();
12
-
13
- fixture = TestBed.createComponent(DasarTabs);
14
- component = fixture.componentInstance;
15
- await fixture.whenStable();
16
- });
17
-
18
- it('should create', () => {
19
- expect(component).toBeTruthy();
20
- });
21
- });
@@ -1,72 +0,0 @@
1
- import {
2
- Directive,
3
- TemplateRef,
4
- Component,
5
- Input,
6
- Output,
7
- EventEmitter,
8
- ContentChildren,
9
- QueryList,
10
- HostBinding,
11
- NgModule,
12
- booleanAttribute,
13
- } from '@angular/core';
14
- import { CommonModule } from '@angular/common';
15
- import { DasarButton } from '../dasar-button/dasar-button';
16
-
17
- export type DasarTabsRadiusType = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
18
- export type DasarTabsAppearanceType = 'solid' | 'subtle' | 'outline';
19
- export type DasarTabsSizeType = 'compact' | 'normal';
20
-
21
- @Directive({
22
- selector: '[tab-item-slot]',
23
- standalone: true,
24
- })
25
- export class DasarTabItemSlotDirective {
26
- constructor(public templateRef: TemplateRef<any>) {}
27
- }
28
-
29
- @Component({
30
- selector: 'dasar-tabs',
31
- standalone: true,
32
- imports: [CommonModule, DasarButton],
33
- templateUrl: './dasar-tabs.html',
34
- styleUrls: ['./dasar-tabs.scss'],
35
- })
36
- export class DasarTabs {
37
- @ContentChildren(DasarTabItemSlotDirective)
38
- tabItemSlotDirectives!: QueryList<DasarTabItemSlotDirective>;
39
-
40
- @Input({ transform: booleanAttribute }) fluid: boolean = false;
41
- @Input() appearance: DasarTabsAppearanceType = 'subtle';
42
- @Input() radius: DasarTabsRadiusType = 'md';
43
- @Input() size: DasarTabsSizeType = 'normal';
44
- @Input() activeIndex: number = 0;
45
- @Input() items: string[] = [];
46
-
47
- @Input() containerStyle: Record<string, any> | null = null;
48
- @Input() contentStyle: Record<string, any> | null = null;
49
- @Input() listStyle: Record<string, any> | null = null;
50
- @Input() containerClass: string = '';
51
- @Input() contentClass: string = '';
52
- @Input() listClass: string = '';
53
-
54
- @Output() tabsChanged = new EventEmitter<number>();
55
- @Output() tabsClicked = new EventEmitter<number>();
56
-
57
- @HostBinding('class.dasar-tabs') readonly baseClass = true;
58
-
59
- selectTab(index: number) {
60
- this.activeIndex = index;
61
- this.tabsClicked.emit(index);
62
- this.tabsChanged.emit(index);
63
- }
64
- }
65
-
66
- @NgModule({
67
- imports: [DasarTabItemSlotDirective, DasarTabs],
68
- exports: [DasarTabItemSlotDirective, DasarTabs],
69
- })
70
- export class DasarTabsModule {}
71
-
72
- export const DasarTabsComponent = [DasarTabs, DasarTabItemSlotDirective] as const;
@@ -1,43 +0,0 @@
1
- <div class="dasar-textarea-wrapper">
2
- @if (label || extraLabelSlot) {
3
- <div class="dasar-textarea-label-row">
4
- @if (label) {
5
- <label class="dasar-textarea-label">{{ label }}</label>
6
- } @else {
7
- <ng-content select="[label-slot]"></ng-content>
8
- }
9
- @if (extraLabelSlot) {
10
- <ng-content select="[extra-label-slot]"></ng-content>
11
- } @else if (labelRight) {
12
- <span class="dasar-textarea-label-right">{{ labelRight }}</span>
13
- }
14
- </div>
15
- }
16
- <div
17
- class="dasar-textarea-container appearance-{{ appearance }} size-{{ size }} radius-{{ radius }}"
18
- [class.full-width]="fullWidth"
19
- [class.disabled]="disabled"
20
- [class.error]="error"
21
- [ngClass]="containerClass"
22
- [ngStyle]="containerStyle"
23
- >
24
- <textarea
25
- [placeholder]="placeholder"
26
- [disabled]="disabled"
27
- [readonly]="readonly"
28
- [rows]="rows"
29
- [cols]="cols"
30
- [ngClass]="textareaClass"
31
- [ngStyle]="textareaStyle"
32
- [value]="_value"
33
- (input)="onInput($event)"
34
- (blur)="onBlur()"
35
- class="dasar-textarea-native"
36
- ></textarea>
37
- </div>
38
- @if (hint) {
39
- <div class="dasar-textarea-hint" [class.error]="error" [class.disabled]="disabled">
40
- {{ hint }}
41
- </div>
42
- }
43
- </div>
@@ -1,189 +0,0 @@
1
- @use '../../styles/theme.scss' as *;
2
-
3
- .dasar-textarea {
4
- display: inline-flex;
5
- flex-direction: column;
6
-
7
- &.full-width {
8
- width: 100%;
9
- }
10
-
11
- &.disabled {
12
- cursor: not-allowed;
13
- }
14
- }
15
-
16
- .dasar-textarea-wrapper {
17
- display: flex;
18
- flex-direction: column;
19
- gap: var(--textarea-wrapper-gap, var(--space-1));
20
- }
21
-
22
- .dasar-textarea-label-row {
23
- display: flex;
24
- align-items: center;
25
- justify-content: space-between;
26
- font-size: var(--textarea-label-font-size, var(--font-size-md));
27
- font-weight: var(--textarea-label-font-weight, var(--font-weight-medium));
28
- color: var(--textarea-label-color, var(--theme-text-primary-color));
29
- line-height: var(--line-height-tight);
30
-
31
- .dasar-textarea-label-right {
32
- color: var(--textarea-label-right-color, var(--theme-text-secondary-color));
33
- font-size: var(--textarea-label-right-font-size, var(--font-size-sm));
34
- gap: var(--textarea-label-right-gap, var(--space-1));
35
- display: inline-flex;
36
- align-items: center;
37
- }
38
- }
39
-
40
- .dasar-textarea-container {
41
- background-color: var(--textarea-background, var(--theme-bg-hover-color));
42
- padding: var(--textarea-padding, var(--space-base));
43
- font-family: inherit;
44
- display: inline-flex;
45
- align-items: flex-start;
46
- border-radius: var(--textarea-radius-sm, var(--radius-sm));
47
- width: auto;
48
- gap: var(--textarea-gap, var(--space-base));
49
-
50
- &.appearance-outline {
51
- border: 1px solid var(--textarea-outline-border, var(--theme-border-strong-color));
52
- background-color: var(--textarea-outline-background, transparent);
53
-
54
- &:hover:not(.disabled) {
55
- border-color: var(--textarea-outline-hover-border, var(--theme-primary-color));
56
- }
57
-
58
- &:focus-within {
59
- border-color: var(--textarea-outline-focus-border, var(--theme-primary-color));
60
- box-shadow: 0 0 0 3px var(--textarea-outline-focus-ring, var(--theme-primary-surface-color));
61
- }
62
- }
63
-
64
- &.appearance-filled {
65
- border: 1px solid var(--textarea-filled-border, transparent);
66
-
67
- &:hover:not(.disabled) {
68
- background-color: var(--textarea-filled-hover-background, var(--theme-border-subtle-color));
69
- }
70
-
71
- &:focus-within {
72
- background-color: var(--textarea-filled-focus-background, var(--theme-bg-surface-color));
73
- border-color: var(--textarea-filled-focus-border, var(--theme-primary-color));
74
- box-shadow: 0 0 0 3px var(--textarea-filled-focus-ring, var(--theme-primary-surface-color));
75
- }
76
- }
77
-
78
- &.error {
79
- border-color: var(--textarea-error-border, var(--theme-danger-color)) !important;
80
-
81
- &:focus-within {
82
- box-shadow: 0 0 0 3px var(--textarea-error-focus-ring, var(--theme-danger-surface-color));
83
- }
84
- }
85
-
86
- &.disabled {
87
- background-color: var(--textarea-disabled-background, var(--theme-bg-hover-color)) !important;
88
- border-color: var(--textarea-disabled-border, transparent) !important;
89
- cursor: not-allowed;
90
- opacity: var(--textarea-disabled-opacity, 0.7);
91
- }
92
-
93
- &.size-sm {
94
- padding: var(--textarea-padding-sm, var(--space-1));
95
- font-size: var(--textarea-font-size-sm, var(--font-size-sm));
96
-
97
- .dasar-textarea-native {
98
- font-size: var(--textarea-font-size-sm, var(--font-size-sm));
99
- }
100
- }
101
-
102
- &.size-md {
103
- padding: var(--textarea-padding-md, var(--space-base));
104
- font-size: var(--textarea-font-size-md, var(--font-size-base));
105
-
106
- .dasar-textarea-native {
107
- font-size: var(--textarea-font-size-md, var(--font-size-base));
108
- }
109
- }
110
-
111
- &.size-lg {
112
- padding: var(--textarea-padding-lg, var(--space-3));
113
- font-size: var(--textarea-font-size-lg, var(--font-size-lg));
114
-
115
- .dasar-textarea-native {
116
- font-size: var(--textarea-font-size-lg, var(--font-size-lg));
117
- }
118
- }
119
-
120
- &.radius-none {
121
- border-radius: var(--textarea-radius-none, var(--radius-none));
122
- }
123
- &.radius-xs {
124
- border-radius: var(--textarea-radius-xs, var(--radius-xs));
125
- }
126
- &.radius-sm {
127
- border-radius: var(--textarea-radius-sm, var(--radius-sm));
128
- }
129
- &.radius-md {
130
- border-radius: var(--textarea-radius-md, var(--radius-md));
131
- }
132
- &.radius-lg {
133
- border-radius: var(--textarea-radius-lg, var(--radius-lg));
134
- }
135
- &.radius-xl {
136
- border-radius: var(--textarea-radius-xl, var(--radius-xl));
137
- }
138
- &.radius-full {
139
- border-radius: var(--textarea-radius-full, var(--radius-full));
140
- }
141
- }
142
-
143
- .dasar-textarea-native {
144
- flex: 1;
145
- width: 100%;
146
- border: none;
147
- outline: none;
148
- background: transparent;
149
- font-family: inherit;
150
- color: var(--textarea-color, var(--theme-text-primary-color));
151
- padding: 0;
152
- resize: vertical;
153
-
154
- &::placeholder {
155
- color: var(--textarea-placeholder-color, var(--theme-text-secondary-color));
156
- }
157
-
158
- &:disabled {
159
- color: var(--textarea-disabled-color, var(--theme-text-disabled-color));
160
- cursor: not-allowed;
161
- }
162
-
163
- &:-webkit-autofill,
164
- &:-webkit-autofill:hover,
165
- &:-webkit-autofill:focus {
166
- -webkit-box-shadow: 0 0 0 30px
167
- var(--textarea-autofill-background, var(--theme-bg-default-color)) inset !important;
168
- -webkit-text-fill-color: var(
169
- --textarea-autofill-color,
170
- var(--theme-text-primary-color)
171
- ) !important;
172
- }
173
- }
174
-
175
- .dasar-textarea-hint {
176
- font-size: var(--textarea-hint-font-size, var(--font-size-sm));
177
- color: var(--textarea-hint-color, var(--theme-text-secondary-color));
178
- line-height: var(--line-height-normal);
179
- margin-top: calc(var(--space-0-5) * -1);
180
-
181
- &.error {
182
- color: var(--textarea-hint-error-color, var(--theme-danger-color));
183
- }
184
-
185
- &.disabled {
186
- opacity: var(--textarea-disabled-opacity, 0.7);
187
- cursor: not-allowed;
188
- }
189
- }
@@ -1,21 +0,0 @@
1
- import { ComponentFixture, TestBed } from '@angular/core/testing';
2
- import { DasarTextarea } from './dasar-textarea';
3
-
4
- describe('DasarTextarea', () => {
5
- let component: DasarTextarea;
6
- let fixture: ComponentFixture<DasarTextarea>;
7
-
8
- beforeEach(async () => {
9
- await TestBed.configureTestingModule({
10
- imports: [DasarTextarea],
11
- }).compileComponents();
12
-
13
- fixture = TestBed.createComponent(DasarTextarea);
14
- component = fixture.componentInstance;
15
- await fixture.whenStable();
16
- });
17
-
18
- it('should create', () => {
19
- expect(component).toBeTruthy();
20
- });
21
- });
@@ -1,139 +0,0 @@
1
- import {
2
- booleanAttribute,
3
- Component,
4
- HostBinding,
5
- Input,
6
- Output,
7
- EventEmitter,
8
- forwardRef,
9
- ViewEncapsulation,
10
- TemplateRef,
11
- ChangeDetectorRef,
12
- inject,
13
- Directive,
14
- ContentChild,
15
- } from '@angular/core';
16
- import { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
17
- import { CommonModule } from '@angular/common';
18
- import { ScaleAttributeType } from '@models/type.model';
19
-
20
- export type DasarTextareaSizeType = Extract<ScaleAttributeType, 'sm' | 'md' | 'lg'>;
21
- export type DasarTextareaAppearanceType = 'outline' | 'filled';
22
- export type DasarTextareaRadiusType = ScaleAttributeType;
23
-
24
- @Directive({ selector: '[label-slot]', standalone: true })
25
- export class DasarTextareaLabelSlot {}
26
- @Directive({ selector: '[extra-label-slot]', standalone: true })
27
- export class DasarTextareaExtraLabelSlot {}
28
-
29
- @Component({
30
- providers: [
31
- {
32
- provide: NG_VALUE_ACCESSOR,
33
- useExisting: forwardRef(() => DasarTextarea),
34
- multi: true,
35
- },
36
- ],
37
- encapsulation: ViewEncapsulation.None,
38
- imports: [CommonModule, FormsModule],
39
- styleUrls: ['./dasar-textarea.scss'],
40
- templateUrl: './dasar-textarea.html',
41
- selector: 'dasar-textarea',
42
- standalone: true,
43
- })
44
- export class DasarTextarea implements ControlValueAccessor {
45
- @ContentChild(DasarTextareaExtraLabelSlot) extraLabelSlot?: DasarTextareaExtraLabelSlot;
46
- @ContentChild(DasarTextareaLabelSlot) labelSlot?: DasarTextareaLabelSlot;
47
-
48
- @Input() appearance: DasarTextareaAppearanceType = 'outline';
49
- @Input() labelRight?: string | TemplateRef<any>;
50
- @Input() size: DasarTextareaSizeType = 'md';
51
- @Input() radius: DasarTextareaRadiusType = 'md';
52
- @Input() hint: string = '';
53
- @Input() placeholder = '';
54
- @Input() label?: string;
55
- @Input() rows: number = 4;
56
- @Input() cols: number = 20;
57
- @Input({ transform: booleanAttribute }) fullWidth = false;
58
- @Input({ transform: booleanAttribute }) disabled = false;
59
- @Input({ transform: booleanAttribute }) readonly = false;
60
- @Input({ transform: booleanAttribute }) error = false;
61
-
62
- @Input() containerClass: string | string[] | Set<string> | { [klass: string]: any } = '';
63
- @Input() textareaClass: string | string[] | Set<string> | { [klass: string]: any } = '';
64
- @Input() hostClass: string | string[] | Set<string> | { [klass: string]: any } = '';
65
- @Input() containerStyle: Record<string, any> | null = null;
66
- @Input() textareaStyle: Record<string, any> | null = null;
67
- @Input() hostStyle: Record<string, any> | null = null;
68
-
69
- private cdr = inject(ChangeDetectorRef);
70
- _value: any = '';
71
-
72
- @Input()
73
- get value(): any {
74
- return this._value;
75
- }
76
- set value(val: any) {
77
- if (this._value !== val) {
78
- this._value = val ?? '';
79
- this.cdr.markForCheck();
80
- }
81
- }
82
-
83
- @Output() valueChange = new EventEmitter<any>();
84
-
85
- @HostBinding('class.dasar-textarea') readonly baseClass = true;
86
-
87
- @HostBinding('class.full-width')
88
- get hasFullWidth(): boolean {
89
- return this.fullWidth;
90
- }
91
-
92
- @HostBinding('class.disabled')
93
- get isDisabled(): boolean {
94
- return this.disabled;
95
- }
96
-
97
- onChange: any = () => {};
98
- onTouched: any = () => {};
99
-
100
- writeValue(val: any): void {
101
- this._value = val !== null && val !== undefined ? String(val) : '';
102
- this.cdr.markForCheck();
103
- }
104
-
105
- registerOnChange(fn: any): void {
106
- this.onChange = fn;
107
- }
108
-
109
- registerOnTouched(fn: any): void {
110
- this.onTouched = fn;
111
- }
112
-
113
- setDisabledState(isDisabled: boolean): void {
114
- this.disabled = isDisabled;
115
- this.cdr.markForCheck();
116
- }
117
-
118
- onInput(event: Event): void {
119
- const target = event.target as HTMLTextAreaElement;
120
- const val = target.value;
121
- this._value = val;
122
- this.onChange(val);
123
- this.valueChange.emit(val);
124
- }
125
-
126
- onBlur(): void {
127
- this.onTouched();
128
- }
129
-
130
- isTemplate(value: any): boolean {
131
- return value instanceof TemplateRef;
132
- }
133
- }
134
-
135
- export const DasarTextareaComponent = [
136
- DasarTextareaExtraLabelSlot,
137
- DasarTextareaLabelSlot,
138
- DasarTextarea,
139
- ] as const;