ux4g-components-angular 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +330 -48
- package/dist/accessibility-bar/README.md +330 -48
- package/dist/accordion/README.md +330 -48
- package/dist/alert/README.md +330 -48
- package/dist/avatar/README.md +330 -48
- package/dist/badge/README.md +330 -48
- package/dist/breadcrumb/README.md +330 -48
- package/dist/button/README.md +330 -48
- package/dist/card/README.md +330 -48
- package/dist/carousel/README.md +330 -48
- package/dist/checkbox/README.md +330 -48
- package/dist/chip/README.md +330 -48
- package/dist/chip-group/README.md +330 -48
- package/dist/combobox/README.md +330 -48
- package/dist/date-time-picker/README.md +330 -48
- package/dist/divider/README.md +330 -48
- package/dist/draft-status-banner/README.md +330 -48
- package/dist/drawer/README.md +330 -48
- package/dist/dropdown/README.md +330 -48
- package/dist/empty-state/README.md +330 -48
- package/dist/feedback/README.md +330 -48
- package/dist/file-upload/README.md +330 -48
- package/dist/footer/README.md +330 -48
- package/dist/form-field-group/README.md +330 -48
- package/dist/icon-button/README.md +330 -48
- package/dist/image/README.md +330 -48
- package/dist/input/README.md +330 -48
- package/dist/journey-timeline/README.md +330 -48
- package/dist/link/README.md +330 -48
- package/dist/list/README.md +330 -48
- package/dist/mega-menu/README.md +330 -48
- package/dist/modal/README.md +330 -48
- package/dist/native/accordion/README.md +1541 -0
- package/dist/native/accordion/fesm2022/ux4g-components-angular-native-accordion.mjs +85 -0
- package/dist/native/accordion/fesm2022/ux4g-components-angular-native-accordion.mjs.map +1 -0
- package/dist/native/accordion/index.d.ts +6 -0
- package/dist/native/accordion/public-api.d.ts +3 -0
- package/dist/native/accordion/public-api.d.ts.map +1 -0
- package/dist/native/accordion/ux4g-components-angular-native-accordion.d.ts.map +1 -0
- package/dist/native/accordion/ux4g-native-accordion.component.d.ts +31 -0
- package/dist/native/accordion/ux4g-native-accordion.component.d.ts.map +1 -0
- package/dist/native/accordion/ux4g-native-accordion.module.d.ts +12 -0
- package/dist/native/accordion/ux4g-native-accordion.module.d.ts.map +1 -0
- package/dist/native/avatar/README.md +1541 -0
- package/dist/native/avatar/fesm2022/ux4g-components-angular-native-avatar.mjs +81 -0
- package/dist/native/avatar/fesm2022/ux4g-components-angular-native-avatar.mjs.map +1 -0
- package/dist/native/avatar/index.d.ts +6 -0
- package/dist/native/avatar/public-api.d.ts +3 -0
- package/dist/native/avatar/public-api.d.ts.map +1 -0
- package/dist/native/avatar/ux4g-components-angular-native-avatar.d.ts.map +1 -0
- package/dist/native/avatar/ux4g-native-avatar.component.d.ts +34 -0
- package/dist/native/avatar/ux4g-native-avatar.component.d.ts.map +1 -0
- package/dist/native/avatar/ux4g-native-avatar.module.d.ts +8 -0
- package/dist/native/avatar/ux4g-native-avatar.module.d.ts.map +1 -0
- package/dist/native/carousel/README.md +1541 -0
- package/dist/native/carousel/fesm2022/ux4g-components-angular-native-carousel.mjs +91 -0
- package/dist/native/carousel/fesm2022/ux4g-components-angular-native-carousel.mjs.map +1 -0
- package/dist/native/carousel/index.d.ts +6 -0
- package/dist/native/carousel/public-api.d.ts +3 -0
- package/dist/native/carousel/public-api.d.ts.map +1 -0
- package/dist/native/carousel/ux4g-components-angular-native-carousel.d.ts.map +1 -0
- package/dist/native/carousel/ux4g-native-carousel.component.d.ts +34 -0
- package/dist/native/carousel/ux4g-native-carousel.component.d.ts.map +1 -0
- package/dist/native/carousel/ux4g-native-carousel.module.d.ts +8 -0
- package/dist/native/carousel/ux4g-native-carousel.module.d.ts.map +1 -0
- package/dist/native/chip/README.md +1541 -0
- package/dist/native/chip/fesm2022/ux4g-components-angular-native-chip.mjs +99 -0
- package/dist/native/chip/fesm2022/ux4g-components-angular-native-chip.mjs.map +1 -0
- package/dist/native/chip/index.d.ts +6 -0
- package/dist/native/chip/public-api.d.ts +3 -0
- package/dist/native/chip/public-api.d.ts.map +1 -0
- package/dist/native/chip/ux4g-components-angular-native-chip.d.ts.map +1 -0
- package/dist/native/chip/ux4g-native-chip.component.d.ts +34 -0
- package/dist/native/chip/ux4g-native-chip.component.d.ts.map +1 -0
- package/dist/native/chip/ux4g-native-chip.module.d.ts +8 -0
- package/dist/native/chip/ux4g-native-chip.module.d.ts.map +1 -0
- package/dist/native/combobox/README.md +1541 -0
- package/dist/native/combobox/fesm2022/ux4g-components-angular-native-combobox.mjs +107 -0
- package/dist/native/combobox/fesm2022/ux4g-components-angular-native-combobox.mjs.map +1 -0
- package/dist/native/combobox/index.d.ts +6 -0
- package/dist/native/combobox/public-api.d.ts +3 -0
- package/dist/native/combobox/public-api.d.ts.map +1 -0
- package/dist/native/combobox/ux4g-components-angular-native-combobox.d.ts.map +1 -0
- package/dist/native/combobox/ux4g-native-combobox.component.d.ts +30 -0
- package/dist/native/combobox/ux4g-native-combobox.component.d.ts.map +1 -0
- package/dist/native/combobox/ux4g-native-combobox.module.d.ts +8 -0
- package/dist/native/combobox/ux4g-native-combobox.module.d.ts.map +1 -0
- package/dist/native/date-picker/README.md +1541 -0
- package/dist/native/date-picker/fesm2022/ux4g-components-angular-native-date-picker.mjs +181 -0
- package/dist/native/date-picker/fesm2022/ux4g-components-angular-native-date-picker.mjs.map +1 -0
- package/dist/native/date-picker/index.d.ts +6 -0
- package/dist/native/date-picker/public-api.d.ts +3 -0
- package/dist/native/date-picker/public-api.d.ts.map +1 -0
- package/dist/native/date-picker/ux4g-components-angular-native-date-picker.d.ts.map +1 -0
- package/dist/native/date-picker/ux4g-native-date-picker.component.d.ts +39 -0
- package/dist/native/date-picker/ux4g-native-date-picker.component.d.ts.map +1 -0
- package/dist/native/date-picker/ux4g-native-date-picker.module.d.ts +12 -0
- package/dist/native/date-picker/ux4g-native-date-picker.module.d.ts.map +1 -0
- package/dist/native/drawer/README.md +1541 -0
- package/dist/native/drawer/fesm2022/ux4g-components-angular-native-drawer.mjs +159 -0
- package/dist/native/drawer/fesm2022/ux4g-components-angular-native-drawer.mjs.map +1 -0
- package/dist/native/drawer/index.d.ts +6 -0
- package/dist/native/drawer/public-api.d.ts +3 -0
- package/dist/native/drawer/public-api.d.ts.map +1 -0
- package/dist/native/drawer/ux4g-components-angular-native-drawer.d.ts.map +1 -0
- package/dist/native/drawer/ux4g-native-drawer.component.d.ts +37 -0
- package/dist/native/drawer/ux4g-native-drawer.component.d.ts.map +1 -0
- package/dist/native/drawer/ux4g-native-drawer.module.d.ts +12 -0
- package/dist/native/drawer/ux4g-native-drawer.module.d.ts.map +1 -0
- package/dist/native/dropdown/README.md +1541 -0
- package/dist/native/dropdown/fesm2022/ux4g-components-angular-native-dropdown.mjs +108 -0
- package/dist/native/dropdown/fesm2022/ux4g-components-angular-native-dropdown.mjs.map +1 -0
- package/dist/native/dropdown/index.d.ts +6 -0
- package/dist/native/dropdown/public-api.d.ts +3 -0
- package/dist/native/dropdown/public-api.d.ts.map +1 -0
- package/dist/native/dropdown/ux4g-components-angular-native-dropdown.d.ts.map +1 -0
- package/dist/native/dropdown/ux4g-native-dropdown.component.d.ts +32 -0
- package/dist/native/dropdown/ux4g-native-dropdown.component.d.ts.map +1 -0
- package/dist/native/dropdown/ux4g-native-dropdown.module.d.ts +8 -0
- package/dist/native/dropdown/ux4g-native-dropdown.module.d.ts.map +1 -0
- package/dist/native/file-upload/README.md +1541 -0
- package/dist/native/file-upload/fesm2022/ux4g-components-angular-native-file-upload.mjs +193 -0
- package/dist/native/file-upload/fesm2022/ux4g-components-angular-native-file-upload.mjs.map +1 -0
- package/dist/native/file-upload/index.d.ts +6 -0
- package/dist/native/file-upload/public-api.d.ts +3 -0
- package/dist/native/file-upload/public-api.d.ts.map +1 -0
- package/dist/native/file-upload/ux4g-components-angular-native-file-upload.d.ts.map +1 -0
- package/dist/native/file-upload/ux4g-native-file-upload.component.d.ts +40 -0
- package/dist/native/file-upload/ux4g-native-file-upload.component.d.ts.map +1 -0
- package/dist/native/file-upload/ux4g-native-file-upload.module.d.ts +8 -0
- package/dist/native/file-upload/ux4g-native-file-upload.module.d.ts.map +1 -0
- package/dist/native/modal/README.md +1541 -0
- package/dist/native/modal/fesm2022/ux4g-components-angular-native-modal.mjs +219 -0
- package/dist/native/modal/fesm2022/ux4g-components-angular-native-modal.mjs.map +1 -0
- package/dist/native/modal/index.d.ts +6 -0
- package/dist/native/modal/public-api.d.ts +3 -0
- package/dist/native/modal/public-api.d.ts.map +1 -0
- package/dist/native/modal/ux4g-components-angular-native-modal.d.ts.map +1 -0
- package/dist/native/modal/ux4g-native-modal.component.d.ts +42 -0
- package/dist/native/modal/ux4g-native-modal.component.d.ts.map +1 -0
- package/dist/native/modal/ux4g-native-modal.module.d.ts +12 -0
- package/dist/native/modal/ux4g-native-modal.module.d.ts.map +1 -0
- package/dist/native/otp/README.md +1541 -0
- package/dist/native/otp/fesm2022/ux4g-components-angular-native-otp.mjs +176 -0
- package/dist/native/otp/fesm2022/ux4g-components-angular-native-otp.mjs.map +1 -0
- package/dist/native/otp/index.d.ts +6 -0
- package/dist/native/otp/public-api.d.ts +3 -0
- package/dist/native/otp/public-api.d.ts.map +1 -0
- package/dist/native/otp/ux4g-components-angular-native-otp.d.ts.map +1 -0
- package/dist/native/otp/ux4g-native-otp.component.d.ts +32 -0
- package/dist/native/otp/ux4g-native-otp.component.d.ts.map +1 -0
- package/dist/native/otp/ux4g-native-otp.module.d.ts +8 -0
- package/dist/native/otp/ux4g-native-otp.module.d.ts.map +1 -0
- package/dist/native/popover/README.md +1541 -0
- package/dist/native/popover/fesm2022/ux4g-components-angular-native-popover.mjs +75 -0
- package/dist/native/popover/fesm2022/ux4g-components-angular-native-popover.mjs.map +1 -0
- package/dist/native/popover/index.d.ts +6 -0
- package/dist/native/popover/public-api.d.ts +3 -0
- package/dist/native/popover/public-api.d.ts.map +1 -0
- package/dist/native/popover/ux4g-components-angular-native-popover.d.ts.map +1 -0
- package/dist/native/popover/ux4g-native-popover.component.d.ts +29 -0
- package/dist/native/popover/ux4g-native-popover.component.d.ts.map +1 -0
- package/dist/native/popover/ux4g-native-popover.module.d.ts +8 -0
- package/dist/native/popover/ux4g-native-popover.module.d.ts.map +1 -0
- package/dist/native/progress/README.md +1541 -0
- package/dist/native/progress/fesm2022/ux4g-components-angular-native-progress.mjs +79 -0
- package/dist/native/progress/fesm2022/ux4g-components-angular-native-progress.mjs.map +1 -0
- package/dist/native/progress/index.d.ts +6 -0
- package/dist/native/progress/public-api.d.ts +3 -0
- package/dist/native/progress/public-api.d.ts.map +1 -0
- package/dist/native/progress/ux4g-components-angular-native-progress.d.ts.map +1 -0
- package/dist/native/progress/ux4g-native-progress.component.d.ts +29 -0
- package/dist/native/progress/ux4g-native-progress.component.d.ts.map +1 -0
- package/dist/native/progress/ux4g-native-progress.module.d.ts +8 -0
- package/dist/native/progress/ux4g-native-progress.module.d.ts.map +1 -0
- package/dist/native/search/README.md +1541 -0
- package/dist/native/search/fesm2022/ux4g-components-angular-native-search.mjs +148 -0
- package/dist/native/search/fesm2022/ux4g-components-angular-native-search.mjs.map +1 -0
- package/dist/native/search/index.d.ts +6 -0
- package/dist/native/search/public-api.d.ts +3 -0
- package/dist/native/search/public-api.d.ts.map +1 -0
- package/dist/native/search/ux4g-components-angular-native-search.d.ts.map +1 -0
- package/dist/native/search/ux4g-native-search.component.d.ts +46 -0
- package/dist/native/search/ux4g-native-search.component.d.ts.map +1 -0
- package/dist/native/search/ux4g-native-search.module.d.ts +8 -0
- package/dist/native/search/ux4g-native-search.module.d.ts.map +1 -0
- package/dist/native/shared/README.md +1541 -0
- package/dist/native/shared/base-native.component.d.ts +38 -0
- package/dist/native/shared/base-native.component.d.ts.map +1 -0
- package/dist/native/shared/fesm2022/ux4g-components-angular-native-shared.mjs +113 -0
- package/dist/native/shared/fesm2022/ux4g-components-angular-native-shared.mjs.map +1 -0
- package/dist/native/shared/index.d.ts +6 -0
- package/dist/native/shared/public-api.d.ts +3 -0
- package/dist/native/shared/public-api.d.ts.map +1 -0
- package/dist/native/shared/render-descriptor.d.ts +8 -0
- package/dist/native/shared/render-descriptor.d.ts.map +1 -0
- package/dist/native/shared/ux4g-components-angular-native-shared.d.ts.map +1 -0
- package/dist/native/stepper/README.md +1541 -0
- package/dist/native/stepper/fesm2022/ux4g-components-angular-native-stepper.mjs +92 -0
- package/dist/native/stepper/fesm2022/ux4g-components-angular-native-stepper.mjs.map +1 -0
- package/dist/native/stepper/index.d.ts +6 -0
- package/dist/native/stepper/public-api.d.ts +3 -0
- package/dist/native/stepper/public-api.d.ts.map +1 -0
- package/dist/native/stepper/ux4g-components-angular-native-stepper.d.ts.map +1 -0
- package/dist/native/stepper/ux4g-native-stepper.component.d.ts +35 -0
- package/dist/native/stepper/ux4g-native-stepper.component.d.ts.map +1 -0
- package/dist/native/stepper/ux4g-native-stepper.module.d.ts +8 -0
- package/dist/native/stepper/ux4g-native-stepper.module.d.ts.map +1 -0
- package/dist/native/table/README.md +1541 -0
- package/dist/native/table/fesm2022/ux4g-components-angular-native-table.mjs +91 -0
- package/dist/native/table/fesm2022/ux4g-components-angular-native-table.mjs.map +1 -0
- package/dist/native/table/index.d.ts +6 -0
- package/dist/native/table/public-api.d.ts +3 -0
- package/dist/native/table/public-api.d.ts.map +1 -0
- package/dist/native/table/ux4g-components-angular-native-table.d.ts.map +1 -0
- package/dist/native/table/ux4g-native-table.component.d.ts +32 -0
- package/dist/native/table/ux4g-native-table.component.d.ts.map +1 -0
- package/dist/native/table/ux4g-native-table.module.d.ts +12 -0
- package/dist/native/table/ux4g-native-table.module.d.ts.map +1 -0
- package/dist/native/tabs/README.md +1541 -0
- package/dist/native/tabs/fesm2022/ux4g-components-angular-native-tabs.mjs +190 -0
- package/dist/native/tabs/fesm2022/ux4g-components-angular-native-tabs.mjs.map +1 -0
- package/dist/native/tabs/index.d.ts +6 -0
- package/dist/native/tabs/public-api.d.ts +3 -0
- package/dist/native/tabs/public-api.d.ts.map +1 -0
- package/dist/native/tabs/ux4g-components-angular-native-tabs.d.ts.map +1 -0
- package/dist/native/tabs/ux4g-native-tabs.component.d.ts +43 -0
- package/dist/native/tabs/ux4g-native-tabs.component.d.ts.map +1 -0
- package/dist/native/tabs/ux4g-native-tabs.module.d.ts +12 -0
- package/dist/native/tabs/ux4g-native-tabs.module.d.ts.map +1 -0
- package/dist/native/time-picker/README.md +1541 -0
- package/dist/native/time-picker/fesm2022/ux4g-components-angular-native-time-picker.mjs +104 -0
- package/dist/native/time-picker/fesm2022/ux4g-components-angular-native-time-picker.mjs.map +1 -0
- package/dist/native/time-picker/index.d.ts +6 -0
- package/dist/native/time-picker/public-api.d.ts +3 -0
- package/dist/native/time-picker/public-api.d.ts.map +1 -0
- package/dist/native/time-picker/ux4g-components-angular-native-time-picker.d.ts.map +1 -0
- package/dist/native/time-picker/ux4g-native-time-picker.component.d.ts +27 -0
- package/dist/native/time-picker/ux4g-native-time-picker.component.d.ts.map +1 -0
- package/dist/native/time-picker/ux4g-native-time-picker.module.d.ts +8 -0
- package/dist/native/time-picker/ux4g-native-time-picker.module.d.ts.map +1 -0
- package/dist/native/tooltip/README.md +1541 -0
- package/dist/native/tooltip/fesm2022/ux4g-components-angular-native-tooltip.mjs +80 -0
- package/dist/native/tooltip/fesm2022/ux4g-components-angular-native-tooltip.mjs.map +1 -0
- package/dist/native/tooltip/index.d.ts +6 -0
- package/dist/native/tooltip/public-api.d.ts +3 -0
- package/dist/native/tooltip/public-api.d.ts.map +1 -0
- package/dist/native/tooltip/ux4g-components-angular-native-tooltip.d.ts.map +1 -0
- package/dist/native/tooltip/ux4g-native-tooltip.component.d.ts +31 -0
- package/dist/native/tooltip/ux4g-native-tooltip.component.d.ts.map +1 -0
- package/dist/native/tooltip/ux4g-native-tooltip.module.d.ts +8 -0
- package/dist/native/tooltip/ux4g-native-tooltip.module.d.ts.map +1 -0
- package/dist/navbar/README.md +330 -48
- package/dist/otp-input/README.md +330 -48
- package/dist/pagination/README.md +330 -48
- package/dist/popover/README.md +330 -48
- package/dist/progress-indicator/README.md +330 -48
- package/dist/radio/README.md +330 -48
- package/dist/result-list-row/README.md +330 -48
- package/dist/search/README.md +330 -48
- package/dist/sla-progress-indicator/README.md +330 -48
- package/dist/slider/README.md +330 -48
- package/dist/slot-grid/README.md +330 -48
- package/dist/social-links/README.md +330 -48
- package/dist/spinner/README.md +330 -48
- package/dist/status-pipeline/README.md +330 -48
- package/dist/stepper/README.md +330 -48
- package/dist/switch/README.md +330 -48
- package/dist/tab/README.md +330 -48
- package/dist/table/README.md +330 -48
- package/dist/tag/README.md +330 -48
- package/dist/tooltip/README.md +330 -48
- package/package.json +176 -3
|
@@ -0,0 +1,1541 @@
|
|
|
1
|
+
# ux4g-components-angular
|
|
2
|
+
|
|
3
|
+
Angular wrapper components for the **UX4G Design System**.
|
|
4
|
+
|
|
5
|
+
Thin, typed Angular components that map inputs to UX4G CSS classes. Each component is tree-shakeable via sub-path imports and NgModule.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install ux4g-components-angular ux4g-components-web
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
> **Note:** `ux4g-components-web` is required — it provides the CSS bundle that styles all components.
|
|
14
|
+
|
|
15
|
+
## Setup
|
|
16
|
+
|
|
17
|
+
Add the CSS bundle to your `angular.json` styles array:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"projects": {
|
|
22
|
+
"your-app": {
|
|
23
|
+
"architect": {
|
|
24
|
+
"build": {
|
|
25
|
+
"options": {
|
|
26
|
+
"styles": [
|
|
27
|
+
"node_modules/ux4g-components-web/styles/ux4g.css",
|
|
28
|
+
"src/styles.css"
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
That's it. Runtime behaviors (dropdowns, modals, tooltips, etc.) are auto-initialized when you import any component module — no manual setup needed.
|
|
39
|
+
|
|
40
|
+
## Peer Dependencies
|
|
41
|
+
|
|
42
|
+
- `@angular/core >= 15.0.0`
|
|
43
|
+
- `@angular/common >= 15.0.0`
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Components
|
|
48
|
+
|
|
49
|
+
### Button
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
// app.module.ts
|
|
53
|
+
import { UX4GButtonModule } from 'ux4g-components-angular/button';
|
|
54
|
+
|
|
55
|
+
@NgModule({
|
|
56
|
+
imports: [UX4GButtonModule],
|
|
57
|
+
})
|
|
58
|
+
export class AppModule {}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```html
|
|
62
|
+
<!-- app.component.html -->
|
|
63
|
+
<ux4g-button variant="primary" size="md" (clicked)="onSave()">
|
|
64
|
+
Save
|
|
65
|
+
</ux4g-button>
|
|
66
|
+
|
|
67
|
+
<ux4g-button variant="outline-danger" size="lg">
|
|
68
|
+
Delete
|
|
69
|
+
</ux4g-button>
|
|
70
|
+
|
|
71
|
+
<ux4g-button variant="tonal-primary" size="sm" shape="pill">
|
|
72
|
+
Tag
|
|
73
|
+
</ux4g-button>
|
|
74
|
+
|
|
75
|
+
<ux4g-button variant="primary" size="md" [loading]="true">
|
|
76
|
+
Saving...
|
|
77
|
+
</ux4g-button>
|
|
78
|
+
|
|
79
|
+
<ux4g-button variant="primary" size="md" [disabled]="true">
|
|
80
|
+
Disabled
|
|
81
|
+
</ux4g-button>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
| Input | Type | Default | Description |
|
|
85
|
+
|---|---|---|---|
|
|
86
|
+
| `variant` | `'primary' \| 'outline-primary' \| 'text-primary' \| 'tonal-primary' \| 'danger' \| 'outline-danger' \| 'text-danger' \| 'tonal-danger'` | `'primary'` | Visual style |
|
|
87
|
+
| `size` | `'xl' \| 'lg' \| 'md' \| 'sm' \| 'xs'` | `'md'` | Button size |
|
|
88
|
+
| `shape` | `'rectangle' \| 'pill'` | `'rectangle'` | Border shape |
|
|
89
|
+
| `disabled` | `boolean` | `false` | Disabled state |
|
|
90
|
+
| `loading` | `boolean` | `false` | Loading state (shows spinner) |
|
|
91
|
+
|
|
92
|
+
| Output | Type | Description |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| `clicked` | `EventEmitter<MouseEvent>` | Emitted on click (suppressed when disabled) |
|
|
95
|
+
|
|
96
|
+
### Spinner
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
import { UX4GSpinnerModule } from 'ux4g-components-angular/spinner';
|
|
100
|
+
|
|
101
|
+
@NgModule({ imports: [UX4GSpinnerModule] })
|
|
102
|
+
export class AppModule {}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```html
|
|
106
|
+
<ux4g-spinner variant="primary" size="md" type="full"></ux4g-spinner>
|
|
107
|
+
<ux4g-spinner variant="danger" size="lg" type="split"></ux4g-spinner>
|
|
108
|
+
<ux4g-spinner variant="inverse" size="xs" type="partial" label="Processing"></ux4g-spinner>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
| Input | Type | Default | Description |
|
|
112
|
+
|---|---|---|---|
|
|
113
|
+
| `variant` | `'primary' \| 'inverse' \| 'danger'` | `'primary'` | Color variant |
|
|
114
|
+
| `size` | `'xl' \| 'lg' \| 'md' \| 'sm' \| 'xs'` | `'md'` | Spinner size |
|
|
115
|
+
| `type` | `'full' \| 'split' \| 'partial'` | `'full'` | Spinner style |
|
|
116
|
+
| `label` | `string` | `'Loading'` | Accessible label |
|
|
117
|
+
|
|
118
|
+
### Link
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
import { UX4GLinkModule } from 'ux4g-components-angular/link';
|
|
122
|
+
|
|
123
|
+
@NgModule({ imports: [UX4GLinkModule] })
|
|
124
|
+
export class AppModule {}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<ux4g-link href="/docs" variant="default" size="md">Documentation</ux4g-link>
|
|
129
|
+
<ux4g-link href="/terms" variant="neutral" size="sm">Terms of Service</ux4g-link>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
| Input | Type | Default | Description |
|
|
133
|
+
|---|---|---|---|
|
|
134
|
+
| `variant` | `'default' \| 'neutral'` | `'default'` | Link color style |
|
|
135
|
+
| `size` | `'sm' \| 'md'` | `'md'` | Link size |
|
|
136
|
+
| `href` | `string` | — | Link URL |
|
|
137
|
+
|
|
138
|
+
### Badge
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
import { UX4GBadgeModule } from 'ux4g-components-angular/badge';
|
|
142
|
+
|
|
143
|
+
@NgModule({ imports: [UX4GBadgeModule] })
|
|
144
|
+
export class AppModule {}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
```html
|
|
148
|
+
<ux4g-badge type="dot" color="primary"></ux4g-badge>
|
|
149
|
+
<ux4g-badge type="digit" color="danger" size="m">5</ux4g-badge>
|
|
150
|
+
<ux4g-badge type="icon" color="success" size="l">✓</ux4g-badge>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
| Input | Type | Default | Description |
|
|
154
|
+
|---|---|---|---|
|
|
155
|
+
| `type` | `'dot' \| 'icon' \| 'digit'` | `'dot'` | Badge type |
|
|
156
|
+
| `color` | `'primary' \| 'success' \| 'warning' \| 'danger' \| 'info' \| 'secondary' \| 'tertiary' \| 'neutral'` | `'primary'` | Badge color |
|
|
157
|
+
| `size` | `'s' \| 'm' \| 'l' \| 'profile-l' \| 'profile-xl' \| 'profile-2xl' \| 'profile-3xl'` | — | Badge size |
|
|
158
|
+
|
|
159
|
+
### Avatar
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
import { UX4GAvatarModule } from 'ux4g-components-angular/avatar';
|
|
163
|
+
|
|
164
|
+
@NgModule({ imports: [UX4GAvatarModule] })
|
|
165
|
+
export class AppModule {}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
```html
|
|
169
|
+
<ux4g-avatar avatarType="status" size="m">
|
|
170
|
+
<img src="user.jpg" alt="User" />
|
|
171
|
+
</ux4g-avatar>
|
|
172
|
+
|
|
173
|
+
<ux4g-avatar avatarType="profile" size="xl">
|
|
174
|
+
<img src="profile.jpg" alt="Profile" />
|
|
175
|
+
</ux4g-avatar>
|
|
176
|
+
|
|
177
|
+
<ux4g-avatar avatarType="group">
|
|
178
|
+
<img src="u1.jpg" alt="" />
|
|
179
|
+
<img src="u2.jpg" alt="" />
|
|
180
|
+
</ux4g-avatar>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
| Input | Type | Default | Description |
|
|
184
|
+
|---|---|---|---|
|
|
185
|
+
| `avatarType` | `'status' \| 'profile' \| 'group'` | `'status'` | Avatar type |
|
|
186
|
+
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl' \| '2xl' \| '3xl'` | — | Avatar size |
|
|
187
|
+
|
|
188
|
+
### Image
|
|
189
|
+
|
|
190
|
+
```ts
|
|
191
|
+
import { UX4GImageModule } from 'ux4g-components-angular/image';
|
|
192
|
+
|
|
193
|
+
@NgModule({ imports: [UX4GImageModule] })
|
|
194
|
+
export class AppModule {}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
```html
|
|
198
|
+
<ux4g-image src="photo.jpg" alt="Photo" ratio="16-9"></ux4g-image>
|
|
199
|
+
<ux4g-image src="photo.jpg" alt="Photo" ratio="4-3" [rounded]="true"></ux4g-image>
|
|
200
|
+
<ux4g-image src="photo.jpg" alt="Photo" ratio="16-9" [overlay]="true" overlayPosition="bottom">
|
|
201
|
+
<ng-template #overlayContent>
|
|
202
|
+
<p class="ux4g-body-m-default">Caption text</p>
|
|
203
|
+
</ng-template>
|
|
204
|
+
</ux4g-image>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
| Input | Type | Default | Description |
|
|
208
|
+
|---|---|---|---|
|
|
209
|
+
| `ratio` | `'1-1' \| '4-3' \| '3-2' \| '16-10' \| '16-9' \| '2-1' \| '5-2' \| '3-1' \| '1-16' \| '2-3' \| '3-4'` | — | Aspect ratio |
|
|
210
|
+
| `rounded` | `boolean` | `false` | Rounded corners |
|
|
211
|
+
| `overlay` | `boolean` | `false` | Enable overlay container |
|
|
212
|
+
| `overlayPosition` | `'top' \| 'bottom' \| 'center' \| 'full'` | `'bottom'` | Overlay position |
|
|
213
|
+
|
|
214
|
+
### Chip
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
import { UX4GChipModule } from 'ux4g-components-angular/chip';
|
|
218
|
+
|
|
219
|
+
@NgModule({ imports: [UX4GChipModule] })
|
|
220
|
+
export class AppModule {}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
```html
|
|
224
|
+
<ux4g-chip chipType="filter" size="md">Category</ux4g-chip>
|
|
225
|
+
<ux4g-chip chipType="choice" size="sm" [active]="true">Selected</ux4g-chip>
|
|
226
|
+
<ux4g-chip chipType="input" size="xs">Tag</ux4g-chip>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
| Input | Type | Default | Description |
|
|
230
|
+
|---|---|---|---|
|
|
231
|
+
| `chipType` | `'filter' \| 'choice' \| 'input'` | `'filter'` | Chip type |
|
|
232
|
+
| `size` | `'md' \| 'sm' \| 'xs'` | `'md'` | Chip size (xs only for input) |
|
|
233
|
+
| `active` | `boolean` | `false` | Active/selected state |
|
|
234
|
+
|
|
235
|
+
### Tag
|
|
236
|
+
|
|
237
|
+
```ts
|
|
238
|
+
import { UX4GTagModule } from 'ux4g-components-angular/tag';
|
|
239
|
+
|
|
240
|
+
@NgModule({ imports: [UX4GTagModule] })
|
|
241
|
+
export class AppModule {}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
```html
|
|
245
|
+
<ux4g-tag variant="tonal" color="neutral">Default</ux4g-tag>
|
|
246
|
+
<ux4g-tag variant="filled" color="success" [small]="true">Active</ux4g-tag>
|
|
247
|
+
<ux4g-tag variant="outline" color="error">Error</ux4g-tag>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
| Input | Type | Default | Description |
|
|
251
|
+
|---|---|---|---|
|
|
252
|
+
| `variant` | `'tonal' \| 'filled' \| 'outline' \| 'text'` | `'tonal'` | Tag style |
|
|
253
|
+
| `color` | `'neutral' \| 'brand' \| 'success' \| 'warning' \| 'error' \| 'info'` | `'neutral'` | Tag color |
|
|
254
|
+
| `small` | `boolean` | `false` | Small size |
|
|
255
|
+
|
|
256
|
+
### Divider
|
|
257
|
+
|
|
258
|
+
```ts
|
|
259
|
+
import { UX4GDividerModule } from 'ux4g-components-angular/divider';
|
|
260
|
+
|
|
261
|
+
@NgModule({ imports: [UX4GDividerModule] })
|
|
262
|
+
export class AppModule {}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
```html
|
|
266
|
+
<ux4g-divider orientation="horizontal"></ux4g-divider>
|
|
267
|
+
<ux4g-divider orientation="vertical"></ux4g-divider>
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
| Input | Type | Default | Description |
|
|
271
|
+
|---|---|---|---|
|
|
272
|
+
| `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Divider direction |
|
|
273
|
+
|
|
274
|
+
### Breadcrumb
|
|
275
|
+
|
|
276
|
+
```ts
|
|
277
|
+
import { UX4GBreadcrumbModule } from 'ux4g-components-angular/breadcrumb';
|
|
278
|
+
|
|
279
|
+
@NgModule({ imports: [UX4GBreadcrumbModule] })
|
|
280
|
+
export class AppModule {}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
```html
|
|
284
|
+
<ux4g-breadcrumb separator="divider">
|
|
285
|
+
<a href="#">Home</a>
|
|
286
|
+
<a href="#">Products</a>
|
|
287
|
+
<span>Current</span>
|
|
288
|
+
</ux4g-breadcrumb>
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
| Input | Type | Default | Description |
|
|
292
|
+
|---|---|---|---|
|
|
293
|
+
| `separator` | `'divider' \| 'icon'` | `'divider'` | Separator style |
|
|
294
|
+
|
|
295
|
+
### Checkbox
|
|
296
|
+
|
|
297
|
+
```ts
|
|
298
|
+
import { UX4GCheckboxModule } from 'ux4g-components-angular/checkbox';
|
|
299
|
+
|
|
300
|
+
@NgModule({ imports: [UX4GCheckboxModule] })
|
|
301
|
+
export class AppModule {}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
```html
|
|
305
|
+
<label>
|
|
306
|
+
<ux4g-checkbox size="md" [checked]="isChecked" (changed)="onCheck($event)"></ux4g-checkbox>
|
|
307
|
+
Accept terms
|
|
308
|
+
</label>
|
|
309
|
+
|
|
310
|
+
<label>
|
|
311
|
+
<ux4g-checkbox size="sm" [error]="true"></ux4g-checkbox>
|
|
312
|
+
Required field
|
|
313
|
+
</label>
|
|
314
|
+
|
|
315
|
+
<label>
|
|
316
|
+
<ux4g-checkbox size="md" [indeterminate]="true"></ux4g-checkbox>
|
|
317
|
+
Select all
|
|
318
|
+
</label>
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
| Input | Type | Default | Description |
|
|
322
|
+
|---|---|---|---|
|
|
323
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Checkbox size |
|
|
324
|
+
| `checked` | `boolean` | `false` | Checked state |
|
|
325
|
+
| `indeterminate` | `boolean` | `false` | Indeterminate state |
|
|
326
|
+
| `disabled` | `boolean` | `false` | Disabled state |
|
|
327
|
+
| `error` | `boolean` | `false` | Error state |
|
|
328
|
+
|
|
329
|
+
| Output | Type | Description |
|
|
330
|
+
|---|---|---|
|
|
331
|
+
| `changed` | `EventEmitter<Event>` | Emitted on change |
|
|
332
|
+
|
|
333
|
+
> **Note:** This is a control-only wrapper. Wrap with `<label>` to associate visible text.
|
|
334
|
+
|
|
335
|
+
### Radio
|
|
336
|
+
|
|
337
|
+
```ts
|
|
338
|
+
import { UX4GRadioModule } from 'ux4g-components-angular/radio';
|
|
339
|
+
|
|
340
|
+
@NgModule({ imports: [UX4GRadioModule] })
|
|
341
|
+
export class AppModule {}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
```html
|
|
345
|
+
<label>
|
|
346
|
+
<ux4g-radio size="md" name="option" value="a" [checked]="selected === 'a'" (changed)="onSelect($event)"></ux4g-radio>
|
|
347
|
+
Option A
|
|
348
|
+
</label>
|
|
349
|
+
<label>
|
|
350
|
+
<ux4g-radio size="lg" name="option" value="b" [error]="true"></ux4g-radio>
|
|
351
|
+
Option B
|
|
352
|
+
</label>
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
| Input | Type | Default | Description |
|
|
356
|
+
|---|---|---|---|
|
|
357
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Radio size |
|
|
358
|
+
| `checked` | `boolean` | `false` | Checked state |
|
|
359
|
+
| `disabled` | `boolean` | `false` | Disabled state |
|
|
360
|
+
| `error` | `boolean` | `false` | Error state |
|
|
361
|
+
| `name` | `string` | `''` | Radio group name |
|
|
362
|
+
| `value` | `string` | `''` | Radio value |
|
|
363
|
+
|
|
364
|
+
| Output | Type | Description |
|
|
365
|
+
|---|---|---|
|
|
366
|
+
| `changed` | `EventEmitter<Event>` | Emitted on change |
|
|
367
|
+
|
|
368
|
+
> **Note:** This is a control-only wrapper. Wrap with `<label>` to associate visible text.
|
|
369
|
+
|
|
370
|
+
### Switch
|
|
371
|
+
|
|
372
|
+
```ts
|
|
373
|
+
import { UX4GSwitchModule } from 'ux4g-components-angular/switch';
|
|
374
|
+
|
|
375
|
+
@NgModule({ imports: [UX4GSwitchModule] })
|
|
376
|
+
export class AppModule {}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
```html
|
|
380
|
+
<label>
|
|
381
|
+
<ux4g-switch size="md" [checked]="isOn" (changed)="onToggle($event)"></ux4g-switch>
|
|
382
|
+
Enable notifications
|
|
383
|
+
</label>
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
| Input | Type | Default | Description |
|
|
387
|
+
|---|---|---|---|
|
|
388
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Switch size |
|
|
389
|
+
| `checked` | `boolean` | `false` | Checked state |
|
|
390
|
+
| `disabled` | `boolean` | `false` | Disabled state |
|
|
391
|
+
|
|
392
|
+
| Output | Type | Description |
|
|
393
|
+
|---|---|---|
|
|
394
|
+
| `changed` | `EventEmitter<Event>` | Emitted on change |
|
|
395
|
+
|
|
396
|
+
> **Note:** This is a control-only wrapper. Wrap with `<label>` to associate visible text.
|
|
397
|
+
|
|
398
|
+
### Card
|
|
399
|
+
|
|
400
|
+
```ts
|
|
401
|
+
import { UX4GCardModule } from 'ux4g-components-angular/card';
|
|
402
|
+
|
|
403
|
+
@NgModule({ imports: [UX4GCardModule] })
|
|
404
|
+
export class AppModule {}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
```html
|
|
408
|
+
<ux4g-card variant="solid" layout="vertical">
|
|
409
|
+
<h3>Card Title</h3>
|
|
410
|
+
<p>Card content goes here.</p>
|
|
411
|
+
</ux4g-card>
|
|
412
|
+
|
|
413
|
+
<ux4g-card variant="outline" layout="horizontal">
|
|
414
|
+
<img src="thumb.jpg" alt="" />
|
|
415
|
+
<p>Horizontal card</p>
|
|
416
|
+
</ux4g-card>
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
| Input | Type | Default | Description |
|
|
420
|
+
|---|---|---|---|
|
|
421
|
+
| `variant` | `'solid' \| 'outline' \| 'no-fill'` | `'solid'` | Card style |
|
|
422
|
+
| `layout` | `'vertical' \| 'horizontal'` | `'vertical'` | Card layout |
|
|
423
|
+
|
|
424
|
+
### Input
|
|
425
|
+
|
|
426
|
+
```ts
|
|
427
|
+
import { UX4GInputModule } from 'ux4g-components-angular/input';
|
|
428
|
+
|
|
429
|
+
@NgModule({ imports: [UX4GInputModule] })
|
|
430
|
+
export class AppModule {}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
```html
|
|
434
|
+
<ux4g-input size="md" state="default">
|
|
435
|
+
<label class="ux4g-input-label">Email</label>
|
|
436
|
+
<input class="ux4g-input" type="email" placeholder="Enter email" />
|
|
437
|
+
</ux4g-input>
|
|
438
|
+
|
|
439
|
+
<ux4g-input size="lg" state="error">
|
|
440
|
+
<label class="ux4g-input-label">Password</label>
|
|
441
|
+
<input class="ux4g-input" type="password" />
|
|
442
|
+
<span class="ux4g-input-helper">Password is required</span>
|
|
443
|
+
</ux4g-input>
|
|
444
|
+
|
|
445
|
+
<ux4g-input size="md" state="default" [disabled]="true">
|
|
446
|
+
<label class="ux4g-input-label">Disabled</label>
|
|
447
|
+
<input class="ux4g-input" type="text" disabled />
|
|
448
|
+
</ux4g-input>
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
| Input | Type | Default | Description |
|
|
452
|
+
|---|---|---|---|
|
|
453
|
+
| `size` | `'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Input container size |
|
|
454
|
+
| `state` | `'default' \| 'error' \| 'success' \| 'warning'` | `'default'` | Validation state |
|
|
455
|
+
| `disabled` | `boolean` | `false` | Disabled state |
|
|
456
|
+
|
|
457
|
+
> **Note:** This is a container shell. Label, input element, and helper text are projected as children using UX4G CSS classes.
|
|
458
|
+
|
|
459
|
+
### List
|
|
460
|
+
|
|
461
|
+
```ts
|
|
462
|
+
import { UX4GListModule } from 'ux4g-components-angular/list';
|
|
463
|
+
|
|
464
|
+
@NgModule({ imports: [UX4GListModule] })
|
|
465
|
+
export class AppModule {}
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
```html
|
|
469
|
+
<ux4g-list variant="default" size="m">
|
|
470
|
+
<li>Item one</li>
|
|
471
|
+
<li>Item two</li>
|
|
472
|
+
</ux4g-list>
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
| Input | Type | Default | Description |
|
|
476
|
+
|---|---|---|---|
|
|
477
|
+
| `variant` | `'default' \| 'error' \| 'success' \| 'warning'` | `'default'` | List style |
|
|
478
|
+
| `size` | `'s' \| 'm' \| 'l' \| 'xl'` | `'m'` | List size |
|
|
479
|
+
|
|
480
|
+
### Dropdown
|
|
481
|
+
|
|
482
|
+
```ts
|
|
483
|
+
import { UX4GDropdownModule } from 'ux4g-components-angular/dropdown';
|
|
484
|
+
|
|
485
|
+
@NgModule({ imports: [UX4GDropdownModule] })
|
|
486
|
+
export class AppModule {}
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
```html
|
|
490
|
+
<ux4g-dropdown type="selection" mode="single" size="md" state="default">
|
|
491
|
+
<ux4g-dropdown-item value="1">Option 1</ux4g-dropdown-item>
|
|
492
|
+
<ux4g-dropdown-item value="2">Option 2</ux4g-dropdown-item>
|
|
493
|
+
</ux4g-dropdown>
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
| Input | Type | Default | Description |
|
|
497
|
+
|---|---|---|---|
|
|
498
|
+
| `type` | `'selection' \| 'button' \| 'overflow'` | `'selection'` | Dropdown type |
|
|
499
|
+
| `mode` | `'single' \| 'multi'` | `'single'` | Selection mode |
|
|
500
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Dropdown size |
|
|
501
|
+
| `state` | `'default' \| 'error' \| 'success' \| 'warning'` | `'default'` | Validation state |
|
|
502
|
+
| `open` | `boolean` | `false` | Open state |
|
|
503
|
+
|
|
504
|
+
### Combobox
|
|
505
|
+
|
|
506
|
+
```ts
|
|
507
|
+
import { UX4GComboboxModule } from 'ux4g-components-angular/combobox';
|
|
508
|
+
|
|
509
|
+
@NgModule({ imports: [UX4GComboboxModule] })
|
|
510
|
+
export class AppModule {}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
```html
|
|
514
|
+
<ux4g-combobox type="single" size="md" state="default" placeholder="Search..."></ux4g-combobox>
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
| Input | Type | Default | Description |
|
|
518
|
+
|---|---|---|---|
|
|
519
|
+
| `type` | `'single' \| 'multi'` | `'single'` | Combobox type |
|
|
520
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Combobox size |
|
|
521
|
+
| `state` | `'default' \| 'error' \| 'success' \| 'warning'` | `'default'` | Validation state |
|
|
522
|
+
| `open` | `boolean` | `false` | Open state |
|
|
523
|
+
|
|
524
|
+
### Modal
|
|
525
|
+
|
|
526
|
+
```ts
|
|
527
|
+
import { UX4GModalModule } from 'ux4g-components-angular/modal';
|
|
528
|
+
|
|
529
|
+
@NgModule({ imports: [UX4GModalModule] })
|
|
530
|
+
export class AppModule {}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
```html
|
|
534
|
+
<ux4g-modal size="m" opacity="50" [open]="isOpen">
|
|
535
|
+
<h2>Modal Title</h2>
|
|
536
|
+
<p>Modal content here.</p>
|
|
537
|
+
<button (click)="isOpen = false">Close</button>
|
|
538
|
+
</ux4g-modal>
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
| Input | Type | Default | Description |
|
|
542
|
+
|---|---|---|---|
|
|
543
|
+
| `size` | `'s' \| 'm' \| 'l'` | `'m'` | Modal size |
|
|
544
|
+
| `opacity` | `'25' \| '50' \| '75'` | `'50'` | Backdrop opacity |
|
|
545
|
+
| `blur` | `boolean` | `false` | Backdrop blur |
|
|
546
|
+
| `open` | `boolean` | `false` | Open state |
|
|
547
|
+
| `centerContent` | `boolean` | `false` | Center modal content |
|
|
548
|
+
|
|
549
|
+
> **Note:** Close handling is external — toggle the `open` input from your component state.
|
|
550
|
+
|
|
551
|
+
### Alert / Toast
|
|
552
|
+
|
|
553
|
+
```ts
|
|
554
|
+
import { UX4GAlertModule } from 'ux4g-components-angular/alert';
|
|
555
|
+
|
|
556
|
+
@NgModule({ imports: [UX4GAlertModule] })
|
|
557
|
+
export class AppModule {}
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
```html
|
|
561
|
+
<ux4g-alert variant="info">This is an informational message.</ux4g-alert>
|
|
562
|
+
<ux4g-alert variant="success" layout="wide">Saved successfully!</ux4g-alert>
|
|
563
|
+
|
|
564
|
+
<!-- Toast variant -->
|
|
565
|
+
<ux4g-alert variant="success" [toast]="true">Toast notification</ux4g-alert>
|
|
566
|
+
|
|
567
|
+
<!-- Toast container for positioning -->
|
|
568
|
+
<ux4g-alert-container position="top-right">
|
|
569
|
+
<ux4g-alert variant="success" [toast]="true">Toast notification</ux4g-alert>
|
|
570
|
+
</ux4g-alert-container>
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
| Input | Type | Default | Description |
|
|
574
|
+
|---|---|---|---|
|
|
575
|
+
| `variant` | `'info' \| 'success' \| 'warning' \| 'error'` | `'info'` | Alert type |
|
|
576
|
+
| `toast` | `boolean` | `false` | Use contextual toast styling instead of inline alert |
|
|
577
|
+
| `layout` | `'fluid' \| 'center' \| 'wide'` | `'fluid'` | Alert layout (when toast=false) |
|
|
578
|
+
|
|
579
|
+
**AlertContainer Inputs:**
|
|
580
|
+
|
|
581
|
+
| Input | Type | Default | Description |
|
|
582
|
+
|---|---|---|---|
|
|
583
|
+
| `position` | `'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right'` | `'top-right'` | Container position |
|
|
584
|
+
|
|
585
|
+
### Search
|
|
586
|
+
|
|
587
|
+
```ts
|
|
588
|
+
import { UX4GSearchModule } from 'ux4g-components-angular/search';
|
|
589
|
+
|
|
590
|
+
@NgModule({ imports: [UX4GSearchModule] })
|
|
591
|
+
export class AppModule {}
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
```html
|
|
595
|
+
<ux4g-search-container size="m">
|
|
596
|
+
<input class="ux4g-search-input" type="search" placeholder="Search..." />
|
|
597
|
+
<button class="ux4g-search-btn">
|
|
598
|
+
<span class="ux4g-icon-outlined">search</span>
|
|
599
|
+
</button>
|
|
600
|
+
</ux4g-search-container>
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
| Input | Type | Default | Description |
|
|
604
|
+
|---|---|---|---|
|
|
605
|
+
| `size` | `'s' \| 'm' \| 'lg'` | `'m'` | Search container size |
|
|
606
|
+
|
|
607
|
+
> **Note:** This is a container shell — the search input, button, and event handling are projected as children. The selector is `ux4g-search-container`.
|
|
608
|
+
|
|
609
|
+
### Pagination
|
|
610
|
+
|
|
611
|
+
```ts
|
|
612
|
+
import { UX4GPaginationModule } from 'ux4g-components-angular/pagination';
|
|
613
|
+
|
|
614
|
+
@NgModule({ imports: [UX4GPaginationModule] })
|
|
615
|
+
export class AppModule {}
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
```html
|
|
619
|
+
<ux4g-pagination variant="default">
|
|
620
|
+
<button class="ux4g-pagination-prev" aria-label="Previous">‹</button>
|
|
621
|
+
<button class="ux4g-pagination-item ux4g-pagination-active">1</button>
|
|
622
|
+
<button class="ux4g-pagination-item">2</button>
|
|
623
|
+
<button class="ux4g-pagination-item">3</button>
|
|
624
|
+
<button class="ux4g-pagination-next" aria-label="Next">›</button>
|
|
625
|
+
</ux4g-pagination>
|
|
626
|
+
|
|
627
|
+
<ux4g-pagination variant="dotted" paginationStyle="solid">
|
|
628
|
+
<span class="ux4g-pagination-dot ux4g-pagination-active"></span>
|
|
629
|
+
<span class="ux4g-pagination-dot"></span>
|
|
630
|
+
<span class="ux4g-pagination-dot"></span>
|
|
631
|
+
</ux4g-pagination>
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
| Input | Type | Default | Description |
|
|
635
|
+
|---|---|---|---|
|
|
636
|
+
| `variant` | `'default' \| 'dotted'` | `'default'` | Pagination style |
|
|
637
|
+
| `paginationStyle` | `'default' \| 'solid' \| 'translucent'` | `'default'` | Dotted variant style |
|
|
638
|
+
|
|
639
|
+
> **Note:** This is a container shell — page items, navigation buttons, and active state management are handled externally via content projection.
|
|
640
|
+
|
|
641
|
+
### Table
|
|
642
|
+
|
|
643
|
+
```ts
|
|
644
|
+
import { UX4GTableModule } from 'ux4g-components-angular/table';
|
|
645
|
+
|
|
646
|
+
@NgModule({ imports: [UX4GTableModule] })
|
|
647
|
+
export class AppModule {}
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
```html
|
|
651
|
+
<ux4g-table size="m" divider="row" [interactive]="true">
|
|
652
|
+
<thead>
|
|
653
|
+
<tr><th>Name</th><th>Email</th></tr>
|
|
654
|
+
</thead>
|
|
655
|
+
<tbody>
|
|
656
|
+
<tr><td>Alice</td><td>alice@example.com</td></tr>
|
|
657
|
+
</tbody>
|
|
658
|
+
</ux4g-table>
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
| Input | Type | Default | Description |
|
|
662
|
+
|---|---|---|---|
|
|
663
|
+
| `size` | `'s' \| 'm' \| 'lg'` | `'m'` | Table size |
|
|
664
|
+
| `divider` | `'row' \| 'column' \| 'none'` | `'row'` | Divider style |
|
|
665
|
+
| `zebra` | `'none' \| 'rows' \| 'cols'` | `'none'` | Zebra striping |
|
|
666
|
+
| `interactive` | `boolean` | `false` | Hover highlight |
|
|
667
|
+
| `sortable` | `boolean` | `false` | Sortable columns |
|
|
668
|
+
| `resizable` | `boolean` | `false` | Resizable columns |
|
|
669
|
+
| `headerBrand` | `boolean` | `false` | Brand-colored header |
|
|
670
|
+
|
|
671
|
+
### Popover
|
|
672
|
+
|
|
673
|
+
```ts
|
|
674
|
+
import { UX4GPopoverModule } from 'ux4g-components-angular/popover';
|
|
675
|
+
|
|
676
|
+
@NgModule({ imports: [UX4GPopoverModule] })
|
|
677
|
+
export class AppModule {}
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
```html
|
|
681
|
+
<ux4g-popover placement="right" [show]="showPopover">
|
|
682
|
+
<div class="ux4g-popover-header">Popover Title</div>
|
|
683
|
+
<div class="ux4g-popover-body">Body text goes here</div>
|
|
684
|
+
</ux4g-popover>
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
| Input | Type | Default | Description |
|
|
688
|
+
|---|---|---|---|
|
|
689
|
+
| `placement` | `'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | `'bottom'` | Popover position |
|
|
690
|
+
| `show` | `boolean` | `false` | Visibility |
|
|
691
|
+
|
|
692
|
+
> **Note:** Content (title, body) is projected as children using UX4G popover CSS classes. There are no `title` or `content` inputs.
|
|
693
|
+
|
|
694
|
+
### Tooltip
|
|
695
|
+
|
|
696
|
+
```ts
|
|
697
|
+
import { UX4GTooltipModule } from 'ux4g-components-angular/tooltip';
|
|
698
|
+
|
|
699
|
+
@NgModule({ imports: [UX4GTooltipModule] })
|
|
700
|
+
export class AppModule {}
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
```html
|
|
704
|
+
<ux4g-tooltip placement="top-center" size="s">
|
|
705
|
+
Tooltip text content goes here
|
|
706
|
+
</ux4g-tooltip>
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
| Input | Type | Default | Description |
|
|
710
|
+
|---|---|---|---|
|
|
711
|
+
| `placement` | `'top-left' \| 'top-center' \| 'top-right' \| 'bottom-left' \| 'bottom-center' \| 'bottom-right' \| 'left-center' \| 'right-center'` | `'top-center'` | Tooltip position |
|
|
712
|
+
| `size` | `'s' \| 'xs'` | `'s'` | Tooltip size |
|
|
713
|
+
|
|
714
|
+
> **Note:** Tooltip text is projected as content. There is no `content` input. Visibility is controlled by the UX4G runtime.
|
|
715
|
+
|
|
716
|
+
### Tab
|
|
717
|
+
|
|
718
|
+
```ts
|
|
719
|
+
import { UX4GTabModule } from 'ux4g-components-angular/tab';
|
|
720
|
+
|
|
721
|
+
@NgModule({ imports: [UX4GTabModule] })
|
|
722
|
+
export class AppModule {}
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
```html
|
|
726
|
+
<ux4g-tab variant="underline" size="md">
|
|
727
|
+
<ux4g-tab-item label="Tab 1" [active]="true">Content 1</ux4g-tab-item>
|
|
728
|
+
<ux4g-tab-item label="Tab 2">Content 2</ux4g-tab-item>
|
|
729
|
+
</ux4g-tab>
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
| Input | Type | Default | Description |
|
|
733
|
+
|---|---|---|---|
|
|
734
|
+
| `variant` | `'underline' \| 'pill'` | `'underline'` | Tab style |
|
|
735
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Tab size |
|
|
736
|
+
| `vertical` | `boolean` | `false` | Vertical layout |
|
|
737
|
+
|
|
738
|
+
### Icon Button
|
|
739
|
+
|
|
740
|
+
```ts
|
|
741
|
+
import { UX4GIconButtonModule } from 'ux4g-components-angular/icon-button';
|
|
742
|
+
|
|
743
|
+
@NgModule({ imports: [UX4GIconButtonModule] })
|
|
744
|
+
export class AppModule {}
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
```html
|
|
748
|
+
<ux4g-icon-button variant="primary" size="md" aria-label="Edit">
|
|
749
|
+
<i class="ux4g-icon-edit"></i>
|
|
750
|
+
</ux4g-icon-button>
|
|
751
|
+
|
|
752
|
+
<ux4g-icon-button variant="tonal-primary" size="lg" [pill]="true" aria-label="Add">
|
|
753
|
+
<i class="ux4g-icon-plus"></i>
|
|
754
|
+
</ux4g-icon-button>
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
| Input | Type | Default | Description |
|
|
758
|
+
|---|---|---|---|
|
|
759
|
+
| `variant` | `'primary' \| 'outline-primary' \| 'tonal-primary' \| 'text-primary'` | `'text-primary'` | Button style |
|
|
760
|
+
| `size` | `'xl' \| 'lg' \| 'md' \| 'sm' \| 'xs'` | `'md'` | Button size |
|
|
761
|
+
| `pill` | `boolean` | `false` | Pill shape |
|
|
762
|
+
|
|
763
|
+
### Accessibility Bar
|
|
764
|
+
|
|
765
|
+
```ts
|
|
766
|
+
import { UX4GAccessibilityBarModule } from 'ux4g-components-angular/accessibility-bar';
|
|
767
|
+
|
|
768
|
+
@NgModule({ imports: [UX4GAccessibilityBarModule] })
|
|
769
|
+
export class AppModule {}
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
```html
|
|
773
|
+
<ux4g-accessibility-bar>
|
|
774
|
+
<a href="#main-content">Skip to main content</a>
|
|
775
|
+
</ux4g-accessibility-bar>
|
|
776
|
+
```
|
|
777
|
+
|
|
778
|
+
### Accordion
|
|
779
|
+
|
|
780
|
+
```ts
|
|
781
|
+
import { UX4GAccordionModule } from 'ux4g-components-angular/accordion';
|
|
782
|
+
|
|
783
|
+
@NgModule({ imports: [UX4GAccordionModule] })
|
|
784
|
+
export class AppModule {}
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
```html
|
|
788
|
+
<ux4g-accordion arrowPosition="right" variant="default">
|
|
789
|
+
<ux4g-accordion-item title="Section 1">Content 1</ux4g-accordion-item>
|
|
790
|
+
<ux4g-accordion-item title="Section 2">Content 2</ux4g-accordion-item>
|
|
791
|
+
</ux4g-accordion>
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
| Input | Type | Default | Description |
|
|
795
|
+
|---|---|---|---|
|
|
796
|
+
| `arrowPosition` | `'right' \| 'left'` | `'right'` | Arrow icon position |
|
|
797
|
+
| `variant` | `'default' \| 'bordered'` | `'default'` | Accordion style |
|
|
798
|
+
|
|
799
|
+
### Stepper
|
|
800
|
+
|
|
801
|
+
```ts
|
|
802
|
+
import { UX4GStepperModule } from 'ux4g-components-angular/stepper';
|
|
803
|
+
|
|
804
|
+
@NgModule({ imports: [UX4GStepperModule] })
|
|
805
|
+
export class AppModule {}
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
```html
|
|
809
|
+
<ux4g-stepper orientation="horizontal" alignment="center">
|
|
810
|
+
<ux4g-stepper-step status="completed">Step 1</ux4g-stepper-step>
|
|
811
|
+
<ux4g-stepper-step status="active">Step 2</ux4g-stepper-step>
|
|
812
|
+
<ux4g-stepper-step>Step 3</ux4g-stepper-step>
|
|
813
|
+
</ux4g-stepper>
|
|
814
|
+
```
|
|
815
|
+
|
|
816
|
+
| Input | Type | Default | Description |
|
|
817
|
+
|---|---|---|---|
|
|
818
|
+
| `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Layout direction |
|
|
819
|
+
| `alignment` | `'default' \| 'center' \| 'left'` | `'default'` | Horizontal alignment |
|
|
820
|
+
| `variant` | `'default' \| 'bottom-line' \| 'bottom-line-fill' \| 'mobile' \| 'progress'` | `'default'` | Stepper style |
|
|
821
|
+
| `size` | `'default' \| 's'` | `'default'` | Stepper size |
|
|
822
|
+
|
|
823
|
+
### Slider
|
|
824
|
+
|
|
825
|
+
```ts
|
|
826
|
+
import { UX4GSliderFieldModule } from 'ux4g-components-angular/slider';
|
|
827
|
+
|
|
828
|
+
@NgModule({ imports: [UX4GSliderFieldModule] })
|
|
829
|
+
export class AppModule {}
|
|
830
|
+
```
|
|
831
|
+
|
|
832
|
+
```html
|
|
833
|
+
<ux4g-slider-field size="sm">
|
|
834
|
+
<label class="ux4g-slider-label">Volume</label>
|
|
835
|
+
<input class="ux4g-slider-input" type="range" min="0" max="100" value="50" />
|
|
836
|
+
</ux4g-slider-field>
|
|
837
|
+
|
|
838
|
+
<ux4g-slider-field size="md">
|
|
839
|
+
<input class="ux4g-slider-input" type="range" min="0" max="100" value="75" />
|
|
840
|
+
</ux4g-slider-field>
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
| Input | Type | Default | Description |
|
|
844
|
+
|---|---|---|---|
|
|
845
|
+
| `size` | `'sm' \| 'md'` | `'sm'` | Slider size |
|
|
846
|
+
|
|
847
|
+
> **Note:** The module is `UX4GSliderFieldModule` and the selector is `ux4g-slider-field`. The range input and label are projected as children.
|
|
848
|
+
|
|
849
|
+
### Drawer
|
|
850
|
+
|
|
851
|
+
```ts
|
|
852
|
+
import { UX4GDrawerModule } from 'ux4g-components-angular/drawer';
|
|
853
|
+
|
|
854
|
+
@NgModule({ imports: [UX4GDrawerModule] })
|
|
855
|
+
export class AppModule {}
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
```html
|
|
859
|
+
<ux4g-drawer placement="right" [open]="isOpen">
|
|
860
|
+
<h3>Drawer Title</h3>
|
|
861
|
+
<p>Drawer content</p>
|
|
862
|
+
<button (click)="isOpen = false">Close</button>
|
|
863
|
+
</ux4g-drawer>
|
|
864
|
+
```
|
|
865
|
+
|
|
866
|
+
| Input | Type | Default | Description |
|
|
867
|
+
|---|---|---|---|
|
|
868
|
+
| `placement` | `'right' \| 'left' \| 'top' \| 'bottom'` | `'right'` | Slide-in direction |
|
|
869
|
+
| `open` | `boolean` | `false` | Open state |
|
|
870
|
+
|
|
871
|
+
> **Note:** Close handling is external — toggle the `open` input from your component state.
|
|
872
|
+
|
|
873
|
+
### Date-Time Picker
|
|
874
|
+
|
|
875
|
+
```ts
|
|
876
|
+
import { UX4GDateTimePickerModule } from 'ux4g-components-angular/date-time-picker';
|
|
877
|
+
|
|
878
|
+
@NgModule({ imports: [UX4GDateTimePickerModule] })
|
|
879
|
+
export class AppModule {}
|
|
880
|
+
```
|
|
881
|
+
|
|
882
|
+
```html
|
|
883
|
+
<ux4g-date-time-picker mode="date"></ux4g-date-time-picker>
|
|
884
|
+
<ux4g-date-time-picker mode="time"></ux4g-date-time-picker>
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
| Input | Type | Default | Description |
|
|
888
|
+
|---|---|---|---|
|
|
889
|
+
| `mode` | `'date' \| 'time'` | `'date'` | Picker mode |
|
|
890
|
+
|
|
891
|
+
### Status Pipeline
|
|
892
|
+
|
|
893
|
+
```ts
|
|
894
|
+
import { UX4GStatusPipelineModule } from 'ux4g-components-angular/status-pipeline';
|
|
895
|
+
|
|
896
|
+
@NgModule({ imports: [UX4GStatusPipelineModule] })
|
|
897
|
+
export class AppModule {}
|
|
898
|
+
```
|
|
899
|
+
|
|
900
|
+
```html
|
|
901
|
+
<ux4g-status-pipeline orientation="horizontal" alignment="center">
|
|
902
|
+
<ux4g-status-pipeline-step status="completed">Submitted</ux4g-status-pipeline-step>
|
|
903
|
+
<ux4g-status-pipeline-step status="active">In Review</ux4g-status-pipeline-step>
|
|
904
|
+
<ux4g-status-pipeline-step>Approved</ux4g-status-pipeline-step>
|
|
905
|
+
</ux4g-status-pipeline>
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
| Input | Type | Default | Description |
|
|
909
|
+
|---|---|---|---|
|
|
910
|
+
| `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Layout direction |
|
|
911
|
+
| `alignment` | `'default' \| 'center' \| 'left'` | `'default'` | Horizontal alignment |
|
|
912
|
+
| `variant` | `'default' \| 'bottom-line' \| 'bottom-line-fill' \| 'mobile' \| 'progress'` | `'default'` | Pipeline style |
|
|
913
|
+
| `size` | `'default' \| 's'` | `'default'` | Pipeline size |
|
|
914
|
+
|
|
915
|
+
### Journey Timeline
|
|
916
|
+
|
|
917
|
+
```ts
|
|
918
|
+
import { UX4GJourneyTimelineModule } from 'ux4g-components-angular/journey-timeline';
|
|
919
|
+
|
|
920
|
+
@NgModule({ imports: [UX4GJourneyTimelineModule] })
|
|
921
|
+
export class AppModule {}
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
```html
|
|
925
|
+
<ux4g-journey-timeline orientation="vertical">
|
|
926
|
+
<ux4g-journey-timeline-item>Event 1</ux4g-journey-timeline-item>
|
|
927
|
+
<ux4g-journey-timeline-item>Event 2</ux4g-journey-timeline-item>
|
|
928
|
+
</ux4g-journey-timeline>
|
|
929
|
+
```
|
|
930
|
+
|
|
931
|
+
| Input | Type | Default | Description |
|
|
932
|
+
|---|---|---|---|
|
|
933
|
+
| `orientation` | `'vertical' \| 'horizontal'` | `'vertical'` | Timeline direction |
|
|
934
|
+
|
|
935
|
+
### Form Field Group
|
|
936
|
+
|
|
937
|
+
```ts
|
|
938
|
+
import { UX4GFormFieldGroupModule } from 'ux4g-components-angular/form-field-group';
|
|
939
|
+
|
|
940
|
+
@NgModule({ imports: [UX4GFormFieldGroupModule] })
|
|
941
|
+
export class AppModule {}
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
```html
|
|
945
|
+
<ux4g-form-field-group>
|
|
946
|
+
<label>Full Name</label>
|
|
947
|
+
<input type="text" />
|
|
948
|
+
<span>Enter your full legal name</span>
|
|
949
|
+
</ux4g-form-field-group>
|
|
950
|
+
```
|
|
951
|
+
|
|
952
|
+
### OTP Input
|
|
953
|
+
|
|
954
|
+
```ts
|
|
955
|
+
import { UX4GOtpInputModule } from 'ux4g-components-angular/otp-input';
|
|
956
|
+
|
|
957
|
+
@NgModule({ imports: [UX4GOtpInputModule] })
|
|
958
|
+
export class AppModule {}
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
```html
|
|
962
|
+
<ux4g-otp-input state="default">
|
|
963
|
+
<div class="ux4g-otp-label ux4g-label-l-default">Enter OTP</div>
|
|
964
|
+
<div class="ux4g-otp-group">
|
|
965
|
+
<input class="ux4g-otp-source" type="hidden" value="" data-ux-count="4" placeholder="—" />
|
|
966
|
+
</div>
|
|
967
|
+
<div class="ux4g-otp-meta ux4g-body-s-default">
|
|
968
|
+
<span class="ux4g-otp-helper">Didn't receive OTP?</span>
|
|
969
|
+
<span class="ux4g-otp-resend">Resend</span>
|
|
970
|
+
</div>
|
|
971
|
+
</ux4g-otp-input>
|
|
972
|
+
|
|
973
|
+
<ux4g-otp-input state="error">
|
|
974
|
+
<div class="ux4g-otp-label ux4g-label-l-default">Enter OTP</div>
|
|
975
|
+
<div class="ux4g-otp-group">
|
|
976
|
+
<input class="ux4g-otp-source" type="hidden" value="" data-ux-count="6" placeholder="—" />
|
|
977
|
+
</div>
|
|
978
|
+
</ux4g-otp-input>
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
| Input | Type | Default | Description |
|
|
982
|
+
|---|---|---|---|
|
|
983
|
+
| `state` | `'default' \| 'success' \| 'error' \| 'locked'` | `'default'` | Input state |
|
|
984
|
+
|
|
985
|
+
> **Note:** The OTP digit inputs are constructed by the runtime JS. The `data-ux-count` attribute on the hidden input controls how many digit boxes render. There is no `length` input — content is projected as children.
|
|
986
|
+
|
|
987
|
+
### File Upload
|
|
988
|
+
|
|
989
|
+
```ts
|
|
990
|
+
import { UX4GFileUploadModule } from 'ux4g-components-angular/file-upload';
|
|
991
|
+
|
|
992
|
+
@NgModule({ imports: [UX4GFileUploadModule] })
|
|
993
|
+
export class AppModule {}
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
```html
|
|
997
|
+
<ux4g-file-upload state="default"></ux4g-file-upload>
|
|
998
|
+
<ux4g-file-upload state="uploaded" fileName="document.pdf"></ux4g-file-upload>
|
|
999
|
+
```
|
|
1000
|
+
|
|
1001
|
+
| Input | Type | Default | Description |
|
|
1002
|
+
|---|---|---|---|
|
|
1003
|
+
| `state` | `'default' \| 'default-vle' \| 'selecting' \| 'scanning' \| 'uploaded' \| 'uploaded-vle' \| 'error'` | `'default'` | Upload state |
|
|
1004
|
+
|
|
1005
|
+
### Progress Indicator
|
|
1006
|
+
|
|
1007
|
+
```ts
|
|
1008
|
+
import { UX4GProgressIndicatorModule } from 'ux4g-components-angular/progress-indicator';
|
|
1009
|
+
|
|
1010
|
+
@NgModule({ imports: [UX4GProgressIndicatorModule] })
|
|
1011
|
+
export class AppModule {}
|
|
1012
|
+
```
|
|
1013
|
+
|
|
1014
|
+
```html
|
|
1015
|
+
<!-- Bar variant -->
|
|
1016
|
+
<ux4g-progress-indicator type="bar">
|
|
1017
|
+
<div class="ux4g-progress-bar-track">
|
|
1018
|
+
<div class="ux4g-progress-bar-fill" style="width: 60%"></div>
|
|
1019
|
+
</div>
|
|
1020
|
+
<span class="ux4g-progress-label">60%</span>
|
|
1021
|
+
</ux4g-progress-indicator>
|
|
1022
|
+
|
|
1023
|
+
<!-- Circle variant -->
|
|
1024
|
+
<ux4g-progress-indicator type="circle" size="l" labelPlacement="inside">
|
|
1025
|
+
<span class="ux4g-progress-value">75%</span>
|
|
1026
|
+
</ux4g-progress-indicator>
|
|
1027
|
+
|
|
1028
|
+
<!-- Rounded shape -->
|
|
1029
|
+
<ux4g-progress-indicator type="bar" shape="rounded">
|
|
1030
|
+
<div class="ux4g-progress-bar-track">
|
|
1031
|
+
<div class="ux4g-progress-bar-fill" style="width: 45%"></div>
|
|
1032
|
+
</div>
|
|
1033
|
+
</ux4g-progress-indicator>
|
|
1034
|
+
```
|
|
1035
|
+
|
|
1036
|
+
| Input | Type | Default | Description |
|
|
1037
|
+
|---|---|---|---|
|
|
1038
|
+
| `type` | `'bar' \| 'circle'` | — (required) | Indicator type |
|
|
1039
|
+
| `labelPlacement` | `'outside' \| 'inside'` | — | Label position |
|
|
1040
|
+
| `shape` | `'default' \| 'rounded'` | — | Bar shape |
|
|
1041
|
+
| `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl' \| '2xl' \| '3xl'` | — | Circle size (ignored for bar) |
|
|
1042
|
+
|
|
1043
|
+
> **Note:** This is a container shell. Progress track, fill, and value label are projected as children. There is no `value` input.
|
|
1044
|
+
|
|
1045
|
+
### Feedback
|
|
1046
|
+
|
|
1047
|
+
```ts
|
|
1048
|
+
import { UX4GFeedbackModule } from 'ux4g-components-angular/feedback';
|
|
1049
|
+
|
|
1050
|
+
@NgModule({ imports: [UX4GFeedbackModule] })
|
|
1051
|
+
export class AppModule {}
|
|
1052
|
+
```
|
|
1053
|
+
|
|
1054
|
+
```html
|
|
1055
|
+
<ux4g-feedback>
|
|
1056
|
+
<p>Was this helpful?</p>
|
|
1057
|
+
<button>Yes</button>
|
|
1058
|
+
<button>No</button>
|
|
1059
|
+
</ux4g-feedback>
|
|
1060
|
+
```
|
|
1061
|
+
|
|
1062
|
+
### Draft Status Banner
|
|
1063
|
+
|
|
1064
|
+
```ts
|
|
1065
|
+
import { UX4GDraftStatusBannerModule } from 'ux4g-components-angular/draft-status-banner';
|
|
1066
|
+
|
|
1067
|
+
@NgModule({ imports: [UX4GDraftStatusBannerModule] })
|
|
1068
|
+
export class AppModule {}
|
|
1069
|
+
```
|
|
1070
|
+
|
|
1071
|
+
```html
|
|
1072
|
+
<ux4g-draft-status-banner variant="default">Draft saved</ux4g-draft-status-banner>
|
|
1073
|
+
<ux4g-draft-status-banner variant="auto">Auto-saving...</ux4g-draft-status-banner>
|
|
1074
|
+
<ux4g-draft-status-banner variant="success">Published</ux4g-draft-status-banner>
|
|
1075
|
+
```
|
|
1076
|
+
|
|
1077
|
+
| Input | Type | Default | Description |
|
|
1078
|
+
|---|---|---|---|
|
|
1079
|
+
| `variant` | `'default' \| 'auto' \| 'success'` | `'default'` | Banner style |
|
|
1080
|
+
|
|
1081
|
+
### SLA Progress Indicator
|
|
1082
|
+
|
|
1083
|
+
```ts
|
|
1084
|
+
import { UX4GSlaProgressIndicatorModule } from 'ux4g-components-angular/sla-progress-indicator';
|
|
1085
|
+
|
|
1086
|
+
@NgModule({ imports: [UX4GSlaProgressIndicatorModule] })
|
|
1087
|
+
export class AppModule {}
|
|
1088
|
+
```
|
|
1089
|
+
|
|
1090
|
+
```html
|
|
1091
|
+
<ux4g-sla-progress-indicator type="circle">
|
|
1092
|
+
<div class="ux4g-sla-circle-track">
|
|
1093
|
+
<span class="ux4g-sla-value">75%</span>
|
|
1094
|
+
</div>
|
|
1095
|
+
</ux4g-sla-progress-indicator>
|
|
1096
|
+
|
|
1097
|
+
<ux4g-sla-progress-indicator type="linear">
|
|
1098
|
+
<div class="ux4g-sla-linear-track">
|
|
1099
|
+
<div class="ux4g-sla-linear-fill" style="width: 50%"></div>
|
|
1100
|
+
</div>
|
|
1101
|
+
</ux4g-sla-progress-indicator>
|
|
1102
|
+
|
|
1103
|
+
<ux4g-sla-progress-indicator type="badge">On Track</ux4g-sla-progress-indicator>
|
|
1104
|
+
```
|
|
1105
|
+
|
|
1106
|
+
| Input | Type | Default | Description |
|
|
1107
|
+
|---|---|---|---|
|
|
1108
|
+
| `type` | `'circle' \| 'linear' \| 'badge'` | — (required) | Indicator type |
|
|
1109
|
+
|
|
1110
|
+
> **Note:** This is a container shell. Progress value and track are projected as children. There is no `value` input.
|
|
1111
|
+
|
|
1112
|
+
### Carousel
|
|
1113
|
+
|
|
1114
|
+
```ts
|
|
1115
|
+
import { UX4GCarouselModule } from 'ux4g-components-angular/carousel';
|
|
1116
|
+
|
|
1117
|
+
@NgModule({ imports: [UX4GCarouselModule] })
|
|
1118
|
+
export class AppModule {}
|
|
1119
|
+
```
|
|
1120
|
+
|
|
1121
|
+
```html
|
|
1122
|
+
<ux4g-carousel>
|
|
1123
|
+
<ux4g-carousel-item>Slide 1</ux4g-carousel-item>
|
|
1124
|
+
<ux4g-carousel-item>Slide 2</ux4g-carousel-item>
|
|
1125
|
+
<ux4g-carousel-item>Slide 3</ux4g-carousel-item>
|
|
1126
|
+
</ux4g-carousel>
|
|
1127
|
+
```
|
|
1128
|
+
|
|
1129
|
+
### Empty State
|
|
1130
|
+
|
|
1131
|
+
```ts
|
|
1132
|
+
import { UX4GEmptyStateModule } from 'ux4g-components-angular/empty-state';
|
|
1133
|
+
|
|
1134
|
+
@NgModule({ imports: [UX4GEmptyStateModule] })
|
|
1135
|
+
export class AppModule {}
|
|
1136
|
+
```
|
|
1137
|
+
|
|
1138
|
+
```html
|
|
1139
|
+
<ux4g-empty-state>
|
|
1140
|
+
<img src="empty.svg" alt="" />
|
|
1141
|
+
<h3>No results found</h3>
|
|
1142
|
+
<p>Try adjusting your search.</p>
|
|
1143
|
+
</ux4g-empty-state>
|
|
1144
|
+
```
|
|
1145
|
+
|
|
1146
|
+
### Chip Group
|
|
1147
|
+
|
|
1148
|
+
```ts
|
|
1149
|
+
import { UX4GChipGroupModule } from 'ux4g-components-angular/chip-group';
|
|
1150
|
+
|
|
1151
|
+
@NgModule({ imports: [UX4GChipGroupModule] })
|
|
1152
|
+
export class AppModule {}
|
|
1153
|
+
```
|
|
1154
|
+
|
|
1155
|
+
```html
|
|
1156
|
+
<ux4g-chip-group variant="filter">
|
|
1157
|
+
<ux4g-chip chipType="filter" size="md" [active]="true">All</ux4g-chip>
|
|
1158
|
+
<ux4g-chip chipType="filter" size="md">Category A</ux4g-chip>
|
|
1159
|
+
</ux4g-chip-group>
|
|
1160
|
+
```
|
|
1161
|
+
|
|
1162
|
+
| Input | Type | Default | Description |
|
|
1163
|
+
|---|---|---|---|
|
|
1164
|
+
| `variant` | `'filter' \| 'choice'` | `'filter'` | Group type |
|
|
1165
|
+
|
|
1166
|
+
### Navbar
|
|
1167
|
+
|
|
1168
|
+
```ts
|
|
1169
|
+
import { UX4GNavbarModule } from 'ux4g-components-angular/navbar';
|
|
1170
|
+
|
|
1171
|
+
@NgModule({ imports: [UX4GNavbarModule] })
|
|
1172
|
+
export class AppModule {}
|
|
1173
|
+
```
|
|
1174
|
+
|
|
1175
|
+
```html
|
|
1176
|
+
<ux4g-navbar>
|
|
1177
|
+
<a href="/">Logo</a>
|
|
1178
|
+
<nav>
|
|
1179
|
+
<a href="#">Home</a>
|
|
1180
|
+
<a href="#">About</a>
|
|
1181
|
+
</nav>
|
|
1182
|
+
</ux4g-navbar>
|
|
1183
|
+
```
|
|
1184
|
+
|
|
1185
|
+
### Social Links
|
|
1186
|
+
|
|
1187
|
+
```ts
|
|
1188
|
+
import { UX4GSocialLinksModule } from 'ux4g-components-angular/social-links';
|
|
1189
|
+
|
|
1190
|
+
@NgModule({ imports: [UX4GSocialLinksModule] })
|
|
1191
|
+
export class AppModule {}
|
|
1192
|
+
```
|
|
1193
|
+
|
|
1194
|
+
```html
|
|
1195
|
+
<ux4g-social-links size="md">
|
|
1196
|
+
<a href="#" aria-label="Twitter"><i class="ux4g-icon-twitter"></i></a>
|
|
1197
|
+
<a href="#" aria-label="LinkedIn"><i class="ux4g-icon-linkedin"></i></a>
|
|
1198
|
+
</ux4g-social-links>
|
|
1199
|
+
```
|
|
1200
|
+
|
|
1201
|
+
| Input | Type | Default | Description |
|
|
1202
|
+
|---|---|---|---|
|
|
1203
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Icon spacing size |
|
|
1204
|
+
|
|
1205
|
+
### Slot Grid
|
|
1206
|
+
|
|
1207
|
+
```ts
|
|
1208
|
+
import { UX4GSlotGridModule } from 'ux4g-components-angular/slot-grid';
|
|
1209
|
+
|
|
1210
|
+
@NgModule({ imports: [UX4GSlotGridModule] })
|
|
1211
|
+
export class AppModule {}
|
|
1212
|
+
```
|
|
1213
|
+
|
|
1214
|
+
```html
|
|
1215
|
+
<ux4g-slot-grid variant="weekly">
|
|
1216
|
+
<div>9:00 AM</div>
|
|
1217
|
+
<div>10:00 AM</div>
|
|
1218
|
+
</ux4g-slot-grid>
|
|
1219
|
+
|
|
1220
|
+
<ux4g-slot-grid variant="compact">
|
|
1221
|
+
<div>9:00</div>
|
|
1222
|
+
<div>9:30</div>
|
|
1223
|
+
</ux4g-slot-grid>
|
|
1224
|
+
```
|
|
1225
|
+
|
|
1226
|
+
| Input | Type | Default | Description |
|
|
1227
|
+
|---|---|---|---|
|
|
1228
|
+
| `variant` | `'weekly' \| 'compact'` | `'weekly'` | Grid layout |
|
|
1229
|
+
|
|
1230
|
+
### Footer
|
|
1231
|
+
|
|
1232
|
+
```ts
|
|
1233
|
+
import { UX4GFooterModule } from 'ux4g-components-angular/footer';
|
|
1234
|
+
|
|
1235
|
+
@NgModule({ imports: [UX4GFooterModule] })
|
|
1236
|
+
export class AppModule {}
|
|
1237
|
+
```
|
|
1238
|
+
|
|
1239
|
+
```html
|
|
1240
|
+
<ux4g-footer theme="primary">
|
|
1241
|
+
<p>© 2024 Company Name</p>
|
|
1242
|
+
</ux4g-footer>
|
|
1243
|
+
```
|
|
1244
|
+
|
|
1245
|
+
| Input | Type | Default | Description |
|
|
1246
|
+
|---|---|---|---|
|
|
1247
|
+
| `theme` | `'default' \| 'primary' \| 'dark'` | `'default'` | Footer theme |
|
|
1248
|
+
|
|
1249
|
+
### Mega Menu
|
|
1250
|
+
|
|
1251
|
+
```ts
|
|
1252
|
+
import { UX4GMegaMenuModule } from 'ux4g-components-angular/mega-menu';
|
|
1253
|
+
|
|
1254
|
+
@NgModule({ imports: [UX4GMegaMenuModule] })
|
|
1255
|
+
export class AppModule {}
|
|
1256
|
+
```
|
|
1257
|
+
|
|
1258
|
+
```html
|
|
1259
|
+
<ux4g-mega-menu>
|
|
1260
|
+
<ux4g-mega-menu-sidebar>
|
|
1261
|
+
<ux4g-mega-menu-category-item [active]="true">Category 1</ux4g-mega-menu-category-item>
|
|
1262
|
+
<ux4g-mega-menu-category-item>Category 2</ux4g-mega-menu-category-item>
|
|
1263
|
+
</ux4g-mega-menu-sidebar>
|
|
1264
|
+
<ux4g-mega-menu-content [active]="true">
|
|
1265
|
+
<ux4g-mega-menu-column>
|
|
1266
|
+
<a href="#">Link 1</a>
|
|
1267
|
+
<a href="#">Link 2</a>
|
|
1268
|
+
</ux4g-mega-menu-column>
|
|
1269
|
+
</ux4g-mega-menu-content>
|
|
1270
|
+
</ux4g-mega-menu>
|
|
1271
|
+
|
|
1272
|
+
<!-- Dropdown variant -->
|
|
1273
|
+
<ux4g-mega-menu [dropdown]="true">
|
|
1274
|
+
<ux4g-mega-menu-sidebar>
|
|
1275
|
+
<ux4g-mega-menu-category-item [active]="true">Services</ux4g-mega-menu-category-item>
|
|
1276
|
+
</ux4g-mega-menu-sidebar>
|
|
1277
|
+
<ux4g-mega-menu-content [active]="true">
|
|
1278
|
+
<ux4g-mega-menu-column>
|
|
1279
|
+
<a href="#">Service A</a>
|
|
1280
|
+
</ux4g-mega-menu-column>
|
|
1281
|
+
</ux4g-mega-menu-content>
|
|
1282
|
+
</ux4g-mega-menu>
|
|
1283
|
+
```
|
|
1284
|
+
|
|
1285
|
+
**UX4GMegaMenu Inputs:**
|
|
1286
|
+
|
|
1287
|
+
| Input | Type | Default | Description |
|
|
1288
|
+
|---|---|---|---|
|
|
1289
|
+
| `dropdown` | `boolean` | `false` | Render as dropdown (wraps in positioning container) |
|
|
1290
|
+
| `dropdownRight` | `boolean` | `false` | Align dropdown to the right |
|
|
1291
|
+
|
|
1292
|
+
**UX4GMegaMenuCategoryItem Inputs:**
|
|
1293
|
+
|
|
1294
|
+
| Input | Type | Default | Description |
|
|
1295
|
+
|---|---|---|---|
|
|
1296
|
+
| `active` | `boolean` | `false` | Active/selected state |
|
|
1297
|
+
|
|
1298
|
+
**UX4GMegaMenuContent Inputs:**
|
|
1299
|
+
|
|
1300
|
+
| Input | Type | Default | Description |
|
|
1301
|
+
|---|---|---|---|
|
|
1302
|
+
| `active` | `boolean` | `false` | Active/visible state |
|
|
1303
|
+
|
|
1304
|
+
### Result List Row
|
|
1305
|
+
|
|
1306
|
+
```ts
|
|
1307
|
+
import { UX4GResultListRowModule } from 'ux4g-components-angular/result-list-row';
|
|
1308
|
+
|
|
1309
|
+
@NgModule({ imports: [UX4GResultListRowModule] })
|
|
1310
|
+
export class AppModule {}
|
|
1311
|
+
```
|
|
1312
|
+
|
|
1313
|
+
```html
|
|
1314
|
+
<ux4g-result-list-row variation="v1">
|
|
1315
|
+
<!-- Header -->
|
|
1316
|
+
<div class="ux4g-result-list-header">
|
|
1317
|
+
<div class="ux4g-result-list-info">
|
|
1318
|
+
<div class="ux4g-result-list-icon"></div>
|
|
1319
|
+
<div class="ux4g-result-list-title-group">
|
|
1320
|
+
<h2 class="ux4g-title-s-default ux4g-result-list-title">Certificate Name</h2>
|
|
1321
|
+
</div>
|
|
1322
|
+
</div>
|
|
1323
|
+
<div class="ux4g-result-list-actions-container">
|
|
1324
|
+
<div class="ux4g-result-list-actions">
|
|
1325
|
+
<button class="ux4g-btn-outline-neutral ux4g-btn-sm ux4g-btn">Track</button>
|
|
1326
|
+
</div>
|
|
1327
|
+
</div>
|
|
1328
|
+
</div>
|
|
1329
|
+
<!-- Expanded Content -->
|
|
1330
|
+
<div class="ux4g-result-list-content">
|
|
1331
|
+
<div class="ux4g-result-list-details">
|
|
1332
|
+
<div class="ux4g-result-list-detail-item">
|
|
1333
|
+
<span class="ux4g-label-m-default ux4g-text-neutral-tertiary">Submitted Date</span>
|
|
1334
|
+
<span class="ux4g-body-s-default ux4g-text-neutral-secondary">1 Apr 2026</span>
|
|
1335
|
+
</div>
|
|
1336
|
+
</div>
|
|
1337
|
+
</div>
|
|
1338
|
+
</ux4g-result-list-row>
|
|
1339
|
+
```
|
|
1340
|
+
|
|
1341
|
+
| Input | Type | Default | Description |
|
|
1342
|
+
|---|---|---|---|
|
|
1343
|
+
| `variation` | `'default' \| 'v1' \| 'v2' \| 'v3' \| 'v4' \| 'v5'` | `'default'` | Row layout variation |
|
|
1344
|
+
|
|
1345
|
+
---
|
|
1346
|
+
|
|
1347
|
+
## Dark Theme
|
|
1348
|
+
|
|
1349
|
+
Apply the dark theme by adding `data-theme="dark"` to any container or the `<html>` element:
|
|
1350
|
+
|
|
1351
|
+
```html
|
|
1352
|
+
<!-- In index.html -->
|
|
1353
|
+
<html data-theme="dark">
|
|
1354
|
+
|
|
1355
|
+
<!-- Or scoped to a section in a template -->
|
|
1356
|
+
<div data-theme="dark">
|
|
1357
|
+
<ux4g-button variant="primary" size="md">Dark themed</ux4g-button>
|
|
1358
|
+
</div>
|
|
1359
|
+
```
|
|
1360
|
+
|
|
1361
|
+
Design tokens automatically switch values — no additional imports needed.
|
|
1362
|
+
|
|
1363
|
+
---
|
|
1364
|
+
|
|
1365
|
+
## Architecture
|
|
1366
|
+
|
|
1367
|
+
This package follows a CSS-first architecture:
|
|
1368
|
+
|
|
1369
|
+
- **CSS is the source of truth** — all visual decisions live in CSS from `ux4g-components-web`
|
|
1370
|
+
- **Wrappers are thin** — they map typed inputs to CSS class strings via `buildXxxClasses()` functions
|
|
1371
|
+
- **No inline styles, no CSS-in-JS** — only `[class]` bindings
|
|
1372
|
+
- **Class_Builder functions** are imported from `ux4g-components-web/types`
|
|
1373
|
+
- **Runtime auto-bootstrap** — interactive behaviors initialize automatically
|
|
1374
|
+
|
|
1375
|
+
---
|
|
1376
|
+
|
|
1377
|
+
## Compatibility
|
|
1378
|
+
|
|
1379
|
+
- Angular >= 15.0.0
|
|
1380
|
+
- Built with Ivy partial compilation (compatible with Angular 15–19+)
|
|
1381
|
+
- `typesVersions` included for `moduleResolution: node` compatibility
|
|
1382
|
+
|
|
1383
|
+
---
|
|
1384
|
+
|
|
1385
|
+
## Available Components (51)
|
|
1386
|
+
|
|
1387
|
+
All components are available as sub-path imports:
|
|
1388
|
+
|
|
1389
|
+
```ts
|
|
1390
|
+
import { UX4GButtonModule } from 'ux4g-components-angular/button';
|
|
1391
|
+
import { UX4GSpinnerModule } from 'ux4g-components-angular/spinner';
|
|
1392
|
+
import { UX4GBadgeModule } from 'ux4g-components-angular/badge';
|
|
1393
|
+
// ... etc.
|
|
1394
|
+
```
|
|
1395
|
+
|
|
1396
|
+
Full list: `accessibility-bar`, `accordion`, `alert`, `avatar`, `badge`, `breadcrumb`, `button`, `card`, `carousel`, `checkbox`, `chip`, `chip-group`, `combobox`, `date-time-picker`, `divider`, `draft-status-banner`, `drawer`, `dropdown`, `empty-state`, `feedback`, `file-upload`, `footer`, `form-field-group`, `icon-button`, `image`, `input`, `journey-timeline`, `link`, `list`, `mega-menu`, `modal`, `navbar`, `otp-input`, `pagination`, `popover`, `progress-indicator`, `radio`, `result-list-row`, `search`, `sla-progress-indicator`, `slider`, `slot-grid`, `social-links`, `spinner`, `status-pipeline`, `stepper`, `switch`, `tab`, `table`, `tag`, `tooltip`
|
|
1397
|
+
|
|
1398
|
+
---
|
|
1399
|
+
|
|
1400
|
+
## Native Wrappers
|
|
1401
|
+
|
|
1402
|
+
In addition to the default thin wrappers documented above, this package provides **Native Wrappers** — Angular components that internally generate the complete UX4G-compliant DOM structure. With Native Wrappers, you declare a single element with input bindings and get a fully rendered, accessible, interactive component without writing any HTML markup.
|
|
1403
|
+
|
|
1404
|
+
### Architecture Decision
|
|
1405
|
+
|
|
1406
|
+
> **Thin Wrappers are the default export. Native Wrappers are opt-in via `/native/` sub-paths.** This decision shall not be reversed without a major version bump.
|
|
1407
|
+
|
|
1408
|
+
- Existing thin wrapper imports (e.g., `ux4g-components-angular/dropdown`) remain unchanged
|
|
1409
|
+
- Native Wrappers use the `/native/` sub-path convention (e.g., `ux4g-components-angular/native/dropdown`)
|
|
1410
|
+
- Both can coexist in the same application without conflicts
|
|
1411
|
+
|
|
1412
|
+
### Import Convention
|
|
1413
|
+
|
|
1414
|
+
```ts
|
|
1415
|
+
// Thin Wrapper (default — unchanged)
|
|
1416
|
+
import { UX4GDropdownModule } from 'ux4g-components-angular/dropdown';
|
|
1417
|
+
|
|
1418
|
+
// Native Wrapper (opt-in)
|
|
1419
|
+
import { UX4GNativeDropdownComponent } from 'ux4g-components-angular/native/dropdown';
|
|
1420
|
+
```
|
|
1421
|
+
|
|
1422
|
+
### Usage Example
|
|
1423
|
+
|
|
1424
|
+
```ts
|
|
1425
|
+
// app.component.ts
|
|
1426
|
+
import { Component } from '@angular/core';
|
|
1427
|
+
import { UX4GNativeDropdownComponent } from 'ux4g-components-angular/native/dropdown';
|
|
1428
|
+
|
|
1429
|
+
@Component({
|
|
1430
|
+
selector: 'app-root',
|
|
1431
|
+
standalone: true,
|
|
1432
|
+
imports: [UX4GNativeDropdownComponent],
|
|
1433
|
+
template: `
|
|
1434
|
+
<ux4g-native-dropdown
|
|
1435
|
+
[options]="options"
|
|
1436
|
+
[(ngModel)]="selected"
|
|
1437
|
+
placeholder="Select..."
|
|
1438
|
+
size="md"
|
|
1439
|
+
></ux4g-native-dropdown>
|
|
1440
|
+
`,
|
|
1441
|
+
})
|
|
1442
|
+
export class AppComponent {
|
|
1443
|
+
options = [
|
|
1444
|
+
{ label: 'Option 1', value: '1' },
|
|
1445
|
+
{ label: 'Option 2', value: '2' },
|
|
1446
|
+
{ label: 'Option 3', value: '3', disabled: true },
|
|
1447
|
+
];
|
|
1448
|
+
selected = '1';
|
|
1449
|
+
}
|
|
1450
|
+
```
|
|
1451
|
+
|
|
1452
|
+
Compare this to the thin wrapper approach, which requires manual HTML structure:
|
|
1453
|
+
|
|
1454
|
+
```html
|
|
1455
|
+
<!-- Thin wrapper — consumer provides all HTML structure -->
|
|
1456
|
+
<ux4g-dropdown type="selection" mode="single" size="md" state="default">
|
|
1457
|
+
<ux4g-dropdown-item value="1">Option 1</ux4g-dropdown-item>
|
|
1458
|
+
<ux4g-dropdown-item value="2">Option 2</ux4g-dropdown-item>
|
|
1459
|
+
<ux4g-dropdown-item value="3">Option 3</ux4g-dropdown-item>
|
|
1460
|
+
</ux4g-dropdown>
|
|
1461
|
+
```
|
|
1462
|
+
|
|
1463
|
+
### Available Native Wrapper Components (19)
|
|
1464
|
+
|
|
1465
|
+
| Import Path | Component |
|
|
1466
|
+
|---|---|
|
|
1467
|
+
| `ux4g-components-angular/native/dropdown` | Dropdown |
|
|
1468
|
+
| `ux4g-components-angular/native/accordion` | Accordion |
|
|
1469
|
+
| `ux4g-components-angular/native/tabs` | Tabs |
|
|
1470
|
+
| `ux4g-components-angular/native/modal` | Modal |
|
|
1471
|
+
| `ux4g-components-angular/native/carousel` | Carousel |
|
|
1472
|
+
| `ux4g-components-angular/native/date-picker` | Date Picker |
|
|
1473
|
+
| `ux4g-components-angular/native/time-picker` | Time Picker |
|
|
1474
|
+
| `ux4g-components-angular/native/drawer` | Drawer |
|
|
1475
|
+
| `ux4g-components-angular/native/combobox` | Combobox |
|
|
1476
|
+
| `ux4g-components-angular/native/search` | Search |
|
|
1477
|
+
| `ux4g-components-angular/native/otp` | OTP Input |
|
|
1478
|
+
| `ux4g-components-angular/native/progress` | Progress Indicator |
|
|
1479
|
+
| `ux4g-components-angular/native/file-upload` | File Upload |
|
|
1480
|
+
| `ux4g-components-angular/native/table` | Table |
|
|
1481
|
+
| `ux4g-components-angular/native/stepper` | Stepper |
|
|
1482
|
+
| `ux4g-components-angular/native/popover` | Popover |
|
|
1483
|
+
| `ux4g-components-angular/native/tooltip` | Tooltip |
|
|
1484
|
+
| `ux4g-components-angular/native/avatar` | Avatar |
|
|
1485
|
+
| `ux4g-components-angular/native/chip` | Chip |
|
|
1486
|
+
|
|
1487
|
+
### Key Differences from Thin Wrappers
|
|
1488
|
+
|
|
1489
|
+
| Feature | Thin Wrapper | Native Wrapper |
|
|
1490
|
+
|---|---|---|
|
|
1491
|
+
| DOM structure | Consumer provides HTML | Generated internally |
|
|
1492
|
+
| Data attributes | Consumer adds manually | Included automatically |
|
|
1493
|
+
| ARIA attributes | Consumer manages | Built-in |
|
|
1494
|
+
| Interactive behaviors | Consumer wires up | Works via Runtime JS auto-init |
|
|
1495
|
+
| Angular Forms | N/A | `ControlValueAccessor` support |
|
|
1496
|
+
| Standalone | NgModule-based | `standalone: true` (NgModule also available) |
|
|
1497
|
+
|
|
1498
|
+
### Angular Forms Integration
|
|
1499
|
+
|
|
1500
|
+
Native Wrappers for form control components implement `ControlValueAccessor`, so they work with both template-driven and reactive forms:
|
|
1501
|
+
|
|
1502
|
+
```html
|
|
1503
|
+
<!-- Template-driven -->
|
|
1504
|
+
<ux4g-native-dropdown [options]="options" [(ngModel)]="selected"></ux4g-native-dropdown>
|
|
1505
|
+
|
|
1506
|
+
<!-- Reactive forms -->
|
|
1507
|
+
<ux4g-native-dropdown [options]="options" formControlName="country"></ux4g-native-dropdown>
|
|
1508
|
+
```
|
|
1509
|
+
|
|
1510
|
+
### Standalone and NgModule Support
|
|
1511
|
+
|
|
1512
|
+
Native Wrappers are declared as `standalone: true` for Angular 17+ consumers. An NgModule is also provided for backward compatibility:
|
|
1513
|
+
|
|
1514
|
+
```ts
|
|
1515
|
+
// Standalone (Angular 17+)
|
|
1516
|
+
import { UX4GNativeDropdownComponent } from 'ux4g-components-angular/native/dropdown';
|
|
1517
|
+
|
|
1518
|
+
@Component({
|
|
1519
|
+
standalone: true,
|
|
1520
|
+
imports: [UX4GNativeDropdownComponent],
|
|
1521
|
+
// ...
|
|
1522
|
+
})
|
|
1523
|
+
|
|
1524
|
+
// NgModule (Angular 15–16)
|
|
1525
|
+
import { UX4GNativeDropdownModule } from 'ux4g-components-angular/native/dropdown';
|
|
1526
|
+
|
|
1527
|
+
@NgModule({
|
|
1528
|
+
imports: [UX4GNativeDropdownModule],
|
|
1529
|
+
})
|
|
1530
|
+
```
|
|
1531
|
+
|
|
1532
|
+
---
|
|
1533
|
+
|
|
1534
|
+
## Related Packages
|
|
1535
|
+
|
|
1536
|
+
- [`ux4g-components-web`](https://www.npmjs.com/package/ux4g-components-web) — CSS bundle and shared types (required)
|
|
1537
|
+
- [`ux4g-components-react`](https://www.npmjs.com/package/ux4g-components-react) — React wrapper components
|
|
1538
|
+
|
|
1539
|
+
## License
|
|
1540
|
+
|
|
1541
|
+
MIT
|