@sd-angular/core 19.0.9 → 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.
Files changed (150) hide show
  1. package/README.md +21 -21
  2. package/assets/STYLE-GUIDE.md +19 -19
  3. package/assets/fonts/fonts.scss +115 -115
  4. package/assets/scss/core/scrollbar.scss +30 -30
  5. package/assets/scss/core/utilities/_grid.scss +25 -19
  6. package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +2 -4
  7. package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +2 -4
  8. package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +5 -6
  9. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +1 -1
  10. package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +1 -1
  11. package/components/form-generic/src/components/form-render/form-render.component.d.ts +4 -6
  12. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
  13. package/components/form-generic/src/services/form-generic.service.d.ts +1 -3
  14. package/components/modal/src/modal.component.d.ts +1 -1
  15. package/components/tab-router/src/models/tab-router.model.d.ts +2 -1
  16. package/components/tab-router/src/services/tab-router.service.d.ts +0 -1
  17. package/components/table/src/components/command/desktop-command.component.d.ts +7 -7
  18. package/components/table/src/components/command/pipes/command.pipe.d.ts +1 -12
  19. package/components/table/src/components/command/pipes/filter.pipe.d.ts +1 -8
  20. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +2 -1
  21. package/components/table/src/models/table-column.model.d.ts +3 -2
  22. package/components/table/src/pipes/selection-disabled.pipe.d.ts +1 -1
  23. package/components/table/src/services/config.service.d.ts +4 -5
  24. package/fesm2022/sd-angular-core-components-anchor.mjs +14 -14
  25. package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
  26. package/fesm2022/sd-angular-core-components-autoid-inspector.mjs.map +1 -1
  27. package/fesm2022/sd-angular-core-components-avatar.mjs +2 -2
  28. package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -1
  29. package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
  30. package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
  31. package/fesm2022/sd-angular-core-components-chart.mjs +40 -40
  32. package/fesm2022/sd-angular-core-components-chart.mjs.map +1 -1
  33. package/fesm2022/sd-angular-core-components-ckeditor-styles.mjs.map +1 -1
  34. package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -1
  35. package/fesm2022/sd-angular-core-components-document-builder.mjs +0 -1
  36. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  37. package/fesm2022/sd-angular-core-components-editor.mjs +2 -2
  38. package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
  39. package/fesm2022/sd-angular-core-components-form-generic.mjs +39 -68
  40. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
  41. package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
  42. package/fesm2022/sd-angular-core-components-inform.mjs +2 -2
  43. package/fesm2022/sd-angular-core-components-inform.mjs.map +1 -1
  44. package/fesm2022/sd-angular-core-components-mini-editor.mjs.map +1 -1
  45. package/fesm2022/sd-angular-core-components-modal-resizable.mjs.map +1 -1
  46. package/fesm2022/sd-angular-core-components-modal.mjs +2 -2
  47. package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
  48. package/fesm2022/sd-angular-core-components-operator.mjs.map +1 -1
  49. package/fesm2022/sd-angular-core-components-org-chart.mjs +2 -2
  50. package/fesm2022/sd-angular-core-components-org-chart.mjs.map +1 -1
  51. package/fesm2022/sd-angular-core-components-preview.mjs +4 -4
  52. package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
  53. package/fesm2022/sd-angular-core-components-query-bar.mjs +10 -10
  54. package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -1
  55. package/fesm2022/sd-angular-core-components-query-builder.mjs +2 -2
  56. package/fesm2022/sd-angular-core-components-query-builder.mjs.map +1 -1
  57. package/fesm2022/sd-angular-core-components-quick-action.mjs +2 -2
  58. package/fesm2022/sd-angular-core-components-quick-action.mjs.map +1 -1
  59. package/fesm2022/sd-angular-core-components-section.mjs +2 -2
  60. package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
  61. package/fesm2022/sd-angular-core-components-side-drawer.mjs +2 -2
  62. package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
  63. package/fesm2022/sd-angular-core-components-splitter.mjs +6 -6
  64. package/fesm2022/sd-angular-core-components-splitter.mjs.map +1 -1
  65. package/fesm2022/sd-angular-core-components-stepper.mjs +2 -2
  66. package/fesm2022/sd-angular-core-components-stepper.mjs.map +1 -1
  67. package/fesm2022/sd-angular-core-components-tab-router.mjs +31 -26
  68. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  69. package/fesm2022/sd-angular-core-components-tab.mjs +2 -2
  70. package/fesm2022/sd-angular-core-components-tab.mjs.map +1 -1
  71. package/fesm2022/sd-angular-core-components-table.mjs +53 -64
  72. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  73. package/fesm2022/sd-angular-core-components-tree.mjs +2 -2
  74. package/fesm2022/sd-angular-core-components-tree.mjs.map +1 -1
  75. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  76. package/fesm2022/sd-angular-core-components-view.mjs.map +1 -1
  77. package/fesm2022/sd-angular-core-directives.mjs +0 -1
  78. package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
  79. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  80. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
  81. package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
  82. package/fesm2022/sd-angular-core-forms-date-range.mjs +2 -2
  83. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  84. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  85. package/fesm2022/sd-angular-core-forms-datetime.mjs +4 -4
  86. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  87. package/fesm2022/sd-angular-core-forms-inline-text.mjs.map +1 -1
  88. package/fesm2022/sd-angular-core-forms-input-color.mjs.map +1 -1
  89. package/fesm2022/sd-angular-core-forms-input-number.mjs +2 -2
  90. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  91. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  92. package/fesm2022/sd-angular-core-forms-label.mjs +2 -2
  93. package/fesm2022/sd-angular-core-forms-label.mjs.map +1 -1
  94. package/fesm2022/sd-angular-core-forms-models.mjs.map +1 -1
  95. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  96. package/fesm2022/sd-angular-core-forms-select.mjs +47 -14
  97. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  98. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  99. package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
  100. package/fesm2022/sd-angular-core-interceptors.mjs +0 -2
  101. package/fesm2022/sd-angular-core-interceptors.mjs.map +1 -1
  102. package/fesm2022/sd-angular-core-modules-auth.mjs +14 -38
  103. package/fesm2022/sd-angular-core-modules-auth.mjs.map +1 -1
  104. package/fesm2022/sd-angular-core-modules-authom.mjs.map +1 -1
  105. package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -1
  106. package/fesm2022/sd-angular-core-modules-layout.mjs +7 -14
  107. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  108. package/fesm2022/sd-angular-core-modules-permission.mjs +5 -12
  109. package/fesm2022/sd-angular-core-modules-permission.mjs.map +1 -1
  110. package/fesm2022/sd-angular-core-pipes.mjs +4 -12
  111. package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
  112. package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
  113. package/fesm2022/sd-angular-core-services-confirm.mjs +16 -21
  114. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  115. package/fesm2022/sd-angular-core-services-docx.mjs +1 -8
  116. package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -1
  117. package/fesm2022/sd-angular-core-services-excel.mjs +26 -19
  118. package/fesm2022/sd-angular-core-services-excel.mjs.map +1 -1
  119. package/fesm2022/sd-angular-core-services-license.mjs +5 -12
  120. package/fesm2022/sd-angular-core-services-license.mjs.map +1 -1
  121. package/fesm2022/sd-angular-core-services-notify.mjs +70 -87
  122. package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
  123. package/fesm2022/sd-angular-core-services-storage.mjs +4 -12
  124. package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
  125. package/fesm2022/sd-angular-core-utilities-extensions.mjs +43 -1
  126. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  127. package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
  128. package/fesm2022/sd-angular-core.mjs.map +1 -1
  129. package/forms/select/src/select-footer-action.directive.d.ts +5 -1
  130. package/forms/select/src/select.component.d.ts +4 -0
  131. package/modules/auth/guards/auth.guard.d.ts +2 -4
  132. package/modules/auth/guards/portal.guard.d.ts +2 -4
  133. package/modules/auth/services/auth.service.d.ts +3 -4
  134. package/modules/keycloak/htmls/auth-keycloak-error.html +54 -54
  135. package/modules/keycloak/htmls/silent-renew.html +7 -7
  136. package/modules/layout/modules/home/guards/home-redirect.guard.d.ts +3 -5
  137. package/modules/permission/src/guards/permission.guard.d.ts +2 -5
  138. package/package.json +80 -80
  139. package/pipes/src/format-number.pipe.d.ts +1 -3
  140. package/sd-angular-core-19.0.11.tgz +0 -0
  141. package/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.d.ts +3 -3
  142. package/services/excel/src/lib/excel.service.d.ts +0 -1
  143. package/services/excel/src/lib/spreadsheet-formula-injection.util.d.ts +5 -0
  144. package/services/license/src/license.service.d.ts +2 -3
  145. package/services/notify/src/components/toast/toast.component.d.ts +9 -13
  146. package/services/notify/src/notify.service.d.ts +4 -5
  147. package/services/storage/src/storage.service.d.ts +3 -4
  148. package/utilities/extensions/index.d.ts +1 -0
  149. package/utilities/extensions/src/object.extension.d.ts +8 -0
  150. package/sd-angular-core-19.0.9.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 |
