@m3ui-vue/m3ui-vue 0.5.1 → 0.5.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,5 +1,6 @@
1
- import { a as e, f as t, i as n, n as r, r as i, t as a } from "./MMenuItem-Dw2ARZic.js";
2
- import { t as o } from "./MIcon-CaEooCmZ.js";
1
+ import { r as e } from "./useLocale-QCIVDYWx.js";
2
+ import { t } from "./MIcon-CaEooCmZ.js";
3
+ import { a as n, i as r, n as i, r as a, t as o } from "./MMenuItem-DyY4zhRA.js";
3
4
  import { t as s } from "./_plugin-vue_export-helper-B3ysoDQm.js";
4
5
  import { Fragment as c, computed as l, createCommentVNode as u, createElementBlock as d, createElementVNode as f, createTextVNode as p, createVNode as m, defineComponent as h, normalizeClass as g, normalizeStyle as _, onBeforeUnmount as v, onMounted as y, openBlock as b, ref as x, renderList as S, shallowRef as C, toDisplayString as w, watch as T, withCtx as E, withKeys as D } from "vue";
5
6
  //#region src/components/MRichTextEditor.vue?vue&type=script&setup=true&lang.ts
@@ -26,7 +27,7 @@ var O = {
26
27
  },
27
28
  emits: ["update:modelValue"],
