ux4g-components-angular 1.1.0 → 1.1.2

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 (62) hide show
  1. package/README.md +1124 -28
  2. package/dist/accessibility-bar/README.md +1124 -28
  3. package/dist/accordion/README.md +1124 -28
  4. package/dist/alert/README.md +1124 -28
  5. package/dist/avatar/README.md +1124 -28
  6. package/dist/badge/README.md +1124 -28
  7. package/dist/breadcrumb/README.md +1124 -28
  8. package/dist/button/README.md +1124 -28
  9. package/dist/card/README.md +1124 -28
  10. package/dist/carousel/README.md +1124 -28
  11. package/dist/checkbox/README.md +1124 -28
  12. package/dist/chip/README.md +1124 -28
  13. package/dist/chip-group/README.md +1124 -28
  14. package/dist/combobox/README.md +1124 -28
  15. package/dist/date-time-picker/README.md +1124 -28
  16. package/dist/divider/README.md +1124 -28
  17. package/dist/draft-status-banner/README.md +1124 -28
  18. package/dist/drawer/README.md +1124 -28
  19. package/dist/dropdown/README.md +1124 -28
  20. package/dist/empty-state/README.md +1124 -28
  21. package/dist/feedback/README.md +1124 -28
  22. package/dist/file-upload/README.md +1183 -0
  23. package/dist/file-upload/fesm2022/ux4g-components-angular-file-upload.mjs +46 -0
  24. package/dist/file-upload/fesm2022/ux4g-components-angular-file-upload.mjs.map +1 -0
  25. package/dist/file-upload/index.d.ts +6 -0
  26. package/dist/file-upload/public-api.d.ts +5 -0
  27. package/dist/file-upload/public-api.d.ts.map +1 -0
  28. package/dist/file-upload/ux4g-components-angular-file-upload.d.ts.map +1 -0
  29. package/dist/file-upload/ux4g-file-upload.component.d.ts +9 -0
  30. package/dist/file-upload/ux4g-file-upload.component.d.ts.map +1 -0
  31. package/dist/file-upload/ux4g-file-upload.module.d.ts +9 -0
  32. package/dist/file-upload/ux4g-file-upload.module.d.ts.map +1 -0
  33. package/dist/footer/README.md +1124 -28
  34. package/dist/form-field-group/README.md +1124 -28
  35. package/dist/icon-button/README.md +1124 -28
  36. package/dist/image/README.md +1124 -28
  37. package/dist/input/README.md +1124 -28
  38. package/dist/journey-timeline/README.md +1124 -28
  39. package/dist/link/README.md +1124 -28
  40. package/dist/list/README.md +1124 -28
  41. package/dist/modal/README.md +1124 -28
  42. package/dist/navbar/README.md +1124 -28
  43. package/dist/otp-input/README.md +1124 -28
  44. package/dist/pagination/README.md +1124 -28
  45. package/dist/popover/README.md +1124 -28
  46. package/dist/progress-indicator/README.md +1124 -28
  47. package/dist/radio/README.md +1124 -28
  48. package/dist/result-list-row/README.md +1124 -28
  49. package/dist/search/README.md +1124 -28
  50. package/dist/sla-progress-indicator/README.md +1124 -28
  51. package/dist/slider/README.md +1124 -28
  52. package/dist/slot-grid/README.md +1124 -28
  53. package/dist/social-links/README.md +1124 -28
  54. package/dist/spinner/README.md +1124 -28
  55. package/dist/status-pipeline/README.md +1124 -28
  56. package/dist/stepper/README.md +1124 -28
  57. package/dist/switch/README.md +1124 -28
  58. package/dist/tab/README.md +1124 -28
  59. package/dist/table/README.md +1124 -28
  60. package/dist/tag/README.md +1124 -28
  61. package/dist/tooltip/README.md +1124 -28
  62. package/package.json +2 -2
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # ux4g-components-angular
2
2
 
3
- Angular wrapper components for the UX4G Design System.
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.
4
6
 
5
7
  ## Installation
6
8
 
@@ -8,74 +10,1168 @@ Angular wrapper components for the UX4G Design System.
8
10
  npm install ux4g-components-angular ux4g-components-web
9
11
  ```
10
12
 
13
+ > **Note:** `ux4g-components-web` is required — it provides the CSS bundle that styles all components.
14
+
11
15
  ## Setup
12
16
 
13
17
  Add the CSS bundle to your `angular.json` styles array:
14
18
 
15
19
  ```json
16
20
  {
17
- "styles": [
18
- "node_modules/ux4g-components-web/styles/ux4g.css",
19
- "src/styles.css"
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
+ }
21
35
  }
22
36
  ```
23
37
 
24
- ## Usage
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
25
50
 
26
51
  ```ts
27
52
  // app.module.ts
28
53
  import { UX4GButtonModule } from 'ux4g-components-angular/button';
29
- import { UX4GSpinnerModule } from 'ux4g-components-angular/spinner';
30
54
 
31
55
  @NgModule({
32
- imports: [UX4GButtonModule, UX4GSpinnerModule],
56
+ imports: [UX4GButtonModule],
33
57
  })
34
58
  export class AppModule {}
35
59
  ```
36
60
 
37
61
  ```html
38
62
  <!-- app.component.html -->
39
- <ux4g-button variant="primary" size="md" (buttonClick)="onSave()">
63
+ <ux4g-button variant="primary" size="md" (clicked)="onSave()">
40
64
  Save
41
65
  </ux4g-button>
42
66
 
43
- <ux4g-spinner variant="primary" size="md" type="full"></ux4g-spinner>
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>
44
82
  ```
45
83
 
46
- ## Available Components (50)
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) |
47
91
 
48
- Each component is available as a sub-path import:
92
+ | Output | Type | Description |
93
+ |---|---|---|
94
+ | `clicked` | `EventEmitter<MouseEvent>` | Emitted on click (suppressed when disabled) |
95
+
96
+ ### Spinner
49
97
 
50
98
  ```ts
