@ng-nest/ui 20.1.4 → 20.1.6
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/checkbox/index.d.ts +1 -1
- package/core/index.d.ts +12 -1
- package/coversations/index.d.ts +29 -7
- package/fesm2022/ng-nest-ui-bubble.mjs +2 -2
- package/fesm2022/ng-nest-ui-bubble.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-core.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-coversations.mjs +26 -3
- package/fesm2022/ng-nest-ui-coversations.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-examples.mjs +2 -2
- package/fesm2022/ng-nest-ui-examples.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-list.mjs +20 -10
- package/fesm2022/ng-nest-ui-list.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-loading.mjs +13 -3
- package/fesm2022/ng-nest-ui-loading.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-message.mjs +20 -20
- package/fesm2022/ng-nest-ui-message.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-progress.mjs +24 -3
- package/fesm2022/ng-nest-ui-progress.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-prompts.mjs +98 -0
- package/fesm2022/ng-nest-ui-prompts.mjs.map +1 -0
- package/fesm2022/ng-nest-ui-sender.mjs +2 -2
- package/fesm2022/ng-nest-ui-sender.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-table.mjs +2 -2
- package/fesm2022/ng-nest-ui-table.mjs.map +1 -1
- package/fesm2022/ng-nest-ui-welcome.mjs +84 -0
- package/fesm2022/ng-nest-ui-welcome.mjs.map +1 -0
- package/fesm2022/ng-nest-ui.mjs +1 -0
- package/fesm2022/ng-nest-ui.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/list/index.d.ts +15 -5
- package/loading/index.d.ts +17 -1
- package/message/index.d.ts +1 -1
- package/package.json +55 -47
- package/progress/index.d.ts +7 -1
- package/prompts/index.d.ts +88 -0
- package/radio/index.d.ts +1 -1
- package/welcome/index.d.ts +65 -0
package/checkbox/index.d.ts
CHANGED
|
@@ -333,7 +333,7 @@ declare class XCheckboxComponent extends XCheckboxProperty implements OnChanges,
|
|
|
333
333
|
labelMapSignal: _angular_core.Signal<{
|
|
334
334
|
[x: string]: boolean;
|
|
335
335
|
}>;
|
|
336
|
-
checkboxType: _angular_core.Signal<"
|
|
336
|
+
checkboxType: _angular_core.Signal<"initial" | "button" | "icon" | "tag">;
|
|
337
337
|
constructor();
|
|
338
338
|
ngOnChanges(changes: SimpleChanges): void;
|
|
339
339
|
ngOnDestroy(): void;
|
package/core/index.d.ts
CHANGED
|
@@ -1253,6 +1253,7 @@ interface XComponentConfig {
|
|
|
1253
1253
|
popover?: XPopoverConfig;
|
|
1254
1254
|
portal?: XPortalConfig;
|
|
1255
1255
|
progress?: XProgressConfing;
|
|
1256
|
+
prompts?: XPromptsConfig;
|
|
1256
1257
|
radio?: XRadioConfig;
|
|
1257
1258
|
rate?: XRateConfig;
|
|
1258
1259
|
result?: XResultConfig;
|
|
@@ -1283,6 +1284,7 @@ interface XComponentConfig {
|
|
|
1283
1284
|
textarea?: XTextareaConfig;
|
|
1284
1285
|
upload?: XUploadConfig;
|
|
1285
1286
|
keyword?: XKeywordConfig;
|
|
1287
|
+
welcome?: XWelcomeConfig;
|
|
1286
1288
|
}
|
|
1287
1289
|
interface XAffixConfig {
|
|
1288
1290
|
top?: string;
|
|
@@ -1414,6 +1416,8 @@ interface XContainerConfig {
|
|
|
1414
1416
|
}
|
|
1415
1417
|
interface XCoversationsConfig {
|
|
1416
1418
|
size?: XSize;
|
|
1419
|
+
loadMoreText?: string;
|
|
1420
|
+
loadingMoreText?: string;
|
|
1417
1421
|
}
|
|
1418
1422
|
interface XHeaderConfig {
|
|
1419
1423
|
height?: string;
|
|
@@ -1567,6 +1571,7 @@ interface XListOptionConfig {
|
|
|
1567
1571
|
size?: XSize;
|
|
1568
1572
|
}
|
|
1569
1573
|
interface XLoadingConfig {
|
|
1574
|
+
type?: any;
|
|
1570
1575
|
size?: XSize | number;
|
|
1571
1576
|
text?: string;
|
|
1572
1577
|
icon?: string;
|
|
@@ -1649,6 +1654,9 @@ interface XProgressConfing {
|
|
|
1649
1654
|
height?: string;
|
|
1650
1655
|
stepWidth?: string;
|
|
1651
1656
|
}
|
|
1657
|
+
interface XPromptsConfig {
|
|
1658
|
+
vertical?: boolean;
|
|
1659
|
+
}
|
|
1652
1660
|
interface XRadioConfig {
|
|
1653
1661
|
size?: XSize;
|
|
1654
1662
|
}
|
|
@@ -1855,6 +1863,9 @@ interface XKeywordConfig {
|
|
|
1855
1863
|
color?: string;
|
|
1856
1864
|
caseSensitive?: boolean;
|
|
1857
1865
|
}
|
|
1866
|
+
interface XWelcomeConfig {
|
|
1867
|
+
variant?: 'outlined' | 'filled' | 'borderless';
|
|
1868
|
+
}
|
|
1858
1869
|
|
|
1859
1870
|
declare class XConfigService {
|
|
1860
1871
|
private componentConfigUpdated$;
|
|
@@ -2002,4 +2013,4 @@ declare class XInnerHTMLComponent {
|
|
|
2002
2013
|
}
|
|
2003
2014
|
|
|
2004
2015
|
export { XAddDays, XAddHours, XAddMilliseconds, XAddMinutes, XAddMonths, XAddSeconds, XAddYears, XBadgeAnimation, XBadgeStandaloneAnimation, XBaseAnimation, XCamelToKebab, XChunk, XClamp, XClearClass, XClearClassSignal, XCloneDeep, XComputed, XComputedStyle, XConfigService, XConnectBaseAnimation, XDataConvert, XDateQuarter, XDateWeek, XDateWeekYear, XDateYearQuarter, XDateYearWeek, XDrop, XDropAnimation, XDuration, XFadeAnimation, XFillDefault, XGetChildren, XGroupBy, XGuid, XHasChildren, XHasIn, XHttpService, XIdentity, XInnerHTMLComponent, XInputBoolean, XInputCssPixelValue, XInputNumber, XInvertKeyValues, XIsArray, XIsBoolean, XIsChange, XIsDate, XIsEmpty, XIsFunction, XIsInputSignal, XIsNil, XIsNotNil, XIsNull, XIsNumber, XIsObject, XIsObjectArray, XIsObservable, XIsRegExp, XIsString, XIsTemplateRef, XIsType, XIsUndefined, XIsValue, XIsValueArray, XIsXTemplate, XKebabToCamel, XMixColors, XMoveAnimation, XMoveBoxAnimation, XOpacityAnimation, XOrderBy, XParentPath, XParents, XPreloadingStrategyService, XProperty, XPropertyFunction, XRemove, XRemoveNgTag, XRepositoryAbstract, XRepositoryService, XRequestAnimationFrame, XResize, XReuseStrategyService, XSetData, XSetFlex, XSleep, XSlideAnimation, XStorageService, XStripTags, XThemeService, XToBoolean, XToCssPixelValue, XToCssPx, XToCssRem, XToDataArray, XToDataConvert, XToDate, XToHex, XToNumber, XToRgb, XToString, XWarnIconTypeNotFound, XWarnSVGTagNotFound, X_CONFIG, X_THEME, X_THEME_AMOUNTS, X_THEME_BACKGROUNDS, X_THEME_BLACK_MERGE, X_THEME_BORDERS, X_THEME_COLORS, X_THEME_COLOR_KEYS, X_THEME_DARK_COLORS, X_THEME_EXCHANGES, X_THEME_LIGHT_COLORS, X_THEME_MERGE, X_THEME_PREFIX, X_THEME_TEXTS, X_THEME_VARS, X_THEME_VARS_KEYS };
|
|
2005
|
-
export type { XAffixConfig, XAlertConfig, XAlign, XAnchorConfig, XAsideConfig, XAutoCompleteConfig, XAvatarConfig, XBackTopConfig, XBadgeConfgig, XBoolean, XBubbleConfig, XBubblesConfig, XButtonConfig, XButtonsConfig, XCalendarConfig, XCardConfig, XCarouselConfig, XCascadeConfig, XCheckboxConfig, XClassMap, XColConfig, XCollapseConfig, XColorConfig, XColorPickerConfig, XColors, XColorsTheme, XCommentConfig, XComponentConfig, XComponentConfigKey, XConfig, XConfigKey, XContainerConfig, XController, XCorner, XCountdownConfig, XCoversationsConfig, XCrumbComfig, XData, XDataArray, XDate, XDatePickerConfig, XDateRangeConfig, XDescriptionConfig, XDialogConfig, XDirection, XDisplayDirection, XDrawerConfig, XDropdownConfig, XEffect, XEmptyConfig, XFilter, XFindConfig, XFit, XFloatLabel, XFooterConfig, XFormConfig, XGroupItem, XHeaderConfig, XHighlightConfig, XIconConfig, XId, XIdentityProperty, XImageConfig, XInnerConfig, XInputConfig, XInputGroupConfig, XInputNumberConfig, XJustify, XKeywordConfig, XLinkConfig, XListConfig, XListOptionConfig, XLoadingConfig, XMenuConfig, XMessageBoxConfig, XMessageConfig, XNotificationConfig, XNumber, XOperation, XOutletConfig, XPageHeaderConfig, XPaginationConfig, XParentIdentityProperty, XPatternConfig, XPlace, XPlacement, XPopconfirmConfig, XPopoverConfig, XPortalConfig, XPosition, XPositionLeftRight, XPositionTopBottom, XProgressConfing, XPropDecorator, XQuery, XRGBColor, XRadioConfig, XRateConfig, XRepositoryInput, XResizeObserver, XResizeObserverEntry, XResponseSize, XResultConfig, XResultList, XRippleConfig, XRouteReuseStorage, XRowConfig, XSelectConfig, XSenderConfig, XShadow, XShape, XSize, XSkeletonConfig, XSliderConfig, XSliderSelectConfig, XSort, XStatisticConfig, XStatus, XStepsConfig, XStyle, XStyleMap, XSwitchConfig, XTableConfig, XTableViewConfig, XTabsConfig, XTagConfig, XTemplate, XTextAlign, XTextRetractConfig, XTextareaConfig, XTheme, XThemeConfig, XThemeKey, XTimeAgoConfig, XTimePickerConfig, XTimeRangeConfig, XTimelineConfig, XTooltipConfig, XTransferConfig, XTreeConfig, XTreeFileConfig, XTreeSelectConfig, XTrigger, XType, XTypeFunc, XUploadConfig, XVariant, XVarsTheme };
|
|
2016
|
+
export type { XAffixConfig, XAlertConfig, XAlign, XAnchorConfig, XAsideConfig, XAutoCompleteConfig, XAvatarConfig, XBackTopConfig, XBadgeConfgig, XBoolean, XBubbleConfig, XBubblesConfig, XButtonConfig, XButtonsConfig, XCalendarConfig, XCardConfig, XCarouselConfig, XCascadeConfig, XCheckboxConfig, XClassMap, XColConfig, XCollapseConfig, XColorConfig, XColorPickerConfig, XColors, XColorsTheme, XCommentConfig, XComponentConfig, XComponentConfigKey, XConfig, XConfigKey, XContainerConfig, XController, XCorner, XCountdownConfig, XCoversationsConfig, XCrumbComfig, XData, XDataArray, XDate, XDatePickerConfig, XDateRangeConfig, XDescriptionConfig, XDialogConfig, XDirection, XDisplayDirection, XDrawerConfig, XDropdownConfig, XEffect, XEmptyConfig, XFilter, XFindConfig, XFit, XFloatLabel, XFooterConfig, XFormConfig, XGroupItem, XHeaderConfig, XHighlightConfig, XIconConfig, XId, XIdentityProperty, XImageConfig, XInnerConfig, XInputConfig, XInputGroupConfig, XInputNumberConfig, XJustify, XKeywordConfig, XLinkConfig, XListConfig, XListOptionConfig, XLoadingConfig, XMenuConfig, XMessageBoxConfig, XMessageConfig, XNotificationConfig, XNumber, XOperation, XOutletConfig, XPageHeaderConfig, XPaginationConfig, XParentIdentityProperty, XPatternConfig, XPlace, XPlacement, XPopconfirmConfig, XPopoverConfig, XPortalConfig, XPosition, XPositionLeftRight, XPositionTopBottom, XProgressConfing, XPromptsConfig, XPropDecorator, XQuery, XRGBColor, XRadioConfig, XRateConfig, XRepositoryInput, XResizeObserver, XResizeObserverEntry, XResponseSize, XResultConfig, XResultList, XRippleConfig, XRouteReuseStorage, XRowConfig, XSelectConfig, XSenderConfig, XShadow, XShape, XSize, XSkeletonConfig, XSliderConfig, XSliderSelectConfig, XSort, XStatisticConfig, XStatus, XStepsConfig, XStyle, XStyleMap, XSwitchConfig, XTableConfig, XTableViewConfig, XTabsConfig, XTagConfig, XTemplate, XTextAlign, XTextRetractConfig, XTextareaConfig, XTheme, XThemeConfig, XThemeKey, XTimeAgoConfig, XTimePickerConfig, XTimeRangeConfig, XTimelineConfig, XTooltipConfig, XTransferConfig, XTreeConfig, XTreeFileConfig, XTreeSelectConfig, XTrigger, XType, XTypeFunc, XUploadConfig, XVariant, XVarsTheme, XWelcomeConfig };
|
package/coversations/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import * as rxjs from 'rxjs';
|
|
|
2
2
|
import * as _angular_core from '@angular/core';
|
|
3
3
|
import { TemplateRef } from '@angular/core';
|
|
4
4
|
import * as _ng_nest_ui_core from '@ng-nest/ui/core';
|
|
5
|
-
import { XSize, XData, XStyle } from '@ng-nest/ui/core';
|
|
5
|
+
import { XBoolean, XSize, XData, XStyle } from '@ng-nest/ui/core';
|
|
6
6
|
import { XListNode } from '@ng-nest/ui/list';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -39,7 +39,7 @@ declare const XCoversationsProperty_base: new () => {
|
|
|
39
39
|
registerOnTouched(fn: () => void): void;
|
|
40
40
|
setDisabledState(disabled: boolean): void;
|
|
41
41
|
formControlValidator(): void;
|
|
42
|
-
readonly validator: _angular_core.InputSignalWithTransform<boolean,
|
|
42
|
+
readonly validator: _angular_core.InputSignalWithTransform<boolean, XBoolean>;
|
|
43
43
|
readonly label: _angular_core.InputSignal<_ng_nest_ui_core.XTemplate>;
|
|
44
44
|
readonly labelWidth: _angular_core.InputSignalWithTransform<string, _ng_nest_ui_core.XNumber>;
|
|
45
45
|
readonly labelAlign: _angular_core.InputSignal<_ng_nest_ui_core.XAlign>;
|
|
@@ -48,9 +48,9 @@ declare const XCoversationsProperty_base: new () => {
|
|
|
48
48
|
readonly direction: _angular_core.InputSignal<_ng_nest_ui_core.XDirection>;
|
|
49
49
|
readonly size: _angular_core.InputSignal<XSize>;
|
|
50
50
|
readonly placeholder: _angular_core.InputSignal<string | string[]>;
|
|
51
|
-
readonly disabled: _angular_core.InputSignalWithTransform<boolean,
|
|
52
|
-
readonly required: _angular_core.InputSignalWithTransform<boolean,
|
|
53
|
-
readonly readonly: _angular_core.InputSignalWithTransform<boolean,
|
|
51
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, XBoolean>;
|
|
52
|
+
readonly required: _angular_core.InputSignalWithTransform<boolean, XBoolean>;
|
|
53
|
+
readonly readonly: _angular_core.InputSignalWithTransform<boolean, XBoolean>;
|
|
54
54
|
readonly valueTpl: _angular_core.InputSignal<TemplateRef<any> | undefined>;
|
|
55
55
|
readonly valueTplContext: _angular_core.InputSignal<unknown>;
|
|
56
56
|
readonly before: _angular_core.InputSignal<_ng_nest_ui_core.XTemplate | undefined>;
|
|
@@ -58,7 +58,7 @@ declare const XCoversationsProperty_base: new () => {
|
|
|
58
58
|
readonly pattern: _angular_core.InputSignal<RegExp | RegExp[]>;
|
|
59
59
|
readonly message: _angular_core.InputSignal<string | string[]>;
|
|
60
60
|
readonly active: _angular_core.ModelSignal<boolean>;
|
|
61
|
-
readonly pointer: _angular_core.InputSignalWithTransform<boolean,
|
|
61
|
+
readonly pointer: _angular_core.InputSignalWithTransform<boolean, XBoolean>;
|
|
62
62
|
readonly inputValidator: _angular_core.InputSignal<((value: any) => boolean) | undefined>;
|
|
63
63
|
};
|
|
64
64
|
/**
|
|
@@ -80,6 +80,11 @@ declare class XCoversationsProperty extends XCoversationsProperty_base {
|
|
|
80
80
|
* @en_US Node style
|
|
81
81
|
*/
|
|
82
82
|
readonly nodeStyle: _angular_core.InputSignal<XStyle | undefined>;
|
|
83
|
+
/**
|
|
84
|
+
* @zh_CN 分组模板
|
|
85
|
+
* @en_US Group style
|
|
86
|
+
*/
|
|
87
|
+
readonly groupTpl: _angular_core.InputSignal<TemplateRef<any> | undefined>;
|
|
83
88
|
/**
|
|
84
89
|
* @zh_CN 尺寸
|
|
85
90
|
* @en_US Size
|
|
@@ -90,8 +95,25 @@ declare class XCoversationsProperty extends XCoversationsProperty_base {
|
|
|
90
95
|
* @en_US Node click event
|
|
91
96
|
*/
|
|
92
97
|
readonly nodeClick: _angular_core.OutputEmitterRef<XCoversationNode>;
|
|
98
|
+
/**
|
|
99
|
+
* @zh_CN 加载更多
|
|
100
|
+
* @en_US load more
|
|
101
|
+
*/
|
|
102
|
+
readonly loadMore: _angular_core.InputSignalWithTransform<boolean, XBoolean>;
|
|
103
|
+
/**
|
|
104
|
+
* @zh_CN 加载更多的文字
|
|
105
|
+
* @en_US Load more text
|
|
106
|
+
* @default '加载更多'
|
|
107
|
+
*/
|
|
108
|
+
readonly loadMoreText: _angular_core.InputSignal<string>;
|
|
109
|
+
/**
|
|
110
|
+
* @zh_CN 正在加载中的文字
|
|
111
|
+
* @en_US Loading
|
|
112
|
+
* @default '正在加载中'
|
|
113
|
+
*/
|
|
114
|
+
readonly loadingMoreText: _angular_core.InputSignal<string>;
|
|
93
115
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<XCoversationsProperty, never>;
|
|
94
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<XCoversationsProperty, "x-coversations-property", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "nodeTpl": { "alias": "nodeTpl"; "required": false; "isSignal": true; }; "nodeStyle": { "alias": "nodeStyle"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "nodeClick": "nodeClick"; }, never, never, true, never>;
|
|
116
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<XCoversationsProperty, "x-coversations-property", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "nodeTpl": { "alias": "nodeTpl"; "required": false; "isSignal": true; }; "nodeStyle": { "alias": "nodeStyle"; "required": false; "isSignal": true; }; "groupTpl": { "alias": "groupTpl"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "loadMore": { "alias": "loadMore"; "required": false; "isSignal": true; }; "loadMoreText": { "alias": "loadMoreText"; "required": false; "isSignal": true; }; "loadingMoreText": { "alias": "loadingMoreText"; "required": false; "isSignal": true; }; }, { "nodeClick": "nodeClick"; }, never, never, true, never>;
|
|
95
117
|
}
|
|
96
118
|
/**
|
|
97
119
|
* @zh_CN List 数据对象
|
|
@@ -364,11 +364,11 @@ class XBubbleComponent extends XBubbleProperty {
|
|
|
364
364
|
this.stopTyping();
|
|
365
365
|
}
|
|
366
366
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: XBubbleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
367
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.0", type: XBubbleComponent, isStandalone: true, selector: "x-bubble", viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["contentRef"], descendants: true, isSignal: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? size()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div class=\"x-bubble-
|
|
367
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.0", type: XBubbleComponent, isStandalone: true, selector: "x-bubble", viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["contentRef"], descendants: true, isSignal: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? size()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div class=\"x-bubble-wrapper\">\r\n @if (loading()) {\r\n <div class=\"x-bubble-content\" [x-loading]=\"true\" [size]=\"'small'\" inline></div>\r\n } @else {\r\n @if (header()) {\r\n <div class=\"x-bubble-header\">\r\n <ng-container *xOutlet=\"header()\">{{ header() }}</ng-container>\r\n </div>\r\n }\r\n @if (isString()) {\r\n <div class=\"x-bubble-content\" #contentRef [innerHTML]=\"renderedContent\"></div>\r\n } @else if (isTemplate()) {\r\n <div class=\"x-bubble-content\" #contentRef>\r\n <ng-container *xOutlet=\"content()\"></ng-container>\r\n </div>\r\n }\r\n @if (footer()) {\r\n <div class=\"x-bubble-footer\">\r\n <ng-container *xOutlet=\"footer()\">{{ footer() }}</ng-container>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n", styles: [".x-bubble{margin:0;padding:0}.x-bubble{display:flex}.x-bubble-wrapper{flex:auto;display:flex;flex-direction:column;align-items:flex-start;min-width:0;max-width:100%}.x-bubble-content{position:relative;box-sizing:border-box;min-width:0;max-width:100%;color:var(--x-text);font-size:var(--x-font-size);border-radius:var(--x-border-radius);word-break:break-word}.x-bubble-outlined .x-bubble-content{border:var(--x-border-width) var(--x-border-style) var(--x-border)}.x-bubble-filled .x-bubble-content{background-color:var(--x-background-a200)}.x-bubble-shadow .x-bubble-content{box-shadow:var(--x-box-shadow)}.x-bubble-end{flex-direction:row-reverse}.x-bubble-end .x-bubble-wrapper{align-items:flex-end}.x-bubble-header{margin-bottom:.25rem}.x-bubble-footer{margin-top:.5rem}.x-bubble-cursor.x-bubble-typing .x-bubble-content:after{content:\"\";display:inline-block;width:.0625rem;height:1.1em;margin-left:.0625rem;background-color:currentColor;vertical-align:middle;animation:x-bubble-blink 1s infinite}.x-bubble-cursor:not(.x-bubble-typing) .x-bubble-content:after{display:none}.x-bubble-avatar-hidden{visibility:hidden}@keyframes x-bubble-blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}.x-bubble.x-big{column-gap:var(--x-padding-big)}.x-bubble.x-big .x-bubble-content{padding:calc(var(--x-padding-big) - .25rem) var(--x-padding-big);line-height:calc(var(--x-height-big) - 1rem);min-height:calc(var(--x-padding-big) * 2 + var(--x-height-big) - 1.5rem)}.x-bubble.x-large{column-gap:var(--x-padding-large)}.x-bubble.x-large .x-bubble-content{padding:calc(var(--x-padding-large) - .25rem) var(--x-padding-large);line-height:calc(var(--x-height-large) - 1rem);min-height:calc(var(--x-padding-large) * 2 + var(--x-height-large) - 1.5rem)}.x-bubble.x-medium{column-gap:var(--x-padding-medium)}.x-bubble.x-medium .x-bubble-content{padding:calc(var(--x-padding-medium) - .25rem) var(--x-padding-medium);line-height:calc(var(--x-height-medium) - 1rem);min-height:calc(var(--x-padding-medium) * 2 + var(--x-height-medium) - 1.5rem)}.x-bubble.x-small{column-gap:var(--x-padding-small)}.x-bubble.x-small .x-bubble-content{padding:calc(var(--x-padding-small) - .25rem) var(--x-padding-small);line-height:calc(var(--x-height-small) - 1rem);min-height:calc(var(--x-padding-small) * 2 + var(--x-height-small) - 1.5rem)}.x-bubble.x-mini{column-gap:var(--x-padding-mini)}.x-bubble.x-mini .x-bubble-content{padding:calc(var(--x-padding-mini) - .25rem) var(--x-padding-mini);line-height:calc(var(--x-height-mini) - 1rem);min-height:calc(var(--x-padding-mini) * 2 + var(--x-height-mini) - 1.5rem)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: XOutletDirective, selector: "[xOutlet]", inputs: ["xOutletContext", "xOutlet"] }, { kind: "component", type: XAvatarComponent, selector: "x-avatar" }, { kind: "component", type: XLoadingComponent, selector: "x-loading, [x-loading]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
368
368
|
}
|
|
369
369
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: XBubbleComponent, decorators: [{
|
|
370
370
|
type: Component,
|
|
371
|
-
args: [{ selector: 'x-bubble', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgClass, XOutletDirective, XAvatarComponent, XLoadingComponent], template: "<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? size()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div class=\"x-bubble-
|
|
371
|
+
args: [{ selector: 'x-bubble', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgClass, XOutletDirective, XAvatarComponent, XLoadingComponent], template: "<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? size()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div class=\"x-bubble-wrapper\">\r\n @if (loading()) {\r\n <div class=\"x-bubble-content\" [x-loading]=\"true\" [size]=\"'small'\" inline></div>\r\n } @else {\r\n @if (header()) {\r\n <div class=\"x-bubble-header\">\r\n <ng-container *xOutlet=\"header()\">{{ header() }}</ng-container>\r\n </div>\r\n }\r\n @if (isString()) {\r\n <div class=\"x-bubble-content\" #contentRef [innerHTML]=\"renderedContent\"></div>\r\n } @else if (isTemplate()) {\r\n <div class=\"x-bubble-content\" #contentRef>\r\n <ng-container *xOutlet=\"content()\"></ng-container>\r\n </div>\r\n }\r\n @if (footer()) {\r\n <div class=\"x-bubble-footer\">\r\n <ng-container *xOutlet=\"footer()\">{{ footer() }}</ng-container>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n", styles: [".x-bubble{margin:0;padding:0}.x-bubble{display:flex}.x-bubble-wrapper{flex:auto;display:flex;flex-direction:column;align-items:flex-start;min-width:0;max-width:100%}.x-bubble-content{position:relative;box-sizing:border-box;min-width:0;max-width:100%;color:var(--x-text);font-size:var(--x-font-size);border-radius:var(--x-border-radius);word-break:break-word}.x-bubble-outlined .x-bubble-content{border:var(--x-border-width) var(--x-border-style) var(--x-border)}.x-bubble-filled .x-bubble-content{background-color:var(--x-background-a200)}.x-bubble-shadow .x-bubble-content{box-shadow:var(--x-box-shadow)}.x-bubble-end{flex-direction:row-reverse}.x-bubble-end .x-bubble-wrapper{align-items:flex-end}.x-bubble-header{margin-bottom:.25rem}.x-bubble-footer{margin-top:.5rem}.x-bubble-cursor.x-bubble-typing .x-bubble-content:after{content:\"\";display:inline-block;width:.0625rem;height:1.1em;margin-left:.0625rem;background-color:currentColor;vertical-align:middle;animation:x-bubble-blink 1s infinite}.x-bubble-cursor:not(.x-bubble-typing) .x-bubble-content:after{display:none}.x-bubble-avatar-hidden{visibility:hidden}@keyframes x-bubble-blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}.x-bubble.x-big{column-gap:var(--x-padding-big)}.x-bubble.x-big .x-bubble-content{padding:calc(var(--x-padding-big) - .25rem) var(--x-padding-big);line-height:calc(var(--x-height-big) - 1rem);min-height:calc(var(--x-padding-big) * 2 + var(--x-height-big) - 1.5rem)}.x-bubble.x-large{column-gap:var(--x-padding-large)}.x-bubble.x-large .x-bubble-content{padding:calc(var(--x-padding-large) - .25rem) var(--x-padding-large);line-height:calc(var(--x-height-large) - 1rem);min-height:calc(var(--x-padding-large) * 2 + var(--x-height-large) - 1.5rem)}.x-bubble.x-medium{column-gap:var(--x-padding-medium)}.x-bubble.x-medium .x-bubble-content{padding:calc(var(--x-padding-medium) - .25rem) var(--x-padding-medium);line-height:calc(var(--x-height-medium) - 1rem);min-height:calc(var(--x-padding-medium) * 2 + var(--x-height-medium) - 1.5rem)}.x-bubble.x-small{column-gap:var(--x-padding-small)}.x-bubble.x-small .x-bubble-content{padding:calc(var(--x-padding-small) - .25rem) var(--x-padding-small);line-height:calc(var(--x-height-small) - 1rem);min-height:calc(var(--x-padding-small) * 2 + var(--x-height-small) - 1.5rem)}.x-bubble.x-mini{column-gap:var(--x-padding-mini)}.x-bubble.x-mini .x-bubble-content{padding:calc(var(--x-padding-mini) - .25rem) var(--x-padding-mini);line-height:calc(var(--x-height-mini) - 1rem);min-height:calc(var(--x-padding-mini) * 2 + var(--x-height-mini) - 1.5rem)}\n"] }]
|
|
372
372
|
}], ctorParameters: () => [] });
|
|
373
373
|
|
|
374
374
|
class XBubbleModule {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-nest-ui-bubble.mjs","sources":["../../../../lib/ng-nest/ui/bubble/bubble.property.ts","../../../../lib/ng-nest/ui/bubble/bubbles.component.ts","../../../../lib/ng-nest/ui/bubble/bubbles.component.html","../../../../lib/ng-nest/ui/bubble/bubble.component.ts","../../../../lib/ng-nest/ui/bubble/bubble.component.html","../../../../lib/ng-nest/ui/bubble/bubble.module.ts","../../../../lib/ng-nest/ui/bubble/ng-nest-ui-bubble.ts"],"sourcesContent":["import { Component, input, output } from '@angular/core';\r\nimport { XBoolean, XNumber, XPropertyFunction, XSize, XTemplate, XToBoolean, XToNumber } from '@ng-nest/ui/core';\r\nimport { XAvatarOption } from '@ng-nest/ui/avatar';\r\n\r\n/**\r\n * Bubble\r\n * @selector x-bubble\r\n * @decorator component\r\n */\r\nexport const XBubblePrefix = 'x-bubble';\r\nconst X_BUBBLE_CONFIG_NAME = 'bubble';\r\n\r\n/**\r\n * Bubble Property\r\n */\r\n@Component({ selector: `${XBubblePrefix}-property`, template: '' })\r\nexport class XBubbleProperty extends XPropertyFunction(X_BUBBLE_CONFIG_NAME) {\r\n /**\r\n * @zh_CN 气泡内容\r\n * @en_US Bubble content\r\n */\r\n readonly content = input<XTemplate>();\r\n /**\r\n * @zh_CN 头像\r\n * @en_US Avatar\r\n */\r\n readonly avatar = input<XBubbleAvatarOption>();\r\n /**\r\n * @zh_CN 尺寸\r\n * @en_US Size\r\n */\r\n readonly size = input<XSize>(this.config?.size ?? 'medium');\r\n /**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\n readonly variant = input<XBubbleVariant>(this.config?.variant ?? 'outlined');\r\n /**\r\n * @zh_CN 位置\r\n * @en_US Bubble placement\r\n */\r\n readonly placement = input<XBubblePlacement>('start');\r\n /**\r\n * @zh_CN 气泡头部内容\r\n * @en_US Bubble header content\r\n */\r\n readonly header = input<XTemplate>();\r\n /**\r\n * @zh_CN 气泡底部内容\r\n * @en_US Bubble header content\r\n */\r\n readonly footer = input<XTemplate>();\r\n /**\r\n * @zh_CN 加载中\r\n * @en_US Loading\r\n */\r\n readonly loading = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 内容输出打字机效果\r\n * @en_US Typing effect\r\n */\r\n readonly typing = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 打字机输出速度\r\n * @en_US Typing speed\r\n */\r\n readonly speed = input<number, XNumber>(30, { transform: XToNumber });\r\n /**\r\n * @zh_CN 内容渲染器,可自定义内容的渲染方式,如 HTML、Markdown\r\n * @en_US Content renderer, can customize content rendering, such as HTML, Markdown\r\n */\r\n readonly renderer = input<XBubbleContentRenderer>();\r\n /**\r\n * @zh_CN 是否显示打字机光标\r\n * @en_US Whether to show the typing cursor\r\n */\r\n readonly showCursor = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 打字开始\r\n * @en_US Typing start\r\n */\r\n readonly typingStart = output<void>();\r\n /**\r\n * @zh_CN 打字正在输出的字符\r\n * @en_US Typing output character\r\n */\r\n readonly typingOuput = output<string>();\r\n /**\r\n * @zh_CN 打字结束\r\n * @en_US Typing end\r\n */\r\n readonly typingEnd = output<void>();\r\n}\r\n\r\n/**\r\n * @zh_CN 头像配置,继承了组件 Avatar 相关属性\r\n * @en_US Avatar settings\r\n */\r\nexport interface XBubbleAvatarOption extends XAvatarOption {\r\n /**\r\n * @zh_CN 是否显示头像\r\n * @en_US Whether to show the avatar\r\n */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Bubbles\r\n * @selector x-bubbles\r\n * @decorator component\r\n */\r\nexport const XBubblesPrefix = 'x-bubbles';\r\nconst X_BUBBLES_CONFIG_NAME = 'bubbles';\r\n\r\n/**\r\n * Bubbles Property\r\n */\r\n@Component({ selector: `${XBubblesPrefix}-property`, template: '' })\r\nexport class XBubblesProperty extends XPropertyFunction(X_BUBBLES_CONFIG_NAME) {\r\n /**\r\n * @zh_CN 尺寸\r\n * @en_US Size\r\n */\r\n readonly size = input<XSize>();\r\n /**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\n readonly variant = input<XBubbleVariant>();\r\n /**\r\n * @zh_CN 滚动条滚动事件,自动获取父级可滚动的元素\r\n * @en_US Scroll event of the scroll bar, automatically obtaining the scrollable element of the parent\r\n */\r\n readonly scrollChange = output<Event>();\r\n}\r\n\r\n/**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\nexport type XBubbleVariant = 'outlined' | 'filled' | 'shadow' | 'borderless';\r\n\r\n/**\r\n * @zh_CN 位置\r\n * @en_US Bubble placement\r\n */\r\nexport type XBubblePlacement = 'start' | 'end';\r\n\r\n/**\r\n * @zh_CN 内容渲染函数\r\n * @en_US Bubble content renderer\r\n */\r\nexport type XBubbleContentRenderer = (content: string) => string | undefined;\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n contentChildren,\r\n ElementRef,\r\n inject,\r\n Renderer2,\r\n ViewEncapsulation\r\n} from '@angular/core';\r\nimport { XBubblesProperty } from './bubble.property';\r\nimport { XBubbleComponent } from './bubble.component';\r\nimport { fromEvent, Subject, Subscription, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'x-bubbles',\r\n templateUrl: './bubbles.component.html',\r\n styleUrls: ['./bubbles.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: []\r\n})\r\nexport class XBubblesComponent extends XBubblesProperty {\r\n elementRef = inject(ElementRef);\r\n renderer = inject(Renderer2);\r\n\r\n private parentScrollElement: HTMLElement | null = null;\r\n private isFollowing = true;\r\n private removeScrollListener: Subscription | null = null;\r\n private contentMutationObserver: MutationObserver | null = null;\r\n private typingObserver: MutationObserver | null = null;\r\n private $destroy = new Subject<void>();\r\n\r\n bubbles = contentChildren(XBubbleComponent);\r\n\r\n ngAfterViewInit(): void {\r\n this.stepScroll();\r\n this.observeContentChanges();\r\n }\r\n\r\n ngDoCheck(): void {\r\n const bubbles = this.bubbles();\r\n if (bubbles.length <= 0) return;\r\n const lastBubble = bubbles[bubbles.length - 1];\r\n if (lastBubble && lastBubble.typing() && lastBubble.pendingContent().length > 0) {\r\n if (!this.typingObserver) {\r\n this.startTypingObserver(lastBubble);\r\n }\r\n } else {\r\n if (this.typingObserver) {\r\n this.stopTypingObserver();\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removeScrollListener?.unsubscribe();\r\n this.contentMutationObserver?.disconnect();\r\n this.stopTypingObserver();\r\n this.$destroy.next();\r\n this.$destroy.complete();\r\n }\r\n\r\n private stepScroll() {\r\n const newScroll = this.getParentScrollElement(this.elementRef.nativeElement);\r\n if (this.parentScrollElement && newScroll === this.parentScrollElement) return;\r\n this.parentScrollElement = newScroll;\r\n if (this.parentScrollElement) {\r\n this.removeScrollListener?.unsubscribe();\r\n this.removeScrollListener = fromEvent(this.parentScrollElement, 'scroll')\r\n .pipe(takeUntil(this.$destroy))\r\n .subscribe((event: Event) => {\r\n const atBottom =\r\n this.parentScrollElement!.scrollHeight - this.parentScrollElement!.scrollTop ===\r\n this.parentScrollElement!.clientHeight;\r\n if (!atBottom) {\r\n this.isFollowing = false;\r\n } else {\r\n this.isFollowing = true;\r\n }\r\n this.scrollChange.emit(event);\r\n });\r\n }\r\n }\r\n\r\n private getParentScrollElement(element: HTMLElement): HTMLElement | null {\r\n let parent = this.renderer.parentNode(element) as HTMLElement;\r\n while (parent && parent.nodeType === 1) {\r\n const overflowY = getComputedStyle(parent).overflowY;\r\n if (overflowY === 'auto' || overflowY === 'scroll') {\r\n return parent;\r\n }\r\n parent = this.renderer.parentNode(parent);\r\n }\r\n return null;\r\n }\r\n private observeContentChanges(): void {\r\n this.contentMutationObserver = new MutationObserver(() => {\r\n this.isFollowing = true;\r\n this.scrollToBottom();\r\n });\r\n\r\n this.contentMutationObserver.observe(this.elementRef.nativeElement, { childList: true });\r\n }\r\n\r\n private startTypingObserver(bubble: XBubbleComponent): void {\r\n const bubbleContent = bubble.contentRef()?.nativeElement;\r\n if (bubbleContent) {\r\n this.typingObserver = new MutationObserver(() => {\r\n if (this.isFollowing) {\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.typingObserver.observe(bubbleContent, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true\r\n });\r\n }\r\n }\r\n\r\n private stopTypingObserver(): void {\r\n if (this.typingObserver) {\r\n this.typingObserver.disconnect();\r\n this.typingObserver = null;\r\n }\r\n }\r\n\r\n scrollToBottom(): void {\r\n this.stepScroll();\r\n if (this.parentScrollElement) {\r\n this.parentScrollElement.scrollTop = this.parentScrollElement.scrollHeight;\r\n }\r\n }\r\n\r\n scrollToTop(): void {\r\n this.stepScroll();\r\n if (this.parentScrollElement) {\r\n this.parentScrollElement.scrollTop = 0;\r\n }\r\n }\r\n}\r\n","<ng-content></ng-content>\r\n","import {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n computed,\r\n viewChild,\r\n ElementRef,\r\n signal,\r\n effect,\r\n SimpleChanges,\r\n inject,\r\n Renderer2\r\n} from '@angular/core';\r\nimport { XBubblePrefix, XBubbleProperty } from './bubble.property';\r\nimport { XOutletDirective } from '@ng-nest/ui/outlet';\r\nimport { XIsEmpty, XIsString, XIsTemplateRef } from '@ng-nest/ui/core';\r\nimport { NgClass } from '@angular/common';\r\nimport { XAvatarComponent } from '@ng-nest/ui/avatar';\r\nimport { XLoadingComponent } from '@ng-nest/ui/loading';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { XBubblesComponent } from './bubbles.component';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\n\r\n@Component({\r\n selector: 'x-bubble',\r\n templateUrl: './bubble.component.html',\r\n styleUrls: ['./bubble.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgClass, XOutletDirective, XAvatarComponent, XLoadingComponent]\r\n})\r\nexport class XBubbleComponent extends XBubbleProperty {\r\n sanitizer = inject(DomSanitizer);\r\n renderer2 = inject(Renderer2);\r\n private bubbles = inject(XBubblesComponent, { optional: true, host: true });\r\n\r\n contentRef = viewChild<ElementRef<HTMLElement>>('contentRef');\r\n\r\n classMap = computed(() => ({\r\n [`${XBubblePrefix}-${this.variantSignal()}`]: !XIsEmpty(this.variantSignal()),\r\n [`${XBubblePrefix}-${this.placement()}`]: !XIsEmpty(this.placement()),\r\n [`${XBubblePrefix}-cursor`]: this.showCursor() && this.typing(),\r\n [`${XBubblePrefix}-typing`]: this.typing() && this.pendingContent().length > 0,\r\n [`x-${this.sizeSignal()}`]: !XIsEmpty(this.sizeSignal())\r\n }));\r\n\r\n typedContent = signal('');\r\n pendingContent = signal('');\r\n pendingContentObserver = toObservable(this.pendingContent);\r\n private typingInterval: any = null;\r\n\r\n sizeSignal = computed(() => {\r\n return this.bubbles?.size() || this.size();\r\n });\r\n\r\n variantSignal = computed(() => {\r\n return this.bubbles?.variant() || this.variant();\r\n });\r\n\r\n isTemplate = computed(() => {\r\n return XIsTemplateRef(this.content());\r\n });\r\n\r\n isString = computed(() => {\r\n return XIsString(this.content());\r\n });\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.isString() && !this.typing()) {\r\n this.stopTyping();\r\n this.typedContent.set(this.typedContent() + this.pendingContent());\r\n this.pendingContent.set('');\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const { content } = changes;\r\n if (content && this.isString()) {\r\n const newFullContent = changes['content'].currentValue || '';\r\n const currentTypedContent = this.typedContent();\r\n\r\n if (!this.typing()) {\r\n this.typedContent.set(newFullContent);\r\n return;\r\n }\r\n\r\n if (newFullContent.startsWith(currentTypedContent)) {\r\n this.pendingContent.set(newFullContent.substring(currentTypedContent.length));\r\n this.startTyping();\r\n } else {\r\n this.stopTyping();\r\n this.typedContent.set('');\r\n this.pendingContent.set(newFullContent);\r\n this.startTyping();\r\n }\r\n }\r\n }\r\n\r\n get renderedContent() {\r\n const finalContent = this.typing() ? this.typedContent() : (this.content() as string) || '';\r\n let renderedString: string;\r\n\r\n if (this.renderer()) {\r\n renderedString = this.renderer()!(finalContent) || '';\r\n } else {\r\n renderedString = finalContent;\r\n }\r\n\r\n return this.sanitizer.bypassSecurityTrustHtml(renderedString);\r\n }\r\n\r\n private startTyping(): void {\r\n if (this.typingInterval) {\r\n return;\r\n }\r\n\r\n if (this.pendingContent().length === 0) {\r\n return;\r\n }\r\n\r\n this.typingStart.emit();\r\n this.typingInterval = setInterval(() => {\r\n if (this.pendingContent().length > 0) {\r\n const nextChar = this.pendingContent().charAt(0);\r\n this.typedContent.update((current) => current + nextChar);\r\n this.pendingContent.update((current) => current.substring(1));\r\n this.typingOuput.emit(nextChar);\r\n } else {\r\n this.typingEnd.emit();\r\n this.stopTyping();\r\n }\r\n }, this.speed());\r\n }\r\n\r\n private stopTyping(): void {\r\n if (this.typingInterval) {\r\n clearInterval(this.typingInterval);\r\n this.typingInterval = null;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stopTyping();\r\n }\r\n}\r\n","<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? size()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div class=\"x-bubble-wrap\">\r\n @if (loading()) {\r\n <div class=\"x-bubble-content\" [x-loading]=\"true\" [size]=\"'small'\" inline></div>\r\n } @else {\r\n @if (header()) {\r\n <div class=\"x-bubble-header\">\r\n <ng-container *xOutlet=\"header()\">{{ header() }}</ng-container>\r\n </div>\r\n }\r\n @if (isString()) {\r\n <div class=\"x-bubble-content\" #contentRef [innerHTML]=\"renderedContent\"></div>\r\n } @else if (isTemplate()) {\r\n <div class=\"x-bubble-content\" #contentRef>\r\n <ng-container *xOutlet=\"content()\"></ng-container>\r\n </div>\r\n }\r\n @if (footer()) {\r\n <div class=\"x-bubble-footer\">\r\n <ng-container *xOutlet=\"footer()\">{{ footer() }}</ng-container>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { XBubbleComponent } from './bubble.component';\r\nimport { XBubblesComponent } from './bubbles.component';\r\n\r\n@NgModule({\r\n exports: [XBubbleComponent, XBubblesComponent],\r\n imports: [XBubbleComponent, XBubblesComponent]\r\n})\r\nexport class XBubbleModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;AAIA;;;;AAIG;AACI,MAAM,aAAa,GAAG,UAAU;AACvC,MAAM,oBAAoB,GAAG,QAAQ;AAErC;;AAEG;MAEU,eAAgB,SAAQ,iBAAiB,CAAC,oBAAoB,CAAC,CAAA;AAD5E,IAAA,WAAA,GAAA;;AAEE;;;AAGG;QACM,IAAA,CAAA,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAa;AACrC;;;AAGG;QACM,IAAA,CAAA,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAuB;AAC9C;;;AAGG;QACM,IAAA,CAAA,IAAI,GAAG,KAAK,CAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,QAAQ,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC3D;;;AAGG;QACM,IAAA,CAAA,OAAO,GAAG,KAAK,CAAiB,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,UAAU,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC5E;;;AAGG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAmB,OAAO,qDAAC;AACrD;;;AAGG;QACM,IAAA,CAAA,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAa;AACpC;;;AAGG;QACM,IAAA,CAAA,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAa;AACpC;;;AAGG;AACM,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAoB,KAAK,2CAAI,SAAS,EAAE,UAAU,EAAA,CAAA,GAAA,CAAvB,EAAE,SAAS,EAAE,UAAU,EAAE,GAAC;AAC7E;;;AAGG;AACM,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAoB,KAAK,0CAAI,SAAS,EAAE,UAAU,EAAA,CAAA,GAAA,CAAvB,EAAE,SAAS,EAAE,UAAU,EAAE,GAAC;AAC5E;;;AAGG;AACM,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAkB,EAAE,yCAAI,SAAS,EAAE,SAAS,EAAA,CAAA,GAAA,CAAtB,EAAE,SAAS,EAAE,SAAS,EAAE,GAAC;AACrE;;;AAGG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA0B;AACnD;;;AAGG;AACM,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAoB,KAAK,8CAAI,SAAS,EAAE,UAAU,EAAA,CAAA,GAAA,CAAvB,EAAE,SAAS,EAAE,UAAU,EAAE,GAAC;AAChF;;;AAGG;QACM,IAAA,CAAA,WAAW,GAAG,MAAM,EAAQ;AACrC;;;AAGG;QACM,IAAA,CAAA,WAAW,GAAG,MAAM,EAAU;AACvC;;;AAGG;QACM,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;AACpC,IAAA;iIA5EY,eAAe,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,4qDADkC,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;2FACnD,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,SAAS;mBAAC,EAAE,QAAQ,EAAE,CAAA,EAAG,aAAa,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;;AA2FlE;;;;AAIG;AACI,MAAM,cAAc,GAAG,WAAW;AACzC,MAAM,qBAAqB,GAAG,SAAS;AAEvC;;AAEG;MAEU,gBAAiB,SAAQ,iBAAiB,CAAC,qBAAqB,CAAC,CAAA;AAD9E,IAAA,WAAA,GAAA;;AAEE;;;AAGG;QACM,IAAA,CAAA,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAS;AAC9B;;;AAGG;QACM,IAAA,CAAA,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkB;AAC1C;;;AAGG;QACM,IAAA,CAAA,YAAY,GAAG,MAAM,EAAS;AACxC,IAAA;iIAhBY,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,+YADkC,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;2FACpD,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,SAAS;mBAAC,EAAE,QAAQ,EAAE,CAAA,EAAG,cAAc,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;;;AChG7D,MAAO,iBAAkB,SAAQ,gBAAgB,CAAA;AARvD,IAAA,WAAA,GAAA;;AASE,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;QAEpB,IAAA,CAAA,mBAAmB,GAAuB,IAAI;QAC9C,IAAA,CAAA,WAAW,GAAG,IAAI;QAClB,IAAA,CAAA,oBAAoB,GAAwB,IAAI;QAChD,IAAA,CAAA,uBAAuB,GAA4B,IAAI;QACvD,IAAA,CAAA,cAAc,GAA4B,IAAI;AAC9C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAEtC,QAAA,IAAA,CAAA,OAAO,GAAG,eAAe,CAAC,gBAAgB,mDAAC;AA6G5C,IAAA;IA3GC,eAAe,GAAA;QACb,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,qBAAqB,EAAE;IAC9B;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;YAAE;QACzB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9C,QAAA,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/E,YAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,gBAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;YACtC;QACF;aAAO;AACL,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;gBACvB,IAAI,CAAC,kBAAkB,EAAE;YAC3B;QACF;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,oBAAoB,EAAE,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,uBAAuB,EAAE,UAAU,EAAE;QAC1C,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;IAEQ,UAAU,GAAA;AAChB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC5E,IAAI,IAAI,CAAC,mBAAmB,IAAI,SAAS,KAAK,IAAI,CAAC,mBAAmB;YAAE;AACxE,QAAA,IAAI,CAAC,mBAAmB,GAAG,SAAS;AACpC,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,IAAI,CAAC,oBAAoB,EAAE,WAAW,EAAE;YACxC,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ;AACrE,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,iBAAA,SAAS,CAAC,CAAC,KAAY,KAAI;AAC1B,gBAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,mBAAoB,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAoB,CAAC,SAAS;AAC5E,oBAAA,IAAI,CAAC,mBAAoB,CAAC,YAAY;gBACxC,IAAI,CAAC,QAAQ,EAAE;AACb,oBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;gBAC1B;qBAAO;AACL,oBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;gBACzB;AACA,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/B,YAAA,CAAC,CAAC;QACN;IACF;AAEQ,IAAA,sBAAsB,CAAC,OAAoB,EAAA;QACjD,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAgB;QAC7D,OAAO,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE;YACtC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,SAAS;YACpD,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,EAAE;AAClD,gBAAA,OAAO,MAAM;YACf;YACA,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;QAC3C;AACA,QAAA,OAAO,IAAI;IACb;IACQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,gBAAgB,CAAC,MAAK;AACvD,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YACvB,IAAI,CAAC,cAAc,EAAE;AACvB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC1F;AAEQ,IAAA,mBAAmB,CAAC,MAAwB,EAAA;QAClD,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,aAAa;QACxD,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,gBAAgB,CAAC,MAAK;AAC9C,gBAAA,IAAI,IAAI,CAAC,WAAW,EAAE;oBACpB,IAAI,CAAC,cAAc,EAAE;gBACvB;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE;AACzC,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,aAAa,EAAE;AAChB,aAAA,CAAC;QACJ;IACF;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;AAChC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;IAEA,cAAc,GAAA;QACZ,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC5B,IAAI,CAAC,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY;QAC5E;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,SAAS,GAAG,CAAC;QACxC;IACF;iIAvHW,iBAAiB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAWF,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChC5C,+BACA,EAAA,MAAA,EAAA,CAAA,uFAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FDoBa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;+BACE,WAAW,EAAA,aAAA,EAGN,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,EAAE,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,uFAAA,CAAA,EAAA;;;AEYP,MAAO,gBAAiB,SAAQ,eAAe,CAAA;AAoCnD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AApCT,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAChC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AACrB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAE3E,QAAA,IAAA,CAAA,UAAU,GAAG,SAAS,CAA0B,YAAY,sDAAC;AAE7D,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,OAAO;AACzB,YAAA,CAAC,GAAG,aAAa,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,EAAE,CAAA,CAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AAC7E,YAAA,CAAC,GAAG,aAAa,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AACrE,YAAA,CAAC,CAAA,EAAG,aAAa,CAAA,OAAA,CAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;AAC/D,YAAA,CAAC,GAAG,aAAa,CAAA,OAAA,CAAS,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;AAC9E,YAAA,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE;AACxD,SAAA,CAAC,oDAAC;AAEH,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,EAAE,wDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,EAAE,0DAAC;AAC3B,QAAA,IAAA,CAAA,sBAAsB,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;QAClD,IAAA,CAAA,cAAc,GAAQ,IAAI;AAElC,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;YACzB,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;AAC5C,QAAA,CAAC,sDAAC;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;YAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;AAClD,QAAA,CAAC,yDAAC;AAEF,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACzB,YAAA,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AACvC,QAAA,CAAC,sDAAC;AAEF,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AACvB,YAAA,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAClC,QAAA,CAAC,oDAAC;QAIA,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;gBACrC,IAAI,CAAC,UAAU,EAAE;AACjB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AAClE,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO;AAC3B,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,YAAY,IAAI,EAAE;AAC5D,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE;AAE/C,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AAClB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC;gBACrC;YACF;AAEA,YAAA,IAAI,cAAc,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE;AAClD,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAC7E,IAAI,CAAC,WAAW,EAAE;YACpB;iBAAO;gBACL,IAAI,CAAC,UAAU,EAAE;AACjB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;gBACvC,IAAI,CAAC,WAAW,EAAE;YACpB;QACF;IACF;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAI,IAAI,CAAC,OAAO,EAAa,IAAI,EAAE;AAC3F,QAAA,IAAI,cAAsB;AAE1B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAG,CAAC,YAAY,CAAC,IAAI,EAAE;QACvD;aAAO;YACL,cAAc,GAAG,YAAY;QAC/B;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,cAAc,CAAC;IAC/D;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB;QACF;QAEA,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;YACtC;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AACvB,QAAA,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,MAAK;YACrC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,GAAG,QAAQ,CAAC;AACzD,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC7D,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;YACjC;iBAAO;AACL,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;gBACrB,IAAI,CAAC,UAAU,EAAE;YACnB;AACF,QAAA,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAClB;IAEQ,UAAU,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;AAClC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,UAAU,EAAE;IACnB;iIAnHW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/B7B,y/CAwCA,EAAA,MAAA,EAAA,CAAA,4gFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDXY,OAAO,oFAAE,gBAAgB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAE7D,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,iBAGL,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,y/CAAA,EAAA,MAAA,EAAA,CAAA,4gFAAA,CAAA,EAAA;;;MErB9D,aAAa,CAAA;iIAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAb,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YAFd,gBAAgB,EAAE,iBAAiB,CAAA,EAAA,OAAA,EAAA,CADnC,gBAAgB,EAAE,iBAAiB,CAAA,EAAA,CAAA,CAAA;AAGlC,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YAFd,gBAAgB,CAAA,EAAA,CAAA,CAAA;;2FAEf,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;AAC9C,oBAAA,OAAO,EAAE,CAAC,gBAAgB,EAAE,iBAAiB;AAC9C,iBAAA;;;ACPD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ng-nest-ui-bubble.mjs","sources":["../../../../lib/ng-nest/ui/bubble/bubble.property.ts","../../../../lib/ng-nest/ui/bubble/bubbles.component.ts","../../../../lib/ng-nest/ui/bubble/bubbles.component.html","../../../../lib/ng-nest/ui/bubble/bubble.component.ts","../../../../lib/ng-nest/ui/bubble/bubble.component.html","../../../../lib/ng-nest/ui/bubble/bubble.module.ts","../../../../lib/ng-nest/ui/bubble/ng-nest-ui-bubble.ts"],"sourcesContent":["import { Component, input, output } from '@angular/core';\r\nimport { XBoolean, XNumber, XPropertyFunction, XSize, XTemplate, XToBoolean, XToNumber } from '@ng-nest/ui/core';\r\nimport { XAvatarOption } from '@ng-nest/ui/avatar';\r\n\r\n/**\r\n * Bubble\r\n * @selector x-bubble\r\n * @decorator component\r\n */\r\nexport const XBubblePrefix = 'x-bubble';\r\nconst X_BUBBLE_CONFIG_NAME = 'bubble';\r\n\r\n/**\r\n * Bubble Property\r\n */\r\n@Component({ selector: `${XBubblePrefix}-property`, template: '' })\r\nexport class XBubbleProperty extends XPropertyFunction(X_BUBBLE_CONFIG_NAME) {\r\n /**\r\n * @zh_CN 气泡内容\r\n * @en_US Bubble content\r\n */\r\n readonly content = input<XTemplate>();\r\n /**\r\n * @zh_CN 头像\r\n * @en_US Avatar\r\n */\r\n readonly avatar = input<XBubbleAvatarOption>();\r\n /**\r\n * @zh_CN 尺寸\r\n * @en_US Size\r\n */\r\n readonly size = input<XSize>(this.config?.size ?? 'medium');\r\n /**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\n readonly variant = input<XBubbleVariant>(this.config?.variant ?? 'outlined');\r\n /**\r\n * @zh_CN 位置\r\n * @en_US Bubble placement\r\n */\r\n readonly placement = input<XBubblePlacement>('start');\r\n /**\r\n * @zh_CN 气泡头部内容\r\n * @en_US Bubble header content\r\n */\r\n readonly header = input<XTemplate>();\r\n /**\r\n * @zh_CN 气泡底部内容\r\n * @en_US Bubble header content\r\n */\r\n readonly footer = input<XTemplate>();\r\n /**\r\n * @zh_CN 加载中\r\n * @en_US Loading\r\n */\r\n readonly loading = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 内容输出打字机效果\r\n * @en_US Typing effect\r\n */\r\n readonly typing = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 打字机输出速度\r\n * @en_US Typing speed\r\n */\r\n readonly speed = input<number, XNumber>(30, { transform: XToNumber });\r\n /**\r\n * @zh_CN 内容渲染器,可自定义内容的渲染方式,如 HTML、Markdown\r\n * @en_US Content renderer, can customize content rendering, such as HTML, Markdown\r\n */\r\n readonly renderer = input<XBubbleContentRenderer>();\r\n /**\r\n * @zh_CN 是否显示打字机光标\r\n * @en_US Whether to show the typing cursor\r\n */\r\n readonly showCursor = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 打字开始\r\n * @en_US Typing start\r\n */\r\n readonly typingStart = output<void>();\r\n /**\r\n * @zh_CN 打字正在输出的字符\r\n * @en_US Typing output character\r\n */\r\n readonly typingOuput = output<string>();\r\n /**\r\n * @zh_CN 打字结束\r\n * @en_US Typing end\r\n */\r\n readonly typingEnd = output<void>();\r\n}\r\n\r\n/**\r\n * @zh_CN 头像配置,继承了组件 Avatar 相关属性\r\n * @en_US Avatar settings\r\n */\r\nexport interface XBubbleAvatarOption extends XAvatarOption {\r\n /**\r\n * @zh_CN 是否显示头像\r\n * @en_US Whether to show the avatar\r\n */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Bubbles\r\n * @selector x-bubbles\r\n * @decorator component\r\n */\r\nexport const XBubblesPrefix = 'x-bubbles';\r\nconst X_BUBBLES_CONFIG_NAME = 'bubbles';\r\n\r\n/**\r\n * Bubbles Property\r\n */\r\n@Component({ selector: `${XBubblesPrefix}-property`, template: '' })\r\nexport class XBubblesProperty extends XPropertyFunction(X_BUBBLES_CONFIG_NAME) {\r\n /**\r\n * @zh_CN 尺寸\r\n * @en_US Size\r\n */\r\n readonly size = input<XSize>();\r\n /**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\n readonly variant = input<XBubbleVariant>();\r\n /**\r\n * @zh_CN 滚动条滚动事件,自动获取父级可滚动的元素\r\n * @en_US Scroll event of the scroll bar, automatically obtaining the scrollable element of the parent\r\n */\r\n readonly scrollChange = output<Event>();\r\n}\r\n\r\n/**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\nexport type XBubbleVariant = 'outlined' | 'filled' | 'shadow' | 'borderless';\r\n\r\n/**\r\n * @zh_CN 位置\r\n * @en_US Bubble placement\r\n */\r\nexport type XBubblePlacement = 'start' | 'end';\r\n\r\n/**\r\n * @zh_CN 内容渲染函数\r\n * @en_US Bubble content renderer\r\n */\r\nexport type XBubbleContentRenderer = (content: string) => string | undefined;\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n contentChildren,\r\n ElementRef,\r\n inject,\r\n Renderer2,\r\n ViewEncapsulation\r\n} from '@angular/core';\r\nimport { XBubblesProperty } from './bubble.property';\r\nimport { XBubbleComponent } from './bubble.component';\r\nimport { fromEvent, Subject, Subscription, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'x-bubbles',\r\n templateUrl: './bubbles.component.html',\r\n styleUrls: ['./bubbles.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: []\r\n})\r\nexport class XBubblesComponent extends XBubblesProperty {\r\n elementRef = inject(ElementRef);\r\n renderer = inject(Renderer2);\r\n\r\n private parentScrollElement: HTMLElement | null = null;\r\n private isFollowing = true;\r\n private removeScrollListener: Subscription | null = null;\r\n private contentMutationObserver: MutationObserver | null = null;\r\n private typingObserver: MutationObserver | null = null;\r\n private $destroy = new Subject<void>();\r\n\r\n bubbles = contentChildren(XBubbleComponent);\r\n\r\n ngAfterViewInit(): void {\r\n this.stepScroll();\r\n this.observeContentChanges();\r\n }\r\n\r\n ngDoCheck(): void {\r\n const bubbles = this.bubbles();\r\n if (bubbles.length <= 0) return;\r\n const lastBubble = bubbles[bubbles.length - 1];\r\n if (lastBubble && lastBubble.typing() && lastBubble.pendingContent().length > 0) {\r\n if (!this.typingObserver) {\r\n this.startTypingObserver(lastBubble);\r\n }\r\n } else {\r\n if (this.typingObserver) {\r\n this.stopTypingObserver();\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removeScrollListener?.unsubscribe();\r\n this.contentMutationObserver?.disconnect();\r\n this.stopTypingObserver();\r\n this.$destroy.next();\r\n this.$destroy.complete();\r\n }\r\n\r\n private stepScroll() {\r\n const newScroll = this.getParentScrollElement(this.elementRef.nativeElement);\r\n if (this.parentScrollElement && newScroll === this.parentScrollElement) return;\r\n this.parentScrollElement = newScroll;\r\n if (this.parentScrollElement) {\r\n this.removeScrollListener?.unsubscribe();\r\n this.removeScrollListener = fromEvent(this.parentScrollElement, 'scroll')\r\n .pipe(takeUntil(this.$destroy))\r\n .subscribe((event: Event) => {\r\n const atBottom =\r\n this.parentScrollElement!.scrollHeight - this.parentScrollElement!.scrollTop ===\r\n this.parentScrollElement!.clientHeight;\r\n if (!atBottom) {\r\n this.isFollowing = false;\r\n } else {\r\n this.isFollowing = true;\r\n }\r\n this.scrollChange.emit(event);\r\n });\r\n }\r\n }\r\n\r\n private getParentScrollElement(element: HTMLElement): HTMLElement | null {\r\n let parent = this.renderer.parentNode(element) as HTMLElement;\r\n while (parent && parent.nodeType === 1) {\r\n const overflowY = getComputedStyle(parent).overflowY;\r\n if (overflowY === 'auto' || overflowY === 'scroll') {\r\n return parent;\r\n }\r\n parent = this.renderer.parentNode(parent);\r\n }\r\n return null;\r\n }\r\n private observeContentChanges(): void {\r\n this.contentMutationObserver = new MutationObserver(() => {\r\n this.isFollowing = true;\r\n this.scrollToBottom();\r\n });\r\n\r\n this.contentMutationObserver.observe(this.elementRef.nativeElement, { childList: true });\r\n }\r\n\r\n private startTypingObserver(bubble: XBubbleComponent): void {\r\n const bubbleContent = bubble.contentRef()?.nativeElement;\r\n if (bubbleContent) {\r\n this.typingObserver = new MutationObserver(() => {\r\n if (this.isFollowing) {\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.typingObserver.observe(bubbleContent, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true\r\n });\r\n }\r\n }\r\n\r\n private stopTypingObserver(): void {\r\n if (this.typingObserver) {\r\n this.typingObserver.disconnect();\r\n this.typingObserver = null;\r\n }\r\n }\r\n\r\n scrollToBottom(): void {\r\n this.stepScroll();\r\n if (this.parentScrollElement) {\r\n this.parentScrollElement.scrollTop = this.parentScrollElement.scrollHeight;\r\n }\r\n }\r\n\r\n scrollToTop(): void {\r\n this.stepScroll();\r\n if (this.parentScrollElement) {\r\n this.parentScrollElement.scrollTop = 0;\r\n }\r\n }\r\n}\r\n","<ng-content></ng-content>\r\n","import {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n computed,\r\n viewChild,\r\n ElementRef,\r\n signal,\r\n effect,\r\n SimpleChanges,\r\n inject,\r\n Renderer2\r\n} from '@angular/core';\r\nimport { XBubblePrefix, XBubbleProperty } from './bubble.property';\r\nimport { XOutletDirective } from '@ng-nest/ui/outlet';\r\nimport { XIsEmpty, XIsString, XIsTemplateRef } from '@ng-nest/ui/core';\r\nimport { NgClass } from '@angular/common';\r\nimport { XAvatarComponent } from '@ng-nest/ui/avatar';\r\nimport { XLoadingComponent } from '@ng-nest/ui/loading';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { XBubblesComponent } from './bubbles.component';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\n\r\n@Component({\r\n selector: 'x-bubble',\r\n templateUrl: './bubble.component.html',\r\n styleUrls: ['./bubble.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgClass, XOutletDirective, XAvatarComponent, XLoadingComponent]\r\n})\r\nexport class XBubbleComponent extends XBubbleProperty {\r\n sanitizer = inject(DomSanitizer);\r\n renderer2 = inject(Renderer2);\r\n private bubbles = inject(XBubblesComponent, { optional: true, host: true });\r\n\r\n contentRef = viewChild<ElementRef<HTMLElement>>('contentRef');\r\n\r\n classMap = computed(() => ({\r\n [`${XBubblePrefix}-${this.variantSignal()}`]: !XIsEmpty(this.variantSignal()),\r\n [`${XBubblePrefix}-${this.placement()}`]: !XIsEmpty(this.placement()),\r\n [`${XBubblePrefix}-cursor`]: this.showCursor() && this.typing(),\r\n [`${XBubblePrefix}-typing`]: this.typing() && this.pendingContent().length > 0,\r\n [`x-${this.sizeSignal()}`]: !XIsEmpty(this.sizeSignal())\r\n }));\r\n\r\n typedContent = signal('');\r\n pendingContent = signal('');\r\n pendingContentObserver = toObservable(this.pendingContent);\r\n private typingInterval: any = null;\r\n\r\n sizeSignal = computed(() => {\r\n return this.bubbles?.size() || this.size();\r\n });\r\n\r\n variantSignal = computed(() => {\r\n return this.bubbles?.variant() || this.variant();\r\n });\r\n\r\n isTemplate = computed(() => {\r\n return XIsTemplateRef(this.content());\r\n });\r\n\r\n isString = computed(() => {\r\n return XIsString(this.content());\r\n });\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.isString() && !this.typing()) {\r\n this.stopTyping();\r\n this.typedContent.set(this.typedContent() + this.pendingContent());\r\n this.pendingContent.set('');\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const { content } = changes;\r\n if (content && this.isString()) {\r\n const newFullContent = changes['content'].currentValue || '';\r\n const currentTypedContent = this.typedContent();\r\n\r\n if (!this.typing()) {\r\n this.typedContent.set(newFullContent);\r\n return;\r\n }\r\n\r\n if (newFullContent.startsWith(currentTypedContent)) {\r\n this.pendingContent.set(newFullContent.substring(currentTypedContent.length));\r\n this.startTyping();\r\n } else {\r\n this.stopTyping();\r\n this.typedContent.set('');\r\n this.pendingContent.set(newFullContent);\r\n this.startTyping();\r\n }\r\n }\r\n }\r\n\r\n get renderedContent() {\r\n const finalContent = this.typing() ? this.typedContent() : (this.content() as string) || '';\r\n let renderedString: string;\r\n\r\n if (this.renderer()) {\r\n renderedString = this.renderer()!(finalContent) || '';\r\n } else {\r\n renderedString = finalContent;\r\n }\r\n\r\n return this.sanitizer.bypassSecurityTrustHtml(renderedString);\r\n }\r\n\r\n private startTyping(): void {\r\n if (this.typingInterval) {\r\n return;\r\n }\r\n\r\n if (this.pendingContent().length === 0) {\r\n return;\r\n }\r\n\r\n this.typingStart.emit();\r\n this.typingInterval = setInterval(() => {\r\n if (this.pendingContent().length > 0) {\r\n const nextChar = this.pendingContent().charAt(0);\r\n this.typedContent.update((current) => current + nextChar);\r\n this.pendingContent.update((current) => current.substring(1));\r\n this.typingOuput.emit(nextChar);\r\n } else {\r\n this.typingEnd.emit();\r\n this.stopTyping();\r\n }\r\n }, this.speed());\r\n }\r\n\r\n private stopTyping(): void {\r\n if (this.typingInterval) {\r\n clearInterval(this.typingInterval);\r\n this.typingInterval = null;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stopTyping();\r\n }\r\n}\r\n","<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? size()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div class=\"x-bubble-wrapper\">\r\n @if (loading()) {\r\n <div class=\"x-bubble-content\" [x-loading]=\"true\" [size]=\"'small'\" inline></div>\r\n } @else {\r\n @if (header()) {\r\n <div class=\"x-bubble-header\">\r\n <ng-container *xOutlet=\"header()\">{{ header() }}</ng-container>\r\n </div>\r\n }\r\n @if (isString()) {\r\n <div class=\"x-bubble-content\" #contentRef [innerHTML]=\"renderedContent\"></div>\r\n } @else if (isTemplate()) {\r\n <div class=\"x-bubble-content\" #contentRef>\r\n <ng-container *xOutlet=\"content()\"></ng-container>\r\n </div>\r\n }\r\n @if (footer()) {\r\n <div class=\"x-bubble-footer\">\r\n <ng-container *xOutlet=\"footer()\">{{ footer() }}</ng-container>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { XBubbleComponent } from './bubble.component';\r\nimport { XBubblesComponent } from './bubbles.component';\r\n\r\n@NgModule({\r\n exports: [XBubbleComponent, XBubblesComponent],\r\n imports: [XBubbleComponent, XBubblesComponent]\r\n})\r\nexport class XBubbleModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|