@@ -667,7 +667,7 @@ import { Color } from '@sd-angular/core/utilities';
667
667
  @Component({
668
668
  selector: 'sd-my-component',
669
669
  templateUrl: './my-component.component.html',
670
- styleUrls: ['./my-component.component.scss'],
670
+ styleUrl: './my-component.component.scss',
671
671
  changeDetection: ChangeDetectionStrategy.OnPush,
672
672
  standalone: true,
673
673
  imports: [],
@@ -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
@@ -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>`.
@@ -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
+ }
@@ -1,11 +1,13 @@
1
+ @use "sass:math";
2
+
1
3
  // --------------------------------------------------------------------------
2
- // Grid row/col 12-column flexbox + native CSS Grid container
3
- // Thuần CSS Flexbox / CSS Grid, không phụ thuộc framework ngoài.
4
- // Breakpoint convention (sm/md/lg/xl) trùng Bootstrap để host app dễ migrate.
4
+ // Grid - row/col 12-column flexbox + native CSS Grid container
5
+ // Pure CSS Flexbox / CSS Grid, with no external framework dependency.
6
+ // Breakpoint convention (sm/md/lg/xl) matches Bootstrap to ease host migration.
5
7
  // --------------------------------------------------------------------------
6
8
 
7
9
  // --------------------------------------------------------------------------
8
- // 1. Flexbox row/col (.row, .col-{1-12})
10
+ // 1. Flexbox row/col (.row, .col-{1-12})
9
11
  // --------------------------------------------------------------------------
10
12
  $grid-columns: 12;
11
13
  $grid-gutter: 16px;
@@ -45,13 +47,15 @@ $grid-gutter: 16px;
45
47
  > * { padding-left: 2px; padding-right: 2px; }
46
48
  }
47
49
 
48
- // .col-1 .col-12
50
+ // .col-1 ... .col-12
49
51
  @for $i from 1 through $grid-columns {
52
+ $col-size: math.percentage(math.div($i, $grid-columns));
53
+
50
54
  .col-#{$i} {
51
55
  box-sizing: border-box;
52
- width: percentage(calc($i / $grid-columns));
53
- flex: 0 0 percentage(calc($i / $grid-columns));
54
- max-width: percentage(calc($i / $grid-columns));
56
+ width: $col-size;
57
+ flex: 0 0 $col-size;
58
+ max-width: $col-size;
55
59
  padding-left: calc($grid-gutter / 2);
56
60
  padding-right: calc($grid-gutter / 2);
57
61
  }
@@ -65,12 +69,12 @@ $grid-gutter: 16px;
65
69
 
66
70
  // --------------------------------------------------------------------------
67
71
  // 1b. Responsive columns
68
- // col-sm-{1-12} : 576px
69
- // col-md-{1-12} : 768px
70
- // col-lg-{1-12} : 992px
71
- // col-xl-{1-12} : 1200px
72
+ // col-sm-{1-12}: >= 576px
73
+ // col-md-{1-12}: >= 768px
74
+ // col-lg-{1-12}: >= 992px
75
+ // col-xl-{1-12}: >= 1200px
72
76
  //
73
- // Mobile-first: mặc định width: 100%, áp dụng kích thước khi đủ rộng.
77
+ // Mobile-first: default width is 100%; column size applies from breakpoint up.
74
78
  // --------------------------------------------------------------------------
75
79
  $grid-breakpoints: (
76
80
  'sm': 576px,
@@ -79,7 +83,7 @@ $grid-breakpoints: (
79
83
  'xl': 1200px,
80
84
  );
81
85
 
82
- // col-{bp} chiếm hết chiều rộng tại breakpoint đó
86
+ // col-{bp} - full-width flexible column at the breakpoint
83
87
  @each $bp, $min-width in $grid-breakpoints {
84
88
  @media (min-width: $min-width) {
85
89
  .col-#{$bp} {
@@ -90,15 +94,17 @@ $grid-breakpoints: (
90
94
  }
91
95
  }
92
96
 
93
- // col-{bp}-{1-12} chiếm n/12 chiều rộng tại breakpoint đó
97
+ // col-{bp}-{1-12} - n/12 column width at the breakpoint
94
98
  @each $bp, $min-width in $grid-breakpoints {
95
99
  @media (min-width: $min-width) {
96
100
  @for $i from 1 through $grid-columns {
101
+ $col-size: math.percentage(math.div($i, $grid-columns));
102
+
97
103
  .col-#{$bp}-#{$i} {
98
104
  box-sizing: border-box;
99
- width: percentage(calc($i / $grid-columns));
100
- flex: 0 0 percentage(calc($i / $grid-columns));
101
- max-width: percentage(calc($i / $grid-columns));
105
+ width: $col-size;
106
+ flex: 0 0 $col-size;
107
+ max-width: $col-size;
102
108
  padding-left: calc($grid-gutter / 2);
103
109
  padding-right: calc($grid-gutter / 2);
104
110
  }
@@ -107,7 +113,7 @@ $grid-breakpoints: (
107
113
  }
108
114
 
109
115
  // --------------------------------------------------------------------------
110
- // 2. CSS Grid container (.grid-container)
116
+ // 2. CSS Grid container (.grid-container)
111
117
  // grid-container + grid-cols-{1-12} + col-span-{1-12}
112
118
  // --------------------------------------------------------------------------
113
119
  .grid-container {
@@ -1,11 +1,9 @@
1
1
  import { EventEmitter } from '@angular/core';
2
2
  import { FormGroup } from '@angular/forms';
3
3
  import { SdModal } from '@sd-angular/core/components/modal';
4
- import { ISdFormGenericConfiguration } from '../../../../configurations';
5
4
  import { SdFormGenericComponent, SdFormGenericDefinitionTable, SdFormGenericGroup, SdFormGenericTableColumn, SdFormGenericVariable } from '../../../../models';
6
5
  import * as i0 from "@angular/core";
7
6
  export declare class AttributeTable {
8
- private formGenericConfiguration;
9
7
  modal?: SdModal;
10
8
  form: FormGroup<{}>;
11
9
  components: (SdFormGenericComponent | SdFormGenericGroup)[];
@@ -13,6 +11,7 @@ export declare class AttributeTable {
13
11
  columnsKey?: string;
14
12
  set _columnsKey(columnsKey: string | undefined | null);
15
13
  columnsKeyChange: EventEmitter<string>;
14
+ private readonly formGenericConfiguration;
16
15
  tables: SdFormGenericDefinitionTable[];
17
16
  types: {
18
17
  value: string;
@@ -22,7 +21,6 @@ export declare class AttributeTable {
22
21
  set _columns(columns: SdFormGenericTableColumn[] | undefined | null);
23
22
  columnsChange: EventEmitter<SdFormGenericTableColumn[]>;
24
23
  column?: SdFormGenericTableColumn;
25
- constructor(formGenericConfiguration: ISdFormGenericConfiguration | null);
26
24
  onChangeColumnsKey: (value: any) => void;
27
25
  addColumn: () => void;
28
26
  readonly columnTypeIcons: Record<string, string>;
@@ -31,6 +29,6 @@ export declare class AttributeTable {
31
29
  editColumn: (idx: number) => void;
32
30
  removeColumn: (idx: number) => void;
33
31
  onConfirm: () => void;
34
- static ɵfac: i0.ɵɵFactoryDeclaration<AttributeTable, [{ optional: true; }]>;
32
+ static ɵfac: i0.ɵɵFactoryDeclaration<AttributeTable, never>;
35
33
  static ɵcmp: i0.ɵɵComponentDeclaration<AttributeTable, "attribute-table", never, { "components": { "alias": "components"; "required": true; }; "variables": { "alias": "variables"; "required": true; }; "_columnsKey": { "alias": "columnsKey"; "required": true; }; "_columns": { "alias": "columns"; "required": true; }; }, { "columnsKeyChange": "columnsKeyChange"; "columnsChange": "columnsChange"; }, never, never, true, never>;
36
34
  }
@@ -1,15 +1,13 @@
1
1
  import { EventEmitter } from '@angular/core';
2
- import { ISdFormGenericConfiguration } from '../../../../configurations';
3
2
  import { SdFormGenericComponent, SdFormGenericTemplate } from '../../../../models';
4
3
  import * as i0 from "@angular/core";
5
4
  export declare class AttributeTemplate {
6
- private formGenericConfiguration;
7
5
  templates: SdFormGenericTemplate[];
8
6
  component: SdFormGenericComponent;
9
7
  set _component(component: SdFormGenericComponent);
10
8
  sdChange: EventEmitter<SdFormGenericComponent>;
11
- constructor(formGenericConfiguration: ISdFormGenericConfiguration | null);
9
+ private readonly formGenericConfiguration;
12
10
  onChange: (value: string | number | null) => void;
13
- static ɵfac: i0.ɵɵFactoryDeclaration<AttributeTemplate, [{ optional: true; }]>;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<AttributeTemplate, never>;
14
12
  static ɵcmp: i0.ɵɵComponentDeclaration<AttributeTemplate, "attribute-template", never, { "_component": { "alias": "component"; "required": true; }; }, { "sdChange": "sdChange"; }, never, never, true, never>;
15
13
  }
@@ -1,14 +1,11 @@
1
- import { ChangeDetectorRef, EventEmitter } from '@angular/core';
1
+ import { EventEmitter } from '@angular/core';
2
2
  import { FormGroup } from '@angular/forms';
3
3
  import { SdModal } from '@sd-angular/core/components/modal';
4
- import { ISdFormGenericConfiguration } from '../../../../configurations';
5
4
  import { Attribute } from '../../../../models';
6
5
  import { SdFormGenericValidation, SdFormGenericValidationFunction } from '../../../../models/form-generic-validation.model';
7
6
  import { SdFormGeneric } from '../../../../models/form-generic.model';
8
7
  import * as i0 from "@angular/core";
9
8
  export declare class ConfigureValidationComponent {
10
- private ref;
11
- private formGenericConfiguration;
12
9
  modal?: SdModal;
13
10
  form: FormGroup<{}>;
14
11
  attributes: Attribute[];
@@ -19,13 +16,15 @@ export declare class ConfigureValidationComponent {
19
16
  display: string;
20
17
  }[];
21
18
  accept: EventEmitter<SdFormGenericValidation[]>;
22
- constructor(ref: ChangeDetectorRef, formGenericConfiguration: ISdFormGenericConfiguration | null);
19
+ private readonly ref;
20
+ private readonly formGenericConfiguration;
21
+ constructor();
23
22
  ngAfterViewInit(): void;
24
23
  ngOnDestroy(): void;
25
24
  open: (formGeneric: SdFormGeneric) => void;
26
25
  addValidation: (type: SdFormGenericValidation["type"]) => void;
27
26
  removaValidation: (index: number) => void;
28
27
  updateValidations: () => void;
29
- static ɵfac: i0.ɵɵFactoryDeclaration<ConfigureValidationComponent, [null, { optional: true; }]>;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConfigureValidationComponent, never>;
30
29
  static ɵcmp: i0.ɵɵComponentDeclaration<ConfigureValidationComponent, "configure-validation", never, {}, { "accept": "accept"; }, never, never, true, never>;
31
30
  }
@@ -7,7 +7,7 @@ export declare class ExpressionBuilderComponent {
7
7
  private ref;
8
8
  modal?: SdModal;
9
9
  form: FormGroup<{}>;
10
- attributeOperators: Record<"string" | "number" | "boolean" | "datetime" | "values", {
10
+ attributeOperators: Record<"string" | "number" | "boolean" | "values" | "datetime", {
11
11
  value: import("@sd-angular/core/components/form-generic").Operator;
12
12
  symbol?: string;
13
13
  display: string;
@@ -11,7 +11,7 @@ export declare class TableControl {
11
11
  constructor(ref: ChangeDetectorRef, builderService: BuilderService);
12
12
  ngAfterViewInit(): void;
13
13
  ngOnDestroy(): void;
14
- columnIcon: (type: string) => "image" | "text_fields" | "123" | "calendar_month" | "radio_button_checked" | "check_box" | "attach_file";
14
+ columnIcon: (type: string) => "image" | "text_fields" | "123" | "check_box" | "calendar_month" | "radio_button_checked" | "attach_file";
15
15
  sampleRows: () => number[];
16
16
  cellPreview: (column: any, rowIndex: number) => any;
17
17
  static ɵfac: i0.ɵɵFactoryDeclaration<TableControl, never>;