@vonage/vivid 5.14.0 → 5.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@ const fastWebUtilities = require('@microsoft/fast-web-utilities');
10
10
  const styles = ":host{display:inline-block;vertical-align:sub}.control.connotation-accent{--_connotation-color-primary: var(--vvd-icon-accent-primary, var(--vvd-color-canvas-text))}.control.connotation-announcement{--_connotation-color-primary: var(--vvd-icon-announcement-primary, var(--vvd-color-announcement-500))}.control.connotation-cta{--_connotation-color-primary: var(--vvd-icon-cta-primary, var(--vvd-color-cta-500))}.control.connotation-success{--_connotation-color-primary: var(--vvd-icon-success-primary, var(--vvd-color-success-500))}.control.connotation-warning{--_connotation-color-primary: var(--vvd-icon-warning-primary, var(--vvd-color-warning-300))}.control.connotation-alert{--_connotation-color-primary: var(--vvd-icon-alert-primary, var(--vvd-color-alert-500))}.control.connotation-information{--_connotation-color-primary: var(--vvd-icon-information-primary, var(--vvd-color-information-500))}.control.size--6{--_icon-block-size: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2)) - (1px*(24 + 4*clamp(-1, var(--vvd-size-density, 0), 2)))) }.control.size--5{--_icon-block-size: calc(1px*(20 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size--4{--_icon-block-size: calc(1px*(24 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size--3{--_icon-block-size: calc(1px*(28 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size--2{--_icon-block-size: calc(1px*(32 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size--1{--_icon-block-size: calc(1px*(36 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-0{--_icon-block-size: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-1{--_icon-block-size: calc(1px*(44 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-2{--_icon-block-size: calc(1px*(48 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-3{--_icon-block-size: calc(1px*(52 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-4{--_icon-block-size: calc(1px*(56 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-5{--_icon-block-size: calc(1px*(60 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control:not(.size--6,.size--5,.size--4,.size--3,.size--2,.size--1,.size-0,.size-1,.size-2,.size-3,.size-4,.size-5){--_icon-block-size: 1em}.control{display:flex;margin:unset;block-size:var(--_icon-block-size);color:currentColor;contain:strict;inline-size:var(--_icon-block-size)}.control[class*=connotation]{color:var(--_connotation-color-primary)}slot,svg,::slotted(:where(svg,img)){margin:auto;block-size:inherit;inline-size:inherit}";
11
11
 
12
12
  const ICONS_BASE_URL = 'https://icon.resources.vonage.com';
13
- const ICONS_VERSION = '4.7.2';
13
+ const ICONS_VERSION = '4.8.0';
14
14
 
