···
const [openDialog, setOpenDialog] = createSignal(false);
const [notice, setNotice] = createSignal("");
const [openUpload, setOpenUpload] = createSignal(false);
24
+
const [openInsertMenu, setOpenInsertMenu] = createSignal(false);
const [validate, setValidate] = createSignal<boolean | undefined>(undefined);
const [isMaximized, setIsMaximized] = createSignal(false);
const [isMinimized, setIsMinimized] = createSignal(false);
let blobInput!: HTMLInputElement;
let formRef!: HTMLFormElement;
30
+
let insertMenuRef!: HTMLDivElement;
32
+
createEffect(() => {
33
+
if (openInsertMenu()) {
34
+
const handleClickOutside = (e: MouseEvent) => {
35
+
if (insertMenuRef && !insertMenuRef.contains(e.target as Node)) {
36
+
setOpenInsertMenu(false);
39
+
document.addEventListener("mousedown", handleClickOutside);
40
+
onCleanup(() => document.removeEventListener("mousedown", handleClickOutside));
const defaultPlaceholder = () => {
···
175
+
const insertTimestamp = () => {
176
+
const timestamp = new Date().toISOString();
177
+
editorView.dispatch({
179
+
from: editorView.state.selection.main.head,
180
+
insert: `"${timestamp}"`,
183
+
setOpenInsertMenu(false);
const FileUpload = (props: { file: File }) => {
···
<div class="text-sm text-red-500 dark:text-red-400">{notice()}</div>
<div class="flex justify-between gap-2">
358
-
class="dark:hover:bg-dark-200 dark:shadow-dark-700 dark:active:bg-dark-100 flex w-fit rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 text-xs shadow-xs hover:bg-neutral-100 active:bg-neutral-200 dark:border-neutral-700 dark:bg-neutral-800"
381
+
<div class="relative" ref={insertMenuRef}>
384
+
class="dark:hover:bg-dark-200 dark:shadow-dark-700 dark:active:bg-dark-100 flex w-fit rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 px-2 py-1.5 text-xs shadow-xs hover:bg-neutral-100 active:bg-neutral-200 dark:border-neutral-700 dark:bg-neutral-800"
385
+
onClick={() => setOpenInsertMenu(!openInsertMenu())}
387
+
<span class="iconify lucide--plus select-none"></span>
389
+
<Show when={openInsertMenu()}>
390
+
<div class="dark:bg-dark-300 dark:shadow-dark-700 absolute bottom-full left-0 mb-1 flex w-40 flex-col rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 shadow-md dark:border-neutral-700 z-10">
393
+
class="flex items-center gap-2 px-3 py-2 text-left text-xs hover:bg-neutral-100 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-600 rounded-t-lg"
395
+
setOpenInsertMenu(false);
399
+
<span class="iconify lucide--upload"></span>
400
+
<span>Upload blob</span>
404
+
class="flex items-center gap-2 px-3 py-2 text-left text-xs hover:bg-neutral-100 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-600 rounded-b-lg"
405
+
onClick={insertTimestamp}
407
+
<span class="iconify lucide--clock"></span>
408
+
<span>Insert timestamp</span>
···
if (e.target.files !== null) setOpenUpload(true);
369
-
<label class="flex items-center gap-1 px-2 py-1.5 select-none" for="blob">
370
-
<span class="iconify lucide--upload"></span>
onClose={() => setOpenUpload(false)}