@ember-eui/core 16.0.0 → 16.0.2
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/declarations/components/eui-aspect-ratio.d.ts +5 -0
- package/declarations/components/eui-aspect-ratio.d.ts.map +1 -1
- package/declarations/components/eui-avatar.d.ts +6 -0
- package/declarations/components/eui-avatar.d.ts.map +1 -1
- package/declarations/components/eui-basic-table.d.ts.map +1 -1
- package/declarations/components/eui-color-picker.d.ts +3 -0
- package/declarations/components/eui-color-picker.d.ts.map +1 -1
- package/declarations/components/eui-color-stops/thumb.d.ts +3 -1
- package/declarations/components/eui-color-stops/thumb.d.ts.map +1 -1
- package/declarations/components/eui-combo-box.d.ts +2 -0
- package/declarations/components/eui-combo-box.d.ts.map +1 -1
- package/declarations/components/eui-data-grid/body.d.ts +2 -0
- package/declarations/components/eui-data-grid/body.d.ts.map +1 -1
- package/declarations/components/eui-data-grid.d.ts.map +1 -1
- package/declarations/components/eui-dual-range.d.ts +2 -0
- package/declarations/components/eui-dual-range.d.ts.map +1 -1
- package/declarations/components/eui-focus-trap.d.ts +1 -0
- package/declarations/components/eui-focus-trap.d.ts.map +1 -1
- package/declarations/components/eui-global-toast-list.d.ts +8 -1
- package/declarations/components/eui-global-toast-list.d.ts.map +1 -1
- package/declarations/components/eui-markdown-editor-drop-zone.d.ts.map +1 -1
- package/declarations/components/eui-markdown-editor.d.ts.map +1 -1
- package/declarations/components/eui-markdown-format.d.ts +2 -0
- package/declarations/components/eui-markdown-format.d.ts.map +1 -1
- package/declarations/components/eui-overlay-mask.d.ts +5 -2
- package/declarations/components/eui-overlay-mask.d.ts.map +1 -1
- package/declarations/components/eui-popover.d.ts +5 -1
- package/declarations/components/eui-popover.d.ts.map +1 -1
- package/declarations/components/eui-range.d.ts +3 -0
- package/declarations/components/eui-range.d.ts.map +1 -1
- package/declarations/components/eui-saturation.d.ts +3 -1
- package/declarations/components/eui-saturation.d.ts.map +1 -1
- package/declarations/components/eui-search-bar/field-value-selection-filter.d.ts.map +1 -1
- package/declarations/components/eui-text-color.d.ts +6 -0
- package/declarations/components/eui-text-color.d.ts.map +1 -1
- package/declarations/components/eui-text.d.ts.map +1 -1
- package/declarations/components/eui-token.d.ts +11 -0
- package/declarations/components/eui-token.d.ts.map +1 -1
- package/declarations/components/eui-tool-tip.d.ts +1 -2
- package/declarations/components/eui-tool-tip.d.ts.map +1 -1
- package/declarations/modifiers/outside-click-detector.d.ts +3 -0
- package/declarations/modifiers/outside-click-detector.d.ts.map +1 -1
- package/declarations/modifiers/resize-observer.d.ts +3 -0
- package/declarations/modifiers/resize-observer.d.ts.map +1 -1
- package/declarations/utils/css-mappings/eui-avatar.d.ts +2 -2
- package/declarations/utils/css-mappings/eui-avatar.d.ts.map +1 -1
- package/declarations/utils/css-mappings/eui-badge.d.ts +1 -1
- package/declarations/utils/css-mappings/eui-badge.d.ts.map +1 -1
- package/declarations/utils/css-mappings/eui-context-menu-item.d.ts +3 -3
- package/declarations/utils/eui/flyout-manager/reducer.d.ts.map +1 -1
- package/declarations/utils/eui/styles.d.ts +5 -0
- package/declarations/utils/eui/styles.d.ts.map +1 -1
- package/declarations/utils/retain-document-listener.d.ts +8 -0
- package/declarations/utils/retain-document-listener.d.ts.map +1 -0
- package/declarations/utils/transition.d.ts +1 -1
- package/declarations/utils/transition.d.ts.map +1 -1
- package/dist/components/eui-aspect-ratio.js +20 -5
- package/dist/components/eui-aspect-ratio.js.map +1 -1
- package/dist/components/eui-avatar.js +16 -4
- package/dist/components/eui-avatar.js.map +1 -1
- package/dist/components/eui-basic-table.js +4 -2
- package/dist/components/eui-basic-table.js.map +1 -1
- package/dist/components/eui-color-picker.js +8 -2
- package/dist/components/eui-color-picker.js.map +1 -1
- package/dist/components/eui-color-stops/thumb.js +17 -5
- package/dist/components/eui-color-stops/thumb.js.map +1 -1
- package/dist/components/eui-combo-box.js +16 -0
- package/dist/components/eui-combo-box.js.map +1 -1
- package/dist/components/eui-data-grid/body.js +21 -1
- package/dist/components/eui-data-grid/body.js.map +1 -1
- package/dist/components/eui-data-grid.js +6 -4
- package/dist/components/eui-data-grid.js.map +1 -1
- package/dist/components/eui-dual-range.js +5 -2
- package/dist/components/eui-dual-range.js.map +1 -1
- package/dist/components/eui-focus-trap.js +4 -1
- package/dist/components/eui-focus-trap.js.map +1 -1
- package/dist/components/eui-global-toast-list.js +33 -5
- package/dist/components/eui-global-toast-list.js.map +1 -1
- package/dist/components/eui-markdown-editor-drop-zone.js +2 -0
- package/dist/components/eui-markdown-editor-drop-zone.js.map +1 -1
- package/dist/components/eui-markdown-editor.js +3 -1
- package/dist/components/eui-markdown-editor.js.map +1 -1
- package/dist/components/eui-markdown-format.js +9 -3
- package/dist/components/eui-markdown-format.js.map +1 -1
- package/dist/components/eui-overlay-mask.js +2 -0
- package/dist/components/eui-overlay-mask.js.map +1 -1
- package/dist/components/eui-popover.js +22 -2
- package/dist/components/eui-popover.js.map +1 -1
- package/dist/components/eui-range.js +10 -3
- package/dist/components/eui-range.js.map +1 -1
- package/dist/components/eui-saturation.js +16 -4
- package/dist/components/eui-saturation.js.map +1 -1
- package/dist/components/eui-search-bar/field-value-selection-filter.js +8 -3
- package/dist/components/eui-search-bar/field-value-selection-filter.js.map +1 -1
- package/dist/components/eui-text-color.js +20 -6
- package/dist/components/eui-text-color.js.map +1 -1
- package/dist/components/eui-text.js +6 -3
- package/dist/components/eui-text.js.map +1 -1
- package/dist/components/eui-token.js +31 -17
- package/dist/components/eui-token.js.map +1 -1
- package/dist/components/eui-tool-tip.js +9 -17
- package/dist/components/eui-tool-tip.js.map +1 -1
- package/dist/icons-DCTZo11a.js.map +1 -1
- package/dist/modifiers/outside-click-detector.js +12 -2
- package/dist/modifiers/outside-click-detector.js.map +1 -1
- package/dist/modifiers/resize-observer.js +19 -4
- package/dist/modifiers/resize-observer.js.map +1 -1
- package/dist/utils/eui/flyout-manager/reducer.js +7 -1
- package/dist/utils/eui/flyout-manager/reducer.js.map +1 -1
- package/dist/utils/eui/styles.js +5 -0
- package/dist/utils/eui/styles.js.map +1 -1
- package/dist/utils/retain-document-listener.js +30 -0
- package/dist/utils/retain-document-listener.js.map +1 -0
- package/dist/utils/transition.js +8 -3
- package/dist/utils/transition.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eui-global-toast-list.js","sources":["../../src/components/eui-global-toast-list.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { fn } from '@ember/helper';\nimport { on } from '@ember/modifier';\nimport { action } from '@ember/object';\nimport didInsert from '@ember/render-modifiers/modifiers/did-insert';\nimport { service } from '@ember/service';\nimport type Owner from '@ember/owner';\n\nimport { getEuiThemeContext } from '../utils/emotion/consume.ts';\nimport { euiClass, useEuiBorealisStyles } from '../utils/eui/styles.ts';\nimport {\n euiGlobalToastListItemStyles,\n euiGlobalToastListStyles\n} from '../utils/eui/styles.generated.ts';\nimport Timer from '../utils/timer.ts';\nimport EuiButton from './eui-button.gts';\nimport EuiNotificationBadge from './eui-notification-badge.gts';\nimport EuiToast from './eui-toast.gts';\n\nimport type EuiI18n from '../services/eui-i18n';\nimport type EuiToasterService from '../services/eui-toaster';\nimport type {\n EuiToastProps,\n EuiToastPropsWithId\n} from '../services/eui-toaster';\nimport type { EuiCss } from '../utils/eui/styles.ts';\n\nexport type EuiToastSide = 'left' | 'right';\n\n/** One entry of `@toasts` (upstream `Toast`): EuiToast's args plus an id. */\nexport interface EuiGlobalToast extends EuiToastProps {\n /** Unique id of the toast. */\n id: string;\n}\n\ntype GlobalToastListArgs = {\n /**\n * The toasts to show, as data (upstream's `toasts`). Without it, the list\n * shows the toasts of the `euiToaster` service. The list never changes\n * this array: remove a toast from it in `@dismissToast`.\n */\n toasts?: EuiGlobalToast[];\n /**\n * Called when a toast is dismissed (its close button or its time ran\n * out, after the fade out). With `@toasts`, remove the toast from the\n * array here; without it, the toast is then removed from the `euiToaster`\n * service. \"Clear all\" calls it for every toast.\n */\n dismissToast?: (this: EuiGlobalToastList, toast: EuiToastProps) => void;\n /**\n * How long toasts stay, in ms, unless a toast sets its own\n * `toastLifeTimeMs`. Hovering or focusing the list pauses the timers.\n * Each toast's highlight bar counts this time down.\n */\n toastLifeTimeMs: number;\n /**\n * Which side of the browser window the toasts appear on: `'right'` or\n * `'left'`. Below the `m` breakpoint the list spans the window.\n * Defaults to `'right'`.\n */\n side?: EuiToastSide;\n /**\n * Shows a \"Clear all\" button once there are at least this many toasts;\n * `0` (or `false`) hides it. Defaults to `3`.\n */\n showClearAllButtonAt?: number | false;\n /** Called after \"Clear all\" dismissed every toast. */\n onClearAllToasts?: () => void;\n /** Shows a badge with the number of toasts. Defaults to `false`. */\n showNotificationBadge?: boolean;\n};\n\n/** Upstream `TOAST_FADE_OUT_MS`. */\nexport const TOAST_FADE_OUT_MS = 250;\n/** Upstream `CLEAR_ALL_TOASTS_THRESHOLD_DEFAULT`. */\nexport const CLEAR_ALL_TOASTS_THRESHOLD_DEFAULT = 3;\n\n/**\n * Renders the toasts of the `euiToaster` service. Place it once in the\n * application template, then show toasts from anywhere:\n * `this.euiToaster.show({ title: 'Saved', color: 'success' })`.\n */\nexport interface EuiGlobalToastListItemSignature {\n Element: HTMLDivElement;\n Args: GlobalToastListArgs;\n}\n\n/** Native Ember toast list on the upstream EUI 123 / Borealis factories. */\nexport default class EuiGlobalToastList extends Component<EuiGlobalToastListItemSignature> {\n @service declare euiToaster: EuiToasterService;\n @service declare euiI18n: EuiI18n;\n\n dismissTimeoutIds: number[] = [];\n toastIdToTimerMap: { [toastId: string]: Timer } = {};\n\n isScrollingToBottom = false;\n isScrolledToBottom = true;\n isUserInteracting = false;\n\n // See [Return Value](https://developer.mozilla.org/en-US/docs/Web/API/Window/requestAnimationFrame#Return_value)\n // for information on initial value of 0\n isScrollingAnimationFrame = 0;\n startScrollingAnimationFrame = 0;\n\n listElement: Element | null = null;\n @tracked toastIdToDismissedMap: {\n [toastId: string]: boolean;\n } = {};\n\n constructor(owner: Owner, args: GlobalToastListArgs) {\n super(owner, args);\n this.scheduleAllToastsForDismissal();\n }\n\n get context() {\n return getEuiThemeContext(this);\n }\n\n get side(): EuiToastSide {\n return this.args.side === 'left' ? 'left' : 'right';\n }\n\n @cached\n get styles() {\n return useEuiBorealisStyles(this.context, euiGlobalToastListStyles);\n }\n\n @cached\n get itemStyles() {\n return useEuiBorealisStyles(this.context, euiGlobalToastListItemStyles);\n }\n\n @cached\n get classes(): string {\n return euiClass(\n this.context,\n { boxSizing: 'border-box' },\n this.styles.euiGlobalToastList,\n this.styles[this.side]\n );\n }\n\n @cached\n get contentClass(): string {\n return euiClass(this.context, this.styles.content);\n }\n\n /** List item styles composed into each EuiToast's own class (`@css`). */\n @cached\n get itemCss(): EuiCss {\n return this.itemStyles.euiGlobalToastListItem;\n }\n\n @cached\n get dismissedItemCss(): EuiCss {\n return [this.itemStyles.euiGlobalToastListItem, this.itemStyles.dismissed];\n }\n\n /** Upstream: the list item styles plus the dismiss button's, on EuiButton. */\n @cached\n get clearAllCss(): EuiCss {\n return [\n this.itemStyles.euiGlobalToastListItem,\n this.styles.euiGlobalToastListDismissButton\n ];\n }\n\n /** Upstream's `css` on the count EuiNotificationBadge. */\n @cached\n get badgeCss(): EuiCss {\n const badge = this.styles.notificationBadge;\n const toasts = this.toasts;\n const dismissed = this.toastIdToDismissedMap;\n const firstDismissed = toasts[0] ? dismissed[toasts[0].id] : false;\n const allDismissed = toasts.every((toast) => dismissed[toast.id]);\n return [\n badge.notificationBadge,\n (firstDismissed || allDismissed) && badge.hasFadeOut\n ];\n }\n\n itemCssFor = (id: string): EuiCss =>\n this.toastIdToDismissedMap[id] ? this.dismissedItemCss : this.itemCss;\n\n lifeTimeFor = (toast: EuiToastPropsWithId): number | undefined =>\n toast.toastLifeTimeMs ?? this.args.toastLifeTimeMs;\n\n /** `@toasts` when given, else the `euiToaster` service's toasts. */\n get toasts(): EuiToastPropsWithId[] {\n return this.args.toasts ?? this.euiToaster.toasts;\n }\n\n /** Removes a dismissed toast from the service (`@toasts` belong to the caller). */\n removeToast(toast: EuiToastPropsWithId): void {\n if (!this.args.toasts) this.euiToaster.remove(toast);\n }\n\n get showClearAll(): boolean {\n const threshold =\n this.args.showClearAllButtonAt ?? CLEAR_ALL_TOASTS_THRESHOLD_DEFAULT;\n const count = this.toasts.length;\n return Boolean(count && threshold && count >= threshold);\n }\n\n get showBadge(): boolean {\n return Boolean(this.args.showNotificationBadge && this.toasts.length);\n }\n\n get hasContent(): boolean {\n return this.toasts.length > 0;\n }\n\n get clearAllLabel(): string {\n return this.euiI18n.lookupToken(\n 'euiGlobalToastList.clearAllToastsButtonAriaLabel',\n 'Clear all toast notifications'\n );\n }\n\n get clearAllText(): string {\n return this.euiI18n.lookupToken(\n 'euiGlobalToastList.clearAllToastsButtonDisplayText',\n 'Clear all'\n );\n }\n\n startScrollingToBottom(): void {\n this.isScrollingToBottom = true;\n\n const scrollToBottom = () => {\n // Although we cancel the requestAnimationFrame in willDestroy,\n // it's possible for this.listElement to become null in the meantime\n if (!this.listElement) {\n return;\n }\n\n const position = this.listElement.scrollTop;\n const destination =\n this.listElement.scrollHeight - this.listElement.clientHeight;\n const distanceToDestination = destination - position;\n\n if (distanceToDestination < 5) {\n this.listElement.scrollTop = destination;\n this.isScrollingToBottom = false;\n this.isScrolledToBottom = true;\n\n return;\n }\n\n this.listElement.scrollTop = position + distanceToDestination * 0.25;\n\n if (this.isScrollingToBottom) {\n this.isScrollingAnimationFrame =\n window.requestAnimationFrame(scrollToBottom);\n }\n };\n\n this.startScrollingAnimationFrame =\n window.requestAnimationFrame(scrollToBottom);\n }\n\n @action\n didInsertToast(toast: EuiToastPropsWithId): void {\n // Toasts present at construction are already scheduled.\n if (!this.toastIdToTimerMap[toast.id]) {\n this.scheduleToastForDismissal(toast);\n }\n\n // If the user has scrolled up the toast list then we don't want to annoy\n // them by scrolling all the way back to the bottom.\n if (!this.isUserInteracting && this.isScrolledToBottom) {\n this.startScrollingToBottom();\n }\n }\n\n isHovered = false;\n isFocused = false;\n\n @action\n onMouseEnter(): void {\n this.isHovered = true;\n this.pauseTimers();\n }\n\n @action\n onMouseLeave(): void {\n this.isHovered = false;\n this.resumeTimers();\n }\n\n @action\n onFocusIn(): void {\n this.isFocused = true;\n this.pauseTimers();\n }\n\n @action\n onFocusOut(): void {\n this.isFocused = false;\n this.resumeTimers();\n }\n\n /**\n * Upstream pauses on mouse enter and on focus inside a toast. Hover and\n * focus are tracked separately so that leaving one (e.g. a focused toast\n * being removed) does not resume the timers while the other still holds.\n */\n pauseTimers(): void {\n // Stop scrolling to bottom if we're in mid-scroll, because the user wants to interact with\n // the list.\n this.isScrollingToBottom = false;\n this.isUserInteracting = true;\n\n // Don't let toasts dismiss themselves while the user is interacting with them.\n for (const toastId in this.toastIdToTimerMap) {\n if (Object.prototype.hasOwnProperty.call(this.toastIdToTimerMap, toastId)) {\n const timer = this.toastIdToTimerMap[toastId];\n // only running timers (pausing twice would lose time)\n if (timer?.id !== undefined) timer.pause();\n }\n }\n }\n\n resumeTimers(): void {\n if (this.isHovered || this.isFocused || !this.isUserInteracting) return;\n this.isUserInteracting = false;\n\n for (const toastId in this.toastIdToTimerMap) {\n if (Object.prototype.hasOwnProperty.call(this.toastIdToTimerMap, toastId)) {\n const timer = this.toastIdToTimerMap[toastId];\n // only paused timers (resuming twice would schedule twice)\n if (timer && timer.id === undefined && timer.timeRemaining !== undefined)\n timer.resume();\n }\n }\n }\n\n @action\n onScroll(): void {\n // Upstream: only the user's own scrolling decides whether the list stays\n // pinned to the bottom (the list scrolls itself when toasts are added).\n if (this.listElement && this.isUserInteracting) {\n this.isScrolledToBottom =\n this.listElement.scrollHeight - this.listElement.scrollTop ===\n this.listElement.clientHeight;\n }\n }\n\n scheduleAllToastsForDismissal(): void {\n this.toasts.forEach((toast) => {\n if (!this.toastIdToTimerMap[toast.id]) {\n this.scheduleToastForDismissal(toast);\n }\n });\n }\n\n @action\n scheduleToastForDismissal(toast: EuiToastPropsWithId): void {\n // Start fading the toast out once its lifetime elapses.\n this.toastIdToTimerMap[toast.id] = new Timer(\n this.dismissToast.bind(this, toast),\n this.lifeTimeFor(toast) as number\n );\n }\n\n @action\n dismissToast(toast: EuiToastPropsWithId): void {\n // Remove the toast after it's done fading out.\n this.dismissTimeoutIds.push(\n window.setTimeout(() => {\n // It is possible to double-dismiss a toast (e.g. by double-clicking\n // its \"x\" button): only the first dismissal counts.\n if (Object.prototype.hasOwnProperty.call(this.toastIdToTimerMap, toast.id)) {\n if (this.args.dismissToast) {\n this.args.dismissToast.apply(this, [toast]);\n }\n\n this.toastIdToTimerMap[toast.id]!.clear();\n delete this.toastIdToTimerMap[toast.id];\n\n const dismissed = { ...this.toastIdToDismissedMap };\n delete dismissed[toast.id];\n this.toastIdToDismissedMap = dismissed;\n this.removeToast(toast);\n }\n }, TOAST_FADE_OUT_MS)\n );\n\n this.toastIdToDismissedMap = {\n ...this.toastIdToDismissedMap,\n [toast.id]: true\n };\n }\n\n /** Upstream \"Clear all\": dismisses every toast at once (no fade out). */\n @action\n clearAll(): void {\n for (const toast of [...this.toasts]) {\n this.args.dismissToast?.apply(this, [toast]);\n this.toastIdToTimerMap[toast.id]?.clear();\n delete this.toastIdToTimerMap[toast.id];\n this.removeToast(toast);\n }\n this.toastIdToDismissedMap = {};\n this.args.onClearAllToasts?.();\n }\n\n @action\n closeToast(toast: EuiToastPropsWithId): void {\n this.dismissToast(toast);\n toast.onClose?.();\n }\n\n @action\n didInsert(element: Element): void {\n this.listElement = element;\n }\n\n willDestroy(): void {\n super.willDestroy();\n\n if (this.isScrollingAnimationFrame !== 0) {\n window.cancelAnimationFrame(this.isScrollingAnimationFrame);\n }\n\n if (this.startScrollingAnimationFrame !== 0) {\n window.cancelAnimationFrame(this.startScrollingAnimationFrame);\n }\n\n this.dismissTimeoutIds.forEach(clearTimeout);\n\n for (const toastId in this.toastIdToTimerMap) {\n if (Object.prototype.hasOwnProperty.call(this.toastIdToTimerMap, toastId)) {\n this.toastIdToTimerMap[toastId]?.clear();\n }\n }\n\n this.listElement = null;\n }\n\n // No whitespace inside the list: without toasts it must match `:empty`\n // (upstream's padding rules).\n <template>\n <div\n aria-live=\"polite\"\n role=\"log\"\n class=\"euiGlobalToastList {{this.classes}}\"\n {{didInsert this.didInsert}}\n {{on \"scroll\" this.onScroll}}\n {{on \"mouseenter\" this.onMouseEnter}}\n {{on \"mouseleave\" this.onMouseLeave}}\n ...attributes\n >{{#if this.hasContent~}}\n <div class={{this.contentClass}}>\n {{#if this.showBadge}}\n <EuiNotificationBadge\n class=\"euiGlobalToastList__countBadge\"\n data-test-subj=\"euiGlobalToastListNotificationBadge\"\n @size=\"m\"\n @color=\"subdued\"\n @css={{this.badgeCss}}\n >{{this.toasts.length}}</EuiNotificationBadge>\n {{/if}}\n {{#each this.toasts key=\"id\" as |toast|}}\n <EuiToast\n class=\"euiGlobalToastListItem\"\n @css={{this.itemCssFor toast.id}}\n @animationMs={{this.lifeTimeFor toast}}\n @title={{toast.title}}\n @useMarkdownFormat={{toast.useMarkdownFormat}}\n @body={{toast.body}}\n @text={{toast.text}}\n @color={{toast.color}}\n @iconType={{toast.iconType}}\n @actionProps={{toast.actionProps}}\n @onClose={{fn this.closeToast toast}}\n {{didInsert (fn this.didInsertToast toast)}}\n {{on \"focusin\" this.onFocusIn}}\n {{on \"focusout\" this.onFocusOut}}\n />\n {{/each}}\n {{#if this.showClearAll}}\n <EuiButton\n class=\"euiGlobalToastListItem\"\n @fullWidth={{true}}\n @size=\"s\"\n @color=\"text\"\n @css={{this.clearAllCss}}\n aria-label={{this.clearAllLabel}}\n data-test-subj=\"euiClearAllToastsButton\"\n {{on \"click\" this.clearAll}}\n >{{this.clearAllText}}</EuiButton>\n {{/if}}\n </div>\n {{~/if}}</div>\n </template>\n}\n"],"names":["TOAST_FADE_OUT_MS","CLEAR_ALL_TOASTS_THRESHOLD_DEFAULT","EuiGlobalToastList","Component","g","prototype","service","i","dismissTimeoutIds","toastIdToTimerMap","isScrollingToBottom","isScrolledToBottom","isUserInteracting","isScrollingAnimationFrame","startScrollingAnimationFrame","listElement","tracked","constructor","owner","args","scheduleAllToastsForDismissal","context","getEuiThemeContext","side","styles","useEuiBorealisStyles","euiGlobalToastListStyles","n","cached","itemStyles","euiGlobalToastListItemStyles","classes","euiClass","boxSizing","euiGlobalToastList","contentClass","content","itemCss","euiGlobalToastListItem","dismissedItemCss","dismissed","clearAllCss","euiGlobalToastListDismissButton","badgeCss","badge","notificationBadge","toasts","toastIdToDismissedMap","firstDismissed","id","allDismissed","every","toast","hasFadeOut","itemCssFor","lifeTimeFor","toastLifeTimeMs","euiToaster","removeToast","remove","showClearAll","threshold","showClearAllButtonAt","count","length","Boolean","showBadge","showNotificationBadge","hasContent","clearAllLabel","euiI18n","lookupToken","clearAllText","startScrollingToBottom","scrollToBottom","position","scrollTop","destination","scrollHeight","clientHeight","distanceToDestination","window","requestAnimationFrame","didInsertToast","scheduleToastForDismissal","action","isHovered","isFocused","onMouseEnter","pauseTimers","onMouseLeave","resumeTimers","onFocusIn","onFocusOut","toastId","Object","hasOwnProperty","call","timer","undefined","pause","timeRemaining","resume","onScroll","forEach","Timer","dismissToast","bind","push","setTimeout","apply","clear","clearAll","onClearAllToasts","closeToast","onClose","didInsert","element","willDestroy","cancelAnimationFrame","clearTimeout","setComponentTemplate","precompileTemplate","strictMode","scope","on","EuiNotificationBadge","EuiToast","fn","EuiButton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eui-global-toast-list.js","sources":["../../src/components/eui-global-toast-list.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { fn } from '@ember/helper';\nimport { on } from '@ember/modifier';\nimport { action } from '@ember/object';\nimport didInsert from '@ember/render-modifiers/modifiers/did-insert';\nimport willDestroy from '@ember/render-modifiers/modifiers/will-destroy';\nimport { service } from '@ember/service';\nimport type Owner from '@ember/owner';\n\nimport { getEuiThemeContext } from '../utils/emotion/consume.ts';\nimport { euiClass, useEuiBorealisStyles } from '../utils/eui/styles.ts';\nimport {\n euiGlobalToastListItemStyles,\n euiGlobalToastListStyles\n} from '../utils/eui/styles.generated.ts';\nimport Timer from '../utils/timer.ts';\nimport EuiButton from './eui-button.gts';\nimport EuiNotificationBadge from './eui-notification-badge.gts';\nimport EuiToast from './eui-toast.gts';\n\nimport type EuiI18n from '../services/eui-i18n';\nimport type EuiToasterService from '../services/eui-toaster';\nimport type {\n EuiToastProps,\n EuiToastPropsWithId\n} from '../services/eui-toaster';\nimport type { EuiCss } from '../utils/eui/styles.ts';\n\nexport type EuiToastSide = 'left' | 'right';\n\n/** One entry of `@toasts` (upstream `Toast`): EuiToast's args plus an id. */\nexport interface EuiGlobalToast extends EuiToastProps {\n /** Unique id of the toast. */\n id: string;\n}\n\ntype GlobalToastListArgs = {\n /**\n * The toasts to show, as data (upstream's `toasts`). Without it, the list\n * shows the toasts of the `euiToaster` service. The list never changes\n * this array: remove a toast from it in `@dismissToast`.\n */\n toasts?: EuiGlobalToast[];\n /**\n * Called when a toast is dismissed (its close button or its time ran\n * out, after the fade out). With `@toasts`, remove the toast from the\n * array here; without it, the toast is then removed from the `euiToaster`\n * service. \"Clear all\" calls it for every toast.\n */\n dismissToast?: (this: EuiGlobalToastList, toast: EuiToastProps) => void;\n /**\n * How long toasts stay, in ms, unless a toast sets its own\n * `toastLifeTimeMs`. Hovering or focusing the list pauses the timers.\n * Each toast's highlight bar counts this time down.\n */\n toastLifeTimeMs: number;\n /**\n * Which side of the browser window the toasts appear on: `'right'` or\n * `'left'`. Below the `m` breakpoint the list spans the window.\n * Defaults to `'right'`.\n */\n side?: EuiToastSide;\n /**\n * Shows a \"Clear all\" button once there are at least this many toasts;\n * `0` (or `false`) hides it. Defaults to `3`.\n */\n showClearAllButtonAt?: number | false;\n /** Called after \"Clear all\" dismissed every toast. */\n onClearAllToasts?: () => void;\n /** Shows a badge with the number of toasts. Defaults to `false`. */\n showNotificationBadge?: boolean;\n};\n\n/** Upstream `TOAST_FADE_OUT_MS`. */\nexport const TOAST_FADE_OUT_MS = 250;\n/** Upstream `CLEAR_ALL_TOASTS_THRESHOLD_DEFAULT`. */\nexport const CLEAR_ALL_TOASTS_THRESHOLD_DEFAULT = 3;\n\n/**\n * Renders the toasts of the `euiToaster` service. Place it once in the\n * application template, then show toasts from anywhere:\n * `this.euiToaster.show({ title: 'Saved', color: 'success' })`.\n */\nexport interface EuiGlobalToastListItemSignature {\n Element: HTMLDivElement;\n Args: GlobalToastListArgs;\n}\n\n/** Native Ember toast list on the upstream EUI 123 / Borealis factories. */\nexport default class EuiGlobalToastList extends Component<EuiGlobalToastListItemSignature> {\n @service declare euiToaster: EuiToasterService;\n @service declare euiI18n: EuiI18n;\n\n /** Pending fade-out timeouts, by toast id (pruned when they fire). */\n dismissTimeoutIds = new Map<string, number>();\n toastIdToTimerMap: { [toastId: string]: Timer } = {};\n\n isScrollingToBottom = false;\n isScrolledToBottom = true;\n isUserInteracting = false;\n\n // See [Return Value](https://developer.mozilla.org/en-US/docs/Web/API/Window/requestAnimationFrame#Return_value)\n // for information on initial value of 0\n isScrollingAnimationFrame = 0;\n startScrollingAnimationFrame = 0;\n\n listElement: Element | null = null;\n @tracked toastIdToDismissedMap: {\n [toastId: string]: boolean;\n } = {};\n\n constructor(owner: Owner, args: GlobalToastListArgs) {\n super(owner, args);\n this.scheduleAllToastsForDismissal();\n }\n\n get context() {\n return getEuiThemeContext(this);\n }\n\n get side(): EuiToastSide {\n return this.args.side === 'left' ? 'left' : 'right';\n }\n\n @cached\n get styles() {\n return useEuiBorealisStyles(this.context, euiGlobalToastListStyles);\n }\n\n @cached\n get itemStyles() {\n return useEuiBorealisStyles(this.context, euiGlobalToastListItemStyles);\n }\n\n @cached\n get classes(): string {\n return euiClass(\n this.context,\n { boxSizing: 'border-box' },\n this.styles.euiGlobalToastList,\n this.styles[this.side]\n );\n }\n\n @cached\n get contentClass(): string {\n return euiClass(this.context, this.styles.content);\n }\n\n /** List item styles composed into each EuiToast's own class (`@css`). */\n @cached\n get itemCss(): EuiCss {\n return this.itemStyles.euiGlobalToastListItem;\n }\n\n @cached\n get dismissedItemCss(): EuiCss {\n return [this.itemStyles.euiGlobalToastListItem, this.itemStyles.dismissed];\n }\n\n /** Upstream: the list item styles plus the dismiss button's, on EuiButton. */\n @cached\n get clearAllCss(): EuiCss {\n return [\n this.itemStyles.euiGlobalToastListItem,\n this.styles.euiGlobalToastListDismissButton\n ];\n }\n\n /** Upstream's `css` on the count EuiNotificationBadge. */\n @cached\n get badgeCss(): EuiCss {\n const badge = this.styles.notificationBadge;\n const toasts = this.toasts;\n const dismissed = this.toastIdToDismissedMap;\n const firstDismissed = toasts[0] ? dismissed[toasts[0].id] : false;\n const allDismissed = toasts.every((toast) => dismissed[toast.id]);\n return [\n badge.notificationBadge,\n (firstDismissed || allDismissed) && badge.hasFadeOut\n ];\n }\n\n itemCssFor = (id: string): EuiCss =>\n this.toastIdToDismissedMap[id] ? this.dismissedItemCss : this.itemCss;\n\n lifeTimeFor = (toast: EuiToastPropsWithId): number | undefined =>\n toast.toastLifeTimeMs ?? this.args.toastLifeTimeMs;\n\n /** `@toasts` when given, else the `euiToaster` service's toasts. */\n get toasts(): EuiToastPropsWithId[] {\n return this.args.toasts ?? this.euiToaster.toasts;\n }\n\n /** Removes a dismissed toast from the service (`@toasts` belong to the caller). */\n removeToast(toast: EuiToastPropsWithId): void {\n if (!this.args.toasts) this.euiToaster.remove(toast);\n }\n\n get showClearAll(): boolean {\n const threshold =\n this.args.showClearAllButtonAt ?? CLEAR_ALL_TOASTS_THRESHOLD_DEFAULT;\n const count = this.toasts.length;\n return Boolean(count && threshold && count >= threshold);\n }\n\n get showBadge(): boolean {\n return Boolean(this.args.showNotificationBadge && this.toasts.length);\n }\n\n get hasContent(): boolean {\n return this.toasts.length > 0;\n }\n\n get clearAllLabel(): string {\n return this.euiI18n.lookupToken(\n 'euiGlobalToastList.clearAllToastsButtonAriaLabel',\n 'Clear all toast notifications'\n );\n }\n\n get clearAllText(): string {\n return this.euiI18n.lookupToken(\n 'euiGlobalToastList.clearAllToastsButtonDisplayText',\n 'Clear all'\n );\n }\n\n startScrollingToBottom(): void {\n this.isScrollingToBottom = true;\n\n const scrollToBottom = () => {\n // Although we cancel the requestAnimationFrame in willDestroy,\n // it's possible for this.listElement to become null in the meantime\n if (!this.listElement) {\n return;\n }\n\n const position = this.listElement.scrollTop;\n const destination =\n this.listElement.scrollHeight - this.listElement.clientHeight;\n const distanceToDestination = destination - position;\n\n if (distanceToDestination < 5) {\n this.listElement.scrollTop = destination;\n this.isScrollingToBottom = false;\n this.isScrolledToBottom = true;\n\n return;\n }\n\n this.listElement.scrollTop = position + distanceToDestination * 0.25;\n\n if (this.isScrollingToBottom) {\n this.isScrollingAnimationFrame =\n window.requestAnimationFrame(scrollToBottom);\n }\n };\n\n this.startScrollingAnimationFrame =\n window.requestAnimationFrame(scrollToBottom);\n }\n\n @action\n didInsertToast(toast: EuiToastPropsWithId): void {\n // Toasts present at construction are already scheduled.\n if (!this.toastIdToTimerMap[toast.id]) {\n this.scheduleToastForDismissal(toast);\n }\n\n // If the user has scrolled up the toast list then we don't want to annoy\n // them by scrolling all the way back to the bottom.\n if (!this.isUserInteracting && this.isScrolledToBottom) {\n this.startScrollingToBottom();\n }\n }\n\n isHovered = false;\n isFocused = false;\n\n @action\n onMouseEnter(): void {\n this.isHovered = true;\n this.pauseTimers();\n }\n\n @action\n onMouseLeave(): void {\n this.isHovered = false;\n this.resumeTimers();\n }\n\n @action\n onFocusIn(): void {\n this.isFocused = true;\n this.pauseTimers();\n }\n\n @action\n onFocusOut(): void {\n this.isFocused = false;\n this.resumeTimers();\n }\n\n /**\n * Upstream pauses on mouse enter and on focus inside a toast. Hover and\n * focus are tracked separately so that leaving one (e.g. a focused toast\n * being removed) does not resume the timers while the other still holds.\n */\n pauseTimers(): void {\n // Stop scrolling to bottom if we're in mid-scroll, because the user wants to interact with\n // the list.\n this.isScrollingToBottom = false;\n this.isUserInteracting = true;\n\n // Don't let toasts dismiss themselves while the user is interacting with them.\n for (const toastId in this.toastIdToTimerMap) {\n if (Object.prototype.hasOwnProperty.call(this.toastIdToTimerMap, toastId)) {\n const timer = this.toastIdToTimerMap[toastId];\n // only running timers (pausing twice would lose time)\n if (timer?.id !== undefined) timer.pause();\n }\n }\n }\n\n resumeTimers(): void {\n if (this.isHovered || this.isFocused || !this.isUserInteracting) return;\n this.isUserInteracting = false;\n\n for (const toastId in this.toastIdToTimerMap) {\n if (Object.prototype.hasOwnProperty.call(this.toastIdToTimerMap, toastId)) {\n const timer = this.toastIdToTimerMap[toastId];\n // only paused timers (resuming twice would schedule twice)\n if (timer && timer.id === undefined && timer.timeRemaining !== undefined)\n timer.resume();\n }\n }\n }\n\n @action\n onScroll(): void {\n // Upstream: only the user's own scrolling decides whether the list stays\n // pinned to the bottom (the list scrolls itself when toasts are added).\n if (this.listElement && this.isUserInteracting) {\n this.isScrolledToBottom =\n this.listElement.scrollHeight - this.listElement.scrollTop ===\n this.listElement.clientHeight;\n }\n }\n\n scheduleAllToastsForDismissal(): void {\n this.toasts.forEach((toast) => {\n if (!this.toastIdToTimerMap[toast.id]) {\n this.scheduleToastForDismissal(toast);\n }\n });\n }\n\n @action\n scheduleToastForDismissal(toast: EuiToastPropsWithId): void {\n // Start fading the toast out once its lifetime elapses.\n this.toastIdToTimerMap[toast.id] = new Timer(\n this.dismissToast.bind(this, toast),\n this.lifeTimeFor(toast) as number\n );\n }\n\n @action\n dismissToast(toast: EuiToastPropsWithId): void {\n // Remove the toast after it's done fading out.\n window.clearTimeout(this.dismissTimeoutIds.get(toast.id));\n this.dismissTimeoutIds.set(\n toast.id,\n window.setTimeout(() => {\n this.dismissTimeoutIds.delete(toast.id);\n // It is possible to double-dismiss a toast (e.g. by double-clicking\n // its \"x\" button): only the first dismissal counts.\n if (Object.prototype.hasOwnProperty.call(this.toastIdToTimerMap, toast.id)) {\n if (this.args.dismissToast) {\n this.args.dismissToast.apply(this, [toast]);\n }\n\n this.toastIdToTimerMap[toast.id]!.clear();\n delete this.toastIdToTimerMap[toast.id];\n\n const dismissed = { ...this.toastIdToDismissedMap };\n delete dismissed[toast.id];\n this.toastIdToDismissedMap = dismissed;\n this.removeToast(toast);\n }\n }, TOAST_FADE_OUT_MS)\n );\n\n this.toastIdToDismissedMap = {\n ...this.toastIdToDismissedMap,\n [toast.id]: true\n };\n }\n\n /**\n * A toast element is gone. When the app removed it from `@toasts` (rather\n * than this list dismissing it), drop its timers: they would otherwise\n * fire for a toast that no longer exists.\n */\n @action\n willDestroyToast(toast: EuiToastPropsWithId): void {\n if (this.isDestroying || this.isDestroyed) return;\n if (this.toasts.some((t) => t.id === toast.id)) return;\n\n window.clearTimeout(this.dismissTimeoutIds.get(toast.id));\n this.dismissTimeoutIds.delete(toast.id);\n this.toastIdToTimerMap[toast.id]?.clear();\n delete this.toastIdToTimerMap[toast.id];\n\n if (toast.id in this.toastIdToDismissedMap) {\n const dismissed = { ...this.toastIdToDismissedMap };\n delete dismissed[toast.id];\n this.toastIdToDismissedMap = dismissed;\n }\n }\n\n /** Upstream \"Clear all\": dismisses every toast at once (no fade out). */\n @action\n clearAll(): void {\n for (const toast of [...this.toasts]) {\n this.args.dismissToast?.apply(this, [toast]);\n this.toastIdToTimerMap[toast.id]?.clear();\n delete this.toastIdToTimerMap[toast.id];\n this.removeToast(toast);\n }\n this.toastIdToDismissedMap = {};\n this.args.onClearAllToasts?.();\n }\n\n @action\n closeToast(toast: EuiToastPropsWithId): void {\n this.dismissToast(toast);\n toast.onClose?.();\n }\n\n @action\n didInsert(element: Element): void {\n this.listElement = element;\n }\n\n willDestroy(): void {\n super.willDestroy();\n\n if (this.isScrollingAnimationFrame !== 0) {\n window.cancelAnimationFrame(this.isScrollingAnimationFrame);\n }\n\n if (this.startScrollingAnimationFrame !== 0) {\n window.cancelAnimationFrame(this.startScrollingAnimationFrame);\n }\n\n this.dismissTimeoutIds.forEach((id) => window.clearTimeout(id));\n this.dismissTimeoutIds.clear();\n\n for (const toastId in this.toastIdToTimerMap) {\n if (Object.prototype.hasOwnProperty.call(this.toastIdToTimerMap, toastId)) {\n this.toastIdToTimerMap[toastId]?.clear();\n }\n }\n\n this.listElement = null;\n }\n\n // No whitespace inside the list: without toasts it must match `:empty`\n // (upstream's padding rules).\n <template>\n <div\n aria-live=\"polite\"\n role=\"log\"\n class=\"euiGlobalToastList {{this.classes}}\"\n {{didInsert this.didInsert}}\n {{on \"scroll\" this.onScroll}}\n {{on \"mouseenter\" this.onMouseEnter}}\n {{on \"mouseleave\" this.onMouseLeave}}\n ...attributes\n >{{#if this.hasContent~}}\n <div class={{this.contentClass}}>\n {{#if this.showBadge}}\n <EuiNotificationBadge\n class=\"euiGlobalToastList__countBadge\"\n data-test-subj=\"euiGlobalToastListNotificationBadge\"\n @size=\"m\"\n @color=\"subdued\"\n @css={{this.badgeCss}}\n >{{this.toasts.length}}</EuiNotificationBadge>\n {{/if}}\n {{#each this.toasts key=\"id\" as |toast|}}\n <EuiToast\n class=\"euiGlobalToastListItem\"\n @css={{this.itemCssFor toast.id}}\n @animationMs={{this.lifeTimeFor toast}}\n @title={{toast.title}}\n @useMarkdownFormat={{toast.useMarkdownFormat}}\n @body={{toast.body}}\n @text={{toast.text}}\n @color={{toast.color}}\n @iconType={{toast.iconType}}\n @actionProps={{toast.actionProps}}\n @onClose={{fn this.closeToast toast}}\n {{didInsert (fn this.didInsertToast toast)}}\n {{willDestroy (fn this.willDestroyToast toast)}}\n {{on \"focusin\" this.onFocusIn}}\n {{on \"focusout\" this.onFocusOut}}\n />\n {{/each}}\n {{#if this.showClearAll}}\n <EuiButton\n class=\"euiGlobalToastListItem\"\n @fullWidth={{true}}\n @size=\"s\"\n @color=\"text\"\n @css={{this.clearAllCss}}\n aria-label={{this.clearAllLabel}}\n data-test-subj=\"euiClearAllToastsButton\"\n {{on \"click\" this.clearAll}}\n >{{this.clearAllText}}</EuiButton>\n {{/if}}\n </div>\n {{~/if}}</div>\n </template>\n}\n"],"names":["TOAST_FADE_OUT_MS","CLEAR_ALL_TOASTS_THRESHOLD_DEFAULT","EuiGlobalToastList","Component","g","prototype","service","i","dismissTimeoutIds","Map","toastIdToTimerMap","isScrollingToBottom","isScrolledToBottom","isUserInteracting","isScrollingAnimationFrame","startScrollingAnimationFrame","listElement","tracked","constructor","owner","args","scheduleAllToastsForDismissal","context","getEuiThemeContext","side","styles","useEuiBorealisStyles","euiGlobalToastListStyles","n","cached","itemStyles","euiGlobalToastListItemStyles","classes","euiClass","boxSizing","euiGlobalToastList","contentClass","content","itemCss","euiGlobalToastListItem","dismissedItemCss","dismissed","clearAllCss","euiGlobalToastListDismissButton","badgeCss","badge","notificationBadge","toasts","toastIdToDismissedMap","firstDismissed","id","allDismissed","every","toast","hasFadeOut","itemCssFor","lifeTimeFor","toastLifeTimeMs","euiToaster","removeToast","remove","showClearAll","threshold","showClearAllButtonAt","count","length","Boolean","showBadge","showNotificationBadge","hasContent","clearAllLabel","euiI18n","lookupToken","clearAllText","startScrollingToBottom","scrollToBottom","position","scrollTop","destination","scrollHeight","clientHeight","distanceToDestination","window","requestAnimationFrame","didInsertToast","scheduleToastForDismissal","action","isHovered","isFocused","onMouseEnter","pauseTimers","onMouseLeave","resumeTimers","onFocusIn","onFocusOut","toastId","Object","hasOwnProperty","call","timer","undefined","pause","timeRemaining","resume","onScroll","forEach","Timer","dismissToast","bind","clearTimeout","get","set","setTimeout","delete","apply","clear","willDestroyToast","isDestroying","isDestroyed","some","t","clearAll","onClearAllToasts","closeToast","onClose","didInsert","element","willDestroy","cancelAnimationFrame","setComponentTemplate","precompileTemplate","strictMode","scope","on","EuiNotificationBadge","EuiToast","fn","EuiButton"],"mappings":"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"}
|
|
@@ -200,6 +200,8 @@ class EuiMarkdownEditorDropZone extends Component {
|
|
|
200
200
|
this.isUploadingFiles = true;
|
|
201
201
|
const resolved = files.map((file, i) => Promise.resolve(fileHandlers[i].getFormattingForItem(file)));
|
|
202
202
|
void Promise.all(resolved).then(results => {
|
|
203
|
+
// The handlers are async: the editor may be gone by now
|
|
204
|
+
if (this.isDestroying || this.isDestroyed) return;
|
|
203
205
|
results.forEach(({
|
|
204
206
|
text,
|
|
205
207
|
config
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eui-markdown-editor-drop-zone.js","sources":["../../src/components/eui-markdown-editor-drop-zone.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { on } from '@ember/modifier';\nimport { action } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport didInsert from '@ember/render-modifiers/modifiers/did-insert';\n\nimport { getEuiThemeContext } from '../utils/emotion/consume.ts';\nimport { euiClass, useEuiBorealisStyles } from '../utils/eui/styles.ts';\nimport { euiMarkdownEditorDropZoneStyles } from '../utils/eui/styles.generated.ts';\nimport resizeObserver from '../modifiers/resize-observer.ts';\nimport EuiMarkdownEditorFooter from './eui-markdown-editor-footer.gts';\n\nimport type {\n EuiMarkdownDropHandler,\n EuiMarkdownStringTagConfig\n} from '../utils/markdown/markdown-types';\nimport type { EuiMarkdownEditorFooterSignature } from './eui-markdown-editor-footer';\nimport type { CSSObject } from '@emotion/css/create-instance';\n\n/** The hidden file input (react-dropzone's `getInputProps()`). */\nconst hiddenInput: CSSObject = { display: 'none' };\n\n/** Files (or drag items) no handler accepts, as upstream. */\nexport function getUnacceptedItems(\n items: ArrayLike<{ type: string }>,\n dropHandlers: EuiMarkdownDropHandler[]\n) {\n const unacceptedItems = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n\n if (!dropHandlers.some((handler) => handler.accepts(item.type))) {\n unacceptedItems.push(item);\n }\n }\n\n return unacceptedItems;\n}\n\n/** @private EuiMarkdownEditor's area accepting dropped or picked files. */\nexport interface EuiMarkdownEditorDropZoneSignature {\n Element: HTMLDivElement;\n Args: {\n /** The editor's plugins, for the footer's help. */\n uiPlugins?: EuiMarkdownEditorFooterSignature['Args']['uiPlugins'];\n /** Errors listed in the footer; they also mark the textarea invalid. */\n errors?: EuiMarkdownEditorFooterSignature['Args']['errors'];\n /** Handlers turning dropped files into markdown. None disables dropping. */\n dropHandlers?: EuiMarkdownDropHandler[];\n /** Inserts the markdown produced for a dropped file. */\n insertText?: (text: string, config: EuiMarkdownStringTagConfig) => void;\n /** A dropped file had no handler (owned by the editor). */\n hasUnacceptedItems?: boolean;\n /** Updates `@hasUnacceptedItems`. */\n setHasUnacceptedItems?: (value: boolean) => void;\n /** Called with the footer's height (px) when it changes. */\n setEditorFooterHeight?: (height: number) => void;\n /** Marks the textarea invalid (Ember `@isInvalid`). */\n isInvalid?: boolean;\n /** Renders the footer. Defaults to `true`. */\n showFooter?: boolean;\n /** Disables dropping and the footer buttons. */\n readOnly?: boolean;\n /** @deprecated Upload state is tracked internally. */\n isUploadingFiles?: boolean;\n };\n Blocks: {\n /** The textarea. */\n default: [];\n };\n}\n\nexport default class EuiMarkdownEditorDropZone extends Component<EuiMarkdownEditorDropZoneSignature> {\n @tracked isDragging = false;\n @tracked isDraggingError = false;\n @tracked isUploadingFiles = false;\n\n fileInput: HTMLInputElement | null = null;\n\n get dropHandlers() {\n return this.args.dropHandlers ?? [];\n }\n\n get isDisabled() {\n return this.dropHandlers.length === 0 || !!this.args.readOnly;\n }\n\n get showFooter() {\n return this.args.showFooter ?? true;\n }\n\n get hasError() {\n return (\n !!this.args.hasUnacceptedItems ||\n (this.args.errors?.length ?? 0) > 0 ||\n !!this.args.isInvalid\n );\n }\n\n @cached\n get styles() {\n const context = getEuiThemeContext(this);\n\n return {\n context,\n styles: useEuiBorealisStyles(context, euiMarkdownEditorDropZoneStyles)\n };\n }\n\n @cached\n get classes() {\n const { context, styles } = this.styles;\n\n return euiClass(\n context,\n styles.euiMarkdownEditorDropZone,\n this.isDragging && !this.isDraggingError ? styles.isDragging : undefined,\n this.isDraggingError ? styles.isDraggingError : undefined,\n this.hasError ? styles.hasError : undefined\n );\n }\n\n @cached\n get inputClass() {\n return euiClass(this.styles.context, hiddenInput);\n }\n\n setHasUnacceptedItems(value: boolean) {\n this.args.setHasUnacceptedItems?.(value);\n }\n\n /** dragenter/dragover: upstream's shared handler. */\n @action\n onDragOver(event: DragEvent) {\n if (this.isDisabled) return;\n\n // Allow dropping (react-dropzone always prevents the default here)\n event.preventDefault();\n\n let accepted: boolean;\n\n if (event.dataTransfer) {\n const unacceptedItems = getUnacceptedItems(\n event.dataTransfer.items,\n this.dropHandlers\n );\n\n this.setHasUnacceptedItems(unacceptedItems.length > 0);\n this.isDraggingError = unacceptedItems.length > 0;\n accepted = unacceptedItems.length === 0;\n } else {\n this.setHasUnacceptedItems(false);\n accepted = false;\n }\n\n this.isDragging = accepted;\n }\n\n @action\n onDragLeave(event: DragEvent) {\n if (this.isDisabled) return;\n\n const zone = event.currentTarget as HTMLElement;\n const next = event.relatedTarget as Node | null;\n\n // Moving between children of the zone is not leaving it\n if (next && zone.contains(next)) return;\n\n this.isDragging = false;\n }\n\n @action\n onDrop(event: DragEvent) {\n if (this.isDisabled) return;\n\n event.preventDefault();\n this.handleFiles(Array.from(event.dataTransfer?.files ?? []));\n }\n\n @action\n onInputChange(event: Event) {\n const input = event.target as HTMLInputElement;\n\n this.handleFiles(Array.from(input.files ?? []));\n input.value = '';\n }\n\n @action\n setFileInput(element: HTMLInputElement) {\n this.fileInput = element;\n }\n\n @action\n openFiles() {\n this.setHasUnacceptedItems(false);\n this.fileInput?.click();\n }\n\n footerFrame: number | null = null;\n\n /**\n * The textarea (a sibling of the footer) resizes in response, so report on\n * the next frame: resizing it inside this ResizeObserver delivery would\n * end the loop with undelivered notifications.\n */\n footerElement: HTMLElement | null = null;\n\n @action\n setFooterElement(element: HTMLElement) {\n this.footerElement = element;\n }\n\n @action\n onFooterResize({ height: rectHeight }: { height: number }) {\n // Layout height, not the (transform-scaled) bounding rect\n const height = this.footerElement?.offsetHeight ?? rectHeight;\n\n if (height === 0) return;\n\n if (this.footerFrame !== null) cancelAnimationFrame(this.footerFrame);\n\n this.footerFrame = requestAnimationFrame(() => {\n this.footerFrame = null;\n if (this.isDestroying || this.isDestroyed) return;\n run(() => this.args.setEditorFooterHeight?.(height));\n });\n }\n\n willDestroy() {\n super.willDestroy();\n if (this.footerFrame !== null) cancelAnimationFrame(this.footerFrame);\n }\n\n handleFiles(files: File[]) {\n const fileHandlers: EuiMarkdownDropHandler[] = [];\n\n // verify all files being dropped are supported\n for (const file of files) {\n const handler = this.dropHandlers.find((handler) =>\n handler.accepts(file.type)\n );\n\n if (!handler) {\n // if we get here then a file isn't handled\n this.setHasUnacceptedItems(true);\n this.isDragging = false;\n this.isDraggingError = false;\n\n return;\n }\n\n fileHandlers.push(handler);\n }\n\n this.isUploadingFiles = true;\n\n const resolved = files.map((file, i) =>\n Promise.resolve(fileHandlers[i]!.getFormattingForItem(file))\n );\n\n void Promise.all(resolved)\n .then((results) => {\n results.forEach(({ text, config }) =>\n this.args.insertText?.(text, config)\n );\n })\n .catch(() => {})\n .then(() => {\n if (this.isDestroying || this.isDestroyed) return;\n\n this.isDragging = false;\n this.isUploadingFiles = false;\n this.isDraggingError = false;\n });\n }\n\n <template>\n {{! Upstream unsets react-dropzone's role=\"button\": files are added with\n the footer's upload button, so the zone is not interactive itself. }}\n <div\n class=\"euiMarkdownEditorDropZone {{this.classes}}\"\n ...attributes\n {{on \"dragenter\" this.onDragOver}}\n {{on \"dragover\" this.onDragOver}}\n {{on \"dragleave\" this.onDragLeave}}\n {{on \"drop\" this.onDrop}}\n >\n {{yield}}\n {{#if this.showFooter}}\n <EuiMarkdownEditorFooter\n @uiPlugins={{@uiPlugins}}\n @errors={{@errors}}\n @dropHandlers={{this.dropHandlers}}\n @hasUnacceptedItems={{@hasUnacceptedItems}}\n @isUploadingFiles={{this.isUploadingFiles}}\n @openFiles={{this.openFiles}}\n @readOnly={{@readOnly}}\n {{didInsert this.setFooterElement}}\n {{resizeObserver \"height\" onResize=this.onFooterResize}}\n />\n {{/if}}\n <input\n class={{this.inputClass}}\n type=\"file\"\n multiple\n tabindex=\"-1\"\n autocomplete=\"off\"\n disabled={{this.isDisabled}}\n {{didInsert this.setFileInput}}\n {{on \"change\" this.onInputChange}}\n />\n </div>\n </template>\n}\n"],"names":["hiddenInput","display","getUnacceptedItems","items","dropHandlers","unacceptedItems","i","length","item","some","handler","accepts","type","push","EuiMarkdownEditorDropZone","Component","g","prototype","tracked","fileInput","args","isDisabled","readOnly","showFooter","hasError","hasUnacceptedItems","errors","isInvalid","styles","context","getEuiThemeContext","useEuiBorealisStyles","euiMarkdownEditorDropZoneStyles","n","cached","classes","euiClass","euiMarkdownEditorDropZone","isDragging","isDraggingError","undefined","inputClass","setHasUnacceptedItems","value","onDragOver","event","preventDefault","accepted","dataTransfer","action","onDragLeave","zone","currentTarget","next","relatedTarget","contains","onDrop","handleFiles","Array","from","files","onInputChange","input","target","setFileInput","element","openFiles","click","footerFrame","footerElement","setFooterElement","onFooterResize","height","rectHeight","offsetHeight","cancelAnimationFrame","requestAnimationFrame","isDestroying","isDestroyed","run","setEditorFooterHeight","willDestroy","fileHandlers","file","find","isUploadingFiles","resolved","map","Promise","resolve","getFormattingForItem","all","then","results","forEach","text","config","insertText","catch","setComponentTemplate","precompileTemplate","strictMode","scope","on","EuiMarkdownEditorFooter","didInsert","resizeObserver"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eui-markdown-editor-drop-zone.js","sources":["../../src/components/eui-markdown-editor-drop-zone.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { on } from '@ember/modifier';\nimport { action } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport didInsert from '@ember/render-modifiers/modifiers/did-insert';\n\nimport { getEuiThemeContext } from '../utils/emotion/consume.ts';\nimport { euiClass, useEuiBorealisStyles } from '../utils/eui/styles.ts';\nimport { euiMarkdownEditorDropZoneStyles } from '../utils/eui/styles.generated.ts';\nimport resizeObserver from '../modifiers/resize-observer.ts';\nimport EuiMarkdownEditorFooter from './eui-markdown-editor-footer.gts';\n\nimport type {\n EuiMarkdownDropHandler,\n EuiMarkdownStringTagConfig\n} from '../utils/markdown/markdown-types';\nimport type { EuiMarkdownEditorFooterSignature } from './eui-markdown-editor-footer';\nimport type { CSSObject } from '@emotion/css/create-instance';\n\n/** The hidden file input (react-dropzone's `getInputProps()`). */\nconst hiddenInput: CSSObject = { display: 'none' };\n\n/** Files (or drag items) no handler accepts, as upstream. */\nexport function getUnacceptedItems(\n items: ArrayLike<{ type: string }>,\n dropHandlers: EuiMarkdownDropHandler[]\n) {\n const unacceptedItems = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n\n if (!dropHandlers.some((handler) => handler.accepts(item.type))) {\n unacceptedItems.push(item);\n }\n }\n\n return unacceptedItems;\n}\n\n/** @private EuiMarkdownEditor's area accepting dropped or picked files. */\nexport interface EuiMarkdownEditorDropZoneSignature {\n Element: HTMLDivElement;\n Args: {\n /** The editor's plugins, for the footer's help. */\n uiPlugins?: EuiMarkdownEditorFooterSignature['Args']['uiPlugins'];\n /** Errors listed in the footer; they also mark the textarea invalid. */\n errors?: EuiMarkdownEditorFooterSignature['Args']['errors'];\n /** Handlers turning dropped files into markdown. None disables dropping. */\n dropHandlers?: EuiMarkdownDropHandler[];\n /** Inserts the markdown produced for a dropped file. */\n insertText?: (text: string, config: EuiMarkdownStringTagConfig) => void;\n /** A dropped file had no handler (owned by the editor). */\n hasUnacceptedItems?: boolean;\n /** Updates `@hasUnacceptedItems`. */\n setHasUnacceptedItems?: (value: boolean) => void;\n /** Called with the footer's height (px) when it changes. */\n setEditorFooterHeight?: (height: number) => void;\n /** Marks the textarea invalid (Ember `@isInvalid`). */\n isInvalid?: boolean;\n /** Renders the footer. Defaults to `true`. */\n showFooter?: boolean;\n /** Disables dropping and the footer buttons. */\n readOnly?: boolean;\n /** @deprecated Upload state is tracked internally. */\n isUploadingFiles?: boolean;\n };\n Blocks: {\n /** The textarea. */\n default: [];\n };\n}\n\nexport default class EuiMarkdownEditorDropZone extends Component<EuiMarkdownEditorDropZoneSignature> {\n @tracked isDragging = false;\n @tracked isDraggingError = false;\n @tracked isUploadingFiles = false;\n\n fileInput: HTMLInputElement | null = null;\n\n get dropHandlers() {\n return this.args.dropHandlers ?? [];\n }\n\n get isDisabled() {\n return this.dropHandlers.length === 0 || !!this.args.readOnly;\n }\n\n get showFooter() {\n return this.args.showFooter ?? true;\n }\n\n get hasError() {\n return (\n !!this.args.hasUnacceptedItems ||\n (this.args.errors?.length ?? 0) > 0 ||\n !!this.args.isInvalid\n );\n }\n\n @cached\n get styles() {\n const context = getEuiThemeContext(this);\n\n return {\n context,\n styles: useEuiBorealisStyles(context, euiMarkdownEditorDropZoneStyles)\n };\n }\n\n @cached\n get classes() {\n const { context, styles } = this.styles;\n\n return euiClass(\n context,\n styles.euiMarkdownEditorDropZone,\n this.isDragging && !this.isDraggingError ? styles.isDragging : undefined,\n this.isDraggingError ? styles.isDraggingError : undefined,\n this.hasError ? styles.hasError : undefined\n );\n }\n\n @cached\n get inputClass() {\n return euiClass(this.styles.context, hiddenInput);\n }\n\n setHasUnacceptedItems(value: boolean) {\n this.args.setHasUnacceptedItems?.(value);\n }\n\n /** dragenter/dragover: upstream's shared handler. */\n @action\n onDragOver(event: DragEvent) {\n if (this.isDisabled) return;\n\n // Allow dropping (react-dropzone always prevents the default here)\n event.preventDefault();\n\n let accepted: boolean;\n\n if (event.dataTransfer) {\n const unacceptedItems = getUnacceptedItems(\n event.dataTransfer.items,\n this.dropHandlers\n );\n\n this.setHasUnacceptedItems(unacceptedItems.length > 0);\n this.isDraggingError = unacceptedItems.length > 0;\n accepted = unacceptedItems.length === 0;\n } else {\n this.setHasUnacceptedItems(false);\n accepted = false;\n }\n\n this.isDragging = accepted;\n }\n\n @action\n onDragLeave(event: DragEvent) {\n if (this.isDisabled) return;\n\n const zone = event.currentTarget as HTMLElement;\n const next = event.relatedTarget as Node | null;\n\n // Moving between children of the zone is not leaving it\n if (next && zone.contains(next)) return;\n\n this.isDragging = false;\n }\n\n @action\n onDrop(event: DragEvent) {\n if (this.isDisabled) return;\n\n event.preventDefault();\n this.handleFiles(Array.from(event.dataTransfer?.files ?? []));\n }\n\n @action\n onInputChange(event: Event) {\n const input = event.target as HTMLInputElement;\n\n this.handleFiles(Array.from(input.files ?? []));\n input.value = '';\n }\n\n @action\n setFileInput(element: HTMLInputElement) {\n this.fileInput = element;\n }\n\n @action\n openFiles() {\n this.setHasUnacceptedItems(false);\n this.fileInput?.click();\n }\n\n footerFrame: number | null = null;\n\n /**\n * The textarea (a sibling of the footer) resizes in response, so report on\n * the next frame: resizing it inside this ResizeObserver delivery would\n * end the loop with undelivered notifications.\n */\n footerElement: HTMLElement | null = null;\n\n @action\n setFooterElement(element: HTMLElement) {\n this.footerElement = element;\n }\n\n @action\n onFooterResize({ height: rectHeight }: { height: number }) {\n // Layout height, not the (transform-scaled) bounding rect\n const height = this.footerElement?.offsetHeight ?? rectHeight;\n\n if (height === 0) return;\n\n if (this.footerFrame !== null) cancelAnimationFrame(this.footerFrame);\n\n this.footerFrame = requestAnimationFrame(() => {\n this.footerFrame = null;\n if (this.isDestroying || this.isDestroyed) return;\n run(() => this.args.setEditorFooterHeight?.(height));\n });\n }\n\n willDestroy() {\n super.willDestroy();\n if (this.footerFrame !== null) cancelAnimationFrame(this.footerFrame);\n }\n\n handleFiles(files: File[]) {\n const fileHandlers: EuiMarkdownDropHandler[] = [];\n\n // verify all files being dropped are supported\n for (const file of files) {\n const handler = this.dropHandlers.find((handler) =>\n handler.accepts(file.type)\n );\n\n if (!handler) {\n // if we get here then a file isn't handled\n this.setHasUnacceptedItems(true);\n this.isDragging = false;\n this.isDraggingError = false;\n\n return;\n }\n\n fileHandlers.push(handler);\n }\n\n this.isUploadingFiles = true;\n\n const resolved = files.map((file, i) =>\n Promise.resolve(fileHandlers[i]!.getFormattingForItem(file))\n );\n\n void Promise.all(resolved)\n .then((results) => {\n // The handlers are async: the editor may be gone by now\n if (this.isDestroying || this.isDestroyed) return;\n\n results.forEach(({ text, config }) =>\n this.args.insertText?.(text, config)\n );\n })\n .catch(() => {})\n .then(() => {\n if (this.isDestroying || this.isDestroyed) return;\n\n this.isDragging = false;\n this.isUploadingFiles = false;\n this.isDraggingError = false;\n });\n }\n\n <template>\n {{! Upstream unsets react-dropzone's role=\"button\": files are added with\n the footer's upload button, so the zone is not interactive itself. }}\n <div\n class=\"euiMarkdownEditorDropZone {{this.classes}}\"\n ...attributes\n {{on \"dragenter\" this.onDragOver}}\n {{on \"dragover\" this.onDragOver}}\n {{on \"dragleave\" this.onDragLeave}}\n {{on \"drop\" this.onDrop}}\n >\n {{yield}}\n {{#if this.showFooter}}\n <EuiMarkdownEditorFooter\n @uiPlugins={{@uiPlugins}}\n @errors={{@errors}}\n @dropHandlers={{this.dropHandlers}}\n @hasUnacceptedItems={{@hasUnacceptedItems}}\n @isUploadingFiles={{this.isUploadingFiles}}\n @openFiles={{this.openFiles}}\n @readOnly={{@readOnly}}\n {{didInsert this.setFooterElement}}\n {{resizeObserver \"height\" onResize=this.onFooterResize}}\n />\n {{/if}}\n <input\n class={{this.inputClass}}\n type=\"file\"\n multiple\n tabindex=\"-1\"\n autocomplete=\"off\"\n disabled={{this.isDisabled}}\n {{didInsert this.setFileInput}}\n {{on \"change\" this.onInputChange}}\n />\n </div>\n </template>\n}\n"],"names":["hiddenInput","display","getUnacceptedItems","items","dropHandlers","unacceptedItems","i","length","item","some","handler","accepts","type","push","EuiMarkdownEditorDropZone","Component","g","prototype","tracked","fileInput","args","isDisabled","readOnly","showFooter","hasError","hasUnacceptedItems","errors","isInvalid","styles","context","getEuiThemeContext","useEuiBorealisStyles","euiMarkdownEditorDropZoneStyles","n","cached","classes","euiClass","euiMarkdownEditorDropZone","isDragging","isDraggingError","undefined","inputClass","setHasUnacceptedItems","value","onDragOver","event","preventDefault","accepted","dataTransfer","action","onDragLeave","zone","currentTarget","next","relatedTarget","contains","onDrop","handleFiles","Array","from","files","onInputChange","input","target","setFileInput","element","openFiles","click","footerFrame","footerElement","setFooterElement","onFooterResize","height","rectHeight","offsetHeight","cancelAnimationFrame","requestAnimationFrame","isDestroying","isDestroyed","run","setEditorFooterHeight","willDestroy","fileHandlers","file","find","isUploadingFiles","resolved","map","Promise","resolve","getFormattingForItem","all","then","results","forEach","text","config","insertText","catch","setComponentTemplate","precompileTemplate","strictMode","scope","on","EuiMarkdownEditorFooter","didInsert","resizeObserver"],"mappings":"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"}
|
|
@@ -53,7 +53,9 @@ const getCursorNode = (textareaRef, parsed) => {
|
|
|
53
53
|
if (node.children) {
|
|
54
54
|
for (let i = 0; i < node.children.length; i++) {
|
|
55
55
|
const child = node.children[i];
|
|
56
|
-
|
|
56
|
+
// Nodes made by plugins (e.g. remark-intraword-underscore) can have
|
|
57
|
+
// no position; upstream skips them too.
|
|
58
|
+
if (child && child.position && child.position.start.offset < selectionStart && selectionStart < child.position.end.offset) {
|
|
57
59
|
if (child.type === 'text') break outer; // don't dive into `text` nodes
|
|
58
60
|
node = child;
|
|
59
61
|
continue outer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eui-markdown-editor.js","sources":["../../src/components/eui-markdown-editor.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { hash } from '@ember/helper';\nimport { on } from '@ember/modifier';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport didInsert from '@ember/render-modifiers/modifiers/did-insert';\nimport didUpdate from '@ember/render-modifiers/modifiers/did-update';\nimport { scheduleOnce } from '@ember/runloop';\nimport type Owner from '@ember/owner';\n\nimport pick from '@nullvoxpopuli/ember-composable-helpers/helpers/pick';\nimport { modifier } from 'ember-modifier';\nimport set from 'ember-set-helper/helpers/set';\nimport style from 'ember-style-modifier/modifiers/style';\nimport unified from 'unified';\n\nimport { argOrDefaultDecorator } from '../helpers/arg-or-default.ts';\nimport resizeObserver from '../modifiers/resize-observer.ts';\nimport { getEuiThemeContext } from '../utils/emotion/consume.ts';\nimport { euiClass, useEuiBorealisStyles } from '../utils/eui/styles.ts';\nimport { euiMarkdownEditorStyles } from '../utils/eui/styles.generated.ts';\nimport validatableControl from '../modifiers/validatable-control.ts';\nimport MarkdownActions, {\n insertText\n} from '../utils/markdown/markdown-actions.ts';\nimport {\n MODE_EDITING,\n MODE_VIEWING\n} from '../utils/markdown/markdown-modes.ts';\nimport {\n defaultParsingPlugins,\n defaultProcessingPlugins,\n defaultUiPlugins\n} from '../utils/markdown/plugins/markdown-default-plugins/index.ts';\nimport EuiMarkdownEditorDropZone from './eui-markdown-editor-drop-zone.gts';\nimport EuiMarkdownEditorTextArea from './eui-markdown-editor-text-area.gts';\nimport EuiMarkdownEditorToolbar from './eui-markdown-editor-toolbar.gts';\nimport EuiMarkdownFormat from './eui-markdown-format.gts';\nimport EuiModal from './eui-modal.gts';\n\nimport type {\n EuiMarkdownAstNode,\n EuiMarkdownAstNodePosition,\n EuiMarkdownDropHandler,\n EuiMarkdownEditorUiPlugin,\n EuiMarkdownParseError,\n EuiMarkdownStringTagConfig\n} from '../utils/markdown/markdown-types';\nimport type { CSSObject } from '@emotion/css/create-instance';\nimport type { EuiMarkdownEditorTextAreaSignature } from './eui-markdown-editor-text-area';\nimport type {\n EuiMarkdownEditorToolbarArgs,\n EuiMarkdownEditorToolbarSignature\n} from './eui-markdown-editor-toolbar';\nimport type { EuiMarkdownFormatSignature } from './eui-markdown-format.gts';\nimport type { Processor } from 'unified';\n\n/** Stands in for React EUI's global `box-sizing` reset. */\nconst editorReset: CSSObject = {\n boxSizing: 'border-box',\n '& :where(*, *::before, *::after)': { boxSizing: 'border-box' }\n};\n\nexport interface EuiMarkdownEditorArgs {\n /**\n * Starts in `'editing'` (textarea) or `'viewing'` (preview) mode.\n * Defaults to `'editing'`.\n */\n initialViewMode?: string;\n /** Id of the editor. Defaults to a generated id. */\n editorId?: string;\n /**\n * The UI plugins of the toolbar (a button per plugin after the built-in\n * bold, lists, … buttons) and of the syntax help. Defaults to\n * `getDefaultEuiMarkdownUiPlugins()` (the tooltip plugin): as upstream,\n * the list you pass replaces the defaults, so add yours to that list\n * (`[...getDefaultEuiMarkdownUiPlugins(), myPlugin]`) to keep them.\n */\n uiPlugins?: EuiMarkdownEditorUiPlugin[];\n /**\n * remark plugins parsing the markdown. Defaults to\n * `getDefaultEuiMarkdownParsingPlugins()`; extend that list to add syntax.\n */\n parsingPluginList?: typeof defaultParsingPlugins;\n /**\n * Plugins turning the parsed markdown into the preview. Defaults to\n * `getDefaultEuiMarkdownProcessingPlugins()`; extend it to render custom\n * nodes with your components.\n */\n processingPluginList?: typeof defaultProcessingPlugins;\n /** The markdown text. Update it in `@onChange`. */\n value: string;\n /** Called with the new markdown text on every change. */\n onChange: (str: string) => void;\n /**\n * Called after each parse with the error (or `null`) and\n * `{ messages, ast }`, e.g. to show plugin validation messages.\n */\n onParse?: (\n parseError: unknown | null,\n parsed: { messages: any[]; ast: any }\n ) => void;\n /**\n * Height of the editor in px, or `'full'` to fill its container.\n * Defaults to `250`.\n */\n height?: number | string;\n /** Maximum height in px when the textarea grows. Defaults to `500`. */\n maxHeight?: number | string;\n /** Grows the preview to fit its content. Defaults to `true`. */\n autoExpandPreview?: boolean;\n /** Disables the textarea. */\n disabled?: boolean;\n /**\n * Marks the textarea invalid: native validity, `aria-invalid` and the\n * danger state styling.\n */\n isInvalid?: boolean;\n /**\n * Read-only: the textarea is `readonly`, toolbar/footer buttons are\n * disabled, file drops are ignored and preview checkboxes do not toggle.\n */\n readOnly?: boolean;\n /**\n * Errors listed in the footer's error popover (e.g. from `@onParse`\n * messages). Any error also gives the textarea the danger state.\n */\n errors?: EuiMarkdownParseError[];\n /**\n * Handlers turning dropped or picked files into markdown:\n * `{ supportedFiles, accepts(type), getFormattingForItem(file) }`. Any\n * handler adds the footer's upload button. Defaults to none.\n */\n dropHandlers?: EuiMarkdownDropHandler[];\n /** Renders the footer (upload, errors and syntax help). Defaults to `true`. */\n showFooter?: boolean;\n /**\n * Customizes the toolbar: `className` is added to it, and `right` (text\n * or a component, e.g. a template-only component rendering an\n * `EuiButton`) replaces the preview/editor switch on its right side.\n */\n toolbarProps?: {\n className?: string;\n right?: EuiMarkdownEditorToolbarArgs['right'];\n };\n /** Accessible label of the textarea. */\n ariaLabel?: string;\n /** Id of the element labelling the textarea (e.g. a form row label). */\n ariaLabelledBy?: string;\n /** Id of the element describing the textarea. */\n ariaDescribedBy?: string;\n /**\n * Further args for the preview's `EuiMarkdownFormat` (upstream's\n * `markdownFormatProps`): `rootClasses`, `textSize`, `color`,\n * `shouldIncludeDefaultRootClasses`, `grow`, `textAlign` and `component`.\n * They win over the `@format…` args.\n */\n markdownFormatProps?: Pick<\n EuiMarkdownFormatSignature['Args'],\n | 'rootClasses'\n | 'textSize'\n | 'color'\n | 'shouldIncludeDefaultRootClasses'\n | 'grow'\n | 'textAlign'\n | 'component'\n >;\n /** `@rootClasses` of the preview's EuiMarkdownFormat. */\n formatRootClasses?: EuiMarkdownFormatSignature['Args']['rootClasses'];\n /** `@textSize` of the preview's EuiMarkdownFormat. */\n formatTextSize?: EuiMarkdownFormatSignature['Args']['textSize'];\n /** `@color` of the preview's EuiMarkdownFormat. */\n formatColor?: EuiMarkdownFormatSignature['Args']['color'];\n /** `@shouldIncludeDefaultRootClasses` of the preview's EuiMarkdownFormat. */\n formatShouldIncludeDefaultRootClasses?: EuiMarkdownFormatSignature['Args']['shouldIncludeDefaultRootClasses'];\n}\n\n/**\n * A markdown textarea with a formatting toolbar, a preview, file drop and\n * extensible syntax (plugins). Attributes go to the `<textarea>`.\n */\nexport interface EuiMarkdownEditorSignature {\n Element: EuiMarkdownEditorTextAreaSignature['Element'];\n Args: EuiMarkdownEditorArgs;\n Blocks: {\n /** Unused. */\n default: [];\n };\n}\n\nexport const getCursorNode = (\n textareaRef: HTMLTextAreaElement,\n parsed: any\n): EuiMarkdownAstNode => {\n const { selectionStart } = textareaRef;\n\n let node: EuiMarkdownAstNode = parsed.result ?? parsed.contents;\n\n \n outer: while (true) {\n if (node.children) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n\n if (\n child &&\n child.position.start.offset < (selectionStart as number) &&\n (selectionStart as number) < child.position.end.offset\n ) {\n if (child.type === 'text') break outer; // don't dive into `text` nodes\n node = child;\n continue outer;\n }\n }\n }\n\n break;\n }\n\n return node;\n};\n\nfunction wrapper(\n textarea: HTMLTextAreaElement,\n parsed: any,\n callback: (node: EuiMarkdownAstNode) => void\n) {\n const node = getCursorNode(textarea, parsed);\n\n callback(node);\n}\n\nexport const getCursorNodeModifier = modifier(function getCursorNodeModifier(\n textarea: EuiMarkdownEditorTextAreaSignature['Element'],\n [parsed, onSelectedNode]: [any, (node: Node) => void]\n) {\n //@ts-expect-error\n const fn = wrapper.bind(null, textarea, parsed, onSelectedNode);\n\n textarea.addEventListener('keyup', fn);\n textarea.addEventListener('mouseup', fn);\n\n return () => {\n textarea.removeEventListener('keyup', fn);\n textarea.removeEventListener('mouseup', fn);\n };\n});\n\nfunction isNewLine(char: string | undefined): boolean {\n if (char == null) return true;\n\n return !!char.match(/[\\r\\n]/);\n}\n\nfunction padWithNewlinesIfNeeded(textarea: HTMLTextAreaElement, text: string) {\n const selectionStart = textarea.selectionStart;\n const selectionEnd = textarea.selectionEnd;\n\n // block parsing requires two leading new lines and none trailing, but we add an extra trailing line for readability\n const isPrevNewLine = isNewLine(textarea.value[selectionStart - 1]);\n const isPrevPrevNewLine = isNewLine(textarea.value[selectionStart - 2]);\n const isNextNewLine = isNewLine(textarea.value[selectionEnd]);\n\n // pad text with newlines as needed\n text = `${isPrevNewLine ? '' : '\\n'}${isPrevPrevNewLine ? '' : '\\n'}${text}${\n isNextNewLine ? '' : '\\n'\n }`;\n\n return text;\n}\n\nexport default class EuiMarkdownEditorComponent extends Component<EuiMarkdownEditorSignature> {\n @tracked pluginEditorPlugin?: EuiMarkdownEditorUiPlugin;\n\n // Defaults\n @argOrDefaultDecorator(defaultParsingPlugins)\n declare parsingPluginList: typeof defaultParsingPlugins;\n\n @argOrDefaultDecorator(250) declare height: number | string;\n @argOrDefaultDecorator(500) declare maxHeight: number | string;\n @argOrDefaultDecorator(true) declare autoExpandPreview: boolean;\n\n @argOrDefaultDecorator(defaultProcessingPlugins)\n declare processingPluginList: typeof defaultProcessingPlugins;\n\n @tracked selectedNode: Node | null = null;\n @tracked editorId = this.args.editorId ?? guidFor({});\n @tracked viewMode = this.args.initialViewMode || MODE_EDITING;\n @tracked textareaRef: HTMLTextAreaElement | null = null;\n @tracked previewRef: HTMLDivElement | null = null;\n @tracked editorToolbarRef: HTMLDivElement | null = null;\n @tracked currentHeight: number | string = 250;\n @tracked editorFooterHeight: number = 0;\n @tracked editorToolbarHeight: number = 0;\n @tracked hasUnacceptedItems = false;\n\n /** Rebuilt when the plugins change (e.g. a default plugin is excluded). */\n @cached\n get markdownActions(): MarkdownActions {\n return new MarkdownActions(this.editorId, this.toolbarPlugins);\n }\n\n get toolbarPlugins() {\n return this.args.uiPlugins ?? defaultUiPlugins;\n }\n\n constructor(owner: Owner, args: EuiMarkdownEditorArgs) {\n super(owner, args);\n this.currentHeight = this.height;\n }\n\n @cached\n get styles() {\n const context = getEuiThemeContext(this);\n\n return {\n context,\n styles: useEuiBorealisStyles(context, euiMarkdownEditorStyles)\n };\n }\n\n @cached\n get classes() {\n const { context, styles } = this.styles;\n\n return euiClass(\n context,\n editorReset,\n styles.euiMarkdownEditor,\n this.height === 'full' ? styles.fullHeight : undefined\n );\n }\n\n get formatRootClasses() {\n return this.args.markdownFormatProps?.rootClasses ?? this.args.formatRootClasses;\n }\n\n get formatTextSize() {\n return this.args.markdownFormatProps?.textSize ?? this.args.formatTextSize;\n }\n\n get formatColor() {\n return this.args.markdownFormatProps?.color ?? this.args.formatColor;\n }\n\n get formatShouldIncludeDefaultRootClasses() {\n return (\n this.args.markdownFormatProps?.shouldIncludeDefaultRootClasses ??\n this.args.formatShouldIncludeDefaultRootClasses\n );\n }\n\n @cached\n get previewClasses() {\n const { context, styles } = this.styles;\n\n return euiClass(context, styles.euiMarkdownEditorPreview);\n }\n\n get rootClassName() {\n return [\n 'euiMarkdownEditor',\n this.isPreviewing ? 'euiMarkdownEditor-isPreviewing' : undefined,\n this.classes\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n get toggleContainerDisplay() {\n // '' removes the inline value (ember-style-modifier ignores undefined)\n return this.isPreviewing ? 'none' : '';\n }\n\n get previewHeight() {\n if (this.height === 'full') {\n return `calc(100% - ${this.editorFooterHeight}px)`;\n }\n\n return `${this.currentHeight}px`;\n }\n\n get textAreaHeight() {\n return this.height === 'full'\n ? '100%'\n : `calc(${(this.height as number) - this.editorFooterHeight}px)`;\n }\n\n get textAreaMaxHeight() {\n return this.height !== 'full'\n ? `${(this.maxHeight as number) - this.editorFooterHeight}px`\n : '';\n }\n\n get editorToggleContainerHeight() {\n return `calc(100% - ${this.editorToolbarHeight}px)`;\n }\n\n @action\n onResize() {\n if (this.textareaRef && this.isEditing && this.height !== 'full') {\n const resizedTextareaHeight =\n this.textareaRef.offsetHeight + this.editorFooterHeight;\n\n const update = () => {\n this.currentHeight = resizedTextareaHeight;\n };\n\n scheduleOnce('afterRender', this, update);\n }\n }\n\n @action\n updateCurrentHeight() {\n const { isPreviewing, autoExpandPreview, height, previewRef, currentHeight } =\n this;\n\n if (isPreviewing && autoExpandPreview && height !== 'full' && previewRef) {\n //@ts-ignore\n if (previewRef.scrollHeight > currentHeight) {\n // scrollHeight does not include the border or margin\n // so we ask for the computed value for those,\n // which is always in pixels because getComputedValue\n // returns the resolved values\n const elementComputedStyle = window.getComputedStyle(previewRef);\n const borderWidth =\n parseFloat(elementComputedStyle.borderTopWidth) +\n parseFloat(elementComputedStyle.borderBottomWidth);\n const marginWidth =\n parseFloat(elementComputedStyle.marginTop) +\n parseFloat(elementComputedStyle.marginBottom);\n\n // then add an extra pixel for safety and because the scrollHeight value is rounded\n const extraHeight = borderWidth + marginWidth + 1;\n\n const update = () => {\n if (previewRef) {\n this.currentHeight = previewRef.scrollHeight + extraHeight;\n }\n };\n\n scheduleOnce('afterRender', this, update);\n }\n }\n }\n\n getCursorNode = () => {};\n\n @action\n setEditorFooterHeight(height: number) {\n this.editorFooterHeight = height;\n }\n\n @action\n setHasUnacceptedItems(value: boolean) {\n this.hasUnacceptedItems = value;\n }\n\n @action\n onTextAreaFocus() {\n this.hasUnacceptedItems = false;\n }\n\n /** Inserts the markdown of a dropped file at the cursor, as upstream. */\n @action\n insertDroppedText(text: string, config: EuiMarkdownStringTagConfig) {\n const textarea = this.textareaRef;\n\n if (!textarea) return;\n\n if (config.block) {\n text = padWithNewlinesIfNeeded(textarea, text);\n }\n\n const newSelectionPoint = textarea.selectionStart + text.length;\n\n insertText(textarea, {\n text,\n selectionStart: newSelectionPoint,\n selectionEnd: newSelectionPoint\n });\n }\n\n @action\n setTextAreaRef(ref: HTMLTextAreaElement) {\n this.textareaRef = ref;\n }\n\n @action\n setEditorToolbarRef(ref: EuiMarkdownEditorToolbarSignature['Element']) {\n this.editorToolbarRef = ref;\n this.editorToolbarHeight = ref.offsetHeight;\n }\n\n @action\n replaceNode(position: EuiMarkdownAstNodePosition, next: string) {\n const value = this.args.value;\n const leading = value.substr(0, position.start.offset);\n const trailing = value.substr(position.end.offset);\n\n this.args.onChange?.(`${leading}${next}${trailing}`);\n }\n\n get isEditing() {\n return this.viewMode === MODE_EDITING;\n }\n\n get isPreviewing() {\n return this.viewMode === MODE_VIEWING;\n }\n\n @action\n setViewMode() {\n this.viewMode = this.isPreviewing ? MODE_EDITING : MODE_VIEWING;\n }\n\n @cached\n get parser() {\n const Compiler = (tree: any) => {\n return tree;\n };\n\n function identityCompiler(this: Processor) {\n //eslint-disable-next-line\n this.Compiler = Compiler;\n }\n\n return unified().use(this.parsingPluginList).use(identityCompiler);\n }\n\n @cached\n get parsed(): [\n ReturnType<typeof this.parser.processSync> | null,\n null | unknown\n ] {\n try {\n const parsed = this.parser.processSync(this.args.value);\n\n return [parsed, null];\n } catch (e) {\n return [null, e];\n }\n }\n\n get vFile() {\n return this.parsed[0];\n }\n\n @action\n onParse() {\n if (this.args.onParse) {\n const [parsed, parseError] = this.parsed;\n const onParse = this.args.onParse;\n const messages = parsed ? parsed.messages : [];\n const ast = parsed ? parsed['result'] ?? parsed.contents : null;\n\n onParse(parseError, { messages, ast });\n }\n }\n\n @action\n setSelectedNode(node: Node) {\n this.selectedNode = node;\n }\n\n openPluginEditor = (plugin: EuiMarkdownEditorUiPlugin) => {\n this.pluginEditorPlugin = plugin;\n };\n\n onEditorPluginSave = (markdown: any, config: any) => {\n const { selectedNode, textareaRef } = this;\n\n if (\n this.pluginEditorPlugin &&\n selectedNode &&\n // @ts-expect-error\n selectedNode.type === this.pluginEditorPlugin.name &&\n // @ts-expect-error\n selectedNode.position\n ) {\n // modifying an existing node\n textareaRef!.setSelectionRange(\n // @ts-expect-error\n selectedNode.position.start.offset,\n // @ts-expect-error\n selectedNode.position.end.offset\n );\n } else {\n // creating a new node\n if (config.block) {\n // inject newlines if needed\n markdown = padWithNewlinesIfNeeded(textareaRef!, markdown);\n }\n }\n\n insertText(textareaRef!, {\n text: markdown,\n selectionStart: undefined,\n selectionEnd: undefined\n });\n\n this.pluginEditorPlugin = undefined;\n };\n\n willDestroy(): void {\n super.willDestroy();\n\n this.textareaRef = null;\n this.previewRef = null;\n this.editorToolbarRef = null;\n }\n\n <template>\n <div\n class={{this.rootClassName}}\n {{didUpdate\n this.updateCurrentHeight\n this.currentHeight\n this.isPreviewing\n this.height\n this.autoExpandPreview\n }}\n >\n <EuiMarkdownEditorToolbar\n @selectedNode={{this.selectedNode}}\n @markdownActions={{this.markdownActions}}\n @onClickPreview={{this.setViewMode}}\n @openPluginEditor={{this.openPluginEditor}}\n @viewMode={{this.viewMode}}\n @uiPlugins={{this.toolbarPlugins}}\n @readOnly={{@readOnly}}\n @right={{@toolbarProps.right}}\n class={{@toolbarProps.className}}\n {{didInsert this.setEditorToolbarRef}}\n />\n {{#if this.isPreviewing}}\n <div\n class=\"euiMarkdownEditorPreview\n {{if @readOnly 'euiMarkdownEditorPreview-isReadOnly'}}\n {{this.previewClasses}}\"\n {{didInsert (set this \"previewRef\")}}\n {{style (hash height=this.previewHeight)}}\n >\n <EuiMarkdownFormat\n @parsingPluginList={{this.parsingPluginList}}\n @processingPluginList={{this.processingPluginList}}\n @value={{@value}}\n @replaceNode={{this.replaceNode}}\n @readOnly={{@readOnly}}\n @rootClasses={{this.formatRootClasses}}\n @textSize={{this.formatTextSize}}\n @color={{this.formatColor}}\n @shouldIncludeDefaultRootClasses={{this.formatShouldIncludeDefaultRootClasses}}\n @grow={{@markdownFormatProps.grow}}\n @textAlign={{@markdownFormatProps.textAlign}}\n @component={{@markdownFormatProps.component}}\n />\n </div>\n {{/if}}\n\n <div\n class=\"euiMarkdownEditor__toggleContainer\"\n {{style\n height=this.editorToggleContainerHeight\n display=this.toggleContainerDisplay\n }}\n >\n <EuiMarkdownEditorDropZone\n @uiPlugins={{this.toolbarPlugins}}\n @errors={{@errors}}\n @dropHandlers={{@dropHandlers}}\n @insertText={{this.insertDroppedText}}\n @hasUnacceptedItems={{this.hasUnacceptedItems}}\n @setHasUnacceptedItems={{this.setHasUnacceptedItems}}\n @setEditorFooterHeight={{this.setEditorFooterHeight}}\n @isInvalid={{@isInvalid}}\n @showFooter={{@showFooter}}\n @readOnly={{@readOnly}}\n >\n <EuiMarkdownEditorTextArea\n {{getCursorNodeModifier this.vFile this.setSelectedNode}}\n {{didUpdate this.onParse this.parsed}}\n {{didInsert this.setTextAreaRef}}\n {{resizeObserver onResize=this.onResize}}\n disabled={{@disabled}}\n id={{this.editorId}}\n @height={{this.textAreaHeight}}\n @maxHeight={{this.textAreaMaxHeight}}\n @readOnly={{@readOnly}}\n value={{@value}}\n aria-label={{@ariaLabel}}\n aria-labelledby={{@ariaLabelledBy}}\n aria-describedby={{@ariaDescribedBy}}\n aria-invalid={{if @isInvalid \"true\"}}\n {{on \"input\" (pick \"target.value\" @onChange)}}\n {{on \"focus\" this.onTextAreaFocus}}\n {{validatableControl @isInvalid}}\n ...attributes\n />\n </EuiMarkdownEditorDropZone>\n {{#if this.pluginEditorPlugin.editor}}\n <EuiModal @onClose={{set this \"pluginEditorPlugin\" undefined}}>\n {{#let (component this.pluginEditorPlugin.editor) as |Editor|}}\n <Editor\n @node={{this.selectedNode}}\n @onCancel={{set this \"pluginEditorPlugin\" undefined}}\n @onSave={{this.onEditorPluginSave}}\n />\n {{/let}}\n </EuiModal>\n {{/if}}\n </div>\n </div>\n </template>\n}\n"],"names":["editorReset","boxSizing","getCursorNode","textareaRef","parsed","selectionStart","node","result","contents","outer","children","i","length","child","position","start","offset","end","type","wrapper","textarea","callback","getCursorNodeModifier","modifier","onSelectedNode","fn","bind","addEventListener","removeEventListener","isNewLine","char","match","padWithNewlinesIfNeeded","text","selectionEnd","isPrevNewLine","value","isPrevPrevNewLine","isNextNewLine","EuiMarkdownEditorComponent","Component","g","prototype","tracked","argOrDefaultDecorator","defaultParsingPlugins","defaultProcessingPlugins","args","editorId","guidFor","initialViewMode","MODE_EDITING","markdownActions","MarkdownActions","toolbarPlugins","n","cached","uiPlugins","defaultUiPlugins","constructor","owner","currentHeight","height","styles","context","getEuiThemeContext","useEuiBorealisStyles","euiMarkdownEditorStyles","classes","euiClass","euiMarkdownEditor","fullHeight","undefined","formatRootClasses","markdownFormatProps","rootClasses","formatTextSize","textSize","formatColor","color","formatShouldIncludeDefaultRootClasses","shouldIncludeDefaultRootClasses","previewClasses","euiMarkdownEditorPreview","rootClassName","isPreviewing","filter","Boolean","join","toggleContainerDisplay","previewHeight","editorFooterHeight","textAreaHeight","textAreaMaxHeight","maxHeight","editorToggleContainerHeight","editorToolbarHeight","onResize","isEditing","resizedTextareaHeight","offsetHeight","update","scheduleOnce","action","updateCurrentHeight","autoExpandPreview","previewRef","scrollHeight","elementComputedStyle","window","getComputedStyle","borderWidth","parseFloat","borderTopWidth","borderBottomWidth","marginWidth","marginTop","marginBottom","extraHeight","setEditorFooterHeight","setHasUnacceptedItems","hasUnacceptedItems","onTextAreaFocus","insertDroppedText","config","block","newSelectionPoint","insertText","setTextAreaRef","ref","setEditorToolbarRef","editorToolbarRef","replaceNode","next","leading","substr","trailing","onChange","viewMode","MODE_VIEWING","setViewMode","parser","Compiler","tree","identityCompiler","unified","use","parsingPluginList","processSync","e","vFile","onParse","parseError","messages","ast","setSelectedNode","selectedNode","openPluginEditor","plugin","pluginEditorPlugin","onEditorPluginSave","markdown","name","setSelectionRange","willDestroy","setComponentTemplate","precompileTemplate","strictMode","scope","didUpdate","EuiMarkdownEditorToolbar","didInsert","set","style","hash","EuiMarkdownFormat","EuiMarkdownEditorDropZone","EuiMarkdownEditorTextArea","resizeObserver","on","pick","validatableControl","EuiModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eui-markdown-editor.js","sources":["../../src/components/eui-markdown-editor.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { hash } from '@ember/helper';\nimport { on } from '@ember/modifier';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport didInsert from '@ember/render-modifiers/modifiers/did-insert';\nimport didUpdate from '@ember/render-modifiers/modifiers/did-update';\nimport { scheduleOnce } from '@ember/runloop';\nimport type Owner from '@ember/owner';\n\nimport pick from '@nullvoxpopuli/ember-composable-helpers/helpers/pick';\nimport { modifier } from 'ember-modifier';\nimport set from 'ember-set-helper/helpers/set';\nimport style from 'ember-style-modifier/modifiers/style';\nimport unified from 'unified';\n\nimport { argOrDefaultDecorator } from '../helpers/arg-or-default.ts';\nimport resizeObserver from '../modifiers/resize-observer.ts';\nimport { getEuiThemeContext } from '../utils/emotion/consume.ts';\nimport { euiClass, useEuiBorealisStyles } from '../utils/eui/styles.ts';\nimport { euiMarkdownEditorStyles } from '../utils/eui/styles.generated.ts';\nimport validatableControl from '../modifiers/validatable-control.ts';\nimport MarkdownActions, {\n insertText\n} from '../utils/markdown/markdown-actions.ts';\nimport {\n MODE_EDITING,\n MODE_VIEWING\n} from '../utils/markdown/markdown-modes.ts';\nimport {\n defaultParsingPlugins,\n defaultProcessingPlugins,\n defaultUiPlugins\n} from '../utils/markdown/plugins/markdown-default-plugins/index.ts';\nimport EuiMarkdownEditorDropZone from './eui-markdown-editor-drop-zone.gts';\nimport EuiMarkdownEditorTextArea from './eui-markdown-editor-text-area.gts';\nimport EuiMarkdownEditorToolbar from './eui-markdown-editor-toolbar.gts';\nimport EuiMarkdownFormat from './eui-markdown-format.gts';\nimport EuiModal from './eui-modal.gts';\n\nimport type {\n EuiMarkdownAstNode,\n EuiMarkdownAstNodePosition,\n EuiMarkdownDropHandler,\n EuiMarkdownEditorUiPlugin,\n EuiMarkdownParseError,\n EuiMarkdownStringTagConfig\n} from '../utils/markdown/markdown-types';\nimport type { CSSObject } from '@emotion/css/create-instance';\nimport type { EuiMarkdownEditorTextAreaSignature } from './eui-markdown-editor-text-area';\nimport type {\n EuiMarkdownEditorToolbarArgs,\n EuiMarkdownEditorToolbarSignature\n} from './eui-markdown-editor-toolbar';\nimport type { EuiMarkdownFormatSignature } from './eui-markdown-format.gts';\nimport type { Processor } from 'unified';\n\n/** Stands in for React EUI's global `box-sizing` reset. */\nconst editorReset: CSSObject = {\n boxSizing: 'border-box',\n '& :where(*, *::before, *::after)': { boxSizing: 'border-box' }\n};\n\nexport interface EuiMarkdownEditorArgs {\n /**\n * Starts in `'editing'` (textarea) or `'viewing'` (preview) mode.\n * Defaults to `'editing'`.\n */\n initialViewMode?: string;\n /** Id of the editor. Defaults to a generated id. */\n editorId?: string;\n /**\n * The UI plugins of the toolbar (a button per plugin after the built-in\n * bold, lists, … buttons) and of the syntax help. Defaults to\n * `getDefaultEuiMarkdownUiPlugins()` (the tooltip plugin): as upstream,\n * the list you pass replaces the defaults, so add yours to that list\n * (`[...getDefaultEuiMarkdownUiPlugins(), myPlugin]`) to keep them.\n */\n uiPlugins?: EuiMarkdownEditorUiPlugin[];\n /**\n * remark plugins parsing the markdown. Defaults to\n * `getDefaultEuiMarkdownParsingPlugins()`; extend that list to add syntax.\n */\n parsingPluginList?: typeof defaultParsingPlugins;\n /**\n * Plugins turning the parsed markdown into the preview. Defaults to\n * `getDefaultEuiMarkdownProcessingPlugins()`; extend it to render custom\n * nodes with your components.\n */\n processingPluginList?: typeof defaultProcessingPlugins;\n /** The markdown text. Update it in `@onChange`. */\n value: string;\n /** Called with the new markdown text on every change. */\n onChange: (str: string) => void;\n /**\n * Called after each parse with the error (or `null`) and\n * `{ messages, ast }`, e.g. to show plugin validation messages.\n */\n onParse?: (\n parseError: unknown | null,\n parsed: { messages: any[]; ast: any }\n ) => void;\n /**\n * Height of the editor in px, or `'full'` to fill its container.\n * Defaults to `250`.\n */\n height?: number | string;\n /** Maximum height in px when the textarea grows. Defaults to `500`. */\n maxHeight?: number | string;\n /** Grows the preview to fit its content. Defaults to `true`. */\n autoExpandPreview?: boolean;\n /** Disables the textarea. */\n disabled?: boolean;\n /**\n * Marks the textarea invalid: native validity, `aria-invalid` and the\n * danger state styling.\n */\n isInvalid?: boolean;\n /**\n * Read-only: the textarea is `readonly`, toolbar/footer buttons are\n * disabled, file drops are ignored and preview checkboxes do not toggle.\n */\n readOnly?: boolean;\n /**\n * Errors listed in the footer's error popover (e.g. from `@onParse`\n * messages). Any error also gives the textarea the danger state.\n */\n errors?: EuiMarkdownParseError[];\n /**\n * Handlers turning dropped or picked files into markdown:\n * `{ supportedFiles, accepts(type), getFormattingForItem(file) }`. Any\n * handler adds the footer's upload button. Defaults to none.\n */\n dropHandlers?: EuiMarkdownDropHandler[];\n /** Renders the footer (upload, errors and syntax help). Defaults to `true`. */\n showFooter?: boolean;\n /**\n * Customizes the toolbar: `className` is added to it, and `right` (text\n * or a component, e.g. a template-only component rendering an\n * `EuiButton`) replaces the preview/editor switch on its right side.\n */\n toolbarProps?: {\n className?: string;\n right?: EuiMarkdownEditorToolbarArgs['right'];\n };\n /** Accessible label of the textarea. */\n ariaLabel?: string;\n /** Id of the element labelling the textarea (e.g. a form row label). */\n ariaLabelledBy?: string;\n /** Id of the element describing the textarea. */\n ariaDescribedBy?: string;\n /**\n * Further args for the preview's `EuiMarkdownFormat` (upstream's\n * `markdownFormatProps`): `rootClasses`, `textSize`, `color`,\n * `shouldIncludeDefaultRootClasses`, `grow`, `textAlign` and `component`.\n * They win over the `@format…` args.\n */\n markdownFormatProps?: Pick<\n EuiMarkdownFormatSignature['Args'],\n | 'rootClasses'\n | 'textSize'\n | 'color'\n | 'shouldIncludeDefaultRootClasses'\n | 'grow'\n | 'textAlign'\n | 'component'\n >;\n /** `@rootClasses` of the preview's EuiMarkdownFormat. */\n formatRootClasses?: EuiMarkdownFormatSignature['Args']['rootClasses'];\n /** `@textSize` of the preview's EuiMarkdownFormat. */\n formatTextSize?: EuiMarkdownFormatSignature['Args']['textSize'];\n /** `@color` of the preview's EuiMarkdownFormat. */\n formatColor?: EuiMarkdownFormatSignature['Args']['color'];\n /** `@shouldIncludeDefaultRootClasses` of the preview's EuiMarkdownFormat. */\n formatShouldIncludeDefaultRootClasses?: EuiMarkdownFormatSignature['Args']['shouldIncludeDefaultRootClasses'];\n}\n\n/**\n * A markdown textarea with a formatting toolbar, a preview, file drop and\n * extensible syntax (plugins). Attributes go to the `<textarea>`.\n */\nexport interface EuiMarkdownEditorSignature {\n Element: EuiMarkdownEditorTextAreaSignature['Element'];\n Args: EuiMarkdownEditorArgs;\n Blocks: {\n /** Unused. */\n default: [];\n };\n}\n\nexport const getCursorNode = (\n textareaRef: HTMLTextAreaElement,\n parsed: any\n): EuiMarkdownAstNode => {\n const { selectionStart } = textareaRef;\n\n let node: EuiMarkdownAstNode = parsed.result ?? parsed.contents;\n\n \n outer: while (true) {\n if (node.children) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n\n // Nodes made by plugins (e.g. remark-intraword-underscore) can have\n // no position; upstream skips them too.\n if (\n child &&\n child.position &&\n child.position.start.offset < (selectionStart as number) &&\n (selectionStart as number) < child.position.end.offset\n ) {\n if (child.type === 'text') break outer; // don't dive into `text` nodes\n node = child;\n continue outer;\n }\n }\n }\n\n break;\n }\n\n return node;\n};\n\nfunction wrapper(\n textarea: HTMLTextAreaElement,\n parsed: any,\n callback: (node: EuiMarkdownAstNode) => void\n) {\n const node = getCursorNode(textarea, parsed);\n\n callback(node);\n}\n\nexport const getCursorNodeModifier = modifier(function getCursorNodeModifier(\n textarea: EuiMarkdownEditorTextAreaSignature['Element'],\n [parsed, onSelectedNode]: [any, (node: Node) => void]\n) {\n //@ts-expect-error\n const fn = wrapper.bind(null, textarea, parsed, onSelectedNode);\n\n textarea.addEventListener('keyup', fn);\n textarea.addEventListener('mouseup', fn);\n\n return () => {\n textarea.removeEventListener('keyup', fn);\n textarea.removeEventListener('mouseup', fn);\n };\n});\n\nfunction isNewLine(char: string | undefined): boolean {\n if (char == null) return true;\n\n return !!char.match(/[\\r\\n]/);\n}\n\nfunction padWithNewlinesIfNeeded(textarea: HTMLTextAreaElement, text: string) {\n const selectionStart = textarea.selectionStart;\n const selectionEnd = textarea.selectionEnd;\n\n // block parsing requires two leading new lines and none trailing, but we add an extra trailing line for readability\n const isPrevNewLine = isNewLine(textarea.value[selectionStart - 1]);\n const isPrevPrevNewLine = isNewLine(textarea.value[selectionStart - 2]);\n const isNextNewLine = isNewLine(textarea.value[selectionEnd]);\n\n // pad text with newlines as needed\n text = `${isPrevNewLine ? '' : '\\n'}${isPrevPrevNewLine ? '' : '\\n'}${text}${\n isNextNewLine ? '' : '\\n'\n }`;\n\n return text;\n}\n\nexport default class EuiMarkdownEditorComponent extends Component<EuiMarkdownEditorSignature> {\n @tracked pluginEditorPlugin?: EuiMarkdownEditorUiPlugin;\n\n // Defaults\n @argOrDefaultDecorator(defaultParsingPlugins)\n declare parsingPluginList: typeof defaultParsingPlugins;\n\n @argOrDefaultDecorator(250) declare height: number | string;\n @argOrDefaultDecorator(500) declare maxHeight: number | string;\n @argOrDefaultDecorator(true) declare autoExpandPreview: boolean;\n\n @argOrDefaultDecorator(defaultProcessingPlugins)\n declare processingPluginList: typeof defaultProcessingPlugins;\n\n @tracked selectedNode: Node | null = null;\n @tracked editorId = this.args.editorId ?? guidFor({});\n @tracked viewMode = this.args.initialViewMode || MODE_EDITING;\n @tracked textareaRef: HTMLTextAreaElement | null = null;\n @tracked previewRef: HTMLDivElement | null = null;\n @tracked editorToolbarRef: HTMLDivElement | null = null;\n @tracked currentHeight: number | string = 250;\n @tracked editorFooterHeight: number = 0;\n @tracked editorToolbarHeight: number = 0;\n @tracked hasUnacceptedItems = false;\n\n /** Rebuilt when the plugins change (e.g. a default plugin is excluded). */\n @cached\n get markdownActions(): MarkdownActions {\n return new MarkdownActions(this.editorId, this.toolbarPlugins);\n }\n\n get toolbarPlugins() {\n return this.args.uiPlugins ?? defaultUiPlugins;\n }\n\n constructor(owner: Owner, args: EuiMarkdownEditorArgs) {\n super(owner, args);\n this.currentHeight = this.height;\n }\n\n @cached\n get styles() {\n const context = getEuiThemeContext(this);\n\n return {\n context,\n styles: useEuiBorealisStyles(context, euiMarkdownEditorStyles)\n };\n }\n\n @cached\n get classes() {\n const { context, styles } = this.styles;\n\n return euiClass(\n context,\n editorReset,\n styles.euiMarkdownEditor,\n this.height === 'full' ? styles.fullHeight : undefined\n );\n }\n\n get formatRootClasses() {\n return this.args.markdownFormatProps?.rootClasses ?? this.args.formatRootClasses;\n }\n\n get formatTextSize() {\n return this.args.markdownFormatProps?.textSize ?? this.args.formatTextSize;\n }\n\n get formatColor() {\n return this.args.markdownFormatProps?.color ?? this.args.formatColor;\n }\n\n get formatShouldIncludeDefaultRootClasses() {\n return (\n this.args.markdownFormatProps?.shouldIncludeDefaultRootClasses ??\n this.args.formatShouldIncludeDefaultRootClasses\n );\n }\n\n @cached\n get previewClasses() {\n const { context, styles } = this.styles;\n\n return euiClass(context, styles.euiMarkdownEditorPreview);\n }\n\n get rootClassName() {\n return [\n 'euiMarkdownEditor',\n this.isPreviewing ? 'euiMarkdownEditor-isPreviewing' : undefined,\n this.classes\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n get toggleContainerDisplay() {\n // '' removes the inline value (ember-style-modifier ignores undefined)\n return this.isPreviewing ? 'none' : '';\n }\n\n get previewHeight() {\n if (this.height === 'full') {\n return `calc(100% - ${this.editorFooterHeight}px)`;\n }\n\n return `${this.currentHeight}px`;\n }\n\n get textAreaHeight() {\n return this.height === 'full'\n ? '100%'\n : `calc(${(this.height as number) - this.editorFooterHeight}px)`;\n }\n\n get textAreaMaxHeight() {\n return this.height !== 'full'\n ? `${(this.maxHeight as number) - this.editorFooterHeight}px`\n : '';\n }\n\n get editorToggleContainerHeight() {\n return `calc(100% - ${this.editorToolbarHeight}px)`;\n }\n\n @action\n onResize() {\n if (this.textareaRef && this.isEditing && this.height !== 'full') {\n const resizedTextareaHeight =\n this.textareaRef.offsetHeight + this.editorFooterHeight;\n\n const update = () => {\n this.currentHeight = resizedTextareaHeight;\n };\n\n scheduleOnce('afterRender', this, update);\n }\n }\n\n @action\n updateCurrentHeight() {\n const { isPreviewing, autoExpandPreview, height, previewRef, currentHeight } =\n this;\n\n if (isPreviewing && autoExpandPreview && height !== 'full' && previewRef) {\n //@ts-ignore\n if (previewRef.scrollHeight > currentHeight) {\n // scrollHeight does not include the border or margin\n // so we ask for the computed value for those,\n // which is always in pixels because getComputedValue\n // returns the resolved values\n const elementComputedStyle = window.getComputedStyle(previewRef);\n const borderWidth =\n parseFloat(elementComputedStyle.borderTopWidth) +\n parseFloat(elementComputedStyle.borderBottomWidth);\n const marginWidth =\n parseFloat(elementComputedStyle.marginTop) +\n parseFloat(elementComputedStyle.marginBottom);\n\n // then add an extra pixel for safety and because the scrollHeight value is rounded\n const extraHeight = borderWidth + marginWidth + 1;\n\n const update = () => {\n if (previewRef) {\n this.currentHeight = previewRef.scrollHeight + extraHeight;\n }\n };\n\n scheduleOnce('afterRender', this, update);\n }\n }\n }\n\n getCursorNode = () => {};\n\n @action\n setEditorFooterHeight(height: number) {\n this.editorFooterHeight = height;\n }\n\n @action\n setHasUnacceptedItems(value: boolean) {\n this.hasUnacceptedItems = value;\n }\n\n @action\n onTextAreaFocus() {\n this.hasUnacceptedItems = false;\n }\n\n /** Inserts the markdown of a dropped file at the cursor, as upstream. */\n @action\n insertDroppedText(text: string, config: EuiMarkdownStringTagConfig) {\n const textarea = this.textareaRef;\n\n if (!textarea) return;\n\n if (config.block) {\n text = padWithNewlinesIfNeeded(textarea, text);\n }\n\n const newSelectionPoint = textarea.selectionStart + text.length;\n\n insertText(textarea, {\n text,\n selectionStart: newSelectionPoint,\n selectionEnd: newSelectionPoint\n });\n }\n\n @action\n setTextAreaRef(ref: HTMLTextAreaElement) {\n this.textareaRef = ref;\n }\n\n @action\n setEditorToolbarRef(ref: EuiMarkdownEditorToolbarSignature['Element']) {\n this.editorToolbarRef = ref;\n this.editorToolbarHeight = ref.offsetHeight;\n }\n\n @action\n replaceNode(position: EuiMarkdownAstNodePosition, next: string) {\n const value = this.args.value;\n const leading = value.substr(0, position.start.offset);\n const trailing = value.substr(position.end.offset);\n\n this.args.onChange?.(`${leading}${next}${trailing}`);\n }\n\n get isEditing() {\n return this.viewMode === MODE_EDITING;\n }\n\n get isPreviewing() {\n return this.viewMode === MODE_VIEWING;\n }\n\n @action\n setViewMode() {\n this.viewMode = this.isPreviewing ? MODE_EDITING : MODE_VIEWING;\n }\n\n @cached\n get parser() {\n const Compiler = (tree: any) => {\n return tree;\n };\n\n function identityCompiler(this: Processor) {\n //eslint-disable-next-line\n this.Compiler = Compiler;\n }\n\n return unified().use(this.parsingPluginList).use(identityCompiler);\n }\n\n @cached\n get parsed(): [\n ReturnType<typeof this.parser.processSync> | null,\n null | unknown\n ] {\n try {\n const parsed = this.parser.processSync(this.args.value);\n\n return [parsed, null];\n } catch (e) {\n return [null, e];\n }\n }\n\n get vFile() {\n return this.parsed[0];\n }\n\n @action\n onParse() {\n if (this.args.onParse) {\n const [parsed, parseError] = this.parsed;\n const onParse = this.args.onParse;\n const messages = parsed ? parsed.messages : [];\n const ast = parsed ? parsed['result'] ?? parsed.contents : null;\n\n onParse(parseError, { messages, ast });\n }\n }\n\n @action\n setSelectedNode(node: Node) {\n this.selectedNode = node;\n }\n\n openPluginEditor = (plugin: EuiMarkdownEditorUiPlugin) => {\n this.pluginEditorPlugin = plugin;\n };\n\n onEditorPluginSave = (markdown: any, config: any) => {\n const { selectedNode, textareaRef } = this;\n\n if (\n this.pluginEditorPlugin &&\n selectedNode &&\n // @ts-expect-error\n selectedNode.type === this.pluginEditorPlugin.name &&\n // @ts-expect-error\n selectedNode.position\n ) {\n // modifying an existing node\n textareaRef!.setSelectionRange(\n // @ts-expect-error\n selectedNode.position.start.offset,\n // @ts-expect-error\n selectedNode.position.end.offset\n );\n } else {\n // creating a new node\n if (config.block) {\n // inject newlines if needed\n markdown = padWithNewlinesIfNeeded(textareaRef!, markdown);\n }\n }\n\n insertText(textareaRef!, {\n text: markdown,\n selectionStart: undefined,\n selectionEnd: undefined\n });\n\n this.pluginEditorPlugin = undefined;\n };\n\n willDestroy(): void {\n super.willDestroy();\n\n this.textareaRef = null;\n this.previewRef = null;\n this.editorToolbarRef = null;\n }\n\n <template>\n <div\n class={{this.rootClassName}}\n {{didUpdate\n this.updateCurrentHeight\n this.currentHeight\n this.isPreviewing\n this.height\n this.autoExpandPreview\n }}\n >\n <EuiMarkdownEditorToolbar\n @selectedNode={{this.selectedNode}}\n @markdownActions={{this.markdownActions}}\n @onClickPreview={{this.setViewMode}}\n @openPluginEditor={{this.openPluginEditor}}\n @viewMode={{this.viewMode}}\n @uiPlugins={{this.toolbarPlugins}}\n @readOnly={{@readOnly}}\n @right={{@toolbarProps.right}}\n class={{@toolbarProps.className}}\n {{didInsert this.setEditorToolbarRef}}\n />\n {{#if this.isPreviewing}}\n <div\n class=\"euiMarkdownEditorPreview\n {{if @readOnly 'euiMarkdownEditorPreview-isReadOnly'}}\n {{this.previewClasses}}\"\n {{didInsert (set this \"previewRef\")}}\n {{style (hash height=this.previewHeight)}}\n >\n <EuiMarkdownFormat\n @parsingPluginList={{this.parsingPluginList}}\n @processingPluginList={{this.processingPluginList}}\n @value={{@value}}\n @replaceNode={{this.replaceNode}}\n @readOnly={{@readOnly}}\n @rootClasses={{this.formatRootClasses}}\n @textSize={{this.formatTextSize}}\n @color={{this.formatColor}}\n @shouldIncludeDefaultRootClasses={{this.formatShouldIncludeDefaultRootClasses}}\n @grow={{@markdownFormatProps.grow}}\n @textAlign={{@markdownFormatProps.textAlign}}\n @component={{@markdownFormatProps.component}}\n />\n </div>\n {{/if}}\n\n <div\n class=\"euiMarkdownEditor__toggleContainer\"\n {{style\n height=this.editorToggleContainerHeight\n display=this.toggleContainerDisplay\n }}\n >\n <EuiMarkdownEditorDropZone\n @uiPlugins={{this.toolbarPlugins}}\n @errors={{@errors}}\n @dropHandlers={{@dropHandlers}}\n @insertText={{this.insertDroppedText}}\n @hasUnacceptedItems={{this.hasUnacceptedItems}}\n @setHasUnacceptedItems={{this.setHasUnacceptedItems}}\n @setEditorFooterHeight={{this.setEditorFooterHeight}}\n @isInvalid={{@isInvalid}}\n @showFooter={{@showFooter}}\n @readOnly={{@readOnly}}\n >\n <EuiMarkdownEditorTextArea\n {{getCursorNodeModifier this.vFile this.setSelectedNode}}\n {{didUpdate this.onParse this.parsed}}\n {{didInsert this.setTextAreaRef}}\n {{resizeObserver onResize=this.onResize}}\n disabled={{@disabled}}\n id={{this.editorId}}\n @height={{this.textAreaHeight}}\n @maxHeight={{this.textAreaMaxHeight}}\n @readOnly={{@readOnly}}\n value={{@value}}\n aria-label={{@ariaLabel}}\n aria-labelledby={{@ariaLabelledBy}}\n aria-describedby={{@ariaDescribedBy}}\n aria-invalid={{if @isInvalid \"true\"}}\n {{on \"input\" (pick \"target.value\" @onChange)}}\n {{on \"focus\" this.onTextAreaFocus}}\n {{validatableControl @isInvalid}}\n ...attributes\n />\n </EuiMarkdownEditorDropZone>\n {{#if this.pluginEditorPlugin.editor}}\n <EuiModal @onClose={{set this \"pluginEditorPlugin\" undefined}}>\n {{#let (component this.pluginEditorPlugin.editor) as |Editor|}}\n <Editor\n @node={{this.selectedNode}}\n @onCancel={{set this \"pluginEditorPlugin\" undefined}}\n @onSave={{this.onEditorPluginSave}}\n />\n {{/let}}\n </EuiModal>\n {{/if}}\n </div>\n </div>\n </template>\n}\n"],"names":["editorReset","boxSizing","getCursorNode","textareaRef","parsed","selectionStart","node","result","contents","outer","children","i","length","child","position","start","offset","end","type","wrapper","textarea","callback","getCursorNodeModifier","modifier","onSelectedNode","fn","bind","addEventListener","removeEventListener","isNewLine","char","match","padWithNewlinesIfNeeded","text","selectionEnd","isPrevNewLine","value","isPrevPrevNewLine","isNextNewLine","EuiMarkdownEditorComponent","Component","g","prototype","tracked","argOrDefaultDecorator","defaultParsingPlugins","defaultProcessingPlugins","args","editorId","guidFor","initialViewMode","MODE_EDITING","markdownActions","MarkdownActions","toolbarPlugins","n","cached","uiPlugins","defaultUiPlugins","constructor","owner","currentHeight","height","styles","context","getEuiThemeContext","useEuiBorealisStyles","euiMarkdownEditorStyles","classes","euiClass","euiMarkdownEditor","fullHeight","undefined","formatRootClasses","markdownFormatProps","rootClasses","formatTextSize","textSize","formatColor","color","formatShouldIncludeDefaultRootClasses","shouldIncludeDefaultRootClasses","previewClasses","euiMarkdownEditorPreview","rootClassName","isPreviewing","filter","Boolean","join","toggleContainerDisplay","previewHeight","editorFooterHeight","textAreaHeight","textAreaMaxHeight","maxHeight","editorToggleContainerHeight","editorToolbarHeight","onResize","isEditing","resizedTextareaHeight","offsetHeight","update","scheduleOnce","action","updateCurrentHeight","autoExpandPreview","previewRef","scrollHeight","elementComputedStyle","window","getComputedStyle","borderWidth","parseFloat","borderTopWidth","borderBottomWidth","marginWidth","marginTop","marginBottom","extraHeight","setEditorFooterHeight","setHasUnacceptedItems","hasUnacceptedItems","onTextAreaFocus","insertDroppedText","config","block","newSelectionPoint","insertText","setTextAreaRef","ref","setEditorToolbarRef","editorToolbarRef","replaceNode","next","leading","substr","trailing","onChange","viewMode","MODE_VIEWING","setViewMode","parser","Compiler","tree","identityCompiler","unified","use","parsingPluginList","processSync","e","vFile","onParse","parseError","messages","ast","setSelectedNode","selectedNode","openPluginEditor","plugin","pluginEditorPlugin","onEditorPluginSave","markdown","name","setSelectionRange","willDestroy","setComponentTemplate","precompileTemplate","strictMode","scope","didUpdate","EuiMarkdownEditorToolbar","didInsert","set","style","hash","EuiMarkdownFormat","EuiMarkdownEditorDropZone","EuiMarkdownEditorTextArea","resizeObserver","on","pick","validatableControl","EuiModal"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import Component from '@glimmer/component';
|
|
|
2
2
|
import { cached } from '@glimmer/tracking';
|
|
3
3
|
import { isArray } from '@ember/array';
|
|
4
4
|
import optional from '@nullvoxpopuli/ember-composable-helpers/helpers/optional';
|
|
5
|
+
import style from 'ember-style-modifier/modifiers/style';
|
|
5
6
|
import unified from 'unified';
|
|
6
7
|
import { getEuiThemeContext } from '../utils/emotion/consume.js';
|
|
7
8
|
import { useEuiBorealisStyles, euiClass } from '../utils/eui/styles.js';
|
|
@@ -11,7 +12,7 @@ import { defaultProcessingPlugins } from '../utils/markdown/plugins/markdown-def
|
|
|
11
12
|
import '../utils/markdown/plugins/markdown-default-plugins/ui-plugins.js';
|
|
12
13
|
import { toDOM } from '../utils/markdown/plugins/to-dom.js';
|
|
13
14
|
import { euiTextAlignCss } from './eui-text-align.js';
|
|
14
|
-
import { euiTextColorCss, TEXT_COLORS } from './eui-text-color.js';
|
|
15
|
+
import { euiTextColorInlineStyle, euiTextColorCss, TEXT_COLORS } from './eui-text-color.js';
|
|
15
16
|
import { euiTextReset } from './eui-text.js';
|
|
16
17
|
import { precompileTemplate } from '@ember/template-compilation';
|
|
17
18
|
import { setComponentTemplate } from '@ember/component';
|
|
@@ -89,10 +90,14 @@ class EuiMarkdownFormat extends Component {
|
|
|
89
90
|
if (!rootClasses) return [];
|
|
90
91
|
return isArray(rootClasses) ? rootClasses : rootClasses.trim().split(/\s+/);
|
|
91
92
|
}
|
|
92
|
-
/**
|
|
93
|
+
/** A custom text color, inline (only with the default EuiText classes). */
|
|
93
94
|
static {
|
|
94
95
|
n(this.prototype, "extraRootClasses", [cached]);
|
|
95
96
|
}
|
|
97
|
+
get inlineStyle() {
|
|
98
|
+
return this.shouldIncludeDefaultRootClasses ? euiTextColorInlineStyle(this.color) : {};
|
|
99
|
+
}
|
|
100
|
+
/** Upstream: EuiText (size, color) with the markdown css composed last. */
|
|
96
101
|
get styleClass() {
|
|
97
102
|
const context = getEuiThemeContext(this);
|
|
98
103
|
const markdown = useEuiBorealisStyles(context, euiMarkdownFormatStyles);
|
|
@@ -141,10 +146,11 @@ class EuiMarkdownFormat extends Component {
|
|
|
141
146
|
n(this.prototype, "result", [cached]);
|
|
142
147
|
}
|
|
143
148
|
static {
|
|
144
|
-
setComponentTemplate(precompileTemplate("{{!-- This hbs was inspired by https://github.com/ampatspell/ember-cli-remark-static/blob/v3.0.5/addon/components/remark.hbs --}}\n{{#let (element (tagName @component)) as |Tag|}}\n <Tag class={{this.rootClassName}} ...attributes>\n {{#if this.result}}\n {{#each this.result.nodes as |node|}}{{node}}{{/each}}\n {{/if}}\n </Tag>\n{{/let}}\n{{#if this.result}}\n {{#each this.result.components as |CompNode|}}\n {{#in-element CompNode.element}}\n {{#if CompNode.componentName}}\n {{#let (component CompNode.componentName) as |DynamicComponent|}}\n <DynamicComponent @replaceNode={{optional @replaceNode}} @readOnly={{@readOnly}} @node={{CompNode}} />\n {{/let}}\n {{/if}}\n {{/in-element}}\n {{/each}}\n{{/if}}", {
|
|
149
|
+
setComponentTemplate(precompileTemplate("{{!-- This hbs was inspired by https://github.com/ampatspell/ember-cli-remark-static/blob/v3.0.5/addon/components/remark.hbs --}}\n{{#let (element (tagName @component)) as |Tag|}}\n <Tag class={{this.rootClassName}} ...attributes {{style this.inlineStyle}}>\n {{#if this.result}}\n {{#each this.result.nodes as |node|}}{{node}}{{/each}}\n {{/if}}\n </Tag>\n{{/let}}\n{{#if this.result}}\n {{#each this.result.components as |CompNode|}}\n {{#in-element CompNode.element}}\n {{#if CompNode.componentName}}\n {{#let (component CompNode.componentName) as |DynamicComponent|}}\n <DynamicComponent @replaceNode={{optional @replaceNode}} @readOnly={{@readOnly}} @node={{CompNode}} />\n {{/let}}\n {{/if}}\n {{/in-element}}\n {{/each}}\n{{/if}}", {
|
|
145
150
|
strictMode: true,
|
|
146
151
|
scope: () => ({
|
|
147
152
|
tagName,
|
|
153
|
+
style,
|
|
148
154
|
optional
|
|
149
155
|
})
|
|
150
156
|
}), this);
|