@fieldia/chatter 0.8.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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +32 -0
  3. package/package.json +39 -0
  4. package/src/index.d.mts +6 -0
  5. package/src/index.d.ts +6 -0
  6. package/src/index.js +10 -0
  7. package/src/index.js.map +1 -0
  8. package/src/index.mjs +7 -0
  9. package/src/index.mjs.map +1 -0
  10. package/src/lib/activities.d.mts +19 -0
  11. package/src/lib/activities.d.ts +19 -0
  12. package/src/lib/activities.js +145 -0
  13. package/src/lib/activities.js.map +1 -0
  14. package/src/lib/activities.mjs +140 -0
  15. package/src/lib/activities.mjs.map +1 -0
  16. package/src/lib/attachments.d.mts +19 -0
  17. package/src/lib/attachments.d.ts +19 -0
  18. package/src/lib/attachments.js +93 -0
  19. package/src/lib/attachments.js.map +1 -0
  20. package/src/lib/attachments.mjs +89 -0
  21. package/src/lib/attachments.mjs.map +1 -0
  22. package/src/lib/chatter.d.mts +45 -0
  23. package/src/lib/chatter.d.ts +45 -0
  24. package/src/lib/chatter.js +222 -0
  25. package/src/lib/chatter.js.map +1 -0
  26. package/src/lib/chatter.mjs +217 -0
  27. package/src/lib/chatter.mjs.map +1 -0
  28. package/src/lib/followers.d.mts +15 -0
  29. package/src/lib/followers.d.ts +15 -0
  30. package/src/lib/followers.js +96 -0
  31. package/src/lib/followers.js.map +1 -0
  32. package/src/lib/followers.mjs +93 -0
  33. package/src/lib/followers.mjs.map +1 -0
  34. package/src/lib/labels.d.mts +43 -0
  35. package/src/lib/labels.d.ts +43 -0
  36. package/src/lib/labels.js +166 -0
  37. package/src/lib/labels.js.map +1 -0
  38. package/src/lib/labels.mjs +163 -0
  39. package/src/lib/labels.mjs.map +1 -0
  40. package/src/lib/memory.d.mts +22 -0
  41. package/src/lib/memory.d.ts +22 -0
  42. package/src/lib/memory.js +131 -0
  43. package/src/lib/memory.js.map +1 -0
  44. package/src/lib/memory.mjs +128 -0
  45. package/src/lib/memory.mjs.map +1 -0
  46. package/src/lib/mentions.d.mts +18 -0
  47. package/src/lib/mentions.d.ts +18 -0
  48. package/src/lib/mentions.js +94 -0
  49. package/src/lib/mentions.js.map +1 -0
  50. package/src/lib/mentions.mjs +90 -0
  51. package/src/lib/mentions.mjs.map +1 -0
  52. package/src/lib/reactions.d.mts +10 -0
  53. package/src/lib/reactions.d.ts +10 -0
  54. package/src/lib/reactions.js +53 -0
  55. package/src/lib/reactions.js.map +1 -0
  56. package/src/lib/reactions.mjs +49 -0
  57. package/src/lib/reactions.mjs.map +1 -0
  58. package/src/lib/slot.d.mts +17 -0
  59. package/src/lib/slot.d.ts +17 -0
  60. package/src/lib/slot.js +37 -0
  61. package/src/lib/slot.js.map +1 -0
  62. package/src/lib/slot.mjs +34 -0
  63. package/src/lib/slot.mjs.map +1 -0
  64. package/src/lib/source.d.mts +114 -0
  65. package/src/lib/source.d.ts +114 -0
  66. package/src/lib/source.js +9 -0
  67. package/src/lib/source.js.map +1 -0
  68. package/src/lib/source.mjs +8 -0
  69. package/src/lib/source.mjs.map +1 -0
  70. package/src/lib/styles.d.mts +4 -0
  71. package/src/lib/styles.d.ts +4 -0
  72. package/src/lib/styles.js +108 -0
  73. package/src/lib/styles.js.map +1 -0
  74. package/src/lib/styles.mjs +104 -0
  75. package/src/lib/styles.mjs.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../../../libs/chatter/src/lib/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { fill, formatBytes } from '@fieldia/core';
