@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.
Files changed (115) hide show
  1. package/README.md +50 -77
  2. package/assets/css/animations.css +207 -0
  3. package/assets/css/base.css +76 -0
  4. package/assets/css/tailwind.css +53 -0
  5. package/assets/css/themes/gray.css +73 -0
  6. package/assets/css/themes/green.css +75 -0
  7. package/assets/css/themes/hospital.css +79 -0
  8. package/assets/css/themes/neutral.css +73 -0
  9. package/assets/css/themes/orange.css +73 -0
  10. package/assets/css/themes/slate.css +73 -0
  11. package/assets/css/themes/stone.css +73 -0
  12. package/assets/css/themes/violet.css +73 -0
  13. package/assets/css/themes/zinc.css +73 -0
  14. package/assets/images/avatar.svg +6 -0
  15. package/assets/images/logo.svg +6 -0
  16. package/fesm2022/shival99-z-ui-components-z-accordion.mjs +148 -0
  17. package/fesm2022/shival99-z-ui-components-z-accordion.mjs.map +1 -0
  18. package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs +74 -0
  19. package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs.map +1 -0
  20. package/fesm2022/shival99-z-ui-components-z-button.mjs +155 -0
  21. package/fesm2022/shival99-z-ui-components-z-button.mjs.map +1 -0
  22. package/fesm2022/shival99-z-ui-components-z-calendar.mjs +2335 -0
  23. package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -0
  24. package/fesm2022/shival99-z-ui-components-z-checkbox.mjs +240 -0
  25. package/fesm2022/shival99-z-ui-components-z-checkbox.mjs.map +1 -0
  26. package/fesm2022/shival99-z-ui-components-z-code.mjs +139 -0
  27. package/fesm2022/shival99-z-ui-components-z-code.mjs.map +1 -0
  28. package/fesm2022/shival99-z-ui-components-z-drawer.mjs +664 -0
  29. package/fesm2022/shival99-z-ui-components-z-drawer.mjs.map +1 -0
  30. package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs +55 -0
  31. package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs.map +1 -0
  32. package/fesm2022/shival99-z-ui-components-z-editor.mjs +411 -0
  33. package/fesm2022/shival99-z-ui-components-z-editor.mjs.map +1 -0
  34. package/fesm2022/shival99-z-ui-components-z-filter.mjs +794 -0
  35. package/fesm2022/shival99-z-ui-components-z-filter.mjs.map +1 -0
  36. package/fesm2022/shival99-z-ui-components-z-icon.mjs +451 -0
  37. package/fesm2022/shival99-z-ui-components-z-icon.mjs.map +1 -0
  38. package/fesm2022/shival99-z-ui-components-z-input.mjs +804 -0
  39. package/fesm2022/shival99-z-ui-components-z-input.mjs.map +1 -0
  40. package/fesm2022/shival99-z-ui-components-z-loading.mjs +105 -0
  41. package/fesm2022/shival99-z-ui-components-z-loading.mjs.map +1 -0
  42. package/fesm2022/shival99-z-ui-components-z-menu.mjs +351 -0
  43. package/fesm2022/shival99-z-ui-components-z-menu.mjs.map +1 -0
  44. package/fesm2022/shival99-z-ui-components-z-modal.mjs +722 -0
  45. package/fesm2022/shival99-z-ui-components-z-modal.mjs.map +1 -0
  46. package/fesm2022/shival99-z-ui-components-z-pagination.mjs +131 -0
  47. package/fesm2022/shival99-z-ui-components-z-pagination.mjs.map +1 -0
  48. package/fesm2022/shival99-z-ui-components-z-popover.mjs +917 -0
  49. package/fesm2022/shival99-z-ui-components-z-popover.mjs.map +1 -0
  50. package/fesm2022/shival99-z-ui-components-z-radio.mjs +154 -0
  51. package/fesm2022/shival99-z-ui-components-z-radio.mjs.map +1 -0
  52. package/fesm2022/shival99-z-ui-components-z-select.mjs +998 -0
  53. package/fesm2022/shival99-z-ui-components-z-select.mjs.map +1 -0
  54. package/fesm2022/shival99-z-ui-components-z-skeleton.mjs +139 -0
  55. package/fesm2022/shival99-z-ui-components-z-skeleton.mjs.map +1 -0
  56. package/fesm2022/shival99-z-ui-components-z-switch.mjs +127 -0
  57. package/fesm2022/shival99-z-ui-components-z-switch.mjs.map +1 -0
  58. package/fesm2022/shival99-z-ui-components-z-table.mjs +2628 -0
  59. package/fesm2022/shival99-z-ui-components-z-table.mjs.map +1 -0
  60. package/fesm2022/shival99-z-ui-components-z-tabs.mjs +259 -0
  61. package/fesm2022/shival99-z-ui-components-z-tabs.mjs.map +1 -0
  62. package/fesm2022/shival99-z-ui-components-z-timeline.mjs +335 -0
  63. package/fesm2022/shival99-z-ui-components-z-timeline.mjs.map +1 -0
  64. package/fesm2022/shival99-z-ui-components-z-toast.mjs +93 -0
  65. package/fesm2022/shival99-z-ui-components-z-toast.mjs.map +1 -0
  66. package/fesm2022/shival99-z-ui-components-z-tooltip.mjs +660 -0
  67. package/fesm2022/shival99-z-ui-components-z-tooltip.mjs.map +1 -0
  68. package/fesm2022/shival99-z-ui-components-z-upload.mjs +504 -0
  69. package/fesm2022/shival99-z-ui-components-z-upload.mjs.map +1 -0
  70. package/fesm2022/shival99-z-ui-i18n.mjs +258 -0
  71. package/fesm2022/shival99-z-ui-i18n.mjs.map +1 -0
  72. package/fesm2022/shival99-z-ui-pipes.mjs +116 -0
  73. package/fesm2022/shival99-z-ui-pipes.mjs.map +1 -0
  74. package/fesm2022/shival99-z-ui-providers.mjs +203 -0
  75. package/fesm2022/shival99-z-ui-providers.mjs.map +1 -0
  76. package/fesm2022/shival99-z-ui-services.mjs +919 -0
  77. package/fesm2022/shival99-z-ui-services.mjs.map +1 -0
  78. package/fesm2022/shival99-z-ui-utils.mjs +591 -0
  79. package/fesm2022/shival99-z-ui-utils.mjs.map +1 -0
  80. package/fesm2022/z-ui.mjs +3 -19924
  81. package/fesm2022/z-ui.mjs.map +1 -1
  82. package/package.json +132 -4
  83. package/types/shival99-z-ui-components-z-accordion.d.ts +55 -0
  84. package/types/shival99-z-ui-components-z-breadcrumb.d.ts +36 -0
  85. package/types/shival99-z-ui-components-z-button.d.ts +41 -0
  86. package/types/shival99-z-ui-components-z-calendar.d.ts +300 -0
  87. package/types/shival99-z-ui-components-z-checkbox.d.ts +84 -0
  88. package/types/shival99-z-ui-components-z-code.d.ts +35 -0
  89. package/types/shival99-z-ui-components-z-drawer.d.ts +232 -0
  90. package/types/shival99-z-ui-components-z-dropdown-menu.d.ts +50 -0
  91. package/types/shival99-z-ui-components-z-editor.d.ts +115 -0
  92. package/types/shival99-z-ui-components-z-filter.d.ts +268 -0
  93. package/types/shival99-z-ui-components-z-icon.d.ts +291 -0
  94. package/types/shival99-z-ui-components-z-input.d.ts +188 -0
  95. package/types/shival99-z-ui-components-z-loading.d.ts +46 -0
  96. package/types/shival99-z-ui-components-z-menu.d.ts +116 -0
  97. package/types/shival99-z-ui-components-z-modal.d.ts +270 -0
  98. package/types/shival99-z-ui-components-z-pagination.d.ts +52 -0
  99. package/types/shival99-z-ui-components-z-popover.d.ts +134 -0
  100. package/types/shival99-z-ui-components-z-radio.d.ts +63 -0
  101. package/types/shival99-z-ui-components-z-select.d.ts +268 -0
  102. package/types/shival99-z-ui-components-z-skeleton.d.ts +55 -0
  103. package/types/shival99-z-ui-components-z-switch.d.ts +48 -0
  104. package/types/shival99-z-ui-components-z-table.d.ts +482 -0
  105. package/types/shival99-z-ui-components-z-tabs.d.ts +75 -0
  106. package/types/shival99-z-ui-components-z-timeline.d.ts +98 -0
  107. package/types/shival99-z-ui-components-z-toast.d.ts +61 -0
  108. package/types/shival99-z-ui-components-z-tooltip.d.ts +85 -0
  109. package/types/shival99-z-ui-components-z-upload.d.ts +136 -0
  110. package/types/shival99-z-ui-i18n.d.ts +50 -0
  111. package/types/shival99-z-ui-pipes.d.ts +36 -0
  112. package/types/shival99-z-ui-providers.d.ts +132 -0
  113. package/types/shival99-z-ui-services.d.ts +364 -0
  114. package/types/shival99-z-ui-utils.d.ts +145 -0
  115. package/types/z-ui.d.ts +3 -4977