51
- import { UX4GButtonModule } from 'ux4g-components-angular/button';
52
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
53
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" [overlay]="true"></ux4g-image>
200
+ ```
201
+
202
+ | Input | Type | Default | Description |
203
+ |---|---|---|---|
204
+ | `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 |
205
+ | `rounded` | `boolean` | `false` | Rounded corners |
206
+ | `overlay` | `boolean` | `false` | Enable overlay |
207
+
208
+ ### Chip
209
+
210
+ ```ts
211
+ import { UX4GChipModule } from 'ux4g-components-angular/chip';
212
+
213
+ @NgModule({ imports: [UX4GChipModule] })
214
+ export class AppModule {}
215
+ ```
216
+
217
+ ```html
218
+ <ux4g-chip chipType="filter" size="md">Category</ux4g-chip>
219
+ <ux4g-chip chipType="choice" size="sm" [active]="true">Selected</ux4g-chip>
220
+ <ux4g-chip chipType="input" size="xs">Tag</ux4g-chip>
221
+ ```
222
+
223
+ | Input | Type | Default | Description |
224
+ |---|---|---|---|
225
+ | `chipType` | `'filter' \| 'choice' \| 'input'` | `'filter'` | Chip type |
226
+ | `size` | `'md' \| 'sm' \| 'xs'` | `'md'` | Chip size (xs only for input) |
227
+ | `active` | `boolean` | `false` | Active/selected state |
228
+
229
+ ### Tag
230
+
231
+ ```ts
232
+ import { UX4GTagModule } from 'ux4g-components-angular/tag';
233
+
234
+ @NgModule({ imports: [UX4GTagModule] })
235
+ export class AppModule {}
236
+ ```
237
+
238
+ ```html
239
+ <ux4g-tag variant="tonal" color="neutral">Default</ux4g-tag>
240
+ <ux4g-tag variant="filled" color="success" [small]="true">Active</ux4g-tag>
241
+ <ux4g-tag variant="outline" color="error">Error</ux4g-tag>
242
+ ```
243
+
244
+ | Input | Type | Default | Description |
245
+ |---|---|---|---|
246
+ | `variant` | `'tonal' \| 'filled' \| 'outline' \| 'text'` | `'tonal'` | Tag style |
247
+ | `color` | `'neutral' \| 'brand' \| 'success' \| 'warning' \| 'error' \| 'info'` | `'neutral'` | Tag color |
248
+ | `small` | `boolean` | `false` | Small size |
249
+
250
+ ### Divider
251
+
252
+ ```ts
253
+ import { UX4GDividerModule } from 'ux4g-components-angular/divider';
254
+
255
+ @NgModule({ imports: [UX4GDividerModule] })
256
+ export class AppModule {}
257
+ ```
258
+
259
+ ```html
260
+ <ux4g-divider orientation="horizontal"></ux4g-divider>
261
+ <ux4g-divider orientation="vertical"></ux4g-divider>
262
+ ```
263
+
264
+ | Input | Type | Default | Description |
265
+ |---|---|---|---|
266
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Divider direction |
267
+
268
+ ### Breadcrumb
269
+
270
+ ```ts
271
+ import { UX4GBreadcrumbModule } from 'ux4g-components-angular/breadcrumb';
272
+
273
+ @NgModule({ imports: [UX4GBreadcrumbModule] })
274
+ export class AppModule {}
275
+ ```
276
+
277
+ ```html
278
+ <ux4g-breadcrumb separator="divider">
279
+ <a href="#">Home</a>
280
+ <a href="#">Products</a>
281
+ <span>Current</span>
282
+ </ux4g-breadcrumb>
283
+ ```
284
+
285
+ | Input | Type | Default | Description |
286
+ |---|---|---|---|
287
+ | `separator` | `'divider' \| 'icon'` | `'divider'` | Separator style |
288
+
289
+ ### Checkbox
290
+
291
+ ```ts
292
+ import { UX4GCheckboxModule } from 'ux4g-components-angular/checkbox';
293
+
294
+ @NgModule({ imports: [UX4GCheckboxModule] })
295
+ export class AppModule {}
296
+ ```
297
+
298
+ ```html
299
+ <ux4g-checkbox size="md" label="Accept terms"></ux4g-checkbox>
300
+ <ux4g-checkbox size="sm" [error]="true" label="Required field"></ux4g-checkbox>
301
+ ```
302
+
303
+ | Input | Type | Default | Description |
304
+ |---|---|---|---|
305
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Checkbox size |
306
+ | `error` | `boolean` | `false` | Error state |
307
+
308
+ ### Radio
309
+
310
+ ```ts
311
+ import { UX4GRadioModule } from 'ux4g-components-angular/radio';
312
+
313
+ @NgModule({ imports: [UX4GRadioModule] })
314
+ export class AppModule {}
315
+ ```
316
+
317
+ ```html
318
+ <ux4g-radio size="md" name="option" label="Option A"></ux4g-radio>
319
+ <ux4g-radio size="lg" name="option" label="Option B" [error]="true"></ux4g-radio>
320
+ ```
321
+
322
+ | Input | Type | Default | Description |
323
+ |---|---|---|---|
324
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Radio size |
325
+ | `error` | `boolean` | `false` | Error state |
326
+
327
+ ### Switch
328
+
329
+ ```ts
330
+ import { UX4GSwitchModule } from 'ux4g-components-angular/switch';
331
+
332
+ @NgModule({ imports: [UX4GSwitchModule] })
333
+ export class AppModule {}
334
+ ```
335
+
336
+ ```html
337
+ <ux4g-switch size="md" label="Enable notifications"></ux4g-switch>
338
+ ```
339
+
340
+ | Input | Type | Default | Description |
341
+ |---|---|---|---|
342
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Switch size |
343
+
344
+ ### Card
345
+
346
+ ```ts
54
347
  import { UX4GCardModule } from 'ux4g-components-angular/card';
55
- // ... and 46 more
348
+
349
+ @NgModule({ imports: [UX4GCardModule] })
350
+ export class AppModule {}
56
351
  ```
