CLASSROOMIO-T-128: TinyMCE Editor Test
CLASSROOMIO-T-128: TinyMCE Integration Merge branch 'main' into CLASSROOMIO-T-128 CLASSROOMIO-T-128: Resolved Fixes CLASSROOMIO-T-128: Ts Errors CLASSROOMIO-T-128: Resolved Feedbacks CLASSROOMIO-T-128: Replace Quill with tinyMCE CLASSROOMIO-T-128: Compare Editors CLASSROOMIO-T-128: TinyMCE Editor Test Co-authored-by: Rotimi Best <[email protected]> Co-authored-by: Tunji Adeyemi <[email protected]> Merge-request: CLASSROOMIO-MR-62 Merged-by: Best Admin <[email protected]>
This commit is contained in:
committed by
Space Cloud
co-authored by
Rotimi Best
parent
0200bc46ac
commit
75479e9719
+1
-2
@@ -23,6 +23,7 @@
|
|||||||
"@sveltejs/adapter-auto": "^2.1.0",
|
"@sveltejs/adapter-auto": "^2.1.0",
|
||||||
"@sveltejs/adapter-netlify": "^2.0.8",
|
"@sveltejs/adapter-netlify": "^2.0.8",
|
||||||
"@tailwindcss/forms": "^0.5.4",
|
"@tailwindcss/forms": "^0.5.4",
|
||||||
|
"@tinymce/tinymce-svelte": "^1.0.1",
|
||||||
"@types/marked": "^5.0.1",
|
"@types/marked": "^5.0.1",
|
||||||
"@types/paystack": "^2.0.1",
|
"@types/paystack": "^2.0.1",
|
||||||
"@types/pluralize": "0.0.30",
|
"@types/pluralize": "0.0.30",
|
||||||
@@ -31,7 +32,6 @@
|
|||||||
"axios": "^1.4.0",
|
"axios": "^1.4.0",
|
||||||
"body-parser": "^1.20.2",
|
"body-parser": "^1.20.2",
|
||||||
"canvas-confetti": "^1.6.0",
|
"canvas-confetti": "^1.6.0",
|
||||||
"cl-editor": "^2.3.0",
|
|
||||||
"cookie-parser": "^1.4.6",
|
"cookie-parser": "^1.4.6",
|
||||||
"copy-to-clipboard": "^3.3.3",
|
"copy-to-clipboard": "^3.3.3",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.0",
|
||||||
@@ -42,7 +42,6 @@
|
|||||||
"netlify": "^13.1.10",
|
"netlify": "^13.1.10",
|
||||||
"openai-edge": "^1.2.2",
|
"openai-edge": "^1.2.2",
|
||||||
"pluralize": "^8.0.0",
|
"pluralize": "^8.0.0",
|
||||||
"quill": "^1.3.7",
|
|
||||||
"sirv": "^2.0.3",
|
"sirv": "^2.0.3",
|
||||||
"svelte-email": "^0.0.4",
|
"svelte-email": "^0.0.4",
|
||||||
"wait-on": "^7.0.1",
|
"wait-on": "^7.0.1",
|
||||||
|
|||||||
+50
-42
@@ -1,52 +1,60 @@
|
|||||||
<!doctype html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||||
|
<meta name="theme-color" content="#333333" />
|
||||||
|
|
||||||
<head>
|
<!-- <link rel="stylesheet" href="global.css"> -->
|
||||||
<meta charset="utf-8">
|
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials" />
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
<link rel="icon" type="image/png" href="/favicon.ico" />
|
||||||
<meta name="theme-color" content="#333333">
|
<link rel="icon" type="image/png" sizes="32x32" href="/logo-32.png" />
|
||||||
|
<link rel="stylesheet" href="https://cdn.plyr.io/3.7.3/plyr.css" />
|
||||||
|
|
||||||
<title>ClassroomIO – The LMS with Superpowers</title>
|
<title>ClassroomIO – The LMS with Superpowers</title>
|
||||||
<meta name="description"
|
<meta
|
||||||
content="ClassroomIO provides AI-powered, easy-to-use tools that empowers educators build, automate and enrich learning experiences in and outside the classroom.">
|
name="description"
|
||||||
<meta name="theme-color" content="#ffffff">
|
content="ClassroomIO provides AI-powered, easy-to-use tools that empowers educators build, automate and enrich learning experiences in and outside the classroom."
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
/>
|
||||||
<meta property="og:title" content="ClassroomIO – The LMS with Superpowers">
|
<meta name="theme-color" content="#ffffff" />
|
||||||
<meta property="og:description"
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
content="ClassroomIO provides AI-powered, easy-to-use tools that empowers educators build, automate and enrich learning experiences in and outside the classroom.">
|
<meta property="og:title" content="ClassroomIO – The LMS with Superpowers" />
|
||||||
<meta property="og:type" content="website">
|
<meta
|
||||||
<meta property="og:image:type" content="image/png">
|
property="og:description"
|
||||||
<meta property="og:image:width" content="1640">
|
content="ClassroomIO provides AI-powered, easy-to-use tools that empowers educators build, automate and enrich learning experiences in and outside the classroom."
|
||||||
<meta property="og:image:height" content="924">
|
/>
|
||||||
<meta property="og:image:secure_url" content="https://app.classroomio.com/classroomio-opengraph-image.png">
|
<meta property="og:type" content="website" />
|
||||||
<meta name="twitter:card" content="summary_large_image">
|
<meta property="og:image:type" content="image/png" />
|
||||||
<meta name="twitter:creator" content="@rotimi_best">
|
<meta property="og:image:width" content="1640" />
|
||||||
<meta name="twitter:title" content="ClassroomIO – The LMS with Superpowers">
|
<meta property="og:image:height" content="924" />
|
||||||
<meta name="twitter:description"
|
<meta
|
||||||
content="ClassroomIO provides AI-powered, easy-to-use tools that empowers educators build, automate and enrich learning experiences in and outside the classroom.">
|
property="og:image:secure_url"
|
||||||
|
content="https://app.classroomio.com/classroomio-opengraph-image.png"
|
||||||
|
/>
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<meta name="twitter:creator" content="@rotimi_best" />
|
||||||
|
<meta name="twitter:title" content="ClassroomIO – The LMS with Superpowers" />
|
||||||
|
<meta
|
||||||
|
name="twitter:description"
|
||||||
|
content="ClassroomIO provides AI-powered, easy-to-use tools that empowers educators build, automate and enrich learning experiences in and outside the classroom."
|
||||||
|
/>
|
||||||
|
|
||||||
<!-- <link rel="stylesheet" href="global.css"> -->
|
<!-- <link rel="stylesheet" href="global.css"> -->
|
||||||
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
|
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials" />
|
||||||
<link rel="icon" type="image/png" href="/favicon.ico">
|
<link rel="icon" type="image/png" href="/favicon.ico" />
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/logo-32.png">
|
<link rel="icon" type="image/png" sizes="32x32" href="/logo-32.png" />
|
||||||
<link href="/css/quill.css" rel="stylesheet">
|
<link rel="stylesheet" href="https://cdn.plyr.io/3.7.3/plyr.css" />
|
||||||
<link rel="stylesheet" href="https://cdn.plyr.io/3.7.3/plyr.css" />
|
|
||||||
|
|
||||||
|
<!--Crisp Chat
|
||||||
<!--Crisp Chat
|
|
||||||
<script
|
<script
|
||||||
type="text/javascript">window.$crisp = []; window.CRISP_WEBSITE_ID = "2158dbf9-90d4-4e50-b962-e1d8a1a6deb7"; (function () { d = document; s = d.createElement("script"); s.src = "https://client.crisp.chat/l.js"; s.async = 1; d.getElementsByTagName("head")[0].appendChild(s); })();</script>
|
type="text/javascript">window.$crisp = []; window.CRISP_WEBSITE_ID = "2158dbf9-90d4-4e50-b962-e1d8a1a6deb7"; (function () { d = document; s = d.createElement("script"); s.src = "https://client.crisp.chat/l.js"; s.async = 1; d.getElementsByTagName("head")[0].appendChild(s); })();</script>
|
||||||
-->
|
-->
|
||||||
<script src="https://cdn.plyr.io/3.7.3/plyr.js">
|
<script src="https://cdn.plyr.io/3.7.3/plyr.js"></script>
|
||||||
</script>
|
|
||||||
|
|
||||||
%sveltekit.head%
|
%sveltekit.head%
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body data-sveltekit-preload-data="hover" class="">
|
<body data-sveltekit-preload-data="hover" class="">
|
||||||
<div style="display: contents">
|
<div style="display: contents">%sveltekit.body%</div>
|
||||||
%sveltekit.body%
|
</body>
|
||||||
</div>
|
</html>
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import isEmpty from 'lodash/isEmpty';
|
||||||
import { useCompletion } from 'ai/svelte';
|
import { useCompletion } from 'ai/svelte';
|
||||||
import MODES from '$lib/utils/constants/mode.js';
|
import MODES from '$lib/utils/constants/mode.js';
|
||||||
import TrashCanIcon from 'carbon-icons-svelte/lib/TrashCan.svelte';
|
import TrashCanIcon from 'carbon-icons-svelte/lib/TrashCan.svelte';
|
||||||
@@ -16,8 +17,6 @@
|
|||||||
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
||||||
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
|
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
|
||||||
import TextField from '$lib/components/Form/TextField.svelte';
|
import TextField from '$lib/components/Form/TextField.svelte';
|
||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
|
||||||
// import ClEditor from '$lib/components/ClEditor/index.svelte';
|
|
||||||
import {
|
import {
|
||||||
lesson,
|
lesson,
|
||||||
lessons,
|
lessons,
|
||||||
@@ -28,8 +27,8 @@
|
|||||||
} from '$lib/components/Course/components/Lesson/store/lessons';
|
} from '$lib/components/Course/components/Lesson/store/lessons';
|
||||||
import VideoUploader from '$lib/components/Course/components/Lesson/Materials/Video/Index.svelte';
|
import VideoUploader from '$lib/components/Course/components/Lesson/Materials/Video/Index.svelte';
|
||||||
import { course } from '$lib/components/Course/store';
|
import { course } from '$lib/components/Course/store';
|
||||||
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
import * as CONSTANTS from './constants';
|
import * as CONSTANTS from './constants';
|
||||||
import isEmpty from 'lodash/isEmpty';
|
|
||||||
|
|
||||||
export let mode = MODES.view;
|
export let mode = MODES.view;
|
||||||
export let prevMode = '';
|
export let prevMode = '';
|
||||||
@@ -41,7 +40,7 @@
|
|||||||
let tabs = CONSTANTS.tabs;
|
let tabs = CONSTANTS.tabs;
|
||||||
let currentTab = tabs[0].value;
|
let currentTab = tabs[0].value;
|
||||||
let errors = {};
|
let errors = {};
|
||||||
let textareaRef = {};
|
let editorWindowRef;
|
||||||
let aiButtonRef = {};
|
let aiButtonRef = {};
|
||||||
let openPopover = false;
|
let openPopover = false;
|
||||||
let player = null;
|
let player = null;
|
||||||
@@ -108,9 +107,10 @@
|
|||||||
|
|
||||||
function updateNoteByCompletion(completion) {
|
function updateNoteByCompletion(completion) {
|
||||||
$lesson.materials.note = completion;
|
$lesson.materials.note = completion;
|
||||||
if (textareaRef && textareaRef?.children?.[0]) {
|
if (editorWindowRef) {
|
||||||
let qlEditor = textareaRef?.children?.[0];
|
const tmceBody = editorWindowRef?.document?.querySelector('body');
|
||||||
qlEditor.scrollTop = qlEditor.scrollHeight;
|
|
||||||
|
editorWindowRef?.scrollTo(0, tmceBody?.scrollHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,13 +230,13 @@
|
|||||||
</PrimaryButton>
|
</PrimaryButton>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="h-[60vh]">
|
<div class="h-[60vh] mt-5">
|
||||||
<TextEditor
|
<TextEditor
|
||||||
bind:container={textareaRef}
|
bind:editorWindowRef
|
||||||
bind:content={$lesson.materials.note}
|
value={$lesson.materials.note}
|
||||||
onChange={(c) => ($lesson.materials.note = c)}
|
onChange={(html) => ($lesson.materials.note = html)}
|
||||||
|
placeholder="Write your lesson note here"
|
||||||
/>
|
/>
|
||||||
<!-- <ClEditor bind:html={$lesson.materials.note} /> -->
|
|
||||||
</div>
|
</div>
|
||||||
{:else if !isNoteEmpty($lesson.materials?.note)}
|
{:else if !isNoteEmpty($lesson.materials?.note)}
|
||||||
<article class="preview prose prose-sm sm:prose p-2">
|
<article class="preview prose prose-sm sm:prose p-2">
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
<script>
|
<script>
|
||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
|
||||||
import { marked } from 'marked';
|
import { marked } from 'marked';
|
||||||
import RoleBasedSecurity from '../RoleBasedSecurity/index.svelte';
|
import RoleBasedSecurity from '../RoleBasedSecurity/index.svelte';
|
||||||
import PageNav from '../PageNav/index.svelte';
|
import PageNav from '../PageNav/index.svelte';
|
||||||
import MODES from '$lib/utils/constants/mode';
|
import MODES from '$lib/utils/constants/mode';
|
||||||
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
||||||
import PageBody from '../PageBody/index.svelte';
|
import PageBody from '../PageBody/index.svelte';
|
||||||
import EditContent from '../EditContent/index.svelte';
|
|
||||||
import { course } from './store';
|
import { course } from './store';
|
||||||
import { updateCourse } from '$lib/utils/services/courses';
|
import { updateCourse } from '$lib/utils/services/courses';
|
||||||
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
|
|
||||||
let mode = MODES.view;
|
let mode = MODES.view;
|
||||||
let isDirty = false;
|
let isDirty = false;
|
||||||
@@ -43,11 +42,13 @@
|
|||||||
<PageBody width="max-w-3xl px-3">
|
<PageBody width="max-w-3xl px-3">
|
||||||
{#if mode === MODES.edit}
|
{#if mode === MODES.edit}
|
||||||
<TextEditor
|
<TextEditor
|
||||||
bind:content={$course.overview}
|
value={$course.overview}
|
||||||
onChange={(c) => {
|
onChange={(html) => {
|
||||||
$course.overview = c;
|
|
||||||
isDirty = true;
|
isDirty = true;
|
||||||
|
$course.overview = html;
|
||||||
}}
|
}}
|
||||||
|
placeholder="Write your overview here"
|
||||||
|
height="700"
|
||||||
/>
|
/>
|
||||||
{:else}
|
{:else}
|
||||||
<article class="preview prose prose-sm sm:prose p-2">
|
<article class="preview prose prose-sm sm:prose p-2">
|
||||||
|
|||||||
@@ -5,15 +5,14 @@
|
|||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
|
|
||||||
export let course;
|
export let course;
|
||||||
|
|
||||||
|
function handleChange(html) {
|
||||||
|
const _course = cloneDeep(course);
|
||||||
|
set(_course, 'metadata.description', html);
|
||||||
|
course = _course;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="h-2/5">
|
<div class="h-2/5">
|
||||||
<TextEditor
|
<TextEditor value={get(course, 'metadata.description')} onChange={handleChange} />
|
||||||
content={get(course, 'metadata.description')}
|
|
||||||
onChange={(html) => {
|
|
||||||
const _course = cloneDeep(course);
|
|
||||||
set(_course, 'metadata.description', html);
|
|
||||||
course = _course;
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,15 +5,14 @@
|
|||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
|
|
||||||
export let course;
|
export let course;
|
||||||
|
|
||||||
|
function handleChange(html) {
|
||||||
|
const _course = cloneDeep(course);
|
||||||
|
set(_course, 'metadata.goals', html);
|
||||||
|
course = _course;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="h-2/5">
|
<div class="h-2/5">
|
||||||
<TextEditor
|
<TextEditor value={get(course, 'metadata.goals')} onChange={handleChange} />
|
||||||
content={get(course, 'metadata.goals')}
|
|
||||||
onChange={(html) => {
|
|
||||||
const _course = cloneDeep(course);
|
|
||||||
set(_course, 'metadata.goals', html);
|
|
||||||
course = _course;
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
import get from 'lodash/get';
|
import get from 'lodash/get';
|
||||||
import isEmpty from 'lodash/isEmpty';
|
import isEmpty from 'lodash/isEmpty';
|
||||||
import { Toggle } from 'carbon-components-svelte';
|
import { Toggle } from 'carbon-components-svelte';
|
||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
|
||||||
import TextField from '$lib/components/Form/TextField.svelte';
|
import TextField from '$lib/components/Form/TextField.svelte';
|
||||||
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
|
|
||||||
export let course = {};
|
export let course = {};
|
||||||
|
|
||||||
@@ -34,6 +34,12 @@
|
|||||||
course = _course;
|
course = _course;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handleChange(html) {
|
||||||
|
const _course = cloneDeep(course);
|
||||||
|
set(_course, 'metadata.reward.description', html);
|
||||||
|
course = _course;
|
||||||
|
}
|
||||||
|
|
||||||
$: setter(showDiscount, 'metadata.showDiscount');
|
$: setter(showDiscount, 'metadata.showDiscount');
|
||||||
$: setter(discount, 'metadata.discount');
|
$: setter(discount, 'metadata.discount');
|
||||||
$: setter(giftToggled, 'metadata.reward.show');
|
$: setter(giftToggled, 'metadata.reward.show');
|
||||||
@@ -88,13 +94,6 @@
|
|||||||
<p class="dark:text-white font-bold mt-5">About Gift</p>
|
<p class="dark:text-white font-bold mt-5">About Gift</p>
|
||||||
|
|
||||||
<div class="h-2/5">
|
<div class="h-2/5">
|
||||||
<TextEditor
|
<TextEditor value={get(course, 'metadata.reward.description')} onChange={handleChange} />
|
||||||
content={get(course, 'metadata.reward.description')}
|
|
||||||
onChange={(html) => {
|
|
||||||
const _course = cloneDeep(course);
|
|
||||||
set(_course, 'metadata.reward.description', html);
|
|
||||||
course = _course;
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -5,15 +5,14 @@
|
|||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
|
|
||||||
export let course;
|
export let course;
|
||||||
|
|
||||||
|
function handleChange(html) {
|
||||||
|
const _course = cloneDeep(course);
|
||||||
|
set(_course, 'metadata.requirements', html);
|
||||||
|
course = _course;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="h-2/5">
|
<div class="h-2/5">
|
||||||
<TextEditor
|
<TextEditor value={get(course, 'metadata.requirements')} onChange={handleChange} />
|
||||||
content={get(course, 'metadata.requirements')}
|
|
||||||
onChange={(html) => {
|
|
||||||
const _course = cloneDeep(course);
|
|
||||||
set(_course, 'metadata.requirements', html);
|
|
||||||
course = _course;
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,130 +1,41 @@
|
|||||||
<script>
|
<script>
|
||||||
import { onMount } from 'svelte';
|
import { PUBLIC_TINYMCE_API_KEY } from '$env/static/public';
|
||||||
|
import Editor from '@tinymce/tinymce-svelte';
|
||||||
|
|
||||||
export let onChange;
|
export let value;
|
||||||
export let content;
|
export let onChange = (html = '') => {};
|
||||||
export let disable;
|
export let height = 300;
|
||||||
export let docId;
|
export let placeholder = '';
|
||||||
export let placeholder = 'Type something...';
|
export let editorWindowRef;
|
||||||
export let errorMessage;
|
|
||||||
export let container;
|
|
||||||
|
|
||||||
const settings = {
|
const apiKey = PUBLIC_TINYMCE_API_KEY;
|
||||||
modules: {
|
|
||||||
toolbar: {
|
// editor configuration
|
||||||
modules: {
|
let conf = {
|
||||||
syntax: true,
|
plugins: 'lists',
|
||||||
toolbar: [
|
toolbar: [
|
||||||
[{ header: [1, 2, 3, false] }],
|
{ name: 'history', items: ['undo', 'redo'] },
|
||||||
['bold', 'italic', 'underline', 'strike'],
|
{ name: 'styles', items: ['styles'] },
|
||||||
['link', 'code-block']
|
{ name: 'formatting', items: ['bold', 'italic'] },
|
||||||
]
|
{ name: 'alignment', items: ['alignleft', 'aligncenter', 'alignright', 'alignjustify'] },
|
||||||
},
|
{ name: 'indentation', items: ['outdent', 'indent'] },
|
||||||
placeholder: 'Type something...',
|
{ name: 'list', items: ['numlist', 'bullist'] }
|
||||||
theme: 'snow'
|
],
|
||||||
}
|
lists_indent_on_tab: false,
|
||||||
},
|
min_height: height,
|
||||||
theme: 'snow',
|
placeholder: placeholder,
|
||||||
placeholder
|
init_instance_callback: function (editor) {
|
||||||
|
editorWindowRef = editor.iframeElement?.contentWindow;
|
||||||
|
editor.on('Input', function (e) {
|
||||||
|
const html = editor.getContent();
|
||||||
|
if (onChange) {
|
||||||
|
onChange(html);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let quill = null;
|
|
||||||
let isUserTyping = false;
|
|
||||||
|
|
||||||
function resetContent(docId) {
|
|
||||||
if (quill && quill.setText) {
|
|
||||||
if (content) {
|
|
||||||
quill.setContents(JSON.parse(content));
|
|
||||||
} else {
|
|
||||||
quill.setText('');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function setQuillHTML(html) {
|
|
||||||
if (quill) {
|
|
||||||
quill.setHTML(html);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onMount(async () => {
|
|
||||||
const { default: Quill } = await import('quill');
|
|
||||||
|
|
||||||
Quill.prototype.getHTML = function () {
|
|
||||||
return this.container.querySelector('.ql-editor').innerHTML;
|
|
||||||
};
|
|
||||||
|
|
||||||
Quill.prototype.setHTML = function (html) {
|
|
||||||
this.container.querySelector('.ql-editor').innerHTML = html;
|
|
||||||
};
|
|
||||||
|
|
||||||
quill = new Quill(container, settings);
|
|
||||||
|
|
||||||
quill.setHTML(content || '');
|
|
||||||
|
|
||||||
quill.on('text-change', function () {
|
|
||||||
onChange(quill.getHTML());
|
|
||||||
});
|
|
||||||
quill.getModule('toolbar').container.addEventListener('mousedown', (e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
isUserTyping = true;
|
|
||||||
});
|
|
||||||
quill.root.addEventListener('focus', () => {
|
|
||||||
isUserTyping = true;
|
|
||||||
});
|
|
||||||
quill.root.addEventListener('blur', () => {
|
|
||||||
isUserTyping = false;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
$: {
|
|
||||||
if (quill && quill.setText) {
|
|
||||||
if (disable) {
|
|
||||||
quill.disable(disable);
|
|
||||||
} else {
|
|
||||||
quill.enable(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$: if (!isUserTyping) {
|
|
||||||
setQuillHTML(content);
|
|
||||||
}
|
|
||||||
|
|
||||||
$: resetContent(docId);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="p-2 w-full h-full">
|
<div>
|
||||||
<div bind:this={container} />
|
<Editor onIni {value} {apiKey} {conf} />
|
||||||
{#if errorMessage}
|
|
||||||
<p class="dark:text-white text-red-500 text-sm">
|
|
||||||
{errorMessage}
|
|
||||||
</p>
|
|
||||||
{/if}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
|
||||||
:global(.dark .ql-stroke) {
|
|
||||||
stroke: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(.dark .ql-snow .ql-picker) {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(.dark .ql-editor.ql-blank::before) {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(.ql-editor) {
|
|
||||||
white-space: normal !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:global(.ql-editor p),
|
|
||||||
:global(.ql-editor h1),
|
|
||||||
:global(.ql-editor h2),
|
|
||||||
:global(.ql-editor h3),
|
|
||||||
:global(.ql-editor h4) {
|
|
||||||
line-height: 2.2;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
import Vote from '$lib/components/Vote/index.svelte';
|
import Vote from '$lib/components/Vote/index.svelte';
|
||||||
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
||||||
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
|
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
|
||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
|
||||||
import Avatar from '$lib/components/Avatar/index.svelte';
|
import Avatar from '$lib/components/Avatar/index.svelte';
|
||||||
import IconButton from '$lib/components/IconButton/index.svelte';
|
import IconButton from '$lib/components/IconButton/index.svelte';
|
||||||
import CheckmarkOutlineIcon from 'carbon-icons-svelte/lib/CheckmarkOutline.svelte';
|
import CheckmarkOutlineIcon from 'carbon-icons-svelte/lib/CheckmarkOutline.svelte';
|
||||||
@@ -25,6 +24,7 @@
|
|||||||
import { snackbarStore } from '$lib/components/Snackbar/store';
|
import { snackbarStore } from '$lib/components/Snackbar/store';
|
||||||
import TextField from '$lib/components/Form/TextField.svelte';
|
import TextField from '$lib/components/Form/TextField.svelte';
|
||||||
import DeleteCommentModal from '$lib/components/Org/Community/DeleteCommentModal.svelte';
|
import DeleteCommentModal from '$lib/components/Org/Community/DeleteCommentModal.svelte';
|
||||||
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
|
|
||||||
dayjs.extend(relativeTime);
|
dayjs.extend(relativeTime);
|
||||||
|
|
||||||
@@ -47,6 +47,8 @@
|
|||||||
body: ''
|
body: ''
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let editorInstance = false;
|
||||||
|
|
||||||
function mapResToQuestion(data) {
|
function mapResToQuestion(data) {
|
||||||
return {
|
return {
|
||||||
id: data.id,
|
id: data.id,
|
||||||
@@ -211,6 +213,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
isEditMode = !isEditMode;
|
isEditMode = !isEditMode;
|
||||||
|
editorInstance = !editorInstance;
|
||||||
|
|
||||||
if (!isEditMode) {
|
if (!isEditMode) {
|
||||||
const fields = { title: editContent.title, body: editContent.body };
|
const fields = { title: editContent.title, body: editContent.body };
|
||||||
@@ -334,14 +337,12 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
{#if isEditMode}
|
{#if isEditMode && editorInstance}
|
||||||
<div class="my-2">
|
<div class="my-2">
|
||||||
<TextEditor
|
<TextEditor
|
||||||
content={question.body}
|
bind:value={editContent.body}
|
||||||
onChange={(c) => (editContent.body = c)}
|
placeholder="Give an answer"
|
||||||
placeholder="Update question"
|
onChange={(html) => (editContent.body = html)}
|
||||||
errorMessage={errors.body}
|
|
||||||
docId={resetInput}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
@@ -398,12 +399,13 @@
|
|||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<TextEditor
|
{#if !editorInstance}
|
||||||
onChange={(c) => (comment = c)}
|
<TextEditor
|
||||||
placeholder="Give an answer"
|
bind:value={comment}
|
||||||
errorMessage={errors.comment}
|
placeholder="Give an answer"
|
||||||
docId={resetInput}
|
onChange={(html) => (comment = html)}
|
||||||
/>
|
/>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<div class="flex justify-end mr-2">
|
<div class="flex justify-end mr-2">
|
||||||
<PrimaryButton label="Comment" onClick={submitComment} />
|
<PrimaryButton label="Comment" onClick={submitComment} />
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import ArrowLeftIcon from 'carbon-icons-svelte/lib/ArrowLeft.svelte';
|
import ArrowLeftIcon from 'carbon-icons-svelte/lib/ArrowLeft.svelte';
|
||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
|
||||||
import { currentOrg } from '$lib/utils/store/org';
|
import { currentOrg } from '$lib/utils/store/org';
|
||||||
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
||||||
import { askCommunityValidation } from '$lib/utils/functions/validator';
|
import { askCommunityValidation } from '$lib/utils/functions/validator';
|
||||||
@@ -9,6 +8,7 @@
|
|||||||
import { SNACKBAR_SEVERITY } from '$lib/components/Snackbar/constants';
|
import { SNACKBAR_SEVERITY } from '$lib/components/Snackbar/constants';
|
||||||
import { snackbarStore } from '$lib/components/Snackbar/store';
|
import { snackbarStore } from '$lib/components/Snackbar/store';
|
||||||
import generateSlug from '$lib/utils/functions/generateSlug';
|
import generateSlug from '$lib/utils/functions/generateSlug';
|
||||||
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
|
|
||||||
let errors = {};
|
let errors = {};
|
||||||
let fields = {
|
let fields = {
|
||||||
@@ -87,8 +87,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<TextEditor
|
<TextEditor
|
||||||
onChange={(v) => (fields.body = v)}
|
bind:value={fields.body}
|
||||||
placeholder="Ask the community any question you might have"
|
placeholder="Ask the community any question you might have"
|
||||||
errorMessage={errors.body}
|
onChange={(html) => (fields.body = html)}
|
||||||
/>
|
/>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
import Vote from '$lib/components/Vote/index.svelte';
|
import Vote from '$lib/components/Vote/index.svelte';
|
||||||
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
||||||
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
|
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
|
||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
|
||||||
import Avatar from '$lib/components/Avatar/index.svelte';
|
import Avatar from '$lib/components/Avatar/index.svelte';
|
||||||
import IconButton from '$lib/components/IconButton/index.svelte';
|
import IconButton from '$lib/components/IconButton/index.svelte';
|
||||||
import CheckmarkOutlineIcon from 'carbon-icons-svelte/lib/CheckmarkOutline.svelte';
|
import CheckmarkOutlineIcon from 'carbon-icons-svelte/lib/CheckmarkOutline.svelte';
|
||||||
@@ -24,6 +23,7 @@
|
|||||||
import { snackbarStore } from '$lib/components/Snackbar/store';
|
import { snackbarStore } from '$lib/components/Snackbar/store';
|
||||||
import TextField from '$lib/components/Form/TextField.svelte';
|
import TextField from '$lib/components/Form/TextField.svelte';
|
||||||
import DeleteCommentModal from '$lib/components/Org/Community/DeleteCommentModal.svelte';
|
import DeleteCommentModal from '$lib/components/Org/Community/DeleteCommentModal.svelte';
|
||||||
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
|
|
||||||
dayjs.extend(relativeTime);
|
dayjs.extend(relativeTime);
|
||||||
|
|
||||||
@@ -46,6 +46,8 @@
|
|||||||
body: ''
|
body: ''
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let editorInstance = false;
|
||||||
|
|
||||||
function mapResToQuestion(data) {
|
function mapResToQuestion(data) {
|
||||||
return {
|
return {
|
||||||
id: data.id,
|
id: data.id,
|
||||||
@@ -210,6 +212,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
isEditMode = !isEditMode;
|
isEditMode = !isEditMode;
|
||||||
|
editorInstance = !editorInstance;
|
||||||
|
|
||||||
if (!isEditMode) {
|
if (!isEditMode) {
|
||||||
const fields = { title: editContent.title, body: editContent.body };
|
const fields = { title: editContent.title, body: editContent.body };
|
||||||
@@ -336,14 +339,12 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
{#if isEditMode}
|
{#if isEditMode && editorInstance}
|
||||||
<div class="my-2">
|
<div class="my-2">
|
||||||
<TextEditor
|
<TextEditor
|
||||||
content={question.body}
|
bind:value={editContent.body}
|
||||||
onChange={(c) => (editContent.body = c)}
|
placeholder="Give an answer"
|
||||||
placeholder="Update question"
|
onChange={(html) => (editContent.body = html)}
|
||||||
errorMessage={errors.body}
|
|
||||||
docId={resetInput}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
@@ -400,12 +401,13 @@
|
|||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<TextEditor
|
{#if !editorInstance}
|
||||||
onChange={(c) => (comment = c)}
|
<TextEditor
|
||||||
placeholder="Give an answer"
|
bind:value={comment}
|
||||||
errorMessage={errors.comment}
|
placeholder="Give an answer"
|
||||||
docId={resetInput}
|
onChange={(html) => (comment = html)}
|
||||||
/>
|
/>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<div class="flex justify-end mr-2">
|
<div class="flex justify-end mr-2">
|
||||||
<PrimaryButton label="Comment" onClick={submitComment} />
|
<PrimaryButton label="Comment" onClick={submitComment} />
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import ArrowLeftIcon from 'carbon-icons-svelte/lib/ArrowLeft.svelte';
|
import ArrowLeftIcon from 'carbon-icons-svelte/lib/ArrowLeft.svelte';
|
||||||
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
|
||||||
import { currentOrgPath, currentOrg } from '$lib/utils/store/org';
|
import { currentOrgPath, currentOrg } from '$lib/utils/store/org';
|
||||||
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
||||||
import { askCommunityValidation } from '$lib/utils/functions/validator';
|
import { askCommunityValidation } from '$lib/utils/functions/validator';
|
||||||
@@ -9,6 +8,7 @@
|
|||||||
import { SNACKBAR_SEVERITY } from '$lib/components/Snackbar/constants';
|
import { SNACKBAR_SEVERITY } from '$lib/components/Snackbar/constants';
|
||||||
import { snackbarStore } from '$lib/components/Snackbar/store';
|
import { snackbarStore } from '$lib/components/Snackbar/store';
|
||||||
import generateSlug from '$lib/utils/functions/generateSlug';
|
import generateSlug from '$lib/utils/functions/generateSlug';
|
||||||
|
import TextEditor from '$lib/components/TextEditor/index.svelte';
|
||||||
|
|
||||||
let errors = {};
|
let errors = {};
|
||||||
let fields = {
|
let fields = {
|
||||||
@@ -90,8 +90,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<TextEditor
|
<TextEditor
|
||||||
onChange={(v) => (fields.body = v)}
|
bind:value={fields.body}
|
||||||
placeholder="Ask the community any question you might have"
|
placeholder="Ask the community any question you might have"
|
||||||
errorMessage={errors.body}
|
onChange={(html) => (fields.body = html)}
|
||||||
/>
|
/>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -1,957 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Quill Editor v1.3.6
|
|
||||||
* https://quilljs.com/
|
|
||||||
* Copyright (c) 2014, Jason Chen
|
|
||||||
* Copyright (c) 2013, salesforce.com
|
|
||||||
*/
|
|
||||||
.ql-container {
|
|
||||||
box-sizing: border-box;
|
|
||||||
font-family: Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 13px;
|
|
||||||
height: 100%;
|
|
||||||
margin: 0px;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.ql-container.ql-disabled .ql-tooltip {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.ql-clipboard {
|
|
||||||
left: -100000px;
|
|
||||||
height: 1px;
|
|
||||||
overflow-y: hidden;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
}
|
|
||||||
.ql-clipboard p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.ql-editor {
|
|
||||||
box-sizing: border-box;
|
|
||||||
line-height: 1.42;
|
|
||||||
height: 100%;
|
|
||||||
outline: none;
|
|
||||||
overflow-y: auto;
|
|
||||||
padding: 12px 15px;
|
|
||||||
tab-size: 4;
|
|
||||||
-moz-tab-size: 4;
|
|
||||||
text-align: left;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
.ql-editor > * {
|
|
||||||
cursor: text;
|
|
||||||
}
|
|
||||||
.ql-editor p,
|
|
||||||
.ql-editor ol,
|
|
||||||
.ql-editor ul,
|
|
||||||
.ql-editor pre,
|
|
||||||
.ql-editor blockquote,
|
|
||||||
.ql-editor h1,
|
|
||||||
.ql-editor h2,
|
|
||||||
.ql-editor h3,
|
|
||||||
.ql-editor h4,
|
|
||||||
.ql-editor h5,
|
|
||||||
.ql-editor h6 {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol,
|
|
||||||
.ql-editor ul {
|
|
||||||
padding-left: 1.5em;
|
|
||||||
}
|
|
||||||
.ql-editor ol > li,
|
|
||||||
.ql-editor ul > li {
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
.ql-editor ul > li::before {
|
|
||||||
content: '\2022';
|
|
||||||
}
|
|
||||||
.ql-editor ul[data-checked='true'],
|
|
||||||
.ql-editor ul[data-checked='false'] {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.ql-editor ul[data-checked='true'] > li *,
|
|
||||||
.ql-editor ul[data-checked='false'] > li * {
|
|
||||||
pointer-events: all;
|
|
||||||
}
|
|
||||||
.ql-editor ul[data-checked='true'] > li::before,
|
|
||||||
.ql-editor ul[data-checked='false'] > li::before {
|
|
||||||
color: #777;
|
|
||||||
cursor: pointer;
|
|
||||||
pointer-events: all;
|
|
||||||
}
|
|
||||||
.ql-editor ul[data-checked='true'] > li::before {
|
|
||||||
content: '\2611';
|
|
||||||
}
|
|
||||||
.ql-editor ul[data-checked='false'] > li::before {
|
|
||||||
content: '\2610';
|
|
||||||
}
|
|
||||||
.ql-editor li::before {
|
|
||||||
display: inline-block;
|
|
||||||
white-space: nowrap;
|
|
||||||
width: 1.2em;
|
|
||||||
}
|
|
||||||
.ql-editor li:not(.ql-direction-rtl)::before {
|
|
||||||
margin-left: -1.5em;
|
|
||||||
margin-right: 0.3em;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-direction-rtl::before {
|
|
||||||
margin-left: 0.3em;
|
|
||||||
margin-right: -1.5em;
|
|
||||||
}
|
|
||||||
.ql-editor ol li:not(.ql-direction-rtl),
|
|
||||||
.ql-editor ul li:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 1.5em;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-direction-rtl,
|
|
||||||
.ql-editor ul li.ql-direction-rtl {
|
|
||||||
padding-right: 1.5em;
|
|
||||||
}
|
|
||||||
.ql-editor ol li {
|
|
||||||
counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
|
|
||||||
counter-increment: list-0;
|
|
||||||
}
|
|
||||||
.ql-editor ol li:before {
|
|
||||||
content: counter(list-0, decimal) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-1 {
|
|
||||||
counter-increment: list-1;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-1:before {
|
|
||||||
content: counter(list-1, lower-alpha) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-1 {
|
|
||||||
counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-2 {
|
|
||||||
counter-increment: list-2;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-2:before {
|
|
||||||
content: counter(list-2, lower-roman) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-2 {
|
|
||||||
counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-3 {
|
|
||||||
counter-increment: list-3;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-3:before {
|
|
||||||
content: counter(list-3, decimal) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-3 {
|
|
||||||
counter-reset: list-4 list-5 list-6 list-7 list-8 list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-4 {
|
|
||||||
counter-increment: list-4;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-4:before {
|
|
||||||
content: counter(list-4, lower-alpha) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-4 {
|
|
||||||
counter-reset: list-5 list-6 list-7 list-8 list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-5 {
|
|
||||||
counter-increment: list-5;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-5:before {
|
|
||||||
content: counter(list-5, lower-roman) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-5 {
|
|
||||||
counter-reset: list-6 list-7 list-8 list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-6 {
|
|
||||||
counter-increment: list-6;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-6:before {
|
|
||||||
content: counter(list-6, decimal) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-6 {
|
|
||||||
counter-reset: list-7 list-8 list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-7 {
|
|
||||||
counter-increment: list-7;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-7:before {
|
|
||||||
content: counter(list-7, lower-alpha) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-7 {
|
|
||||||
counter-reset: list-8 list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-8 {
|
|
||||||
counter-increment: list-8;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-8:before {
|
|
||||||
content: counter(list-8, lower-roman) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-8 {
|
|
||||||
counter-reset: list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-9 {
|
|
||||||
counter-increment: list-9;
|
|
||||||
}
|
|
||||||
.ql-editor ol li.ql-indent-9:before {
|
|
||||||
content: counter(list-9, decimal) '. ';
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-1:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 3em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-1:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 4.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 3em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 4.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-2:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 6em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-2:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 7.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 6em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 7.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-3:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 9em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-3:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 10.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 9em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 10.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-4:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 12em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-4:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 13.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 12em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 13.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-5:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 15em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-5:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 16.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 15em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 16.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-6:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 18em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-6:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 19.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 18em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 19.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-7:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 21em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-7:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 22.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 21em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 22.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-8:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 24em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-8:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 25.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 24em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 25.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-9:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 27em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-9:not(.ql-direction-rtl) {
|
|
||||||
padding-left: 28.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 27em;
|
|
||||||
}
|
|
||||||
.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right {
|
|
||||||
padding-right: 28.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-video {
|
|
||||||
display: block;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-video.ql-align-center {
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-video.ql-align-right {
|
|
||||||
margin: 0 0 0 auto;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-bg-black {
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-bg-red {
|
|
||||||
background-color: #e60000;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-bg-orange {
|
|
||||||
background-color: #f90;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-bg-yellow {
|
|
||||||
background-color: #ff0;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-bg-green {
|
|
||||||
background-color: #008a00;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-bg-blue {
|
|
||||||
background-color: #06c;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-bg-purple {
|
|
||||||
background-color: #93f;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-color-white {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-color-red {
|
|
||||||
color: #e60000;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-color-orange {
|
|
||||||
color: #f90;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-color-yellow {
|
|
||||||
color: #ff0;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-color-green {
|
|
||||||
color: #008a00;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-color-blue {
|
|
||||||
color: #06c;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-color-purple {
|
|
||||||
color: #93f;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-font-serif {
|
|
||||||
font-family: Georgia, Times New Roman, serif;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-font-monospace {
|
|
||||||
font-family: Monaco, Courier New, monospace;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-size-small {
|
|
||||||
font-size: 0.75em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-size-large {
|
|
||||||
font-size: 1.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-size-huge {
|
|
||||||
font-size: 2.5em;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-direction-rtl {
|
|
||||||
direction: rtl;
|
|
||||||
text-align: inherit;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-align-center {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-align-justify {
|
|
||||||
text-align: justify;
|
|
||||||
}
|
|
||||||
.ql-editor .ql-align-right {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
.ql-editor.ql-blank::before {
|
|
||||||
color: rgba(0, 0, 0, 0.6);
|
|
||||||
content: attr(data-placeholder);
|
|
||||||
font-style: italic;
|
|
||||||
left: 15px;
|
|
||||||
pointer-events: none;
|
|
||||||
position: absolute;
|
|
||||||
right: 15px;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar:after,
|
|
||||||
.ql-snow .ql-toolbar:after {
|
|
||||||
clear: both;
|
|
||||||
content: '';
|
|
||||||
display: table;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar button,
|
|
||||||
.ql-snow .ql-toolbar button {
|
|
||||||
background: none;
|
|
||||||
border: none;
|
|
||||||
cursor: pointer;
|
|
||||||
display: inline-block;
|
|
||||||
float: left;
|
|
||||||
height: 24px;
|
|
||||||
padding: 3px 5px;
|
|
||||||
width: 28px;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar button svg,
|
|
||||||
.ql-snow .ql-toolbar button svg {
|
|
||||||
float: left;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar button:active:hover,
|
|
||||||
.ql-snow .ql-toolbar button:active:hover {
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar input.ql-image[type='file'],
|
|
||||||
.ql-snow .ql-toolbar input.ql-image[type='file'] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar button:hover,
|
|
||||||
.ql-snow .ql-toolbar button:hover,
|
|
||||||
.ql-snow.ql-toolbar button:focus,
|
|
||||||
.ql-snow .ql-toolbar button:focus,
|
|
||||||
.ql-snow.ql-toolbar button.ql-active,
|
|
||||||
.ql-snow .ql-toolbar button.ql-active,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label:hover,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label:hover,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label.ql-active,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label.ql-active,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item:hover,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item:hover,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item.ql-selected,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item.ql-selected {
|
|
||||||
color: #06c;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar button:hover .ql-fill,
|
|
||||||
.ql-snow .ql-toolbar button:hover .ql-fill,
|
|
||||||
.ql-snow.ql-toolbar button:focus .ql-fill,
|
|
||||||
.ql-snow .ql-toolbar button:focus .ql-fill,
|
|
||||||
.ql-snow.ql-toolbar button.ql-active .ql-fill,
|
|
||||||
.ql-snow .ql-toolbar button.ql-active .ql-fill,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,
|
|
||||||
.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,
|
|
||||||
.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,
|
|
||||||
.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,
|
|
||||||
.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,
|
|
||||||
.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,
|
|
||||||
.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill {
|
|
||||||
fill: #06c;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar button:hover .ql-stroke,
|
|
||||||
.ql-snow .ql-toolbar button:hover .ql-stroke,
|
|
||||||
.ql-snow.ql-toolbar button:focus .ql-stroke,
|
|
||||||
.ql-snow .ql-toolbar button:focus .ql-stroke,
|
|
||||||
.ql-snow.ql-toolbar button.ql-active .ql-stroke,
|
|
||||||
.ql-snow .ql-toolbar button.ql-active .ql-stroke,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
|
|
||||||
.ql-snow.ql-toolbar button:hover .ql-stroke-miter,
|
|
||||||
.ql-snow .ql-toolbar button:hover .ql-stroke-miter,
|
|
||||||
.ql-snow.ql-toolbar button:focus .ql-stroke-miter,
|
|
||||||
.ql-snow .ql-toolbar button:focus .ql-stroke-miter,
|
|
||||||
.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,
|
|
||||||
.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
|
|
||||||
.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,
|
|
||||||
.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter {
|
|
||||||
stroke: #06c;
|
|
||||||
}
|
|
||||||
@media (pointer: coarse) {
|
|
||||||
.ql-snow.ql-toolbar button:hover:not(.ql-active),
|
|
||||||
.ql-snow .ql-toolbar button:hover:not(.ql-active) {
|
|
||||||
color: #444;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,
|
|
||||||
.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,
|
|
||||||
.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,
|
|
||||||
.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill {
|
|
||||||
fill: #444;
|
|
||||||
}
|
|
||||||
.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,
|
|
||||||
.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,
|
|
||||||
.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,
|
|
||||||
.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter {
|
|
||||||
stroke: #444;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.ql-snow {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.ql-snow * {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-hidden {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-out-bottom,
|
|
||||||
.ql-snow .ql-out-top {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip {
|
|
||||||
position: absolute;
|
|
||||||
transform: translateY(10px);
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip a {
|
|
||||||
cursor: pointer;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip.ql-flip {
|
|
||||||
transform: translateY(-10px);
|
|
||||||
}
|
|
||||||
.ql-snow .ql-formats {
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-formats:after {
|
|
||||||
clear: both;
|
|
||||||
content: '';
|
|
||||||
display: table;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-stroke {
|
|
||||||
fill: none;
|
|
||||||
stroke: #444;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: round;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-stroke-miter {
|
|
||||||
fill: none;
|
|
||||||
stroke: #444;
|
|
||||||
stroke-miterlimit: 10;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-fill,
|
|
||||||
.ql-snow .ql-stroke.ql-fill {
|
|
||||||
fill: #444;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-empty {
|
|
||||||
fill: none;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-even {
|
|
||||||
fill-rule: evenodd;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-thin,
|
|
||||||
.ql-snow .ql-stroke.ql-thin {
|
|
||||||
stroke-width: 1;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-transparent {
|
|
||||||
opacity: 0.4;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-direction svg:last-child {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-direction.ql-active svg:last-child {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-direction.ql-active svg:first-child {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor h1 {
|
|
||||||
font-size: 2em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor h2 {
|
|
||||||
font-size: 1.5em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor h3 {
|
|
||||||
font-size: 1.17em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor h4 {
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor h5 {
|
|
||||||
font-size: 0.83em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor h6 {
|
|
||||||
font-size: 0.67em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor a {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor blockquote {
|
|
||||||
border-left: 4px solid #ccc;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
margin-top: 5px;
|
|
||||||
padding-left: 16px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor code,
|
|
||||||
.ql-snow .ql-editor pre {
|
|
||||||
background-color: #f0f0f0;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor pre {
|
|
||||||
white-space: pre-wrap;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
margin-top: 5px;
|
|
||||||
padding: 5px 10px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor code {
|
|
||||||
font-size: 85%;
|
|
||||||
padding: 2px 4px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor pre.ql-syntax {
|
|
||||||
background-color: #23241f;
|
|
||||||
color: #f8f8f2;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-editor img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker {
|
|
||||||
color: #444;
|
|
||||||
display: inline-block;
|
|
||||||
float: left;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
height: 24px;
|
|
||||||
position: relative;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker-label {
|
|
||||||
cursor: pointer;
|
|
||||||
display: inline-block;
|
|
||||||
height: 100%;
|
|
||||||
padding-left: 8px;
|
|
||||||
padding-right: 2px;
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker-label::before {
|
|
||||||
display: inline-block;
|
|
||||||
line-height: 22px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker-options {
|
|
||||||
background-color: #fff;
|
|
||||||
display: none;
|
|
||||||
min-width: 100%;
|
|
||||||
padding: 4px 8px;
|
|
||||||
position: absolute;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker-options .ql-picker-item {
|
|
||||||
cursor: pointer;
|
|
||||||
display: block;
|
|
||||||
padding-bottom: 5px;
|
|
||||||
padding-top: 5px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-expanded .ql-picker-label {
|
|
||||||
color: #ccc;
|
|
||||||
z-index: 2;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill {
|
|
||||||
fill: #ccc;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke {
|
|
||||||
stroke: #ccc;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-expanded .ql-picker-options {
|
|
||||||
display: block;
|
|
||||||
margin-top: -1px;
|
|
||||||
top: 100%;
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-color-picker,
|
|
||||||
.ql-snow .ql-icon-picker {
|
|
||||||
width: 28px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-color-picker .ql-picker-label,
|
|
||||||
.ql-snow .ql-icon-picker .ql-picker-label {
|
|
||||||
padding: 2px 4px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-color-picker .ql-picker-label svg,
|
|
||||||
.ql-snow .ql-icon-picker .ql-picker-label svg {
|
|
||||||
right: 4px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-icon-picker .ql-picker-options {
|
|
||||||
padding: 4px 0px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-icon-picker .ql-picker-item {
|
|
||||||
height: 24px;
|
|
||||||
width: 24px;
|
|
||||||
padding: 2px 4px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-color-picker .ql-picker-options {
|
|
||||||
padding: 3px 5px;
|
|
||||||
width: 152px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-color-picker .ql-picker-item {
|
|
||||||
border: 1px solid transparent;
|
|
||||||
float: left;
|
|
||||||
height: 16px;
|
|
||||||
margin: 2px;
|
|
||||||
padding: 0px;
|
|
||||||
width: 16px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg {
|
|
||||||
position: absolute;
|
|
||||||
margin-top: -9px;
|
|
||||||
right: 0;
|
|
||||||
top: 50%;
|
|
||||||
width: 18px;
|
|
||||||
}
|
|
||||||
.ql-snow
|
|
||||||
.ql-picker.ql-header
|
|
||||||
.ql-picker-label[data-label]:not([data-label=''])::before,
|
|
||||||
.ql-snow
|
|
||||||
.ql-picker.ql-font
|
|
||||||
.ql-picker-label[data-label]:not([data-label=''])::before,
|
|
||||||
.ql-snow
|
|
||||||
.ql-picker.ql-size
|
|
||||||
.ql-picker-label[data-label]:not([data-label=''])::before,
|
|
||||||
.ql-snow
|
|
||||||
.ql-picker.ql-header
|
|
||||||
.ql-picker-item[data-label]:not([data-label=''])::before,
|
|
||||||
.ql-snow
|
|
||||||
.ql-picker.ql-font
|
|
||||||
.ql-picker-item[data-label]:not([data-label=''])::before,
|
|
||||||
.ql-snow
|
|
||||||
.ql-picker.ql-size
|
|
||||||
.ql-picker-item[data-label]:not([data-label=''])::before {
|
|
||||||
content: attr(data-label);
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header {
|
|
||||||
width: 98px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item::before {
|
|
||||||
content: 'Normal';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='1']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='1']::before {
|
|
||||||
content: 'Heading 1';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='2']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='2']::before {
|
|
||||||
content: 'Heading 2';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='3']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='3']::before {
|
|
||||||
content: 'Heading 3';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='4']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='4']::before {
|
|
||||||
content: 'Heading 4';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='5']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='5']::before {
|
|
||||||
content: 'Heading 5';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='6']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='6']::before {
|
|
||||||
content: 'Heading 6';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='1']::before {
|
|
||||||
font-size: 2em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='2']::before {
|
|
||||||
font-size: 1.5em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='3']::before {
|
|
||||||
font-size: 1.17em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='4']::before {
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='5']::before {
|
|
||||||
font-size: 0.83em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='6']::before {
|
|
||||||
font-size: 0.67em;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-font {
|
|
||||||
width: 108px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-item::before {
|
|
||||||
content: 'Sans Serif';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='serif']::before,
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='serif']::before {
|
|
||||||
content: 'Serif';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='monospace']::before,
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before {
|
|
||||||
content: 'Monospace';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='serif']::before {
|
|
||||||
font-family: Georgia, Times New Roman, serif;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before {
|
|
||||||
font-family: Monaco, Courier New, monospace;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-size {
|
|
||||||
width: 98px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item::before {
|
|
||||||
content: 'Normal';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='small']::before,
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before {
|
|
||||||
content: 'Small';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='large']::before,
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before {
|
|
||||||
content: 'Large';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='huge']::before,
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before {
|
|
||||||
content: 'Huge';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before {
|
|
||||||
font-size: 10px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before {
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before {
|
|
||||||
font-size: 32px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-color-picker.ql-background .ql-picker-item {
|
|
||||||
background-color: #fff;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-color-picker.ql-color .ql-picker-item {
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
.ql-toolbar.ql-snow {
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
box-sizing: border-box;
|
|
||||||
font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
|
|
||||||
padding: 8px;
|
|
||||||
}
|
|
||||||
.ql-toolbar.ql-snow .ql-formats {
|
|
||||||
margin-right: 15px;
|
|
||||||
}
|
|
||||||
.ql-toolbar.ql-snow .ql-picker-label {
|
|
||||||
border: 1px solid transparent;
|
|
||||||
}
|
|
||||||
.ql-toolbar.ql-snow .ql-picker-options {
|
|
||||||
border: 1px solid transparent;
|
|
||||||
box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px;
|
|
||||||
}
|
|
||||||
.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label {
|
|
||||||
border-color: #ccc;
|
|
||||||
}
|
|
||||||
.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options {
|
|
||||||
border-color: #ccc;
|
|
||||||
}
|
|
||||||
.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,
|
|
||||||
.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover {
|
|
||||||
border-color: #000;
|
|
||||||
}
|
|
||||||
.ql-toolbar.ql-snow + .ql-container.ql-snow {
|
|
||||||
border-top: 0px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip {
|
|
||||||
background-color: #fff;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
box-shadow: 0px 0px 5px #ddd;
|
|
||||||
color: #444;
|
|
||||||
padding: 5px 12px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip::before {
|
|
||||||
content: 'Visit URL:';
|
|
||||||
line-height: 26px;
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip input[type='text'] {
|
|
||||||
display: none;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
font-size: 13px;
|
|
||||||
height: 26px;
|
|
||||||
margin: 0px;
|
|
||||||
padding: 3px 5px;
|
|
||||||
width: 170px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip a.ql-preview {
|
|
||||||
display: inline-block;
|
|
||||||
max-width: 200px;
|
|
||||||
overflow-x: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip a.ql-action::after {
|
|
||||||
border-right: 1px solid #ccc;
|
|
||||||
content: 'Edit';
|
|
||||||
margin-left: 16px;
|
|
||||||
padding-right: 8px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip a.ql-remove::before {
|
|
||||||
content: 'Remove';
|
|
||||||
margin-left: 8px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip a {
|
|
||||||
line-height: 26px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip.ql-editing a.ql-preview,
|
|
||||||
.ql-snow .ql-tooltip.ql-editing a.ql-remove {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip.ql-editing input[type='text'] {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
|
|
||||||
border-right: 0px;
|
|
||||||
content: 'Save';
|
|
||||||
padding-right: 0px;
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip[data-mode='link']::before {
|
|
||||||
content: 'Enter link:';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip[data-mode='formula']::before {
|
|
||||||
content: 'Enter formula:';
|
|
||||||
}
|
|
||||||
.ql-snow .ql-tooltip[data-mode='video']::before {
|
|
||||||
content: 'Enter video:';
|
|
||||||
}
|
|
||||||
.ql-snow a {
|
|
||||||
color: #06c;
|
|
||||||
}
|
|
||||||
.ql-container.ql-snow {
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user