28
29
  setup(s, { emit: h }) {
29
- let P = t(), F = s, I = l(() => ({
30
+ let P = e(), F = s, I = l(() => ({
30
31
  bold: P.bold,
31
32
  italic: P.italic,
32
33
  underline: P.underline,
@@ -194,27 +195,27 @@ var O = {
194
195
  function Z() {
195
196
  G.value && z.value?.chain().focus().setImage({ src: G.value }).run(), W.value = !1;
196
197
  }
197
- return (t, l) => (b(), d("div", { class: g(["overflow-hidden rounded-lg border transition-colors duration-150", s.disabled ? "border-outline-variant/50 opacity-60" : "border-outline-variant focus-within:border-primary"]) }, [
198
+ return (e, l) => (b(), d("div", { class: g(["overflow-hidden rounded-lg border transition-colors duration-150", s.disabled ? "border-outline-variant/50 opacity-60" : "border-outline-variant focus-within:border-primary"]) }, [
198
199
  R.value ? (b(), d("div", O, [
199
- m(r, { align: "left" }, {
200
- trigger: E(() => [f("button", k, [p(w(K.value) + " ", 1), m(o, {
200
+ m(i, { align: "left" }, {
201
+ trigger: E(() => [f("button", k, [p(w(K.value) + " ", 1), m(t, {
201
202
  name: "arrow_drop_down",
202
203
  size: 20
203
204
  })])]),
204
205
  default: E(() => [
205
- m(a, { onClick: l[0] ||= (e) => q(0) }, {
206
+ m(o, { onClick: l[0] ||= (e) => q(0) }, {
206
207
  default: E(() => [p(w(I.value.paragraph), 1)]),
207
208
  _: 1
208
209
  }),
209
- m(a, { onClick: l[1] ||= (e) => q(1) }, {
210
+ m(o, { onClick: l[1] ||= (e) => q(1) }, {
210
211
  default: E(() => [p(w(I.value.heading1), 1)]),
211
212
  _: 1
212
213
  }),
213
- m(a, { onClick: l[2] ||= (e) => q(2) }, {
214
+ m(o, { onClick: l[2] ||= (e) => q(2) }, {
214
215
  default: E(() => [p(w(I.value.heading2), 1)]),
215
216
  _: 1
216
217
  }),
217
- m(a, { onClick: l[3] ||= (e) => q(3) }, {
218
+ m(o, { onClick: l[3] ||= (e) => q(3) }, {
218
219
  default: E(() => [p(w(I.value.heading3), 1)]),
219
220
  _: 1
220
221
  })
@@ -222,23 +223,23 @@ var O = {
222
223
  _: 1
223
224
  }),
224
225
  l[10] ||= f("div", { class: "mx-1 h-6 w-px bg-outline-variant" }, null, -1),
225
- (b(!0), d(c, null, S(V.value, (e, t) => (b(), d(c, { key: t }, [(b(!0), d(c, null, S(e, (e) => (b(), d("button", {
226
+ (b(!0), d(c, null, S(V.value, (e, n) => (b(), d(c, { key: n }, [(b(!0), d(c, null, S(e, (e) => (b(), d("button", {
226
227
  key: e.icon,
227
228
  type: "button",
228
229
  title: e.label,
229
230
  class: g(["flex h-8 w-8 cursor-pointer items-center justify-center rounded transition-colors duration-100", e.active?.() ? "bg-secondary-container text-on-secondary-container" : "text-on-surface-variant hover:bg-on-surface/8"]),
230
231
  onClick: e.action
231
- }, [m(o, {
232
+ }, [m(t, {
232
233
  name: e.icon,
233
234
  size: 20
234
- }, null, 8, ["name"])], 10, A))), 128)), t < V.value.length - 1 ? (b(), d("div", j)) : u("", !0)], 64))), 128)),
235
+ }, null, 8, ["name"])], 10, A))), 128)), n < V.value.length - 1 ? (b(), d("div", j)) : u("", !0)], 64))), 128)),
235
236
  l[11] ||= f("div", { class: "mx-1 h-6 w-px bg-outline-variant" }, null, -1),
236
237
  f("button", {
237
238
  type: "button",
238
239
  title: I.value.link,
239
240
  class: "flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8",
240
241
  onClick: J
241
- }, [m(o, {
242
+ }, [m(t, {
242
243
  name: "link",
243
244
  size: 20
244
245
  })], 8, M),
@@ -247,7 +248,7 @@ var O = {
247
248
  title: I.value.image,
248
249
  class: "flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8",
249
250
  onClick: X
250
- }, [m(o, {
251
+ }, [m(t, {
251
252
  name: "image",
252
253
  size: 20
253
254
  })], 8, N)
@@ -258,22 +259,22 @@ var O = {
258
259
  class: "rte-content bg-surface px-4 py-3 text-body-large text-on-surface",
259
260
  style: _({ minHeight: s.minHeight })
260
261
  }, null, 4),
261
- m(n, {
262
+ m(r, {
262
263
  modelValue: H.value,
263
264
  "onUpdate:modelValue": l[6] ||= (e) => H.value = e,
264
265
  title: I.value.insertLink
265
266
  }, {
266
- actions: E(() => [m(e, {
267
+ actions: E(() => [m(n, {
267
268
  variant: "text",
268
269
  onClick: l[5] ||= (e) => H.value = !1
269
270
  }, {
270
271
  default: E(() => [p(w(I.value.cancel), 1)]),
271
272
  _: 1
272
- }), m(e, { onClick: Y }, {
273
+ }), m(n, { onClick: Y }, {
273
274
  default: E(() => [p(w(I.value.insert), 1)]),
274
275
  _: 1
275
276
  })]),
276
- default: E(() => [m(i, {
277
+ default: E(() => [m(a, {
277
278
  modelValue: U.value,
278
279
  "onUpdate:modelValue": l[4] ||= (e) => U.value = e,
279
280
  label: "URL",
@@ -282,22 +283,22 @@ var O = {
282
283
  }, null, 8, ["modelValue"])]),
283
284
  _: 1
284
285
  }, 8, ["modelValue", "title"]),
285
- m(n, {
286
+ m(r, {
286
287
  modelValue: W.value,
287
288
  "onUpdate:modelValue": l[9] ||= (e) => W.value = e,
288
289
  title: I.value.insertImage
289
290
  }, {
290
- actions: E(() => [m(e, {
291
+ actions: E(() => [m(n, {
291
292
  variant: "text",
292
293
  onClick: l[8] ||= (e) => W.value = !1
293
294
  }, {
294
295
  default: E(() => [p(w(I.value.cancel), 1)]),
295
296
  _: 1
296
- }), m(e, { onClick: Z }, {
297
+ }), m(n, { onClick: Z }, {
297
298
  default: E(() => [p(w(I.value.insert), 1)]),
298
299
  _: 1
299
300
  })]),
300
- default: E(() => [m(i, {
301
+ default: E(() => [m(a, {
301
302
  modelValue: G.value,
302
303
  "onUpdate:modelValue": l[7] ||= (e) => G.value = e,
303
304
  label: I.value.imageUrlLabel,
@@ -1 +1 @@
1
- {"version":3,"file":"rich-text-editor.js","names":[],"sources":["../src/components/MRichTextEditor.vue","../src/components/MRichTextEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount, shallowRef, computed } from 'vue'\nimport MIcon from './MIcon.vue'\nimport MMenu from './MMenu.vue'\nimport MMenuItem from './MMenuItem.vue'\nimport MDialog from './MDialog.vue'\nimport MTextField from './MTextField.vue'\nimport MButton from './MButton.vue'\nimport { useLocale } from '../composables/useLocale'\n\nexport interface RichTextEditorLabels {\n bold?: string\n italic?: string\n underline?: string\n strikethrough?: string\n highlight?: string\n bulletList?: string\n orderedList?: string\n blockquote?: string\n code?: string\n alignLeft?: string\n alignCenter?: string\n alignRight?: string\n undo?: string\n redo?: string\n link?: string\n image?: string\n paragraph?: string\n heading1?: string\n heading2?: string\n heading3?: string\n insertLink?: string\n insertImage?: string\n imageUrlLabel?: string\n cancel?: string\n insert?: string\n}\n\nconst locale = useLocale()\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string\n placeholder?: string\n disabled?: boolean\n minHeight?: string\n labels?: RichTextEditorLabels\n }>(),\n { disabled: false, minHeight: '200px' },\n)\n\nconst l = computed<Required<RichTextEditorLabels>>(() => ({\n bold: locale.bold,\n italic: locale.italic,\n underline: locale.underline,\n strikethrough: locale.strikethrough,\n highlight: locale.highlight,\n bulletList: locale.bulletList,\n orderedList: locale.orderedList,\n blockquote: locale.blockquote,\n code: locale.code,\n alignLeft: locale.alignLeft,\n alignCenter: locale.alignCenter,\n alignRight: locale.alignRight,\n undo: locale.undo,\n redo: locale.redo,\n link: locale.link,\n image: locale.image,\n paragraph: locale.paragraph,\n heading1: locale.heading1,\n heading2: locale.heading2,\n heading3: locale.heading3,\n insertLink: locale.insertLink,\n insertImage: locale.insertImage,\n imageUrlLabel: locale.imageUrlLabel,\n cancel: locale.cancel,\n insert: locale.insert,\n ...props.labels,\n}))\n\nconst emit = defineEmits<{ 'update:modelValue': [string] }>()\n\nconst ready = ref(false)\nconst editorRef = shallowRef<any>(null)\nconst editorContainer = ref<HTMLElement | null>(null)\n\ninterface ToolBtn {\n icon: string\n label: string\n action: () => void\n active?: () => boolean\n}\n\nconst toolGroups = ref<ToolBtn[][]>([])\n\nonMounted(async () => {\n const [\n { Editor },\n { default: StarterKit },\n { default: Underline },\n { default: TextAlign },\n { default: Link },\n { default: Image },\n { default: Highlight },\n { default: Placeholder },\n { TextStyle },\n { default: Color },\n ] = await Promise.all([\n import('@tiptap/vue-3'),\n import('@tiptap/starter-kit'),\n import('@tiptap/extension-underline'),\n import('@tiptap/extension-text-align'),\n import('@tiptap/extension-link'),\n import('@tiptap/extension-image'),\n import('@tiptap/extension-highlight'),\n import('@tiptap/extension-placeholder'),\n import('@tiptap/extension-text-style'),\n import('@tiptap/extension-color'),\n ])\n\n const editor = new Editor({\n element: editorContainer.value!,\n content: props.modelValue,\n editable: !props.disabled,\n extensions: [\n StarterKit,\n Underline,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Link.configure({ openOnClick: false }),\n Image,\n Highlight.configure({ multicolor: true }),\n Placeholder.configure({ placeholder: props.placeholder ?? 'Start writing...' }),\n TextStyle,\n Color,\n ],\n onUpdate: ({ editor: e }) => emit('update:modelValue', e.getHTML()),\n })\n\n editorRef.value = editor\n\n toolGroups.value = [\n [\n { icon: 'format_bold', label: l.value.bold, action: () => editor.chain().focus().toggleBold().run(), active: () => !!editor.isActive('bold') },\n { icon: 'format_italic', label: l.value.italic, action: () => editor.chain().focus().toggleItalic().run(), active: () => !!editor.isActive('italic') },\n { icon: 'format_underlined', label: l.value.underline, action: () => editor.chain().focus().toggleUnderline().run(), active: () => !!editor.isActive('underline') },\n { icon: 'format_strikethrough', label: l.value.strikethrough, action: () => editor.chain().focus().toggleStrike().run(), active: () => !!editor.isActive('strike') },\n { icon: 'ink_highlighter', label: l.value.highlight, action: () => editor.chain().focus().toggleHighlight().run(), active: () => !!editor.isActive('highlight') },\n ],\n [\n { icon: 'format_list_bulleted', label: l.value.bulletList, action: () => editor.chain().focus().toggleBulletList().run(), active: () => !!editor.isActive('bulletList') },\n { icon: 'format_list_numbered', label: l.value.orderedList, action: () => editor.chain().focus().toggleOrderedList().run(), active: () => !!editor.isActive('orderedList') },\n { icon: 'format_quote', label: l.value.blockquote, action: () => editor.chain().focus().toggleBlockquote().run(), active: () => !!editor.isActive('blockquote') },\n { icon: 'code', label: l.value.code, action: () => editor.chain().focus().toggleCode().run(), active: () => !!editor.isActive('code') },\n ],\n [\n { icon: 'format_align_left', label: l.value.alignLeft, action: () => editor.chain().focus().setTextAlign('left').run(), active: () => !!editor.isActive({ textAlign: 'left' }) },\n { icon: 'format_align_center', label: l.value.alignCenter, action: () => editor.chain().focus().setTextAlign('center').run(), active: () => !!editor.isActive({ textAlign: 'center' }) },\n { icon: 'format_align_right', label: l.value.alignRight, action: () => editor.chain().focus().setTextAlign('right').run(), active: () => !!editor.isActive({ textAlign: 'right' }) },\n ],\n [\n { icon: 'undo', label: l.value.undo, action: () => editor.chain().focus().undo().run() },\n { icon: 'redo', label: l.value.redo, action: () => editor.chain().focus().redo().run() },\n ],\n ]\n\n onBeforeUnmount(() => editor.destroy())\n\n watch(() => props.modelValue, (val) => {\n if (editor.getHTML() !== val) editor.commands.setContent(val)\n })\n\n watch(() => props.disabled, (v) => editor.setEditable(!v))\n\n ready.value = true\n})\n\nconst linkDialogOpen = ref(false)\nconst linkUrl = ref('')\nconst imageDialogOpen = ref(false)\nconst imageUrl = ref('')\n\nconst headingLabel = computed(() => {\n const e = editorRef.value\n if (!e) return l.value.paragraph\n if (e.isActive('heading', { level: 1 })) return l.value.heading1\n if (e.isActive('heading', { level: 2 })) return l.value.heading2\n if (e.isActive('heading', { level: 3 })) return l.value.heading3\n return l.value.paragraph\n})\n\nfunction setHeading(level: 0 | 1 | 2 | 3) {\n if (level === 0) editorRef.value?.chain().focus().setParagraph().run()\n else editorRef.value?.chain().focus().toggleHeading({ level }).run()\n}\n\nfunction openLinkDialog() {\n linkUrl.value = ''\n linkDialogOpen.value = true\n}\n\nfunction confirmLink() {\n if (linkUrl.value) editorRef.value?.chain().focus().setLink({ href: linkUrl.value }).run()\n linkDialogOpen.value = false\n}\n\nfunction openImageDialog() {\n imageUrl.value = ''\n imageDialogOpen.value = true\n}\n\nfunction confirmImage() {\n if (imageUrl.value) editorRef.value?.chain().focus().setImage({ src: imageUrl.value }).run()\n imageDialogOpen.value = false\n}\n</script>\n\n<template>\n <div\n class=\"overflow-hidden rounded-lg border transition-colors duration-150\"\n :class=\"disabled ? 'border-outline-variant/50 opacity-60' : 'border-outline-variant focus-within:border-primary'\"\n >\n <!-- Toolbar -->\n <div v-if=\"ready\" class=\"flex flex-wrap items-center gap-0.5 border-b border-outline-variant bg-surface-container px-2 py-1.5\">\n <!-- Heading menu -->\n <MMenu align=\"left\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"flex h-8 cursor-pointer items-center gap-1 rounded px-2 text-label-large text-on-surface-variant hover:bg-on-surface/8\"\n >\n {{ headingLabel }}\n <MIcon name=\"arrow_drop_down\" :size=\"20\" />\n </button>\n </template>\n <MMenuItem @click=\"setHeading(0)\">{{ l.paragraph }}</MMenuItem>\n <MMenuItem @click=\"setHeading(1)\">{{ l.heading1 }}</MMenuItem>\n <MMenuItem @click=\"setHeading(2)\">{{ l.heading2 }}</MMenuItem>\n <MMenuItem @click=\"setHeading(3)\">{{ l.heading3 }}</MMenuItem>\n </MMenu>\n\n <div class=\"mx-1 h-6 w-px bg-outline-variant\" />\n\n <template v-for=\"(group, gi) in toolGroups\" :key=\"gi\">\n <button\n v-for=\"btn in group\"\n :key=\"btn.icon\"\n type=\"button\"\n :title=\"btn.label\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded transition-colors duration-100\"\n :class=\"btn.active?.() ? 'bg-secondary-container text-on-secondary-container' : 'text-on-surface-variant hover:bg-on-surface/8'\"\n @click=\"btn.action\"\n >\n <MIcon :name=\"btn.icon\" :size=\"20\" />\n </button>\n <div v-if=\"gi < toolGroups.length - 1\" class=\"mx-1 h-6 w-px bg-outline-variant\" />\n </template>\n\n <div class=\"mx-1 h-6 w-px bg-outline-variant\" />\n\n <button\n type=\"button\"\n :title=\"l.link\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8\"\n @click=\"openLinkDialog\"\n >\n <MIcon name=\"link\" :size=\"20\" />\n </button>\n <button\n type=\"button\"\n :title=\"l.image\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8\"\n @click=\"openImageDialog\"\n >\n <MIcon name=\"image\" :size=\"20\" />\n </button>\n </div>\n\n <!-- Editor content -->\n <div\n ref=\"editorContainer\"\n class=\"rte-content bg-surface px-4 py-3 text-body-large text-on-surface\"\n :style=\"{ minHeight: minHeight }\"\n />\n\n <!-- Link dialog -->\n <MDialog v-model=\"linkDialogOpen\" :title=\"l.insertLink\">\n <MTextField v-model=\"linkUrl\" label=\"URL\" placeholder=\" \" @keydown.enter=\"confirmLink\" />\n <template #actions>\n <MButton variant=\"text\" @click=\"linkDialogOpen = false\">{{ l.cancel }}</MButton>\n <MButton @click=\"confirmLink\">{{ l.insert }}</MButton>\n </template>\n </MDialog>\n\n <!-- Image dialog -->\n <MDialog v-model=\"imageDialogOpen\" :title=\"l.insertImage\">\n <MTextField v-model=\"imageUrl\" :label=\"l.imageUrlLabel\" placeholder=\" \" @keydown.enter=\"confirmImage\" />\n <template #actions>\n <MButton variant=\"text\" @click=\"imageDialogOpen = false\">{{ l.cancel }}</MButton>\n <MButton @click=\"confirmImage\">{{ l.insert }}</MButton>\n </template>\n </MDialog>\n </div>\n</template>\n\n<style scoped>\n.rte-content :deep(.tiptap) {\n outline: none;\n min-height: inherit;\n}\n\n.rte-content :deep(.tiptap p.is-editor-empty:first-child::before) {\n content: attr(data-placeholder);\n float: left;\n color: var(--color-on-surface-variant);\n opacity: 0.5;\n pointer-events: none;\n height: 0;\n}\n\n.rte-content :deep(h1) { font-size: var(--text-headline-large); line-height: var(--text-headline-large--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(h2) { font-size: var(--text-headline-medium); line-height: var(--text-headline-medium--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(h3) { font-size: var(--text-headline-small); line-height: var(--text-headline-small--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(p) { margin: 0.5em 0; }\n.rte-content :deep(ul) { list-style-type: disc; padding-left: 1.5em; margin: 0.5em 0; }\n.rte-content :deep(ol) { list-style-type: decimal; padding-left: 1.5em; margin: 0.5em 0; }\n.rte-content :deep(blockquote) { border-left: 3px solid var(--color-primary); padding-left: 1em; margin: 0.5em 0; color: var(--color-on-surface-variant); }\n.rte-content :deep(code) { background: var(--color-surface-container-highest); padding: 0.15em 0.4em; border-radius: 4px; font-size: 0.875em; }\n.rte-content :deep(pre) { background: var(--color-surface-container-highest); padding: 1em; border-radius: 8px; overflow-x: auto; margin: 0.5em 0; }\n.rte-content :deep(pre code) { background: none; padding: 0; }\n.rte-content :deep(a) { color: var(--color-primary); text-decoration: underline; }\n.rte-content :deep(mark) { background: var(--color-tertiary-container); color: var(--color-on-tertiary-container); padding: 0.1em 0.2em; border-radius: 2px; }\n.rte-content :deep(img) { max-width: 100%; height: auto; border-radius: 8px; margin: 0.5em 0; }\n</style>\n","<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount, shallowRef, computed } from 'vue'\nimport MIcon from './MIcon.vue'\nimport MMenu from './MMenu.vue'\nimport MMenuItem from './MMenuItem.vue'\nimport MDialog from './MDialog.vue'\nimport MTextField from './MTextField.vue'\nimport MButton from './MButton.vue'\nimport { useLocale } from '../composables/useLocale'\n\nexport interface RichTextEditorLabels {\n bold?: string\n italic?: string\n underline?: string\n strikethrough?: string\n highlight?: string\n bulletList?: string\n orderedList?: string\n blockquote?: string\n code?: string\n alignLeft?: string\n alignCenter?: string\n alignRight?: string\n undo?: string\n redo?: string\n link?: string\n image?: string\n paragraph?: string\n heading1?: string\n heading2?: string\n heading3?: string\n insertLink?: string\n insertImage?: string\n imageUrlLabel?: string\n cancel?: string\n insert?: string\n}\n\nconst locale = useLocale()\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string\n placeholder?: string\n disabled?: boolean\n minHeight?: string\n labels?: RichTextEditorLabels\n }>(),\n { disabled: false, minHeight: '200px' },\n)\n\nconst l = computed<Required<RichTextEditorLabels>>(() => ({\n bold: locale.bold,\n italic: locale.italic,\n underline: locale.underline,\n strikethrough: locale.strikethrough,\n highlight: locale.highlight,\n bulletList: locale.bulletList,\n orderedList: locale.orderedList,\n blockquote: locale.blockquote,\n code: locale.code,\n alignLeft: locale.alignLeft,\n alignCenter: locale.alignCenter,\n alignRight: locale.alignRight,\n undo: locale.undo,\n redo: locale.redo,\n link: locale.link,\n image: locale.image,\n paragraph: locale.paragraph,\n heading1: locale.heading1,\n heading2: locale.heading2,\n heading3: locale.heading3,\n insertLink: locale.insertLink,\n insertImage: locale.insertImage,\n imageUrlLabel: locale.imageUrlLabel,\n cancel: locale.cancel,\n insert: locale.insert,\n ...props.labels,\n}))\n\nconst emit = defineEmits<{ 'update:modelValue': [string] }>()\n\nconst ready = ref(false)\nconst editorRef = shallowRef<any>(null)\nconst editorContainer = ref<HTMLElement | null>(null)\n\ninterface ToolBtn {\n icon: string\n label: string\n action: () => void\n active?: () => boolean\n}\n\nconst toolGroups = ref<ToolBtn[][]>([])\n\nonMounted(async () => {\n const [\n { Editor },\n { default: StarterKit },\n { default: Underline },\n { default: TextAlign },\n { default: Link },\n { default: Image },\n { default: Highlight },\n { default: Placeholder },\n { TextStyle },\n { default: Color },\n ] = await Promise.all([\n import('@tiptap/vue-3'),\n import('@tiptap/starter-kit'),\n import('@tiptap/extension-underline'),\n import('@tiptap/extension-text-align'),\n import('@tiptap/extension-link'),\n import('@tiptap/extension-image'),\n import('@tiptap/extension-highlight'),\n import('@tiptap/extension-placeholder'),\n import('@tiptap/extension-text-style'),\n import('@tiptap/extension-color'),\n ])\n\n const editor = new Editor({\n element: editorContainer.value!,\n content: props.modelValue,\n editable: !props.disabled,\n extensions: [\n StarterKit,\n Underline,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Link.configure({ openOnClick: false }),\n Image,\n Highlight.configure({ multicolor: true }),\n Placeholder.configure({ placeholder: props.placeholder ?? 'Start writing...' }),\n TextStyle,\n Color,\n ],\n onUpdate: ({ editor: e }) => emit('update:modelValue', e.getHTML()),\n })\n\n editorRef.value = editor\n\n toolGroups.value = [\n [\n { icon: 'format_bold', label: l.value.bold, action: () => editor.chain().focus().toggleBold().run(), active: () => !!editor.isActive('bold') },\n { icon: 'format_italic', label: l.value.italic, action: () => editor.chain().focus().toggleItalic().run(), active: () => !!editor.isActive('italic') },\n { icon: 'format_underlined', label: l.value.underline, action: () => editor.chain().focus().toggleUnderline().run(), active: () => !!editor.isActive('underline') },\n { icon: 'format_strikethrough', label: l.value.strikethrough, action: () => editor.chain().focus().toggleStrike().run(), active: () => !!editor.isActive('strike') },\n { icon: 'ink_highlighter', label: l.value.highlight, action: () => editor.chain().focus().toggleHighlight().run(), active: () => !!editor.isActive('highlight') },\n ],\n [\n { icon: 'format_list_bulleted', label: l.value.bulletList, action: () => editor.chain().focus().toggleBulletList().run(), active: () => !!editor.isActive('bulletList') },\n { icon: 'format_list_numbered', label: l.value.orderedList, action: () => editor.chain().focus().toggleOrderedList().run(), active: () => !!editor.isActive('orderedList') },\n { icon: 'format_quote', label: l.value.blockquote, action: () => editor.chain().focus().toggleBlockquote().run(), active: () => !!editor.isActive('blockquote') },\n { icon: 'code', label: l.value.code, action: () => editor.chain().focus().toggleCode().run(), active: () => !!editor.isActive('code') },\n ],\n [\n { icon: 'format_align_left', label: l.value.alignLeft, action: () => editor.chain().focus().setTextAlign('left').run(), active: () => !!editor.isActive({ textAlign: 'left' }) },\n { icon: 'format_align_center', label: l.value.alignCenter, action: () => editor.chain().focus().setTextAlign('center').run(), active: () => !!editor.isActive({ textAlign: 'center' }) },\n { icon: 'format_align_right', label: l.value.alignRight, action: () => editor.chain().focus().setTextAlign('right').run(), active: () => !!editor.isActive({ textAlign: 'right' }) },\n ],\n [\n { icon: 'undo', label: l.value.undo, action: () => editor.chain().focus().undo().run() },\n { icon: 'redo', label: l.value.redo, action: () => editor.chain().focus().redo().run() },\n ],\n ]\n\n onBeforeUnmount(() => editor.destroy())\n\n watch(() => props.modelValue, (val) => {\n if (editor.getHTML() !== val) editor.commands.setContent(val)\n })\n\n watch(() => props.disabled, (v) => editor.setEditable(!v))\n\n ready.value = true\n})\n\nconst linkDialogOpen = ref(false)\nconst linkUrl = ref('')\nconst imageDialogOpen = ref(false)\nconst imageUrl = ref('')\n\nconst headingLabel = computed(() => {\n const e = editorRef.value\n if (!e) return l.value.paragraph\n if (e.isActive('heading', { level: 1 })) return l.value.heading1\n if (e.isActive('heading', { level: 2 })) return l.value.heading2\n if (e.isActive('heading', { level: 3 })) return l.value.heading3\n return l.value.paragraph\n})\n\nfunction setHeading(level: 0 | 1 | 2 | 3) {\n if (level === 0) editorRef.value?.chain().focus().setParagraph().run()\n else editorRef.value?.chain().focus().toggleHeading({ level }).run()\n}\n\nfunction openLinkDialog() {\n linkUrl.value = ''\n linkDialogOpen.value = true\n}\n\nfunction confirmLink() {\n if (linkUrl.value) editorRef.value?.chain().focus().setLink({ href: linkUrl.value }).run()\n linkDialogOpen.value = false\n}\n\nfunction openImageDialog() {\n imageUrl.value = ''\n imageDialogOpen.value = true\n}\n\nfunction confirmImage() {\n if (imageUrl.value) editorRef.value?.chain().focus().setImage({ src: imageUrl.value }).run()\n imageDialogOpen.value = false\n}\n</script>\n\n<template>\n <div\n class=\"overflow-hidden rounded-lg border transition-colors duration-150\"\n :class=\"disabled ? 'border-outline-variant/50 opacity-60' : 'border-outline-variant focus-within:border-primary'\"\n >\n <!-- Toolbar -->\n <div v-if=\"ready\" class=\"flex flex-wrap items-center gap-0.5 border-b border-outline-variant bg-surface-container px-2 py-1.5\">\n <!-- Heading menu -->\n <MMenu align=\"left\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"flex h-8 cursor-pointer items-center gap-1 rounded px-2 text-label-large text-on-surface-variant hover:bg-on-surface/8\"\n >\n {{ headingLabel }}\n <MIcon name=\"arrow_drop_down\" :size=\"20\" />\n </button>\n </template>\n <MMenuItem @click=\"setHeading(0)\">{{ l.paragraph }}</MMenuItem>\n <MMenuItem @click=\"setHeading(1)\">{{ l.heading1 }}</MMenuItem>\n <MMenuItem @click=\"setHeading(2)\">{{ l.heading2 }}</MMenuItem>\n <MMenuItem @click=\"setHeading(3)\">{{ l.heading3 }}</MMenuItem>\n </MMenu>\n\n <div class=\"mx-1 h-6 w-px bg-outline-variant\" />\n\n <template v-for=\"(group, gi) in toolGroups\" :key=\"gi\">\n <button\n v-for=\"btn in group\"\n :key=\"btn.icon\"\n type=\"button\"\n :title=\"btn.label\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded transition-colors duration-100\"\n :class=\"btn.active?.() ? 'bg-secondary-container text-on-secondary-container' : 'text-on-surface-variant hover:bg-on-surface/8'\"\n @click=\"btn.action\"\n >\n <MIcon :name=\"btn.icon\" :size=\"20\" />\n </button>\n <div v-if=\"gi < toolGroups.length - 1\" class=\"mx-1 h-6 w-px bg-outline-variant\" />\n </template>\n\n <div class=\"mx-1 h-6 w-px bg-outline-variant\" />\n\n <button\n type=\"button\"\n :title=\"l.link\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8\"\n @click=\"openLinkDialog\"\n >\n <MIcon name=\"link\" :size=\"20\" />\n </button>\n <button\n type=\"button\"\n :title=\"l.image\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8\"\n @click=\"openImageDialog\"\n >\n <MIcon name=\"image\" :size=\"20\" />\n </button>\n </div>\n\n <!-- Editor content -->\n <div\n ref=\"editorContainer\"\n class=\"rte-content bg-surface px-4 py-3 text-body-large text-on-surface\"\n :style=\"{ minHeight: minHeight }\"\n />\n\n <!-- Link dialog -->\n <MDialog v-model=\"linkDialogOpen\" :title=\"l.insertLink\">\n <MTextField v-model=\"linkUrl\" label=\"URL\" placeholder=\" \" @keydown.enter=\"confirmLink\" />\n <template #actions>\n <MButton variant=\"text\" @click=\"linkDialogOpen = false\">{{ l.cancel }}</MButton>\n <MButton @click=\"confirmLink\">{{ l.insert }}</MButton>\n </template>\n </MDialog>\n\n <!-- Image dialog -->\n <MDialog v-model=\"imageDialogOpen\" :title=\"l.insertImage\">\n <MTextField v-model=\"imageUrl\" :label=\"l.imageUrlLabel\" placeholder=\" \" @keydown.enter=\"confirmImage\" />\n <template #actions>\n <MButton variant=\"text\" @click=\"imageDialogOpen = false\">{{ l.cancel }}</MButton>\n <MButton @click=\"confirmImage\">{{ l.insert }}</MButton>\n </template>\n </MDialog>\n </div>\n</template>\n\n<style scoped>\n.rte-content :deep(.tiptap) {\n outline: none;\n min-height: inherit;\n}\n\n.rte-content :deep(.tiptap p.is-editor-empty:first-child::before) {\n content: attr(data-placeholder);\n float: left;\n color: var(--color-on-surface-variant);\n opacity: 0.5;\n pointer-events: none;\n height: 0;\n}\n\n.rte-content :deep(h1) { font-size: var(--text-headline-large); line-height: var(--text-headline-large--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(h2) { font-size: var(--text-headline-medium); line-height: var(--text-headline-medium--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(h3) { font-size: var(--text-headline-small); line-height: var(--text-headline-small--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(p) { margin: 0.5em 0; }\n.rte-content :deep(ul) { list-style-type: disc; padding-left: 1.5em; margin: 0.5em 0; }\n.rte-content :deep(ol) { list-style-type: decimal; padding-left: 1.5em; margin: 0.5em 0; }\n.rte-content :deep(blockquote) { border-left: 3px solid var(--color-primary); padding-left: 1em; margin: 0.5em 0; color: var(--color-on-surface-variant); }\n.rte-content :deep(code) { background: var(--color-surface-container-highest); padding: 0.15em 0.4em; border-radius: 4px; font-size: 0.875em; }\n.rte-content :deep(pre) { background: var(--color-surface-container-highest); padding: 1em; border-radius: 8px; overflow-x: auto; margin: 0.5em 0; }\n.rte-content :deep(pre code) { background: none; padding: 0; }\n.rte-content :deep(a) { color: var(--color-primary); text-decoration: underline; }\n.rte-content :deep(mark) { background: var(--color-tertiary-container); color: var(--color-on-tertiary-container); padding: 0.1em 0.2em; border-radius: 2px; }\n.rte-content :deep(img) { max-width: 100%; height: auto; border-radius: 8px; margin: 0.5em 0; }\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"rich-text-editor.js","names":[],"sources":["../src/components/MRichTextEditor.vue","../src/components/MRichTextEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount, shallowRef, computed } from 'vue'\nimport MIcon from './MIcon.vue'\nimport MMenu from './MMenu.vue'\nimport MMenuItem from './MMenuItem.vue'\nimport MDialog from './MDialog.vue'\nimport MTextField from './MTextField.vue'\nimport MButton from './MButton.vue'\nimport { useLocale } from '../composables/useLocale'\n\nexport interface RichTextEditorLabels {\n bold?: string\n italic?: string\n underline?: string\n strikethrough?: string\n highlight?: string\n bulletList?: string\n orderedList?: string\n blockquote?: string\n code?: string\n alignLeft?: string\n alignCenter?: string\n alignRight?: string\n undo?: string\n redo?: string\n link?: string\n image?: string\n paragraph?: string\n heading1?: string\n heading2?: string\n heading3?: string\n insertLink?: string\n insertImage?: string\n imageUrlLabel?: string\n cancel?: string\n insert?: string\n}\n\nconst locale = useLocale()\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string\n placeholder?: string\n disabled?: boolean\n minHeight?: string\n labels?: RichTextEditorLabels\n }>(),\n { disabled: false, minHeight: '200px' },\n)\n\nconst l = computed<Required<RichTextEditorLabels>>(() => ({\n bold: locale.bold,\n italic: locale.italic,\n underline: locale.underline,\n strikethrough: locale.strikethrough,\n highlight: locale.highlight,\n bulletList: locale.bulletList,\n orderedList: locale.orderedList,\n blockquote: locale.blockquote,\n code: locale.code,\n alignLeft: locale.alignLeft,\n alignCenter: locale.alignCenter,\n alignRight: locale.alignRight,\n undo: locale.undo,\n redo: locale.redo,\n link: locale.link,\n image: locale.image,\n paragraph: locale.paragraph,\n heading1: locale.heading1,\n heading2: locale.heading2,\n heading3: locale.heading3,\n insertLink: locale.insertLink,\n insertImage: locale.insertImage,\n imageUrlLabel: locale.imageUrlLabel,\n cancel: locale.cancel,\n insert: locale.insert,\n ...props.labels,\n}))\n\nconst emit = defineEmits<{ 'update:modelValue': [string] }>()\n\nconst ready = ref(false)\nconst editorRef = shallowRef<any>(null)\nconst editorContainer = ref<HTMLElement | null>(null)\n\ninterface ToolBtn {\n icon: string\n label: string\n action: () => void\n active?: () => boolean\n}\n\nconst toolGroups = ref<ToolBtn[][]>([])\n\nonMounted(async () => {\n const [\n { Editor },\n { default: StarterKit },\n { default: Underline },\n { default: TextAlign },\n { default: Link },\n { default: Image },\n { default: Highlight },\n { default: Placeholder },\n { TextStyle },\n { default: Color },\n ] = await Promise.all([\n import('@tiptap/vue-3'),\n import('@tiptap/starter-kit'),\n import('@tiptap/extension-underline'),\n import('@tiptap/extension-text-align'),\n import('@tiptap/extension-link'),\n import('@tiptap/extension-image'),\n import('@tiptap/extension-highlight'),\n import('@tiptap/extension-placeholder'),\n import('@tiptap/extension-text-style'),\n import('@tiptap/extension-color'),\n ])\n\n const editor = new Editor({\n element: editorContainer.value!,\n content: props.modelValue,\n editable: !props.disabled,\n extensions: [\n StarterKit,\n Underline,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Link.configure({ openOnClick: false }),\n Image,\n Highlight.configure({ multicolor: true }),\n Placeholder.configure({ placeholder: props.placeholder ?? 'Start writing...' }),\n TextStyle,\n Color,\n ],\n onUpdate: ({ editor: e }) => emit('update:modelValue', e.getHTML()),\n })\n\n editorRef.value = editor\n\n toolGroups.value = [\n [\n { icon: 'format_bold', label: l.value.bold, action: () => editor.chain().focus().toggleBold().run(), active: () => !!editor.isActive('bold') },\n { icon: 'format_italic', label: l.value.italic, action: () => editor.chain().focus().toggleItalic().run(), active: () => !!editor.isActive('italic') },\n { icon: 'format_underlined', label: l.value.underline, action: () => editor.chain().focus().toggleUnderline().run(), active: () => !!editor.isActive('underline') },\n { icon: 'format_strikethrough', label: l.value.strikethrough, action: () => editor.chain().focus().toggleStrike().run(), active: () => !!editor.isActive('strike') },\n { icon: 'ink_highlighter', label: l.value.highlight, action: () => editor.chain().focus().toggleHighlight().run(), active: () => !!editor.isActive('highlight') },\n ],\n [\n { icon: 'format_list_bulleted', label: l.value.bulletList, action: () => editor.chain().focus().toggleBulletList().run(), active: () => !!editor.isActive('bulletList') },\n { icon: 'format_list_numbered', label: l.value.orderedList, action: () => editor.chain().focus().toggleOrderedList().run(), active: () => !!editor.isActive('orderedList') },\n { icon: 'format_quote', label: l.value.blockquote, action: () => editor.chain().focus().toggleBlockquote().run(), active: () => !!editor.isActive('blockquote') },\n { icon: 'code', label: l.value.code, action: () => editor.chain().focus().toggleCode().run(), active: () => !!editor.isActive('code') },\n ],\n [\n { icon: 'format_align_left', label: l.value.alignLeft, action: () => editor.chain().focus().setTextAlign('left').run(), active: () => !!editor.isActive({ textAlign: 'left' }) },\n { icon: 'format_align_center', label: l.value.alignCenter, action: () => editor.chain().focus().setTextAlign('center').run(), active: () => !!editor.isActive({ textAlign: 'center' }) },\n { icon: 'format_align_right', label: l.value.alignRight, action: () => editor.chain().focus().setTextAlign('right').run(), active: () => !!editor.isActive({ textAlign: 'right' }) },\n ],\n [\n { icon: 'undo', label: l.value.undo, action: () => editor.chain().focus().undo().run() },\n { icon: 'redo', label: l.value.redo, action: () => editor.chain().focus().redo().run() },\n ],\n ]\n\n onBeforeUnmount(() => editor.destroy())\n\n watch(() => props.modelValue, (val) => {\n if (editor.getHTML() !== val) editor.commands.setContent(val)\n })\n\n watch(() => props.disabled, (v) => editor.setEditable(!v))\n\n ready.value = true\n})\n\nconst linkDialogOpen = ref(false)\nconst linkUrl = ref('')\nconst imageDialogOpen = ref(false)\nconst imageUrl = ref('')\n\nconst headingLabel = computed(() => {\n const e = editorRef.value\n if (!e) return l.value.paragraph\n if (e.isActive('heading', { level: 1 })) return l.value.heading1\n if (e.isActive('heading', { level: 2 })) return l.value.heading2\n if (e.isActive('heading', { level: 3 })) return l.value.heading3\n return l.value.paragraph\n})\n\nfunction setHeading(level: 0 | 1 | 2 | 3) {\n if (level === 0) editorRef.value?.chain().focus().setParagraph().run()\n else editorRef.value?.chain().focus().toggleHeading({ level }).run()\n}\n\nfunction openLinkDialog() {\n linkUrl.value = ''\n linkDialogOpen.value = true\n}\n\nfunction confirmLink() {\n if (linkUrl.value) editorRef.value?.chain().focus().setLink({ href: linkUrl.value }).run()\n linkDialogOpen.value = false\n}\n\nfunction openImageDialog() {\n imageUrl.value = ''\n imageDialogOpen.value = true\n}\n\nfunction confirmImage() {\n if (imageUrl.value) editorRef.value?.chain().focus().setImage({ src: imageUrl.value }).run()\n imageDialogOpen.value = false\n}\n</script>\n\n<template>\n <div\n class=\"overflow-hidden rounded-lg border transition-colors duration-150\"\n :class=\"disabled ? 'border-outline-variant/50 opacity-60' : 'border-outline-variant focus-within:border-primary'\"\n >\n <!-- Toolbar -->\n <div v-if=\"ready\" class=\"flex flex-wrap items-center gap-0.5 border-b border-outline-variant bg-surface-container px-2 py-1.5\">\n <!-- Heading menu -->\n <MMenu align=\"left\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"flex h-8 cursor-pointer items-center gap-1 rounded px-2 text-label-large text-on-surface-variant hover:bg-on-surface/8\"\n >\n {{ headingLabel }}\n <MIcon name=\"arrow_drop_down\" :size=\"20\" />\n </button>\n </template>\n <MMenuItem @click=\"setHeading(0)\">{{ l.paragraph }}</MMenuItem>\n <MMenuItem @click=\"setHeading(1)\">{{ l.heading1 }}</MMenuItem>\n <MMenuItem @click=\"setHeading(2)\">{{ l.heading2 }}</MMenuItem>\n <MMenuItem @click=\"setHeading(3)\">{{ l.heading3 }}</MMenuItem>\n </MMenu>\n\n <div class=\"mx-1 h-6 w-px bg-outline-variant\" />\n\n <template v-for=\"(group, gi) in toolGroups\" :key=\"gi\">\n <button\n v-for=\"btn in group\"\n :key=\"btn.icon\"\n type=\"button\"\n :title=\"btn.label\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded transition-colors duration-100\"\n :class=\"btn.active?.() ? 'bg-secondary-container text-on-secondary-container' : 'text-on-surface-variant hover:bg-on-surface/8'\"\n @click=\"btn.action\"\n >\n <MIcon :name=\"btn.icon\" :size=\"20\" />\n </button>\n <div v-if=\"gi < toolGroups.length - 1\" class=\"mx-1 h-6 w-px bg-outline-variant\" />\n </template>\n\n <div class=\"mx-1 h-6 w-px bg-outline-variant\" />\n\n <button\n type=\"button\"\n :title=\"l.link\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8\"\n @click=\"openLinkDialog\"\n >\n <MIcon name=\"link\" :size=\"20\" />\n </button>\n <button\n type=\"button\"\n :title=\"l.image\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8\"\n @click=\"openImageDialog\"\n >\n <MIcon name=\"image\" :size=\"20\" />\n </button>\n </div>\n\n <!-- Editor content -->\n <div\n ref=\"editorContainer\"\n class=\"rte-content bg-surface px-4 py-3 text-body-large text-on-surface\"\n :style=\"{ minHeight: minHeight }\"\n />\n\n <!-- Link dialog -->\n <MDialog v-model=\"linkDialogOpen\" :title=\"l.insertLink\">\n <MTextField v-model=\"linkUrl\" label=\"URL\" placeholder=\" \" @keydown.enter=\"confirmLink\" />\n <template #actions>\n <MButton variant=\"text\" @click=\"linkDialogOpen = false\">{{ l.cancel }}</MButton>\n <MButton @click=\"confirmLink\">{{ l.insert }}</MButton>\n </template>\n </MDialog>\n\n <!-- Image dialog -->\n <MDialog v-model=\"imageDialogOpen\" :title=\"l.insertImage\">\n <MTextField v-model=\"imageUrl\" :label=\"l.imageUrlLabel\" placeholder=\" \" @keydown.enter=\"confirmImage\" />\n <template #actions>\n <MButton variant=\"text\" @click=\"imageDialogOpen = false\">{{ l.cancel }}</MButton>\n <MButton @click=\"confirmImage\">{{ l.insert }}</MButton>\n </template>\n </MDialog>\n </div>\n</template>\n\n<style scoped>\n.rte-content :deep(.tiptap) {\n outline: none;\n min-height: inherit;\n}\n\n.rte-content :deep(.tiptap p.is-editor-empty:first-child::before) {\n content: attr(data-placeholder);\n float: left;\n color: var(--color-on-surface-variant);\n opacity: 0.5;\n pointer-events: none;\n height: 0;\n}\n\n.rte-content :deep(h1) { font-size: var(--text-headline-large); line-height: var(--text-headline-large--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(h2) { font-size: var(--text-headline-medium); line-height: var(--text-headline-medium--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(h3) { font-size: var(--text-headline-small); line-height: var(--text-headline-small--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(p) { margin: 0.5em 0; }\n.rte-content :deep(ul) { list-style-type: disc; padding-left: 1.5em; margin: 0.5em 0; }\n.rte-content :deep(ol) { list-style-type: decimal; padding-left: 1.5em; margin: 0.5em 0; }\n.rte-content :deep(blockquote) { border-left: 3px solid var(--color-primary); padding-left: 1em; margin: 0.5em 0; color: var(--color-on-surface-variant); }\n.rte-content :deep(code) { background: var(--color-surface-container-highest); padding: 0.15em 0.4em; border-radius: 4px; font-size: 0.875em; }\n.rte-content :deep(pre) { background: var(--color-surface-container-highest); padding: 1em; border-radius: 8px; overflow-x: auto; margin: 0.5em 0; }\n.rte-content :deep(pre code) { background: none; padding: 0; }\n.rte-content :deep(a) { color: var(--color-primary); text-decoration: underline; }\n.rte-content :deep(mark) { background: var(--color-tertiary-container); color: var(--color-on-tertiary-container); padding: 0.1em 0.2em; border-radius: 2px; }\n.rte-content :deep(img) { max-width: 100%; height: auto; border-radius: 8px; margin: 0.5em 0; }\n</style>\n","<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount, shallowRef, computed } from 'vue'\nimport MIcon from './MIcon.vue'\nimport MMenu from './MMenu.vue'\nimport MMenuItem from './MMenuItem.vue'\nimport MDialog from './MDialog.vue'\nimport MTextField from './MTextField.vue'\nimport MButton from './MButton.vue'\nimport { useLocale } from '../composables/useLocale'\n\nexport interface RichTextEditorLabels {\n bold?: string\n italic?: string\n underline?: string\n strikethrough?: string\n highlight?: string\n bulletList?: string\n orderedList?: string\n blockquote?: string\n code?: string\n alignLeft?: string\n alignCenter?: string\n alignRight?: string\n undo?: string\n redo?: string\n link?: string\n image?: string\n paragraph?: string\n heading1?: string\n heading2?: string\n heading3?: string\n insertLink?: string\n insertImage?: string\n imageUrlLabel?: string\n cancel?: string\n insert?: string\n}\n\nconst locale = useLocale()\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string\n placeholder?: string\n disabled?: boolean\n minHeight?: string\n labels?: RichTextEditorLabels\n }>(),\n { disabled: false, minHeight: '200px' },\n)\n\nconst l = computed<Required<RichTextEditorLabels>>(() => ({\n bold: locale.bold,\n italic: locale.italic,\n underline: locale.underline,\n strikethrough: locale.strikethrough,\n highlight: locale.highlight,\n bulletList: locale.bulletList,\n orderedList: locale.orderedList,\n blockquote: locale.blockquote,\n code: locale.code,\n alignLeft: locale.alignLeft,\n alignCenter: locale.alignCenter,\n alignRight: locale.alignRight,\n undo: locale.undo,\n redo: locale.redo,\n link: locale.link,\n image: locale.image,\n paragraph: locale.paragraph,\n heading1: locale.heading1,\n heading2: locale.heading2,\n heading3: locale.heading3,\n insertLink: locale.insertLink,\n insertImage: locale.insertImage,\n imageUrlLabel: locale.imageUrlLabel,\n cancel: locale.cancel,\n insert: locale.insert,\n ...props.labels,\n}))\n\nconst emit = defineEmits<{ 'update:modelValue': [string] }>()\n\nconst ready = ref(false)\nconst editorRef = shallowRef<any>(null)\nconst editorContainer = ref<HTMLElement | null>(null)\n\ninterface ToolBtn {\n icon: string\n label: string\n action: () => void\n active?: () => boolean\n}\n\nconst toolGroups = ref<ToolBtn[][]>([])\n\nonMounted(async () => {\n const [\n { Editor },\n { default: StarterKit },\n { default: Underline },\n { default: TextAlign },\n { default: Link },\n { default: Image },\n { default: Highlight },\n { default: Placeholder },\n { TextStyle },\n { default: Color },\n ] = await Promise.all([\n import('@tiptap/vue-3'),\n import('@tiptap/starter-kit'),\n import('@tiptap/extension-underline'),\n import('@tiptap/extension-text-align'),\n import('@tiptap/extension-link'),\n import('@tiptap/extension-image'),\n import('@tiptap/extension-highlight'),\n import('@tiptap/extension-placeholder'),\n import('@tiptap/extension-text-style'),\n import('@tiptap/extension-color'),\n ])\n\n const editor = new Editor({\n element: editorContainer.value!,\n content: props.modelValue,\n editable: !props.disabled,\n extensions: [\n StarterKit,\n Underline,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Link.configure({ openOnClick: false }),\n Image,\n Highlight.configure({ multicolor: true }),\n Placeholder.configure({ placeholder: props.placeholder ?? 'Start writing...' }),\n TextStyle,\n Color,\n ],\n onUpdate: ({ editor: e }) => emit('update:modelValue', e.getHTML()),\n })\n\n editorRef.value = editor\n\n toolGroups.value = [\n [\n { icon: 'format_bold', label: l.value.bold, action: () => editor.chain().focus().toggleBold().run(), active: () => !!editor.isActive('bold') },\n { icon: 'format_italic', label: l.value.italic, action: () => editor.chain().focus().toggleItalic().run(), active: () => !!editor.isActive('italic') },\n { icon: 'format_underlined', label: l.value.underline, action: () => editor.chain().focus().toggleUnderline().run(), active: () => !!editor.isActive('underline') },\n { icon: 'format_strikethrough', label: l.value.strikethrough, action: () => editor.chain().focus().toggleStrike().run(), active: () => !!editor.isActive('strike') },\n { icon: 'ink_highlighter', label: l.value.highlight, action: () => editor.chain().focus().toggleHighlight().run(), active: () => !!editor.isActive('highlight') },\n ],\n [\n { icon: 'format_list_bulleted', label: l.value.bulletList, action: () => editor.chain().focus().toggleBulletList().run(), active: () => !!editor.isActive('bulletList') },\n { icon: 'format_list_numbered', label: l.value.orderedList, action: () => editor.chain().focus().toggleOrderedList().run(), active: () => !!editor.isActive('orderedList') },\n { icon: 'format_quote', label: l.value.blockquote, action: () => editor.chain().focus().toggleBlockquote().run(), active: () => !!editor.isActive('blockquote') },\n { icon: 'code', label: l.value.code, action: () => editor.chain().focus().toggleCode().run(), active: () => !!editor.isActive('code') },\n ],\n [\n { icon: 'format_align_left', label: l.value.alignLeft, action: () => editor.chain().focus().setTextAlign('left').run(), active: () => !!editor.isActive({ textAlign: 'left' }) },\n { icon: 'format_align_center', label: l.value.alignCenter, action: () => editor.chain().focus().setTextAlign('center').run(), active: () => !!editor.isActive({ textAlign: 'center' }) },\n { icon: 'format_align_right', label: l.value.alignRight, action: () => editor.chain().focus().setTextAlign('right').run(), active: () => !!editor.isActive({ textAlign: 'right' }) },\n ],\n [\n { icon: 'undo', label: l.value.undo, action: () => editor.chain().focus().undo().run() },\n { icon: 'redo', label: l.value.redo, action: () => editor.chain().focus().redo().run() },\n ],\n ]\n\n onBeforeUnmount(() => editor.destroy())\n\n watch(() => props.modelValue, (val) => {\n if (editor.getHTML() !== val) editor.commands.setContent(val)\n })\n\n watch(() => props.disabled, (v) => editor.setEditable(!v))\n\n ready.value = true\n})\n\nconst linkDialogOpen = ref(false)\nconst linkUrl = ref('')\nconst imageDialogOpen = ref(false)\nconst imageUrl = ref('')\n\nconst headingLabel = computed(() => {\n const e = editorRef.value\n if (!e) return l.value.paragraph\n if (e.isActive('heading', { level: 1 })) return l.value.heading1\n if (e.isActive('heading', { level: 2 })) return l.value.heading2\n if (e.isActive('heading', { level: 3 })) return l.value.heading3\n return l.value.paragraph\n})\n\nfunction setHeading(level: 0 | 1 | 2 | 3) {\n if (level === 0) editorRef.value?.chain().focus().setParagraph().run()\n else editorRef.value?.chain().focus().toggleHeading({ level }).run()\n}\n\nfunction openLinkDialog() {\n linkUrl.value = ''\n linkDialogOpen.value = true\n}\n\nfunction confirmLink() {\n if (linkUrl.value) editorRef.value?.chain().focus().setLink({ href: linkUrl.value }).run()\n linkDialogOpen.value = false\n}\n\nfunction openImageDialog() {\n imageUrl.value = ''\n imageDialogOpen.value = true\n}\n\nfunction confirmImage() {\n if (imageUrl.value) editorRef.value?.chain().focus().setImage({ src: imageUrl.value }).run()\n imageDialogOpen.value = false\n}\n</script>\n\n<template>\n <div\n class=\"overflow-hidden rounded-lg border transition-colors duration-150\"\n :class=\"disabled ? 'border-outline-variant/50 opacity-60' : 'border-outline-variant focus-within:border-primary'\"\n >\n <!-- Toolbar -->\n <div v-if=\"ready\" class=\"flex flex-wrap items-center gap-0.5 border-b border-outline-variant bg-surface-container px-2 py-1.5\">\n <!-- Heading menu -->\n <MMenu align=\"left\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"flex h-8 cursor-pointer items-center gap-1 rounded px-2 text-label-large text-on-surface-variant hover:bg-on-surface/8\"\n >\n {{ headingLabel }}\n <MIcon name=\"arrow_drop_down\" :size=\"20\" />\n </button>\n </template>\n <MMenuItem @click=\"setHeading(0)\">{{ l.paragraph }}</MMenuItem>\n <MMenuItem @click=\"setHeading(1)\">{{ l.heading1 }}</MMenuItem>\n <MMenuItem @click=\"setHeading(2)\">{{ l.heading2 }}</MMenuItem>\n <MMenuItem @click=\"setHeading(3)\">{{ l.heading3 }}</MMenuItem>\n </MMenu>\n\n <div class=\"mx-1 h-6 w-px bg-outline-variant\" />\n\n <template v-for=\"(group, gi) in toolGroups\" :key=\"gi\">\n <button\n v-for=\"btn in group\"\n :key=\"btn.icon\"\n type=\"button\"\n :title=\"btn.label\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded transition-colors duration-100\"\n :class=\"btn.active?.() ? 'bg-secondary-container text-on-secondary-container' : 'text-on-surface-variant hover:bg-on-surface/8'\"\n @click=\"btn.action\"\n >\n <MIcon :name=\"btn.icon\" :size=\"20\" />\n </button>\n <div v-if=\"gi < toolGroups.length - 1\" class=\"mx-1 h-6 w-px bg-outline-variant\" />\n </template>\n\n <div class=\"mx-1 h-6 w-px bg-outline-variant\" />\n\n <button\n type=\"button\"\n :title=\"l.link\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8\"\n @click=\"openLinkDialog\"\n >\n <MIcon name=\"link\" :size=\"20\" />\n </button>\n <button\n type=\"button\"\n :title=\"l.image\"\n class=\"flex h-8 w-8 cursor-pointer items-center justify-center rounded text-on-surface-variant transition-colors hover:bg-on-surface/8\"\n @click=\"openImageDialog\"\n >\n <MIcon name=\"image\" :size=\"20\" />\n </button>\n </div>\n\n <!-- Editor content -->\n <div\n ref=\"editorContainer\"\n class=\"rte-content bg-surface px-4 py-3 text-body-large text-on-surface\"\n :style=\"{ minHeight: minHeight }\"\n />\n\n <!-- Link dialog -->\n <MDialog v-model=\"linkDialogOpen\" :title=\"l.insertLink\">\n <MTextField v-model=\"linkUrl\" label=\"URL\" placeholder=\" \" @keydown.enter=\"confirmLink\" />\n <template #actions>\n <MButton variant=\"text\" @click=\"linkDialogOpen = false\">{{ l.cancel }}</MButton>\n <MButton @click=\"confirmLink\">{{ l.insert }}</MButton>\n </template>\n </MDialog>\n\n <!-- Image dialog -->\n <MDialog v-model=\"imageDialogOpen\" :title=\"l.insertImage\">\n <MTextField v-model=\"imageUrl\" :label=\"l.imageUrlLabel\" placeholder=\" \" @keydown.enter=\"confirmImage\" />\n <template #actions>\n <MButton variant=\"text\" @click=\"imageDialogOpen = false\">{{ l.cancel }}</MButton>\n <MButton @click=\"confirmImage\">{{ l.insert }}</MButton>\n </template>\n </MDialog>\n </div>\n</template>\n\n<style scoped>\n.rte-content :deep(.tiptap) {\n outline: none;\n min-height: inherit;\n}\n\n.rte-content :deep(.tiptap p.is-editor-empty:first-child::before) {\n content: attr(data-placeholder);\n float: left;\n color: var(--color-on-surface-variant);\n opacity: 0.5;\n pointer-events: none;\n height: 0;\n}\n\n.rte-content :deep(h1) { font-size: var(--text-headline-large); line-height: var(--text-headline-large--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(h2) { font-size: var(--text-headline-medium); line-height: var(--text-headline-medium--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(h3) { font-size: var(--text-headline-small); line-height: var(--text-headline-small--line-height); font-weight: 600; margin: 0.75em 0 0.25em; }\n.rte-content :deep(p) { margin: 0.5em 0; }\n.rte-content :deep(ul) { list-style-type: disc; padding-left: 1.5em; margin: 0.5em 0; }\n.rte-content :deep(ol) { list-style-type: decimal; padding-left: 1.5em; margin: 0.5em 0; }\n.rte-content :deep(blockquote) { border-left: 3px solid var(--color-primary); padding-left: 1em; margin: 0.5em 0; color: var(--color-on-surface-variant); }\n.rte-content :deep(code) { background: var(--color-surface-container-highest); padding: 0.15em 0.4em; border-radius: 4px; font-size: 0.875em; }\n.rte-content :deep(pre) { background: var(--color-surface-container-highest); padding: 1em; border-radius: 8px; overflow-x: auto; margin: 0.5em 0; }\n.rte-content :deep(pre code) { background: none; padding: 0; }\n.rte-content :deep(a) { color: var(--color-primary); text-decoration: underline; }\n.rte-content :deep(mark) { background: var(--color-tertiary-container); color: var(--color-on-tertiary-container); padding: 0.1em 0.2em; border-radius: 2px; }\n.rte-content :deep(img) { max-width: 100%; height: auto; border-radius: 8px; margin: 0.5em 0; }\n</style>\n"],"mappings":"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"}
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
- .code-editor-container[data-v-b0a66a4b] .cm-editor{height:100%;min-height:inherit;font-family:Roboto Mono,Fira Code,Consolas,monospace;font-size:.8125rem;line-height:1.6}.code-editor-container[data-v-b0a66a4b] .cm-editor.cm-focused{outline:none}.code-editor-container[data-v-b0a66a4b] .cm-scroller{min-height:inherit}.code-editor-container[data-v-b0a66a4b] .cm-content{padding:12px 0}.code-editor-container[data-v-b0a66a4b] .cm-line{padding:0 16px}.code-editor-container[data-v-b0a66a4b] .cm-gutters{background:var(--color-surface-container);border-right:1px solid var(--color-outline-variant);color:var(--color-outline);padding:0 4px;font-size:.75rem}.code-editor-container[data-v-b0a66a4b] .cm-activeLineGutter{background:var(--color-surface-container-high);color:var(--color-on-surface-variant)}.code-editor-container[data-v-b0a66a4b] .cm-activeLine{background:var(--color-surface-container-lowest)}.code-editor-container[data-v-b0a66a4b] .cm-selectionBackground{background:var(--color-primary-container)!important}.code-editor-container[data-v-b0a66a4b] .cm-cursor{border-left-color:var(--color-primary);border-left-width:2px}.code-editor-container[data-v-b0a66a4b] .cm-matchingBracket{background:var(--color-tertiary-container);color:var(--color-on-tertiary-container);border-radius:2px}.code-editor-container[data-v-b0a66a4b] .cm-foldGutter span{color:var(--color-on-surface-variant)}@keyframes m3-wavy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes m3-wavy-travel{0%{stroke-dashoffset:0}to{stroke-dashoffset:calc(var(--m3-wave-len) * -1px)}}@media (prefers-reduced-motion:reduce){.animate-\[m3-wavy-spin_2\.8s_linear_infinite\]{animation:2.8s linear infinite m3-wavy-spin}.animate-\[m3-wavy-travel_2s_linear_infinite\]{animation:none!important}}.m3-dialog-enter-active[data-v-2e3c3567],.m3-dialog-leave-active[data-v-2e3c3567]{transition:opacity .15s}.m3-dialog-enter-from[data-v-2e3c3567],.m3-dialog-leave-to[data-v-2e3c3567]{opacity:0}.m3-dialog-enter-active .dialog-box[data-v-2e3c3567],.m3-dialog-leave-active .dialog-box[data-v-2e3c3567]{transition:transform .15s}.m3-dialog-enter-from .dialog-box[data-v-2e3c3567],.m3-dialog-leave-to .dialog-box[data-v-2e3c3567]{transform:scale(.95)}.m3-dialog-fs-enter-active[data-v-2e3c3567],.m3-dialog-fs-leave-active[data-v-2e3c3567]{transition:transform .25s cubic-bezier(.2,0,0,1),opacity .15s}.m3-dialog-fs-enter-from[data-v-2e3c3567],.m3-dialog-fs-leave-to[data-v-2e3c3567]{opacity:0;transform:translateY(100%)}.toast-row[data-v-d4877a26]{grid-template-rows:1fr;padding-bottom:8px;display:grid}.toast-row>.toast-inner[data-v-d4877a26]{min-height:0}.m3-toast-bot-enter-active[data-v-d4877a26]{transition:grid-template-rows .22s cubic-bezier(.2,0,0,1),padding-bottom .22s cubic-bezier(.2,0,0,1)}.m3-toast-bot-enter-active>.toast-inner[data-v-d4877a26]{transition:opacity .18s,transform .22s cubic-bezier(.2,0,0,1)}.m3-toast-bot-enter-from[data-v-d4877a26]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-bot-enter-from>.toast-inner[data-v-d4877a26]{opacity:0;transform:translateY(20px)scale(.94)}.m3-toast-bot-leave-active[data-v-d4877a26]{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1),padding-bottom .3s cubic-bezier(.2,0,0,1)}.m3-toast-bot-leave-active>.toast-inner[data-v-d4877a26]{transition:opacity .18s,transform .18s}.m3-toast-bot-leave-to[data-v-d4877a26]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-bot-leave-to>.toast-inner[data-v-d4877a26]{opacity:0;transform:scale(.92)}.m3-toast-bot-leave-active>.toast-count-badge[data-v-d4877a26]{transition:opacity .15s,transform .15s}.m3-toast-bot-leave-to>.toast-count-badge[data-v-d4877a26]{opacity:0;transform:scale(.5)}.m3-toast-top-enter-active[data-v-d4877a26]{transition:grid-template-rows .22s cubic-bezier(.2,0,0,1),padding-bottom .22s cubic-bezier(.2,0,0,1)}.m3-toast-top-enter-active>.toast-inner[data-v-d4877a26]{transition:opacity .18s,transform .22s cubic-bezier(.2,0,0,1)}.m3-toast-top-enter-from[data-v-d4877a26]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-top-enter-from>.toast-inner[data-v-d4877a26]{opacity:0;transform:translateY(-20px)scale(.94)}.m3-toast-top-leave-active[data-v-d4877a26]{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1),padding-bottom .3s cubic-bezier(.2,0,0,1)}.m3-toast-top-leave-active>.toast-inner[data-v-d4877a26]{transition:opacity .18s,transform .18s}.m3-toast-top-leave-to[data-v-d4877a26]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-top-leave-to>.toast-inner[data-v-d4877a26]{opacity:0;transform:scale(.92)}.m3-toast-top-leave-active>.toast-count-badge[data-v-d4877a26]{transition:opacity .15s,transform .15s}.m3-toast-top-leave-to>.toast-count-badge[data-v-d4877a26]{opacity:0;transform:scale(.5)}.m3-badge-enter-active[data-v-d4877a26]{transition:opacity .2s,transform .2s cubic-bezier(.34,1.56,.64,1)}.m3-badge-leave-active[data-v-d4877a26]{transition:opacity .15s,transform .15s}.m3-badge-enter-from[data-v-d4877a26],.m3-badge-leave-to[data-v-d4877a26]{opacity:0;transform:scale(.5)}.m3-count-enter-active[data-v-d4877a26]{transition:opacity .12s,transform .12s}.m3-count-leave-active[data-v-d4877a26]{transition:opacity 80ms,transform 80ms}.m3-count-enter-from[data-v-d4877a26]{opacity:0;transform:scale(1.5)translateY(-3px)}.m3-count-leave-to[data-v-d4877a26]{opacity:0;transform:scale(.6)translateY(2px)}@keyframes m3-toast-progress-d4877a26{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.notif-row[data-v-2338355e]{grid-template-rows:1fr;padding-bottom:6px;display:grid}.notif-row>.notif-inner[data-v-2338355e]{min-height:0}.m3-notif-bot-enter-active[data-v-2338355e]{transition:grid-template-rows .2s,padding-bottom .2s}.m3-notif-bot-enter-active>.notif-inner[data-v-2338355e]{transition:opacity .15s,transform .2s;overflow:hidden}.m3-notif-bot-enter-from[data-v-2338355e]{grid-template-rows:0fr;padding-bottom:0}.m3-notif-bot-enter-from>.notif-inner[data-v-2338355e]{opacity:0;transform:translateY(12px)scale(.95)}.m3-notif-bot-leave-active[data-v-2338355e]{transition:grid-template-rows .25s,padding-bottom .25s}.m3-notif-bot-leave-active>.notif-inner[data-v-2338355e]{transition:opacity .15s,transform .15s;overflow:hidden}.m3-notif-bot-leave-to[data-v-2338355e]{grid-template-rows:0fr;padding-bottom:0}.m3-notif-bot-leave-to>.notif-inner[data-v-2338355e]{opacity:0;transform:scale(.93)}.m3-notif-bot-leave-active>.notif-count-badge[data-v-2338355e]{transition:opacity .15s,transform .15s}.m3-notif-bot-leave-to>.notif-count-badge[data-v-2338355e]{opacity:0;transform:scale(.5)}.m3-notif-top-enter-active[data-v-2338355e]{transition:grid-template-rows .2s,padding-bottom .2s}.m3-notif-top-enter-active>.notif-inner[data-v-2338355e]{transition:opacity .15s,transform .2s;overflow:hidden}.m3-notif-top-enter-from[data-v-2338355e]{grid-template-rows:0fr;padding-bottom:0}.m3-notif-top-enter-from>.notif-inner[data-v-2338355e]{opacity:0;transform:translateY(-12px)scale(.95)}.m3-notif-top-leave-active[data-v-2338355e]{transition:grid-template-rows .25s,padding-bottom .25s}.m3-notif-top-leave-active>.notif-inner[data-v-2338355e]{transition:opacity .15s,transform .15s;overflow:hidden}.m3-notif-top-leave-to[data-v-2338355e]{grid-template-rows:0fr;padding-bottom:0}.m3-notif-top-leave-to>.notif-inner[data-v-2338355e]{opacity:0;transform:scale(.93)}.m3-notif-top-leave-active>.notif-count-badge[data-v-2338355e]{transition:opacity .15s,transform .15s}.m3-notif-top-leave-to>.notif-count-badge[data-v-2338355e]{opacity:0;transform:scale(.5)}.m3-badge-enter-active[data-v-2338355e]{transition:opacity .2s,transform .2s cubic-bezier(.34,1.56,.64,1)}.m3-badge-leave-active[data-v-2338355e]{transition:opacity .15s,transform .15s}.m3-badge-enter-from[data-v-2338355e],.m3-badge-leave-to[data-v-2338355e]{opacity:0;transform:scale(.5)}.m3-count-enter-active[data-v-2338355e]{transition:opacity .12s,transform .12s}.m3-count-leave-active[data-v-2338355e]{transition:opacity 80ms,transform 80ms}.m3-count-enter-from[data-v-2338355e]{opacity:0;transform:scale(1.5)translateY(-3px)}.m3-count-leave-to[data-v-2338355e]{opacity:0;transform:scale(.6)translateY(2px)}.m3-ac-modal-enter-active[data-v-aace974a],.m3-ac-modal-leave-active[data-v-aace974a]{transition:opacity .15s}.m3-ac-modal-enter-from[data-v-aace974a],.m3-ac-modal-leave-to[data-v-aace974a]{opacity:0}.m3-ac-modal-enter-active .ac-modal-box[data-v-aace974a],.m3-ac-modal-leave-active .ac-modal-box[data-v-aace974a]{transition:transform .15s}.m3-ac-modal-enter-from .ac-modal-box[data-v-aace974a],.m3-ac-modal-leave-to .ac-modal-box[data-v-aace974a]{transform:scale(.95)}.bs-scrim[data-v-5b1fb748]{transition:opacity .3s}.bs-enter-from .bs-scrim[data-v-5b1fb748],.bs-leave-to .bs-scrim[data-v-5b1fb748]{opacity:0}.bs-panel[data-v-5b1fb748]{transition:transform .32s cubic-bezier(.2,0,0,1),opacity .24s}.bs-enter-from .bs-panel[data-v-5b1fb748]{opacity:0;transform:translateY(40%)}.bs-leave-to .bs-panel[data-v-5b1fb748]{opacity:0;transform:translateY(100%)!important}.carousel-track[data-v-f1acc440]{scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none}.carousel-track[data-v-f1acc440]::-webkit-scrollbar{display:none}.snap-center[data-v-f1acc440]>*{scroll-snap-align:center}.snap-start[data-v-f1acc440]>*{scroll-snap-align:start}.hue-slider[data-v-4d640982]{background:linear-gradient(90deg,red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.hue-slider[data-v-4d640982]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.hue-slider[data-v-4d640982]::-moz-range-thumb{cursor:pointer;background:#fff;border:none;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.hue-slider[data-v-59af9128]{background:linear-gradient(90deg,red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.hue-slider[data-v-59af9128]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.hue-slider[data-v-59af9128]::-moz-range-thumb{cursor:pointer;background:#fff;border:none;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.m3-cp-modal-enter-active[data-v-59af9128],.m3-cp-modal-leave-active[data-v-59af9128]{transition:opacity .15s}.m3-cp-modal-enter-from[data-v-59af9128],.m3-cp-modal-leave-to[data-v-59af9128]{opacity:0}.m3-cp-modal-enter-active .cp-box[data-v-59af9128],.m3-cp-modal-leave-active .cp-box[data-v-59af9128]{transition:transform .15s}.m3-cp-modal-enter-from .cp-box[data-v-59af9128],.m3-cp-modal-leave-to .cp-box[data-v-59af9128]{transform:scale(.95)}.m3-cmd-enter-active[data-v-4d6cca63],.m3-cmd-leave-active[data-v-4d6cca63]{transition:opacity .15s}.m3-cmd-enter-from[data-v-4d6cca63],.m3-cmd-leave-to[data-v-4d6cca63]{opacity:0}.m3-cmd-enter-active .cmd-box[data-v-4d6cca63],.m3-cmd-leave-active .cmd-box[data-v-4d6cca63]{transition:transform .15s}.m3-cmd-enter-from .cmd-box[data-v-4d6cca63],.m3-cmd-leave-to .cmd-box[data-v-4d6cca63]{transform:scale(.95)translateY(-10px)}.dt-expand-grid[data-v-857139c7]{grid-template-rows:0fr;transition:grid-template-rows .25s cubic-bezier(.2,0,0,1);display:grid}.dt-expand-grid.dt-expand-open[data-v-857139c7]{grid-template-rows:1fr}.dt-expand-body[data-v-857139c7]{min-height:0;overflow:hidden}.m3-dp-modal-enter-active[data-v-ac5f05d4],.m3-dp-modal-leave-active[data-v-ac5f05d4]{transition:opacity .15s}.m3-dp-modal-enter-from[data-v-ac5f05d4],.m3-dp-modal-leave-to[data-v-ac5f05d4]{opacity:0}.m3-dp-modal-enter-active .dp-box[data-v-ac5f05d4],.m3-dp-modal-leave-active .dp-box[data-v-ac5f05d4]{transition:transform .15s}.m3-dp-modal-enter-from .dp-box[data-v-ac5f05d4],.m3-dp-modal-leave-to .dp-box[data-v-ac5f05d4]{transform:scale(.95)}.m3-drp-modal-enter-active[data-v-fcb7a791],.m3-drp-modal-leave-active[data-v-fcb7a791]{transition:opacity .15s}.m3-drp-modal-enter-from[data-v-fcb7a791],.m3-drp-modal-leave-to[data-v-fcb7a791]{opacity:0}.m3-drp-modal-enter-active .drp-box[data-v-fcb7a791],.m3-drp-modal-leave-active .drp-box[data-v-fcb7a791]{transition:transform .15s}.m3-drp-modal-enter-from .drp-box[data-v-fcb7a791],.m3-drp-modal-leave-to .drp-box[data-v-fcb7a791]{transform:scale(.95)}.expand-grid[data-v-31731809]{grid-template-rows:0fr;transition:grid-template-rows .3s ease-in-out;display:grid}.expand-grid.expand-open[data-v-31731809]{grid-template-rows:1fr}.expand-body[data-v-31731809]{min-height:0;overflow:hidden}.m3-fab-content-enter-active[data-v-02ba313e]{transition:opacity .2s,transform .2s cubic-bezier(.2,0,0,1)}.m3-fab-content-leave-active[data-v-02ba313e]{transition:opacity .15s,transform .15s}.m3-fab-content-enter-from[data-v-02ba313e]{opacity:0;transform:scale(.85)}.m3-fab-content-leave-to[data-v-02ba313e]{opacity:0;transform:scale(.9)}.m3-file-enter-active[data-v-6b150427],.m3-file-leave-active[data-v-6b150427]{transition:all .2s}.m3-file-enter-from[data-v-6b150427],.m3-file-leave-to[data-v-6b150427]{opacity:0;transform:translateY(-8px)}.mli-expand-grid{grid-template-rows:1fr;display:grid}.mli-expand-body{min-height:0;padding-left:2rem;overflow:hidden}.mli-expand-enter-active{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1)}.mli-expand-enter-active>.mli-expand-body{transition:opacity .2s cubic-bezier(.2,0,0,1) 80ms}.mli-expand-enter-from{grid-template-rows:0fr}.mli-expand-enter-from>.mli-expand-body{opacity:0}.mli-expand-leave-active{transition:grid-template-rows .25s cubic-bezier(.4,0,1,1)}.mli-expand-leave-active>.mli-expand-body{transition:opacity .12s cubic-bezier(.4,0,1,1)}.mli-expand-leave-to{grid-template-rows:0fr}.mli-expand-leave-to>.mli-expand-body{opacity:0}.m3-mac-modal-enter-active[data-v-3337b2c7],.m3-mac-modal-leave-active[data-v-3337b2c7]{transition:opacity .15s}.m3-mac-modal-enter-from[data-v-3337b2c7],.m3-mac-modal-leave-to[data-v-3337b2c7]{opacity:0}.m3-mac-modal-enter-active .mac-modal-box[data-v-3337b2c7],.m3-mac-modal-leave-active .mac-modal-box[data-v-3337b2c7]{transition:transform .15s}.m3-mac-modal-enter-from .mac-modal-box[data-v-3337b2c7],.m3-mac-modal-leave-to .mac-modal-box[data-v-3337b2c7]{transform:scale(.95)}.m3-ms-modal-enter-active[data-v-67bbd3cf],.m3-ms-modal-leave-active[data-v-67bbd3cf]{transition:opacity .15s}.m3-ms-modal-enter-from[data-v-67bbd3cf],.m3-ms-modal-leave-to[data-v-67bbd3cf]{opacity:0}.m3-ms-modal-enter-active .ms-modal-box[data-v-67bbd3cf],.m3-ms-modal-leave-active .ms-modal-box[data-v-67bbd3cf]{transition:transform .15s}.m3-ms-modal-enter-from .ms-modal-box[data-v-67bbd3cf],.m3-ms-modal-leave-to .ms-modal-box[data-v-67bbd3cf]{transform:scale(.95)}input[type=number][data-v-f6db08d0]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number][data-v-f6db08d0]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number][data-v-f6db08d0]{-moz-appearance:textfield}.nd-scrim[data-v-2210a491]{transition:opacity .28s}.nd-enter-from .nd-scrim[data-v-2210a491],.nd-leave-to .nd-scrim[data-v-2210a491]{opacity:0}.nd-panel[data-v-2210a491]{transition:transform .3s cubic-bezier(.2,0,0,1)}.nd-enter-from .nd-panel-left[data-v-2210a491],.nd-leave-to .nd-panel-left[data-v-2210a491]{transform:translate(-100%)}.nd-enter-from .nd-panel-right[data-v-2210a491],.nd-leave-to .nd-panel-right[data-v-2210a491]{transform:translate(100%)}.nd-enter-from .nd-panel-top[data-v-2210a491],.nd-leave-to .nd-panel-top[data-v-2210a491]{transform:translateY(-100%)}.nd-enter-from .nd-panel-bottom[data-v-2210a491],.nd-leave-to .nd-panel-bottom[data-v-2210a491]{transform:translateY(100%)}.nd-section-grid[data-v-2210a491]{grid-template-rows:1fr;display:grid}.nd-section-body[data-v-2210a491]{min-height:0;overflow:hidden}.nd-section-enter-active[data-v-2210a491]{transition:grid-template-rows .35s cubic-bezier(.2,0,0,1)}.nd-section-enter-active>.nd-section-body[data-v-2210a491]{transition:opacity .25s cubic-bezier(.2,0,0,1) 80ms}.nd-section-enter-from[data-v-2210a491]{grid-template-rows:0fr}.nd-section-enter-from>.nd-section-body[data-v-2210a491]{opacity:0}.nd-section-leave-active[data-v-2210a491]{transition:grid-template-rows .28s cubic-bezier(.4,0,1,1)}.nd-section-leave-active>.nd-section-body[data-v-2210a491]{transition:opacity .15s cubic-bezier(.4,0,1,1)}.nd-section-leave-to[data-v-2210a491]{grid-template-rows:0fr}.nd-section-leave-to>.nd-section-body[data-v-2210a491]{opacity:0}.nd-inline[data-v-2210a491]{transition:width .3s cubic-bezier(.2,0,0,1);overflow:hidden}.nd-inline[data-v-2210a491]>*{min-width:var(--nd-width,18rem)}.nd-inline.nd-collapsed[data-v-2210a491]>*{min-width:0}.nd-toggle[data-v-2210a491]{align-items:center;display:flex}.nd-toggle-inner[data-v-2210a491]{flex-shrink:0;justify-content:center;align-items:center;width:72px;height:64px;display:flex}.nd-label[data-v-2210a491]{transition:opacity .2s cubic-bezier(.2,0,0,1) 80ms}.nd-inline.nd-collapsed .nd-label[data-v-2210a491],.nd-inline.nd-collapsed[data-v-2210a491] .nd-label{opacity:0;transition:opacity .1s cubic-bezier(.2,0,0,1)}.nd-inline .nd-collapse-h[data-v-2210a491]{max-height:80px;transition:max-height .3s cubic-bezier(.2,0,0,1)}.nd-inline.nd-collapsed .nd-collapse-h[data-v-2210a491]{max-height:0}.nd-inline .nd-section-body[data-v-2210a491]>*,.nd-inline[data-v-2210a491] .nd-section-body>*{transition:padding .3s cubic-bezier(.2,0,0,1)}.nd-children-divider[data-v-2210a491]{border-top:1px solid #0000;height:0;margin:0 .75rem;transition:border-color .1s,margin .1s}.nd-inline.nd-collapsed .nd-children-divider[data-v-2210a491]{border-top-color:var(--color-outline-variant);margin:.25rem .75rem;transition:border-color .2s .3s,margin .2s .3s}@keyframes m3-wave-flow{0%{transform:translate(0)}to{transform:translate(-20px)}}@keyframes m3-progress-indeterminate{0%{left:-40%}to{left:100%}}@media (prefers-reduced-motion:reduce){.animate-\[m3-wave-flow_1\.2s_linear_infinite\],.animate-\[m3-wave-flow_0\.9s_linear_infinite\],.animate-\[m3-progress-indeterminate_1\.6s_ease-in-out_infinite\]{animation:none!important}}@keyframes m3-cpb-spin{0%{transform:rotate(-90deg)}to{transform:rotate(270deg)}}@keyframes m3-cpb-arc{0%{stroke-dasharray:5 246.3;stroke-dashoffset:0}50%{stroke-dasharray:176 75.3;stroke-dashoffset:-70px}to{stroke-dasharray:5 246.3;stroke-dashoffset:-251.3px}}.m3-radio-dot[data-v-cdb650b5]{transform-box:fill-box;transform-origin:50%;transition:transform .15s;transform:scale(0)}.m3-radio-dot.is-checked[data-v-cdb650b5]{transform:scale(1)}.m3-select-modal-enter-active[data-v-17adb5b4],.m3-select-modal-leave-active[data-v-17adb5b4]{transition:opacity .15s}.m3-select-modal-enter-from[data-v-17adb5b4],.m3-select-modal-leave-to[data-v-17adb5b4]{opacity:0}.m3-select-modal-enter-active .select-modal-box[data-v-17adb5b4],.m3-select-modal-leave-active .select-modal-box[data-v-17adb5b4]{transition:transform .15s}.m3-select-modal-enter-from .select-modal-box[data-v-17adb5b4],.m3-select-modal-leave-to .select-modal-box[data-v-17adb5b4]{transform:scale(.95)}.ss-scrim[data-v-ba5b6f4b]{transition:opacity .28s}.ss-enter-from .ss-scrim[data-v-ba5b6f4b],.ss-leave-to .ss-scrim[data-v-ba5b6f4b]{opacity:0}.ss-panel[data-v-ba5b6f4b]{transition:transform .32s cubic-bezier(.2,0,0,1),opacity .24s}.ss-enter-from .ss-panel[data-v-ba5b6f4b]{opacity:0;transform:translate(40%)}.ss-leave-to .ss-panel[data-v-ba5b6f4b]{opacity:0;transform:translate(100%)!important}@keyframes skeleton-wave-move-32ecf05b{0%{transform:translate(-100%)}60%{transform:translate(100%)}to{transform:translate(100%)}}.skeleton-wave[data-v-32ecf05b]{position:relative;overflow:hidden}.skeleton-wave[data-v-32ecf05b]:after{content:"";background:linear-gradient(90deg, transparent 0%, var(--color-on-surface) 50%, transparent 100%);opacity:.06;animation:1.8s ease-in-out infinite skeleton-wave-move-32ecf05b;position:absolute;inset:0}.toggle-btn[data-v-ec1435bc]{transition:border-radius .25s,background-color .15s}.m3-spot-enter-active[data-v-1fa0da82],.m3-spot-leave-active[data-v-1fa0da82]{transition:opacity .15s}.m3-spot-enter-from[data-v-1fa0da82],.m3-spot-leave-to[data-v-1fa0da82]{opacity:0}.m3-spot-enter-active .spot-box[data-v-1fa0da82],.m3-spot-leave-active .spot-box[data-v-1fa0da82]{transition:transform .15s,opacity .15s}.m3-spot-enter-from .spot-box[data-v-1fa0da82]{opacity:0;transform:scale(.96)translateY(-8px)}.m3-spot-leave-to .spot-box[data-v-1fa0da82]{opacity:0;transform:scale(.98)}.m3-tp-modal-enter-active[data-v-a2a090e9],.m3-tp-modal-leave-active[data-v-a2a090e9]{transition:opacity .15s}.m3-tp-modal-enter-from[data-v-a2a090e9],.m3-tp-modal-leave-to[data-v-a2a090e9]{opacity:0}.m3-tp-modal-enter-active .tp-box[data-v-a2a090e9],.m3-tp-modal-leave-active .tp-box[data-v-a2a090e9]{transition:transform .15s}.m3-tp-modal-enter-from .tp-box[data-v-a2a090e9],.m3-tp-modal-leave-to .tp-box[data-v-a2a090e9]{transform:scale(.95)}.m3-tour-highlight{box-shadow:0 0 0 4px var(--color-primary);border-radius:8px;position:relative;z-index:201!important}.m3-tour-enter-active,.m3-tour-leave-active{transition:opacity .2s}.m3-tour-enter-from,.m3-tour-leave-to{opacity:0}.m3-markdown[data-v-23db2c2c] h1{font-size:var(--text-headline-large);line-height:var(--text-headline-large--line-height);color:var(--color-on-surface);margin:1em 0 .5em;font-weight:600}.m3-markdown[data-v-23db2c2c] h2{font-size:var(--text-headline-medium);line-height:var(--text-headline-medium--line-height);color:var(--color-on-surface);margin:1em 0 .5em;font-weight:600}.m3-markdown[data-v-23db2c2c] h3{font-size:var(--text-headline-small);line-height:var(--text-headline-small--line-height);color:var(--color-on-surface);margin:.75em 0 .25em;font-weight:600}.m3-markdown[data-v-23db2c2c] h4{font-size:var(--text-title-large);line-height:var(--text-title-large--line-height);color:var(--color-on-surface);margin:.75em 0 .25em;font-weight:600}.m3-markdown[data-v-23db2c2c] p{margin:.5em 0}.m3-markdown[data-v-23db2c2c] a{color:var(--color-primary);text-underline-offset:2px;text-decoration:underline}.m3-markdown[data-v-23db2c2c] a:hover{opacity:.8}.m3-markdown[data-v-23db2c2c] strong{color:var(--color-on-surface);font-weight:600}.m3-markdown[data-v-23db2c2c] em{font-style:italic}.m3-markdown[data-v-23db2c2c] ul{margin:.5em 0;padding-left:1.5em;list-style-type:disc}.m3-markdown[data-v-23db2c2c] ol{margin:.5em 0;padding-left:1.5em;list-style-type:decimal}.m3-markdown[data-v-23db2c2c] li{margin:.25em 0}.m3-markdown[data-v-23db2c2c] li::marker{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] blockquote{border-left:3px solid var(--color-primary);background:var(--color-surface-container);color:var(--color-on-surface-variant);border-radius:0 8px 8px 0;margin:.75em 0;padding:.5em 1em}.m3-markdown[data-v-23db2c2c] code{background:var(--color-surface-container-highest);color:var(--color-primary);border-radius:4px;padding:.15em .4em;font-family:Roboto Mono,Fira Code,Consolas,monospace;font-size:.875em}.m3-markdown[data-v-23db2c2c] pre{background:var(--color-surface-container-highest);border:1px solid var(--color-outline-variant);border-radius:12px;margin:.75em 0;padding:1em;overflow-x:auto}.m3-markdown[data-v-23db2c2c] pre code{color:var(--color-on-surface);background:0 0;padding:0;font-size:.8125rem;line-height:1.6}.m3-markdown[data-v-23db2c2c] .hljs-keyword,.m3-markdown[data-v-23db2c2c] .hljs-selector-tag,.m3-markdown[data-v-23db2c2c] .hljs-built_in,.m3-markdown[data-v-23db2c2c] .hljs-tag .hljs-keyword{color:var(--color-primary)}.m3-markdown[data-v-23db2c2c] .hljs-string,.m3-markdown[data-v-23db2c2c] .hljs-regexp,.m3-markdown[data-v-23db2c2c] .hljs-template-variable{color:var(--color-tertiary)}.m3-markdown[data-v-23db2c2c] .hljs-number,.m3-markdown[data-v-23db2c2c] .hljs-literal{color:var(--color-error)}.m3-markdown[data-v-23db2c2c] .hljs-title.function_,.m3-markdown[data-v-23db2c2c] .hljs-title.function_>.hljs-keyword{color:var(--color-secondary);font-weight:500}.m3-markdown[data-v-23db2c2c] .hljs-type,.m3-markdown[data-v-23db2c2c] .hljs-title.class_{color:var(--color-primary);font-style:italic}.m3-markdown[data-v-23db2c2c] .hljs-comment,.m3-markdown[data-v-23db2c2c] .hljs-quote{color:var(--color-outline);font-style:italic}.m3-markdown[data-v-23db2c2c] .hljs-attr,.m3-markdown[data-v-23db2c2c] .hljs-attribute{color:var(--color-tertiary)}.m3-markdown[data-v-23db2c2c] .hljs-tag{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] .hljs-name{color:var(--color-primary)}.m3-markdown[data-v-23db2c2c] .hljs-punctuation,.m3-markdown[data-v-23db2c2c] .hljs-operator,.m3-markdown[data-v-23db2c2c] .hljs-meta,.m3-markdown[data-v-23db2c2c] .hljs-meta .hljs-keyword{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] .hljs-variable,.m3-markdown[data-v-23db2c2c] .hljs-property,.m3-markdown[data-v-23db2c2c] .hljs-symbol,.m3-markdown[data-v-23db2c2c] .hljs-params{color:var(--color-on-surface)}.m3-markdown[data-v-23db2c2c] .m3-code-block{position:relative}.m3-markdown[data-v-23db2c2c] .m3-code-copy{background:var(--color-surface-container);width:28px;height:28px;color:var(--color-on-surface-variant);cursor:pointer;opacity:0;z-index:1;border:none;border-radius:6px;justify-content:center;align-items:center;transition:opacity .15s;display:flex;position:absolute;top:8px;right:8px}.m3-markdown[data-v-23db2c2c] .m3-code-block:hover .m3-code-copy{opacity:1}.m3-markdown[data-v-23db2c2c] .m3-code-copy:hover{background:var(--color-surface-container-high);color:var(--color-on-surface)}.m3-markdown[data-v-23db2c2c] .m3-code-line{display:block}.m3-markdown[data-v-23db2c2c] .m3-line-hl{background:color-mix(in srgb, var(--color-primary) 8%, transparent);border-left:2px solid color-mix(in srgb, var(--color-primary) 40%, transparent);margin:0 -1em;padding:0 1em 0 calc(1em - 2px)}.m3-markdown[data-v-23db2c2c] hr{border:none;border-top:1px solid var(--color-outline-variant);margin:1.5em 0}.m3-markdown[data-v-23db2c2c] table{border-collapse:collapse;width:100%;margin:.75em 0}.m3-markdown[data-v-23db2c2c] th{background:var(--color-surface-container);text-align:left;border-bottom:2px solid var(--color-outline-variant);font-weight:600;font-size:var(--text-label-large);color:var(--color-on-surface);padding:.5em .75em}.m3-markdown[data-v-23db2c2c] td{border-bottom:1px solid var(--color-outline-variant);padding:.5em .75em}.m3-markdown[data-v-23db2c2c] img{border-radius:12px;max-width:100%;height:auto;margin:.5em 0}.rte-content[data-v-e6829e5c] .tiptap{min-height:inherit;outline:none}.rte-content[data-v-e6829e5c] .tiptap p.is-editor-empty:first-child:before{content:attr(data-placeholder);float:left;color:var(--color-on-surface-variant);opacity:.5;pointer-events:none;height:0}.rte-content[data-v-e6829e5c] h1{font-size:var(--text-headline-large);line-height:var(--text-headline-large--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-e6829e5c] h2{font-size:var(--text-headline-medium);line-height:var(--text-headline-medium--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-e6829e5c] h3{font-size:var(--text-headline-small);line-height:var(--text-headline-small--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-e6829e5c] p{margin:.5em 0}.rte-content[data-v-e6829e5c] ul{margin:.5em 0;padding-left:1.5em;list-style-type:disc}.rte-content[data-v-e6829e5c] ol{margin:.5em 0;padding-left:1.5em;list-style-type:decimal}.rte-content[data-v-e6829e5c] blockquote{border-left:3px solid var(--color-primary);color:var(--color-on-surface-variant);margin:.5em 0;padding-left:1em}.rte-content[data-v-e6829e5c] code{background:var(--color-surface-container-highest);border-radius:4px;padding:.15em .4em;font-size:.875em}.rte-content[data-v-e6829e5c] pre{background:var(--color-surface-container-highest);border-radius:8px;margin:.5em 0;padding:1em;overflow-x:auto}.rte-content[data-v-e6829e5c] pre code{background:0 0;padding:0}.rte-content[data-v-e6829e5c] a{color:var(--color-primary);text-decoration:underline}.rte-content[data-v-e6829e5c] mark{background:var(--color-tertiary-container);color:var(--color-on-tertiary-container);border-radius:2px;padding:.1em .2em}.rte-content[data-v-e6829e5c] img{border-radius:8px;max-width:100%;height:auto;margin:.5em 0}
1
+ .code-editor-container[data-v-05d72157] .cm-editor{height:100%;min-height:inherit;font-family:Roboto Mono,Fira Code,Consolas,monospace;font-size:.8125rem;line-height:1.6}.code-editor-container[data-v-05d72157] .cm-editor.cm-focused{outline:none}.code-editor-container[data-v-05d72157] .cm-scroller{min-height:inherit}.code-editor-container[data-v-05d72157] .cm-content{padding:12px 0}.code-editor-container[data-v-05d72157] .cm-line{padding:0 16px}.code-editor-container[data-v-05d72157] .cm-gutters{background:var(--color-surface-container);border-right:1px solid var(--color-outline-variant);color:var(--color-outline);padding:0 4px;font-size:.75rem}.code-editor-container[data-v-05d72157] .cm-activeLineGutter{background:var(--color-surface-container-high);color:var(--color-on-surface-variant)}.code-editor-container[data-v-05d72157] .cm-activeLine{background:var(--color-surface-container-lowest)}.code-editor-container[data-v-05d72157] .cm-selectionBackground{background:var(--color-primary-container)!important}.code-editor-container[data-v-05d72157] .cm-cursor{border-left-color:var(--color-primary);border-left-width:2px}.code-editor-container[data-v-05d72157] .cm-matchingBracket{background:var(--color-tertiary-container);color:var(--color-on-tertiary-container);border-radius:2px}.code-editor-container[data-v-05d72157] .cm-foldGutter span{color:var(--color-on-surface-variant)}@keyframes m3-wavy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes m3-wavy-travel{0%{stroke-dashoffset:0}to{stroke-dashoffset:calc(var(--m3-wave-len) * -1px)}}@media (prefers-reduced-motion:reduce){.animate-\[m3-wavy-spin_2\.8s_linear_infinite\]{animation:2.8s linear infinite m3-wavy-spin}.animate-\[m3-wavy-travel_2s_linear_infinite\]{animation:none!important}}.m3-dialog-enter-active[data-v-2e3c3567],.m3-dialog-leave-active[data-v-2e3c3567]{transition:opacity .15s}.m3-dialog-enter-from[data-v-2e3c3567],.m3-dialog-leave-to[data-v-2e3c3567]{opacity:0}.m3-dialog-enter-active .dialog-box[data-v-2e3c3567],.m3-dialog-leave-active .dialog-box[data-v-2e3c3567]{transition:transform .15s}.m3-dialog-enter-from .dialog-box[data-v-2e3c3567],.m3-dialog-leave-to .dialog-box[data-v-2e3c3567]{transform:scale(.95)}.m3-dialog-fs-enter-active[data-v-2e3c3567],.m3-dialog-fs-leave-active[data-v-2e3c3567]{transition:transform .25s cubic-bezier(.2,0,0,1),opacity .15s}.m3-dialog-fs-enter-from[data-v-2e3c3567],.m3-dialog-fs-leave-to[data-v-2e3c3567]{opacity:0;transform:translateY(100%)}.toast-row[data-v-d4877a26]{grid-template-rows:1fr;padding-bottom:8px;display:grid}.toast-row>.toast-inner[data-v-d4877a26]{min-height:0}.m3-toast-bot-enter-active[data-v-d4877a26]{transition:grid-template-rows .22s cubic-bezier(.2,0,0,1),padding-bottom .22s cubic-bezier(.2,0,0,1)}.m3-toast-bot-enter-active>.toast-inner[data-v-d4877a26]{transition:opacity .18s,transform .22s cubic-bezier(.2,0,0,1)}.m3-toast-bot-enter-from[data-v-d4877a26]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-bot-enter-from>.toast-inner[data-v-d4877a26]{opacity:0;transform:translateY(20px)scale(.94)}.m3-toast-bot-leave-active[data-v-d4877a26]{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1),padding-bottom .3s cubic-bezier(.2,0,0,1)}.m3-toast-bot-leave-active>.toast-inner[data-v-d4877a26]{transition:opacity .18s,transform .18s}.m3-toast-bot-leave-to[data-v-d4877a26]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-bot-leave-to>.toast-inner[data-v-d4877a26]{opacity:0;transform:scale(.92)}.m3-toast-bot-leave-active>.toast-count-badge[data-v-d4877a26]{transition:opacity .15s,transform .15s}.m3-toast-bot-leave-to>.toast-count-badge[data-v-d4877a26]{opacity:0;transform:scale(.5)}.m3-toast-top-enter-active[data-v-d4877a26]{transition:grid-template-rows .22s cubic-bezier(.2,0,0,1),padding-bottom .22s cubic-bezier(.2,0,0,1)}.m3-toast-top-enter-active>.toast-inner[data-v-d4877a26]{transition:opacity .18s,transform .22s cubic-bezier(.2,0,0,1)}.m3-toast-top-enter-from[data-v-d4877a26]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-top-enter-from>.toast-inner[data-v-d4877a26]{opacity:0;transform:translateY(-20px)scale(.94)}.m3-toast-top-leave-active[data-v-d4877a26]{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1),padding-bottom .3s cubic-bezier(.2,0,0,1)}.m3-toast-top-leave-active>.toast-inner[data-v-d4877a26]{transition:opacity .18s,transform .18s}.m3-toast-top-leave-to[data-v-d4877a26]{grid-template-rows:0fr;padding-bottom:0}.m3-toast-top-leave-to>.toast-inner[data-v-d4877a26]{opacity:0;transform:scale(.92)}.m3-toast-top-leave-active>.toast-count-badge[data-v-d4877a26]{transition:opacity .15s,transform .15s}.m3-toast-top-leave-to>.toast-count-badge[data-v-d4877a26]{opacity:0;transform:scale(.5)}.m3-badge-enter-active[data-v-d4877a26]{transition:opacity .2s,transform .2s cubic-bezier(.34,1.56,.64,1)}.m3-badge-leave-active[data-v-d4877a26]{transition:opacity .15s,transform .15s}.m3-badge-enter-from[data-v-d4877a26],.m3-badge-leave-to[data-v-d4877a26]{opacity:0;transform:scale(.5)}.m3-count-enter-active[data-v-d4877a26]{transition:opacity .12s,transform .12s}.m3-count-leave-active[data-v-d4877a26]{transition:opacity 80ms,transform 80ms}.m3-count-enter-from[data-v-d4877a26]{opacity:0;transform:scale(1.5)translateY(-3px)}.m3-count-leave-to[data-v-d4877a26]{opacity:0;transform:scale(.6)translateY(2px)}@keyframes m3-toast-progress-d4877a26{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.notif-row[data-v-2338355e]{grid-template-rows:1fr;padding-bottom:6px;display:grid}.notif-row>.notif-inner[data-v-2338355e]{min-height:0}.m3-notif-bot-enter-active[data-v-2338355e]{transition:grid-template-rows .2s,padding-bottom .2s}.m3-notif-bot-enter-active>.notif-inner[data-v-2338355e]{transition:opacity .15s,transform .2s;overflow:hidden}.m3-notif-bot-enter-from[data-v-2338355e]{grid-template-rows:0fr;padding-bottom:0}.m3-notif-bot-enter-from>.notif-inner[data-v-2338355e]{opacity:0;transform:translateY(12px)scale(.95)}.m3-notif-bot-leave-active[data-v-2338355e]{transition:grid-template-rows .25s,padding-bottom .25s}.m3-notif-bot-leave-active>.notif-inner[data-v-2338355e]{transition:opacity .15s,transform .15s;overflow:hidden}.m3-notif-bot-leave-to[data-v-2338355e]{grid-template-rows:0fr;padding-bottom:0}.m3-notif-bot-leave-to>.notif-inner[data-v-2338355e]{opacity:0;transform:scale(.93)}.m3-notif-bot-leave-active>.notif-count-badge[data-v-2338355e]{transition:opacity .15s,transform .15s}.m3-notif-bot-leave-to>.notif-count-badge[data-v-2338355e]{opacity:0;transform:scale(.5)}.m3-notif-top-enter-active[data-v-2338355e]{transition:grid-template-rows .2s,padding-bottom .2s}.m3-notif-top-enter-active>.notif-inner[data-v-2338355e]{transition:opacity .15s,transform .2s;overflow:hidden}.m3-notif-top-enter-from[data-v-2338355e]{grid-template-rows:0fr;padding-bottom:0}.m3-notif-top-enter-from>.notif-inner[data-v-2338355e]{opacity:0;transform:translateY(-12px)scale(.95)}.m3-notif-top-leave-active[data-v-2338355e]{transition:grid-template-rows .25s,padding-bottom .25s}.m3-notif-top-leave-active>.notif-inner[data-v-2338355e]{transition:opacity .15s,transform .15s;overflow:hidden}.m3-notif-top-leave-to[data-v-2338355e]{grid-template-rows:0fr;padding-bottom:0}.m3-notif-top-leave-to>.notif-inner[data-v-2338355e]{opacity:0;transform:scale(.93)}.m3-notif-top-leave-active>.notif-count-badge[data-v-2338355e]{transition:opacity .15s,transform .15s}.m3-notif-top-leave-to>.notif-count-badge[data-v-2338355e]{opacity:0;transform:scale(.5)}.m3-badge-enter-active[data-v-2338355e]{transition:opacity .2s,transform .2s cubic-bezier(.34,1.56,.64,1)}.m3-badge-leave-active[data-v-2338355e]{transition:opacity .15s,transform .15s}.m3-badge-enter-from[data-v-2338355e],.m3-badge-leave-to[data-v-2338355e]{opacity:0;transform:scale(.5)}.m3-count-enter-active[data-v-2338355e]{transition:opacity .12s,transform .12s}.m3-count-leave-active[data-v-2338355e]{transition:opacity 80ms,transform 80ms}.m3-count-enter-from[data-v-2338355e]{opacity:0;transform:scale(1.5)translateY(-3px)}.m3-count-leave-to[data-v-2338355e]{opacity:0;transform:scale(.6)translateY(2px)}.m3-ac-modal-enter-active[data-v-aace974a],.m3-ac-modal-leave-active[data-v-aace974a]{transition:opacity .15s}.m3-ac-modal-enter-from[data-v-aace974a],.m3-ac-modal-leave-to[data-v-aace974a]{opacity:0}.m3-ac-modal-enter-active .ac-modal-box[data-v-aace974a],.m3-ac-modal-leave-active .ac-modal-box[data-v-aace974a]{transition:transform .15s}.m3-ac-modal-enter-from .ac-modal-box[data-v-aace974a],.m3-ac-modal-leave-to .ac-modal-box[data-v-aace974a]{transform:scale(.95)}.bs-scrim[data-v-5b1fb748]{transition:opacity .3s}.bs-enter-from .bs-scrim[data-v-5b1fb748],.bs-leave-to .bs-scrim[data-v-5b1fb748]{opacity:0}.bs-panel[data-v-5b1fb748]{transition:transform .32s cubic-bezier(.2,0,0,1),opacity .24s}.bs-enter-from .bs-panel[data-v-5b1fb748]{opacity:0;transform:translateY(40%)}.bs-leave-to .bs-panel[data-v-5b1fb748]{opacity:0;transform:translateY(100%)!important}.carousel-track[data-v-f1acc440]{scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none}.carousel-track[data-v-f1acc440]::-webkit-scrollbar{display:none}.snap-center[data-v-f1acc440]>*{scroll-snap-align:center}.snap-start[data-v-f1acc440]>*{scroll-snap-align:start}.hue-slider[data-v-4d640982]{background:linear-gradient(90deg,red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.hue-slider[data-v-4d640982]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.hue-slider[data-v-4d640982]::-moz-range-thumb{cursor:pointer;background:#fff;border:none;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.hue-slider[data-v-59af9128]{background:linear-gradient(90deg,red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.hue-slider[data-v-59af9128]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.hue-slider[data-v-59af9128]::-moz-range-thumb{cursor:pointer;background:#fff;border:none;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0006}.m3-cp-modal-enter-active[data-v-59af9128],.m3-cp-modal-leave-active[data-v-59af9128]{transition:opacity .15s}.m3-cp-modal-enter-from[data-v-59af9128],.m3-cp-modal-leave-to[data-v-59af9128]{opacity:0}.m3-cp-modal-enter-active .cp-box[data-v-59af9128],.m3-cp-modal-leave-active .cp-box[data-v-59af9128]{transition:transform .15s}.m3-cp-modal-enter-from .cp-box[data-v-59af9128],.m3-cp-modal-leave-to .cp-box[data-v-59af9128]{transform:scale(.95)}.m3-cmd-enter-active[data-v-4d6cca63],.m3-cmd-leave-active[data-v-4d6cca63]{transition:opacity .15s}.m3-cmd-enter-from[data-v-4d6cca63],.m3-cmd-leave-to[data-v-4d6cca63]{opacity:0}.m3-cmd-enter-active .cmd-box[data-v-4d6cca63],.m3-cmd-leave-active .cmd-box[data-v-4d6cca63]{transition:transform .15s}.m3-cmd-enter-from .cmd-box[data-v-4d6cca63],.m3-cmd-leave-to .cmd-box[data-v-4d6cca63]{transform:scale(.95)translateY(-10px)}.dt-expand-grid[data-v-857139c7]{grid-template-rows:0fr;transition:grid-template-rows .25s cubic-bezier(.2,0,0,1);display:grid}.dt-expand-grid.dt-expand-open[data-v-857139c7]{grid-template-rows:1fr}.dt-expand-body[data-v-857139c7]{min-height:0;overflow:hidden}.m3-dp-modal-enter-active[data-v-ac5f05d4],.m3-dp-modal-leave-active[data-v-ac5f05d4]{transition:opacity .15s}.m3-dp-modal-enter-from[data-v-ac5f05d4],.m3-dp-modal-leave-to[data-v-ac5f05d4]{opacity:0}.m3-dp-modal-enter-active .dp-box[data-v-ac5f05d4],.m3-dp-modal-leave-active .dp-box[data-v-ac5f05d4]{transition:transform .15s}.m3-dp-modal-enter-from .dp-box[data-v-ac5f05d4],.m3-dp-modal-leave-to .dp-box[data-v-ac5f05d4]{transform:scale(.95)}.m3-drp-modal-enter-active[data-v-fcb7a791],.m3-drp-modal-leave-active[data-v-fcb7a791]{transition:opacity .15s}.m3-drp-modal-enter-from[data-v-fcb7a791],.m3-drp-modal-leave-to[data-v-fcb7a791]{opacity:0}.m3-drp-modal-enter-active .drp-box[data-v-fcb7a791],.m3-drp-modal-leave-active .drp-box[data-v-fcb7a791]{transition:transform .15s}.m3-drp-modal-enter-from .drp-box[data-v-fcb7a791],.m3-drp-modal-leave-to .drp-box[data-v-fcb7a791]{transform:scale(.95)}.expand-grid[data-v-31731809]{grid-template-rows:0fr;transition:grid-template-rows .3s ease-in-out;display:grid}.expand-grid.expand-open[data-v-31731809]{grid-template-rows:1fr}.expand-body[data-v-31731809]{min-height:0;overflow:hidden}.m3-fab-content-enter-active[data-v-02ba313e]{transition:opacity .2s,transform .2s cubic-bezier(.2,0,0,1)}.m3-fab-content-leave-active[data-v-02ba313e]{transition:opacity .15s,transform .15s}.m3-fab-content-enter-from[data-v-02ba313e]{opacity:0;transform:scale(.85)}.m3-fab-content-leave-to[data-v-02ba313e]{opacity:0;transform:scale(.9)}.m3-file-enter-active[data-v-6b150427],.m3-file-leave-active[data-v-6b150427]{transition:all .2s}.m3-file-enter-from[data-v-6b150427],.m3-file-leave-to[data-v-6b150427]{opacity:0;transform:translateY(-8px)}.mli-expand-grid{grid-template-rows:1fr;display:grid}.mli-expand-body{min-height:0;padding-left:2rem;overflow:hidden}.mli-expand-enter-active{transition:grid-template-rows .3s cubic-bezier(.2,0,0,1)}.mli-expand-enter-active>.mli-expand-body{transition:opacity .2s cubic-bezier(.2,0,0,1) 80ms}.mli-expand-enter-from{grid-template-rows:0fr}.mli-expand-enter-from>.mli-expand-body{opacity:0}.mli-expand-leave-active{transition:grid-template-rows .25s cubic-bezier(.4,0,1,1)}.mli-expand-leave-active>.mli-expand-body{transition:opacity .12s cubic-bezier(.4,0,1,1)}.mli-expand-leave-to{grid-template-rows:0fr}.mli-expand-leave-to>.mli-expand-body{opacity:0}.m3-mac-modal-enter-active[data-v-3337b2c7],.m3-mac-modal-leave-active[data-v-3337b2c7]{transition:opacity .15s}.m3-mac-modal-enter-from[data-v-3337b2c7],.m3-mac-modal-leave-to[data-v-3337b2c7]{opacity:0}.m3-mac-modal-enter-active .mac-modal-box[data-v-3337b2c7],.m3-mac-modal-leave-active .mac-modal-box[data-v-3337b2c7]{transition:transform .15s}.m3-mac-modal-enter-from .mac-modal-box[data-v-3337b2c7],.m3-mac-modal-leave-to .mac-modal-box[data-v-3337b2c7]{transform:scale(.95)}.m3-ms-modal-enter-active[data-v-67bbd3cf],.m3-ms-modal-leave-active[data-v-67bbd3cf]{transition:opacity .15s}.m3-ms-modal-enter-from[data-v-67bbd3cf],.m3-ms-modal-leave-to[data-v-67bbd3cf]{opacity:0}.m3-ms-modal-enter-active .ms-modal-box[data-v-67bbd3cf],.m3-ms-modal-leave-active .ms-modal-box[data-v-67bbd3cf]{transition:transform .15s}.m3-ms-modal-enter-from .ms-modal-box[data-v-67bbd3cf],.m3-ms-modal-leave-to .ms-modal-box[data-v-67bbd3cf]{transform:scale(.95)}input[type=number][data-v-f6db08d0]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number][data-v-f6db08d0]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number][data-v-f6db08d0]{-moz-appearance:textfield}.nd-scrim[data-v-2210a491]{transition:opacity .28s}.nd-enter-from .nd-scrim[data-v-2210a491],.nd-leave-to .nd-scrim[data-v-2210a491]{opacity:0}.nd-panel[data-v-2210a491]{transition:transform .3s cubic-bezier(.2,0,0,1)}.nd-enter-from .nd-panel-left[data-v-2210a491],.nd-leave-to .nd-panel-left[data-v-2210a491]{transform:translate(-100%)}.nd-enter-from .nd-panel-right[data-v-2210a491],.nd-leave-to .nd-panel-right[data-v-2210a491]{transform:translate(100%)}.nd-enter-from .nd-panel-top[data-v-2210a491],.nd-leave-to .nd-panel-top[data-v-2210a491]{transform:translateY(-100%)}.nd-enter-from .nd-panel-bottom[data-v-2210a491],.nd-leave-to .nd-panel-bottom[data-v-2210a491]{transform:translateY(100%)}.nd-section-grid[data-v-2210a491]{grid-template-rows:1fr;display:grid}.nd-section-body[data-v-2210a491]{min-height:0;overflow:hidden}.nd-section-enter-active[data-v-2210a491]{transition:grid-template-rows .35s cubic-bezier(.2,0,0,1)}.nd-section-enter-active>.nd-section-body[data-v-2210a491]{transition:opacity .25s cubic-bezier(.2,0,0,1) 80ms}.nd-section-enter-from[data-v-2210a491]{grid-template-rows:0fr}.nd-section-enter-from>.nd-section-body[data-v-2210a491]{opacity:0}.nd-section-leave-active[data-v-2210a491]{transition:grid-template-rows .28s cubic-bezier(.4,0,1,1)}.nd-section-leave-active>.nd-section-body[data-v-2210a491]{transition:opacity .15s cubic-bezier(.4,0,1,1)}.nd-section-leave-to[data-v-2210a491]{grid-template-rows:0fr}.nd-section-leave-to>.nd-section-body[data-v-2210a491]{opacity:0}.nd-inline[data-v-2210a491]{transition:width .3s cubic-bezier(.2,0,0,1);overflow:hidden}.nd-inline[data-v-2210a491]>*{min-width:var(--nd-width,18rem)}.nd-inline.nd-collapsed[data-v-2210a491]>*{min-width:0}.nd-toggle[data-v-2210a491]{align-items:center;display:flex}.nd-toggle-inner[data-v-2210a491]{flex-shrink:0;justify-content:center;align-items:center;width:72px;height:64px;display:flex}.nd-label[data-v-2210a491]{transition:opacity .2s cubic-bezier(.2,0,0,1) 80ms}.nd-inline.nd-collapsed .nd-label[data-v-2210a491],.nd-inline.nd-collapsed[data-v-2210a491] .nd-label{opacity:0;transition:opacity .1s cubic-bezier(.2,0,0,1)}.nd-inline .nd-collapse-h[data-v-2210a491]{max-height:80px;transition:max-height .3s cubic-bezier(.2,0,0,1)}.nd-inline.nd-collapsed .nd-collapse-h[data-v-2210a491]{max-height:0}.nd-inline .nd-section-body[data-v-2210a491]>*,.nd-inline[data-v-2210a491] .nd-section-body>*{transition:padding .3s cubic-bezier(.2,0,0,1)}.nd-children-divider[data-v-2210a491]{border-top:1px solid #0000;height:0;margin:0 .75rem;transition:border-color .1s,margin .1s}.nd-inline.nd-collapsed .nd-children-divider[data-v-2210a491]{border-top-color:var(--color-outline-variant);margin:.25rem .75rem;transition:border-color .2s .3s,margin .2s .3s}@keyframes m3-wave-flow{0%{transform:translate(0)}to{transform:translate(-20px)}}@keyframes m3-progress-indeterminate{0%{left:-40%}to{left:100%}}@media (prefers-reduced-motion:reduce){.animate-\[m3-wave-flow_1\.2s_linear_infinite\],.animate-\[m3-wave-flow_0\.9s_linear_infinite\],.animate-\[m3-progress-indeterminate_1\.6s_ease-in-out_infinite\]{animation:none!important}}@keyframes m3-cpb-spin{0%{transform:rotate(-90deg)}to{transform:rotate(270deg)}}@keyframes m3-cpb-arc{0%{stroke-dasharray:5 246.3;stroke-dashoffset:0}50%{stroke-dasharray:176 75.3;stroke-dashoffset:-70px}to{stroke-dasharray:5 246.3;stroke-dashoffset:-251.3px}}.m3-radio-dot[data-v-cdb650b5]{transform-box:fill-box;transform-origin:50%;transition:transform .15s;transform:scale(0)}.m3-radio-dot.is-checked[data-v-cdb650b5]{transform:scale(1)}.m3-select-modal-enter-active[data-v-17adb5b4],.m3-select-modal-leave-active[data-v-17adb5b4]{transition:opacity .15s}.m3-select-modal-enter-from[data-v-17adb5b4],.m3-select-modal-leave-to[data-v-17adb5b4]{opacity:0}.m3-select-modal-enter-active .select-modal-box[data-v-17adb5b4],.m3-select-modal-leave-active .select-modal-box[data-v-17adb5b4]{transition:transform .15s}.m3-select-modal-enter-from .select-modal-box[data-v-17adb5b4],.m3-select-modal-leave-to .select-modal-box[data-v-17adb5b4]{transform:scale(.95)}.ss-scrim[data-v-ba5b6f4b]{transition:opacity .28s}.ss-enter-from .ss-scrim[data-v-ba5b6f4b],.ss-leave-to .ss-scrim[data-v-ba5b6f4b]{opacity:0}.ss-panel[data-v-ba5b6f4b]{transition:transform .32s cubic-bezier(.2,0,0,1),opacity .24s}.ss-enter-from .ss-panel[data-v-ba5b6f4b]{opacity:0;transform:translate(40%)}.ss-leave-to .ss-panel[data-v-ba5b6f4b]{opacity:0;transform:translate(100%)!important}@keyframes skeleton-wave-move-32ecf05b{0%{transform:translate(-100%)}60%{transform:translate(100%)}to{transform:translate(100%)}}.skeleton-wave[data-v-32ecf05b]{position:relative;overflow:hidden}.skeleton-wave[data-v-32ecf05b]:after{content:"";background:linear-gradient(90deg, transparent 0%, var(--color-on-surface) 50%, transparent 100%);opacity:.06;animation:1.8s ease-in-out infinite skeleton-wave-move-32ecf05b;position:absolute;inset:0}.toggle-btn[data-v-ec1435bc]{transition:border-radius .25s,background-color .15s}.m3-spot-enter-active[data-v-1fa0da82],.m3-spot-leave-active[data-v-1fa0da82]{transition:opacity .15s}.m3-spot-enter-from[data-v-1fa0da82],.m3-spot-leave-to[data-v-1fa0da82]{opacity:0}.m3-spot-enter-active .spot-box[data-v-1fa0da82],.m3-spot-leave-active .spot-box[data-v-1fa0da82]{transition:transform .15s,opacity .15s}.m3-spot-enter-from .spot-box[data-v-1fa0da82]{opacity:0;transform:scale(.96)translateY(-8px)}.m3-spot-leave-to .spot-box[data-v-1fa0da82]{opacity:0;transform:scale(.98)}.m3-tp-modal-enter-active[data-v-a2a090e9],.m3-tp-modal-leave-active[data-v-a2a090e9]{transition:opacity .15s}.m3-tp-modal-enter-from[data-v-a2a090e9],.m3-tp-modal-leave-to[data-v-a2a090e9]{opacity:0}.m3-tp-modal-enter-active .tp-box[data-v-a2a090e9],.m3-tp-modal-leave-active .tp-box[data-v-a2a090e9]{transition:transform .15s}.m3-tp-modal-enter-from .tp-box[data-v-a2a090e9],.m3-tp-modal-leave-to .tp-box[data-v-a2a090e9]{transform:scale(.95)}.m3-tour-highlight{box-shadow:0 0 0 4px var(--color-primary);border-radius:8px;position:relative;z-index:201!important}.m3-tour-enter-active,.m3-tour-leave-active{transition:opacity .2s}.m3-tour-enter-from,.m3-tour-leave-to{opacity:0}.m3-markdown[data-v-23db2c2c] h1{font-size:var(--text-headline-large);line-height:var(--text-headline-large--line-height);color:var(--color-on-surface);margin:1em 0 .5em;font-weight:600}.m3-markdown[data-v-23db2c2c] h2{font-size:var(--text-headline-medium);line-height:var(--text-headline-medium--line-height);color:var(--color-on-surface);margin:1em 0 .5em;font-weight:600}.m3-markdown[data-v-23db2c2c] h3{font-size:var(--text-headline-small);line-height:var(--text-headline-small--line-height);color:var(--color-on-surface);margin:.75em 0 .25em;font-weight:600}.m3-markdown[data-v-23db2c2c] h4{font-size:var(--text-title-large);line-height:var(--text-title-large--line-height);color:var(--color-on-surface);margin:.75em 0 .25em;font-weight:600}.m3-markdown[data-v-23db2c2c] p{margin:.5em 0}.m3-markdown[data-v-23db2c2c] a{color:var(--color-primary);text-underline-offset:2px;text-decoration:underline}.m3-markdown[data-v-23db2c2c] a:hover{opacity:.8}.m3-markdown[data-v-23db2c2c] strong{color:var(--color-on-surface);font-weight:600}.m3-markdown[data-v-23db2c2c] em{font-style:italic}.m3-markdown[data-v-23db2c2c] ul{margin:.5em 0;padding-left:1.5em;list-style-type:disc}.m3-markdown[data-v-23db2c2c] ol{margin:.5em 0;padding-left:1.5em;list-style-type:decimal}.m3-markdown[data-v-23db2c2c] li{margin:.25em 0}.m3-markdown[data-v-23db2c2c] li::marker{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] blockquote{border-left:3px solid var(--color-primary);background:var(--color-surface-container);color:var(--color-on-surface-variant);border-radius:0 8px 8px 0;margin:.75em 0;padding:.5em 1em}.m3-markdown[data-v-23db2c2c] code{background:var(--color-surface-container-highest);color:var(--color-primary);border-radius:4px;padding:.15em .4em;font-family:Roboto Mono,Fira Code,Consolas,monospace;font-size:.875em}.m3-markdown[data-v-23db2c2c] pre{background:var(--color-surface-container-highest);border:1px solid var(--color-outline-variant);border-radius:12px;margin:.75em 0;padding:1em;overflow-x:auto}.m3-markdown[data-v-23db2c2c] pre code{color:var(--color-on-surface);background:0 0;padding:0;font-size:.8125rem;line-height:1.6}.m3-markdown[data-v-23db2c2c] .hljs-keyword,.m3-markdown[data-v-23db2c2c] .hljs-selector-tag,.m3-markdown[data-v-23db2c2c] .hljs-built_in,.m3-markdown[data-v-23db2c2c] .hljs-tag .hljs-keyword{color:var(--color-primary)}.m3-markdown[data-v-23db2c2c] .hljs-string,.m3-markdown[data-v-23db2c2c] .hljs-regexp,.m3-markdown[data-v-23db2c2c] .hljs-template-variable{color:var(--color-tertiary)}.m3-markdown[data-v-23db2c2c] .hljs-number,.m3-markdown[data-v-23db2c2c] .hljs-literal{color:var(--color-error)}.m3-markdown[data-v-23db2c2c] .hljs-title.function_,.m3-markdown[data-v-23db2c2c] .hljs-title.function_>.hljs-keyword{color:var(--color-secondary);font-weight:500}.m3-markdown[data-v-23db2c2c] .hljs-type,.m3-markdown[data-v-23db2c2c] .hljs-title.class_{color:var(--color-primary);font-style:italic}.m3-markdown[data-v-23db2c2c] .hljs-comment,.m3-markdown[data-v-23db2c2c] .hljs-quote{color:var(--color-outline);font-style:italic}.m3-markdown[data-v-23db2c2c] .hljs-attr,.m3-markdown[data-v-23db2c2c] .hljs-attribute{color:var(--color-tertiary)}.m3-markdown[data-v-23db2c2c] .hljs-tag{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] .hljs-name{color:var(--color-primary)}.m3-markdown[data-v-23db2c2c] .hljs-punctuation,.m3-markdown[data-v-23db2c2c] .hljs-operator,.m3-markdown[data-v-23db2c2c] .hljs-meta,.m3-markdown[data-v-23db2c2c] .hljs-meta .hljs-keyword{color:var(--color-on-surface-variant)}.m3-markdown[data-v-23db2c2c] .hljs-variable,.m3-markdown[data-v-23db2c2c] .hljs-property,.m3-markdown[data-v-23db2c2c] .hljs-symbol,.m3-markdown[data-v-23db2c2c] .hljs-params{color:var(--color-on-surface)}.m3-markdown[data-v-23db2c2c] .m3-code-block{position:relative}.m3-markdown[data-v-23db2c2c] .m3-code-copy{background:var(--color-surface-container);width:28px;height:28px;color:var(--color-on-surface-variant);cursor:pointer;opacity:0;z-index:1;border:none;border-radius:6px;justify-content:center;align-items:center;transition:opacity .15s;display:flex;position:absolute;top:8px;right:8px}.m3-markdown[data-v-23db2c2c] .m3-code-block:hover .m3-code-copy{opacity:1}.m3-markdown[data-v-23db2c2c] .m3-code-copy:hover{background:var(--color-surface-container-high);color:var(--color-on-surface)}.m3-markdown[data-v-23db2c2c] .m3-code-line{display:block}.m3-markdown[data-v-23db2c2c] .m3-line-hl{background:color-mix(in srgb, var(--color-primary) 8%, transparent);border-left:2px solid color-mix(in srgb, var(--color-primary) 40%, transparent);margin:0 -1em;padding:0 1em 0 calc(1em - 2px)}.m3-markdown[data-v-23db2c2c] hr{border:none;border-top:1px solid var(--color-outline-variant);margin:1.5em 0}.m3-markdown[data-v-23db2c2c] table{border-collapse:collapse;width:100%;margin:.75em 0}.m3-markdown[data-v-23db2c2c] th{background:var(--color-surface-container);text-align:left;border-bottom:2px solid var(--color-outline-variant);font-weight:600;font-size:var(--text-label-large);color:var(--color-on-surface);padding:.5em .75em}.m3-markdown[data-v-23db2c2c] td{border-bottom:1px solid var(--color-outline-variant);padding:.5em .75em}.m3-markdown[data-v-23db2c2c] img{border-radius:12px;max-width:100%;height:auto;margin:.5em 0}.rte-content[data-v-e6829e5c] .tiptap{min-height:inherit;outline:none}.rte-content[data-v-e6829e5c] .tiptap p.is-editor-empty:first-child:before{content:attr(data-placeholder);float:left;color:var(--color-on-surface-variant);opacity:.5;pointer-events:none;height:0}.rte-content[data-v-e6829e5c] h1{font-size:var(--text-headline-large);line-height:var(--text-headline-large--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-e6829e5c] h2{font-size:var(--text-headline-medium);line-height:var(--text-headline-medium--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-e6829e5c] h3{font-size:var(--text-headline-small);line-height:var(--text-headline-small--line-height);margin:.75em 0 .25em;font-weight:600}.rte-content[data-v-e6829e5c] p{margin:.5em 0}.rte-content[data-v-e6829e5c] ul{margin:.5em 0;padding-left:1.5em;list-style-type:disc}.rte-content[data-v-e6829e5c] ol{margin:.5em 0;padding-left:1.5em;list-style-type:decimal}.rte-content[data-v-e6829e5c] blockquote{border-left:3px solid var(--color-primary);color:var(--color-on-surface-variant);margin:.5em 0;padding-left:1em}.rte-content[data-v-e6829e5c] code{background:var(--color-surface-container-highest);border-radius:4px;padding:.15em .4em;font-size:.875em}.rte-content[data-v-e6829e5c] pre{background:var(--color-surface-container-highest);border-radius:8px;margin:.5em 0;padding:1em;overflow-x:auto}.rte-content[data-v-e6829e5c] pre code{background:0 0;padding:0}.rte-content[data-v-e6829e5c] a{color:var(--color-primary);text-decoration:underline}.rte-content[data-v-e6829e5c] mark{background:var(--color-tertiary-container);color:var(--color-on-tertiary-container);border-radius:2px;padding:.1em .2em}.rte-content[data-v-e6829e5c] img{border-radius:8px;max-width:100%;height:auto;margin:.5em 0}
2
2
  /*$vite$:1*/
@@ -0,0 +1,88 @@
1
+ import { inject as e, reactive as t, toValue as n, watchEffect as r } from "vue";
2
+ //#region src/composables/useLocale.ts
3
+ var i = {
4
+ search: "Search...",
5
+ noResults: "No results",
6
+ close: "Close",
7
+ cancel: "Cancel",
8
+ confirm: "Confirm",
9
+ loading: "Loading",
10
+ previous: "Previous",
11
+ next: "Next",
12
+ today: "Today",
13
+ more: "more",
14
+ selectedCount: "selected",
15
+ recordCount: "record",
16
+ expand: "Expand",
17
+ columns: "Columns",
18
+ exportCsv: "Export CSV",
19
+ noGroup: "No group",
20
+ finish: "Finish",
21
+ dropText: "Drop files here or",
22
+ selectText: "browse",
23
+ maxSizePrefix: "Max.",
24
+ remove: "Remove",
25
+ selectDate: "Select date",
26
+ selectTime: "Select time",
27
+ selectRange: "Select range",
28
+ pickStart: "Select start",
29
+ pickEnd: "Select end",
30
+ previousMonth: "Previous month",
31
+ nextMonth: "Next month",
32
+ dayView: "Day",
33
+ weekView: "Week",
34
+ available: "Available",
35
+ selected: "Selected",
36
+ noItems: "No items",
37
+ moveAllRight: "Move all right",
38
+ moveRight: "Move selected right",
39
+ moveLeft: "Move selected left",
40
+ moveAllLeft: "Move all left",
41
+ searchCommand: "Search command...",
42
+ navigateHint: "navigate",
43
+ selectHint: "select",
44
+ openHint: "open",
45
+ closeHint: "close",
46
+ loadingMore: "Loading...",
47
+ noMoreItems: "No more items",
48
+ bold: "Bold",
49
+ italic: "Italic",
50
+ underline: "Underline",
51
+ strikethrough: "Strikethrough",
52
+ highlight: "Highlight",
53
+ bulletList: "Bullet list",
54
+ orderedList: "Ordered list",
55
+ blockquote: "Blockquote",
56
+ code: "Code",
57
+ alignLeft: "Align left",
58
+ alignCenter: "Align center",
59
+ alignRight: "Align right",
60
+ undo: "Undo",
61
+ redo: "Redo",
62
+ link: "Link",
63
+ image: "Image",
64
+ paragraph: "Paragraph",
65
+ heading1: "Heading 1",
66
+ heading2: "Heading 2",
67
+ heading3: "Heading 3",
68
+ insertLink: "Insert link",
69
+ insertImage: "Insert image",
70
+ imageUrlLabel: "Image URL",
71
+ insert: "Insert",
72
+ jsonValid: "Valid",
73
+ jsonInvalid: "Invalid",
74
+ jsonFormat: "Format",
75
+ jsonMinify: "Minify",
76
+ jsonElements: "elements",
77
+ jsonFields: "fields"
78
+ }, a = Symbol("m3-locale");
79
+ function o() {
80
+ let o = e(a, {}), s = t({ ...i });
81
+ return r(() => {
82
+ Object.assign(s, i, n(o));
83
+ }), s;
84
+ }
85
+ //#endregion
86
+ export { i as n, o as r, a as t };
87
+
88
+ //# sourceMappingURL=useLocale-QCIVDYWx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLocale-QCIVDYWx.js","names":[],"sources":["../src/composables/useLocale.ts"],"sourcesContent":["import { inject, reactive, watchEffect, toValue, type InjectionKey, type MaybeRef } from 'vue'\n\nexport interface M3Locale {\n // Common\n search: string\n noResults: string\n close: string\n cancel: string\n confirm: string\n loading: string\n\n // Navigation\n previous: string\n next: string\n today: string\n more: string\n\n // Tables\n selectedCount: string\n recordCount: string\n expand: string\n columns: string\n exportCsv: string\n noGroup: string\n\n // Tour\n finish: string\n\n // File upload\n dropText: string\n selectText: string\n maxSizePrefix: string\n remove: string\n\n // Pickers\n selectDate: string\n selectTime: string\n selectRange: string\n pickStart: string\n pickEnd: string\n previousMonth: string\n nextMonth: string\n\n // Scheduler\n dayView: string\n weekView: string\n\n // Transfer list\n available: string\n selected: string\n noItems: string\n moveAllRight: string\n moveRight: string\n moveLeft: string\n moveAllLeft: string\n\n // Command palette / Spotlight\n searchCommand: string\n navigateHint: string\n selectHint: string\n openHint: string\n closeHint: string\n\n // Infinite scroll\n loadingMore: string\n noMoreItems: string\n\n // Rich text editor\n bold: string\n italic: string\n underline: string\n strikethrough: string\n highlight: string\n bulletList: string\n orderedList: string\n blockquote: string\n code: string\n alignLeft: string\n alignCenter: string\n alignRight: string\n undo: string\n redo: string\n link: string\n image: string\n paragraph: string\n heading1: string\n heading2: string\n heading3: string\n insertLink: string\n insertImage: string\n imageUrlLabel: string\n insert: string\n\n // JSON editor\n jsonValid: string\n jsonInvalid: string\n jsonFormat: string\n jsonMinify: string\n\n // JSON viewer\n jsonElements: string\n jsonFields: string\n}\n\nexport const defaultLocale: M3Locale = {\n search: 'Search...',\n noResults: 'No results',\n close: 'Close',\n cancel: 'Cancel',\n confirm: 'Confirm',\n loading: 'Loading',\n\n previous: 'Previous',\n next: 'Next',\n today: 'Today',\n more: 'more',\n\n selectedCount: 'selected',\n recordCount: 'record',\n expand: 'Expand',\n columns: 'Columns',\n exportCsv: 'Export CSV',\n noGroup: 'No group',\n\n finish: 'Finish',\n\n dropText: 'Drop files here or',\n selectText: 'browse',\n maxSizePrefix: 'Max.',\n remove: 'Remove',\n\n selectDate: 'Select date',\n selectTime: 'Select time',\n selectRange: 'Select range',\n pickStart: 'Select start',\n pickEnd: 'Select end',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n\n dayView: 'Day',\n weekView: 'Week',\n\n available: 'Available',\n selected: 'Selected',\n noItems: 'No items',\n moveAllRight: 'Move all right',\n moveRight: 'Move selected right',\n moveLeft: 'Move selected left',\n moveAllLeft: 'Move all left',\n\n searchCommand: 'Search command...',\n navigateHint: 'navigate',\n selectHint: 'select',\n openHint: 'open',\n closeHint: 'close',\n\n loadingMore: 'Loading...',\n noMoreItems: 'No more items',\n\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n highlight: 'Highlight',\n bulletList: 'Bullet list',\n orderedList: 'Ordered list',\n blockquote: 'Blockquote',\n code: 'Code',\n alignLeft: 'Align left',\n alignCenter: 'Align center',\n alignRight: 'Align right',\n undo: 'Undo',\n redo: 'Redo',\n link: 'Link',\n image: 'Image',\n paragraph: 'Paragraph',\n heading1: 'Heading 1',\n heading2: 'Heading 2',\n heading3: 'Heading 3',\n insertLink: 'Insert link',\n insertImage: 'Insert image',\n imageUrlLabel: 'Image URL',\n insert: 'Insert',\n\n jsonValid: 'Valid',\n jsonInvalid: 'Invalid',\n jsonFormat: 'Format',\n jsonMinify: 'Minify',\n\n jsonElements: 'elements',\n jsonFields: 'fields',\n}\n\nexport const M3_LOCALE_KEY: InjectionKey<MaybeRef<Partial<M3Locale>>> = Symbol('m3-locale')\n\nexport function useLocale(): M3Locale {\n const provided = inject(M3_LOCALE_KEY, {})\n const locale = reactive({ ...defaultLocale }) as M3Locale\n\n watchEffect(() => {\n Object.assign(locale, defaultLocale, toValue(provided))\n })\n\n return locale\n}\n"],"mappings":";;AAwGA,IAAa,IAA0B;CACrC,QAAQ;CACR,WAAW;CACX,OAAO;CACP,QAAQ;CACR,SAAS;CACT,SAAS;CAET,UAAU;CACV,MAAM;CACN,OAAO;CACP,MAAM;CAEN,eAAe;CACf,aAAa;CACb,QAAQ;CACR,SAAS;CACT,WAAW;CACX,SAAS;CAET,QAAQ;CAER,UAAU;CACV,YAAY;CACZ,eAAe;CACf,QAAQ;CAER,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,WAAW;CACX,SAAS;CACT,eAAe;CACf,WAAW;CAEX,SAAS;CACT,UAAU;CAEV,WAAW;CACX,UAAU;CACV,SAAS;CACT,cAAc;CACd,WAAW;CACX,UAAU;CACV,aAAa;CAEb,eAAe;CACf,cAAc;CACd,YAAY;CACZ,UAAU;CACV,WAAW;CAEX,aAAa;CACb,aAAa;CAEb,MAAM;CACN,QAAQ;CACR,WAAW;CACX,eAAe;CACf,WAAW;CACX,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,MAAM;CACN,WAAW;CACX,aAAa;CACb,YAAY;CACZ,MAAM;CACN,MAAM;CACN,MAAM;CACN,OAAO;CACP,WAAW;CACX,UAAU;CACV,UAAU;CACV,UAAU;CACV,YAAY;CACZ,aAAa;CACb,eAAe;CACf,QAAQ;CAER,WAAW;CACX,aAAa;CACb,YAAY;CACZ,YAAY;CAEZ,cAAc;CACd,YAAY;AACd,GAEa,IAA2D,OAAO,WAAW;AAE1F,SAAgB,IAAsB;CACpC,IAAM,IAAW,EAAO,GAAe,CAAC,CAAC,GACnC,IAAS,EAAS,EAAE,GAAG,EAAc,CAAC;CAM5C,OAJA,QAAkB;EAChB,OAAO,OAAO,GAAQ,GAAe,EAAQ,CAAQ,CAAC;CACxD,CAAC,GAEM;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m3ui-vue/m3ui-vue",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Material 3 component library for Vue 3 + Tailwind CSS v4",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -123,8 +123,8 @@ function tick(now: number) {
123
123
  const dt = lastTime !== null ? now - lastTime : 0;
124
124
  lastTime = now;
125
125
 
126
- // 1. Advance wave phase
127
- animPhase -= dt * PHASE_PER_MS;
126
+ // 1. Advance wave phase (crest travels right-to-left along the ring, matching Material)
127
+ animPhase += dt * PHASE_PER_MS;
128
128
 
129
129
  // 2. Smooth arc (exponential: 90% in ≈300ms, equivalent feel to CSS ease-out)
130
130
  if (dt > 0) {
@@ -146,6 +146,7 @@ function buildExtensions(mods: any) {
146
146
  languageMod.bracketMatching(),
147
147
  languageMod.indentOnInput(),
148
148
  languageMod.foldGutter(),
149
+ viewMod.drawSelection(),
149
150
  viewMod.highlightActiveLine(),
150
151
  viewMod.highlightActiveLineGutter(),
151
152
  languageMod.syntaxHighlighting(m3Style),