@tolle_/tolle-ui 18.2.29 → 18.3.0
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 +12 -12
- package/esm2022/lib/alert-dialog.component.mjs +82 -64
- package/esm2022/lib/alert-dialog.service.mjs +38 -6
- 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 +125 -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/modal-ref.mjs +36 -7
- package/esm2022/lib/modal.component.mjs +42 -28
- package/esm2022/lib/modal.mjs +2 -29
- package/esm2022/lib/modal.service.mjs +26 -4
- 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-panel.component.mjs +5 -5
- package/esm2022/lib/resizable.component.mjs +219 -0
- package/esm2022/lib/segment.component.mjs +19 -9
- 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 +16642 -1105
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/alert-dialog-dynamic.component.d.ts +5 -0
- package/lib/alert-dialog.component.d.ts +23 -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/modal-ref.d.ts +6 -1
- package/lib/modal.component.d.ts +7 -4
- package/lib/modal.d.ts +9 -3
- 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 +3 -2
- package/preset.js +7 -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-menu-trigger.json +1 -1
- package/registry/r/context-menu.json +1 -1
- 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/modal.json +3 -3
- 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/resizable-panel.json +1 -1
- 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 +121 -8
|
@@ -0,0 +1,243 @@
|
|
|
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
|
+
const itemVariants = cva('group/item flex items-center gap-4 rounded-md border text-sm transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', {
|
|
7
|
+
variants: {
|
|
8
|
+
variant: {
|
|
9
|
+
default: 'border-transparent bg-transparent',
|
|
10
|
+
outline: 'border-border bg-transparent',
|
|
11
|
+
muted: 'border-transparent bg-muted/50',
|
|
12
|
+
},
|
|
13
|
+
size: {
|
|
14
|
+
xs: 'px-2 py-1.5 gap-2',
|
|
15
|
+
sm: 'px-3 py-2 gap-3',
|
|
16
|
+
default: 'px-4 py-3',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: { variant: 'default', size: 'default' },
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* A flex container for content rows built from media, title, description and
|
|
23
|
+
* actions — profiles, notifications, settings rows, list entries. Use
|
|
24
|
+
* `tolle-field` instead when wrapping a form control.
|
|
25
|
+
* @new
|
|
26
|
+
*/
|
|
27
|
+
export class ItemComponent {
|
|
28
|
+
cdr = inject(ChangeDetectorRef);
|
|
29
|
+
/**
|
|
30
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
31
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
32
|
+
* rendering the class it was born with.
|
|
33
|
+
*/
|
|
34
|
+
ngOnChanges() {
|
|
35
|
+
this.cdr.markForCheck();
|
|
36
|
+
}
|
|
37
|
+
/** Visual style of the row. @default 'default' */
|
|
38
|
+
variant = 'default';
|
|
39
|
+
/** Padding and gap density of the row. @default 'default' */
|
|
40
|
+
size = 'default';
|
|
41
|
+
/** Extra Tailwind classes merged onto the row via `cn()` (last-wins). */
|
|
42
|
+
class = '';
|
|
43
|
+
get computedClass() {
|
|
44
|
+
return cn(itemVariants({ variant: this.variant, size: this.size }), this.class);
|
|
45
|
+
}
|
|
46
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
47
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemComponent, isStandalone: true, selector: "tolle-item", inputs: { variant: "variant", size: "size", class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="computedClass"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
48
|
+
}
|
|
49
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemComponent, decorators: [{
|
|
50
|
+
type: Component,
|
|
51
|
+
args: [{ selector: 'tolle-item', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="computedClass"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
|
|
52
|
+
}], propDecorators: { variant: [{
|
|
53
|
+
type: Input
|
|
54
|
+
}], size: [{
|
|
55
|
+
type: Input
|
|
56
|
+
}], class: [{
|
|
57
|
+
type: Input
|
|
58
|
+
}] } });
|
|
59
|
+
/** Stacks several `tolle-item` rows as a single list. */
|
|
60
|
+
export class ItemGroupComponent {
|
|
61
|
+
cdr = inject(ChangeDetectorRef);
|
|
62
|
+
/**
|
|
63
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
64
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
65
|
+
* rendering the class it was born with.
|
|
66
|
+
*/
|
|
67
|
+
ngOnChanges() {
|
|
68
|
+
this.cdr.markForCheck();
|
|
69
|
+
}
|
|
70
|
+
/** Extra Tailwind classes merged onto the group via `cn()` (last-wins). */
|
|
71
|
+
class = '';
|
|
72
|
+
cn = cn;
|
|
73
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
74
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemGroupComponent, isStandalone: true, selector: "tolle-item-group", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div role="list" [class]="cn('flex flex-col', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
75
|
+
}
|
|
76
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemGroupComponent, decorators: [{
|
|
77
|
+
type: Component,
|
|
78
|
+
args: [{ selector: 'tolle-item-group', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div role="list" [class]="cn('flex flex-col', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
|
|
79
|
+
}], propDecorators: { class: [{
|
|
80
|
+
type: Input
|
|
81
|
+
}] } });
|
|
82
|
+
/** Leading media slot — avatar, icon, or thumbnail. */
|
|
83
|
+
export class ItemMediaComponent {
|
|
84
|
+
cdr = inject(ChangeDetectorRef);
|
|
85
|
+
/**
|
|
86
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
87
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
88
|
+
* rendering the class it was born with.
|
|
89
|
+
*/
|
|
90
|
+
ngOnChanges() {
|
|
91
|
+
this.cdr.markForCheck();
|
|
92
|
+
}
|
|
93
|
+
/** Extra Tailwind classes merged onto the media slot via `cn()` (last-wins). */
|
|
94
|
+
class = '';
|
|
95
|
+
cn = cn;
|
|
96
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemMediaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
97
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemMediaComponent, isStandalone: true, selector: "tolle-item-media", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex shrink-0 items-center justify-center text-muted-foreground', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
98
|
+
}
|
|
99
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemMediaComponent, decorators: [{
|
|
100
|
+
type: Component,
|
|
101
|
+
args: [{ selector: 'tolle-item-media', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex shrink-0 items-center justify-center text-muted-foreground', class)"><ng-content></ng-content></div>`, styles: [":host{display:inline-flex}\n"] }]
|
|
102
|
+
}], propDecorators: { class: [{
|
|
103
|
+
type: Input
|
|
104
|
+
}] } });
|
|
105
|
+
/** Grows to fill the row; wraps the title and description. */
|
|
106
|
+
export class ItemContentComponent {
|
|
107
|
+
cdr = inject(ChangeDetectorRef);
|
|
108
|
+
/**
|
|
109
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
110
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
111
|
+
* rendering the class it was born with.
|
|
112
|
+
*/
|
|
113
|
+
ngOnChanges() {
|
|
114
|
+
this.cdr.markForCheck();
|
|
115
|
+
}
|
|
116
|
+
/** Extra Tailwind classes merged onto the content column via `cn()` (last-wins). */
|
|
117
|
+
class = '';
|
|
118
|
+
cn = cn;
|
|
119
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
120
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemContentComponent, isStandalone: true, selector: "tolle-item-content", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex min-w-0 flex-1 flex-col gap-0.5', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
121
|
+
}
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemContentComponent, decorators: [{
|
|
123
|
+
type: Component,
|
|
124
|
+
args: [{ selector: 'tolle-item-content', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex min-w-0 flex-1 flex-col gap-0.5', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
|
|
125
|
+
}], propDecorators: { class: [{
|
|
126
|
+
type: Input
|
|
127
|
+
}] } });
|
|
128
|
+
/** Primary line of the row. */
|
|
129
|
+
export class ItemTitleComponent {
|
|
130
|
+
cdr = inject(ChangeDetectorRef);
|
|
131
|
+
/**
|
|
132
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
133
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
134
|
+
* rendering the class it was born with.
|
|
135
|
+
*/
|
|
136
|
+
ngOnChanges() {
|
|
137
|
+
this.cdr.markForCheck();
|
|
138
|
+
}
|
|
139
|
+
/** Extra Tailwind classes merged onto the title via `cn()` (last-wins). */
|
|
140
|
+
class = '';
|
|
141
|
+
cn = cn;
|
|
142
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
143
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemTitleComponent, isStandalone: true, selector: "tolle-item-title", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<p [class]="cn('truncate font-medium leading-none text-foreground', class)"><ng-content></ng-content></p>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
144
|
+
}
|
|
145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemTitleComponent, decorators: [{
|
|
146
|
+
type: Component,
|
|
147
|
+
args: [{ selector: 'tolle-item-title', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<p [class]="cn('truncate font-medium leading-none text-foreground', class)"><ng-content></ng-content></p>`, styles: [":host{display:block}\n"] }]
|
|
148
|
+
}], propDecorators: { class: [{
|
|
149
|
+
type: Input
|
|
150
|
+
}] } });
|
|
151
|
+
/** Secondary line of the row. */
|
|
152
|
+
export class ItemDescriptionComponent {
|
|
153
|
+
cdr = inject(ChangeDetectorRef);
|
|
154
|
+
/**
|
|
155
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
156
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
157
|
+
* rendering the class it was born with.
|
|
158
|
+
*/
|
|
159
|
+
ngOnChanges() {
|
|
160
|
+
this.cdr.markForCheck();
|
|
161
|
+
}
|
|
162
|
+
/** Extra Tailwind classes merged onto the description via `cn()` (last-wins). */
|
|
163
|
+
class = '';
|
|
164
|
+
cn = cn;
|
|
165
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemDescriptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
166
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemDescriptionComponent, isStandalone: true, selector: "tolle-item-description", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<p [class]="cn('truncate text-sm text-muted-foreground', class)"><ng-content></ng-content></p>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
167
|
+
}
|
|
168
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemDescriptionComponent, decorators: [{
|
|
169
|
+
type: Component,
|
|
170
|
+
args: [{ selector: 'tolle-item-description', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<p [class]="cn('truncate text-sm text-muted-foreground', class)"><ng-content></ng-content></p>`, styles: [":host{display:block}\n"] }]
|
|
171
|
+
}], propDecorators: { class: [{
|
|
172
|
+
type: Input
|
|
173
|
+
}] } });
|
|
174
|
+
/** Trailing slot for buttons, switches, or badges. */
|
|
175
|
+
export class ItemActionsComponent {
|
|
176
|
+
cdr = inject(ChangeDetectorRef);
|
|
177
|
+
/**
|
|
178
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
179
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
180
|
+
* rendering the class it was born with.
|
|
181
|
+
*/
|
|
182
|
+
ngOnChanges() {
|
|
183
|
+
this.cdr.markForCheck();
|
|
184
|
+
}
|
|
185
|
+
/** Extra Tailwind classes merged onto the actions slot via `cn()` (last-wins). */
|
|
186
|
+
class = '';
|
|
187
|
+
cn = cn;
|
|
188
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
189
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemActionsComponent, isStandalone: true, selector: "tolle-item-actions", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex shrink-0 items-center gap-2', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
190
|
+
}
|
|
191
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemActionsComponent, decorators: [{
|
|
192
|
+
type: Component,
|
|
193
|
+
args: [{ selector: 'tolle-item-actions', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex shrink-0 items-center gap-2', class)"><ng-content></ng-content></div>`, styles: [":host{display:inline-flex}\n"] }]
|
|
194
|
+
}], propDecorators: { class: [{
|
|
195
|
+
type: Input
|
|
196
|
+
}] } });
|
|
197
|
+
/** Optional full-width header above the row's main line. */
|
|
198
|
+
export class ItemHeaderComponent {
|
|
199
|
+
cdr = inject(ChangeDetectorRef);
|
|
200
|
+
/**
|
|
201
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
202
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
203
|
+
* rendering the class it was born with.
|
|
204
|
+
*/
|
|
205
|
+
ngOnChanges() {
|
|
206
|
+
this.cdr.markForCheck();
|
|
207
|
+
}
|
|
208
|
+
/** Extra Tailwind classes merged onto the header via `cn()` (last-wins). */
|
|
209
|
+
class = '';
|
|
210
|
+
cn = cn;
|
|
211
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
212
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemHeaderComponent, isStandalone: true, selector: "tolle-item-header", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex w-full items-center justify-between gap-2', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
213
|
+
}
|
|
214
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemHeaderComponent, decorators: [{
|
|
215
|
+
type: Component,
|
|
216
|
+
args: [{ selector: 'tolle-item-header', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex w-full items-center justify-between gap-2', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
|
|
217
|
+
}], propDecorators: { class: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}] } });
|
|
220
|
+
/** Optional full-width footer below the row's main line. */
|
|
221
|
+
export class ItemFooterComponent {
|
|
222
|
+
cdr = inject(ChangeDetectorRef);
|
|
223
|
+
/**
|
|
224
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
225
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
226
|
+
* rendering the class it was born with.
|
|
227
|
+
*/
|
|
228
|
+
ngOnChanges() {
|
|
229
|
+
this.cdr.markForCheck();
|
|
230
|
+
}
|
|
231
|
+
/** Extra Tailwind classes merged onto the footer via `cn()` (last-wins). */
|
|
232
|
+
class = '';
|
|
233
|
+
cn = cn;
|
|
234
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
235
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemFooterComponent, isStandalone: true, selector: "tolle-item-footer", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex w-full items-center justify-between gap-2', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
236
|
+
}
|
|
237
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemFooterComponent, decorators: [{
|
|
238
|
+
type: Component,
|
|
239
|
+
args: [{ selector: 'tolle-item-footer', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex w-full items-center justify-between gap-2', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
|
|
240
|
+
}], propDecorators: { class: [{
|
|
241
|
+
type: Input
|
|
242
|
+
}] } });
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL2l0ZW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOztBQUVoQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQ3RCLHNLQUFzSyxFQUN0SztJQUNFLFFBQVEsRUFBRTtRQUNSLE9BQU8sRUFBRTtZQUNQLE9BQU8sRUFBRSxtQ0FBbUM7WUFDNUMsT0FBTyxFQUFFLDhCQUE4QjtZQUN2QyxLQUFLLEVBQUUsZ0NBQWdDO1NBQ3hDO1FBQ0QsSUFBSSxFQUFFO1lBQ0osRUFBRSxFQUFFLG1CQUFtQjtZQUN2QixFQUFFLEVBQUUsaUJBQWlCO1lBQ3JCLE9BQU8sRUFBRSxXQUFXO1NBQ3JCO0tBQ0Y7SUFDRCxlQUFlLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Q0FDekQsQ0FDRixDQUFDO0FBSUY7Ozs7O0dBS0c7QUFTSCxNQUFNLE9BQU8sYUFBYTtJQUNQLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVqRDs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtEQUFrRDtJQUN6QyxPQUFPLEdBQXlCLFNBQVMsQ0FBQztJQUNuRCw2REFBNkQ7SUFDcEQsSUFBSSxHQUFzQixTQUFT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QUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuXG5jb25zdCBpdGVtVmFyaWFudHMgPSBjdmEoXG4gICdncm91cC9pdGVtIGZsZXggaXRlbXMtY2VudGVyIGdhcC00IHJvdW5kZWQtbWQgYm9yZGVyIHRleHQtc20gdHJhbnNpdGlvbi1jb2xvcnMgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMicsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OiAnYm9yZGVyLXRyYW5zcGFyZW50IGJnLXRyYW5zcGFyZW50JyxcbiAgICAgICAgb3V0bGluZTogJ2JvcmRlci1ib3JkZXIgYmctdHJhbnNwYXJlbnQnLFxuICAgICAgICBtdXRlZDogJ2JvcmRlci10cmFuc3BhcmVudCBiZy1tdXRlZC81MCcsXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICB4czogJ3B4LTIgcHktMS41IGdhcC0yJyxcbiAgICAgICAgc206ICdweC0zIHB5LTIgZ2FwLTMnLFxuICAgICAgICBkZWZhdWx0OiAncHgtNCBweS0zJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHsgdmFyaWFudDogJ2RlZmF1bHQnLCBzaXplOiAnZGVmYXVsdCcgfSxcbiAgfVxuKTtcblxuZXhwb3J0IHR5cGUgSXRlbVByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBpdGVtVmFyaWFudHM+O1xuXG4vKipcbiAqIEEgZmxleCBjb250YWluZXIgZm9yIGNvbnRlbnQgcm93cyBidWlsdCBmcm9tIG1lZGlhLCB0aXRsZSwgZGVzY3JpcHRpb24gYW5kXG4gKiBhY3Rpb25zIOKAlCBwcm9maWxlcywgbm90aWZpY2F0aW9ucywgc2V0dGluZ3Mgcm93cywgbGlzdCBlbnRyaWVzLiBVc2VcbiAqIGB0b2xsZS1maWVsZGAgaW5zdGVhZCB3aGVuIHdyYXBwaW5nIGEgZm9ybSBjb250cm9sLlxuICogQG5ld1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1pdGVtJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYDxkaXYgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgSXRlbUNvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFZpc3VhbCBzdHlsZSBvZiB0aGUgcm93LiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgdmFyaWFudDogSXRlbVByb3BzWyd2YXJpYW50J10gPSAnZGVmYXVsdCc7XG4gIC8qKiBQYWRkaW5nIGFuZCBnYXAgZGVuc2l0eSBvZiB0aGUgcm93LiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogSXRlbVByb3BzWydzaXplJ10gPSAnZGVmYXVsdCc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSByb3cgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oaXRlbVZhcmlhbnRzKHsgdmFyaWFudDogdGhpcy52YXJpYW50LCBzaXplOiB0aGlzLnNpemUgfSksIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKiBTdGFja3Mgc2V2ZXJhbCBgdG9sbGUtaXRlbWAgcm93cyBhcyBhIHNpbmdsZSBsaXN0LiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtaXRlbS1ncm91cCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2IHJvbGU9XCJsaXN0XCIgW2NsYXNzXT1cImNuKCdmbGV4IGZsZXgtY29sJywgY2xhc3MpXCI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvZGl2PmAsXG59KVxuZXhwb3J0IGNsYXNzIEl0ZW1Hcm91cENvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGdyb3VwIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuXG4vKiogTGVhZGluZyBtZWRpYSBzbG90IOKAlCBhdmF0YXIsIGljb24sIG9yIHRodW1ibmFpbC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWl0ZW0tbWVkaWEnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPGRpdiBbY2xhc3NdPVwiY24oJ2ZsZXggc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsIGNsYXNzKVwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBJdGVtTWVkaWFDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBtZWRpYSBzbG90IHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuXG4vKiogR3Jvd3MgdG8gZmlsbCB0aGUgcm93OyB3cmFwcyB0aGUgdGl0bGUgYW5kIGRlc2NyaXB0aW9uLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtaXRlbS1jb250ZW50JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYDxkaXYgW2NsYXNzXT1cImNuKCdmbGV4IG1pbi13LTAgZmxleC0xIGZsZXgtY29sIGdhcC0wLjUnLCBjbGFzcylcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgSXRlbUNvbnRlbnRDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBjb250ZW50IGNvbHVtbiB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBwcm90ZWN0ZWQgY24gPSBjbjtcbn1cblxuLyoqIFByaW1hcnkgbGluZSBvZiB0aGUgcm93LiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtaXRlbS10aXRsZScsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8cCBbY2xhc3NdPVwiY24oJ3RydW5jYXRlIGZvbnQtbWVkaXVtIGxlYWRpbmctbm9uZSB0ZXh0LWZvcmVncm91bmQnLCBjbGFzcylcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9wPmAsXG59KVxuZXhwb3J0IGNsYXNzIEl0ZW1UaXRsZUNvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHRpdGxlIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuXG4vKiogU2Vjb25kYXJ5IGxpbmUgb2YgdGhlIHJvdy4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWl0ZW0tZGVzY3JpcHRpb24nLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPHAgW2NsYXNzXT1cImNuKCd0cnVuY2F0ZSB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsIGNsYXNzKVwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L3A+YCxcbn0pXG5leHBvcnQgY2xhc3MgSXRlbURlc2NyaXB0aW9uQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgZGVzY3JpcHRpb24gdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG5cbi8qKiBUcmFpbGluZyBzbG90IGZvciBidXR0b25zLCBzd2l0Y2hlcywgb3IgYmFkZ2VzLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtaXRlbS1hY3Rpb25zJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogaW5saW5lLWZsZXg7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYDxkaXYgW2NsYXNzXT1cImNuKCdmbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBnYXAtMicsIGNsYXNzKVwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBJdGVtQWN0aW9uc0NvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGFjdGlvbnMgc2xvdCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBwcm90ZWN0ZWQgY24gPSBjbjtcbn1cblxuLyoqIE9wdGlvbmFsIGZ1bGwtd2lkdGggaGVhZGVyIGFib3ZlIHRoZSByb3cncyBtYWluIGxpbmUuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1pdGVtLWhlYWRlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2IFtjbGFzc109XCJjbignZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMicsIGNsYXNzKVwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBJdGVtSGVhZGVyQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgaGVhZGVyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuXG4vKiogT3B0aW9uYWwgZnVsbC13aWR0aCBmb290ZXIgYmVsb3cgdGhlIHJvdydzIG1haW4gbGluZS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWl0ZW0tZm9vdGVyJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYDxkaXYgW2NsYXNzXT1cImNuKCdmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yJywgY2xhc3MpXCI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvZGl2PmAsXG59KVxuZXhwb3J0IGNsYXNzIEl0ZW1Gb290ZXJDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBmb290ZXIgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
const kbdVariants = cva('inline-flex select-none items-center justify-center gap-1 rounded border border-border font-mono font-medium text-muted-foreground', {
|
|
7
|
+
variants: {
|
|
8
|
+
size: {
|
|
9
|
+
sm: 'h-4 min-w-4 px-1 text-[10px]',
|
|
10
|
+
default: 'h-5 min-w-5 px-1.5 text-[11px]',
|
|
11
|
+
lg: 'h-6 min-w-6 px-2 text-xs',
|
|
12
|
+
},
|
|
13
|
+
variant: {
|
|
14
|
+
default: 'bg-muted',
|
|
15
|
+
outline: 'bg-transparent',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
defaultVariants: { size: 'default', variant: 'default' },
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Renders a keyboard key or shortcut, e.g. `<tolle-kbd>⌘</tolle-kbd>`.
|
|
22
|
+
* Pairs with `tolle-command-shortcut` inside command menus.
|
|
23
|
+
* @new
|
|
24
|
+
*/
|
|
25
|
+
export class KbdComponent {
|
|
26
|
+
cdr = inject(ChangeDetectorRef);
|
|
27
|
+
/**
|
|
28
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
29
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
30
|
+
* rendering the class it was born with.
|
|
31
|
+
*/
|
|
32
|
+
ngOnChanges() {
|
|
33
|
+
this.cdr.markForCheck();
|
|
34
|
+
}
|
|
35
|
+
/** Size of the key cap. @default 'default' */
|
|
36
|
+
size = 'default';
|
|
37
|
+
/** Visual style of the key cap. @default 'default' */
|
|
38
|
+
variant = 'default';
|
|
39
|
+
/** Extra Tailwind classes merged onto the key cap via `cn()` (last-wins). */
|
|
40
|
+
class = '';
|
|
41
|
+
get computedClass() {
|
|
42
|
+
return cn(kbdVariants({ size: this.size, variant: this.variant }), this.class);
|
|
43
|
+
}
|
|
44
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbdComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
45
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: KbdComponent, isStandalone: true, selector: "tolle-kbd", inputs: { size: "size", variant: "variant", class: "class" }, usesOnChanges: true, ngImport: i0, template: `<kbd [class]="computedClass"><ng-content></ng-content></kbd>`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
46
|
+
}
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbdComponent, decorators: [{
|
|
48
|
+
type: Component,
|
|
49
|
+
args: [{ selector: 'tolle-kbd', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<kbd [class]="computedClass"><ng-content></ng-content></kbd>`, styles: [":host{display:inline-flex}\n"] }]
|
|
50
|
+
}], propDecorators: { size: [{
|
|
51
|
+
type: Input
|
|
52
|
+
}], variant: [{
|
|
53
|
+
type: Input
|
|
54
|
+
}], class: [{
|
|
55
|
+
type: Input
|
|
56
|
+
}] } });
|
|
57
|
+
/**
|
|
58
|
+
* Groups several `tolle-kbd` keys into one shortcut, e.g. ⌘ + K.
|
|
59
|
+
*/
|
|
60
|
+
export class KbdGroupComponent {
|
|
61
|
+
cdr = inject(ChangeDetectorRef);
|
|
62
|
+
/**
|
|
63
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
64
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
65
|
+
* rendering the class it was born with.
|
|
66
|
+
*/
|
|
67
|
+
ngOnChanges() {
|
|
68
|
+
this.cdr.markForCheck();
|
|
69
|
+
}
|
|
70
|
+
/** Extra Tailwind classes merged onto the group via `cn()` (last-wins). */
|
|
71
|
+
class = '';
|
|
72
|
+
cn = cn;
|
|
73
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbdGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
74
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: KbdGroupComponent, isStandalone: true, selector: "tolle-kbd-group", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<span [class]="cn('inline-flex items-center gap-1', class)"><ng-content></ng-content></span>`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
75
|
+
}
|
|
76
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbdGroupComponent, decorators: [{
|
|
77
|
+
type: Component,
|
|
78
|
+
args: [{ selector: 'tolle-kbd-group', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<span [class]="cn('inline-flex items-center gap-1', class)"><ng-content></ng-content></span>`, styles: [":host{display:inline-flex}\n"] }]
|
|
79
|
+
}], propDecorators: { class: [{
|
|
80
|
+
type: Input
|
|
81
|
+
}] } });
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIva2JkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFaEMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUNyQixvSUFBb0ksRUFDcEk7SUFDRSxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsOEJBQThCO1lBQ2xDLE9BQU8sRUFBRSxnQ0FBZ0M7WUFDekMsRUFBRSxFQUFFLDBCQUEwQjtTQUMvQjtRQUNELE9BQU8sRUFBRTtZQUNQLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE9BQU8sRUFBRSxnQkFBZ0I7U0FDMUI7S0FDRjtJQUNELGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRTtDQUN6RCxDQUNGLENBQUM7QUFJRjs7OztHQUlHO0FBU0gsTUFBTSxPQUFPLFlBQVk7SUFDTixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFakQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCw4Q0FBOEM7SUFDckMsSUFBSSxHQUFxQixTQUFTLENBQUM7SUFDNUMsc0RBQXNEO0lBQzdDLE9BQU8sR0FBd0IsU0FBUyxDQUFDO0lBQ2xELDZFQUE2RTtJQUNwRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRXBCLElBQUksYUFBYTtRQUNmLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakYsQ0FBQzt3R0FyQlUsWUFBWTs0RkFBWixZQUFZLHdKQUZiLDhEQUE4RCxxR0FGOUQsWUFBWTs7NEZBSVgsWUFBWTtrQkFSeEIsU0FBUzsrQkFDRSxXQUFXLGNBRVQsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckMsOERBQThEOzhCQWUvRCxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSzs7QUFPUjs7R0FFRztBQVNILE1BQU0sT0FBTyxpQkFBaUI7SUFDWCxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFakQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCwyRUFBMkU7SUFDbEUsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNWLEVBQUUsR0FBRyxFQUFFLENBQUM7d0dBZFAsaUJBQWlCOzRGQUFqQixpQkFBaUIsNEhBRmxCLDhGQUE4RixxR0FGOUYsWUFBWTs7NEZBSVgsaUJBQWlCO2tCQVI3QixTQUFTOytCQUNFLGlCQUFpQixjQUVmLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLDhGQUE4Rjs4QkFlL0YsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuY29uc3Qga2JkVmFyaWFudHMgPSBjdmEoXG4gICdpbmxpbmUtZmxleCBzZWxlY3Qtbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEgcm91bmRlZCBib3JkZXIgYm9yZGVyLWJvcmRlciBmb250LW1vbm8gZm9udC1tZWRpdW0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyxcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICBzaXplOiB7XG4gICAgICAgIHNtOiAnaC00IG1pbi13LTQgcHgtMSB0ZXh0LVsxMHB4XScsXG4gICAgICAgIGRlZmF1bHQ6ICdoLTUgbWluLXctNSBweC0xLjUgdGV4dC1bMTFweF0nLFxuICAgICAgICBsZzogJ2gtNiBtaW4tdy02IHB4LTIgdGV4dC14cycsXG4gICAgICB9LFxuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OiAnYmctbXV0ZWQnLFxuICAgICAgICBvdXRsaW5lOiAnYmctdHJhbnNwYXJlbnQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czogeyBzaXplOiAnZGVmYXVsdCcsIHZhcmlhbnQ6ICdkZWZhdWx0JyB9LFxuICB9XG4pO1xuXG5leHBvcnQgdHlwZSBLYmRQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2Yga2JkVmFyaWFudHM+O1xuXG4vKipcbiAqIFJlbmRlcnMgYSBrZXlib2FyZCBrZXkgb3Igc2hvcnRjdXQsIGUuZy4gYDx0b2xsZS1rYmQ+4oyYPC90b2xsZS1rYmQ+YC5cbiAqIFBhaXJzIHdpdGggYHRvbGxlLWNvbW1hbmQtc2hvcnRjdXRgIGluc2lkZSBjb21tYW5kIG1lbnVzLlxuICogQG5ld1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1rYmQnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPGtiZCBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2tiZD5gLFxufSlcbmV4cG9ydCBjbGFzcyBLYmRDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBTaXplIG9mIHRoZSBrZXkgY2FwLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogS2JkUHJvcHNbJ3NpemUnXSA9ICdkZWZhdWx0JztcbiAgLyoqIFZpc3VhbCBzdHlsZSBvZiB0aGUga2V5IGNhcC4gQGRlZmF1bHQgJ2RlZmF1bHQnICovXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IEtiZFByb3BzWyd2YXJpYW50J10gPSAnZGVmYXVsdCc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBrZXkgY2FwIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKGtiZFZhcmlhbnRzKHsgc2l6ZTogdGhpcy5zaXplLCB2YXJpYW50OiB0aGlzLnZhcmlhbnQgfSksIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKlxuICogR3JvdXBzIHNldmVyYWwgYHRvbGxlLWtiZGAga2V5cyBpbnRvIG9uZSBzaG9ydGN1dCwgZS5nLiDijJggKyBLLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1rYmQtZ3JvdXAnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPHNwYW4gW2NsYXNzXT1cImNuKCdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEnLCBjbGFzcylcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9zcGFuPmAsXG59KVxuZXhwb3J0IGNsYXNzIEtiZEdyb3VwQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgZ3JvdXAgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=
|
|
@@ -16,26 +16,21 @@ export class LabelComponent {
|
|
|
16
16
|
>
|
|
17
17
|
<ng-content></ng-content>
|
|
18
18
|
</label>
|
|
19
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
19
|
+
`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
20
20
|
}
|
|
21
21
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LabelComponent, decorators: [{
|
|
22
22
|
type: Component,
|
|
23
|
-
args: [{
|
|
24
|
-
selector: 'tolle-label',
|
|
25
|
-
standalone: true,
|
|
26
|
-
imports: [CommonModule],
|
|
27
|
-
template: `
|
|
23
|
+
args: [{ selector: 'tolle-label', standalone: true, imports: [CommonModule], template: `
|
|
28
24
|
<label
|
|
29
25
|
[attr.for]="for"
|
|
30
26
|
[class]="computedClass"
|
|
31
27
|
>
|
|
32
28
|
<ng-content></ng-content>
|
|
33
29
|
</label>
|
|
34
|
-
|
|
35
|
-
}]
|
|
30
|
+
`, styles: [":host{display:inline-flex}\n"] }]
|
|
36
31
|
}], propDecorators: { for: [{
|
|
37
32
|
type: Input
|
|
38
33
|
}], class: [{
|
|
39
34
|
type: Input
|
|
40
35
|
}] } });
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9sYWJlbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBZ0JoQyxNQUFNLE9BQU8sY0FBYztJQUNkLEdBQUcsQ0FBVTtJQUNiLEtBQUssR0FBVyxFQUFFLENBQUM7SUFFNUIsSUFBSSxhQUFhO1FBQ2IsT0FBTyxFQUFFLENBQ0wsdUlBQXVJLEVBQ3ZJLElBQUksQ0FBQyxLQUFLLENBQ2IsQ0FBQztJQUNOLENBQUM7d0dBVFEsY0FBYzs0RkFBZCxjQUFjLCtHQVRiOzs7Ozs7O0dBT1gscUdBUlcsWUFBWTs7NEZBVWIsY0FBYztrQkFkMUIsU0FBUzsrQkFDSSxhQUFhLGNBRVgsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2I7Ozs7Ozs7R0FPWDs4QkFHVSxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtbGFiZWwnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgfSddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWxcbiAgICAgIFthdHRyLmZvcl09XCJmb3JcIlxuICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2xhYmVsPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIExhYmVsQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBmb3I/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuXG4gICAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBjbihcbiAgICAgICAgICAgIFwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHNlbGVjdC1ub25lIHRleHQtc20gZm9udC1tZWRpdW0gbGVhZGluZy1ub25lIHBlZXItZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIHBlZXItZGlzYWJsZWQ6b3BhY2l0eS01MFwiLFxuICAgICAgICAgICAgdGhpcy5jbGFzc1xuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,135 @@
|
|
|
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 markerVariants = cva('flex w-full items-center gap-2 text-xs', {
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
// System notes and tool activity — centred, quiet.
|
|
11
|
+
default: 'justify-center py-1 text-muted-foreground',
|
|
12
|
+
// A labelled rule between two stretches of transcript.
|
|
13
|
+
separator: 'py-3 text-muted-foreground',
|
|
14
|
+
// Live status such as "Thinking…", aligned with the transcript's leading edge.
|
|
15
|
+
status: 'justify-start py-1 text-muted-foreground',
|
|
16
|
+
// A failed send or a tool error.
|
|
17
|
+
error: 'justify-center py-1 font-medium text-destructive',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: { variant: 'default' },
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* An inline row in a chat transcript that is not a message: a system note, a
|
|
24
|
+
* streaming status, tool activity, or a labelled date separator.
|
|
25
|
+
* @new
|
|
26
|
+
*/
|
|
27
|
+
export class MarkerComponent {
|
|
28
|
+
cdr = inject(ChangeDetectorRef);
|
|
29
|
+
/**
|
|
30
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
31
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
32
|
+
* rendering the class it was born with.
|
|
33
|
+
*/
|
|
34
|
+
ngOnChanges() {
|
|
35
|
+
this.cdr.markForCheck();
|
|
36
|
+
}
|
|
37
|
+
/** Kind of transcript marker this row represents. @default 'default' */
|
|
38
|
+
variant = 'default';
|
|
39
|
+
/** Text for the marker — the date on a separator, or the status wording. */
|
|
40
|
+
label = '';
|
|
41
|
+
/** Remixicon class for a leading icon, e.g. 'ri-tools-line'. */
|
|
42
|
+
icon = '';
|
|
43
|
+
/** Applies the shimmer text sweep, for live status such as "Thinking…". @default false */
|
|
44
|
+
shimmer = false;
|
|
45
|
+
/** Extra Tailwind classes merged onto the row via `cn()` (last-wins). */
|
|
46
|
+
class = '';
|
|
47
|
+
get computedClass() {
|
|
48
|
+
return cn(markerVariants({ variant: this.variant }), this.class);
|
|
49
|
+
}
|
|
50
|
+
/** Whether this marker announces a change to assistive technology. */
|
|
51
|
+
get isLive() {
|
|
52
|
+
return this.variant === 'status' || this.variant === 'error';
|
|
53
|
+
}
|
|
54
|
+
get iconClass() {
|
|
55
|
+
return cn('shrink-0', this.icon, this.shimmer && 'animate-pulse');
|
|
56
|
+
}
|
|
57
|
+
get labelClass() {
|
|
58
|
+
return cn('inline-flex items-center gap-1 whitespace-nowrap', this.variant === 'separator' && 'shrink-0 px-1 font-medium', this.shimmer && 'shimmer');
|
|
59
|
+
}
|
|
60
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
61
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MarkerComponent, isStandalone: true, selector: "tolle-marker", inputs: { variant: "variant", label: "label", icon: "icon", shimmer: "shimmer", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
62
|
+
<div
|
|
63
|
+
[class]="computedClass"
|
|
64
|
+
[attr.role]="variant === 'separator' ? 'separator' : isLive ? 'status' : null"
|
|
65
|
+
[attr.aria-live]="isLive ? 'polite' : null">
|
|
66
|
+
<span *ngIf="variant === 'separator'" aria-hidden="true" class="h-px flex-1 bg-border"></span>
|
|
67
|
+
|
|
68
|
+
<i *ngIf="icon" [class]="iconClass" aria-hidden="true"></i>
|
|
69
|
+
|
|
70
|
+
<span [class]="labelClass">
|
|
71
|
+
<span *ngIf="label">{{ label }}</span>
|
|
72
|
+
<ng-content></ng-content>
|
|
73
|
+
</span>
|
|
74
|
+
|
|
75
|
+
<span *ngIf="variant === 'separator'" aria-hidden="true" class="h-px flex-1 bg-border"></span>
|
|
76
|
+
</div>
|
|
77
|
+
`, 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 });
|
|
78
|
+
}
|
|
79
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkerComponent, decorators: [{
|
|
80
|
+
type: Component,
|
|
81
|
+
args: [{ selector: 'tolle-marker', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
82
|
+
<div
|
|
83
|
+
[class]="computedClass"
|
|
84
|
+
[attr.role]="variant === 'separator' ? 'separator' : isLive ? 'status' : null"
|
|
85
|
+
[attr.aria-live]="isLive ? 'polite' : null">
|
|
86
|
+
<span *ngIf="variant === 'separator'" aria-hidden="true" class="h-px flex-1 bg-border"></span>
|
|
87
|
+
|
|
88
|
+
<i *ngIf="icon" [class]="iconClass" aria-hidden="true"></i>
|
|
89
|
+
|
|
90
|
+
<span [class]="labelClass">
|
|
91
|
+
<span *ngIf="label">{{ label }}</span>
|
|
92
|
+
<ng-content></ng-content>
|
|
93
|
+
</span>
|
|
94
|
+
|
|
95
|
+
<span *ngIf="variant === 'separator'" aria-hidden="true" class="h-px flex-1 bg-border"></span>
|
|
96
|
+
</div>
|
|
97
|
+
`, styles: [":host{display:block}\n"] }]
|
|
98
|
+
}], propDecorators: { variant: [{
|
|
99
|
+
type: Input
|
|
100
|
+
}], label: [{
|
|
101
|
+
type: Input
|
|
102
|
+
}], icon: [{
|
|
103
|
+
type: Input
|
|
104
|
+
}], shimmer: [{
|
|
105
|
+
type: Input
|
|
106
|
+
}], class: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}] } });
|
|
109
|
+
/**
|
|
110
|
+
* Groups related markers — a run of tool calls, say — into one indented block so
|
|
111
|
+
* they read as a single step in the transcript.
|
|
112
|
+
*/
|
|
113
|
+
export class MarkerGroupComponent {
|
|
114
|
+
cdr = inject(ChangeDetectorRef);
|
|
115
|
+
/**
|
|
116
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
117
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
118
|
+
* rendering the class it was born with.
|
|
119
|
+
*/
|
|
120
|
+
ngOnChanges() {
|
|
121
|
+
this.cdr.markForCheck();
|
|
122
|
+
}
|
|
123
|
+
/** Extra Tailwind classes merged onto the group via `cn()` (last-wins). */
|
|
124
|
+
class = '';
|
|
125
|
+
cn = cn;
|
|
126
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkerGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
127
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MarkerGroupComponent, isStandalone: true, selector: "tolle-marker-group", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex w-full flex-col gap-0.5', class)" role="group"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
128
|
+
}
|
|
129
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkerGroupComponent, decorators: [{
|
|
130
|
+
type: Component,
|
|
131
|
+
args: [{ selector: 'tolle-marker-group', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex w-full flex-col gap-0.5', class)" role="group"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
|
|
132
|
+
}], propDecorators: { class: [{
|
|
133
|
+
type: Input
|
|
134
|
+
}] } });
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvbWFya2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBRWhDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyx3Q0FBd0MsRUFBRTtJQUNuRSxRQUFRLEVBQUU7UUFDUixPQUFPLEVBQUU7WUFDUCxtREFBbUQ7WUFDbkQsT0FBTyxFQUFFLDJDQUEyQztZQUNwRCx1REFBdUQ7WUFDdkQsU0FBUyxFQUFFLDRCQUE0QjtZQUN2QywrRUFBK0U7WUFDL0UsTUFBTSxFQUFFLDBDQUEwQztZQUNsRCxpQ0FBaUM7WUFDakMsS0FBSyxFQUFFLGtEQUFrRDtTQUMxRDtLQUNGO0lBQ0QsZUFBZSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRTtDQUN4QyxDQUFDLENBQUM7QUFJSDs7OztHQUlHO0FBeUJILE1BQU0sT0FBTyxlQUFlO0lBQ1QsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsd0VBQXdFO0lBQy9ELE9BQU8sR0FBMkIsU0FBUyxDQUFDO0lBQ3JELDRFQUE0RTtJQUNuRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLGdFQUFnRTtJQUN2RCxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25CLDBGQUEwRjtJQUNqRixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLHlFQUF5RTtJQUNoRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRXBCLElBQUksYUFBYTtRQUNmLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLEVBQUUsQ0FDUCxrREFBa0QsRUFDbEQsSUFBSSxDQUFDLE9BQU8sS0FBSyxXQUFXLElBQUksMkJBQTJCLEVBQzNELElBQUksQ0FBQyxPQUFPLElBQUksU0FBUyxDQUMxQixDQUFDO0lBQ0osQ0FBQzt3R0ExQ1UsZUFBZTs0RkFBZixlQUFlLCtMQWxCaEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQlQsK0ZBbEJTLFlBQVk7OzRGQW9CWCxlQUFlO2tCQXhCM0IsU0FBUzsrQkFDRSxjQUFjLGNBRVosSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQlQ7OEJBZVEsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSzs7QUF3QlI7OztHQUdHO0FBU0gsTUFBTSxPQUFPLG9CQUFvQjtJQUNkLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVqRDs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELDJFQUEyRTtJQUNsRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ1YsRUFBRSxHQUFHLEVBQUUsQ0FBQzt3R0FkUCxvQkFBb0I7NEZBQXBCLG9CQUFvQiwrSEFGckIsdUdBQXVHLCtGQUZ2RyxZQUFZOzs0RkFJWCxvQkFBb0I7a0JBUmhDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBRWxCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLHVHQUF1Rzs4QkFleEcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuY29uc3QgbWFya2VyVmFyaWFudHMgPSBjdmEoJ2ZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXhzJywge1xuICB2YXJpYW50czoge1xuICAgIHZhcmlhbnQ6IHtcbiAgICAgIC8vIFN5c3RlbSBub3RlcyBhbmQgdG9vbCBhY3Rpdml0eSDigJQgY2VudHJlZCwgcXVpZXQuXG4gICAgICBkZWZhdWx0OiAnanVzdGlmeS1jZW50ZXIgcHktMSB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgLy8gQSBsYWJlbGxlZCBydWxlIGJldHdlZW4gdHdvIHN0cmV0Y2hlcyBvZiB0cmFuc2NyaXB0LlxuICAgICAgc2VwYXJhdG9yOiAncHktMyB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgLy8gTGl2ZSBzdGF0dXMgc3VjaCBhcyBcIlRoaW5raW5n4oCmXCIsIGFsaWduZWQgd2l0aCB0aGUgdHJhbnNjcmlwdCdzIGxlYWRpbmcgZWRnZS5cbiAgICAgIHN0YXR1czogJ2p1c3RpZnktc3RhcnQgcHktMSB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgLy8gQSBmYWlsZWQgc2VuZCBvciBhIHRvb2wgZXJyb3IuXG4gICAgICBlcnJvcjogJ2p1c3RpZnktY2VudGVyIHB5LTEgZm9udC1tZWRpdW0gdGV4dC1kZXN0cnVjdGl2ZScsXG4gICAgfSxcbiAgfSxcbiAgZGVmYXVsdFZhcmlhbnRzOiB7IHZhcmlhbnQ6ICdkZWZhdWx0JyB9LFxufSk7XG5cbmV4cG9ydCB0eXBlIE1hcmtlclByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBtYXJrZXJWYXJpYW50cz47XG5cbi8qKlxuICogQW4gaW5saW5lIHJvdyBpbiBhIGNoYXQgdHJhbnNjcmlwdCB0aGF0IGlzIG5vdCBhIG1lc3NhZ2U6IGEgc3lzdGVtIG5vdGUsIGFcbiAqIHN0cmVhbWluZyBzdGF0dXMsIHRvb2wgYWN0aXZpdHksIG9yIGEgbGFiZWxsZWQgZGF0ZSBzZXBhcmF0b3IuXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1hcmtlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiXG4gICAgICBbYXR0ci5yb2xlXT1cInZhcmlhbnQgPT09ICdzZXBhcmF0b3InID8gJ3NlcGFyYXRvcicgOiBpc0xpdmUgPyAnc3RhdHVzJyA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1saXZlXT1cImlzTGl2ZSA/ICdwb2xpdGUnIDogbnVsbFwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50ID09PSAnc2VwYXJhdG9yJ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiaC1weCBmbGV4LTEgYmctYm9yZGVyXCI+PC9zcGFuPlxuXG4gICAgICA8aSAqbmdJZj1cImljb25cIiBbY2xhc3NdPVwiaWNvbkNsYXNzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuXG4gICAgICA8c3BhbiBbY2xhc3NdPVwibGFiZWxDbGFzc1wiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImxhYmVsXCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50ID09PSAnc2VwYXJhdG9yJ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiaC1weCBmbGV4LTEgYmctYm9yZGVyXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBNYXJrZXJDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBLaW5kIG9mIHRyYW5zY3JpcHQgbWFya2VyIHRoaXMgcm93IHJlcHJlc2VudHMuIEBkZWZhdWx0ICdkZWZhdWx0JyAqL1xuICBASW5wdXQoKSB2YXJpYW50OiBNYXJrZXJQcm9wc1sndmFyaWFudCddID0gJ2RlZmF1bHQnO1xuICAvKiogVGV4dCBmb3IgdGhlIG1hcmtlciDigJQgdGhlIGRhdGUgb24gYSBzZXBhcmF0b3IsIG9yIHRoZSBzdGF0dXMgd29yZGluZy4gKi9cbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgLyoqIFJlbWl4aWNvbiBjbGFzcyBmb3IgYSBsZWFkaW5nIGljb24sIGUuZy4gJ3JpLXRvb2xzLWxpbmUnLiAqL1xuICBASW5wdXQoKSBpY29uID0gJyc7XG4gIC8qKiBBcHBsaWVzIHRoZSBzaGltbWVyIHRleHQgc3dlZXAsIGZvciBsaXZlIHN0YXR1cyBzdWNoIGFzIFwiVGhpbmtpbmfigKZcIi4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgc2hpbW1lciA9IGZhbHNlO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgcm93IHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY24obWFya2VyVmFyaWFudHMoeyB2YXJpYW50OiB0aGlzLnZhcmlhbnQgfSksIHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBtYXJrZXIgYW5ub3VuY2VzIGEgY2hhbmdlIHRvIGFzc2lzdGl2ZSB0ZWNobm9sb2d5LiAqL1xuICBnZXQgaXNMaXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhcmlhbnQgPT09ICdzdGF0dXMnIHx8IHRoaXMudmFyaWFudCA9PT0gJ2Vycm9yJztcbiAgfVxuXG4gIGdldCBpY29uQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY24oJ3Nocmluay0wJywgdGhpcy5pY29uLCB0aGlzLnNoaW1tZXIgJiYgJ2FuaW1hdGUtcHVsc2UnKTtcbiAgfVxuXG4gIGdldCBsYWJlbENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSB3aGl0ZXNwYWNlLW5vd3JhcCcsXG4gICAgICB0aGlzLnZhcmlhbnQgPT09ICdzZXBhcmF0b3InICYmICdzaHJpbmstMCBweC0xIGZvbnQtbWVkaXVtJyxcbiAgICAgIHRoaXMuc2hpbW1lciAmJiAnc2hpbW1lcidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogR3JvdXBzIHJlbGF0ZWQgbWFya2VycyDigJQgYSBydW4gb2YgdG9vbCBjYWxscywgc2F5IOKAlCBpbnRvIG9uZSBpbmRlbnRlZCBibG9jayBzb1xuICogdGhleSByZWFkIGFzIGEgc2luZ2xlIHN0ZXAgaW4gdGhlIHRyYW5zY3JpcHQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1hcmtlci1ncm91cCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2IFtjbGFzc109XCJjbignZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTAuNScsIGNsYXNzKVwiIHJvbGU9XCJncm91cFwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBNYXJrZXJHcm91cENvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGdyb3VwIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuIl19
|