@shival99/z-vnetcity 1.4.13

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 (129) hide show
  1. package/README.md +306 -0
  2. package/assets/css/animations.css +207 -0
  3. package/assets/css/base.css +136 -0
  4. package/assets/css/tailwind.css +56 -0
  5. package/assets/css/themes/gray.css +75 -0
  6. package/assets/css/themes/green.css +77 -0
  7. package/assets/css/themes/homy.css +86 -0
  8. package/assets/css/themes/hospital.css +81 -0
  9. package/assets/css/themes/neutral.css +75 -0
  10. package/assets/css/themes/orange.css +75 -0
  11. package/assets/css/themes/slate.css +75 -0
  12. package/assets/css/themes/stone.css +75 -0
  13. package/assets/css/themes/violet.css +75 -0
  14. package/assets/css/themes/zinc.css +75 -0
  15. package/assets/icons/v-customer-service.svg +3 -0
  16. package/assets/images/avatar.svg +6 -0
  17. package/assets/images/logo.svg +6 -0
  18. package/fesm2022/shival99-z-vnetcity-components-z-accordion.mjs +148 -0
  19. package/fesm2022/shival99-z-vnetcity-components-z-accordion.mjs.map +1 -0
  20. package/fesm2022/shival99-z-vnetcity-components-z-breadcrumb.mjs +75 -0
  21. package/fesm2022/shival99-z-vnetcity-components-z-breadcrumb.mjs.map +1 -0
  22. package/fesm2022/shival99-z-vnetcity-components-z-button.mjs +156 -0
  23. package/fesm2022/shival99-z-vnetcity-components-z-button.mjs.map +1 -0
  24. package/fesm2022/shival99-z-vnetcity-components-z-calendar.mjs +3120 -0
  25. package/fesm2022/shival99-z-vnetcity-components-z-calendar.mjs.map +1 -0
  26. package/fesm2022/shival99-z-vnetcity-components-z-card.mjs +118 -0
  27. package/fesm2022/shival99-z-vnetcity-components-z-card.mjs.map +1 -0
  28. package/fesm2022/shival99-z-vnetcity-components-z-checkbox.mjs +252 -0
  29. package/fesm2022/shival99-z-vnetcity-components-z-checkbox.mjs.map +1 -0
  30. package/fesm2022/shival99-z-vnetcity-components-z-code.mjs +140 -0
  31. package/fesm2022/shival99-z-vnetcity-components-z-code.mjs.map +1 -0
  32. package/fesm2022/shival99-z-vnetcity-components-z-drawer.mjs +683 -0
  33. package/fesm2022/shival99-z-vnetcity-components-z-drawer.mjs.map +1 -0
  34. package/fesm2022/shival99-z-vnetcity-components-z-dropdown-menu.mjs +56 -0
  35. package/fesm2022/shival99-z-vnetcity-components-z-dropdown-menu.mjs.map +1 -0
  36. package/fesm2022/shival99-z-vnetcity-components-z-editor.mjs +422 -0
  37. package/fesm2022/shival99-z-vnetcity-components-z-editor.mjs.map +1 -0
  38. package/fesm2022/shival99-z-vnetcity-components-z-empty.mjs +136 -0
  39. package/fesm2022/shival99-z-vnetcity-components-z-empty.mjs.map +1 -0
  40. package/fesm2022/shival99-z-vnetcity-components-z-filter.mjs +788 -0
  41. package/fesm2022/shival99-z-vnetcity-components-z-filter.mjs.map +1 -0
  42. package/fesm2022/shival99-z-vnetcity-components-z-icon.mjs +515 -0
  43. package/fesm2022/shival99-z-vnetcity-components-z-icon.mjs.map +1 -0
  44. package/fesm2022/shival99-z-vnetcity-components-z-input.mjs +808 -0
  45. package/fesm2022/shival99-z-vnetcity-components-z-input.mjs.map +1 -0
  46. package/fesm2022/shival99-z-vnetcity-components-z-loading.mjs +105 -0
  47. package/fesm2022/shival99-z-vnetcity-components-z-loading.mjs.map +1 -0
  48. package/fesm2022/shival99-z-vnetcity-components-z-menu.mjs +402 -0
  49. package/fesm2022/shival99-z-vnetcity-components-z-menu.mjs.map +1 -0
  50. package/fesm2022/shival99-z-vnetcity-components-z-modal.mjs +742 -0
  51. package/fesm2022/shival99-z-vnetcity-components-z-modal.mjs.map +1 -0
  52. package/fesm2022/shival99-z-vnetcity-components-z-pagination.mjs +146 -0
  53. package/fesm2022/shival99-z-vnetcity-components-z-pagination.mjs.map +1 -0
  54. package/fesm2022/shival99-z-vnetcity-components-z-popover.mjs +942 -0
  55. package/fesm2022/shival99-z-vnetcity-components-z-popover.mjs.map +1 -0
  56. package/fesm2022/shival99-z-vnetcity-components-z-radio.mjs +154 -0
  57. package/fesm2022/shival99-z-vnetcity-components-z-radio.mjs.map +1 -0
  58. package/fesm2022/shival99-z-vnetcity-components-z-select.mjs +1111 -0
  59. package/fesm2022/shival99-z-vnetcity-components-z-select.mjs.map +1 -0
  60. package/fesm2022/shival99-z-vnetcity-components-z-skeleton.mjs +142 -0
  61. package/fesm2022/shival99-z-vnetcity-components-z-skeleton.mjs.map +1 -0
  62. package/fesm2022/shival99-z-vnetcity-components-z-steps.mjs +394 -0
  63. package/fesm2022/shival99-z-vnetcity-components-z-steps.mjs.map +1 -0
  64. package/fesm2022/shival99-z-vnetcity-components-z-switch.mjs +139 -0
  65. package/fesm2022/shival99-z-vnetcity-components-z-switch.mjs.map +1 -0
  66. package/fesm2022/shival99-z-vnetcity-components-z-table.mjs +4286 -0
  67. package/fesm2022/shival99-z-vnetcity-components-z-table.mjs.map +1 -0
  68. package/fesm2022/shival99-z-vnetcity-components-z-tabs.mjs +261 -0
  69. package/fesm2022/shival99-z-vnetcity-components-z-tabs.mjs.map +1 -0
  70. package/fesm2022/shival99-z-vnetcity-components-z-tags.mjs +312 -0
  71. package/fesm2022/shival99-z-vnetcity-components-z-tags.mjs.map +1 -0
  72. package/fesm2022/shival99-z-vnetcity-components-z-timeline.mjs +333 -0
  73. package/fesm2022/shival99-z-vnetcity-components-z-timeline.mjs.map +1 -0
  74. package/fesm2022/shival99-z-vnetcity-components-z-toast.mjs +283 -0
  75. package/fesm2022/shival99-z-vnetcity-components-z-toast.mjs.map +1 -0
  76. package/fesm2022/shival99-z-vnetcity-components-z-tooltip.mjs +681 -0
  77. package/fesm2022/shival99-z-vnetcity-components-z-tooltip.mjs.map +1 -0
  78. package/fesm2022/shival99-z-vnetcity-components-z-upload.mjs +510 -0
  79. package/fesm2022/shival99-z-vnetcity-components-z-upload.mjs.map +1 -0
  80. package/fesm2022/shival99-z-vnetcity-i18n.mjs +411 -0
  81. package/fesm2022/shival99-z-vnetcity-i18n.mjs.map +1 -0
  82. package/fesm2022/shival99-z-vnetcity-pipes.mjs +120 -0
  83. package/fesm2022/shival99-z-vnetcity-pipes.mjs.map +1 -0
  84. package/fesm2022/shival99-z-vnetcity-providers.mjs +219 -0
  85. package/fesm2022/shival99-z-vnetcity-providers.mjs.map +1 -0
  86. package/fesm2022/shival99-z-vnetcity-services.mjs +2103 -0
  87. package/fesm2022/shival99-z-vnetcity-services.mjs.map +1 -0
  88. package/fesm2022/shival99-z-vnetcity-utils.mjs +600 -0
  89. package/fesm2022/shival99-z-vnetcity-utils.mjs.map +1 -0
  90. package/fesm2022/z-ui.mjs +8 -0
  91. package/fesm2022/z-ui.mjs.map +1 -0
  92. package/package.json +263 -0
  93. package/types/shival99-z-vnetcity-components-z-accordion.d.ts +55 -0
  94. package/types/shival99-z-vnetcity-components-z-breadcrumb.d.ts +36 -0
  95. package/types/shival99-z-vnetcity-components-z-button.d.ts +41 -0
  96. package/types/shival99-z-vnetcity-components-z-calendar.d.ts +411 -0
  97. package/types/shival99-z-vnetcity-components-z-card.d.ts +53 -0
  98. package/types/shival99-z-vnetcity-components-z-checkbox.d.ts +89 -0
  99. package/types/shival99-z-vnetcity-components-z-code.d.ts +36 -0
  100. package/types/shival99-z-vnetcity-components-z-drawer.d.ts +234 -0
  101. package/types/shival99-z-vnetcity-components-z-dropdown-menu.d.ts +52 -0
  102. package/types/shival99-z-vnetcity-components-z-editor.d.ts +117 -0
  103. package/types/shival99-z-vnetcity-components-z-empty.d.ts +51 -0
  104. package/types/shival99-z-vnetcity-components-z-filter.d.ts +268 -0
  105. package/types/shival99-z-vnetcity-components-z-icon.d.ts +334 -0
  106. package/types/shival99-z-vnetcity-components-z-input.d.ts +199 -0
  107. package/types/shival99-z-vnetcity-components-z-loading.d.ts +46 -0
  108. package/types/shival99-z-vnetcity-components-z-menu.d.ts +138 -0
  109. package/types/shival99-z-vnetcity-components-z-modal.d.ts +273 -0
  110. package/types/shival99-z-vnetcity-components-z-pagination.d.ts +55 -0
  111. package/types/shival99-z-vnetcity-components-z-popover.d.ts +137 -0
  112. package/types/shival99-z-vnetcity-components-z-radio.d.ts +63 -0
  113. package/types/shival99-z-vnetcity-components-z-select.d.ts +296 -0
  114. package/types/shival99-z-vnetcity-components-z-skeleton.d.ts +56 -0
  115. package/types/shival99-z-vnetcity-components-z-steps.d.ts +106 -0
  116. package/types/shival99-z-vnetcity-components-z-switch.d.ts +50 -0
  117. package/types/shival99-z-vnetcity-components-z-table.d.ts +725 -0
  118. package/types/shival99-z-vnetcity-components-z-tabs.d.ts +76 -0
  119. package/types/shival99-z-vnetcity-components-z-tags.d.ts +115 -0
  120. package/types/shival99-z-vnetcity-components-z-timeline.d.ts +98 -0
  121. package/types/shival99-z-vnetcity-components-z-toast.d.ts +127 -0
  122. package/types/shival99-z-vnetcity-components-z-tooltip.d.ts +86 -0
  123. package/types/shival99-z-vnetcity-components-z-upload.d.ts +137 -0
  124. package/types/shival99-z-vnetcity-i18n.d.ts +34 -0
  125. package/types/shival99-z-vnetcity-pipes.d.ts +44 -0
  126. package/types/shival99-z-vnetcity-providers.d.ts +151 -0
  127. package/types/shival99-z-vnetcity-services.d.ts +595 -0
  128. package/types/shival99-z-vnetcity-utils.d.ts +118 -0
  129. package/types/z-ui.d.ts +3 -0
