@sd-angular/core 19.0.12 → 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.
Files changed (167) hide show
  1. package/README.md +712 -712
  2. package/assets/STYLE-GUIDE.md +601 -601
  3. package/assets/images/coming-soon.svg +22 -22
  4. package/assets/images/data-empty.svg +20 -20
  5. package/assets/images/expired.svg +21 -21
  6. package/assets/images/file-error.svg +27 -27
  7. package/assets/images/filter-empty.svg +19 -19
  8. package/assets/images/filter-required.svg +20 -20
  9. package/assets/images/forbidden.svg +14 -14
  10. package/assets/images/image-error.svg +26 -26
  11. package/assets/images/maintenance.svg +22 -22
  12. package/assets/images/not-found.svg +19 -19
  13. package/assets/images/offline.svg +19 -19
  14. package/assets/images/submitted.svg +17 -17
  15. package/assets/images/success.svg +17 -17
  16. package/assets/images/unauthorized.svg +21 -21
  17. package/assets/images/unknown-error.svg +17 -17
  18. package/assets/scss/ckeditor5.scss +88 -88
  19. package/assets/scss/core/_inline-edit.scss +105 -105
  20. package/assets/scss/core/color.scss +73 -73
  21. package/assets/scss/core/form.scss +317 -317
  22. package/assets/scss/core/image.scss +35 -35
  23. package/assets/scss/core/utilities/_base.scss +333 -333
  24. package/assets/scss/core/utilities/_border.scss +22 -22
  25. package/assets/scss/core/utilities/_display.scss +10 -10
  26. package/assets/scss/core/utilities/_elevation.scss +80 -80
  27. package/assets/scss/core/utilities/_flexbox.scss +54 -54
  28. package/assets/scss/core/utilities/_gap.scss +9 -9
  29. package/assets/scss/core/utilities/_index.scss +17 -17
  30. package/assets/scss/core/utilities/_misc.scss +20 -20
  31. package/assets/scss/core/utilities/_overflow.scss +9 -9
  32. package/assets/scss/core/utilities/_position.scss +8 -8
  33. package/assets/scss/core/utilities/_sizing.scss +28 -28
  34. package/assets/scss/core/utilities/_spacing.scss +31 -31
  35. package/assets/scss/core/utilities/_typography.scss +99 -99
  36. package/assets/scss/sd-core.scss +16 -16
  37. package/assets/scss/themes/default.scss +45 -45
  38. package/assets/scss/themes/material-theme.scss +101 -101
  39. package/components/preview/src/preview-pdf/pdf-worker-inline.generated.d.ts +7 -0
  40. package/components/table/src/services/table-export/table-export.service.d.ts +3 -1
  41. package/components/table/src/table.component.d.ts +1 -1
  42. package/fesm2022/sd-angular-core-components-anchor.mjs +6 -6
  43. package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
  44. package/fesm2022/sd-angular-core-components-autoid-inspector.mjs +2 -2
  45. package/fesm2022/sd-angular-core-components-autoid-inspector.mjs.map +1 -1
  46. package/fesm2022/sd-angular-core-components-badge.mjs +2 -2
  47. package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
  48. package/fesm2022/sd-angular-core-components-base.mjs.map +1 -1
  49. package/fesm2022/sd-angular-core-components-button.mjs +2 -2
  50. package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
  51. package/fesm2022/sd-angular-core-components-chart.mjs +40 -40
  52. package/fesm2022/sd-angular-core-components-chart.mjs.map +1 -1
  53. package/fesm2022/sd-angular-core-components-ckeditor-styles.mjs.map +1 -1
  54. package/fesm2022/sd-angular-core-components-code-editor.mjs +2 -2
  55. package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -1
  56. package/fesm2022/sd-angular-core-components-document-builder.mjs +77 -77
  57. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  58. package/fesm2022/sd-angular-core-components-editor.mjs +2 -2
  59. package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
  60. package/fesm2022/sd-angular-core-components-form-generic.mjs +106 -106
  61. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
  62. package/fesm2022/sd-angular-core-components-history.mjs +2 -2
  63. package/fesm2022/sd-angular-core-components-history.mjs.map +1 -1
  64. package/fesm2022/sd-angular-core-components-import-excel.mjs +2 -2
  65. package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
  66. package/fesm2022/sd-angular-core-components-inform.mjs.map +1 -1
  67. package/fesm2022/sd-angular-core-components-mini-editor.mjs +2 -2
  68. package/fesm2022/sd-angular-core-components-mini-editor.mjs.map +1 -1
  69. package/fesm2022/sd-angular-core-components-modal-resizable.mjs +2 -2
  70. package/fesm2022/sd-angular-core-components-modal-resizable.mjs.map +1 -1
  71. package/fesm2022/sd-angular-core-components-modal.mjs +2 -2
  72. package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
  73. package/fesm2022/sd-angular-core-components-operator.mjs +2 -2
  74. package/fesm2022/sd-angular-core-components-operator.mjs.map +1 -1
  75. package/fesm2022/sd-angular-core-components-org-chart.mjs +2 -2
  76. package/fesm2022/sd-angular-core-components-org-chart.mjs.map +1 -1
  77. package/fesm2022/sd-angular-core-components-preview.mjs +32 -6
  78. package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
  79. package/fesm2022/sd-angular-core-components-query-bar.mjs +10 -10
  80. package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -1
  81. package/fesm2022/sd-angular-core-components-query-builder.mjs +2 -2
  82. package/fesm2022/sd-angular-core-components-query-builder.mjs.map +1 -1
  83. package/fesm2022/sd-angular-core-components-section.mjs +4 -4
  84. package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
  85. package/fesm2022/sd-angular-core-components-side-drawer.mjs +2 -2
  86. package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
  87. package/fesm2022/sd-angular-core-components-stepper.mjs +2 -2
  88. package/fesm2022/sd-angular-core-components-stepper.mjs.map +1 -1
  89. package/fesm2022/sd-angular-core-components-tab-router.mjs +6 -6
  90. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  91. package/fesm2022/sd-angular-core-components-tab.mjs +2 -2
  92. package/fesm2022/sd-angular-core-components-tab.mjs.map +1 -1
  93. package/fesm2022/sd-angular-core-components-table.mjs +32 -17
  94. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  95. package/fesm2022/sd-angular-core-components-upload-file.mjs +4 -4
  96. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  97. package/fesm2022/sd-angular-core-components-view.mjs +2 -2
  98. package/fesm2022/sd-angular-core-components-view.mjs.map +1 -1
  99. package/fesm2022/sd-angular-core-configurations.mjs.map +1 -1
  100. package/fesm2022/sd-angular-core-directives.mjs +20 -20
  101. package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
  102. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +2 -2
  103. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  104. package/fesm2022/sd-angular-core-forms-checkbox.mjs +2 -2
  105. package/fesm2022/sd-angular-core-forms-checkbox.mjs.map +1 -1
  106. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +2 -2
  107. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
  108. package/fesm2022/sd-angular-core-forms-chip.mjs +2 -2
  109. package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
  110. package/fesm2022/sd-angular-core-forms-date-range.mjs +2 -2
  111. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  112. package/fesm2022/sd-angular-core-forms-date.mjs +114 -35
  113. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  114. package/fesm2022/sd-angular-core-forms-datetime.mjs +6 -6
  115. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  116. package/fesm2022/sd-angular-core-forms-directives.mjs.map +1 -1
  117. package/fesm2022/sd-angular-core-forms-inline-text.mjs +2 -2
  118. package/fesm2022/sd-angular-core-forms-inline-text.mjs.map +1 -1
  119. package/fesm2022/sd-angular-core-forms-input-color.mjs +2 -2
  120. package/fesm2022/sd-angular-core-forms-input-color.mjs.map +1 -1
  121. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  122. package/fesm2022/sd-angular-core-forms-input.mjs +2 -2
  123. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  124. package/fesm2022/sd-angular-core-forms-label.mjs +2 -2
  125. package/fesm2022/sd-angular-core-forms-label.mjs.map +1 -1
  126. package/fesm2022/sd-angular-core-forms-models.mjs.map +1 -1
  127. package/fesm2022/sd-angular-core-forms-radio.mjs +2 -2
  128. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  129. package/fesm2022/sd-angular-core-forms-select.mjs +2 -2
  130. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  131. package/fesm2022/sd-angular-core-forms-switch.mjs +2 -2
  132. package/fesm2022/sd-angular-core-forms-switch.mjs.map +1 -1
  133. package/fesm2022/sd-angular-core-forms-textarea.mjs +2 -2
  134. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  135. package/fesm2022/sd-angular-core-handlers.mjs.map +1 -1
  136. package/fesm2022/sd-angular-core-i18n.mjs +20 -0
  137. package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
  138. package/fesm2022/sd-angular-core-interceptors.mjs.map +1 -1
  139. package/fesm2022/sd-angular-core-modules-auth.mjs.map +1 -1
  140. package/fesm2022/sd-angular-core-modules-authom.mjs.map +1 -1
  141. package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -1
  142. package/fesm2022/sd-angular-core-modules-layout.mjs +145 -46
  143. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  144. package/fesm2022/sd-angular-core-modules-permission.mjs.map +1 -1
  145. package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
  146. package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
  147. package/fesm2022/sd-angular-core-services-cache.mjs.map +1 -1
  148. package/fesm2022/sd-angular-core-services-confirm.mjs +2 -2
  149. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  150. package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -1
  151. package/fesm2022/sd-angular-core-services-excel.mjs.map +1 -1
  152. package/fesm2022/sd-angular-core-services-license.mjs.map +1 -1
  153. package/fesm2022/sd-angular-core-services-loading.mjs +5 -5
  154. package/fesm2022/sd-angular-core-services-loading.mjs.map +1 -1
  155. package/fesm2022/sd-angular-core-services-notify.mjs +12 -12
  156. package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
  157. package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
  158. package/fesm2022/sd-angular-core-utilities-data-state.mjs.map +1 -1
  159. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  160. package/forms/date/src/date.component.d.ts +9 -1
  161. package/i18n/src/en.d.ts +4 -0
  162. package/modules/layout/components/sidebar-v1/main.component.d.ts +1 -0
  163. package/modules/layout/index.d.ts +1 -0
  164. package/modules/layout/utils/index.d.ts +1 -0
  165. package/modules/layout/utils/tab-name.util.d.ts +8 -0
  166. package/package.json +41 -41
  167. package/sd-angular-core-19.0.12.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
+ }