@duyanhdev/mvp-ifs-ui-kit 21.0.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 (170) hide show
  1. package/.editorconfig +16 -0
  2. package/.gitmodules +3 -0
  3. package/.postcssrc.json +5 -0
  4. package/.prettierignore +14 -0
  5. package/.prettierrc.json +29 -0
  6. package/LICENSE.md +21 -0
  7. package/README.md +59 -0
  8. package/angular.json +98 -0
  9. package/eslint.config.js +89 -0
  10. package/package.json +59 -0
  11. package/public/demo/images/flag/flag_placeholder.png +0 -0
  12. package/public/demo/images/footer-image.gif +0 -0
  13. package/public/demo/images/galleria/galleria1.jpg +0 -0
  14. package/public/demo/images/galleria/galleria10.jpg +0 -0
  15. package/public/demo/images/galleria/galleria10s.jpg +0 -0
  16. package/public/demo/images/galleria/galleria11.jpg +0 -0
  17. package/public/demo/images/galleria/galleria11s.jpg +0 -0
  18. package/public/demo/images/galleria/galleria12.jpg +0 -0
  19. package/public/demo/images/galleria/galleria12s.jpg +0 -0
  20. package/public/demo/images/galleria/galleria13.jpg +0 -0
  21. package/public/demo/images/galleria/galleria13s.jpg +0 -0
  22. package/public/demo/images/galleria/galleria14.jpg +0 -0
  23. package/public/demo/images/galleria/galleria14s.jpg +0 -0
  24. package/public/demo/images/galleria/galleria15.jpg +0 -0
  25. package/public/demo/images/galleria/galleria15s.jpg +0 -0
  26. package/public/demo/images/galleria/galleria1s.jpg +0 -0
  27. package/public/demo/images/galleria/galleria2.jpg +0 -0
  28. package/public/demo/images/galleria/galleria2s.jpg +0 -0
  29. package/public/demo/images/galleria/galleria3.jpg +0 -0
  30. package/public/demo/images/galleria/galleria3s.jpg +0 -0
  31. package/public/demo/images/galleria/galleria4.jpg +0 -0
  32. package/public/demo/images/galleria/galleria4s.jpg +0 -0
  33. package/public/demo/images/galleria/galleria5.jpg +0 -0
  34. package/public/demo/images/galleria/galleria5s.jpg +0 -0
  35. package/public/demo/images/galleria/galleria6.jpg +0 -0
  36. package/public/demo/images/galleria/galleria6s.jpg +0 -0
  37. package/public/demo/images/galleria/galleria7.jpg +0 -0
  38. package/public/demo/images/galleria/galleria7s.jpg +0 -0
  39. package/public/demo/images/galleria/galleria8.jpg +0 -0
  40. package/public/demo/images/galleria/galleria8s.jpg +0 -0
  41. package/public/demo/images/galleria/galleria9.jpg +0 -0
  42. package/public/demo/images/galleria/galleria9s.jpg +0 -0
  43. package/public/demo/images/product/bamboo-watch.jpg +0 -0
  44. package/public/demo/images/product/black-watch.jpg +0 -0
  45. package/public/demo/images/product/blue-band.jpg +0 -0
  46. package/public/demo/images/product/blue-t-shirt.jpg +0 -0
  47. package/public/demo/images/product/bracelet.jpg +0 -0
  48. package/public/demo/images/product/brown-purse.jpg +0 -0
  49. package/public/demo/images/product/chakra-bracelet.jpg +0 -0
  50. package/public/demo/images/product/galaxy-earrings.jpg +0 -0
  51. package/public/demo/images/product/game-controller.jpg +0 -0
  52. package/public/demo/images/product/gaming-set.jpg +0 -0
  53. package/public/demo/images/product/gold-phone-case.jpg +0 -0
  54. package/public/demo/images/product/green-earbuds.jpg +0 -0
  55. package/public/demo/images/product/green-t-shirt.jpg +0 -0
  56. package/public/demo/images/product/grey-t-shirt.jpg +0 -0
  57. package/public/demo/images/product/headphones.jpg +0 -0
  58. package/public/demo/images/product/light-green-t-shirt.jpg +0 -0
  59. package/public/demo/images/product/lime-band.jpg +0 -0
  60. package/public/demo/images/product/mini-speakers.jpg +0 -0
  61. package/public/demo/images/product/painted-phone-case.jpg +0 -0
  62. package/public/demo/images/product/pink-band.jpg +0 -0
  63. package/public/demo/images/product/pink-purse.jpg +0 -0
  64. package/public/demo/images/product/product-placeholder.svg +10 -0
  65. package/public/demo/images/product/purple-band.jpg +0 -0
  66. package/public/demo/images/product/purple-gemstone-necklace.jpg +0 -0
  67. package/public/demo/images/product/purple-t-shirt.jpg +0 -0
  68. package/public/demo/images/product/shoes.jpg +0 -0
  69. package/public/demo/images/product/sneakers.jpg +0 -0
  70. package/public/demo/images/product/teal-t-shirt.jpg +0 -0
  71. package/public/demo/images/product/yellow-earbuds.jpg +0 -0
  72. package/public/demo/images/product/yoga-mat.jpg +0 -0
  73. package/public/demo/images/product/yoga-set.jpg +0 -0
  74. package/src/app/layout/component/configurator/app.configurator.html +48 -0
  75. package/src/app/layout/component/configurator/app.configurator.ts +396 -0
  76. package/src/app/layout/component/floatingconfigurator/app.floatingconfigurator.ts +31 -0
  77. package/src/app/layout/component/footer/app.footer.scss +52 -0
  78. package/src/app/layout/component/footer/app.footer.ts +26 -0
  79. package/src/app/layout/component/layout/app.layout.ts +50 -0
  80. package/src/app/layout/component/menu/app.menu.html +7 -0
  81. package/src/app/layout/component/menu/app.menu.scss +13 -0
  82. package/src/app/layout/component/menu/app.menu.ts +90 -0
  83. package/src/app/layout/component/menuitem/app.menuitem.html +56 -0
  84. package/src/app/layout/component/menuitem/app.menuitem.scss +218 -0
  85. package/src/app/layout/component/menuitem/app.menuitem.ts +126 -0
  86. package/src/app/layout/component/sidebar/app.sidebar.html +3 -0
  87. package/src/app/layout/component/sidebar/app.sidebar.scss +0 -0
  88. package/src/app/layout/component/sidebar/app.sidebar.ts +106 -0
  89. package/src/app/layout/component/topbar/app.topbar.html +190 -0
  90. package/src/app/layout/component/topbar/app.topbar.scss +8 -0
  91. package/src/app/layout/component/topbar/app.topbar.ts +68 -0
  92. package/src/app/layout/service/layout.service.ts +117 -0
  93. package/src/app/pages/auth/access.ts +32 -0
  94. package/src/app/pages/auth/auth.routes.ts +10 -0
  95. package/src/app/pages/auth/error.ts +32 -0
  96. package/src/app/pages/auth/login.ts +71 -0
  97. package/src/app/pages/crud/crud.ts +387 -0
  98. package/src/app/pages/dashboard/dashboard.css +778 -0
  99. package/src/app/pages/dashboard/dashboard.html +191 -0
  100. package/src/app/pages/dashboard/dashboard.ts +348 -0
  101. package/src/app/pages/documentation/documentation.ts +73 -0
  102. package/src/app/pages/empty/empty.ts +11 -0
  103. package/src/app/pages/landing/components/featureswidget.ts +139 -0
  104. package/src/app/pages/landing/components/footerwidget.ts +73 -0
  105. package/src/app/pages/landing/components/herowidget.ts +25 -0
  106. package/src/app/pages/landing/components/highlightswidget.ts +46 -0
  107. package/src/app/pages/landing/components/pricingwidget.ts +119 -0
  108. package/src/app/pages/landing/components/topbarwidget.component.ts +68 -0
  109. package/src/app/pages/landing/landing.ts +31 -0
  110. package/src/app/pages/notfound/notfound.ts +68 -0
  111. package/src/app/pages/pages.routes.ts +17 -0
  112. package/src/app/pages/profile/profile.html +57 -0
  113. package/src/app/pages/profile/profile.scss +145 -0
  114. package/src/app/pages/profile/profile.ts +19 -0
  115. package/src/app/pages/service/country.service.ts +255 -0
  116. package/src/app/pages/service/customer.service.ts +9057 -0
  117. package/src/app/pages/service/icon.service.ts +23 -0
  118. package/src/app/pages/service/node.service.ts +816 -0
  119. package/src/app/pages/service/photo.service.ts +103 -0
  120. package/src/app/pages/service/product.service.ts +1322 -0
  121. package/src/app/pages/tickets/tickets-create/tickets-create.html +140 -0
  122. package/src/app/pages/tickets/tickets-create/tickets-create.scss +617 -0
  123. package/src/app/pages/tickets/tickets-create/tickets-create.ts +104 -0
  124. package/src/app/pages/tickets/tickets-list/ticket-list.html +150 -0
  125. package/src/app/pages/tickets/tickets-list/ticket-list.scss +392 -0
  126. package/src/app/pages/tickets/tickets-list/ticket-list.ts +178 -0
  127. package/src/app/pages/uikit/buttondemo.ts +254 -0
  128. package/src/app/pages/uikit/chartdemo.ts +290 -0
  129. package/src/app/pages/uikit/filedemo.ts +52 -0
  130. package/src/app/pages/uikit/formlayoutdemo.ts +129 -0
  131. package/src/app/pages/uikit/inputdemo.ts +339 -0
  132. package/src/app/pages/uikit/listdemo.ts +217 -0
  133. package/src/app/pages/uikit/mediademo.ts +1021 -0
  134. package/src/app/pages/uikit/menudemo.ts +540 -0
  135. package/src/app/pages/uikit/messagesdemo.ts +101 -0
  136. package/src/app/pages/uikit/miscdemo.ts +192 -0
  137. package/src/app/pages/uikit/overlaydemo.ts +235 -0
  138. package/src/app/pages/uikit/panelsdemo.ts +235 -0
  139. package/src/app/pages/uikit/tabledemo.ts +568 -0
  140. package/src/app/pages/uikit/timelinedemo.ts +141 -0
  141. package/src/app/pages/uikit/treedemo.ts +75 -0
  142. package/src/app/pages/uikit/uikit.routes.ts +35 -0
  143. package/src/app.component.ts +22 -0
  144. package/src/app.config.ts +23 -0
  145. package/src/app.routes.ts +23 -0
  146. package/src/assets/demo/code.scss +17 -0
  147. package/src/assets/demo/demo.scss +2 -0
  148. package/src/assets/demo/flags/flags.css +984 -0
  149. package/src/assets/layout/_core.scss +24 -0
  150. package/src/assets/layout/_footer.scss +8 -0
  151. package/src/assets/layout/_main.scss +21 -0
  152. package/src/assets/layout/_menu.scss +159 -0
  153. package/src/assets/layout/_mixins.scss +15 -0
  154. package/src/assets/layout/_preloading.scss +47 -0
  155. package/src/assets/layout/_responsive.scss +111 -0
  156. package/src/assets/layout/_topbar.scss +201 -0
  157. package/src/assets/layout/_typography.scss +68 -0
  158. package/src/assets/layout/_utils.scss +25 -0
  159. package/src/assets/layout/layout.scss +13 -0
  160. package/src/assets/layout/variables/_common.scss +21 -0
  161. package/src/assets/layout/variables/_dark.scss +5 -0
  162. package/src/assets/layout/variables/_light.scss +5 -0
  163. package/src/assets/styles.scss +4 -0
  164. package/src/assets/tailwind.css +32 -0
  165. package/src/index.html +15 -0
  166. package/src/main.ts +5 -0
  167. package/tsconfig.app.json +15 -0
  168. package/tsconfig.json +33 -0
  169. package/tsconfig.spec.json +15 -0
  170. package/vercel.json +9 -0