package/README.md CHANGED
@@ -2,32 +2,32 @@
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/@shival99/z-ui.svg)](https://www.npmjs.com/package/@shival99/z-ui)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![Angular](https://img.shields.io/badge/Angular-20+-dd0031.svg)](https://angular.dev)
5
+ [![Angular](https://img.shields.io/badge/Angular-21+-dd0031.svg)](https://angular.dev)
6
6
 
7
- A comprehensive, high-performance UI component library built with Angular 20+, featuring 40+ customizable components with dark mode, accessibility, and enterprise-ready features.
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 CSS variables
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** - Only import what you need
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 with ngx-translate
19
+ - 🌐 **i18n Ready** - Built-in translation support
20
20
 
21
21
  ## 📦 Installation
22
22
 
23
23
  ```bash
24
- npm install @shival99/z-ui
24
+ pnpm add @shival99/z-ui
25
25
  ```
26
26
 
27
27
  ### Peer Dependencies
28
28
 
29
29
  ```bash
30
- npm install @angular/cdk @ng-icons/core @ng-icons/lucide @ng-icons/iconsax \
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
- # For z-editor (Rich Text Editor)
42
- npm install ngx-quill quill
43
-
44
- # For z-code (Syntax Highlighting)
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
- ### 1. Import Components
47
+ ### Import Components
57
48
 
58
49
  ```typescript
59
- import { ZButtonComponent, ZInputComponent, ZTableComponent } from '@shival99/z-ui';
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
- ### 2. Add Theme Styles
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
- // app.config.ts
92
- import { provideZTranslate } from '@shival99/z-ui';
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
- ### Form Controls
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
- - `ZInputComponent` - Text input with validation, masks, async validation
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
- ### Data Display
116
-
117
- - `ZTableComponent` - Advanced data table with sorting, filtering, pagination, virtual scrolling
118
- - `ZCodeComponent` - Syntax highlighted code blocks
119
- - `ZBadgeComponent` - Status badges
120
-
121
- ### Layout
122
-
123
- - `ZModalComponent` - Modal dialogs
124
- - `ZDrawerComponent` - Side panels
125
- - `ZAccordionComponent` - Collapsible sections
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
- - `ZToastService` - Toast notifications
131
- - `ZLoadingComponent` - Loading spinners
132
- - `ZTooltipDirective` - Tooltips
133
- - `ZPopoverDirective` - Popovers
101
+ ## 🎨 Theming
134
102
 
135
- ### Navigation
103
+ Available themes: `green`, `orange`, `violet`, `neutral`, `zinc`, `slate`, `stone`, `gray`, `hospital`
136
104
 
137
- - `ZBreadcrumbComponent` - Breadcrumb navigation
138
- - `ZMenuComponent` - Dropdown menus
139
- - `ZPaginationComponent` - Pagination controls
105
+ ```typescript
106
+ import { ZThemeService } from '@shival99/z-ui/services';
140
107
 
141
- ## 📚 Documentation
108
+ export class AppComponent {
109
+ private themeService = inject(ZThemeService);
142
110
 
143
- Full documentation and examples: [https://z-ui.dev](https://z-ui.dev)
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
+ }