@firecms/editor 3.0.0-rc.1 → 3.0.0-rc.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.
@@ -1,7 +1,10 @@
1
- import { type BubbleMenuProps } from "@tiptap/react";
2
1
  import { type ReactNode } from "react";
2
+ import { type BubbleMenuProps } from "@tiptap/react/menus";
3
3
  export interface EditorBubbleProps extends Omit<BubbleMenuProps, "editor"> {
4
4
  children: ReactNode;
5
+ tippyOptions?: {
6
+ placement?: any;
7
+ };
5
8
  }
6
- export declare const EditorBubble: import("react").ForwardRefExoticComponent<EditorBubbleProps & import("react").RefAttributes<HTMLDivElement>>;
9
+ export declare const EditorBubble: import("react").ForwardRefExoticComponent<Omit<EditorBubbleProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
7
10
  export default EditorBubble;
@@ -1,11 +1,11 @@
1
- export declare const placeholder: import("@tiptap/core").Extension<import("@tiptap/extension-placeholder").PlaceholderOptions, any>;
1
+ export declare const placeholder: import("@tiptap/core").Extension<import("@tiptap/extensions").PlaceholderOptions, any>;
2
2
  export declare const tiptapLink: import("@tiptap/core").Mark<import("@tiptap/extension-link").LinkOptions, any>;
3
- export declare const taskList: import("@tiptap/core").Node<import("@tiptap/extension-task-list").TaskListOptions, any>;
4
- export declare const taskItem: import("@tiptap/core").Node<import("@tiptap/extension-task-item").TaskItemOptions, any>;
3
+ export declare const taskList: import("@tiptap/core").Node<import("@tiptap/extension-list").TaskListOptions, any>;
4
+ export declare const taskItem: import("@tiptap/core").Node<import("@tiptap/extension-list").TaskItemOptions, any>;
5
5
  export declare const horizontalRule: import("@tiptap/core").Node<import("@tiptap/extension-horizontal-rule").HorizontalRuleOptions, any>;
6
- export declare const bulletList: import("@tiptap/core").Node<import("@tiptap/extension-bullet-list").BulletListOptions, any>;
7
- export declare const orderedList: import("@tiptap/core").Node<import("@tiptap/extension-ordered-list").OrderedListOptions, any>;
8
- export declare const listItem: import("@tiptap/core").Node<import("@tiptap/extension-list-item").ListItemOptions, any>;
6
+ export declare const bulletList: import("@tiptap/core").Node<import("@tiptap/extension-list").BulletListOptions, any>;
7
+ export declare const orderedList: import("@tiptap/core").Node<import("@tiptap/extension-list").OrderedListOptions, any>;
8
+ export declare const listItem: import("@tiptap/core").Node<import("@tiptap/extension-list").ListItemOptions, any>;
9
9
  export declare const blockquote: import("@tiptap/core").Node<import("@tiptap/extension-blockquote").BlockquoteOptions, any>;
10
10
  export declare const codeBlock: import("@tiptap/core").Node<import("@tiptap/extension-code-block").CodeBlockOptions, any>;
11
11
  export declare const code: import("@tiptap/core").Mark<import("@tiptap/extension-code").CodeOptions, any>;
@@ -4,7 +4,7 @@ import TiptapImage from "@tiptap/extension-image";
4
4
  import { TaskItem } from "@tiptap/extension-task-item";
5
5
  import { TaskList } from "@tiptap/extension-task-list";
6
6
  import { InputRule } from "@tiptap/core";
7
- declare const PlaceholderExtension: import("@tiptap/core").Extension<import("@tiptap/extension-placeholder").PlaceholderOptions, any>;
7
+ declare const PlaceholderExtension: import("@tiptap/core").Extension<import("@tiptap/extensions").PlaceholderOptions, any>;
8
8
  declare const Horizontal: import("@tiptap/core").Node<import("@tiptap/extension-horizontal-rule").HorizontalRuleOptions, any>;
9
9
  export { PlaceholderExtension as Placeholder, StarterKit, Horizontal as HorizontalRule, TiptapLink, TiptapImage, TaskItem, TaskList, InputRule };
10
10
  export { getPrevText } from "../utils/utils";
@@ -1,5 +1,5 @@
1
1
  import React, { ReactNode } from "react";
2
- import { Editor, Node, Range } from "@tiptap/react";
2
+ import { Editor, Node, Range } from "@tiptap/core";
3
3
  import { DOMOutputSpec, Node as ProseMirrorNode } from "@tiptap/pm/model";
