OPtimized components
All checks were successful
Deploy Docs to Synology / deploy (push) Successful in 4s

This commit is contained in:
2026-04-26 23:33:55 +02:00
parent 971133d430
commit e3e5082247
15 changed files with 438 additions and 755 deletions

367
dist/sigpro-ui.esm.js vendored
View File

@@ -28,10 +28,14 @@ __export(exports_All, {
Toggle: () => Toggle,
Toast: () => Toast,
Timeline: () => Timeline,
Textrotate: () => Textrotate,
Textarea: () => Textarea,
TextRotate: () => TextRotate,
Tabs: () => Tabs,
TableItems: () => TableItems,
Table: () => Table,
SwapToggle: () => SwapToggle,
SwapOn: () => SwapOn,
SwapOff: () => SwapOff,
Swap: () => Swap,
Steps: () => Steps,
Step: () => Step,
@@ -56,7 +60,13 @@ __export(exports_All, {
Fileinput: () => Fileinput,
Fieldset: () => Fieldset,
Fab: () => Fab,
DropdownContent: () => DropdownContent,
DropdownButton: () => DropdownButton,
Dropdown: () => Dropdown,
DrawerToggle: () => DrawerToggle,
DrawerSide: () => DrawerSide,
DrawerOverlay: () => DrawerOverlay,
DrawerContent: () => DrawerContent,
Drawer: () => Drawer,
Divider: () => Divider,
Datepicker: () => Datepicker,
@@ -69,6 +79,9 @@ __export(exports_All, {
Chat: () => Chat,
CarouselItem: () => CarouselItem,
Carousel: () => Carousel,
CardTitle: () => CardTitle,
CardBody: () => CardBody,
CardActions: () => CardActions,
Card: () => Card,
Calendar: () => Calendar,
Button: () => Button,
@@ -520,16 +533,12 @@ var rand = (r) => `${r}-${Math.random().toString(36).slice(2, 9)}`;
var close = () => document.activeElement?.blur();
var listKey = (items, isOpen) => {
const cursor = S(-1);
R(() => {
if (!get(isOpen))
cursor(-1);
});
const onKey = (e, select) => {
const list = get(items), i = cursor(), len = list.length;
if (!len)
return;
const k2 = e.key;
k2 === "ArrowDown" ? (e.preventDefault(), isOpen(true), cursor(Math.min(i + 1, len - 1))) : k2 === "ArrowUp" ? (e.preventDefault(), cursor(Math.max(i - 1, 0))) : k2 === "Enter" ? i >= 0 && (e.preventDefault(), select(list[i])) : k2 === "Escape" && isOpen(false);
k2 === "ArrowDown" ? (e.preventDefault(), isOpen(true), cursor(Math.min(i + 1, len - 1))) : k2 === "ArrowUp" ? (e.preventDefault(), cursor(Math.max(i - 1, 0))) : k2 === "Enter" ? i >= 0 && (e.preventDefault(), select(list[i])) : k2 === "Escape" && (isOpen(false), cursor(-1));
};
return { cursor, onKey };
};
@@ -572,7 +581,10 @@ var Autocomplete = ({ items, value, onselect, placeholder = "Buscar...", ...prop
isOpen(true);
},
onfocus: () => isOpen(true),
onblur: () => setTimeout(() => isOpen(false), 150),
onblur: () => setTimeout(() => {
isOpen(false);
cursor(-1);
}, 150),
onkeydown: (e) => onKey(e, pick)
}),
z(isOpen, () => G({ duration: 200, slide: true }, O("ul", {
@@ -688,15 +700,10 @@ var Calendar = (p2) => {
p2.hour ? O("div", { class: "mt-3 pt-2 border-t border-base-300" }, rangeMode() ? O("div", { class: "flex gap-4" }, [HourSlider({ value: startHour, onChange: (h) => startHour(h) }), HourSlider({ value: endHour, onChange: (h) => endHour(h) })]) : HourSlider({ value: startHour, onChange: (h) => startHour(h) })) : null
]);
};
var Card = (p2, c) => {
if (!p2.title && !p2.body && !p2.actions && !c)
return O("div", { ...p2, class: cls("card", p2.class) }, c);
return O("div", { ...p2, class: cls("card", p2.class) }, [
p2.title && O("div", { class: cls("card-title", p2.titleClass) }, p2.title),
(p2.body || c) && O("div", { class: cls("card-body", p2.bodyClass) }, p2.body || c),
p2.actions && O("div", { class: cls("card-actions", p2.actionsClass) }, p2.actions)
].filter(Boolean));
};
var Card = (p2, c) => O("div", { ...p2, class: cls("card", p2.class) }, c);
var CardTitle = (p2, c) => O("div", { ...p2, class: cls("card-title", p2.class) }, c);
var CardBody = (p2, c) => O("div", { ...p2, class: cls("card-body", p2.class) }, c);
var CardActions = (p2, c) => O("div", { ...p2, class: cls("card-actions", p2.class) }, c);
var Carousel = (p2, c) => O("div", { ...p2, class: cls("carousel", p2.class) }, c);
var CarouselItem = (p2, c) => O("div", { ...p2, class: cls("carousel-item", p2.class) }, c);
var Chat = (p2, c) => O("div", { ...p2, class: cls("chat", p2.class) }, c);
@@ -857,21 +864,15 @@ var Datepicker = (p2) => {
])
]);
};
var Drawer = (p2, c) => {
const id = p2.id || rand("drawer");
return O("div", { class: cls("drawer", p2.class) }, [
O("input", { id, type: "checkbox", class: "drawer-toggle", checked: () => get(p2.open), onchange: (e) => isFn(p2.open) && p2.open(e.target.checked) }),
O("div", { class: "drawer-side" }, [O("label", { for: id, class: "drawer-overlay", onclick: () => isFn(p2.open) && p2.open(false) }), O("div", { class: "min-h-full bg-base-200 w-80 p-4" }, () => get(p2.side))]),
O("div", { class: "drawer-content" }, c)
]);
};
var Drawer = (p2, c) => div({ ...p2, class: cls("drawer", p2.class) }, c);
var DrawerToggle = (p2) => input({ ...p2, type: "checkbox", class: "drawer-toggle", checked: () => get(p2.checked), onchange: (e) => isFn(p2.checked) && p2.checked(e.target.checked) });
var DrawerContent = (p2, c) => div({ ...p2, class: cls("drawer-content", p2.class) }, c);
var DrawerSide = (p2, c) => div({ ...p2, class: cls("drawer-side", p2.class) }, c);
var DrawerOverlay = (p2) => label({ ...p2, for: p2.for, class: cls("drawer-overlay", p2.class) });
var Divider = (p2) => O("div", { ...p2, class: cls("divider", p2.class) });
var Dropdown = (p2, c) => {
return O("div", { ...p2, class: cls("dropdown", p2.class) }, [
O("div", { tabindex: "0", role: "button", class: cls("btn", p2.buttonClass) }, p2.label),
O("div", { tabindex: "-1", class: "dropdown-content" }, c)
]);
};
var Dropdown = (p2, c) => O("div", { ...p2, class: cls("dropdown", p2.class) }, c);
var DropdownButton = (p2, c) => O("div", { ...p2, tabindex: "0", role: "button", class: cls("btn", p2.class) }, c);
var DropdownContent = (p2, c) => O("div", { ...p2, tabindex: "0", class: cls("dropdown-content", p2.class) }, c);
var Fab = (p2, c) => O("div", { class: "fab" }, [O("div", { tabindex: "0", role: "button", class: cls("btn", p2.class) }, Icon(p2.icon)), c]);
var Fieldset = (p2, c) => O("fieldset", { class: cls("fieldset", p2.class) }, [O("legend", { class: "fieldset-legend" }, p2.label), c]);
var Fileinput = (p2) => {
@@ -949,7 +950,7 @@ var Fileinput = (p2) => {
var Icon = (p2) => O("span", { class: p2.startsWith("icon-") ? p2 : "" }, p2.startsWith("icon-") ? null : p2);
var Indicator = (p2, c) => O("div", { ...p2, class: cls("indicator", p2.class) }, [p2.value && O("span", { class: cls("indicator-item badge", p2.class) }, p2.value), c]);
var Input = (p2) => {
const { label, icon, float, placeholder, value, left, right, rule, hint, content, ...rest } = p2;
const { label: label2, icon, float, placeholder, value, left, right, rule, hint, content, ...rest } = p2;
const showPassword = S(false);
const isFocused = S(false);
const isPassword = p2.type === "password";
@@ -965,16 +966,16 @@ var Input = (p2) => {
}
}, [
O("label", { class: float ? "floating-label" : "" }, [
float ? O("span", {}, label) : null,
float ? O("span", {}, label2) : null,
O("label", { pattern, class: () => cls("input validator", p2.class) }, [
label && !float ? O("span", { class: "label" }, label) : null,
label2 && !float ? O("span", { class: "label" }, label2) : null,
left ?? null,
O("input", { ...rest, type: inputType, class: "grow", pattern, placeholder: placeholder || label || " ", value }),
O("input", { ...rest, type: inputType, class: "grow", pattern, placeholder: placeholder || label2 || " ", value }),
right ?? null,
isPassword ? O("label", { class: "swap swap-rotate ml-2" }, [
O("input", { type: "checkbox", onchange: (e) => showPassword(e.target.checked) }),
O("span", { class: "swap-on icon-[lucide--eye]" }),
O("span", { class: "swap-off icon-[lucide--eye-off]" })
isPassword ? Swap({ class: "ml-2" }, [
SwapToggle({ value: showPassword, class: "swap-rotate" }),
SwapOn({}, Icon("icon-[lucide--eye]")),
SwapOff({}, Icon("icon-[lucide--eye-off]"))
]) : null
]),
hint ? O("div", { class: "validator-hint" }, hint) : null,
@@ -1060,16 +1061,16 @@ var Rating = (p2) => {
var Select = (p2, c) => {
if (c !== undefined)
return O("select", { class: cls("select", p2.class), ...p2 }, c);
const { label, float, placeholder, placeholderDisabled = true, value, left, right, hint, items, keyFn, ...rest } = p2;
const { label: label2, float, placeholder, placeholderDisabled = true, value, left, right, hint, items, keyFn, ...rest } = p2;
const opts = () => {
const raw = get(items) || [];
const ph = placeholder ? [{ disabled: placeholderDisabled, label: placeholder, value: "" }] : [];
return [...ph, ...raw];
};
return O("label", { class: float ? "floating-label" : "" }, [
float ? O("span", {}, label) : null,
float ? O("span", {}, label2) : null,
O("label", { class: cls("select", rest.class) }, [
!float && label ? O("span", { class: "label" }, label) : null,
!float && label2 ? O("span", { class: "label" }, label2) : null,
left ?? null,
O("select", {
value: () => get(value),
@@ -1089,21 +1090,21 @@ var SkeletonText = (p2) => O("span", { ...p2, class: cls("skeleton skeleton-text
var Stack = (p2, c) => O("div", { ...p2, class: cls("stack", p2.class) }, c);
var Steps = (p2, c) => O("ul", { ...p2, class: cls("steps", p2.class) }, c);
var Step = (p2, c) => O("li", { ...p2, class: cls("step", p2.class), "data-content": p2.dataContent }, c);
var Swap = (p2) => O("label", { ...p2, class: cls("swap", p2.class) }, [
O("input", { type: "checkbox", checked: () => get(p2.value), onchange: (e) => isFn(p2.value) && p2.value(e.target.checked) }),
O("div", { class: "swap-on" }, p2.on),
O("div", { class: "swap-off" }, p2.off)
]);
var Table = (p2) => {
if (p2.children !== undefined)
return O("table", { class: cls("table", p2.class), ...p2 }, p2.children);
const { items, columns = [], header = true, keyFn, ...rest } = p2;
const hd = header !== false && columns.some((c) => c.label) ? O("thead", {}, O("tr", {}, columns.map((c) => O("th", { class: c.class }, c.label)))) : null;
const bd = O("tbody", {}, K(() => get(items) || [], (it, idx) => O("tr", {}, columns.map((c) => {
const v2 = c.render ? c.render(it, idx) : it[c.key];
return O("td", { class: c.class }, v2);
}))));
return O("table", { class: cls("table", rest.class), ...rest }, [hd, bd]);
var Swap = (p2, c) => O("label", { ...p2, class: cls("swap", p2.class) }, c);
var SwapToggle = (p2) => O("input", { type: "checkbox", checked: () => get(p2.value), onchange: (e) => isFn(p2.value) && p2.value(e.target.checked), class: p2.class });
var SwapOn = (p2, c) => O("div", { ...p2, class: cls("swap-on", p2.class) }, c);
var SwapOff = (p2, c) => O("div", { ...p2, class: cls("swap-off", p2.class) }, c);
var Table = (p2, c) => O("table", { ...p2, class: cls("table", p2.class) }, c);
var TableItems = ({ items, columns = [], header = true }) => {
const head = header !== false && columns.some((c) => c.label) ? O("thead", {}, O("tr", {}, columns.map((c) => O("th", { class: c.class }, c.label)))) : null;
const body = O("tbody", {}, () => {
const list = get(items) || [];
return list.map((it, idx) => O("tr", {}, columns.map((c) => {
const v2 = c.render ? c.render(it, idx) : it[c.key];
return O("td", { class: c.class }, v2);
})));
});
return [head, body].filter(Boolean);
};
var Tabs = (p2, c) => {
if (!p2.items) {
@@ -1149,10 +1150,7 @@ var Tabs = (p2, c) => {
});
};
var Textarea = (p2) => O("textarea", { ...p2, class: cls("textarea", p2.class) });
var TextRotate = (p2) => {
const words = Array.isArray(p2.words) ? p2.words : typeof p2.words === "string" ? p2.words.split(",") : [];
return O("span", { ...p2, class: cls("text-rotate", p2.class) }, O("span", {}, words.map((w2) => O("span", {}, w2))));
};
var Textrotate = (p2, c) => O("span", { ...p2, class: cls("text-rotate", p2.class) }, c);
var Timeline = (p2, c) => O("ul", { ...p2, class: cls("timeline", p2.class) }, c);
var Toast = (message, type = "alert-success", duration = 3500) => {
let container = document.getElementById("sigpro-toast-container");
@@ -1209,252 +1207,6 @@ var Toast = (message, type = "alert-success", duration = 3500) => {
var Toggle = (p2) => O("input", { ...p2, type: "checkbox", class: cls("toggle", p2.class) });
var Tooltip = (p2, c) => O("div", { ...p2, class: cls("tooltip", p2.class), "data-tip": p2.tip }, c);
// components/Editor.js
var exports_Editor = {};
__export(exports_Editor, {
Editor: () => Editor
});
var Editor = (p2) => {
const { value, class: extraClass } = p2;
let editorRef = null;
let savedRange = null;
const isSource = S(false);
const source = S("");
const count = S(0);
const refreshTick = S(0);
const showEmojis = S(false);
const emojis = ["\uD83D\uDE00", "\uD83D\uDE0A", "\uD83D\uDE09", "\uD83E\uDDD0", "\uD83D\uDE2E", "\uD83E\uDD14", "\uD83D\uDE05", "\uD83D\uDE02", "\uD83D\uDE0D", "\uD83D\uDE18", "\uD83E\uDD70", "\uD83D\uDC4D", "\uD83D\uDC4E", "\uD83D\uDC4C", "\uD83E\uDD1D", "\uD83E\uDD1E", "\uD83D\uDC4B", "\uD83D\uDC4F", "\uD83D\uDE4C", "\uD83D\uDE4F", "\uD83D\uDCAA", "☝️", "\uD83D\uDC47", "\uD83D\uDC48", "\uD83D\uDC49", "\uD83D\uDD95", "✅", "⚠️", "\uD83D\uDE80", "\uD83D\uDCE2", "✉️", "❤️"];
const saveSelection = () => {
const sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount)
savedRange = sel.getRangeAt(0);
};
const restoreSelection = () => {
if (savedRange) {
const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(savedRange);
}
};
const triggerRefresh = () => {
refreshTick(refreshTick() + 1);
if (editorRef)
count(editorRef.innerText.length);
};
const notify = () => {
if (!editorRef)
return;
const html = editorRef.innerHTML;
if (isFn(value))
value(html);
else
p2.onchange?.(html);
triggerRefresh();
};
const exec = (cmd, val = null) => {
if (!editorRef)
return;
editorRef.focus();
if (savedRange)
restoreSelection();
document.execCommand(cmd, false, val);
savedRange = null;
notify();
};
const openLightbox = (src) => {
const overlay = document.createElement("div");
overlay.style = `position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.9);z-index:9999;display:flex;align-items:center;justify-content:center;cursor:zoom-out;`;
const img = document.createElement("img");
img.src = src;
img.style = `max-width:95%;max-height:95%;box-shadow:0 0 30px rgba(0,0,0,0.5);border-radius:4px;`;
overlay.onclick = () => document.body.removeChild(overlay);
overlay.appendChild(img);
document.body.appendChild(overlay);
};
const handleUpload = (file) => {
if (!file)
return;
const reader = new FileReader;
reader.onload = (re) => {
if (file.type.startsWith("image/")) {
const imgHtml = `<div style="display:inline-block; resize:both; overflow:hidden; vertical-align:bottom; line-height:0; width:200px; height:auto; border:1px dashed #ccc; padding:2px; cursor:pointer;" class="resizable-img-container"><img src="${re.target.result}" style="width:100%; height:100%; object-fit:contain; pointer-events:none;"></div>&nbsp;`;
exec("insertHTML", imgHtml);
} else {
const linkHtml = `<a href="${re.target.result}" download="${file.name}" contenteditable="false" style="display:inline-flex; align-items:center; gap:5px; padding:4px 8px; border:1px solid #ccc; border-radius:4px; background:#f9f9f9; text-decoration:none; color:#333; font-size:12px; margin:2px; cursor:pointer;"><span class="icon-[lucide--paperclip] w-3 h-3"></span>${file.name}</a>&nbsp;`;
exec("insertHTML", linkHtml);
}
};
reader.readAsDataURL(file);
};
const queryState = (cmd, val = null) => {
refreshTick();
if (!editorRef || isSource())
return false;
try {
if (cmd === "formatBlock") {
let node = window.getSelection().getRangeAt(0).commonAncestorContainer;
while (node && node !== editorRef) {
if (node.nodeType === 1 && node.tagName === val)
return true;
node = node.parentNode;
}
return false;
}
return document.queryCommandState(cmd);
} catch (e) {
return false;
}
};
const toolbar = O("div", { class: "flex flex-wrap items-center gap-1 p-2 border-b border-base-300 bg-base-200 sticky top-0 z-20" }, [
O("div", { class: "flex flex-wrap gap-1 flex-1 items-center" }, [
O("button", { type: "button", class: () => `btn btn-ghost btn-xs ${queryState("bold") ? "btn-active bg-primary/20" : ""}`, onclick: () => exec("bold") }, O("span", { class: "icon-[lucide--bold]" })),
O("button", { type: "button", class: () => `btn btn-ghost btn-xs ${queryState("italic") ? "btn-active bg-primary/20" : ""}`, onclick: () => exec("italic") }, O("span", { class: "icon-[lucide--italic]" })),
O("button", { type: "button", class: () => `btn btn-ghost btn-xs ${queryState("underline") ? "btn-active bg-primary/20" : ""}`, onclick: () => exec("underline") }, O("span", { class: "icon-[lucide--underline]" })),
O("input", { type: "color", class: "w-5 h-5 p-0 border-0 bg-transparent cursor-pointer", oninput: (e) => exec("foreColor", e.target.value) }),
O("span", { class: "w-px h-5 bg-base-300 mx-1" }),
O("button", {
type: "button",
class: "btn btn-ghost btn-xs",
onclick: () => exec("justifyLeft")
}, O("span", { class: "icon-[lucide--align-left]" })),
O("button", {
type: "button",
class: "btn btn-ghost btn-xs",
onclick: () => exec("justifyCenter")
}, O("span", { class: "icon-[lucide--align-center]" })),
O("button", {
type: "button",
class: "btn btn-ghost btn-xs",
onclick: () => exec("justifyRight")
}, O("span", { class: "icon-[lucide--align-right]" })),
O("span", { class: "w-px h-5 bg-base-300 mx-1" }),
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: () => exec("insertUnorderedList") }, O("span", { class: "icon-[lucide--list]" })),
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: () => exec("insertOrderedList") }, O("span", { class: "icon-[lucide--list-ordered]" })),
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: () => exec("outdent"), title: "Mover izquierda" }, O("span", { class: "icon-[lucide--indent-decrease]" })),
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: () => exec("indent"), title: "Mover derecha (Tab)" }, O("span", { class: "icon-[lucide--indent-increase]" })),
O("button", { type: "button", class: () => `btn btn-ghost btn-xs ${queryState("formatBlock", "BLOCKQUOTE") ? "btn-active" : ""}`, onclick: () => exec("formatBlock", queryState("formatBlock", "BLOCKQUOTE") ? "P" : "BLOCKQUOTE") }, O("span", { class: "icon-[lucide--quote]" })),
O("span", { class: "w-px h-5 bg-base-300 mx-1" }),
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: () => {
const url = window.prompt("URL:");
if (url)
exec("createLink", url);
} }, O("span", { class: "icon-[lucide--link]" })),
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: () => {
const input = document.createElement("input");
input.type = "file";
input.onchange = (e) => handleUpload(e.target.files[0]);
input.click();
} }, O("span", { class: "icon-[lucide--paperclip]" })),
O("div", { class: "relative" }, [
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: (e) => {
e.stopPropagation();
saveSelection();
showEmojis(!showEmojis());
} }, O("span", { class: "icon-[lucide--smile]" })),
O("div", { class: "absolute top-full left-0 mt-1 p-2 bg-base-100 border border-base-300 shadow-xl rounded-box w-52 z-50 flex flex-wrap gap-1", style: () => showEmojis() ? "display:flex" : "display:none" }, emojis.map((emo) => O("span", { class: "cursor-pointer hover:bg-base-200 p-1 rounded text-lg", onclick: (e) => {
e.stopPropagation();
exec("insertText", emo);
showEmojis(false);
} }, emo)))
]),
O("span", { class: "w-px h-5 bg-base-300 mx-1" }),
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: () => exec("removeFormat") }, O("span", { class: "icon-[lucide--eraser]" })),
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: () => exec("undo"), title: "Deshacer" }, O("span", { class: "icon-[lucide--undo-2]" })),
O("button", { type: "button", class: "btn btn-ghost btn-xs", onclick: () => exec("redo"), title: "Rehacer" }, O("span", { class: "icon-[lucide--redo-2]" }))
]),
O("button", { type: "button", class: () => `btn btn-ghost btn-xs ${isSource() ? "btn-active" : ""}`, onclick: () => {
if (!isSource())
source(editorRef?.innerHTML || "");
else if (editorRef) {
editorRef.innerHTML = source();
notify();
}
isSource(!isSource());
} }, O("span", { class: "icon-[lucide--code-2]" }))
]);
if (typeof document !== "undefined" && !document.getElementById("editor-styles")) {
const style = document.createElement("style");
style.id = "editor-styles";
style.textContent = `
[contenteditable="true"] div,
[contenteditable="true"] p {
margin: 0;
padding: 0;
}
`;
document.head.appendChild(style);
}
return O("div", { class: cls("border border-base-300 rounded-box bg-base-100 overflow-hidden shadow-sm flex flex-col", extraClass) }, [
toolbar,
O("div", { class: "relative flex-1 flex flex-col", onclick: () => showEmojis(false) }, [
O("div", {
ref: (el) => {
if (!editorRef && el) {
editorRef = el;
el.innerHTML = get(value) || "";
document.execCommand("defaultParagraphSeparator", false, "br");
el.addEventListener("click", (e) => {
const container = e.target.closest(".resizable-img-container");
if (container) {
const img = container.querySelector("img");
if (img)
openLightbox(img.src);
}
});
}
},
style: () => `min-height:22rem;${isSource() ? "display:none" : ""}`,
class: "p-4 outline-none text-base-content leading-relaxed [&>div]:m-0 [&>p]:m-0 [&>div]:min-h-[1em] [&_.resizable-img-container]:hover:border-primary [&_blockquote]:border-l-4 [&_blockquote]:border-base-300 [&_blockquote]:pl-4 [&_blockquote]:italic [&_ul]:list-disc [&_ul]:pl-8 [&_ol]:list-decimal [&_ol]:pl-8",
contenteditable: "true",
oninput: notify,
onkeydown: (e) => {
if (e.key === "Tab") {
e.preventDefault();
exec("indent");
}
},
onkeyup: () => {
triggerRefresh();
saveSelection();
},
onclick: (e) => {
triggerRefresh();
saveSelection();
e.stopPropagation();
},
onmouseup: () => {
notify();
saveSelection();
},
onpaste: (e) => {
e.preventDefault();
const text = e.clipboardData.getData("text/plain");
exec("insertText", text);
},
ondragover: (e) => e.preventDefault(),
ondrop: (e) => {
e.preventDefault();
handleUpload(e.dataTransfer.files[0]);
}
}),
O("textarea", {
class: "w-full flex-1 min-h-[22rem] p-4 outline-none font-mono text-sm bg-base-200 border-0",
style: () => isSource() ? "" : "display:none",
value: source,
oninput: (e) => {
source(e.target.value);
if (editorRef)
editorRef.innerHTML = e.target.value;
p2.onchange?.(e.target.value);
}
})
]),
O("div", { class: "px-3 py-1 border-t border-base-300 bg-base-100/50 text-[10px] text-right text-base-content/60 italic" }, [
O("span", () => `${count()} caracteres`)
])
]);
};
// utils.js
var i18n = {
es: {
@@ -1480,8 +1232,7 @@ var tt = (t) => () => i18n[currentLocale()][t] || t;
// index.js
var Components = {
...exports_All,
...exports_Editor
...exports_All
};
var Utils = {
Locale,