package/README.md ADDED
@@ -0,0 +1,306 @@
1
+ # Z-UI - Modern Angular Component Library
2
+
3
+ A comprehensive, high-performance UI component library built with Angular 21+, featuring 40+ customizable components with dark mode, accessibility, and enterprise-ready features.
4
+
5
+ ## Features
6
+
7
+ - **40+ Components** - Buttons, Inputs, Tables, Modals, Calendars, and more
8
+ - **Dark Mode** - Built-in theme support with 9 color themes
9
+ - **Accessible** - WCAG 2.1 compliant components
10
+ - **Responsive** - Mobile-first responsive design
11
+ - **High Performance** - OnPush change detection, virtual scrolling
12
+ - **Customizable** - CSS variables, class-variance-authority
13
+ - **Tree-shakable** - Import only what you need
14
+ - **Type-safe** - Full TypeScript support with strict mode
15
+ - **i18n Ready** - Built-in translation support
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ pnpm add @shival99/z-vnetcity
21
+ ```
22
+
23
+ ### Peer Dependencies
24
+
25
+ ```bash
26
+ pnpm add @angular/cdk @ng-icons/core @ng-icons/lucide @ng-icons/iconsax \
27
+ @tanstack/angular-table @shival99/angular-virtual \
28
+ class-variance-authority clsx tailwind-merge \
29
+ ngx-mask ngx-scrollbar @shival99/ngx-sonner ngxtension minisearch
30
+ ```
31
+
32
+ ### Optional Dependencies
33
+
34
+ ```bash
35
+ pnpm add ngx-quill quill # Rich Text Editor
36
+ pnpm add shiki dompurify # Syntax Highlighting
37
+ pnpm add echarts ngx-echarts # Charts
38
+ pnpm add @ngx-translate/core @ngx-translate/http-loader # i18n
39
+ pnpm add exceljs file-saver xlsx # Excel Export
40
+ ```
41
+
42
+ ### Tailwind CSS v4 Setup
43
+
44
+ Z-UI requires Tailwind CSS v4. Install the dependencies:
45
+
46
+ ```bash
47
+ pnpm add -D tailwindcss @tailwindcss/postcss postcss
48
+ ```
49
+
50
+ Create `postcss.config.mjs` in your project root:
51
+
52
+ ```javascript
53
+ export default {
54
+ plugins: {
55
+ '@tailwindcss/postcss': {},
56
+ },
57
+ };
58
+ ```
59
+
60
+ Update your `project.json` or `angular.json` styles:
61
+
62
+ ```json
63
+ "styles": [
64
+ "node_modules/@shival99/z-vnetcity/assets/css/themes/green.css",
65
+ "node_modules/@shival99/z-vnetcity/assets/css/tailwind.css",
66
+ "src/styles.scss"
67
+ ]
68
+ ```
69
+
70
+ Copy theme files to assets for lazy loading (optional):
71
+
72
+ ```json
73
+ "assets": [
74
+ {
75
+ "glob": "*.css",
76
+ "input": "node_modules/@shival99/z-vnetcity/assets/css/themes",
77
+ "output": "assets/css/themes"
78
+ }
79
+ ]
80
+ ```
81
+
82
+ ## Quick Start
83
+
84
+ ### Import Components
85
+
86
+ ```typescript
87
+ import { ZButtonComponent } from '@shival99/z-vnetcity/components/z-button';
88
+ import { ZInputComponent } from '@shival99/z-vnetcity/components/z-input';
89
+ import { ZTableComponent } from '@shival99/z-vnetcity/components/z-table';
90
+
91
+ @Component({
92
+ selector: 'app-root',
93
+ standalone: true,
94
+ imports: [ZButtonComponent, ZInputComponent, ZTableComponent],
95
+ template: `
96
+ <z-button zVariant="primary">Click me</z-button>
97
+ <z-input zLabel="Email" zPlaceholder="Enter email" />
98
+ `,
99
+ })
100
+ export class AppComponent {}
101
+ ```
102
+
103
+ ### Configure Providers
104
+
105
+ ```typescript
106
+ import { provideZTranslate } from '@shival99/z-vnetcity/providers';
107
+ import { provideZNgxMask } from '@shival99/z-vnetcity/providers';
108
+
109
+ export const appConfig: ApplicationConfig = {
110
+ providers: [provideZTranslate({ defaultLang: 'vi', langPath: '/assets/i18n/' }), provideZNgxMask()],
111
+ };
112
+ ```
113
+
114
+ ## Components
115
+
116
+ | Category | Components |
117
+ | ----------- | ---------------------------------------------------------------- |
118
+ | **Form** | Input, Select, Checkbox, Radio, Switch, Calendar, Upload, Filter |
119
+ | **Data** | Table, Pagination, Code, Editor, Timeline |
120
+ | **Overlay** | Modal, Drawer, Toast, Tooltip, Popover, Dropdown Menu |
121
+ | **Layout** | Accordion, Tabs, Menu, Breadcrumb, Skeleton |
122
+ | **Display** | Button, Icon, Loading |
123
+
124
+ ## Import Paths
125
+
126
+ ```typescript
127
+ import { ZButtonComponent } from '@shival99/z-vnetcity/components/z-button';
128
+ import { ZTableComponent } from '@shival99/z-vnetcity/components/z-table';
129
+ import { ZModalService } from '@shival99/z-vnetcity/components/z-modal';
130
+
131
+ import { ZThemeService, ZCacheService } from '@shival99/z-vnetcity/services';
132
+ import { provideZTranslate } from '@shival99/z-vnetcity/providers';
133
+ import { zTransform, zMergeClasses } from '@shival99/z-vnetcity/utils';
134
+ import { ZSafeHtmlPipe } from '@shival99/z-vnetcity/pipes';
135
+ import { Z_UI_TRANSLATIONS } from '@shival99/z-vnetcity/i18n';
136
+ ```
137
+
138
+ ## Theming
139
+
140
+ Available themes: `green`, `orange`, `violet`, `neutral`, `zinc`, `slate`, `stone`, `gray`, `hospital`
141
+
142
+ ```typescript
143
+ import { ZThemeService } from '@shival99/z-vnetcity/services';
144
+
145
+ export class AppComponent {
146
+ private themeService = inject(ZThemeService);
147
+
148
+ ngOnInit() {
149
+ this.themeService.setTheme('violet');
150
+ this.themeService.toggleDarkMode(true);
151
+ }
152
+ }
153
+ ```
154
+
155
+ ## CSS Variables
156
+
157
+ Z-UI uses CSS variables for customization. You can override these variables in your project's CSS to customize the look and feel.
158
+
159
+ ### Font Variables
160
+
161
+ Override these in your `styles.css` or `styles.scss`:
162
+
163
+ ```css
164
+ :root {
165
+ --font-sans: 'Be Vietnam Pro', system-ui, -apple-system, sans-serif;
166
+ --font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'Courier New', monospace;
167
+ }
168
+ ```
169
+
170
+ Example - Using Inter font:
171
+
172
+ ```css
173
+ :root {
174
+ --font-sans: 'Inter', system-ui, -apple-system, sans-serif;
175
+ }
176
+ ```
177
+
178
+ ### Theme Variables (Light Mode)
179
+
180
+ ```css
181
+ :root {
182
+ --radius: 0.625rem;
183
+ --background: oklch(1 0 0);
184
+ --foreground: oklch(0.145 0.031 264.539);
185
+ --card: oklch(1 0 0);
186
+ --card-foreground: oklch(0.145 0.031 264.539);
187
+ --popover: oklch(1 0 0);
188
+ --popover-foreground: oklch(0.145 0.031 264.539);
189
+ --primary: oklch(0.422 0.095 166.913);
190
+ --primary-foreground: oklch(0.982 0.018 166.913);
191
+ --secondary: oklch(0.967 0.004 264.539);
192
+ --secondary-foreground: oklch(0.209 0.021 264.539);
193
+ --muted: oklch(0.967 0.004 264.539);
194
+ --muted-foreground: oklch(0.556 0.024 264.539);
195
+ --accent: oklch(0.967 0.004 264.539);
196
+ --accent-foreground: oklch(0.209 0.021 264.539);
197
+ --destructive: oklch(0.577 0.245 27.325);
198
+ --destructive-foreground: oklch(0.985 0 0);
199
+ --border: oklch(0.929 0.007 264.539);
200
+ --input: oklch(0.929 0.007 264.539);
201
+ --input-autofill: oklch(1 0 0);
202
+ --ring: oklch(0.422 0.095 166.913);
203
+ --chart-1: oklch(0.646 0.222 41.116);
204
+ --chart-2: oklch(0.6 0.118 184.704);
205
+ --chart-3: oklch(0.398 0.07 227.334);
206
+ --chart-4: oklch(0.828 0.189 84.429);
207
+ --chart-5: oklch(0.769 0.188 70.08);
208
+ --sidebar: oklch(0.985 0.001 264.539);
209
+ --sidebar-foreground: oklch(0.145 0.031 264.539);
210
+ --sidebar-primary: oklch(0.422 0.095 166.913);
211
+ --sidebar-primary-foreground: oklch(0.982 0.018 166.913);
212
+ --sidebar-accent: oklch(0.967 0.004 264.539);
213
+ --sidebar-accent-foreground: oklch(0.209 0.021 264.539);
214
+ --sidebar-border: oklch(0.929 0.007 264.539);
215
+ --sidebar-ring: oklch(0.422 0.095 166.913);
216
+ }
217
+ ```
218
+
219
+ ### Theme Variables (Dark Mode)
220
+
221
+ ```css
222
+ .dark {
223
+ --background: oklch(0.145 0.031 264.539);
224
+ --foreground: oklch(0.985 0.001 264.539);
225
+ --card: oklch(0.209 0.021 264.539);
226
+ --card-foreground: oklch(0.985 0.001 264.539);
227
+ --popover: oklch(0.209 0.021 264.539);
228
+ --popover-foreground: oklch(0.985 0.001 264.539);
229
+ --primary: oklch(0.696 0.17 162.48);
230
+ --primary-foreground: oklch(0.209 0.021 264.539);
231
+ --secondary: oklch(0.268 0.019 264.539);
232
+ --secondary-foreground: oklch(0.985 0.001 264.539);
233
+ --muted: oklch(0.268 0.019 264.539);
234
+ --muted-foreground: oklch(0.708 0.019 264.539);
235
+ --accent: oklch(0.268 0.019 264.539);
236
+ --accent-foreground: oklch(0.985 0.001 264.539);
237
+ --destructive: oklch(0.704 0.191 22.216);
238
+ --destructive-foreground: oklch(0.985 0 0);
239
+ --border: oklch(1 0 0 / 10%);
240
+ --input: oklch(1 0 0 / 15%);
241
+ --input-autofill: oklch(0.19 0 0);
242
+ --ring: oklch(0.527 0.154 150.069);
243
+ --chart-1: oklch(0.488 0.243 264.376);
244
+ --chart-2: oklch(0.696 0.17 162.48);
245
+ --chart-3: oklch(0.769 0.188 70.08);
246
+ --chart-4: oklch(0.627 0.265 303.9);
247
+ --chart-5: oklch(0.645 0.246 16.439);
248
+ --sidebar: oklch(0.209 0.021 264.539);
249
+ --sidebar-foreground: oklch(0.985 0.001 264.539);
250
+ --sidebar-primary: oklch(0.696 0.17 162.48);
251
+ --sidebar-primary-foreground: oklch(0.209 0.021 264.539);
252
+ --sidebar-accent: oklch(0.268 0.019 264.539);
253
+ --sidebar-accent-foreground: oklch(0.985 0.001 264.539);
254
+ --sidebar-border: oklch(1 0 0 / 10%);
255
+ --sidebar-ring: oklch(0.527 0.154 150.069);
256
+ }
257
+ ```
258
+
259
+ ### Scrollbar Variables
260
+
261
+ ```css
262
+ :root {
263
+ --scrollbar-track-color: transparent;
264
+ --scrollbar-track-shape: 5px;
265
+ --scrollbar-track-thickness: 7px;
266
+ --scrollbar-thumb-color: #d1d5db;
267
+ --scrollbar-thumb-hover-color: #9ca3af;
268
+ --scrollbar-thumb-shape: 5px;
269
+ --scrollbar-thumb-min-size: 40;
270
+ --scrollbar-hover-opacity-transition-leave-duration: 0.3s;
271
+ --scrollbar-hover-opacity-transition-leave-delay: 0.5s;
272
+ }
273
+
274
+ .dark {
275
+ --scrollbar-thumb-color: #4b5563;
276
+ --scrollbar-thumb-hover-color: #6b7280;
277
+ }
278
+ ```
279
+
280
+ ### Example: Custom Override
281
+
282
+ Create a custom theme by overriding variables in your project:
283
+
284
+ ```css
285
+ /* styles.css */
286
+ :root {
287
+ /* Custom font */
288
+ --font-sans: 'Roboto', system-ui, sans-serif;
289
+
290
+ /* Custom primary color */
291
+ --primary: oklch(0.6 0.2 240);
292
+ --primary-foreground: oklch(1 0 0);
293
+
294
+ /* Custom border radius */
295
+ --radius: 0.5rem;
296
+ }
297
+
298
+ .dark {
299
+ /* Dark mode primary color */
300
+ --primary: oklch(0.7 0.2 240);
301
+ }
302
+ ```
303
+
304
+ ## License
305
+
306
+ MIT © [VuBoi](https://github.com/vuboi)
@@ -0,0 +1,207 @@
1
+ /* ===== Animation Utilities ===== */
2
+ @layer base {
3
+ @keyframes z-enter {
4
+ from {
5
+ opacity: var(--z-enter-opacity, 1);
6
+ transform: translate3d(var(--z-enter-translate-x, 0), var(--z-enter-translate-y, 0), 0)
7
+ scale3d(var(--z-enter-scale, 1), var(--z-enter-scale, 1), var(--z-enter-scale, 1));
8
+ }
9
+ }
10
+
11
+ @keyframes z-exit {
12
+ to {
13
+ opacity: var(--z-exit-opacity, 1);
14
+ transform: translate3d(var(--z-exit-translate-x, 0), var(--z-exit-translate-y, 0), 0)
15
+ scale3d(var(--z-exit-scale, 1), var(--z-exit-scale, 1), var(--z-exit-scale, 1));
16
+ }
17
+ }
18
+
19
+ .z-animate-in {
20
+ animation: z-enter 180ms cubic-bezier(0.32, 0.72, 0, 1);
21
+ animation-fill-mode: forwards;
22
+ }
23
+
24
+ .z-animate-out {
25
+ animation: z-exit 150ms cubic-bezier(0.32, 0.72, 0, 1);
26
+ animation-fill-mode: forwards;
27
+ }
28
+
29
+ /* Fade */
30
+ .z-fade-in {
31
+ --z-enter-opacity: 0;
32
+ }
33
+
34
+ .z-fade-out {
35
+ --z-exit-opacity: 0;
36
+ }
37
+
38
+ /* Zoom/Scale */
39
+ .z-zoom-in-95 {
40
+ --z-enter-scale: 0.95;
41
+ }
42
+
43
+ .z-zoom-out-95 {
44
+ --z-exit-scale: 0.95;
45
+ }
46
+
47
+ .z-zoom-in-90 {
48
+ --z-enter-scale: 0.9;
49
+ }
50
+
51
+ .z-zoom-out-90 {
52
+ --z-exit-scale: 0.9;
53
+ }
54
+
55
+ /* Slide */
56
+ .z-slide-in-from-top-2 {
57
+ --z-enter-translate-y: -4px;
58
+ }
59
+
60
+ .z-slide-out-to-top-2 {
61
+ --z-exit-translate-y: -4px;
62
+ }
63
+
64
+ .z-slide-in-from-bottom-2 {
65
+ --z-enter-translate-y: 4px;
66
+ }
67
+
68
+ .z-slide-out-to-bottom-2 {
69
+ --z-exit-translate-y: 4px;
70
+ }
71
+
72
+ .z-slide-in-from-left-2 {
73
+ --z-enter-translate-x: -4px;
74
+ }
75
+
76
+ .z-slide-out-to-left-2 {
77
+ --z-exit-translate-x: -4px;
78
+ }
79
+
80
+ .z-slide-in-from-right-2 {
81
+ --z-enter-translate-x: 4px;
82
+ }
83
+
84
+ .z-slide-out-to-right-2 {
85
+ --z-exit-translate-x: 4px;
86
+ }
87
+
88
+ /* Slide-4 (8px) - for popover */
89
+ .z-slide-in-from-top-4 {
90
+ --z-enter-translate-y: -8px;
91
+ }
92
+
93
+ .z-slide-out-to-top-4 {
94
+ --z-exit-translate-y: -8px;
95
+ }
96
+
97
+ .z-slide-in-from-bottom-4 {
98
+ --z-enter-translate-y: 8px;
99
+ }
100
+
101
+ .z-slide-out-to-bottom-4 {
102
+ --z-exit-translate-y: 8px;
103
+ }
104
+
105
+ .z-slide-in-from-left-4 {
106
+ --z-enter-translate-x: -8px;
107
+ }
108
+
109
+ .z-slide-out-to-left-4 {
110
+ --z-exit-translate-x: -8px;
111
+ }
112
+
113
+ .z-slide-in-from-right-4 {
114
+ --z-enter-translate-x: 8px;
115
+ }
116
+
117
+ .z-slide-out-to-right-4 {
118
+ --z-exit-translate-x: 8px;
119
+ }
120
+
121
+ /* Duration modifiers */
122
+ .z-duration-100 {
123
+ animation-duration: 100ms;
124
+ }
125
+
126
+ .z-duration-150 {
127
+ animation-duration: 150ms;
128
+ }
129
+
130
+ .z-duration-200 {
131
+ animation-duration: 200ms;
132
+ }
133
+
134
+ .z-duration-300 {
135
+ animation-duration: 300ms;
136
+ }
137
+
138
+ /* CDK Overlay Backdrop Animation */
139
+ @keyframes z-backdrop-enter {
140
+ from {
141
+ opacity: 0;
142
+ }
143
+
144
+ to {
145
+ opacity: 1;
146
+ }
147
+ }
148
+
149
+ @keyframes z-backdrop-exit {
150
+ from {
151
+ opacity: 1;
152
+ }
153
+
154
+ to {
155
+ opacity: 0;
156
+ }
157
+ }
158
+
159
+ @keyframes z-spin-effect {
160
+ to {
161
+ transform: rotate(360deg);
162
+ }
163
+ }
164
+
165
+ .z-animate-spin {
166
+ animation: z-spin-effect 1s linear infinite;
167
+ }
168
+
169
+ @keyframes z-wave-effect {
170
+ to {
171
+ box-shadow: 0 0 0 5px var(--z-wave-color, currentColor);
172
+ }
173
+ }
174
+
175
+ @keyframes z-fade-effect {
176
+ to {
177
+ opacity: 0;
178
+ }
179
+ }
180
+
181
+ .z-animate-wave {
182
+ position: absolute;
183
+ inset: 0;
184
+ display: block;
185
+ border-radius: inherit;
186
+ box-shadow: 0 0 0 0 var(--z-wave-color, currentColor);
187
+ opacity: 0.2;
188
+ animation:
189
+ z-fade-effect 2s cubic-bezier(0.08, 0.82, 0.17, 1),
190
+ z-wave-effect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);
191
+ animation-fill-mode: forwards;
192
+ pointer-events: none;
193
+ }
194
+
195
+ /* CDK Backdrop Styles for Service Mode Modal */
196
+ .cdk-overlay-backdrop {
197
+ animation: z-backdrop-enter 150ms ease-out forwards;
198
+ }
199
+
200
+ .cdk-overlay-backdrop.cdk-overlay-backdrop-showing {
201
+ opacity: 1;
202
+ }
203
+
204
+ .cdk-overlay-backdrop.z-backdrop-leaving {
205
+ animation: z-backdrop-exit 120ms ease-in forwards;
206
+ }
207
+ }
@@ -0,0 +1,136 @@
1
+ :root {
2
+ --font-sans: 'Be Vietnam Pro', system-ui, -apple-system, sans-serif;
3
+ --font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'Courier New', monospace;
4
+ --scrollbar-track-color: transparent;
5
+ --scrollbar-track-shape: 5px;
6
+ --scrollbar-track-thickness: 7px;
7
+ --scrollbar-thumb-color: #d1d5db;
8
+ --scrollbar-thumb-hover-color: #9ca3af;
9
+ --scrollbar-thumb-shape: 5px;
10
+ --scrollbar-thumb-min-size: 40;
11
+ --scrollbar-hover-opacity-transition-leave-duration: 0.3s;
12
+ --scrollbar-hover-opacity-transition-leave-delay: 0.5s;
13
+
14
+ /* Shadow tokens */
15
+ --shadow-card: 0 0 5px 0 rgba(0, 0, 0, 0.1), 0 0 1px 0 rgba(0, 0, 0, 0.1);
16
+ --shadow-card-md: 0 2px 8px rgba(0, 0, 0, 0.15);
17
+ --shadow-card-lg: 0 4px 8px -2px rgba(9, 30, 66, 0.25), 0 0 0 1px rgba(9, 30, 66, 0.08);
18
+ --shadow-card-soft: 0 0 0.25em rgba(67, 71, 85, 0.27), 0 0.25em 1em rgba(90, 125, 188, 0.05);
19
+ }
20
+
21
+ * {
22
+ border-color: var(--border);
23
+ outline-color: color-mix(in srgb, var(--ring) 50%, transparent);
24
+ }
25
+
26
+ body {
27
+ background-color: var(--background);
28
+ color: var(--foreground);
29
+ font-family: var(--font-sans);
30
+ -webkit-font-smoothing: antialiased;
31
+ -moz-osx-font-smoothing: grayscale;
32
+ }
33
+
34
+ ::-webkit-scrollbar {
35
+ width: 7px;
36
+ height: 7px;
37
+ }
38
+
39
+ ::-webkit-scrollbar-track {
40
+ background: transparent;
41
+ }
42
+
43
+ ::-webkit-scrollbar-thumb {
44
+ background-color: #d1d5db;
45
+ border-radius: 5px;
46
+ }
47
+
48
+ ::-webkit-scrollbar-thumb:hover,
49
+ ::-webkit-scrollbar-thumb:active {
50
+ background-color: #9ca3af;
51
+ }
52
+
53
+ ::-webkit-scrollbar-corner {
54
+ background: transparent;
55
+ }
56
+
57
+ .dark ::-webkit-scrollbar-thumb {
58
+ background-color: #4b5563;
59
+ }
60
+
61
+ .dark ::-webkit-scrollbar-thumb:hover,
62
+ .dark ::-webkit-scrollbar-thumb:active {
63
+ background-color: #6b7280;
64
+ }
65
+
66
+ .dark {
67
+ --scrollbar-thumb-color: #4b5563;
68
+ --scrollbar-thumb-hover-color: #6b7280;
69
+ --input-autofill: oklch(0.25 0.03 265.94);
70
+ }
71
+
72
+ /* ==================== Utility Classes ==================== */
73
+
74
+ @layer utilities {
75
+ .shadow-card {
76
+ box-shadow: var(--shadow-card);
77
+ }
78
+
79
+ .shadow-card-md {
80
+ box-shadow: var(--shadow-card-md);
81
+ }
82
+
83
+ .shadow-card-lg {
84
+ box-shadow: var(--shadow-card-lg);
85
+ }
86
+
87
+ .shadow-card-soft {
88
+ box-shadow: var(--shadow-card-soft);
89
+ }
90
+ }
91
+
92
+ /* ==================== CDK Drag-Drop Styles ==================== */
93
+
94
+ /* Drag Preview - Element being dragged */
95
+ .cdk-drag-preview {
96
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.15);
97
+ border-radius: 6px;
98
+ background-color: var(--card);
99
+ z-index: 10000 !important;
100
+ pointer-events: none;
101
+ opacity: 1;
102
+ padding: 1rem;
103
+ }
104
+
105
+ .dark .cdk-drag-preview {
106
+ border: 1px solid var(--border);
107
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.4);
108
+ }
109
+
110
+ /* Drag Placeholder - Empty space where item was */
111
+ .cdk-drag-placeholder {
112
+ background-color: color-mix(in srgb, var(--primary) 12%, transparent);
113
+ border: 2px dashed var(--primary);
114
+ border-radius: 6px;
115
+ opacity: 0.8;
116
+ visibility: visible;
117
+ }
118
+
119
+ .cdk-drag-placeholder * {
120
+ opacity: 0;
121
+ }
122
+
123
+ /* Drag Animation - Item movement transition */
124
+ .cdk-drag-animating {
125
+ transition: transform 100ms cubic-bezier(0, 0, 0.2, 1);
126
+ }
127
+
128
+ /* Drop List Animation - Smooth sorting transition */
129
+ .cdk-drop-list-dragging .cdk-drag:not(.cdk-drag-placeholder) {
130
+ transition: transform 100ms cubic-bezier(0, 0, 0.2, 1);
131
+ }
132
+
133
+ /* Dragging Item - No transition during drag */
134
+ .cdk-drag-dragging {
135
+ transition: none !important;
136
+ }
@@ -0,0 +1,56 @@
1
+ @import 'tailwindcss';
2
+
3
+ /* Scan z-ui compiled components for class generation */
4
+ @source '../../fesm2022';
5
+
6
+ /* Configure dark mode to use class instead of prefers-color-scheme */
7
+ @custom-variant dark (&:where(.dark, .dark *));
8
+
9
+ @theme inline {
10
+ --color-background: var(--background);
11
+ --color-foreground: var(--foreground);
12
+ --color-card: var(--card);
13
+ --color-card-foreground: var(--card-foreground);
14
+ --color-popover: var(--popover);
15
+ --color-popover-foreground: var(--popover-foreground);
16
+ --color-primary: var(--primary);
17
+ --color-primary-foreground: var(--primary-foreground);
18
+ --color-secondary: var(--secondary);
19
+ --color-secondary-foreground: var(--secondary-foreground);
20
+ --color-muted: var(--muted);
21
+ --color-muted-foreground: var(--muted-foreground);
22
+ --color-accent: var(--accent);
23
+ --color-accent-foreground: var(--accent-foreground);
24
+ --color-destructive: var(--destructive);
25
+ --color-destructive-foreground: var(--destructive-foreground);
26
+ --color-border: var(--border);
27
+ --color-input: var(--input);
28
+ --color-ring: var(--ring);
29
+ --color-chart-1: var(--chart-1);
30
+ --color-chart-2: var(--chart-2);
31
+ --color-chart-3: var(--chart-3);
32
+ --color-chart-4: var(--chart-4);
33
+ --color-chart-5: var(--chart-5);
34
+ --color-sidebar: var(--sidebar);
35
+ --color-sidebar-foreground: var(--sidebar-foreground);
36
+ --color-sidebar-primary: var(--sidebar-primary);
37
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
38
+ --color-sidebar-accent: var(--sidebar-accent);
39
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
40
+ --color-sidebar-border: var(--sidebar-border);
41
+ --color-sidebar-ring: var(--sidebar-ring);
42
+ --radius-sm: calc(var(--radius) - 4px);
43
+ --radius-md: calc(var(--radius) - 2px);
44
+ --radius-lg: var(--radius);
45
+ --radius-xl: calc(var(--radius) + 4px);
46
+ }
47
+
48
+ /* Base styles */
49
+ @import './base.css';
50
+
51
+ /* Animations */
52
+ @import './animations.css';
53
+
54
+ /* Themes - Homy theme is the default */
55
+ /* Other themes are lazy loaded by ZThemeService when setTheme() is called */
56
+ @import './themes/homy.css';