@@ -0,0 +1,778 @@
1
+ /* ══════════════════════════════════════════════════
2
+ PRIMENG CSS VARIABLES MAPPING
3
+ Dùng biến của PrimeNG thay cho biến tùy chỉnh
4
+
5
+ Các biến PrimeNG chính được dùng:
6
+ --p-surface-0 → white / #ffffff
7
+ --p-surface-50 → near-white surface
8
+ --p-surface-100 → light surface
9
+ --p-surface-200 → border light
10
+ --p-surface-700 → dark surface
11
+ --p-surface-800 → darker surface
12
+ --p-surface-900 → darkest surface
13
+ --p-surface-ground → page background
14
+ --p-surface-section → section background
15
+ --p-surface-card → card background
16
+ --p-surface-overlay → overlay background
17
+ --p-surface-border → border color
18
+ --p-text-color → primary text
19
+ --p-text-color-secondary → muted text
20
+ --p-primary-color → brand/primary color (blue)
21
+ --p-primary-50 ... --p-primary-900
22
+ --p-content-border-color → content borders
23
+ --p-card-shadow → card shadow
24
+ --p-overlay-modal-shadow → larger shadow
25
+ --p-border-radius → base radius
26
+ --p-border-radius-sm → small radius
27
+ --p-border-radius-lg → large radius
28
+ ══════════════════════════════════════════════════ */
29
+
30
+ /* ══════════════════════════════════════════════════
31
+ LOCAL SEMANTIC ALIASES (thin wrapper)
32
+ Chỉ giữ các màu accent vì PrimeNG không có sẵn
33
+ ══════════════════════════════════════════════════ */
34
+ :host {
35
+ --dash-blue: #3b82f6;
36
+ --dash-orange: #f97316;
37
+ --dash-violet: #8b5cf6;
38
+ --dash-emerald: #10b981;
39
+ --dash-cyan: #06b6d4;
40
+ --dash-pink: #ec4899;
41
+ --dash-amber: #f59e0b;
42
+ --dash-red: #ef4444;
43
+ }
44
+
45
+ /* ══════════════════════════════════════════════════
46
+ LAYOUT WRAP
47
+ ══════════════════════════════════════════════════ */
48
+ .dashboard-wrap {
49
+ padding: 24px;
50
+ background: var(--p-surface-ground);
51
+ min-height: 100%;
52
+ color: var(--p-text-color);
53
+ transition:
54
+ background 0.3s,
55
+ color 0.3s;
56
+ }
57
+
58
+ /* ══════════════════════════════════════════════════
59
+ HEADER
60
+ ══════════════════════════════════════════════════ */
61
+ .dash-header {
62
+ display: flex;
63
+ align-items: flex-start;
64
+ justify-content: space-between;
65
+ gap: 16px;
66
+ flex-wrap: wrap;
67
+ margin-bottom: 24px;
68
+ }
69
+
70
+ .dash-title {
71
+ font-size: 24px;
72
+ font-weight: 900;
73
+ color: var(--p-text-color);
74
+ letter-spacing: -0.5px;
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 10px;
78
+ }
79
+
80
+ .dash-icon-badge {
81
+ font-size: 22px;
82
+ line-height: 1;
83
+ }
84
+
85
+ .dash-subtitle {
86
+ font-size: 13px;
87
+ color: var(--p-text-color-secondary);
88
+ margin-top: 4px;
89
+ display: flex;
90
+ align-items: center;
91
+ gap: 6px;
92
+ }
93
+
94
+ .live-dot {
95
+ width: 8px;
96
+ height: 8px;
97
+ border-radius: 50%;
98
+ background: var(--dash-emerald);
99
+ box-shadow: 0 0 8px rgba(16, 185, 129, 0.7);
100
+ animation: pulse-live 2s infinite;
101
+ flex-shrink: 0;
102
+ }
103
+
104
+ @keyframes pulse-live {
105
+ 0%,
106
+ 100% {
107
+ opacity: 1;
108
+ transform: scale(1);
109
+ }
110
+ 50% {
111
+ opacity: 0.5;
112
+ transform: scale(0.8);
113
+ }
114
+ }
115
+
116
+ .btn-create {
117
+ display: flex;
118
+ align-items: center;
119
+ gap: 7px;
120
+ background: var(--p-primary-color);
121
+ color: var(--p-primary-contrast-color, #fff);
122
+ border: none;
123
+ padding: 10px 22px;
124
+ border-radius: var(--p-border-radius-lg, 12px);
125
+ font-size: 13px;
126
+ font-weight: 800;
127
+ cursor: pointer;
128
+ font-family: inherit;
129
+ box-shadow: 0 4px 18px color-mix(in srgb, var(--p-primary-color) 40%, transparent);
130
+ transition:
131
+ transform 0.2s,
132
+ box-shadow 0.2s;
133
+ white-space: nowrap;
134
+
135
+ &:hover {
136
+ transform: translateY(-2px);
137
+ box-shadow: 0 8px 24px color-mix(in srgb, var(--p-primary-color) 55%, transparent);
138
+ background: var(--p-primary-600, var(--p-primary-color));
139
+ }
140
+
141
+ &:active {
142
+ transform: translateY(0);
143
+ }
144
+ }
145
+
146
+ /* ══════════════════════════════════════════════════
147
+ STAT GRID
148
+ ══════════════════════════════════════════════════ */
149
+ .stat-grid {
150
+ display: grid;
151
+ grid-template-columns: repeat(4, minmax(0, 1fr));
152
+ gap: 16px;
153
+ margin-bottom: 20px;
154
+ }
155
+
156
+ .stat-card {
157
+ position: relative;
158
+ overflow: hidden;
159
+ background: var(--p-surface-card);
160
+ border: 1px solid var(--p-content-border-color);
161
+ border-radius: var(--p-border-radius-lg, 16px);
162
+ padding: 20px;
163
+ cursor: default;
164
+ box-shadow: var(--p-card-shadow);
165
+ transition:
166
+ transform 0.25s,
167
+ box-shadow 0.25s,
168
+ border-color 0.25s;
169
+
170
+ &:hover {
171
+ transform: translateY(-4px);
172
+ }
173
+ }
174
+
175
+ /* Left accent stripe per card */
176
+ .stat-blue {
177
+ border-left: 4px solid var(--dash-blue);
178
+ &:hover {
179
+ box-shadow:
180
+ var(--p-overlay-modal-shadow),
181
+ 0 0 0 1px rgba(59, 130, 246, 0.25);
182
+ }
183
+ }
184
+ .stat-orange {
185
+ border-left: 4px solid var(--dash-orange);
186
+ &:hover {
187
+ box-shadow:
188
+ var(--p-overlay-modal-shadow),
189
+ 0 0 0 1px rgba(249, 115, 22, 0.25);
190
+ }
191
+ }
192
+ .stat-violet {
193
+ border-left: 4px solid var(--dash-violet);
194
+ &:hover {
195
+ box-shadow:
196
+ var(--p-overlay-modal-shadow),
197
+ 0 0 0 1px rgba(139, 92, 246, 0.25);
198
+ }
199
+ }
200
+ .stat-emerald {
201
+ border-left: 4px solid var(--dash-emerald);
202
+ &:hover {
203
+ box-shadow:
204
+ var(--p-overlay-modal-shadow),
205
+ 0 0 0 1px rgba(16, 185, 129, 0.25);
206
+ }
207
+ }
208
+
209
+ .stat-glow {
210
+ position: absolute;
211
+ top: -20px;
212
+ right: -20px;
213
+ width: 90px;
214
+ height: 90px;
215
+ border-radius: 50%;
216
+ filter: blur(36px);
217
+ pointer-events: none;
218
+ opacity: 0.3;
219
+ }
220
+ .glow-blue {
221
+ background: var(--dash-blue);
222
+ }
223
+ .glow-orange {
224
+ background: var(--dash-orange);
225
+ }
226
+ .glow-violet {
227
+ background: var(--dash-violet);
228
+ }
229
+ .glow-emerald {
230
+ background: var(--dash-emerald);
231
+ }
232
+
233
+ .stat-icon-wrap {
234
+ width: 42px;
235
+ height: 42px;
236
+ border-radius: var(--p-border-radius, 12px);
237
+ display: flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ font-size: 20px;
241
+ margin-bottom: 14px;
242
+ border: 1px solid;
243
+ }
244
+ .icon-blue {
245
+ background: rgba(59, 130, 246, 0.15);
246
+ border-color: rgba(59, 130, 246, 0.35);
247
+ }
248
+ .icon-orange {
249
+ background: rgba(249, 115, 22, 0.15);
250
+ border-color: rgba(249, 115, 22, 0.35);
251
+ }
252
+ .icon-violet {
253
+ background: rgba(139, 92, 246, 0.15);
254
+ border-color: rgba(139, 92, 246, 0.35);
255
+ }
256
+ .icon-emerald {
257
+ background: rgba(16, 185, 129, 0.15);
258
+ border-color: rgba(16, 185, 129, 0.35);
259
+ }
260
+
261
+ .stat-label {
262
+ font-size: 11px;
263
+ font-weight: 800;
264
+ text-transform: uppercase;
265
+ letter-spacing: 0.9px;
266
+ color: var(--p-text-color-secondary);
267
+ margin-bottom: 6px;
268
+ }
269
+
270
+ .stat-value {
271
+ font-size: 38px;
272
+ font-weight: 900;
273
+ color: var(--p-text-color);
274
+ line-height: 1;
275
+ }
276
+
277
+ .stat-trend {
278
+ font-size: 12px;
279
+ font-weight: 700;
280
+ margin-top: 8px;
281
+ }
282
+ .trend-up {
283
+ color: var(--dash-emerald);
284
+ }
285
+ .trend-warn {
286
+ color: var(--dash-orange);
287
+ }
288
+ .trend-info {
289
+ color: var(--dash-blue);
290
+ }
291
+
292
+ /* Sparklines */
293
+ .sparkline {
294
+ display: flex;
295
+ align-items: flex-end;
296
+ gap: 3px;
297
+ height: 26px;
298
+ margin-top: 10px;
299
+ }
300
+ .spark-bar {
301
+ flex: 1;
302
+ border-radius: 3px 3px 0 0;
303
+ opacity: 0.35;
304
+ transition:
305
+ opacity 0.2s,
306
+ height 0.3s;
307
+ min-height: 4px;
308
+ }
309
+ .stat-card:hover .spark-bar {
310
+ opacity: 0.85;
311
+ }
312
+
313
+ /* ══════════════════════════════════════════════════
314
+ CHARTS ROW
315
+ ══════════════════════════════════════════════════ */
316
+ .charts-row {
317
+ display: grid;
318
+ grid-template-columns: 2fr 1fr;
319
+ gap: 16px;
320
+ margin-bottom: 20px;
321
+ }
322
+
323
+ .chart-panel {
324
+ height: 100%;
325
+ }
326
+
327
+ .chart-body {
328
+ position: relative;
329
+ height: 240px;
330
+
331
+ ::ng-deep canvas {
332
+ max-height: 240px !important;
333
+ }
334
+ ::ng-deep .p-chart {
335
+ height: 100%;
336
+ }
337
+ }
338
+
339
+ .donut-body {
340
+ display: flex;
341
+ align-items: center;
342
+ gap: 20px;
343
+ height: 240px;
344
+
345
+ ::ng-deep .p-chart {
346
+ flex: 1;
347
+ height: 100%;
348
+ }
349
+ }
350
+
351
+ .donut-legend {
352
+ display: flex;
353
+ flex-direction: column;
354
+ gap: 12px;
355
+ flex-shrink: 0;
356
+ }
357
+
358
+ .donut-legend-item {
359
+ display: flex;
360
+ align-items: center;
361
+ gap: 8px;
362
+ }
363
+
364
+ .legend-val {
365
+ font-size: 15px;
366
+ font-weight: 800;
367
+ color: var(--p-text-color);
368
+ margin-left: auto;
369
+ }
370
+
371
+ /* ══════════════════════════════════════════════════
372
+ PANEL
373
+ ══════════════════════════════════════════════════ */
374
+ .panel {
375
+ background: var(--p-surface-card);
376
+ border: 1px solid var(--p-content-border-color);
377
+ border-radius: var(--p-border-radius-lg, 16px);
378
+ overflow: hidden;
379
+ box-shadow: var(--p-card-shadow);
380
+ transition: box-shadow 0.25s;
381
+
382
+ &:hover {
383
+ box-shadow: var(--p-overlay-modal-shadow);
384
+ }
385
+ }
386
+
387
+ .panel-accent-blue {
388
+ border-top: 3px solid var(--dash-blue);
389
+ }
390
+ .panel-accent-violet {
391
+ border-top: 3px solid var(--dash-violet);
392
+ }
393
+ .panel-accent-emerald {
394
+ border-top: 3px solid var(--dash-emerald);
395
+ }
396
+ .panel-accent-orange {
397
+ border-top: 3px solid var(--dash-orange);
398
+ }
399
+
400
+ .panel-head {
401
+ display: flex;
402
+ align-items: center;
403
+ justify-content: space-between;
404
+ flex-wrap: wrap;
405
+ gap: 8px;
406
+ padding: 16px 20px;
407
+ border-bottom: 1px solid var(--p-content-border-color);
408
+ }
409
+
410
+ .panel-title {
411
+ font-size: 14px;
412
+ font-weight: 800;
413
+ color: var(--p-text-color);
414
+ }
415
+
416
+ .panel-sub {
417
+ font-size: 12px;
418
+ color: var(--p-text-color-secondary);
419
+ font-weight: 600;
420
+ }
421
+
422
+ .panel-body {
423
+ padding: 20px;
424
+ &.p-0 {
425
+ padding: 0;
426
+ }
427
+ }
428
+
429
+ .mb-4 {
430
+ margin-bottom: 20px;
431
+ }
432
+
433
+ /* ══════════════════════════════════════════════════
434
+ TWO COL
435
+ ══════════════════════════════════════════════════ */
436
+ .two-col {
437
+ display: grid;
438
+ grid-template-columns: 1fr 1fr;
439
+ gap: 16px;
440
+ margin-bottom: 20px;
441
+ }
442
+
443
+ /* ══════════════════════════════════════════════════
444
+ LEGEND
445
+ ══════════════════════════════════════════════════ */
446
+ .legend-row {
447
+ display: flex;
448
+ align-items: center;
449
+ gap: 12px;
450
+ }
451
+
452
+ .legend-dot {
453
+ width: 10px;
454
+ height: 10px;
455
+ border-radius: 50%;
456
+ flex-shrink: 0;
457
+ }
458
+
459
+ .legend-label {
460
+ font-size: 12px;
461
+ font-weight: 600;
462
+ color: var(--p-text-color-secondary);
463
+ }
464
+
465
+ /* ══════════════════════════════════════════════════
466
+ RECENT ITEMS
467
+ ══════════════════════════════════════════════════ */
468
+ .recent-item {
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 12px;
472
+ padding: 13px 20px;
473
+ border-bottom: 1px solid var(--p-content-border-color);
474
+ transition:
475
+ background 0.15s,
476
+ padding-left 0.15s;
477
+ cursor: default;
478
+
479
+ &:last-child,
480
+ &.last {
481
+ border-bottom: none;
482
+ }
483
+ }
484
+
485
+ .ri-avatar {
486
+ width: 38px;
487
+ height: 38px;
488
+ border-radius: var(--p-border-radius, 10px);
489
+ display: flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ font-size: 13px;
493
+ font-weight: 800;
494
+ flex-shrink: 0;
495
+ }
496
+
497
+ .ri-info {
498
+ flex: 1;
499
+ min-width: 0;
500
+ }
501
+
502
+ .ri-title {
503
+ font-size: 13px;
504
+ font-weight: 700;
505
+ color: var(--p-text-color);
506
+ white-space: nowrap;
507
+ overflow: hidden;
508
+ text-overflow: ellipsis;
509
+ }
510
+
511
+ .ri-meta {
512
+ font-size: 11px;
513
+ color: var(--p-text-color-secondary);
514
+ margin-top: 2px;
515
+ }
516
+
517
+ /* ══════════════════════════════════════════════════
518
+ STATUS BADGES
519
+ ══════════════════════════════════════════════════ */
520
+ .st-badge {
521
+ display: inline-flex;
522
+ align-items: center;
523
+ gap: 5px;
524
+ padding: 4px 11px;
525
+ border-radius: var(--p-border-radius-xl, 20px);
526
+ font-size: 11px;
527
+ font-weight: 800;
528
+ white-space: nowrap;
529
+ flex-shrink: 0;
530
+ }
531
+
532
+ .st-open {
533
+ background: var(--p-red-100, rgba(239, 68, 68, 0.14));
534
+ border: 1px solid var(--p-red-300, rgba(239, 68, 68, 0.28));
535
+ color: var(--p-red-500, #ef4444);
536
+ }
537
+
538
+ .st-progress {
539
+ background: var(--p-amber-100, rgba(245, 158, 11, 0.14));
540
+ border: 1px solid var(--p-amber-300, rgba(245, 158, 11, 0.28));
541
+ color: var(--p-amber-500, #f59e0b);
542
+ }
543
+
544
+ .st-done {
545
+ background: var(--p-green-100, rgba(16, 185, 129, 0.14));
546
+ border: 1px solid var(--p-green-300, rgba(16, 185, 129, 0.28));
547
+ color: var(--p-green-500, #10b981);
548
+ }
549
+
550
+ .st-dot {
551
+ width: 7px;
552
+ height: 7px;
553
+ border-radius: 50%;
554
+ flex-shrink: 0;
555
+ }
556
+ .dot-red {
557
+ background: var(--p-red-500, #ef4444);
558
+ box-shadow: 0 0 6px rgba(239, 68, 68, 0.6);
559
+ }
560
+ .dot-amber {
561
+ background: var(--p-amber-500, #f59e0b);
562
+ box-shadow: 0 0 6px rgba(245, 158, 11, 0.6);
563
+ }
564
+ .dot-green {
565
+ background: var(--p-green-500, #10b981);
566
+ box-shadow: 0 0 6px rgba(16, 185, 129, 0.6);
567
+ }
568
+
569
+ /* ══════════════════════════════════════════════════
570
+ TYPE BARS
571
+ ══════════════════════════════════════════════════ */
572
+ .type-row {
573
+ display: flex;
574
+ align-items: center;
575
+ gap: 12px;
576
+ padding: 10px 0;
577
+ border-bottom: 1px solid var(--p-content-border-color);
578
+ &:last-child {
579
+ border-bottom: none;
580
+ }
581
+ }
582
+
583
+ .type-name {
584
+ font-size: 12px;
585
+ font-weight: 700;
586
+ color: var(--p-text-color);
587
+ min-width: 88px;
588
+ }
589
+
590
+ .type-bar-bg {
591
+ flex: 1;
592
+ height: 8px;
593
+ border-radius: 99px;
594
+ background: var(--p-surface-200, rgba(0, 0, 0, 0.07));
595
+ overflow: hidden;
596
+ }
597
+
598
+ .type-bar {
599
+ height: 100%;
600
+ border-radius: 99px;
601
+ transition: width 0.7s cubic-bezier(0.4, 0, 0.2, 1);
602
+ }
603
+
604
+ .type-count {
605
+ font-size: 13px;
606
+ font-weight: 700;
607
+ color: var(--p-text-color-secondary);
608
+ min-width: 22px;
609
+ text-align: right;
610
+ }
611
+
612
+ /* ══════════════════════════════════════════════════
613
+ TABLE
614
+ ══════════════════════════════════════════════════ */
615
+ .dash-table {
616
+ width: 100%;
617
+ border-collapse: collapse;
618
+ font-size: 13px;
619
+
620
+ th {
621
+ padding: 11px 16px;
622
+ text-align: left;
623
+ font-size: 11px;
624
+ font-weight: 800;
625
+ text-transform: uppercase;
626
+ letter-spacing: 0.7px;
627
+ color: var(--p-text-color-secondary);
628
+ border-bottom: 1px solid var(--p-content-border-color);
629
+ white-space: nowrap;
630
+ }
631
+
632
+ td {
633
+ padding: 12px 16px;
634
+ border-bottom: 1px solid var(--p-content-border-color);
635
+ color: var(--p-text-color);
636
+ vertical-align: middle;
637
+ }
638
+ }
639
+
640
+ .ticket-id {
641
+ font-size: 11px;
642
+ font-weight: 800;
643
+ color: var(--p-primary-color);
644
+ letter-spacing: 0.5px;
645
+ }
646
+
647
+ .ticket-title-cell {
648
+ font-weight: 600;
649
+ max-width: 200px;
650
+ overflow: hidden;
651
+ text-overflow: ellipsis;
652
+ white-space: nowrap;
653
+ }
654
+
655
+ .table-avatar-wrap {
656
+ display: flex;
657
+ align-items: center;
658
+ gap: 8px;
659
+ white-space: nowrap;
660
+ }
661
+
662
+ .table-avatar {
663
+ width: 30px;
664
+ height: 30px;
665
+ border-radius: var(--p-border-radius-sm, 8px);
666
+ display: flex;
667
+ align-items: center;
668
+ justify-content: center;
669
+ font-size: 11px;
670
+ font-weight: 800;
671
+ flex-shrink: 0;
672
+ }
673
+
674
+ .dept-badge {
675
+ color: var(--p-text-color-secondary);
676
+ border: 1px solid var(--p-content-border-color);
677
+ padding: 3px 9px;
678
+ border-radius: var(--p-border-radius-xl, 20px);
679
+ font-size: 11px;
680
+ font-weight: 700;
681
+ white-space: nowrap;
682
+ }
683
+
684
+ .type-chip {
685
+ font-size: 12px;
686
+ font-weight: 700;
687
+ }
688
+
689
+ .date-cell {
690
+ color: var(--p-text-color-secondary);
691
+ font-size: 12px;
692
+ white-space: nowrap;
693
+ }
694
+
695
+ /* ══════════════════════════════════════════════════
696
+ GHOST BUTTON
697
+ ══════════════════════════════════════════════════ */
698
+ .btn-ghost {
699
+ color: var(--p-text-color-secondary);
700
+ border: 1px solid var(--p-content-border-color);
701
+ padding: 7px 15px;
702
+ border-radius: var(--p-border-radius, 9px);
703
+ font-size: 12px;
704
+ font-weight: 700;
705
+ cursor: pointer;
706
+ transition:
707
+ background 0.2s,
708
+ color 0.2s;
709
+ }
710
+
711
+ /* ══════════════════════════════════════════════════
712
+ SCROLLBAR
713
+ ══════════════════════════════════════════════════ */
714
+ ::-webkit-scrollbar {
715
+ width: 5px;
716
+ height: 5px;
717
+ }
718
+ ::-webkit-scrollbar-track {
719
+ background: transparent;
720
+ }
721
+ ::-webkit-scrollbar-thumb {
722
+ background: var(--p-surface-400, rgba(0, 0, 0, 0.2));
723
+ border-radius: 10px;
724
+ }
725
+
726
+ /* ══════════════════════════════════════════════════
727
+ RESPONSIVE
728
+ ══════════════════════════════════════════════════ */
729
+ @media (max-width: 1100px) {
730
+ .stat-grid {
731
+ grid-template-columns: repeat(2, 1fr);
732
+ }
733
+ .charts-row {
734
+ grid-template-columns: 1fr;
735
+ }
736
+ .donut-body {
737
+ height: auto;
738
+ flex-direction: column;
739
+ align-items: flex-start;
740
+ }
741
+ .chart-body {
742
+ height: 220px;
743
+ }
744
+ }
745
+
746
+ @media (max-width: 768px) {
747
+ .dashboard-wrap {
748
+ padding: 16px;
749
+ }
750
+ .dash-header {
751
+ flex-direction: column;
752
+ align-items: flex-start;
753
+ }
754
+ .two-col {
755
+ grid-template-columns: 1fr;
756
+ }
757
+
758
+ .dash-table th:nth-child(4),
759
+ .dash-table td:nth-child(4),
760
+ .dash-table th:nth-child(7),
761
+ .dash-table td:nth-child(7) {
762
+ display: none;
763
+ }
764
+ }
765
+
766
+ @media (max-width: 520px) {
767
+ .stat-grid {
768
+ grid-template-columns: 1fr;
769
+ }
770
+ .stat-value {
771
+ font-size: 32px;
772
+ }
773
+
774
+ .dash-table th:nth-child(3),
775
+ .dash-table td:nth-child(3) {
776
+ display: none;
777
+ }
778
+ }