@projectfive/v-richtext-vue2 0.0.0-stage → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +69 -0
- package/dist/style.css +1 -0
- package/dist/types/richtext-vue/src/components/input-richtext/CharacterCount.vue.d.ts +19 -0
- package/dist/types/richtext-vue/src/components/input-richtext/InputRichtext.vue.d.ts +135 -0
- package/dist/types/richtext-vue/src/components/input-richtext/MediaControls.vue.d.ts +3 -0
- package/dist/types/richtext-vue/src/components/input-richtext/MentionMenu.vue.d.ts +21 -0
- package/dist/types/richtext-vue/src/components/input-richtext/TableMenu.vue.d.ts +19 -0
- package/dist/types/richtext-vue/src/components/input-richtext/TableOfContents.vue.d.ts +3 -0
- package/dist/types/richtext-vue/src/components/input-richtext/TemplatesMenu.vue.d.ts +18 -0
- package/dist/types/richtext-vue/src/components/input-richtext/UploadPopover.vue.d.ts +24 -0
- package/dist/types/richtext-vue/src/components/input-richtext/VisibilityConditionsMenu.vue.d.ts +20 -0
- package/dist/types/richtext-vue/src/components/input-richtext/YoutubePopover.vue.d.ts +4 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/file-drop.d.ts +22 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/file-node.d.ts +18 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/heading-id.d.ts +14 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/index.d.ts +36 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/link.d.ts +8 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/media-attributes.d.ts +8 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/mention-menu.d.ts +62 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/mention.d.ts +16 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/previews.d.ts +8 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/task-item.d.ts +8 -0
- package/dist/types/richtext-vue/src/components/input-richtext/extensions/visibility-conditions.d.ts +32 -0
- package/dist/types/richtext-vue/src/components/input-richtext/liquid.d.ts +11 -0
- package/dist/types/richtext-vue/src/components/input-richtext/types.d.ts +122 -0
- package/dist/types/richtext-vue/src/components/tiptap-icons/Icon.vue.d.ts +15 -0
- package/dist/types/richtext-vue/src/components/tiptap-icons/index.d.ts +40 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/CommandButton.vue.d.ts +36 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/blockquote-button/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/blockquote-button/use-blockquote.d.ts +12 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/code-block-button/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/code-block-button/use-code-block.d.ts +12 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/color-highlight-button/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/color-highlight-button/use-color-highlight.d.ts +125 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/color-highlight-popover/ColorHighlightPopover.vue.d.ts +3 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/color-highlight-popover/ColorHighlightPopoverButton.vue.d.ts +17 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/color-highlight-popover/ColorHighlightPopoverContent.vue.d.ts +183 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/color-highlight-popover/index.d.ts +3 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/command.d.ts +26 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/heading-button/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/heading-button/use-heading.d.ts +25 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/heading-dropdown-menu/HeadingDropdownMenu.vue.d.ts +32 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/heading-dropdown-menu/index.d.ts +2 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/heading-dropdown-menu/use-heading-dropdown-menu.d.ts +6 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/link-popover/LinkButton.vue.d.ts +17 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/link-popover/LinkContent.vue.d.ts +18 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/link-popover/LinkMain.vue.d.ts +28 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/link-popover/LinkPopover.vue.d.ts +62 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/link-popover/index.d.ts +4 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/link-popover/use-link-popover.d.ts +96 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/list-button/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/list-button/use-list.d.ts +22 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/list-dropdown-menu/ListDropdownMenu.vue.d.ts +32 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/list-dropdown-menu/index.d.ts +2 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/list-dropdown-menu/use-list-dropdown-menu.d.ts +15 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/mark-button/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/mark-button/use-mark.d.ts +29 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/text-align-button/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/text-align-button/use-text-align.d.ts +27 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/undo-redo-button/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui/undo-redo-button/use-undo-redo.d.ts +17 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/button/Button.vue.d.ts +53 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/button/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/button-group/ButtonGroup.vue.d.ts +43 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/button-group/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/card/Card.vue.d.ts +16 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/card/CardBody.vue.d.ts +15 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/card/CardItemGroup.vue.d.ts +42 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/card/index.d.ts +3 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/dropdown-menu/DropdownMenu.vue.d.ts +66 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/dropdown-menu/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/input/Input.vue.d.ts +20 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/input/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/popover/Popover.vue.d.ts +65 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/popover/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/separator/Separator.vue.d.ts +35 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/separator/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/spacer/Spacer.vue.d.ts +31 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/spacer/index.d.ts +1 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/toolbar/Toolbar.vue.d.ts +45 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/toolbar/ToolbarGroup.vue.d.ts +15 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/toolbar/ToolbarSeparator.vue.d.ts +3 -0
- package/dist/types/richtext-vue/src/components/tiptap-ui-primitive/toolbar/index.d.ts +3 -0
- package/dist/types/richtext-vue/src/composables/use-editor-state.d.ts +32 -0
- package/dist/types/richtext-vue/src/composables/use-is-breakpoint.d.ts +10 -0
- package/dist/types/richtext-vue/src/composables/use-menu-navigation.d.ts +55 -0
- package/dist/types/richtext-vue/src/composables/use-popover.d.ts +45 -0
- package/dist/types/richtext-vue/src/composables/use-tiptap-editor.d.ts +16 -0
- package/dist/types/richtext-vue/src/composables/use-top-layer.d.ts +9 -0
- package/dist/types/richtext-vue/src/composables/use-translations.d.ts +7 -0
- package/dist/types/richtext-vue/src/composables/utils.d.ts +21 -0
- package/dist/types/richtext-vue/src/index.d.ts +14 -0
- package/dist/types/richtext-vue/src/lib/pointer.d.ts +6 -0
- package/dist/types/richtext-vue/src/lib/resize-image.d.ts +6 -0
- package/dist/types/richtext-vue/src/lib/shortcuts.d.ts +24 -0
- package/dist/types/richtext-vue/src/lib/throttle.d.ts +10 -0
- package/dist/types/richtext-vue/src/lib/tiptap-utils.d.ts +109 -0
- package/dist/types/richtext-vue/src/locales/en.d.ts +140 -0
- package/dist/types/richtext-vue/src/locales/index.d.ts +5 -0
- package/dist/types/richtext-vue/src/locales/nl.d.ts +2 -0
- package/dist/types/richtext-vue2/src/components/tiptap-ui-primitive/portal/Portal.vue.d.ts +15 -0
- package/dist/types/richtext-vue2/src/lib/tiptap-vue.d.ts +9 -0
- package/dist/v-richtext.js +3318 -0
- package/dist/v-richtext.js.map +1 -0
- package/package.json +64 -6
- package/README.md +0 -3
package/Readme.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# @projectfive/v-richtext-vue2
|
|
2
|
+
|
|
3
|
+
`<InputRichtext>` for Vue 2.7: the same richtext editor as [`@projectfive/v-richtext`](../richtext-vue/Readme.md), with the same features, props, options and styling. This Readme only covers what's different in Vue 2; everything else is in the main package's Readme.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Requires Vue 2.7.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @projectfive/v-richtext-vue2
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import Vue from 'vue';
|
|
15
|
+
import RichtextPlugin from '@projectfive/v-richtext-vue2';
|
|
16
|
+
import '@projectfive/v-richtext-vue2/style.css';
|
|
17
|
+
|
|
18
|
+
Vue.use(RichtextPlugin);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Or register it locally:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { InputRichtext } from '@projectfive/v-richtext-vue2';
|
|
25
|
+
|
|
26
|
+
export default {
|
|
27
|
+
components: { InputRichtext },
|
|
28
|
+
};
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
```vue
|
|
34
|
+
<InputRichtext
|
|
35
|
+
v-model="value"
|
|
36
|
+
:options="options"
|
|
37
|
+
:on-upload-file="uploadFile"
|
|
38
|
+
locale="nl"
|
|
39
|
+
@action="onAction"
|
|
40
|
+
@keydown-ctrl-enter="send"
|
|
41
|
+
/>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Differences from Vue 3:
|
|
45
|
+
|
|
46
|
+
- **Events:** Vue 2 doesn't convert between camelCase and kebab-case event names, so use them exactly as listed: `@keydown-ctrl-enter` (not `@keydownCtrlEnter`), `@action`, `@error`.
|
|
47
|
+
- **`v-model`:** works as usual. The component uses the `modelValue` prop and the `update:modelValue` event, like in Vue 3. Without `v-model`, bind `:model-value` and `@update:modelValue`.
|
|
48
|
+
- **Popovers and menus** are moved to the end of `<body>` by the editor itself (Vue 2 has no `Teleport`).
|
|
49
|
+
|
|
50
|
+
## Development
|
|
51
|
+
|
|
52
|
+
This package has almost no source of its own. Its build takes the source from `../richtext-vue/src`, except for the files in this package's `src/`, which replace the shared file at the same path:
|
|
53
|
+
|
|
54
|
+
| File | Why |
|
|
55
|
+
|---|---|
|
|
56
|
+
| `lib/tiptap-vue.ts` | `useEditor` and `EditorContent` from `@tiptap/vue-2` instead of `@tiptap/vue-3` |
|
|
57
|
+
| `components/tiptap-ui-primitive/portal/Portal.vue` | Moves popovers to `<body>` (no `Teleport` in Vue 2) |
|
|
58
|
+
| `main.ts`, `env.d.ts` | Test page entry (`new Vue(...)`) and the `.vue` module type |
|
|
59
|
+
|
|
60
|
+
The shared source is written to work in both Vue versions. The rules are under "Vue 2 compatibility" in [../richtext-vue/UPSTREAM.md](../richtext-vue/UPSTREAM.md).
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npm start -w @projectfive/v-richtext-vue2 # test page on http://localhost:5179 (the shared App.vue on Vue 2)
|
|
64
|
+
npm run build -w @projectfive/v-richtext-vue2 # type check against Vue 2, library build and declarations in dist/
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The repository's `node_modules` has Vue 3. This package installs its own Vue 2.7 and `@tiptap/vue-2`, and the Vite config (`resolve.dedupe`) and tsconfig (`paths`) make sure both the shared source and Tiptap use that copy.
|
|
68
|
+
|
|
69
|
+
What has been tested is in [../richtext-vue/TESTING.md](../richtext-vue/TESTING.md).
|
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@charset "UTF-8";.tiptap-button.tiptap-button{--tt-button-default-bg-color: transparent;--tt-button-hover-bg-color: var(--tt-gray-light-200);--tt-button-active-bg-color: var(--tt-gray-light-a-100);--tt-button-active-hover-bg-color: var(--tt-gray-light-200);--tt-button-default-text-color: var(--tt-gray-light-a-600);--tt-button-hover-text-color: var(--tt-gray-light-a-900);--tt-button-active-text-color: var(--tt-gray-light-a-900);--tt-button-disabled-text-color: var(--tt-gray-light-a-400);--tt-button-default-icon-color: var(--tt-gray-light-a-600);--tt-button-hover-icon-color: var(--tt-gray-light-a-900);--tt-button-active-icon-color: var(--tt-brand-color-500);--tt-button-disabled-icon-color: var(--tt-gray-light-a-400);--tt-button-default-dropdown-arrows-color: var(--tt-gray-light-a-600);--tt-button-hover-dropdown-arrows-color: var(--tt-gray-light-a-700);--tt-button-active-dropdown-arrows-color: var(--tt-gray-light-a-600);font-size:calc(.875 * var(--richtext-font-size, 1rem));font-weight:500;font-feature-settings:"salt" on,"cv01" on;line-height:1.15;height:calc(2 * var(--richtext-font-size, 1rem));min-width:calc(2 * var(--richtext-font-size, 1rem));border:none;padding:calc(.5 * var(--richtext-font-size, 1rem));gap:calc(.25 * var(--richtext-font-size, 1rem));display:flex;align-items:center;justify-content:center;border-radius:var(--tt-radius-lg, calc(.75 * var(--richtext-font-size, 1rem)));background-color:var(--tt-button-default-bg-color);color:var(--tt-button-default-text-color);transition-property:background,color,opacity;transition-duration:var(--tt-transition-duration-default);transition-timing-function:var(--tt-transition-easing-default);margin:0;font-family:inherit;text-transform:none;letter-spacing:normal;white-space:nowrap;box-shadow:none;outline:none;opacity:1;cursor:pointer;pointer-events:auto;-webkit-user-select:none;user-select:none;appearance:none}.tiptap-button.tiptap-button:focus-visible{outline:none}.tiptap-button.tiptap-button .tiptap-button-text{padding:0 calc(.125 * var(--richtext-font-size, 1rem));flex-grow:1;text-align:left;line-height:calc(1.5 * var(--richtext-font-size, 1rem))}.tiptap-button.tiptap-button .tiptap-button-icon,.tiptap-button.tiptap-button .tiptap-button-dropdown-small{flex-shrink:0}.tiptap-button.tiptap-button .tiptap-button-icon{width:calc(1 * var(--richtext-font-size, 1rem));height:calc(1 * var(--richtext-font-size, 1rem));color:var(--tt-button-default-icon-color)}.tiptap-button.tiptap-button .tiptap-button-dropdown-small{width:calc(.625 * var(--richtext-font-size, 1rem));height:calc(.625 * var(--richtext-font-size, 1rem));color:var(--tt-button-default-dropdown-arrows-color)}.tiptap-button.tiptap-button:has(>svg):not(:has(>:not(svg))){gap:calc(.125 * var(--richtext-font-size, 1rem))}.tiptap-button.tiptap-button:has(>svg:nth-of-type(2)):has(>.tiptap-button-dropdown-small):not(:has(>svg:nth-of-type(3))):not(:has(>.tiptap-button-text)){gap:0;padding-right:calc(.25 * var(--richtext-font-size, 1rem))}.tiptap-button.tiptap-button:hover:not([disabled]),.tiptap-button.tiptap-button[data-focus-visible=true],.tiptap-button.tiptap-button[data-highlighted]:not([disabled]):not([data-highlighted=false]){background-color:var(--tt-button-hover-bg-color);color:var(--tt-button-hover-text-color)}.tiptap-button.tiptap-button:hover:not([disabled]) .tiptap-button-icon,.tiptap-button.tiptap-button[data-focus-visible=true] .tiptap-button-icon,.tiptap-button.tiptap-button[data-highlighted]:not([disabled]):not([data-highlighted=false]) .tiptap-button-icon{color:var(--tt-button-hover-icon-color)}.tiptap-button.tiptap-button:hover:not([disabled]) .tiptap-button-dropdown-small,.tiptap-button.tiptap-button[data-focus-visible=true] .tiptap-button-dropdown-small,.tiptap-button.tiptap-button[data-highlighted]:not([disabled]):not([data-highlighted=false]) .tiptap-button-dropdown-small{color:var(--tt-button-hover-dropdown-arrows-color)}.tiptap-button.tiptap-button[data-active-state=on]:not([disabled]),.tiptap-button.tiptap-button[data-state=open]:not([disabled]){background-color:var(--tt-button-active-bg-color);color:var(--tt-button-active-text-color)}.tiptap-button.tiptap-button[data-active-state=on]:not([disabled]) .tiptap-button-icon,.tiptap-button.tiptap-button[data-state=open]:not([disabled]) .tiptap-button-icon{color:var(--tt-button-active-icon-color)}.tiptap-button.tiptap-button[data-active-state=on]:not([disabled]) .tiptap-button-dropdown-small,.tiptap-button.tiptap-button[data-state=open]:not([disabled]) .tiptap-button-dropdown-small{color:var(--tt-button-active-dropdown-arrows-color)}.tiptap-button.tiptap-button[data-active-state=on]:not([disabled]):hover,.tiptap-button.tiptap-button[data-state=open]:not([disabled]):hover{background-color:var(--tt-button-active-hover-bg-color)}.tiptap-button.tiptap-button:disabled{color:var(--tt-button-disabled-text-color);cursor:default}.tiptap-button.tiptap-button:disabled .tiptap-button-icon{color:var(--tt-button-disabled-icon-color)}:root{--tt-toolbar-height: calc(2.75 * var(--richtext-font-size, 1rem));--tt-safe-area-bottom: env(safe-area-inset-bottom, 0px);--tt-toolbar-bg-color: var(--white);--tt-toolbar-border-color: var(--tt-gray-light-a-100)}.tiptap-toolbar{display:flex;align-items:center;gap:calc(.25 * var(--richtext-font-size, 1rem))}.tiptap-toolbar-group{display:flex;align-items:center;gap:calc(.125 * var(--richtext-font-size, 1rem))}.tiptap-toolbar-group:empty{display:none}.tiptap-toolbar-group:empty+.tiptap-separator,.tiptap-separator+.tiptap-toolbar-group:empty{display:none}.tiptap-toolbar[data-variant=fixed]{position:sticky;top:0;z-index:50;width:100%;min-height:var(--tt-toolbar-height);background:var(--tt-toolbar-bg-color);border-bottom:1px solid var(--tt-toolbar-border-color);padding:0 calc(.5 * var(--richtext-font-size, 1rem));overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none}.tiptap-toolbar[data-variant=fixed]::-webkit-scrollbar{display:none}@media(max-width:480px){.tiptap-toolbar[data-variant=fixed]{position:absolute;top:auto;height:calc(var(--tt-toolbar-height) + var(--tt-safe-area-bottom));border-top:1px solid var(--tt-toolbar-border-color);border-bottom:none;padding:0 calc(.5 * var(--richtext-font-size, 1rem)) var(--tt-safe-area-bottom);flex-wrap:nowrap;justify-content:flex-start}.tiptap-toolbar[data-variant=fixed] .tiptap-toolbar-group{flex:0 0 auto}}.tiptap-toolbar[data-variant=floating]{--tt-toolbar-padding: calc(.125 * var(--richtext-font-size, 1rem));--tt-toolbar-border-width: 1px;padding:calc(.188 * var(--richtext-font-size, 1rem));border-radius:calc(var(--tt-toolbar-padding) + var(--tt-radius-lg) + var(--tt-toolbar-border-width));border:var(--tt-toolbar-border-width) solid var(--tt-toolbar-border-color);background-color:var(--tt-toolbar-bg-color);box-shadow:var(--tt-shadow-elevated-md);outline:none;overflow:hidden}.tiptap-toolbar[data-variant=floating][data-plain=true]{padding:0;border-radius:0;border:none;box-shadow:none;background-color:transparent}@media screen and (max-width:480px){.tiptap-toolbar[data-variant=floating]{width:100%;border-radius:0;border:none;box-shadow:none}}.tiptap-separator{--tt-link-border-color: var(--tt-gray-light-a-200)}.tiptap-separator{flex-shrink:0;background-color:var(--tt-link-border-color)}.tiptap-separator[data-orientation=horizontal]{height:1px;width:100%;margin:calc(.5 * var(--richtext-font-size, 1rem)) 0}.tiptap-separator[data-orientation=vertical]{height:calc(1.5 * var(--richtext-font-size, 1rem));width:1px}:root{--tt-dropdown-menu-bg-color: var(--white);--tt-dropdown-menu-text-color: var(--tt-gray-light-a-600);--tt-dropdown-menu-label-color: var(--tt-gray-light-a-800)}.tiptap-dropdown-menu-content{--slide-x: 0px;--slide-y: 0px;--padding: calc(.375 * var(--richtext-font-size, 1rem));position:relative;z-index:50;min-width:calc(8 * var(--richtext-font-size, 1rem));max-height:var(--radix-dropdown-menu-content-available-height);overflow-x:hidden;overflow-y:auto;border-radius:calc(var(--padding) + var(--tt-radius-lg));padding:calc(.375 * var(--richtext-font-size, 1rem));background-color:var(--tt-dropdown-menu-bg-color);color:var(--tt-dropdown-menu-text-color);box-shadow:var(--tt-shadow-elevated-md);transform-origin:var(--radix-dropdown-menu-content-transform-origin);transition-duration:.1s}.tiptap-dropdown-menu-content[data-side=bottom]{--slide-y: calc(-.5 * var(--richtext-font-size, 1rem))}.tiptap-dropdown-menu-content[data-side=top]{--slide-y: calc(.5 * var(--richtext-font-size, 1rem))}.tiptap-dropdown-menu-content[data-side=left]{--slide-x: calc(.5 * var(--richtext-font-size, 1rem))}.tiptap-dropdown-menu-content[data-side=right]{--slide-x: calc(-.5 * var(--richtext-font-size, 1rem))}.tiptap-dropdown-menu-content[data-state=open]{animation:dropdown-in .1s ease forwards}.tiptap-dropdown-menu-content[data-state=closed]{animation:dropdown-out .1s ease forwards;overflow:hidden}.tiptap-dropdown-menu-sub-content{--slide-x: 0px;--slide-y: 0px;--padding: calc(.375 * var(--richtext-font-size, 1rem));z-index:50;min-width:calc(6 * var(--richtext-font-size, 1rem));overflow:hidden;border-radius:calc(var(--padding) + var(--tt-radius-lg));padding:calc(.25 * var(--richtext-font-size, 1rem));background-color:var(--tt-dropdown-menu-bg-color);box-shadow:var(--tt-shadow-elevated-md);color:var(--tt-dropdown-menu-text-color);transform-origin:var(--radix-dropdown-menu-content-transform-origin);transition-duration:.1s}.tiptap-dropdown-menu-sub-content[data-side=bottom]{--slide-y: calc(-.5 * var(--richtext-font-size, 1rem))}.tiptap-dropdown-menu-sub-content[data-side=top]{--slide-y: calc(.5 * var(--richtext-font-size, 1rem))}.tiptap-dropdown-menu-sub-content[data-side=left]{--slide-x: calc(.5 * var(--richtext-font-size, 1rem))}.tiptap-dropdown-menu-sub-content[data-side=right]{--slide-x: calc(-.5 * var(--richtext-font-size, 1rem))}.tiptap-dropdown-menu-sub-content[data-state=open]{animation:dropdown-in .1s ease forwards}.tiptap-dropdown-menu-sub-content[data-state=closed]{animation:dropdown-out .1s ease forwards}@keyframes dropdown-in{0%{opacity:0;transform:scale(.95) translate(var(--slide-x),var(--slide-y))}to{opacity:1;transform:scale(1) translate(0)}}@keyframes dropdown-out{0%{opacity:1;transform:scale(1) translate(0)}to{opacity:0;transform:scale(.95) translate(var(--slide-x),var(--slide-y))}}.tiptap-dropdown-menu-label{padding:calc(.75 * var(--richtext-font-size, 1rem)) calc(.5 * var(--richtext-font-size, 1rem)) calc(.25 * var(--richtext-font-size, 1rem));font-size:calc(.75 * var(--richtext-font-size, 1rem));font-weight:600;line-height:normal;text-transform:capitalize;color:var(--tt-dropdown-menu-label-color)}.tiptap-dropdown-menu-label[data-inset=true]{padding-left:calc(1.75 * var(--richtext-font-size, 1rem))}.tiptap-dropdown-menu-group,.tiptap-dropdown-menu-group[data-orientation=vertical]{display:flex;flex-direction:column}.tiptap-dropdown-menu-group[data-orientation=horizontal]{display:flex;flex-direction:row;align-items:center;gap:calc(.25 * var(--richtext-font-size, 1rem))}.tiptap-popover-root{display:contents}:where(.tiptap-anchored){inset:auto;margin:0;padding:0;border:0;overflow:visible;color:inherit;background:transparent}.tiptap-anchored{--radix-popover-content-available-height: calc(100dvh - calc(2 * var(--richtext-font-size, 1rem)));--radix-popover-content-transform-origin: top left;--radix-dropdown-menu-content-available-height: calc(100dvh - calc(2 * var(--richtext-font-size, 1rem)));--radix-dropdown-menu-content-transform-origin: top left;position:fixed;top:anchor(bottom);left:anchor(left);margin-top:var(--tt-popover-offset, 4px);position-try-fallbacks:flip-block,flip-inline}.tiptap-anchored[data-align=center]{left:auto;justify-self:anchor-center}.tiptap-anchored[data-align=end]{left:auto;right:anchor(right)}.tiptap-anchored:not(:popover-open){display:none}.tiptap-popover{--tt-popover-bg-color: var(--white);--tt-popover-border-color: var(--tt-gray-light-a-100);--tt-popover-text-color: var(--tt-gray-light-a-600)}.tiptap-popover{z-index:50;outline:none;transform-origin:var(--radix-popover-content-transform-origin);max-height:var(--radix-popover-content-available-height)}.tiptap-popover>*{max-height:var(--radix-popover-content-available-height)}.tiptap-popover[data-state=open]{animation:fadeIn .15s cubic-bezier(.16,1,.3,1),zoomIn .15s cubic-bezier(.16,1,.3,1)}.tiptap-popover[data-state=closed]{animation:fadeOut .15s cubic-bezier(.16,1,.3,1),zoomOut .15s cubic-bezier(.16,1,.3,1)}.tiptap-popover[data-side=top],.tiptap-popover[data-side=top-start],.tiptap-popover[data-side=top-end]{animation:slideFromBottom .15s cubic-bezier(.16,1,.3,1)}.tiptap-popover[data-side=right],.tiptap-popover[data-side=right-start],.tiptap-popover[data-side=right-end]{animation:slideFromLeft .15s cubic-bezier(.16,1,.3,1)}.tiptap-popover[data-side=bottom],.tiptap-popover[data-side=bottom-start],.tiptap-popover[data-side=bottom-end]{animation:slideFromTop .15s cubic-bezier(.16,1,.3,1)}.tiptap-popover[data-side=left],.tiptap-popover[data-side=left-start],.tiptap-popover[data-side=left-end]{animation:slideFromRight .15s cubic-bezier(.16,1,.3,1)}.tiptap-button-group{display:flex;width:fit-content;align-items:stretch}.tiptap-button-group:has(>[data-slot=tiptap-button-group]){gap:calc(.125 * var(--richtext-font-size, 1rem))}.tiptap-button-group>*:focus-visible{position:relative;z-index:10}.tiptap-button-group>[data-slot=select-trigger]:not([class*=w-]){width:fit-content}.tiptap-button-group>input{flex:1}.tiptap-button-group-horizontal>[data-slot]:has(~[data-slot]){border-top-right-radius:0;border-bottom-right-radius:0}.tiptap-button-group-horizontal>[data-slot]~[data-slot]{border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.tiptap-button-group-vertical{flex-direction:column}.tiptap-button-group-vertical>[data-slot]:has(~[data-slot]){border-bottom-left-radius:0;border-bottom-right-radius:0}.tiptap-button-group-vertical>[data-slot]~[data-slot]{border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.tiptap-button-group-separator{position:relative;align-self:stretch}.tiptap-button-group-separator[data-orientation=horizontal]{margin-left:1px;margin-right:1px}.tiptap-button-group-separator[data-orientation=horizontal]{width:auto}.tiptap-button-group-separator[data-orientation=vertical]{margin-top:1px;margin-bottom:1px}.tiptap-button-group-separator[data-orientation=vertical]{height:auto}:root{--tiptap-card-bg-color: var(--white);--tiptap-card-border-color: var(--tt-gray-light-a-100);--tiptap-card-group-label-color: var(--tt-gray-light-a-800)}.tiptap-card{--padding: calc(.375 * var(--richtext-font-size, 1rem));--border-width: 1px;border-radius:calc(var(--padding) + var(--tt-radius-lg));box-shadow:var(--tt-shadow-elevated-md);background-color:var(--tiptap-card-bg-color);border:1px solid var(--tiptap-card-border-color);display:flex;flex-direction:column;outline:none;align-items:center;position:relative;min-width:0;word-wrap:break-word;background-clip:border-box}.tiptap-card-header{padding:calc(.375 * var(--richtext-font-size, 1rem));flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;width:100%;border-bottom:var(--border-width) solid var(--tiptap-card-border-color)}.tiptap-card-body{padding:calc(.375 * var(--richtext-font-size, 1rem));flex:1 1 auto;overflow-y:auto}.tiptap-card-item-group{position:relative;display:flex;vertical-align:middle;min-width:max-content}.tiptap-card-item-group[data-orientation=vertical]{flex-direction:column;justify-content:center}.tiptap-card-item-group[data-orientation=horizontal]{gap:calc(.25 * var(--richtext-font-size, 1rem));flex-direction:row;align-items:center}.tiptap-card-group-label{padding:calc(.75 * var(--richtext-font-size, 1rem)) calc(.5 * var(--richtext-font-size, 1rem)) calc(.25 * var(--richtext-font-size, 1rem));font-size:calc(.75 * var(--richtext-font-size, 1rem));font-weight:600;line-height:normal;text-transform:capitalize;color:var(--tiptap-card-group-label-color)}.tiptap-button-highlight{position:relative;width:calc(1.25 * var(--richtext-font-size, 1rem));height:calc(1.25 * var(--richtext-font-size, 1rem));margin:0 calc(-.175 * var(--richtext-font-size, 1rem));border-radius:var(--tt-radius-xl);background-color:var(--highlight-color);transition:transform .2s ease}.tiptap-button-highlight:after{content:"";position:absolute;width:100%;height:100%;left:0;top:0;border-radius:inherit;box-sizing:border-box;border:1px solid var(--highlight-color);filter:brightness(95%);mix-blend-mode:multiply}.dark .tiptap-button-highlight:after{filter:brightness(140%);mix-blend-mode:lighten}.tiptap-button[data-active-state=on] .tiptap-button-highlight:after{filter:brightness(80%)}.dark .tiptap-button[data-active-state=on] .tiptap-button-highlight:after{filter:brightness(180%)}:root{--tt-input-placeholder: var(--tt-gray-light-a-400);--tt-input-border: var(--tt-gray-light-a-200);--tt-input-border-focus: var(--tt-gray-light-a-300)}.tiptap-input.tiptap-input{width:100%;min-width:0;height:calc(2 * var(--richtext-font-size, 1rem));padding:calc(.25 * var(--richtext-font-size, 1rem)) calc(.625 * var(--richtext-font-size, 1rem));border-radius:var(--tt-radius-md);border:1px solid var(--tt-input-border);background:transparent;font-size:calc(1 * var(--richtext-font-size, 1rem));outline:none;margin:0;box-shadow:none;color:inherit;font-family:inherit;line-height:normal;appearance:none;transition:color,background-color,border-color .15s}.tiptap-input.tiptap-input::placeholder{color:var(--tt-input-placeholder)}.tiptap-input.tiptap-input:focus-visible{border-color:var(--tt-input-border-focus)}@media(min-width:768px){.tiptap-input.tiptap-input{font-size:calc(.875 * var(--richtext-font-size, 1rem))}}.tiptap-link-input{font-size:calc(.875 * var(--richtext-font-size, 1rem));border:none;min-width:calc(12 * var(--richtext-font-size, 1rem));padding-right:0;text-overflow:ellipsis;white-space:nowrap}.tiptap-link-input:focus{text-overflow:clip;overflow:visible}:root{--tt-shadow-elevated-md: 0px 16px 48px 0px rgba(17, 24, 39, .04), 0px 12px 24px 0px rgba(17, 24, 39, .04), 0px 6px 8px 0px rgba(17, 24, 39, .02), 0px 2px 3px 0px rgba(17, 24, 39, .02);--tt-radius-xxs: calc(.125 * var(--richtext-font-size, 1rem));--tt-radius-xs: calc(.25 * var(--richtext-font-size, 1rem));--tt-radius-sm: calc(.375 * var(--richtext-font-size, 1rem));--tt-radius-md: calc(.5 * var(--richtext-font-size, 1rem));--tt-radius-lg: calc(.75 * var(--richtext-font-size, 1rem));--tt-radius-xl: calc(1 * var(--richtext-font-size, 1rem));--tt-transition-duration-default: .2s;--tt-transition-easing-default: cubic-bezier(.46, .03, .52, .96);--tt-accent-contrast: 8%;--tt-destructive-contrast: 8%;--tt-foreground-contrast: 8%}:where(.rt-editor,.tiptap-popover,.tiptap-dropdown-menu-content,.rt-mention-menu,.rt-media-controls){overflow-wrap:break-word;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:where(.rt-editor,.tiptap-popover,.tiptap-dropdown-menu-content,.rt-mention-menu,.rt-media-controls),:where(.rt-editor,.tiptap-popover,.tiptap-dropdown-menu-content,.rt-mention-menu,.rt-media-controls) :where(*,:before,:after){box-sizing:border-box;transition:none var(--tt-transition-duration-default) var(--tt-transition-easing-default)}:root{--tt-color-highlight-yellow: #fef9c3;--tt-color-highlight-green: #dcfce7;--tt-color-highlight-blue: #e0f2fe;--tt-color-highlight-purple: #f3e8ff;--tt-color-highlight-red: #ffe4e6;--tt-color-highlight-gray: rgb(248, 248, 247);--tt-color-highlight-brown: rgb(244, 238, 238);--tt-color-highlight-orange: rgb(251, 236, 221);--tt-color-highlight-pink: rgb(252, 241, 246);--tt-color-highlight-yellow-contrast: #fbe604;--tt-color-highlight-green-contrast: #c7fad8;--tt-color-highlight-blue-contrast: #ceeafd;--tt-color-highlight-purple-contrast: #e4ccff;--tt-color-highlight-red-contrast: #ffccd0;--tt-color-highlight-gray-contrast: rgba(84, 72, 49, .15);--tt-color-highlight-brown-contrast: rgba(210, 162, 141, .35);--tt-color-highlight-orange-contrast: rgba(224, 124, 57, .27);--tt-color-highlight-pink-contrast: rgba(225, 136, 179, .27)}.dark{--tt-color-highlight-yellow: #6b6524;--tt-color-highlight-green: #509568;--tt-color-highlight-blue: #6e92aa;--tt-color-highlight-purple: #583e74;--tt-color-highlight-red: #743e42;--tt-color-highlight-gray: rgb(47, 47, 47);--tt-color-highlight-brown: rgb(74, 50, 40);--tt-color-highlight-orange: rgb(92, 59, 35);--tt-color-highlight-pink: rgb(78, 44, 60);--tt-color-highlight-yellow-contrast: #58531e;--tt-color-highlight-green-contrast: #47855d;--tt-color-highlight-blue-contrast: #5e86a1;--tt-color-highlight-purple-contrast: #4c3564;--tt-color-highlight-red-contrast: #643539;--tt-color-highlight-gray-contrast: rgba(255, 255, 255, .094);--tt-color-highlight-brown-contrast: rgba(184, 101, 69, .25);--tt-color-highlight-orange-contrast: rgba(233, 126, 37, .2);--tt-color-highlight-pink-contrast: rgba(220, 76, 145, .22)}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes zoomIn{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoomOut{0%{transform:scale(1)}to{transform:scale(.95)}}@keyframes zoom{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes slideFromTop{0%{transform:translateY(calc(-.5 * var(--richtext-font-size, 1rem)))}to{transform:translateY(0)}}@keyframes slideFromRight{0%{transform:translate(calc(.5 * var(--richtext-font-size, 1rem)))}to{transform:translate(0)}}@keyframes slideFromLeft{0%{transform:translate(calc(-.5 * var(--richtext-font-size, 1rem)))}to{transform:translate(0)}}@keyframes slideFromBottom{0%{transform:translateY(calc(.5 * var(--richtext-font-size, 1rem)))}to{transform:translateY(0)}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.tiptap.ProseMirror{--blockquote-bg-color: var(--tt-gray-light-900)}.tiptap.ProseMirror blockquote{position:relative;padding-left:1em;padding-top:.375em;padding-bottom:.375em;margin:calc(1.5 * var(--richtext-font-size, 1rem)) 0}.tiptap.ProseMirror blockquote p{margin-top:0}.tiptap.ProseMirror blockquote:before,.tiptap.ProseMirror blockquote.is-empty:before{position:absolute;bottom:0;left:0;top:0;height:100%;width:.25em;background-color:var(--blockquote-bg-color);content:"";border-radius:0}.tiptap.ProseMirror{--tt-inline-code-bg-color: var(--tt-gray-light-a-100);--tt-inline-code-text-color: var(--tt-gray-light-a-700);--tt-inline-code-border-color: var(--tt-gray-light-a-200);--tt-codeblock-bg: var(--tt-gray-light-a-50);--tt-codeblock-text: var(--tt-gray-light-a-800);--tt-codeblock-border: var(--tt-gray-light-a-200)}.tiptap.ProseMirror code{background-color:var(--tt-inline-code-bg-color);color:var(--tt-inline-code-text-color);border:1px solid var(--tt-inline-code-border-color);font-family:JetBrains Mono NL,monospace;font-size:.875em;line-height:1.4;border-radius:6px/calc(.375 * var(--richtext-font-size, 1rem));padding:.1em .2em}.tiptap.ProseMirror pre{background-color:var(--tt-codeblock-bg);color:var(--tt-codeblock-text);border:1px solid var(--tt-codeblock-border);margin-top:1.5em;margin-bottom:1.5em;padding:1em;font-size:calc(1 * var(--richtext-font-size, 1rem));border-radius:6px/calc(.375 * var(--richtext-font-size, 1rem))}.tiptap.ProseMirror pre code{background-color:transparent;border:none;border-radius:0;-webkit-text-fill-color:inherit;color:inherit}.tiptap.ProseMirror{--horizontal-rule-color: var(--tt-gray-light-a-200)}.tiptap.ProseMirror hr{box-sizing:content-box;height:1px;margin:1.5em 0;padding:calc(.75 * var(--richtext-font-size, 1rem)) 0;border:none;background-color:var(--horizontal-rule-color);background-clip:content-box}.tiptap.ProseMirror{--tt-checklist-bg-color: var(--tt-gray-light-a-100);--tt-checklist-bg-active-color: var(--tt-gray-light-a-900);--tt-checklist-border-color: var(--tt-gray-light-a-200);--tt-checklist-border-active-color: var(--tt-gray-light-a-900);--tt-checklist-check-icon-color: var(--white);--tt-checklist-text-active: var(--tt-gray-light-a-500)}.tiptap.ProseMirror ol,.tiptap.ProseMirror ul{margin-top:1.5em;margin-bottom:1.5em;padding-left:1.5em}.tiptap.ProseMirror ol:first-child,.tiptap.ProseMirror ul:first-child{margin-top:0}.tiptap.ProseMirror ol:last-child,.tiptap.ProseMirror ul:last-child{margin-bottom:0}.tiptap.ProseMirror ol ol,.tiptap.ProseMirror ol ul,.tiptap.ProseMirror ul ol,.tiptap.ProseMirror ul ul{margin-top:calc(.375 * var(--richtext-font-size, 1rem));margin-bottom:0}.tiptap.ProseMirror li>p{margin-top:0;margin-bottom:0}.tiptap.ProseMirror li:not(:last-child){margin-bottom:calc(.375 * var(--richtext-font-size, 1rem))}.tiptap.ProseMirror li p:not(:first-child):not(td p):not(th p){margin-top:0;line-height:1.6}.tiptap.ProseMirror ol{list-style:decimal}.tiptap.ProseMirror ol ol{list-style:lower-alpha}.tiptap.ProseMirror ol ol ol{list-style:lower-roman}.tiptap.ProseMirror ol ol ol ol{list-style:decimal}.tiptap.ProseMirror ol ol ol ol ol{list-style:lower-alpha}.tiptap.ProseMirror ol ol ol ol ol ol{list-style:lower-roman}.tiptap.ProseMirror ol ol ol ol ol ol ol{list-style:decimal}.tiptap.ProseMirror ol ol ol ol ol ol ol ol{list-style:lower-alpha}.tiptap.ProseMirror ol ol ol ol ol ol ol ol ol{list-style:lower-roman}.tiptap.ProseMirror ul:not([data-type=taskList]){list-style:disc}.tiptap.ProseMirror ul:not([data-type=taskList]) ul{list-style:circle}.tiptap.ProseMirror ul:not([data-type=taskList]) ul ul{list-style:square}.tiptap.ProseMirror ul:not([data-type=taskList]) ul ul ul{list-style:disc}.tiptap.ProseMirror ul:not([data-type=taskList]) ul ul ul ul{list-style:circle}.tiptap.ProseMirror ul:not([data-type=taskList]) ul ul ul ul ul{list-style:square}.tiptap.ProseMirror ul:not([data-type=taskList]) ul ul ul ul ul ul{list-style:disc}.tiptap.ProseMirror ul:not([data-type=taskList]) ul ul ul ul ul ul ul{list-style:circle}.tiptap.ProseMirror ul:not([data-type=taskList]) ul ul ul ul ul ul ul ul{list-style:square}.tiptap.ProseMirror ul[data-type=taskList]{padding-left:.25em}.tiptap.ProseMirror ul[data-type=taskList] li{display:flex;flex-direction:row;align-items:flex-start}.tiptap.ProseMirror ul[data-type=taskList] li:not(:has(>p:first-child)){list-style-type:none}.tiptap.ProseMirror ul[data-type=taskList] li[data-checked=true]>div>p{opacity:.5;text-decoration:line-through}.tiptap.ProseMirror ul[data-type=taskList] li[data-checked=true]>div>p span{text-decoration:line-through}.tiptap.ProseMirror ul[data-type=taskList] li label{position:relative;padding-top:calc(.375 * var(--richtext-font-size, 1rem));padding-right:calc(.5 * var(--richtext-font-size, 1rem))}.tiptap.ProseMirror ul[data-type=taskList] li label input[type=checkbox]{appearance:none;position:relative;display:block;width:1em;min-width:0;max-width:none;height:1em;margin:0;padding:0;opacity:1;z-index:auto;font-size:inherit;line-height:normal;box-shadow:none;border:1px solid var(--tt-checklist-border-color);border-radius:var(--tt-radius-xs, calc(.25 * var(--richtext-font-size, 1rem)));background-color:var(--tt-checklist-bg-color);cursor:pointer;transition:background-color 80ms ease-out,border-color 80ms ease-out}.tiptap.ProseMirror ul[data-type=taskList] li label input[type=checkbox]:before{content:"";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:.75em;height:.75em;background-color:var(--tt-checklist-check-icon-color);opacity:0;-webkit-mask:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22currentColor%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M21.4142%204.58579C22.1953%205.36683%2022.1953%206.63317%2021.4142%207.41421L10.4142%2018.4142C9.63317%2019.1953%208.36684%2019.1953%207.58579%2018.4142L2.58579%2013.4142C1.80474%2012.6332%201.80474%2011.3668%202.58579%2010.5858C3.36683%209.80474%204.63317%209.80474%205.41421%2010.5858L9%2014.1716L18.5858%204.58579C19.3668%203.80474%2020.6332%203.80474%2021.4142%204.58579Z%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E) center/contain no-repeat;mask:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22currentColor%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M21.4142%204.58579C22.1953%205.36683%2022.1953%206.63317%2021.4142%207.41421L10.4142%2018.4142C9.63317%2019.1953%208.36684%2019.1953%207.58579%2018.4142L2.58579%2013.4142C1.80474%2012.6332%201.80474%2011.3668%202.58579%2010.5858C3.36683%209.80474%204.63317%209.80474%205.41421%2010.5858L9%2014.1716L18.5858%204.58579C19.3668%203.80474%2020.6332%203.80474%2021.4142%204.58579Z%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E) center/contain no-repeat}.tiptap.ProseMirror ul[data-type=taskList] li label input[type=checkbox]:checked{background:var(--tt-checklist-bg-active-color);border-color:var(--tt-checklist-border-active-color)}.tiptap.ProseMirror ul[data-type=taskList] li label input[type=checkbox]:checked:before{opacity:1}.tiptap.ProseMirror ul[data-type=taskList] li label input[type=checkbox]:focus-visible{outline:2px solid var(--tt-brand-color-500);outline-offset:1px}.tiptap.ProseMirror ul[data-type=taskList] li div{flex:1 1 0%;min-width:0}.tiptap.ProseMirror ul[data-type=taskList] li>div>p:first-child{margin-top:0}.tiptap.ProseMirror ul[data-type=taskList] li>div>p{margin-bottom:0}.tiptap.ProseMirror ul[data-type=taskList] li>div>ul{margin-top:calc(.375 * var(--richtext-font-size, 1rem))}.tiptap.ProseMirror ul[data-type=taskList] li:not(:last-child){margin-bottom:calc(.375 * var(--richtext-font-size, 1rem))}.tiptap.ProseMirror img{max-width:100%;height:auto;display:block}.tiptap.ProseMirror p>img{display:inline-block}.tiptap.ProseMirror>img:not([data-type=emoji] img){margin:calc(2 * var(--richtext-font-size, 1rem)) 0;outline:calc(.125 * var(--richtext-font-size, 1rem)) solid transparent;border-radius:var(--tt-radius-xs, calc(.25 * var(--richtext-font-size, 1rem)))}.tiptap.ProseMirror img:not([data-type=emoji] img).ProseMirror-selectednode{outline-color:var(--tt-brand-color-500)}.tiptap.ProseMirror .tiptap-thread:has(>img){margin:calc(2 * var(--richtext-font-size, 1rem)) 0}.tiptap.ProseMirror .tiptap-thread:has(>img) img{outline:calc(.125 * var(--richtext-font-size, 1rem)) solid transparent;border-radius:var(--tt-radius-xs, calc(.25 * var(--richtext-font-size, 1rem)))}.tiptap.ProseMirror .tiptap-thread img{margin:0}.tiptap.ProseMirror h1,.tiptap.ProseMirror h2,.tiptap.ProseMirror h3,.tiptap.ProseMirror h4{position:relative;color:inherit;font-style:inherit}.tiptap.ProseMirror>h1:first-child,.tiptap.ProseMirror>h2:first-child,.tiptap.ProseMirror>h3:first-child,.tiptap.ProseMirror>h4:first-child,.tiptap.ProseMirror>.ProseMirror-widget+h1,.tiptap.ProseMirror>.ProseMirror-widget+h2,.tiptap.ProseMirror>.ProseMirror-widget+h3,.tiptap.ProseMirror>.ProseMirror-widget+h4{margin-top:0}.tiptap.ProseMirror h1{font-size:1.5em;font-weight:700;margin-top:3em}.tiptap.ProseMirror h2{font-size:1.25em;font-weight:700;margin-top:2.5em}.tiptap.ProseMirror h3{font-size:1.125em;font-weight:600;margin-top:2em}.tiptap.ProseMirror h4{font-size:1em;font-weight:600;margin-top:2em}.tiptap.ProseMirror{--tt-collaboration-carets-label: var(--tt-gray-light-900);--link-text-color: var(--tt-brand-color-500);--placeholder-color: var(--tt-gray-light-a-400);--tiptap-ai-insertion-color: var(--tt-brand-color-600)}.tiptap.ProseMirror>*{position:relative}.tiptap.ProseMirror{white-space:pre-wrap;outline:none;caret-color:var(--tt-cursor-color)}.tiptap.ProseMirror>:first-child{margin-top:0}.tiptap.ProseMirror>:last-child{margin-bottom:0}.tiptap.ProseMirror p:not(:first-child):not(td p):not(th p){margin-top:20px}.tiptap.ProseMirror p:not(td p):not(th p){font-size:calc(1 * var(--richtext-font-size, 1rem));line-height:1.6;font-weight:400}.tiptap.ProseMirror:not(.readonly):not(.ProseMirror-hideselection) ::selection{background-color:var(--tt-selection-color)}.tiptap.ProseMirror:not(.readonly):not(.ProseMirror-hideselection) .selection::selection{background:transparent}.tiptap.ProseMirror .selection{display:inline;background-color:var(--tt-selection-color)}.tiptap.ProseMirror .ProseMirror-selectednode:not(img):not(pre):not(.react-renderer){border-radius:var(--tt-radius-md);background-color:var(--tt-selection-color)}.tiptap.ProseMirror .ProseMirror-hideselection{caret-color:transparent}.tiptap.ProseMirror.resize-cursor{cursor:ew-resize;cursor:col-resize}.tiptap.ProseMirror a span{text-decoration:underline}.tiptap.ProseMirror s span{text-decoration:line-through}.tiptap.ProseMirror u span{text-decoration:underline}.tiptap.ProseMirror .tiptap-ai-insertion{color:var(--tiptap-ai-insertion-color)}.tiptap.ProseMirror .collaboration-carets__caret{border-right:1px solid transparent;border-left:1px solid transparent;pointer-events:none;margin-left:-1px;margin-right:-1px;position:relative;word-break:normal}.tiptap.ProseMirror .collaboration-carets__label{color:var(--tt-collaboration-carets-label);border-radius:calc(.25 * var(--richtext-font-size, 1rem));border-bottom-left-radius:0;font-size:calc(.75 * var(--richtext-font-size, 1rem));font-weight:600;left:-1px;line-height:1;padding:calc(.125 * var(--richtext-font-size, 1rem)) calc(.375 * var(--richtext-font-size, 1rem));position:absolute;top:-1.3em;-webkit-user-select:none;user-select:none;white-space:nowrap}.tiptap.ProseMirror [data-type=emoji] img{display:inline-block;width:1.25em;height:1.25em;cursor:text}.tiptap.ProseMirror a{color:var(--link-text-color);text-decoration:underline}.tiptap.ProseMirror [data-type=mention]{display:inline-block;color:var(--tt-brand-color-500)}.is-empty:not(.with-slash)[data-placeholder]:has(>.ProseMirror-trailingBreak:only-child):before{content:attr(data-placeholder)}.is-empty.with-slash[data-placeholder]:has(>.ProseMirror-trailingBreak:only-child):before{content:"Write, type '/' for commands…";font-style:italic}.is-empty[data-placeholder]:has(>.ProseMirror-trailingBreak:only-child):before{pointer-events:none;height:0;position:absolute;width:100%;text-align:inherit;left:0;right:0}.is-empty[data-placeholder]:has(>.ProseMirror-trailingBreak):before{color:var(--placeholder-color)}.prosemirror-dropcursor-block,.prosemirror-dropcursor-inline{background:var(--tt-brand-color-400)!important;border-radius:calc(.25 * var(--richtext-font-size, 1rem));margin-left:-1px;margin-right:-1px;width:100%;height:calc(.188 * var(--richtext-font-size, 1rem));cursor:grabbing}.tiptap.ProseMirror{--tt-indent-unit: 24px}.tiptap.ProseMirror [data-indent]{transition:margin-left .2s ease-in-out;margin-left:calc(var(--tt-indent-unit) * var(--tt-indent-level, 0))}:where(:root){--richtext-accent: rgb(98, 41, 255);--richtext-accent-text: rgb(255, 255, 255);--richtext-text: rgb(34, 35, 37);--richtext-background: rgb(255, 255, 255);--richtext-surface: rgb(255, 255, 255);--richtext-border: color-mix(in srgb, var(--richtext-text) 10%, transparent);--richtext-text-muted: color-mix(in srgb, var(--richtext-text) 64%, transparent);--richtext-fill: color-mix(in srgb, var(--richtext-text) 5%, transparent);--richtext-danger: rgb(235, 55, 30);--richtext-warning: rgb(163, 136, 0);--richtext-popover-radius: calc(.75 * var(--richtext-font-size, 1rem));--richtext-font-size: 1rem;--richtext-popover-shadow: 0 6px 16px rgba(17, 24, 39, .07), 0 1px 3px rgba(17, 24, 39, .05)}:where(.dark){--richtext-accent: rgb(122, 82, 255);--richtext-text: rgb(245, 245, 245);--richtext-background: rgb(14, 14, 17);--richtext-surface: rgb(25, 25, 26);--richtext-danger: rgb(240, 90, 70);--richtext-warning: rgb(214, 180, 40);--richtext-popover-shadow: 0 6px 16px rgba(0, 0, 0, .35), 0 1px 3px rgba(0, 0, 0, .25)}:root:root{--tt-gray-light-a-50: color-mix(in srgb, var(--richtext-text) 4%, transparent);--tt-gray-dark-a-50: color-mix(in srgb, var(--richtext-text) 4%, transparent);--tt-gray-light-a-100: color-mix(in srgb, var(--richtext-text) 5%, transparent);--tt-gray-dark-a-100: color-mix(in srgb, var(--richtext-text) 5%, transparent);--tt-gray-light-a-200: color-mix(in srgb, var(--richtext-text) 10%, transparent);--tt-gray-dark-a-200: color-mix(in srgb, var(--richtext-text) 10%, transparent);--tt-gray-light-a-300: color-mix(in srgb, var(--richtext-text) 20%, transparent);--tt-gray-dark-a-300: color-mix(in srgb, var(--richtext-text) 20%, transparent);--tt-gray-light-a-400: color-mix(in srgb, var(--richtext-text) 42%, transparent);--tt-gray-dark-a-400: color-mix(in srgb, var(--richtext-text) 42%, transparent);--tt-gray-light-a-500: color-mix(in srgb, var(--richtext-text) 64%, transparent);--tt-gray-dark-a-500: color-mix(in srgb, var(--richtext-text) 64%, transparent);--tt-gray-light-a-600: color-mix(in srgb, var(--richtext-text) 78%, transparent);--tt-gray-dark-a-600: color-mix(in srgb, var(--richtext-text) 78%, transparent);--tt-gray-light-a-700: color-mix(in srgb, var(--richtext-text) 87%, transparent);--tt-gray-dark-a-700: color-mix(in srgb, var(--richtext-text) 87%, transparent);--tt-gray-light-a-800: color-mix(in srgb, var(--richtext-text) 95%, transparent);--tt-gray-dark-a-800: color-mix(in srgb, var(--richtext-text) 95%, transparent);--tt-gray-light-a-900: color-mix(in srgb, var(--richtext-text) 98%, transparent);--tt-gray-dark-a-900: color-mix(in srgb, var(--richtext-text) 98%, transparent);--tt-gray-light-50: color-mix(in srgb, var(--richtext-text) 2%, var(--richtext-surface));--tt-gray-dark-50: color-mix(in srgb, var(--richtext-text) 2%, var(--richtext-surface));--tt-gray-light-100: color-mix(in srgb, var(--richtext-text) 4%, var(--richtext-surface));--tt-gray-dark-100: color-mix(in srgb, var(--richtext-text) 4%, var(--richtext-surface));--tt-gray-light-200: color-mix(in srgb, var(--richtext-text) 8%, var(--richtext-surface));--tt-gray-dark-200: color-mix(in srgb, var(--richtext-text) 8%, var(--richtext-surface));--tt-gray-light-300: color-mix(in srgb, var(--richtext-text) 16%, var(--richtext-surface));--tt-gray-dark-300: color-mix(in srgb, var(--richtext-text) 16%, var(--richtext-surface));--tt-gray-light-400: color-mix(in srgb, var(--richtext-text) 36%, var(--richtext-surface));--tt-gray-dark-400: color-mix(in srgb, var(--richtext-text) 36%, var(--richtext-surface));--tt-gray-light-500: color-mix(in srgb, var(--richtext-text) 50%, var(--richtext-surface));--tt-gray-dark-500: color-mix(in srgb, var(--richtext-text) 50%, var(--richtext-surface));--tt-gray-light-600: color-mix(in srgb, var(--richtext-text) 66%, var(--richtext-surface));--tt-gray-dark-600: color-mix(in srgb, var(--richtext-text) 66%, var(--richtext-surface));--tt-gray-light-700: color-mix(in srgb, var(--richtext-text) 75%, var(--richtext-surface));--tt-gray-dark-700: color-mix(in srgb, var(--richtext-text) 75%, var(--richtext-surface));--tt-gray-light-800: color-mix(in srgb, var(--richtext-text) 85%, var(--richtext-surface));--tt-gray-dark-800: color-mix(in srgb, var(--richtext-text) 85%, var(--richtext-surface));--tt-gray-light-900: color-mix(in srgb, var(--richtext-text) 90%, var(--richtext-surface));--tt-gray-dark-900: color-mix(in srgb, var(--richtext-text) 90%, var(--richtext-surface));--tt-brand-color-500: var(--richtext-accent);--tt-brand-color-50: color-mix(in srgb, var(--richtext-accent) 6%, var(--richtext-surface));--tt-brand-color-100: color-mix(in srgb, var(--richtext-accent) 12%, var(--richtext-surface));--tt-brand-color-200: color-mix(in srgb, var(--richtext-accent) 25%, var(--richtext-surface));--tt-brand-color-300: color-mix(in srgb, var(--richtext-accent) 45%, var(--richtext-surface));--tt-brand-color-400: color-mix(in srgb, var(--richtext-accent) 72%, var(--richtext-surface));--tt-brand-color-600: color-mix(in srgb, var(--richtext-accent) 85%, var(--richtext-text));--tt-brand-color-700: color-mix(in srgb, var(--richtext-accent) 72%, var(--richtext-text));--tt-brand-color-800: color-mix(in srgb, var(--richtext-accent) 58%, var(--richtext-text));--tt-brand-color-900: color-mix(in srgb, var(--richtext-accent) 42%, var(--richtext-text));--tt-brand-color-950: color-mix(in srgb, var(--richtext-accent) 28%, var(--richtext-text));--white: var(--richtext-accent-text);--black: var(--richtext-accent-text);--tt-bg-color: var(--richtext-background);--tt-toolbar-bg-color: var(--richtext-background);--tt-card-bg-color: var(--richtext-surface);--tiptap-card-bg-color: var(--richtext-surface);--tt-dropdown-menu-bg-color: var(--richtext-surface);--tt-border-color: var(--richtext-border);--tt-border-color-tint: color-mix(in srgb, var(--richtext-border) 50%, transparent);--tt-toolbar-border-color: var(--richtext-border);--tt-card-border-color: var(--richtext-border);--tt-cursor-color: var(--richtext-accent);--tt-selection-color: color-mix(in srgb, var(--richtext-accent) 20%, transparent);--tt-color-red-base: var(--richtext-danger)}.tiptap.ProseMirror.tiptap.ProseMirror{--tt-checklist-bg-active-color: var(--richtext-accent);--tt-checklist-border-active-color: var(--richtext-accent);--tt-checklist-check-icon-color: var(--richtext-accent-text)}.tiptap-popover.tiptap-popover{--tt-popover-bg-color: var(--richtext-surface);--tt-popover-border-color: var(--richtext-border)}.rt-editor{position:relative;display:flex;flex-direction:column;min-width:0;color:var(--richtext-text);background-color:var(--richtext-background);border:1px solid var(--richtext-border);border-radius:var(--tt-radius-md)}.rt-editor .tiptap-toolbar[data-variant=fixed]{border-radius:var(--tt-radius-md) var(--tt-radius-md) 0 0}@media(max-width:480px){.rt-editor .tiptap-toolbar[data-variant=fixed]{position:sticky;top:0;height:auto;min-height:var(--tt-toolbar-height);padding:0 calc(.5 * var(--richtext-font-size, 1rem));border-top:none;border-bottom:1px solid var(--richtext-border)}}.rt-editor .rt-editor-content{display:flex;flex-direction:column;flex:1;min-height:0;container-type:inline-size}.rt-editor .rt-editor-content .tiptap.ProseMirror{--rt-gutter: var(--richtext-padding-x, calc(1.25 * var(--richtext-font-size, 1rem)));--rt-gutter-end: var(--rt-gutter);--rt-centering: calc((100cqi - var(--richtext-max-width, 65ch)) / 2);--rt-wide: min(5%, max(0px, calc(var(--rt-centering) - var(--rt-gutter-end))));flex:1;padding:calc(1 * var(--richtext-font-size, 1rem)) max(var(--rt-gutter-end),var(--rt-centering)) calc(1 * var(--richtext-font-size, 1rem)) max(var(--rt-gutter),var(--rt-centering));outline:none}.rt-editor .rt-editor-content .tiptap.ProseMirror :is(h1,h2,h3,h4,h5,h6){scroll-margin-top:calc(1 * var(--richtext-font-size, 1rem))}.rt-editor .rt-editor-content .tiptap.ProseMirror>img:not([size=small],[size=medium],[float=left],[float=right]){max-width:calc(100% + 2 * var(--rt-wide));margin-left:50%;transform:translate(-50%)}.rt-editor .rt-editor-content .tiptap.ProseMirror>div[data-youtube-video]:not(:has(iframe:is([size=small],[size=medium],[float=left],[float=right]))),.rt-editor .rt-editor-content .tiptap.ProseMirror>.tableWrapper{margin-right:calc(-1 * var(--rt-wide));margin-left:calc(-1 * var(--rt-wide))}.rt-toc{position:sticky;top:0;z-index:2;align-self:flex-end;width:0;height:0}.rt-editor:not([data-toolbar=bottom]):has(>.rt-editor-toolbar)>.rt-toc{top:var(--tt-toolbar-height)}.rt-editor:not([data-toolbar=bottom]):has(>.rt-editor-toolbar) .rt-editor-content .tiptap.ProseMirror :is(h1,h2,h3,h4,h5,h6){scroll-margin-top:calc(var(--tt-toolbar-height) + 1 * var(--richtext-font-size, 1rem))}.rt-editor:has(>.rt-toc) .rt-editor-content .tiptap.ProseMirror{--rt-gutter-end: calc(var(--rt-gutter) + calc(1.5 * var(--richtext-font-size, 1rem)))}.rt-toc-lines.rt-toc-lines,.rt-toc-item.rt-toc-item{min-width:0;min-height:0;margin:0;font:inherit;text-transform:none;letter-spacing:normal;background:none;border:0;box-shadow:none;cursor:pointer;appearance:none}.rt-toc-lines.rt-toc-lines{position:absolute;top:calc(.75 * var(--richtext-font-size, 1rem));right:calc(.5 * var(--richtext-font-size, 1rem));display:flex;flex-direction:column;align-items:flex-end;gap:calc(.375 * var(--richtext-font-size, 1rem));width:auto;height:auto;padding:calc(.25 * var(--richtext-font-size, 1rem));border-radius:var(--tt-radius-xs)}.rt-toc-lines.rt-toc-lines:focus-visible{outline:2px solid var(--richtext-accent)}.rt-toc-line{display:block;width:calc(1 * var(--richtext-font-size, 1rem));height:2px;background:var(--richtext-text-muted);border-radius:1px;opacity:.6}.rt-toc-line[data-rank="1"]{width:calc(.75 * var(--richtext-font-size, 1rem))}.rt-toc-line[data-rank="2"]{width:calc(.5 * var(--richtext-font-size, 1rem))}.rt-toc-line[data-rank="3"]{width:calc(.375 * var(--richtext-font-size, 1rem))}.rt-toc-list{position:absolute;top:calc(.5 * var(--richtext-font-size, 1rem));right:calc(.25 * var(--richtext-font-size, 1rem));width:max-content;min-width:calc(10 * var(--richtext-font-size, 1rem));max-width:calc(18 * var(--richtext-font-size, 1rem));max-height:min(60vh,20 * var(--richtext-font-size, 1rem));margin:0;padding:calc(.25 * var(--richtext-font-size, 1rem));overflow-y:auto;list-style:none;background:var(--richtext-surface);border:1px solid var(--richtext-border);border-radius:var(--richtext-popover-radius);box-shadow:var(--richtext-popover-shadow);visibility:hidden;opacity:0;transition:opacity .1s ease,visibility .1s}.rt-toc:hover .rt-toc-list,.rt-toc:focus-within .rt-toc-list{visibility:visible;opacity:1}.rt-toc-list li{margin:0;padding:0}.rt-toc-item.rt-toc-item{display:block;width:100%;padding:calc(.25 * var(--richtext-font-size, 1rem)) calc(.5 * var(--richtext-font-size, 1rem));overflow:hidden;font-size:calc(.875 * var(--richtext-font-size, 1rem));line-height:1.4;color:var(--richtext-text);text-align:left;text-overflow:ellipsis;white-space:nowrap;border-radius:calc(var(--richtext-popover-radius) - .25 * var(--richtext-font-size, 1rem))}.rt-toc-item.rt-toc-item:hover,.rt-toc-item.rt-toc-item:focus-visible{background:var(--richtext-fill);outline:none}.rt-toc-item.rt-toc-item[data-rank="0"]{font-weight:600}.rt-toc-item.rt-toc-item[data-rank="1"]{padding-left:calc(1.25 * var(--richtext-font-size, 1rem))}.rt-toc-item.rt-toc-item[data-rank="2"]{padding-left:calc(2 * var(--richtext-font-size, 1rem))}.rt-toc-item.rt-toc-item[data-rank="3"]{padding-left:calc(2.75 * var(--richtext-font-size, 1rem))}.rt-editor[data-toolbar=bottom] .tiptap-toolbar[data-variant=fixed]{order:1;top:auto;bottom:0;border-bottom:none;border-top:1px solid var(--richtext-border);border-radius:0 0 var(--tt-radius-md) var(--tt-radius-md)}@media(max-width:480px){.rt-editor[data-toolbar=bottom] .tiptap-toolbar[data-variant=fixed]{top:auto;border-bottom:none;border-top:1px solid var(--richtext-border)}}.rt-editor[data-compact]{--tt-toolbar-height: calc(2.25 * var(--richtext-font-size, 1rem))}.rt-editor[data-compact] .rt-editor-content .tiptap.ProseMirror{--rt-gutter: var(--richtext-padding-x, calc(.75 * var(--richtext-font-size, 1rem)));padding-top:calc(.5 * var(--richtext-font-size, 1rem));padding-bottom:calc(.5 * var(--richtext-font-size, 1rem))}.rt-editor[data-compact] .rt-editor-footer{padding:0 var(--richtext-padding-x, calc(.75 * var(--richtext-font-size, 1rem))) calc(.25 * var(--richtext-font-size, 1rem));border-top:none}.rt-editor[data-compact]:not(:focus-within):not(:has(.tiptap-toolbar [data-state=open])):not([data-toolbar-hold=shown]) .tiptap-toolbar,.rt-editor[data-compact]:not(:focus-within):not(:has(.tiptap-toolbar [data-state=open])):not([data-toolbar-hold=shown]) .rt-editor-footer,.rt-editor[data-compact][data-toolbar-hold=hidden] .tiptap-toolbar,.rt-editor[data-compact][data-toolbar-hold=hidden] .rt-editor-footer{display:none}.rt-editor[data-invalid]{border-color:var(--richtext-danger)}.rt-form-field{position:absolute;bottom:0;left:calc(1 * var(--richtext-font-size, 1rem));width:1px;height:1px;padding:0;border:0;opacity:0;resize:none;pointer-events:none}.rt-editor-footer{display:flex;justify-content:flex-end;padding:calc(.25 * var(--richtext-font-size, 1rem)) var(--richtext-padding-x, calc(.75 * var(--richtext-font-size, 1rem)));border-top:1px solid var(--richtext-border)}.rt-character-count{display:flex;gap:calc(.5 * var(--richtext-font-size, 1rem));font-size:calc(.75 * var(--richtext-font-size, 1rem));color:var(--richtext-text-muted);font-variant-numeric:tabular-nums}.rt-character-count[data-state=below-min] .rt-character-count-hint{color:var(--richtext-warning)}.rt-character-count[data-state=at-limit]{color:var(--richtext-danger)}.rt-media-controls{position:fixed;z-index:60}.rt-media-controls[popover]{inset:auto;margin:0;overflow:visible;color:inherit}.rt-media-controls .rt-media-caption{width:calc(12 * var(--richtext-font-size, 1rem))}.rt-upload-button{flex-shrink:0}.rt-upload-button .tiptap-button-text{white-space:nowrap}.rt-popover-text{max-width:calc(16 * var(--richtext-font-size, 1rem));padding:0 calc(.5 * var(--richtext-font-size, 1rem));overflow:hidden;font-size:calc(.875 * var(--richtext-font-size, 1rem));text-overflow:ellipsis;white-space:nowrap}.rt-popover-error{margin:calc(.25 * var(--richtext-font-size, 1rem)) calc(.5 * var(--richtext-font-size, 1rem)) 0;font-size:calc(.75 * var(--richtext-font-size, 1rem));color:var(--richtext-danger)}.tiptap-popover>.tiptap-card,.tiptap-dropdown-menu-content.tiptap-dropdown-menu-content,.rt-media-controls.tiptap-toolbar{--tt-radius-lg: calc(var(--richtext-popover-radius) - calc(.375 * var(--richtext-font-size, 1rem)));--tt-radius-md: calc(var(--richtext-popover-radius) - calc(.375 * var(--richtext-font-size, 1rem)));border:1px solid var(--richtext-border);border-radius:var(--richtext-popover-radius);box-shadow:var(--richtext-popover-shadow)}.tiptap-dropdown-menu-separator{height:1px;margin:calc(.25 * var(--richtext-font-size, 1rem)) 0;background:var(--richtext-border)}.rt-mention-menu{--radix-dropdown-menu-content-available-height: calc(18 * var(--richtext-font-size, 1rem));position:fixed;z-index:60;min-width:calc(12 * var(--richtext-font-size, 1rem))}.rt-mention-menu[popover]{inset:auto;margin:0;color:inherit}.rt-mention-menu-empty{padding:calc(.25 * var(--richtext-font-size, 1rem)) calc(.5 * var(--richtext-font-size, 1rem));font-size:calc(.875 * var(--richtext-font-size, 1rem));color:var(--richtext-text-muted)}.rt-upload-placeholder{display:flex;gap:calc(.5 * var(--richtext-font-size, 1rem));align-items:center;margin:calc(.5 * var(--richtext-font-size, 1rem)) 0;padding:calc(.5 * var(--richtext-font-size, 1rem)) calc(.75 * var(--richtext-font-size, 1rem));font-size:calc(.875 * var(--richtext-font-size, 1rem));color:var(--richtext-text-muted);border:1px dashed var(--richtext-border);border-radius:var(--tt-radius-md);-webkit-user-select:none;user-select:none}.rt-upload-placeholder:before{content:"";flex-shrink:0;width:calc(.875 * var(--richtext-font-size, 1rem));height:calc(.875 * var(--richtext-font-size, 1rem));border:2px solid var(--richtext-border);border-top-color:var(--richtext-accent);border-radius:50%;animation:rt-spin .8s linear infinite}.rt-upload-placeholder[data-state=error]{color:var(--richtext-danger);border-style:solid;border-color:color-mix(in srgb,var(--richtext-danger) 40%,transparent)}.rt-upload-placeholder[data-state=error]:before{display:none}.rt-upload-placeholder span{flex:1;min-width:0}.rt-upload-placeholder-close{padding:0 calc(.25 * var(--richtext-font-size, 1rem));font-size:calc(1 * var(--richtext-font-size, 1rem));line-height:1;color:inherit;background:none;border:0;cursor:pointer}@keyframes rt-spin{to{transform:rotate(360deg)}}.tiptap.ProseMirror .mention,.rt-content .mention{display:inline-block;padding:0 calc(.25 * var(--richtext-font-size, 1rem));line-height:1.4;background:var(--richtext-fill);border:1px solid var(--richtext-border);border-radius:var(--tt-radius-xs)}.tiptap.ProseMirror .mention .mention-char,.rt-content .mention .mention-char{margin-right:.1em;font-weight:600;opacity:.5}.tiptap.ProseMirror .mention[preview],.rt-content .mention[preview]{position:relative;padding-right:calc(.75 * var(--richtext-font-size, 1rem));background:transparent}.tiptap.ProseMirror .mention[preview] .mention-char,.tiptap.ProseMirror .mention[preview] .mention-label,.rt-content .mention[preview] .mention-char,.rt-content .mention[preview] .mention-label{display:none}.tiptap.ProseMirror .mention[preview]:before,.rt-content .mention[preview]:before{content:attr(preview)}.tiptap.ProseMirror .mention[preview]:after,.rt-content .mention[preview]:after{content:attr(data-label);position:absolute;top:1px;right:1px;bottom:1px;display:flex;align-items:center;padding:0 0 0 calc(.25 * var(--richtext-font-size, 1rem));font-size:0;white-space:nowrap;background:color-mix(in srgb,var(--richtext-accent) 15%,var(--richtext-surface));border-radius:var(--tt-radius-xs);transition:all .05s ease}.tiptap.ProseMirror .mention[preview]:hover:after,.rt-content .mention[preview]:hover:after{padding:0 calc(.25 * var(--richtext-font-size, 1rem));font-size:calc(.75 * var(--richtext-font-size, 1rem));background:color-mix(in srgb,var(--richtext-accent) 8%,var(--richtext-surface))}.tiptap.ProseMirror .conditionally-visible,.rt-content .conditionally-visible{position:relative;margin:calc(.75 * var(--richtext-font-size, 1rem)) 0;padding:calc(1.6 * var(--richtext-font-size, 1rem)) calc(.5 * var(--richtext-font-size, 1rem)) calc(.25 * var(--richtext-font-size, 1rem));border:1px solid var(--richtext-border);border-radius:var(--tt-radius-xs)}.tiptap.ProseMirror .conditionally-visible>:first-child,.rt-content .conditionally-visible>:first-child{margin-top:0}.tiptap.ProseMirror .conditionally-visible>:last-child,.rt-content .conditionally-visible>:last-child{margin-bottom:0}.tiptap.ProseMirror .conditionally-visible:before,.rt-content .conditionally-visible:before{content:attr(condition-label);position:absolute;top:-1px;left:-1px;padding:0 calc(.25 * var(--richtext-font-size, 1rem));font-size:calc(.75 * var(--richtext-font-size, 1rem));white-space:nowrap;background:var(--richtext-fill);border:1px solid var(--richtext-border);border-radius:var(--tt-radius-xs) var(--tt-radius-xs) var(--tt-radius-xs) 0}.tiptap.ProseMirror .conditionally-visible[data-hidden-label],.rt-content .conditionally-visible[data-hidden-label]{padding:calc(.25 * var(--richtext-font-size, 1rem)) calc(.5 * var(--richtext-font-size, 1rem));color:var(--richtext-text-muted);font-style:italic;border-style:dashed}.tiptap.ProseMirror .conditionally-visible[data-hidden-label]>*,.rt-content .conditionally-visible[data-hidden-label]>*{display:none}.tiptap.ProseMirror .conditionally-visible[data-hidden-label]:before,.rt-content .conditionally-visible[data-hidden-label]:before{content:attr(data-hidden-label);position:static;padding:0;font-size:calc(.875 * var(--richtext-font-size, 1rem));background:none;border:0}.tiptap.ProseMirror a[data-type=file],.rt-content a[data-type=file]{display:inline-flex;margin:0 calc(.25 * var(--richtext-font-size, 1rem)) calc(.25 * var(--richtext-font-size, 1rem)) 0;padding:calc(.25 * var(--richtext-font-size, 1rem)) calc(.5 * var(--richtext-font-size, 1rem));text-decoration:none;background:var(--richtext-fill);border:1px solid var(--richtext-border);border-radius:var(--tt-radius-xs)}.tiptap.ProseMirror div[data-youtube-video] iframe,.rt-content div[data-youtube-video] iframe{width:100%;max-width:100%;height:auto;aspect-ratio:16/9;border:0;border-radius:var(--tt-radius-xs)}.tiptap.ProseMirror img[size=small],.tiptap.ProseMirror div[data-youtube-video]:has(iframe[size=small]),.rt-content img[size=small],.rt-content div[data-youtube-video]:has(iframe[size=small]){max-width:200px}.tiptap.ProseMirror img[size=medium],.tiptap.ProseMirror div[data-youtube-video]:has(iframe[size=medium]),.rt-content img[size=medium],.rt-content div[data-youtube-video]:has(iframe[size=medium]){max-width:400px}.tiptap.ProseMirror img[float=left],.tiptap.ProseMirror div[data-youtube-video]:has(iframe[float=left]),.rt-content img[float=left],.rt-content div[data-youtube-video]:has(iframe[float=left]){float:left;margin-right:calc(1 * var(--richtext-font-size, 1rem))}.tiptap.ProseMirror img[float=right],.tiptap.ProseMirror div[data-youtube-video]:has(iframe[float=right]),.rt-content img[float=right],.rt-content div[data-youtube-video]:has(iframe[float=right]){float:right;margin-left:calc(1 * var(--richtext-font-size, 1rem))}.rt-content ul[data-type=taskList]{padding-left:.25em;list-style:none}.rt-content ul[data-type=taskList] li{display:flex;gap:calc(.5 * var(--richtext-font-size, 1rem));align-items:baseline}.rt-content ul[data-type=taskList] li:not(:last-child){margin-bottom:calc(.375 * var(--richtext-font-size, 1rem))}.rt-content ul[data-type=taskList] li>div{flex:1;min-width:0}.rt-content ul[data-type=taskList] li>div>p{margin:0}.rt-content ul[data-type=taskList] li>div>ul{margin:calc(.375 * var(--richtext-font-size, 1rem)) 0 0}.tiptap.ProseMirror .tableWrapper,.rt-content .tableWrapper{margin:calc(1 * var(--richtext-font-size, 1rem)) 0;overflow-x:auto}.tiptap.ProseMirror table,.rt-content table{width:100%;margin:0;border-collapse:collapse;table-layout:fixed}.tiptap.ProseMirror td,.tiptap.ProseMirror th,.rt-content td,.rt-content th{position:relative;min-width:1em;padding:calc(.375 * var(--richtext-font-size, 1rem)) calc(.5 * var(--richtext-font-size, 1rem));vertical-align:top;border:1px solid var(--richtext-border)}.tiptap.ProseMirror td>*,.tiptap.ProseMirror th>*,.rt-content td>*,.rt-content th>*{margin:0}.tiptap.ProseMirror th,.rt-content th{font-weight:600;text-align:left;background:var(--richtext-fill)}.tiptap.ProseMirror .selectedCell:after,.rt-content .selectedCell:after{content:"";position:absolute;inset:0;pointer-events:none;background:color-mix(in srgb,var(--richtext-accent) 15%,transparent)}.tiptap.ProseMirror div[data-youtube-video] iframe{pointer-events:none}.tiptap.ProseMirror hr,.tiptap.ProseMirror a[data-type=file],.tiptap.ProseMirror .mention,.tiptap.ProseMirror div[data-youtube-video] iframe{outline:2px solid transparent;outline-offset:1px}.tiptap.ProseMirror hr.ProseMirror-selectednode,.tiptap.ProseMirror a[data-type=file].ProseMirror-selectednode,.tiptap.ProseMirror .mention.ProseMirror-selectednode,.tiptap.ProseMirror div[data-youtube-video].ProseMirror-selectednode iframe{outline-color:var(--tt-brand-color-500)}.tiptap.ProseMirror hr{border-radius:var(--tt-radius-xs)}.rt-editor[data-readonly=true] .tiptap.ProseMirror ul[data-type=taskList] input[type=checkbox]{cursor:default}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Character count under the editor. `limit` is enforced by Tiptap's
|
|
3
|
+
* CharacterCount extension; `min` only shows a hint.
|
|
4
|
+
*/
|
|
5
|
+
type __VLS_Props = {
|
|
6
|
+
min?: number;
|
|
7
|
+
limit?: number;
|
|
8
|
+
};
|
|
9
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>>, {}>;
|
|
10
|
+
declare const _default: typeof __VLS_export;
|
|
11
|
+
export default _default;
|
|
12
|
+
type __VLS_TypePropsToOption<T> = {
|
|
13
|
+
[K in keyof T & string]-?: {} extends Pick<T, K> ? {
|
|
14
|
+
type: import('vue').PropType<Required<T>[K]>;
|
|
15
|
+
} : {
|
|
16
|
+
type: import('vue').PropType<T[K]>;
|
|
17
|
+
required: true;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { RichtextLocale, RichtextOptions, RichtextToolbarPosition, RichtextValue, UploadFileFunction } from "./types";
|
|
2
|
+
import "./input-richtext.scss";
|
|
3
|
+
declare const _default: typeof __VLS_export;
|
|
4
|
+
export default _default;
|
|
5
|
+
declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<{
|
|
6
|
+
modelValue?: RichtextValue;
|
|
7
|
+
/** Format of the emitted value (default "html"). HTML output wraps visibility conditions in liquid tags. */
|
|
8
|
+
outputFormat?: "html" | "json";
|
|
9
|
+
options?: RichtextOptions;
|
|
10
|
+
/** Values shown instead of a mention's label, keyed by mention id. Reactive. */
|
|
11
|
+
mentionPreviews?: Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Uploads a file and resolves to its URL. Used by the image and file buttons and
|
|
14
|
+
* for dropped/pasted files. Without it, the buttons only accept links and
|
|
15
|
+
* dropped/pasted files fail with a console error.
|
|
16
|
+
*/
|
|
17
|
+
onUploadFile?: UploadFileFunction;
|
|
18
|
+
/** Default: "Begin met typen..." / "Start typing..." */
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
/** Read-only. With "tasks", task list checkboxes can still be toggled, which emits the new value. */
|
|
21
|
+
readonly?: boolean | "tasks";
|
|
22
|
+
autofocus?: boolean;
|
|
23
|
+
/** Submitted with the surrounding form under this name */
|
|
24
|
+
name?: string;
|
|
25
|
+
/** The form can't be submitted while the editor is empty */
|
|
26
|
+
required?: boolean;
|
|
27
|
+
toolbarPosition?: RichtextToolbarPosition;
|
|
28
|
+
/** Smaller spacing; toolbar and character count only show while the editor has focus */
|
|
29
|
+
compact?: boolean;
|
|
30
|
+
/** Language of the editor's own texts. Default "nl". */
|
|
31
|
+
locale?: RichtextLocale;
|
|
32
|
+
}>, {
|
|
33
|
+
modelValue: string;
|
|
34
|
+
outputFormat: string;
|
|
35
|
+
options: () => {};
|
|
36
|
+
mentionPreviews: () => {};
|
|
37
|
+
onUploadFile: undefined;
|
|
38
|
+
placeholder: undefined;
|
|
39
|
+
readonly: boolean;
|
|
40
|
+
autofocus: boolean;
|
|
41
|
+
name: undefined;
|
|
42
|
+
required: boolean;
|
|
43
|
+
toolbarPosition: string;
|
|
44
|
+
compact: boolean;
|
|
45
|
+
locale: string;
|
|
46
|
+
}>, {
|
|
47
|
+
editor: import("vue").ComputedRef<import("@tiptap/vue-2").Editor | undefined>;
|
|
48
|
+
/** Same as a form field's checkValidity(); true when not part of form validation */
|
|
49
|
+
checkValidity: () => boolean;
|
|
50
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
51
|
+
"update:modelValue": (value: import("@tiptap/core").Content) => void;
|
|
52
|
+
action: (action: import("./types").SelectMentionAction) => void;
|
|
53
|
+
"keydown-ctrl-enter": (event: KeyboardEvent) => void;
|
|
54
|
+
error: (error: import("./types").RichtextUploadError) => void;
|
|
55
|
+
}, string, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<{
|
|
56
|
+
modelValue?: RichtextValue;
|
|
57
|
+
/** Format of the emitted value (default "html"). HTML output wraps visibility conditions in liquid tags. */
|
|
58
|
+
outputFormat?: "html" | "json";
|
|
59
|
+
options?: RichtextOptions;
|
|
60
|
+
/** Values shown instead of a mention's label, keyed by mention id. Reactive. */
|
|
61
|
+
mentionPreviews?: Record<string, unknown>;
|
|
62
|
+
/**
|
|
63
|
+
* Uploads a file and resolves to its URL. Used by the image and file buttons and
|
|
64
|
+
* for dropped/pasted files. Without it, the buttons only accept links and
|
|
65
|
+
* dropped/pasted files fail with a console error.
|
|
66
|
+
*/
|
|
67
|
+
onUploadFile?: UploadFileFunction;
|
|
68
|
+
/** Default: "Begin met typen..." / "Start typing..." */
|
|
69
|
+
placeholder?: string;
|
|
70
|
+
/** Read-only. With "tasks", task list checkboxes can still be toggled, which emits the new value. */
|
|
71
|
+
readonly?: boolean | "tasks";
|
|
72
|
+
autofocus?: boolean;
|
|
73
|
+
/** Submitted with the surrounding form under this name */
|
|
74
|
+
name?: string;
|
|
75
|
+
/** The form can't be submitted while the editor is empty */
|
|
76
|
+
required?: boolean;
|
|
77
|
+
toolbarPosition?: RichtextToolbarPosition;
|
|
78
|
+
/** Smaller spacing; toolbar and character count only show while the editor has focus */
|
|
79
|
+
compact?: boolean;
|
|
80
|
+
/** Language of the editor's own texts. Default "nl". */
|
|
81
|
+
locale?: RichtextLocale;
|
|
82
|
+
}>, {
|
|
83
|
+
modelValue: string;
|
|
84
|
+
outputFormat: string;
|
|
85
|
+
options: () => {};
|
|
86
|
+
mentionPreviews: () => {};
|
|
87
|
+
onUploadFile: undefined;
|
|
88
|
+
placeholder: undefined;
|
|
89
|
+
readonly: boolean;
|
|
90
|
+
autofocus: boolean;
|
|
91
|
+
name: undefined;
|
|
92
|
+
required: boolean;
|
|
93
|
+
toolbarPosition: string;
|
|
94
|
+
compact: boolean;
|
|
95
|
+
locale: string;
|
|
96
|
+
}>>>, {
|
|
97
|
+
autofocus: boolean;
|
|
98
|
+
name: string;
|
|
99
|
+
readonly: boolean | "tasks";
|
|
100
|
+
placeholder: string;
|
|
101
|
+
required: boolean;
|
|
102
|
+
modelValue: import("@tiptap/core").Content;
|
|
103
|
+
mentionPreviews: Record<string, unknown>;
|
|
104
|
+
options: RichtextOptions;
|
|
105
|
+
outputFormat: "html" | "json";
|
|
106
|
+
onUploadFile: UploadFileFunction;
|
|
107
|
+
toolbarPosition: RichtextToolbarPosition;
|
|
108
|
+
compact: boolean;
|
|
109
|
+
locale: RichtextLocale;
|
|
110
|
+
}>, {
|
|
111
|
+
'after-menu'?: (props: {}) => any;
|
|
112
|
+
}>;
|
|
113
|
+
type __VLS_TypePropsToOption<T> = {
|
|
114
|
+
[K in keyof T & string]-?: {} extends Pick<T, K> ? {
|
|
115
|
+
type: import('vue').PropType<Required<T>[K]>;
|
|
116
|
+
} : {
|
|
117
|
+
type: import('vue').PropType<T[K]>;
|
|
118
|
+
required: true;
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
type __VLS_WithDefaults<P, D> = {
|
|
122
|
+
[K in keyof P & string]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
|
|
123
|
+
default: D[K];
|
|
124
|
+
}> : P[K];
|
|
125
|
+
};
|
|
126
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
127
|
+
new (): {
|
|
128
|
+
$slots: S;
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
type __VLS_PrettifyLocal<T> = (T extends any ? {
|
|
132
|
+
[K in keyof T]: T[K];
|
|
133
|
+
} : {
|
|
134
|
+
[K in keyof T as K]: T[K];
|
|
135
|
+
}) & {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, unknown, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MentionMenuState } from "./extensions/mention-menu";
|
|
2
|
+
/**
|
|
3
|
+
* Suggestion list for mentions, positioned under the typed "@query"
|
|
4
|
+
* (or above it when there's no room below).
|
|
5
|
+
*/
|
|
6
|
+
type __VLS_Props = {
|
|
7
|
+
state: MentionMenuState;
|
|
8
|
+
};
|
|
9
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
10
|
+
select: (index: number) => void;
|
|
11
|
+
}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>>, {}>;
|
|
12
|
+
declare const _default: typeof __VLS_export;
|
|
13
|
+
export default _default;
|
|
14
|
+
type __VLS_TypePropsToOption<T> = {
|
|
15
|
+
[K in keyof T & string]-?: {} extends Pick<T, K> ? {
|
|
16
|
+
type: import('vue').PropType<Required<T>[K]>;
|
|
17
|
+
} : {
|
|
18
|
+
type: import('vue').PropType<T[K]>;
|
|
19
|
+
required: true;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RichtextOptions } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Table dropdown: "Insert table" outside a table, row/column/header/merge
|
|
4
|
+
* actions inside one.
|
|
5
|
+
*/
|
|
6
|
+
type __VLS_Props = {
|
|
7
|
+
insertDefaults?: NonNullable<RichtextOptions["table"]>["insertDefaults"];
|
|
8
|
+
};
|
|
9
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>>, {}>;
|
|
10
|
+
declare const _default: typeof __VLS_export;
|
|
11
|
+
export default _default;
|
|
12
|
+
type __VLS_TypePropsToOption<T> = {
|
|
13
|
+
[K in keyof T & string]-?: {} extends Pick<T, K> ? {
|
|
14
|
+
type: import('vue').PropType<Required<T>[K]>;
|
|
15
|
+
} : {
|
|
16
|
+
type: import('vue').PropType<T[K]>;
|
|
17
|
+
required: true;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, unknown, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RichtextTemplate } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Dropdown with predefined texts (options.templates), inserted at the cursor.
|
|
4
|
+
*/
|
|
5
|
+
type __VLS_Props = {
|
|
6
|
+
templates: RichtextTemplate[];
|
|
7
|
+
};
|
|
8
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>>, {}>;
|
|
9
|
+
declare const _default: typeof __VLS_export;
|
|
10
|
+
export default _default;
|
|
11
|
+
type __VLS_TypePropsToOption<T> = {
|
|
12
|
+
[K in keyof T & string]-?: {} extends Pick<T, K> ? {
|
|
13
|
+
type: import('vue').PropType<Required<T>[K]>;
|
|
14
|
+
} : {
|
|
15
|
+
type: import('vue').PropType<T[K]>;
|
|
16
|
+
required: true;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { UploadFileFunction } from "./types";
|
|
2
|
+
import "@/components/tiptap-ui/link-popover/link-popover.scss";
|
|
3
|
+
/**
|
|
4
|
+
* Toolbar button for images or file links. Uploads a file through `upload`,
|
|
5
|
+
* or links to a URL. With one selected, it offers to open or remove it.
|
|
6
|
+
*/
|
|
7
|
+
type __VLS_Props = {
|
|
8
|
+
type: "image" | "file";
|
|
9
|
+
/** Without it, only linking to a URL is offered. Checks the size and reports errors itself. */
|
|
10
|
+
upload?: UploadFileFunction;
|
|
11
|
+
/** Opens the popover; see lib/shortcuts.ts */
|
|
12
|
+
shortcutKeys?: string;
|
|
13
|
+
};
|
|
14
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>>, {}>;
|
|
15
|
+
declare const _default: typeof __VLS_export;
|
|
16
|
+
export default _default;
|
|
17
|
+
type __VLS_TypePropsToOption<T> = {
|
|
18
|
+
[K in keyof T & string]-?: {} extends Pick<T, K> ? {
|
|
19
|
+
type: import('vue').PropType<Required<T>[K]>;
|
|
20
|
+
} : {
|
|
21
|
+
type: import('vue').PropType<T[K]>;
|
|
22
|
+
required: true;
|
|
23
|
+
};
|
|
24
|
+
};
|
package/dist/types/richtext-vue/src/components/input-richtext/VisibilityConditionsMenu.vue.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Editor } from "@tiptap/core";
|
|
2
|
+
import type { VisibilityCondition } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Dropdown to wrap the selected blocks in a visibility condition, like a blockquote.
|
|
5
|
+
*/
|
|
6
|
+
type __VLS_Props = {
|
|
7
|
+
editor?: Editor | null;
|
|
8
|
+
conditions: VisibilityCondition[];
|
|
9
|
+
};
|
|
10
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>>, {}>;
|
|
11
|
+
declare const _default: typeof __VLS_export;
|
|
12
|
+
export default _default;
|
|
13
|
+
type __VLS_TypePropsToOption<T> = {
|
|
14
|
+
[K in keyof T & string]-?: {} extends Pick<T, K> ? {
|
|
15
|
+
type: import('vue').PropType<Required<T>[K]>;
|
|
16
|
+
} : {
|
|
17
|
+
type: import('vue').PropType<T[K]>;
|
|
18
|
+
required: true;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import "@/components/tiptap-ui/link-popover/link-popover.scss";
|
|
2
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, unknown, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
3
|
+
declare const _default: typeof __VLS_export;
|
|
4
|
+
export default _default;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Extension } from "@tiptap/core";
|
|
2
|
+
import { type RichtextMessages } from "@/locales";
|
|
3
|
+
export interface FileDropOptions {
|
|
4
|
+
/** Uploads the file and resolves to its URL */
|
|
5
|
+
upload: (file: File, type: "file" | "image") => Promise<string>;
|
|
6
|
+
/** Insert image files as images (requires the image extension) */
|
|
7
|
+
images: boolean;
|
|
8
|
+
/** Insert other files as file links (requires the file extension) */
|
|
9
|
+
files: boolean;
|
|
10
|
+
/** Texts in the editor's locale */
|
|
11
|
+
messages: () => RichtextMessages;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Uploads files that are dropped on or pasted into the editor. Images become
|
|
15
|
+
* images, other files become file links, placed next to the paragraph they
|
|
16
|
+
* were dropped on.
|
|
17
|
+
*
|
|
18
|
+
* While uploading, a placeholder shows where the file will go. It's a widget
|
|
19
|
+
* decoration, so it never ends up in the value or the undo history. A failed
|
|
20
|
+
* upload leaves the placeholder with the error until it's dismissed.
|
|
21
|
+
*/
|
|
22
|
+
export declare const FileDrop: Extension<FileDropOptions, any>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Node } from "@tiptap/core";
|
|
2
|
+
declare module "@tiptap/core" {
|
|
3
|
+
interface Commands<ReturnType> {
|
|
4
|
+
file: {
|
|
5
|
+
/** Inserts a file link, or replaces the selected one */
|
|
6
|
+
setFile: (file: {
|
|
7
|
+
href: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
}) => ReturnType;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** "https://example.com/files/report.pdf?x=1" → "report.pdf" */
|
|
14
|
+
export declare function fileNameFromUrl(href: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* File link block: `<a data-type="file" href="…">name</a>`, same as v-richtext 2.x.
|
|
17
|
+
*/
|
|
18
|
+
export declare const FileNode: Node<any, any>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Extension } from "@tiptap/core";
|
|
2
|
+
declare module "@tiptap/core" {
|
|
3
|
+
interface Commands<ReturnType> {
|
|
4
|
+
headingId: {
|
|
5
|
+
/** Sets the `id` (anchor) of the heading at the cursor; empty removes it */
|
|
6
|
+
setHeadingId: (id: string | null) => ReturnType;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* `id` on headings, e.g. `<h2 id="contact">`, so pages can link to them
|
|
12
|
+
* (`#contact`). Kept when content is loaded and saved.
|
|
13
|
+
*/
|
|
14
|
+
export declare const HeadingId: Extension<any, any>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Extensions } from "@tiptap/core";
|
|
2
|
+
import type { MentionMenu } from "./mention-menu";
|
|
3
|
+
import type { RichtextMessages } from "@/locales";
|
|
4
|
+
import type { HeadingLevel, RichtextAction, RichtextExtensionName, RichtextOptions } from "../types";
|
|
5
|
+
/** Enabled without any options; `options.enabled` / `options.disabled` change this set */
|
|
6
|
+
export declare const DEFAULT_EXTENSIONS: RichtextExtensionName[];
|
|
7
|
+
export declare const DEFAULT_HEADING_LEVELS: HeadingLevel[];
|
|
8
|
+
/**
|
|
9
|
+
* Buttons that `options.hidden` can remove from the toolbar: their function
|
|
10
|
+
* stays available through Tiptap's shortcuts and input rules. Popover and menu
|
|
11
|
+
* buttons (link, image, table, …) aren't in here, because their shortcuts
|
|
12
|
+
* work by clicking the button. visibilityConditions is the exception: hiding
|
|
13
|
+
* its menu keeps existing condition blocks (and their previews) working, but
|
|
14
|
+
* no new ones can be added.
|
|
15
|
+
*/
|
|
16
|
+
export declare const HIDEABLE_BUTTONS: Set<RichtextExtensionName>;
|
|
17
|
+
/** Enabled extensions whose toolbar button is hidden (`options.hidden`) */
|
|
18
|
+
export declare function resolveHiddenButtons(options: RichtextOptions | undefined, enabled: Set<RichtextExtensionName>): Set<RichtextExtensionName>;
|
|
19
|
+
/**
|
|
20
|
+
* The extensions to load: the defaults, plus `enabled`, plus character count,
|
|
21
|
+
* mentions and visibility conditions when their options are set, minus `disabled`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveExtensions(options?: RichtextOptions): Set<RichtextExtensionName>;
|
|
24
|
+
export interface ExtensionContext {
|
|
25
|
+
placeholder: () => string;
|
|
26
|
+
mentionMenu: MentionMenu | null;
|
|
27
|
+
getMentionPreviews: () => Record<string, unknown>;
|
|
28
|
+
onAction: (action: RichtextAction) => void;
|
|
29
|
+
/** For dropped and pasted files */
|
|
30
|
+
uploadFile: (file: File, type: "file" | "image") => Promise<string>;
|
|
31
|
+
/** Whether task checkboxes can be toggled while the editor is read-only */
|
|
32
|
+
canCheckTasksReadonly: () => boolean;
|
|
33
|
+
/** Texts in the editor's locale */
|
|
34
|
+
messages: () => RichtextMessages;
|
|
35
|
+
}
|
|
36
|
+
export declare function buildExtensions(enabled: Set<RichtextExtensionName>, options: RichtextOptions, context: ExtensionContext): Extensions;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiptap's link, with a `target` that survives a round trip. Tiptap reads a
|
|
3
|
+
* link without `target` back as its default `_blank`, so a link set to open in
|
|
4
|
+
* the same tab would come back opening in a new one. Here links keep
|
|
5
|
+
* `target="_blank"` as the default, same-tab links store `target="_self"`, and
|
|
6
|
+
* links without a target (from pasted or old content) open in the same tab.
|
|
7
|
+
*/
|
|
8
|
+
export declare const Link: import("@tiptap/core").Mark<import("@tiptap/extension-link").LinkOptions, any>;
|
package/dist/types/richtext-vue/src/components/input-richtext/extensions/media-attributes.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NodeConfig } from "@tiptap/core";
|
|
2
|
+
/**
|
|
3
|
+
* Adds the size/float/loading attributes that p5 content stores on images and
|
|
4
|
+
* YouTube embeds, so they survive a round trip through the editor. Size and
|
|
5
|
+
* float are also read from the classes of Blixem's older editor
|
|
6
|
+
* (`custom-image-small custom-image-float-left`), and written as attributes.
|
|
7
|
+
*/
|
|
8
|
+
export declare const mediaAttributes: Partial<NodeConfig>;
|