4
4
  import { PluginKey } from "@tiptap/pm/state";
5
5
  import { SuggestionOptions } from "@tiptap/suggestion";
package/dist/index.es.js CHANGED
@@ -1,18 +1,20 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import React, { forwardRef, useRef, useEffect, useState, useImperativeHandle, useMemo, useDeferredValue } from "react";
3
3
  import { TextFieldsIcon, LooksOneIcon, LooksTwoIcon, Looks3Icon, CheckBoxIcon, FormatListBulletedIcon, FormatListNumberedIcon, FormatQuoteIcon, CodeIcon, CheckIcon, KeyboardArrowDownIcon, Button, Popover, cls, focusedDisabled, DeleteIcon, FormatBoldIcon, FormatItalicIcon, FormatUnderlinedIcon, FormatStrikethroughIcon, defaultBorderMixin, ImageIcon, AutoFixHighIcon, useInjectStyles, Separator } from "@firecms/ui";
4
- import { useCurrentEditor, BubbleMenu, isNodeSelection, Node, mergeAttributes, ReactRenderer, EditorProvider } from "@tiptap/react";
4
+ import { useCurrentEditor, ReactRenderer, EditorProvider } from "@tiptap/react";
5
5
  import Document from "@tiptap/extension-document";
6
6
  import { Markdown } from "tiptap-markdown";
7
7
  import Underline from "@tiptap/extension-underline";
8
8
  import Heading from "@tiptap/extension-heading";
9
- import TextStyle from "@tiptap/extension-text-style";
9
+ import { TextStyleKit } from "@tiptap/extension-text-style";
10
10
  import Color from "@tiptap/extension-color";
11
11
  import Highlight from "@tiptap/extension-highlight";
12
12
  import Bold from "@tiptap/extension-bold";
13
13
  import Italic from "@tiptap/extension-italic";
14
14
  import Strike from "@tiptap/extension-strike";
15
15
  import { c } from "react-compiler-runtime";
16
+ import { BubbleMenu } from "@tiptap/react/menus";
17
+ import { NodeSelection, PluginKey, Plugin } from "@tiptap/pm/state";
16
18
  import { Slot } from "@radix-ui/react-slot";
17
19
  import StarterKit from "@tiptap/starter-kit";
18
20
  import HorizontalRule from "@tiptap/extension-horizontal-rule";
@@ -21,8 +23,7 @@ import TiptapImage from "@tiptap/extension-image";
21
23
  import Placeholder from "@tiptap/extension-placeholder";
22
24
  import { TaskItem } from "@tiptap/extension-task-item";
23
25
  import { TaskList } from "@tiptap/extension-task-list";
24
- import { Extension, InputRule } from "@tiptap/core";
25
- import { PluginKey, Plugin, NodeSelection } from "@tiptap/pm/state";
26
+ import { Extension, InputRule, Node, mergeAttributes } from "@tiptap/core";
26
27
  import { DecorationSet, Decoration } from "@tiptap/pm/view";
27
28
  import OrderedList from "@tiptap/extension-ordered-list";
28
29
  import BulletList from "@tiptap/extension-bullet-list";
@@ -32,118 +33,89 @@ import Blockquote from "@tiptap/extension-blockquote";
32
33
  import Code from "@tiptap/extension-code";
33
34
  import { DOMSerializer } from "@tiptap/pm/model";
34
35
  import Suggestion from "@tiptap/suggestion";
