@joanroucoux/cairn-ui 0.10.1 → 0.11.1

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 (51) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/fesm2022/joanroucoux-cairn-ui-action-bar.mjs +3 -3
  3. package/fesm2022/joanroucoux-cairn-ui-alert.mjs +3 -3
  4. package/fesm2022/joanroucoux-cairn-ui-amount.mjs +3 -3
  5. package/fesm2022/joanroucoux-cairn-ui-async.mjs +85 -81
  6. package/fesm2022/joanroucoux-cairn-ui-async.mjs.map +1 -1
  7. package/fesm2022/joanroucoux-cairn-ui-avatar.mjs +6 -6
  8. package/fesm2022/joanroucoux-cairn-ui-back-link.mjs +3 -3
  9. package/fesm2022/joanroucoux-cairn-ui-badge.mjs +3 -3
  10. package/fesm2022/joanroucoux-cairn-ui-button.mjs +3 -3
  11. package/fesm2022/joanroucoux-cairn-ui-card.mjs +3 -3
  12. package/fesm2022/joanroucoux-cairn-ui-choice-chips.mjs +3 -3
  13. package/fesm2022/joanroucoux-cairn-ui-delta.mjs +3 -3
  14. package/fesm2022/joanroucoux-cairn-ui-dialog.mjs +3 -3
  15. package/fesm2022/joanroucoux-cairn-ui-donut.mjs +3 -3
  16. package/fesm2022/joanroucoux-cairn-ui-drawer.mjs +3 -3
  17. package/fesm2022/joanroucoux-cairn-ui-empty.mjs +3 -3
  18. package/fesm2022/joanroucoux-cairn-ui-external-link.mjs +3 -3
  19. package/fesm2022/joanroucoux-cairn-ui-external-link.mjs.map +1 -1
  20. package/fesm2022/joanroucoux-cairn-ui-fact.mjs +6 -6
  21. package/fesm2022/joanroucoux-cairn-ui-field.mjs +9 -9
  22. package/fesm2022/joanroucoux-cairn-ui-filter-chips.mjs +3 -3
  23. package/fesm2022/joanroucoux-cairn-ui-group-header.mjs +3 -3
  24. package/fesm2022/joanroucoux-cairn-ui-icon-toggle.mjs +3 -3
  25. package/fesm2022/joanroucoux-cairn-ui-input.mjs +6 -6
  26. package/fesm2022/joanroucoux-cairn-ui-input.mjs.map +1 -1
  27. package/fesm2022/joanroucoux-cairn-ui-line-chart.mjs +3 -3
  28. package/fesm2022/joanroucoux-cairn-ui-menu.mjs +13 -12
  29. package/fesm2022/joanroucoux-cairn-ui-menu.mjs.map +1 -1
  30. package/fesm2022/joanroucoux-cairn-ui-meter.mjs +3 -3
  31. package/fesm2022/joanroucoux-cairn-ui-motion.mjs +12 -12
  32. package/fesm2022/joanroucoux-cairn-ui-nav-item.mjs +3 -3
  33. package/fesm2022/joanroucoux-cairn-ui-result-group.mjs +3 -3
  34. package/fesm2022/joanroucoux-cairn-ui-row.mjs +15 -15
  35. package/fesm2022/joanroucoux-cairn-ui-segmented.mjs +3 -3
  36. package/fesm2022/joanroucoux-cairn-ui-select-pill.mjs +3 -3
  37. package/fesm2022/joanroucoux-cairn-ui-select.mjs +3 -3
  38. package/fesm2022/joanroucoux-cairn-ui-skeleton.mjs +3 -3
  39. package/fesm2022/joanroucoux-cairn-ui-stale-link.mjs +3 -3
  40. package/fesm2022/joanroucoux-cairn-ui-stat.mjs +3 -3
  41. package/fesm2022/joanroucoux-cairn-ui-switch.mjs +3 -3
  42. package/fesm2022/joanroucoux-cairn-ui-tab-bar.mjs +6 -6
  43. package/fesm2022/joanroucoux-cairn-ui-table.mjs +27 -27
  44. package/fesm2022/joanroucoux-cairn-ui-toast.mjs +6 -6
  45. package/mcp-manifest.json +1 -1
  46. package/package.json +1 -1
  47. package/styles/theme.css +4 -0
  48. package/styles/tokens.css +0 -4
  49. package/types/joanroucoux-cairn-ui-async.d.ts +4 -2
  50. package/types/joanroucoux-cairn-ui-external-link.d.ts +1 -1
  51. package/types/joanroucoux-cairn-ui-input.d.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.11.1
4
+
5
+ ### Fixed
6
+
7
+ - `ui-menu` keeps its 8px margin from the edge of the page, not from the window, so a classic scrollbar no longer covers part of it near the right edge.
8
+
9
+ ## 0.11.0
10
+
11
+ ### Changed
12
+
13
+ - `styles/theme.css` sets `scrollbar-gutter: stable` on `html`, so a classic scrollbar appearing when content arrives no longer shifts the layout.
14
+ - `ui-async` reserves the skeleton's space while waiting: during the first 150 ms of a load the `[asyncLoading]` content is laid out but invisible and hidden from assistive technology.
15
+
16
+ ### Removed
17
+
18
+ - The unused `--secondary`, `--secondary-foreground`, `--accent` and `--accent-foreground` tokens from `styles/tokens.css`.
19
+
3
20
  ## 0.10.1
4
21
 
5
22
  ### Added
@@ -20,7 +20,7 @@ var UiActionBar = class UiActionBar {
20
20
  }