57
352
 
58
- 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`, `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`
353
+ ```html
354
+ <ux4g-card variant="solid" layout="vertical">
355
+ <h3>Card Title</h3>
356
+ <p>Card content goes here.</p>
357
+ </ux4g-card>
59
358
 
60
- ## Architecture
359
+ <ux4g-card variant="outline" layout="horizontal">
360
+ <img src="thumb.jpg" alt="" />
361
+ <p>Horizontal card</p>
362
+ </ux4g-card>
363
+ ```
61
364
 
62
- This package follows a CSS-first architecture:
365
+ | Input | Type | Default | Description |
366
+ |---|---|---|---|
367
+ | `variant` | `'solid' \| 'outline' \| 'no-fill'` | `'solid'` | Card style |
368
+ | `layout` | `'vertical' \| 'horizontal'` | `'vertical'` | Card layout |
63
369
 
64
- - **CSS is the source of truth** — all visual decisions live in CSS
65
- - **Wrappers are thin** — they map typed inputs to CSS class strings via `buildXxxClasses()` functions
66
- - **No inline styles, no CSS-in-JS** — only `[class]` bindings
67
- - **No local `types.ts` copies** — all Class_Builder functions are imported from `ux4g-components-web/types`
370
+ ### Input
68
371
 
69
- ## Compatibility
372
+ ```ts
373
+ import { UX4GInputModule } from 'ux4g-components-angular/input';
70
374
 
