diff --git a/components/details/details-content.tsx b/components/details/details-content.tsx index aad4428..c7aad59 100644 --- a/components/details/details-content.tsx +++ b/components/details/details-content.tsx @@ -21,6 +21,7 @@ import { } from "@/service/master-user"; import { useForm } from "react-hook-form"; import { Badge } from "../ui/badge"; +import { formatTextToHtmlTag } from "@/utils/global"; type TabKey = "trending" | "comments" | "latest"; @@ -338,6 +339,16 @@ export default function DetailContent() { // // ); // } + + function removeImgTags(htmlString?: { __html: string }) { + const parser = new DOMParser(); + const doc = parser.parseFromString(String(htmlString?.__html), "text/html"); + + const images = doc.querySelectorAll("img"); + images.forEach((img) => img.remove()); + + return { __html: doc.body.innerHTML }; + } function decodeHtmlString(raw: string = "") { if (!raw) return ""; @@ -520,11 +531,10 @@ export default function DetailContent() {
diff --git a/components/editor/custom-editor.js b/components/editor/custom-editor.js index 95886a7..cee120f 100644 --- a/components/editor/custom-editor.js +++ b/components/editor/custom-editor.js @@ -1,7 +1,7 @@ -// components/custom-editor.js - -import React from "react"; +import React, { useCallback, useEffect, useRef, useState } from "react"; import { CKEditor } from "@ckeditor/ckeditor5-react"; + +import "@/styles/custom-editor.css"; import Editor from "@/vendor/ckeditor5/build/ckeditor"; function CustomEditor(props) { @@ -47,7 +47,7 @@ function CustomEditor(props) { padding: 1rem; } p { - margin: 0.5em 0; + margin: 0.5em 0 !important; } h1, h2, h3, h4, h5, h6 { margin: 1em 0 0.5em 0; @@ -72,98 +72,6 @@ function CustomEditor(props) { }, }} /> -
); } diff --git a/components/editor/view-editor.js b/components/editor/view-editor.js index 31e7db9..1e579b0 100644 --- a/components/editor/view-editor.js +++ b/components/editor/view-editor.js @@ -48,7 +48,8 @@ function ViewEditor(props) { .ckeditor-view-wrapper { border-radius: 6px; overflow: hidden; - box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), + box-shadow: + 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); } diff --git a/components/form/article/create-article-form.tsx b/components/form/article/create-article-form.tsx index 2df8011..dc210dc 100644 --- a/components/form/article/create-article-form.tsx +++ b/components/form/article/create-article-form.tsx @@ -56,7 +56,7 @@ const CustomEditor = dynamic( () => { return import("@/components/editor/custom-editor"); }, - { ssr: false } + { ssr: false }, ); interface FileWithPreview extends File { @@ -118,14 +118,14 @@ export default function CreateArticleForm() { const [tag, setTag] = useState(""); const [thumbnailImg, setThumbnailImg] = useState([]); const [selectedMainImage, setSelectedMainImage] = useState( - null + null, ); const [thumbnailValidation, setThumbnailValidation] = useState(""); const [filesValidation, setFileValidation] = useState(""); const [diseData, setDiseData] = useState(); const [selectedWritingType, setSelectedWritingType] = useState("single"); const [status, setStatus] = useState<"publish" | "draft" | "scheduled">( - "publish" + "publish", ); const [isScheduled, setIsScheduled] = useState(false); const [startDateValue, setStartDateValue] = useState(); @@ -230,7 +230,7 @@ export default function CreateArticleForm() { } const saveArticleToDise = async ( - values: z.infer + values: z.infer, ) => { if (useAi) { const request = { @@ -351,12 +351,12 @@ export default function CreateArticleForm() { // format: 2025-10-08 14:30:00 const formattedDateTime = `${combinedDate.getFullYear()}-${String( - combinedDate.getMonth() + 1 + combinedDate.getMonth() + 1, ).padStart(2, "0")}-${String(combinedDate.getDate()).padStart( 2, - "0" + "0", )} ${String(combinedDate.getHours()).padStart(2, "0")}:${String( - combinedDate.getMinutes() + combinedDate.getMinutes(), ).padStart(2, "0")}:00`; const request = { @@ -493,7 +493,7 @@ export default function CreateArticleForm() { } } const uniqueArray = temp.filter( - (item, index) => temp.indexOf(item) === index + (item, index) => temp.indexOf(item) === index, ); setValue("tags", uniqueArray as [string, ...string[]]); @@ -505,7 +505,7 @@ export default function CreateArticleForm() { onSubmit={handleSubmit(onSubmit)} >
-

Judul

+

Judulss

@@ -588,7 +588,7 @@ export default function CreateArticleForm() { setDiseData(data); setValue( "description", - data?.articleBody ? data?.articleBody : "" + data?.articleBody ? data?.articleBody : "", ); }} /> @@ -781,7 +781,7 @@ export default function CreateArticleForm() { type="button" onClick={() => { const filteredTags = value.filter( - (tag: string) => tag !== item + (tag: string) => tag !== item, ); if (filteredTags.length === 0) { setError("tags", { @@ -792,7 +792,7 @@ export default function CreateArticleForm() { clearErrors("tags"); setValue( "tags", - filteredTags as [string, ...string[]] + filteredTags as [string, ...string[]], ); } }} diff --git a/components/table/article-table.tsx b/components/table/article-table.tsx index 3a50853..919c99d 100644 --- a/components/table/article-table.tsx +++ b/components/table/article-table.tsx @@ -316,7 +316,7 @@ export default function ArticleTable() { return cellValue; } }, - [article, page] + [article, page], ); let typingTimer: NodeJS.Timeout; @@ -445,8 +445,8 @@ export default function ArticleTable() {
-
- +
+
{(username === "admin-mabes" @@ -455,7 +455,18 @@ export default function ArticleTable() { ).map((column) => ( {column.name} @@ -472,7 +483,17 @@ export default function ArticleTable() { ).map((column) => ( {renderCell(item, column.uid)} diff --git a/package-lock.json b/package-lock.json index b5497c7..366c352 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "react-apexcharts": "^1.7.0", "react-datepicker": "^8.4.0", "react-day-picker": "^9.7.0", - "react-dom": "^19.0.0", + "react-dom": "^19.2.4", "react-dropzone": "^14.3.8", "react-hook-form": "^7.65.0", "react-password-checklist": "^1.8.1", @@ -1514,111 +1514,6 @@ "next": "*" } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.1.tgz", - "integrity": "sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.1.tgz", - "integrity": "sha512-hbyKtrDGUkgkyQi1m1IyD3q4I/3m9ngr+V93z4oKHrPcmxwNL5iMWORvLSGAf2YujL+6HxgVvZuCYZfLfb4bGw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.1.tgz", - "integrity": "sha512-/fvHet+EYckFvRLQ0jPHJCUI5/B56+2DpI1xDSvi80r/3Ez+Eaa2Yq4tJcRTaB1kqj/HrYKn8Yplm9bNoMJpwQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.1.tgz", - "integrity": "sha512-MFHrgL4TXNQbBPzkKKur4Fb5ICEJa87HM7fczFs2+HWblM7mMLdco3dvyTI+QmLBU9xgns/EeeINSZD6Ar+oLg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.1.tgz", - "integrity": "sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.1.tgz", - "integrity": "sha512-9pRbK3M4asAHQRkwaXwu601oPZHghuSC8IXNENgbBSyImHv/zY4K5udBusgdHkvJ/Tcr96jJwQYOll0qU8+fPA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.1.tgz", - "integrity": "sha512-bdfQkggaLgnmYrFkSQfsHfOhk/mCYmjnrbRCGgkMcoOBZ4n+TRRSLmT/CU5SATzlBJ9TpioUyBW/vWFXTqQRiA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-win32-x64-msvc": { "version": "16.1.1", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.1.tgz", @@ -6403,9 +6298,9 @@ ] }, "node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "engines": { "node": ">=0.10.0" } @@ -6457,14 +6352,14 @@ } }, "node_modules/react-dom": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", - "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.0" + "react": "^19.2.4" } }, "node_modules/react-dropzone": { @@ -7703,6 +7598,111 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.1.tgz", + "integrity": "sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.1.tgz", + "integrity": "sha512-hbyKtrDGUkgkyQi1m1IyD3q4I/3m9ngr+V93z4oKHrPcmxwNL5iMWORvLSGAf2YujL+6HxgVvZuCYZfLfb4bGw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.1.tgz", + "integrity": "sha512-/fvHet+EYckFvRLQ0jPHJCUI5/B56+2DpI1xDSvi80r/3Ez+Eaa2Yq4tJcRTaB1kqj/HrYKn8Yplm9bNoMJpwQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.1.tgz", + "integrity": "sha512-MFHrgL4TXNQbBPzkKKur4Fb5ICEJa87HM7fczFs2+HWblM7mMLdco3dvyTI+QmLBU9xgns/EeeINSZD6Ar+oLg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.1.tgz", + "integrity": "sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.1.tgz", + "integrity": "sha512-9pRbK3M4asAHQRkwaXwu601oPZHghuSC8IXNENgbBSyImHv/zY4K5udBusgdHkvJ/Tcr96jJwQYOll0qU8+fPA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.1.tgz", + "integrity": "sha512-bdfQkggaLgnmYrFkSQfsHfOhk/mCYmjnrbRCGgkMcoOBZ4n+TRRSLmT/CU5SATzlBJ9TpioUyBW/vWFXTqQRiA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } } } diff --git a/package.json b/package.json index e4cfe47..421df74 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "react-apexcharts": "^1.7.0", "react-datepicker": "^8.4.0", "react-day-picker": "^9.7.0", - "react-dom": "^19.0.0", + "react-dom": "^19.2.4", "react-dropzone": "^14.3.8", "react-hook-form": "^7.65.0", "react-password-checklist": "^1.8.1", diff --git a/style/ckeditor.css b/style/ckeditor.css deleted file mode 100644 index e55d076..0000000 --- a/style/ckeditor.css +++ /dev/null @@ -1,215 +0,0 @@ -/* CKEditor Custom Styling */ - -/* Main editor container */ -.ck.ck-editor { - border-radius: 6px; - overflow: hidden; - box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); -} - -/* Toolbar styling */ -.ck.ck-toolbar { - background: #f8fafc; - border: 1px solid #d1d5db; - border-bottom: none; - border-radius: 6px 6px 0 0; - padding: 8px; -} - -.ck.ck-toolbar .ck-toolbar__items { - gap: 4px; -} - -/* Main editable area */ -.ck.ck-editor__editable { - background: #ffffff; - border: 1px solid #d1d5db; - border-top: none; - border-radius: 0 0 6px 6px; - padding: 1.5em 2em !important; - min-height: 400px; - line-height: 1.6; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - font-size: 14px; - color: #333; -} - -/* Focus state */ -.ck.ck-editor__editable.ck-focused { - border-color: #1a9aef; - box-shadow: 0 0 0 2px rgba(26, 154, 239, 0.2); - outline: none; -} - -/* Content styling */ -.ck.ck-editor__editable .ck-content { - padding: 0; -} - -/* Typography improvements */ -.ck.ck-editor__editable p { - margin: 0.5em 0; - line-height: 1.6; -} - -.ck.ck-editor__editable h1, -.ck.ck-editor__editable h2, -.ck.ck-editor__editable h3, -.ck.ck-editor__editable h4, -.ck.ck-editor__editable h5, -.ck.ck-editor__editable h6 { - margin: 1em 0 0.5em 0; - font-weight: 600; - line-height: 1.4; -} - -.ck.ck-editor__editable h1 { font-size: 1.75em; } -.ck.ck-editor__editable h2 { font-size: 1.5em; } -.ck.ck-editor__editable h3 { font-size: 1.25em; } -.ck.ck-editor__editable h4 { font-size: 1.1em; } -.ck.ck-editor__editable h5 { font-size: 1em; } -.ck.ck-editor__editable h6 { font-size: 0.9em; } - -/* Lists */ -.ck.ck-editor__editable ul, -.ck.ck-editor__editable ol { - margin: 0.5em 0; - padding-left: 2em; -} - -.ck.ck-editor__editable li { - margin: 0.25em 0; - line-height: 1.6; -} - -/* Blockquotes */ -.ck.ck-editor__editable blockquote { - margin: 1em 0; - padding: 0.75em 1em; - border-left: 4px solid #1a9aef; - background-color: #f8fafc; - border-radius: 0 4px 4px 0; - font-style: italic; - color: #4b5563; -} - -/* Tables */ -.ck.ck-editor__editable table { - border-collapse: collapse; - width: 100%; - margin: 1em 0; -} - -.ck.ck-editor__editable table td, -.ck.ck-editor__editable table th { - border: 1px solid #d1d5db; - padding: 0.5em 0.75em; - text-align: left; -} - -.ck.ck-editor__editable table th { - background-color: #f8fafc; - font-weight: 600; -} - -/* Links */ -.ck.ck-editor__editable a { - color: #1a9aef; - text-decoration: underline; -} - -.ck.ck-editor__editable a:hover { - color: #0d7cd6; -} - -/* Code blocks */ -.ck.ck-editor__editable pre { - background-color: #f8fafc; - border: 1px solid #d1d5db; - border-radius: 4px; - padding: 1em; - margin: 1em 0; - overflow-x: auto; - font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; - font-size: 13px; - line-height: 1.4; -} - -.ck.ck-editor__editable code { - background-color: #f1f5f9; - padding: 0.2em 0.4em; - border-radius: 3px; - font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; - font-size: 0.9em; -} - -/* Images */ -.ck.ck-editor__editable img { - max-width: 100%; - height: auto; - border-radius: 4px; - margin: 0.5em 0; -} - -/* Horizontal rule */ -.ck.ck-editor__editable hr { - border: none; - border-top: 1px solid #d1d5db; - margin: 2em 0; -} - -/* Placeholder text */ -.ck.ck-editor__editable.ck-blurred:empty::before { - content: attr(data-placeholder); - color: #9ca3af; - font-style: italic; -} - -/* Mobile responsiveness */ -@media (max-width: 768px) { - .ck.ck-editor__editable { - padding: 1em 1.5em !important; - font-size: 16px; /* Better for mobile */ - } - - .ck.ck-toolbar { - padding: 6px; - } - - .ck.ck-toolbar .ck-toolbar__items { - gap: 2px; - } -} - -/* Dark mode support */ -@media (prefers-color-scheme: dark) { - .ck.ck-editor__editable { - background: #1f2937; - color: #f9fafb; - border-color: #4b5563; - } - - .ck.ck-editor__editable h1, - .ck.ck-editor__editable h2, - .ck.ck-editor__editable h3, - .ck.ck-editor__editable h4, - .ck.ck-editor__editable h5, - .ck.ck-editor__editable h6 { - color: #f9fafb; - } - - .ck.ck-editor__editable blockquote { - background-color: #374151; - border-left-color: #1a9aef; - color: #d1d5db; - } - - .ck.ck-editor__editable pre { - background-color: #374151; - border-color: #4b5563; - } - - .ck.ck-editor__editable code { - background-color: #4b5563; - } -} diff --git a/styles/custom-editor.css b/styles/custom-editor.css new file mode 100644 index 0000000..d203c3d --- /dev/null +++ b/styles/custom-editor.css @@ -0,0 +1,121 @@ +/* ========== CKEditor Wrapper ========== */ +.ckeditor-wrapper { + border-radius: 6px; + overflow: hidden; + box-shadow: + 0 1px 3px 0 rgba(0, 0, 0, 0.1), + 0 1px 2px 0 rgba(0, 0, 0, 0.06); +} + +/* ========== Main Editor Container ========== */ +.ckeditor-wrapper .ck.ck-editor__main { + min-height: var(--editor-min-height, 400px); + max-height: var(--editor-max-height, 600px); +} + +/* ========== Editable Content Area (ClassicEditor) ========== */ +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline { + min-height: calc(var(--editor-min-height, 400px) - 50px); + max-height: calc(var(--editor-max-height, 600px) - 50px); + overflow-y: auto !important; + scrollbar-width: thin; + scrollbar-color: #cbd5e1 #f1f5f9; + background: #fff !important; + color: #111 !important; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + font-size: 14px; + line-height: 1.6; + padding: 1rem; + border: none !important; +} + +/* ========== Headings and Text Formatting ========== */ +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h1, +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h2, +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h3, +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h4, +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h5, +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h6 { + margin: 1em 0 0.5em 0; + color: inherit !important; +} + +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline p { + margin: 0.5em 0 !important; +} + +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline ul, +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline ol { + margin: 0.5em 0; + padding-left: 2em; +} + +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline blockquote { + margin: 1em 0; + padding: 0.5em 1em; + border-left: 4px solid #d1d5db; + background-color: #f9fafb; + color: inherit !important; +} + +/* ========== Dark Mode Support ========== */ +.dark .ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline { + background: #111 !important; + color: #f9fafb !important; +} + +.dark .ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h1, +.dark .ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h2, +.dark .ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h3, +.dark .ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h4, +.dark .ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h5, +.dark .ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline h6 { + color: #f9fafb !important; +} + +.dark .ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline blockquote { + background-color: #1f2937 !important; + border-left-color: #374151 !important; + color: #f3f4f6 !important; +} + +/* ========== Custom Scrollbars (Light & Dark) ========== */ +.ckeditor-wrapper .ck.ck-content.ck-editor__editable_inline::-webkit-scrollbar { + width: 8px; +} + +.ckeditor-wrapper + .ck.ck-content.ck-editor__editable_inline::-webkit-scrollbar-track { + background: #f1f5f9; + border-radius: 4px; +} + +.ckeditor-wrapper + .ck.ck-content.ck-editor__editable_inline::-webkit-scrollbar-thumb { + background: #cbd5e1; + border-radius: 4px; +} + +.ckeditor-wrapper + .ck.ck-content.ck-editor__editable_inline::-webkit-scrollbar-thumb:hover { + background: #94a3b8; +} + +.dark + .ckeditor-wrapper + .ck.ck-content.ck-editor__editable_inline::-webkit-scrollbar-track { + background: #1f2937; +} + +.dark + .ckeditor-wrapper + .ck.ck-content.ck-editor__editable_inline::-webkit-scrollbar-thumb { + background: #4b5563; +} + +.dark + .ckeditor-wrapper + .ck.ck-content.ck-editor__editable_inline::-webkit-scrollbar-thumb:hover { + background: #6b7280; +} diff --git a/utils/global.tsx b/utils/global.tsx index 68830b0..445ec6d 100644 --- a/utils/global.tsx +++ b/utils/global.tsx @@ -97,7 +97,7 @@ export function delay(ms: number) { export function textEllipsis( str: string, maxLength: number, - { side = "end", ellipsis = "..." } = {} + { side = "end", ellipsis = "..." } = {}, ) { if (str !== undefined && str?.length > maxLength) { switch (side) {