@tolle_/tolle-ui 18.2.29 → 18.2.30
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/esm2022/lib/accordion-item.component.mjs +5 -11
- package/esm2022/lib/accordion.component.mjs +4 -9
- package/esm2022/lib/alert-dialog-dynamic.component.mjs +5 -10
- package/esm2022/lib/alert-dialog.component.mjs +44 -59
- package/esm2022/lib/alert.component.mjs +5 -11
- package/esm2022/lib/aspect-ratio.component.mjs +119 -0
- package/esm2022/lib/attachment.component.mjs +334 -0
- package/esm2022/lib/avatar-fallback.component.mjs +3 -3
- package/esm2022/lib/avatar.component.mjs +4 -9
- package/esm2022/lib/badge.component.mjs +4 -9
- package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
- package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
- package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
- package/esm2022/lib/breadcrumb.component.mjs +3 -3
- package/esm2022/lib/bubble.component.mjs +301 -0
- package/esm2022/lib/button.component.mjs +5 -11
- package/esm2022/lib/calendar.component.mjs +5 -11
- package/esm2022/lib/card.component.mjs +14 -43
- package/esm2022/lib/carousel/carousel.component.mjs +5 -12
- package/esm2022/lib/chain-of-thought.component.mjs +380 -0
- package/esm2022/lib/chart-pie.component.mjs +386 -0
- package/esm2022/lib/chart.component.mjs +1146 -0
- package/esm2022/lib/chart.service.mjs +555 -0
- package/esm2022/lib/checkbox.component.mjs +5 -11
- package/esm2022/lib/checkpoint.component.mjs +134 -0
- package/esm2022/lib/collapsible.component.mjs +4 -11
- package/esm2022/lib/combobox.component.mjs +372 -0
- package/esm2022/lib/command-dialog.component.mjs +164 -0
- package/esm2022/lib/command.component.mjs +514 -0
- package/esm2022/lib/command.service.mjs +130 -0
- package/esm2022/lib/confirmation.component.mjs +219 -0
- package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
- package/esm2022/lib/context-menu.component.mjs +460 -0
- package/esm2022/lib/context-menu.service.mjs +121 -0
- package/esm2022/lib/context.component.mjs +377 -0
- package/esm2022/lib/conversation.component.mjs +442 -0
- package/esm2022/lib/country-selector.component.mjs +5 -11
- package/esm2022/lib/data-table.component.mjs +59 -12
- package/esm2022/lib/date-picker.component.mjs +251 -198
- package/esm2022/lib/date-range-picker.component.mjs +224 -116
- package/esm2022/lib/date-time-picker.component.mjs +506 -0
- package/esm2022/lib/direction.component.mjs +79 -0
- package/esm2022/lib/dropdown-item.component.mjs +3 -3
- package/esm2022/lib/dropdown-label.component.mjs +3 -3
- package/esm2022/lib/dropdown-menu.component.mjs +3 -3
- package/esm2022/lib/dropdown-separator.component.mjs +3 -3
- package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
- package/esm2022/lib/empty-state.component.mjs +4 -9
- package/esm2022/lib/field.component.mjs +394 -0
- package/esm2022/lib/hover-card.component.mjs +6 -16
- package/esm2022/lib/inline-citation.component.mjs +263 -0
- package/esm2022/lib/input-group.component.mjs +418 -0
- package/esm2022/lib/input.component.mjs +5 -11
- package/esm2022/lib/item.component.mjs +243 -0
- package/esm2022/lib/kbd.component.mjs +82 -0
- package/esm2022/lib/label.component.mjs +4 -9
- package/esm2022/lib/marker.component.mjs +135 -0
- package/esm2022/lib/masked-input.component.mjs +5 -11
- package/esm2022/lib/menubar.component.mjs +683 -0
- package/esm2022/lib/message-scroller.component.mjs +353 -0
- package/esm2022/lib/message-scroller.service.mjs +157 -0
- package/esm2022/lib/message.component.mjs +228 -0
- package/esm2022/lib/model-selector.component.mjs +310 -0
- package/esm2022/lib/multi-select.component.mjs +155 -72
- package/esm2022/lib/native-select.component.mjs +201 -0
- package/esm2022/lib/navigation-menu.component.mjs +642 -0
- package/esm2022/lib/otp-group.component.mjs +3 -3
- package/esm2022/lib/otp-slot.component.mjs +4 -9
- package/esm2022/lib/otp.component.mjs +5 -11
- package/esm2022/lib/pagination.component.mjs +7 -10
- package/esm2022/lib/plan.component.mjs +335 -0
- package/esm2022/lib/popover-content.component.mjs +4 -9
- package/esm2022/lib/popover.component.mjs +15 -13
- package/esm2022/lib/progress.component.mjs +4 -9
- package/esm2022/lib/prompt-input.component.mjs +526 -0
- package/esm2022/lib/queue.component.mjs +280 -0
- package/esm2022/lib/radio-group.component.mjs +6 -13
- package/esm2022/lib/radio-item.component.mjs +4 -9
- package/esm2022/lib/range-calendar.component.mjs +5 -11
- package/esm2022/lib/reasoning.component.mjs +335 -0
- package/esm2022/lib/resizable.component.mjs +219 -0
- package/esm2022/lib/segment.component.mjs +17 -7
- package/esm2022/lib/select-group.component.mjs +4 -8
- package/esm2022/lib/select-item.component.mjs +4 -9
- package/esm2022/lib/select-separator.component.mjs +4 -8
- package/esm2022/lib/select.component.mjs +133 -49
- package/esm2022/lib/separator.component.mjs +4 -9
- package/esm2022/lib/sheet.component.mjs +38 -56
- package/esm2022/lib/shimmer.component.mjs +84 -0
- package/esm2022/lib/sidebar.component.mjs +11 -1
- package/esm2022/lib/skeleton.component.mjs +4 -9
- package/esm2022/lib/sources.component.mjs +452 -0
- package/esm2022/lib/spinner.component.mjs +68 -0
- package/esm2022/lib/suggestion.component.mjs +207 -0
- package/esm2022/lib/switch.component.mjs +5 -11
- package/esm2022/lib/table.component.mjs +213 -0
- package/esm2022/lib/tabs.component.mjs +4 -11
- package/esm2022/lib/tag-input.component.mjs +5 -11
- package/esm2022/lib/task.component.mjs +359 -0
- package/esm2022/lib/textarea.component.mjs +5 -11
- package/esm2022/lib/theme.service.mjs +17 -6
- package/esm2022/lib/time-picker.component.mjs +923 -0
- package/esm2022/lib/toast.service.mjs +3 -2
- package/esm2022/lib/toaster.component.mjs +76 -39
- package/esm2022/lib/toggle-group.component.mjs +4 -9
- package/esm2022/lib/toggle.component.mjs +5 -11
- package/esm2022/lib/tool.component.mjs +462 -0
- package/esm2022/lib/typography.component.mjs +83 -0
- package/esm2022/lib/utils/color.mjs +140 -19
- package/esm2022/public-api.mjs +61 -1
- package/fesm2022/tolle-ui.mjs +16453 -1024
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/alert-dialog.component.d.ts +10 -2
- package/lib/aspect-ratio.component.d.ts +20 -0
- package/lib/attachment.component.d.ts +101 -0
- package/lib/bubble.component.d.ts +112 -0
- package/lib/chain-of-thought.component.d.ts +166 -0
- package/lib/chart-pie.component.d.ts +108 -0
- package/lib/chart.component.d.ts +369 -0
- package/lib/chart.service.d.ts +222 -0
- package/lib/checkpoint.component.d.ts +51 -0
- package/lib/combobox.component.d.ts +90 -0
- package/lib/command-dialog.component.d.ts +53 -0
- package/lib/command.component.d.ts +189 -0
- package/lib/command.service.d.ts +67 -0
- package/lib/confirmation.component.d.ts +70 -0
- package/lib/context-menu-trigger.directive.d.ts +12 -0
- package/lib/context-menu.component.d.ts +41 -0
- package/lib/context-menu.service.d.ts +38 -0
- package/lib/context.component.d.ts +134 -0
- package/lib/conversation.component.d.ts +165 -0
- package/lib/data-table.component.d.ts +26 -1
- package/lib/date-picker.component.d.ts +72 -11
- package/lib/date-range-picker.component.d.ts +63 -6
- package/lib/date-time-picker.component.d.ts +119 -0
- package/lib/direction.component.d.ts +45 -0
- package/lib/field.component.d.ts +201 -0
- package/lib/inline-citation.component.d.ts +103 -0
- package/lib/input-group.component.d.ts +150 -0
- package/lib/item.component.d.ts +154 -0
- package/lib/kbd.component.d.ts +50 -0
- package/lib/marker.component.d.ts +58 -0
- package/lib/menubar.component.d.ts +247 -0
- package/lib/message-scroller.component.d.ts +159 -0
- package/lib/message-scroller.service.d.ts +73 -0
- package/lib/message.component.d.ts +128 -0
- package/lib/model-selector.component.d.ts +103 -0
- package/lib/multi-select.component.d.ts +66 -14
- package/lib/native-select.component.d.ts +57 -0
- package/lib/navigation-menu.component.d.ts +230 -0
- package/lib/plan.component.d.ts +120 -0
- package/lib/popover.component.d.ts +1 -0
- package/lib/prompt-input.component.d.ts +194 -0
- package/lib/queue.component.d.ts +106 -0
- package/lib/reasoning.component.d.ts +127 -0
- package/lib/resizable.component.d.ts +43 -0
- package/lib/segment.component.d.ts +13 -3
- package/lib/select.component.d.ts +37 -5
- package/lib/sheet.component.d.ts +3 -0
- package/lib/shimmer.component.d.ts +38 -0
- package/lib/sidebar.component.d.ts +2 -0
- package/lib/sources.component.d.ts +156 -0
- package/lib/spinner.component.d.ts +29 -0
- package/lib/suggestion.component.d.ts +96 -0
- package/lib/table.component.d.ts +106 -0
- package/lib/task.component.d.ts +151 -0
- package/lib/theme.service.d.ts +9 -0
- package/lib/time-picker.component.d.ts +243 -0
- package/lib/toast.service.d.ts +3 -1
- package/lib/toaster.component.d.ts +26 -9
- package/lib/tool.component.d.ts +158 -0
- package/lib/typography.component.d.ts +32 -0
- package/lib/utils/color.d.ts +19 -5
- package/package.json +1 -1
- package/public-api.d.ts +50 -0
- package/registry/docs-content.json +8480 -1542
- package/registry/llms-full.txt +2679 -319
- package/registry/llms.txt +43 -4
- package/registry/manifest.json +9090 -1742
- package/registry/r/accordion-item.json +1 -1
- package/registry/r/accordion.json +1 -1
- package/registry/r/alert-dialog-dynamic.json +1 -1
- package/registry/r/alert-dialog.json +1 -1
- package/registry/r/alert.json +1 -1
- package/registry/r/attachment.json +23 -0
- package/registry/r/avatar-fallback.json +1 -1
- package/registry/r/avatar.json +1 -1
- package/registry/r/badge.json +1 -1
- package/registry/r/breadcrumb-item.json +1 -1
- package/registry/r/breadcrumb-link.json +1 -1
- package/registry/r/breadcrumb-separator.json +1 -1
- package/registry/r/breadcrumb.json +1 -1
- package/registry/r/bubble.json +23 -0
- package/registry/r/button.json +1 -1
- package/registry/r/calendar.json +1 -1
- package/registry/r/card.json +1 -1
- package/registry/r/carousel.json +1 -1
- package/registry/r/chain-of-thought.json +23 -0
- package/registry/r/chart-pie.json +30 -0
- package/registry/r/chart.json +28 -0
- package/registry/r/checkbox.json +1 -1
- package/registry/r/checkpoint.json +23 -0
- package/registry/r/collapsible.json +1 -1
- package/registry/r/combobox.json +31 -0
- package/registry/r/command-dialog.json +21 -0
- package/registry/r/command.json +26 -0
- package/registry/r/confirmation.json +23 -0
- package/registry/r/context.json +26 -0
- package/registry/r/conversation.json +23 -0
- package/registry/r/country-selector.json +1 -1
- package/registry/r/data-table.json +1 -1
- package/registry/r/date-picker.json +4 -4
- package/registry/r/date-range-picker.json +3 -3
- package/registry/r/date-time-picker.json +28 -0
- package/registry/r/direction.json +16 -0
- package/registry/r/dropdown-item.json +1 -1
- package/registry/r/dropdown-label.json +1 -1
- package/registry/r/dropdown-menu.json +1 -1
- package/registry/r/dropdown-separator.json +1 -1
- package/registry/r/dropdown-trigger.json +1 -1
- package/registry/r/empty-state.json +1 -1
- package/registry/r/field.json +23 -0
- package/registry/r/hover-card.json +1 -1
- package/registry/r/inline-citation.json +26 -0
- package/registry/r/input-group.json +23 -0
- package/registry/r/input.json +1 -1
- package/registry/r/item.json +23 -0
- package/registry/r/kbd.json +23 -0
- package/registry/r/label.json +1 -1
- package/registry/r/marker.json +23 -0
- package/registry/r/masked-input.json +1 -1
- package/registry/r/menubar.json +24 -0
- package/registry/r/message-scroller.json +26 -0
- package/registry/r/message.json +23 -0
- package/registry/r/model-selector.json +32 -0
- package/registry/r/multi-select.json +2 -2
- package/registry/r/native-select.json +23 -0
- package/registry/r/navigation-menu.json +24 -0
- package/registry/r/otp-group.json +1 -1
- package/registry/r/otp-slot.json +1 -1
- package/registry/r/otp.json +1 -1
- package/registry/r/pagination.json +3 -2
- package/registry/r/plan.json +23 -0
- package/registry/r/popover-content.json +1 -1
- package/registry/r/popover.json +1 -1
- package/registry/r/progress.json +1 -1
- package/registry/r/prompt-input.json +23 -0
- package/registry/r/queue.json +23 -0
- package/registry/r/radio-group.json +1 -1
- package/registry/r/radio-item.json +1 -1
- package/registry/r/range-calendar.json +1 -1
- package/registry/r/reasoning.json +23 -0
- package/registry/r/segment.json +1 -1
- package/registry/r/select-group.json +1 -1
- package/registry/r/select-item.json +1 -1
- package/registry/r/select-separator.json +1 -1
- package/registry/r/select.json +4 -3
- package/registry/r/separator.json +1 -1
- package/registry/r/sheet.json +1 -1
- package/registry/r/shimmer.json +23 -0
- package/registry/r/sidebar.json +1 -1
- package/registry/r/skeleton.json +1 -1
- package/registry/r/sources.json +23 -0
- package/registry/r/spinner.json +23 -0
- package/registry/r/suggestion.json +23 -0
- package/registry/r/switch.json +1 -1
- package/registry/r/table.json +21 -0
- package/registry/r/tabs.json +1 -1
- package/registry/r/tag-input.json +1 -1
- package/registry/r/task.json +23 -0
- package/registry/r/textarea.json +1 -1
- package/registry/r/time-picker.json +24 -0
- package/registry/r/toaster.json +2 -2
- package/registry/r/toggle-group.json +1 -1
- package/registry/r/toggle.json +1 -1
- package/registry/r/tool.json +23 -0
- package/registry/r/typography.json +23 -0
- package/registry/registry.json +915 -22
- package/theme.css +109 -8
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, forwardRef, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import { computePosition, flip, shift, offset, size, autoUpdate } from '@floating-ui/dom';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { cn } from './utils/cn';
|
|
7
|
+
import { CommandComponent, CommandInputComponent, CommandListComponent, CommandEmptyComponent, CommandItemComponent, } from './command.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common";
|
|
10
|
+
const comboboxTriggerVariants = cva('flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background text-foreground shadow-sm transition-colors ' +
|
|
11
|
+
'focus:outline-none focus-visible:border-primary/80 focus-visible:ring-4 focus-visible:ring-ring/30 ' +
|
|
12
|
+
'disabled:cursor-not-allowed disabled:opacity-50', {
|
|
13
|
+
variants: {
|
|
14
|
+
size: {
|
|
15
|
+
xs: 'h-8 px-2 text-xs',
|
|
16
|
+
sm: 'h-9 px-3 text-sm',
|
|
17
|
+
default: 'h-10 px-3 text-sm',
|
|
18
|
+
lg: 'h-11 px-4 text-base',
|
|
19
|
+
},
|
|
20
|
+
invalid: {
|
|
21
|
+
true: 'border-destructive focus-visible:border-destructive/80 focus-visible:ring-destructive/30',
|
|
22
|
+
false: '',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: { size: 'default', invalid: false },
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* A searchable single-select: a button that opens a `tolle-command` list in a
|
|
29
|
+
* floating panel. Implements `ControlValueAccessor`, so it works with
|
|
30
|
+
* `ngModel` and reactive forms.
|
|
31
|
+
*
|
|
32
|
+
* Use `tolle-select` when the list is short and needs no search, and
|
|
33
|
+
* `tolle-multi-select` when more than one value can be chosen.
|
|
34
|
+
* @new
|
|
35
|
+
*/
|
|
36
|
+
export class ComboboxComponent {
|
|
37
|
+
cdr;
|
|
38
|
+
/** Options to choose from. @default [] */
|
|
39
|
+
options = [];
|
|
40
|
+
/** Text shown on the trigger when nothing is selected. @default 'Select an option…' */
|
|
41
|
+
placeholder = 'Select an option…';
|
|
42
|
+
/** Placeholder inside the search box. @default 'Search…' */
|
|
43
|
+
searchPlaceholder = 'Search…';
|
|
44
|
+
/** Message shown when the query matches no option. @default 'No results found.' */
|
|
45
|
+
emptyMessage = 'No results found.';
|
|
46
|
+
/** Height and text size of the trigger. @default 'default' */
|
|
47
|
+
size = 'default';
|
|
48
|
+
/** Applies the destructive border and focus ring. @default false */
|
|
49
|
+
invalid = false;
|
|
50
|
+
/** Disables the control. @default false */
|
|
51
|
+
disabled = false;
|
|
52
|
+
/** Set false to filter the options yourself, e.g. server-side. @default true */
|
|
53
|
+
shouldFilter = true;
|
|
54
|
+
/** Close the panel after a value is chosen. @default true */
|
|
55
|
+
closeOnSelect = true;
|
|
56
|
+
/** Where the panel opens relative to the trigger. @default 'bottom-start' */
|
|
57
|
+
placement = 'bottom-start';
|
|
58
|
+
/** Accessible name when there is no associated visible label. @default '' */
|
|
59
|
+
ariaLabel = '';
|
|
60
|
+
/** Extra Tailwind classes merged onto the trigger via `cn()` (last-wins). */
|
|
61
|
+
class = '';
|
|
62
|
+
/** Emitted with the chosen value whenever the selection changes. */
|
|
63
|
+
valueChange = new EventEmitter();
|
|
64
|
+
/** Emitted with the query text as the user searches. */
|
|
65
|
+
searchChange = new EventEmitter();
|
|
66
|
+
/** Emitted when the panel opens. */
|
|
67
|
+
opened = new EventEmitter();
|
|
68
|
+
/** Emitted when the panel closes. */
|
|
69
|
+
closed = new EventEmitter();
|
|
70
|
+
triggerEl;
|
|
71
|
+
panelEl;
|
|
72
|
+
panelId = `combobox-panel-${Math.random().toString(36).slice(2, 11)}`;
|
|
73
|
+
value = null;
|
|
74
|
+
isOpen = false;
|
|
75
|
+
cn = cn;
|
|
76
|
+
cleanup;
|
|
77
|
+
onChange = () => { };
|
|
78
|
+
onTouched = () => { };
|
|
79
|
+
constructor(cdr) {
|
|
80
|
+
this.cdr = cdr;
|
|
81
|
+
}
|
|
82
|
+
outsideClickHandler = (event) => {
|
|
83
|
+
const target = event.target;
|
|
84
|
+
if (!this.triggerEl?.nativeElement.contains(target) &&
|
|
85
|
+
!this.panelEl?.nativeElement.contains(target)) {
|
|
86
|
+
this.close();
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
escapeHandler = (event) => {
|
|
90
|
+
if (event.key === 'Escape' && this.isOpen) {
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
this.close();
|
|
93
|
+
this.triggerEl?.nativeElement.focus();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
get selectedLabel() {
|
|
97
|
+
return this.options.find((o) => o.value === this.value)?.label ?? '';
|
|
98
|
+
}
|
|
99
|
+
get computedTriggerClass() {
|
|
100
|
+
return cn(comboboxTriggerVariants({ size: this.size, invalid: this.invalid }), this.class);
|
|
101
|
+
}
|
|
102
|
+
toggle() {
|
|
103
|
+
this.isOpen ? this.close() : this.open();
|
|
104
|
+
}
|
|
105
|
+
open() {
|
|
106
|
+
if (this.disabled || this.isOpen)
|
|
107
|
+
return;
|
|
108
|
+
this.isOpen = true;
|
|
109
|
+
this.opened.emit();
|
|
110
|
+
this.cdr.markForCheck();
|
|
111
|
+
setTimeout(() => {
|
|
112
|
+
this.updatePosition();
|
|
113
|
+
// Focus the search box so the user can type straight away.
|
|
114
|
+
this.panelEl?.nativeElement.querySelector('input')?.focus();
|
|
115
|
+
document.addEventListener('pointerdown', this.outsideClickHandler, true);
|
|
116
|
+
document.addEventListener('keydown', this.escapeHandler, true);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
close() {
|
|
120
|
+
if (!this.isOpen)
|
|
121
|
+
return;
|
|
122
|
+
this.isOpen = false;
|
|
123
|
+
this.closed.emit();
|
|
124
|
+
this.onTouched();
|
|
125
|
+
this.teardown();
|
|
126
|
+
this.cdr.markForCheck();
|
|
127
|
+
}
|
|
128
|
+
onTriggerKeyDown(event) {
|
|
129
|
+
if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key) && !this.isOpen) {
|
|
130
|
+
event.preventDefault();
|
|
131
|
+
this.open();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
onSelect(value) {
|
|
135
|
+
this.value = value;
|
|
136
|
+
this.onChange(value);
|
|
137
|
+
this.valueChange.emit(value);
|
|
138
|
+
if (this.closeOnSelect) {
|
|
139
|
+
this.close();
|
|
140
|
+
this.triggerEl?.nativeElement.focus();
|
|
141
|
+
}
|
|
142
|
+
this.cdr.markForCheck();
|
|
143
|
+
}
|
|
144
|
+
updatePosition() {
|
|
145
|
+
const trigger = this.triggerEl?.nativeElement;
|
|
146
|
+
const panel = this.panelEl?.nativeElement;
|
|
147
|
+
if (!trigger || !panel)
|
|
148
|
+
return;
|
|
149
|
+
this.cleanup = autoUpdate(trigger, panel, () => {
|
|
150
|
+
computePosition(trigger, panel, {
|
|
151
|
+
placement: this.placement,
|
|
152
|
+
middleware: [
|
|
153
|
+
offset(4),
|
|
154
|
+
flip(),
|
|
155
|
+
shift({ padding: 8 }),
|
|
156
|
+
// Match the panel to the trigger width and cap its height to the space
|
|
157
|
+
// actually available, so the list scrolls instead of overflowing.
|
|
158
|
+
size({
|
|
159
|
+
padding: 8,
|
|
160
|
+
apply({ rects, availableHeight, elements }) {
|
|
161
|
+
Object.assign(elements.floating.style, {
|
|
162
|
+
minWidth: `${rects.reference.width}px`,
|
|
163
|
+
maxHeight: `${Math.max(160, availableHeight)}px`,
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
}),
|
|
167
|
+
],
|
|
168
|
+
}).then(({ x, y }) => {
|
|
169
|
+
Object.assign(panel.style, {
|
|
170
|
+
left: `${x}px`,
|
|
171
|
+
top: `${y}px`,
|
|
172
|
+
visibility: 'visible',
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
teardown() {
|
|
178
|
+
this.cleanup?.();
|
|
179
|
+
this.cleanup = undefined;
|
|
180
|
+
document.removeEventListener('pointerdown', this.outsideClickHandler, true);
|
|
181
|
+
document.removeEventListener('keydown', this.escapeHandler, true);
|
|
182
|
+
}
|
|
183
|
+
ngOnDestroy() {
|
|
184
|
+
this.teardown();
|
|
185
|
+
}
|
|
186
|
+
writeValue(value) {
|
|
187
|
+
this.value = value;
|
|
188
|
+
this.cdr.markForCheck();
|
|
189
|
+
}
|
|
190
|
+
registerOnChange(fn) {
|
|
191
|
+
this.onChange = fn;
|
|
192
|
+
}
|
|
193
|
+
registerOnTouched(fn) {
|
|
194
|
+
this.onTouched = fn;
|
|
195
|
+
}
|
|
196
|
+
setDisabledState(isDisabled) {
|
|
197
|
+
this.disabled = isDisabled;
|
|
198
|
+
this.cdr.markForCheck();
|
|
199
|
+
}
|
|
200
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComboboxComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
201
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ComboboxComponent, isStandalone: true, selector: "tolle-combobox", inputs: { options: "options", placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", emptyMessage: "emptyMessage", size: "size", invalid: "invalid", disabled: "disabled", shouldFilter: "shouldFilter", closeOnSelect: "closeOnSelect", placement: "placement", ariaLabel: "ariaLabel", class: "class" }, outputs: { valueChange: "valueChange", searchChange: "searchChange", opened: "opened", closed: "closed" }, providers: [
|
|
202
|
+
{
|
|
203
|
+
provide: NG_VALUE_ACCESSOR,
|
|
204
|
+
useExisting: forwardRef(() => ComboboxComponent),
|
|
205
|
+
multi: true,
|
|
206
|
+
},
|
|
207
|
+
], viewQueries: [{ propertyName: "triggerEl", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panelEl", first: true, predicate: ["panel"], descendants: true }], ngImport: i0, template: `
|
|
208
|
+
<button
|
|
209
|
+
#trigger
|
|
210
|
+
type="button"
|
|
211
|
+
role="combobox"
|
|
212
|
+
aria-haspopup="listbox"
|
|
213
|
+
[attr.aria-expanded]="isOpen"
|
|
214
|
+
[attr.aria-controls]="isOpen ? panelId : null"
|
|
215
|
+
[attr.aria-label]="ariaLabel || null"
|
|
216
|
+
[attr.data-state]="isOpen ? 'open' : 'closed'"
|
|
217
|
+
[disabled]="disabled"
|
|
218
|
+
[class]="computedTriggerClass"
|
|
219
|
+
(click)="toggle()"
|
|
220
|
+
(keydown)="onTriggerKeyDown($event)"
|
|
221
|
+
>
|
|
222
|
+
<span [class]="cn('truncate', selectedLabel ? 'text-foreground' : 'text-muted-foreground')">
|
|
223
|
+
{{ selectedLabel || placeholder }}
|
|
224
|
+
</span>
|
|
225
|
+
<i
|
|
226
|
+
class="ri-expand-up-down-line shrink-0 text-muted-foreground transition-transform"
|
|
227
|
+
aria-hidden="true"
|
|
228
|
+
></i>
|
|
229
|
+
</button>
|
|
230
|
+
|
|
231
|
+
<div
|
|
232
|
+
*ngIf="isOpen"
|
|
233
|
+
#panel
|
|
234
|
+
[id]="panelId"
|
|
235
|
+
class="fixed left-0 top-0 z-[9999]"
|
|
236
|
+
style="visibility: hidden"
|
|
237
|
+
>
|
|
238
|
+
<div class="overflow-hidden rounded-md border border-border bg-popover shadow-md">
|
|
239
|
+
<tolle-command [shouldFilter]="shouldFilter" (selected)="onSelect($event)" (queryChange)="searchChange.emit($event)">
|
|
240
|
+
<tolle-command-input [placeholder]="searchPlaceholder"></tolle-command-input>
|
|
241
|
+
<tolle-command-list>
|
|
242
|
+
<tolle-command-empty>{{ emptyMessage }}</tolle-command-empty>
|
|
243
|
+
<tolle-command-item
|
|
244
|
+
*ngFor="let option of options"
|
|
245
|
+
[value]="option.value"
|
|
246
|
+
[label]="option.label"
|
|
247
|
+
[keywords]="option.keywords || []"
|
|
248
|
+
[disabled]="option.disabled || false"
|
|
249
|
+
>
|
|
250
|
+
<i
|
|
251
|
+
class="ri-check-line shrink-0"
|
|
252
|
+
[class.opacity-0]="option.value !== value"
|
|
253
|
+
aria-hidden="true"
|
|
254
|
+
></i>
|
|
255
|
+
<span class="truncate">{{ option.label }}</span>
|
|
256
|
+
</tolle-command-item>
|
|
257
|
+
</tolle-command-list>
|
|
258
|
+
</tolle-command>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CommandComponent, selector: "tolle-command", inputs: ["shouldFilter", "ariaLabel", "class"], outputs: ["selected", "queryChange"] }, { kind: "component", type: CommandInputComponent, selector: "tolle-command-input", inputs: ["placeholder", "ariaLabel", "class", "inputClass"] }, { kind: "component", type: CommandListComponent, selector: "tolle-command-list", inputs: ["ariaLabel", "class"] }, { kind: "component", type: CommandEmptyComponent, selector: "tolle-command-empty", inputs: ["class"] }, { kind: "component", type: CommandItemComponent, selector: "tolle-command-item", inputs: ["value", "label", "keywords", "disabled", "class"], outputs: ["selected"] }] });
|
|
262
|
+
}
|
|
263
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComboboxComponent, decorators: [{
|
|
264
|
+
type: Component,
|
|
265
|
+
args: [{ selector: 'tolle-combobox', standalone: true, imports: [
|
|
266
|
+
CommonModule,
|
|
267
|
+
CommandComponent,
|
|
268
|
+
CommandInputComponent,
|
|
269
|
+
CommandListComponent,
|
|
270
|
+
CommandEmptyComponent,
|
|
271
|
+
CommandItemComponent,
|
|
272
|
+
], providers: [
|
|
273
|
+
{
|
|
274
|
+
provide: NG_VALUE_ACCESSOR,
|
|
275
|
+
useExisting: forwardRef(() => ComboboxComponent),
|
|
276
|
+
multi: true,
|
|
277
|
+
},
|
|
278
|
+
], template: `
|
|
279
|
+
<button
|
|
280
|
+
#trigger
|
|
281
|
+
type="button"
|
|
282
|
+
role="combobox"
|
|
283
|
+
aria-haspopup="listbox"
|
|
284
|
+
[attr.aria-expanded]="isOpen"
|
|
285
|
+
[attr.aria-controls]="isOpen ? panelId : null"
|
|
286
|
+
[attr.aria-label]="ariaLabel || null"
|
|
287
|
+
[attr.data-state]="isOpen ? 'open' : 'closed'"
|
|
288
|
+
[disabled]="disabled"
|
|
289
|
+
[class]="computedTriggerClass"
|
|
290
|
+
(click)="toggle()"
|
|
291
|
+
(keydown)="onTriggerKeyDown($event)"
|
|
292
|
+
>
|
|
293
|
+
<span [class]="cn('truncate', selectedLabel ? 'text-foreground' : 'text-muted-foreground')">
|
|
294
|
+
{{ selectedLabel || placeholder }}
|
|
295
|
+
</span>
|
|
296
|
+
<i
|
|
297
|
+
class="ri-expand-up-down-line shrink-0 text-muted-foreground transition-transform"
|
|
298
|
+
aria-hidden="true"
|
|
299
|
+
></i>
|
|
300
|
+
</button>
|
|
301
|
+
|
|
302
|
+
<div
|
|
303
|
+
*ngIf="isOpen"
|
|
304
|
+
#panel
|
|
305
|
+
[id]="panelId"
|
|
306
|
+
class="fixed left-0 top-0 z-[9999]"
|
|
307
|
+
style="visibility: hidden"
|
|
308
|
+
>
|
|
309
|
+
<div class="overflow-hidden rounded-md border border-border bg-popover shadow-md">
|
|
310
|
+
<tolle-command [shouldFilter]="shouldFilter" (selected)="onSelect($event)" (queryChange)="searchChange.emit($event)">
|
|
311
|
+
<tolle-command-input [placeholder]="searchPlaceholder"></tolle-command-input>
|
|
312
|
+
<tolle-command-list>
|
|
313
|
+
<tolle-command-empty>{{ emptyMessage }}</tolle-command-empty>
|
|
314
|
+
<tolle-command-item
|
|
315
|
+
*ngFor="let option of options"
|
|
316
|
+
[value]="option.value"
|
|
317
|
+
[label]="option.label"
|
|
318
|
+
[keywords]="option.keywords || []"
|
|
319
|
+
[disabled]="option.disabled || false"
|
|
320
|
+
>
|
|
321
|
+
<i
|
|
322
|
+
class="ri-check-line shrink-0"
|
|
323
|
+
[class.opacity-0]="option.value !== value"
|
|
324
|
+
aria-hidden="true"
|
|
325
|
+
></i>
|
|
326
|
+
<span class="truncate">{{ option.label }}</span>
|
|
327
|
+
</tolle-command-item>
|
|
328
|
+
</tolle-command-list>
|
|
329
|
+
</tolle-command>
|
|
330
|
+
</div>
|
|
331
|
+
</div>
|
|
332
|
+
`, styles: [":host{display:block}\n"] }]
|
|
333
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { options: [{
|
|
334
|
+
type: Input
|
|
335
|
+
}], placeholder: [{
|
|
336
|
+
type: Input
|
|
337
|
+
}], searchPlaceholder: [{
|
|
338
|
+
type: Input
|
|
339
|
+
}], emptyMessage: [{
|
|
340
|
+
type: Input
|
|
341
|
+
}], size: [{
|
|
342
|
+
type: Input
|
|
343
|
+
}], invalid: [{
|
|
344
|
+
type: Input
|
|
345
|
+
}], disabled: [{
|
|
346
|
+
type: Input
|
|
347
|
+
}], shouldFilter: [{
|
|
348
|
+
type: Input
|
|
349
|
+
}], closeOnSelect: [{
|
|
350
|
+
type: Input
|
|
351
|
+
}], placement: [{
|
|
352
|
+
type: Input
|
|
353
|
+
}], ariaLabel: [{
|
|
354
|
+
type: Input
|
|
355
|
+
}], class: [{
|
|
356
|
+
type: Input
|
|
357
|
+
}], valueChange: [{
|
|
358
|
+
type: Output
|
|
359
|
+
}], searchChange: [{
|
|
360
|
+
type: Output
|
|
361
|
+
}], opened: [{
|
|
362
|
+
type: Output
|
|
363
|
+
}], closed: [{
|
|
364
|
+
type: Output
|
|
365
|
+
}], triggerEl: [{
|
|
366
|
+
type: ViewChild,
|
|
367
|
+
args: ['trigger']
|
|
368
|
+
}], panelEl: [{
|
|
369
|
+
type: ViewChild,
|
|
370
|
+
args: ['panel']
|
|
371
|
+
}] } });
|
|
372
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jb21ib2JveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixTQUFTLEVBQ1QsVUFBVSxHQUdYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUYsT0FBTyxFQUFFLEdBQUcsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsb0JBQW9CLEdBQ3JCLE1BQU0scUJBQXFCLENBQUM7OztBQUU3QixNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FDakMsMElBQTBJO0lBQ3hJLHFHQUFxRztJQUNyRyxpREFBaUQsRUFDbkQ7SUFDRSxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsa0JBQWtCO1lBQ3RCLEVBQUUsRUFBRSxrQkFBa0I7WUFDdEIsT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixFQUFFLEVBQUUscUJBQXFCO1NBQzFCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLDBGQUEwRjtZQUNoRyxLQUFLLEVBQUUsRUFBRTtTQUNWO0tBQ0Y7SUFDRCxlQUFlLEVBQUUsRUFBRSxJ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Q1A7d0JBQ1AsWUFBWTt3QkFDWixnQkFBZ0I7d0JBQ2hCLHFCQUFxQjt3QkFDckIsb0JBQW9CO3dCQUNwQixxQkFBcUI7d0JBQ3JCLG9CQUFvQjtxQkFDckIsYUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzs0QkFDaEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RUO3NGQUlRLE9BQU87c0JBQWYsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFHSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFZSxTQUFTO3NCQUE5QixTQUFTO3VCQUFDLFNBQVM7Z0JBQ0EsT0FBTztzQkFBMUIsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY29tcHV0ZVBvc2l0aW9uLCBmbGlwLCBzaGlmdCwgb2Zmc2V0LCBzaXplLCBhdXRvVXBkYXRlIH0gZnJvbSAnQGZsb2F0aW5nLXVpL2RvbSc7XG5pbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSAnY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5pbXBvcnQge1xuICBDb21tYW5kQ29tcG9uZW50LFxuICBDb21tYW5kSW5wdXRDb21wb25lbnQsXG4gIENvbW1hbmRMaXN0Q29tcG9uZW50LFxuICBDb21tYW5kRW1wdHlDb21wb25lbnQsXG4gIENvbW1hbmRJdGVtQ29tcG9uZW50LFxufSBmcm9tICcuL2NvbW1hbmQuY29tcG9uZW50JztcblxuY29uc3QgY29tYm9ib3hUcmlnZ2VyVmFyaWFudHMgPSBjdmEoXG4gICdmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc20gdHJhbnNpdGlvbi1jb2xvcnMgJyArXG4gICAgJ2ZvY3VzOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmJvcmRlci1wcmltYXJ5LzgwIGZvY3VzLXZpc2libGU6cmluZy00IGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzMwICcgK1xuICAgICdkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgc2l6ZToge1xuICAgICAgICB4czogJ2gtOCBweC0yIHRleHQteHMnLFxuICAgICAgICBzbTogJ2gtOSBweC0zIHRleHQtc20nLFxuICAgICAgICBkZWZhdWx0OiAnaC0xMCBweC0zIHRleHQtc20nLFxuICAgICAgICBsZzogJ2gtMTEgcHgtNCB0ZXh0LWJhc2UnLFxuICAgICAgfSxcbiAgICAgIGludmFsaWQ6IHtcbiAgICAgICAgdHJ1ZTogJ2JvcmRlci1kZXN0cnVjdGl2ZSBmb2N1cy12aXNpYmxlOmJvcmRlci1kZXN0cnVjdGl2ZS84MCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMzAnLFxuICAgICAgICBmYWxzZTogJycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7IHNpemU6ICdkZWZhdWx0JywgaW52YWxpZDogZmFsc2UgfSxcbiAgfVxuKTtcblxuZXhwb3J0IHR5cGUgQ29tYm9ib3hQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgY29tYm9ib3hUcmlnZ2VyVmFyaWFudHM+O1xuXG5leHBvcnQgdHlwZSBDb21ib2JveE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogRXh0cmEgdGVybXMgdGhhdCBzaG91bGQgYWxzbyBtYXRjaCB0aGlzIG9wdGlvbiB3aGVuIHNlYXJjaGluZy4gKi9cbiAga2V5d29yZHM/OiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogQSBzZWFyY2hhYmxlIHNpbmdsZS1zZWxlY3Q6IGEgYnV0dG9uIHRoYXQgb3BlbnMgYSBgdG9sbGUtY29tbWFuZGAgbGlzdCBpbiBhXG4gKiBmbG9hdGluZyBwYW5lbC4gSW1wbGVtZW50cyBgQ29udHJvbFZhbHVlQWNjZXNzb3JgLCBzbyBpdCB3b3JrcyB3aXRoXG4gKiBgbmdNb2RlbGAgYW5kIHJlYWN0aXZlIGZvcm1zLlxuICpcbiAqIFVzZSBgdG9sbGUtc2VsZWN0YCB3aGVuIHRoZSBsaXN0IGlzIHNob3J0IGFuZCBuZWVkcyBubyBzZWFyY2gsIGFuZFxuICogYHRvbGxlLW11bHRpLXNlbGVjdGAgd2hlbiBtb3JlIHRoYW4gb25lIHZhbHVlIGNhbiBiZSBjaG9zZW4uXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNvbWJvYm94JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBDb21tYW5kQ29tcG9uZW50LFxuICAgIENvbW1hbmRJbnB1dENvbXBvbmVudCxcbiAgICBDb21tYW5kTGlzdENvbXBvbmVudCxcbiAgICBDb21tYW5kRW1wdHlDb21wb25lbnQsXG4gICAgQ29tbWFuZEl0ZW1Db21wb25lbnQsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29tYm9ib3hDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uXG4gICAgICAjdHJpZ2dlclxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpc09wZW4gPyBwYW5lbElkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCB8fCBudWxsXCJcbiAgICAgIFthdHRyLmRhdGEtc3RhdGVdPVwiaXNPcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCdcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtjbGFzc109XCJjb21wdXRlZFRyaWdnZXJDbGFzc1wiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgKGtleWRvd24pPVwib25UcmlnZ2VyS2V5RG93bigkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8c3BhbiBbY2xhc3NdPVwiY24oJ3RydW5jYXRlJywgc2VsZWN0ZWRMYWJlbCA/ICd0ZXh0LWZvcmVncm91bmQnIDogJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCcpXCI+XG4gICAgICAgIHt7IHNlbGVjdGVkTGFiZWwgfHwgcGxhY2Vob2xkZXIgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxpXG4gICAgICAgIGNsYXNzPVwicmktZXhwYW5kLXVwLWRvd24tbGluZSBzaHJpbmstMCB0ZXh0LW11dGVkLWZvcmVncm91bmQgdHJhbnNpdGlvbi10cmFuc2Zvcm1cIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgPjwvaT5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiaXNPcGVuXCJcbiAgICAgICNwYW5lbFxuICAgICAgW2lkXT1cInBhbmVsSWRcIlxuICAgICAgY2xhc3M9XCJmaXhlZCBsZWZ0LTAgdG9wLTAgei1bOTk5OV1cIlxuICAgICAgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW5cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1wb3BvdmVyIHNoYWRvdy1tZFwiPlxuICAgICAgICA8dG9sbGUtY29tbWFuZCBbc2hvdWxkRmlsdGVyXT1cInNob3VsZEZpbHRlclwiIChzZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQpXCIgKHF1ZXJ5Q2hhbmdlKT1cInNlYXJjaENoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICA8dG9sbGUtY29tbWFuZC1pbnB1dCBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIj48L3RvbGxlLWNvbW1hbmQtaW5wdXQ+XG4gICAgICAgICAgPHRvbGxlLWNvbW1hbmQtbGlzdD5cbiAgICAgICAgICAgIDx0b2xsZS1jb21tYW5kLWVtcHR5Pnt7IGVtcHR5TWVzc2FnZSB9fTwvdG9sbGUtY29tbWFuZC1lbXB0eT5cbiAgICAgICAgICAgIDx0b2xsZS1jb21tYW5kLWl0ZW1cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIlxuICAgICAgICAgICAgICBba2V5d29yZHNdPVwib3B0aW9uLmtleXdvcmRzIHx8IFtdXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyaS1jaGVjay1saW5lIHNocmluay0wXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mub3BhY2l0eS0wXT1cIm9wdGlvbi52YWx1ZSAhPT0gdmFsdWVcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJ1bmNhdGVcIj57eyBvcHRpb24ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RvbGxlLWNvbW1hbmQtaXRlbT5cbiAgICAgICAgICA8L3RvbGxlLWNvbW1hbmQtbGlzdD5cbiAgICAgICAgPC90b2xsZS1jb21tYW5kPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XG4gIC8qKiBPcHRpb25zIHRvIGNob29zZSBmcm9tLiBAZGVmYXVsdCBbXSAqL1xuICBASW5wdXQoKSBvcHRpb25zOiBDb21ib2JveE9wdGlvbltdID0gW107XG4gIC8qKiBUZXh0IHNob3duIG9uIHRoZSB0cmlnZ2VyIHdoZW4gbm90aGluZyBpcyBzZWxlY3RlZC4gQGRlZmF1bHQgJ1NlbGVjdCBhbiBvcHRpb27igKYnICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1NlbGVjdCBhbiBvcHRpb27igKYnO1xuICAvKiogUGxhY2Vob2xkZXIgaW5zaWRlIHRoZSBzZWFyY2ggYm94LiBAZGVmYXVsdCAnU2VhcmNo4oCmJyAqL1xuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlciA9ICdTZWFyY2jigKYnO1xuICAvKiogTWVzc2FnZSBzaG93biB3aGVuIHRoZSBxdWVyeSBtYXRjaGVzIG5vIG9wdGlvbi4gQGRlZmF1bHQgJ05vIHJlc3VsdHMgZm91bmQuJyAqL1xuICBASW5wdXQoKSBlbXB0eU1lc3NhZ2UgPSAnTm8gcmVzdWx0cyBmb3VuZC4nO1xuICAvKiogSGVpZ2h0IGFuZCB0ZXh0IHNpemUgb2YgdGhlIHRyaWdnZXIuIEBkZWZhdWx0ICdkZWZhdWx0JyAqL1xuICBASW5wdXQoKSBzaXplOiBDb21ib2JveFByb3BzWydzaXplJ10gPSAnZGVmYXVsdCc7XG4gIC8qKiBBcHBsaWVzIHRoZSBkZXN0cnVjdGl2ZSBib3JkZXIgYW5kIGZvY3VzIHJpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGludmFsaWQgPSBmYWxzZTtcbiAgLyoqIERpc2FibGVzIHRoZSBjb250cm9sLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKiogU2V0IGZhbHNlIHRvIGZpbHRlciB0aGUgb3B0aW9ucyB5b3Vyc2VsZiwgZS5nLiBzZXJ2ZXItc2lkZS4gQGRlZmF1bHQgdHJ1ZSAqL1xuICBASW5wdXQoKSBzaG91bGRGaWx0ZXIgPSB0cnVlO1xuICAvKiogQ2xvc2UgdGhlIHBhbmVsIGFmdGVyIGEgdmFsdWUgaXMgY2hvc2VuLiBAZGVmYXVsdCB0cnVlICovXG4gIEBJbnB1dCgpIGNsb3NlT25TZWxlY3QgPSB0cnVlO1xuICAvKiogV2hlcmUgdGhlIHBhbmVsIG9wZW5zIHJlbGF0aXZlIHRvIHRoZSB0cmlnZ2VyLiBAZGVmYXVsdCAnYm90dG9tLXN0YXJ0JyAqL1xuICBASW5wdXQoKSBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnIHwgJ2JvdHRvbS1lbmQnIHwgJ3RvcC1zdGFydCcgfCAndG9wLWVuZCcgPSAnYm90dG9tLXN0YXJ0JztcbiAgLyoqIEFjY2Vzc2libGUgbmFtZSB3aGVuIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbC4gQGRlZmF1bHQgJycgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsID0gJyc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSB0cmlnZ2VyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2l0aCB0aGUgY2hvc2VuIHZhbHVlIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4gKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKiBFbWl0dGVkIHdpdGggdGhlIHF1ZXJ5IHRleHQgYXMgdGhlIHVzZXIgc2VhcmNoZXMuICovXG4gIEBPdXRwdXQoKSBzZWFyY2hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgcGFuZWwgb3BlbnMuICovXG4gIEBPdXRwdXQoKSBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHBhbmVsIGNsb3Nlcy4gKi9cbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJykgdHJpZ2dlckVsPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbmVsJykgcGFuZWxFbD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHJlYWRvbmx5IHBhbmVsSWQgPSBgY29tYm9ib3gtcGFuZWwtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMSl9YDtcblxuICB2YWx1ZTogYW55ID0gbnVsbDtcbiAgaXNPcGVuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xuXG4gIHByaXZhdGUgY2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0c2lkZUNsaWNrSGFuZGxlciA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xuICAgIGlmIChcbiAgICAgICF0aGlzLnRyaWdnZXJFbD8ubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmXG4gICAgICAhdGhpcy5wYW5lbEVsPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldClcbiAgICApIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlc2NhcGVIYW5kbGVyID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLnRyaWdnZXJFbD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBnZXQgc2VsZWN0ZWRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCgobykgPT4gby52YWx1ZSA9PT0gdGhpcy52YWx1ZSk/LmxhYmVsID8/ICcnO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkVHJpZ2dlckNsYXNzKCkge1xuICAgIHJldHVybiBjbihjb21ib2JveFRyaWdnZXJWYXJpYW50cyh7IHNpemU6IHRoaXMuc2l6ZSwgaW52YWxpZDogdGhpcy5pbnZhbGlkIH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA/IHRoaXMuY2xvc2UoKSA6IHRoaXMub3BlbigpO1xuICB9XG5cbiAgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW5lZC5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgIC8vIEZvY3VzIHRoZSBzZWFyY2ggYm94IHNvIHRoZSB1c2VyIGNhbiB0eXBlIHN0cmFpZ2h0IGF3YXkuXG4gICAgICB0aGlzLnBhbmVsRWw/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKT8uZm9jdXMoKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vdXRzaWRlQ2xpY2tIYW5kbGVyLCB0cnVlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmVzY2FwZUhhbmRsZXIsIHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy50ZWFyZG93bigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25UcmlnZ2VyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChbJ0Fycm93RG93bicsICdBcnJvd1VwJywgJ0VudGVyJywgJyAnXS5pbmNsdWRlcyhldmVudC5rZXkpICYmICF0aGlzLmlzT3Blbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VsZWN0KHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLnRyaWdnZXJFbD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdHJpZ2dlciA9IHRoaXMudHJpZ2dlckVsPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wYW5lbEVsPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdHJpZ2dlciB8fCAhcGFuZWwpIHJldHVybjtcblxuICAgIHRoaXMuY2xlYW51cCA9IGF1dG9VcGRhdGUodHJpZ2dlciwgcGFuZWwsICgpID0+IHtcbiAgICAgIGNvbXB1dGVQb3NpdGlvbih0cmlnZ2VyLCBwYW5lbCwge1xuICAgICAgICBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50LFxuICAgICAgICBtaWRkbGV3YXJlOiBbXG4gICAgICAgICAgb2Zmc2V0KDQpLFxuICAgICAgICAgIGZsaXAoKSxcbiAgICAgICAgICBzaGlmdCh7IHBhZGRpbmc6IDggfSksXG4gICAgICAgICAgLy8gTWF0Y2ggdGhlIHBhbmVsIHRvIHRoZSB0cmlnZ2VyIHdpZHRoIGFuZCBjYXAgaXRzIGhlaWdodCB0byB0aGUgc3BhY2VcbiAgICAgICAgICAvLyBhY3R1YWxseSBhdmFpbGFibGUsIHNvIHRoZSBsaXN0IHNjcm9sbHMgaW5zdGVhZCBvZiBvdmVyZmxvd2luZy5cbiAgICAgICAgICBzaXplKHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDgsXG4gICAgICAgICAgICBhcHBseSh7IHJlY3RzLCBhdmFpbGFibGVIZWlnaHQsIGVsZW1lbnRzIH0pIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50cy5mbG9hdGluZy5zdHlsZSwge1xuICAgICAgICAgICAgICAgIG1pbldpZHRoOiBgJHtyZWN0cy5yZWZlcmVuY2Uud2lkdGh9cHhgLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogYCR7TWF0aC5tYXgoMTYwLCBhdmFpbGFibGVIZWlnaHQpfXB4YCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSkudGhlbigoeyB4LCB5IH0pID0+IHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwYW5lbC5zdHlsZSwge1xuICAgICAgICAgIGxlZnQ6IGAke3h9cHhgLFxuICAgICAgICAgIHRvcDogYCR7eX1weGAsXG4gICAgICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZWFyZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXA/LigpO1xuICAgIHRoaXMuY2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub3V0c2lkZUNsaWNrSGFuZGxlciwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuZXNjYXBlSGFuZGxlciwgdHJ1ZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnRlYXJkb3duKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { cn } from './utils/cn';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
/**
|
|
7
|
+
* The ⌘K command palette: a `tolle-command` in a centred modal overlay.
|
|
8
|
+
*
|
|
9
|
+
* Project a full command menu inside:
|
|
10
|
+
*
|
|
11
|
+
* ```html
|
|
12
|
+
* <tolle-command-dialog [(open)]="paletteOpen">
|
|
13
|
+
* <tolle-command (selected)="run($event)">
|
|
14
|
+
* <tolle-command-input></tolle-command-input>
|
|
15
|
+
* <tolle-command-list>…</tolle-command-list>
|
|
16
|
+
* </tolle-command>
|
|
17
|
+
* </tolle-command-dialog>
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* Set `shortcut` to bind a global hotkey (default ⌘K / Ctrl+K).
|
|
21
|
+
* @new
|
|
22
|
+
*/
|
|
23
|
+
export class CommandDialogComponent {
|
|
24
|
+
cdr;
|
|
25
|
+
/** Whether the palette is visible. Supports two-way binding via `[(open)]`. @default false */
|
|
26
|
+
open = false;
|
|
27
|
+
/**
|
|
28
|
+
* Global hotkey that toggles the palette, as `mod+key` where `mod` maps to ⌘
|
|
29
|
+
* on macOS and Ctrl elsewhere. Set to `''` to disable the binding.
|
|
30
|
+
* @default 'mod+k'
|
|
31
|
+
*/
|
|
32
|
+
shortcut = 'mod+k';
|
|
33
|
+
/** Close the palette when the backdrop is clicked. @default true */
|
|
34
|
+
closeOnBackdrop = true;
|
|
35
|
+
/** Accessible name for the dialog. @default 'Command palette' */
|
|
36
|
+
ariaLabel = 'Command palette';
|
|
37
|
+
/** Extra Tailwind classes merged onto the panel via `cn()` (last-wins). */
|
|
38
|
+
class = '';
|
|
39
|
+
/** Two-way binding partner for `open`. */
|
|
40
|
+
openChange = new EventEmitter();
|
|
41
|
+
/** Emitted when the palette opens. */
|
|
42
|
+
opened = new EventEmitter();
|
|
43
|
+
/** Emitted when the palette closes. */
|
|
44
|
+
closed = new EventEmitter();
|
|
45
|
+
panelEl;
|
|
46
|
+
cn = cn;
|
|
47
|
+
constructor(cdr) {
|
|
48
|
+
this.cdr = cdr;
|
|
49
|
+
}
|
|
50
|
+
onKeyDown = (event) => {
|
|
51
|
+
if (event.key === 'Escape' && this.open) {
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
this.setOpen(false);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (!this.shortcut)
|
|
57
|
+
return;
|
|
58
|
+
const parts = this.shortcut.toLowerCase().split('+');
|
|
59
|
+
const key = parts[parts.length - 1];
|
|
60
|
+
const needsMod = parts.includes('mod') || parts.includes('meta') || parts.includes('ctrl');
|
|
61
|
+
const modHeld = event.metaKey || event.ctrlKey;
|
|
62
|
+
if (event.key.toLowerCase() === key && (!needsMod || modHeld)) {
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
this.setOpen(!this.open);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
ngOnInit() {
|
|
68
|
+
document.addEventListener('keydown', this.onKeyDown);
|
|
69
|
+
}
|
|
70
|
+
ngOnDestroy() {
|
|
71
|
+
document.removeEventListener('keydown', this.onKeyDown);
|
|
72
|
+
}
|
|
73
|
+
onBackdropClick() {
|
|
74
|
+
if (this.closeOnBackdrop)
|
|
75
|
+
this.setOpen(false);
|
|
76
|
+
}
|
|
77
|
+
setOpen(next) {
|
|
78
|
+
if (this.open === next)
|
|
79
|
+
return;
|
|
80
|
+
this.open = next;
|
|
81
|
+
this.openChange.emit(next);
|
|
82
|
+
(next ? this.opened : this.closed).emit();
|
|
83
|
+
this.cdr.markForCheck();
|
|
84
|
+
if (next) {
|
|
85
|
+
// Focus the projected search box once the panel is in the DOM, so typing
|
|
86
|
+
// works immediately on open.
|
|
87
|
+
setTimeout(() => this.panelEl?.nativeElement.querySelector('input')?.focus());
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
91
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CommandDialogComponent, isStandalone: true, selector: "tolle-command-dialog", inputs: { open: "open", shortcut: "shortcut", closeOnBackdrop: "closeOnBackdrop", ariaLabel: "ariaLabel", class: "class" }, outputs: { openChange: "openChange", opened: "opened", closed: "closed" }, viewQueries: [{ propertyName: "panelEl", first: true, predicate: ["panel"], descendants: true }], ngImport: i0, template: `
|
|
92
|
+
<div
|
|
93
|
+
*ngIf="open"
|
|
94
|
+
class="fixed inset-0 z-[9999] flex items-start justify-center p-4 pt-[15vh]"
|
|
95
|
+
role="dialog"
|
|
96
|
+
aria-modal="true"
|
|
97
|
+
[attr.aria-label]="ariaLabel"
|
|
98
|
+
>
|
|
99
|
+
<div
|
|
100
|
+
class="fixed inset-0 bg-black/50 backdrop-blur-sm animate-in fade-in"
|
|
101
|
+
aria-hidden="true"
|
|
102
|
+
(click)="onBackdropClick()"
|
|
103
|
+
></div>
|
|
104
|
+
|
|
105
|
+
<div
|
|
106
|
+
#panel
|
|
107
|
+
[class]="cn(
|
|
108
|
+
'relative z-10 w-full max-w-lg overflow-hidden rounded-lg border border-border bg-popover shadow-lg',
|
|
109
|
+
class
|
|
110
|
+
)"
|
|
111
|
+
>
|
|
112
|
+
<ng-content></ng-content>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
116
|
+
}
|
|
117
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandDialogComponent, decorators: [{
|
|
118
|
+
type: Component,
|
|
119
|
+
args: [{ selector: 'tolle-command-dialog', standalone: true, imports: [CommonModule], template: `
|
|
120
|
+
<div
|
|
121
|
+
*ngIf="open"
|
|
122
|
+
class="fixed inset-0 z-[9999] flex items-start justify-center p-4 pt-[15vh]"
|
|
123
|
+
role="dialog"
|
|
124
|
+
aria-modal="true"
|
|
125
|
+
[attr.aria-label]="ariaLabel"
|
|
126
|
+
>
|
|
127
|
+
<div
|
|
128
|
+
class="fixed inset-0 bg-black/50 backdrop-blur-sm animate-in fade-in"
|
|
129
|
+
aria-hidden="true"
|
|
130
|
+
(click)="onBackdropClick()"
|
|
131
|
+
></div>
|
|
132
|
+
|
|
133
|
+
<div
|
|
134
|
+
#panel
|
|
135
|
+
[class]="cn(
|
|
136
|
+
'relative z-10 w-full max-w-lg overflow-hidden rounded-lg border border-border bg-popover shadow-lg',
|
|
137
|
+
class
|
|
138
|
+
)"
|
|
139
|
+
>
|
|
140
|
+
<ng-content></ng-content>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
`, styles: [":host{display:block}\n"] }]
|
|
144
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { open: [{
|
|
145
|
+
type: Input
|
|
146
|
+
}], shortcut: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}], closeOnBackdrop: [{
|
|
149
|
+
type: Input
|
|
150
|
+
}], ariaLabel: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], class: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], openChange: [{
|
|
155
|
+
type: Output
|
|
156
|
+
}], opened: [{
|
|
157
|
+
type: Output
|
|
158
|
+
}], closed: [{
|
|
159
|
+
type: Output
|
|
160
|
+
}], panelEl: [{
|
|
161
|
+
type: ViewChild,
|
|
162
|
+
args: ['panel']
|
|
163
|
+
}] } });
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jb21tYW5kLWRpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixTQUFTLEdBSVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQWdDSCxNQUFNLE9BQU8sc0JBQXNCO0lBMkJiO0lBMUJwQiw4RkFBOEY7SUFDckYsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUN0Qjs7OztPQUlHO0lBQ00sUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUM1QixvRUFBb0U7SUFDM0QsZUFBZSxHQUFHLElBQUksQ0FBQztJQUNoQyxpRUFBaUU7SUFDeEQsU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBQ3ZDLDJFQUEyRTtJQUNsRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRXBCLDBDQUEwQztJQUNoQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUNuRCxzQ0FBc0M7SUFDNUIsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDNUMsdUNBQXVDO0lBQzdCLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRXhCLE9BQU8sQ0FBMkI7SUFFNUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUVsQixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtJQUFHLENBQUM7SUFFN0IsU0FBUyxHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO1FBQ3BELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxR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QUVhLE9BQU87c0JBQTFCLFNBQVM7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBFbGVtZW50UmVmLFxuICBWaWV3Q2hpbGQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuLyoqXG4gKiBUaGUg4oyYSyBjb21tYW5kIHBhbGV0dGU6IGEgYHRvbGxlLWNvbW1hbmRgIGluIGEgY2VudHJlZCBtb2RhbCBvdmVybGF5LlxuICpcbiAqIFByb2plY3QgYSBmdWxsIGNvbW1hbmQgbWVudSBpbnNpZGU6XG4gKlxuICogYGBgaHRtbFxuICogPHRvbGxlLWNvbW1hbmQtZGlhbG9nIFsob3BlbildPVwicGFsZXR0ZU9wZW5cIj5cbiAqICAgPHRvbGxlLWNvbW1hbmQgKHNlbGVjdGVkKT1cInJ1bigkZXZlbnQpXCI+XG4gKiAgICAgPHRvbGxlLWNvbW1hbmQtaW5wdXQ+PC90b2xsZS1jb21tYW5kLWlucHV0PlxuICogICAgIDx0b2xsZS1jb21tYW5kLWxpc3Q+4oCmPC90b2xsZS1jb21tYW5kLWxpc3Q+XG4gKiAgIDwvdG9sbGUtY29tbWFuZD5cbiAqIDwvdG9sbGUtY29tbWFuZC1kaWFsb2c+XG4gKiBgYGBcbiAqXG4gKiBTZXQgYHNob3J0Y3V0YCB0byBiaW5kIGEgZ2xvYmFsIGhvdGtleSAoZGVmYXVsdCDijJhLIC8gQ3RybCtLKS5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtY29tbWFuZC1kaWFsb2cnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cIm9wZW5cIlxuICAgICAgY2xhc3M9XCJmaXhlZCBpbnNldC0wIHotWzk5OTldIGZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1jZW50ZXIgcC00IHB0LVsxNXZoXVwiXG4gICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZml4ZWQgaW5zZXQtMCBiZy1ibGFjay81MCBiYWNrZHJvcC1ibHVyLXNtIGFuaW1hdGUtaW4gZmFkZS1pblwiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soKVwiXG4gICAgICA+PC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgI3BhbmVsXG4gICAgICAgIFtjbGFzc109XCJjbihcbiAgICAgICAgICAncmVsYXRpdmUgei0xMCB3LWZ1bGwgbWF4LXctbGcgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctcG9wb3ZlciBzaGFkb3ctbGcnLFxuICAgICAgICAgIGNsYXNzXG4gICAgICAgIClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFdoZXRoZXIgdGhlIHBhbGV0dGUgaXMgdmlzaWJsZS4gU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nIHZpYSBgWyhvcGVuKV1gLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBvcGVuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBHbG9iYWwgaG90a2V5IHRoYXQgdG9nZ2xlcyB0aGUgcGFsZXR0ZSwgYXMgYG1vZCtrZXlgIHdoZXJlIGBtb2RgIG1hcHMgdG8g4oyYXG4gICAqIG9uIG1hY09TIGFuZCBDdHJsIGVsc2V3aGVyZS4gU2V0IHRvIGAnJ2AgdG8gZGlzYWJsZSB0aGUgYmluZGluZy5cbiAgICogQGRlZmF1bHQgJ21vZCtrJ1xuICAgKi9cbiAgQElucHV0KCkgc2hvcnRjdXQgPSAnbW9kK2snO1xuICAvKiogQ2xvc2UgdGhlIHBhbGV0dGUgd2hlbiB0aGUgYmFja2Ryb3AgaXMgY2xpY2tlZC4gQGRlZmF1bHQgdHJ1ZSAqL1xuICBASW5wdXQoKSBjbG9zZU9uQmFja2Ryb3AgPSB0cnVlO1xuICAvKiogQWNjZXNzaWJsZSBuYW1lIGZvciB0aGUgZGlhbG9nLiBAZGVmYXVsdCAnQ29tbWFuZCBwYWxldHRlJyAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWwgPSAnQ29tbWFuZCBwYWxldHRlJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHBhbmVsIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIFR3by13YXkgYmluZGluZyBwYXJ0bmVyIGZvciBgb3BlbmAuICovXG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSBwYWxldHRlIG9wZW5zLiAqL1xuICBAT3V0cHV0KCkgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSBwYWxldHRlIGNsb3Nlcy4gKi9cbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCdwYW5lbCcpIHBhbmVsRWw/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcm90ZWN0ZWQgY24gPSBjbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLm9wZW4pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldE9wZW4oZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG9ydGN1dCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5zaG9ydGN1dC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcrJyk7XG4gICAgY29uc3Qga2V5ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbmVlZHNNb2QgPSBwYXJ0cy5pbmNsdWRlcygnbW9kJykgfHwgcGFydHMuaW5jbHVkZXMoJ21ldGEnKSB8fCBwYXJ0cy5pbmNsdWRlcygnY3RybCcpO1xuICAgIGNvbnN0IG1vZEhlbGQgPSBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXk7XG5cbiAgICBpZiAoZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09IGtleSAmJiAoIW5lZWRzTW9kIHx8IG1vZEhlbGQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRPcGVuKCF0aGlzLm9wZW4pO1xuICAgIH1cbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcbiAgfVxuXG4gIG9uQmFja2Ryb3BDbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZU9uQmFja2Ryb3ApIHRoaXMuc2V0T3BlbihmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHNldE9wZW4obmV4dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW4gPT09IG5leHQpIHJldHVybjtcbiAgICB0aGlzLm9wZW4gPSBuZXh0O1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KG5leHQpO1xuICAgIChuZXh0ID8gdGhpcy5vcGVuZWQgOiB0aGlzLmNsb3NlZCkuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgaWYgKG5leHQpIHtcbiAgICAgIC8vIEZvY3VzIHRoZSBwcm9qZWN0ZWQgc2VhcmNoIGJveCBvbmNlIHRoZSBwYW5lbCBpcyBpbiB0aGUgRE9NLCBzbyB0eXBpbmdcbiAgICAgIC8vIHdvcmtzIGltbWVkaWF0ZWx5IG9uIG9wZW4uXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucGFuZWxFbD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpPy5mb2N1cygpKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|