71
- - Angular >= 15.0.0
72
- - Built with Ivy partial compilation (compatible with Angular 15–19+)
73
- - `typesVersions` included for `moduleResolution: node` compatibility
375
+ @NgModule({ imports: [UX4GInputModule] })
376
+ export class AppModule {}
377
+ ```
74
378
 
75
- ## Peer Dependencies
379
+ ```html
380
+ <ux4g-input size="md" state="default" label="Email" placeholder="Enter email"></ux4g-input>
381
+ <ux4g-input size="lg" state="error" label="Password" helperText="Password is required"></ux4g-input>
382
+ ```
76
383
 
77
- - `@angular/core >= 15.0.0`
78
- - `@angular/common >= 15.0.0`
384
+ | Input | Type | Default | Description |
385
+ |---|---|---|---|
386
+ | `size` | `'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Input size |
387
+ | `state` | `'default' \| 'error' \| 'success' \| 'warning'` | `'default'` | Validation state |
388
+
389
+ ### List
390
+
391
+ ```ts
392
+ import { UX4GListModule } from 'ux4g-components-angular/list';
393
+
394
+ @NgModule({ imports: [UX4GListModule] })
395
+ export class AppModule {}
396
+ ```
397
+
398
+ ```html
399
+ <ux4g-list variant="default" size="m">
400
+ <li>Item one</li>
401
+ <li>Item two</li>
402
+ </ux4g-list>
403
+ ```
404
+
405
+ | Input | Type | Default | Description |
406
+ |---|---|---|---|
407
+ | `variant` | `'default' \| 'error' \| 'success' \| 'warning'` | `'default'` | List style |
408
+ | `size` | `'s' \| 'm' \| 'l' \| 'xl'` | `'m'` | List size |
409
+
410
+ ### Dropdown
411
+
412
+ ```ts
413
+ import { UX4GDropdownModule } from 'ux4g-components-angular/dropdown';
414
+
415
+ @NgModule({ imports: [UX4GDropdownModule] })
416
+ export class AppModule {}
417
+ ```
418
+
419
+ ```html
420
+ <ux4g-dropdown type="selection" mode="single" size="md" state="default">
421
+ <ux4g-dropdown-item value="1">Option 1</ux4g-dropdown-item>
422
+ <ux4g-dropdown-item value="2">Option 2</ux4g-dropdown-item>
423
+ </ux4g-dropdown>
424
+ ```
425
+
426
+ | Input | Type | Default | Description |
427
+ |---|---|---|---|
428
+ | `type` | `'selection' \| 'button' \| 'overflow'` | `'selection'` | Dropdown type |
429
+ | `mode` | `'single' \| 'multi'` | `'single'` | Selection mode |
430
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Dropdown size |
431
+ | `state` | `'default' \| 'error' \| 'success' \| 'warning'` | `'default'` | Validation state |
432
+ | `open` | `boolean` | `false` | Open state |
433
+
434
+ ### Combobox
435
+
436
+ ```ts
437
+ import { UX4GComboboxModule } from 'ux4g-components-angular/combobox';
438
+
439
+ @NgModule({ imports: [UX4GComboboxModule] })
440
+ export class AppModule {}
441
+ ```
442
+
443
+ ```html
444
+ <ux4g-combobox type="single" size="md" state="default" placeholder="Search..."></ux4g-combobox>
445
+ ```
446
+
447
+ | Input | Type | Default | Description |
448
+ |---|---|---|---|
449
+ | `type` | `'single' \| 'multi'` | `'single'` | Combobox type |
450
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Combobox size |
451
+ | `state` | `'default' \| 'error' \| 'success' \| 'warning'` | `'default'` | Validation state |
452
+ | `open` | `boolean` | `false` | Open state |
453
+
454
+ ### Modal
455
+
456
+ ```ts
457
+ import { UX4GModalModule } from 'ux4g-components-angular/modal';
458
+
459
+ @NgModule({ imports: [UX4GModalModule] })
460
+ export class AppModule {}
461
+ ```
462
+
463
+ ```html
464
+ <ux4g-modal size="m" opacity="50" [open]="isOpen" (closed)="isOpen = false">
465
+ <h2>Modal Title</h2>
466
+ <p>Modal content here.</p>
467
+ </ux4g-modal>
468
+ ```
469
+
470
+ | Input | Type | Default | Description |
471
+ |---|---|---|---|
472
+ | `size` | `'s' \| 'm' \| 'l'` | `'m'` | Modal size |
473
+ | `opacity` | `'25' \| '50' \| '75'` | `'50'` | Backdrop opacity |
474
+ | `blur` | `boolean` | `false` | Backdrop blur |
475
+ | `open` | `boolean` | `false` | Open state |
476
+ | `centerContent` | `boolean` | `false` | Center modal content |
477
+
478
+ | Output | Type | Description |
479
+ |---|---|---|
480
+ | `closed` | `EventEmitter<void>` | Emitted when modal is closed |
481
+
482
+ ### Alert / Toast
483
+
484
+ ```ts
485
+ import { UX4GAlertModule } from 'ux4g-components-angular/alert';
486
+
487
+ @NgModule({ imports: [UX4GAlertModule] })
488
+ export class AppModule {}
489
+ ```
490
+
491
+ ```html
492
+ <ux4g-alert variant="info">This is an informational message.</ux4g-alert>
493
+ <ux4g-alert variant="success" layout="wide">Saved successfully!</ux4g-alert>
494
+
495
+ <ux4g-alert-container position="top-right">
496
+ <ux4g-alert variant="success">Toast notification</ux4g-alert>
497
+ </ux4g-alert-container>
498
+ ```
499
+
500
+ | Input | Type | Default | Description |
501
+ |---|---|---|---|
502
+ | `variant` | `'info' \| 'success' \| 'warning' \| 'error'` | `'info'` | Alert type |
503
+ | `layout` | `'fluid' \| 'center' \| 'wide'` | `'fluid'` | Alert layout |
504
+
505
+ **AlertContainer Inputs:**
506
+
507
+ | Input | Type | Default | Description |
508
+ |---|---|---|---|
509
+ | `position` | `'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right'` | `'top-right'` | Container position |
510
+
511
+ ### Search
512
+
513
+ ```ts
514
+ import { UX4GSearchModule } from 'ux4g-components-angular/search';
515
+
516
+ @NgModule({ imports: [UX4GSearchModule] })
517
+ export class AppModule {}
518
+ ```
519
+
520
+ ```html
521
+ <ux4g-search size="m" placeholder="Search..." (searched)="onSearch($event)"></ux4g-search>
522
+ ```
523
+
524
+ | Input | Type | Default | Description |
525
+ |---|---|---|---|
526
+ | `size` | `'s' \| 'm' \| 'lg'` | `'m'` | Search size |
527
+
528
+ | Output | Type | Description |
529
+ |---|---|---|
530
+ | `searched` | `EventEmitter<string>` | Emitted on search submit |
531
+
532
+ ### Pagination
533
+
534
+ ```ts
535
+ import { UX4GPaginationModule } from 'ux4g-components-angular/pagination';
536
+
537
+ @NgModule({ imports: [UX4GPaginationModule] })
538
+ export class AppModule {}
539
+ ```
540
+
541
+ ```html
542
+ <ux4g-pagination variant="default" [totalPages]="10" [currentPage]="1" (pageChanged)="onPage($event)"></ux4g-pagination>
543
+ <ux4g-pagination variant="dotted" paginationStyle="solid" [totalPages]="5" [currentPage]="2"></ux4g-pagination>
544
+ ```
545
+
546
+ | Input | Type | Default | Description |
547
+ |---|---|---|---|
548
+ | `variant` | `'default' \| 'dotted'` | `'default'` | Pagination style |
549
+ | `paginationStyle` | `'default' \| 'solid' \| 'translucent'` | `'default'` | Dotted variant style |
550
+
551
+ | Output | Type | Description |
552
+ |---|---|---|
553
+ | `pageChanged` | `EventEmitter<number>` | Emitted on page change |
554
+
555
+ ### Table
556
+
557
+ ```ts
558
+ import { UX4GTableModule } from 'ux4g-components-angular/table';
559
+
560
+ @NgModule({ imports: [UX4GTableModule] })
561
+ export class AppModule {}
562
+ ```
563
+
564
+ ```html
565
+ <ux4g-table size="m" divider="row" [interactive]="true">
566
+ <thead>
567
+ <tr><th>Name</th><th>Email</th></tr>
568
+ </thead>
569
+ <tbody>
570
+ <tr><td>Alice</td><td>alice@example.com</td></tr>
571
+ </tbody>
572
+ </ux4g-table>
573
+ ```
574
+
575
+ | Input | Type | Default | Description |
576
+ |---|---|---|---|
577
+ | `size` | `'s' \| 'm' \| 'lg'` | `'m'` | Table size |
578
+ | `divider` | `'row' \| 'column' \| 'none'` | `'row'` | Divider style |
579
+ | `zebra` | `'none' \| 'rows' \| 'cols'` | `'none'` | Zebra striping |
580
+ | `interactive` | `boolean` | `false` | Hover highlight |
581
+ | `sortable` | `boolean` | `false` | Sortable columns |
582
+ | `resizable` | `boolean` | `false` | Resizable columns |
583
+ | `headerBrand` | `boolean` | `false` | Brand-colored header |
584
+
585
+ ### Popover
586
+
587
+ ```ts
588
+ import { UX4GPopoverModule } from 'ux4g-components-angular/popover';
589
+
590
+ @NgModule({ imports: [UX4GPopoverModule] })
591
+ export class AppModule {}
592
+ ```
593
+
594
+ ```html
595
+ <ux4g-popover placement="right" title="Popover Title" content="Body text" [show]="showPopover">
596
+ <button>Toggle Popover</button>
597
+ </ux4g-popover>
598
+ ```
599
+
600
+ | Input | Type | Default | Description |
601
+ |---|---|---|---|
602
+ | `placement` | `'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | `'bottom'` | Popover position |
603
+ | `show` | `boolean` | `false` | Visibility |
604
+
605
+ ### Tooltip
606
+
607
+ ```ts
608
+ import { UX4GTooltipModule } from 'ux4g-components-angular/tooltip';
609
+
610
+ @NgModule({ imports: [UX4GTooltipModule] })
611
+ export class AppModule {}
612
+ ```
613
+
614
+ ```html
615
+ <ux4g-tooltip placement="top-center" size="s" content="Tooltip text">
616
+ <button>Hover me</button>
617
+ </ux4g-tooltip>
618
+ ```
619
+
620
+ | Input | Type | Default | Description |
621
+ |---|---|---|---|
622
+ | `placement` | `'top-left' \| 'top-center' \| 'top-right' \| 'bottom-left' \| 'bottom-center' \| 'bottom-right' \| 'left-center' \| 'right-center'` | `'top-center'` | Tooltip position |
623
+ | `size` | `'s' \| 'xs'` | `'s'` | Tooltip size |
624
+
625
+ ### Tab
626
+
627
+ ```ts
628
+ import { UX4GTabModule } from 'ux4g-components-angular/tab';
629
+
630
+ @NgModule({ imports: [UX4GTabModule] })
631
+ export class AppModule {}
632
+ ```
633
+
634
+ ```html
635
+ <ux4g-tab variant="underline" size="md">
636
+ <ux4g-tab-item label="Tab 1" [active]="true">Content 1</ux4g-tab-item>
637
+ <ux4g-tab-item label="Tab 2">Content 2</ux4g-tab-item>
638
+ </ux4g-tab>
639
+ ```
640
+
641
+ | Input | Type | Default | Description |
642
+ |---|---|---|---|
643
+ | `variant` | `'underline' \| 'pill'` | `'underline'` | Tab style |
644
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Tab size |
645
+ | `vertical` | `boolean` | `false` | Vertical layout |
646
+
647
+ ### Icon Button
648
+
649
+ ```ts
650
+ import { UX4GIconButtonModule } from 'ux4g-components-angular/icon-button';
651
+
652
+ @NgModule({ imports: [UX4GIconButtonModule] })
653
+ export class AppModule {}
654
+ ```
655
+
656
+ ```html
657
+ <ux4g-icon-button variant="primary" size="md" aria-label="Edit">
658
+ <i class="ux4g-icon-edit"></i>
659
+ </ux4g-icon-button>
660
+
661
+ <ux4g-icon-button variant="tonal-primary" size="lg" [pill]="true" aria-label="Add">
662
+ <i class="ux4g-icon-plus"></i>
663
+ </ux4g-icon-button>
664
+ ```
665
+
666
+ | Input | Type | Default | Description |
667
+ |---|---|---|---|
668
+ | `variant` | `'primary' \| 'outline-primary' \| 'tonal-primary' \| 'text-primary'` | `'primary'` | Button style |
669
+ | `size` | `'xl' \| 'lg' \| 'md' \| 'sm' \| 'xs'` | `'md'` | Button size |
670
+ | `pill` | `boolean` | `false` | Pill shape |
671
+
672
+ ### Accessibility Bar
673
+
674
+ ```ts
675
+ import { UX4GAccessibilityBarModule } from 'ux4g-components-angular/accessibility-bar';
676
+
677
+ @NgModule({ imports: [UX4GAccessibilityBarModule] })
678
+ export class AppModule {}
679
+ ```
680
+
681
+ ```html
682
+ <ux4g-accessibility-bar>
683
+ <a href="#main-content">Skip to main content</a>
684
+ </ux4g-accessibility-bar>
685
+ ```
686
+
687
+ ### Accordion
688
+
689
+ ```ts
690
+ import { UX4GAccordionModule } from 'ux4g-components-angular/accordion';
691
+
692
+ @NgModule({ imports: [UX4GAccordionModule] })
693
+ export class AppModule {}
694
+ ```
695
+
696
+ ```html
697
+ <ux4g-accordion arrowPosition="right" variant="default">
698
+ <ux4g-accordion-item title="Section 1">Content 1</ux4g-accordion-item>
699
+ <ux4g-accordion-item title="Section 2">Content 2</ux4g-accordion-item>
700
+ </ux4g-accordion>
701
+ ```
702
+
703
+ | Input | Type | Default | Description |
704
+ |---|---|---|---|
705
+ | `arrowPosition` | `'right' \| 'left'` | `'right'` | Arrow icon position |
706
+ | `variant` | `'default' \| 'bordered'` | `'default'` | Accordion style |
707
+
708
+ ### Stepper
709
+
710
+ ```ts
711
+ import { UX4GStepperModule } from 'ux4g-components-angular/stepper';
712
+
713
+ @NgModule({ imports: [UX4GStepperModule] })
714
+ export class AppModule {}
715
+ ```
716
+
717
+ ```html
718
+ <ux4g-stepper orientation="horizontal" alignment="center">
719
+ <ux4g-stepper-step status="completed">Step 1</ux4g-stepper-step>
720
+ <ux4g-stepper-step status="active">Step 2</ux4g-stepper-step>
721
+ <ux4g-stepper-step>Step 3</ux4g-stepper-step>
722
+ </ux4g-stepper>
723
+ ```
724
+
725
+ | Input | Type | Default | Description |
726
+ |---|---|---|---|
727
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Layout direction |
728
+ | `alignment` | `'default' \| 'center' \| 'left'` | `'default'` | Horizontal alignment |
729
+ | `variant` | `'default' \| 'bottom-line' \| 'bottom-line-fill' \| 'mobile' \| 'progress'` | `'default'` | Stepper style |
730
+ | `size` | `'default' \| 's'` | `'default'` | Stepper size |
731
+
732
+ ### Slider
733
+
734
+ ```ts
735
+ import { UX4GSliderModule } from 'ux4g-components-angular/slider';
736
+
737
+ @NgModule({ imports: [UX4GSliderModule] })
738
+ export class AppModule {}
739
+ ```
740
+
741
+ ```html
742
+ <ux4g-slider size="sm" [min]="0" [max]="100" [value]="50"></ux4g-slider>
743
+ <ux4g-slider size="md" [min]="0" [max]="100" [value]="75"></ux4g-slider>
744
+ ```
745
+
746
+ | Input | Type | Default | Description |
747
+ |---|---|---|---|
748
+ | `size` | `'sm' \| 'md'` | `'sm'` | Slider size |
749
+
750
+ ### Drawer
751
+
752
+ ```ts
753
+ import { UX4GDrawerModule } from 'ux4g-components-angular/drawer';
754
+
755
+ @NgModule({ imports: [UX4GDrawerModule] })
756
+ export class AppModule {}
757
+ ```
758
+
759
+ ```html
760
+ <ux4g-drawer placement="right" [open]="isOpen" (closed)="isOpen = false">
761
+ <h3>Drawer Title</h3>
762
+ <p>Drawer content</p>
763
+ </ux4g-drawer>
764
+ ```
765
+
766
+ | Input | Type | Default | Description |
767
+ |---|---|---|---|
768
+ | `placement` | `'right' \| 'left' \| 'top' \| 'bottom'` | `'right'` | Slide-in direction |
769
+ | `open` | `boolean` | `false` | Open state |
770
+
771
+ | Output | Type | Description |
772
+ |---|---|---|
773
+ | `closed` | `EventEmitter<void>` | Emitted when drawer is closed |
774
+
775
+ ### Date-Time Picker
776
+
777
+ ```ts
778
+ import { UX4GDateTimePickerModule } from 'ux4g-components-angular/date-time-picker';
779
+
780
+ @NgModule({ imports: [UX4GDateTimePickerModule] })
781
+ export class AppModule {}
782
+ ```
783
+
784
+ ```html
785
+ <ux4g-date-time-picker mode="date"></ux4g-date-time-picker>
786
+ <ux4g-date-time-picker mode="time"></ux4g-date-time-picker>
787
+ ```
788
+
789
+ | Input | Type | Default | Description |
790
+ |---|---|---|---|
791
+ | `mode` | `'date' \| 'time'` | `'date'` | Picker mode |
792
+
793
+ ### Status Pipeline
794
+
795
+ ```ts
796
+ import { UX4GStatusPipelineModule } from 'ux4g-components-angular/status-pipeline';
797
+
798
+ @NgModule({ imports: [UX4GStatusPipelineModule] })
799
+ export class AppModule {}
800
+ ```
801
+
802
+ ```html
803
+ <ux4g-status-pipeline orientation="horizontal" alignment="center">
804
+ <ux4g-status-pipeline-step status="completed">Submitted</ux4g-status-pipeline-step>
805
+ <ux4g-status-pipeline-step status="active">In Review</ux4g-status-pipeline-step>
806
+ <ux4g-status-pipeline-step>Approved</ux4g-status-pipeline-step>
807
+ </ux4g-status-pipeline>
808
+ ```
809
+
810
+ | Input | Type | Default | Description |
811
+ |---|---|---|---|
812
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Layout direction |
813
+ | `alignment` | `'default' \| 'center' \| 'left'` | `'default'` | Horizontal alignment |
814
+ | `variant` | `'default' \| 'bottom-line' \| 'bottom-line-fill' \| 'mobile' \| 'progress'` | `'default'` | Pipeline style |
815
+ | `size` | `'default' \| 's'` | `'default'` | Pipeline size |
816
+
817
+ ### Journey Timeline
818
+
819
+ ```ts
820
+ import { UX4GJourneyTimelineModule } from 'ux4g-components-angular/journey-timeline';
821
+
822
+ @NgModule({ imports: [UX4GJourneyTimelineModule] })
823
+ export class AppModule {}
824
+ ```
825
+
826
+ ```html
827
+ <ux4g-journey-timeline orientation="vertical">
828
+ <ux4g-journey-timeline-item>Event 1</ux4g-journey-timeline-item>
829
+ <ux4g-journey-timeline-item>Event 2</ux4g-journey-timeline-item>
830
+ </ux4g-journey-timeline>
831
+ ```
832
+
833
+ | Input | Type | Default | Description |
834
+ |---|---|---|---|
835
+ | `orientation` | `'vertical' \| 'horizontal'` | `'vertical'` | Timeline direction |
836
+
837
+ ### Form Field Group
838
+
839
+ ```ts
840
+ import { UX4GFormFieldGroupModule } from 'ux4g-components-angular/form-field-group';
841
+
842
+ @NgModule({ imports: [UX4GFormFieldGroupModule] })
843
+ export class AppModule {}
844
+ ```
845
+
846
+ ```html
847
+ <ux4g-form-field-group>
848
+ <label>Full Name</label>
849
+ <input type="text" />
850
+ <span>Enter your full legal name</span>
851
+ </ux4g-form-field-group>
852
+ ```
853
+
854
+ ### OTP Input
855
+
856
+ ```ts
857
+ import { UX4GOtpInputModule } from 'ux4g-components-angular/otp-input';
858
+
859
+ @NgModule({ imports: [UX4GOtpInputModule] })
860
+ export class AppModule {}
861
+ ```
862
+
863
+ ```html
864
+ <ux4g-otp-input [length]="4" state="default"></ux4g-otp-input>
865
+ <ux4g-otp-input [length]="6" state="error"></ux4g-otp-input>
866
+ ```
867
+
868
+ | Input | Type | Default | Description |
869
+ |---|---|---|---|
870
+ | `state` | `'default' \| 'success' \| 'error' \| 'locked'` | `'default'` | Input state |
871
+
872
+ ### File Upload
873
+
874
+ ```ts
875
+ import { UX4GFileUploadModule } from 'ux4g-components-angular/file-upload';
876
+
877
+ @NgModule({ imports: [UX4GFileUploadModule] })
878
+ export class AppModule {}
879
+ ```
880
+
881
+ ```html
882
+ <ux4g-file-upload state="default"></ux4g-file-upload>
883
+ <ux4g-file-upload state="uploaded" fileName="document.pdf"></ux4g-file-upload>
884
+ ```
885
+
886
+ | Input | Type | Default | Description |
887
+ |---|---|---|---|
888
+ | `state` | `'default' \| 'default-vle' \| 'selecting' \| 'scanning' \| 'uploaded' \| 'uploaded-vle' \| 'error'` | `'default'` | Upload state |
889
+
890
+ ### Progress Indicator
891
+
892
+ ```ts
893
+ import { UX4GProgressIndicatorModule } from 'ux4g-components-angular/progress-indicator';
894
+
895
+ @NgModule({ imports: [UX4GProgressIndicatorModule] })
896
+ export class AppModule {}
897
+ ```
898
+
899
+ ```html
900
+ <ux4g-progress-indicator type="bar" [value]="60"></ux4g-progress-indicator>
901
+ <ux4g-progress-indicator type="circle" [value]="75" size="l"></ux4g-progress-indicator>
902
+ ```
903
+
904
+ | Input | Type | Default | Description |
905
+ |---|---|---|---|
906
+ | `type` | `'bar' \| 'circle'` | `'bar'` | Indicator type |
907
+ | `size` | `'xs' \| 's' \| 'm' \| 'l' \| 'xl' \| '2xl' \| '3xl'` | `'m'` | Circle size |
908
+
909
+ ### Feedback
910
+
911
+ ```ts
912
+ import { UX4GFeedbackModule } from 'ux4g-components-angular/feedback';
913
+
914
+ @NgModule({ imports: [UX4GFeedbackModule] })
915
+ export class AppModule {}
916
+ ```
917
+
918
+ ```html
919
+ <ux4g-feedback>
920
+ <p>Was this helpful?</p>
921
+ <button>Yes</button>
922
+ <button>No</button>
923
+ </ux4g-feedback>
924
+ ```
925
+
926
+ ### Draft Status Banner
927
+
928
+ ```ts
929
+ import { UX4GDraftStatusBannerModule } from 'ux4g-components-angular/draft-status-banner';
930
+
931
+ @NgModule({ imports: [UX4GDraftStatusBannerModule] })
932
+ export class AppModule {}
933
+ ```
934
+
935
+ ```html
936
+ <ux4g-draft-status-banner variant="default">Draft saved</ux4g-draft-status-banner>
937
+ <ux4g-draft-status-banner variant="auto">Auto-saving...</ux4g-draft-status-banner>
938
+ <ux4g-draft-status-banner variant="success">Published</ux4g-draft-status-banner>
939
+ ```
940
+
941
+ | Input | Type | Default | Description |
942
+ |---|---|---|---|
943
+ | `variant` | `'default' \| 'auto' \| 'success'` | `'default'` | Banner style |
944
+
945
+ ### SLA Progress Indicator
946
+
947
+ ```ts
948
+ import { UX4GSlaProgressIndicatorModule } from 'ux4g-components-angular/sla-progress-indicator';
949
+
950
+ @NgModule({ imports: [UX4GSlaProgressIndicatorModule] })
951
+ export class AppModule {}
952
+ ```
953
+
954
+ ```html
955
+ <ux4g-sla-progress-indicator type="circle" [value]="75"></ux4g-sla-progress-indicator>
956
+ <ux4g-sla-progress-indicator type="linear" [value]="50"></ux4g-sla-progress-indicator>
957
+ <ux4g-sla-progress-indicator type="badge">On Track</ux4g-sla-progress-indicator>
958
+ ```
959
+
960
+ | Input | Type | Default | Description |
961
+ |---|---|---|---|
962
+ | `type` | `'circle' \| 'linear' \| 'badge'` | `'circle'` | Indicator type |
963
+
964
+ ### Carousel
965
+
966
+ ```ts
967
+ import { UX4GCarouselModule } from 'ux4g-components-angular/carousel';
968
+
969
+ @NgModule({ imports: [UX4GCarouselModule] })
970
+ export class AppModule {}
971
+ ```
972
+
973
+ ```html
974
+ <ux4g-carousel>
975
+ <ux4g-carousel-item>Slide 1</ux4g-carousel-item>
976
+ <ux4g-carousel-item>Slide 2</ux4g-carousel-item>
977
+ <ux4g-carousel-item>Slide 3</ux4g-carousel-item>
978
+ </ux4g-carousel>
979
+ ```
980
+
981
+ ### Empty State
982
+
983
+ ```ts
984
+ import { UX4GEmptyStateModule } from 'ux4g-components-angular/empty-state';
985
+
986
+ @NgModule({ imports: [UX4GEmptyStateModule] })
987
+ export class AppModule {}
988
+ ```
989
+
990
+ ```html
991
+ <ux4g-empty-state>
992
+ <img src="empty.svg" alt="" />
993
+ <h3>No results found</h3>
994
+ <p>Try adjusting your search.</p>
995
+ </ux4g-empty-state>
996
+ ```
997
+
998
+ ### Chip Group
999
+
1000
+ ```ts
1001
+ import { UX4GChipGroupModule } from 'ux4g-components-angular/chip-group';
1002
+
1003
+ @NgModule({ imports: [UX4GChipGroupModule] })
1004
+ export class AppModule {}
1005
+ ```
1006
+
1007
+ ```html
1008
+ <ux4g-chip-group variant="filter">
1009
+ <ux4g-chip chipType="filter" size="md" [active]="true">All</ux4g-chip>
1010
+ <ux4g-chip chipType="filter" size="md">Category A</ux4g-chip>
1011
+ </ux4g-chip-group>
1012
+ ```
1013
+
1014
+ | Input | Type | Default | Description |
1015
+ |---|---|---|---|
1016
+ | `variant` | `'filter' \| 'choice'` | `'filter'` | Group type |
1017
+
1018
+ ### Navbar
1019
+
1020
+ ```ts
1021
+ import { UX4GNavbarModule } from 'ux4g-components-angular/navbar';
1022
+
1023
+ @NgModule({ imports: [UX4GNavbarModule] })
1024
+ export class AppModule {}
1025
+ ```
1026
+
1027
+ ```html
1028
+ <ux4g-navbar>
1029
+ <a href="/">Logo</a>
1030
+ <nav>
1031
+ <a href="#">Home</a>
1032
+ <a href="#">About</a>
1033
+ </nav>
1034
+ </ux4g-navbar>
1035
+ ```
1036
+
1037
+ ### Social Links
1038
+
1039
+ ```ts
1040
+ import { UX4GSocialLinksModule } from 'ux4g-components-angular/social-links';
1041
+
1042
+ @NgModule({ imports: [UX4GSocialLinksModule] })
1043
+ export class AppModule {}
1044
+ ```
1045
+
1046
+ ```html
1047
+ <ux4g-social-links size="md">
1048
+ <a href="#" aria-label="Twitter"><i class="ux4g-icon-twitter"></i></a>
1049
+ <a href="#" aria-label="LinkedIn"><i class="ux4g-icon-linkedin"></i></a>
1050
+ </ux4g-social-links>
1051
+ ```
1052
+
1053
+ | Input | Type | Default | Description |
1054
+ |---|---|---|---|
1055
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Icon spacing size |
1056
+
1057
+ ### Slot Grid
1058
+
1059
+ ```ts
1060
+ import { UX4GSlotGridModule } from 'ux4g-components-angular/slot-grid';
1061
+
1062
+ @NgModule({ imports: [UX4GSlotGridModule] })
1063
+ export class AppModule {}
1064
+ ```
1065
+
1066
+ ```html
1067
+ <ux4g-slot-grid variant="weekly">
1068
+ <div>9:00 AM</div>
1069
+ <div>10:00 AM</div>
1070
+ </ux4g-slot-grid>
1071
+
1072
+ <ux4g-slot-grid variant="compact">
1073
+ <div>9:00</div>
1074
+ <div>9:30</div>
1075
+ </ux4g-slot-grid>
1076
+ ```
1077
+
1078
+ | Input | Type | Default | Description |
1079
+ |---|---|---|---|
1080
+ | `variant` | `'weekly' \| 'compact'` | `'weekly'` | Grid layout |
1081
+
1082
+ ### Footer
1083
+
1084
+ ```ts
1085
+ import { UX4GFooterModule } from 'ux4g-components-angular/footer';
1086
+
1087
+ @NgModule({ imports: [UX4GFooterModule] })
1088
+ export class AppModule {}
1089
+ ```
1090
+
1091
+ ```html
1092
+ <ux4g-footer theme="primary">
1093
+ <p>&copy; 2024 Company Name</p>
1094
+ </ux4g-footer>
1095
+ ```
1096
+
1097
+ | Input | Type | Default | Description |
1098
+ |---|---|---|---|
1099
+ | `theme` | `'default' \| 'primary' \| 'dark'` | `'default'` | Footer theme |
1100
+
1101
+ ### Result List Row
1102
+
1103
+ ```ts
1104
+ import { UX4GResultListRowModule } from 'ux4g-components-angular/result-list-row';
1105
+
1106
+ @NgModule({ imports: [UX4GResultListRowModule] })
1107
+ export class AppModule {}
1108
+ ```
1109
+
1110
+ ```html
1111
+ <ux4g-result-list-row variation="default">
1112
+ <h4>Result Title</h4>
1113
+ <p>Description</p>
1114
+ </ux4g-result-list-row>
1115
+ ```
1116
+
1117
+ | Input | Type | Default | Description |
1118
+ |---|---|---|---|
1119
+ | `variation` | `'default' \| 'v1' \| 'v2' \| 'v3' \| 'v4' \| 'v5'` | `'default'` | Row layout variation |
1120
+
1121
+ ---
1122
+
1123
+ ## Dark Theme
1124
+
1125
+ Apply the dark theme by adding `data-theme="dark"` to any container or the `<html>` element:
1126
+
1127
+ ```html
1128
+ <!-- In index.html -->
1129
+ <html data-theme="dark">
1130
+
1131
+ <!-- Or scoped to a section in a template -->
1132
+ <div data-theme="dark">
1133
+ <ux4g-button variant="primary" size="md">Dark themed</ux4g-button>
1134
+ </div>
1135
+ ```
1136
+
1137
+ Design tokens automatically switch values — no additional imports needed.
1138
+
1139
+ ---
1140
+
1141
+ ## Architecture
1142
+
1143
+ This package follows a CSS-first architecture:
1144
+
1145
+ - **CSS is the source of truth** — all visual decisions live in CSS from `ux4g-components-web`
1146
+ - **Wrappers are thin** — they map typed inputs to CSS class strings via `buildXxxClasses()` functions
1147
+ - **No inline styles, no CSS-in-JS** — only `[class]` bindings
1148
+ - **Class_Builder functions** are imported from `ux4g-components-web/types`
1149
+ - **Runtime auto-bootstrap** — interactive behaviors initialize automatically
1150
+
1151
+ ---
1152
+
1153
+ ## Compatibility
1154
+
1155
+ - Angular >= 15.0.0
1156
+ - Built with Ivy partial compilation (compatible with Angular 15–19+)
1157
+ - `typesVersions` included for `moduleResolution: node` compatibility
1158
+
1159
+ ---
1160
+
1161
+ ## Available Components (50)
1162
+
1163
+ All components are available as sub-path imports:
1164
+
1165
+ ```ts
1166
+ import { UX4GButtonModule } from 'ux4g-components-angular/button';
1167
+ import { UX4GSpinnerModule } from 'ux4g-components-angular/spinner';
1168
+ import { UX4GBadgeModule } from 'ux4g-components-angular/badge';
1169
+ // ... etc.
1170
+ ```
1171
+
1172
+ 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`, `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`
1173
+
1174
+ ---
79
1175
 
80
1176
  ## Related Packages
81
1177