@blotch/dolan 22.2.3 → 22.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/add.js +9 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/add.test.js +36 -3
- package/dist/commands/add.test.js.map +1 -1
- package/dist/commands/doctor.js +187 -7
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +280 -7
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/init.d.ts +2 -2
- package/dist/commands/init.js +38 -18
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/init.test.js +107 -1
- package/dist/commands/init.test.js.map +1 -1
- package/dist/commands/theme.js +1 -1
- package/dist/commands/theme.js.map +1 -1
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.js +126 -45
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/update.test.js +314 -2
- package/dist/commands/update.test.js.map +1 -1
- package/dist/lockfile.d.ts +7 -0
- package/dist/lockfile.js +36 -0
- package/dist/lockfile.js.map +1 -1
- package/dist/lockfile.test.d.ts +1 -0
- package/dist/lockfile.test.js +25 -0
- package/dist/lockfile.test.js.map +1 -0
- package/dist/registry.d.ts +6 -0
- package/dist/registry.js +48 -2
- package/dist/registry.js.map +1 -1
- package/dist/registry.test.js +45 -3
- package/dist/registry.test.js.map +1 -1
- package/dist/test-utils.d.ts +5 -0
- package/dist/test-utils.js +6 -1
- package/dist/test-utils.js.map +1 -1
- package/dist/testing/fire-lynx-event.d.ts +14 -0
- package/dist/testing/fire-lynx-event.js +19 -0
- package/dist/testing/fire-lynx-event.js.map +1 -0
- package/dist/testing/fire-lynx-event.test.d.ts +1 -0
- package/dist/testing/fire-lynx-event.test.js +44 -0
- package/dist/testing/fire-lynx-event.test.js.map +1 -0
- package/dist/testing/lynx-main-thread.d.ts +22 -0
- package/dist/testing/lynx-main-thread.js +11 -0
- package/dist/testing/lynx-main-thread.js.map +1 -0
- package/dist/testing/lynx-main-thread.test.d.ts +1 -0
- package/dist/testing/lynx-main-thread.test.js +24 -0
- package/dist/testing/lynx-main-thread.test.js.map +1 -0
- package/dist/testing/set-input-signal.d.ts +5 -4
- package/dist/testing/set-input-signal.js +5 -4
- package/dist/testing/set-input-signal.js.map +1 -1
- package/dist/ui/components/accordion/accordion.test.ts +158 -144
- package/dist/ui/components/accordion/accordion.ts +19 -14
- package/dist/ui/components/action-sheet/action-sheet.test.ts +272 -187
- package/dist/ui/components/action-sheet/action-sheet.ts +40 -34
- package/dist/ui/components/alert/alert.test.ts +67 -19
- package/dist/ui/components/alert/alert.ts +14 -16
- package/dist/ui/components/alert-dialog/alert-dialog.test.ts +206 -139
- package/dist/ui/components/alert-dialog/alert-dialog.ts +32 -26
- package/dist/ui/components/area-chart/area-chart.test.ts +81 -1
- package/dist/ui/components/avatar/avatar.test.ts +89 -45
- package/dist/ui/components/badge/badge.test.ts +57 -23
- package/dist/ui/components/badge/badge.ts +12 -14
- package/dist/ui/components/bar-chart/bar-chart.test.ts +82 -1
- package/dist/ui/components/bottom-sheet/bottom-sheet.test.ts +373 -297
- package/dist/ui/components/bottom-sheet/bottom-sheet.ts +34 -33
- package/dist/ui/components/button/button.test.ts +611 -2
- package/dist/ui/components/button/button.ts +431 -62
- package/dist/ui/components/button/index.ts +2 -0
- package/dist/ui/components/button-group/button-group.test.ts +484 -2
- package/dist/ui/components/button-group/button-group.ts +380 -68
- package/dist/ui/components/button-group/index.ts +3 -0
- package/dist/ui/components/candlestick-chart/candlestick-chart.test.ts +82 -1
- package/dist/ui/components/card/card.test.ts +82 -62
- package/dist/ui/components/chart/chart-presets.test.ts +197 -1
- package/dist/ui/components/chart/chart-presets.ts +8 -1
- package/dist/ui/components/chart/chart-theme.ts +12 -0
- package/dist/ui/components/chart/chart.test.ts +1017 -0
- package/dist/ui/components/chart/chart.ts +56 -43
- package/dist/ui/components/checkbox/checkbox.test.ts +124 -42
- package/dist/ui/components/checkbox/checkbox.ts +23 -23
- package/dist/ui/components/collapsible/collapsible.test.ts +158 -81
- package/dist/ui/components/collapsible/collapsible.ts +19 -14
- package/dist/ui/components/context-menu/context-menu.test.ts +224 -0
- package/dist/ui/components/context-menu/context-menu.ts +110 -0
- package/dist/ui/components/context-menu/index.ts +1 -0
- package/dist/ui/components/dialog/dialog.test.ts +210 -152
- package/dist/ui/components/dialog/dialog.ts +29 -23
- package/dist/ui/components/dock/dock-scroll.test.ts +130 -0
- package/dist/ui/components/dock/dock-scroll.ts +133 -0
- package/dist/ui/components/dock/dock.test.ts +749 -0
- package/dist/ui/components/dock/dock.ts +960 -0
- package/dist/ui/components/dock/index.ts +2 -0
- package/dist/ui/components/empty-state/empty-state.test.ts +28 -39
- package/dist/ui/components/glass/concentric-radius.test.ts +13 -0
- package/dist/ui/components/glass/concentric-radius.ts +17 -0
- package/dist/ui/components/glass/glass-design.test.ts +78 -0
- package/dist/ui/components/glass/glass-design.ts +119 -0
- package/dist/ui/components/glass/glass.test.ts +338 -0
- package/dist/ui/components/glass/glass.ts +360 -0
- package/dist/ui/components/glass/index.ts +18 -0
- package/dist/ui/components/icon/icon-theme.test.ts +36 -0
- package/dist/ui/components/icon/icon-theme.ts +36 -13
- package/dist/ui/components/icon/icon.test.ts +52 -41
- package/dist/ui/components/input/input.test.ts +178 -101
- package/dist/ui/components/input/input.ts +15 -12
- package/dist/ui/components/label/label.test.ts +11 -24
- package/dist/ui/components/line-chart/line-chart.test.ts +76 -1
- package/dist/ui/components/list/list.test.ts +80 -49
- package/dist/ui/components/menu/index.ts +25 -0
- package/dist/ui/components/menu/menu-placement.test.ts +153 -0
- package/dist/ui/components/menu/menu-placement.ts +159 -0
- package/dist/ui/components/menu/menu-popup.test.ts +632 -0
- package/dist/ui/components/menu/menu-popup.ts +544 -0
- package/dist/ui/components/menu/menu.test.ts +429 -0
- package/dist/ui/components/menu/menu.ts +415 -0
- package/dist/ui/components/nav-drawer/nav-drawer.test.ts +425 -260
- package/dist/ui/components/nav-drawer/nav-drawer.ts +72 -56
- package/dist/ui/components/pagination/pagination.test.ts +136 -86
- package/dist/ui/components/progress/progress.test.ts +102 -46
- package/dist/ui/components/progress/progress.ts +52 -54
- package/dist/ui/components/radio-group/radio-group.test.ts +128 -83
- package/dist/ui/components/radio-group/radio-group.ts +24 -24
- package/dist/ui/components/scatter-chart/scatter-chart.test.ts +74 -1
- package/dist/ui/components/scroll-area/scroll-area.test.ts +72 -36
- package/dist/ui/components/select/select.test.ts +138 -78
- package/dist/ui/components/select/select.ts +17 -11
- package/dist/ui/components/separator/separator.test.ts +18 -17
- package/dist/ui/components/sheet/sheet.test.ts +64 -11
- package/dist/ui/components/sheet/sheet.ts +9 -1
- package/dist/ui/components/skeleton/skeleton.test.ts +24 -7
- package/dist/ui/components/skeleton/skeleton.ts +10 -16
- package/dist/ui/components/spinner/spinner.test.ts +64 -46
- package/dist/ui/components/spinner/spinner.ts +16 -19
- package/dist/ui/components/switch/switch.test.ts +116 -46
- package/dist/ui/components/switch/switch.ts +8 -13
- package/dist/ui/components/tab-bar/index.ts +1 -0
- package/dist/ui/components/tab-bar/tab-bar.test.ts +280 -0
- package/dist/ui/components/tab-bar/tab-bar.ts +230 -0
- package/dist/ui/components/tabs/tabs.test.ts +215 -157
- package/dist/ui/components/tabs/tabs.ts +110 -118
- package/dist/ui/components/textarea/textarea.test.ts +206 -100
- package/dist/ui/components/textarea/textarea.ts +14 -12
- package/dist/ui/components/toast/toast.test.ts +434 -350
- package/dist/ui/components/toast/toast.ts +42 -51
- package/dist/ui/components/toggle/toggle.test.ts +247 -140
- package/dist/ui/theme/chart-colors.test.ts +8 -3
- package/dist/ui/theme/dark.css +38 -2
- package/dist/ui/theme/default.css +55 -7
- package/dist/ui/theme/icon-colors.test.ts +8 -3
- package/dist/ui/theme/rgb-channels.test.ts +84 -0
- package/dist/ui/theme/tailwind-build.test.ts +114 -0
- package/dist/ui/theme/tailwind-css.test.ts +83 -0
- package/dist/ui/theme/tailwind-plugin.test.ts +42 -2
- package/dist/ui/theme/tailwind-plugin.ts +93 -29
- package/dist/ui/theme/tailwind.css +113 -0
- package/dist/ui/utils/animate.test.ts +13 -1
- package/dist/utils/analyze.d.ts +14 -0
- package/dist/utils/analyze.js +15 -0
- package/dist/utils/analyze.js.map +1 -1
- package/dist/utils/analyze.test.js +14 -1
- package/dist/utils/analyze.test.js.map +1 -1
- package/dist/utils/installed.d.ts +12 -0
- package/dist/utils/installed.js +16 -0
- package/dist/utils/installed.js.map +1 -1
- package/dist/utils/installed.test.js +17 -1
- package/dist/utils/installed.test.js.map +1 -1
- package/dist/utils/resolve-paths.d.ts +4 -4
- package/dist/utils/resolve-paths.js +5 -7
- package/dist/utils/resolve-paths.js.map +1 -1
- package/dist/utils/resolve-paths.test.js +9 -5
- package/dist/utils/resolve-paths.test.js.map +1 -1
- package/dist/utils/tailwind.d.ts +25 -0
- package/dist/utils/tailwind.js +51 -0
- package/dist/utils/tailwind.js.map +1 -0
- package/dist/utils/tailwind.test.d.ts +1 -0
- package/dist/utils/tailwind.test.js +71 -0
- package/dist/utils/tailwind.test.js.map +1 -0
- package/package.json +9 -1
- package/dist/ui/components/area-chart/area-chart-render.test.ts +0 -63
- package/dist/ui/components/bar-chart/bar-chart-render.test.ts +0 -58
- package/dist/ui/components/button/button-render.test.ts +0 -132
- package/dist/ui/components/button-group/button-group-render.test.ts +0 -146
- package/dist/ui/components/candlestick-chart/candlestick-chart-render.test.ts +0 -59
- package/dist/ui/components/chart/chart-render.test.ts +0 -730
- package/dist/ui/components/line-chart/line-chart-render.test.ts +0 -83
- package/dist/ui/components/scatter-chart/scatter-chart-render.test.ts +0 -64
|
@@ -37,9 +37,9 @@ import { cn } from '../../utils/cn';
|
|
|
37
37
|
<!-- bg-black/50 dims the content behind the sheet. The fadeIn/fadeOut in
|
|
38
38
|
#animateIn/#animateOut already tween this element's opacity over
|
|
39
39
|
DURATION.normal, so the dim animates in lockstep with the panel slide —
|
|
40
|
-
matching the dialog/bottom-sheet backdrop.
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
matching the dialog/bottom-sheet backdrop. It's a named color, not a
|
|
41
|
+
theme one, because the dim is black in light and dark mode alike;
|
|
42
|
+
bg-black/50 compiles to rgb(0 0 0 / 0.5), which Lynx accepts. -->
|
|
43
43
|
<view
|
|
44
44
|
#backdrop
|
|
45
45
|
class="h-full w-full bg-black/50"
|
|
@@ -92,8 +92,10 @@ export class UiActionSheet implements OnDestroy {
|
|
|
92
92
|
: 'position: fixed; overflow: visible; width: 100vw; height: 100vh; top: 0; left: 0; z-index: 999; display: none;',
|
|
93
93
|
);
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
// Required: both are always in the template (the overlay is hidden, never
|
|
96
|
+
// removed), and nothing reads them before the first render.
|
|
97
|
+
readonly backdropRef = viewChild.required<ElementRef>('backdrop');
|
|
98
|
+
readonly panelRef = viewChild.required<ElementRef>('panel');
|
|
97
99
|
#backdropAnim?: AnimationHandle;
|
|
98
100
|
#panelAnim?: AnimationHandle;
|
|
99
101
|
#hasBeenOpen = false;
|
|
@@ -101,21 +103,25 @@ export class UiActionSheet implements OnDestroy {
|
|
|
101
103
|
// them.
|
|
102
104
|
readonly #timers = new Set<ReturnType<typeof setTimeout>>();
|
|
103
105
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
106
|
+
/**
|
|
107
|
+
* Opens or closes the action sheet as `open` changes. A field rather than a
|
|
108
|
+
* constructor: Angular's test build keeps a function for a constructor that
|
|
109
|
+
* nothing calls, which an app's coverage report would show as uncovered.
|
|
110
|
+
*
|
|
111
|
+
* `#hasBeenOpen` prevents the close animation from running on the initial
|
|
112
|
+
* effect evaluation when `open` starts as false. Without this guard, the
|
|
113
|
+
* first run would call #doClose() and emit `closed` before the action
|
|
114
|
+
* sheet has ever been opened.
|
|
115
|
+
*/
|
|
116
|
+
protected readonly openOrClose = effect(() => {
|
|
117
|
+
const isOpen = this.open();
|
|
118
|
+
if (isOpen) {
|
|
119
|
+
this.#hasBeenOpen = true;
|
|
120
|
+
this.#doOpen();
|
|
121
|
+
} else if (this.#hasBeenOpen) {
|
|
122
|
+
this.#doClose();
|
|
123
|
+
}
|
|
124
|
+
});
|
|
119
125
|
|
|
120
126
|
protected readonly panelClass = computed(() =>
|
|
121
127
|
cn('w-full flex-col gap-2 px-4 pb-6 flex', this.userClass()),
|
|
@@ -190,9 +196,8 @@ export class UiActionSheet implements OnDestroy {
|
|
|
190
196
|
}
|
|
191
197
|
|
|
192
198
|
#animateIn(): void {
|
|
193
|
-
const backdrop = this.backdropRef()
|
|
194
|
-
const panel = this.panelRef()
|
|
195
|
-
if (!backdrop || !panel) return;
|
|
199
|
+
const backdrop = this.backdropRef().nativeElement;
|
|
200
|
+
const panel = this.panelRef().nativeElement;
|
|
196
201
|
|
|
197
202
|
this.#backdropAnim?.cancel();
|
|
198
203
|
this.#panelAnim?.cancel();
|
|
@@ -210,9 +215,8 @@ export class UiActionSheet implements OnDestroy {
|
|
|
210
215
|
}
|
|
211
216
|
|
|
212
217
|
#animateOut(): void {
|
|
213
|
-
const backdrop = this.backdropRef()
|
|
214
|
-
const panel = this.panelRef()
|
|
215
|
-
if (!backdrop || !panel) return;
|
|
218
|
+
const backdrop = this.backdropRef().nativeElement;
|
|
219
|
+
const panel = this.panelRef().nativeElement;
|
|
216
220
|
|
|
217
221
|
this.#backdropAnim?.cancel();
|
|
218
222
|
this.#panelAnim?.cancel();
|
|
@@ -275,7 +279,8 @@ export class UiActionSheetItem {
|
|
|
275
279
|
|
|
276
280
|
readonly pressed = output<void>();
|
|
277
281
|
|
|
278
|
-
|
|
282
|
+
// Required: the container is always in the template.
|
|
283
|
+
readonly containerRef = viewChild.required<ElementRef>('container');
|
|
279
284
|
#pressAnim?: AnimationHandle;
|
|
280
285
|
|
|
281
286
|
protected readonly containerClass = computed(() =>
|
|
@@ -295,19 +300,19 @@ export class UiActionSheetItem {
|
|
|
295
300
|
protected onPressStart(): void {
|
|
296
301
|
this.#pressAnim?.cancel();
|
|
297
302
|
this.#pressAnim = pressDown(
|
|
298
|
-
this.containerRef()
|
|
303
|
+
this.containerRef().nativeElement,
|
|
299
304
|
SCALE.pressDownLight,
|
|
300
305
|
);
|
|
301
306
|
}
|
|
302
307
|
|
|
303
308
|
protected onPressEnd(): void {
|
|
304
309
|
this.#pressAnim?.cancel();
|
|
305
|
-
this.#pressAnim = pressRelease(this.containerRef()
|
|
310
|
+
this.#pressAnim = pressRelease(this.containerRef().nativeElement);
|
|
306
311
|
}
|
|
307
312
|
|
|
308
313
|
protected onPressCancel(): void {
|
|
309
314
|
this.#pressAnim?.cancel();
|
|
310
|
-
this.#pressAnim = pressRelease(this.containerRef()
|
|
315
|
+
this.#pressAnim = pressRelease(this.containerRef().nativeElement);
|
|
311
316
|
}
|
|
312
317
|
|
|
313
318
|
protected onTap(): void {
|
|
@@ -343,7 +348,8 @@ export class UiActionSheetCancel {
|
|
|
343
348
|
readonly label = input('Cancel');
|
|
344
349
|
readonly userClass = input<string>('', { alias: 'class' });
|
|
345
350
|
|
|
346
|
-
|
|
351
|
+
// Required: the container is always in the template.
|
|
352
|
+
readonly containerRef = viewChild.required<ElementRef>('container');
|
|
347
353
|
#pressAnim?: AnimationHandle;
|
|
348
354
|
|
|
349
355
|
protected readonly containerClass = computed(() =>
|
|
@@ -360,19 +366,19 @@ export class UiActionSheetCancel {
|
|
|
360
366
|
protected onPressStart(): void {
|
|
361
367
|
this.#pressAnim?.cancel();
|
|
362
368
|
this.#pressAnim = pressDown(
|
|
363
|
-
this.containerRef()
|
|
369
|
+
this.containerRef().nativeElement,
|
|
364
370
|
SCALE.pressDownLight,
|
|
365
371
|
);
|
|
366
372
|
}
|
|
367
373
|
|
|
368
374
|
protected onPressEnd(): void {
|
|
369
375
|
this.#pressAnim?.cancel();
|
|
370
|
-
this.#pressAnim = pressRelease(this.containerRef()
|
|
376
|
+
this.#pressAnim = pressRelease(this.containerRef().nativeElement);
|
|
371
377
|
}
|
|
372
378
|
|
|
373
379
|
protected onPressCancel(): void {
|
|
374
380
|
this.#pressAnim?.cancel();
|
|
375
|
-
this.#pressAnim = pressRelease(this.containerRef()
|
|
381
|
+
this.#pressAnim = pressRelease(this.containerRef().nativeElement);
|
|
376
382
|
}
|
|
377
383
|
|
|
378
384
|
protected onTap(): void {
|
|
@@ -1,19 +1,38 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
1
|
+
import { Component, signal } from '@angular/core';
|
|
2
2
|
import { render, waitForUpdate } from '@blotch/angular-lynx-testing-library';
|
|
3
3
|
import { LYNX_ELEMENTS } from '@blotch/angular-lynx';
|
|
4
|
-
import { describe, expect, it } from 'vitest';
|
|
5
|
-
import {
|
|
6
|
-
import { UiAlert, alertVariants } from './alert';
|
|
4
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { lynxMainThread } from '../../../test-utils/lynx-main-thread';
|
|
6
|
+
import { type AlertVariant, UiAlert, alertVariants } from './alert';
|
|
7
7
|
|
|
8
8
|
@Component({
|
|
9
|
-
standalone: true,
|
|
10
9
|
imports: [UiAlert, LYNX_ELEMENTS],
|
|
11
|
-
template:
|
|
10
|
+
template: `
|
|
11
|
+
<ui-alert
|
|
12
|
+
[variant]="variant()"
|
|
13
|
+
[title]="title()"
|
|
14
|
+
[description]="description()"
|
|
15
|
+
class="mt-2"
|
|
16
|
+
>
|
|
17
|
+
<text>Message</text>
|
|
18
|
+
</ui-alert>
|
|
19
|
+
`,
|
|
12
20
|
})
|
|
13
21
|
class AlertHost {
|
|
14
|
-
variant
|
|
22
|
+
readonly variant = signal<AlertVariant>('default');
|
|
23
|
+
readonly title = signal('');
|
|
24
|
+
readonly description = signal('');
|
|
15
25
|
}
|
|
16
26
|
|
|
27
|
+
const renderAlert = async () => {
|
|
28
|
+
const result = await render(AlertHost);
|
|
29
|
+
return {
|
|
30
|
+
...result,
|
|
31
|
+
host: result.componentRef.instance as AlertHost,
|
|
32
|
+
alert: () => result.container.querySelector('.rounded-lg')!,
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
|
|
17
36
|
describe('alertVariants', () => {
|
|
18
37
|
it('returns default variant classes', () => {
|
|
19
38
|
expect(alertVariants()).toContain('bg-background');
|
|
@@ -27,22 +46,51 @@ describe('alertVariants', () => {
|
|
|
27
46
|
});
|
|
28
47
|
|
|
29
48
|
describe('UiAlert', () => {
|
|
30
|
-
it('renders projected content', async () => {
|
|
31
|
-
const { getByText } = await
|
|
49
|
+
it('renders projected content, without a title or description', async () => {
|
|
50
|
+
const { alert, getByText } = await renderAlert();
|
|
32
51
|
expect(getByText('Message')).toBeTruthy();
|
|
52
|
+
expect(alert().querySelectorAll('text')).toHaveLength(1);
|
|
53
|
+
expect(alert().classList).toContain('mt-2');
|
|
33
54
|
});
|
|
34
55
|
|
|
35
|
-
it('renders title and description
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const { componentRef, container } = await render(UiAlert);
|
|
40
|
-
const inst = componentRef.instance as UiAlert;
|
|
41
|
-
setInputSignal(inst.title, 'Heads up');
|
|
42
|
-
setInputSignal(inst.description, 'Your download is ready.');
|
|
56
|
+
it('renders the title and description when set', async () => {
|
|
57
|
+
const { host, getByText } = await renderAlert();
|
|
58
|
+
host.title.set('Heads up');
|
|
59
|
+
host.description.set('Your download is ready.');
|
|
43
60
|
await waitForUpdate();
|
|
61
|
+
expect(getByText('Heads up').getAttribute('class')).toContain(
|
|
62
|
+
'text-foreground',
|
|
63
|
+
);
|
|
64
|
+
expect(
|
|
65
|
+
getByText('Your download is ready.').getAttribute('class'),
|
|
66
|
+
).toContain('text-muted-foreground');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('colors every part for the destructive variant', async () => {
|
|
70
|
+
const { host, alert, getByText } = await renderAlert();
|
|
71
|
+
host.variant.set('destructive');
|
|
72
|
+
host.title.set('Error');
|
|
73
|
+
host.description.set('Something went wrong.');
|
|
74
|
+
await waitForUpdate();
|
|
75
|
+
expect(alert().classList).toContain('border-destructive');
|
|
76
|
+
expect(getByText('Error').classList).toContain('text-destructive');
|
|
77
|
+
expect(getByText('Something went wrong.').classList).toContain(
|
|
78
|
+
'text-destructive',
|
|
79
|
+
);
|
|
80
|
+
});
|
|
44
81
|
|
|
45
|
-
|
|
46
|
-
|
|
82
|
+
it('reveals itself on first render', async () => {
|
|
83
|
+
const animate = vi.spyOn(lynxMainThread(), '__ElementAnimate');
|
|
84
|
+
const { alert } = await renderAlert();
|
|
85
|
+
expect(animate).toHaveBeenCalledWith(alert(), [
|
|
86
|
+
0, // Starts an animation.
|
|
87
|
+
expect.any(String),
|
|
88
|
+
[
|
|
89
|
+
{ transform: 'translateY(4px)', opacity: 0 },
|
|
90
|
+
{ transform: 'translateY(0)', opacity: 1 },
|
|
91
|
+
],
|
|
92
|
+
expect.any(Object),
|
|
93
|
+
]);
|
|
94
|
+
animate.mockRestore();
|
|
47
95
|
});
|
|
48
96
|
});
|
|
@@ -17,9 +17,10 @@ export const alertVariants = cva('flex-col rounded-lg border p-4 flex', {
|
|
|
17
17
|
variants: {
|
|
18
18
|
variant: {
|
|
19
19
|
default: 'border-border bg-background',
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
// the
|
|
20
|
+
// A solid destructive border over red at 10%. The tint is the
|
|
21
|
+
// pre-composed bg-destructive-subtle, not bg-destructive/10: a modifier
|
|
22
|
+
// needs the theme's --destructive-rgb, which themes copied before it
|
|
23
|
+
// existed don't have.
|
|
23
24
|
destructive: 'border-destructive bg-destructive-subtle',
|
|
24
25
|
},
|
|
25
26
|
},
|
|
@@ -75,20 +76,17 @@ export class UiAlert {
|
|
|
75
76
|
readonly description = input<string>('');
|
|
76
77
|
readonly userClass = input<string>('', { alias: 'class' });
|
|
77
78
|
|
|
78
|
-
readonly containerRef = viewChild<ElementRef>('container');
|
|
79
|
+
readonly containerRef = viewChild.required<ElementRef>('container');
|
|
79
80
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
}
|
|
81
|
+
/**
|
|
82
|
+
* Reveals the alert with a subtle entrance on first render. A field rather
|
|
83
|
+
* than a constructor: Angular's test build keeps a function for a
|
|
84
|
+
* constructor that nothing calls, which an app's coverage report would show
|
|
85
|
+
* as uncovered.
|
|
86
|
+
*/
|
|
87
|
+
protected readonly entrance = effect(() => {
|
|
88
|
+
revealIn(this.containerRef().nativeElement, { fromY: 4 });
|
|
89
|
+
});
|
|
92
90
|
|
|
93
91
|
protected readonly containerClass = computed(() =>
|
|
94
92
|
cn(alertVariants({ variant: this.variant() }), this.userClass()),
|