@sd-angular/core 19.0.13 → 19.0.14
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 +712 -712
- package/assets/STYLE-GUIDE.md +601 -601
- package/assets/images/coming-soon.svg +22 -22
- package/assets/images/data-empty.svg +20 -20
- package/assets/images/expired.svg +21 -21
- package/assets/images/file-error.svg +27 -27
- package/assets/images/filter-empty.svg +19 -19
- package/assets/images/filter-required.svg +20 -20
- package/assets/images/forbidden.svg +14 -14
- package/assets/images/image-error.svg +26 -26
- package/assets/images/maintenance.svg +22 -22
- package/assets/images/not-found.svg +19 -19
- package/assets/images/offline.svg +19 -19
- package/assets/images/submitted.svg +17 -17
- package/assets/images/success.svg +17 -17
- package/assets/images/unauthorized.svg +21 -21
- package/assets/images/unknown-error.svg +17 -17
- package/assets/scss/ckeditor5.scss +88 -88
- package/assets/scss/core/_inline-edit.scss +105 -105
- package/assets/scss/core/color.scss +73 -73
- package/assets/scss/core/form.scss +317 -317
- package/assets/scss/core/image.scss +35 -35
- package/assets/scss/core/utilities/_base.scss +333 -333
- package/assets/scss/core/utilities/_border.scss +22 -22
- package/assets/scss/core/utilities/_display.scss +10 -10
- package/assets/scss/core/utilities/_elevation.scss +80 -80
- package/assets/scss/core/utilities/_flexbox.scss +54 -54
- package/assets/scss/core/utilities/_gap.scss +9 -9
- package/assets/scss/core/utilities/_index.scss +17 -17
- package/assets/scss/core/utilities/_misc.scss +20 -20
- package/assets/scss/core/utilities/_overflow.scss +9 -9
- package/assets/scss/core/utilities/_position.scss +8 -8
- package/assets/scss/core/utilities/_sizing.scss +28 -28
- package/assets/scss/core/utilities/_spacing.scss +31 -31
- package/assets/scss/core/utilities/_typography.scss +99 -99
- package/assets/scss/sd-core.scss +16 -16
- package/assets/scss/themes/default.scss +45 -45
- package/assets/scss/themes/material-theme.scss +101 -101
- package/components/preview/src/preview-pdf/pdf-worker-inline.generated.d.ts +7 -0
- package/components/table/src/services/table-export/table-export.service.d.ts +3 -1
- package/components/table/src/table.component.d.ts +1 -1
- package/fesm2022/sd-angular-core-components-anchor.mjs +6 -6
- package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-autoid-inspector.mjs +2 -2
- package/fesm2022/sd-angular-core-components-autoid-inspector.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-badge.mjs +2 -2
- package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-base.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-button.mjs +2 -2
- 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-ckeditor-styles.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-code-editor.mjs +2 -2
- package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-document-builder.mjs +77 -77
- package/fesm2022/sd-angular-core-components-document-builder.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 +106 -106
- package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-history.mjs +2 -2
- package/fesm2022/sd-angular-core-components-history.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-import-excel.mjs +2 -2
- package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-inform.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-mini-editor.mjs +2 -2
- package/fesm2022/sd-angular-core-components-mini-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-modal-resizable.mjs +2 -2
- package/fesm2022/sd-angular-core-components-modal-resizable.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-operator.mjs +2 -2
- package/fesm2022/sd-angular-core-components-operator.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 +32 -6
- 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-section.mjs +4 -4
- 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-stepper.mjs +2 -2
- package/fesm2022/sd-angular-core-components-stepper.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tab-router.mjs +6 -6
- 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 +32 -17
- package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-upload-file.mjs +4 -4
- package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-view.mjs +2 -2
- package/fesm2022/sd-angular-core-components-view.mjs.map +1 -1
- package/fesm2022/sd-angular-core-configurations.mjs.map +1 -1
- package/fesm2022/sd-angular-core-directives.mjs +20 -20
- package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-checkbox.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-checkbox.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip.mjs +2 -2
- 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-date.mjs +114 -35
- package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-datetime.mjs +6 -6
- package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-inline-text.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-inline-text.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input-color.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-input-color.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-input.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-radio.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-radio.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-forms-switch.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-switch.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-textarea.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
- package/fesm2022/sd-angular-core-handlers.mjs.map +1 -1
- package/fesm2022/sd-angular-core-i18n.mjs +20 -0
- package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
- package/fesm2022/sd-angular-core-interceptors.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-auth.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 +130 -43
- package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-permission.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-cache.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-confirm.mjs +2 -2
- package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-excel.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-license.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-loading.mjs +5 -5
- package/fesm2022/sd-angular-core-services-loading.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-notify.mjs +12 -12
- package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-data-state.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
- package/forms/date/src/date.component.d.ts +9 -1
- package/i18n/src/en.d.ts +4 -0
- package/modules/layout/index.d.ts +1 -0
- package/modules/layout/utils/index.d.ts +1 -0
- package/modules/layout/utils/tab-name.util.d.ts +8 -0
- package/package.json +73 -73
- package/sd-angular-core-19.0.13.tgz +0 -0
|
@@ -1,333 +1,333 @@
|
|
|
1
|
-
// --------------------------------------------------------------------------
|
|
2
|
-
// Base / Reboot — chuẩn hóa rendering giữa các browser, thiết lập baseline
|
|
3
|
-
// cho toàn bộ ứng dụng. Thuần CSS, không phụ thuộc 3rd-party reset.
|
|
4
|
-
//
|
|
5
|
-
// Nguồn gốc rule: kế thừa từ Bootstrap 4 reboot + modern-normalize (đã được
|
|
6
|
-
// inline trực tiếp ở đây để dứt điểm phụ thuộc Bootstrap).
|
|
7
|
-
// --------------------------------------------------------------------------
|
|
8
|
-
|
|
9
|
-
// --------------------------------------------------------------------------
|
|
10
|
-
// 1. Box-sizing
|
|
11
|
-
// Đặt border-box toàn cục để width/height không bị cộng thêm padding/border.
|
|
12
|
-
// Đây là rule quan trọng nhất — thiếu là toàn bộ layout lệch.
|
|
13
|
-
// --------------------------------------------------------------------------
|
|
14
|
-
*,
|
|
15
|
-
*::before,
|
|
16
|
-
*::after {
|
|
17
|
-
box-sizing: border-box;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// --------------------------------------------------------------------------
|
|
21
|
-
// 2. Document
|
|
22
|
-
// --------------------------------------------------------------------------
|
|
23
|
-
html {
|
|
24
|
-
// Ngăn browser tự điều chỉnh font-size khi xoay màn hình (iOS)
|
|
25
|
-
-webkit-text-size-adjust: 100%;
|
|
26
|
-
// Bỏ tap highlight màu xám trên mobile
|
|
27
|
-
-webkit-tap-highlight-color: transparent;
|
|
28
|
-
line-height: 1.15;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// --------------------------------------------------------------------------
|
|
32
|
-
// 3. Body
|
|
33
|
-
// --------------------------------------------------------------------------
|
|
34
|
-
body {
|
|
35
|
-
margin: 0;
|
|
36
|
-
font-family: Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
37
|
-
font-size: 14px;
|
|
38
|
-
font-weight: 400;
|
|
39
|
-
line-height: 1.5;
|
|
40
|
-
color: #212529;
|
|
41
|
-
background-color: #fff;
|
|
42
|
-
text-align: left;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// --------------------------------------------------------------------------
|
|
46
|
-
// 4. Sectioning elements — IE10 fallback (display: block)
|
|
47
|
-
// --------------------------------------------------------------------------
|
|
48
|
-
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
|
|
49
|
-
display: block;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// --------------------------------------------------------------------------
|
|
53
|
-
// 5. Focus management
|
|
54
|
-
// Ẩn outline khi focus bằng chuột/touch; vẫn hiện khi dùng bàn phím.
|
|
55
|
-
// --------------------------------------------------------------------------
|
|
56
|
-
[tabindex="-1"]:focus:not(:focus-visible) {
|
|
57
|
-
outline: 0 !important;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// --------------------------------------------------------------------------
|
|
61
|
-
// 6. Typography
|
|
62
|
-
// --------------------------------------------------------------------------
|
|
63
|
-
|
|
64
|
-
// Bỏ margin-top của heading để dễ kiểm soát spacing trong layouts
|
|
65
|
-
h1, h2, h3, h4, h5, h6 {
|
|
66
|
-
margin-top: 0;
|
|
67
|
-
margin-bottom: 0.5rem;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
p {
|
|
71
|
-
margin-top: 0;
|
|
72
|
-
margin-bottom: 1rem;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Abbreviation với tooltip
|
|
76
|
-
abbr[title] {
|
|
77
|
-
text-decoration: underline dotted;
|
|
78
|
-
cursor: help;
|
|
79
|
-
border-bottom: 0;
|
|
80
|
-
text-decoration-skip-ink: none;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
address {
|
|
84
|
-
margin-bottom: 1rem;
|
|
85
|
-
font-style: normal;
|
|
86
|
-
line-height: inherit;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// List — xóa margin-top, giữ margin-bottom
|
|
90
|
-
ol,
|
|
91
|
-
ul,
|
|
92
|
-
dl {
|
|
93
|
-
margin-top: 0;
|
|
94
|
-
margin-bottom: 1rem;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
ol ol, ul ul, ol ul, ul ol {
|
|
98
|
-
margin-bottom: 0;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
dt { font-weight: 700; }
|
|
102
|
-
|
|
103
|
-
dd {
|
|
104
|
-
margin-bottom: 0.5rem;
|
|
105
|
-
margin-left: 0;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
blockquote { margin: 0 0 1rem; }
|
|
109
|
-
|
|
110
|
-
// Bold & strong
|
|
111
|
-
b,
|
|
112
|
-
strong { font-weight: bolder; }
|
|
113
|
-
|
|
114
|
-
small { font-size: 80%; }
|
|
115
|
-
|
|
116
|
-
// Sub & sup — không ảnh hưởng line-height
|
|
117
|
-
sub,
|
|
118
|
-
sup {
|
|
119
|
-
position: relative;
|
|
120
|
-
font-size: 75%;
|
|
121
|
-
line-height: 0;
|
|
122
|
-
vertical-align: baseline;
|
|
123
|
-
}
|
|
124
|
-
sub { bottom: -0.25em; }
|
|
125
|
-
sup { top: -0.5em; }
|
|
126
|
-
|
|
127
|
-
// --------------------------------------------------------------------------
|
|
128
|
-
// 7. Links
|
|
129
|
-
// --------------------------------------------------------------------------
|
|
130
|
-
a {
|
|
131
|
-
color: #007bff;
|
|
132
|
-
text-decoration: none;
|
|
133
|
-
background-color: transparent; // Xóa nền xám trên link active trong IE 10
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
a:hover {
|
|
137
|
-
text-decoration: underline;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Link không có href (anchor thuần) — kế thừa màu cha, không gạch chân
|
|
141
|
-
a:not([href]):not([class]),
|
|
142
|
-
a:not([href]):not([class]):hover {
|
|
143
|
-
color: inherit;
|
|
144
|
-
text-decoration: none;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// --------------------------------------------------------------------------
|
|
148
|
-
// 8. Code
|
|
149
|
-
// --------------------------------------------------------------------------
|
|
150
|
-
pre,
|
|
151
|
-
code,
|
|
152
|
-
kbd,
|
|
153
|
-
samp {
|
|
154
|
-
font-family: SFMono-Regular, Menlo, Monaco, Consolas, 'Courier New', monospace;
|
|
155
|
-
font-size: 1em; // Sửa font-size lạ trên một số browser
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
pre {
|
|
159
|
-
margin-top: 0;
|
|
160
|
-
margin-bottom: 1rem;
|
|
161
|
-
overflow: auto;
|
|
162
|
-
-ms-overflow-style: scrollbar;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// --------------------------------------------------------------------------
|
|
166
|
-
// 9. Media
|
|
167
|
-
// --------------------------------------------------------------------------
|
|
168
|
-
figure { margin: 0 0 1rem; }
|
|
169
|
-
|
|
170
|
-
img {
|
|
171
|
-
vertical-align: middle;
|
|
172
|
-
border-style: none; // Xóa border trên ảnh trong link (IE 10)
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
svg {
|
|
176
|
-
overflow: hidden; // Fix SVG overflow bug trong IE10/11
|
|
177
|
-
vertical-align: middle;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// --------------------------------------------------------------------------
|
|
181
|
-
// 10. Tables
|
|
182
|
-
// --------------------------------------------------------------------------
|
|
183
|
-
table {
|
|
184
|
-
border-collapse: collapse; // Tránh double border khi dùng border trên td/th
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
caption {
|
|
188
|
-
padding-top: 0.75rem;
|
|
189
|
-
padding-bottom: 0.75rem;
|
|
190
|
-
color: #6c757d;
|
|
191
|
-
text-align: left;
|
|
192
|
-
caption-side: bottom;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
th {
|
|
196
|
-
font-weight: 600; // Không dùng bold mặc định của browser
|
|
197
|
-
text-align: inherit;
|
|
198
|
-
text-align: -webkit-match-parent;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// --------------------------------------------------------------------------
|
|
202
|
-
// 11. Forms
|
|
203
|
-
// --------------------------------------------------------------------------
|
|
204
|
-
|
|
205
|
-
// label là inline-block để có thể set margin; margin-bottom mặc định 0.5rem
|
|
206
|
-
// có thể override per-component (xem core/form.scss cho mat-checkbox).
|
|
207
|
-
label {
|
|
208
|
-
display: inline-block;
|
|
209
|
-
margin-bottom: 0.5rem;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// Xóa border-radius mà macOS Chrome tự thêm vào button
|
|
213
|
-
button { border-radius: 0; }
|
|
214
|
-
|
|
215
|
-
// Ẩn outline trên button khi click (chỉ hiện khi dùng bàn phím)
|
|
216
|
-
button:focus:not(:focus-visible) { outline: 0; }
|
|
217
|
-
|
|
218
|
-
input,
|
|
219
|
-
button,
|
|
220
|
-
select,
|
|
221
|
-
optgroup,
|
|
222
|
-
textarea {
|
|
223
|
-
margin: 0;
|
|
224
|
-
font-family: inherit;
|
|
225
|
-
font-size: inherit;
|
|
226
|
-
line-height: inherit;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Hiển thị overflow trên Edge
|
|
230
|
-
button,
|
|
231
|
-
input { overflow: visible; }
|
|
232
|
-
|
|
233
|
-
// Xóa text-transform kế thừa trong Firefox
|
|
234
|
-
button,
|
|
235
|
-
select { text-transform: none; }
|
|
236
|
-
|
|
237
|
-
// Cursor pointer cho role="button"
|
|
238
|
-
[role="button"] { cursor: pointer; }
|
|
239
|
-
|
|
240
|
-
// Xóa word-wrap kỳ lạ trong Safari
|
|
241
|
-
select { word-wrap: normal; }
|
|
242
|
-
|
|
243
|
-
// Fix clickable types trên iOS/Safari
|
|
244
|
-
button,
|
|
245
|
-
[type="button"],
|
|
246
|
-
[type="reset"],
|
|
247
|
-
[type="submit"] {
|
|
248
|
-
-webkit-appearance: button;
|
|
249
|
-
|
|
250
|
-
&:not(:disabled) { cursor: pointer; }
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// Xóa inner border/padding trong Firefox
|
|
254
|
-
button::-moz-focus-inner,
|
|
255
|
-
[type="button"]::-moz-focus-inner,
|
|
256
|
-
[type="reset"]::-moz-focus-inner,
|
|
257
|
-
[type="submit"]::-moz-focus-inner {
|
|
258
|
-
padding: 0;
|
|
259
|
-
border-style: none;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Radio & checkbox
|
|
263
|
-
input[type="radio"],
|
|
264
|
-
input[type="checkbox"] {
|
|
265
|
-
box-sizing: border-box;
|
|
266
|
-
padding: 0;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
textarea {
|
|
270
|
-
overflow: auto; // Xóa scrollbar dọc mặc định trong IE
|
|
271
|
-
resize: vertical; // Chỉ cho resize theo chiều dọc
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
fieldset {
|
|
275
|
-
min-width: 0;
|
|
276
|
-
padding: 0;
|
|
277
|
-
margin: 0;
|
|
278
|
-
border: 0;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
legend {
|
|
282
|
-
display: block;
|
|
283
|
-
width: 100%;
|
|
284
|
-
max-width: 100%;
|
|
285
|
-
padding: 0;
|
|
286
|
-
margin-bottom: 0.5rem;
|
|
287
|
-
font-size: 1.5rem;
|
|
288
|
-
line-height: inherit;
|
|
289
|
-
color: inherit;
|
|
290
|
-
white-space: normal;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
progress { vertical-align: baseline; }
|
|
294
|
-
|
|
295
|
-
// Sửa cursor spinner trên Chrome
|
|
296
|
-
[type="number"]::-webkit-inner-spin-button,
|
|
297
|
-
[type="number"]::-webkit-outer-spin-button { height: auto; }
|
|
298
|
-
|
|
299
|
-
// Sửa rounded corners trên search input trong iOS
|
|
300
|
-
[type="search"] {
|
|
301
|
-
outline-offset: -2px;
|
|
302
|
-
-webkit-appearance: none;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
|
|
306
|
-
|
|
307
|
-
// File upload button — kế thừa font
|
|
308
|
-
::-webkit-file-upload-button {
|
|
309
|
-
font: inherit;
|
|
310
|
-
-webkit-appearance: button;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// --------------------------------------------------------------------------
|
|
314
|
-
// 12. Misc
|
|
315
|
-
// --------------------------------------------------------------------------
|
|
316
|
-
output { display: inline-block; }
|
|
317
|
-
|
|
318
|
-
summary {
|
|
319
|
-
display: list-item;
|
|
320
|
-
cursor: pointer;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
template { display: none; }
|
|
324
|
-
|
|
325
|
-
// Ẩn element có attribute [hidden] (bao gồm IE 10)
|
|
326
|
-
[hidden] { display: none !important; }
|
|
327
|
-
|
|
328
|
-
// Horizontal rule
|
|
329
|
-
hr {
|
|
330
|
-
box-sizing: content-box;
|
|
331
|
-
height: 0;
|
|
332
|
-
overflow: visible;
|
|
333
|
-
}
|
|
1
|
+
// --------------------------------------------------------------------------
|
|
2
|
+
// Base / Reboot — chuẩn hóa rendering giữa các browser, thiết lập baseline
|
|
3
|
+
// cho toàn bộ ứng dụng. Thuần CSS, không phụ thuộc 3rd-party reset.
|
|
4
|
+
//
|
|
5
|
+
// Nguồn gốc rule: kế thừa từ Bootstrap 4 reboot + modern-normalize (đã được
|
|
6
|
+
// inline trực tiếp ở đây để dứt điểm phụ thuộc Bootstrap).
|
|
7
|
+
// --------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
// --------------------------------------------------------------------------
|
|
10
|
+
// 1. Box-sizing
|
|
11
|
+
// Đặt border-box toàn cục để width/height không bị cộng thêm padding/border.
|
|
12
|
+
// Đây là rule quan trọng nhất — thiếu là toàn bộ layout lệch.
|
|
13
|
+
// --------------------------------------------------------------------------
|
|
14
|
+
*,
|
|
15
|
+
*::before,
|
|
16
|
+
*::after {
|
|
17
|
+
box-sizing: border-box;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// --------------------------------------------------------------------------
|
|
21
|
+
// 2. Document
|
|
22
|
+
// --------------------------------------------------------------------------
|
|
23
|
+
html {
|
|
24
|
+
// Ngăn browser tự điều chỉnh font-size khi xoay màn hình (iOS)
|
|
25
|
+
-webkit-text-size-adjust: 100%;
|
|
26
|
+
// Bỏ tap highlight màu xám trên mobile
|
|
27
|
+
-webkit-tap-highlight-color: transparent;
|
|
28
|
+
line-height: 1.15;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// --------------------------------------------------------------------------
|
|
32
|
+
// 3. Body
|
|
33
|
+
// --------------------------------------------------------------------------
|
|
34
|
+
body {
|
|
35
|
+
margin: 0;
|
|
36
|
+
font-family: Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
37
|
+
font-size: 14px;
|
|
38
|
+
font-weight: 400;
|
|
39
|
+
line-height: 1.5;
|
|
40
|
+
color: #212529;
|
|
41
|
+
background-color: #fff;
|
|
42
|
+
text-align: left;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// --------------------------------------------------------------------------
|
|
46
|
+
// 4. Sectioning elements — IE10 fallback (display: block)
|
|
47
|
+
// --------------------------------------------------------------------------
|
|
48
|
+
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
|
|
49
|
+
display: block;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// --------------------------------------------------------------------------
|
|
53
|
+
// 5. Focus management
|
|
54
|
+
// Ẩn outline khi focus bằng chuột/touch; vẫn hiện khi dùng bàn phím.
|
|
55
|
+
// --------------------------------------------------------------------------
|
|
56
|
+
[tabindex="-1"]:focus:not(:focus-visible) {
|
|
57
|
+
outline: 0 !important;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// --------------------------------------------------------------------------
|
|
61
|
+
// 6. Typography
|
|
62
|
+
// --------------------------------------------------------------------------
|
|
63
|
+
|
|
64
|
+
// Bỏ margin-top của heading để dễ kiểm soát spacing trong layouts
|
|
65
|
+
h1, h2, h3, h4, h5, h6 {
|
|
66
|
+
margin-top: 0;
|
|
67
|
+
margin-bottom: 0.5rem;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
p {
|
|
71
|
+
margin-top: 0;
|
|
72
|
+
margin-bottom: 1rem;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Abbreviation với tooltip
|
|
76
|
+
abbr[title] {
|
|
77
|
+
text-decoration: underline dotted;
|
|
78
|
+
cursor: help;
|
|
79
|
+
border-bottom: 0;
|
|
80
|
+
text-decoration-skip-ink: none;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
address {
|
|
84
|
+
margin-bottom: 1rem;
|
|
85
|
+
font-style: normal;
|
|
86
|
+
line-height: inherit;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// List — xóa margin-top, giữ margin-bottom
|
|
90
|
+
ol,
|
|
91
|
+
ul,
|
|
92
|
+
dl {
|
|
93
|
+
margin-top: 0;
|
|
94
|
+
margin-bottom: 1rem;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
ol ol, ul ul, ol ul, ul ol {
|
|
98
|
+
margin-bottom: 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
dt { font-weight: 700; }
|
|
102
|
+
|
|
103
|
+
dd {
|
|
104
|
+
margin-bottom: 0.5rem;
|
|
105
|
+
margin-left: 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
blockquote { margin: 0 0 1rem; }
|
|
109
|
+
|
|
110
|
+
// Bold & strong
|
|
111
|
+
b,
|
|
112
|
+
strong { font-weight: bolder; }
|
|
113
|
+
|
|
114
|
+
small { font-size: 80%; }
|
|
115
|
+
|
|
116
|
+
// Sub & sup — không ảnh hưởng line-height
|
|
117
|
+
sub,
|
|
118
|
+
sup {
|
|
119
|
+
position: relative;
|
|
120
|
+
font-size: 75%;
|
|
121
|
+
line-height: 0;
|
|
122
|
+
vertical-align: baseline;
|
|
123
|
+
}
|
|
124
|
+
sub { bottom: -0.25em; }
|
|
125
|
+
sup { top: -0.5em; }
|
|
126
|
+
|
|
127
|
+
// --------------------------------------------------------------------------
|
|
128
|
+
// 7. Links
|
|
129
|
+
// --------------------------------------------------------------------------
|
|
130
|
+
a {
|
|
131
|
+
color: #007bff;
|
|
132
|
+
text-decoration: none;
|
|
133
|
+
background-color: transparent; // Xóa nền xám trên link active trong IE 10
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
a:hover {
|
|
137
|
+
text-decoration: underline;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Link không có href (anchor thuần) — kế thừa màu cha, không gạch chân
|
|
141
|
+
a:not([href]):not([class]),
|
|
142
|
+
a:not([href]):not([class]):hover {
|
|
143
|
+
color: inherit;
|
|
144
|
+
text-decoration: none;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// --------------------------------------------------------------------------
|
|
148
|
+
// 8. Code
|
|
149
|
+
// --------------------------------------------------------------------------
|
|
150
|
+
pre,
|
|
151
|
+
code,
|
|
152
|
+
kbd,
|
|
153
|
+
samp {
|
|
154
|
+
font-family: SFMono-Regular, Menlo, Monaco, Consolas, 'Courier New', monospace;
|
|
155
|
+
font-size: 1em; // Sửa font-size lạ trên một số browser
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
pre {
|
|
159
|
+
margin-top: 0;
|
|
160
|
+
margin-bottom: 1rem;
|
|
161
|
+
overflow: auto;
|
|
162
|
+
-ms-overflow-style: scrollbar;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// --------------------------------------------------------------------------
|
|
166
|
+
// 9. Media
|
|
167
|
+
// --------------------------------------------------------------------------
|
|
168
|
+
figure { margin: 0 0 1rem; }
|
|
169
|
+
|
|
170
|
+
img {
|
|
171
|
+
vertical-align: middle;
|
|
172
|
+
border-style: none; // Xóa border trên ảnh trong link (IE 10)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
svg {
|
|
176
|
+
overflow: hidden; // Fix SVG overflow bug trong IE10/11
|
|
177
|
+
vertical-align: middle;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// --------------------------------------------------------------------------
|
|
181
|
+
// 10. Tables
|
|
182
|
+
// --------------------------------------------------------------------------
|
|
183
|
+
table {
|
|
184
|
+
border-collapse: collapse; // Tránh double border khi dùng border trên td/th
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
caption {
|
|
188
|
+
padding-top: 0.75rem;
|
|
189
|
+
padding-bottom: 0.75rem;
|
|
190
|
+
color: #6c757d;
|
|
191
|
+
text-align: left;
|
|
192
|
+
caption-side: bottom;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
th {
|
|
196
|
+
font-weight: 600; // Không dùng bold mặc định của browser
|
|
197
|
+
text-align: inherit;
|
|
198
|
+
text-align: -webkit-match-parent;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// --------------------------------------------------------------------------
|
|
202
|
+
// 11. Forms
|
|
203
|
+
// --------------------------------------------------------------------------
|
|
204
|
+
|
|
205
|
+
// label là inline-block để có thể set margin; margin-bottom mặc định 0.5rem
|
|
206
|
+
// có thể override per-component (xem core/form.scss cho mat-checkbox).
|
|
207
|
+
label {
|
|
208
|
+
display: inline-block;
|
|
209
|
+
margin-bottom: 0.5rem;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Xóa border-radius mà macOS Chrome tự thêm vào button
|
|
213
|
+
button { border-radius: 0; }
|
|
214
|
+
|
|
215
|
+
// Ẩn outline trên button khi click (chỉ hiện khi dùng bàn phím)
|
|
216
|
+
button:focus:not(:focus-visible) { outline: 0; }
|
|
217
|
+
|
|
218
|
+
input,
|
|
219
|
+
button,
|
|
220
|
+
select,
|
|
221
|
+
optgroup,
|
|
222
|
+
textarea {
|
|
223
|
+
margin: 0;
|
|
224
|
+
font-family: inherit;
|
|
225
|
+
font-size: inherit;
|
|
226
|
+
line-height: inherit;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Hiển thị overflow trên Edge
|
|
230
|
+
button,
|
|
231
|
+
input { overflow: visible; }
|
|
232
|
+
|
|
233
|
+
// Xóa text-transform kế thừa trong Firefox
|
|
234
|
+
button,
|
|
235
|
+
select { text-transform: none; }
|
|
236
|
+
|
|
237
|
+
// Cursor pointer cho role="button"
|
|
238
|
+
[role="button"] { cursor: pointer; }
|
|
239
|
+
|
|
240
|
+
// Xóa word-wrap kỳ lạ trong Safari
|
|
241
|
+
select { word-wrap: normal; }
|
|
242
|
+
|
|
243
|
+
// Fix clickable types trên iOS/Safari
|
|
244
|
+
button,
|
|
245
|
+
[type="button"],
|
|
246
|
+
[type="reset"],
|
|
247
|
+
[type="submit"] {
|
|
248
|
+
-webkit-appearance: button;
|
|
249
|
+
|
|
250
|
+
&:not(:disabled) { cursor: pointer; }
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Xóa inner border/padding trong Firefox
|
|
254
|
+
button::-moz-focus-inner,
|
|
255
|
+
[type="button"]::-moz-focus-inner,
|
|
256
|
+
[type="reset"]::-moz-focus-inner,
|
|
257
|
+
[type="submit"]::-moz-focus-inner {
|
|
258
|
+
padding: 0;
|
|
259
|
+
border-style: none;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Radio & checkbox
|
|
263
|
+
input[type="radio"],
|
|
264
|
+
input[type="checkbox"] {
|
|
265
|
+
box-sizing: border-box;
|
|
266
|
+
padding: 0;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
textarea {
|
|
270
|
+
overflow: auto; // Xóa scrollbar dọc mặc định trong IE
|
|
271
|
+
resize: vertical; // Chỉ cho resize theo chiều dọc
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
fieldset {
|
|
275
|
+
min-width: 0;
|
|
276
|
+
padding: 0;
|
|
277
|
+
margin: 0;
|
|
278
|
+
border: 0;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
legend {
|
|
282
|
+
display: block;
|
|
283
|
+
width: 100%;
|
|
284
|
+
max-width: 100%;
|
|
285
|
+
padding: 0;
|
|
286
|
+
margin-bottom: 0.5rem;
|
|
287
|
+
font-size: 1.5rem;
|
|
288
|
+
line-height: inherit;
|
|
289
|
+
color: inherit;
|
|
290
|
+
white-space: normal;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
progress { vertical-align: baseline; }
|
|
294
|
+
|
|
295
|
+
// Sửa cursor spinner trên Chrome
|
|
296
|
+
[type="number"]::-webkit-inner-spin-button,
|
|
297
|
+
[type="number"]::-webkit-outer-spin-button { height: auto; }
|
|
298
|
+
|
|
299
|
+
// Sửa rounded corners trên search input trong iOS
|
|
300
|
+
[type="search"] {
|
|
301
|
+
outline-offset: -2px;
|
|
302
|
+
-webkit-appearance: none;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
|
|
306
|
+
|
|
307
|
+
// File upload button — kế thừa font
|
|
308
|
+
::-webkit-file-upload-button {
|
|
309
|
+
font: inherit;
|
|
310
|
+
-webkit-appearance: button;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// --------------------------------------------------------------------------
|
|
314
|
+
// 12. Misc
|
|
315
|
+
// --------------------------------------------------------------------------
|
|
316
|
+
output { display: inline-block; }
|
|
317
|
+
|
|
318
|
+
summary {
|
|
319
|
+
display: list-item;
|
|
320
|
+
cursor: pointer;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
template { display: none; }
|
|
324
|
+
|
|
325
|
+
// Ẩn element có attribute [hidden] (bao gồm IE 10)
|
|
326
|
+
[hidden] { display: none !important; }
|
|
327
|
+
|
|
328
|
+
// Horizontal rule
|
|
329
|
+
hr {
|
|
330
|
+
box-sizing: content-box;
|
|
331
|
+
height: 0;
|
|
332
|
+
overflow: visible;
|
|
333
|
+
}
|