35
- import tippy from "tippy.js";
36
+ import { computePosition, offset, flip, shift, autoUpdate } from "@floating-ui/dom";
36
37
  const EditorBubble = forwardRef((t0, ref) => {
37
- const $ = c(21);
38
+ const $ = c(18);
38
39
  let children;
40
+ let options;
39
41
  let rest;
40
42
  let tippyOptions;
41
43
  if ($[0] !== t0) {
42
44
  ({
43
45
  children,
44
46
  tippyOptions,
47
+ options,
45
48
  ...rest
46
49
  } = t0);
47
50
  $[0] = t0;
48
51
  $[1] = children;
49
- $[2] = rest;
50
- $[3] = tippyOptions;
52
+ $[2] = options;
53
+ $[3] = rest;
54
+ $[4] = tippyOptions;
51
55
  } else {
52
56
  children = $[1];
53
- rest = $[2];
54
- tippyOptions = $[3];
57
+ options = $[2];
58
+ rest = $[3];
59
+ tippyOptions = $[4];
55
60
  }
56
61
  const {
57
62
  editor
58
63
  } = useCurrentEditor();
59
- const instanceRef = useRef(null);
64
+ tippyOptions?.placement;
60
65
  let t1;
61
- if ($[4] !== tippyOptions) {
62
- t1 = () => {
63
- if (!instanceRef.current || !tippyOptions?.placement) {
64
- return;
65
- }
66
- instanceRef.current.setProps({
67
- placement: tippyOptions.placement
68
- });
69
- instanceRef.current.popperInstance?.update();
70
- };
71
- $[4] = tippyOptions;
72
- $[5] = t1;
73
- } else {
74
- t1 = $[5];
75
- }
76
- const t2 = tippyOptions?.placement;
66
+ const shouldShow = _temp$1;
67
+ const t2 = tippyOptions?.placement ?? options?.placement;
77
68
  let t3;
78
- if ($[6] !== t2) {
79
- t3 = [t2];
69
+ if ($[5] !== options || $[6] !== t2) {
70
+ t3 = {
71
+ ...options,
72
+ placement: t2
73
+ };
74
+ $[5] = options;
80
75
  $[6] = t2;
81
76
  $[7] = t3;
82
77
  } else {
83
78
  t3 = $[7];
84
79
  }
85
- useEffect(t1, t3);
80
+ const mergedOptions = t3;
86
81
  let t4;
87
- const shouldShow = _temp$1;
88
- let t5;
89
- if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
90
- t5 = (val) => {
91
- instanceRef.current = val;
92
- };
93
- $[8] = t5;
94
- } else {
95
- t5 = $[8];
96
- }
97
- let t6;
98
- if ($[9] !== tippyOptions) {
99
- t6 = {
100
- onCreate: t5,
101
- moveTransition: "transform 0.15s ease-out",
102
- ...tippyOptions
103
- };
104
- $[9] = tippyOptions;
105
- $[10] = t6;
106
- } else {
107
- t6 = $[10];
108
- }
109
- let t7;
110
- if ($[11] !== rest || $[12] !== t6) {
111
- t7 = {
82
+ if ($[8] !== mergedOptions || $[9] !== rest) {
83
+ t4 = {
112
84
  shouldShow,
113
- tippyOptions: t6,
85
+ options: mergedOptions,
114
86
  ...rest
115
87
  };
116
- $[11] = rest;
117
- $[12] = t6;
118
- $[13] = t7;
88
+ $[8] = mergedOptions;
89
+ $[9] = rest;
90
+ $[10] = t4;
119
91
  } else {
120
- t7 = $[13];
92
+ t4 = $[10];
121
93
  }
122
- t4 = t7;
123
- const bubbleMenuProps = t4;
94
+ t1 = t4;
95
+ const bubbleMenuProps = t1;
124
96
  if (!editor) {
125
97
  return null;
126
98
  }
127
- let t8;
128
- if ($[14] !== bubbleMenuProps || $[15] !== children || $[16] !== editor) {
129
- t8 = /* @__PURE__ */ jsx(BubbleMenu, { editor, ...bubbleMenuProps, children });
130
- $[14] = bubbleMenuProps;
131
- $[15] = children;
132
- $[16] = editor;
133
- $[17] = t8;
99
+ let t5;
100
+ if ($[11] !== bubbleMenuProps || $[12] !== children || $[13] !== editor) {
101
+ t5 = /* @__PURE__ */ jsx(BubbleMenu, { editor, ...bubbleMenuProps, children });
102
+ $[11] = bubbleMenuProps;
103
+ $[12] = children;
104
+ $[13] = editor;
105
+ $[14] = t5;
134
106
  } else {
135
- t8 = $[17];
107
+ t5 = $[14];
136
108
  }
137
- let t9;
138
- if ($[18] !== ref || $[19] !== t8) {
139
- t9 = /* @__PURE__ */ jsx("div", { ref, children: t8 });
140
- $[18] = ref;
141
- $[19] = t8;
142
- $[20] = t9;
109
+ let t6;
110
+ if ($[15] !== ref || $[16] !== t5) {
111
+ t6 = /* @__PURE__ */ jsx("div", { ref, children: t5 });
112
+ $[15] = ref;
113
+ $[16] = t5;
114
+ $[17] = t6;
143
115
  } else {
144
- t9 = $[20];
116
+ t6 = $[17];
145
117
  }
146
- return t9;
118
+ return t6;
147
119
  });
148
120
  function _temp$1(t0) {
149
121
  const {
@@ -156,7 +128,7 @@ function _temp$1(t0) {
156
128
  const {
157
129
  empty
158
130
  } = selection;
159
- if (editor_0.isActive("image") || empty || isNodeSelection(selection)) {
131
+ if (editor_0.isActive("image") || empty || selection instanceof NodeSelection) {
160
132
  return false;
161
133
  }
162
134
  return true;
@@ -1324,8 +1296,7 @@ const SlashCommand = Node.create({
1324
1296
  }) => {
1325
1297
  const $from = state.doc.resolve(range.from);
1326
1298
  const type = state.schema.nodes[this.name];
1327
- const allow = !!$from.parent.type.contentMatch.matchType(type);
1328
- return allow;
1299
+ return !!$from.parent.type.contentMatch.matchType(type);
1329
1300
  }
1330
1301
  }
1331
1302
  };
@@ -1455,13 +1426,14 @@ const suggestion = (ref, {
1455
1426
  return availableSuggestionItems.filter((item) => {
1456
1427
  const inTitle = item.title.toLowerCase().startsWith(query.toLowerCase());
1457
1428
  if (inTitle) return inTitle;
1458
- const inSearchTerms = item.searchTerms?.some((term) => term.toLowerCase().startsWith(query.toLowerCase()));
1459
- return inSearchTerms;
1429
+ return item.searchTerms?.some((term) => term.toLowerCase().startsWith(query.toLowerCase()));
1460
1430
  });
1461
1431
  },
1462
1432
  render: () => {
1463
1433
  let component;
1464
- let popup;
1434
+ let containerEl = null;
1435
+ let cleanupAutoUpdate = null;
1436
+ let reference = null;
1465
1437
  return {
1466
1438
  onStart: (props) => {
1467
1439
  component = new ReactRenderer(CommandList, {
@@ -1475,35 +1447,69 @@ const suggestion = (ref, {
1475
1447
  if (!props.clientRect) {
1476
1448
  return;
1477
1449
  }
1478
- popup = tippy("body", {
1479
- getReferenceClientRect: props.clientRect,
1480
- appendTo: ref?.current,
1481
- content: component.element,
1482
- showOnCreate: true,
1483
- interactive: true,
1484
- trigger: "manual",
1485
- placement: "bottom-start"
1450
+ containerEl = document.createElement("div");
1451
+ containerEl.style.position = "fixed";
1452
+ containerEl.style.left = "0px";
1453
+ containerEl.style.top = "0px";
1454
+ containerEl.style.zIndex = "9999";
1455
+ (ref?.current || document.body).appendChild(containerEl);
1456
+ containerEl.appendChild(component.element);
1457
+ reference = {
1458
+ getBoundingClientRect: props.clientRect
1459
+ };
1460
+ cleanupAutoUpdate = autoUpdate(reference, containerEl, () => {
1461
+ if (!reference) return;
1462
+ computePosition(reference, containerEl, {
1463
+ placement: "bottom-start",
1464
+ middleware: [offset(4), flip(), shift()],
1465
+ strategy: "fixed"
1466
+ }).then(({
1467
+ x,
1468
+ y
1469
+ }) => {
1470
+ Object.assign(containerEl.style, {
1471
+ left: `${x}px`,
1472
+ top: `${y}px`,
1473
+ visibility: "visible"
1474
+ });
1475
+ });
1486
1476
  });
1487
1477
  },
1488
1478
  onUpdate(props) {
1489
1479
  component.updateProps(props);
1490
- if (!props.clientRect) {
1480
+ if (!props.clientRect || !containerEl || !reference) {
1491
1481
  return;
1492
1482
  }
1493
- popup[0].setProps({
1494
- getReferenceClientRect: props.clientRect
1483
+ reference.getBoundingClientRect = props.clientRect;
1484
+ computePosition(reference, containerEl, {
1485
+ placement: "bottom-start",
1486
+ middleware: [offset(4), flip(), shift()],
1487
+ strategy: "fixed"
1488
+ }).then(({
1489
+ x,
1490
+ y
1491
+ }) => {
1492
+ Object.assign(containerEl.style, {
1493
+ left: `${x}px`,
1494
+ top: `${y}px`,
1495
+ visibility: "visible"
1496
+ });
1495
1497
  });
1496
1498
  },
1497
1499
  onKeyDown(props) {
1498
1500
  if (props.event.key === "Escape") {
1499
- popup[0].hide();
1500
1501
  props.event.preventDefault();
1501
1502
  return true;
1502
1503
  }
1503
1504
  return component.ref?.onKeyDown(props);
1504
1505
  },
1505
1506
  onExit() {
1506
- if (popup && popup[0]) popup[0].destroy();
1507
+ if (cleanupAutoUpdate) cleanupAutoUpdate();
1508
+ if (containerEl && containerEl.parentNode) {
1509
+ containerEl.parentNode.removeChild(containerEl);
1510
+ }
1511
+ containerEl = null;
1512
+ reference = null;
1507
1513
  component?.destroy();
1508
1514
  }
1509
1515
  };
@@ -1865,14 +1871,12 @@ const suggestionItems = [{
1865
1871
  input.click();
1866
1872
  }
1867
1873
  }];
1868
- const CustomDocument = Document.extend({
1869
- // content: 'heading block*',
1870
- });
1871
1874
  const proseClasses = {
1872
1875
  "sm": "prose-sm",
1873
1876
  "base": "prose-base",
1874
1877
  "lg": "prose-lg"
1875
1878
  };
1879
+ const canUseDOM = Boolean(typeof window !== "undefined" && window.document && window.document.createElement);
1876
1880
  const FireCMSEditor = ({
1877
1881
  content,
1878
1882
  onJsonContentChange,
@@ -1933,7 +1937,7 @@ const FireCMSEditor = ({
1933
1937
  }
1934
1938
  };
1935
1939
  const proseClass = proseClasses[textSize];
1936
- const extensions = useMemo(() => [starterKit, CustomDocument, HighlightDecorationExtension(highlight), TextLoadingDecorationExtension, Underline, Bold, TextStyle, Italic, Strike, Color, Highlight.configure({
1940
+ const extensions = useMemo(() => [starterKit, Document.extend({}), HighlightDecorationExtension(highlight), TextLoadingDecorationExtension, Underline, Bold, TextStyleKit, Italic, Strike, Color, Highlight.configure({
1937
1941
  multicolor: true
1938
1942
  }), Heading, CustomKeymap, DragAndDrop, placeholder, tiptapLink, imageExtension, taskList, taskItem, Markdown.configure({
1939
1943
  html: true
@@ -1946,7 +1950,7 @@ const FireCMSEditor = ({
1946
1950
  aiController
1947
1951
  })
1948
1952
  })], []);
1949
- return /* @__PURE__ */ jsx("div", { ref, className: "relative min-h-[300px] w-full", children: /* @__PURE__ */ jsx(EditorProvider, { content: content ?? "", extensions, editorProps: {
1953
+ return /* @__PURE__ */ jsx("div", { ref, className: "relative min-h-[300px] w-full", children: /* @__PURE__ */ jsx(EditorProvider, { content: content ?? "", extensions, immediatelyRender: canUseDOM, editorProps: {
1950
1954
  editable: () => !disabled,
1951
1955
  attributes: {
1952
1956
  class: cls(proseClass, "prose-headings:font-title font-default focus:outline-none max-w-full p-12")
@@ -1960,8 +1964,9 @@ const FireCMSEditor = ({
1960
1964
  editor: editor_1
1961
1965
  }) => {
1962
1966
  onEditorUpdate(editor_1);
1963
- }, children: /* @__PURE__ */ jsxs(EditorBubble, { tippyOptions: {
1964
- placement: "top"
1967
+ }, children: /* @__PURE__ */ jsxs(EditorBubble, { options: {
1968
+ placement: "top",
1969
+ offset: 6
1965
1970
  }, className: cls("flex w-fit max-w-[90vw] h-10 overflow-hidden rounded border bg-white dark:bg-surface-900 shadow", defaultBorderMixin), children: [
1966
1971
  /* @__PURE__ */ jsx(NodeSelector, { portalContainer: ref.current, open: openNode, onOpenChange: setOpenNode }),
1967
1972
  /* @__PURE__ */ jsx(Separator, { orientation: "vertical" }),
@@ -2134,7 +2139,7 @@ ul[data-type="taskList"] li[data-checked="true"] > div > p {
2134
2139
  transition: opacity ease-in 0.2s;
2135
2140
  border-radius: 0.25rem;
2136
2141
 
2137
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(128, 128, 128, 0.9)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7.55228475,8 8,8.44771525 8,9 C8,9.55228475 7.55228475,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E");
2142
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(128, 128, 128, 0.9)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7,8.44771525 7,9 7,9 C7,9.55228475 7,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E");
2138
2143
  background-size: calc(0.5em + 0.375rem) calc(0.5em + 0.375rem);
2139
2144
  background-repeat: no-repeat;
2140
2145
  background-position: center;