@sdcorejs/angular 21.0.10 → 21.1.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.
- package/README.md +32 -23
- package/assets/STYLE-GUIDE.md +58 -72
- package/assets/scss/core/_inline-edit.scss +1 -1
- package/assets/scss/core/color.scss +56 -45
- package/assets/scss/core/form.scss +21 -9
- package/assets/scss/core/utilities/_base.scss +3 -3
- package/assets/scss/core/utilities/_border.scss +1 -1
- package/assets/scss/themes/default.scss +46 -32
- package/assets/scss/themes/material-theme.scss +8 -87
- package/fesm2022/sdcorejs-angular-components-anchor.mjs +5 -6
- package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +10 -11
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-badge.mjs +14 -12
- package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-button.mjs +9 -10
- package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs +3 -3
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-editor.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs +21 -24
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-history.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs +5 -7
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-inform.mjs +4 -14
- package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +5 -6
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal.mjs +25 -7
- package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-preview.mjs +7 -8
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs +24 -28
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-section.mjs +8 -13
- package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-splitter.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-stepper.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs +5 -6
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +23 -27
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tree.mjs +6 -8
- package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs +8 -9
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-view.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-view.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-directives.mjs +1 -1
- package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +2 -2
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +7 -9
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +7 -9
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date.mjs +7 -9
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs +466 -344
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-inline-text.mjs +4 -5
- package/fesm2022/sdcorejs-angular-forms-inline-text.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-label.mjs +4 -5
- package/fesm2022/sdcorejs-angular-forms-label.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-radio.mjs +2 -4
- package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -8
- package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-switch.mjs +2 -2
- package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-icon.mjs +505 -0
- package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +29 -29
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules.mjs +1 -0
- package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-confirm.mjs +85 -5
- package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-excel.mjs +22 -14
- package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-loading.mjs +1 -1
- package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-utilities-models.mjs +3 -2
- package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
- package/package.json +6 -1
- package/types/sdcorejs-angular-components-badge.d.ts +5 -16
- package/types/sdcorejs-angular-components-button.d.ts +7 -5
- package/types/sdcorejs-angular-components-inform.d.ts +2 -8
- package/types/sdcorejs-angular-components-modal.d.ts +1 -1
- package/types/sdcorejs-angular-components-query-builder.d.ts +6 -6
- package/types/sdcorejs-angular-components-section.d.ts +1 -5
- package/types/sdcorejs-angular-components-side-drawer.d.ts +1 -1
- package/types/sdcorejs-angular-components-table.d.ts +9 -10
- package/types/sdcorejs-angular-components-tree.d.ts +3 -2
- package/types/sdcorejs-angular-forms-datetime.d.ts +4 -4
- package/types/sdcorejs-angular-modules-icon.d.ts +191 -0
- package/types/sdcorejs-angular-modules.d.ts +1 -0
- package/types/sdcorejs-angular-services-confirm.d.ts +49 -1
- package/types/sdcorejs-angular-utilities-models.d.ts +6 -4
package/README.md
CHANGED
|
@@ -91,32 +91,41 @@ export const appConfig: ApplicationConfig = {
|
|
|
91
91
|
|
|
92
92
|
## Theming / SCSS Customization
|
|
93
93
|
|
|
94
|
+
`sd-core.scss` emits the Angular Material M3 theme with `mat.theme(...)`.
|
|
95
|
+
Prefer Core UI variables such as `--sd-primary`, `--sd-surface`, `--sd-text`,
|
|
96
|
+
and `--sd-border` in application code. Material system variables remain an
|
|
97
|
+
implementation detail for Angular Material overrides.
|
|
98
|
+
|
|
94
99
|
### CSS Variables
|
|
95
100
|
|
|
96
101
|
`@sdcorejs/angular` sử dụng CSS custom properties (variables) để quản lý màu sắc. Mỗi màu được expose dưới dạng `--sd-<color>`.
|
|
97
102
|
|
|
98
103
|
**Available color tokens / Các biến màu sắc:**
|
|
99
104
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
|
104
|
-
|
|
|
105
|
-
| `--sd-
|
|
106
|
-
| `--sd-
|
|
107
|
-
| `--sd-
|
|
108
|
-
| `--sd-
|
|
109
|
-
| `--sd-
|
|
110
|
-
| `--sd-
|
|
111
|
-
| `--sd-
|
|
112
|
-
| `--sd-
|
|
113
|
-
| `--sd-info`
|
|
114
|
-
| `--sd
|
|
115
|
-
| `--sd-
|
|
116
|
-
| `--sd-
|
|
117
|
-
| `--sd-
|
|
118
|
-
| `--sd-
|
|
119
|
-
| `--sd-
|
|
105
|
+
Core UI exposes a small public token surface: semantic palettes for component
|
|
106
|
+
states, plus neutral tokens for surface, text, border, and disabled states.
|
|
107
|
+
|
|
108
|
+
| Variable | Default bridge / fallback | Description |
|
|
109
|
+
| -------- | ------------------------- | ----------- |
|
|
110
|
+
| `--sd-primary` | `var(--mat-sys-primary, #005cbb)` | Main action color |
|
|
111
|
+
| `--sd-primary-light` | `color-mix(in srgb, var(--sd-primary) 14%, white)` | Soft primary background |
|
|
112
|
+
| `--sd-primary-dark` | `color-mix(in srgb, var(--sd-primary) 84%, black)` | Hover/active primary shade |
|
|
113
|
+
| `--sd-primary-contrast` | `#ffffff` | Text/icon on primary |
|
|
114
|
+
| `--sd-secondary` | `var(--mat-sys-secondary, #5c6270)` | Secondary action/accent |
|
|
115
|
+
| `--sd-secondary-light` | `color-mix(in srgb, var(--sd-secondary) 12%, white)` | Soft secondary background |
|
|
116
|
+
| `--sd-secondary-dark` | `color-mix(in srgb, var(--sd-secondary) 84%, black)` | Hover/active secondary shade |
|
|
117
|
+
| `--sd-secondary-contrast` | `#ffffff` | Text/icon on secondary |
|
|
118
|
+
| `--sd-info`, `--sd-success`, `--sd-warning`, `--sd-error` | Semantic base colors | Info, success, warning, and error states |
|
|
119
|
+
| `--sd-*-light` / `--sd-*-dark` / `--sd-*-contrast` | Generated from each semantic base | Soft background, active shade, and readable foreground |
|
|
120
|
+
| `--sd-surface` | `var(--mat-sys-surface, #fdfbff)` | App/page surface |
|
|
121
|
+
| `--sd-surface-muted` | `var(--mat-sys-surface-container-highest, #e7e8ed)` | Muted neutral background |
|
|
122
|
+
| `--sd-text` | `var(--mat-sys-on-surface, #1a1b1f)` | Primary text |
|
|
123
|
+
| `--sd-text-secondary` | `var(--mat-sys-on-surface-variant, #44474f)` | Secondary text |
|
|
124
|
+
| `--sd-text-muted` | `color-mix(in srgb, var(--sd-text) 62%, transparent)` | Muted text |
|
|
125
|
+
| `--sd-border` | `var(--mat-sys-outline-variant, #c4c6d0)` | Divider/subtle border |
|
|
126
|
+
| `--sd-border-strong` | `var(--mat-sys-outline, #74777f)` | Strong border/focus outline |
|
|
127
|
+
| `--sd-disabled-bg` | `color-mix(in srgb, var(--sd-text) 8%, transparent)` | Disabled background |
|
|
128
|
+
| `--sd-disabled-text` | `color-mix(in srgb, var(--sd-text) 60%, transparent)` | Disabled text/icon |
|
|
120
129
|
|
|
121
130
|
### Custom Theme / Tuỳ chỉnh theme
|
|
122
131
|
|
|
@@ -314,7 +323,7 @@ import { SdButton } from '@sdcorejs/angular/components/button';
|
|
|
314
323
|
|
|
315
324
|
| Input | Type | Default | Description |
|
|
316
325
|
| ------------ | ------------------------------------------ | ------------- | ---------------------------------- |
|
|
317
|
-
| `type` | `'fill' \| 'light' \| 'outline' \| '
|
|
326
|
+
| `type` | `'fill' \| 'light' \| 'outline' \| 'text'` | `'light'` | Kiểu nút |
|
|
318
327
|
| `color` | `Color` | `'secondary'` | Màu sắc |
|
|
319
328
|
| `size` | `'sm' \| 'md' \| 'lg'` | `'sm'` | Kích thước |
|
|
320
329
|
| `title` | `string` | — | Nhãn nút |
|
|
@@ -377,7 +386,7 @@ import { SdSection } from '@sdcorejs/angular/components/section';
|
|
|
377
386
|
| `subTitle` | `string` | — | Tiêu đề phụ |
|
|
378
387
|
| `icon` | `string` | — | Icon Material |
|
|
379
388
|
| `iconColor` | `Color` | `'primary'` | Màu icon |
|
|
380
|
-
| `
|
|
389
|
+
| `collapsible` | `boolean` | `false` | Cho phép thu gọn |
|
|
381
390
|
| `collapsed` | `boolean` | `false` | Trạng thái ban đầu thu gọn |
|
|
382
391
|
| `hideHeader` | `boolean` | `false` | Ẩn phần header |
|
|
383
392
|
|
|
@@ -386,7 +395,7 @@ import { SdSection } from '@sdcorejs/angular/components/section';
|
|
|
386
395
|
<!-- nội dung -->
|
|
387
396
|
</sd-section>
|
|
388
397
|
|
|
389
|
-
<sd-section title="Cài đặt nâng cao" icon="settings"
|
|
398
|
+
<sd-section title="Cài đặt nâng cao" icon="settings" collapsible [collapsed]="true">
|
|
390
399
|
<!-- nội dung ẩn mặc định -->
|
|
391
400
|
</sd-section>
|
|
392
401
|
```
|
package/assets/STYLE-GUIDE.md
CHANGED
|
@@ -94,54 +94,49 @@ projects/sdcorejs-angular/assets/
|
|
|
94
94
|
│ └── _typography.scss # T{n}{M|R} tokens + fs-* + font-weight-* + text-*
|
|
95
95
|
└── themes/
|
|
96
96
|
├── default.scss # sd.theme() mixin — override `--sd-*` color tokens
|
|
97
|
-
└── material-theme.scss # Angular Material
|
|
97
|
+
└── material-theme.scss # Angular Material M3 theme/token baseline
|
|
98
98
|
```
|
|
99
99
|
|
|
100
100
|
---
|
|
101
101
|
|
|
102
102
|
## 3. Hệ thống màu sắc
|
|
103
103
|
|
|
104
|
-
Màu được định nghĩa dưới dạng **CSS custom properties** với prefix `--sd-*`, cho phép override runtime (không cần recompile SCSS).
|
|
104
|
+
Màu được định nghĩa dưới dạng **CSS custom properties** với prefix `--sd-*`, cho phép override runtime (không cần recompile SCSS). Default theme bridge các token nền tảng sang Angular Material M3 `--mat-sys-*` khi có thể.
|
|
105
105
|
|
|
106
106
|
### 3.1 Color tokens
|
|
107
107
|
|
|
108
|
-
| Token
|
|
108
|
+
| Token | CSS variable | Default bridge / fallback | Use for |
|
|
109
109
|
|---|---|---|---|
|
|
110
|
-
| `primary`
|
|
111
|
-
| `primary-light`
|
|
112
|
-
| `primary-dark`
|
|
113
|
-
| `
|
|
114
|
-
| `
|
|
115
|
-
| `
|
|
116
|
-
| `
|
|
117
|
-
| `
|
|
118
|
-
| `success
|
|
119
|
-
| `
|
|
120
|
-
| `
|
|
121
|
-
| `
|
|
122
|
-
| `
|
|
123
|
-
| `
|
|
124
|
-
| `
|
|
125
|
-
| `secondary`
|
|
126
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `
|
|
129
|
-
| `
|
|
130
|
-
| `
|
|
131
|
-
| `black400` | `--sd-black400` | `#757575` | Text phụ, placeholder |
|
|
132
|
-
| `black300` | `--sd-black300` | `#BFBFBF` | Divider, border nhẹ |
|
|
133
|
-
| `black200` | `--sd-black200` | `#E6E6E6` | Border mặc định, separator |
|
|
134
|
-
| `black100` | `--sd-black100` | `#F2F2F2` | Background disabled, row hover |
|
|
135
|
-
|
|
110
|
+
| `primary` | `--sd-primary` | `var(--mat-sys-primary, #005cbb)` | Main action color |
|
|
111
|
+
| `primary-light` | `--sd-primary-light` | `color-mix(in srgb, var(--sd-primary) 14%, white)` | Soft primary background |
|
|
112
|
+
| `primary-dark` | `--sd-primary-dark` | `color-mix(in srgb, var(--sd-primary) 84%, black)` | Primary hover/active shade |
|
|
113
|
+
| `primary-contrast` | `--sd-primary-contrast` | `#ffffff` | Text/icon on primary |
|
|
114
|
+
| `secondary` | `--sd-secondary` | `var(--mat-sys-secondary, #5c6270)` | Secondary action/accent |
|
|
115
|
+
| `secondary-light` | `--sd-secondary-light` | `color-mix(in srgb, var(--sd-secondary) 12%, white)` | Soft secondary background |
|
|
116
|
+
| `secondary-dark` | `--sd-secondary-dark` | `color-mix(in srgb, var(--sd-secondary) 84%, black)` | Secondary hover/active shade |
|
|
117
|
+
| `secondary-contrast` | `--sd-secondary-contrast` | `#ffffff` | Text/icon on secondary |
|
|
118
|
+
| `info`, `success`, `warning`, `error` | `--sd-info`, ... | Semantic base colors | Info, success, warning, and error states |
|
|
119
|
+
| `*-light` | `--sd-info-light`, ... | `color-mix(in srgb, var(--sd-*) 14%, white)` | Soft semantic background |
|
|
120
|
+
| `*-dark` | `--sd-info-dark`, ... | `color-mix(in srgb, var(--sd-*) 84%, black)` | Semantic hover/active shade |
|
|
121
|
+
| `*-contrast` | `--sd-info-contrast`, ... | `#ffffff` | Text/icon on semantic color |
|
|
122
|
+
| `surface` | `--sd-surface` | `var(--mat-sys-surface, #fdfbff)` | Page/component surface |
|
|
123
|
+
| `surface-muted` | `--sd-surface-muted` | `var(--mat-sys-surface-container-highest, #e7e8ed)` | Muted neutral background |
|
|
124
|
+
| `text` | `--sd-text` | `var(--mat-sys-on-surface, #1a1b1f)` | Primary text |
|
|
125
|
+
| `text-secondary` | `--sd-text-secondary` | `var(--mat-sys-on-surface-variant, #44474f)` | Secondary text |
|
|
126
|
+
| `text-muted` | `--sd-text-muted` | `color-mix(in srgb, var(--sd-text) 62%, transparent)` | Muted text |
|
|
127
|
+
| `border` | `--sd-border` | `var(--mat-sys-outline-variant, #c4c6d0)` | Divider/subtle border |
|
|
128
|
+
| `border-strong` | `--sd-border-strong` | `var(--mat-sys-outline, #74777f)` | Strong border/focus outline |
|
|
129
|
+
| `disabled-bg` | `--sd-disabled-bg` | `color-mix(in srgb, var(--sd-text) 8%, transparent)` | Disabled background |
|
|
130
|
+
| `disabled-text` | `--sd-disabled-text` | `color-mix(in srgb, var(--sd-text) 60%, transparent)` | Disabled text/icon |
|
|
136
131
|
### 3.2 Color utility classes
|
|
137
132
|
|
|
138
133
|
Mọi token ở §3.1 đều sinh 3 class:
|
|
139
134
|
|
|
140
135
|
| Pattern | Ví dụ |
|
|
141
136
|
|---|---|
|
|
142
|
-
| `.text-{token}` | `text-primary`, `text-error`, `text-
|
|
137
|
+
| `.text-{token}` | `text-primary`, `text-error`, `text-secondary` |
|
|
143
138
|
| `.bg-{token}` | `bg-primary-light`, `bg-error-light`, `bg-white` |
|
|
144
|
-
| `.border-{token}` | `border-primary`, `border-
|
|
139
|
+
| `.border-{token}` | `border-primary`, `border-error` |
|
|
145
140
|
|
|
146
141
|
`white` / `black` luôn có sẵn ngoài bảng trên: `.text-white` / `.text-black` / `.bg-white` / `.bg-black`.
|
|
147
142
|
|
|
@@ -154,7 +149,7 @@ Mọi token ở §3.1 đều sinh 3 class:
|
|
|
154
149
|
.my-element {
|
|
155
150
|
color: map.get(color.$color_map, 'primary');
|
|
156
151
|
background: map.get(color.$color_map, 'primary-light');
|
|
157
|
-
border-color: map.get(color.$color_map, '
|
|
152
|
+
border-color: map.get(color.$color_map, 'border');
|
|
158
153
|
}
|
|
159
154
|
```
|
|
160
155
|
|
|
@@ -376,16 +371,16 @@ rounded-full // border-radius: 9999px (pill / circle)
|
|
|
376
371
|
|
|
377
372
|
### 9.2 Border utilities
|
|
378
373
|
|
|
379
|
-
Border color default = `var(--sd-
|
|
374
|
+
Border color default = `var(--sd-border)`.
|
|
380
375
|
|
|
381
376
|
| Class | CSS |
|
|
382
377
|
|---|---|
|
|
383
|
-
| `border` | `border: 1px solid var(--sd-
|
|
378
|
+
| `border` | `border: 1px solid var(--sd-border)` |
|
|
384
379
|
| `border-0` | `border: 0` |
|
|
385
|
-
| `border-top` | `border-top: 1px solid var(--sd-
|
|
386
|
-
| `border-bottom` | `border-bottom: 1px solid var(--sd-
|
|
387
|
-
| `border-left` | `border-left: 1px solid var(--sd-
|
|
388
|
-
| `border-right` | `border-right: 1px solid var(--sd-
|
|
380
|
+
| `border-top` | `border-top: 1px solid var(--sd-border)` |
|
|
381
|
+
| `border-bottom` | `border-bottom: 1px solid var(--sd-border)` |
|
|
382
|
+
| `border-left` | `border-left: 1px solid var(--sd-border)` |
|
|
383
|
+
| `border-right` | `border-right: 1px solid var(--sd-border)` |
|
|
389
384
|
|
|
390
385
|
Đổi màu border: kết hợp `.border` với `.border-{token}` (xem §3.2).
|
|
391
386
|
|
|
@@ -490,53 +485,44 @@ CSS shadow tĩnh, tương đương Angular Material `mat.elevation()` mixin như
|
|
|
490
485
|
|
|
491
486
|
## 14. Custom theme
|
|
492
487
|
|
|
493
|
-
|
|
488
|
+
Host apps can override SDCoreJS semantic tokens with `sd.theme()`. When an app owns the global Angular Material theme, use the Material M3 token API with `mat.theme()`.
|
|
494
489
|
|
|
495
490
|
```scss
|
|
496
491
|
@use '@sdcorejs/angular/assets/scss/themes/default' as sd;
|
|
497
492
|
@use '@angular/material' as mat;
|
|
498
|
-
@include mat.core();
|
|
499
493
|
|
|
500
494
|
html {
|
|
495
|
+
color-scheme: light;
|
|
496
|
+
|
|
501
497
|
@include sd.theme(
|
|
502
498
|
(
|
|
503
|
-
primary:
|
|
504
|
-
primary-light:
|
|
505
|
-
primary-dark:
|
|
499
|
+
primary: #AE7129,
|
|
500
|
+
primary-light: #F4F2F1,
|
|
501
|
+
primary-dark: #6B4414,
|
|
506
502
|
)
|
|
507
503
|
);
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
// --- Angular Material M2 palette ---
|
|
511
|
-
|
|
512
|
-
$custom-primary-palette: mat.m2-define-palette((
|
|
513
|
-
50: #F4F2F1, 100: #E7E1DA, 200: #DAC8B4, 300: #D1AC80, 400: #CD9450,
|
|
514
|
-
500: #AE7129, 600: #8D5A1E, 700: #6B4414, 800: #4B2F0E, 900: #34210A,
|
|
515
|
-
contrast: ( 600: white, 700: white, 800: white, 900: white )
|
|
516
|
-
));
|
|
517
|
-
|
|
518
|
-
$custom-accent-palette: mat.m2-define-palette((
|
|
519
|
-
50: #F1F3F1, 100: #DCE5DD, 200: #BBD3BC, 300: #8FC291, 400: #67B76A,
|
|
520
|
-
500: #4CAF50, 600: #3A8C3D, 700: #29692C, 800: #1C471E, 900: #132F14,
|
|
521
|
-
contrast: ( 700: white, 800: white, 900: white )
|
|
522
|
-
));
|
|
523
|
-
|
|
524
|
-
$custom-warn-palette: mat.m2-define-palette((
|
|
525
|
-
50: #F5F0F0, 100: #EAD9D6, 200: #E4B0AA, 300: #E6786B, 400: #EE4430,
|
|
526
|
-
500: #F82C13, 600: #D11801, 700: #9A1100, 800: #680B00, 900: #440700,
|
|
527
|
-
contrast: ( 600: white, 700: white, 800: white, 900: white )
|
|
528
|
-
));
|
|
529
504
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
505
|
+
@include mat.theme(
|
|
506
|
+
(
|
|
507
|
+
color: (
|
|
508
|
+
theme-type: light,
|
|
509
|
+
primary: mat.$azure-palette,
|
|
510
|
+
tertiary: mat.$green-palette,
|
|
511
|
+
),
|
|
512
|
+
typography: Roboto,
|
|
513
|
+
density: 0,
|
|
514
|
+
)
|
|
515
|
+
);
|
|
516
|
+
}
|
|
536
517
|
```
|
|
537
518
|
|
|
538
|
-
|
|
539
|
-
|
|
519
|
+
Prefer Material M3 system variables for Material-facing styles:
|
|
520
|
+
`--mat-sys-primary`, `--mat-sys-on-primary`, `--mat-sys-surface`,
|
|
521
|
+
`--mat-sys-on-surface`, `--mat-sys-error`, `--mat-sys-outline`, and
|
|
522
|
+
`--mat-sys-outline-variant`.
|
|
523
|
+
|
|
524
|
+
> `sd.theme()` only needs the tokens you want to override; omitted tokens keep their defaults.
|
|
525
|
+
> Keep Material theme configuration in a global stylesheet, not component SCSS.
|
|
540
526
|
|
|
541
527
|
---
|
|
542
528
|
|
|
@@ -1,31 +1,39 @@
|
|
|
1
1
|
@use 'sass:map';
|
|
2
2
|
|
|
3
|
-
$
|
|
4
|
-
'primary',
|
|
5
|
-
'primary-light',
|
|
6
|
-
'primary-dark',
|
|
7
|
-
'
|
|
8
|
-
'
|
|
9
|
-
'
|
|
10
|
-
'
|
|
11
|
-
'
|
|
12
|
-
'
|
|
13
|
-
'
|
|
14
|
-
'
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'
|
|
18
|
-
'
|
|
19
|
-
'
|
|
20
|
-
'
|
|
21
|
-
'
|
|
22
|
-
'
|
|
23
|
-
'
|
|
24
|
-
'
|
|
25
|
-
'
|
|
26
|
-
'
|
|
27
|
-
'
|
|
28
|
-
'
|
|
3
|
+
$public-colors:
|
|
4
|
+
'primary',
|
|
5
|
+
'primary-light',
|
|
6
|
+
'primary-dark',
|
|
7
|
+
'primary-contrast',
|
|
8
|
+
'secondary',
|
|
9
|
+
'secondary-light',
|
|
10
|
+
'secondary-dark',
|
|
11
|
+
'secondary-contrast',
|
|
12
|
+
'info',
|
|
13
|
+
'info-light',
|
|
14
|
+
'info-dark',
|
|
15
|
+
'info-contrast',
|
|
16
|
+
'success',
|
|
17
|
+
'success-light',
|
|
18
|
+
'success-dark',
|
|
19
|
+
'success-contrast',
|
|
20
|
+
'warning',
|
|
21
|
+
'warning-light',
|
|
22
|
+
'warning-dark',
|
|
23
|
+
'warning-contrast',
|
|
24
|
+
'error',
|
|
25
|
+
'error-light',
|
|
26
|
+
'error-dark',
|
|
27
|
+
'error-contrast',
|
|
28
|
+
'surface',
|
|
29
|
+
'surface-muted',
|
|
30
|
+
'text',
|
|
31
|
+
'text-secondary',
|
|
32
|
+
'text-muted',
|
|
33
|
+
'border',
|
|
34
|
+
'border-strong',
|
|
35
|
+
'disabled-bg',
|
|
36
|
+
'disabled-text';
|
|
29
37
|
|
|
30
38
|
@function create_var_map($colors) {
|
|
31
39
|
$var-map: ();
|
|
@@ -37,38 +45,41 @@ $system-colors:
|
|
|
37
45
|
@return $var-map;
|
|
38
46
|
}
|
|
39
47
|
|
|
40
|
-
|
|
41
|
-
$color_map: create_var_map($system-colors);
|
|
48
|
+
$color_map: create_var_map($public-colors);
|
|
42
49
|
$basic_color_map: (
|
|
43
|
-
'white': #
|
|
50
|
+
'white': #fff,
|
|
44
51
|
'black': #000,
|
|
45
52
|
);
|
|
46
53
|
|
|
47
|
-
$disabled-bg: map.get($color-map, '
|
|
48
|
-
$disabled-text: map.get($color-map, '
|
|
54
|
+
$disabled-bg: map.get($color-map, 'disabled-bg');
|
|
55
|
+
$disabled-text: map.get($color-map, 'disabled-text');
|
|
49
56
|
|
|
50
57
|
@each $color, $value in map.merge($color_map, $basic_color_map) {
|
|
51
|
-
// Text
|
|
52
58
|
.text-#{$color} {
|
|
53
59
|
color: $value !important;
|
|
54
60
|
}
|
|
55
|
-
|
|
61
|
+
|
|
56
62
|
.bg-#{$color} {
|
|
57
63
|
background: $value !important;
|
|
58
64
|
}
|
|
59
|
-
|
|
65
|
+
|
|
60
66
|
.border-#{$color} {
|
|
61
67
|
border-color: $value !important;
|
|
62
68
|
}
|
|
63
69
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
|
|
71
|
+
.text-secondary {
|
|
72
|
+
color: map.get($color_map, 'text-secondary') !important;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.text-muted {
|
|
76
|
+
color: map.get($color_map, 'text-muted') !important;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.text-body {
|
|
80
|
+
color: map.get($color_map, 'text') !important;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.bg-muted {
|
|
84
|
+
background: map.get($color_map, 'surface-muted') !important;
|
|
85
|
+
}
|
|
@@ -6,6 +6,18 @@
|
|
|
6
6
|
font-size: 16px;
|
|
7
7
|
width: 100%;
|
|
8
8
|
|
|
9
|
+
.sd-form-field-label {
|
|
10
|
+
display: inline-flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
gap: 4px;
|
|
13
|
+
max-width: 100%;
|
|
14
|
+
vertical-align: middle;
|
|
15
|
+
|
|
16
|
+
sd-icon {
|
|
17
|
+
flex: 0 0 auto;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
9
21
|
// Xử lý tô màu required
|
|
10
22
|
.mat-mdc-form-field-required-marker {
|
|
11
23
|
color: map.get(color.$color_map, 'error');
|
|
@@ -14,22 +26,22 @@
|
|
|
14
26
|
// Xử lý màu border nhạt bớt
|
|
15
27
|
.mat-mdc-notch-piece {
|
|
16
28
|
&.mdc-notched-outline__leading {
|
|
17
|
-
border-color: map.get(color.$color_map, '
|
|
29
|
+
border-color: map.get(color.$color_map, 'border') !important;
|
|
18
30
|
}
|
|
19
31
|
&.mdc-notched-outline__notch {
|
|
20
|
-
border-top-color: map.get(color.$color_map, '
|
|
21
|
-
border-bottom-color: map.get(color.$color_map, '
|
|
32
|
+
border-top-color: map.get(color.$color_map, 'border') !important;
|
|
33
|
+
border-bottom-color: map.get(color.$color_map, 'border') !important;
|
|
22
34
|
}
|
|
23
35
|
&.mdc-notched-outline__trailing {
|
|
24
|
-
border-color: map.get(color.$color_map, '
|
|
36
|
+
border-color: map.get(color.$color_map, 'border') !important;
|
|
25
37
|
}
|
|
26
38
|
}
|
|
27
39
|
|
|
28
40
|
// Xử lý icon
|
|
29
41
|
.sd-suffix-icon {
|
|
30
|
-
color:
|
|
42
|
+
color: map.get(color.$color_map, 'text-secondary');
|
|
31
43
|
&:hover {
|
|
32
|
-
color:
|
|
44
|
+
color: map.get(color.$color_map, 'text');
|
|
33
45
|
}
|
|
34
46
|
}
|
|
35
47
|
|
|
@@ -47,15 +59,15 @@
|
|
|
47
59
|
padding: 0;
|
|
48
60
|
background: transparent;
|
|
49
61
|
cursor: pointer;
|
|
50
|
-
color:
|
|
62
|
+
color: map.get(color.$color_map, 'text-secondary');
|
|
51
63
|
transition: background-color 80ms ease, color 80ms ease;
|
|
52
64
|
|
|
53
65
|
&:hover {
|
|
54
|
-
background:
|
|
66
|
+
background: color-mix(in srgb, map.get(color.$color_map, 'text') 8%, transparent);
|
|
55
67
|
color: map.get(color.$color_map, 'error');
|
|
56
68
|
}
|
|
57
69
|
|
|
58
|
-
|
|
70
|
+
sd-icon {
|
|
59
71
|
font-size: 16px;
|
|
60
72
|
width: 16px;
|
|
61
73
|
height: 16px;
|
|
@@ -37,8 +37,8 @@ body {
|
|
|
37
37
|
font-size: 14px;
|
|
38
38
|
font-weight: 400;
|
|
39
39
|
line-height: 1.5;
|
|
40
|
-
color: #
|
|
41
|
-
background-color: #
|
|
40
|
+
color: var(--sd-text, var(--mat-sys-on-surface, #1a1b1f));
|
|
41
|
+
background-color: var(--sd-surface, var(--mat-sys-surface, #fdfbff));
|
|
42
42
|
text-align: left;
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -128,7 +128,7 @@ sup { top: -0.5em; }
|
|
|
128
128
|
// 7. Links
|
|
129
129
|
// --------------------------------------------------------------------------
|
|
130
130
|
a {
|
|
131
|
-
color: #
|
|
131
|
+
color: var(--sd-primary, var(--mat-sys-primary, #005cbb));
|
|
132
132
|
text-decoration: none;
|
|
133
133
|
background-color: transparent; // Xóa nền xám trên link active trong IE 10
|
|
134
134
|
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// Border utilities
|
|
13
13
|
// border | border-0 | border-top | border-bottom | border-left | border-right
|
|
14
14
|
// --------------------------------------------------------------------------
|
|
15
|
-
$_border-color: var(--sd-
|
|
15
|
+
$_border-color: var(--sd-border);
|
|
16
16
|
|
|
17
17
|
.border { border: 1px solid $_border-color !important; }
|
|
18
18
|
.border-0 { border: 0 !important; }
|
|
@@ -2,44 +2,58 @@
|
|
|
2
2
|
@use "../core/color";
|
|
3
3
|
|
|
4
4
|
$default-theme: (
|
|
5
|
-
primary: #
|
|
6
|
-
primary-light:
|
|
7
|
-
primary-dark:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
5
|
+
primary: var(--mat-sys-primary, #005cbb),
|
|
6
|
+
primary-light: color-mix(in srgb, var(--sd-primary) 14%, white),
|
|
7
|
+
primary-dark: color-mix(in srgb, var(--sd-primary) 84%, black),
|
|
8
|
+
primary-contrast: #ffffff,
|
|
9
|
+
|
|
10
|
+
secondary: var(--mat-sys-secondary, #5c6270),
|
|
11
|
+
secondary-light: color-mix(in srgb, var(--sd-secondary) 12%, white),
|
|
12
|
+
secondary-dark: color-mix(in srgb, var(--sd-secondary) 84%, black),
|
|
13
|
+
secondary-contrast: #ffffff,
|
|
14
|
+
|
|
15
|
+
info: #006a6a,
|
|
16
|
+
info-light: color-mix(in srgb, var(--sd-info) 14%, white),
|
|
17
|
+
info-dark: color-mix(in srgb, var(--sd-info) 84%, black),
|
|
18
|
+
info-contrast: #ffffff,
|
|
19
|
+
|
|
20
|
+
success: #2e7d32,
|
|
21
|
+
success-light: color-mix(in srgb, var(--sd-success) 14%, white),
|
|
22
|
+
success-dark: color-mix(in srgb, var(--sd-success) 84%, black),
|
|
23
|
+
success-contrast: #ffffff,
|
|
24
|
+
|
|
25
|
+
warning: #a66300,
|
|
26
|
+
warning-light: color-mix(in srgb, var(--sd-warning) 14%, white),
|
|
27
|
+
warning-dark: color-mix(in srgb, var(--sd-warning) 84%, black),
|
|
28
|
+
warning-contrast: #ffffff,
|
|
29
|
+
|
|
30
|
+
error: var(--mat-sys-error, #ba1a1a),
|
|
31
|
+
error-light: color-mix(in srgb, var(--sd-error) 14%, white),
|
|
32
|
+
error-dark: color-mix(in srgb, var(--sd-error) 84%, black),
|
|
33
|
+
error-contrast: #ffffff,
|
|
34
|
+
|
|
35
|
+
surface: var(--mat-sys-surface, #fdfbff),
|
|
36
|
+
surface-muted: var(--mat-sys-surface-container-highest, #e7e8ed),
|
|
37
|
+
text: var(--mat-sys-on-surface, #1a1b1f),
|
|
38
|
+
text-secondary: var(--mat-sys-on-surface-variant, #44474f),
|
|
39
|
+
text-muted: color-mix(in srgb, var(--sd-text) 62%, transparent),
|
|
40
|
+
border: var(--mat-sys-outline-variant, #c4c6d0),
|
|
41
|
+
border-strong: var(--mat-sys-outline, #74777f),
|
|
42
|
+
disabled-bg: color-mix(in srgb, var(--sd-text) 8%, transparent),
|
|
43
|
+
disabled-text: color-mix(in srgb, var(--sd-text) 60%, transparent),
|
|
30
44
|
);
|
|
31
45
|
|
|
32
|
-
//
|
|
33
|
-
// Chỉ áp dụng cho các component có hỗ trợ trailing icon
|
|
46
|
+
// Keep Material form-field trailing icons aligned with the Core error palette.
|
|
34
47
|
:root {
|
|
35
|
-
--mat-form-field-error-trailing-icon-color: #{map.get($default-theme, 'error')};
|
|
36
|
-
--mat-form-field-error-hover-trailing-icon-color: #{map.get($default-theme, 'error-dark')};
|
|
37
|
-
--mat-form-field-error-focus-trailing-icon-color: #{map.get($default-theme, 'error-dark')};
|
|
48
|
+
--mat-form-field-error-trailing-icon-color: var(--sd-error, #{map.get($default-theme, 'error')});
|
|
49
|
+
--mat-form-field-error-hover-trailing-icon-color: var(--sd-error-dark, #{map.get($default-theme, 'error-dark')});
|
|
50
|
+
--mat-form-field-error-focus-trailing-icon-color: var(--sd-error-dark, #{map.get($default-theme, 'error-dark')});
|
|
38
51
|
}
|
|
39
52
|
|
|
40
|
-
@mixin theme($theme) {
|
|
53
|
+
@mixin theme($theme: ()) {
|
|
41
54
|
$theme: map.merge($default-theme, $theme);
|
|
42
|
-
|
|
55
|
+
|
|
56
|
+
@each $color in color.$public-colors {
|
|
43
57
|
--sd-#{$color}: #{map.get($theme, $color)};
|
|
44
58
|
}
|
|
45
59
|
}
|