@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,462 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Directive, EventEmitter, Injectable, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { BehaviorSubject, Subscription } from 'rxjs';
|
|
4
|
+
import { skip } from 'rxjs/operators';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { cn } from './utils/cn';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
const toolStateVariants = cva('inline-flex shrink-0 items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium', {
|
|
10
|
+
variants: {
|
|
11
|
+
state: {
|
|
12
|
+
pending: 'bg-muted text-muted-foreground',
|
|
13
|
+
running: 'bg-info/10 text-info',
|
|
14
|
+
success: 'bg-success/10 text-success',
|
|
15
|
+
error: 'bg-destructive/10 text-destructive',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
defaultVariants: {
|
|
19
|
+
state: 'pending',
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
/** Remixicon class shown in the state chip for each state. */
|
|
23
|
+
const TOOL_STATE_ICONS = {
|
|
24
|
+
pending: 'ri-time-line',
|
|
25
|
+
running: 'ri-loader-4-line animate-spin',
|
|
26
|
+
success: 'ri-check-line',
|
|
27
|
+
error: 'ri-error-warning-line',
|
|
28
|
+
};
|
|
29
|
+
/** Default chip text for each state. */
|
|
30
|
+
const TOOL_STATE_LABELS = {
|
|
31
|
+
pending: 'Pending',
|
|
32
|
+
running: 'Running',
|
|
33
|
+
success: 'Completed',
|
|
34
|
+
error: 'Error',
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Coordinates a `tolle-tool` with its header, input and output.
|
|
38
|
+
*
|
|
39
|
+
* Header/input/output are OnPush siblings projected into the tool, so the
|
|
40
|
+
* shared open + state they render from is published here.
|
|
41
|
+
*
|
|
42
|
+
* Provided on `ToolComponent`, so each tool call gets its own instance.
|
|
43
|
+
*/
|
|
44
|
+
export class ToolService {
|
|
45
|
+
openSource = new BehaviorSubject(false);
|
|
46
|
+
/** Emits whether the tool call is expanded. */
|
|
47
|
+
open$ = this.openSource.asObservable();
|
|
48
|
+
stateSource = new BehaviorSubject('pending');
|
|
49
|
+
/** Emits the tool call's lifecycle state. */
|
|
50
|
+
state$ = this.stateSource.asObservable();
|
|
51
|
+
/** True while the tool call is expanded. */
|
|
52
|
+
get open() {
|
|
53
|
+
return this.openSource.value;
|
|
54
|
+
}
|
|
55
|
+
/** The tool call's current state. */
|
|
56
|
+
get state() {
|
|
57
|
+
return this.stateSource.value;
|
|
58
|
+
}
|
|
59
|
+
setOpen(value) {
|
|
60
|
+
if (this.openSource.value !== value)
|
|
61
|
+
this.openSource.next(value);
|
|
62
|
+
}
|
|
63
|
+
toggle() {
|
|
64
|
+
this.setOpen(!this.openSource.value);
|
|
65
|
+
}
|
|
66
|
+
setState(state) {
|
|
67
|
+
if (this.stateSource.value !== state)
|
|
68
|
+
this.stateSource.next(state);
|
|
69
|
+
}
|
|
70
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
71
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolService });
|
|
72
|
+
}
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolService, decorators: [{
|
|
74
|
+
type: Injectable
|
|
75
|
+
}] });
|
|
76
|
+
const toolVariants = cva('w-full overflow-hidden rounded-md border bg-card text-card-foreground', {
|
|
77
|
+
variants: {
|
|
78
|
+
state: {
|
|
79
|
+
pending: 'border-border',
|
|
80
|
+
running: 'border-info/40',
|
|
81
|
+
success: 'border-border',
|
|
82
|
+
error: 'border-destructive/40',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
defaultVariants: {
|
|
86
|
+
state: 'pending',
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
/**
|
|
90
|
+
* A collapsible record of one tool/function call: what was invoked, the
|
|
91
|
+
* arguments it received and the result it returned.
|
|
92
|
+
*
|
|
93
|
+
* Compose it from `tolle-tool-header`, `tolle-tool-input` and
|
|
94
|
+
* `tolle-tool-output`.
|
|
95
|
+
* @new
|
|
96
|
+
*/
|
|
97
|
+
export class ToolComponent {
|
|
98
|
+
/** Lifecycle of the call, driving the header chip and border. @default 'pending' */
|
|
99
|
+
state = 'pending';
|
|
100
|
+
/** Whether the call's input and output are expanded. @default false */
|
|
101
|
+
open = false;
|
|
102
|
+
/** Extra Tailwind classes merged onto the tool via `cn()` (last-wins). */
|
|
103
|
+
class = '';
|
|
104
|
+
/** Emitted with the new state whenever the call is expanded or collapsed. */
|
|
105
|
+
openChange = new EventEmitter();
|
|
106
|
+
service = inject(ToolService);
|
|
107
|
+
cdr = inject(ChangeDetectorRef);
|
|
108
|
+
subscriptions = new Subscription();
|
|
109
|
+
/** True while an `open` input is being pushed into the service. */
|
|
110
|
+
applyingInput = false;
|
|
111
|
+
ngOnInit() {
|
|
112
|
+
this.service.setOpen(this.open);
|
|
113
|
+
this.service.setState(this.state);
|
|
114
|
+
// `skip(1)` drops the BehaviorSubject's current value so mounting never
|
|
115
|
+
// emits a spurious `openChange`.
|
|
116
|
+
this.subscriptions.add(this.service.open$.pipe(skip(1)).subscribe((open) => {
|
|
117
|
+
this.open = open;
|
|
118
|
+
this.cdr.markForCheck();
|
|
119
|
+
// Only user-driven toggles are worth reporting; echoing a change the
|
|
120
|
+
// parent just made would fight a `[(open)]` binding.
|
|
121
|
+
if (!this.applyingInput)
|
|
122
|
+
this.openChange.emit(open);
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
ngOnChanges(changes) {
|
|
126
|
+
if (changes['open'])
|
|
127
|
+
this.applyInput(this.open);
|
|
128
|
+
this.service.setState(this.state);
|
|
129
|
+
// A bound `class` input is written through Angular's styling path,
|
|
130
|
+
// which does not mark an OnPush view dirty on its own.
|
|
131
|
+
this.cdr.markForCheck();
|
|
132
|
+
}
|
|
133
|
+
applyInput(open) {
|
|
134
|
+
this.applyingInput = true;
|
|
135
|
+
try {
|
|
136
|
+
this.service.setOpen(open);
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
this.applyingInput = false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
ngOnDestroy() {
|
|
143
|
+
this.subscriptions.unsubscribe();
|
|
144
|
+
}
|
|
145
|
+
get computedClass() {
|
|
146
|
+
return cn(toolVariants({ state: this.state }), this.class);
|
|
147
|
+
}
|
|
148
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
149
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ToolComponent, isStandalone: true, selector: "tolle-tool", inputs: { state: "state", open: "open", class: "class" }, outputs: { openChange: "openChange" }, providers: [ToolService], usesOnChanges: true, ngImport: i0, template: `
|
|
150
|
+
<div [class]="computedClass" [attr.data-state]="open ? 'open' : 'closed'">
|
|
151
|
+
<ng-content></ng-content>
|
|
152
|
+
</div>
|
|
153
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
154
|
+
}
|
|
155
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolComponent, decorators: [{
|
|
156
|
+
type: Component,
|
|
157
|
+
args: [{ selector: 'tolle-tool', standalone: true, imports: [CommonModule], providers: [ToolService], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
158
|
+
<div [class]="computedClass" [attr.data-state]="open ? 'open' : 'closed'">
|
|
159
|
+
<ng-content></ng-content>
|
|
160
|
+
</div>
|
|
161
|
+
`, styles: [":host{display:block}\n"] }]
|
|
162
|
+
}], propDecorators: { state: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], open: [{
|
|
165
|
+
type: Input
|
|
166
|
+
}], class: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], openChange: [{
|
|
169
|
+
type: Output
|
|
170
|
+
}] } });
|
|
171
|
+
/** Clickable header of a `tolle-tool`: the tool's name plus its state chip. */
|
|
172
|
+
export class ToolHeaderComponent {
|
|
173
|
+
/**
|
|
174
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
175
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
176
|
+
* rendering the class it was born with.
|
|
177
|
+
*/
|
|
178
|
+
ngOnChanges() {
|
|
179
|
+
this.cdr.markForCheck();
|
|
180
|
+
}
|
|
181
|
+
/** Name of the tool that was called. @default '' */
|
|
182
|
+
name = '';
|
|
183
|
+
/** Remixicon class shown before the tool name. @default 'ri-tools-line' */
|
|
184
|
+
icon = 'ri-tools-line';
|
|
185
|
+
/** Overrides the chip text; defaults to a label derived from the state. @default '' */
|
|
186
|
+
stateLabelOverride = '';
|
|
187
|
+
/** Extra Tailwind classes merged onto the header via `cn()` (last-wins). */
|
|
188
|
+
class = '';
|
|
189
|
+
/** Extra Tailwind classes merged onto the state chip via `cn()` (last-wins). */
|
|
190
|
+
chipClassName = '';
|
|
191
|
+
service = inject(ToolService);
|
|
192
|
+
cdr = inject(ChangeDetectorRef);
|
|
193
|
+
subscriptions = new Subscription();
|
|
194
|
+
open = false;
|
|
195
|
+
state = 'pending';
|
|
196
|
+
ngOnInit() {
|
|
197
|
+
this.subscriptions.add(this.service.open$.subscribe((open) => {
|
|
198
|
+
this.open = open;
|
|
199
|
+
this.cdr.markForCheck();
|
|
200
|
+
}));
|
|
201
|
+
this.subscriptions.add(this.service.state$.subscribe((state) => {
|
|
202
|
+
this.state = state;
|
|
203
|
+
this.cdr.markForCheck();
|
|
204
|
+
}));
|
|
205
|
+
}
|
|
206
|
+
ngOnDestroy() {
|
|
207
|
+
this.subscriptions.unsubscribe();
|
|
208
|
+
}
|
|
209
|
+
get stateIcon() {
|
|
210
|
+
return TOOL_STATE_ICONS[this.state];
|
|
211
|
+
}
|
|
212
|
+
get stateLabel() {
|
|
213
|
+
return this.stateLabelOverride || TOOL_STATE_LABELS[this.state];
|
|
214
|
+
}
|
|
215
|
+
get chipClass() {
|
|
216
|
+
return cn(toolStateVariants({ state: this.state }), this.chipClassName);
|
|
217
|
+
}
|
|
218
|
+
get computedClass() {
|
|
219
|
+
return cn('flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors', 'hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring', this.class);
|
|
220
|
+
}
|
|
221
|
+
onToggle() {
|
|
222
|
+
this.service.toggle();
|
|
223
|
+
}
|
|
224
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
225
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ToolHeaderComponent, isStandalone: true, selector: "tolle-tool-header", inputs: { name: "name", icon: "icon", stateLabelOverride: "stateLabelOverride", class: "class", chipClassName: "chipClassName" }, usesOnChanges: true, ngImport: i0, template: `
|
|
226
|
+
<button
|
|
227
|
+
type="button"
|
|
228
|
+
data-tool-header
|
|
229
|
+
[attr.aria-expanded]="open"
|
|
230
|
+
[attr.data-state]="open ? 'open' : 'closed'"
|
|
231
|
+
[class]="computedClass"
|
|
232
|
+
(click)="onToggle()"
|
|
233
|
+
>
|
|
234
|
+
<i [class]="icon" class="shrink-0 text-muted-foreground" aria-hidden="true"></i>
|
|
235
|
+
|
|
236
|
+
<span class="truncate font-medium text-foreground" data-tool-name>{{ name }}</span>
|
|
237
|
+
|
|
238
|
+
<span [class]="chipClass" data-tool-state>
|
|
239
|
+
<i [class]="stateIcon" aria-hidden="true"></i>
|
|
240
|
+
{{ stateLabel }}
|
|
241
|
+
</span>
|
|
242
|
+
|
|
243
|
+
<i
|
|
244
|
+
class="ri-arrow-down-s-line shrink-0 text-muted-foreground transition-transform duration-200"
|
|
245
|
+
[class.rotate-180]="open"
|
|
246
|
+
aria-hidden="true"
|
|
247
|
+
></i>
|
|
248
|
+
|
|
249
|
+
<ng-content></ng-content>
|
|
250
|
+
</button>
|
|
251
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
252
|
+
}
|
|
253
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolHeaderComponent, decorators: [{
|
|
254
|
+
type: Component,
|
|
255
|
+
args: [{ selector: 'tolle-tool-header', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
256
|
+
<button
|
|
257
|
+
type="button"
|
|
258
|
+
data-tool-header
|
|
259
|
+
[attr.aria-expanded]="open"
|
|
260
|
+
[attr.data-state]="open ? 'open' : 'closed'"
|
|
261
|
+
[class]="computedClass"
|
|
262
|
+
(click)="onToggle()"
|
|
263
|
+
>
|
|
264
|
+
<i [class]="icon" class="shrink-0 text-muted-foreground" aria-hidden="true"></i>
|
|
265
|
+
|
|
266
|
+
<span class="truncate font-medium text-foreground" data-tool-name>{{ name }}</span>
|
|
267
|
+
|
|
268
|
+
<span [class]="chipClass" data-tool-state>
|
|
269
|
+
<i [class]="stateIcon" aria-hidden="true"></i>
|
|
270
|
+
{{ stateLabel }}
|
|
271
|
+
</span>
|
|
272
|
+
|
|
273
|
+
<i
|
|
274
|
+
class="ri-arrow-down-s-line shrink-0 text-muted-foreground transition-transform duration-200"
|
|
275
|
+
[class.rotate-180]="open"
|
|
276
|
+
aria-hidden="true"
|
|
277
|
+
></i>
|
|
278
|
+
|
|
279
|
+
<ng-content></ng-content>
|
|
280
|
+
</button>
|
|
281
|
+
`, styles: [":host{display:block}\n"] }]
|
|
282
|
+
}], propDecorators: { name: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}], icon: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}], stateLabelOverride: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], class: [{
|
|
289
|
+
type: Input
|
|
290
|
+
}], chipClassName: [{
|
|
291
|
+
type: Input
|
|
292
|
+
}] } });
|
|
293
|
+
/**
|
|
294
|
+
* Base for the two payload panels. Owns the shared "visible only while the
|
|
295
|
+
* tool is expanded" wiring and the payload-to-text formatting.
|
|
296
|
+
*
|
|
297
|
+
* Decorated with a selector-less `@Directive()` because it uses Angular
|
|
298
|
+
* features (DI and lifecycle hooks) on behalf of its subclasses.
|
|
299
|
+
*/
|
|
300
|
+
export class ToolPayloadBase {
|
|
301
|
+
/**
|
|
302
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
303
|
+
* not mark an OnPush component dirty — without this hook subclasses keep
|
|
304
|
+
* rendering the class they were born with.
|
|
305
|
+
*/
|
|
306
|
+
ngOnChanges() {
|
|
307
|
+
this.cdr.markForCheck();
|
|
308
|
+
}
|
|
309
|
+
/** Payload to render; objects are pretty-printed as JSON, strings are shown as-is. */
|
|
310
|
+
payload = null;
|
|
311
|
+
service = inject(ToolService);
|
|
312
|
+
cdr = inject(ChangeDetectorRef);
|
|
313
|
+
subscriptions = new Subscription();
|
|
314
|
+
open = false;
|
|
315
|
+
ngOnInit() {
|
|
316
|
+
this.subscriptions.add(this.service.open$.subscribe((open) => {
|
|
317
|
+
this.open = open;
|
|
318
|
+
this.cdr.markForCheck();
|
|
319
|
+
}));
|
|
320
|
+
}
|
|
321
|
+
ngOnDestroy() {
|
|
322
|
+
this.subscriptions.unsubscribe();
|
|
323
|
+
}
|
|
324
|
+
/** True once there is a payload worth rendering. */
|
|
325
|
+
get hasPayload() {
|
|
326
|
+
return this.payload !== null && this.payload !== undefined && this.payload !== '';
|
|
327
|
+
}
|
|
328
|
+
/** The payload as display text. Falls back to `String()` for cyclic values. */
|
|
329
|
+
get formatted() {
|
|
330
|
+
if (typeof this.payload === 'string')
|
|
331
|
+
return this.payload;
|
|
332
|
+
try {
|
|
333
|
+
return JSON.stringify(this.payload, null, 2) ?? String(this.payload);
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return String(this.payload);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolPayloadBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
340
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: ToolPayloadBase, usesOnChanges: true, ngImport: i0 });
|
|
341
|
+
}
|
|
342
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolPayloadBase, decorators: [{
|
|
343
|
+
type: Directive
|
|
344
|
+
}] });
|
|
345
|
+
/** Arguments the tool was called with. Visible while the `tolle-tool` is expanded. */
|
|
346
|
+
export class ToolInputComponent extends ToolPayloadBase {
|
|
347
|
+
/** Arguments passed to the tool; objects are pretty-printed as JSON. @default null */
|
|
348
|
+
payload = null;
|
|
349
|
+
/** Heading above the payload. @default 'Parameters' */
|
|
350
|
+
label = 'Parameters';
|
|
351
|
+
/** Extra Tailwind classes merged onto the panel via `cn()` (last-wins). */
|
|
352
|
+
class = '';
|
|
353
|
+
get computedClass() {
|
|
354
|
+
return cn('flex flex-col gap-1.5 border-t border-border px-3 py-2', this.class);
|
|
355
|
+
}
|
|
356
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
357
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ToolInputComponent, isStandalone: true, selector: "tolle-tool-input", inputs: { payload: "payload", label: "label", class: "class" }, usesInheritance: true, ngImport: i0, template: `
|
|
358
|
+
<div *ngIf="open" data-tool-input [class]="computedClass">
|
|
359
|
+
<p *ngIf="label" class="text-xs font-medium uppercase tracking-wide text-muted-foreground">
|
|
360
|
+
{{ label }}
|
|
361
|
+
</p>
|
|
362
|
+
|
|
363
|
+
<pre
|
|
364
|
+
*ngIf="hasPayload; else projected"
|
|
365
|
+
class="max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground"
|
|
366
|
+
>{{ formatted }}</pre>
|
|
367
|
+
|
|
368
|
+
<ng-template #projected>
|
|
369
|
+
<div class="max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground">
|
|
370
|
+
<ng-content></ng-content>
|
|
371
|
+
</div>
|
|
372
|
+
</ng-template>
|
|
373
|
+
</div>
|
|
374
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
375
|
+
}
|
|
376
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolInputComponent, decorators: [{
|
|
377
|
+
type: Component,
|
|
378
|
+
args: [{ selector: 'tolle-tool-input', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
379
|
+
<div *ngIf="open" data-tool-input [class]="computedClass">
|
|
380
|
+
<p *ngIf="label" class="text-xs font-medium uppercase tracking-wide text-muted-foreground">
|
|
381
|
+
{{ label }}
|
|
382
|
+
</p>
|
|
383
|
+
|
|
384
|
+
<pre
|
|
385
|
+
*ngIf="hasPayload; else projected"
|
|
386
|
+
class="max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground"
|
|
387
|
+
>{{ formatted }}</pre>
|
|
388
|
+
|
|
389
|
+
<ng-template #projected>
|
|
390
|
+
<div class="max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground">
|
|
391
|
+
<ng-content></ng-content>
|
|
392
|
+
</div>
|
|
393
|
+
</ng-template>
|
|
394
|
+
</div>
|
|
395
|
+
`, styles: [":host{display:block}\n"] }]
|
|
396
|
+
}], propDecorators: { payload: [{
|
|
397
|
+
type: Input
|
|
398
|
+
}], label: [{
|
|
399
|
+
type: Input
|
|
400
|
+
}], class: [{
|
|
401
|
+
type: Input
|
|
402
|
+
}] } });
|
|
403
|
+
/** Result the tool returned. Visible while the `tolle-tool` is expanded. */
|
|
404
|
+
export class ToolOutputComponent extends ToolPayloadBase {
|
|
405
|
+
/** Result returned by the tool; objects are pretty-printed as JSON. @default null */
|
|
406
|
+
payload = null;
|
|
407
|
+
/** Heading above the payload. @default 'Result' */
|
|
408
|
+
label = 'Result';
|
|
409
|
+
/** Styles the payload as a failure. @default false */
|
|
410
|
+
error = false;
|
|
411
|
+
/** Extra Tailwind classes merged onto the panel via `cn()` (last-wins). */
|
|
412
|
+
class = '';
|
|
413
|
+
get payloadClass() {
|
|
414
|
+
return cn('max-h-64 overflow-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground', this.error && 'bg-destructive/10 text-destructive');
|
|
415
|
+
}
|
|
416
|
+
get computedClass() {
|
|
417
|
+
return cn('flex flex-col gap-1.5 border-t border-border px-3 py-2', this.class);
|
|
418
|
+
}
|
|
419
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolOutputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
420
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ToolOutputComponent, isStandalone: true, selector: "tolle-tool-output", inputs: { payload: "payload", label: "label", error: "error", class: "class" }, usesInheritance: true, ngImport: i0, template: `
|
|
421
|
+
<div *ngIf="open" data-tool-output [class]="computedClass">
|
|
422
|
+
<p *ngIf="label" class="text-xs font-medium uppercase tracking-wide text-muted-foreground">
|
|
423
|
+
{{ label }}
|
|
424
|
+
</p>
|
|
425
|
+
|
|
426
|
+
<pre *ngIf="hasPayload; else projected" [class]="payloadClass">{{ formatted }}</pre>
|
|
427
|
+
|
|
428
|
+
<ng-template #projected>
|
|
429
|
+
<div [class]="payloadClass">
|
|
430
|
+
<ng-content></ng-content>
|
|
431
|
+
</div>
|
|
432
|
+
</ng-template>
|
|
433
|
+
</div>
|
|
434
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
435
|
+
}
|
|
436
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolOutputComponent, decorators: [{
|
|
437
|
+
type: Component,
|
|
438
|
+
args: [{ selector: 'tolle-tool-output', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
439
|
+
<div *ngIf="open" data-tool-output [class]="computedClass">
|
|
440
|
+
<p *ngIf="label" class="text-xs font-medium uppercase tracking-wide text-muted-foreground">
|
|
441
|
+
{{ label }}
|
|
442
|
+
</p>
|
|
443
|
+
|
|
444
|
+
<pre *ngIf="hasPayload; else projected" [class]="payloadClass">{{ formatted }}</pre>
|
|
445
|
+
|
|
446
|
+
<ng-template #projected>
|
|
447
|
+
<div [class]="payloadClass">
|
|
448
|
+
<ng-content></ng-content>
|
|
449
|
+
</div>
|
|
450
|
+
</ng-template>
|
|
451
|
+
</div>
|
|
452
|
+
`, styles: [":host{display:block}\n"] }]
|
|
453
|
+
}], propDecorators: { payload: [{
|
|
454
|
+
type: Input
|
|
455
|
+
}], label: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], error: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], class: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}] } });
|
|
462
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL3Rvb2wuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvTCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBRWhDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUMzQixzRkFBc0YsRUFDdEY7SUFDRSxRQUFRLEVBQUU7UUFDUixLQUFLLEVBQUU7WUFDTCxPQUFPLEVBQUUsZ0NBQWdDO1lBQ3pDLE9BQU8sRUFBRSxzQkFBc0I7WUFDL0IsT0FBTyxFQUFFLDRCQUE0QjtZQUNyQyxLQUFLLEVBQUUsb0NBQW9DO1NBQzVDO0tBQ0Y7SUFDRCxlQUFlLEVBQUU7UUFDZixLQUFLLEVBQUUsU0FBUztLQUNqQjtDQUNGLENBQ0YsQ0FBQztBQU9GLDhEQUE4RDtBQUM5RCxNQUFNLGdCQUFnQixHQUE4QjtJQUNsRCxPQUFPLEVBQUUsY0FBYztJQUN2QixPQUFPLEVBQUUsK0JBQStCO0lBQ3hDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLEtBQUssRUFBRSx1QkFBdUI7Q0FDL0IsQ0FBQztBQUVGLHdDQUF3QztBQUN4QyxNQUFNLGlCQUFpQixHQUE4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bkUsT0FBTyxHQUFZLElBQUksQ0FBQztJQUMxQyxtREFBbUQ7SUFDMUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztJQUMxQixzREFBc0Q7SUFDN0MsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN2QiwyRUFBMkU7SUFDbEUsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVwQixJQUFJLFlBQVk7UUFDZCxPQUFPLEVBQUUsQ0FDUCxrRkFBa0YsRUFDbEYsSUFBSSxDQUFDLEtBQUssSUFBSSxvQ0FBb0MsQ0FDbkQsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEYsQ0FBQzt3R0FuQlUsbUJBQW1COzRGQUFuQixtQkFBbUIsb0xBaEJwQjs7Ozs7Ozs7Ozs7Ozs7R0FjVCwrRkFoQlMsWUFBWTs7NEZBa0JYLG1CQUFtQjtrQkF0Qi9CLFNBQVM7K0JBQ0UsbUJBQW1CLGNBRWpCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7OztHQWNUOzhCQUlpQixPQUFPO3NCQUF4QixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuY29uc3QgdG9vbFN0YXRlVmFyaWFudHMgPSBjdmEoXG4gICdpbmxpbmUtZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZC1mdWxsIHB4LTIgcHktMC41IHRleHQteHMgZm9udC1tZWRpdW0nLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIHBlbmRpbmc6ICdiZy1tdXRlZCB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgICBydW5uaW5nOiAnYmctaW5mby8xMCB0ZXh0LWluZm8nLFxuICAgICAgICBzdWNjZXNzOiAnYmctc3VjY2Vzcy8xMCB0ZXh0LXN1Y2Nlc3MnLFxuICAgICAgICBlcnJvcjogJ2JnLWRlc3RydWN0aXZlLzEwIHRleHQtZGVzdHJ1Y3RpdmUnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgc3RhdGU6ICdwZW5kaW5nJyxcbiAgICB9LFxuICB9XG4pO1xuXG5leHBvcnQgdHlwZSBUb29sU3RhdGVQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgdG9vbFN0YXRlVmFyaWFudHM+O1xuXG4vKiogTGlmZWN5Y2xlIG9mIGEgdG9vbCBjYWxsLiAqL1xuZXhwb3J0IHR5cGUgVG9vbFN0YXRlID0gTm9uTnVsbGFibGU8VG9vbFN0YXRlUHJvcHNbJ3N0YXRlJ10+O1xuXG4vKiogUmVtaXhpY29uIGNsYXNzIHNob3duIGluIHRoZSBzdGF0ZSBjaGlwIGZvciBlYWNoIHN0YXRlLiAqL1xuY29uc3QgVE9PTF9TVEFURV9JQ09OUzogUmVjb3JkPFRvb2xTdGF0ZSwgc3RyaW5nPiA9IHtcbiAgcGVuZGluZzogJ3JpLXRpbWUtbGluZScsXG4gIHJ1bm5pbmc6ICdyaS1sb2FkZXItNC1saW5lIGFuaW1hdGUtc3BpbicsXG4gIHN1Y2Nlc3M6ICdyaS1jaGVjay1saW5lJyxcbiAgZXJyb3I6ICdyaS1lcnJvci13YXJuaW5nLWxpbmUnLFxufTtcblxuLyoqIERlZmF1bHQgY2hpcCB0ZXh0IGZvciBlYWNoIHN0YXRlLiAqL1xuY29uc3QgVE9PTF9TVEFURV9MQUJFTFM6IFJlY29yZDxUb29sU3RhdGUsIHN0cmluZz4gPSB7XG4gIHBlbmRpbmc6ICdQZW5kaW5nJyxcbiAgcnVubmluZzogJ1J1bm5pbmcnLFxuICBzdWNjZXNzOiAnQ29tcGxldGVkJyxcbiAgZXJyb3I6ICdFcnJvcicsXG59O1xuXG4vKipcbiAqIENvb3JkaW5hdGVzIGEgYHRvbGxlLXRvb2xgIHdpdGggaXRzIGhlYWRlciwgaW5wdXQgYW5kIG91dHB1dC5cbiAqXG4gKiBIZWFkZXIvaW5wdXQvb3V0cHV0IGFyZSBPblB1c2ggc2libGluZ3MgcHJvamVjdGVkIGludG8gdGhlIHRvb2wsIHNvIHRoZVxuICogc2hhcmVkIG9wZW4gKyBzdGF0ZSB0aGV5IHJlbmRlciBmcm9tIGlzIHB1Ymxpc2hlZCBoZXJlLlxuICpcbiAqIFByb3ZpZGVkIG9uIGBUb29sQ29tcG9uZW50YCwgc28gZWFjaCB0b29sIGNhbGwgZ2V0cyBpdHMgb3duIGluc3RhbmNlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVG9vbFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wZW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIEVtaXRzIHdoZXRoZXIgdGhlIHRvb2wgY2FsbCBpcyBleHBhbmRlZC4gKi9cbiAgcmVhZG9ubHkgb3BlbiQgPSB0aGlzLm9wZW5Tb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VG9vbFN0YXRlPigncGVuZGluZycpO1xuICAvKiogRW1pdHMgdGhlIHRvb2wgY2FsbCdzIGxpZmVjeWNsZSBzdGF0ZS4gKi9cbiAgcmVhZG9ubHkgc3RhdGUkID0gdGhpcy5zdGF0ZVNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICAvKiogVHJ1ZSB3aGlsZSB0aGUgdG9vbCBjYWxsIGlzIGV4cGFuZGVkLiAqL1xuICBnZXQgb3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuU291cmNlLnZhbHVlO1xuICB9XG5cbiAgLyoqIFRoZSB0b29sIGNhbGwncyBjdXJyZW50IHN0YXRlLiAqL1xuICBnZXQgc3RhdGUoKTogVG9vbFN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVNvdXJjZS52YWx1ZTtcbiAgfVxuXG4gIHNldE9wZW4odmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuU291cmNlLnZhbHVlICE9PSB2YWx1ZSkgdGhpcy5vcGVuU291cmNlLm5leHQodmFsdWUpO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3BlbighdGhpcy5vcGVuU291cmNlLnZhbHVlKTtcbiAgfVxuXG4gIHNldFN0YXRlKHN0YXRlOiBUb29sU3RhdGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZVNvdXJjZS52YWx1ZSAhPT0gc3RhdGUpIHRoaXMuc3RhdGVTb3VyY2UubmV4dChzdGF0ZSk7XG4gIH1cbn1cblxuY29uc3QgdG9vbFZhcmlhbnRzID0gY3ZhKCd3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQnLCB7XG4gIHZhcmlhbnRzOiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIHBlbmRpbmc6ICdib3JkZXItYm9yZGVyJyxcbiAgICAgIHJ1bm5pbmc6ICdib3JkZXItaW5mby80MCcsXG4gICAgICBzdWNjZXNzOiAnYm9yZGVyLWJvcmRlcicsXG4gICAgICBlcnJvcjogJ2JvcmRlci1kZXN0cnVjdGl2ZS80MCcsXG4gICAgfSxcbiAgfSxcbiAgZGVmYXVsdFZhcmlhbnRzOiB7XG4gICAgc3RhdGU6ICdwZW5kaW5nJyxcbiAgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBUb29sUHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIHRvb2xWYXJpYW50cz47XG5cbi8qKlxuICogQSBjb2xsYXBzaWJsZSByZWNvcmQgb2Ygb25lIHRvb2wvZnVuY3Rpb24gY2FsbDogd2hhdCB3YXMgaW52b2tlZCwgdGhlXG4gKiBhcmd1bWVudHMgaXQgcmVjZWl2ZWQgYW5kIHRoZSByZXN1bHQgaXQgcmV0dXJuZWQuXG4gKlxuICogQ29tcG9zZSBpdCBmcm9tIGB0b2xsZS10b29sLWhlYWRlcmAsIGB0b2xsZS10b29sLWlucHV0YCBhbmRcbiAqIGB0b2xsZS10b29sLW91dHB1dGAuXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRvb2wnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbVG9vbFNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzXCIgW2F0dHIuZGF0YS1zdGF0ZV09XCJvcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCdcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgVG9vbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogTGlmZWN5Y2xlIG9mIHRoZSBjYWxsLCBkcml2aW5nIHRoZSBoZWFkZXIgY2hpcCBhbmQgYm9yZGVyLiBAZGVmYXVsdCAncGVuZGluZycgKi9cbiAgQElucHV0KCkgc3RhdGU6IFRvb2xTdGF0ZSA9ICdwZW5kaW5nJztcbiAgLyoqIFdoZXRoZXIgdGhlIGNhbGwncyBpbnB1dCBhbmQgb3V0cHV0IGFyZSBleHBhbmRlZC4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgb3BlbiA9IGZhbHNlO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgdG9vbCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIC8qKiBFbWl0dGVkIHdpdGggdGhlIG5ldyBzdGF0ZSB3aGVuZXZlciB0aGUgY2FsbCBpcyBleHBhbmRlZCBvciBjb2xsYXBzZWQuICovXG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChUb29sU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAvKiogVHJ1ZSB3aGlsZSBhbiBgb3BlbmAgaW5wdXQgaXMgYmVpbmcgcHVzaGVkIGludG8gdGhlIHNlcnZpY2UuICovXG4gIHByaXZhdGUgYXBwbHlpbmdJbnB1dCA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5zZXRPcGVuKHRoaXMub3Blbik7XG4gICAgdGhpcy5zZXJ2aWNlLnNldFN0YXRlKHRoaXMuc3RhdGUpO1xuICAgIC8vIGBza2lwKDEpYCBkcm9wcyB0aGUgQmVoYXZpb3JTdWJqZWN0J3MgY3VycmVudCB2YWx1ZSBzbyBtb3VudGluZyBuZXZlclxuICAgIC8vIGVtaXRzIGEgc3B1cmlvdXMgYG9wZW5DaGFuZ2VgLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnNlcnZpY2Uub3BlbiQucGlwZShza2lwKDEpKS5zdWJzY3JpYmUoKG9wZW4pID0+IHtcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIC8vIE9ubHkgdXNlci1kcml2ZW4gdG9nZ2xlcyBhcmUgd29ydGggcmVwb3J0aW5nOyBlY2hvaW5nIGEgY2hhbmdlIHRoZVxuICAgICAgICAvLyBwYXJlbnQganVzdCBtYWRlIHdvdWxkIGZpZ2h0IGEgYFsob3BlbildYCBiaW5kaW5nLlxuICAgICAgICBpZiAoIXRoaXMuYXBwbHlpbmdJbnB1dCkgdGhpcy5vcGVuQ2hhbmdlLmVtaXQob3Blbik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ29wZW4nXSkgdGhpcy5hcHBseUlucHV0KHRoaXMub3Blbik7XG4gICAgdGhpcy5zZXJ2aWNlLnNldFN0YXRlKHRoaXMuc3RhdGUpO1xuICBcbiAgICAvLyBBIGJvdW5kIGBjbGFzc2AgaW5wdXQgaXMgd3JpdHRlbiB0aHJvdWdoIEFuZ3VsYXIncyBzdHlsaW5nIHBhdGgsXG4gICAgLy8gd2hpY2ggZG9lcyBub3QgbWFyayBhbiBPblB1c2ggdmlldyBkaXJ0eSBvbiBpdHMgb3duLlxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUlucHV0KG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5aW5nSW5wdXQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNlcnZpY2Uuc2V0T3BlbihvcGVuKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHBseWluZ0lucHV0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24odG9vbFZhcmlhbnRzKHsgc3RhdGU6IHRoaXMuc3RhdGUgfSksIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKiBDbGlja2FibGUgaGVhZGVyIG9mIGEgYHRvbGxlLXRvb2xgOiB0aGUgdG9vbCdzIG5hbWUgcGx1cyBpdHMgc3RhdGUgY2hpcC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRvb2wtaGVhZGVyJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS10b29sLWhlYWRlclxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuXCJcbiAgICAgIFthdHRyLmRhdGEtc3RhdGVdPVwib3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnXCJcbiAgICAgIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCJcbiAgICAgIChjbGljayk9XCJvblRvZ2dsZSgpXCJcbiAgICA+XG4gICAgICA8aSBbY2xhc3NdPVwiaWNvblwiIGNsYXNzPVwic2hyaW5rLTAgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuXG4gICAgICA8c3BhbiBjbGFzcz1cInRydW5jYXRlIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdG9vbC1uYW1lPnt7IG5hbWUgfX08L3NwYW4+XG5cbiAgICAgIDxzcGFuIFtjbGFzc109XCJjaGlwQ2xhc3NcIiBkYXRhLXRvb2wtc3RhdGU+XG4gICAgICAgIDxpIFtjbGFzc109XCJzdGF0ZUljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIHt7IHN0YXRlTGFiZWwgfX1cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJyaS1hcnJvdy1kb3duLXMtbGluZSBzaHJpbmstMCB0ZXh0LW11dGVkLWZvcmVncm91bmQgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwXCJcbiAgICAgICAgW2NsYXNzLnJvdGF0ZS0xODBdPVwib3BlblwiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICA+PC9pPlxuXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9idXR0b24+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2xIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIE5hbWUgb2YgdGhlIHRvb2wgdGhhdCB3YXMgY2FsbGVkLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBuYW1lID0gJyc7XG4gIC8qKiBSZW1peGljb24gY2xhc3Mgc2hvd24gYmVmb3JlIHRoZSB0b29sIG5hbWUuIEBkZWZhdWx0ICdyaS10b29scy1saW5lJyAqL1xuICBASW5wdXQoKSBpY29uID0gJ3JpLXRvb2xzLWxpbmUnO1xuICAvKiogT3ZlcnJpZGVzIHRoZSBjaGlwIHRleHQ7IGRlZmF1bHRzIHRvIGEgbGFiZWwgZGVyaXZlZCBmcm9tIHRoZSBzdGF0ZS4gQGRlZmF1bHQgJycgKi9cbiAgQElucHV0KCkgc3RhdGVMYWJlbE92ZXJyaWRlID0gJyc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBoZWFkZXIgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHN0YXRlIGNoaXAgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2hpcENsYXNzTmFtZSA9ICcnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChUb29sU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIG9wZW4gPSBmYWxzZTtcbiAgc3RhdGU6IFRvb2xTdGF0ZSA9ICdwZW5kaW5nJztcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5zZXJ2aWNlLm9wZW4kLnN1YnNjcmliZSgob3BlbikgPT4ge1xuICAgICAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5zZXJ2aWNlLnN0YXRlJC5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBzdGF0ZUljb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVE9PTF9TVEFURV9JQ09OU1t0aGlzLnN0YXRlXTtcbiAgfVxuXG4gIGdldCBzdGF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVMYWJlbE92ZXJyaWRlIHx8IFRPT0xfU1RBVEVfTEFCRUxTW3RoaXMuc3RhdGVdO1xuICB9XG5cbiAgZ2V0IGNoaXBDbGFzcygpIHtcbiAgICByZXR1cm4gY24odG9vbFN0YXRlVmFyaWFudHMoeyBzdGF0ZTogdGhpcy5zdGF0ZSB9KSwgdGhpcy5jaGlwQ2xhc3NOYW1lKTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZENsYXNzKCkge1xuICAgIHJldHVybiBjbihcbiAgICAgICdmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0yIHRleHQtbGVmdCB0ZXh0LXNtIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICdob3ZlcjpiZy1hY2NlbnQvNTAgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLWluc2V0IGZvY3VzLXZpc2libGU6cmluZy1yaW5nJyxcbiAgICAgIHRoaXMuY2xhc3NcbiAgICApO1xuICB9XG5cbiAgb25Ub2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnRvZ2dsZSgpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBmb3IgdGhlIHR3byBwYXlsb2FkIHBhbmVscy4gT3ducyB0aGUgc2hhcmVkIFwidmlzaWJsZSBvbmx5IHdoaWxlIHRoZVxuICogdG9vbCBpcyBleHBhbmRlZFwiIHdpcmluZyBhbmQgdGhlIHBheWxvYWQtdG8tdGV4dCBmb3JtYXR0aW5nLlxuICpcbiAqIERlY29yYXRlZCB3aXRoIGEgc2VsZWN0b3ItbGVzcyBgQERpcmVjdGl2ZSgpYCBiZWNhdXNlIGl0IHVzZXMgQW5ndWxhclxuICogZmVhdHVyZXMgKERJIGFuZCBsaWZlY3ljbGUgaG9va3MpIG9uIGJlaGFsZiBvZiBpdHMgc3ViY2xhc3Nlcy5cbiAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVG9vbFBheWxvYWRCYXNlIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgc3ViY2xhc3NlcyBrZWVwXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgdGhleSB3ZXJlIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFBheWxvYWQgdG8gcmVuZGVyOyBvYmplY3RzIGFyZSBwcmV0dHktcHJpbnRlZCBhcyBKU09OLCBzdHJpbmdzIGFyZSBzaG93biBhcy1pcy4gKi9cbiAgcGF5bG9hZDogdW5rbm93biA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoVG9vbFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBvcGVuID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc2VydmljZS5vcGVuJC5zdWJzY3JpYmUoKG9wZW4pID0+IHtcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBUcnVlIG9uY2UgdGhlcmUgaXMgYSBwYXlsb2FkIHdvcnRoIHJlbmRlcmluZy4gKi9cbiAgZ2V0IGhhc1BheWxvYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGF5bG9hZCAhPT0gbnVsbCAmJiB0aGlzLnBheWxvYWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnBheWxvYWQgIT09ICcnO1xuICB9XG5cbiAgLyoqIFRoZSBwYXlsb2FkIGFzIGRpc3BsYXkgdGV4dC4gRmFsbHMgYmFjayB0byBgU3RyaW5nKClgIGZvciBjeWNsaWMgdmFsdWVzLiAqL1xuICBnZXQgZm9ybWF0dGVkKCk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnBheWxvYWQgPT09ICdzdHJpbmcnKSByZXR1cm4gdGhpcy5wYXlsb2FkO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5wYXlsb2FkLCBudWxsLCAyKSA/PyBTdHJpbmcodGhpcy5wYXlsb2FkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBTdHJpbmcodGhpcy5wYXlsb2FkKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFyZ3VtZW50cyB0aGUgdG9vbCB3YXMgY2FsbGVkIHdpdGguIFZpc2libGUgd2hpbGUgdGhlIGB0b2xsZS10b29sYCBpcyBleHBhbmRlZC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRvb2wtaW5wdXQnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAqbmdJZj1cIm9wZW5cIiBkYXRhLXRvb2wtaW5wdXQgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj5cbiAgICAgIDxwICpuZ0lmPVwibGFiZWxcIiBjbGFzcz1cInRleHQteHMgZm9udC1tZWRpdW0gdXBwZXJjYXNlIHRyYWNraW5nLXdpZGUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgIHt7IGxhYmVsIH19XG4gICAgICA8L3A+XG5cbiAgICAgIDxwcmVcbiAgICAgICAgKm5nSWY9XCJoYXNQYXlsb2FkOyBlbHNlIHByb2plY3RlZFwiXG4gICAgICAgIGNsYXNzPVwibWF4LWgtNjQgb3ZlcmZsb3ctYXV0byByb3VuZGVkLW1kIGJnLW11dGVkIHAtMyBmb250LW1vbm8gdGV4dC14cyB0ZXh0LWZvcmVncm91bmRcIlxuICAgICAgPnt7IGZvcm1hdHRlZCB9fTwvcHJlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI3Byb2plY3RlZD5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1heC1oLTY0IG92ZXJmbG93LWF1dG8gcm91bmRlZC1tZCBiZy1tdXRlZCBwLTMgZm9udC1tb25vIHRleHQteHMgdGV4dC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2xJbnB1dENvbXBvbmVudCBleHRlbmRzIFRvb2xQYXlsb2FkQmFzZSB7XG4gIC8qKiBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSB0b29sOyBvYmplY3RzIGFyZSBwcmV0dHktcHJpbnRlZCBhcyBKU09OLiBAZGVmYXVsdCBudWxsICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlIHBheWxvYWQ6IHVua25vd24gPSBudWxsO1xuICAvKiogSGVhZGluZyBhYm92ZSB0aGUgcGF5bG9hZC4gQGRlZmF1bHQgJ1BhcmFtZXRlcnMnICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJ1BhcmFtZXRlcnMnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgcGFuZWwgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oJ2ZsZXggZmxleC1jb2wgZ2FwLTEuNSBib3JkZXItdCBib3JkZXItYm9yZGVyIHB4LTMgcHktMicsIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKiBSZXN1bHQgdGhlIHRvb2wgcmV0dXJuZWQuIFZpc2libGUgd2hpbGUgdGhlIGB0b2xsZS10b29sYCBpcyBleHBhbmRlZC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRvb2wtb3V0cHV0JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgKm5nSWY9XCJvcGVuXCIgZGF0YS10b29sLW91dHB1dCBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPlxuICAgICAgPHAgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwidGV4dC14cyBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5cbiAgICAgICAge3sgbGFiZWwgfX1cbiAgICAgIDwvcD5cblxuICAgICAgPHByZSAqbmdJZj1cImhhc1BheWxvYWQ7IGVsc2UgcHJvamVjdGVkXCIgW2NsYXNzXT1cInBheWxvYWRDbGFzc1wiPnt7IGZvcm1hdHRlZCB9fTwvcHJlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI3Byb2plY3RlZD5cbiAgICAgICAgPGRpdiBbY2xhc3NdPVwicGF5bG9hZENsYXNzXCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2xPdXRwdXRDb21wb25lbnQgZXh0ZW5kcyBUb29sUGF5bG9hZEJhc2Uge1xuICAvKiogUmVzdWx0IHJldHVybmVkIGJ5IHRoZSB0b29sOyBvYmplY3RzIGFyZSBwcmV0dHktcHJpbnRlZCBhcyBKU09OLiBAZGVmYXVsdCBudWxsICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlIHBheWxvYWQ6IHVua25vd24gPSBudWxsO1xuICAvKiogSGVhZGluZyBhYm92ZSB0aGUgcGF5bG9hZC4gQGRlZmF1bHQgJ1Jlc3VsdCcgKi9cbiAgQElucHV0KCkgbGFiZWwgPSAnUmVzdWx0JztcbiAgLyoqIFN0eWxlcyB0aGUgcGF5bG9hZCBhcyBhIGZhaWx1cmUuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGVycm9yID0gZmFsc2U7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBwYW5lbCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIGdldCBwYXlsb2FkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ21heC1oLTY0IG92ZXJmbG93LWF1dG8gcm91bmRlZC1tZCBiZy1tdXRlZCBwLTMgZm9udC1tb25vIHRleHQteHMgdGV4dC1mb3JlZ3JvdW5kJyxcbiAgICAgIHRoaXMuZXJyb3IgJiYgJ2JnLWRlc3RydWN0aXZlLzEwIHRleHQtZGVzdHJ1Y3RpdmUnXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZENsYXNzKCkge1xuICAgIHJldHVybiBjbignZmxleCBmbGV4LWNvbCBnYXAtMS41IGJvcmRlci10IGJvcmRlci1ib3JkZXIgcHgtMyBweS0yJywgdGhpcy5jbGFzcyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { cn } from './utils/cn';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
const typographyVariants = cva('', {
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
h1: 'scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl',
|
|
11
|
+
h2: 'scroll-m-20 border-b border-border pb-2 text-3xl font-semibold tracking-tight first:mt-0',
|
|
12
|
+
h3: 'scroll-m-20 text-2xl font-semibold tracking-tight',
|
|
13
|
+
h4: 'scroll-m-20 text-xl font-semibold tracking-tight',
|
|
14
|
+
p: 'leading-7 [&:not(:first-child)]:mt-6',
|
|
15
|
+
blockquote: 'mt-6 border-l-2 border-border pl-6 italic',
|
|
16
|
+
lead: 'text-xl text-muted-foreground',
|
|
17
|
+
large: 'text-lg font-semibold',
|
|
18
|
+
small: 'text-sm font-medium leading-none',
|
|
19
|
+
muted: 'text-sm text-muted-foreground',
|
|
20
|
+
code: 'relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: { variant: 'p' },
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Applies the theme's type scale to projected content. Renders the semantically
|
|
27
|
+
* correct host tag for the chosen `variant` (`h1`–`h4`, `blockquote`, `code`,
|
|
28
|
+
* otherwise `p`), so headings stay real headings for assistive tech.
|
|
29
|
+
* @new
|
|
30
|
+
*/
|
|
31
|
+
export class TypographyComponent {
|
|
32
|
+
cdr = inject(ChangeDetectorRef);
|
|
33
|
+
/**
|
|
34
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
35
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
36
|
+
* rendering the class it was born with.
|
|
37
|
+
*/
|
|
38
|
+
ngOnChanges() {
|
|
39
|
+
this.cdr.markForCheck();
|
|
40
|
+
}
|
|
41
|
+
/** Type scale step; also selects the rendered HTML tag. @default 'p' */
|
|
42
|
+
variant = 'p';
|
|
43
|
+
/** Extra Tailwind classes merged onto the element via `cn()` (last-wins). */
|
|
44
|
+
class = '';
|
|
45
|
+
/** True for the variants that have no dedicated tag and render as `<p>`. */
|
|
46
|
+
get isParagraph() {
|
|
47
|
+
return !['h1', 'h2', 'h3', 'h4', 'blockquote', 'code'].includes(this.variant ?? 'p');
|
|
48
|
+
}
|
|
49
|
+
get computedClass() {
|
|
50
|
+
return cn(typographyVariants({ variant: this.variant }), this.class);
|
|
51
|
+
}
|
|
52
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TypographyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
53
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TypographyComponent, isStandalone: true, selector: "tolle-typography", inputs: { variant: "variant", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
54
|
+
<ng-template #body><ng-content></ng-content></ng-template>
|
|
55
|
+
|
|
56
|
+
<h1 *ngIf="variant === 'h1'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h1>
|
|
57
|
+
<h2 *ngIf="variant === 'h2'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h2>
|
|
58
|
+
<h3 *ngIf="variant === 'h3'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h3>
|
|
59
|
+
<h4 *ngIf="variant === 'h4'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h4>
|
|
60
|
+
<blockquote *ngIf="variant === 'blockquote'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></blockquote>
|
|
61
|
+
<code *ngIf="variant === 'code'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></code>
|
|
62
|
+
<p *ngIf="isParagraph" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></p>
|
|
63
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
64
|
+
}
|
|
65
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TypographyComponent, decorators: [{
|
|
66
|
+
type: Component,
|
|
67
|
+
args: [{ selector: 'tolle-typography', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
68
|
+
<ng-template #body><ng-content></ng-content></ng-template>
|
|
69
|
+
|
|
70
|
+
<h1 *ngIf="variant === 'h1'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h1>
|
|
71
|
+
<h2 *ngIf="variant === 'h2'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h2>
|
|
72
|
+
<h3 *ngIf="variant === 'h3'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h3>
|
|
73
|
+
<h4 *ngIf="variant === 'h4'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></h4>
|
|
74
|
+
<blockquote *ngIf="variant === 'blockquote'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></blockquote>
|
|
75
|
+
<code *ngIf="variant === 'code'" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></code>
|
|
76
|
+
<p *ngIf="isParagraph" [class]="computedClass"><ng-container *ngTemplateOutlet="body"></ng-container></p>
|
|
77
|
+
`, styles: [":host{display:block}\n"] }]
|
|
78
|
+
}], propDecorators: { variant: [{
|
|
79
|
+
type: Input
|
|
80
|
+
}], class: [{
|
|
81
|
+
type: Input
|
|
82
|
+
}] } });
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwb2dyYXBoeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL3R5cG9ncmFwaHkuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUFFaEMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFO0lBQ2pDLFFBQVEsRUFBRTtRQUNSLE9BQU8sRUFBRTtZQUNQLEVBQUUsRUFBRSxnRUFBZ0U7WUFDcEUsRUFBRSxFQUFFLDBGQUEwRjtZQUM5RixFQUFFLEVBQUUsbURBQW1EO1lBQ3ZELEVBQUUsRUFBRSxrREFBa0Q7WUFDdEQsQ0FBQyxFQUFFLHNDQUFzQztZQUN6QyxVQUFVLEVBQUUsMkNBQTJDO1lBQ3ZELElBQUksRUFBRSwrQkFBK0I7WUFDckMsS0FBSyxFQUFFLHVCQUF1QjtZQUM5QixLQUFLLEVBQUUsa0NBQWtDO1lBQ3pDLEtBQUssRUFBRSwrQkFBK0I7WUFDdEMsSUFBSSxFQUFFLG1GQUFtRjtTQUMxRjtLQUNGO0lBQ0QsZUFBZSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRTtDQUNsQyxDQUFDLENBQUM7QUFJSDs7Ozs7R0FLRztBQXNCSCxNQUFNLE9BQU8sbUJBQW1CO0lBQ2IsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsd0VBQXdFO0lBQy9ELE9BQU8sR0FBK0IsR0FBRyxDQUFDO0lBQ25ELDZFQUE2RTtJQUNwRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRXBCLDRFQUE0RTtJQUM1RSxJQUFJLFdBQVc7UUFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQzt3R0F4QlUsbUJBQW1COzRGQUFuQixtQkFBbUIsaUpBWnBCOzs7Ozs7Ozs7O0dBVVQsK0ZBZlMsWUFBWTs7NEZBaUJYLG1CQUFtQjtrQkFyQi9CLFNBQVM7K0JBQ0Usa0JBQWtCLGNBRWhCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBSXJDOzs7Ozs7Ozs7O0dBVVQ7OEJBZVEsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25DaGFuZ2VzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSAnY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbmNvbnN0IHR5cG9ncmFwaHlWYXJpYW50cyA9IGN2YSgnJywge1xuICB2YXJpYW50czoge1xuICAgIHZhcmlhbnQ6IHtcbiAgICAgIGgxOiAnc2Nyb2xsLW0tMjAgdGV4dC00eGwgZm9udC1leHRyYWJvbGQgdHJhY2tpbmctdGlnaHQgbGc6dGV4dC01eGwnLFxuICAgICAgaDI6ICdzY3JvbGwtbS0yMCBib3JkZXItYiBib3JkZXItYm9yZGVyIHBiLTIgdGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodCBmaXJzdDptdC0wJyxcbiAgICAgIGgzOiAnc2Nyb2xsLW0tMjAgdGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodCcsXG4gICAgICBoNDogJ3Njcm9sbC1tLTIwIHRleHQteGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodCcsXG4gICAgICBwOiAnbGVhZGluZy03IFsmOm5vdCg6Zmlyc3QtY2hpbGQpXTptdC02JyxcbiAgICAgIGJsb2NrcXVvdGU6ICdtdC02IGJvcmRlci1sLTIgYm9yZGVyLWJvcmRlciBwbC02IGl0YWxpYycsXG4gICAgICBsZWFkOiAndGV4dC14bCB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgbGFyZ2U6ICd0ZXh0LWxnIGZvbnQtc2VtaWJvbGQnLFxuICAgICAgc21hbGw6ICd0ZXh0LXNtIGZvbnQtbWVkaXVtIGxlYWRpbmctbm9uZScsXG4gICAgICBtdXRlZDogJ3RleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyxcbiAgICAgIGNvZGU6ICdyZWxhdGl2ZSByb3VuZGVkIGJnLW11dGVkIHB4LVswLjNyZW1dIHB5LVswLjJyZW1dIGZvbnQtbW9ubyB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQnLFxuICAgIH0sXG4gIH0sXG4gIGRlZmF1bHRWYXJpYW50czogeyB2YXJpYW50OiAncCcgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBUeXBvZ3JhcGh5UHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIHR5cG9ncmFwaHlWYXJpYW50cz47XG5cbi8qKlxuICogQXBwbGllcyB0aGUgdGhlbWUncyB0eXBlIHNjYWxlIHRvIHByb2plY3RlZCBjb250ZW50LiBSZW5kZXJzIHRoZSBzZW1hbnRpY2FsbHlcbiAqIGNvcnJlY3QgaG9zdCB0YWcgZm9yIHRoZSBjaG9zZW4gYHZhcmlhbnRgIChgaDFg4oCTYGg0YCwgYGJsb2NrcXVvdGVgLCBgY29kZWAsXG4gKiBvdGhlcndpc2UgYHBgKSwgc28gaGVhZGluZ3Mgc3RheSByZWFsIGhlYWRpbmdzIGZvciBhc3Npc3RpdmUgdGVjaC5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtdHlwb2dyYXBoeScsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgLy8gYDxuZy1jb250ZW50PmAgbWF5IG9ubHkgYXBwZWFyIG9uY2Ug4oCUIGEgZHVwbGljYXRlZCBzbG90IHBlciBicmFuY2ggd291bGQgbGVhdmVcbiAgLy8gZXZlcnkgYnJhbmNoIGJ1dCB0aGUgZmlyc3QgZW1wdHkuIFByb2plY3Qgb25jZSBpbnRvIGEgdGVtcGxhdGUgYW5kIHN0YW1wIHRoYXRcbiAgLy8gdGVtcGxhdGUgaW50byB3aGljaGV2ZXIgdGFnIHRoZSB2YXJpYW50IHNlbGVjdHMuXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLXRlbXBsYXRlICNib2R5PjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPlxuXG4gICAgPGgxICpuZ0lmPVwidmFyaWFudCA9PT0gJ2gxJ1wiIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlcIj48L25nLWNvbnRhaW5lcj48L2gxPlxuICAgIDxoMiAqbmdJZj1cInZhcmlhbnQgPT09ICdoMidcIiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJib2R5XCI+PC9uZy1jb250YWluZXI+PC9oMj5cbiAgICA8aDMgKm5nSWY9XCJ2YXJpYW50ID09PSAnaDMnXCIgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYm9keVwiPjwvbmctY29udGFpbmVyPjwvaDM+XG4gICAgPGg0ICpuZ0lmPVwidmFyaWFudCA9PT0gJ2g0J1wiIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlcIj48L25nLWNvbnRhaW5lcj48L2g0PlxuICAgIDxibG9ja3F1b3RlICpuZ0lmPVwidmFyaWFudCA9PT0gJ2Jsb2NrcXVvdGUnXCIgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYm9keVwiPjwvbmctY29udGFpbmVyPjwvYmxvY2txdW90ZT5cbiAgICA8Y29kZSAqbmdJZj1cInZhcmlhbnQgPT09ICdjb2RlJ1wiIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlcIj48L25nLWNvbnRhaW5lcj48L2NvZGU+XG4gICAgPHAgKm5nSWY9XCJpc1BhcmFncmFwaFwiIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlcIj48L25nLWNvbnRhaW5lcj48L3A+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFR5cG9ncmFwaHlDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUeXBlIHNjYWxlIHN0ZXA7IGFsc28gc2VsZWN0cyB0aGUgcmVuZGVyZWQgSFRNTCB0YWcuIEBkZWZhdWx0ICdwJyAqL1xuICBASW5wdXQoKSB2YXJpYW50OiBUeXBvZ3JhcGh5UHJvcHNbJ3ZhcmlhbnQnXSA9ICdwJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGVsZW1lbnQgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICAvKiogVHJ1ZSBmb3IgdGhlIHZhcmlhbnRzIHRoYXQgaGF2ZSBubyBkZWRpY2F0ZWQgdGFnIGFuZCByZW5kZXIgYXMgYDxwPmAuICovXG4gIGdldCBpc1BhcmFncmFwaCgpIHtcbiAgICByZXR1cm4gIVsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnYmxvY2txdW90ZScsICdjb2RlJ10uaW5jbHVkZXModGhpcy52YXJpYW50ID8/ICdwJyk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24odHlwb2dyYXBoeVZhcmlhbnRzKHsgdmFyaWFudDogdGhpcy52YXJpYW50IH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxufVxuIl19
|