@shival99/z-ui 1.0.1 → 1.0.3
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.
- package/README.md +50 -77
- package/assets/css/animations.css +207 -0
- package/assets/css/base.css +76 -0
- package/assets/css/tailwind.css +53 -0
- package/assets/css/themes/gray.css +73 -0
- package/assets/css/themes/green.css +75 -0
- package/assets/css/themes/hospital.css +79 -0
- package/assets/css/themes/neutral.css +73 -0
- package/assets/css/themes/orange.css +73 -0
- package/assets/css/themes/slate.css +73 -0
- package/assets/css/themes/stone.css +73 -0
- package/assets/css/themes/violet.css +73 -0
- package/assets/css/themes/zinc.css +73 -0
- package/assets/images/avatar.svg +6 -0
- package/assets/images/logo.svg +6 -0
- package/fesm2022/shival99-z-ui-components-z-accordion.mjs +148 -0
- package/fesm2022/shival99-z-ui-components-z-accordion.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs +74 -0
- package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-button.mjs +155 -0
- package/fesm2022/shival99-z-ui-components-z-button.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs +2335 -0
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-checkbox.mjs +240 -0
- package/fesm2022/shival99-z-ui-components-z-checkbox.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-code.mjs +139 -0
- package/fesm2022/shival99-z-ui-components-z-code.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-drawer.mjs +664 -0
- package/fesm2022/shival99-z-ui-components-z-drawer.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs +55 -0
- package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-editor.mjs +411 -0
- package/fesm2022/shival99-z-ui-components-z-editor.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-filter.mjs +794 -0
- package/fesm2022/shival99-z-ui-components-z-filter.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-icon.mjs +451 -0
- package/fesm2022/shival99-z-ui-components-z-icon.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-input.mjs +804 -0
- package/fesm2022/shival99-z-ui-components-z-input.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-loading.mjs +105 -0
- package/fesm2022/shival99-z-ui-components-z-loading.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-menu.mjs +351 -0
- package/fesm2022/shival99-z-ui-components-z-menu.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-modal.mjs +722 -0
- package/fesm2022/shival99-z-ui-components-z-modal.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-pagination.mjs +131 -0
- package/fesm2022/shival99-z-ui-components-z-pagination.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-popover.mjs +917 -0
- package/fesm2022/shival99-z-ui-components-z-popover.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-radio.mjs +154 -0
- package/fesm2022/shival99-z-ui-components-z-radio.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-select.mjs +998 -0
- package/fesm2022/shival99-z-ui-components-z-select.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-skeleton.mjs +139 -0
- package/fesm2022/shival99-z-ui-components-z-skeleton.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-switch.mjs +127 -0
- package/fesm2022/shival99-z-ui-components-z-switch.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-table.mjs +2628 -0
- package/fesm2022/shival99-z-ui-components-z-table.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-tabs.mjs +259 -0
- package/fesm2022/shival99-z-ui-components-z-tabs.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-timeline.mjs +335 -0
- package/fesm2022/shival99-z-ui-components-z-timeline.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-toast.mjs +93 -0
- package/fesm2022/shival99-z-ui-components-z-toast.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-tooltip.mjs +660 -0
- package/fesm2022/shival99-z-ui-components-z-tooltip.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-upload.mjs +504 -0
- package/fesm2022/shival99-z-ui-components-z-upload.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-i18n.mjs +258 -0
- package/fesm2022/shival99-z-ui-i18n.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-pipes.mjs +116 -0
- package/fesm2022/shival99-z-ui-pipes.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-providers.mjs +203 -0
- package/fesm2022/shival99-z-ui-providers.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-services.mjs +919 -0
- package/fesm2022/shival99-z-ui-services.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-utils.mjs +591 -0
- package/fesm2022/shival99-z-ui-utils.mjs.map +1 -0
- package/fesm2022/z-ui.mjs +3 -19924
- package/fesm2022/z-ui.mjs.map +1 -1
- package/package.json +132 -4
- package/types/shival99-z-ui-components-z-accordion.d.ts +55 -0
- package/types/shival99-z-ui-components-z-breadcrumb.d.ts +36 -0
- package/types/shival99-z-ui-components-z-button.d.ts +41 -0
- package/types/shival99-z-ui-components-z-calendar.d.ts +300 -0
- package/types/shival99-z-ui-components-z-checkbox.d.ts +84 -0
- package/types/shival99-z-ui-components-z-code.d.ts +35 -0
- package/types/shival99-z-ui-components-z-drawer.d.ts +232 -0
- package/types/shival99-z-ui-components-z-dropdown-menu.d.ts +50 -0
- package/types/shival99-z-ui-components-z-editor.d.ts +115 -0
- package/types/shival99-z-ui-components-z-filter.d.ts +268 -0
- package/types/shival99-z-ui-components-z-icon.d.ts +291 -0
- package/types/shival99-z-ui-components-z-input.d.ts +188 -0
- package/types/shival99-z-ui-components-z-loading.d.ts +46 -0
- package/types/shival99-z-ui-components-z-menu.d.ts +116 -0
- package/types/shival99-z-ui-components-z-modal.d.ts +270 -0
- package/types/shival99-z-ui-components-z-pagination.d.ts +52 -0
- package/types/shival99-z-ui-components-z-popover.d.ts +134 -0
- package/types/shival99-z-ui-components-z-radio.d.ts +63 -0
- package/types/shival99-z-ui-components-z-select.d.ts +268 -0
- package/types/shival99-z-ui-components-z-skeleton.d.ts +55 -0
- package/types/shival99-z-ui-components-z-switch.d.ts +48 -0
- package/types/shival99-z-ui-components-z-table.d.ts +482 -0
- package/types/shival99-z-ui-components-z-tabs.d.ts +75 -0
- package/types/shival99-z-ui-components-z-timeline.d.ts +98 -0
- package/types/shival99-z-ui-components-z-toast.d.ts +61 -0
- package/types/shival99-z-ui-components-z-tooltip.d.ts +85 -0
- package/types/shival99-z-ui-components-z-upload.d.ts +136 -0
- package/types/shival99-z-ui-i18n.d.ts +50 -0
- package/types/shival99-z-ui-pipes.d.ts +36 -0
- package/types/shival99-z-ui-providers.d.ts +132 -0
- package/types/shival99-z-ui-services.d.ts +364 -0
- package/types/shival99-z-ui-utils.d.ts +145 -0
- package/types/z-ui.d.ts +3 -4977
package/README.md
CHANGED
|
@@ -2,32 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@shival99/z-ui)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[](https://angular.dev)
|
|
6
6
|
|
|
7
|
-
A comprehensive, high-performance UI component library built with Angular
|
|
7
|
+
A comprehensive, high-performance UI component library built with Angular 21+, featuring 40+ customizable components with dark mode, accessibility, and enterprise-ready features.
|
|
8
8
|
|
|
9
9
|
## ✨ Features
|
|
10
10
|
|
|
11
11
|
- 🎨 **40+ Components** - Buttons, Inputs, Tables, Modals, Calendars, and more
|
|
12
|
-
- 🌙 **Dark Mode** - Built-in theme support with
|
|
12
|
+
- 🌙 **Dark Mode** - Built-in theme support with 9 color themes
|
|
13
13
|
- ♿ **Accessible** - WCAG 2.1 compliant components
|
|
14
14
|
- 📱 **Responsive** - Mobile-first responsive design
|
|
15
15
|
- 🚀 **High Performance** - OnPush change detection, virtual scrolling
|
|
16
16
|
- 🔧 **Customizable** - CSS variables, class-variance-authority
|
|
17
|
-
- 📦 **Tree-shakable** -
|
|
17
|
+
- 📦 **Tree-shakable** - Import only what you need
|
|
18
18
|
- 🎯 **Type-safe** - Full TypeScript support with strict mode
|
|
19
|
-
- 🌐 **i18n Ready** - Built-in translation support
|
|
19
|
+
- 🌐 **i18n Ready** - Built-in translation support
|
|
20
20
|
|
|
21
21
|
## 📦 Installation
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
|
|
24
|
+
pnpm add @shival99/z-ui
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
### Peer Dependencies
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
|
|
30
|
+
pnpm add @angular/cdk @ng-icons/core @ng-icons/lucide @ng-icons/iconsax \
|
|
31
31
|
@tanstack/angular-table @tanstack/angular-virtual \
|
|
32
32
|
class-variance-authority clsx tailwind-merge \
|
|
33
33
|
ngx-mask ngx-scrollbar ngx-sonner ngxtension minisearch
|
|
@@ -35,28 +35,21 @@ npm install @angular/cdk @ng-icons/core @ng-icons/lucide @ng-icons/iconsax \
|
|
|
35
35
|
|
|
36
36
|
### Optional Dependencies
|
|
37
37
|
|
|
38
|
-
For specific components:
|
|
39
|
-
|
|
40
38
|
```bash
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
npm install shiki
|
|
46
|
-
|
|
47
|
-
# For z-chart (Charts)
|
|
48
|
-
npm install echarts ngx-echarts
|
|
49
|
-
|
|
50
|
-
# For i18n support
|
|
51
|
-
npm install @ngx-translate/core @ngx-translate/http-loader
|
|
39
|
+
pnpm add ngx-quill quill # Rich Text Editor
|
|
40
|
+
pnpm add shiki dompurify # Syntax Highlighting
|
|
41
|
+
pnpm add echarts ngx-echarts # Charts
|
|
42
|
+
pnpm add @ngx-translate/core @ngx-translate/http-loader # i18n
|
|
52
43
|
```
|
|
53
44
|
|
|
54
45
|
## 🚀 Quick Start
|
|
55
46
|
|
|
56
|
-
###
|
|
47
|
+
### Import Components
|
|
57
48
|
|
|
58
49
|
```typescript
|
|
59
|
-
import { ZButtonComponent
|
|
50
|
+
import { ZButtonComponent } from '@shival99/z-ui/components/z-button';
|
|
51
|
+
import { ZInputComponent } from '@shival99/z-ui/components/z-input';
|
|
52
|
+
import { ZTableComponent } from '@shival99/z-ui/components/z-table';
|
|
60
53
|
|
|
61
54
|
@Component({
|
|
62
55
|
selector: 'app-root',
|
|
@@ -70,77 +63,57 @@ import { ZButtonComponent, ZInputComponent, ZTableComponent } from '@shival99/z-
|
|
|
70
63
|
export class AppComponent {}
|
|
71
64
|
```
|
|
72
65
|
|
|
73
|
-
###
|
|
74
|
-
|
|
75
|
-
Add to your `styles.scss`:
|
|
76
|
-
|
|
77
|
-
```scss
|
|
78
|
-
@import '@shival99/z-ui/styles';
|
|
79
|
-
|
|
80
|
-
// Or use CSS variables for custom theming
|
|
81
|
-
:root {
|
|
82
|
-
--z-primary: 222.2 47.4% 11.2%;
|
|
83
|
-
--z-primary-foreground: 210 40% 98%;
|
|
84
|
-
// ... more variables
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### 3. Configure Providers
|
|
66
|
+
### Configure Providers
|
|
89
67
|
|
|
90
68
|
```typescript
|
|
91
|
-
|
|
92
|
-
import {
|
|
69
|
+
import { provideZTranslate } from '@shival99/z-ui/providers';
|
|
70
|
+
import { provideZNgxMask } from '@shival99/z-ui/providers';
|
|
93
71
|
|
|
94
72
|
export const appConfig: ApplicationConfig = {
|
|
95
|
-
providers: [
|
|
96
|
-
provideZTranslate({
|
|
97
|
-
defaultLang: 'en',
|
|
98
|
-
langPath: '/assets/i18n/',
|
|
99
|
-
}),
|
|
100
|
-
],
|
|
73
|
+
providers: [provideZTranslate({ defaultLang: 'vi', langPath: '/assets/i18n/' }), provideZNgxMask()],
|
|
101
74
|
};
|
|
102
75
|
```
|
|
103
76
|
|
|
104
77
|
## 🧩 Components
|
|
105
78
|
|
|
106
|
-
|
|
79
|
+
| Category | Components |
|
|
80
|
+
| ----------- | ---------------------------------------------------------------- |
|
|
81
|
+
| **Form** | Input, Select, Checkbox, Radio, Switch, Calendar, Upload, Filter |
|
|
82
|
+
| **Data** | Table, Pagination, Code, Editor, Timeline |
|
|
83
|
+
| **Overlay** | Modal, Drawer, Toast, Tooltip, Popover, Dropdown Menu |
|
|
84
|
+
| **Layout** | Accordion, Tabs, Menu, Breadcrumb, Skeleton |
|
|
85
|
+
| **Display** | Button, Icon, Loading |
|
|
107
86
|
|
|
108
|
-
|
|
109
|
-
- `ZSelectComponent` - Select dropdown with search, multi-select
|
|
110
|
-
- `ZCheckboxComponent` - Checkbox with indeterminate state
|
|
111
|
-
- `ZRadioComponent` - Radio button groups
|
|
112
|
-
- `ZSwitchComponent` - Toggle switch
|
|
113
|
-
- `ZCalendarComponent` - Date/time picker with range support
|
|
87
|
+
## 📁 Import Paths
|
|
114
88
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
- `ZTabsComponent` - Tab navigation
|
|
127
|
-
|
|
128
|
-
### Feedback
|
|
89
|
+
```typescript
|
|
90
|
+
import { ZButtonComponent } from '@shival99/z-ui/components/z-button';
|
|
91
|
+
import { ZTableComponent } from '@shival99/z-ui/components/z-table';
|
|
92
|
+
import { ZModalService } from '@shival99/z-ui/components/z-modal';
|
|
93
|
+
|
|
94
|
+
import { ZThemeService, ZCacheService } from '@shival99/z-ui/services';
|
|
95
|
+
import { provideZTranslate } from '@shival99/z-ui/providers';
|
|
96
|
+
import { zTransform, zMergeClasses } from '@shival99/z-ui/utils';
|
|
97
|
+
import { ZSafeHtmlPipe } from '@shival99/z-ui/pipes';
|
|
98
|
+
import { Z_UI_TRANSLATIONS } from '@shival99/z-ui/i18n';
|
|
99
|
+
```
|
|
129
100
|
|
|
130
|
-
|
|
131
|
-
- `ZLoadingComponent` - Loading spinners
|
|
132
|
-
- `ZTooltipDirective` - Tooltips
|
|
133
|
-
- `ZPopoverDirective` - Popovers
|
|
101
|
+
## 🎨 Theming
|
|
134
102
|
|
|
135
|
-
|
|
103
|
+
Available themes: `green`, `orange`, `violet`, `neutral`, `zinc`, `slate`, `stone`, `gray`, `hospital`
|
|
136
104
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
- `ZPaginationComponent` - Pagination controls
|
|
105
|
+
```typescript
|
|
106
|
+
import { ZThemeService } from '@shival99/z-ui/services';
|
|
140
107
|
|
|
141
|
-
|
|
108
|
+
export class AppComponent {
|
|
109
|
+
private themeService = inject(ZThemeService);
|
|
142
110
|
|
|
143
|
-
|
|
111
|
+
ngOnInit() {
|
|
112
|
+
this.themeService.setTheme('violet');
|
|
113
|
+
this.themeService.toggleDarkMode(true);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
144
117
|
|
|
145
118
|
## 📄 License
|
|
146
119
|
|
|
@@ -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,76 @@
|
|
|
1
|
+
/* ===== Base Styles ===== */
|
|
2
|
+
@layer base {
|
|
3
|
+
* {
|
|
4
|
+
@apply border-border outline-ring/50;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
body {
|
|
8
|
+
@apply bg-background text-foreground;
|
|
9
|
+
font-family:
|
|
10
|
+
'Be Vietnam Pro',
|
|
11
|
+
system-ui,
|
|
12
|
+
-apple-system,
|
|
13
|
+
sans-serif;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* ===== Custom Scrollbar Styles ===== */
|
|
17
|
+
/* * {
|
|
18
|
+
scrollbar-width: auto;
|
|
19
|
+
scrollbar-color: #d1d5db transparent;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
*:hover {
|
|
23
|
+
scrollbar-color: #9ca3af transparent;
|
|
24
|
+
} */
|
|
25
|
+
|
|
26
|
+
/* WebKit browsers (Chrome, Safari, Edge) */
|
|
27
|
+
::-webkit-scrollbar {
|
|
28
|
+
width: 7px;
|
|
29
|
+
height: 7px;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
::-webkit-scrollbar-track {
|
|
33
|
+
background: transparent;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
::-webkit-scrollbar-thumb {
|
|
37
|
+
background-color: #d1d5db;
|
|
38
|
+
border-radius: 5px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
::-webkit-scrollbar-thumb:hover,
|
|
42
|
+
::-webkit-scrollbar-thumb:active {
|
|
43
|
+
background-color: #9ca3af;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
::-webkit-scrollbar-corner {
|
|
47
|
+
background: transparent;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Dark mode scrollbar */
|
|
51
|
+
.dark ::-webkit-scrollbar-thumb {
|
|
52
|
+
background-color: #4b5563;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.dark ::-webkit-scrollbar-thumb:hover,
|
|
56
|
+
.dark ::-webkit-scrollbar-thumb:active {
|
|
57
|
+
background-color: #6b7280;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
:root {
|
|
61
|
+
--scrollbar-track-color: transparent;
|
|
62
|
+
--scrollbar-track-shape: 5px;
|
|
63
|
+
--scrollbar-track-thickness: 7px;
|
|
64
|
+
--scrollbar-thumb-color: #d1d5db;
|
|
65
|
+
--scrollbar-thumb-hover-color: #9ca3af;
|
|
66
|
+
--scrollbar-thumb-shape: 5px;
|
|
67
|
+
--scrollbar-thumb-min-size: 40;
|
|
68
|
+
--scrollbar-hover-opacity-transition-leave-duration: 0.3s;
|
|
69
|
+
--scrollbar-hover-opacity-transition-leave-delay: 0.5s;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.dark {
|
|
73
|
+
--scrollbar-thumb-color: #4b5563;
|
|
74
|
+
--scrollbar-thumb-hover-color: #6b7280;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
@import 'tailwindcss';
|
|
2
|
+
|
|
3
|
+
/* Configure dark mode to use class instead of prefers-color-scheme */
|
|
4
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
5
|
+
|
|
6
|
+
@theme inline {
|
|
7
|
+
--color-background: var(--background);
|
|
8
|
+
--color-foreground: var(--foreground);
|
|
9
|
+
--color-card: var(--card);
|
|
10
|
+
--color-card-foreground: var(--card-foreground);
|
|
11
|
+
--color-popover: var(--popover);
|
|
12
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
13
|
+
--color-primary: var(--primary);
|
|
14
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
15
|
+
--color-secondary: var(--secondary);
|
|
16
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
17
|
+
--color-muted: var(--muted);
|
|
18
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
19
|
+
--color-accent: var(--accent);
|
|
20
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
21
|
+
--color-destructive: var(--destructive);
|
|
22
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
23
|
+
--color-border: var(--border);
|
|
24
|
+
--color-input: var(--input);
|
|
25
|
+
--color-ring: var(--ring);
|
|
26
|
+
--color-chart-1: var(--chart-1);
|
|
27
|
+
--color-chart-2: var(--chart-2);
|
|
28
|
+
--color-chart-3: var(--chart-3);
|
|
29
|
+
--color-chart-4: var(--chart-4);
|
|
30
|
+
--color-chart-5: var(--chart-5);
|
|
31
|
+
--color-sidebar: var(--sidebar);
|
|
32
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
33
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
34
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
35
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
36
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
37
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
38
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
39
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
40
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
41
|
+
--radius-lg: var(--radius);
|
|
42
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Base styles */
|
|
46
|
+
@import './base.css';
|
|
47
|
+
|
|
48
|
+
/* Animations */
|
|
49
|
+
@import './animations.css';
|
|
50
|
+
|
|
51
|
+
/* Themes - Only neutral theme is bundled (default theme) */
|
|
52
|
+
/* Other themes are lazy loaded by ZThemeService when setTheme() is called */
|
|
53
|
+
@import './themes/neutral.css';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/* GRAY THEME */
|
|
2
|
+
:root[z-theme='gray'] {
|
|
3
|
+
--radius: 0.625rem;
|
|
4
|
+
--background: oklch(1 0 0);
|
|
5
|
+
--foreground: oklch(0.13 0.028 261.692);
|
|
6
|
+
--card: oklch(1 0 0);
|
|
7
|
+
--card-foreground: oklch(0.13 0.028 261.692);
|
|
8
|
+
--popover: oklch(1 0 0);
|
|
9
|
+
--popover-foreground: oklch(0.13 0.028 261.692);
|
|
10
|
+
--primary: oklch(0.21 0.034 264.665);
|
|
11
|
+
--primary-foreground: oklch(0.985 0.002 247.839);
|
|
12
|
+
--secondary: oklch(0.967 0.003 264.542);
|
|
13
|
+
--secondary-foreground: oklch(0.21 0.034 264.665);
|
|
14
|
+
--muted: oklch(0.967 0.003 264.542);
|
|
15
|
+
--muted-foreground: oklch(0.551 0.027 264.364);
|
|
16
|
+
--accent: oklch(0.967 0.003 264.542);
|
|
17
|
+
--accent-foreground: oklch(0.21 0.034 264.665);
|
|
18
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
19
|
+
--destructive-foreground: oklch(0.985 0 0);
|
|
20
|
+
--border: oklch(0.928 0.006 264.531);
|
|
21
|
+
--input: oklch(0.928 0.006 264.531);
|
|
22
|
+
--input-autofill: oklch(1 0 0);
|
|
23
|
+
--ring: oklch(0.707 0.022 261.325);
|
|
24
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
25
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
26
|
+
--chart-3: oklch(0.398 0.07 227.334);
|
|
27
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
28
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
29
|
+
--sidebar: oklch(0.985 0.002 247.839);
|
|
30
|
+
--sidebar-foreground: oklch(0.13 0.028 261.692);
|
|
31
|
+
--sidebar-primary: oklch(0.21 0.034 264.665);
|
|
32
|
+
--sidebar-primary-foreground: oklch(0.985 0.002 247.839);
|
|
33
|
+
--sidebar-accent: oklch(0.967 0.003 264.542);
|
|
34
|
+
--sidebar-accent-foreground: oklch(0.21 0.034 264.665);
|
|
35
|
+
--sidebar-border: oklch(0.928 0.006 264.531);
|
|
36
|
+
--sidebar-ring: oklch(0.707 0.022 261.325);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
:root[z-theme='gray'].dark {
|
|
40
|
+
--background: oklch(0.13 0.028 261.692);
|
|
41
|
+
--foreground: oklch(0.985 0.002 247.839);
|
|
42
|
+
--card: oklch(0.21 0.034 264.665);
|
|
43
|
+
--card-foreground: oklch(0.985 0.002 247.839);
|
|
44
|
+
--popover: oklch(0.21 0.034 264.665);
|
|
45
|
+
--popover-foreground: oklch(0.985 0.002 247.839);
|
|
46
|
+
--primary: oklch(0.928 0.006 264.531);
|
|
47
|
+
--primary-foreground: oklch(0.21 0.034 264.665);
|
|
48
|
+
--secondary: oklch(0.278 0.033 256.848);
|
|
49
|
+
--secondary-foreground: oklch(0.985 0.002 247.839);
|
|
50
|
+
--muted: oklch(0.278 0.033 256.848);
|
|
51
|
+
--muted-foreground: oklch(0.707 0.022 261.325);
|
|
52
|
+
--accent: oklch(0.278 0.033 256.848);
|
|
53
|
+
--accent-foreground: oklch(0.985 0.002 247.839);
|
|
54
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
55
|
+
--destructive-foreground: oklch(0.985 0 0);
|
|
56
|
+
--border: oklch(1 0 0 / 10%);
|
|
57
|
+
--input: oklch(1 0 0 / 15%);
|
|
58
|
+
--input-autofill: oklch(0.19 0 0);
|
|
59
|
+
--ring: oklch(0.551 0.027 264.364);
|
|
60
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
61
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
62
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
63
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
64
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
65
|
+
--sidebar: oklch(0.21 0.034 264.665);
|
|
66
|
+
--sidebar-foreground: oklch(0.985 0.002 247.839);
|
|
67
|
+
--sidebar-primary: oklch(0.928 0.006 264.531);
|
|
68
|
+
--sidebar-primary-foreground: oklch(0.21 0.034 264.665);
|
|
69
|
+
--sidebar-accent: oklch(0.278 0.033 256.848);
|
|
70
|
+
--sidebar-accent-foreground: oklch(0.985 0.002 247.839);
|
|
71
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
72
|
+
--sidebar-ring: oklch(0.551 0.027 264.364);
|
|
73
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* GREEN THEME (Default) */
|
|
2
|
+
:root,
|
|
3
|
+
:root[z-theme='green'] {
|
|
4
|
+
--radius: 0.65rem;
|
|
5
|
+
--background: oklch(1 0 0);
|
|
6
|
+
--foreground: oklch(0.141 0.005 285.823);
|
|
7
|
+
--card: oklch(1 0 0);
|
|
8
|
+
--card-foreground: oklch(0.141 0.005 285.823);
|
|
9
|
+
--popover: oklch(1 0 0);
|
|
10
|
+
--popover-foreground: oklch(0.141 0.005 285.823);
|
|
11
|
+
--primary: oklch(0.648 0.2 131.684);
|
|
12
|
+
--primary-foreground: oklch(0.986 0.031 120.757);
|
|
13
|
+
--secondary: oklch(0.967 0.001 286.375);
|
|
14
|
+
--secondary-foreground: oklch(0.21 0.006 285.885);
|
|
15
|
+
--muted: oklch(0.967 0.001 286.375);
|
|
16
|
+
--muted-foreground: oklch(0.552 0.016 285.938);
|
|
17
|
+
--accent: oklch(0.967 0.001 286.375);
|
|
18
|
+
--accent-foreground: oklch(0.21 0.006 285.885);
|
|
19
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
20
|
+
--destructive-foreground: oklch(0.985 0 0);
|
|
21
|
+
--border: oklch(0.92 0.004 286.32);
|
|
22
|
+
--input: oklch(0.92 0.004 286.32);
|
|
23
|
+
--input-autofill: oklch(1 0 0);
|
|
24
|
+
--ring: oklch(0.841 0.238 128.85);
|
|
25
|
+
--chart-1: oklch(0.871 0.15 154.449);
|
|
26
|
+
--chart-2: oklch(0.723 0.219 149.579);
|
|
27
|
+
--chart-3: oklch(0.627 0.194 149.214);
|
|
28
|
+
--chart-4: oklch(0.527 0.154 150.069);
|
|
29
|
+
--chart-5: oklch(0.448 0.119 151.328);
|
|
30
|
+
--sidebar: oklch(0.985 0 0);
|
|
31
|
+
--sidebar-foreground: oklch(0.141 0.005 285.823);
|
|
32
|
+
--sidebar-primary: oklch(0.648 0.2 131.684);
|
|
33
|
+
--sidebar-primary-foreground: oklch(0.986 0.031 120.757);
|
|
34
|
+
--sidebar-accent: oklch(0.967 0.001 286.375);
|
|
35
|
+
--sidebar-accent-foreground: oklch(0.21 0.006 285.885);
|
|
36
|
+
--sidebar-border: oklch(0.92 0.004 286.32);
|
|
37
|
+
--sidebar-ring: oklch(0.841 0.238 128.85);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
:root.dark,
|
|
41
|
+
:root[z-theme='green'].dark {
|
|
42
|
+
--background: oklch(0.141 0.005 285.823);
|
|
43
|
+
--foreground: oklch(0.985 0 0);
|
|
44
|
+
--card: oklch(0.21 0.006 285.885);
|
|
45
|
+
--card-foreground: oklch(0.985 0 0);
|
|
46
|
+
--popover: oklch(0.21 0.006 285.885);
|
|
47
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
48
|
+
--primary: oklch(0.648 0.2 131.684);
|
|
49
|
+
--primary-foreground: oklch(0.986 0.031 120.757);
|
|
50
|
+
--secondary: oklch(0.274 0.006 286.033);
|
|
51
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
52
|
+
--muted: oklch(0.274 0.006 286.033);
|
|
53
|
+
--muted-foreground: oklch(0.705 0.015 286.067);
|
|
54
|
+
--accent: oklch(0.274 0.006 286.033);
|
|
55
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
56
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
57
|
+
--destructive-foreground: oklch(0.985 0 0);
|
|
58
|
+
--border: oklch(1 0 0 / 10%);
|
|
59
|
+
--input: oklch(1 0 0 / 15%);
|
|
60
|
+
--input-autofill: oklch(0.19 0 0);
|
|
61
|
+
--ring: oklch(0.405 0.101 131.063);
|
|
62
|
+
--chart-1: oklch(0.871 0.15 154.449);
|
|
63
|
+
--chart-2: oklch(0.723 0.219 149.579);
|
|
64
|
+
--chart-3: oklch(0.627 0.194 149.214);
|
|
65
|
+
--chart-4: oklch(0.527 0.154 150.069);
|
|
66
|
+
--chart-5: oklch(0.448 0.119 151.328);
|
|
67
|
+
--sidebar: oklch(0.21 0.006 285.885);
|
|
68
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
69
|
+
--sidebar-primary: oklch(0.768 0.233 130.85);
|
|
70
|
+
--sidebar-primary-foreground: oklch(0.986 0.031 120.757);
|
|
71
|
+
--sidebar-accent: oklch(0.274 0.006 286.033);
|
|
72
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
73
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
74
|
+
--sidebar-ring: oklch(0.405 0.101 131.063);
|
|
75
|
+
}
|