dasar-ui 0.0.0-stage → 1.1.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 (113) hide show
  1. package/.editorconfig +17 -0
  2. package/.nvmrc +1 -0
  3. package/.prettierrc +12 -0
  4. package/.vscode/extensions.json +4 -0
  5. package/.vscode/launch.json +20 -0
  6. package/.vscode/settings.json +4 -0
  7. package/.vscode/tasks.json +42 -0
  8. package/CHANGELOG.md +18 -0
  9. package/README.md +59 -3
  10. package/angular.json +37 -0
  11. package/package.json +42 -6
  12. package/projects/dasar-ui/README.md +64 -0
  13. package/projects/dasar-ui/ng-package.json +10 -0
  14. package/projects/dasar-ui/package.json +27 -0
  15. package/projects/dasar-ui/src/lib/components/dasar-button/dasar-button.html +9 -0
  16. package/projects/dasar-ui/src/lib/components/dasar-button/dasar-button.scss +352 -0
  17. package/projects/dasar-ui/src/lib/components/dasar-button/dasar-button.spec.ts +21 -0
  18. package/projects/dasar-ui/src/lib/components/dasar-button/dasar-button.ts +154 -0
  19. package/projects/dasar-ui/src/lib/components/dasar-button-group/dasar-button-group.html +1 -0
  20. package/projects/dasar-ui/src/lib/components/dasar-button-group/dasar-button-group.scss +69 -0
  21. package/projects/dasar-ui/src/lib/components/dasar-button-group/dasar-button-group.spec.ts +21 -0
  22. package/projects/dasar-ui/src/lib/components/dasar-button-group/dasar-button-group.ts +30 -0
  23. package/projects/dasar-ui/src/lib/components/dasar-calendar/dasar-calendar.html +158 -0
  24. package/projects/dasar-ui/src/lib/components/dasar-calendar/dasar-calendar.scss +371 -0
  25. package/projects/dasar-ui/src/lib/components/dasar-calendar/dasar-calendar.spec.ts +21 -0
  26. package/projects/dasar-ui/src/lib/components/dasar-calendar/dasar-calendar.ts +458 -0
  27. package/projects/dasar-ui/src/lib/components/dasar-card/dasar-card.html +80 -0
  28. package/projects/dasar-ui/src/lib/components/dasar-card/dasar-card.scss +184 -0
  29. package/projects/dasar-ui/src/lib/components/dasar-card/dasar-card.spec.ts +21 -0
  30. package/projects/dasar-ui/src/lib/components/dasar-card/dasar-card.ts +294 -0
  31. package/projects/dasar-ui/src/lib/components/dasar-chip/dasar-chip.html +42 -0
  32. package/projects/dasar-ui/src/lib/components/dasar-chip/dasar-chip.scss +38 -0
  33. package/projects/dasar-ui/src/lib/components/dasar-chip/dasar-chip.ts +207 -0
  34. package/projects/dasar-ui/src/lib/components/dasar-datepicker/dasar-datepicker.html +102 -0
  35. package/projects/dasar-ui/src/lib/components/dasar-datepicker/dasar-datepicker.scss +301 -0
  36. package/projects/dasar-ui/src/lib/components/dasar-datepicker/dasar-datepicker.spec.ts +21 -0
  37. package/projects/dasar-ui/src/lib/components/dasar-datepicker/dasar-datepicker.ts +527 -0
  38. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.html +1 -0
  39. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.registry.ts +5089 -0
  40. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.scss +24 -0
  41. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.spec.ts +21 -0
  42. package/projects/dasar-ui/src/lib/components/dasar-icon/dasar-icon.ts +97 -0
  43. package/projects/dasar-ui/src/lib/components/dasar-input/dasar-input.html +54 -0
  44. package/projects/dasar-ui/src/lib/components/dasar-input/dasar-input.scss +281 -0
  45. package/projects/dasar-ui/src/lib/components/dasar-input/dasar-input.spec.ts +21 -0
  46. package/projects/dasar-ui/src/lib/components/dasar-input/dasar-input.ts +323 -0
  47. package/projects/dasar-ui/src/lib/components/dasar-menu/dasar-menu.html +63 -0
  48. package/projects/dasar-ui/src/lib/components/dasar-menu/dasar-menu.scss +195 -0
  49. package/projects/dasar-ui/src/lib/components/dasar-menu/dasar-menu.spec.ts +21 -0
  50. package/projects/dasar-ui/src/lib/components/dasar-menu/dasar-menu.ts +240 -0
  51. package/projects/dasar-ui/src/lib/components/dasar-number-input/dasar-number-input.html +90 -0
  52. package/projects/dasar-ui/src/lib/components/dasar-number-input/dasar-number-input.scss +358 -0
  53. package/projects/dasar-ui/src/lib/components/dasar-number-input/dasar-number-input.spec.ts +21 -0
  54. package/projects/dasar-ui/src/lib/components/dasar-number-input/dasar-number-input.ts +337 -0
  55. package/projects/dasar-ui/src/lib/components/dasar-pagination/dasar-pagination.html +98 -0
  56. package/projects/dasar-ui/src/lib/components/dasar-pagination/dasar-pagination.scss +51 -0
  57. package/projects/dasar-ui/src/lib/components/dasar-pagination/dasar-pagination.spec.ts +21 -0
  58. package/projects/dasar-ui/src/lib/components/dasar-pagination/dasar-pagination.ts +99 -0
  59. package/projects/dasar-ui/src/lib/components/dasar-pin/dasar-pin.css +0 -0
  60. package/projects/dasar-ui/src/lib/components/dasar-pin/dasar-pin.html +1 -0
  61. package/projects/dasar-ui/src/lib/components/dasar-pin/dasar-pin.spec.ts +21 -0
  62. package/projects/dasar-ui/src/lib/components/dasar-pin/dasar-pin.ts +9 -0
  63. package/projects/dasar-ui/src/lib/components/dasar-pivot-table/dasar-pivot-table.html +163 -0
  64. package/projects/dasar-ui/src/lib/components/dasar-pivot-table/dasar-pivot-table.scss +283 -0
  65. package/projects/dasar-ui/src/lib/components/dasar-pivot-table/dasar-pivot-table.ts +230 -0
  66. package/projects/dasar-ui/src/lib/components/dasar-radio/dasar-radio.css +0 -0
  67. package/projects/dasar-ui/src/lib/components/dasar-radio/dasar-radio.html +1 -0
  68. package/projects/dasar-ui/src/lib/components/dasar-radio/dasar-radio.spec.ts +21 -0
  69. package/projects/dasar-ui/src/lib/components/dasar-radio/dasar-radio.ts +9 -0
  70. package/projects/dasar-ui/src/lib/components/dasar-select/dasar-select.html +185 -0
  71. package/projects/dasar-ui/src/lib/components/dasar-select/dasar-select.scss +347 -0
  72. package/projects/dasar-ui/src/lib/components/dasar-select/dasar-select.spec.ts +21 -0
  73. package/projects/dasar-ui/src/lib/components/dasar-select/dasar-select.ts +497 -0
  74. package/projects/dasar-ui/src/lib/components/dasar-slider/dasar-slider.css +0 -0
  75. package/projects/dasar-ui/src/lib/components/dasar-slider/dasar-slider.html +1 -0
  76. package/projects/dasar-ui/src/lib/components/dasar-slider/dasar-slider.spec.ts +21 -0
  77. package/projects/dasar-ui/src/lib/components/dasar-slider/dasar-slider.ts +9 -0
  78. package/projects/dasar-ui/src/lib/components/dasar-table/dasar-table.html +162 -0
  79. package/projects/dasar-ui/src/lib/components/dasar-table/dasar-table.scss +283 -0
  80. package/projects/dasar-ui/src/lib/components/dasar-table/dasar-table.spec.ts +21 -0
  81. package/projects/dasar-ui/src/lib/components/dasar-table/dasar-table.ts +380 -0
  82. package/projects/dasar-ui/src/lib/components/dasar-tabs/dasar-tabs.html +41 -0
  83. package/projects/dasar-ui/src/lib/components/dasar-tabs/dasar-tabs.scss +126 -0
  84. package/projects/dasar-ui/src/lib/components/dasar-tabs/dasar-tabs.spec.ts +21 -0
  85. package/projects/dasar-ui/src/lib/components/dasar-tabs/dasar-tabs.ts +72 -0
  86. package/projects/dasar-ui/src/lib/components/dasar-textarea/dasar-textarea.html +43 -0
  87. package/projects/dasar-ui/src/lib/components/dasar-textarea/dasar-textarea.scss +189 -0
  88. package/projects/dasar-ui/src/lib/components/dasar-textarea/dasar-textarea.spec.ts +21 -0
  89. package/projects/dasar-ui/src/lib/components/dasar-textarea/dasar-textarea.ts +139 -0
  90. package/projects/dasar-ui/src/lib/components/dasar-theme-provider/dasar-theme-provider.ts +286 -0
  91. package/projects/dasar-ui/src/lib/components/dasar-toast/dasar-toast.css +0 -0
  92. package/projects/dasar-ui/src/lib/components/dasar-toast/dasar-toast.html +1 -0
  93. package/projects/dasar-ui/src/lib/components/dasar-toast/dasar-toast.spec.ts +21 -0
  94. package/projects/dasar-ui/src/lib/components/dasar-toast/dasar-toast.ts +9 -0
  95. package/projects/dasar-ui/src/lib/components/dasar-toggle/dasar-toggle.css +0 -0
  96. package/projects/dasar-ui/src/lib/components/dasar-toggle/dasar-toggle.html +1 -0
  97. package/projects/dasar-ui/src/lib/components/dasar-toggle/dasar-toggle.spec.ts +21 -0
  98. package/projects/dasar-ui/src/lib/components/dasar-toggle/dasar-toggle.ts +9 -0
  99. package/projects/dasar-ui/src/lib/components/dasar-tooltip/dasar-tooltip.css +0 -0
  100. package/projects/dasar-ui/src/lib/components/dasar-tooltip/dasar-tooltip.html +1 -0
  101. package/projects/dasar-ui/src/lib/components/dasar-tooltip/dasar-tooltip.spec.ts +21 -0
  102. package/projects/dasar-ui/src/lib/components/dasar-tooltip/dasar-tooltip.ts +9 -0
  103. package/projects/dasar-ui/src/lib/models/theme.model.ts +643 -0
  104. package/projects/dasar-ui/src/lib/models/type.model.ts +11 -0
  105. package/projects/dasar-ui/src/lib/services/theme.service.ts +643 -0
  106. package/projects/dasar-ui/src/lib/styles/theme.scss +239 -0
  107. package/projects/dasar-ui/src/lib/styles/theme.ts +70 -0
  108. package/projects/dasar-ui/src/lib/utils/common.ts +175 -0
  109. package/projects/dasar-ui/src/public-api.ts +23 -0
  110. package/projects/dasar-ui/tsconfig.lib.json +21 -0
  111. package/projects/dasar-ui/tsconfig.lib.prod.json +11 -0
  112. package/projects/dasar-ui/tsconfig.spec.json +11 -0
  113. package/tsconfig.json +37 -0