15
15
  const numberConverter = {
16
16
  toView(value) {
@@ -6,7 +6,7 @@ import { classNames } from '@microsoft/fast-web-utilities';
6
6
  const styles = ":host{display:inline-block;vertical-align:sub}.control.connotation-accent{--_connotation-color-primary: var(--vvd-icon-accent-primary, var(--vvd-color-canvas-text))}.control.connotation-announcement{--_connotation-color-primary: var(--vvd-icon-announcement-primary, var(--vvd-color-announcement-500))}.control.connotation-cta{--_connotation-color-primary: var(--vvd-icon-cta-primary, var(--vvd-color-cta-500))}.control.connotation-success{--_connotation-color-primary: var(--vvd-icon-success-primary, var(--vvd-color-success-500))}.control.connotation-warning{--_connotation-color-primary: var(--vvd-icon-warning-primary, var(--vvd-color-warning-300))}.control.connotation-alert{--_connotation-color-primary: var(--vvd-icon-alert-primary, var(--vvd-color-alert-500))}.control.connotation-information{--_connotation-color-primary: var(--vvd-icon-information-primary, var(--vvd-color-information-500))}.control.size--6{--_icon-block-size: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2)) - (1px*(24 + 4*clamp(-1, var(--vvd-size-density, 0), 2)))) }.control.size--5{--_icon-block-size: calc(1px*(20 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size--4{--_icon-block-size: calc(1px*(24 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size--3{--_icon-block-size: calc(1px*(28 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size--2{--_icon-block-size: calc(1px*(32 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size--1{--_icon-block-size: calc(1px*(36 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-0{--_icon-block-size: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-1{--_icon-block-size: calc(1px*(44 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-2{--_icon-block-size: calc(1px*(48 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-3{--_icon-block-size: calc(1px*(52 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-4{--_icon-block-size: calc(1px*(56 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control.size-5{--_icon-block-size: calc(1px*(60 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) }.control:not(.size--6,.size--5,.size--4,.size--3,.size--2,.size--1,.size-0,.size-1,.size-2,.size-3,.size-4,.size-5){--_icon-block-size: 1em}.control{display:flex;margin:unset;block-size:var(--_icon-block-size);color:currentColor;contain:strict;inline-size:var(--_icon-block-size)}.control[class*=connotation]{color:var(--_connotation-color-primary)}slot,svg,::slotted(:where(svg,img)){margin:auto;block-size:inherit;inline-size:inherit}";
7
7
 
8
8
  const ICONS_BASE_URL = 'https://icon.resources.vonage.com';
9
- const ICONS_VERSION = '4.7.2';
9
+ const ICONS_VERSION = '4.8.0';
10
10
 
11
11
  const numberConverter = {
12
12
  toView(value) {
package/index.cjs CHANGED
@@ -270,6 +270,7 @@ exports.RteHtmlSerializer = richTextEditor_definition.RteHtmlSerializer;
270
270
  exports.RteInlineImageFeature = richTextEditor_definition.RteInlineImageFeature;
271
271
  exports.RteInputRuleFeature = richTextEditor_definition.RteInputRuleFeature;
272
272
  exports.RteItalicFeature = richTextEditor_definition.RteItalicFeature;
273
+ exports.RteKeyboardShortcutsFeature = richTextEditor_definition.RteKeyboardShortcutsFeature;
273
274
  exports.RteLinkFeature = richTextEditor_definition.RteLinkFeature;
274
275
  exports.RteListFeature = richTextEditor_definition.RteListFeature;
275
276
  exports.RteMonospaceFeature = richTextEditor_definition.RteMonospaceFeature;
package/index.js CHANGED
@@ -51,7 +51,7 @@ export { VwcProgressElement, progressDefinition, registerProgress } from './prog
51
51
  export { VwcRadioGroupElement, radioGroupDefinition, registerRadioGroup } from './radio-group/definition.js';
52
52
  export { VwcRadioElement, radioDefinition, registerRadio } from './radio/definition.js';
53
53
  export { VwcRangeSliderElement, rangeSliderDefinition, registerRangeSlider } from './range-slider/definition.js';
54
- export { RteAlignmentFeature, RteAtomFeature, RteBase, RteBoldFeature, RteConfig, RteDropHandlerFeature, RteFileHandlerFeature, RteFontSizePickerFeature, RteHardBreakFeature, RteHtmlParser, RteHtmlSerializer, RteInlineImageFeature, RteInputRuleFeature, RteItalicFeature, RteLinkFeature, RteListFeature, RteMonospaceFeature, RtePlaceholderFeature, RteStrikethroughFeature, RteSuggestFeature, RteTextBlockPickerFeature, RteTextColorPickerFeature, RteToolbarButtonFeature, RteToolbarFeature, RteUnderlineFeature, VwcRichTextEditorElement, registerRichTextEditor, richTextEditorDefinition } from './rich-text-editor/definition.js';
54
+ export { RteAlignmentFeature, RteAtomFeature, RteBase, RteBoldFeature, RteConfig, RteDropHandlerFeature, RteFileHandlerFeature, RteFontSizePickerFeature, RteHardBreakFeature, RteHtmlParser, RteHtmlSerializer, RteInlineImageFeature, RteInputRuleFeature, RteItalicFeature, RteKeyboardShortcutsFeature, RteLinkFeature, RteListFeature, RteMonospaceFeature, RtePlaceholderFeature, RteStrikethroughFeature, RteSuggestFeature, RteTextBlockPickerFeature, RteTextColorPickerFeature, RteToolbarButtonFeature, RteToolbarFeature, RteUnderlineFeature, VwcRichTextEditorElement, registerRichTextEditor, richTextEditorDefinition } from './rich-text-editor/definition.js';
55
55
  export { VwcRichTextViewElement, registerRichTextView, richTextViewDefinition } from './rich-text-view/definition.js';
56
56
  export { VwcSearchableSelectElement, registerSearchableSelect } from './searchable-select/definition.js';
57
57
  export { VwcSelectElement, registerSelect, selectDefinition } from './select/definition.js';
@@ -20,6 +20,7 @@ export { RteDropHandlerFeature } from './features/drop-handler';
20
20
  export { RteToolbarButtonFeature } from './features/toolbar-button';
21
21
  export { RteAtomFeature } from './features/atom';
22
22
  export { RteInputRuleFeature } from './features/input-rule';
23
+ export { RteKeyboardShortcutsFeature } from './features/keyboard-shortcuts';
23
24
  export { RteSuggestFeature } from './features/suggest';
24
25
  export { RteHtmlParser } from './html-parser';
25
26
  export { RteHtmlSerializer } from './html-serializer';
@@ -0,0 +1,16 @@
1
+ import { PluginContribution, RteFeatureImpl } from '../feature';
2
+ import { RteInstance, RteInstanceImpl } from '../instance';
3
+ export type KeyboardShortcutHandler = (rteInstance: RteInstance) => boolean;
4
+ export interface RteKeyboardShortcutsFeatureOptions {
5
+ shortcuts: Record<string, KeyboardShortcutHandler>;
6
+ }
7
+ export declare class RteKeyboardShortcutsFeatureImpl extends RteFeatureImpl {
8
+ featureId: string;
9
+ protected readonly options: RteKeyboardShortcutsFeatureOptions;
10
+ name: string;
11
+ constructor(featureId: string, options: RteKeyboardShortcutsFeatureOptions);
12
+ getPlugins(rte: RteInstanceImpl): PluginContribution[];
13
+ }
14
+ export declare const RteKeyboardShortcutsFeature: {
15
+ new (featureId: string, options: RteKeyboardShortcutsFeatureOptions): {};
16
+ };
@@ -35,6 +35,7 @@ export declare class RteInstance {
35
35
  }
36
36
  export declare class RteInstanceImpl {
37
37
  readonly options?: RteInstanceOptions | undefined;
38
+ readonly facade: RteInstance;
38
39
  state: EditorState;
39
40
  readonly config: RteConfigImpl;
40
41
  readonly schema: Schema;
@@ -45,7 +46,7 @@ export declare class RteInstanceImpl {
45
46
  readonly foreignHtmlSerializer: RteHtmlSerializer;
46
47
  getFeature<T extends RteFeatureImpl>(name: string): T;
47
48
  getPublicInterface(Feature: Constructor<RteFeature>, featureId?: string): any;
48
- constructor(configFacade: RteConfig, options?: RteInstanceOptions | undefined);
49
+ constructor(instanceFacade: RteInstance, configFacade: RteConfig, options?: RteInstanceOptions | undefined);
49
50
  protected initState(initialDoc?: RteDocument): void;
50
51
  reset(initialDocument?: RteDocument): void;
51
52
  view: EditorView | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vonage/vivid",
3
- "version": "5.14.0",
3
+ "version": "5.15.0",
4
4
  "homepage": "https://vivid.deno.dev",
5
5
  "bugs": {
6
6
  "url": "https://github.com/Vonage/vivid-3/issues"
@@ -88,14 +88,14 @@
88
88
  "vitest-axe": "^0.1.0",
89
89
  "vitest-fetch-mock": "^0.4.5",
90
90
  "wait-on": "^8.0.5",
91
- "@repo/consts": "1.0.0",
92
91
  "@repo/eslint-config": "1.0.0",
93
- "@repo/shared": "1.0.0",
94
- "@repo/stylelint-config": "1.0.0",
95
92
  "@repo/cem-analyzer-plugins": "1.0.0",
96
93
  "@repo/eslint-plugin-repo": "1.0.0",
94
+ "@repo/stylelint-config": "1.0.0",
95
+ "@repo/shared": "1.0.0",
97
96
  "@repo/styles": "1.0.0",
98
97
  "@repo/tokens": "1.0.0",
98
+ "@repo/consts": "1.0.0",
99
99
  "@repo/tools": "1.0.0",
100
100
  "@repo/typescript-config": "1.0.0",
101
101
  "@repo/vitest-config": "1.0.0"
@@ -20,7 +20,7 @@ const divider = require('../unbundled/divider.cjs');
20
20
  const DOMPurify = require('dompurify');
21
21
  const mixins = require('../unbundled/mixins.cjs');
22
22
 
23
- const styles = ":host{display:block}.rte{display:flex;flex-direction:column;block-size:100%}.editor{display:contents}.editor-viewport{position:relative;overflow:hidden;flex:1;contain:layout}.editor-scroll-area{--editor-padding-block: 8px;--editor-padding-inline: 16px;display:flex;flex-direction:column;background-color:var(--vvd-color-canvas);block-size:100%;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);overflow-y:auto;--scrollbar-track-color: transparent;--scrollbar-thumb-color: color-mix(in srgb, var(--vvd-color-neutral-950), transparent 70%)}.editor-scroll-area{scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color);scrollbar-width:thin}.editor-scroll-area ::-webkit-scrollbar{width:4px}.editor-scroll-area ::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}.editor-scroll-area ::-webkit-scrollbar-thumb{border:0;border-radius:4px;background-color:var(--scrollbar-fallback-track-color, var(--scrollbar-thumb-color))}.popovers--disabled>*{display:none!important}";
23
+ const styles = ":host{display:flex;flex-direction:column}.rte{display:flex;flex-direction:column;block-size:100%;min-block-size:0}.editor{display:contents}.editor-viewport{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;contain:layout;min-block-size:0}.editor-scroll-area{--editor-padding-inline: var( --rich-text-editor-padding-inline, 16px );--editor-padding-block: var( --rich-text-editor-padding-block, 8px );display:flex;flex:1;flex-direction:column;background-color:var(--vvd-color-canvas);color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);min-block-size:0;overflow-y:auto;--scrollbar-track-color: transparent;--scrollbar-thumb-color: color-mix(in srgb, var(--vvd-color-neutral-950), transparent 70%)}.editor-scroll-area{scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color);scrollbar-width:thin}.editor-scroll-area ::-webkit-scrollbar{width:4px}.editor-scroll-area ::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}.editor-scroll-area ::-webkit-scrollbar-thumb{border:0;border-radius:4px;background-color:var(--scrollbar-fallback-track-color, var(--scrollbar-thumb-color))}.popovers--disabled>*{display:none!important}";
24
24
 
25
25
  // Recovery values encode a range index and an offset. They are
26
26
  // represented as numbers, because tons of them will be created when
@@ -11504,6 +11504,22 @@ class RteCoreImpl extends slottableRequest.RteFeatureImpl {
11504
11504
  ];
11505
11505
  }
11506
11506
  getPlugins(rte) {
11507
+ const enterKeyChainCommands = chainCommands(
11508
+ newlineInCode,
11509
+ createParagraphNear,
11510
+ liftEmptyBlock,
11511
+ splitBlockAs((node, atEnd, $from) => {
11512
+ if (!atEnd) {
11513
+ return { type: node.type, attrs: node.attrs };
11514
+ }
11515
+ return {
11516
+ type: defaultTextblockForMatch(
11517
+ $from.node($from.depth - 1).contentMatchAt($from.indexAfter($from.depth - 1))
11518
+ ),
11519
+ attrs: rte.textblockAttrs.extractFromNode(node)
11520
+ };
11521
+ })
11522
+ );
11507
11523
  return [
11508
11524
  this.contribution(this.disabled.plugin),
11509
11525
  this.contribution(
@@ -11540,22 +11556,8 @@ class RteCoreImpl extends slottableRequest.RteFeatureImpl {
11540
11556
  this.contribution(
11541
11557
  keymap({
11542
11558
  ...baseKeymap,
11543
- Enter: chainCommands(
11544
- newlineInCode,
11545
- createParagraphNear,
11546
- liftEmptyBlock,
11547
- splitBlockAs((node, atEnd, $from) => {
11548
- if (!atEnd) {
11549
- return { type: node.type, attrs: node.attrs };
11550
- }
11551
- return {
11552
- type: defaultTextblockForMatch(
11553
- $from.node($from.depth - 1).contentMatchAt($from.indexAfter($from.depth - 1))
11554
- ),
11555
- attrs: rte.textblockAttrs.extractFromNode(node)
11556
- };
11557
- })
11558
- )
11559
+ Enter: enterKeyChainCommands,
11560
+ "Shift-Enter": enterKeyChainCommands
11559
11561
  })
11560
11562
  ),
11561
11563
  this.contribution(dropCursor()),
@@ -11769,7 +11771,7 @@ class RteInstance {
11769
11771
  this.feature = (Feature, featureId) => {
11770
11772
  return this[slottableRequest.impl].getPublicInterface(Feature, featureId);
11771
11773
  };
11772
- this[slottableRequest.impl] = new RteInstanceImpl(config, options);
11774
+ this[slottableRequest.impl] = new RteInstanceImpl(this, config, options);
11773
11775
  }
11774
11776
  /**
11775
11777
  * Returns the current document state.
@@ -11825,7 +11827,7 @@ class RteInstance {
11825
11827
  }
11826
11828
  }
11827
11829
  class RteInstanceImpl {
11828
- constructor(configFacade, options) {
11830
+ constructor(instanceFacade, configFacade, options) {
11829
11831
  this.options = options;
11830
11832
  this.view = null;
11831
11833
  this.dispatchTransaction = (tr) => {
@@ -11837,6 +11839,7 @@ class RteInstanceImpl {
11837
11839
  }
11838
11840
  return this.state;
11839
11841
  };
11842
+ this.facade = instanceFacade;
11840
11843
  const config = configFacade[slottableRequest.impl];
11841
11844
  this.config = config;
11842
11845
  this.schema = config.schema;
@@ -12752,7 +12755,7 @@ class RteHardBreakFeatureImpl extends slottableRequest.RteFeatureImpl {
12752
12755
  const keyBindings = {
12753
12756
  "Shift-Enter": forceBreak
12754
12757
  };
12755
- return [this.contribution(keymap(keyBindings))];
12758
+ return [this.contribution(keymap(keyBindings), slottableRequest.contributionPriority.high)];
12756
12759
  }
12757
12760
  }
12758
12761
  const RteHardBreakFeature = slottableRequest.featureFacade(RteHardBreakFeatureImpl);
@@ -15179,6 +15182,31 @@ class RteInputRuleFeatureImpl extends slottableRequest.RteFeatureImpl {
15179
15182
  }
15180
15183
  const RteInputRuleFeature = slottableRequest.featureFacade(RteInputRuleFeatureImpl);
15181
15184
 
15185
+ function toCommand(handler, rteInstance) {
15186
+ if (handler.length === 0) {
15187
+ return (_state, _dispatch) => handler();
15188
+ }
15189
+ return (_state, _dispatch) => handler(rteInstance);
15190
+ }
15191
+ class RteKeyboardShortcutsFeatureImpl extends slottableRequest.RteFeatureImpl {
15192
+ constructor(featureId, options) {
15193
+ super();
15194
+ this.featureId = featureId;
15195
+ this.options = options;
15196
+ this.name = `RteKeyboardShortcutsFeature[${featureId}]`;
15197
+ }
15198
+ getPlugins(rte) {
15199
+ const bindings = {};
15200
+ for (const [key, handler] of Object.entries(this.options.shortcuts)) {
15201
+ bindings[key] = toCommand(handler, rte.facade);
15202
+ }
15203
+ return [this.contribution(keymap(bindings), slottableRequest.contributionPriority.high)];
15204
+ }
15205
+ }
15206
+ const RteKeyboardShortcutsFeature = slottableRequest.featureFacade(
15207
+ RteKeyboardShortcutsFeatureImpl
15208
+ );
15209
+
15182
15210
  const suggestCss = ".suggest-popover{display:flex;flex-direction:column;padding:4px;gap:2px;max-block-size:408px;max-inline-size:248px;min-inline-size:128px}.suggest-loading-widget{display:inline-flex;align-items:center;margin-inline-start:2px;vertical-align:middle;white-space:normal}.suggest-empty-message{display:flex;align-items:center;justify-content:center;color:var(--vvd-color-neutral-300);font:var(--vvd-typography-base);min-block-size:40px;text-align:center}.suggest-item--visible-focus{box-shadow:0 0 0 4px color-mix(in srgb,var(--focus-stroke-color, var(--vvd-color-cta-500)),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent}";
15183
15211
 
15184
15212
  const isPopoverOpen = (state) => Boolean(state?.suggestions && !state.dismissed);
@@ -15564,6 +15592,7 @@ exports.RteHtmlSerializer = RteHtmlSerializer;
15564
15592
  exports.RteInlineImageFeature = RteInlineImageFeature;
15565
15593
  exports.RteInputRuleFeature = RteInputRuleFeature;
15566
15594
  exports.RteItalicFeature = RteItalicFeature;
15595
+ exports.RteKeyboardShortcutsFeature = RteKeyboardShortcutsFeature;
15567
15596
  exports.RteLinkFeature = RteLinkFeature;
15568
15597
  exports.RteListFeature = RteListFeature;
15569
15598
  exports.RteMonospaceFeature = RteMonospaceFeature;
@@ -16,7 +16,7 @@ import { D as Divider } from '../unbundled/divider.js';
16
16
  import DOMPurify from 'dompurify';
17
17
  import { g as generateRandomId } from '../unbundled/mixins.js';
18
18
 
19
- const styles = ":host{display:block}.rte{display:flex;flex-direction:column;block-size:100%}.editor{display:contents}.editor-viewport{position:relative;overflow:hidden;flex:1;contain:layout}.editor-scroll-area{--editor-padding-block: 8px;--editor-padding-inline: 16px;display:flex;flex-direction:column;background-color:var(--vvd-color-canvas);block-size:100%;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);overflow-y:auto;--scrollbar-track-color: transparent;--scrollbar-thumb-color: color-mix(in srgb, var(--vvd-color-neutral-950), transparent 70%)}.editor-scroll-area{scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color);scrollbar-width:thin}.editor-scroll-area ::-webkit-scrollbar{width:4px}.editor-scroll-area ::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}.editor-scroll-area ::-webkit-scrollbar-thumb{border:0;border-radius:4px;background-color:var(--scrollbar-fallback-track-color, var(--scrollbar-thumb-color))}.popovers--disabled>*{display:none!important}";
19
+ const styles = ":host{display:flex;flex-direction:column}.rte{display:flex;flex-direction:column;block-size:100%;min-block-size:0}.editor{display:contents}.editor-viewport{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;contain:layout;min-block-size:0}.editor-scroll-area{--editor-padding-inline: var( --rich-text-editor-padding-inline, 16px );--editor-padding-block: var( --rich-text-editor-padding-block, 8px );display:flex;flex:1;flex-direction:column;background-color:var(--vvd-color-canvas);color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);min-block-size:0;overflow-y:auto;--scrollbar-track-color: transparent;--scrollbar-thumb-color: color-mix(in srgb, var(--vvd-color-neutral-950), transparent 70%)}.editor-scroll-area{scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color);scrollbar-width:thin}.editor-scroll-area ::-webkit-scrollbar{width:4px}.editor-scroll-area ::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}.editor-scroll-area ::-webkit-scrollbar-thumb{border:0;border-radius:4px;background-color:var(--scrollbar-fallback-track-color, var(--scrollbar-thumb-color))}.popovers--disabled>*{display:none!important}";
20
20
 
21
21
  // Recovery values encode a range index and an offset. They are
22
22
  // represented as numbers, because tons of them will be created when
@@ -11500,6 +11500,22 @@ class RteCoreImpl extends RteFeatureImpl {
11500
11500
  ];
11501
11501
  }
11502
11502
  getPlugins(rte) {
11503
+ const enterKeyChainCommands = chainCommands(
11504
+ newlineInCode,
11505
+ createParagraphNear,
11506
+ liftEmptyBlock,
11507
+ splitBlockAs((node, atEnd, $from) => {
11508
+ if (!atEnd) {
11509
+ return { type: node.type, attrs: node.attrs };
11510
+ }
11511
+ return {
11512
+ type: defaultTextblockForMatch(
11513
+ $from.node($from.depth - 1).contentMatchAt($from.indexAfter($from.depth - 1))
11514
+ ),
11515
+ attrs: rte.textblockAttrs.extractFromNode(node)
11516
+ };
11517
+ })
11518
+ );
11503
11519
  return [
11504
11520
  this.contribution(this.disabled.plugin),
11505
11521
  this.contribution(
@@ -11536,22 +11552,8 @@ class RteCoreImpl extends RteFeatureImpl {
11536
11552
  this.contribution(
11537
11553
  keymap({
11538
11554
  ...baseKeymap,
11539
- Enter: chainCommands(
11540
- newlineInCode,
11541
- createParagraphNear,
11542
- liftEmptyBlock,
11543
- splitBlockAs((node, atEnd, $from) => {
11544
- if (!atEnd) {
11545
- return { type: node.type, attrs: node.attrs };
11546
- }
11547
- return {
11548
- type: defaultTextblockForMatch(
11549
- $from.node($from.depth - 1).contentMatchAt($from.indexAfter($from.depth - 1))
11550
- ),
11551
- attrs: rte.textblockAttrs.extractFromNode(node)
11552
- };
11553
- })
11554
- )
11555
+ Enter: enterKeyChainCommands,
11556
+ "Shift-Enter": enterKeyChainCommands
11555
11557
  })
11556
11558
  ),
11557
11559
  this.contribution(dropCursor()),
@@ -11765,7 +11767,7 @@ class RteInstance {
11765
11767
  this.feature = (Feature, featureId) => {
11766
11768
  return this[impl].getPublicInterface(Feature, featureId);
11767
11769
  };
11768
- this[impl] = new RteInstanceImpl(config, options);
11770
+ this[impl] = new RteInstanceImpl(this, config, options);
11769
11771
  }
11770
11772
  /**
11771
11773
  * Returns the current document state.
@@ -11821,7 +11823,7 @@ class RteInstance {
11821
11823
  }
11822
11824
  }
11823
11825
  class RteInstanceImpl {
11824
- constructor(configFacade, options) {
11826
+ constructor(instanceFacade, configFacade, options) {
11825
11827
  this.options = options;
11826
11828
  this.view = null;
11827
11829
  this.dispatchTransaction = (tr) => {
@@ -11833,6 +11835,7 @@ class RteInstanceImpl {
11833
11835
  }
11834
11836
  return this.state;
11835
11837
  };
11838
+ this.facade = instanceFacade;
11836
11839
  const config = configFacade[impl];
11837
11840
  this.config = config;
11838
11841
  this.schema = config.schema;
@@ -12748,7 +12751,7 @@ class RteHardBreakFeatureImpl extends RteFeatureImpl {
12748
12751
  const keyBindings = {
12749
12752
  "Shift-Enter": forceBreak
12750
12753
  };
12751
- return [this.contribution(keymap(keyBindings))];
12754
+ return [this.contribution(keymap(keyBindings), contributionPriority.high)];
12752
12755
  }
12753
12756
  }
12754
12757
  const RteHardBreakFeature = featureFacade(RteHardBreakFeatureImpl);
@@ -15175,6 +15178,31 @@ class RteInputRuleFeatureImpl extends RteFeatureImpl {
15175
15178
  }
15176
15179
  const RteInputRuleFeature = featureFacade(RteInputRuleFeatureImpl);
15177
15180
 
15181
+ function toCommand(handler, rteInstance) {
15182
+ if (handler.length === 0) {
15183
+ return (_state, _dispatch) => handler();
15184
+ }
15185
+ return (_state, _dispatch) => handler(rteInstance);
15186
+ }
15187
+ class RteKeyboardShortcutsFeatureImpl extends RteFeatureImpl {
15188
+ constructor(featureId, options) {
15189
+ super();
15190
+ this.featureId = featureId;
15191
+ this.options = options;
15192
+ this.name = `RteKeyboardShortcutsFeature[${featureId}]`;
15193
+ }
15194
+ getPlugins(rte) {
15195
+ const bindings = {};
15196
+ for (const [key, handler] of Object.entries(this.options.shortcuts)) {
15197
+ bindings[key] = toCommand(handler, rte.facade);
15198
+ }
15199
+ return [this.contribution(keymap(bindings), contributionPriority.high)];
15200
+ }
15201
+ }
15202
+ const RteKeyboardShortcutsFeature = featureFacade(
15203
+ RteKeyboardShortcutsFeatureImpl
15204
+ );
15205
+
15178
15206
  const suggestCss = ".suggest-popover{display:flex;flex-direction:column;padding:4px;gap:2px;max-block-size:408px;max-inline-size:248px;min-inline-size:128px}.suggest-loading-widget{display:inline-flex;align-items:center;margin-inline-start:2px;vertical-align:middle;white-space:normal}.suggest-empty-message{display:flex;align-items:center;justify-content:center;color:var(--vvd-color-neutral-300);font:var(--vvd-typography-base);min-block-size:40px;text-align:center}.suggest-item--visible-focus{box-shadow:0 0 0 4px color-mix(in srgb,var(--focus-stroke-color, var(--vvd-color-cta-500)),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent}";
15179
15207
 
15180
15208
  const isPopoverOpen = (state) => Boolean(state?.suggestions && !state.dismissed);
@@ -15546,4 +15574,4 @@ const registerRichTextEditor = createRegisterFunction(
15546
15574
  richTextEditorDefinition
15547
15575
  );
15548
15576
 
15549
- export { RteAlignmentFeature, RteAtomFeature, RteBase, RteBoldFeature, RteConfig, RteDropHandlerFeature, RteFileHandlerFeature, RteFontSizePickerFeature, RteHardBreakFeature, RteHtmlParser, RteHtmlSerializer, RteInlineImageFeature, RteInputRuleFeature, RteItalicFeature, RteLinkFeature, RteListFeature, RteMonospaceFeature, RtePlaceholderFeature, RteStrikethroughFeature, RteSuggestFeature, RteTextBlockPickerFeature, RteTextColorPickerFeature, RteToolbarButtonFeature, RteToolbarFeature, RteUnderlineFeature, RichTextEditor as VwcRichTextEditorElement, registerRichTextEditor, richTextEditorDefinition };
15577
+ export { RteAlignmentFeature, RteAtomFeature, RteBase, RteBoldFeature, RteConfig, RteDropHandlerFeature, RteFileHandlerFeature, RteFontSizePickerFeature, RteHardBreakFeature, RteHtmlParser, RteHtmlSerializer, RteInlineImageFeature, RteInputRuleFeature, RteItalicFeature, RteKeyboardShortcutsFeature, RteLinkFeature, RteListFeature, RteMonospaceFeature, RtePlaceholderFeature, RteStrikethroughFeature, RteSuggestFeature, RteTextBlockPickerFeature, RteTextColorPickerFeature, RteToolbarButtonFeature, RteToolbarFeature, RteUnderlineFeature, RichTextEditor as VwcRichTextEditorElement, registerRichTextEditor, richTextEditorDefinition };