21
21
  static ɵfac = i0.ɵɵngDeclareFactory({
22
22
  minVersion: "12.0.0",
23
- version: "22.2.1",
23
+ version: "22.2.2",
24
24
  ngImport: i0,
25
25
  type: UiActionBar,
26
26
  deps: [],
@@ -28,7 +28,7 @@ var UiActionBar = class UiActionBar {
28
28
  });
29
29
  static ɵcmp = i0.ɵɵngDeclareComponent({
30
30
  minVersion: "14.0.0",
31
- version: "22.2.1",
31
+ version: "22.2.2",
32
32
  type: UiActionBar,
33
33
  isStandalone: true,
34
34
  selector: "ui-action-bar",
@@ -40,7 +40,7 @@ var UiActionBar = class UiActionBar {
40
40
  };
41
41
  i0.ɵɵngDeclareClassMetadata({
42
42
  minVersion: "12.0.0",
43
- version: "22.2.1",
43
+ version: "22.2.2",
44
44
  ngImport: i0,
45
45
  type: UiActionBar,
46
46
  decorators: [{
@@ -27,7 +27,7 @@ var UiAlert = class UiAlert {
27
27
  classes = computed(() => `${BASE_CLASSES} ${VARIANT_CLASSES[this.variant()]}${this.fadeIn() ? " ui-enter-fade" : ""}`, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
28
28
  static ɵfac = i0.ɵɵngDeclareFactory({
29
29
  minVersion: "12.0.0",
30
- version: "22.2.1",
30
+ version: "22.2.2",
31
31
  ngImport: i0,
32
32
  type: UiAlert,
33
33
  deps: [],
@@ -35,7 +35,7 @@ var UiAlert = class UiAlert {
35
35
  });
36
36
  static ɵcmp = i0.ɵɵngDeclareComponent({
37
37
  minVersion: "17.0.0",
38
- version: "22.2.1",
38
+ version: "22.2.2",
39
39
  type: UiAlert,
40
40
  isStandalone: true,
41
41
  selector: "ui-alert",
@@ -133,7 +133,7 @@ var UiAlert = class UiAlert {
133
133
  };
134
134
  i0.ɵɵngDeclareClassMetadata({
135
135
  minVersion: "12.0.0",
136
- version: "22.2.1",
136
+ version: "22.2.2",
137
137
  ngImport: i0,
138
138
  type: UiAlert,
139
139
  decorators: [{
@@ -72,7 +72,7 @@ var UiAmount = class UiAmount {
72
72
  }, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
73
73
  static ɵfac = i0.ɵɵngDeclareFactory({
74
74
  minVersion: "12.0.0",
75
- version: "22.2.1",
75
+ version: "22.2.2",
76
76
  ngImport: i0,
77
77
  type: UiAmount,
78
78
  deps: [],
@@ -80,7 +80,7 @@ var UiAmount = class UiAmount {
80
80
  });
81
81
  static ɵcmp = i0.ɵɵngDeclareComponent({
82
82
  minVersion: "17.1.0",
83
- version: "22.2.1",
83
+ version: "22.2.2",
84
84
  type: UiAmount,
85
85
  isStandalone: true,
86
86
  selector: "ui-amount",
@@ -146,7 +146,7 @@ var UiAmount = class UiAmount {
146
146
  };
147
147
  i0.ɵɵngDeclareClassMetadata({
148
148
  minVersion: "12.0.0",
149
- version: "22.2.1",
149
+ version: "22.2.2",
150
150
  ngImport: i0,
151
151
  type: UiAmount,
152
152
  decorators: [{
@@ -178,7 +178,7 @@ var UiAsync = class UiAsync {
178
178
  }
179
179
  static ɵfac = i0.ɵɵngDeclareFactory({
180
180
  minVersion: "12.0.0",
181
- version: "22.2.1",
181
+ version: "22.2.2",
182
182
  ngImport: i0,
183
183
  type: UiAsync,
184
184
  deps: [],
@@ -186,7 +186,7 @@ var UiAsync = class UiAsync {
186
186
  });
187
187
  static ɵcmp = i0.ɵɵngDeclareComponent({
188
188
  minVersion: "17.0.0",
189
- version: "22.2.1",
189
+ version: "22.2.2",
190
190
  type: UiAsync,
191
191
  isStandalone: true,
192
192
  selector: "ui-async",
@@ -263,48 +263,50 @@ var UiAsync = class UiAsync {
263
263
  } },
264
264
  ngImport: i0,
265
265
  template: `
266
- @switch (shown()) {
267
- @case (null) {}
268
- @case ('loading') {
266
+ @if (shown() === null || shown() === 'loading') {
267
+ <div class="contents" [attr.aria-hidden]="shown() === null ? 'true' : null" [class.invisible]="shown() === null">
269
268
  <ng-content select="[asyncLoading]" />
270
- }
271
- @case ('error') {
272
- <div aria-live="polite" role="alert" [class]="boxClasses()">
273
- @if (variant() === 'inline') {
274
- <span class="text-label text-(--muted-foreground)">{{ errorMessage() }}</span>
275
- } @else {
276
- @if (variant() === 'emphasis') {
277
- <h2 [class]="titleClasses()">{{ errorTitle() }}</h2>
269
+ </div>
270
+ } @else {
271
+ @switch (shown()) {
272
+ @case ('error') {
273
+ <div aria-live="polite" role="alert" [class]="boxClasses()">
274
+ @if (variant() === 'inline') {
275
+ <span class="text-label text-(--muted-foreground)">{{ errorMessage() }}</span>
278
276
  } @else {
279
- <span [class]="titleClasses()">{{ errorTitle() }}</span>
280
- }
281
- <span class="text-(--muted-foreground)" [class]="messageClasses()">{{ errorMessage() }}</span>
282
- }
283
- <button type="button" [class]="retryButtonClasses()" (click)="retry.emit()">
284
- @if (retryIcon() || variant() !== 'inline') {
285
- <svg
286
- aria-hidden="true"
287
- class="block flex-none fill-none stroke-current"
288
- stroke-linecap="round"
289
- stroke-linejoin="round"
290
- stroke-width="1.75"
291
- viewBox="0 0 24 24"
292
- [attr.height]="iconSize()"
293
- [attr.width]="iconSize()"
294
- >
295
- <path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" />
296
- <path d="M21 3v5h-5" />
297
- </svg>
277
+ @if (variant() === 'emphasis') {
278
+ <h2 [class]="titleClasses()">{{ errorTitle() }}</h2>
279
+ } @else {
280
+ <span [class]="titleClasses()">{{ errorTitle() }}</span>
281
+ }
282
+ <span class="text-(--muted-foreground)" [class]="messageClasses()">{{ errorMessage() }}</span>
298
283
  }
299
- {{ retryLabel() }}
300
- </button>
301
- </div>
302
- }
303
- @case ('empty') {
304
- <ng-content select="[asyncEmpty]" />
305
- }
306
- @default {
307
- <ng-content />
284
+ <button type="button" [class]="retryButtonClasses()" (click)="retry.emit()">
285
+ @if (retryIcon() || variant() !== 'inline') {
286
+ <svg
287
+ aria-hidden="true"
288
+ class="block flex-none fill-none stroke-current"
289
+ stroke-linecap="round"
290
+ stroke-linejoin="round"
291
+ stroke-width="1.75"
292
+ viewBox="0 0 24 24"
293
+ [attr.height]="iconSize()"
294
+ [attr.width]="iconSize()"
295
+ >
296
+ <path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" />
297
+ <path d="M21 3v5h-5" />
298
+ </svg>
299
+ }
300
+ {{ retryLabel() }}
301
+ </button>
302
+ </div>
303
+ }
304
+ @case ('empty') {
305
+ <ng-content select="[asyncEmpty]" />
306
+ }
307
+ @default {
308
+ <ng-content />
309
+ }
308
310
  }
309
311
  }
310
312
  `,
@@ -313,7 +315,7 @@ var UiAsync = class UiAsync {
313
315
  };
314
316
  i0.ɵɵngDeclareClassMetadata({
315
317
  minVersion: "12.0.0",
316
- version: "22.2.1",
318
+ version: "22.2.2",
317
319
  ngImport: i0,
318
320
  type: UiAsync,
319
321
  decorators: [{
@@ -321,48 +323,50 @@ i0.ɵɵngDeclareClassMetadata({
321
323
  args: [{
322
324
  selector: "ui-async",
323
325
  template: `
324
- @switch (shown()) {
325
- @case (null) {}
326
- @case ('loading') {
326
+ @if (shown() === null || shown() === 'loading') {
327
+ <div class="contents" [attr.aria-hidden]="shown() === null ? 'true' : null" [class.invisible]="shown() === null">
327
328
  <ng-content select="[asyncLoading]" />
328
- }
329
- @case ('error') {
330
- <div aria-live="polite" role="alert" [class]="boxClasses()">
331
- @if (variant() === 'inline') {
332
- <span class="text-label text-(--muted-foreground)">{{ errorMessage() }}</span>
333
- } @else {
334
- @if (variant() === 'emphasis') {
335
- <h2 [class]="titleClasses()">{{ errorTitle() }}</h2>
329
+ </div>
330
+ } @else {
331
+ @switch (shown()) {
332
+ @case ('error') {
333
+ <div aria-live="polite" role="alert" [class]="boxClasses()">
334
+ @if (variant() === 'inline') {
335
+ <span class="text-label text-(--muted-foreground)">{{ errorMessage() }}</span>
336
336
  } @else {
337
- <span [class]="titleClasses()">{{ errorTitle() }}</span>
338
- }
339
- <span class="text-(--muted-foreground)" [class]="messageClasses()">{{ errorMessage() }}</span>
340
- }
341
- <button type="button" [class]="retryButtonClasses()" (click)="retry.emit()">
342
- @if (retryIcon() || variant() !== 'inline') {
343
- <svg
344
- aria-hidden="true"
345
- class="block flex-none fill-none stroke-current"
346
- stroke-linecap="round"
347
- stroke-linejoin="round"
348
- stroke-width="1.75"
349
- viewBox="0 0 24 24"
350
- [attr.height]="iconSize()"
351
- [attr.width]="iconSize()"
352
- >
353
- <path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" />
354
- <path d="M21 3v5h-5" />
355
- </svg>
337
+ @if (variant() === 'emphasis') {
338
+ <h2 [class]="titleClasses()">{{ errorTitle() }}</h2>
339
+ } @else {
340
+ <span [class]="titleClasses()">{{ errorTitle() }}</span>
341
+ }
342
+ <span class="text-(--muted-foreground)" [class]="messageClasses()">{{ errorMessage() }}</span>
356
343
  }
357
- {{ retryLabel() }}
358
- </button>
359
- </div>
360
- }
361
- @case ('empty') {
362
- <ng-content select="[asyncEmpty]" />
363
- }
364
- @default {
365
- <ng-content />
344
+ <button type="button" [class]="retryButtonClasses()" (click)="retry.emit()">
345
+ @if (retryIcon() || variant() !== 'inline') {
346
+ <svg
347
+ aria-hidden="true"
348
+ class="block flex-none fill-none stroke-current"
349
+ stroke-linecap="round"
350
+ stroke-linejoin="round"
351
+ stroke-width="1.75"
352
+ viewBox="0 0 24 24"
353
+ [attr.height]="iconSize()"
354
+ [attr.width]="iconSize()"
355
+ >
356
+ <path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" />
357
+ <path d="M21 3v5h-5" />
358
+ </svg>
359
+ }
360
+ {{ retryLabel() }}
361
+ </button>
362
+ </div>
363
+ }
364
+ @case ('empty') {
365
+ <ng-content select="[asyncEmpty]" />
366
+ }
367
+ @default {
368
+ <ng-content />
369
+ }
366
370
  }
367
371
  }
368
372
  `,
@@ -1 +1 @@
1
- {"version":3,"file":"joanroucoux-cairn-ui-async.mjs","names":[],"sources":["../../../projects/ui/async/delayed-state.ts","../../../projects/ui/async/async.ts"],"sourcesContent":["import { DestroyRef, type Signal, effect, inject, signal, untracked } from '@angular/core';\n\nimport type { AsyncState } from './async';\n\nexport const SKELETON_DELAY_MS = 150;\nexport const SKELETON_MIN_MS = 400;\n\n/**\n * Turns the live state of a call into the state to draw: `loading` only appears once the call has\n * lasted 150 ms and, once shown, stays at least 400 ms. Until then the previous state stays on\n * screen; `null` means nothing to draw yet (a first load under 150 ms). Call it in an injection context.\n *\n * @example\n * protected readonly shown = delayedState(this.state);\n */\nexport function delayedState(source: Signal<AsyncState>): Signal<AsyncState | null> {\n const displayed = signal<AsyncState | null>(null);\n let timer: ReturnType<typeof setTimeout> | undefined;\n let shownAt = 0;\n\n const clear = (): void => {\n clearTimeout(timer);\n timer = undefined;\n };\n\n inject(DestroyRef).onDestroy(clear);\n\n effect(() => {\n const state = source();\n\n untracked(() => {\n if (state === 'loading') {\n if (displayed() === 'loading') {\n clear();\n } else {\n timer = setTimeout(() => {\n timer = undefined;\n shownAt = Date.now();\n displayed.set('loading');\n }, SKELETON_DELAY_MS);\n }\n\n return;\n }\n\n clear();\n\n const remaining = shownAt + SKELETON_MIN_MS - Date.now();\n\n if (displayed() === 'loading' && remaining > 0) {\n timer = setTimeout(() => {\n timer = undefined;\n displayed.set(untracked(source));\n }, remaining);\n } else {\n displayed.set(state);\n }\n });\n });\n\n return displayed.asReadonly();\n}\n","import { Component, booleanAttribute, computed, input, output } from '@angular/core';\n\nimport { holdTransitionsUntilRendered } from '@joanroucoux/cairn-ui/motion';\n\nimport { delayedState } from './delayed-state';\n\n/** Available async block states. */\nexport const ASYNC_STATES = ['loading', 'error', 'empty', 'ready'] as const;\nexport type AsyncState = (typeof ASYNC_STATES)[number];\n\n/** Looks of the error block. */\nexport const ASYNC_VARIANTS = ['elevated', 'plain', 'emphasis', 'inline'] as const;\nexport type AsyncVariant = (typeof ASYNC_VARIANTS)[number];\n\n/** Alignments of the error block; `auto` is centered from 64rem. */\nexport const ASYNC_ALIGNS = ['start', 'center', 'auto'] as const;\nexport type AsyncAlign = (typeof ASYNC_ALIGNS)[number];\n\nconst RETRY_BASE_CLASSES =\n 'relative inline-flex items-center justify-center rounded-control font-medium whitespace-nowrap cursor-pointer select-none touch-manipulation transition-[scale,background-color] [transition-duration:var(--duration-press),var(--duration-fast)] ease-out active:scale-(--press-scale) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) text-label';\n\nconst RETRY_OUTLINE_CLASSES =\n 'bg-(--card) text-(--foreground) shadow-[inset_0_0_0_1px_var(--border)] hover:bg-(--glow)';\n\nconst RETRY_PRIMARY_CLASSES = 'bg-(--primary) text-(--primary-foreground) hover:bg-(--primary-to)';\n\nconst RETRY_BLOCK_CLASSES = 'min-h-(--row-min) gap-2 pl-3 pr-4';\n\nconst RETRY_INLINE_CLASSES = 'h-11 pointer-fine:h-8 flex-none';\n\nconst RETRY_INLINE_ICON_CLASSES = 'gap-1.5 pl-2.5 pr-3';\n\nconst RETRY_INLINE_TEXT_CLASSES = 'px-3';\n\nconst ELEVATED_SURFACE_CLASSES = 'rounded-control bg-(--elevated)';\n\nconst CARD_SURFACE_CLASSES = 'rounded-container bg-(--card) shadow-[inset_0_0_0_1px_var(--border)]';\n\ntype BlockSpec = {\n surface: string;\n gap: string;\n padding: Record<AsyncAlign, string>;\n title: string;\n message: Record<AsyncAlign, string>;\n retryMargin: Record<AsyncAlign, string>;\n retry: string;\n};\n\nconst BLOCK_SPECS: Record<Exclude<AsyncVariant, 'inline'>, BlockSpec> = {\n elevated: {\n surface: ELEVATED_SURFACE_CLASSES,\n gap: 'gap-1',\n padding: { start: 'p-4', center: 'px-4 py-10', auto: 'p-4 lg:py-10' },\n title: 'text-body font-medium',\n message: { start: 'text-label', center: 'text-label', auto: 'text-label' },\n retryMargin: { start: 'mt-2', center: 'mt-2', auto: 'mt-2' },\n retry: RETRY_OUTLINE_CLASSES,\n },\n plain: {\n surface: '',\n gap: 'gap-1',\n padding: { start: 'px-4 py-5', center: 'px-4 py-12', auto: 'px-4 py-5 lg:py-12' },\n title: 'text-body leading-[normal] font-medium',\n message: {\n start: 'text-label leading-[normal]',\n center: 'text-label leading-[normal]',\n auto: 'text-label leading-[normal]',\n },\n retryMargin: { start: 'mt-2', center: 'mt-2', auto: 'mt-2' },\n retry: RETRY_OUTLINE_CLASSES,\n },\n emphasis: {\n surface: '',\n gap: 'gap-3',\n padding: { start: 'px-4 py-6', center: 'px-4 py-14', auto: 'px-4 py-6 lg:py-14' },\n title: 'text-title font-semibold',\n message: {\n start: 'text-label',\n center: 'text-body leading-[normal]',\n auto: 'text-label lg:text-body lg:leading-[normal]',\n },\n retryMargin: { start: 'mt-1', center: 'mt-2', auto: 'mt-1 lg:mt-2' },\n retry: RETRY_PRIMARY_CLASSES,\n },\n};\n\nconst ALIGN_CLASSES: Record<AsyncAlign, string> = {\n start: 'items-start',\n center: 'items-center text-center',\n auto: 'items-start lg:items-center lg:text-center',\n};\n\nconst INLINE_BOX_CLASSES = 'flex-row items-center justify-between gap-3 pt-1.5 pr-1.5 pb-2 pl-2.5';\n\n/**\n * The three states of a block that depends on a service call, next to the ready content.\n *\n * @example\n * <ui-async [state]=\"totalState()\" errorTitle=\"The total couldn’t be loaded\" errorMessage=\"The server didn’t respond.\" retryLabel=\"Try again\" (retry)=\"reload()\">\n * <span asyncLoading><ui-skeleton shape=\"figure\" /></span>\n * <span asyncEmpty>Add a holding to see your total.</span>\n * <span>{{ total() }}</span>\n * </ui-async>\n */\n@Component({\n selector: 'ui-async',\n template: `\n @switch (shown()) {\n @case (null) {}\n @case ('loading') {\n <ng-content select=\"[asyncLoading]\" />\n }\n @case ('error') {\n <div aria-live=\"polite\" role=\"alert\" [class]=\"boxClasses()\">\n @if (variant() === 'inline') {\n <span class=\"text-label text-(--muted-foreground)\">{{ errorMessage() }}</span>\n } @else {\n @if (variant() === 'emphasis') {\n <h2 [class]=\"titleClasses()\">{{ errorTitle() }}</h2>\n } @else {\n <span [class]=\"titleClasses()\">{{ errorTitle() }}</span>\n }\n <span class=\"text-(--muted-foreground)\" [class]=\"messageClasses()\">{{ errorMessage() }}</span>\n }\n <button type=\"button\" [class]=\"retryButtonClasses()\" (click)=\"retry.emit()\">\n @if (retryIcon() || variant() !== 'inline') {\n <svg\n aria-hidden=\"true\"\n class=\"block flex-none fill-none stroke-current\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n viewBox=\"0 0 24 24\"\n [attr.height]=\"iconSize()\"\n [attr.width]=\"iconSize()\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n }\n {{ retryLabel() }}\n </button>\n </div>\n }\n @case ('empty') {\n <ng-content select=\"[asyncEmpty]\" />\n }\n @default {\n <ng-content />\n }\n }\n `,\n host: {\n '[attr.aria-busy]': \"state() === 'loading' || null\",\n '[class.flex]': 'filling()',\n '[class.flex-col]': 'filling()',\n },\n})\nexport class UiAsync {\n readonly state = input.required<AsyncState>();\n readonly errorTitle = input<string>();\n readonly errorMessage = input<string>();\n readonly retryLabel = input<string>();\n /** Draws the rotate icon in the retry button. Only the `inline` variant honors `false`. */\n readonly retryIcon = input(true, { transform: booleanAttribute });\n readonly variant = input<AsyncVariant>('elevated');\n readonly align = input<AsyncAlign>('start');\n readonly card = input(false, { transform: booleanAttribute });\n readonly fill = input(false, { transform: booleanAttribute });\n readonly retry = output<void>();\n\n protected readonly shown = delayedState(this.state);\n\n protected readonly filling = computed(() => this.fill() && this.shown() === 'error');\n\n protected readonly iconSize = computed(() => (this.variant() === 'inline' ? 16 : 18));\n\n readonly #spec = computed(() => {\n const variant = this.variant();\n\n return variant === 'inline' ? null : BLOCK_SPECS[variant];\n });\n\n protected readonly boxClasses = computed(() => {\n const spec = this.#spec();\n const fill = this.fill() ? ' flex-1 justify-center' : '';\n\n if (spec === null) {\n return `flex ${INLINE_BOX_CLASSES}${this.card() ? ` ${CARD_SURFACE_CLASSES}` : ''}${this.fill() ? ' flex-1' : ''}`;\n }\n\n const surface = this.card() ? CARD_SURFACE_CLASSES : spec.surface;\n\n return `flex flex-col ${surface} ${spec.gap} ${ALIGN_CLASSES[this.align()]} ${spec.padding[this.align()]}${fill}`;\n });\n\n protected readonly titleClasses = computed(() => this.#spec()!.title);\n\n protected readonly messageClasses = computed(() => this.#spec()!.message[this.align()]);\n\n protected readonly retryButtonClasses = computed(() => {\n const spec = this.#spec();\n\n if (spec === null) {\n const spacing = this.retryIcon() ? RETRY_INLINE_ICON_CLASSES : RETRY_INLINE_TEXT_CLASSES;\n\n return `${RETRY_BASE_CLASSES} ${RETRY_OUTLINE_CLASSES} ${RETRY_INLINE_CLASSES} ${spacing}`;\n }\n\n return `${RETRY_BASE_CLASSES} ${spec.retry} ${RETRY_BLOCK_CLASSES} ${spec.retryMargin[this.align()]}`;\n });\n\n constructor() {\n holdTransitionsUntilRendered();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"joanroucoux-cairn-ui-async.mjs","names":[],"sources":["../../../projects/ui/async/delayed-state.ts","../../../projects/ui/async/async.ts"],"sourcesContent":["import { DestroyRef, type Signal, effect, inject, signal, untracked } from '@angular/core';\n\nimport type { AsyncState } from './async';\n\nexport const SKELETON_DELAY_MS = 150;\nexport const SKELETON_MIN_MS = 400;\n\n/**\n * Turns the live state of a call into the state to draw: `loading` only appears once the call has\n * lasted 150 ms and, once shown, stays at least 400 ms. Until then the previous state stays on\n * screen; `null` means no state to draw yet (a first load under 150 ms), which `ui-async` renders as an invisible skeleton. Call it in an injection context.\n *\n * @example\n * protected readonly shown = delayedState(this.state);\n */\nexport function delayedState(source: Signal<AsyncState>): Signal<AsyncState | null> {\n const displayed = signal<AsyncState | null>(null);\n let timer: ReturnType<typeof setTimeout> | undefined;\n let shownAt = 0;\n\n const clear = (): void => {\n clearTimeout(timer);\n timer = undefined;\n };\n\n inject(DestroyRef).onDestroy(clear);\n\n effect(() => {\n const state = source();\n\n untracked(() => {\n if (state === 'loading') {\n if (displayed() === 'loading') {\n clear();\n } else {\n timer = setTimeout(() => {\n timer = undefined;\n shownAt = Date.now();\n displayed.set('loading');\n }, SKELETON_DELAY_MS);\n }\n\n return;\n }\n\n clear();\n\n const remaining = shownAt + SKELETON_MIN_MS - Date.now();\n\n if (displayed() === 'loading' && remaining > 0) {\n timer = setTimeout(() => {\n timer = undefined;\n displayed.set(untracked(source));\n }, remaining);\n } else {\n displayed.set(state);\n }\n });\n });\n\n return displayed.asReadonly();\n}\n","import { Component, booleanAttribute, computed, input, output } from '@angular/core';\n\nimport { holdTransitionsUntilRendered } from '@joanroucoux/cairn-ui/motion';\n\nimport { delayedState } from './delayed-state';\n\n/** Available async block states. */\nexport const ASYNC_STATES = ['loading', 'error', 'empty', 'ready'] as const;\nexport type AsyncState = (typeof ASYNC_STATES)[number];\n\n/** Looks of the error block. */\nexport const ASYNC_VARIANTS = ['elevated', 'plain', 'emphasis', 'inline'] as const;\nexport type AsyncVariant = (typeof ASYNC_VARIANTS)[number];\n\n/** Alignments of the error block; `auto` is centered from 64rem. */\nexport const ASYNC_ALIGNS = ['start', 'center', 'auto'] as const;\nexport type AsyncAlign = (typeof ASYNC_ALIGNS)[number];\n\nconst RETRY_BASE_CLASSES =\n 'relative inline-flex items-center justify-center rounded-control font-medium whitespace-nowrap cursor-pointer select-none touch-manipulation transition-[scale,background-color] [transition-duration:var(--duration-press),var(--duration-fast)] ease-out active:scale-(--press-scale) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) text-label';\n\nconst RETRY_OUTLINE_CLASSES =\n 'bg-(--card) text-(--foreground) shadow-[inset_0_0_0_1px_var(--border)] hover:bg-(--glow)';\n\nconst RETRY_PRIMARY_CLASSES = 'bg-(--primary) text-(--primary-foreground) hover:bg-(--primary-to)';\n\nconst RETRY_BLOCK_CLASSES = 'min-h-(--row-min) gap-2 pl-3 pr-4';\n\nconst RETRY_INLINE_CLASSES = 'h-11 pointer-fine:h-8 flex-none';\n\nconst RETRY_INLINE_ICON_CLASSES = 'gap-1.5 pl-2.5 pr-3';\n\nconst RETRY_INLINE_TEXT_CLASSES = 'px-3';\n\nconst ELEVATED_SURFACE_CLASSES = 'rounded-control bg-(--elevated)';\n\nconst CARD_SURFACE_CLASSES = 'rounded-container bg-(--card) shadow-[inset_0_0_0_1px_var(--border)]';\n\ntype BlockSpec = {\n surface: string;\n gap: string;\n padding: Record<AsyncAlign, string>;\n title: string;\n message: Record<AsyncAlign, string>;\n retryMargin: Record<AsyncAlign, string>;\n retry: string;\n};\n\nconst BLOCK_SPECS: Record<Exclude<AsyncVariant, 'inline'>, BlockSpec> = {\n elevated: {\n surface: ELEVATED_SURFACE_CLASSES,\n gap: 'gap-1',\n padding: { start: 'p-4', center: 'px-4 py-10', auto: 'p-4 lg:py-10' },\n title: 'text-body font-medium',\n message: { start: 'text-label', center: 'text-label', auto: 'text-label' },\n retryMargin: { start: 'mt-2', center: 'mt-2', auto: 'mt-2' },\n retry: RETRY_OUTLINE_CLASSES,\n },\n plain: {\n surface: '',\n gap: 'gap-1',\n padding: { start: 'px-4 py-5', center: 'px-4 py-12', auto: 'px-4 py-5 lg:py-12' },\n title: 'text-body leading-[normal] font-medium',\n message: {\n start: 'text-label leading-[normal]',\n center: 'text-label leading-[normal]',\n auto: 'text-label leading-[normal]',\n },\n retryMargin: { start: 'mt-2', center: 'mt-2', auto: 'mt-2' },\n retry: RETRY_OUTLINE_CLASSES,\n },\n emphasis: {\n surface: '',\n gap: 'gap-3',\n padding: { start: 'px-4 py-6', center: 'px-4 py-14', auto: 'px-4 py-6 lg:py-14' },\n title: 'text-title font-semibold',\n message: {\n start: 'text-label',\n center: 'text-body leading-[normal]',\n auto: 'text-label lg:text-body lg:leading-[normal]',\n },\n retryMargin: { start: 'mt-1', center: 'mt-2', auto: 'mt-1 lg:mt-2' },\n retry: RETRY_PRIMARY_CLASSES,\n },\n};\n\nconst ALIGN_CLASSES: Record<AsyncAlign, string> = {\n start: 'items-start',\n center: 'items-center text-center',\n auto: 'items-start lg:items-center lg:text-center',\n};\n\nconst INLINE_BOX_CLASSES = 'flex-row items-center justify-between gap-3 pt-1.5 pr-1.5 pb-2 pl-2.5';\n\n/**\n * The three states of a block that depends on a service call, next to the ready content. During the\n * first 150 ms of a load the `[asyncLoading]` content is laid out but invisible and hidden from\n * assistive technology, so the block already holds its skeleton's space.\n *\n * @example\n * <ui-async [state]=\"totalState()\" errorTitle=\"The total couldn’t be loaded\" errorMessage=\"The server didn’t respond.\" retryLabel=\"Try again\" (retry)=\"reload()\">\n * <span asyncLoading><ui-skeleton shape=\"figure\" /></span>\n * <span asyncEmpty>Add a holding to see your total.</span>\n * <span>{{ total() }}</span>\n * </ui-async>\n */\n@Component({\n selector: 'ui-async',\n template: `\n @if (shown() === null || shown() === 'loading') {\n <div class=\"contents\" [attr.aria-hidden]=\"shown() === null ? 'true' : null\" [class.invisible]=\"shown() === null\">\n <ng-content select=\"[asyncLoading]\" />\n </div>\n } @else {\n @switch (shown()) {\n @case ('error') {\n <div aria-live=\"polite\" role=\"alert\" [class]=\"boxClasses()\">\n @if (variant() === 'inline') {\n <span class=\"text-label text-(--muted-foreground)\">{{ errorMessage() }}</span>\n } @else {\n @if (variant() === 'emphasis') {\n <h2 [class]=\"titleClasses()\">{{ errorTitle() }}</h2>\n } @else {\n <span [class]=\"titleClasses()\">{{ errorTitle() }}</span>\n }\n <span class=\"text-(--muted-foreground)\" [class]=\"messageClasses()\">{{ errorMessage() }}</span>\n }\n <button type=\"button\" [class]=\"retryButtonClasses()\" (click)=\"retry.emit()\">\n @if (retryIcon() || variant() !== 'inline') {\n <svg\n aria-hidden=\"true\"\n class=\"block flex-none fill-none stroke-current\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n viewBox=\"0 0 24 24\"\n [attr.height]=\"iconSize()\"\n [attr.width]=\"iconSize()\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n }\n {{ retryLabel() }}\n </button>\n </div>\n }\n @case ('empty') {\n <ng-content select=\"[asyncEmpty]\" />\n }\n @default {\n <ng-content />\n }\n }\n }\n `,\n host: {\n '[attr.aria-busy]': \"state() === 'loading' || null\",\n '[class.flex]': 'filling()',\n '[class.flex-col]': 'filling()',\n },\n})\nexport class UiAsync {\n readonly state = input.required<AsyncState>();\n readonly errorTitle = input<string>();\n readonly errorMessage = input<string>();\n readonly retryLabel = input<string>();\n /** Draws the rotate icon in the retry button. Only the `inline` variant honors `false`. */\n readonly retryIcon = input(true, { transform: booleanAttribute });\n readonly variant = input<AsyncVariant>('elevated');\n readonly align = input<AsyncAlign>('start');\n readonly card = input(false, { transform: booleanAttribute });\n readonly fill = input(false, { transform: booleanAttribute });\n readonly retry = output<void>();\n\n protected readonly shown = delayedState(this.state);\n\n protected readonly filling = computed(() => this.fill() && this.shown() === 'error');\n\n protected readonly iconSize = computed(() => (this.variant() === 'inline' ? 16 : 18));\n\n readonly #spec = computed(() => {\n const variant = this.variant();\n\n return variant === 'inline' ? null : BLOCK_SPECS[variant];\n });\n\n protected readonly boxClasses = computed(() => {\n const spec = this.#spec();\n const fill = this.fill() ? ' flex-1 justify-center' : '';\n\n if (spec === null) {\n return `flex ${INLINE_BOX_CLASSES}${this.card() ? ` ${CARD_SURFACE_CLASSES}` : ''}${this.fill() ? ' flex-1' : ''}`;\n }\n\n const surface = this.card() ? CARD_SURFACE_CLASSES : spec.surface;\n\n return `flex flex-col ${surface} ${spec.gap} ${ALIGN_CLASSES[this.align()]} ${spec.padding[this.align()]}${fill}`;\n });\n\n protected readonly titleClasses = computed(() => this.#spec()!.title);\n\n protected readonly messageClasses = computed(() => this.#spec()!.message[this.align()]);\n\n protected readonly retryButtonClasses = computed(() => {\n const spec = this.#spec();\n\n if (spec === null) {\n const spacing = this.retryIcon() ? RETRY_INLINE_ICON_CLASSES : RETRY_INLINE_TEXT_CLASSES;\n\n return `${RETRY_BASE_CLASSES} ${RETRY_OUTLINE_CLASSES} ${RETRY_INLINE_CLASSES} ${spacing}`;\n }\n\n return `${RETRY_BASE_CLASSES} ${spec.retry} ${RETRY_BLOCK_CLASSES} ${spec.retryMargin[this.align()]}`;\n });\n\n constructor() {\n holdTransitionsUntilRendered();\n }\n}\n"],"mappings":"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"}
@@ -20,7 +20,7 @@ var UiAvatar = class UiAvatar {
20
20
  classes = computed(() => `${BASE_CLASSES} ${SIZE_CLASSES[this.size()]}`, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
21
21
  static ɵfac = i0.ɵɵngDeclareFactory({
22
22
  minVersion: "12.0.0",
23
- version: "22.2.1",
23
+ version: "22.2.2",
24
24
  ngImport: i0,
25
25
  type: UiAvatar,
26
26
  deps: [],
@@ -28,7 +28,7 @@ var UiAvatar = class UiAvatar {
28
28
  });
29
29
  static ɵcmp = i0.ɵɵngDeclareComponent({
30
30
  minVersion: "17.1.0",
31
- version: "22.2.1",
31
+ version: "22.2.2",
32
32
  type: UiAvatar,
33
33
  isStandalone: true,
34
34
  selector: "ui-avatar",
@@ -69,7 +69,7 @@ var UiAvatar = class UiAvatar {
69
69
  };
70
70
  i0.ɵɵngDeclareClassMetadata({
71
71
  minVersion: "12.0.0",
72
- version: "22.2.1",
72
+ version: "22.2.2",
73
73
  ngImport: i0,
74
74
  type: UiAvatar,
75
75
  decorators: [{
@@ -114,7 +114,7 @@ i0.ɵɵngDeclareClassMetadata({
114
114
  var UiAvatarLink = class UiAvatarLink {
115
115
  static ɵfac = i0.ɵɵngDeclareFactory({
116
116
  minVersion: "12.0.0",
117
- version: "22.2.1",
117
+ version: "22.2.2",
118
118
  ngImport: i0,
119
119
  type: UiAvatarLink,
120
120
  deps: [],
@@ -122,7 +122,7 @@ var UiAvatarLink = class UiAvatarLink {
122
122
  });
123
123
  static ɵdir = i0.ɵɵngDeclareDirective({
124
124
  minVersion: "14.0.0",
125
- version: "22.2.1",
125
+ version: "22.2.2",
126
126
  type: UiAvatarLink,
127
127
  isStandalone: true,
128
128
  selector: "a[uiAvatarLink], button[uiAvatarLink]",
@@ -132,7 +132,7 @@ var UiAvatarLink = class UiAvatarLink {
132
132
  };
133
133
  i0.ɵɵngDeclareClassMetadata({
134
134
  minVersion: "12.0.0",
135
- version: "22.2.1",
135
+ version: "22.2.2",
136
136
  ngImport: i0,
137
137
  type: UiAvatarLink,
138
138
  decorators: [{
@@ -30,7 +30,7 @@ var UiBackLink = class UiBackLink {
30
30
  }
31
31
  static ɵfac = i0.ɵɵngDeclareFactory({
32
32
  minVersion: "12.0.0",
33
- version: "22.2.1",
33
+ version: "22.2.2",
34
34
  ngImport: i0,
35
35
  type: UiBackLink,
36
36
  deps: [],
@@ -38,7 +38,7 @@ var UiBackLink = class UiBackLink {
38
38
  });
39
39
  static ɵcmp = i0.ɵɵngDeclareComponent({
40
40
  minVersion: "17.1.0",
41
- version: "22.2.1",
41
+ version: "22.2.2",
42
42
  type: UiBackLink,
43
43
  isStandalone: true,
44
44
  selector: "a[ui-back-link], button[ui-back-link]",
@@ -75,7 +75,7 @@ var UiBackLink = class UiBackLink {
75
75
  };
76
76
  i0.ɵɵngDeclareClassMetadata({
77
77
  minVersion: "12.0.0",
78
- version: "22.2.1",
78
+ version: "22.2.2",
79
79
  ngImport: i0,
80
80
  type: UiBackLink,
81
81
  decorators: [{
@@ -17,7 +17,7 @@ var UiBadge = class UiBadge {
17
17
  classes = computed(() => `${BASE_CLASSES} ${SIZE_CLASSES[this.size()]} ${VARIANT_CLASSES[this.variant()]}`, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
18
18
  static ɵfac = i0.ɵɵngDeclareFactory({
19
19
  minVersion: "12.0.0",
20
- version: "22.2.1",
20
+ version: "22.2.2",
21
21
  ngImport: i0,
22
22
  type: UiBadge,
23
23
  deps: [],
@@ -25,7 +25,7 @@ var UiBadge = class UiBadge {
25
25
  });
26
26
  static ɵcmp = i0.ɵɵngDeclareComponent({
27
27
  minVersion: "17.1.0",
28
- version: "22.2.1",
28
+ version: "22.2.2",
29
29
  type: UiBadge,
30
30
  isStandalone: true,
31
31
  selector: "ui-badge",
@@ -53,7 +53,7 @@ var UiBadge = class UiBadge {
53
53
  };
54
54
  i0.ɵɵngDeclareClassMetadata({
55
55
  minVersion: "12.0.0",
56
- version: "22.2.1",
56
+ version: "22.2.2",
57
57
  ngImport: i0,
58
58
  type: UiBadge,
59
59
  decorators: [{
@@ -82,7 +82,7 @@ var UiButton = class UiButton {
82
82
  }
83
83
  static ɵfac = i0.ɵɵngDeclareFactory({
84
84
  minVersion: "12.0.0",
85
- version: "22.2.1",
85
+ version: "22.2.2",
86
86
  ngImport: i0,
87
87
  type: UiButton,
88
88
  deps: [],
@@ -90,7 +90,7 @@ var UiButton = class UiButton {
90
90
  });
91
91
  static ɵcmp = i0.ɵɵngDeclareComponent({
92
92
  minVersion: "17.0.0",
93
- version: "22.2.1",
93
+ version: "22.2.2",
94
94
  type: UiButton,
95
95
  isStandalone: true,
96
96
  selector: "button[ui-button], a[ui-button]",
@@ -144,7 +144,7 @@ var UiButton = class UiButton {
144
144
  };
145
145
  i0.ɵɵngDeclareClassMetadata({
146
146
  minVersion: "12.0.0",
147
- version: "22.2.1",
147
+ version: "22.2.2",
148
148
  ngImport: i0,
149
149
  type: UiButton,
150
150
  decorators: [{
@@ -125,7 +125,7 @@ var UiCard = class UiCard {
125
125
  }, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
126
126
  static ɵfac = i0.ɵɵngDeclareFactory({
127
127
  minVersion: "12.0.0",
128
- version: "22.2.1",
128
+ version: "22.2.2",
129
129
  ngImport: i0,
130
130
  type: UiCard,
131
131
  deps: [],
@@ -133,7 +133,7 @@ var UiCard = class UiCard {
133
133
  });
134
134
  static ɵcmp = i0.ɵɵngDeclareComponent({
135
135
  minVersion: "17.1.0",
136
- version: "22.2.1",
136
+ version: "22.2.2",
137
137
  type: UiCard,
138
138
  isStandalone: true,
139
139
  selector: "ui-card",
@@ -182,7 +182,7 @@ var UiCard = class UiCard {
182
182
  };
183
183
  i0.ɵɵngDeclareClassMetadata({
184
184
  minVersion: "12.0.0",
185
- version: "22.2.1",
185
+ version: "22.2.2",
186
186
  ngImport: i0,
187
187
  type: UiCard,
188
188
  decorators: [{
@@ -67,7 +67,7 @@ var UiChoiceChips = class UiChoiceChips {
67
67
  }
68
68
  static ɵfac = i0.ɵɵngDeclareFactory({
69
69
  minVersion: "12.0.0",
70
- version: "22.2.1",
70
+ version: "22.2.2",
71
71
  ngImport: i0,
72
72
  type: UiChoiceChips,
73
73
  deps: [],
@@ -75,7 +75,7 @@ var UiChoiceChips = class UiChoiceChips {
75
75
  });
76
76
  static ɵcmp = i0.ɵɵngDeclareComponent({
77
77
  minVersion: "17.0.0",
78
- version: "22.2.1",
78
+ version: "22.2.2",
79
79
  type: UiChoiceChips,
80
80
  isStandalone: true,
81
81
  selector: "ui-choice-chips",
@@ -213,7 +213,7 @@ var UiChoiceChips = class UiChoiceChips {
213
213
  };
214
214
  i0.ɵɵngDeclareClassMetadata({
215
215
  minVersion: "12.0.0",
216
- version: "22.2.1",
216
+ version: "22.2.2",
217
217
  ngImport: i0,
218
218
  type: UiChoiceChips,
219
219
  decorators: [{
@@ -40,7 +40,7 @@ var UiDelta = class UiDelta {
40
40
  }, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
41
41
  static ɵfac = i0.ɵɵngDeclareFactory({
42
42
  minVersion: "12.0.0",
43
- version: "22.2.1",
43
+ version: "22.2.2",
44
44
  ngImport: i0,
45
45
  type: UiDelta,
46
46
  deps: [],
@@ -48,7 +48,7 @@ var UiDelta = class UiDelta {
48
48
  });
49
49
  static ɵcmp = i0.ɵɵngDeclareComponent({
50
50
  minVersion: "17.0.0",
51
- version: "22.2.1",
51
+ version: "22.2.2",
52
52
  type: UiDelta,
53
53
  isStandalone: true,
54
54
  selector: "ui-delta",
@@ -104,7 +104,7 @@ var UiDelta = class UiDelta {
104
104
  };
105
105
  i0.ɵɵngDeclareClassMetadata({
106
106
  minVersion: "12.0.0",
107
- version: "22.2.1",
107
+ version: "22.2.2",
108
108
  ngImport: i0,
109
109
  type: UiDelta,
110
110
  decorators: [{
@@ -314,7 +314,7 @@ var UiDialog = class UiDialog {
314
314
  }
315
315
  static ɵfac = i0.ɵɵngDeclareFactory({
316
316
  minVersion: "12.0.0",
317
- version: "22.2.1",
317
+ version: "22.2.2",
318
318
  ngImport: i0,
319
319
  type: UiDialog,
320
320
  deps: [],
@@ -322,7 +322,7 @@ var UiDialog = class UiDialog {
322
322
  });
323
323
  static ɵcmp = i0.ɵɵngDeclareComponent({
324
324
  minVersion: "17.0.0",
325
- version: "22.2.1",
325
+ version: "22.2.2",
326
326
  type: UiDialog,
327
327
  isStandalone: true,
328
328
  selector: "ui-dialog",
@@ -483,7 +483,7 @@ var UiDialog = class UiDialog {
483
483
  };
484
484
  i0.ɵɵngDeclareClassMetadata({
485
485
  minVersion: "12.0.0",
486
- version: "22.2.1",
486
+ version: "22.2.2",
487
487
  ngImport: i0,
488
488
  type: UiDialog,
489
489
  decorators: [{