@@ -0,0 +1,352 @@
1
+ @use '../../styles/theme.scss' as *;
2
+
3
+ .dasar-button {
4
+ display: inline-flex;
5
+ width: fit-content;
6
+
7
+ &.full-width {
8
+ width: 100%;
9
+
10
+ .dasar-button-native {
11
+ width: 100%;
12
+ }
13
+ }
14
+ }
15
+
16
+ .dasar-button-native {
17
+ font-weight: var(--btn-font-weight, var(--font-weight-medium));
18
+ gap: var(--btn-gap, var(--space-base));
19
+ border: 1px solid transparent;
20
+ justify-content: center;
21
+ box-sizing: border-box;
22
+ font-family: inherit;
23
+ display: inline-flex;
24
+ align-items: center;
25
+ white-space: nowrap;
26
+ overflow: hidden;
27
+ cursor: pointer;
28
+ width: auto;
29
+
30
+ &.size-xs {
31
+ padding: 0 var(--btn-padding-horizontal-xs, var(--space-base));
32
+ height: var(--btn-height-xs, var(--space-6));
33
+ font-size: var(--font-size-xs);
34
+ }
35
+
36
+ &.size-sm {
37
+ padding: 0 var(--btn-padding-horizontal-sm, var(--space-3));
38
+ height: var(--btn-height-sm, var(--space-8));
39
+ font-size: var(--font-size-sm);
40
+ }
41
+
42
+ &.size-md {
43
+ padding: 0 var(--btn-padding-horizontal-md, var(--space-4));
44
+ height: var(--btn-height-md, var(--space-10));
45
+ font-size: var(--font-size-base);
46
+ }
47
+
48
+ &.size-lg {
49
+ padding: 0 var(--btn-padding-horizontal-lg, var(--space-5));
50
+ height: var(--btn-height-lg, var(--space-12));
51
+ font-size: var(--font-size-lg);
52
+ }
53
+
54
+ &.size-xl {
55
+ padding: 0 var(--btn-padding-horizontal-xl, var(--space-6));
56
+ height: var(--btn-height-xl, var(--space-16));
57
+ font-size: var(--font-size-xl);
58
+ }
59
+
60
+ &.icon-only {
61
+ padding: 0;
62
+ &.size-xs {
63
+ width: var(--btn-icon-size-xs, var(--space-6));
64
+ }
65
+ &.size-sm {
66
+ width: var(--btn-icon-size-sm, var(--space-8));
67
+ }
68
+ &.size-md {
69
+ width: var(--btn-icon-size-md, var(--space-10));
70
+ }
71
+ &.size-lg {
72
+ width: var(--btn-icon-size-lg, var(--space-12));
73
+ }
74
+ &.size-xl {
75
+ width: var(--btn-icon-size-xl, var(--space-16));
76
+ }
77
+ }
78
+
79
+ &.radius-none {
80
+ border-radius: var(--btn-radius-none, var(--radius-none));
81
+ }
82
+
83
+ &.radius-xs {
84
+ border-radius: var(--btn-radius-xs, var(--radius-xs));
85
+ }
86
+
87
+ &.radius-sm {
88
+ border-radius: var(--btn-radius-sm, var(--radius-sm));
89
+ }
90
+
91
+ &.radius-md {
92
+ border-radius: var(--btn-radius-md, var(--radius-md));
93
+ }
94
+
95
+ &.radius-lg {
96
+ border-radius: var(--btn-radius-lg, var(--radius-lg));
97
+ }
98
+
99
+ &.radius-xl {
100
+ border-radius: var(--btn-radius-xl, var(--radius-xl));
101
+ }
102
+
103
+ &.radius-full {
104
+ border-radius: var(--btn-radius-full, var(--radius-full));
105
+ }
106
+
107
+ &.primary {
108
+ background-color: var(--btn-primary-bg, var(--theme-primary-color));
109
+ border-color: var(--btn-primary-border, var(--theme-primary-color));
110
+ color: var(--btn-primary-color, var(--theme-text-inverse-color));
111
+
112
+ &:hover:not(:disabled) {
113
+ background-color: var(--btn-primary-hover-bg, var(--theme-primary-hover-color));
114
+ border-color: var(--btn-primary-hover-border, var(--theme-primary-hover-color));
115
+ transition: all 0.2s ease-in-out;
116
+ }
117
+
118
+ &:focus-visible {
119
+ outline: 3px solid var(--btn-primary-focus-ring, var(--theme-primary-surface-color));
120
+ border-color: transparent;
121
+ }
122
+
123
+ &.subtle {
124
+ background-color: var(--btn-primary-subtle-bg, var(--theme-primary-surface-color));
125
+ color: var(--btn-primary-subtle-color, var(--theme-primary-color));
126
+ border-color: transparent;
127
+
128
+ &:hover:not(:disabled) {
129
+ background-color: var(--btn-primary-subtle-hover-bg, var(--theme-primary-color));
130
+ color: var(--btn-primary-subtle-hover-color, var(--theme-text-inverse-color));
131
+ transition: all 0.2s ease-in-out;
132
+ }
133
+ }
134
+
135
+ &.outline {
136
+ border-color: var(--btn-primary-outline-border, var(--theme-primary-color));
137
+ color: var(--btn-primary-outline-color, var(--theme-primary-color));
138
+ background-color: transparent;
139
+
140
+ &:hover:not(:disabled) {
141
+ background-color: var(--btn-primary-outline-hover-bg, var(--theme-primary-surface-color));
142
+ transition: all 0.2s ease-in-out;
143
+ }
144
+ }
145
+ }
146
+
147
+ &.success {
148
+ background-color: var(--btn-success-bg, var(--theme-success-color));
149
+ border-color: var(--btn-success-border, var(--theme-success-color));
150
+ color: var(--btn-success-color, var(--theme-text-inverse-color));
151
+
152
+ &:hover:not(:disabled) {
153
+ transition: all 0.2s ease-in-out;
154
+ filter: brightness(0.9);
155
+ }
156
+
157
+ &:focus-visible {
158
+ outline: 3px solid var(--btn-success-focus-ring, var(--theme-success-surface-color));
159
+ border-color: transparent;
160
+ }
161
+
162
+ &.subtle {
163
+ background-color: var(--btn-success-subtle-bg, var(--theme-success-surface-color));
164
+ color: var(--btn-success-subtle-color, var(--theme-success-color));
165
+ border-color: transparent;
166
+
167
+ &:hover:not(:disabled) {
168
+ background-color: var(--btn-success-subtle-hover-bg, var(--theme-success-color));
169
+ color: var(--btn-success-subtle-hover-color, var(--theme-text-inverse-color));
170
+ transition: all 0.2s ease-in-out;
171
+ }
172
+ }
173
+
174
+ &.outline {
175
+ border-color: var(--btn-success-outline-border, var(--theme-success-color));
176
+ color: var(--btn-success-outline-color, var(--theme-success-color));
177
+ background-color: transparent;
178
+
179
+ &:hover:not(:disabled) {
180
+ background-color: var(--btn-success-outline-hover-bg, var(--theme-success-surface-color));
181
+ transition: all 0.2s ease-in-out;
182
+ }
183
+ }
184
+ }
185
+
186
+ &.warning {
187
+ background-color: var(--btn-warning-bg, var(--theme-warning-color));
188
+ border-color: var(--btn-warning-border, var(--theme-warning-color));
189
+ color: var(--btn-warning-color, var(--theme-text-inverse-color));
190
+
191
+ &:hover:not(:disabled) {
192
+ transition: all 0.2s ease-in-out;
193
+ filter: brightness(0.9);
194
+ }
195
+
196
+ &:focus-visible {
197
+ outline: 3px solid var(--btn-warning-focus-ring, var(--theme-warning-surface-color));
198
+ border-color: transparent;
199
+ }
200
+
201
+ &.subtle {
202
+ background-color: var(--btn-warning-subtle-bg, var(--theme-warning-surface-color));
203
+ color: var(--btn-warning-subtle-color, var(--theme-warning-color));
204
+ border-color: transparent;
205
+
206
+ &:hover:not(:disabled) {
207
+ background-color: var(--btn-warning-subtle-hover-bg, var(--theme-warning-color));
208
+ color: var(--btn-warning-subtle-hover-color, var(--theme-text-inverse-color));
209
+ transition: all 0.2s ease-in-out;
210
+ }
211
+ }
212
+
213
+ &.outline {
214
+ border-color: var(--btn-warning-outline-border, var(--theme-warning-color));
215
+ color: var(--btn-warning-outline-color, var(--theme-warning-color));
216
+ background-color: transparent;
217
+
218
+ &:hover:not(:disabled) {
219
+ background-color: var(--btn-warning-outline-hover-bg, var(--theme-warning-surface-color));
220
+ transition: all 0.2s ease-in-out;
221
+ }
222
+ }
223
+ }
224
+
225
+ &.danger {
226
+ background-color: var(--btn-danger-bg, var(--theme-danger-color));
227
+ border-color: var(--btn-danger-border, var(--theme-danger-color));
228
+ color: var(--btn-danger-color, var(--text-white-color));
229
+
230
+ &:hover:not(:disabled) {
231
+ transition: all 0.2s ease-in-out;
232
+ filter: brightness(0.9);
233
+ }
234
+
235
+ &:focus-visible {
236
+ outline: 3px solid var(--btn-danger-focus-ring, var(--theme-danger-surface-color));
237
+ border-color: transparent;
238
+ }
239
+
240
+ &.subtle {
241
+ background-color: var(--btn-danger-subtle-bg, var(--theme-danger-surface-color));
242
+ color: var(--btn-danger-subtle-color, var(--theme-danger-color));
243
+ border-color: transparent;
244
+
245
+ &:hover:not(:disabled) {
246
+ background-color: var(--btn-danger-subtle-hover-bg, var(--theme-danger-color));
247
+ color: var(--btn-danger-subtle-hover-color, var(--theme-text-inverse-color));
248
+ transition: all 0.2s ease-in-out;
249
+ }
250
+ }
251
+
252
+ &.outline {
253
+ border-color: var(--btn-danger-outline-border, var(--theme-danger-color));
254
+ color: var(--btn-danger-outline-color, var(--theme-danger-color));
255
+ background-color: transparent;
256
+
257
+ &:hover:not(:disabled) {
258
+ background-color: var(--btn-danger-outline-hover-bg, var(--theme-danger-surface-color));
259
+ transition: all 0.2s ease-in-out;
260
+ }
261
+ }
262
+ }
263
+
264
+ &.secondary {
265
+ background-color: var(--btn-secondary-bg, var(--theme-bg-hover-color));
266
+ border-color: var(--btn-secondary-border, var(--theme-border-strong-color));
267
+ color: var(--btn-secondary-color, var(--theme-text-primary-color));
268
+
269
+ &:hover:not(:disabled) {
270
+ background-color: var(--btn-secondary-hover-bg, var(--theme-border-subtle-color));
271
+ transition: all 0.2s ease-in-out;
272
+ }
273
+
274
+ &:focus-visible {
275
+ outline: 3px solid var(--btn-secondary-focus-ring, var(--theme-border-subtle-color));
276
+ }
277
+
278
+ &.subtle {
279
+ background-color: var(--btn-secondary-subtle-bg, var(--theme-bg-surface-color));
280
+ color: var(--btn-secondary-subtle-color, var(--theme-text-secondary-color));
281
+ border-color: transparent;
282
+
283
+ &:hover:not(:disabled) {
284
+ background-color: var(--btn-secondary-subtle-hover-bg, var(--theme-bg-hover-color));
285
+ color: var(--btn-secondary-subtle-hover-color, var(--theme-text-primary-color));
286
+ transition: all 0.2s ease-in-out;
287
+ }
288
+ }
289
+
290
+ &.outline {
291
+ border-color: var(--btn-secondary-outline-border, var(--theme-border-strong-color));
292
+ color: var(--btn-secondary-outline-color, var(--theme-text-primary-color));
293
+ background-color: transparent;
294
+
295
+ &:hover:not(:disabled) {
296
+ background-color: var(--btn-secondary-outline-hover-bg, var(--theme-bg-hover-color));
297
+ transition: all 0.2s ease-in-out;
298
+ }
299
+ }
300
+ }
301
+
302
+ &.ghost {
303
+ color: var(--btn-ghost-color, var(--theme-text-secondary-color));
304
+ background-color: transparent;
305
+ border-color: transparent;
306
+
307
+ &:hover:not(:disabled) {
308
+ background-color: var(--btn-ghost-hover-bg, var(--theme-bg-hover-color));
309
+ color: var(--btn-ghost-hover-color, var(--theme-text-primary-color));
310
+ transition: all 0.2s ease-in-out;
311
+ }
312
+
313
+ &:focus-visible {
314
+ outline: 3px solid var(--btn-ghost-focus-ring, var(--theme-border-subtle-color));
315
+ }
316
+ }
317
+
318
+ &:disabled {
319
+ border-color: var(--btn-disabled-border, var(--theme-border-subtle-color));
320
+ background-color: var(--btn-disabled-bg, var(--theme-bg-hover-color));
321
+ color: var(--btn-disabled-color, var(--theme-text-disabled-color));
322
+ cursor: not-allowed;
323
+ box-shadow: none;
324
+ opacity: 0.7;
325
+ }
326
+
327
+ &:disabled.ghost,
328
+ &:disabled.subtle {
329
+ border-color: transparent !important;
330
+ }
331
+
332
+ &.fluid {
333
+ background-color: transparent !important;
334
+ border-color: transparent !important;
335
+ box-shadow: none !important;
336
+ border-radius: 0 !important;
337
+ color: inherit !important;
338
+ height: auto !important;
339
+ width: 100% !important;
340
+ padding: 0 !important;
341
+
342
+ &:hover,
343
+ &:focus-visible,
344
+ &:active {
345
+ background-color: transparent !important;
346
+ border-color: transparent !important;
347
+ color: inherit !important;
348
+ outline: none !important;
349
+ filter: none !important;
350
+ }
351
+ }
352
+ }
@@ -0,0 +1,21 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { DasarButton } from './dasar-button';
3
+
4
+ describe('DasarButton', () => {
5
+ let component: DasarButton;
6
+ let fixture: ComponentFixture<DasarButton>;
7
+
8
+ beforeEach(async () => {
9
+ await TestBed.configureTestingModule({
10
+ imports: [DasarButton],
11
+ }).compileComponents();
12
+
13
+ fixture = TestBed.createComponent(DasarButton);
14
+ component = fixture.componentInstance;
15
+ await fixture.whenStable();
16
+ });
17
+
18
+ it('should create', () => {
19
+ expect(component).toBeTruthy();
20
+ });
21
+ });
@@ -0,0 +1,154 @@
1
+ import {
2
+ ViewEncapsulation,
3
+ booleanAttribute,
4
+ HostBinding,
5
+ Component,
6
+ inject,
7
+ Input,
8
+ } from '@angular/core';
9
+ import { CommonModule } from '@angular/common';
10
+
11
+ import { DASAR_THEME_PROVIDER } from '../dasar-theme-provider/dasar-theme-provider';
12
+ import { ClassType, ScaleAttributeType, StyleType } from '../../models/type.model';
13
+ import { parseClassesToArray, resolveThemeDefault } from '../../utils/common';
14
+ import { DasarThemeService } from '../../services/theme.service';
15
+
16
+ export type DasarButtonSizeType = Extract<ScaleAttributeType, 'xs' | 'sm' | 'md' | 'lg' | 'xl'>;
17
+ export type DasarButtonVariantType =
18
+ 'primary' | 'success' | 'warning' | 'danger' | 'secondary' | 'ghost';
19
+ export type DasarButtonAppearanceType = 'solid' | 'subtle' | 'outline';
20
+ export type DasarButtonType = 'button' | 'submit' | 'reset';
21
+ export type DasarButtonRadiusType = ScaleAttributeType;
22
+
23
+ export interface DasarButtonConfig {
24
+ appearance?: DasarButtonAppearanceType;
25
+ variant?: DasarButtonVariantType;
26
+ radius?: DasarButtonRadiusType;
27
+ size?: DasarButtonSizeType;
28
+ buttonStyle?: StyleType;
29
+ buttonClass?: ClassType;
30
+ type?: DasarButtonType;
31
+ fullWidth?: boolean;
32
+ iconOnly?: boolean;
33
+ disabled?: boolean;
34
+ fluid?: boolean;
35
+ }
36
+
37
+ @Component({
38
+ encapsulation: ViewEncapsulation.None,
39
+ styleUrls: ['./dasar-button.scss'],
40
+ templateUrl: './dasar-button.html',
41
+ selector: 'dasar-button',
42
+ imports: [CommonModule],
43
+ })
44
+ export class DasarButton {
45
+ private themeProvider = inject(DASAR_THEME_PROVIDER, { optional: true });
46
+ private themeService = inject(DasarThemeService, { optional: true });
47
+
48
+ @Input() appearance = resolveThemeDefault(
49
+ 'button',
50
+ 'appearance',
51
+ 'solid',
52
+ this.themeProvider,
53
+ this.themeService,
54
+ );
55
+ @Input() variant = resolveThemeDefault(
56
+ 'button',
57
+ 'variant',
58
+ 'primary',
59
+ this.themeProvider,
60
+ this.themeService,
61
+ );
62
+ @Input() radius = resolveThemeDefault(
63
+ 'button',
64
+ 'radius',
65
+ 'md',
66
+ this.themeProvider,
67
+ this.themeService,
68
+ );
69
+ @Input() size = resolveThemeDefault(
70
+ 'button',
71
+ 'size',
72
+ 'md',
73
+ this.themeProvider,
74
+ this.themeService,
75
+ );
76
+ @Input({ alias: 'button-style' }) buttonStyle = resolveThemeDefault(
77
+ 'button',
78
+ 'buttonStyle',
79
+ null,
80
+ this.themeProvider,
81
+ this.themeService,
82
+ );
83
+ @Input({ alias: 'button-class' }) buttonClass = resolveThemeDefault(
84
+ 'button',
85
+ 'buttonClass',
86
+ null,
87
+ this.themeProvider,
88
+ this.themeService,
89
+ );
90
+ @Input() type = resolveThemeDefault(
91
+ 'button',
92
+ 'type',
93
+ 'button',
94
+ this.themeProvider,
95
+ this.themeService,
96
+ );
97
+ @Input({ transform: booleanAttribute }) disabled = resolveThemeDefault(
98
+ 'button',
99
+ 'iconOnly',
100
+ false,
101
+ this.themeProvider,
102
+ this.themeService,
103
+ );
104
+ @Input({ transform: booleanAttribute }) fluid = resolveThemeDefault(
105
+ 'button',
106
+ 'fluid',
107
+ false,
108
+ this.themeProvider,
109
+ this.themeService,
110
+ );
111
+ @Input({ alias: 'full-width', transform: booleanAttribute }) fullWidth = resolveThemeDefault(
112
+ 'button',
113
+ 'fullWidth',
114
+ false,
115
+ this.themeProvider,
116
+ this.themeService,
117
+ );
118
+ @Input({ alias: 'icon-only', transform: booleanAttribute }) iconOnly = resolveThemeDefault(
119
+ 'button',
120
+ 'iconOnly',
121
+ false,
122
+ this.themeProvider,
123
+ this.themeService,
124
+ );
125
+
126
+ @HostBinding('class')
127
+ get hostClasses(): string {
128
+ const classes = ['dasar-button'];
129
+ if (this.fullWidth) classes.push('full-width');
130
+ if (this.disabled) classes.push('disabled');
131
+ return classes.join(' ');
132
+ }
133
+
134
+ get buttonClasses(): Record<string, boolean> {
135
+ const overrideClass = parseClassesToArray(this.buttonClass);
136
+ const baseClass = {
137
+ [this.appearance]: this.appearance !== 'solid',
138
+ [`radius-${this.radius}`]: !!this.radius,
139
+ [`size-${this.size}`]: true,
140
+ [this.variant]: true,
141
+ 'icon-only': this.iconOnly,
142
+ fluid: this.fluid,
143
+ };
144
+ if (overrideClass && overrideClass?.length > 0) {
145
+ return {
146
+ ...baseClass,
147
+ ...Object.fromEntries(overrideClass.map((name) => [name, true])),
148
+ };
149
+ }
150
+ return baseClass;
151
+ }
152
+ }
153
+
154
+ export const DasarButtonComponent = [DasarButton] as const;
@@ -0,0 +1,69 @@
1
+ @use '../../styles/theme.scss' as *;
2
+
3
+ :host {
4
+ display: inline-flex;
5
+ vertical-align: middle;
6
+
7
+ &.vertical {
8
+ flex-direction: column;
9
+ }
10
+
11
+ &.attached {
12
+ &.horizontal {
13
+ dasar-button {
14
+ &:not(:first-child) {
15
+ margin-left: -1px;
16
+ .dasar-button-native {
17
+ border-top-left-radius: 0 !important;
18
+ border-bottom-left-radius: 0 !important;
19
+ }
20
+ }
21
+
22
+ &:not(:last-child) {
23
+ .dasar-button-native {
24
+ border-top-right-radius: 0 !important;
25
+ border-bottom-right-radius: 0 !important;
26
+ }
27
+ }
28
+
29
+ &:hover,
30
+ &:focus-within {
31
+ position: relative;
32
+ z-index: 2;
33
+ }
34
+ }
35
+ }
36
+
37
+ &.vertical {
38
+ dasar-button {
39
+ &:not(:first-child) {
40
+ margin-top: -1px;
41
+ .dasar-button-native {
42
+ border-top-left-radius: 0 !important;
43
+ border-top-right-radius: 0 !important;
44
+ }
45
+ }
46
+
47
+ &:not(:last-child) {
48
+ .dasar-button-native {
49
+ border-bottom-left-radius: 0 !important;
50
+ border-bottom-right-radius: 0 !important;
51
+ }
52
+ }
53
+
54
+ &:hover,
55
+ &:focus-within {
56
+ position: relative;
57
+ z-index: 2;
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ &:not(.attached) {
64
+ gap: 8px;
65
+ &.vertical {
66
+ flex-direction: column;
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,21 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { DasarButtonGroup } from './dasar-button-group';
3
+
4
+ describe('DasarButtonGroup', () => {
5
+ let component: DasarButtonGroup;
6
+ let fixture: ComponentFixture<DasarButtonGroup>;
7
+
8
+ beforeEach(async () => {
9
+ await TestBed.configureTestingModule({
10
+ imports: [DasarButtonGroup],
11
+ }).compileComponents();
12
+
13
+ fixture = TestBed.createComponent(DasarButtonGroup);
14
+ component = fixture.componentInstance;
15
+ await fixture.whenStable();
16
+ });
17
+
18
+ it('should create', () => {
19
+ expect(component).toBeTruthy();
20
+ });
21
+ });
@@ -0,0 +1,30 @@
1
+ import { booleanAttribute, Component, Input, ViewEncapsulation } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+
4
+ export type DasarButtonGroupOrientationType = 'horizontal' | 'vertical';
5
+
6
+ @Component({
7
+ styleUrls: ['./dasar-button-group.scss'],
8
+ templateUrl: './dasar-button-group.html',
9
+ encapsulation: ViewEncapsulation.None,
10
+ selector: 'dasar-button-group',
11
+ imports: [CommonModule],
12
+ standalone: true,
13
+ // host: {
14
+
15
+ // }
16
+ // //dasar-button-native-group
17
+ })
18
+ export class DasarButtonGroup {
19
+ @Input() orientation: DasarButtonGroupOrientationType = 'horizontal';
20
+ @Input({ transform: booleanAttribute }) attached = true;
21
+
22
+ get buttonClasses(): Record<string, boolean> {
23
+ return {
24
+ 'dasar-button-native-group': true,
25
+ horizontal: this.orientation === "vertical",
26
+ vertical: this.orientation === "vertical",
27
+ 'attached': this.attached,
28
+ };
29
+ }
30
+ }