@skalfa/skalfa-app 1.0.2 → 1.0.5

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 (99) hide show
  1. package/.env.example +8 -16
  2. package/app/auth/edit/page.tsx +1 -1
  3. package/app/auth/login/page.tsx +1 -1
  4. package/app/auth/me/page.tsx +1 -1
  5. package/app/auth/register/page.tsx +1 -1
  6. package/app/auth/verify/page.tsx +1 -1
  7. package/app/dashboard/layout.tsx +2 -2
  8. package/app/dashboard/page.tsx +1 -1
  9. package/app/index.ts +1 -0
  10. package/app/layout.tsx +2 -4
  11. package/app/page.tsx +2 -2
  12. package/bun.lock +39 -24
  13. package/components/index.ts +1 -3
  14. package/package.json +8 -7
  15. package/styles/components.css +1392 -0
  16. package/styles/globals.css +40 -175
  17. package/styles/utilities.css +37 -0
  18. package/tsconfig.json +4 -2
  19. package/utils/commands/skalfa.ts +3 -0
  20. package/blueprints/starter.blueprint.json +0 -103
  21. package/components/base.components/accordion/Accordion.component.tsx +0 -82
  22. package/components/base.components/breadcrumb/Breadcrumb.component.tsx +0 -80
  23. package/components/base.components/button/Button.component.tsx +0 -91
  24. package/components/base.components/button/IconButton.component.tsx +0 -88
  25. package/components/base.components/button/button.decorate.ts +0 -82
  26. package/components/base.components/card/AlertCard.component.tsx +0 -69
  27. package/components/base.components/card/Card.component.tsx +0 -25
  28. package/components/base.components/card/DashboardCard.component.tsx +0 -44
  29. package/components/base.components/card/GalleryCard.component.tsx +0 -50
  30. package/components/base.components/card/ProductCard.component.tsx +0 -65
  31. package/components/base.components/card/ProfileCard.component.tsx +0 -71
  32. package/components/base.components/carousel/Carousel.component.tsx +0 -113
  33. package/components/base.components/chip/Chip.component.tsx +0 -39
  34. package/components/base.components/document/DocumentViewer.component.tsx +0 -164
  35. package/components/base.components/document/ExportExcel.component.tsx +0 -340
  36. package/components/base.components/document/ImportExcel.component.tsx +0 -315
  37. package/components/base.components/document/PrintTable.component.tsx +0 -204
  38. package/components/base.components/document/RenderPDF.component.tsx +0 -416
  39. package/components/base.components/index.ts +0 -85
  40. package/components/base.components/input/Checkbox.component.tsx +0 -109
  41. package/components/base.components/input/Input.component.tsx +0 -332
  42. package/components/base.components/input/InputCheckbox.component.tsx +0 -174
  43. package/components/base.components/input/InputCurrency.component.tsx +0 -163
  44. package/components/base.components/input/InputDate.component.tsx +0 -352
  45. package/components/base.components/input/InputDatetime.component.tsx +0 -260
  46. package/components/base.components/input/InputDocument.component.tsx +0 -352
  47. package/components/base.components/input/InputImage.component.tsx +0 -533
  48. package/components/base.components/input/InputMap.component.tsx +0 -318
  49. package/components/base.components/input/InputNumber.component.tsx +0 -192
  50. package/components/base.components/input/InputOtp.component.tsx +0 -169
  51. package/components/base.components/input/InputPassword.component.tsx +0 -236
  52. package/components/base.components/input/InputRadio.component.tsx +0 -175
  53. package/components/base.components/input/InputTime.component.tsx +0 -276
  54. package/components/base.components/input/InputValues.component.tsx +0 -68
  55. package/components/base.components/input/Radio.component.tsx +0 -102
  56. package/components/base.components/input/Select.component.tsx +0 -541
  57. package/components/base.components/modal/BottomSheet.component.tsx +0 -246
  58. package/components/base.components/modal/FloatingPage.component.tsx +0 -104
  59. package/components/base.components/modal/Modal.component.tsx +0 -96
  60. package/components/base.components/modal/ModalConfirm.component.tsx +0 -218
  61. package/components/base.components/modal/Toast.component.tsx +0 -126
  62. package/components/base.components/nav/Bottombar.component.tsx +0 -116
  63. package/components/base.components/nav/Footer.component.tsx +0 -144
  64. package/components/base.components/nav/Headbar.component.tsx +0 -104
  65. package/components/base.components/nav/Navbar.component.tsx +0 -100
  66. package/components/base.components/nav/Sidebar.component.tsx +0 -301
  67. package/components/base.components/nav/Tabbar.component.tsx +0 -60
  68. package/components/base.components/nav/Wizard.component.tsx +0 -73
  69. package/components/base.components/supervision/FormSupervision.component.tsx +0 -434
  70. package/components/base.components/supervision/TableSupervision.component.tsx +0 -697
  71. package/components/base.components/table/ControlBar.component.tsx +0 -497
  72. package/components/base.components/table/FilterComponent.tsx +0 -518
  73. package/components/base.components/table/Pagination.component.tsx +0 -159
  74. package/components/base.components/table/Table.component.tsx +0 -469
  75. package/components/base.components/typography/TypographyArticle.component.tsx +0 -26
  76. package/components/base.components/typography/TypographyColumn.component.tsx +0 -20
  77. package/components/base.components/typography/TypographyContent.component.tsx +0 -20
  78. package/components/base.components/typography/TypographyTips.component.tsx +0 -20
  79. package/components/base.components/wrap/Draggable.component.tsx +0 -303
  80. package/components/base.components/wrap/IDBProvider.tsx +0 -12
  81. package/components/base.components/wrap/Image.component.tsx +0 -10
  82. package/components/base.components/wrap/OutsideClick.component.tsx +0 -48
  83. package/components/base.components/wrap/ScrollContainer.component.tsx +0 -104
  84. package/components/base.components/wrap/ShortcutProvider.tsx +0 -57
  85. package/components/base.components/wrap/Swipe.component.tsx +0 -93
  86. package/components/construct.components/example.tsx +0 -1
  87. package/components/construct.components/index.ts +0 -5
  88. package/components/structure.components/example.tsx +0 -1
  89. package/components/structure.components/index.ts +0 -5
  90. package/langs/index.ts +0 -1
  91. package/langs/validation.langs.ts +0 -17
  92. package/schema/idb/app.schema.ts +0 -9
  93. package/schema/index.ts +0 -5
  94. package/utils/commands/barrels.ts +0 -28
  95. package/utils/commands/blueprint.ts +0 -421
  96. package/utils/commands/light.ts +0 -21
  97. package/utils/commands/logger.ts +0 -42
  98. package/utils/commands/stubs/table-blueprint.stub +0 -13
  99. package/utils/commands/use-pdf.ts +0 -29
