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.
Files changed (273) hide show
  1. package/README.md +330 -48
  2. package/dist/accessibility-bar/README.md +330 -48
  3. package/dist/accordion/README.md +330 -48
  4. package/dist/alert/README.md +330 -48
  5. package/dist/avatar/README.md +330 -48
  6. package/dist/badge/README.md +330 -48
  7. package/dist/breadcrumb/README.md +330 -48
  8. package/dist/button/README.md +330 -48
  9. package/dist/card/README.md +330 -48
  10. package/dist/carousel/README.md +330 -48
  11. package/dist/checkbox/README.md +330 -48
  12. package/dist/chip/README.md +330 -48
  13. package/dist/chip-group/README.md +330 -48
  14. package/dist/combobox/README.md +330 -48
  15. package/dist/date-time-picker/README.md +330 -48
  16. package/dist/divider/README.md +330 -48
  17. package/dist/draft-status-banner/README.md +330 -48
  18. package/dist/drawer/README.md +330 -48
  19. package/dist/dropdown/README.md +330 -48
  20. package/dist/empty-state/README.md +330 -48
  21. package/dist/feedback/README.md +330 -48
  22. package/dist/file-upload/README.md +330 -48
  23. package/dist/footer/README.md +330 -48
  24. package/dist/form-field-group/README.md +330 -48
  25. package/dist/icon-button/README.md +330 -48
  26. package/dist/image/README.md +330 -48
  27. package/dist/input/README.md +330 -48
  28. package/dist/journey-timeline/README.md +330 -48
  29. package/dist/link/README.md +330 -48
  30. package/dist/list/README.md +330 -48
  31. package/dist/mega-menu/README.md +330 -48
  32. package/dist/modal/README.md +330 -48
  33. package/dist/native/accordion/README.md +1541 -0
  34. package/dist/native/accordion/fesm2022/ux4g-components-angular-native-accordion.mjs +85 -0
  35. package/dist/native/accordion/fesm2022/ux4g-components-angular-native-accordion.mjs.map +1 -0
  36. package/dist/native/accordion/index.d.ts +6 -0
  37. package/dist/native/accordion/public-api.d.ts +3 -0
  38. package/dist/native/accordion/public-api.d.ts.map +1 -0
  39. package/dist/native/accordion/ux4g-components-angular-native-accordion.d.ts.map +1 -0
  40. package/dist/native/accordion/ux4g-native-accordion.component.d.ts +31 -0
  41. package/dist/native/accordion/ux4g-native-accordion.component.d.ts.map +1 -0
  42. package/dist/native/accordion/ux4g-native-accordion.module.d.ts +12 -0
  43. package/dist/native/accordion/ux4g-native-accordion.module.d.ts.map +1 -0
  44. package/dist/native/avatar/README.md +1541 -0
  45. package/dist/native/avatar/fesm2022/ux4g-components-angular-native-avatar.mjs +81 -0
  46. package/dist/native/avatar/fesm2022/ux4g-components-angular-native-avatar.mjs.map +1 -0
  47. package/dist/native/avatar/index.d.ts +6 -0
  48. package/dist/native/avatar/public-api.d.ts +3 -0
  49. package/dist/native/avatar/public-api.d.ts.map +1 -0
  50. package/dist/native/avatar/ux4g-components-angular-native-avatar.d.ts.map +1 -0
  51. package/dist/native/avatar/ux4g-native-avatar.component.d.ts +34 -0
  52. package/dist/native/avatar/ux4g-native-avatar.component.d.ts.map +1 -0
  53. package/dist/native/avatar/ux4g-native-avatar.module.d.ts +8 -0
  54. package/dist/native/avatar/ux4g-native-avatar.module.d.ts.map +1 -0
  55. package/dist/native/carousel/README.md +1541 -0
  56. package/dist/native/carousel/fesm2022/ux4g-components-angular-native-carousel.mjs +91 -0
  57. package/dist/native/carousel/fesm2022/ux4g-components-angular-native-carousel.mjs.map +1 -0
  58. package/dist/native/carousel/index.d.ts +6 -0
  59. package/dist/native/carousel/public-api.d.ts +3 -0
  60. package/dist/native/carousel/public-api.d.ts.map +1 -0
  61. package/dist/native/carousel/ux4g-components-angular-native-carousel.d.ts.map +1 -0
  62. package/dist/native/carousel/ux4g-native-carousel.component.d.ts +34 -0
  63. package/dist/native/carousel/ux4g-native-carousel.component.d.ts.map +1 -0
  64. package/dist/native/carousel/ux4g-native-carousel.module.d.ts +8 -0
  65. package/dist/native/carousel/ux4g-native-carousel.module.d.ts.map +1 -0
  66. package/dist/native/chip/README.md +1541 -0
  67. package/dist/native/chip/fesm2022/ux4g-components-angular-native-chip.mjs +99 -0
  68. package/dist/native/chip/fesm2022/ux4g-components-angular-native-chip.mjs.map +1 -0
  69. package/dist/native/chip/index.d.ts +6 -0
  70. package/dist/native/chip/public-api.d.ts +3 -0
  71. package/dist/native/chip/public-api.d.ts.map +1 -0
  72. package/dist/native/chip/ux4g-components-angular-native-chip.d.ts.map +1 -0
  73. package/dist/native/chip/ux4g-native-chip.component.d.ts +34 -0
  74. package/dist/native/chip/ux4g-native-chip.component.d.ts.map +1 -0
  75. package/dist/native/chip/ux4g-native-chip.module.d.ts +8 -0
  76. package/dist/native/chip/ux4g-native-chip.module.d.ts.map +1 -0
  77. package/dist/native/combobox/README.md +1541 -0
  78. package/dist/native/combobox/fesm2022/ux4g-components-angular-native-combobox.mjs +107 -0
  79. package/dist/native/combobox/fesm2022/ux4g-components-angular-native-combobox.mjs.map +1 -0
  80. package/dist/native/combobox/index.d.ts +6 -0
  81. package/dist/native/combobox/public-api.d.ts +3 -0
  82. package/dist/native/combobox/public-api.d.ts.map +1 -0
  83. package/dist/native/combobox/ux4g-components-angular-native-combobox.d.ts.map +1 -0
  84. package/dist/native/combobox/ux4g-native-combobox.component.d.ts +30 -0
  85. package/dist/native/combobox/ux4g-native-combobox.component.d.ts.map +1 -0
  86. package/dist/native/combobox/ux4g-native-combobox.module.d.ts +8 -0
  87. package/dist/native/combobox/ux4g-native-combobox.module.d.ts.map +1 -0
  88. package/dist/native/date-picker/README.md +1541 -0
  89. package/dist/native/date-picker/fesm2022/ux4g-components-angular-native-date-picker.mjs +181 -0
  90. package/dist/native/date-picker/fesm2022/ux4g-components-angular-native-date-picker.mjs.map +1 -0
  91. package/dist/native/date-picker/index.d.ts +6 -0
  92. package/dist/native/date-picker/public-api.d.ts +3 -0
  93. package/dist/native/date-picker/public-api.d.ts.map +1 -0
  94. package/dist/native/date-picker/ux4g-components-angular-native-date-picker.d.ts.map +1 -0
  95. package/dist/native/date-picker/ux4g-native-date-picker.component.d.ts +39 -0
  96. package/dist/native/date-picker/ux4g-native-date-picker.component.d.ts.map +1 -0
  97. package/dist/native/date-picker/ux4g-native-date-picker.module.d.ts +12 -0
  98. package/dist/native/date-picker/ux4g-native-date-picker.module.d.ts.map +1 -0
  99. package/dist/native/drawer/README.md +1541 -0
  100. package/dist/native/drawer/fesm2022/ux4g-components-angular-native-drawer.mjs +159 -0
  101. package/dist/native/drawer/fesm2022/ux4g-components-angular-native-drawer.mjs.map +1 -0
  102. package/dist/native/drawer/index.d.ts +6 -0
  103. package/dist/native/drawer/public-api.d.ts +3 -0
  104. package/dist/native/drawer/public-api.d.ts.map +1 -0
  105. package/dist/native/drawer/ux4g-components-angular-native-drawer.d.ts.map +1 -0
  106. package/dist/native/drawer/ux4g-native-drawer.component.d.ts +37 -0
  107. package/dist/native/drawer/ux4g-native-drawer.component.d.ts.map +1 -0
  108. package/dist/native/drawer/ux4g-native-drawer.module.d.ts +12 -0
  109. package/dist/native/drawer/ux4g-native-drawer.module.d.ts.map +1 -0
  110. package/dist/native/dropdown/README.md +1541 -0
  111. package/dist/native/dropdown/fesm2022/ux4g-components-angular-native-dropdown.mjs +108 -0
  112. package/dist/native/dropdown/fesm2022/ux4g-components-angular-native-dropdown.mjs.map +1 -0
  113. package/dist/native/dropdown/index.d.ts +6 -0
  114. package/dist/native/dropdown/public-api.d.ts +3 -0
  115. package/dist/native/dropdown/public-api.d.ts.map +1 -0
  116. package/dist/native/dropdown/ux4g-components-angular-native-dropdown.d.ts.map +1 -0
  117. package/dist/native/dropdown/ux4g-native-dropdown.component.d.ts +32 -0
  118. package/dist/native/dropdown/ux4g-native-dropdown.component.d.ts.map +1 -0
  119. package/dist/native/dropdown/ux4g-native-dropdown.module.d.ts +8 -0
  120. package/dist/native/dropdown/ux4g-native-dropdown.module.d.ts.map +1 -0
  121. package/dist/native/file-upload/README.md +1541 -0
  122. package/dist/native/file-upload/fesm2022/ux4g-components-angular-native-file-upload.mjs +193 -0
  123. package/dist/native/file-upload/fesm2022/ux4g-components-angular-native-file-upload.mjs.map +1 -0
  124. package/dist/native/file-upload/index.d.ts +6 -0
  125. package/dist/native/file-upload/public-api.d.ts +3 -0
  126. package/dist/native/file-upload/public-api.d.ts.map +1 -0
  127. package/dist/native/file-upload/ux4g-components-angular-native-file-upload.d.ts.map +1 -0
  128. package/dist/native/file-upload/ux4g-native-file-upload.component.d.ts +40 -0
  129. package/dist/native/file-upload/ux4g-native-file-upload.component.d.ts.map +1 -0
  130. package/dist/native/file-upload/ux4g-native-file-upload.module.d.ts +8 -0
  131. package/dist/native/file-upload/ux4g-native-file-upload.module.d.ts.map +1 -0
  132. package/dist/native/modal/README.md +1541 -0
  133. package/dist/native/modal/fesm2022/ux4g-components-angular-native-modal.mjs +219 -0
  134. package/dist/native/modal/fesm2022/ux4g-components-angular-native-modal.mjs.map +1 -0
  135. package/dist/native/modal/index.d.ts +6 -0
  136. package/dist/native/modal/public-api.d.ts +3 -0
  137. package/dist/native/modal/public-api.d.ts.map +1 -0
  138. package/dist/native/modal/ux4g-components-angular-native-modal.d.ts.map +1 -0
  139. package/dist/native/modal/ux4g-native-modal.component.d.ts +42 -0
  140. package/dist/native/modal/ux4g-native-modal.component.d.ts.map +1 -0
  141. package/dist/native/modal/ux4g-native-modal.module.d.ts +12 -0
  142. package/dist/native/modal/ux4g-native-modal.module.d.ts.map +1 -0
  143. package/dist/native/otp/README.md +1541 -0
  144. package/dist/native/otp/fesm2022/ux4g-components-angular-native-otp.mjs +176 -0
  145. package/dist/native/otp/fesm2022/ux4g-components-angular-native-otp.mjs.map +1 -0
  146. package/dist/native/otp/index.d.ts +6 -0
  147. package/dist/native/otp/public-api.d.ts +3 -0
  148. package/dist/native/otp/public-api.d.ts.map +1 -0
  149. package/dist/native/otp/ux4g-components-angular-native-otp.d.ts.map +1 -0
  150. package/dist/native/otp/ux4g-native-otp.component.d.ts +32 -0
  151. package/dist/native/otp/ux4g-native-otp.component.d.ts.map +1 -0
  152. package/dist/native/otp/ux4g-native-otp.module.d.ts +8 -0
  153. package/dist/native/otp/ux4g-native-otp.module.d.ts.map +1 -0
  154. package/dist/native/popover/README.md +1541 -0
  155. package/dist/native/popover/fesm2022/ux4g-components-angular-native-popover.mjs +75 -0
  156. package/dist/native/popover/fesm2022/ux4g-components-angular-native-popover.mjs.map +1 -0
  157. package/dist/native/popover/index.d.ts +6 -0
  158. package/dist/native/popover/public-api.d.ts +3 -0
  159. package/dist/native/popover/public-api.d.ts.map +1 -0
  160. package/dist/native/popover/ux4g-components-angular-native-popover.d.ts.map +1 -0
  161. package/dist/native/popover/ux4g-native-popover.component.d.ts +29 -0
  162. package/dist/native/popover/ux4g-native-popover.component.d.ts.map +1 -0
  163. package/dist/native/popover/ux4g-native-popover.module.d.ts +8 -0
  164. package/dist/native/popover/ux4g-native-popover.module.d.ts.map +1 -0
  165. package/dist/native/progress/README.md +1541 -0
  166. package/dist/native/progress/fesm2022/ux4g-components-angular-native-progress.mjs +79 -0
  167. package/dist/native/progress/fesm2022/ux4g-components-angular-native-progress.mjs.map +1 -0
  168. package/dist/native/progress/index.d.ts +6 -0
  169. package/dist/native/progress/public-api.d.ts +3 -0
  170. package/dist/native/progress/public-api.d.ts.map +1 -0
  171. package/dist/native/progress/ux4g-components-angular-native-progress.d.ts.map +1 -0
  172. package/dist/native/progress/ux4g-native-progress.component.d.ts +29 -0
  173. package/dist/native/progress/ux4g-native-progress.component.d.ts.map +1 -0
  174. package/dist/native/progress/ux4g-native-progress.module.d.ts +8 -0
  175. package/dist/native/progress/ux4g-native-progress.module.d.ts.map +1 -0
  176. package/dist/native/search/README.md +1541 -0
  177. package/dist/native/search/fesm2022/ux4g-components-angular-native-search.mjs +148 -0
  178. package/dist/native/search/fesm2022/ux4g-components-angular-native-search.mjs.map +1 -0
  179. package/dist/native/search/index.d.ts +6 -0
  180. package/dist/native/search/public-api.d.ts +3 -0
  181. package/dist/native/search/public-api.d.ts.map +1 -0
  182. package/dist/native/search/ux4g-components-angular-native-search.d.ts.map +1 -0
  183. package/dist/native/search/ux4g-native-search.component.d.ts +46 -0
  184. package/dist/native/search/ux4g-native-search.component.d.ts.map +1 -0
  185. package/dist/native/search/ux4g-native-search.module.d.ts +8 -0
  186. package/dist/native/search/ux4g-native-search.module.d.ts.map +1 -0
  187. package/dist/native/shared/README.md +1541 -0
  188. package/dist/native/shared/base-native.component.d.ts +38 -0
  189. package/dist/native/shared/base-native.component.d.ts.map +1 -0
  190. package/dist/native/shared/fesm2022/ux4g-components-angular-native-shared.mjs +113 -0
  191. package/dist/native/shared/fesm2022/ux4g-components-angular-native-shared.mjs.map +1 -0
  192. package/dist/native/shared/index.d.ts +6 -0
  193. package/dist/native/shared/public-api.d.ts +3 -0
  194. package/dist/native/shared/public-api.d.ts.map +1 -0
  195. package/dist/native/shared/render-descriptor.d.ts +8 -0
  196. package/dist/native/shared/render-descriptor.d.ts.map +1 -0
  197. package/dist/native/shared/ux4g-components-angular-native-shared.d.ts.map +1 -0
  198. package/dist/native/stepper/README.md +1541 -0
  199. package/dist/native/stepper/fesm2022/ux4g-components-angular-native-stepper.mjs +92 -0
  200. package/dist/native/stepper/fesm2022/ux4g-components-angular-native-stepper.mjs.map +1 -0
  201. package/dist/native/stepper/index.d.ts +6 -0
  202. package/dist/native/stepper/public-api.d.ts +3 -0
  203. package/dist/native/stepper/public-api.d.ts.map +1 -0
  204. package/dist/native/stepper/ux4g-components-angular-native-stepper.d.ts.map +1 -0
  205. package/dist/native/stepper/ux4g-native-stepper.component.d.ts +35 -0
  206. package/dist/native/stepper/ux4g-native-stepper.component.d.ts.map +1 -0
  207. package/dist/native/stepper/ux4g-native-stepper.module.d.ts +8 -0
  208. package/dist/native/stepper/ux4g-native-stepper.module.d.ts.map +1 -0
  209. package/dist/native/table/README.md +1541 -0
  210. package/dist/native/table/fesm2022/ux4g-components-angular-native-table.mjs +91 -0
  211. package/dist/native/table/fesm2022/ux4g-components-angular-native-table.mjs.map +1 -0
  212. package/dist/native/table/index.d.ts +6 -0
  213. package/dist/native/table/public-api.d.ts +3 -0
  214. package/dist/native/table/public-api.d.ts.map +1 -0
  215. package/dist/native/table/ux4g-components-angular-native-table.d.ts.map +1 -0
  216. package/dist/native/table/ux4g-native-table.component.d.ts +32 -0
  217. package/dist/native/table/ux4g-native-table.component.d.ts.map +1 -0
  218. package/dist/native/table/ux4g-native-table.module.d.ts +12 -0
  219. package/dist/native/table/ux4g-native-table.module.d.ts.map +1 -0
  220. package/dist/native/tabs/README.md +1541 -0
  221. package/dist/native/tabs/fesm2022/ux4g-components-angular-native-tabs.mjs +190 -0
  222. package/dist/native/tabs/fesm2022/ux4g-components-angular-native-tabs.mjs.map +1 -0
  223. package/dist/native/tabs/index.d.ts +6 -0
  224. package/dist/native/tabs/public-api.d.ts +3 -0
  225. package/dist/native/tabs/public-api.d.ts.map +1 -0
  226. package/dist/native/tabs/ux4g-components-angular-native-tabs.d.ts.map +1 -0
  227. package/dist/native/tabs/ux4g-native-tabs.component.d.ts +43 -0
  228. package/dist/native/tabs/ux4g-native-tabs.component.d.ts.map +1 -0
  229. package/dist/native/tabs/ux4g-native-tabs.module.d.ts +12 -0
  230. package/dist/native/tabs/ux4g-native-tabs.module.d.ts.map +1 -0
  231. package/dist/native/time-picker/README.md +1541 -0
  232. package/dist/native/time-picker/fesm2022/ux4g-components-angular-native-time-picker.mjs +104 -0
  233. package/dist/native/time-picker/fesm2022/ux4g-components-angular-native-time-picker.mjs.map +1 -0
  234. package/dist/native/time-picker/index.d.ts +6 -0
  235. package/dist/native/time-picker/public-api.d.ts +3 -0
  236. package/dist/native/time-picker/public-api.d.ts.map +1 -0
  237. package/dist/native/time-picker/ux4g-components-angular-native-time-picker.d.ts.map +1 -0
  238. package/dist/native/time-picker/ux4g-native-time-picker.component.d.ts +27 -0
  239. package/dist/native/time-picker/ux4g-native-time-picker.component.d.ts.map +1 -0
  240. package/dist/native/time-picker/ux4g-native-time-picker.module.d.ts +8 -0
  241. package/dist/native/time-picker/ux4g-native-time-picker.module.d.ts.map +1 -0
  242. package/dist/native/tooltip/README.md +1541 -0
  243. package/dist/native/tooltip/fesm2022/ux4g-components-angular-native-tooltip.mjs +80 -0
  244. package/dist/native/tooltip/fesm2022/ux4g-components-angular-native-tooltip.mjs.map +1 -0
  245. package/dist/native/tooltip/index.d.ts +6 -0
  246. package/dist/native/tooltip/public-api.d.ts +3 -0
  247. package/dist/native/tooltip/public-api.d.ts.map +1 -0
  248. package/dist/native/tooltip/ux4g-components-angular-native-tooltip.d.ts.map +1 -0
  249. package/dist/native/tooltip/ux4g-native-tooltip.component.d.ts +31 -0
  250. package/dist/native/tooltip/ux4g-native-tooltip.component.d.ts.map +1 -0
  251. package/dist/native/tooltip/ux4g-native-tooltip.module.d.ts +8 -0
  252. package/dist/native/tooltip/ux4g-native-tooltip.module.d.ts.map +1 -0
  253. package/dist/navbar/README.md +330 -48
  254. package/dist/otp-input/README.md +330 -48
  255. package/dist/pagination/README.md +330 -48
  256. package/dist/popover/README.md +330 -48
  257. package/dist/progress-indicator/README.md +330 -48
  258. package/dist/radio/README.md +330 -48
  259. package/dist/result-list-row/README.md +330 -48
  260. package/dist/search/README.md +330 -48
  261. package/dist/sla-progress-indicator/README.md +330 -48
  262. package/dist/slider/README.md +330 -48
  263. package/dist/slot-grid/README.md +330 -48
  264. package/dist/social-links/README.md +330 -48
  265. package/dist/spinner/README.md +330 -48
  266. package/dist/status-pipeline/README.md +330 -48
  267. package/dist/stepper/README.md +330 -48
  268. package/dist/switch/README.md +330 -48
  269. package/dist/tab/README.md +330 -48
  270. package/dist/table/README.md +330 -48
  271. package/dist/tag/README.md +330 -48
  272. package/dist/tooltip/README.md +330 -48
  273. 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>&copy; 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