@sd-angular/core 19.0.10 → 19.0.11
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 +20 -20
- package/assets/STYLE-GUIDE.md +19 -19
- package/assets/fonts/fonts.scss +115 -115
- package/assets/scss/core/scrollbar.scss +30 -30
- package/assets/scss/core/utilities/_grid.scss +149 -149
- package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +1 -1
- package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +1 -1
- package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
- package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +1 -1
- package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-autoid-inspector.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-avatar.mjs +2 -2
- package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-chart.mjs +40 -40
- package/fesm2022/sd-angular-core-components-chart.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-editor.mjs +2 -2
- package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-form-generic.mjs +2 -2
- package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-inform.mjs +2 -2
- package/fesm2022/sd-angular-core-components-inform.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-modal.mjs +2 -2
- package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-org-chart.mjs +2 -2
- package/fesm2022/sd-angular-core-components-org-chart.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-preview.mjs +4 -4
- package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-query-bar.mjs +10 -10
- package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-query-builder.mjs +2 -2
- package/fesm2022/sd-angular-core-components-query-builder.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-quick-action.mjs +2 -2
- package/fesm2022/sd-angular-core-components-quick-action.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-section.mjs +2 -2
- package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-side-drawer.mjs +2 -2
- package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-splitter.mjs +6 -6
- package/fesm2022/sd-angular-core-components-splitter.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-stepper.mjs +2 -2
- package/fesm2022/sd-angular-core-components-stepper.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tab.mjs +2 -2
- package/fesm2022/sd-angular-core-components-tab.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-table.mjs +8 -8
- package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tree.mjs +2 -2
- package/fesm2022/sd-angular-core-components-tree.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-view.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date-range.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-datetime.mjs +4 -4
- package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-inline-text.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input-number.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-label.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-label.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-models.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-select.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
- package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-authom.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-layout.mjs +2 -2
- package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
- package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-excel.mjs +26 -19
- package/fesm2022/sd-angular-core-services-excel.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-notify.mjs +2 -2
- package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
- package/fesm2022/sd-angular-core.mjs.map +1 -1
- package/modules/keycloak/htmls/auth-keycloak-error.html +54 -54
- package/modules/keycloak/htmls/silent-renew.html +7 -7
- package/package.json +43 -43
- package/sd-angular-core-19.0.11.tgz +0 -0
- package/services/excel/src/lib/excel.service.d.ts +0 -1
- package/services/excel/src/lib/spreadsheet-formula-injection.util.d.ts +5 -0
- package/sd-angular-core-19.0.10.tgz +0 -0
package/README.md
CHANGED
|
@@ -250,8 +250,8 @@ import { SdSection } from '@sd-angular/core/components/section';
|
|
|
250
250
|
| `subTitle` | `string` | — | Tiêu đề phụ |
|
|
251
251
|
| `icon` | `string` | — | Icon Material |
|
|
252
252
|
| `iconColor` | `Color` | `'primary'` | Màu icon |
|
|
253
|
-
| `collapsible` | `boolean` | `false` | Cho phép thu gọn |
|
|
254
|
-
| `collapsable` | `boolean` | `false` | Deprecated alias của `collapsible` |
|
|
253
|
+
| `collapsible` | `boolean` | `false` | Cho phép thu gọn |
|
|
254
|
+
| `collapsable` | `boolean` | `false` | Deprecated alias của `collapsible` |
|
|
255
255
|
| `collapsed` | `boolean` | `false` | Trạng thái ban đầu thu gọn |
|
|
256
256
|
| `hideHeader` | `boolean` | `false` | Ẩn phần header |
|
|
257
257
|
|
|
@@ -260,7 +260,7 @@ import { SdSection } from '@sd-angular/core/components/section';
|
|
|
260
260
|
<!-- nội dung -->
|
|
261
261
|
</sd-section>
|
|
262
262
|
|
|
263
|
-
<sd-section title="Cài đặt nâng cao" icon="settings" collapsible [collapsed]="true">
|
|
263
|
+
<sd-section title="Cài đặt nâng cao" icon="settings" collapsible [collapsed]="true">
|
|
264
264
|
<!-- nội dung ẩn mặc định -->
|
|
265
265
|
</sd-section>
|
|
266
266
|
```
|
|
@@ -365,13 +365,13 @@ option: SdTableOption<Product> = {
|
|
|
365
365
|
});
|
|
366
366
|
return { items: res.data, total: res.total };
|
|
367
367
|
},
|
|
368
|
-
columns: [
|
|
369
|
-
{ field: 'code', type: 'string', title: 'Mã', width: '120px' },
|
|
370
|
-
{ field: 'name', type: 'string', title: 'Tên', sortable: true },
|
|
371
|
-
{ field: 'status', type: 'values', title: 'Trạng thái',
|
|
372
|
-
useBadge: (val) => ({ color: val === 'ACTIVE' ? 'success' : 'secondary', title: val })
|
|
373
|
-
},
|
|
374
|
-
],
|
|
368
|
+
columns: [
|
|
369
|
+
{ field: 'code', type: 'string', title: 'Mã', width: '120px' },
|
|
370
|
+
{ field: 'name', type: 'string', title: 'Tên', sortable: true },
|
|
371
|
+
{ field: 'status', type: 'values', title: 'Trạng thái',
|
|
372
|
+
useBadge: (val) => ({ color: val === 'ACTIVE' ? 'success' : 'secondary', title: val })
|
|
373
|
+
},
|
|
374
|
+
],
|
|
375
375
|
command: {
|
|
376
376
|
align: 'right',
|
|
377
377
|
commands: [
|
|
@@ -408,15 +408,15 @@ import { SdAvatar } from '@sd-angular/core/components/avatar';
|
|
|
408
408
|
| `SdTabRouter` | `@sd-angular/core/components/tab-router` | Tab navigation với Angular Router |
|
|
409
409
|
| `SdSideDrawer` | `@sd-angular/core/components/side-drawer` | Drawer layout trái/phải |
|
|
410
410
|
| `SdUploadFile` | `@sd-angular/core/components/upload-file` | Upload file |
|
|
411
|
-
| `SdQuickAction` | `@sd-angular/core/components/quick-action` | Nút action dạng icon |
|
|
412
|
-
| `SdHistory` | `@sd-angular/core/components/history` | Lịch sử thay đổi |
|
|
413
|
-
| `SdImportExcel` | `@sd-angular/core/components/import-excel` | Wizard import Excel |
|
|
414
|
-
| `SdTree` | `@sd-angular/core/components/tree` | Tree static/lazy với selection, command, filter và custom item template |
|
|
415
|
-
| `SdOrgChart` | `@sd-angular/core/components/org-chart` | Sơ đồ tổ chức dạng cây, hỗ trợ custom node template |
|
|
416
|
-
| `SdQueryBar` | `@sd-angular/core/components/query-bar` | Thanh lọc/search theo cấu hình option |
|
|
417
|
-
| `SdQueryBuilder` | `@sd-angular/core/components/query-builder` | Visual query builder |
|
|
418
|
-
| `SdSplitter` | `@sd-angular/core/components/splitter` | Layout chia vùng kéo giãn |
|
|
419
|
-
| `SdCodeEditor` | `@sd-angular/core/components/code-editor` | Code editor (PrismJS) |
|
|
411
|
+
| `SdQuickAction` | `@sd-angular/core/components/quick-action` | Nút action dạng icon |
|
|
412
|
+
| `SdHistory` | `@sd-angular/core/components/history` | Lịch sử thay đổi |
|
|
413
|
+
| `SdImportExcel` | `@sd-angular/core/components/import-excel` | Wizard import Excel |
|
|
414
|
+
| `SdTree` | `@sd-angular/core/components/tree` | Tree static/lazy với selection, command, filter và custom item template |
|
|
415
|
+
| `SdOrgChart` | `@sd-angular/core/components/org-chart` | Sơ đồ tổ chức dạng cây, hỗ trợ custom node template |
|
|
416
|
+
| `SdQueryBar` | `@sd-angular/core/components/query-bar` | Thanh lọc/search theo cấu hình option |
|
|
417
|
+
| `SdQueryBuilder` | `@sd-angular/core/components/query-builder` | Visual query builder |
|
|
418
|
+
| `SdSplitter` | `@sd-angular/core/components/splitter` | Layout chia vùng kéo giãn |
|
|
419
|
+
| `SdCodeEditor` | `@sd-angular/core/components/code-editor` | Code editor (PrismJS) |
|
|
420
420
|
| `SdMiniEditor` | `@sd-angular/core/components/mini-editor` | Rich text editor nhỏ |
|
|
421
421
|
| `SdDocumentBuilder` | `@sd-angular/core/components/document-builder` | Document builder |
|
|
422
422
|
| `SdAnchorMain` | `@sd-angular/core/components/anchor` | Anchor / mục lục cuộn trang |
|
|
@@ -729,4 +729,4 @@ Core UI components expose runtime state via lowercase `data-*` attributes for e2
|
|
|
729
729
|
|
|
730
730
|
## License
|
|
731
731
|
|
|
732
|
-
Internal use only — © SD Team
|
|
732
|
+
Internal use only — © SD Team
|
package/assets/STYLE-GUIDE.md
CHANGED
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
11. [Cursor, vertical-align, misc](#11-cursor-vertical-align-misc)
|
|
20
20
|
12. [Elevation (mat-elevation-z0–z8)](#12-elevation-mat-elevation-z0z8)
|
|
21
21
|
13. [Reset / Reboot baseline](#13-reset--reboot-baseline)
|
|
22
|
-
14. [Custom theme](#14-custom-theme)
|
|
23
|
-
15. [Fonts & Images shipped](#15-fonts--images-shipped)
|
|
24
|
-
16. [What is NOT shipped](#16-what-is-not-shipped) — anti-confusion cho AI
|
|
25
|
-
17. [AI rendering guardrails](#17-ai-rendering-guardrails) — ưu tiên Core UI trước khi viết CSS mới
|
|
26
|
-
|
|
27
|
-
---
|
|
22
|
+
14. [Custom theme](#14-custom-theme)
|
|
23
|
+
15. [Fonts & Images shipped](#15-fonts--images-shipped)
|
|
24
|
+
16. [What is NOT shipped](#16-what-is-not-shipped) — anti-confusion cho AI
|
|
25
|
+
17. [AI rendering guardrails](#17-ai-rendering-guardrails) — ưu tiên Core UI trước khi viết CSS mới
|
|
26
|
+
|
|
27
|
+
---
|
|
28
28
|
|
|
29
29
|
## 1. Cài đặt vào Angular
|
|
30
30
|
|
|
@@ -605,16 +605,16 @@ Tham chiếu qua `core/image.scss` utility hoặc trực tiếp `assets/images/<
|
|
|
605
605
|
| `alert` | dùng `<sd-notify>` service |
|
|
606
606
|
| `modal` | dùng `<sd-modal>` |
|
|
607
607
|
|
|
608
|
-
> Lưu ý lớn nhất: **spacing scale đã đổi từ Bootstrap multiplier (1=4px, 2=8px…) sang px tuyệt đối**. `mb-3` trong Bootstrap = 16px; trong `@sd-angular/core` `mb-3` = **3px**. Reading code cũ cần convert (× 4) cẩn thận hoặc thay bằng `mb-16`.
|
|
609
|
-
|
|
610
|
-
---
|
|
611
|
-
|
|
612
|
-
## 17. AI rendering guardrails
|
|
613
|
-
|
|
614
|
-
Khi sinh UI mới, agent phải rà docs Core UI trước và ưu tiên component/utility đã có thay vì tự tạo class SCSS trong component.
|
|
615
|
-
|
|
616
|
-
- **Spacing layout dùng bội số 4px**: ưu tiên `4`, `8`, `12`, `16`, `24`, `32`... cho margin, padding, gap, gutter. Không sinh spacing lẻ như `3px`, `5px`, `7px` trừ khi có yêu cầu pixel-perfect rõ ràng.
|
|
617
|
-
- **Hạn chế class CSS cục bộ**: trước khi viết `.field-label`, `.status-pill`, `.detail-row`, `.cell-input`..., kiểm tra có utility class hoặc component `sd-*` phù hợp không. Chỉ thêm SCSS mới khi Core UI không có pattern tương đương.
|
|
618
|
-
- **View/read-only label + value**: dùng `<sd-view>` hoặc `[viewed]="true"` trên form component. Không tự dựng cặp label/value bằng class riêng cho các màn hình DETAIL.
|
|
619
|
-
- **Trạng thái, nhãn, counter**: dùng `<sd-badge>` hoặc `useBadge` của `<sd-table>`. Không tự viết badge/pill/status class trong component nếu chỉ để thể hiện trạng thái.
|
|
620
|
-
- **Input trong table hoặc vùng dense**: trong `<sd-table>`, inline filter, editable cell, toolbar/cell dày đặc, truyền `size="sm"` cho các form component hỗ trợ size như `<sd-input>`, `<sd-select>`, `<sd-autocomplete>`, `<sd-date>`, `<sd-date-range>`, `<sd-datetime>`, `<sd-input-number>`, `<sd-textarea>`, `<sd-chip>`, `<sd-chip-calendar>`, `<sd-input-color>`.
|
|
608
|
+
> Lưu ý lớn nhất: **spacing scale đã đổi từ Bootstrap multiplier (1=4px, 2=8px…) sang px tuyệt đối**. `mb-3` trong Bootstrap = 16px; trong `@sd-angular/core` `mb-3` = **3px**. Reading code cũ cần convert (× 4) cẩn thận hoặc thay bằng `mb-16`.
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 17. AI rendering guardrails
|
|
613
|
+
|
|
614
|
+
Khi sinh UI mới, agent phải rà docs Core UI trước và ưu tiên component/utility đã có thay vì tự tạo class SCSS trong component.
|
|
615
|
+
|
|
616
|
+
- **Spacing layout dùng bội số 4px**: ưu tiên `4`, `8`, `12`, `16`, `24`, `32`... cho margin, padding, gap, gutter. Không sinh spacing lẻ như `3px`, `5px`, `7px` trừ khi có yêu cầu pixel-perfect rõ ràng.
|
|
617
|
+
- **Hạn chế class CSS cục bộ**: trước khi viết `.field-label`, `.status-pill`, `.detail-row`, `.cell-input`..., kiểm tra có utility class hoặc component `sd-*` phù hợp không. Chỉ thêm SCSS mới khi Core UI không có pattern tương đương.
|
|
618
|
+
- **View/read-only label + value**: dùng `<sd-view>` hoặc `[viewed]="true"` trên form component. Không tự dựng cặp label/value bằng class riêng cho các màn hình DETAIL.
|
|
619
|
+
- **Trạng thái, nhãn, counter**: dùng `<sd-badge>` hoặc `useBadge` của `<sd-table>`. Không tự viết badge/pill/status class trong component nếu chỉ để thể hiện trạng thái.
|
|
620
|
+
- **Input trong table hoặc vùng dense**: trong `<sd-table>`, inline filter, editable cell, toolbar/cell dày đặc, truyền `size="sm"` cho các form component hỗ trợ size như `<sd-input>`, `<sd-select>`, `<sd-autocomplete>`, `<sd-date>`, `<sd-date-range>`, `<sd-datetime>`, `<sd-input-number>`, `<sd-textarea>`, `<sd-chip>`, `<sd-chip-calendar>`, `<sd-input-color>`.
|
package/assets/fonts/fonts.scss
CHANGED
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
/* =========================================
|
|
2
|
-
1. ROBOTO (Text Font)
|
|
3
|
-
========================================= */
|
|
4
|
-
|
|
5
|
-
@font-face {
|
|
6
|
-
font-family: 'Roboto';
|
|
7
|
-
src: url('./roboto/roboto-v50-latin_vietnamese-regular.woff2') format('woff2');
|
|
8
|
-
font-weight: 400;
|
|
9
|
-
font-style: normal;
|
|
10
|
-
font-display: swap;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
@font-face {
|
|
14
|
-
font-family: 'Roboto';
|
|
15
|
-
src: url('./roboto/roboto-v50-latin_vietnamese-italic.woff2') format('woff2');
|
|
16
|
-
font-weight: 400;
|
|
17
|
-
font-style: italic;
|
|
18
|
-
font-display: swap;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@font-face {
|
|
23
|
-
font-family: 'Roboto';
|
|
24
|
-
src: url('./roboto/roboto-v50-latin_vietnamese-500.woff2') format('woff2');
|
|
25
|
-
font-weight: 500;
|
|
26
|
-
font-style: normal;
|
|
27
|
-
font-display: swap;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
@font-face {
|
|
31
|
-
font-family: 'Roboto';
|
|
32
|
-
src: url('./roboto/roboto-v50-latin_vietnamese-600.woff2') format('woff2');
|
|
33
|
-
font-weight: 600;
|
|
34
|
-
font-style: normal;
|
|
35
|
-
font-display: swap;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/* =========================================
|
|
39
|
-
2. MATERIAL ICONS (Cũ - Classic)
|
|
40
|
-
========================================= */
|
|
41
|
-
|
|
42
|
-
/* Filled (Regular) */
|
|
43
|
-
@font-face {
|
|
44
|
-
font-family: 'Material Icons';
|
|
45
|
-
src: url('./material-icons/material-icons-v145-latin-regular.woff2') format('woff2');
|
|
46
|
-
font-weight: 400;
|
|
47
|
-
font-style: normal;
|
|
48
|
-
font-display: block;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/* Outlined */
|
|
52
|
-
@font-face {
|
|
53
|
-
font-family: 'Material Icons Outlined';
|
|
54
|
-
src: url('./material-icons/material-icons-outlined-v110-latin-regular.woff2') format('woff2');
|
|
55
|
-
font-weight: 400;
|
|
56
|
-
font-style: normal;
|
|
57
|
-
font-display: block;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/* =========================================
|
|
61
|
-
3. MATERIAL SYMBOLS (Mới - v29)
|
|
62
|
-
Đây là bộ icon thế hệ mới của Google
|
|
63
|
-
========================================= */
|
|
64
|
-
@font-face {
|
|
65
|
-
font-family: 'Material Symbols Outlined'; /* Đặt tên này để khớp với class chuẩn */
|
|
66
|
-
src: url('./material-symbols/material-symbols-v29-latin-regular.woff2') format('woff2');
|
|
67
|
-
font-weight: 400;
|
|
68
|
-
font-style: normal;
|
|
69
|
-
font-display: block;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/* =========================================
|
|
73
|
-
4. CSS CLASSES (Utility Classes)
|
|
74
|
-
========================================= */
|
|
75
|
-
|
|
76
|
-
/* Class dùng chung để tránh lặp code */
|
|
77
|
-
%icon-shared-style {
|
|
78
|
-
font-weight: normal;
|
|
79
|
-
font-style: normal;
|
|
80
|
-
font-size: 24px;
|
|
81
|
-
line-height: 1;
|
|
82
|
-
letter-spacing: normal;
|
|
83
|
-
text-transform: none;
|
|
84
|
-
display: inline-block;
|
|
85
|
-
white-space: nowrap;
|
|
86
|
-
word-wrap: normal;
|
|
87
|
-
direction: ltr;
|
|
88
|
-
/* 1. Hỗ trợ trình duyệt cũ (Webkit/Chrome cũ) */
|
|
89
|
-
-webkit-font-feature-settings: 'liga';
|
|
90
|
-
|
|
91
|
-
/* 2. Thuộc tính chuẩn (Standard) - Bắt buộc phải có để hết warning */
|
|
92
|
-
font-feature-settings: 'liga';
|
|
93
|
-
/* ======================================================== */
|
|
94
|
-
/* Làm mượt font trên các nền tảng */
|
|
95
|
-
-webkit-font-smoothing: antialiased;
|
|
96
|
-
text-rendering: optimizeLegibility;
|
|
97
|
-
-moz-osx-font-smoothing: grayscale;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/* Áp dụng lại cho các class */
|
|
101
|
-
.material-icons {
|
|
102
|
-
font-family: 'Material Icons';
|
|
103
|
-
@extend %icon-shared-style;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.material-icons-outlined {
|
|
107
|
-
font-family: 'Material Icons Outlined';
|
|
108
|
-
@extend %icon-shared-style;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
.material-symbols-outlined {
|
|
112
|
-
font-family: 'Material Symbols Outlined';
|
|
113
|
-
@extend %icon-shared-style;
|
|
114
|
-
/* Symbols có thể cần thêm settings riêng nếu dùng variable font,
|
|
115
|
-
nhưng với file woff2 tĩnh của bạn thì setting trên là đủ */
|
|
1
|
+
/* =========================================
|
|
2
|
+
1. ROBOTO (Text Font)
|
|
3
|
+
========================================= */
|
|
4
|
+
|
|
5
|
+
@font-face {
|
|
6
|
+
font-family: 'Roboto';
|
|
7
|
+
src: url('./roboto/roboto-v50-latin_vietnamese-regular.woff2') format('woff2');
|
|
8
|
+
font-weight: 400;
|
|
9
|
+
font-style: normal;
|
|
10
|
+
font-display: swap;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@font-face {
|
|
14
|
+
font-family: 'Roboto';
|
|
15
|
+
src: url('./roboto/roboto-v50-latin_vietnamese-italic.woff2') format('woff2');
|
|
16
|
+
font-weight: 400;
|
|
17
|
+
font-style: italic;
|
|
18
|
+
font-display: swap;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@font-face {
|
|
23
|
+
font-family: 'Roboto';
|
|
24
|
+
src: url('./roboto/roboto-v50-latin_vietnamese-500.woff2') format('woff2');
|
|
25
|
+
font-weight: 500;
|
|
26
|
+
font-style: normal;
|
|
27
|
+
font-display: swap;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@font-face {
|
|
31
|
+
font-family: 'Roboto';
|
|
32
|
+
src: url('./roboto/roboto-v50-latin_vietnamese-600.woff2') format('woff2');
|
|
33
|
+
font-weight: 600;
|
|
34
|
+
font-style: normal;
|
|
35
|
+
font-display: swap;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* =========================================
|
|
39
|
+
2. MATERIAL ICONS (Cũ - Classic)
|
|
40
|
+
========================================= */
|
|
41
|
+
|
|
42
|
+
/* Filled (Regular) */
|
|
43
|
+
@font-face {
|
|
44
|
+
font-family: 'Material Icons';
|
|
45
|
+
src: url('./material-icons/material-icons-v145-latin-regular.woff2') format('woff2');
|
|
46
|
+
font-weight: 400;
|
|
47
|
+
font-style: normal;
|
|
48
|
+
font-display: block;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* Outlined */
|
|
52
|
+
@font-face {
|
|
53
|
+
font-family: 'Material Icons Outlined';
|
|
54
|
+
src: url('./material-icons/material-icons-outlined-v110-latin-regular.woff2') format('woff2');
|
|
55
|
+
font-weight: 400;
|
|
56
|
+
font-style: normal;
|
|
57
|
+
font-display: block;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* =========================================
|
|
61
|
+
3. MATERIAL SYMBOLS (Mới - v29)
|
|
62
|
+
Đây là bộ icon thế hệ mới của Google
|
|
63
|
+
========================================= */
|
|
64
|
+
@font-face {
|
|
65
|
+
font-family: 'Material Symbols Outlined'; /* Đặt tên này để khớp với class chuẩn */
|
|
66
|
+
src: url('./material-symbols/material-symbols-v29-latin-regular.woff2') format('woff2');
|
|
67
|
+
font-weight: 400;
|
|
68
|
+
font-style: normal;
|
|
69
|
+
font-display: block;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* =========================================
|
|
73
|
+
4. CSS CLASSES (Utility Classes)
|
|
74
|
+
========================================= */
|
|
75
|
+
|
|
76
|
+
/* Class dùng chung để tránh lặp code */
|
|
77
|
+
%icon-shared-style {
|
|
78
|
+
font-weight: normal;
|
|
79
|
+
font-style: normal;
|
|
80
|
+
font-size: 24px;
|
|
81
|
+
line-height: 1;
|
|
82
|
+
letter-spacing: normal;
|
|
83
|
+
text-transform: none;
|
|
84
|
+
display: inline-block;
|
|
85
|
+
white-space: nowrap;
|
|
86
|
+
word-wrap: normal;
|
|
87
|
+
direction: ltr;
|
|
88
|
+
/* 1. Hỗ trợ trình duyệt cũ (Webkit/Chrome cũ) */
|
|
89
|
+
-webkit-font-feature-settings: 'liga';
|
|
90
|
+
|
|
91
|
+
/* 2. Thuộc tính chuẩn (Standard) - Bắt buộc phải có để hết warning */
|
|
92
|
+
font-feature-settings: 'liga';
|
|
93
|
+
/* ======================================================== */
|
|
94
|
+
/* Làm mượt font trên các nền tảng */
|
|
95
|
+
-webkit-font-smoothing: antialiased;
|
|
96
|
+
text-rendering: optimizeLegibility;
|
|
97
|
+
-moz-osx-font-smoothing: grayscale;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Áp dụng lại cho các class */
|
|
101
|
+
.material-icons {
|
|
102
|
+
font-family: 'Material Icons';
|
|
103
|
+
@extend %icon-shared-style;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.material-icons-outlined {
|
|
107
|
+
font-family: 'Material Icons Outlined';
|
|
108
|
+
@extend %icon-shared-style;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.material-symbols-outlined {
|
|
112
|
+
font-family: 'Material Symbols Outlined';
|
|
113
|
+
@extend %icon-shared-style;
|
|
114
|
+
/* Symbols có thể cần thêm settings riêng nếu dùng variable font,
|
|
115
|
+
nhưng với file woff2 tĩnh của bạn thì setting trên là đủ */
|
|
116
116
|
}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
/* scrollbar */
|
|
2
|
-
/* width */
|
|
3
|
-
::-webkit-scrollbar {
|
|
4
|
-
width: 7px;
|
|
5
|
-
height: 7px;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
/* scrollbar hover*/
|
|
9
|
-
/* Tăng kích thước khi hover để user dễ thao tác */
|
|
10
|
-
::-webkit-scrollbar:hover {
|
|
11
|
-
width: 10px;
|
|
12
|
-
height: 10px;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/* Track */
|
|
16
|
-
::-webkit-scrollbar-track {
|
|
17
|
-
background: #f1f1f1;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/* Handle */
|
|
21
|
-
::-webkit-scrollbar-thumb {
|
|
22
|
-
background: #c5c5c5;
|
|
23
|
-
border-radius: 50px;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/* Handle on hover */
|
|
27
|
-
::-webkit-scrollbar-thumb:hover {
|
|
28
|
-
// background: #555555;
|
|
29
|
-
background: #c5c5c5;
|
|
30
|
-
}
|
|
1
|
+
/* scrollbar */
|
|
2
|
+
/* width */
|
|
3
|
+
::-webkit-scrollbar {
|
|
4
|
+
width: 7px;
|
|
5
|
+
height: 7px;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/* scrollbar hover*/
|
|
9
|
+
/* Tăng kích thước khi hover để user dễ thao tác */
|
|
10
|
+
::-webkit-scrollbar:hover {
|
|
11
|
+
width: 10px;
|
|
12
|
+
height: 10px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Track */
|
|
16
|
+
::-webkit-scrollbar-track {
|
|
17
|
+
background: #f1f1f1;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Handle */
|
|
21
|
+
::-webkit-scrollbar-thumb {
|
|
22
|
+
background: #c5c5c5;
|
|
23
|
+
border-radius: 50px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* Handle on hover */
|
|
27
|
+
::-webkit-scrollbar-thumb:hover {
|
|
28
|
+
// background: #555555;
|
|
29
|
+
background: #c5c5c5;
|
|
30
|
+
}
|