@@ -0,0 +1,1392 @@
1
+ @layer components {
2
+ /* ============================ */
3
+ /* ## Button */
4
+ /* ============================ */
5
+ .button {
6
+ @apply whitespace-nowrap cursor-pointer disabled:!text-disable disabled:!bg-light-disable;
7
+ filter: brightness(0.94);
8
+ }
9
+
10
+ .button:disabled {
11
+ cursor: default;
12
+ pointer-events: none;
13
+ }
14
+
15
+ .button:hover {
16
+ filter: brightness(1);
17
+ }
18
+
19
+ .button:active {
20
+ transform: scale(1);
21
+ filter: brightness(0.9);
22
+ box-shadow: inset 0 0 5px 0 rgba(0, 0, 0, 0.25);
23
+ }
24
+
25
+ .button-loading {
26
+ border-radius: 50%;
27
+ display: inline-block;
28
+ border-top: 2.5px solid;
29
+ border-left: 2.5px solid;
30
+ border-right: 2.5px solid transparent;
31
+ box-sizing: border-box;
32
+ animation: rotation 1s linear infinite;
33
+ }
34
+
35
+ @keyframes rotation {
36
+ 0% {
37
+ transform: rotate(0deg);
38
+ }
39
+ 100% {
40
+ transform: rotate(360deg);
41
+ }
42
+ }
43
+
44
+ /* ## Button variant */
45
+ .button-solid-primary { @apply bg-primary text-white; }
46
+ .button-solid-secondary { @apply bg-secondary text-white; }
47
+ .button-solid-warning { @apply bg-warning text-white; }
48
+ .button-solid-danger { @apply bg-danger text-white; }
49
+ .button-solid-success { @apply bg-success text-white; }
50
+
51
+ .button-outline-primary { @apply border text-primary; }
52
+ .button-outline-secondary { @apply border text-secondary; }
53
+ .button-outline-warning { @apply border text-warning; }
54
+ .button-outline-danger { @apply border text-danger; }
55
+ .button-outline-success { @apply border text-success; }
56
+
57
+ .button-light-primary { @apply bg-light-primary text-primary; }
58
+ .button-light-secondary { @apply bg-light-secondary text-secondary; }
59
+ .button-light-warning { @apply bg-light-warning text-warning; }
60
+ .button-light-danger { @apply bg-light-danger text-danger; }
61
+ .button-light-success { @apply bg-light-success text-success; }
62
+
63
+ .button-simple-primary { @apply text-primary; }
64
+ .button-simple-secondary { @apply text-secondary; }
65
+ .button-simple-warning { @apply text-warning; }
66
+ .button-simple-danger { @apply text-danger; }
67
+ .button-simple-success { @apply text-success; }
68
+
69
+ /* ## Button size */
70
+ .button-lg { @apply px-14 py-3 flex items-center gap-3 rounded-sm; }
71
+ .button-md { @apply px-8 py-2 flex items-center gap-2 rounded-sm; }
72
+ .button-sm { @apply px-6 py-2 text-xs flex items-center gap-2 rounded-sm; }
73
+ .button-xs { @apply px-3 py-1 text-xs flex items-center gap-1.5 rounded-xs; }
74
+
75
+ /* ## Icon button size */
76
+ .icon-button-lg { @apply w-10 h-10 flex items-center justify-center rounded-sm; }
77
+ .icon-button-md { @apply w-8 h-8 flex items-center justify-center rounded-sm; }
78
+ .icon-button-sm { @apply w-7 h-7 text-xs flex items-center justify-center rounded-sm; }
79
+ .icon-button-xs { @apply w-6 h-6 text-xs flex items-center justify-center rounded-xs; }
80
+
81
+ /* ## Button loading size */
82
+ .button-lg .button-loading, .icon-button-lg .button-loading { @apply w-5 h-5; }
83
+ .button-md .button-loading, .icon-button-md .button-loading { @apply w-4 h-4; }
84
+ .button-sm .button-loading, .icon-button-sm .button-loading { @apply w-3 h-3; }
85
+ .button-xs .button-loading, .icon-button-xs .button-loading { @apply w-3 h-3; }
86
+
87
+ /* ## Button icon size */
88
+ .button-lg .button-icon, .icon-button-lg .button-icon { @apply text-xl mb-0.5; }
89
+ .button-md .button-icon, .icon-button-md .button-icon { @apply text-base mb-0.5; }
90
+ .button-sm .button-icon, .icon-button-sm .button-icon { @apply text-sm mb-0.5; }
91
+ .button-xs .button-icon, .icon-button-xs .button-icon { @apply text-xs mb-0; }
92
+
93
+
94
+ /* ============================ */
95
+ /* ## Input */
96
+ /* ============================ */
97
+ .input {
98
+ @apply px-4 py-2 rounded-[6px] text-foreground bg-background w-full transition duration-150 ease-in-out focus:outline-none border placeholder:font-normal placeholder:text-light-foreground focus:!border-primary disabled:opacity-60;
99
+ }
100
+
101
+ .input-file {
102
+ @apply file:-mx-3 file:-my-1 file:cursor-pointer file:overflow-hidden file:rounded-md file:border-0 file:border-solid file:border-inherit file:[margin-inline-end:0.75rem] file:bg-slate-200 file:px-3 file:py-1 file:text-slate-500;
103
+ }
104
+
105
+ .input-label {
106
+ @apply select-none text-sm text-foreground;
107
+ }
108
+
109
+ .input-error {
110
+ @apply !border-light-danger bg-light-danger/20;
111
+ }
112
+
113
+ .input-icon {
114
+ @apply absolute top-1/2 -translate-y-1/2 text-light-foreground;
115
+ }
116
+
117
+ .input-error-message {
118
+ @apply text-xs text-danger;
119
+ }
120
+
121
+ .input-tip {
122
+ @apply text-xs text-light-foreground;
123
+ }
124
+
125
+ .input-suggest-container {
126
+ @apply py-2 rounded-lg absolute left-0 w-full bg-background shadow z-30 overflow-hidden ease-in-out max-h-[200px] overflow-y-auto;
127
+ }
128
+
129
+ .input-suggest {
130
+ @apply py-1 px-4 cursor-pointer w-full list-none text-foreground hover:text-primary;
131
+ }
132
+
133
+ .input-values-container {
134
+ @apply flex gap-2 flex-nowrap w-max;
135
+ }
136
+
137
+ .input-values-item {
138
+ @apply flex text-sm px-1 pl-2 justify-between bg-white text-foreground border items-center rounded-[4px];
139
+ }
140
+
141
+ .input-values-delete {
142
+ @apply text-xs cursor-pointer text-light-foreground pl-2 pr-1 py-1 hover:text-danger;
143
+ }
144
+
145
+ .input-values-dropdown {
146
+ @apply p-2 rounded-sm absolute left-0 w-full bg-background border-b border-x border-stroke z-30 overflow-hidden ease-in-out max-h-[200px] overflow-y-auto flex gap-2 flex-wrap;
147
+ }
148
+
149
+ .input-values-preview {
150
+ @apply absolute top-1/2 -translate-y-1/2 overflow-x-hidden py-1.5 w-max;
151
+ }
152
+
153
+ /* ## Extra Input states & layout */
154
+ .input-with-left-icon {
155
+ @apply pl-12;
156
+ }
157
+ .input-with-right-icon {
158
+ @apply pr-12;
159
+ }
160
+
161
+ .input-label-disabled {
162
+ @apply opacity-50;
163
+ }
164
+
165
+ .input-label-focus {
166
+ @apply text-primary;
167
+ }
168
+
169
+ .input-label-error {
170
+ @apply text-danger;
171
+ }
172
+
173
+ .input-tip-disabled {
174
+ @apply opacity-60;
175
+ }
176
+
177
+ .input-icon-left {
178
+ @apply left-4;
179
+ }
180
+ .input-icon-right {
181
+ @apply right-4;
182
+ }
183
+ .input-icon-disabled {
184
+ @apply opacity-60;
185
+ }
186
+ .input-icon-focus {
187
+ @apply text-primary;
188
+ }
189
+
190
+ .input-suggest-container {
191
+ @apply py-2 rounded-lg absolute left-0 w-full bg-background shadow z-30 overflow-hidden ease-in-out max-h-[200px] overflow-y-auto transition-all duration-150 origin-top;
192
+ @apply opacity-0 scale-y-0 -translate-y-1/2;
193
+ }
194
+ .input-suggest-container-active {
195
+ @apply opacity-100 scale-y-100 -translate-y-0;
196
+ }
197
+
198
+ .input-suggest-active {
199
+ @apply bg-light-primary text-primary;
200
+ }
201
+
202
+ .input-suggest {
203
+ @apply py-1 px-4 cursor-pointer w-full list-none text-foreground hover:text-primary hover:bg-light-primary;
204
+ }
205
+
206
+ /* ## Select specific layout */
207
+ .select-multiple-values {
208
+ @apply absolute top-1/2 -translate-y-1/2 overflow-x-auto py-1.5;
209
+ }
210
+ .select-multiple-values-left-icon {
211
+ @apply ml-[2.5rem];
212
+ }
213
+ .select-multiple-values-no-icon {
214
+ @apply ml-2;
215
+ }
216
+ .select-icon-dropdown {
217
+ @apply cursor-pointer hover:text-primary;
218
+ }
219
+ .select-suggest-check {
220
+ @apply mr-2 text-sm;
221
+ }
222
+
223
+ /* ## Input icon clear */
224
+ .input-icon-clear {
225
+ @apply right-12 cursor-pointer hover:text-danger;
226
+ }
227
+
228
+ /* ## Base input container */
229
+ .input-container {
230
+ @apply relative flex flex-col gap-y-0.5;
231
+ }
232
+
233
+ /* ## Input OTP */
234
+ .input-otp-box {
235
+ @apply pb-1;
236
+ }
237
+ .input-otp-box-focus {
238
+ @apply !border-primary;
239
+ }
240
+ .input-otp-digits-container {
241
+ @apply flex gap-2 justify-between;
242
+ }
243
+ .input-otp-cell {
244
+ @apply w-8 h-full pb-1 text-center border-b outline-none border-foreground focus:!border-primary placeholder:text-light-foreground;
245
+ }
246
+
247
+ /* ## Input Password Strength */
248
+ .password-strength-bar {
249
+ @apply h-1 rounded transition-all duration-300 w-1/3;
250
+ }
251
+ .password-strength-bar-weak {
252
+ @apply bg-danger;
253
+ }
254
+ .password-strength-bar-strong {
255
+ @apply bg-warning;
256
+ }
257
+ .password-strength-bar-excellent {
258
+ @apply bg-success;
259
+ }
260
+ .password-strength-bar-empty {
261
+ @apply bg-background;
262
+ }
263
+
264
+ .password-strength-text {
265
+ @apply text-[10px] font-medium;
266
+ }
267
+ .password-strength-text-weak {
268
+ @apply text-danger;
269
+ }
270
+ .password-strength-text-strong {
271
+ @apply text-warning;
272
+ }
273
+ .password-strength-text-excellent {
274
+ @apply text-success;
275
+ }
276
+
277
+ .input-password-confirm-wrapper {
278
+ @apply mt-4;
279
+ }
280
+
281
+ /* ## Input Number Sort Icons */
282
+ .input-number-sort-container {
283
+ @apply flex flex-col;
284
+ }
285
+ .input-number-sort-up {
286
+ @apply text-light-foreground hover:text-primary -mb-1;
287
+ }
288
+ .input-number-sort-down {
289
+ @apply text-light-foreground hover:text-primary -mt-1;
290
+ }
291
+
292
+ /* ##Input Date & Time Popovers */
293
+ .input-date-picker-popover {
294
+ @apply w-max h-72 bg-background border border-stroke p-2 rounded-[6px] absolute top-full right-0 mt-1 z-50;
295
+ }
296
+ .input-datetime-picker-popover {
297
+ @apply absolute z-50 top-full right-0 mt-1 w-max bg-background border border-stroke rounded-[6px] p-2 shadow min-w-[350px];
298
+ }
299
+ .input-time-picker-popover {
300
+ @apply absolute z-50 top-full right-0 mt-1 w-max bg-background border border-stroke rounded-[6px] p-2 shadow min-w-[300px];
301
+ }
302
+
303
+ /* ## Input Map */
304
+ .input-map-suggest-container {
305
+ @apply absolute top-full left-0 mt-2 w-full z-50 bg-background border border-stroke rounded-md overflow-hidden shadow-lg;
306
+ }
307
+ .input-map-badge-left {
308
+ @apply absolute top-3 left-3 bg-background px-3 py-2 rounded-lg shadow;
309
+ }
310
+ .input-map-badge-right {
311
+ @apply absolute top-3 right-3 bg-background p-3 rounded-lg cursor-pointer shadow;
312
+ }
313
+ .input-map-marker {
314
+ @apply text-3xl text-primary drop-shadow-md transition-transform;
315
+ }
316
+ .input-map-marker-drag {
317
+ @apply scale-125 -translate-y-2;
318
+ }
319
+
320
+ /* ## Input Image */
321
+ .input-image-dropzone {
322
+ @apply border-2 border-dashed rounded-xl p-2 w-full bg-background cursor-pointer overflow-hidden border-stroke;
323
+ }
324
+ .input-image-dropzone-drag {
325
+ @apply border-primary;
326
+ }
327
+ .input-image-dropzone-error {
328
+ @apply border-danger;
329
+ }
330
+ .input-image-dropzone-content {
331
+ @apply absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 flex flex-col items-center text-light-foreground;
332
+ }
333
+ .input-image-dropzone-text {
334
+ @apply text-xs text-center mt-4;
335
+ }
336
+ .input-image-cropper-wrapper {
337
+ @apply relative bg-background rounded-lg overflow-hidden mx-auto;
338
+ }
339
+ .input-image-cropper-grid-container {
340
+ @apply absolute top-0 left-0 pointer-events-none;
341
+ }
342
+ .input-image-cropper-grid-border {
343
+ @apply absolute inset-0 border-2 border-stroke;
344
+ }
345
+ .input-image-cropper-grid-line-h {
346
+ @apply absolute left-0 w-full border-t border-stroke;
347
+ }
348
+ .input-image-cropper-grid-line-h-1 {
349
+ @apply top-1/3;
350
+ }
351
+ .input-image-cropper-grid-line-h-2 {
352
+ @apply top-2/3;
353
+ }
354
+ .input-image-cropper-grid-line-v {
355
+ @apply absolute top-0 h-full border-l border-stroke;
356
+ }
357
+ .input-image-cropper-grid-line-v-1 {
358
+ @apply left-1/3;
359
+ }
360
+ .input-image-cropper-grid-line-v-2 {
361
+ @apply left-2/3;
362
+ }
363
+
364
+ /* ## Input Document */
365
+ .input-document-value-item {
366
+ @apply border rounded-sm pl-2 pr-1 py-1 text-xs bg-light-primary/30 border-light-primary text-primary flex items-center gap-1 max-w-[150px] border-dashed cursor-pointer hover:bg-light-primary/50;
367
+ }
368
+ .input-document-dropzone {
369
+ @apply border rounded border-dashed border-stroke p-3 bg-background h-[350px] md:h-[600px] flex justify-center items-center;
370
+ }
371
+ .input-document-preview-box {
372
+ @apply relative w-full aspect-square flex justify-center bg-background items-center cursor-pointer;
373
+ }
374
+ .input-document-upload-box {
375
+ @apply w-full aspect-square flex flex-col gap-2 justify-center items-center border border-dashed border-stroke cursor-pointer text-light-foreground;
376
+ }
377
+ .input-document-values {
378
+ @apply absolute top-1/2 -translate-y-1/2 overflow-x-hidden py-1.5 w-max flex gap-2 overflow-hidden cursor-pointer;
379
+ }
380
+ .input-document-values-left-icon {
381
+ @apply ml-[2.5rem];
382
+ }
383
+ .input-document-values-no-icon {
384
+ @apply ml-2;
385
+ }
386
+ .input-document-empty-box {
387
+ @apply w-full h-full flex flex-col gap-6 justify-center items-center cursor-pointer text-light-foreground;
388
+ }
389
+ .input-document-thumbs-container {
390
+ @apply max-h-[calc(100vh-650px)] md:max-h-[calc(100vh-750px)] overflow-y-auto;
391
+ }
392
+ .input-document-thumbs-grid {
393
+ @apply grid grid-cols-5 gap-1;
394
+ }
395
+ .input-document-thumb-wrapper {
396
+ @apply relative w-full aspect-square flex justify-center bg-background items-center cursor-pointer brightness-70 hover:brightness-90;
397
+ }
398
+ .input-document-thumb-wrapper-active {
399
+ @apply brightness-100;
400
+ }
401
+
402
+
403
+ /* ============================ */
404
+ /* ## Radio & Checkbox */
405
+ /* ============================ */
406
+ .input-radio-list, .input-checkbox-list {
407
+ @apply overflow-auto w-full flex flex-nowrap gap-y-2 gap-4;
408
+ }
409
+ .input-radio-list-vertical, .input-checkbox-list-vertical {
410
+ @apply flex-col flex-wrap;
411
+ }
412
+
413
+ .radio-container, .checkbox-container {
414
+ @apply flex flex-col gap-1;
415
+ }
416
+ .radio-wrapper {
417
+ @apply flex gap-2 items-center cursor-pointer;
418
+ }
419
+ .checkbox-wrapper {
420
+ @apply flex gap-2 items-center cursor-pointer active:scale-x-[102%];
421
+ }
422
+ .radio-wrapper-disabled, .checkbox-wrapper-disabled {
423
+ @apply pointer-events-none opacity-60;
424
+ }
425
+
426
+ .radio-input {
427
+ @apply flex justify-center items-center rounded-full w-5 h-5 active:outline border border-light-foreground;
428
+ }
429
+ .radio-input-checked {
430
+ @apply border-[5px] outline-light-primary border-primary;
431
+ }
432
+
433
+ .checkbox-input {
434
+ @apply flex justify-center items-center rounded-md border w-6 h-6 transition-colors border-light-foreground text-light-foreground;
435
+ }
436
+ .checkbox-input-checked {
437
+ @apply border-light-primary bg-primary text-background;
438
+ }
439
+
440
+ .radio-label, .checkbox-label {
441
+ @apply whitespace-nowrap;
442
+ }
443
+ .radio-label-checked, .checkbox-label-checked {
444
+ @apply font-semibold;
445
+ }
446
+
447
+ .input-scroll {
448
+ overflow: auto;
449
+ }
450
+
451
+ .input-scroll::-webkit-scrollbar,
452
+ .input-values-preview::-webkit-scrollbar,
453
+ .select-multiple-values::-webkit-scrollbar,
454
+ .input-document-values::-webkit-scrollbar,
455
+ .input-radio-list::-webkit-scrollbar,
456
+ .input-checkbox-list::-webkit-scrollbar {
457
+ width: 5px;
458
+ height: 5px;
459
+ position: fixed;
460
+ top: 0;
461
+ left: 0;
462
+ }
463
+
464
+ .input-scroll:hover::-webkit-scrollbar,
465
+ .input-values-preview:hover::-webkit-scrollbar,
466
+ .select-multiple-values:hover::-webkit-scrollbar,
467
+ .input-document-values:hover::-webkit-scrollbar,
468
+ .input-radio-list:hover::-webkit-scrollbar,
469
+ .input-checkbox-list:hover::-webkit-scrollbar {
470
+ display: block;
471
+ }
472
+
473
+ .input-scroll::-webkit-scrollbar-track,
474
+ .input-values-preview::-webkit-scrollbar-track,
475
+ .select-multiple-values::-webkit-scrollbar-track,
476
+ .input-document-values::-webkit-scrollbar-track,
477
+ .input-radio-list::-webkit-scrollbar-track,
478
+ .input-checkbox-list::-webkit-scrollbar-track {
479
+ background: transparent;
480
+ }
481
+
482
+ .input-scroll::-webkit-scrollbar-thumb,
483
+ .input-values-preview::-webkit-scrollbar-thumb,
484
+ .select-multiple-values::-webkit-scrollbar-thumb,
485
+ .input-document-values::-webkit-scrollbar-thumb,
486
+ .input-radio-list::-webkit-scrollbar-thumb,
487
+ .input-checkbox-list::-webkit-scrollbar-thumb {
488
+ background: transparent;
489
+ border-radius: 10px;
490
+ }
491
+
492
+ .input-scroll::-webkit-scrollbar-thumb:hover,
493
+ .input-values-preview::-webkit-scrollbar-thumb:hover,
494
+ .select-multiple-values::-webkit-scrollbar-thumb:hover,
495
+ .input-document-values::-webkit-scrollbar-thumb:hover,
496
+ .input-radio-list::-webkit-scrollbar-thumb:hover,
497
+ .input-checkbox-list::-webkit-scrollbar-thumb:hover {
498
+ background: rgba(0, 0, 0, 0.1);
499
+ }
500
+
501
+ /* ============================ */
502
+ /* ## Modal */
503
+ /* ============================ */
504
+ .modal {
505
+ @apply isolate fixed left-1/2 -translate-x-1/2 top-[1rem] md:top-[15vh] opacity-100 bg-white z-40 w-[calc(100vw-2rem)] md:w-[50vw] max-w-[500px];
506
+ }
507
+
508
+ .modal-confirm {
509
+ @apply rounded-[4px] border-t-4 !border-primary max-w-[300px];
510
+ }
511
+
512
+ .modal-header {
513
+ @apply flex justify-between items-center gap-8 px-4 pt-4;
514
+ }
515
+
516
+ .modal-title {
517
+ @apply text-lg font-semibold text-foreground;
518
+ }
519
+
520
+ .modal-tip {
521
+ @apply text-sm text-light-foreground leading-4 mt-1;
522
+ }
523
+
524
+ .modal-footer {
525
+ @apply px-4 py-2.5 mt-4 bg-background rounded-b-[6px];
526
+ }
527
+
528
+ .floating-page {
529
+ @apply fixed top-[1rem] right-0 bg-background lg:top-0 h-screen z-40 border-t-4 md:border-t-0 md:border-l-4 !border-primary overflow-hidden overflow-y-auto w-[100vw] md:w-[50vw] max-w-[700px];
530
+ }
531
+
532
+ .modal-backdrop {
533
+ @apply isolate fixed left-0 top-0 z-40 w-screen h-screen bg-light-foreground/20 backdrop-blur-[1px];
534
+ }
535
+
536
+ .toast {
537
+ @apply isolate fixed right-5 bottom-5 opacity-100 bg-white z-40 border-t-4 !border-primary rounded-[6px] w-[calc(100vw-2rem)] md:w-[50vw] max-w-[300px];
538
+ }
539
+
540
+ .bottom-sheet {
541
+ @apply fixed left-0 right-0 w-full h-full z-50 transition-[top] duration-75;
542
+ }
543
+
544
+ .bottom-sheet-container {
545
+ @apply w-full h-full bg-white rounded-t shadow-xl overflow-hidden;
546
+ }
547
+
548
+ .bottom-sheet-handle-wrapper {
549
+ @apply py-2 flex justify-center cursor-grab;
550
+ }
551
+
552
+ .bottom-sheet-handle {
553
+ @apply w-14 h-[2.5px] bg-slate-200 rounded-full;
554
+ }
555
+
556
+ .bottom-sheet-footer {
557
+ @apply fixed bottom-0 left-0 right-0 z-50;
558
+ }
559
+
560
+
561
+ /* ============================ */
562
+ /* ## Accordion */
563
+ /* ============================ */
564
+ .accordion {
565
+ @apply bg-background border border-stroke rounded-lg flex;
566
+ }
567
+ .accordion-horizontal {
568
+ @apply flex-row w-min border-r-0;
569
+ }
570
+ .accordion-vertical {
571
+ @apply flex-col border-b-0;
572
+ }
573
+
574
+ .accordion-head {
575
+ @apply flex justify-between items-center gap-4 font-semibold cursor-pointer;
576
+ }
577
+ .accordion-head-horizontal {
578
+ @apply flex-col px-2 py-4;
579
+ }
580
+ .accordion-head-vertical {
581
+ @apply py-2 px-4;
582
+ }
583
+
584
+ .accordion-item {
585
+ @apply border-stroke;
586
+ }
587
+ .accordion-item-horizontal {
588
+ @apply border-r flex;
589
+ }
590
+ .accordion-item-vertical {
591
+ @apply border-b;
592
+ }
593
+
594
+ .accordion-content {
595
+ @apply transition-all overflow-hidden;
596
+ }
597
+ .accordion-content-horizontal-active {
598
+ @apply max-w-max pr-4 py-2;
599
+ }
600
+ .accordion-content-horizontal-inactive {
601
+ @apply max-w-0 px-0;
602
+ }
603
+ .accordion-content-vertical-active {
604
+ @apply max-h-max pb-4 px-4;
605
+ }
606
+ .accordion-content-vertical-inactive {
607
+ @apply max-h-0 pb-0 px-4;
608
+ }
609
+
610
+
611
+ /* ============================ */
612
+ /* ## Breadcrumb */
613
+ /* ============================ */
614
+ .breadcrumb {
615
+ @apply w-full overflow-x-auto overflow-y-hidden whitespace-nowrap;
616
+ }
617
+ .breadcrumb-list {
618
+ @apply flex items-center;
619
+ }
620
+ .breadcrumb-link {
621
+ @apply capitalize;
622
+ }
623
+ .breadcrumb-link-square {
624
+ @apply py-2 px-4 rounded-[6px] bg-light-foreground/10;
625
+ }
626
+ .breadcrumb-link-active {
627
+ @apply text-primary;
628
+ }
629
+ .breadcrumb-link-square-active {
630
+ @apply text-primary bg-primary/10;
631
+ }
632
+ .breadcrumb-separator {
633
+ @apply mx-2 text-light-foreground flex items-center;
634
+ }
635
+
636
+
637
+ /* ============================ */
638
+ /* ## Card */
639
+ /* ============================ */
640
+ .card {
641
+ @apply px-4 py-2.5 rounded-[6px] border bg-white;
642
+ }
643
+
644
+ /* ## Alert Card */
645
+ .alert-card {
646
+ @apply rounded-[6px] bg-white p-4 border sm:p-6;
647
+ }
648
+ .alert-card-badge {
649
+ @apply rounded-[4px] border text-primary bg-primary/20 px-3 py-1.5 text-xs font-bold;
650
+ }
651
+ .alert-card-title {
652
+ @apply mt-4 text-lg font-medium sm:text-xl;
653
+ }
654
+
655
+ /* ## Dashboard Card */
656
+ .dashboard-card {
657
+ @apply bg-white border py-4 px-6 rounded-[6px] flex justify-between gap-4 items-center;
658
+ }
659
+
660
+ /* ## Gallery Card */
661
+ .gallery-card-image {
662
+ @apply w-full rounded-bl-4xl rounded-tr-3xl object-cover aspect-[4/3];
663
+ }
664
+ .gallery-card-label {
665
+ @apply mt-1 text-center text-sm text-light-foreground;
666
+ }
667
+
668
+ /* ## Product Card */
669
+ .product-card {
670
+ @apply rounded-[6px] border p-2 bg-white;
671
+ }
672
+ .product-card-image {
673
+ @apply h-56 w-full rounded-[4px] object-cover;
674
+ }
675
+
676
+ /* ## Profile Card */
677
+ .profile-card {
678
+ @apply relative block overflow-hidden rounded-[6px] border bg-white p-4 sm:p-6;
679
+ }
680
+ .profile-card-image {
681
+ @apply size-16 rounded-full object-cover shadow-sm;
682
+ }
683
+
684
+
685
+ /* ============================ */
686
+ /* ## Carousel */
687
+ /* ============================ */
688
+ .carousel {
689
+ @apply relative w-full overflow-hidden rounded-[6px];
690
+ }
691
+ .carousel-inner {
692
+ @apply flex transition-transform duration-500;
693
+ }
694
+ .carousel-item {
695
+ @apply flex-shrink-0 w-full aspect-[16/6] flex items-center justify-center bg-cover bg-center;
696
+ }
697
+ .carousel-btn {
698
+ @apply absolute top-1/2 transform -translate-y-1/2 bg-light-foreground/40 text-white p-2 rounded-[6px] cursor-pointer;
699
+ }
700
+ .carousel-prev-btn {
701
+ @apply left-4;
702
+ }
703
+ .carousel-next-btn {
704
+ @apply right-4;
705
+ }
706
+ .carousel-navigation {
707
+ @apply absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2;
708
+ }
709
+ .carousel-indicator {
710
+ @apply w-8 h-1 rounded-full bg-light-foreground/40;
711
+ }
712
+ .carousel-indicator-active {
713
+ @apply bg-primary;
714
+ }
715
+
716
+
717
+ /* ============================ */
718
+ /* ## Chip */
719
+ /* ============================ */
720
+ .chip-group {
721
+ @apply overflow-hidden flex gap-2 flex-wrap;
722
+ }
723
+ .chip {
724
+ @apply flex text-xs py-0.5 px-2 justify-between text-foreground border items-center rounded-md cursor-pointer;
725
+ }
726
+ .chip-delete {
727
+ @apply text-xs cursor-pointer text-light-foreground pl-2 py-1 hover:text-danger;
728
+ }
729
+
730
+
731
+ /* ============================ */
732
+ /* ## Typography */
733
+ /* ============================ */
734
+ /* ## Article */
735
+ .typography-article-header {
736
+ @apply text-light-foreground;
737
+ }
738
+ .typography-article-title {
739
+ @apply text-2xl font-bold mt-2;
740
+ }
741
+ .typography-article-content {
742
+ @apply text-justify mt-2;
743
+ }
744
+ .typography-article-footer {
745
+ @apply text-sm text-light-foreground mt-4;
746
+ }
747
+
748
+ /* ## Column */
749
+ .typography-column-title {
750
+ @apply text-xs font-semibold text-light-foreground;
751
+ }
752
+
753
+ /* ## Content */
754
+ .typography-content-title {
755
+ @apply font-semibold;
756
+ }
757
+ .typography-content-body {
758
+ @apply text-sm text-light-foreground;
759
+ }
760
+
761
+ /* ## Tips */
762
+ .typography-tips {
763
+ @apply pl-3 py-1 border-l-2 border-light-primary;
764
+ }
765
+ .typography-tips-title {
766
+ @apply font-semibold;
767
+ }
768
+ .typography-tips-body {
769
+ @apply text-sm text-light-foreground;
770
+ }
771
+
772
+ /* ============================ */
773
+ /* ## Table Control Bar */
774
+ /* ============================ */
775
+ .control-bar {
776
+ @apply py-1 md:py-2 md:px-1.5 bg-white rounded-[6px] border border-stroke flex items-center mb-2;
777
+ }
778
+ .control-bar-create-wrapper {
779
+ @apply pl-1.5 pr-3 mr-2 border-r border-stroke;
780
+ }
781
+ .control-bar-search-wrapper {
782
+ @apply w-full min-w-[150px];
783
+ }
784
+ .control-bar-search-wrapper-searchable {
785
+ @apply pr-1.5;
786
+ }
787
+ .control-bar-search-wrapper-standalone {
788
+ @apply px-1.5;
789
+ }
790
+ .control-bar-search-input {
791
+ @apply py-1.5 text-sm;
792
+ }
793
+ .control-bar-search-input-searchable {
794
+ @apply rounded-l-none;
795
+ }
796
+ .control-bar-searchable-wrapper {
797
+ @apply w-28 pl-1.5;
798
+ }
799
+ .control-bar-searchable-select {
800
+ @apply py-1.5 text-sm rounded-r-none border-r-0;
801
+ }
802
+ .control-bar-button-wrapper {
803
+ @apply px-1.5 rounded-md relative;
804
+ }
805
+ .control-bar-button-wrapper-refresh {
806
+ @apply md:px-1.5 relative;
807
+ }
808
+ .control-bar-icon-button {
809
+ @apply !text-foreground p-4;
810
+ }
811
+ .control-bar-filter-button {
812
+ @apply !text-foreground;
813
+ }
814
+ .control-bar-dropdown {
815
+ @apply absolute -bottom-4 bg-white translate-y-full right-0 w-[240px] z-20 rounded-lg border border-stroke transition-all duration-200;
816
+ }
817
+ .control-bar-dropdown-hidden {
818
+ @apply scale-y-0 top-0 opacity-0 pointer-events-none;
819
+ }
820
+ .control-bar-dropdown-title {
821
+ @apply select-none text-foreground text-xs p-4;
822
+ }
823
+ .control-bar-selectable-checkbox-list {
824
+ @apply px-4 border-0 gap-4 mb-4;
825
+ }
826
+ .control-bar-selectable-checkbox {
827
+ @apply w-5 h-5;
828
+ }
829
+ .control-bar-sort-list {
830
+ @apply flex flex-col mb-4;
831
+ }
832
+ .control-bar-sort-item {
833
+ @apply flex justify-between cursor-pointer text-sm px-4 py-2 hover:bg-light-primary;
834
+ }
835
+ .control-bar-sort-item-active {
836
+ @apply text-primary bg-primary/10;
837
+ }
838
+ .control-bar-sort-active-icon {
839
+ @apply text-primary;
840
+ }
841
+ .control-bar-sort-icon {
842
+ @apply text-xs;
843
+ }
844
+ .control-bar-sort-badge {
845
+ @apply text-[9px] ml-1;
846
+ }
847
+ .control-bar-filter-panel {
848
+ @apply mb-2 animate-intro-down;
849
+ }
850
+ .control-bar-filter-panel-hidden {
851
+ @apply p-0 h-0 hidden overflow-hidden;
852
+ }
853
+ .control-bar-mobile-container {
854
+ @apply flex flex-col gap-4 p-2;
855
+ }
856
+ .control-bar-mobile-title {
857
+ @apply select-none text-foreground text-xs pb-2;
858
+ }
859
+ .control-bar-mobile-checkbox-list {
860
+ @apply px-2 border-0 gap-4 bg-transparent;
861
+ }
862
+ .control-bar-mobile-sort-item {
863
+ @apply flex justify-between cursor-pointer text-sm p-2 hover:bg-light-primary active:scale-x-[102%];
864
+ }
865
+ .control-bar-mobile-sort-item-active {
866
+ @apply text-primary bg-primary/10;
867
+ }
868
+ .control-bar-mobile-filter {
869
+ @apply border-0 p-0 mb-2;
870
+ }
871
+
872
+ /* ============================ */
873
+ /* ## Table */
874
+ /* ============================ */
875
+ .table-head-row {
876
+ @apply flex gap-4;
877
+ }
878
+ .table-head-column {
879
+ @apply px-4 py-2.5 font-bold w-full flex justify-between gap-2 items-center text-sm text-foreground capitalize;
880
+ }
881
+ .table-body-column {
882
+ @apply px-4 py-4 font-medium;
883
+ }
884
+ .table-body-row {
885
+ @apply flex items-center gap-4 rounded-[4px] relative opacity-0 animate-intro-fade border-b hover:bg-light-primary/30;
886
+ }
887
+ .table-body {
888
+ @apply flex flex-col gap-y-0.5;
889
+ }
890
+ .table-action-column {
891
+ @apply flex-1 flex justify-end gap-2 px-4 py-2;
892
+ }
893
+ .table-floating-action {
894
+ @apply sticky bg-background -right-5 z-30 cursor-pointer flex items-center shadow rounded-l-lg;
895
+ }
896
+ .table-floating-action-icon-wrapper {
897
+ @apply pl-4 pr-7 py-2;
898
+ }
899
+ .table-floating-action-content {
900
+ @apply py-1 flex gap-2 w-0 overflow-hidden transition-all duration-200;
901
+ }
902
+ .table-floating-action-content-active {
903
+ @apply w-max pl-2 pr-8;
904
+ }
905
+ .table-loading-container {
906
+ @apply flex flex-col items-center justify-center gap-8 p-20;
907
+ }
908
+ .table-loading-text {
909
+ @apply text-lg text-light-foreground animate-pulse;
910
+ }
911
+ .table-empty-container {
912
+ @apply flex flex-col items-center justify-center gap-8 p-20 opacity-50;
913
+ }
914
+ .table-empty-text {
915
+ @apply text-lg text-light-foreground;
916
+ }
917
+ .table-mobile-list {
918
+ @apply w-full flex flex-col gap-y-2;
919
+ }
920
+ .table-bulk-actions-bar {
921
+ @apply rounded-[6px] bg-white mt-4 w-full px-4 py-2 border border-stroke flex justify-between items-center;
922
+ }
923
+ .table-bulk-actions-title {
924
+ @apply text-sm font-semibold;
925
+ }
926
+ .table-bulk-actions-buttons {
927
+ @apply flex justify-end items-center gap-2;
928
+ }
929
+ .table-pagination-desktop {
930
+ @apply mt-6 mb-24 md:mb-0 hidden md:block;
931
+ }
932
+ .table-pagination-mobile {
933
+ @apply mt-6 mb-10 md:hidden;
934
+ }
935
+
936
+ /* ============================ */
937
+ /* ## Table Filter Component */
938
+ /* ============================ */
939
+ .filter-panel {
940
+ @apply p-4 border border-stroke rounded-sm;
941
+ }
942
+ .filter-panel-header {
943
+ @apply flex justify-between items-center mb-4;
944
+ }
945
+ .filter-panel-controls {
946
+ @apply flex gap-4 items-center;
947
+ }
948
+ .filter-panel-bookmarks-wrapper {
949
+ @apply flex gap-2 items-center;
950
+ }
951
+ .filter-panel-bookmark-btn {
952
+ @apply text-slate-400;
953
+ }
954
+ .filter-row {
955
+ @apply flex flex-wrap items-center gap-2 mb-2;
956
+ }
957
+ .filter-col-logic {
958
+ @apply w-[20%] md:w-[10%];
959
+ }
960
+ .filter-col-column {
961
+ @apply w-[52.5%] md:w-[30.7%];
962
+ }
963
+ .filter-col-column-with-logic {
964
+ @apply w-[30%] md:w-[20%];
965
+ }
966
+ .filter-col-operator {
967
+ @apply w-[35%] md:w-[18%];
968
+ }
969
+ .filter-col-value {
970
+ @apply w-full md:w-[45%];
971
+ }
972
+ .filter-input-field {
973
+ @apply text-sm p-2 px-3;
974
+ }
975
+ .filter-add-btn {
976
+ @apply md:mt-4;
977
+ }
978
+ .filter-bookmark-list-container {
979
+ @apply p-4 flex flex-col gap-2;
980
+ }
981
+ .filter-bookmark-row {
982
+ @apply p-2 border border-stroke rounded-sm flex justify-between;
983
+ }
984
+ .filter-bookmark-name {
985
+ @apply pl-1;
986
+ }
987
+ .filter-bookmark-empty-text {
988
+ @apply text-center text-light-foreground py-4;
989
+ }
990
+ .filter-bookmark-form-container {
991
+ @apply p-4;
992
+ }
993
+ .filter-bookmark-form-input {
994
+ @apply mt-4;
995
+ }
996
+ .filter-between-container {
997
+ @apply flex items-center gap-2 flex-1;
998
+ }
999
+
1000
+ /* ============================ */
1001
+ /* ## Table Pagination */
1002
+ /* ============================ */
1003
+ .pagination-container {
1004
+ @apply flex items-center justify-end md:justify-between gap-4 md:gap-6;
1005
+ }
1006
+ .pagination-item {
1007
+ @apply w-8 md:w-12 h-8 text-sm flex justify-center items-center bg-white rounded-[4px] border border-stroke cursor-pointer;
1008
+ }
1009
+ .pagination-item-active {
1010
+ @apply bg-light-primary/50 text-primary;
1011
+ }
1012
+ .pagination-overflow {
1013
+ @apply py-1.5 px-2 text-foreground text-sm;
1014
+ }
1015
+ .pagination-desktop-wrapper {
1016
+ @apply hidden md:flex items-center gap-6;
1017
+ }
1018
+ .pagination-paginate-select {
1019
+ @apply py-1.5 text-sm bg-white rounded-[4px];
1020
+ }
1021
+ .pagination-desktop-pages {
1022
+ @apply flex items-center gap-2 mt-0.5;
1023
+ }
1024
+ .pagination-desktop-info {
1025
+ @apply hidden md:block text-sm text-foreground;
1026
+ }
1027
+ .pagination-mobile-wrapper {
1028
+ @apply border border-stroke rounded-sm flex md:hidden items-center;
1029
+ }
1030
+ .pagination-mobile-info {
1031
+ @apply text-sm text-foreground px-4 py-2;
1032
+ }
1033
+ .pagination-mobile-controls {
1034
+ @apply flex items-center gap-2 bg-light-primary/50 text-primary p-2;
1035
+ }
1036
+
1037
+
1038
+ /* ============================ */
1039
+ /* ## Table Supervision */
1040
+ /* ============================ */
1041
+ .table-supervision-action-list {
1042
+ @apply flex items-center gap-2;
1043
+ }
1044
+ .table-supervision-detail-container {
1045
+ @apply p-4;
1046
+ }
1047
+ .table-supervision-detail-body {
1048
+ @apply flex flex-col gap-y-4;
1049
+ }
1050
+ .table-supervision-title {
1051
+ @apply text-lg lg:text-xl font-bold mb-2 lg:mb-4;
1052
+ }
1053
+ .table-supervision-control-button {
1054
+ @apply !text-foreground;
1055
+ }
1056
+ .table-supervision-mobile-add-btn {
1057
+ @apply fixed bottom-2 left-2 w-12 h-12 md:hidden;
1058
+ }
1059
+ .table-supervision-modal {
1060
+ @apply bg-background;
1061
+ }
1062
+ .table-supervision-form-mobile-container {
1063
+ @apply p-4 h-[110vh];
1064
+ }
1065
+ .table-supervision-form-container {
1066
+ @apply p-4;
1067
+ }
1068
+ .table-supervision-large-modal {
1069
+ @apply bg-background md:w-[1200px] max-w-[1200px];
1070
+ }
1071
+ .table-supervision-confirm-text {
1072
+ @apply px-2 pb-2 text-sm text-center;
1073
+ }
1074
+ .table-supervision-confirm-item-name {
1075
+ @apply font-semibold;
1076
+ }
1077
+
1078
+ /* ============================ */
1079
+ /* ## Form Supervision */
1080
+ /* ============================ */
1081
+ .form-supervision-title {
1082
+ @apply text-lg font-semibold mb-4;
1083
+ }
1084
+ .form-supervision-base {
1085
+ @apply grid grid-cols-12 gap-4;
1086
+ }
1087
+ .form-supervision-cluster-item {
1088
+ @apply relative pr-8;
1089
+ }
1090
+ .form-supervision-cluster-item-wrapped {
1091
+ @apply p-4 rounded border;
1092
+ }
1093
+ .form-supervision-cluster-grid {
1094
+ @apply w-full grid grid-cols-12 gap-4;
1095
+ }
1096
+ .form-supervision-cluster-remove-btn {
1097
+ @apply absolute top-10 right-2 translate-x-1/2 -translate-y-1/2;
1098
+ }
1099
+ .form-supervision-cluster-remove-btn-wrapped {
1100
+ @apply translate-x-0 -translate-y-0 top-1 right-1;
1101
+ }
1102
+ .form-supervision-footer {
1103
+ @apply flex justify-end mt-4;
1104
+ }
1105
+ .form-supervision-confirm-text {
1106
+ @apply px-2 pb-2 text-sm text-center;
1107
+ }
1108
+ .form-supervision-toast-error {
1109
+ @apply !border-danger;
1110
+ }
1111
+ .form-supervision-toast-success {
1112
+ @apply !border-success;
1113
+ }
1114
+ .form-supervision-toast-text {
1115
+ @apply px-3 pb-2 text-sm;
1116
+ }
1117
+
1118
+ /* ============================ */
1119
+ /* ## Sidebar */
1120
+ /* ============================ */
1121
+ .sidebar-backdrop {
1122
+ @apply absolute top-0 left-0 w-full h-full bg-background/50 blur-md z-20 md:hidden;
1123
+ }
1124
+ .sidebar-base {
1125
+ @apply flex flex-col fixed w-full sm:w-64 h-screen px-2 py-4 overflow-y-auto bg-white z-20 rounded-r-[8px] border-r;
1126
+ }
1127
+ .sidebar-head-item {
1128
+ @apply flex justify-between items-center text-light-foreground font-semibold py-2 text-xs uppercase;
1129
+ }
1130
+ .sidebar-item {
1131
+ @apply flex items-center justify-between px-2 py-2 gap-2 transition-colors duration-300 transform hover:text-primary cursor-pointer transition-none;
1132
+ }
1133
+ .sidebar-item-active {
1134
+ @apply text-primary border-l-2 border-primary pl-4;
1135
+ }
1136
+ .sidebar-child-item {
1137
+ @apply flex items-center justify-between px-2 py-2 gap-2 transition-colors duration-300 transform hover:text-primary cursor-pointer transition-none border-l-2;
1138
+ }
1139
+ .sidebar-child-item-active {
1140
+ @apply text-primary border-primary pl-4;
1141
+ }
1142
+ .sidebar-main-content {
1143
+ @apply w-full md:ml-[256px] md:w-[calc(100vw-256px)] min-h-screen overflow-x-hidden;
1144
+ }
1145
+
1146
+ /* ============================ */
1147
+ /* ## Bottombar */
1148
+ /* ============================ */
1149
+ .bottombar-base {
1150
+ @apply fixed left-1/2 -translate-x-1/2 w-[96%] max-w-[400px] p-2 px-4 bg-white border rounded-[6px] z-40;
1151
+ }
1152
+ .bottombar-item {
1153
+ @apply flex justify-center items-center flex-col py-3 rounded-[6px];
1154
+ }
1155
+ .bottombar-item-active {
1156
+ @apply border-b bg-background text-primary;
1157
+ }
1158
+
1159
+ /* ============================ */
1160
+ /* ## Navbar */
1161
+ /* ============================ */
1162
+ .navbar-topbar {
1163
+ @apply relative py-2.5 bg-background rounded-[6px] z-40 hidden lg:block;
1164
+ }
1165
+ .navbar-container {
1166
+ @apply container flex items-center justify-between px-4 mx-auto;
1167
+ }
1168
+ .navbar-special-link {
1169
+ @apply font-medium text-primary ml-2;
1170
+ }
1171
+ .navbar-menu {
1172
+ @apply flex gap-12;
1173
+ }
1174
+ .navbar-menu-item-sm {
1175
+ @apply px-4 text-sm text-gray-500 hover:text-foreground;
1176
+ }
1177
+ .navbar-menu-item-base {
1178
+ @apply px-4 text-base text-gray-500 hover:text-foreground;
1179
+ }
1180
+ .navbar-main {
1181
+ @apply bg-white border-y sticky top-0 z-40;
1182
+ }
1183
+ .navbar-main-container {
1184
+ @apply container flex items-center justify-between px-4 py-2.5 gap-8 mx-auto relative;
1185
+ }
1186
+ .navbar-logo-title {
1187
+ @apply text-lg font-extrabold italic whitespace-nowrap;
1188
+ }
1189
+ .navbar-logo-subtitle {
1190
+ @apply text-xs -mt-1 font-semibold text-light-foreground;
1191
+ }
1192
+ .navbar-auth-buttons {
1193
+ @apply flex w-full gap-4 justify-end;
1194
+ }
1195
+
1196
+ /* ============================ */
1197
+ /* ## Headbar */
1198
+ /* ============================ */
1199
+ .headbar-base {
1200
+ @apply p-1 flex items-center justify-between bg-white rounded-[6px] relative z-30 select-none border px-4 py-2;
1201
+ }
1202
+ .headbar-right-controls {
1203
+ @apply flex gap-2 w-max items-center;
1204
+ }
1205
+ .headbar-icon-button {
1206
+ @apply p-2 text-light-foreground hover:text-foreground cursor-pointer;
1207
+ }
1208
+ .headbar-divider {
1209
+ @apply h-5 w-[1px] bg-foreground mx-2.5;
1210
+ }
1211
+ .headbar-user-profile-trigger {
1212
+ @apply flex items-center gap-2.5 px-4 cursor-pointer -ml-2 text-light-foreground hover:text-foreground;
1213
+ }
1214
+ .headbar-user-avatar-wrapper {
1215
+ @apply h-10 bg-background rounded-full aspect-square overflow-hidden flex justify-center items-center;
1216
+ }
1217
+ .headbar-user-info {
1218
+ @apply hidden lg:block w-max max-w-[110px];
1219
+ }
1220
+ .headbar-user-name {
1221
+ @apply text-sm font-semibold line-clamp-1;
1222
+ }
1223
+ .headbar-user-role {
1224
+ @apply -mt-0.5 text-xs font-medium line-clamp-1;
1225
+ }
1226
+ .headbar-dropdown {
1227
+ @apply absolute right-0 top-[70px] rounded-[6px] border overflow-hidden bg-white z-30 transition-transform origin-top;
1228
+ }
1229
+ .headbar-dropdown-header {
1230
+ @apply flex items-center gap-4 p-4 rounded-b-[4px] border-b;
1231
+ }
1232
+ .headbar-dropdown-avatar-wrapper {
1233
+ @apply h-14 bg-background border rounded-full aspect-square overflow-hidden flex justify-center items-center;
1234
+ }
1235
+ .headbar-dropdown-user-info {
1236
+ @apply pr-5 w-[160px];
1237
+ }
1238
+ .headbar-dropdown-body {
1239
+ @apply py-4;
1240
+ }
1241
+ .headbar-dropdown-item {
1242
+ @apply px-6 py-2 flex gap-4 hover:bg-background/40 hover:border-y items-center cursor-pointer;
1243
+ }
1244
+ .headbar-dropdown-item-danger {
1245
+ @apply px-6 py-2 flex gap-4 hover:bg-background/40 hover:border-y items-center cursor-pointer text-danger;
1246
+ }
1247
+
1248
+ /* ============================ */
1249
+ /* ## Footer */
1250
+ /* ============================ */
1251
+ .footer-base {
1252
+ @apply bg-white/50 backdrop-blur-md border-t-2 pt-[100px] pb-16;
1253
+ }
1254
+ .footer-brand-container {
1255
+ @apply container mx-auto px-4 lg:px-52 text-center;
1256
+ }
1257
+ .footer-brand-title {
1258
+ @apply text-4xl font-extrabold italic whitespace-nowrap;
1259
+ }
1260
+ .footer-brand-subtitle {
1261
+ @apply text-lg font-semibold text-light-foreground;
1262
+ }
1263
+ .footer-contact-container {
1264
+ @apply flex flex-col justify-center items-center mt-16 gap-4 px-4;
1265
+ }
1266
+ .footer-contact-link {
1267
+ @apply font-medium cursor-pointer hover:border-b border-foreground;
1268
+ }
1269
+ .footer-support-hours {
1270
+ @apply font-medium text-center;
1271
+ }
1272
+ .footer-socials-container {
1273
+ @apply flex mt-10 gap-4 justify-center;
1274
+ }
1275
+ .footer-social-icon {
1276
+ @apply text-2xl hover:scale-110;
1277
+ }
1278
+ .footer-links-container {
1279
+ @apply container mx-auto px-6 bg-white border-y mt-20;
1280
+ }
1281
+ .footer-links-grid {
1282
+ @apply grid grid-cols-1 md:grid-cols-3 gap-16 md:gap-4 py-12 px-12;
1283
+ }
1284
+ .footer-menu-title {
1285
+ @apply text-lg font-semibold text-foreground mb-4;
1286
+ }
1287
+ .footer-menu-list {
1288
+ @apply flex flex-col gap-2;
1289
+ }
1290
+ .footer-menu-link {
1291
+ @apply text-light-foreground hover:underline;
1292
+ }
1293
+ .footer-copyright {
1294
+ @apply text-lg text-center font-semibold mt-16;
1295
+ }
1296
+
1297
+ /* ============================ */
1298
+ /* ## Tabbar */
1299
+ /* ============================ */
1300
+ .tabbar-base {
1301
+ @apply grid grid-flow-col rounded-[6px] border;
1302
+ }
1303
+ .tabbar-item {
1304
+ @apply text-center px-2 py-2 rounded-[64px];
1305
+ }
1306
+ .tabbar-item-active {
1307
+ @apply bg-white/60 text-primary font-semibold;
1308
+ }
1309
+ .tabbar-item-inactive {
1310
+ @apply hover:bg-white/60 cursor-pointer;
1311
+ }
1312
+
1313
+ /* ============================ */
1314
+ /* ## Wizard */
1315
+ /* ============================ */
1316
+ .wizard-step-header {
1317
+ @apply relative mb-2;
1318
+ }
1319
+ .wizard-progress-bar-wrapper {
1320
+ @apply absolute flex items-center;
1321
+ }
1322
+ .wizard-progress-bar-bg {
1323
+ @apply w-full bg-light-primary rounded flex-1;
1324
+ }
1325
+ .wizard-progress-bar-fill {
1326
+ @apply py-1 rounded w-full;
1327
+ }
1328
+ .wizard-progress-bar-fill-active {
1329
+ @apply bg-primary;
1330
+ }
1331
+ .wizard-progress-bar-fill-gradient {
1332
+ @apply bg-gradient-to-r from-primary to-light-primary to-70%;
1333
+ }
1334
+ .wizard-circle {
1335
+ @apply w-10 h-10 mx-auto rounded-full text-lg font-bold flex items-center;
1336
+ }
1337
+ .wizard-circle-active {
1338
+ @apply bg-primary text-background;
1339
+ }
1340
+ .wizard-circle-inactive {
1341
+ @apply bg-light-primary text-white;
1342
+ }
1343
+ .wizard-label {
1344
+ @apply text-xs text-center md:text-sm 2xl:text-base font-medium;
1345
+ }
1346
+
1347
+ /* ============================ */
1348
+ /* ## Scroll Container */
1349
+ /* ============================ */
1350
+ .scroll-container-main {
1351
+ @apply w-full overflow-x-auto;
1352
+ }
1353
+ .scroll-container-floating-bar {
1354
+ @apply fixed bottom-0 py-1 bg-background w-full;
1355
+ }
1356
+ .scroll-container-floating-wrapper {
1357
+ @apply overflow-x-auto overflow-y-hidden;
1358
+ }
1359
+ .scroll-container-phantom-element {
1360
+ @apply h-0.5 opacity-0;
1361
+ }
1362
+
1363
+ /* ============================ */
1364
+ /* ## Swipe */
1365
+ /* ============================ */
1366
+ .swipe-container {
1367
+ @apply relative w-full overflow-hidden select-none;
1368
+ }
1369
+ .swipe-left-action {
1370
+ @apply absolute h-full left-0 w-1/2 flex items-center px-8 gap-2 bg-light-warning text-warning cursor-pointer transition-opacity;
1371
+ }
1372
+ .swipe-right-action {
1373
+ @apply absolute h-full right-0 w-1/2 flex justify-end items-center px-8 gap-2 bg-light-danger text-danger cursor-pointer transition-opacity;
1374
+ }
1375
+ .swipe-content {
1376
+ @apply relative z-10 bg-background;
1377
+ }
1378
+
1379
+ /* ============================ */
1380
+ /* ## Shortcut Provider */
1381
+ /* ============================ */
1382
+ .shortcut-help-grid {
1383
+ @apply p-4 grid grid-cols-2 gap-4;
1384
+ }
1385
+ .shortcut-key-badge {
1386
+ @apply px-2 py-1 border rounded bg-gray-100 w-max;
1387
+ }
1388
+
1389
+ }
1390
+
1391
+
1392
+