2
+ import { drawIcon } from '@fieldia/widgets';
3
+ const isImage = (attachment) => attachment.type.startsWith('image/') && !!attachment.url;
4
+ /** A message's files: an image as a preview that opens it, any other file as a link with its size. */
5
+ export function attachmentList(context, attachments, remove) {
6
+ const { el, doc, labels, icons } = context;
7
+ return el('ul', { class: 'fd-attachments' }, ...attachments.map((attachment) => {
8
+ const item = el('li', { class: 'fd-attachment' });
9
+ if (isImage(attachment)) {
10
+ const preview = el('img', { src: attachment.url, alt: attachment.name });
11
+ item.append(el('a', { class: 'fd-attachment-image', href: attachment.url, target: '_blank', rel: 'noopener' }, preview));
12
+ }
13
+ else {
14
+ const icon = drawIcon(doc, 'file', icons);
15
+ const words = el('span', { class: 'fd-attachment-words' }, el('span', { class: 'fd-attachment-name' }, attachment.name), el('span', { class: 'fd-attachment-size' }, formatBytes(attachment.size)));
16
+ const parts = [...(icon ? [icon] : []), words];
17
+ item.append(attachment.url
18
+ ? el('a', { class: 'fd-attachment-file', href: attachment.url, target: '_blank', rel: 'noopener', download: attachment.name }, ...parts)
19
+ : el('span', { class: 'fd-attachment-file' }, ...parts));
20
+ }
21
+ if (remove) {
22
+ const drop = el('button', { type: 'button', class: 'fd-attachment-remove', 'aria-label': fill(labels.removeAttachment, { name: attachment.name }) }, '×');
23
+ drop.addEventListener('click', () => remove(attachment));
24
+ item.append(drop);
25
+ }
26
+ return item;
27
+ }));
28
+ }
29
+ /**
30
+ * The composer's files: a button to choose them, dropped ones too, each
31
+ * stored at once through the source and shown until it is sent or taken away.
32
+ * Without a source that stores files, there is nothing to show.
33
+ */
34
+ export function composerFiles(context, onProblem) {
35
+ const { el, labels, source, doc, icons } = context;
36
+ let files = [];
37
+ let uploading = 0;
38
+ const input = el('input', { type: 'file', multiple: '', hidden: '' });
39
+ const icon = drawIcon(doc, 'link', icons);
40
+ const button = el('button', { type: 'button', class: 'fd-button fd-attach' }, ...(icon ? [icon] : []), labels.attach);
41
+ const chips = el('div', { class: 'fd-composer-files' });
42
+ const element = el('div', { class: 'fd-composer-attach' }, button, input);
43
+ const draw = () => chips.replaceChildren(...(files.length ? [attachmentList(context, files, (gone) => ((files = files.filter((f) => f !== gone)), draw()))] : []));
44
+ async function take(chosen) {
45
+ const record = context.record();
46
+ if (!source.upload || !record)
47
+ return;
48
+ uploading += chosen.length;
49
+ for (const file of chosen) {
50
+ try {
51
+ files = [...files, await source.upload(record, file)];
52
+ draw();
53
+ }
54
+ catch (error) {
55
+ onProblem(fill(labels.couldNotSend, { reason: error.message }));
56
+ }
57
+ finally {
58
+ uploading--;
59
+ }
60
+ }
61
+ }
62
+ button.addEventListener('click', () => input.click());
63
+ input.addEventListener('change', () => {
64
+ void take([...(input.files ?? [])]);
65
+ input.value = '';
66
+ });
67
+ return {
68
+ /** The button, or nothing when the source cannot store files. */
69
+ element: source.upload ? element : null,
70
+ chips,
71
+ files: () => files,
72
+ busy: () => uploading > 0,
73
+ clear() {
74
+ files = [];
75
+ draw();
76
+ },
77
+ /** Files dropped on the composer are taken too. */
78
+ takeDropsOn(target) {
79
+ if (!source.upload)
80
+ return;
81
+ target.addEventListener('dragover', (event) => event.preventDefault());
82
+ target.addEventListener('drop', (event) => {
83
+ event.preventDefault();
84
+ void take([...(event.dataTransfer?.files ?? [])]);
85
+ });
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=attachments.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.mjs","sourceRoot":"","sources":["../../../../../libs/chatter/src/lib/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type Locale } from '@fieldia/core';
2
+ import { type IconSet } from '@fieldia/widgets';
3
+ import { type ChatterLabels } from './labels.mjs';
4
+ import type { ChatterSource, RecordRef } from './source.mjs';
5
+ export interface ChatterOptions {
6
+ source: ChatterSource;
7
+ /** The record the conversation is about; null for one not saved yet. */
8
+ record: RecordRef | null;
9
+ locale?: Locale;
10
+ labels?: Partial<ChatterLabels>;
11
+ dir?: 'ltr' | 'rtl';
12
+ /** The app's own icons, by name, as the viewer takes them. */
13
+ icons?: IconSet;
14
+ /** The clock for what is due today; the real one unless a test pins it. */
15
+ now?: () => Date;
16
+ }
17
+ export interface ChatterHandle {
18
+ readonly element: HTMLElement;
19
+ /** Fetch the conversation again, after something changed elsewhere. */
20
+ refresh(): Promise<void>;
21
+ /** Follow another record, or none while one is not saved. */
22
+ setRecord(record: RecordRef | null): Promise<void>;
23
+ destroy(): void;
24
+ }
25
+ /** What the parts of a chatter share: the page, its words, its source, and the record. */
26
+ export interface ChatterContext {
27
+ doc: Document;
28
+ labels: ChatterLabels;
29
+ locale: Locale;
30
+ source: ChatterSource;
31
+ icons?: IconSet;
32
+ now: () => Date;
33
+ record(): RecordRef | null;
34
+ el<K extends keyof HTMLElementTagNameMap>(tag: K, attrs?: Record<string, string | undefined>, ...children: (Node | string)[]): HTMLElementTagNameMap[K];
35
+ }
36
+ /** What was typed, as HTML: a paragraph for each block, a line break for each line, every character escaped. */
37
+ export declare function textToHtml(text: string): string;
38
+ /** A person's initials, for when there is no picture. */
39
+ export declare function initials(name: string): string;
40
+ /**
41
+ * A record's conversation beside its form: messages to its followers, notes
42
+ * for the team, and its tracked changes. Plain DOM, so it works in every
43
+ * framework; it talks to the server only through the app's `source`.
44
+ */
45
+ export declare function mountChatter(host: HTMLElement, options: ChatterOptions): ChatterHandle;
@@ -0,0 +1,45 @@
1
+ import { type Locale } from '@fieldia/core';
2
+ import { type IconSet } from '@fieldia/widgets';
3
+ import { type ChatterLabels } from './labels';
4
+ import type { ChatterSource, RecordRef } from './source';
5
+ export interface ChatterOptions {
6
+ source: ChatterSource;
7
+ /** The record the conversation is about; null for one not saved yet. */
8
+ record: RecordRef | null;
9
+ locale?: Locale;
10
+ labels?: Partial<ChatterLabels>;
11
+ dir?: 'ltr' | 'rtl';
12
+ /** The app's own icons, by name, as the viewer takes them. */
13
+ icons?: IconSet;
14
+ /** The clock for what is due today; the real one unless a test pins it. */
15
+ now?: () => Date;
16
+ }
17
+ export interface ChatterHandle {
18
+ readonly element: HTMLElement;
19
+ /** Fetch the conversation again, after something changed elsewhere. */
20
+ refresh(): Promise<void>;
21
+ /** Follow another record, or none while one is not saved. */
22
+ setRecord(record: RecordRef | null): Promise<void>;
23
+ destroy(): void;
24
+ }
25
+ /** What the parts of a chatter share: the page, its words, its source, and the record. */
26
+ export interface ChatterContext {
27
+ doc: Document;
28
+ labels: ChatterLabels;
29
+ locale: Locale;
30
+ source: ChatterSource;
31
+ icons?: IconSet;
32
+ now: () => Date;
33
+ record(): RecordRef | null;
34
+ el<K extends keyof HTMLElementTagNameMap>(tag: K, attrs?: Record<string, string | undefined>, ...children: (Node | string)[]): HTMLElementTagNameMap[K];
35
+ }
36
+ /** What was typed, as HTML: a paragraph for each block, a line break for each line, every character escaped. */
37
+ export declare function textToHtml(text: string): string;
38
+ /** A person's initials, for when there is no picture. */
39
+ export declare function initials(name: string): string;
40
+ /**
41
+ * A record's conversation beside its form: messages to its followers, notes
42
+ * for the team, and its tracked changes. Plain DOM, so it works in every
43
+ * framework; it talks to the server only through the app's `source`.
44
+ */
45
+ export declare function mountChatter(host: HTMLElement, options: ChatterOptions): ChatterHandle;
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.textToHtml = textToHtml;
4
+ exports.initials = initials;
5
+ exports.mountChatter = mountChatter;
6
+ const core_1 = require("@fieldia/core");
7
+ const widgets_1 = require("@fieldia/widgets");
8
+ const activities_1 = require("./activities");
9
+ const attachments_1 = require("./attachments");
10
+ const followers_1 = require("./followers");
11
+ const labels_1 = require("./labels");
12
+ const mentions_1 = require("./mentions");
13
+ const reactions_1 = require("./reactions");
14
+ const styles_1 = require("./styles");
15
+ /** What was typed, as HTML: a paragraph for each block, a line break for each line, every character escaped. */
16
+ function textToHtml(text) {
17
+ const escape = (line) => line.replace(/[&<>"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[c]);
18
+ return text
19
+ .trim()
20
+ .split(/\n\s*\n/)
21
+ .map((block) => `<p>${block.split('\n').map(escape).join('<br>')}</p>`)
22
+ .join('');
23
+ }
24
+ /** A person's initials, for when there is no picture. */
25
+ function initials(name) {
26
+ return name
27
+ .split(/\s+/)
28
+ .filter(Boolean)
29
+ .slice(0, 2)
30
+ .map((part) => part[0]?.toUpperCase() ?? '')
31
+ .join('');
32
+ }
33
+ /**
34
+ * A record's conversation beside its form: messages to its followers, notes
35
+ * for the team, and its tracked changes. Plain DOM, so it works in every
36
+ * framework; it talks to the server only through the app's `source`.
37
+ */
38
+ function mountChatter(host, options) {
39
+ const doc = host.ownerDocument;
40
+ (0, widgets_1.installStyles)(doc);
41
+ (0, styles_1.installChatterStyles)(doc);
42
+ const locale = options.locale ?? 'en';
43
+ const labels = { ...labels_1.CHATTER_LABELS[locale], ...options.labels };
44
+ let record = options.record;
45
+ let destroyed = false;
46
+ function el(tag, attrs = {}, ...children) {
47
+ const node = doc.createElement(tag);
48
+ for (const [name, value] of Object.entries(attrs))
49
+ if (value !== undefined)
50
+ node.setAttribute(name, value);
51
+ node.append(...children);
52
+ return node;
53
+ }
54
+ const context = { doc, labels, locale, source: options.source, icons: options.icons, now: options.now ?? (() => new Date()), record: () => record, el };
55
+ const root = el('section', { class: 'fd-theme fd-chatter', 'aria-label': labels.conversation, dir: options.dir, lang: locale });
56
+ const sendButton = el('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.sendMessage);
57
+ const noteButton = el('button', { type: 'button', class: 'fd-button' }, labels.logNote);
58
+ const bar = el('div', { class: 'fd-chatter-bar' }, sendButton, noteButton);
59
+ const waiting = el('p', { class: 'fd-chatter-waiting', hidden: '' }, labels.notSaved);
60
+ const empty = el('p', { class: 'fd-chatter-empty', hidden: '' }, labels.empty);
61
+ const list = el('ol', { class: 'fd-chatter-messages' });
62
+ // ---- composing ----------------------------------------------------------------
63
+ let mode = 'message';
64
+ let replyTo = null;
65
+ const box = el('textarea', { class: 'fd-input', rows: '3' });
66
+ // The mention list takes its keys first: Enter picks a person, Escape closes the list, not the composer.
67
+ const mentioning = (0, mentions_1.mentions)(context, box);
68
+ const replying = el('p', { class: 'fd-replying', hidden: '' });
69
+ const post = el('button', { type: 'button', class: 'fd-button fd-button-primary' });
70
+ const cancel = el('button', { type: 'button', class: 'fd-button' }, labels.cancel);
71
+ const problem = el('p', { class: 'fd-chatter-problem', role: 'alert', hidden: '' });
72
+ const say = (message) => {
73
+ problem.textContent = message;
74
+ problem.hidden = false;
75
+ };
76
+ const files = (0, attachments_1.composerFiles)(context, say);
77
+ const actions = el('div', { class: 'fd-composer-actions' }, post, cancel);
78
+ if (files.element)
79
+ actions.append(el('span', { class: 'fd-spacer' }), files.element);
80
+ const composer = el('div', { class: 'fd-composer', hidden: '' }, replying, box, mentioning.list, files.chips, problem, actions);
81
+ files.takeDropsOn(composer);
82
+ function openComposer(kind, answering = null) {
83
+ mode = kind;
84
+ replyTo = answering;
85
+ replying.hidden = !answering;
86
+ replying.textContent = answering ? (0, core_1.fill)(labels.replyingTo, { name: answering.author?.name ?? '' }) : '';
87
+ composer.hidden = false;
88
+ composer.classList.toggle('fd-composer-note', kind === 'note');
89
+ box.placeholder = kind === 'note' ? labels.forTeam : labels.forFollowers;
90
+ box.setAttribute('aria-label', kind === 'note' ? labels.logNote : labels.sendMessage);
91
+ post.textContent = kind === 'note' ? labels.log : labels.send;
92
+ problem.hidden = true;
93
+ box.focus();
94
+ }
95
+ function closeComposer() {
96
+ composer.hidden = true;
97
+ box.value = '';
98
+ replyTo = null;
99
+ files.clear();
100
+ mentioning.reset();
101
+ }
102
+ async function submit() {
103
+ const current = record;
104
+ // Words, files or both; and never while a file is still on its way.
105
+ const attachments = files.files();
106
+ if (!current || (!box.value.trim() && !attachments.length) || post.disabled || files.busy())
107
+ return;
108
+ post.disabled = true;
109
+ try {
110
+ const mentioned = mentioning.picked();
111
+ await options.source.post(current, {
112
+ kind: mode,
113
+ body: box.value.trim() ? textToHtml(box.value) : '',
114
+ attachments,
115
+ ...(replyTo ? { parentId: replyTo.id } : {}),
116
+ ...(mentioned.length ? { mentions: mentioned } : {}),
117
+ });
118
+ closeComposer();
119
+ await load();
120
+ }
121
+ catch (error) {
122
+ say((0, core_1.fill)(labels.couldNotSend, { reason: error.message }));
123
+ }
124
+ finally {
125
+ post.disabled = false;
126
+ }
127
+ }
128
+ sendButton.addEventListener('click', () => openComposer('message'));
129
+ noteButton.addEventListener('click', () => openComposer('note'));
130
+ post.addEventListener('click', () => void submit());
131
+ cancel.addEventListener('click', closeComposer);
132
+ box.addEventListener('keydown', (event) => {
133
+ if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {
134
+ event.preventDefault();
135
+ void submit();
136
+ }
137
+ else if (event.key === 'Escape') {
138
+ event.preventDefault();
139
+ closeComposer();
140
+ }
141
+ });
142
+ // ---- the messages ---------------------------------------------------------------
143
+ const when = new Intl.DateTimeFormat(locale === 'ar' ? 'ar-EG-u-nu-latn' : locale, { dateStyle: 'medium', timeStyle: 'short' });
144
+ function avatar(person) {
145
+ if (person?.avatar)
146
+ return el('img', { class: 'fd-avatar-image', src: person.avatar, alt: '' });
147
+ return el('span', { class: 'fd-avatar-initials', 'aria-hidden': 'true' }, initials(person?.name ?? '?'));
148
+ }
149
+ /** The messages on show, by id: an answer names whom it answers. */
150
+ let shown = new Map();
151
+ function messageItem(message) {
152
+ const head = el('div', { class: 'fd-message-head' }, el('span', { class: 'fd-message-author' }, message.author?.name ?? ''), el('time', { datetime: message.date }, when.format(new Date(message.date))));
153
+ if (message.kind === 'note')
154
+ head.append(el('span', { class: 'fd-message-kind' }, labels.note));
155
+ const body = el('div', { class: 'fd-message-body' });
156
+ body.innerHTML = (0, widgets_1.sanitizeHtml)(message.body, doc);
157
+ const content = el('div', { class: 'fd-message-content' }, head);
158
+ const parent = message.parentId != null ? shown.get(message.parentId) : undefined;
159
+ if (parent)
160
+ content.append(el('p', { class: 'fd-message-parent' }, (0, core_1.fill)(labels.replyingTo, { name: parent.author?.name ?? '' })));
161
+ if (message.body)
162
+ content.append(body);
163
+ if (message.tracking?.length) {
164
+ content.append(el('ul', { class: 'fd-tracking' }, ...message.tracking.map((change) => el('li', {}, `${change.label}: ${change.from ?? '—'} → ${change.to ?? '—'}`))));
165
+ }
166
+ if (message.attachments?.length)
167
+ content.append((0, attachments_1.attachmentList)(context, message.attachments));
168
+ // An event is history, not something to answer or react to.
169
+ if (message.kind !== 'event') {
170
+ const reply = el('button', { type: 'button', class: 'fd-message-reply', 'aria-label': labels.reply }, '↩');
171
+ reply.addEventListener('click', () => openComposer('message', message));
172
+ const reactions = (0, reactions_1.reactionBar)(context, message.id, message.reactions ?? []);
173
+ content.append(el('div', { class: 'fd-message-actions' }, ...(reactions ? [reactions] : []), reply));
174
+ }
175
+ return el('li', { class: `fd-message fd-message-${message.kind}`, 'data-message': String(message.id) }, avatar(message.author), content);
176
+ }
177
+ async function load() {
178
+ const current = record;
179
+ waiting.hidden = current !== null;
180
+ bar.hidden = current === null;
181
+ if (!current) {
182
+ closeComposer();
183
+ list.replaceChildren();
184
+ empty.hidden = true;
185
+ if (activities.element)
186
+ activities.element.hidden = true;
187
+ return;
188
+ }
189
+ void activities.load();
190
+ void followers.load();
191
+ const messages = await options.source.messages(current);
192
+ if (destroyed || record !== current)
193
+ return; // another record, or gone, meanwhile
194
+ shown = new Map(messages.map((message) => [message.id, message]));
195
+ list.replaceChildren(...messages.map(messageItem));
196
+ empty.hidden = messages.length > 0;
197
+ }
198
+ // Marking an activity done posts what came of it: the conversation is fetched again.
199
+ const activities = (0, activities_1.activitiesPart)(context, () => load());
200
+ if (activities.button)
201
+ bar.append(activities.button);
202
+ // Who follows sits at the far end of the bar, its list just under it.
203
+ const followers = (0, followers_1.followersPart)(context);
204
+ if (followers.button)
205
+ bar.append(el('span', { class: 'fd-spacer' }), followers.button);
206
+ root.append(bar, ...(followers.element ? [followers.element] : []), waiting, composer, ...(activities.element ? [activities.element] : []), empty, list);
207
+ host.append(root);
208
+ void load();
209
+ return {
210
+ element: root,
211
+ refresh: load,
212
+ async setRecord(next) {
213
+ record = next;
214
+ await load();
215
+ },
216
+ destroy() {
217
+ destroyed = true;
218
+ root.remove();
219
+ },
220
+ };
221
+ }
222
+ //# sourceMappingURL=chatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatter.js","sourceRoot":"","sources":["../../../../../libs/chatter/src/lib/chatter.ts"],"names":[],"mappings":"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"}