@rivet-health/design-system 40.9.1 → 40.10.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.
@@ -0,0 +1,72 @@
1
+ import { ChangeDetectionStrategy, Component, HostBinding, Input, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Trailing control row of a `riv-card` — typically buttons or a link.
5
+ *
6
+ * Sits above a stretched `[riv-card-link]` overlay, so its controls stay
7
+ * independently clickable on a card whose whole surface is activatable.
8
+ *
9
+ * `align` of `stretch` lays the controls out as equal-width columns, which is
10
+ * how a card with a single full-width action reads best.
11
+ *
12
+ * ```html
13
+ * <riv-card-actions [align]="'stretch'" [variant]="'filled'">
14
+ * <button rivButton [variant]="'ghost'">View report</button>
15
+ * </riv-card-actions>
16
+ * ```
17
+ */
18
+ export class CardActionsComponent {
19
+ constructor() {
20
+ /** Distribution of the controls along the row. */
21
+ this.align = 'end';
22
+ /** `filled` gives the row its own background, separating it from the body. */
23
+ this.variant = 'plain';
24
+ this.padding = 'medium';
25
+ this.orientation = 'horizontal';
26
+ /** Draws a separator above the row. Implied by the `filled` variant. */
27
+ this.divider = false;
28
+ }
29
+ get classes() {
30
+ return Object.entries({
31
+ [this.variant]: true,
32
+ [`align-${this.align}`]: true,
33
+ [`padding-${this.padding}`]: true,
34
+ [this.orientation]: true,
35
+ divider: this.divider,
36
+ })
37
+ .filter(([_, v]) => v)
38
+ .map(([k]) => k)
39
+ .join(' ');
40
+ }
41
+ }
42
+ CardActionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
43
+ CardActionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CardActionsComponent, selector: "riv-card-actions", inputs: { align: "align", variant: "variant", padding: "padding", orientation: "orientation", divider: "divider" }, host: { properties: { "class": "this.classes" } }, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{position:relative;z-index:var(--card-raised-z-index);display:flex;align-items:center;gap:var(--size-small);min-width:0}:host.horizontal{flex-direction:row}:host.vertical{flex-direction:column;align-items:stretch}:host.align-start{justify-content:flex-start}:host.align-center{justify-content:center}:host.align-end{justify-content:flex-end}:host.align-between{justify-content:space-between}:host.align-stretch{display:grid}:host.align-stretch.horizontal{grid-auto-flow:column;grid-auto-columns:1fr}:host.align-stretch.vertical{grid-auto-flow:row;grid-auto-rows:1fr}:host.filled{background-color:var(--surface-light-1)}:host.filled,:host.divider{border-top:var(--border-width) solid var(--border-light-blend)}:host.padding-small{padding:var(--size-small)}:host.padding-medium{padding:var(--size-medium)}:host.padding-large{padding:var(--size-large)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardActionsComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ selector: 'riv-card-actions', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n", styles: [":host{position:relative;z-index:var(--card-raised-z-index);display:flex;align-items:center;gap:var(--size-small);min-width:0}:host.horizontal{flex-direction:row}:host.vertical{flex-direction:column;align-items:stretch}:host.align-start{justify-content:flex-start}:host.align-center{justify-content:center}:host.align-end{justify-content:flex-end}:host.align-between{justify-content:space-between}:host.align-stretch{display:grid}:host.align-stretch.horizontal{grid-auto-flow:column;grid-auto-columns:1fr}:host.align-stretch.vertical{grid-auto-flow:row;grid-auto-rows:1fr}:host.filled{background-color:var(--surface-light-1)}:host.filled,:host.divider{border-top:var(--border-width) solid var(--border-light-blend)}:host.padding-small{padding:var(--size-small)}:host.padding-medium{padding:var(--size-medium)}:host.padding-large{padding:var(--size-large)}\n"] }]
47
+ }], propDecorators: { align: [{
48
+ type: Input
49
+ }], variant: [{
50
+ type: Input
51
+ }], padding: [{
52
+ type: Input
53
+ }], orientation: [{
54
+ type: Input
55
+ }], divider: [{
56
+ type: Input
57
+ }], classes: [{
58
+ type: HostBinding,
59
+ args: ['class']
60
+ }] } });
61
+ (function (CardActionsComponent) {
62
+ CardActionsComponent.Variants = ['plain', 'filled'];
63
+ CardActionsComponent.Aligns = [
64
+ 'start',
65
+ 'center',
66
+ 'end',
67
+ 'between',
68
+ 'stretch',
69
+ ];
70
+ CardActionsComponent.Orientations = ['horizontal', 'vertical'];
71
+ })(CardActionsComponent || (CardActionsComponent = {}));
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1hY3Rpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL2xheW91dC9jYXJkL2NhcmQtYWN0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9sYXlvdXQvY2FyZC9jYXJkLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssR0FDTixNQUFNLGVBQWUsQ0FBQzs7QUFHdkI7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFPSCxNQUFNLE9BQU8sb0JBQW9CO0lBTmpDO1FBT0Usa0RBQWtEO1FBRWxELFVBQUssR0FBK0IsS0FBSyxDQUFDO1FBRTFDLDhFQUE4RTtRQUU5RSxZQUFPLEdBQWlDLE9BQU8sQ0FBQztRQUdoRCxZQUFPLEdBQTBCLFFBQVEsQ0FBQztRQUcxQyxnQkFBVyxHQUFxQyxZQUFZLENBQUM7UUFFN0Qsd0VBQXdFO1FBRXhFLFlBQU8sR0FBWSxLQUFLLENBQUM7S0FlMUI7SUFiQyxJQUNJLE9BQU87UUFDVCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDcEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSTtZQUNwQixDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSTtZQUM3QixDQUFDLFdBQVcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSTtZQUNqQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJO1lBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDO2FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDOztrSEEvQlUsb0JBQW9CO3NHQUFwQixvQkFBb0IsK05DN0JqQyw2QkFDQTs0RkQ0QmEsb0JBQW9CO2tCQU5oQyxTQUFTOytCQUNFLGtCQUFrQixtQkFHWCx1QkFBdUIsQ0FBQyxNQUFNOzhCQUsvQyxLQUFLO3NCQURKLEtBQUs7Z0JBS04sT0FBTztzQkFETixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixXQUFXO3NCQURWLEtBQUs7Z0JBS04sT0FBTztzQkFETixLQUFLO2dCQUlGLE9BQU87c0JBRFYsV0FBVzt1QkFBQyxPQUFPOztBQWV0QixXQUFpQixvQkFBb0I7SUFDdEIsNkJBQVEsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQVUsQ0FBQztJQUd4QywyQkFBTSxHQUFHO1FBQ3BCLE9BQU87UUFDUCxRQUFRO1FBQ1IsS0FBSztRQUNMLFNBQVM7UUFDVCxTQUFTO0tBQ0QsQ0FBQztJQUdFLGlDQUFZLEdBQUcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFVLENBQUM7QUFFbEUsQ0FBQyxFQWZnQixvQkFBb0IsS0FBcEIsb0JBQW9CLFFBZXBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhcmRDb21wb25lbnQgfSBmcm9tICcuL2NhcmQuY29tcG9uZW50JztcblxuLyoqXG4gKiBUcmFpbGluZyBjb250cm9sIHJvdyBvZiBhIGByaXYtY2FyZGAg4oCUIHR5cGljYWxseSBidXR0b25zIG9yIGEgbGluay5cbiAqXG4gKiBTaXRzIGFib3ZlIGEgc3RyZXRjaGVkIGBbcml2LWNhcmQtbGlua11gIG92ZXJsYXksIHNvIGl0cyBjb250cm9scyBzdGF5XG4gKiBpbmRlcGVuZGVudGx5IGNsaWNrYWJsZSBvbiBhIGNhcmQgd2hvc2Ugd2hvbGUgc3VyZmFjZSBpcyBhY3RpdmF0YWJsZS5cbiAqXG4gKiBgYWxpZ25gIG9mIGBzdHJldGNoYCBsYXlzIHRoZSBjb250cm9scyBvdXQgYXMgZXF1YWwtd2lkdGggY29sdW1ucywgd2hpY2ggaXNcbiAqIGhvdyBhIGNhcmQgd2l0aCBhIHNpbmdsZSBmdWxsLXdpZHRoIGFjdGlvbiByZWFkcyBiZXN0LlxuICpcbiAqIGBgYGh0bWxcbiAqIDxyaXYtY2FyZC1hY3Rpb25zIFthbGlnbl09XCInc3RyZXRjaCdcIiBbdmFyaWFudF09XCInZmlsbGVkJ1wiPlxuICogICA8YnV0dG9uIHJpdkJ1dHRvbiBbdmFyaWFudF09XCInZ2hvc3QnXCI+VmlldyByZXBvcnQ8L2J1dHRvbj5cbiAqIDwvcml2LWNhcmQtYWN0aW9ucz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtY2FyZC1hY3Rpb25zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhcmQtYWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhcmQtYWN0aW9ucy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDYXJkQWN0aW9uc0NvbXBvbmVudCB7XG4gIC8qKiBEaXN0cmlidXRpb24gb2YgdGhlIGNvbnRyb2xzIGFsb25nIHRoZSByb3cuICovXG4gIEBJbnB1dCgpXG4gIGFsaWduOiBDYXJkQWN0aW9uc0NvbXBvbmVudC5BbGlnbiA9ICdlbmQnO1xuXG4gIC8qKiBgZmlsbGVkYCBnaXZlcyB0aGUgcm93IGl0cyBvd24gYmFja2dyb3VuZCwgc2VwYXJhdGluZyBpdCBmcm9tIHRoZSBib2R5LiAqL1xuICBASW5wdXQoKVxuICB2YXJpYW50OiBDYXJkQWN0aW9uc0NvbXBvbmVudC5WYXJpYW50ID0gJ3BsYWluJztcblxuICBASW5wdXQoKVxuICBwYWRkaW5nOiBDYXJkQ29tcG9uZW50LlBhZGRpbmcgPSAnbWVkaXVtJztcblxuICBASW5wdXQoKVxuICBvcmllbnRhdGlvbjogQ2FyZEFjdGlvbnNDb21wb25lbnQuT3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCc7XG5cbiAgLyoqIERyYXdzIGEgc2VwYXJhdG9yIGFib3ZlIHRoZSByb3cuIEltcGxpZWQgYnkgdGhlIGBmaWxsZWRgIHZhcmlhbnQuICovXG4gIEBJbnB1dCgpXG4gIGRpdmlkZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoe1xuICAgICAgW3RoaXMudmFyaWFudF06IHRydWUsXG4gICAgICBbYGFsaWduLSR7dGhpcy5hbGlnbn1gXTogdHJ1ZSxcbiAgICAgIFtgcGFkZGluZy0ke3RoaXMucGFkZGluZ31gXTogdHJ1ZSxcbiAgICAgIFt0aGlzLm9yaWVudGF0aW9uXTogdHJ1ZSxcbiAgICAgIGRpdmlkZXI6IHRoaXMuZGl2aWRlcixcbiAgICB9KVxuICAgICAgLmZpbHRlcigoW18sIHZdKSA9PiB2KVxuICAgICAgLm1hcCgoW2tdKSA9PiBrKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIENhcmRBY3Rpb25zQ29tcG9uZW50IHtcbiAgZXhwb3J0IGNvbnN0IFZhcmlhbnRzID0gWydwbGFpbicsICdmaWxsZWQnXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgVmFyaWFudCA9ICh0eXBlb2YgVmFyaWFudHMpW251bWJlcl07XG5cbiAgZXhwb3J0IGNvbnN0IEFsaWducyA9IFtcbiAgICAnc3RhcnQnLFxuICAgICdjZW50ZXInLFxuICAgICdlbmQnLFxuICAgICdiZXR3ZWVuJyxcbiAgICAnc3RyZXRjaCcsXG4gIF0gYXMgY29uc3Q7XG4gIGV4cG9ydCB0eXBlIEFsaWduID0gKHR5cGVvZiBBbGlnbnMpW251bWJlcl07XG5cbiAgZXhwb3J0IGNvbnN0IE9yaWVudGF0aW9ucyA9IFsnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCddIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBPcmllbnRhdGlvbiA9ICh0eXBlb2YgT3JpZW50YXRpb25zKVtudW1iZXJdO1xufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
@@ -0,0 +1,43 @@
1
+ import { ChangeDetectionStrategy, Component, HostBinding, Input, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Body of a `riv-card`.
5
+ *
6
+ * Grows to absorb any spare height by default, which keeps `riv-card-actions`
7
+ * pinned to the bottom when cards of differing content sit in an equal-height
8
+ * grid. Set `[grow]="false"` when the card should shrink to its content.
9
+ */
10
+ export class CardContentComponent {
11
+ constructor() {
12
+ this.padding = 'medium';
13
+ this.grow = true;
14
+ /** Draws a separator below the content. */
15
+ this.divider = false;
16
+ }
17
+ get classes() {
18
+ return Object.entries({
19
+ [`padding-${this.padding}`]: true,
20
+ grow: this.grow,
21
+ divider: this.divider,
22
+ })
23
+ .filter(([_, v]) => v)
24
+ .map(([k]) => k)
25
+ .join(' ');
26
+ }
27
+ }
28
+ CardContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
29
+ CardContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CardContentComponent, selector: "riv-card-content", inputs: { padding: "padding", grow: "grow", divider: "divider" }, host: { properties: { "class": "this.classes" } }, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{display:block;min-width:0;font:var(--body-medium)}:host.grow{flex-grow:1}:host.divider{border-bottom:var(--border-width) solid var(--border-light-blend)}:host.padding-small{padding:var(--size-small)}:host.padding-medium{padding:var(--size-medium)}:host.padding-large{padding:var(--size-large)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardContentComponent, decorators: [{
31
+ type: Component,
32
+ args: [{ selector: 'riv-card-content', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n", styles: [":host{display:block;min-width:0;font:var(--body-medium)}:host.grow{flex-grow:1}:host.divider{border-bottom:var(--border-width) solid var(--border-light-blend)}:host.padding-small{padding:var(--size-small)}:host.padding-medium{padding:var(--size-medium)}:host.padding-large{padding:var(--size-large)}\n"] }]
33
+ }], propDecorators: { padding: [{
34
+ type: Input
35
+ }], grow: [{
36
+ type: Input
37
+ }], divider: [{
38
+ type: Input
39
+ }], classes: [{
40
+ type: HostBinding,
41
+ args: ['class']
42
+ }] } });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL2xheW91dC9jYXJkL2NhcmQtY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9sYXlvdXQvY2FyZC9jYXJkLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssR0FDTixNQUFNLGVBQWUsQ0FBQzs7QUFHdkI7Ozs7OztHQU1HO0FBT0gsTUFBTSxPQUFPLG9CQUFvQjtJQU5qQztRQVFFLFlBQU8sR0FBMEIsUUFBUSxDQUFDO1FBRzFDLFNBQUksR0FBWSxJQUFJLENBQUM7UUFFckIsMkNBQTJDO1FBRTNDLFlBQU8sR0FBWSxLQUFLLENBQUM7S0FhMUI7SUFYQyxJQUNJLE9BQU87UUFDVCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDcEIsQ0FBQyxXQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUk7WUFDakMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3RCLENBQUM7YUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7O2tIQXJCVSxvQkFBb0I7c0dBQXBCLG9CQUFvQiw2S0NyQmpDLDZCQUNBOzRGRG9CYSxvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU07OEJBSS9DLE9BQU87c0JBRE4sS0FBSztnQkFJTixJQUFJO3NCQURILEtBQUs7Z0JBS04sT0FBTztzQkFETixLQUFLO2dCQUlGLE9BQU87c0JBRFYsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhcmRDb21wb25lbnQgfSBmcm9tICcuL2NhcmQuY29tcG9uZW50JztcblxuLyoqXG4gKiBCb2R5IG9mIGEgYHJpdi1jYXJkYC5cbiAqXG4gKiBHcm93cyB0byBhYnNvcmIgYW55IHNwYXJlIGhlaWdodCBieSBkZWZhdWx0LCB3aGljaCBrZWVwcyBgcml2LWNhcmQtYWN0aW9uc2BcbiAqIHBpbm5lZCB0byB0aGUgYm90dG9tIHdoZW4gY2FyZHMgb2YgZGlmZmVyaW5nIGNvbnRlbnQgc2l0IGluIGFuIGVxdWFsLWhlaWdodFxuICogZ3JpZC4gU2V0IGBbZ3Jvd109XCJmYWxzZVwiYCB3aGVuIHRoZSBjYXJkIHNob3VsZCBzaHJpbmsgdG8gaXRzIGNvbnRlbnQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1jYXJkLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FyZC1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FyZC1jb250ZW50LmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENhcmRDb250ZW50Q29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgcGFkZGluZzogQ2FyZENvbXBvbmVudC5QYWRkaW5nID0gJ21lZGl1bSc7XG5cbiAgQElucHV0KClcbiAgZ3JvdzogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIERyYXdzIGEgc2VwYXJhdG9yIGJlbG93IHRoZSBjb250ZW50LiAqL1xuICBASW5wdXQoKVxuICBkaXZpZGVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBjbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHtcbiAgICAgIFtgcGFkZGluZy0ke3RoaXMucGFkZGluZ31gXTogdHJ1ZSxcbiAgICAgIGdyb3c6IHRoaXMuZ3JvdyxcbiAgICAgIGRpdmlkZXI6IHRoaXMuZGl2aWRlcixcbiAgICB9KVxuICAgICAgLmZpbHRlcigoW18sIHZdKSA9PiB2KVxuICAgICAgLm1hcCgoW2tdKSA9PiBrKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
@@ -0,0 +1,127 @@
1
+ import { ChangeDetectionStrategy, Component, HostBinding, Input, Optional, } from '@angular/core';
2
+ import { uniqueId } from 'lodash';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./card.component";
5
+ import * as i2 from "@angular/common";
6
+ /**
7
+ * Top row of a `riv-card`: heading text plus optional adornments.
8
+ *
9
+ * Three projection slots, all optional:
10
+ * - `[leading]` — icon, avatar, or status dot shown before the heading
11
+ * - default — laid out on the heading's baseline, so status badges sit beside
12
+ * the title and wrap below it when space runs out. Also takes a whole custom
13
+ * title (an inline rename field, say) when `heading` is left unset;
14
+ * `subheading` still renders below either way.
15
+ * - `[actions]` — trailing controls such as `riv-menu`
16
+ *
17
+ * ```html
18
+ * <riv-card-header [heading]="'Commercial 2025'" [subheading]="'Aetna'">
19
+ * <riv-icon leading [name]="'FileText'"></riv-icon>
20
+ * <riv-badge [size]="'small'" [variant]="'categorical-8'">Draft</riv-badge>
21
+ * <riv-menu actions>...</riv-menu>
22
+ * </riv-card-header>
23
+ * ```
24
+ *
25
+ * `headingLevel` renders a real `h1`–`h6` so the card fits the page's heading
26
+ * outline; pick the level that follows the surrounding content rather than the
27
+ * one that looks right, since size comes from the design tokens either way.
28
+ *
29
+ * The heading font can be overridden per-instance with the
30
+ * `--card-heading-font` custom property.
31
+ */
32
+ export class CardHeaderComponent {
33
+ constructor(card) {
34
+ this.card = card;
35
+ /**
36
+ * Identifies the title for a clickable `riv-card`, which names its click
37
+ * target from the title rather than from the card's whole text.
38
+ */
39
+ this.titleId = uniqueId('riv-card-title-');
40
+ /** Heading element rendered for `heading`, for document outline purposes. */
41
+ this.headingLevel = 3;
42
+ /** `filled` gives the header its own background, separating it from the body. */
43
+ this.variant = 'plain';
44
+ this.padding = 'medium';
45
+ /** Draws a separator below the header. Implied by the `filled` variant. */
46
+ this.divider = false;
47
+ /** Cross-axis alignment of the leading slot, heading block, and actions. */
48
+ this.align = 'start';
49
+ }
50
+ /**
51
+ * Offers the heading to an enclosing card as the name for its click target.
52
+ * Only a text heading is offered: projected titles can be anything, so those
53
+ * cards fall back to naming against their whole content.
54
+ */
55
+ ngOnChanges(changes) {
56
+ if (changes['heading']) {
57
+ if (this.heading?.trim()) {
58
+ this.card?.setTitleId(this.titleId);
59
+ }
60
+ else {
61
+ this.card?.clearTitleId(this.titleId);
62
+ }
63
+ }
64
+ }
65
+ /** Withdraws the offer, so the card stops naming itself against this header. */
66
+ ngOnDestroy() {
67
+ this.card?.clearTitleId(this.titleId);
68
+ }
69
+ get classes() {
70
+ return Object.entries({
71
+ [this.variant]: true,
72
+ [`padding-${this.padding}`]: true,
73
+ [`align-${this.align}`]: true,
74
+ divider: this.divider,
75
+ })
76
+ .filter(([_, v]) => v)
77
+ .map(([k]) => k)
78
+ .join(' ');
79
+ }
80
+ /**
81
+ * Line clamping is applied inline so the line count stays a plain input
82
+ * rather than a fixed set of CSS classes.
83
+ */
84
+ get clampStyle() {
85
+ return this.clamp == null
86
+ ? {}
87
+ : {
88
+ display: '-webkit-box',
89
+ '-webkit-box-orient': 'vertical',
90
+ '-webkit-line-clamp': `${this.clamp}`,
91
+ overflow: 'hidden',
92
+ };
93
+ }
94
+ }
95
+ CardHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardHeaderComponent, deps: [{ token: i1.CardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
96
+ CardHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CardHeaderComponent, selector: "riv-card-header", inputs: { heading: "heading", subheading: "subheading", headingLevel: "headingLevel", variant: "variant", padding: "padding", divider: "divider", align: "align", clamp: "clamp" }, host: { properties: { "class": "this.classes" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"leading\"><ng-content select=\"[leading]\"></ng-content></div>\n<div class=\"main\">\n <div class=\"title-row\" [id]=\"titleId\">\n <div *ngIf=\"heading?.trim()\" class=\"heading\" [ngStyle]=\"clampStyle\">\n <ng-container [ngSwitch]=\"headingLevel\">\n <h1 *ngSwitchCase=\"1\">{{ heading }}</h1>\n <h2 *ngSwitchCase=\"2\">{{ heading }}</h2>\n <h3 *ngSwitchCase=\"3\">{{ heading }}</h3>\n <h4 *ngSwitchCase=\"4\">{{ heading }}</h4>\n <h5 *ngSwitchCase=\"5\">{{ heading }}</h5>\n <h6 *ngSwitchCase=\"6\">{{ heading }}</h6>\n </ng-container>\n </div>\n <ng-content></ng-content>\n </div>\n <div *ngIf=\"subheading?.trim()\" class=\"subheading\">{{ subheading }}</div>\n</div>\n<div class=\"actions\"><ng-content select=\"[actions]\"></ng-content></div>\n", styles: [":host{display:flex;gap:var(--size-medium);min-width:0}:host.align-start{align-items:flex-start}:host.align-center{align-items:center}:host.padding-small{padding:var(--size-small)}:host.padding-medium{padding:var(--size-medium)}:host.padding-large{padding:var(--size-large)}:host.filled{background-color:var(--surface-light-1)}:host.filled,:host.divider{border-bottom:var(--border-width) solid var(--border-light-blend)}.main{flex-grow:1;min-width:0}.title-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--size-xsmall);min-width:0;font:var(--card-heading-font, var(--title-04));color:var(--type-light-high-contrast)}:host.filled .title-row{font:var(--card-heading-font, var(--title-02))}.leading{flex-shrink:0}.actions{position:relative;z-index:var(--card-raised-z-index);display:flex;flex-shrink:0;align-items:center;gap:var(--size-small)}.leading:not(:has(*)),.actions:not(:has(*)){display:none}.heading{min-width:0}.heading>*{display:inline;margin:0;font:inherit;color:inherit}.subheading{font:var(--body-small);color:var(--type-light-low-contrast)}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
97
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardHeaderComponent, decorators: [{
98
+ type: Component,
99
+ args: [{ selector: 'riv-card-header', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"leading\"><ng-content select=\"[leading]\"></ng-content></div>\n<div class=\"main\">\n <div class=\"title-row\" [id]=\"titleId\">\n <div *ngIf=\"heading?.trim()\" class=\"heading\" [ngStyle]=\"clampStyle\">\n <ng-container [ngSwitch]=\"headingLevel\">\n <h1 *ngSwitchCase=\"1\">{{ heading }}</h1>\n <h2 *ngSwitchCase=\"2\">{{ heading }}</h2>\n <h3 *ngSwitchCase=\"3\">{{ heading }}</h3>\n <h4 *ngSwitchCase=\"4\">{{ heading }}</h4>\n <h5 *ngSwitchCase=\"5\">{{ heading }}</h5>\n <h6 *ngSwitchCase=\"6\">{{ heading }}</h6>\n </ng-container>\n </div>\n <ng-content></ng-content>\n </div>\n <div *ngIf=\"subheading?.trim()\" class=\"subheading\">{{ subheading }}</div>\n</div>\n<div class=\"actions\"><ng-content select=\"[actions]\"></ng-content></div>\n", styles: [":host{display:flex;gap:var(--size-medium);min-width:0}:host.align-start{align-items:flex-start}:host.align-center{align-items:center}:host.padding-small{padding:var(--size-small)}:host.padding-medium{padding:var(--size-medium)}:host.padding-large{padding:var(--size-large)}:host.filled{background-color:var(--surface-light-1)}:host.filled,:host.divider{border-bottom:var(--border-width) solid var(--border-light-blend)}.main{flex-grow:1;min-width:0}.title-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--size-xsmall);min-width:0;font:var(--card-heading-font, var(--title-04));color:var(--type-light-high-contrast)}:host.filled .title-row{font:var(--card-heading-font, var(--title-02))}.leading{flex-shrink:0}.actions{position:relative;z-index:var(--card-raised-z-index);display:flex;flex-shrink:0;align-items:center;gap:var(--size-small)}.leading:not(:has(*)),.actions:not(:has(*)){display:none}.heading{min-width:0}.heading>*{display:inline;margin:0;font:inherit;color:inherit}.subheading{font:var(--body-small);color:var(--type-light-low-contrast)}\n"] }]
100
+ }], ctorParameters: function () { return [{ type: i1.CardComponent, decorators: [{
101
+ type: Optional
102
+ }] }]; }, propDecorators: { heading: [{
103
+ type: Input
104
+ }], subheading: [{
105
+ type: Input
106
+ }], headingLevel: [{
107
+ type: Input
108
+ }], variant: [{
109
+ type: Input
110
+ }], padding: [{
111
+ type: Input
112
+ }], divider: [{
113
+ type: Input
114
+ }], align: [{
115
+ type: Input
116
+ }], clamp: [{
117
+ type: Input
118
+ }], classes: [{
119
+ type: HostBinding,
120
+ args: ['class']
121
+ }] } });
122
+ (function (CardHeaderComponent) {
123
+ CardHeaderComponent.Variants = ['plain', 'filled'];
124
+ CardHeaderComponent.HeadingLevels = [1, 2, 3, 4, 5, 6];
125
+ CardHeaderComponent.Aligns = ['start', 'center'];
126
+ })(CardHeaderComponent || (CardHeaderComponent = {}));
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvbGF5b3V0L2NhcmQvY2FyZC1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvbGF5b3V0L2NhcmQvY2FyZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssRUFHTCxRQUFRLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7OztBQUdsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQU9ILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsWUFBeUMsSUFBMEI7UUFBMUIsU0FBSSxHQUFKLElBQUksQ0FBc0I7UUFFbkU7OztXQUdHO1FBQ00sWUFBTyxHQUFXLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBVXZELDZFQUE2RTtRQUU3RSxpQkFBWSxHQUFxQyxDQUFDLENBQUM7UUFFbkQsaUZBQWlGO1FBRWpGLFlBQU8sR0FBZ0MsT0FBTyxDQUFDO1FBRy9DLFlBQU8sR0FBMEIsUUFBUSxDQUFDO1FBRTFDLDJFQUEyRTtRQUUzRSxZQUFPLEdBQVksS0FBSyxDQUFDO1FBRXpCLDRFQUE0RTtRQUU1RSxVQUFLLEdBQThCLE9BQU8sQ0FBQztJQWpDMkIsQ0FBQztJQTBDdkU7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdkM7U0FDRjtJQUNILENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFDSSxPQUFPO1FBQ1QsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ3BCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUk7WUFDcEIsQ0FBQyxXQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUk7WUFDakMsQ0FBQyxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUk7WUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3RCLENBQUM7YUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSTtZQUN2QixDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQztnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsb0JBQW9CLEVBQUUsVUFBVTtnQkFDaEMsb0JBQW9CLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNyQyxRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDO0lBQ1IsQ0FBQzs7aUhBekZVLG1CQUFtQjtxR0FBbkIsbUJBQW1CLG1UQzdDaEMsK3pCQWtCQTs0RkQyQmEsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNOzswQkFHbEMsUUFBUTs0Q0FVckIsT0FBTztzQkFETixLQUFLO2dCQUtOLFVBQVU7c0JBRFQsS0FBSztnQkFLTixZQUFZO3NCQURYLEtBQUs7Z0JBS04sT0FBTztzQkFETixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFLTixPQUFPO3NCQUROLEtBQUs7Z0JBS04sS0FBSztzQkFESixLQUFLO2dCQVFOLEtBQUs7c0JBREosS0FBSztnQkF3QkYsT0FBTztzQkFEVixXQUFXO3VCQUFDLE9BQU87O0FBNkJ0QixXQUFpQixtQkFBbUI7SUFDckIsNEJBQVEsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQVUsQ0FBQztJQUd4QyxpQ0FBYSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQVUsQ0FBQztJQUc1QywwQkFBTSxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBRXJELENBQUMsRUFUZ0IsbUJBQW1CLEtBQW5CLG1CQUFtQixRQVNuQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IENhcmRDb21wb25lbnQgfSBmcm9tICcuL2NhcmQuY29tcG9uZW50JztcblxuLyoqXG4gKiBUb3Agcm93IG9mIGEgYHJpdi1jYXJkYDogaGVhZGluZyB0ZXh0IHBsdXMgb3B0aW9uYWwgYWRvcm5tZW50cy5cbiAqXG4gKiBUaHJlZSBwcm9qZWN0aW9uIHNsb3RzLCBhbGwgb3B0aW9uYWw6XG4gKiAtIGBbbGVhZGluZ11gIOKAlCBpY29uLCBhdmF0YXIsIG9yIHN0YXR1cyBkb3Qgc2hvd24gYmVmb3JlIHRoZSBoZWFkaW5nXG4gKiAtIGRlZmF1bHQg4oCUIGxhaWQgb3V0IG9uIHRoZSBoZWFkaW5nJ3MgYmFzZWxpbmUsIHNvIHN0YXR1cyBiYWRnZXMgc2l0IGJlc2lkZVxuICogICB0aGUgdGl0bGUgYW5kIHdyYXAgYmVsb3cgaXQgd2hlbiBzcGFjZSBydW5zIG91dC4gQWxzbyB0YWtlcyBhIHdob2xlIGN1c3RvbVxuICogICB0aXRsZSAoYW4gaW5saW5lIHJlbmFtZSBmaWVsZCwgc2F5KSB3aGVuIGBoZWFkaW5nYCBpcyBsZWZ0IHVuc2V0O1xuICogICBgc3ViaGVhZGluZ2Agc3RpbGwgcmVuZGVycyBiZWxvdyBlaXRoZXIgd2F5LlxuICogLSBgW2FjdGlvbnNdYCDigJQgdHJhaWxpbmcgY29udHJvbHMgc3VjaCBhcyBgcml2LW1lbnVgXG4gKlxuICogYGBgaHRtbFxuICogPHJpdi1jYXJkLWhlYWRlciBbaGVhZGluZ109XCInQ29tbWVyY2lhbCAyMDI1J1wiIFtzdWJoZWFkaW5nXT1cIidBZXRuYSdcIj5cbiAqICAgPHJpdi1pY29uIGxlYWRpbmcgW25hbWVdPVwiJ0ZpbGVUZXh0J1wiPjwvcml2LWljb24+XG4gKiAgIDxyaXYtYmFkZ2UgW3NpemVdPVwiJ3NtYWxsJ1wiIFt2YXJpYW50XT1cIidjYXRlZ29yaWNhbC04J1wiPkRyYWZ0PC9yaXYtYmFkZ2U+XG4gKiAgIDxyaXYtbWVudSBhY3Rpb25zPi4uLjwvcml2LW1lbnU+XG4gKiA8L3Jpdi1jYXJkLWhlYWRlcj5cbiAqIGBgYFxuICpcbiAqIGBoZWFkaW5nTGV2ZWxgIHJlbmRlcnMgYSByZWFsIGBoMWDigJNgaDZgIHNvIHRoZSBjYXJkIGZpdHMgdGhlIHBhZ2UncyBoZWFkaW5nXG4gKiBvdXRsaW5lOyBwaWNrIHRoZSBsZXZlbCB0aGF0IGZvbGxvd3MgdGhlIHN1cnJvdW5kaW5nIGNvbnRlbnQgcmF0aGVyIHRoYW4gdGhlXG4gKiBvbmUgdGhhdCBsb29rcyByaWdodCwgc2luY2Ugc2l6ZSBjb21lcyBmcm9tIHRoZSBkZXNpZ24gdG9rZW5zIGVpdGhlciB3YXkuXG4gKlxuICogVGhlIGhlYWRpbmcgZm9udCBjYW4gYmUgb3ZlcnJpZGRlbiBwZXItaW5zdGFuY2Ugd2l0aCB0aGVcbiAqIGAtLWNhcmQtaGVhZGluZy1mb250YCBjdXN0b20gcHJvcGVydHkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1jYXJkLWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXJkLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhcmQtaGVhZGVyLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENhcmRIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgY2FyZDogQ2FyZENvbXBvbmVudCB8IG51bGwpIHt9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXMgdGhlIHRpdGxlIGZvciBhIGNsaWNrYWJsZSBgcml2LWNhcmRgLCB3aGljaCBuYW1lcyBpdHMgY2xpY2tcbiAgICogdGFyZ2V0IGZyb20gdGhlIHRpdGxlIHJhdGhlciB0aGFuIGZyb20gdGhlIGNhcmQncyB3aG9sZSB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGVJZDogc3RyaW5nID0gdW5pcXVlSWQoJ3Jpdi1jYXJkLXRpdGxlLScpO1xuXG4gIC8qKiBIZWFkaW5nIHRleHQuIE9taXQgd2hlbiBwcm9qZWN0aW5nIGN1c3RvbSBoZWFkaW5nIG1hcmt1cCBpbnN0ZWFkLiAqL1xuICBASW5wdXQoKVxuICBoZWFkaW5nPzogc3RyaW5nO1xuXG4gIC8qKiBTdXBwb3J0aW5nIHRleHQgcmVuZGVyZWQgYmVsb3cgdGhlIGhlYWRpbmcuICovXG4gIEBJbnB1dCgpXG4gIHN1YmhlYWRpbmc/OiBzdHJpbmc7XG5cbiAgLyoqIEhlYWRpbmcgZWxlbWVudCByZW5kZXJlZCBmb3IgYGhlYWRpbmdgLCBmb3IgZG9jdW1lbnQgb3V0bGluZSBwdXJwb3Nlcy4gKi9cbiAgQElucHV0KClcbiAgaGVhZGluZ0xldmVsOiBDYXJkSGVhZGVyQ29tcG9uZW50LkhlYWRpbmdMZXZlbCA9IDM7XG5cbiAgLyoqIGBmaWxsZWRgIGdpdmVzIHRoZSBoZWFkZXIgaXRzIG93biBiYWNrZ3JvdW5kLCBzZXBhcmF0aW5nIGl0IGZyb20gdGhlIGJvZHkuICovXG4gIEBJbnB1dCgpXG4gIHZhcmlhbnQ6IENhcmRIZWFkZXJDb21wb25lbnQuVmFyaWFudCA9ICdwbGFpbic7XG5cbiAgQElucHV0KClcbiAgcGFkZGluZzogQ2FyZENvbXBvbmVudC5QYWRkaW5nID0gJ21lZGl1bSc7XG5cbiAgLyoqIERyYXdzIGEgc2VwYXJhdG9yIGJlbG93IHRoZSBoZWFkZXIuIEltcGxpZWQgYnkgdGhlIGBmaWxsZWRgIHZhcmlhbnQuICovXG4gIEBJbnB1dCgpXG4gIGRpdmlkZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogQ3Jvc3MtYXhpcyBhbGlnbm1lbnQgb2YgdGhlIGxlYWRpbmcgc2xvdCwgaGVhZGluZyBibG9jaywgYW5kIGFjdGlvbnMuICovXG4gIEBJbnB1dCgpXG4gIGFsaWduOiBDYXJkSGVhZGVyQ29tcG9uZW50LkFsaWduID0gJ3N0YXJ0JztcblxuICAvKipcbiAgICogVHJ1bmNhdGVzIHRoZSBoZWFkaW5nIHRvIHRoaXMgbWFueSBsaW5lcyB3aXRoIGFuIGVsbGlwc2lzLiBMZWF2ZSB1bnNldCB0b1xuICAgKiBsZXQgdGhlIGhlYWRpbmcgd3JhcCBmcmVlbHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBjbGFtcD86IG51bWJlcjtcblxuICAvKipcbiAgICogT2ZmZXJzIHRoZSBoZWFkaW5nIHRvIGFuIGVuY2xvc2luZyBjYXJkIGFzIHRoZSBuYW1lIGZvciBpdHMgY2xpY2sgdGFyZ2V0LlxuICAgKiBPbmx5IGEgdGV4dCBoZWFkaW5nIGlzIG9mZmVyZWQ6IHByb2plY3RlZCB0aXRsZXMgY2FuIGJlIGFueXRoaW5nLCBzbyB0aG9zZVxuICAgKiBjYXJkcyBmYWxsIGJhY2sgdG8gbmFtaW5nIGFnYWluc3QgdGhlaXIgd2hvbGUgY29udGVudC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snaGVhZGluZyddKSB7XG4gICAgICBpZiAodGhpcy5oZWFkaW5nPy50cmltKCkpIHtcbiAgICAgICAgdGhpcy5jYXJkPy5zZXRUaXRsZUlkKHRoaXMudGl0bGVJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhcmQ/LmNsZWFyVGl0bGVJZCh0aGlzLnRpdGxlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBXaXRoZHJhd3MgdGhlIG9mZmVyLCBzbyB0aGUgY2FyZCBzdG9wcyBuYW1pbmcgaXRzZWxmIGFnYWluc3QgdGhpcyBoZWFkZXIuICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2FyZD8uY2xlYXJUaXRsZUlkKHRoaXMudGl0bGVJZCk7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoe1xuICAgICAgW3RoaXMudmFyaWFudF06IHRydWUsXG4gICAgICBbYHBhZGRpbmctJHt0aGlzLnBhZGRpbmd9YF06IHRydWUsXG4gICAgICBbYGFsaWduLSR7dGhpcy5hbGlnbn1gXTogdHJ1ZSxcbiAgICAgIGRpdmlkZXI6IHRoaXMuZGl2aWRlcixcbiAgICB9KVxuICAgICAgLmZpbHRlcigoW18sIHZdKSA9PiB2KVxuICAgICAgLm1hcCgoW2tdKSA9PiBrKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5lIGNsYW1waW5nIGlzIGFwcGxpZWQgaW5saW5lIHNvIHRoZSBsaW5lIGNvdW50IHN0YXlzIGEgcGxhaW4gaW5wdXRcbiAgICogcmF0aGVyIHRoYW4gYSBmaXhlZCBzZXQgb2YgQ1NTIGNsYXNzZXMuXG4gICAqL1xuICBnZXQgY2xhbXBTdHlsZSgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jbGFtcCA9PSBudWxsXG4gICAgICA/IHt9XG4gICAgICA6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnLXdlYmtpdC1ib3gnLFxuICAgICAgICAgICctd2Via2l0LWJveC1vcmllbnQnOiAndmVydGljYWwnLFxuICAgICAgICAgICctd2Via2l0LWxpbmUtY2xhbXAnOiBgJHt0aGlzLmNsYW1wfWAsXG4gICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2FyZEhlYWRlckNvbXBvbmVudCB7XG4gIGV4cG9ydCBjb25zdCBWYXJpYW50cyA9IFsncGxhaW4nLCAnZmlsbGVkJ10gYXMgY29uc3Q7XG4gIGV4cG9ydCB0eXBlIFZhcmlhbnQgPSAodHlwZW9mIFZhcmlhbnRzKVtudW1iZXJdO1xuXG4gIGV4cG9ydCBjb25zdCBIZWFkaW5nTGV2ZWxzID0gWzEsIDIsIDMsIDQsIDUsIDZdIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBIZWFkaW5nTGV2ZWwgPSAodHlwZW9mIEhlYWRpbmdMZXZlbHMpW251bWJlcl07XG5cbiAgZXhwb3J0IGNvbnN0IEFsaWducyA9IFsnc3RhcnQnLCAnY2VudGVyJ10gYXMgY29uc3Q7XG4gIGV4cG9ydCB0eXBlIEFsaWduID0gKHR5cGVvZiBBbGlnbnMpW251bWJlcl07XG59XG4iLCI8ZGl2IGNsYXNzPVwibGVhZGluZ1wiPjxuZy1jb250ZW50IHNlbGVjdD1cIltsZWFkaW5nXVwiPjwvbmctY29udGVudD48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtYWluXCI+XG4gIDxkaXYgY2xhc3M9XCJ0aXRsZS1yb3dcIiBbaWRdPVwidGl0bGVJZFwiPlxuICAgIDxkaXYgKm5nSWY9XCJoZWFkaW5nPy50cmltKClcIiBjbGFzcz1cImhlYWRpbmdcIiBbbmdTdHlsZV09XCJjbGFtcFN0eWxlXCI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJoZWFkaW5nTGV2ZWxcIj5cbiAgICAgICAgPGgxICpuZ1N3aXRjaENhc2U9XCIxXCI+e3sgaGVhZGluZyB9fTwvaDE+XG4gICAgICAgIDxoMiAqbmdTd2l0Y2hDYXNlPVwiMlwiPnt7IGhlYWRpbmcgfX08L2gyPlxuICAgICAgICA8aDMgKm5nU3dpdGNoQ2FzZT1cIjNcIj57eyBoZWFkaW5nIH19PC9oMz5cbiAgICAgICAgPGg0ICpuZ1N3aXRjaENhc2U9XCI0XCI+e3sgaGVhZGluZyB9fTwvaDQ+XG4gICAgICAgIDxoNSAqbmdTd2l0Y2hDYXNlPVwiNVwiPnt7IGhlYWRpbmcgfX08L2g1PlxuICAgICAgICA8aDYgKm5nU3dpdGNoQ2FzZT1cIjZcIj57eyBoZWFkaW5nIH19PC9oNj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJzdWJoZWFkaW5nPy50cmltKClcIiBjbGFzcz1cInN1YmhlYWRpbmdcIj57eyBzdWJoZWFkaW5nIH19PC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FjdGlvbnNdXCI+PC9uZy1jb250ZW50PjwvZGl2PlxuIl19
@@ -0,0 +1,94 @@
1
+ import { ChangeDetectionStrategy, Component, HostBinding, Input, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Makes a `riv-card` activate, applied to a native `<a>` or `<button>` inside
5
+ * the card.
6
+ *
7
+ * Two modes:
8
+ * - `stretch` (default) — the element's hit area expands to cover the whole
9
+ * card, so clicking anywhere activates it. Sibling controls in
10
+ * `riv-card-header`'s `[actions]` slot and in `riv-card-actions` stay above
11
+ * the overlay and remain independently clickable, with no need to stop event
12
+ * propagation.
13
+ * - `region` — the element behaves as an ordinary block wrapper, activating
14
+ * only the part of the card it wraps. Use this when a card has more than one
15
+ * meaningful destination.
16
+ *
17
+ * ```html
18
+ * <riv-card>
19
+ * <riv-card-header [heading]="workbook.name">
20
+ * <a riv-card-link [routerLink]="['/workbooks', workbook.id]">
21
+ * {{ workbook.name }}
22
+ * </a>
23
+ * <riv-menu actions>...</riv-menu>
24
+ * </riv-card-header>
25
+ * </riv-card>
26
+ * ```
27
+ *
28
+ * Prefer this over a click handler on the card: a real `<a>` keeps keyboard
29
+ * focus, "open in new tab", and screen reader link semantics, and a real
30
+ * `<button>` does the same for actions that do not navigate. Because the
31
+ * overlay is a sibling of the card's other controls rather than an ancestor,
32
+ * the card avoids nesting interactive elements.
33
+ *
34
+ * When `stretch` is used, keep the visible link text meaningful on its own —
35
+ * it is the accessible name for the whole card.
36
+ */
37
+ export class CardLinkComponent {
38
+ constructor(el, renderer) {
39
+ this.el = el;
40
+ this.renderer = renderer;
41
+ /** Whether the hit area covers the whole card or only the wrapped region. */
42
+ this.mode = 'stretch';
43
+ }
44
+ get classes() {
45
+ return Object.entries({
46
+ [this.mode]: true,
47
+ disabled: !!this.disabled,
48
+ })
49
+ .filter(([_, v]) => v)
50
+ .map(([k]) => k)
51
+ .join(' ');
52
+ }
53
+ get ariaDisabled() {
54
+ return this.disabled ? 'true' : null;
55
+ }
56
+ get tabIndex() {
57
+ return this.disabled ? '-1' : null;
58
+ }
59
+ ngOnChanges(changes) {
60
+ // Anchors have no `disabled` property, so only real controls are disabled
61
+ // natively; the rest rely on `aria-disabled` and suppressed pointer events.
62
+ if (changes['disabled'] && 'disabled' in this.el.nativeElement) {
63
+ if (this.disabled) {
64
+ this.renderer.setAttribute(this.el.nativeElement, 'disabled', 'true');
65
+ }
66
+ else {
67
+ this.renderer.removeAttribute(this.el.nativeElement, 'disabled');
68
+ }
69
+ }
70
+ }
71
+ }
72
+ CardLinkComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardLinkComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
73
+ CardLinkComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CardLinkComponent, selector: "[riv-card-link]", inputs: { mode: "mode", disabled: "disabled" }, host: { properties: { "class": "this.classes", "attr.aria-disabled": "this.ariaDisabled", "attr.tabindex": "this.tabIndex" } }, usesOnChanges: true, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{padding:0;border:none;background:none;color:inherit;font:inherit;text-align:inherit;text-decoration:none;cursor:pointer}:host.disabled{color:var(--type-light-disabled);cursor:default}:host.region{display:block;min-width:0;transition:background-color var(--short-transition)}:host.region:not(.disabled):hover{background-color:var(--black-20)}:host.stretch:after{content:\"\";position:absolute;inset:0;z-index:var(--card-click-target-z-index);transition:background-color var(--short-transition)}:host.stretch:not(.disabled):hover:after{background-color:var(--black-20)}:host.stretch.disabled:after{pointer-events:none}:host.stretch:focus-visible{outline:none}:host.stretch:focus-visible:after{outline:var(--border-width-large) solid var(--type-light-link);outline-offset:calc(-1 * var(--border-width-large))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardLinkComponent, decorators: [{
75
+ type: Component,
76
+ args: [{ selector: '[riv-card-link]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n", styles: [":host{padding:0;border:none;background:none;color:inherit;font:inherit;text-align:inherit;text-decoration:none;cursor:pointer}:host.disabled{color:var(--type-light-disabled);cursor:default}:host.region{display:block;min-width:0;transition:background-color var(--short-transition)}:host.region:not(.disabled):hover{background-color:var(--black-20)}:host.stretch:after{content:\"\";position:absolute;inset:0;z-index:var(--card-click-target-z-index);transition:background-color var(--short-transition)}:host.stretch:not(.disabled):hover:after{background-color:var(--black-20)}:host.stretch.disabled:after{pointer-events:none}:host.stretch:focus-visible{outline:none}:host.stretch:focus-visible:after{outline:var(--border-width-large) solid var(--type-light-link);outline-offset:calc(-1 * var(--border-width-large))}\n"] }]
77
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { mode: [{
78
+ type: Input
79
+ }], disabled: [{
80
+ type: Input
81
+ }], classes: [{
82
+ type: HostBinding,
83
+ args: ['class']
84
+ }], ariaDisabled: [{
85
+ type: HostBinding,
86
+ args: ['attr.aria-disabled']
87
+ }], tabIndex: [{
88
+ type: HostBinding,
89
+ args: ['attr.tabindex']
90
+ }] } });
91
+ (function (CardLinkComponent) {
92
+ CardLinkComponent.Modes = ['stretch', 'region'];
93
+ })(CardLinkComponent || (CardLinkComponent = {}));
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1saW5rLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL2xheW91dC9jYXJkL2NhcmQtbGluay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9sYXlvdXQvY2FyZC9jYXJkLWxpbmsuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsV0FBVyxFQUNYLEtBQUssR0FJTixNQUFNLGVBQWUsQ0FBQzs7QUFFdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQU9ILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFDbUIsRUFBYyxFQUNkLFFBQW1CO1FBRG5CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBR3RDLDZFQUE2RTtRQUU3RSxTQUFJLEdBQTJCLFNBQVMsQ0FBQztJQUp0QyxDQUFDO0lBU0osSUFDSSxPQUFPO1FBQ1QsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ3BCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUk7WUFDakIsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUTtTQUMxQixDQUFDO2FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRUQsSUFDSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLDBFQUEwRTtRQUMxRSw0RUFBNEU7UUFDNUUsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFO1lBQzlELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3ZFO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ2xFO1NBQ0Y7SUFDSCxDQUFDOzsrR0E1Q1UsaUJBQWlCO21HQUFqQixpQkFBaUIsNFBDbkQ5Qiw2QkFDQTs0RkRrRGEsaUJBQWlCO2tCQU43QixTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNO3lIQVUvQyxJQUFJO3NCQURILEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlGLE9BQU87c0JBRFYsV0FBVzt1QkFBQyxPQUFPO2dCQVloQixZQUFZO3NCQURmLFdBQVc7dUJBQUMsb0JBQW9CO2dCQU03QixRQUFRO3NCQURYLFdBQVc7dUJBQUMsZUFBZTs7QUFrQjlCLFdBQWlCLGlCQUFpQjtJQUNuQix1QkFBSyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBRXRELENBQUMsRUFIZ0IsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUdqQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIE1ha2VzIGEgYHJpdi1jYXJkYCBhY3RpdmF0ZSwgYXBwbGllZCB0byBhIG5hdGl2ZSBgPGE+YCBvciBgPGJ1dHRvbj5gIGluc2lkZVxuICogdGhlIGNhcmQuXG4gKlxuICogVHdvIG1vZGVzOlxuICogLSBgc3RyZXRjaGAgKGRlZmF1bHQpIOKAlCB0aGUgZWxlbWVudCdzIGhpdCBhcmVhIGV4cGFuZHMgdG8gY292ZXIgdGhlIHdob2xlXG4gKiAgIGNhcmQsIHNvIGNsaWNraW5nIGFueXdoZXJlIGFjdGl2YXRlcyBpdC4gU2libGluZyBjb250cm9scyBpblxuICogICBgcml2LWNhcmQtaGVhZGVyYCdzIGBbYWN0aW9uc11gIHNsb3QgYW5kIGluIGByaXYtY2FyZC1hY3Rpb25zYCBzdGF5IGFib3ZlXG4gKiAgIHRoZSBvdmVybGF5IGFuZCByZW1haW4gaW5kZXBlbmRlbnRseSBjbGlja2FibGUsIHdpdGggbm8gbmVlZCB0byBzdG9wIGV2ZW50XG4gKiAgIHByb3BhZ2F0aW9uLlxuICogLSBgcmVnaW9uYCDigJQgdGhlIGVsZW1lbnQgYmVoYXZlcyBhcyBhbiBvcmRpbmFyeSBibG9jayB3cmFwcGVyLCBhY3RpdmF0aW5nXG4gKiAgIG9ubHkgdGhlIHBhcnQgb2YgdGhlIGNhcmQgaXQgd3JhcHMuIFVzZSB0aGlzIHdoZW4gYSBjYXJkIGhhcyBtb3JlIHRoYW4gb25lXG4gKiAgIG1lYW5pbmdmdWwgZGVzdGluYXRpb24uXG4gKlxuICogYGBgaHRtbFxuICogPHJpdi1jYXJkPlxuICogICA8cml2LWNhcmQtaGVhZGVyIFtoZWFkaW5nXT1cIndvcmtib29rLm5hbWVcIj5cbiAqICAgICA8YSByaXYtY2FyZC1saW5rIFtyb3V0ZXJMaW5rXT1cIlsnL3dvcmtib29rcycsIHdvcmtib29rLmlkXVwiPlxuICogICAgICAge3sgd29ya2Jvb2submFtZSB9fVxuICogICAgIDwvYT5cbiAqICAgICA8cml2LW1lbnUgYWN0aW9ucz4uLi48L3Jpdi1tZW51PlxuICogICA8L3Jpdi1jYXJkLWhlYWRlcj5cbiAqIDwvcml2LWNhcmQ+XG4gKiBgYGBcbiAqXG4gKiBQcmVmZXIgdGhpcyBvdmVyIGEgY2xpY2sgaGFuZGxlciBvbiB0aGUgY2FyZDogYSByZWFsIGA8YT5gIGtlZXBzIGtleWJvYXJkXG4gKiBmb2N1cywgXCJvcGVuIGluIG5ldyB0YWJcIiwgYW5kIHNjcmVlbiByZWFkZXIgbGluayBzZW1hbnRpY3MsIGFuZCBhIHJlYWxcbiAqIGA8YnV0dG9uPmAgZG9lcyB0aGUgc2FtZSBmb3IgYWN0aW9ucyB0aGF0IGRvIG5vdCBuYXZpZ2F0ZS4gQmVjYXVzZSB0aGVcbiAqIG92ZXJsYXkgaXMgYSBzaWJsaW5nIG9mIHRoZSBjYXJkJ3Mgb3RoZXIgY29udHJvbHMgcmF0aGVyIHRoYW4gYW4gYW5jZXN0b3IsXG4gKiB0aGUgY2FyZCBhdm9pZHMgbmVzdGluZyBpbnRlcmFjdGl2ZSBlbGVtZW50cy5cbiAqXG4gKiBXaGVuIGBzdHJldGNoYCBpcyB1c2VkLCBrZWVwIHRoZSB2aXNpYmxlIGxpbmsgdGV4dCBtZWFuaW5nZnVsIG9uIGl0cyBvd24g4oCUXG4gKiBpdCBpcyB0aGUgYWNjZXNzaWJsZSBuYW1lIGZvciB0aGUgd2hvbGUgY2FyZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW3Jpdi1jYXJkLWxpbmtdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhcmQtbGluay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhcmQtbGluay5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDYXJkTGlua0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICApIHt9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGhpdCBhcmVhIGNvdmVycyB0aGUgd2hvbGUgY2FyZCBvciBvbmx5IHRoZSB3cmFwcGVkIHJlZ2lvbi4gKi9cbiAgQElucHV0KClcbiAgbW9kZTogQ2FyZExpbmtDb21wb25lbnQuTW9kZSA9ICdzdHJldGNoJztcblxuICBASW5wdXQoKVxuICBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBjbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHtcbiAgICAgIFt0aGlzLm1vZGVdOiB0cnVlLFxuICAgICAgZGlzYWJsZWQ6ICEhdGhpcy5kaXNhYmxlZCxcbiAgICB9KVxuICAgICAgLmZpbHRlcigoW18sIHZdKSA9PiB2KVxuICAgICAgLm1hcCgoW2tdKSA9PiBrKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRpc2FibGVkJylcbiAgZ2V0IGFyaWFEaXNhYmxlZCgpOiAndHJ1ZScgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/ICd0cnVlJyA6IG51bGw7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICBnZXQgdGFiSW5kZXgoKTogJy0xJyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkID8gJy0xJyA6IG51bGw7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgLy8gQW5jaG9ycyBoYXZlIG5vIGBkaXNhYmxlZGAgcHJvcGVydHksIHNvIG9ubHkgcmVhbCBjb250cm9scyBhcmUgZGlzYWJsZWRcbiAgICAvLyBuYXRpdmVseTsgdGhlIHJlc3QgcmVseSBvbiBgYXJpYS1kaXNhYmxlZGAgYW5kIHN1cHByZXNzZWQgcG9pbnRlciBldmVudHMuXG4gICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10gJiYgJ2Rpc2FibGVkJyBpbiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2FyZExpbmtDb21wb25lbnQge1xuICBleHBvcnQgY29uc3QgTW9kZXMgPSBbJ3N0cmV0Y2gnLCAncmVnaW9uJ10gYXMgY29uc3Q7XG4gIGV4cG9ydCB0eXBlIE1vZGUgPSAodHlwZW9mIE1vZGVzKVtudW1iZXJdO1xufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
@@ -0,0 +1,70 @@
1
+ import { ChangeDetectionStrategy, Component, HostBinding, Input, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ /**
5
+ * Image or video region of a `riv-card`, usually its first part.
6
+ *
7
+ * Pass `src` to render an image, or project any other media (`<video>`,
8
+ * `<iframe>`, a chart) as content:
9
+ *
10
+ * ```html
11
+ * <riv-card-media
12
+ * [src]="report.thumbnailUrl"
13
+ * [alt]="'Preview of ' + report.name"
14
+ * [aspectRatio]="'16 / 9'"
15
+ * ></riv-card-media>
16
+ * ```
17
+ *
18
+ * `alt` defaults to an empty string, which marks the image as decorative. Set
19
+ * it whenever the media carries information the surrounding text does not — a
20
+ * card whose only distinguishing feature is its image needs one.
21
+ *
22
+ * Give the region a stable box with `aspectRatio` or `height` so cards in a
23
+ * grid stay aligned while images load.
24
+ */
25
+ export class CardMediaComponent {
26
+ constructor() {
27
+ /** Alternative text. Empty means decorative. */
28
+ this.alt = '';
29
+ /** How the image fills the region. */
30
+ this.fit = 'cover';
31
+ }
32
+ get classes() {
33
+ return `fit-${this.fit}`;
34
+ }
35
+ get aspectRatioStyle() {
36
+ return this.aspectRatio ?? null;
37
+ }
38
+ get heightStyle() {
39
+ return this.height ?? null;
40
+ }
41
+ }
42
+ CardMediaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardMediaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
43
+ CardMediaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CardMediaComponent, selector: "riv-card-media", inputs: { src: "src", alt: "alt", aspectRatio: "aspectRatio", height: "height", fit: "fit" }, host: { properties: { "class": "this.classes", "style.aspect-ratio": "this.aspectRatioStyle", "style.height": "this.heightStyle" } }, ngImport: i0, template: "<img *ngIf=\"src\" class=\"image\" [src]=\"src\" [alt]=\"alt\" />\n<ng-content></ng-content>\n", styles: [":host{display:block;flex-shrink:0;overflow:hidden;min-width:0;background-color:var(--surface-light-1)}.image{display:block;width:100%;height:100%}:host.fit-cover .image{object-fit:cover}:host.fit-contain .image{object-fit:contain}:host.fit-fill .image{object-fit:fill}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardMediaComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ selector: 'riv-card-media', changeDetection: ChangeDetectionStrategy.OnPush, template: "<img *ngIf=\"src\" class=\"image\" [src]=\"src\" [alt]=\"alt\" />\n<ng-content></ng-content>\n", styles: [":host{display:block;flex-shrink:0;overflow:hidden;min-width:0;background-color:var(--surface-light-1)}.image{display:block;width:100%;height:100%}:host.fit-cover .image{object-fit:cover}:host.fit-contain .image{object-fit:contain}:host.fit-fill .image{object-fit:fill}\n"] }]
47
+ }], propDecorators: { src: [{
48
+ type: Input
49
+ }], alt: [{
50
+ type: Input
51
+ }], aspectRatio: [{
52
+ type: Input
53
+ }], height: [{
54
+ type: Input
55
+ }], fit: [{
56
+ type: Input
57
+ }], classes: [{
58
+ type: HostBinding,
59
+ args: ['class']
60
+ }], aspectRatioStyle: [{
61
+ type: HostBinding,
62
+ args: ['style.aspect-ratio']
63
+ }], heightStyle: [{
64
+ type: HostBinding,
65
+ args: ['style.height']
66
+ }] } });
67
+ (function (CardMediaComponent) {
68
+ CardMediaComponent.Fits = ['cover', 'contain', 'fill'];
69
+ })(CardMediaComponent || (CardMediaComponent = {}));
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1tZWRpYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9sYXlvdXQvY2FyZC9jYXJkLW1lZGlhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL2xheW91dC9jYXJkL2NhcmQtbWVkaWEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssR0FDTixNQUFNLGVBQWUsQ0FBQzs7O0FBRXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQU9ILE1BQU0sT0FBTyxrQkFBa0I7SUFOL0I7UUFXRSxnREFBZ0Q7UUFFaEQsUUFBRyxHQUFXLEVBQUUsQ0FBQztRQVVqQixzQ0FBc0M7UUFFdEMsUUFBRyxHQUEyQixPQUFPLENBQUM7S0FnQnZDO0lBZEMsSUFDSSxPQUFPO1FBQ1QsT0FBTyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFDSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFDSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztJQUM3QixDQUFDOztnSEFsQ1Usa0JBQWtCO29HQUFsQixrQkFBa0IsMFJDbEMvQixnR0FFQTs0RkRnQ2Esa0JBQWtCO2tCQU45QixTQUFTOytCQUNFLGdCQUFnQixtQkFHVCx1QkFBdUIsQ0FBQyxNQUFNOzhCQUsvQyxHQUFHO3NCQURGLEtBQUs7Z0JBS04sR0FBRztzQkFERixLQUFLO2dCQUtOLFdBQVc7c0JBRFYsS0FBSztnQkFLTixNQUFNO3NCQURMLEtBQUs7Z0JBS04sR0FBRztzQkFERixLQUFLO2dCQUlGLE9BQU87c0JBRFYsV0FBVzt1QkFBQyxPQUFPO2dCQU1oQixnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsb0JBQW9CO2dCQU03QixXQUFXO3NCQURkLFdBQVc7dUJBQUMsY0FBYzs7QUFNN0IsV0FBaUIsa0JBQWtCO0lBQ3BCLHVCQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBVSxDQUFDO0FBRTVELENBQUMsRUFIZ0Isa0JBQWtCLEtBQWxCLGtCQUFrQixRQUdsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogSW1hZ2Ugb3IgdmlkZW8gcmVnaW9uIG9mIGEgYHJpdi1jYXJkYCwgdXN1YWxseSBpdHMgZmlyc3QgcGFydC5cbiAqXG4gKiBQYXNzIGBzcmNgIHRvIHJlbmRlciBhbiBpbWFnZSwgb3IgcHJvamVjdCBhbnkgb3RoZXIgbWVkaWEgKGA8dmlkZW8+YCxcbiAqIGA8aWZyYW1lPmAsIGEgY2hhcnQpIGFzIGNvbnRlbnQ6XG4gKlxuICogYGBgaHRtbFxuICogPHJpdi1jYXJkLW1lZGlhXG4gKiAgIFtzcmNdPVwicmVwb3J0LnRodW1ibmFpbFVybFwiXG4gKiAgIFthbHRdPVwiJ1ByZXZpZXcgb2YgJyArIHJlcG9ydC5uYW1lXCJcbiAqICAgW2FzcGVjdFJhdGlvXT1cIicxNiAvIDknXCJcbiAqID48L3Jpdi1jYXJkLW1lZGlhPlxuICogYGBgXG4gKlxuICogYGFsdGAgZGVmYXVsdHMgdG8gYW4gZW1wdHkgc3RyaW5nLCB3aGljaCBtYXJrcyB0aGUgaW1hZ2UgYXMgZGVjb3JhdGl2ZS4gU2V0XG4gKiBpdCB3aGVuZXZlciB0aGUgbWVkaWEgY2FycmllcyBpbmZvcm1hdGlvbiB0aGUgc3Vycm91bmRpbmcgdGV4dCBkb2VzIG5vdCDigJQgYVxuICogY2FyZCB3aG9zZSBvbmx5IGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmUgaXMgaXRzIGltYWdlIG5lZWRzIG9uZS5cbiAqXG4gKiBHaXZlIHRoZSByZWdpb24gYSBzdGFibGUgYm94IHdpdGggYGFzcGVjdFJhdGlvYCBvciBgaGVpZ2h0YCBzbyBjYXJkcyBpbiBhXG4gKiBncmlkIHN0YXkgYWxpZ25lZCB3aGlsZSBpbWFnZXMgbG9hZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LWNhcmQtbWVkaWEnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FyZC1tZWRpYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhcmQtbWVkaWEuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2FyZE1lZGlhQ29tcG9uZW50IHtcbiAgLyoqIEltYWdlIFVSTC4gT21pdCB3aGVuIHByb2plY3RpbmcgbWVkaWEgYXMgY29udGVudCBpbnN0ZWFkLiAqL1xuICBASW5wdXQoKVxuICBzcmM/OiBzdHJpbmc7XG5cbiAgLyoqIEFsdGVybmF0aXZlIHRleHQuIEVtcHR5IG1lYW5zIGRlY29yYXRpdmUuICovXG4gIEBJbnB1dCgpXG4gIGFsdDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIEFueSBDU1MgYGFzcGVjdC1yYXRpb2AgdmFsdWUsIGUuZy4gYCcxNiAvIDknYC4gKi9cbiAgQElucHV0KClcbiAgYXNwZWN0UmF0aW8/OiBzdHJpbmc7XG5cbiAgLyoqIEFueSBDU1MgbGVuZ3RoLCBlLmcuIGAnMTQwcHgnYC4gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBhc3BlY3RSYXRpb2AuICovXG4gIEBJbnB1dCgpXG4gIGhlaWdodD86IHN0cmluZztcblxuICAvKiogSG93IHRoZSBpbWFnZSBmaWxscyB0aGUgcmVnaW9uLiAqL1xuICBASW5wdXQoKVxuICBmaXQ6IENhcmRNZWRpYUNvbXBvbmVudC5GaXQgPSAnY292ZXInO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgY2xhc3NlcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZml0LSR7dGhpcy5maXR9YDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuYXNwZWN0LXJhdGlvJylcbiAgZ2V0IGFzcGVjdFJhdGlvU3R5bGUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYXNwZWN0UmF0aW8gPz8gbnVsbDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JylcbiAgZ2V0IGhlaWdodFN0eWxlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmhlaWdodCA/PyBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2FyZE1lZGlhQ29tcG9uZW50IHtcbiAgZXhwb3J0IGNvbnN0IEZpdHMgPSBbJ2NvdmVyJywgJ2NvbnRhaW4nLCAnZmlsbCddIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBGaXQgPSAodHlwZW9mIEZpdHMpW251bWJlcl07XG59XG4iLCI8aW1nICpuZ0lmPVwic3JjXCIgY2xhc3M9XCJpbWFnZVwiIFtzcmNdPVwic3JjXCIgW2FsdF09XCJhbHRcIiAvPlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19