gavaengine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/editor/ArticleEditor.tsx","../src/components/editor/extensions/ResizableImageExtension.ts","../src/components/editor/extensions/ResizableImageView.tsx","../src/components/editor/extensions/DraggableYoutubeExtension.ts","../src/components/editor/extensions/DraggableYoutubeView.tsx","../src/components/editor/extensions/VideoExtension.ts","../src/components/editor/extensions/VideoView.tsx","../src/components/editor/EditorToolbar.tsx","../src/components/media/MediaPickerModal.tsx","../src/components/editor/CoverImageUpload.tsx","../src/components/editor/RevisionPanel.tsx","../src/components/editor/ImageEditModal.tsx","../src/components/articles/ArticleList.tsx","../src/components/users/UserTable.tsx","../src/components/users/UserForm.tsx","../src/components/media/MediaGrid.tsx","../src/components/dashboard/DashboardNavbar.tsx","../src/components/dashboard/StatCard.tsx","../src/components/splash/SplashScreen.tsx","../src/components/splash/DashboardSplashTrigger.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { ResizableImage } from \"./extensions/ResizableImageExtension.js\";\nimport LinkExt from \"@tiptap/extension-link\";\nimport { DraggableYoutube } from \"./extensions/DraggableYoutubeExtension.js\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { VideoExtension } from \"./extensions/VideoExtension.js\";\nimport UnderlineExt from \"@tiptap/extension-underline\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport { Color } from \"@tiptap/extension-color\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport Superscript from \"@tiptap/extension-superscript\";\nimport Subscript from \"@tiptap/extension-subscript\";\nimport { Table } from \"@tiptap/extension-table\";\nimport { TableRow } from \"@tiptap/extension-table-row\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport {\n ArrowLeft,\n Check,\n Loader2,\n Settings,\n ChevronRight,\n Globe,\n FileText,\n History,\n Eye,\n} from \"lucide-react\";\nimport { EditorToolbar } from \"./EditorToolbar.js\";\nimport { CoverImageUpload } from \"./CoverImageUpload.js\";\nimport { RevisionPanel } from \"./RevisionPanel.js\";\nimport { useGavaActions } from \"../../providers/ActionsContext.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\n\ninterface ArticleData {\n id: string;\n title: string;\n slug: string;\n excerpt: string;\n content: string;\n coverImage: string;\n category: string;\n status: string;\n authorName: string;\n}\n\ninterface ArticleEditorProps {\n article: ArticleData;\n canPublish: boolean;\n}\n\ntype SaveStatus = \"idle\" | \"saving\" | \"saved\" | \"error\";\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nexport function ArticleEditor({ article, canPublish: canPub }: ArticleEditorProps) {\n const router = useRouter();\n const actions = useGavaActions();\n const config = useGavaConfig();\n const { strings, routes, categories, editor: editorConfig } = config;\n\n const [title, setTitle] = useState(article.title);\n const [slug, setSlug] = useState(article.slug);\n const [excerpt, setExcerpt] = useState(article.excerpt);\n const [coverImage, setCoverImage] = useState(article.coverImage);\n const [category, setCategory] = useState(article.category);\n const [status, setStatus] = useState(article.status);\n const [authorName, setAuthorName] = useState(article.authorName || \"\");\n const [saveStatus, setSaveStatus] = useState<SaveStatus>(\"idle\");\n const [showSettings, setShowSettings] = useState(false);\n const [showHistory, setShowHistory] = useState(false);\n const [autoSlug, setAutoSlug] = useState(!article.slug);\n const saveTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingUpdate = useRef(false);\n const mountedRef = useRef(false);\n const scrollRef = useRef<HTMLDivElement>(null);\n const [scrolled, setScrolled] = useState(false);\n const [hasSpace, setHasSpace] = useState(false);\n const spread = scrolled && hasSpace;\n\n useEffect(() => {\n document.documentElement.classList.remove(\"page-exit-to-editor\");\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = \"\";\n };\n }, []);\n\n useEffect(() => {\n const check = () => setHasSpace(window.innerWidth >= 1420);\n check();\n window.addEventListener(\"resize\", check);\n return () => window.removeEventListener(\"resize\", check);\n }, []);\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions: [\n StarterKit.configure({\n heading: { levels: editorConfig.headingLevels as [1, 2, 3, 4, 5, 6] },\n }),\n ResizableImage,\n LinkExt.configure({\n openOnClick: false,\n HTMLAttributes: { target: \"_blank\", rel: \"noopener noreferrer\" },\n }),\n DraggableYoutube.configure({\n HTMLAttributes: { class: \"article-video-embed\" },\n width: 640,\n height: 360,\n }),\n Placeholder.configure({\n placeholder: editorConfig.placeholder,\n }),\n UnderlineExt,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Highlight.configure({ multicolor: true }),\n Color,\n TextStyle,\n Superscript,\n Subscript,\n Table.configure({ resizable: true }),\n TableRow,\n TableCell,\n TableHeader,\n VideoExtension,\n ],\n content: article.content || \"\",\n editorProps: {\n attributes: {\n class: \"article-content outline-none min-h-[300px]\",\n },\n },\n onUpdate: () => {\n scheduleSave();\n },\n });\n\n const doSave = useCallback(\n async (fields?: {\n title?: string;\n slug?: string;\n excerpt?: string;\n coverImage?: string;\n category?: string;\n content?: string;\n authorName?: string;\n }) => {\n if (!fields && !editor) return;\n if (pendingUpdate.current) return;\n pendingUpdate.current = true;\n setSaveStatus(\"saving\");\n\n try {\n const data = fields ?? {\n title,\n slug,\n excerpt,\n coverImage,\n category,\n content: editor?.getHTML() ?? \"\",\n authorName,\n };\n\n await actions.updateArticle(article.id, data);\n setSaveStatus(\"saved\");\n setTimeout(() => setSaveStatus(\"idle\"), 2000);\n } catch {\n setSaveStatus(\"error\");\n } finally {\n pendingUpdate.current = false;\n }\n },\n [article.id, title, slug, excerpt, coverImage, category, editor, authorName, actions]\n );\n\n const scheduleSave = useCallback(() => {\n if (saveTimeout.current) clearTimeout(saveTimeout.current);\n saveTimeout.current = setTimeout(() => doSave(), editorConfig.autoSaveDelay);\n }, [doSave, editorConfig.autoSaveDelay]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === \"s\") {\n e.preventDefault();\n if (saveTimeout.current) clearTimeout(saveTimeout.current);\n doSave();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [doSave]);\n\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n scheduleSave();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [title, slug, excerpt, coverImage, category, authorName]);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const onScroll = () => setScrolled(el.scrollTop > 50);\n onScroll();\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, []);\n\n useEffect(() => {\n if (autoSlug && title) {\n setSlug(slugify(title));\n }\n }, [title, autoSlug]);\n\n const handlePublish = async () => {\n if (saveTimeout.current) clearTimeout(saveTimeout.current);\n await doSave();\n try {\n await actions.publishArticle(article.id);\n setStatus(\"pubblicato\");\n router.refresh();\n } catch (err) {\n alert(err instanceof Error ? err.message : \"Error publishing\");\n }\n };\n\n const handleUnpublish = async () => {\n try {\n await actions.unpublishArticle(article.id);\n setStatus(\"bozza\");\n router.refresh();\n } catch (err) {\n alert(err instanceof Error ? err.message : \"Error\");\n }\n };\n\n const handleSaveDraft = async () => {\n if (saveTimeout.current) clearTimeout(saveTimeout.current);\n await doSave();\n };\n\n return (\n <div className=\"-mx-4 sm:-mx-6 -my-6 lg:-my-8 h-[calc(100dvh-4.5rem)] flex flex-col bg-background overflow-hidden\">\n {/* Top bar */}\n <div\n className={`z-20 px-4 py-3 pointer-events-none transition-all duration-500 ease-out ${spread ? \"absolute top-[4.5rem] left-0 right-0\" : \"flex-shrink-0 relative\"}`}\n >\n <div\n className=\"flex items-center justify-between mx-auto transition-all duration-500 ease-out\"\n style={{ maxWidth: spread ? \"100%\" : \"64rem\" }}\n >\n <div\n className={`flex items-center pointer-events-auto transition-all duration-500 ease-out ${spread ? \"bg-background/90 backdrop-blur-md shadow-lg border border-card-border/50 rounded-full px-3 py-1.5\" : \"\"}`}\n >\n <button\n onClick={() => router.push(routes.articles)}\n className=\"flex items-center gap-2 text-sm text-muted hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"w-4 h-4\" />\n <span className=\"hidden sm:inline\">{strings.articles}</span>\n </button>\n </div>\n\n <div\n className={`flex items-center gap-2 text-sm text-muted transition-all duration-500 ${spread ? \"opacity-0 scale-90 pointer-events-none\" : \"opacity-100 scale-100\"}`}\n >\n {saveStatus === \"saving\" && (\n <>\n <Loader2 className=\"w-3.5 h-3.5 animate-spin\" />\n <span>{strings.saving}</span>\n </>\n )}\n {saveStatus === \"saved\" && (\n <>\n <Check className=\"w-3.5 h-3.5 text-green-500\" />\n <span className=\"text-green-500\">{strings.saved}</span>\n </>\n )}\n {saveStatus === \"error\" && (\n <span className=\"text-red-500\">{strings.saveError}</span>\n )}\n </div>\n\n <div\n className={`flex items-center gap-2 pointer-events-auto transition-all duration-500 ease-out ${spread ? \"bg-background/90 backdrop-blur-md shadow-lg border border-card-border/50 rounded-full px-2 py-1\" : \"\"}`}\n >\n <div\n className={`flex items-center gap-1.5 text-sm text-muted overflow-hidden transition-all duration-300 ${spread && saveStatus !== \"idle\" ? \"max-w-[30px] opacity-100 pl-1\" : \"max-w-0 opacity-0\"}`}\n >\n {saveStatus === \"saving\" && (\n <Loader2 className=\"w-3.5 h-3.5 animate-spin flex-shrink-0\" />\n )}\n {saveStatus === \"saved\" && (\n <Check className=\"w-3.5 h-3.5 text-green-500 flex-shrink-0\" />\n )}\n {saveStatus === \"error\" && (\n <span className=\"w-2 h-2 rounded-full bg-red-500 flex-shrink-0\" />\n )}\n </div>\n\n <button\n onClick={() =>\n window.open(\n status === \"pubblicato\" && slug\n ? routes.articleView(slug)\n : routes.articlePreview(article.id),\n \"_blank\"\n )\n }\n className=\"p-2 rounded-full text-muted hover:text-foreground hover:bg-card-border/50 transition-colors\"\n title={\n status === \"pubblicato\"\n ? strings.viewArticle\n : strings.preview\n }\n >\n <Eye className=\"w-4 h-4\" />\n </button>\n\n <button\n onClick={() => {\n setShowHistory(!showHistory);\n if (!showHistory) setShowSettings(false);\n }}\n className={`p-2 rounded-full transition-colors ${\n showHistory\n ? \"bg-accent/10 text-accent\"\n : \"text-muted hover:text-foreground hover:bg-card-border/50\"\n }`}\n title={strings.revisions}\n >\n <History className=\"w-4 h-4\" />\n </button>\n\n <button\n onClick={() => {\n setShowSettings(!showSettings);\n if (!showSettings) setShowHistory(false);\n }}\n className={`p-2 rounded-full transition-colors ${\n showSettings\n ? \"bg-accent/10 text-accent\"\n : \"text-muted hover:text-foreground hover:bg-card-border/50\"\n }`}\n title={strings.settings}\n >\n <Settings className=\"w-4 h-4\" />\n </button>\n\n <button\n onClick={handleSaveDraft}\n className=\"px-3 py-1.5 text-sm border border-card-border/50 rounded-full hover:bg-card-border/50 transition-colors\"\n >\n {strings.saveDraft}\n </button>\n\n {canPub && status === \"bozza\" && (\n <button\n onClick={handlePublish}\n className=\"px-4 py-1.5 text-sm bg-accent text-white rounded-full hover:bg-accent-hover transition-colors font-medium flex items-center gap-1.5\"\n >\n <Globe className=\"w-3.5 h-3.5\" />\n {strings.publish}\n </button>\n )}\n {canPub && status === \"pubblicato\" && (\n <button\n onClick={handleUnpublish}\n className=\"px-3 py-1.5 text-sm border border-amber-500 text-amber-600 rounded-full hover:bg-amber-50 transition-colors\"\n >\n {strings.unpublish}\n </button>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex-1 flex min-h-0\">\n <div className=\"flex-1 overflow-y-auto\" ref={scrollRef}>\n <div className=\"article-content-wrapper py-8\">\n <div className=\"flex items-center gap-2 mb-6\">\n {status === \"pubblicato\" ? (\n <span className=\"inline-flex items-center gap-1.5 text-xs font-medium text-green-600 bg-green-50 px-2.5 py-1 rounded-full\">\n <Globe className=\"w-3 h-3\" />\n {strings.published}\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1.5 text-xs font-medium text-amber-600 bg-amber-50 px-2.5 py-1 rounded-full\">\n <FileText className=\"w-3 h-3\" />\n {strings.draft}\n </span>\n )}\n </div>\n\n <CoverImageUpload value={coverImage} onChange={setCoverImage} />\n\n <textarea\n ref={(el) => {\n if (el) {\n el.style.height = \"auto\";\n el.style.height = el.scrollHeight + \"px\";\n }\n }}\n value={title}\n onChange={(e) => {\n setTitle(e.target.value);\n const el = e.target;\n el.style.height = \"auto\";\n el.style.height = el.scrollHeight + \"px\";\n }}\n rows={1}\n placeholder={strings.titlePlaceholder}\n className=\"w-full mt-8 mb-6 text-4xl md:text-[2.75rem] lg:text-5xl font-heading font-bold text-foreground leading-[1.08] tracking-[-0.02em] bg-transparent border-none outline-none placeholder:text-muted-foreground/40 resize-none overflow-hidden\"\n />\n </div>\n\n <div className=\"sticky top-0 z-10 py-2 flex justify-center px-4\">\n <EditorToolbar editor={editor} />\n </div>\n\n <div className=\"article-content-wrapper pb-8\">\n <EditorContent editor={editor} />\n </div>\n </div>\n\n {showHistory && (\n <RevisionPanel\n articleId={article.id}\n onClose={() => setShowHistory(false)}\n onRestore={() => router.refresh()}\n />\n )}\n\n {showSettings && (\n <div className=\"w-80 border-l border-card-border bg-card overflow-auto p-5 hidden lg:block\">\n <h3 className=\"font-semibold text-foreground mb-4 flex items-center gap-2\">\n <Settings className=\"w-4 h-4\" />\n {strings.settings}\n </h3>\n\n <div className=\"space-y-5\">\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {strings.slugUrl}\n </label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={slug}\n onChange={(e) => {\n setAutoSlug(false);\n setSlug(e.target.value);\n }}\n placeholder={strings.slugPlaceholder}\n className=\"flex-1 px-3 py-2 text-sm bg-background border border-card-border rounded-lg outline-none focus:border-accent\"\n />\n </div>\n <p className=\"text-xs text-muted mt-1\">\n {routes.articleView(slug || \"...\")}\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {strings.category}\n </label>\n <select\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n className=\"w-full px-3 py-2 text-sm bg-background border border-card-border rounded-lg outline-none focus:border-accent\"\n >\n <option value=\"\">{strings.selectCategory}</option>\n {categories.map((cat) => (\n <option key={cat} value={cat}>\n {cat}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {strings.excerpt}\n </label>\n <textarea\n value={excerpt}\n onChange={(e) => setExcerpt(e.target.value)}\n placeholder={strings.excerptPlaceholder}\n rows={3}\n className=\"w-full px-3 py-2 text-sm bg-background border border-card-border rounded-lg outline-none focus:border-accent resize-none\"\n />\n </div>\n\n <div className=\"pt-4 border-t border-card-border\">\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {strings.author}\n </label>\n <input\n type=\"text\"\n value={authorName}\n onChange={(e) => setAuthorName(e.target.value)}\n placeholder={strings.authorPlaceholder}\n className=\"w-full px-3 py-2 text-sm bg-background border border-card-border rounded-lg outline-none focus:border-accent\"\n />\n </div>\n </div>\n\n {status === \"pubblicato\" && slug && (\n <div>\n <a\n href={routes.articleView(slug)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 text-sm text-accent hover:underline\"\n >\n {strings.viewArticle}\n <ChevronRight className=\"w-3.5 h-3.5\" />\n </a>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { ResizableImageView } from \"./ResizableImageView.js\";\n\nexport interface ImageOptions {\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n resizableImage: {\n setImage: (options: {\n src: string;\n alt?: string;\n title?: string;\n }) => ReturnType;\n };\n }\n}\n\nfunction figureAlignToWrap(figure: HTMLElement): string {\n if (figure.classList.contains(\"align-left\")) return \"left\";\n if (figure.classList.contains(\"align-right\")) return \"right\";\n return \"none\";\n}\n\nfunction figureWidth(figure: HTMLElement): string {\n return figure.style.maxWidth || figure.style.width || \"100%\";\n}\n\nexport const ResizableImage = Node.create<ImageOptions>({\n name: \"image\",\n group: \"block\",\n draggable: true,\n atom: true,\n\n addOptions() {\n return { HTMLAttributes: {} };\n },\n\n addAttributes() {\n return {\n src: { default: null },\n alt: { default: null },\n title: { default: null },\n width: {\n default: \"100%\",\n parseHTML: (el: HTMLElement) => {\n const figure = el.closest(\"figure\");\n if (figure) return figureWidth(figure);\n return el.style.width || \"100%\";\n },\n renderHTML: (attrs: Record<string, string>) => ({\n style: `width: ${attrs.width}`,\n }),\n },\n textWrap: {\n default: \"none\",\n parseHTML: (el: HTMLElement) => {\n const figure = el.closest(\"figure\");\n if (figure) return figureAlignToWrap(figure);\n return (\n el.getAttribute(\"data-text-wrap\") ||\n el.getAttribute(\"data-float\") ||\n \"none\"\n );\n },\n renderHTML: (attrs: Record<string, string>) => ({\n \"data-text-wrap\": attrs.textWrap,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n { tag: \"figure img[src]\" },\n { tag: \"img[src]\" },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"img\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n ];\n },\n\n addCommands() {\n return {\n setImage:\n (options) =>\n ({ commands }) =>\n commands.insertContent({ type: this.name, attrs: options }),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ResizableImageView);\n },\n});\n","\"use client\";\n\nimport { NodeViewWrapper, type NodeViewProps } from \"@tiptap/react\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { AlignLeft, AlignCenter, AlignRight, Trash2 } from \"lucide-react\";\n\ntype WrapMode = \"none\" | \"left\" | \"right\";\ntype Handle = \"nw\" | \"ne\" | \"sw\" | \"se\";\n\nexport function ResizableImageView({\n node,\n updateAttributes,\n selected,\n deleteNode,\n}: NodeViewProps) {\n const { src, alt, width, textWrap } = node.attrs as {\n src: string;\n alt: string;\n width: string;\n textWrap: WrapMode;\n };\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [resizing, setResizing] = useState(false);\n\n const onResizeStart = useCallback(\n (e: React.MouseEvent, handle: Handle) => {\n e.preventDefault();\n e.stopPropagation();\n setResizing(true);\n\n const startX = e.clientX;\n const container = wrapperRef.current?.closest(\n \".article-content, .tiptap\"\n ) as HTMLElement | null;\n if (!container) return;\n\n const containerWidth = container.getBoundingClientRect().width;\n const startWidthPx = wrapperRef.current!.getBoundingClientRect().width;\n const isLeft = handle === \"nw\" || handle === \"sw\";\n\n const onMove = (ev: MouseEvent) => {\n const rawDelta = ev.clientX - startX;\n const delta = isLeft ? -rawDelta : rawDelta;\n const newPx = Math.max(startWidthPx + delta, containerWidth * 0.1);\n const pct = Math.min((newPx / containerWidth) * 100, 100);\n updateAttributes({ width: `${Math.round(pct)}%` });\n };\n\n const onUp = () => {\n setResizing(false);\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n },\n [updateAttributes]\n );\n\n const setWrap = useCallback(\n (mode: WrapMode) => {\n if (mode === \"none\") {\n updateAttributes({ textWrap: \"none\", width: \"100%\" });\n } else {\n const pct = parseInt(width, 10);\n updateAttributes({\n textWrap: mode,\n width: pct > 60 ? \"40%\" : width,\n });\n }\n },\n [updateAttributes, width]\n );\n\n return (\n <NodeViewWrapper\n className={[\"image-node\", selected && \"selected\", resizing && \"resizing\"]\n .filter(Boolean)\n .join(\" \")}\n data-text-wrap={textWrap}\n style={{ width }}\n ref={wrapperRef}\n >\n <img\n src={src}\n alt={alt || \"\"}\n draggable={false}\n data-drag-handle\n className=\"image-node__img\"\n />\n\n {selected && (\n <>\n {([\"nw\", \"ne\", \"sw\", \"se\"] as Handle[]).map((h) => (\n <span\n key={h}\n className={`image-node__handle image-node__handle--${h}`}\n onMouseDown={(e) => onResizeStart(e, h)}\n contentEditable={false}\n />\n ))}\n\n {!resizing && (\n <div\n className=\"image-node__toolbar\"\n contentEditable={false}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n onClick={() => setWrap(\"left\")}\n className={textWrap === \"left\" ? \"active\" : \"\"}\n title=\"Text right\"\n >\n <AlignLeft className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setWrap(\"none\")}\n className={textWrap === \"none\" ? \"active\" : \"\"}\n title=\"Full width\"\n >\n <AlignCenter className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setWrap(\"right\")}\n className={textWrap === \"right\" ? \"active\" : \"\"}\n title=\"Text left\"\n >\n <AlignRight className=\"w-4 h-4\" />\n </button>\n <span className=\"image-node__toolbar-sep\" />\n <button\n type=\"button\"\n onClick={() => deleteNode()}\n className=\"delete\"\n title=\"Remove\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n </>\n )}\n </NodeViewWrapper>\n );\n}\n","import Youtube from \"@tiptap/extension-youtube\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { DraggableYoutubeView } from \"./DraggableYoutubeView.js\";\n\nexport const DraggableYoutube = Youtube.extend({\n draggable: true,\n\n addNodeView() {\n return ReactNodeViewRenderer(DraggableYoutubeView);\n },\n});\n","\"use client\";\n\nimport { NodeViewWrapper, type NodeViewProps } from \"@tiptap/react\";\n\nfunction toEmbedUrl(url: string): string {\n if (!url) return \"\";\n if (url.includes(\"/embed/\")) return url;\n\n const shortMatch = url.match(/youtu\\.be\\/([\\w-]+)/);\n if (shortMatch) return `https://www.youtube.com/embed/${shortMatch[1]}`;\n\n const match = url.match(/(?:v=|shorts\\/)([\\w-]+)/);\n if (match) return `https://www.youtube.com/embed/${match[1]}`;\n\n return url;\n}\n\nexport function DraggableYoutubeView({ node, selected }: NodeViewProps) {\n const { src, width, height } = node.attrs;\n const embedUrl = toEmbedUrl(src ?? \"\");\n\n if (!embedUrl) return <NodeViewWrapper />;\n\n return (\n <NodeViewWrapper\n className={`draggable-video-wrapper${selected ? \" selected\" : \"\"}`}\n data-drag-handle\n >\n <iframe\n src={embedUrl}\n width={width || 640}\n height={height || 360}\n allowFullScreen\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n style={{ pointerEvents: selected ? \"none\" : \"auto\" }}\n />\n </NodeViewWrapper>\n );\n}\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { VideoView } from \"./VideoView.js\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n videoBlock: {\n setVideo: (options: { src: string }) => ReturnType;\n };\n }\n}\n\nexport const VideoExtension = Node.create({\n name: \"videoBlock\",\n group: \"block\",\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n src: { default: null },\n };\n },\n\n parseHTML() {\n return [{ tag: \"video[src]\" }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n { class: \"article-video\" },\n [\"video\", mergeAttributes(HTMLAttributes, { controls: \"true\" })],\n ];\n },\n\n addCommands() {\n return {\n setVideo:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n });\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(VideoView);\n },\n});\n","\"use client\";\n\nimport { NodeViewWrapper, type NodeViewProps } from \"@tiptap/react\";\n\nexport function VideoView({ node, selected }: NodeViewProps) {\n const { src } = node.attrs;\n\n if (!src) return <NodeViewWrapper />;\n\n return (\n <NodeViewWrapper\n className={`article-video draggable-video-wrapper${selected ? \" selected\" : \"\"}`}\n data-drag-handle\n >\n <video\n src={src}\n controls\n style={{ pointerEvents: selected ? \"none\" : \"auto\" }}\n />\n </NodeViewWrapper>\n );\n}\n","\"use client\";\n\nimport { Editor } from \"@tiptap/react\";\nimport {\n Bold,\n Italic,\n Underline,\n Strikethrough,\n Superscript,\n Subscript,\n Heading2,\n Heading3,\n List,\n ListOrdered,\n Quote,\n Minus,\n Code,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Link,\n Image,\n Youtube,\n Video,\n Undo2,\n Redo2,\n Highlighter,\n Palette,\n Table,\n Plus,\n X,\n} from \"lucide-react\";\nimport { useCallback, useState, useRef, useEffect } from \"react\";\nimport { MediaPickerModal } from \"../media/MediaPickerModal.js\";\nimport { useGavaActions } from \"../../providers/ActionsContext.js\";\n\ninterface EditorToolbarProps {\n editor: Editor | null;\n}\n\nconst TEXT_COLORS = [\n { label: \"Black\", value: \"#171717\" },\n { label: \"Red\", value: \"#dc2626\" },\n { label: \"Orange\", value: \"#ea580c\" },\n { label: \"Green\", value: \"#16a34a\" },\n { label: \"Blue\", value: \"#2563eb\" },\n { label: \"Purple\", value: \"#9333ea\" },\n { label: \"Gray\", value: \"#6b7280\" },\n];\n\nconst HIGHLIGHT_COLORS = [\n { label: \"Yellow\", value: \"#fef08a\" },\n { label: \"Green\", value: \"#bbf7d0\" },\n { label: \"Blue\", value: \"#bfdbfe\" },\n { label: \"Pink\", value: \"#fbcfe8\" },\n { label: \"Orange\", value: \"#fed7aa\" },\n { label: \"Purple\", value: \"#e9d5ff\" },\n];\n\nexport function EditorToolbar({ editor }: EditorToolbarProps) {\n const actions = useGavaActions();\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showHighlightPicker, setShowHighlightPicker] = useState(false);\n const [showTableMenu, setShowTableMenu] = useState(false);\n const [mediaPickerOpen, setMediaPickerOpen] = useState(false);\n const colorRef = useRef<HTMLDivElement>(null);\n const highlightRef = useRef<HTMLDivElement>(null);\n const tableRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n if (colorRef.current && !colorRef.current.contains(e.target as Node))\n setShowColorPicker(false);\n if (\n highlightRef.current &&\n !highlightRef.current.contains(e.target as Node)\n )\n setShowHighlightPicker(false);\n if (tableRef.current && !tableRef.current.contains(e.target as Node))\n setShowTableMenu(false);\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, []);\n\n const handleImageSelect = useCallback(\n (url: string) => {\n if (!editor) return;\n editor.chain().focus().setImage({ src: url }).run();\n setMediaPickerOpen(false);\n },\n [editor]\n );\n\n const addLink = useCallback(() => {\n if (!editor) return;\n const previousUrl = editor.getAttributes(\"link\").href;\n const url = window.prompt(\"URL:\", previousUrl);\n if (url === null) return;\n if (url === \"\") {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n return;\n }\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: url })\n .run();\n }, [editor]);\n\n const addYoutube = useCallback(() => {\n if (!editor) return;\n const url = window.prompt(\"YouTube URL:\");\n if (!url) return;\n editor.commands.setYoutubeVideo({ src: url, width: 640, height: 360 });\n }, [editor]);\n\n const addVideo = useCallback(() => {\n if (!editor) return;\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"video/mp4,video/webm,video/quicktime\";\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n const formData = new FormData();\n formData.append(\"file\", file);\n const res = await fetch(actions.uploadUrl, {\n method: \"POST\",\n body: formData,\n });\n const data = await res.json();\n if (data.url) {\n editor.commands.setVideo({ src: data.url });\n } else if (data.error) {\n alert(data.error);\n }\n };\n input.click();\n }, [editor, actions.uploadUrl]);\n\n if (!editor) return null;\n\n const ToolButton = ({\n onClick,\n active,\n children,\n title,\n }: {\n onClick: () => void;\n active?: boolean;\n children: React.ReactNode;\n title: string;\n }) => (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={`p-1.5 rounded-full transition-colors ${\n active\n ? \"bg-accent/15 text-accent\"\n : \"text-muted hover:bg-card-border/50 hover:text-foreground\"\n }`}\n >\n {children}\n </button>\n );\n\n const Divider = () => <div className=\"w-px h-6 bg-card-border mx-1\" />;\n\n const DropdownItem = ({\n onClick,\n children,\n danger,\n }: {\n onClick: () => void;\n children: React.ReactNode;\n danger?: boolean;\n }) => (\n <button\n onClick={onClick}\n className={`w-full text-left px-3 py-1.5 text-sm transition-colors ${\n danger\n ? \"text-red-500 hover:bg-red-50\"\n : \"text-foreground hover:bg-card-border/50\"\n }`}\n >\n {children}\n </button>\n );\n\n return (\n <div className=\"inline-flex items-center flex-wrap gap-0.5 p-2 border border-card-border rounded-full bg-card\">\n <ToolButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n active={editor.isActive(\"bold\")}\n title=\"Bold\"\n >\n <Bold className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n active={editor.isActive(\"italic\")}\n title=\"Italic\"\n >\n <Italic className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n active={editor.isActive(\"underline\")}\n title=\"Underline\"\n >\n <Underline className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().toggleStrike().run()}\n active={editor.isActive(\"strike\")}\n title=\"Strikethrough\"\n >\n <Strikethrough className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n active={editor.isActive(\"superscript\")}\n title=\"Superscript\"\n >\n <Superscript className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n active={editor.isActive(\"subscript\")}\n title=\"Subscript\"\n >\n <Subscript className=\"w-4 h-4\" />\n </ToolButton>\n\n <Divider />\n\n <div className=\"relative\" ref={colorRef}>\n <ToolButton\n onClick={() => {\n setShowColorPicker(!showColorPicker);\n setShowHighlightPicker(false);\n setShowTableMenu(false);\n }}\n active={showColorPicker}\n title=\"Text color\"\n >\n <div className=\"flex flex-col items-center gap-0.5\">\n <Palette className=\"w-4 h-4\" />\n <div\n className=\"w-3.5 h-0.5 rounded-full\"\n style={{\n background:\n editor.getAttributes(\"textStyle\").color || \"currentColor\",\n }}\n />\n </div>\n </ToolButton>\n {showColorPicker && (\n <div className=\"absolute top-full left-0 mt-1 bg-card border border-card-border rounded-lg p-2 shadow-lg z-30\">\n <div className=\"grid grid-cols-4 gap-1.5 w-[132px]\">\n <button\n onClick={() => {\n editor.chain().focus().unsetColor().run();\n setShowColorPicker(false);\n }}\n className=\"w-7 h-7 rounded-md border border-card-border hover:scale-110 transition-transform flex items-center justify-center bg-background\"\n title=\"Default\"\n >\n <X className=\"w-3 h-3 text-muted\" />\n </button>\n {TEXT_COLORS.map((c) => (\n <button\n key={c.value}\n onClick={() => {\n editor.chain().focus().setColor(c.value).run();\n setShowColorPicker(false);\n }}\n className=\"w-7 h-7 rounded-md border border-card-border hover:scale-110 transition-transform\"\n style={{ background: c.value }}\n title={c.label}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n\n <div className=\"relative\" ref={highlightRef}>\n <ToolButton\n onClick={() => {\n setShowHighlightPicker(!showHighlightPicker);\n setShowColorPicker(false);\n setShowTableMenu(false);\n }}\n active={editor.isActive(\"highlight\")}\n title=\"Highlight\"\n >\n <Highlighter className=\"w-4 h-4\" />\n </ToolButton>\n {showHighlightPicker && (\n <div className=\"absolute top-full left-0 mt-1 bg-card border border-card-border rounded-lg p-2 shadow-lg z-30\">\n <div className=\"grid grid-cols-4 gap-1.5 w-[132px]\">\n <button\n onClick={() => {\n editor.chain().focus().unsetHighlight().run();\n setShowHighlightPicker(false);\n }}\n className=\"w-7 h-7 rounded-md border border-card-border hover:scale-110 transition-transform flex items-center justify-center bg-background\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3 text-muted\" />\n </button>\n {HIGHLIGHT_COLORS.map((c) => (\n <button\n key={c.value}\n onClick={() => {\n editor\n .chain()\n .focus()\n .toggleHighlight({ color: c.value })\n .run();\n setShowHighlightPicker(false);\n }}\n className=\"w-7 h-7 rounded-md border border-card-border hover:scale-110 transition-transform\"\n style={{ background: c.value }}\n title={c.label}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n\n <Divider />\n\n <ToolButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n active={editor.isActive(\"heading\", { level: 2 })}\n title=\"H2\"\n >\n <Heading2 className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}\n active={editor.isActive(\"heading\", { level: 3 })}\n title=\"H3\"\n >\n <Heading3 className=\"w-4 h-4\" />\n </ToolButton>\n\n <Divider />\n\n <ToolButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n active={editor.isActive(\"bulletList\")}\n title=\"Bullet list\"\n >\n <List className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n active={editor.isActive(\"orderedList\")}\n title=\"Numbered list\"\n >\n <ListOrdered className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n active={editor.isActive(\"blockquote\")}\n title=\"Quote\"\n >\n <Quote className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n active={editor.isActive(\"codeBlock\")}\n title=\"Code block\"\n >\n <Code className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title=\"Divider\"\n >\n <Minus className=\"w-4 h-4\" />\n </ToolButton>\n\n <Divider />\n\n <ToolButton\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\n active={editor.isActive({ textAlign: \"left\" })}\n title=\"Align left\"\n >\n <AlignLeft className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\n active={editor.isActive({ textAlign: \"center\" })}\n title=\"Align center\"\n >\n <AlignCenter className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\n active={editor.isActive({ textAlign: \"right\" })}\n title=\"Align right\"\n >\n <AlignRight className=\"w-4 h-4\" />\n </ToolButton>\n\n <Divider />\n\n <div className=\"relative\" ref={tableRef}>\n <ToolButton\n onClick={() => {\n setShowTableMenu(!showTableMenu);\n setShowColorPicker(false);\n setShowHighlightPicker(false);\n }}\n active={editor.isActive(\"table\")}\n title=\"Table\"\n >\n <Table className=\"w-4 h-4\" />\n </ToolButton>\n {showTableMenu && (\n <div className=\"absolute top-full left-0 mt-1 bg-card border border-card-border rounded-lg py-1 shadow-lg z-30 w-52\">\n {!editor.isActive(\"table\") ? (\n <DropdownItem\n onClick={() => {\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run();\n setShowTableMenu(false);\n }}\n >\n <span className=\"flex items-center gap-2\">\n <Plus className=\"w-3.5 h-3.5\" />\n Insert 3x3 table\n </span>\n </DropdownItem>\n ) : (\n <>\n <DropdownItem\n onClick={() => {\n editor.chain().focus().addRowBefore().run();\n setShowTableMenu(false);\n }}\n >\n Add row above\n </DropdownItem>\n <DropdownItem\n onClick={() => {\n editor.chain().focus().addRowAfter().run();\n setShowTableMenu(false);\n }}\n >\n Add row below\n </DropdownItem>\n <DropdownItem\n onClick={() => {\n editor.chain().focus().addColumnBefore().run();\n setShowTableMenu(false);\n }}\n >\n Add column left\n </DropdownItem>\n <DropdownItem\n onClick={() => {\n editor.chain().focus().addColumnAfter().run();\n setShowTableMenu(false);\n }}\n >\n Add column right\n </DropdownItem>\n <div className=\"border-t border-card-border my-1\" />\n <DropdownItem\n danger\n onClick={() => {\n editor.chain().focus().deleteRow().run();\n setShowTableMenu(false);\n }}\n >\n Delete row\n </DropdownItem>\n <DropdownItem\n danger\n onClick={() => {\n editor.chain().focus().deleteColumn().run();\n setShowTableMenu(false);\n }}\n >\n Delete column\n </DropdownItem>\n <DropdownItem\n danger\n onClick={() => {\n editor.chain().focus().deleteTable().run();\n setShowTableMenu(false);\n }}\n >\n Delete table\n </DropdownItem>\n </>\n )}\n </div>\n )}\n </div>\n\n <Divider />\n\n <ToolButton onClick={addLink} active={editor.isActive(\"link\")} title=\"Link\">\n <Link className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton onClick={() => setMediaPickerOpen(true)} title=\"Image\">\n <Image className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton onClick={addYoutube} title=\"YouTube\">\n <Youtube className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton onClick={addVideo} title=\"Video\">\n <Video className=\"w-4 h-4\" />\n </ToolButton>\n\n <Divider />\n\n <ToolButton\n onClick={() => editor.chain().focus().undo().run()}\n title=\"Undo\"\n >\n <Undo2 className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton\n onClick={() => editor.chain().focus().redo().run()}\n title=\"Redo\"\n >\n <Redo2 className=\"w-4 h-4\" />\n </ToolButton>\n\n <MediaPickerModal\n open={mediaPickerOpen}\n onClose={() => setMediaPickerOpen(false)}\n onSelect={handleImageSelect}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { X, Search, Upload, Loader2, ImageIcon } from \"lucide-react\";\nimport { useGavaActions } from \"../../providers/ActionsContext.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\nimport type { GEMedia } from \"../../types.js\";\n\ninterface MediaPickerModalProps {\n open: boolean;\n onClose: () => void;\n onSelect: (url: string) => void;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function MediaPickerModal({\n open,\n onClose,\n onSelect,\n}: MediaPickerModalProps) {\n const actions = useGavaActions();\n const { strings, upload: uploadConfig } = useGavaConfig();\n const [tab, setTab] = useState<\"library\" | \"upload\">(\"library\");\n const [media, setMedia] = useState<GEMedia[]>([]);\n const [loading, setLoading] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [uploading, setUploading] = useState(false);\n const [dragOver, setDragOver] = useState(false);\n\n const loadMedia = useCallback(async () => {\n setLoading(true);\n try {\n const data = await actions.getMedia();\n setMedia(data);\n } finally {\n setLoading(false);\n }\n }, [actions]);\n\n useEffect(() => {\n if (open) {\n loadMedia();\n setSearch(\"\");\n setTab(\"library\");\n }\n }, [open, loadMedia]);\n\n useEffect(() => {\n if (!open) return;\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [open, onClose]);\n\n const uploadFile = useCallback(\n async (file: File) => {\n setUploading(true);\n try {\n const formData = new FormData();\n formData.append(\"file\", file);\n const res = await fetch(actions.uploadUrl, {\n method: \"POST\",\n body: formData,\n });\n const data = await res.json();\n if (data.url) {\n onSelect(data.url);\n }\n } finally {\n setUploading(false);\n }\n },\n [onSelect, actions.uploadUrl]\n );\n\n const handleFileSelect = useCallback(() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = uploadConfig.imageTypes.join(\",\");\n input.onchange = () => {\n const file = input.files?.[0];\n if (file) uploadFile(file);\n };\n input.click();\n }, [uploadFile, uploadConfig.imageTypes]);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n const file = e.dataTransfer.files[0];\n if (file && file.type.startsWith(\"image/\")) {\n uploadFile(file);\n }\n },\n [uploadFile]\n );\n\n if (!open) return null;\n\n const images = media.filter((m) => m.mimeType.startsWith(\"image/\"));\n const filtered = images.filter((m) =>\n search ? m.filename.toLowerCase().includes(search.toLowerCase()) : true\n );\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n <div className=\"absolute inset-0 bg-black/50\" onClick={onClose} />\n <div className=\"relative w-full max-w-3xl max-h-[85vh] mx-4 bg-card border border-card-border rounded-2xl shadow-xl flex flex-col dash-scale-in\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-card-border\">\n <h2 className=\"text-lg font-semibold text-foreground\">\n {strings.selectImage}\n </h2>\n <button\n onClick={onClose}\n className=\"p-1.5 rounded-full text-muted hover:bg-card-border/50 hover:text-foreground transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n <div className=\"flex border-b border-card-border px-5\">\n <button\n onClick={() => setTab(\"library\")}\n className={`px-4 py-2.5 text-sm font-medium border-b-2 transition-colors -mb-px ${\n tab === \"library\"\n ? \"border-accent text-accent\"\n : \"border-transparent text-muted hover:text-foreground\"\n }`}\n >\n {strings.mediaLibrary}\n </button>\n <button\n onClick={() => setTab(\"upload\")}\n className={`px-4 py-2.5 text-sm font-medium border-b-2 transition-colors -mb-px ${\n tab === \"upload\"\n ? \"border-accent text-accent\"\n : \"border-transparent text-muted hover:text-foreground\"\n }`}\n >\n {strings.uploadNew}\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-5\">\n {tab === \"library\" ? (\n <>\n <div className=\"relative mb-4\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={strings.searchFiles}\n className=\"w-full pl-9 pr-3 py-2 text-sm bg-background border border-card-border rounded-full outline-none focus:border-accent transition-colors\"\n />\n </div>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-16\">\n <Loader2 className=\"w-6 h-6 text-muted animate-spin\" />\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"text-center py-16\">\n <ImageIcon className=\"w-10 h-10 text-muted mx-auto mb-3\" />\n <p className=\"text-sm text-muted\">\n {search ? strings.noImagesSearch : strings.noImages}\n </p>\n </div>\n ) : (\n <div className=\"grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 gap-3\">\n {filtered.map((m) => (\n <button\n key={m.id}\n type=\"button\"\n onClick={() => onSelect(m.path)}\n className=\"group relative aspect-square rounded-lg overflow-hidden border border-card-border hover:border-accent transition-colors focus:outline-none focus:ring-2 focus:ring-accent\"\n >\n <img\n src={m.path}\n alt={m.filename}\n className=\"w-full h-full object-cover\"\n />\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/30 transition-colors\" />\n <div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/70 to-transparent p-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <p className=\"text-[11px] text-white truncate\">\n {m.filename}\n </p>\n <p className=\"text-[10px] text-white/70\">\n {formatSize(m.size)}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </>\n ) : (\n <div\n onDragOver={(e) => {\n e.preventDefault();\n setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={handleDrop}\n className={`flex flex-col items-center justify-center py-20 rounded-xl border-2 border-dashed transition-colors ${\n dragOver\n ? \"border-accent bg-accent/5\"\n : \"border-card-border\"\n }`}\n >\n {uploading ? (\n <Loader2 className=\"w-10 h-10 text-muted animate-spin\" />\n ) : (\n <>\n <Upload className=\"w-10 h-10 text-muted mb-4\" />\n <p className=\"text-sm text-muted mb-4\">{strings.dragHint}</p>\n <button\n type=\"button\"\n onClick={handleFileSelect}\n className=\"px-5 py-2 text-sm font-medium bg-accent text-white rounded-full hover:bg-accent/90 transition-colors\"\n >\n {strings.chooseFile}\n </button>\n <p className=\"text-xs text-muted mt-3\">\n {strings.uploadHint}\n </p>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { ImagePlus, X } from \"lucide-react\";\nimport { MediaPickerModal } from \"../media/MediaPickerModal.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\n\ninterface CoverImageUploadProps {\n value: string;\n onChange: (url: string) => void;\n}\n\nexport function CoverImageUpload({ value, onChange }: CoverImageUploadProps) {\n const [pickerOpen, setPickerOpen] = useState(false);\n const { strings } = useGavaConfig();\n\n const handleSelect = (url: string) => {\n onChange(url);\n setPickerOpen(false);\n };\n\n if (value) {\n return (\n <>\n <div className=\"relative aspect-[2/1] w-full rounded-xl overflow-hidden group cursor-pointer\">\n <img\n src={value}\n alt={strings.coverImageLabel}\n className=\"w-full h-full object-cover\"\n />\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/30 transition-colors flex items-center justify-center\">\n <div className=\"opacity-0 group-hover:opacity-100 transition-opacity flex gap-2\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setPickerOpen(true);\n }}\n className=\"bg-white text-gray-900 px-4 py-2 rounded-full text-sm font-medium hover:bg-gray-100 transition-colors\"\n >\n {strings.change}\n </button>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onChange(\"\");\n }}\n className=\"bg-red-500 text-white p-2 rounded-full hover:bg-red-600 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n <MediaPickerModal\n open={pickerOpen}\n onClose={() => setPickerOpen(false)}\n onSelect={handleSelect}\n />\n </>\n );\n }\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setPickerOpen(true)}\n className=\"w-full aspect-[2/1] rounded-xl border-2 border-dashed transition-colors flex flex-col items-center justify-center gap-3 border-card-border hover:border-muted\"\n >\n <ImagePlus className=\"w-8 h-8 text-muted\" />\n <div className=\"text-sm text-muted\">\n <span className=\"font-medium text-foreground\">\n {strings.coverImageLabel}\n </span>\n </div>\n <span className=\"text-xs text-muted\">{strings.coverImageHint}</span>\n </button>\n <MediaPickerModal\n open={pickerOpen}\n onClose={() => setPickerOpen(false)}\n onSelect={handleSelect}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { X, RotateCcw, Clock } from \"lucide-react\";\nimport { useGavaActions } from \"../../providers/ActionsContext.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\nimport type { GERevision } from \"../../types.js\";\n\ninterface RevisionPanelProps {\n articleId: string;\n onClose: () => void;\n onRestore: () => void;\n}\n\nexport function RevisionPanel({\n articleId,\n onClose,\n onRestore,\n}: RevisionPanelProps) {\n const actions = useGavaActions();\n const { strings } = useGavaConfig();\n const [revisions, setRevisions] = useState<GERevision[]>([]);\n const [loading, setLoading] = useState(true);\n const [restoring, setRestoring] = useState<string | null>(null);\n\n useEffect(() => {\n loadRevisions();\n }, [articleId]);\n\n async function loadRevisions() {\n setLoading(true);\n try {\n const data = await actions.getRevisions(articleId);\n setRevisions(data);\n } catch {\n // ignore\n } finally {\n setLoading(false);\n }\n }\n\n async function handleRestore(revisionId: string) {\n if (!confirm(strings.restoreConfirm)) return;\n setRestoring(revisionId);\n try {\n await actions.restoreRevision(articleId, revisionId);\n onRestore();\n } catch (err) {\n alert(err instanceof Error ? err.message : \"Error restoring revision\");\n } finally {\n setRestoring(null);\n }\n }\n\n function formatDate(date: Date) {\n return new Date(date).toLocaleString(\"it-IT\", {\n day: \"numeric\",\n month: \"short\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n }\n\n return (\n <div className=\"w-80 border-l border-card-border bg-card overflow-auto p-5 hidden lg:block\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"font-semibold text-foreground flex items-center gap-2\">\n <Clock className=\"w-4 h-4\" />\n {strings.revisions}\n </h3>\n <button\n onClick={onClose}\n className=\"p-1 rounded-full text-muted hover:text-foreground hover:bg-card-border/50 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {loading ? (\n <p className=\"text-sm text-muted\">{strings.loading}</p>\n ) : revisions.length === 0 ? (\n <p className=\"text-sm text-muted\">{strings.noRevisions}</p>\n ) : (\n <div className=\"space-y-3\">\n {revisions.map((rev) => (\n <div\n key={rev.id}\n className=\"p-3 rounded-lg border border-card-border hover:border-accent/30 transition-colors\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {rev.title || strings.untitled}\n </p>\n <p className=\"text-xs text-muted mt-0.5\">\n {formatDate(rev.createdAt)} — {rev.editor.name}\n </p>\n {rev.note && (\n <p className=\"text-xs text-accent mt-1\">{rev.note}</p>\n )}\n </div>\n <button\n onClick={() => handleRestore(rev.id)}\n disabled={restoring === rev.id}\n className=\"p-1.5 rounded-full text-muted hover:text-accent hover:bg-accent/10 transition-colors flex-shrink-0 disabled:opacity-50\"\n title={strings.restore}\n >\n <RotateCcw\n className={`w-3.5 h-3.5 ${restoring === rev.id ? \"animate-spin\" : \"\"}`}\n />\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport Cropper from \"react-easy-crop\";\nimport type { Area } from \"react-easy-crop\";\nimport {\n X,\n ZoomIn,\n ZoomOut,\n Check,\n RectangleHorizontal,\n Square,\n Smartphone,\n Maximize,\n Loader2,\n RotateCcw,\n} from \"lucide-react\";\nimport { useGavaActions } from \"../../providers/ActionsContext.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\n\ninterface ImageEditModalProps {\n src: string;\n originalSrc?: string | null;\n onSave: (newUrl: string) => void;\n onRestore?: () => void;\n onClose: () => void;\n}\n\nconst ASPECT_PRESETS = [\n { label: \"Free\", value: undefined, icon: Maximize },\n { label: \"16:9\", value: 16 / 9, icon: RectangleHorizontal },\n { label: \"4:3\", value: 4 / 3, icon: Smartphone },\n { label: \"1:1\", value: 1, icon: Square },\n];\n\nasync function loadImage(src: string): Promise<HTMLImageElement> {\n const image = new Image();\n image.crossOrigin = \"anonymous\";\n image.src = src;\n await new Promise<void>((resolve, reject) => {\n image.onload = () => resolve();\n image.onerror = reject;\n });\n return image;\n}\n\nasync function cropImageWithBlurFill(\n imageSrc: string,\n pixelCrop: Area\n): Promise<Blob> {\n const image = await loadImage(imageSrc);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = pixelCrop.width;\n canvas.height = pixelCrop.height;\n const ctx = canvas.getContext(\"2d\")!;\n\n const extendsLeft = pixelCrop.x < 0;\n const extendsTop = pixelCrop.y < 0;\n const extendsRight = pixelCrop.x + pixelCrop.width > image.naturalWidth;\n const extendsBottom = pixelCrop.y + pixelCrop.height > image.naturalHeight;\n const needsBlurFill =\n extendsLeft || extendsTop || extendsRight || extendsBottom;\n\n if (needsBlurFill) {\n const blurCanvas = document.createElement(\"canvas\");\n blurCanvas.width = pixelCrop.width;\n blurCanvas.height = pixelCrop.height;\n const blurCtx = blurCanvas.getContext(\"2d\")!;\n\n blurCtx.filter = \"blur(30px) brightness(0.7)\";\n blurCtx.drawImage(image, 0, 0, pixelCrop.width, pixelCrop.height);\n blurCtx.filter = \"none\";\n\n ctx.drawImage(blurCanvas, 0, 0);\n\n const imgX = -pixelCrop.x;\n const imgY = -pixelCrop.y;\n ctx.drawImage(image, imgX, imgY, image.naturalWidth, image.naturalHeight);\n } else {\n ctx.drawImage(\n image,\n pixelCrop.x,\n pixelCrop.y,\n pixelCrop.width,\n pixelCrop.height,\n 0,\n 0,\n pixelCrop.width,\n pixelCrop.height\n );\n }\n\n return new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob!), \"image/jpeg\", 0.92);\n });\n}\n\nexport function ImageEditModal({\n src,\n originalSrc,\n onSave,\n onRestore,\n onClose,\n}: ImageEditModalProps) {\n const actions = useGavaActions();\n const { strings } = useGavaConfig();\n const [crop, setCrop] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [aspect, setAspect] = useState<number | undefined>(undefined);\n const [croppedAreaPixels, setCroppedAreaPixels] = useState<Area | null>(null);\n const [saving, setSaving] = useState(false);\n\n const onCropComplete = useCallback((_: Area, pixels: Area) => {\n setCroppedAreaPixels(pixels);\n }, []);\n\n const handleSave = async () => {\n if (!croppedAreaPixels) return;\n setSaving(true);\n\n try {\n const blob = await cropImageWithBlurFill(src, croppedAreaPixels);\n const formData = new FormData();\n formData.append(\"file\", blob, \"cropped.jpg\");\n\n const res = await fetch(actions.uploadUrl, {\n method: \"POST\",\n body: formData,\n });\n const data = await res.json();\n\n if (data.url) {\n onSave(data.url);\n }\n } catch {\n alert(strings.saveError);\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex flex-col bg-black/90\">\n <div className=\"flex items-center justify-between px-4 py-3 bg-black/50\">\n <h3 className=\"text-white font-medium text-sm\">\n {strings.editImage}\n </h3>\n <div className=\"flex items-center gap-2\">\n {originalSrc && onRestore && (\n <button\n onClick={() => {\n onRestore();\n onClose();\n }}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-amber-400 hover:text-amber-300 border border-amber-400/30 rounded-full hover:bg-amber-400/10 transition-colors\"\n >\n <RotateCcw className=\"w-3.5 h-3.5\" />\n {strings.restoreOriginal}\n </button>\n )}\n <button\n onClick={onClose}\n className=\"text-white/70 hover:text-white p-1 rounded-full hover:bg-white/10 transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n\n <div className=\"flex-1 relative\">\n <Cropper\n image={src}\n crop={crop}\n zoom={zoom}\n minZoom={0.3}\n maxZoom={3}\n aspect={aspect}\n restrictPosition={false}\n onCropChange={setCrop}\n onZoomChange={setZoom}\n onCropComplete={onCropComplete}\n showGrid\n style={{\n containerStyle: { background: \"transparent\" },\n }}\n />\n </div>\n\n <div className=\"bg-black/70 backdrop-blur-sm px-4 py-4 space-y-3\">\n <div className=\"flex items-center gap-3 justify-center\">\n <button\n onClick={() => setZoom(Math.max(0.3, zoom - 0.2))}\n className=\"text-white/70 hover:text-white p-1.5 rounded-full hover:bg-white/10 transition-colors\"\n >\n <ZoomOut className=\"w-4 h-4\" />\n </button>\n <input\n type=\"range\"\n min={0.3}\n max={3}\n step={0.05}\n value={zoom}\n onChange={(e) => setZoom(Number(e.target.value))}\n className=\"w-48 accent-blue-500\"\n />\n <button\n onClick={() => setZoom(Math.min(3, zoom + 0.2))}\n className=\"text-white/70 hover:text-white p-1.5 rounded-full hover:bg-white/10 transition-colors\"\n >\n <ZoomIn className=\"w-4 h-4\" />\n </button>\n <span className=\"text-white/50 text-xs w-12 text-center\">\n {Math.round(zoom * 100)}%\n </span>\n </div>\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex gap-1\">\n {ASPECT_PRESETS.map((p) => {\n const Icon = p.icon;\n const isActive =\n aspect === p.value ||\n (aspect === undefined && p.value === undefined);\n return (\n <button\n key={p.label}\n onClick={() => setAspect(p.value)}\n className={`flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-medium transition-colors ${\n isActive\n ? \"bg-blue-500 text-white\"\n : \"text-white/60 hover:text-white hover:bg-white/10\"\n }`}\n >\n <Icon className=\"w-3.5 h-3.5\" />\n {p.label}\n </button>\n );\n })}\n </div>\n\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"px-4 py-1.5 text-sm text-white/70 hover:text-white border border-white/20 rounded-full hover:bg-white/10 transition-colors\"\n >\n {strings.cancel}\n </button>\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"px-4 py-1.5 text-sm bg-blue-500 text-white rounded-full hover:bg-blue-600 transition-colors font-medium flex items-center gap-1.5 disabled:opacity-50\"\n >\n {saving ? (\n <Loader2 className=\"w-3.5 h-3.5 animate-spin\" />\n ) : (\n <Check className=\"w-3.5 h-3.5\" />\n )}\n {strings.apply}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useRef, useEffect, useCallback } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport {\n Plus,\n FileText,\n Globe,\n Pencil,\n Trash2,\n Search,\n EyeOff,\n} from \"lucide-react\";\nimport { useGavaActions } from \"../../providers/ActionsContext.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\n\ninterface Article {\n id: string;\n title: string;\n status: string;\n category: string;\n coverImage: string;\n authorName: string;\n updatedAt: Date;\n publishedAt: Date | null;\n}\n\ninterface ArticleListProps {\n articles: Article[];\n canCreate: boolean;\n canEdit: boolean;\n canPublish: boolean;\n}\n\ntype Filter = \"tutti\" | \"bozza\" | \"pubblicato\";\n\nexport function ArticleList({\n articles,\n canCreate,\n canEdit,\n canPublish: canPub,\n}: ArticleListProps) {\n const router = useRouter();\n const actions = useGavaActions();\n const { strings, routes } = useGavaConfig();\n\n const filterLabels: Record<Filter, string> = {\n tutti: strings.all,\n bozza: strings.drafts,\n pubblicato: strings.published,\n };\n\n const [filter, setFilter] = useState<Filter>(\"tutti\");\n const [search, setSearch] = useState(\"\");\n const filterRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n const [indicator, setIndicator] = useState({ left: 0, width: 0 });\n\n const filtered = articles.filter((a) => {\n if (filter !== \"tutti\" && a.status !== filter) return false;\n if (search && !a.title.toLowerCase().includes(search.toLowerCase()))\n return false;\n return true;\n });\n\n const counts = {\n tutti: articles.length,\n bozza: articles.filter((a) => a.status === \"bozza\").length,\n pubblicato: articles.filter((a) => a.status === \"pubblicato\").length,\n };\n\n const updateIndicator = useCallback(() => {\n const el = filterRefs.current[filter];\n if (el) {\n setIndicator({\n left: el.offsetLeft,\n width: el.offsetWidth,\n });\n }\n }, [filter]);\n\n useEffect(() => {\n updateIndicator();\n window.addEventListener(\"resize\", updateIndicator);\n return () => window.removeEventListener(\"resize\", updateIndicator);\n }, [updateIndicator]);\n\n const handleDelete = async (id: string, title: string) => {\n if (!confirm(strings.deleteConfirm(title))) return;\n await actions.deleteArticle(id);\n router.refresh();\n };\n\n const handleUnpublish = async (id: string, title: string) => {\n if (!confirm(strings.unpublishConfirm(title))) return;\n await actions.unpublishArticle(id);\n router.refresh();\n };\n\n return (\n <div className=\"dash-animate-in\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground mb-1\">\n {strings.articles}\n </h1>\n <p className=\"text-sm text-muted\">\n {strings.totalArticles(articles.length)}\n </p>\n </div>\n {canCreate && (\n <Link\n href={routes.articleNew}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 bg-accent text-white rounded-full hover:bg-accent-hover transition-all duration-200 text-sm font-medium hover:shadow-md active:scale-[0.97]\"\n >\n <Plus className=\"w-4 h-4\" />\n {strings.newArticle}\n </Link>\n )}\n </div>\n\n <div className=\"flex flex-col sm:flex-row gap-3 mb-6\">\n <div className=\"dash-filter-group flex bg-card border border-card-border rounded-full p-1 gap-1\">\n <div\n className=\"dash-filter-indicator\"\n style={{ left: indicator.left, width: indicator.width }}\n />\n {([\"tutti\", \"bozza\", \"pubblicato\"] as Filter[]).map((f) => (\n <button\n key={f}\n ref={(el) => {\n filterRefs.current[f] = el;\n }}\n onClick={() => setFilter(f)}\n className={`dash-filter-btn px-3 py-1.5 text-sm rounded-full capitalize ${\n filter === f\n ? \"text-white\"\n : \"text-muted hover:text-foreground\"\n }`}\n >\n {filterLabels[f]}{\" \"}\n <span\n className={`text-xs ${filter === f ? \"opacity-80\" : \"opacity-50\"}`}\n >\n ({counts[f]})\n </span>\n </button>\n ))}\n </div>\n\n <div className=\"relative flex-1 max-w-xs\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={strings.searchArticles}\n className=\"dash-search w-full pl-9 pr-3 py-2 text-sm bg-card border border-card-border rounded-full outline-none focus:border-accent\"\n />\n </div>\n </div>\n\n {filtered.length === 0 ? (\n <div className=\"dash-scale-in bg-card border border-card-border rounded-xl p-12 text-center\">\n <FileText className=\"dash-empty-icon w-10 h-10 text-muted mx-auto mb-3\" />\n <p className=\"text-muted text-sm\">\n {search ? strings.noArticlesSearch : strings.noArticles}\n </p>\n </div>\n ) : (\n <div className=\"bg-card border border-card-border rounded-xl overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-card-border text-left\">\n <th className=\"px-4 py-3 font-medium text-muted\">\n {strings.title}\n </th>\n <th className=\"px-4 py-3 font-medium text-muted hidden md:table-cell\">\n {strings.author}\n </th>\n <th className=\"px-4 py-3 font-medium text-muted hidden lg:table-cell\">\n {strings.category}\n </th>\n <th className=\"px-4 py-3 font-medium text-muted\">\n {strings.status}\n </th>\n <th className=\"px-4 py-3 font-medium text-muted hidden sm:table-cell\">\n {strings.updated}\n </th>\n {canEdit && (\n <th className=\"px-4 py-3 font-medium text-muted text-right\">\n {strings.actions}\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {filtered.map((article) => (\n <tr\n key={article.id}\n className=\"border-b border-card-border/50 last:border-0 hover:bg-card-border/20 transition-colors duration-150\"\n >\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n {article.coverImage ? (\n <img\n src={article.coverImage}\n alt=\"\"\n className=\"w-10 h-10 rounded-md object-cover flex-shrink-0 bg-card-border transition-transform duration-200 hover:scale-105\"\n />\n ) : (\n <div className=\"w-10 h-10 rounded-md bg-card-border flex items-center justify-center flex-shrink-0\">\n <FileText className=\"w-4 h-4 text-muted\" />\n </div>\n )}\n <span className=\"font-medium text-foreground\">\n {article.title || (\n <span className=\"italic text-muted\">\n {strings.untitled}\n </span>\n )}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-muted hidden md:table-cell\">\n {article.authorName || \"—\"}\n </td>\n <td className=\"px-4 py-3 text-muted hidden lg:table-cell\">\n {article.category || \"—\"}\n </td>\n <td className=\"px-4 py-3\">\n {article.status === \"pubblicato\" ? (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-green-600 bg-green-50 px-2 py-0.5 rounded-full\">\n <Globe className=\"w-3 h-3\" />\n {strings.published}\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-amber-600 bg-amber-50 px-2 py-0.5 rounded-full\">\n <FileText className=\"w-3 h-3\" />\n {strings.draft}\n </span>\n )}\n </td>\n <td className=\"px-4 py-3 text-muted text-sm hidden sm:table-cell\">\n {new Date(article.updatedAt).toLocaleDateString(\"it-IT\", {\n day: \"numeric\",\n month: \"short\",\n year: \"numeric\",\n })}\n </td>\n {canEdit && (\n <td className=\"px-4 py-3 text-right\">\n <div className=\"flex items-center justify-end gap-1\">\n {canPub && article.status === \"pubblicato\" && (\n <button\n onClick={() =>\n handleUnpublish(article.id, article.title)\n }\n className=\"p-1.5 rounded-full text-muted hover:text-amber-600 hover:bg-amber-50 transition-all duration-200 active:scale-90\"\n title={strings.unpublish}\n >\n <EyeOff className=\"w-4 h-4\" />\n </button>\n )}\n <Link\n href={routes.articleEdit(article.id)}\n className=\"p-1.5 rounded-full text-muted hover:text-foreground hover:bg-card-border/50 transition-all duration-200 active:scale-90\"\n title={strings.edit}\n >\n <Pencil className=\"w-4 h-4\" />\n </Link>\n <button\n onClick={() =>\n handleDelete(article.id, article.title)\n }\n className=\"p-1.5 rounded-full text-muted hover:text-red-500 hover:bg-red-50 transition-all duration-200 active:scale-90\"\n title={strings.delete}\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { Pencil, Trash2 } from \"lucide-react\";\nimport { useGavaActions } from \"../../providers/ActionsContext.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\n\ntype User = {\n id: string;\n name: string;\n email: string;\n role: string;\n createdAt: Date;\n};\n\nexport function UserTable({\n users,\n currentUserId,\n}: {\n users: User[];\n currentUserId: string;\n}) {\n const actions = useGavaActions();\n const { strings, roles, routes } = useGavaConfig();\n\n async function handleDelete(id: string, name: string) {\n if (!confirm(strings.deleteUserConfirm(name))) return;\n const result = await actions.deleteUser(id);\n if (result && \"error\" in result && result.error) {\n alert(result.error);\n }\n }\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-card-border\">\n <th className=\"text-left py-3 px-4 font-semibold text-foreground\">\n {strings.name}\n </th>\n <th className=\"text-left py-3 px-4 font-semibold text-foreground\">\n {strings.email}\n </th>\n <th className=\"text-left py-3 px-4 font-semibold text-foreground\">\n {strings.role}\n </th>\n <th className=\"text-left py-3 px-4 font-semibold text-foreground\">\n {strings.createdAt}\n </th>\n <th className=\"text-right py-3 px-4 font-semibold text-foreground\">\n {strings.actions}\n </th>\n </tr>\n </thead>\n <tbody>\n {users.map((user) => (\n <tr\n key={user.id}\n className=\"border-b border-card-border hover:bg-card/50\"\n >\n <td className=\"py-3 px-4 text-foreground\">{user.name}</td>\n <td className=\"py-3 px-4 text-muted\">{user.email}</td>\n <td className=\"py-3 px-4\">\n <span className=\"inline-block px-2 py-0.5 bg-accent/10 text-accent text-xs font-medium rounded-full\">\n {roles.labels[user.role] || user.role}\n </span>\n </td>\n <td className=\"py-3 px-4 text-muted\">\n {new Date(user.createdAt).toLocaleDateString(\"it-IT\")}\n </td>\n <td className=\"py-3 px-4 text-right\">\n <div className=\"flex items-center justify-end gap-2\">\n <Link\n href={routes.userEdit(user.id)}\n className=\"p-1.5 text-muted hover:text-accent transition-colors\"\n title={strings.edit}\n >\n <Pencil className=\"w-4 h-4\" />\n </Link>\n {user.id !== currentUserId && (\n <button\n onClick={() => handleDelete(user.id, user.name)}\n className=\"p-1.5 text-muted hover:text-red-500 transition-colors\"\n title={strings.delete}\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useGavaActions } from \"../../providers/ActionsContext.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\n\ntype UserData = {\n id: string;\n name: string;\n email: string;\n role: string;\n} | null;\n\nexport function UserForm({ user }: { user?: UserData }) {\n const actions = useGavaActions();\n const { strings, roles } = useGavaConfig();\n const [error, setError] = useState(\"\");\n const isEditing = !!user;\n\n async function handleSubmit(formData: FormData) {\n setError(\"\");\n let result;\n if (isEditing) {\n result = await actions.updateUser(user!.id, formData);\n } else {\n result = await actions.createUser(formData);\n }\n if (result && \"error\" in result && result.error) {\n setError(result.error);\n }\n }\n\n return (\n <form action={handleSubmit} className=\"space-y-4 max-w-md\">\n {error && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 text-red-700 dark:text-red-400 px-4 py-3 rounded-lg text-sm\">\n {error}\n </div>\n )}\n\n <div>\n <label\n htmlFor=\"name\"\n className=\"block text-sm font-medium text-foreground mb-1\"\n >\n {strings.name}\n </label>\n <input\n id=\"name\"\n name=\"name\"\n type=\"text\"\n required\n defaultValue={user?.name || \"\"}\n className=\"w-full px-3 py-2 bg-background border border-card-border rounded-lg text-foreground text-sm focus:outline-none focus:ring-2 focus:ring-accent focus:border-transparent\"\n />\n </div>\n\n <div>\n <label\n htmlFor=\"email\"\n className=\"block text-sm font-medium text-foreground mb-1\"\n >\n {strings.email}\n </label>\n <input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n required\n defaultValue={user?.email || \"\"}\n className=\"w-full px-3 py-2 bg-background border border-card-border rounded-lg text-foreground text-sm focus:outline-none focus:ring-2 focus:ring-accent focus:border-transparent\"\n />\n </div>\n\n <div>\n <label\n htmlFor=\"password\"\n className=\"block text-sm font-medium text-foreground mb-1\"\n >\n {strings.password}\n {isEditing && strings.passwordEditHint}\n </label>\n <input\n id=\"password\"\n name=\"password\"\n type=\"password\"\n required={!isEditing}\n minLength={6}\n className=\"w-full px-3 py-2 bg-background border border-card-border rounded-lg text-foreground text-sm focus:outline-none focus:ring-2 focus:ring-accent focus:border-transparent\"\n placeholder={isEditing ? \"\" : \"Min 6 chars\"}\n />\n </div>\n\n <div>\n <label\n htmlFor=\"role\"\n className=\"block text-sm font-medium text-foreground mb-1\"\n >\n {strings.role}\n </label>\n <select\n id=\"role\"\n name=\"role\"\n required\n defaultValue={user?.role || roles.list[roles.list.length - 1]}\n className=\"w-full px-3 py-2 bg-background border border-card-border rounded-lg text-foreground text-sm focus:outline-none focus:ring-2 focus:ring-accent focus:border-transparent\"\n >\n {roles.list.map((r) => (\n <option key={r} value={r}>\n {roles.labels[r] || r}\n </option>\n ))}\n </select>\n </div>\n\n <button\n type=\"submit\"\n className=\"px-6 py-2.5 bg-accent text-white rounded-full font-medium text-sm hover:bg-accent-hover transition-colors\"\n >\n {isEditing ? strings.saveChanges : strings.createUser}\n </button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { Search, Trash2, Copy, Check, ImageIcon } from \"lucide-react\";\nimport { useGavaActions } from \"../../providers/ActionsContext.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\nimport type { GEMedia } from \"../../types.js\";\n\ninterface MediaGridProps {\n media: GEMedia[];\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function MediaGrid({ media }: MediaGridProps) {\n const router = useRouter();\n const actions = useGavaActions();\n const { strings } = useGavaConfig();\n const [search, setSearch] = useState(\"\");\n const [copiedId, setCopiedId] = useState<string | null>(null);\n\n const filtered = media.filter((m) =>\n search ? m.filename.toLowerCase().includes(search.toLowerCase()) : true\n );\n\n const handleCopy = async (path: string, id: string) => {\n await navigator.clipboard.writeText(path);\n setCopiedId(id);\n setTimeout(() => setCopiedId(null), 2000);\n };\n\n const handleDelete = async (id: string, filename: string) => {\n if (!confirm(strings.deleteConfirm(filename))) return;\n try {\n await actions.deleteMedia(id);\n router.refresh();\n } catch (err) {\n alert(\n err instanceof Error ? err.message : \"Error deleting file\"\n );\n }\n };\n\n return (\n <div className=\"dash-animate-in\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground mb-1\">\n {strings.media}\n </h1>\n <p className=\"text-sm text-muted\">{strings.totalFiles(media.length)}</p>\n </div>\n <div className=\"relative max-w-xs w-full\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={strings.searchFiles}\n className=\"dash-search w-full pl-9 pr-3 py-2 text-sm bg-card border border-card-border rounded-full outline-none focus:border-accent\"\n />\n </div>\n </div>\n\n {filtered.length === 0 ? (\n <div className=\"dash-scale-in bg-card border border-card-border rounded-xl p-12 text-center\">\n <ImageIcon className=\"dash-empty-icon w-10 h-10 text-muted mx-auto mb-3\" />\n <p className=\"text-muted text-sm\">\n {search ? strings.noMediaSearch : strings.noMedia}\n </p>\n </div>\n ) : (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\">\n {filtered.map((m, i) => (\n <div\n key={m.id}\n className=\"dash-animate-in dash-stagger dash-card-hover bg-card border border-card-border rounded-xl overflow-hidden group\"\n style={{ \"--i\": i } as React.CSSProperties}\n >\n <div className=\"aspect-square bg-card-border relative overflow-hidden\">\n {m.mimeType.startsWith(\"image/\") ? (\n <img\n src={m.path}\n alt={m.filename}\n className=\"dash-media-img w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <ImageIcon className=\"w-8 h-8 text-muted\" />\n </div>\n )}\n\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex items-center justify-center gap-2\">\n <button\n onClick={() => handleCopy(m.path, m.id)}\n className=\"p-2 rounded-full bg-white/90 text-foreground hover:bg-white transition-all duration-200 active:scale-90\"\n title={strings.copyUrl}\n >\n {copiedId === m.id ? (\n <Check className=\"w-4 h-4 text-green-600\" />\n ) : (\n <Copy className=\"w-4 h-4\" />\n )}\n </button>\n <button\n onClick={() => handleDelete(m.id, m.filename)}\n className=\"p-2 rounded-full bg-white/90 text-red-500 hover:bg-white transition-all duration-200 active:scale-90\"\n title={strings.delete}\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"p-2.5\">\n <p className=\"text-xs font-medium text-foreground truncate\">\n {m.filename}\n </p>\n <p className=\"text-[10px] text-muted\">\n {formatSize(m.size)} — {m.uploader.name}\n </p>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { useSession, signOut } from \"next-auth/react\";\nimport { FileText, Users, LogOut, BarChart3, ImageIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\n\nexport function DashboardNavbar() {\n const pathname = usePathname();\n const { data: session } = useSession();\n const [mobileOpen, setMobileOpen] = useState(false);\n const { branding, roles, strings, routes } = useGavaConfig();\n const role = session?.user?.role;\n\n const navigation = [\n { name: strings.articles, href: routes.articles, icon: FileText },\n ...(roles.canEdit(role || \"\")\n ? [{ name: strings.media, href: routes.media, icon: ImageIcon }]\n : []),\n ...(roles.canPublish(role || \"\")\n ? [\n {\n name: strings.statistics,\n href: routes.dashboard + \"/statistiche\",\n icon: BarChart3,\n },\n ]\n : []),\n ...(role === roles.adminRole\n ? [{ name: strings.users, href: routes.users, icon: Users }]\n : []),\n ];\n\n const isActive = (href: string) => pathname.startsWith(href);\n\n return (\n <header className=\"sticky top-0 z-50 px-4 pb-4\">\n <div className=\"mx-auto max-w-7xl\">\n <nav className=\"bg-background/95 backdrop-blur-sm border border-t-transparent border-card-border rounded-b-xl\">\n <div className=\"flex h-14 items-center justify-between px-6\">\n <Link href={routes.home} className=\"flex items-center gap-3\">\n {branding.logo && (\n <span className=\"relative z-[9999] -my-[100px] py-[100px] bg-white rounded-b-lg px-1.5 pb-1.5\">\n <img\n src={branding.logo}\n alt={branding.name}\n width={44}\n height={44}\n />\n </span>\n )}\n <span className=\"font-bold text-lg text-foreground\">\n {branding.name}\n </span>\n </Link>\n\n <div className=\"hidden md:flex md:items-center md:gap-6\">\n {navigation.map((item) => (\n <Link\n key={item.name}\n href={item.href}\n className={`flex items-center gap-2 text-sm font-medium transition-colors ${\n isActive(item.href)\n ? \"text-accent\"\n : \"text-muted hover:text-foreground\"\n }`}\n >\n <item.icon className=\"w-4 h-4\" />\n {item.name}\n </Link>\n ))}\n </div>\n\n <div className=\"hidden md:flex md:items-center md:gap-3\">\n <div className=\"text-right\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">\n {session?.user?.name}\n </p>\n <p className=\"text-xs text-muted leading-tight\">\n {roles.labels[role || \"\"] || role}\n </p>\n </div>\n <button\n onClick={() => signOut({ callbackUrl: routes.login })}\n className=\"p-2 rounded-full text-muted hover:text-foreground hover:bg-card transition-colors\"\n title={strings.logout}\n >\n <LogOut className=\"w-4 h-4\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={() => setMobileOpen(!mobileOpen)}\n className=\"md:hidden p-2 rounded-full text-foreground flex flex-col justify-center items-center w-10 h-10 gap-1.5\"\n aria-label=\"Menu\"\n >\n <span\n className={`block h-0.5 w-5 bg-foreground rounded-full transition-all duration-300 ease-in-out ${\n mobileOpen ? \"rotate-45 translate-y-2\" : \"\"\n }`}\n />\n <span\n className={`block h-0.5 w-5 bg-foreground rounded-full transition-all duration-300 ease-in-out ${\n mobileOpen ? \"opacity-0 scale-0\" : \"\"\n }`}\n />\n <span\n className={`block h-0.5 w-5 bg-foreground rounded-full transition-all duration-300 ease-in-out ${\n mobileOpen ? \"-rotate-45 -translate-y-2\" : \"\"\n }`}\n />\n </button>\n </div>\n\n <div\n className={`md:hidden overflow-hidden transition-all duration-300 ease-in-out ${\n mobileOpen ? \"max-h-80 opacity-100\" : \"max-h-0 opacity-0\"\n }`}\n >\n <div className=\"py-4 border-t border-card-border mx-6 space-y-1\">\n {navigation.map((item) => (\n <Link\n key={item.name}\n href={item.href}\n onClick={() => setMobileOpen(false)}\n className={`flex items-center gap-3 px-3 py-2 rounded-full text-sm font-medium transition-colors ${\n isActive(item.href)\n ? \"text-accent\"\n : \"text-muted hover:text-foreground\"\n }`}\n >\n <item.icon className=\"w-4 h-4\" />\n {item.name}\n </Link>\n ))}\n\n <div className=\"pt-3 mt-2 border-t border-card-border\">\n <div className=\"px-3 mb-2\">\n <p className=\"text-sm font-medium text-foreground\">\n {session?.user?.name}\n </p>\n <p className=\"text-xs text-muted\">\n {roles.labels[role || \"\"] || role}\n </p>\n </div>\n <button\n onClick={() => signOut({ callbackUrl: routes.login })}\n className=\"flex items-center gap-3 px-3 py-2 text-sm text-muted hover:text-foreground transition-colors w-full rounded-full hover:bg-card\"\n >\n <LogOut className=\"w-4 h-4\" />\n {strings.logout}\n </button>\n </div>\n </div>\n </div>\n </nav>\n </div>\n </header>\n );\n}\n","import { type LucideIcon } from \"lucide-react\";\n\ninterface StatCardProps {\n label: string;\n value: number | string;\n icon: LucideIcon;\n accent?: \"blue\" | \"green\" | \"purple\" | \"amber\";\n}\n\nconst accentStyles = {\n blue: {\n border: \"border-l-blue-500\",\n bg: \"bg-blue-500/10\",\n text: \"text-blue-600\",\n },\n green: {\n border: \"border-l-green-500\",\n bg: \"bg-green-500/10\",\n text: \"text-green-600\",\n },\n purple: {\n border: \"border-l-purple-500\",\n bg: \"bg-purple-500/10\",\n text: \"text-purple-600\",\n },\n amber: {\n border: \"border-l-amber-500\",\n bg: \"bg-amber-500/10\",\n text: \"text-amber-600\",\n },\n};\n\nexport function StatCard({\n label,\n value,\n icon: Icon,\n accent = \"blue\",\n}: StatCardProps) {\n const s = accentStyles[accent];\n\n return (\n <div\n className={`bg-card border border-card-border rounded-xl p-5 border-l-[3px] ${s.border} transition-all duration-200 hover:shadow-sm`}\n >\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"text-xs font-medium text-muted uppercase tracking-wide mb-2\">\n {label}\n </p>\n <p className=\"text-3xl font-bold text-foreground tabular-nums\">\n {value}\n </p>\n </div>\n <div className={`p-2 rounded-lg ${s.bg}`}>\n <Icon className={`w-5 h-5 ${s.text}`} />\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useSplash } from \"../../providers/SplashContext.js\";\nimport { useGavaConfig } from \"../../providers/ConfigContext.js\";\n\nfunction pickRandom3(words: string[]): string[] {\n const shuffled = [...words].sort(() => Math.random() - 0.5);\n return shuffled.slice(0, 3);\n}\n\nexport function SplashScreen() {\n const { phase } = useSplash();\n const { branding } = useGavaConfig();\n const words = useMemo(() => pickRandom3(branding.splashWords), [branding.splashWords]);\n\n if (phase === \"idle\") return null;\n\n const topClass =\n phase === \"closing\"\n ? \"splash-enter-down\"\n : phase === \"opening\"\n ? \"splash-exit-up\"\n : \"\";\n\n const bottomClass =\n phase === \"closing\"\n ? \"splash-enter-up\"\n : phase === \"opening\"\n ? \"splash-exit-down\"\n : \"\";\n\n return (\n <div className=\"fixed inset-0 z-[9999] pointer-events-none\">\n <div\n className={`splash-half splash-half-top absolute inset-x-0 top-0 h-1/2 bg-background overflow-hidden ${topClass}`}\n >\n <div className=\"absolute inset-0 flex flex-col items-center justify-end pb-2\">\n <span className=\"splash-title\">GAVA</span>\n </div>\n </div>\n\n <div\n className={`splash-half splash-half-bottom absolute inset-x-0 bottom-0 h-1/2 bg-background overflow-hidden ${bottomClass}`}\n >\n <div className=\"absolute inset-0 flex flex-col items-center justify-start pt-2\">\n <span className=\"splash-title\">ENGINE</span>\n <div className=\"flex items-center gap-3 mt-6\">\n {words.map((word, i) => (\n <span\n key={word}\n className=\"splash-word text-xs sm:text-sm font-medium tracking-widest uppercase\"\n style={{ animationDelay: `${0.2 + i * 0.1}s` }}\n >\n {word}\n {i < 2 && (\n <span className=\"ml-3 text-muted-foreground\">&middot;</span>\n )}\n </span>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useSplash } from \"../../providers/SplashContext.js\";\n\nexport function DashboardSplashTrigger() {\n const { openSplash } = useSplash();\n\n useEffect(() => {\n if (typeof window.requestIdleCallback === \"function\") {\n const id = window.requestIdleCallback(() => openSplash());\n return () => window.cancelIdleCallback(id);\n }\n const timeout = setTimeout(() => {\n requestAnimationFrame(() => openSplash());\n }, 100);\n return () => clearTimeout(timeout);\n }, [openSplash]);\n\n return null;\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useRef","ReactNodeViewRenderer","NodeViewWrapper","jsx","ReactNodeViewRenderer","Node","mergeAttributes","ReactNodeViewRenderer","NodeViewWrapper","jsx","Node","mergeAttributes","ReactNodeViewRenderer","Superscript","Subscript","Table","Loader2","AlignLeft","AlignCenter","AlignRight","Image","Youtube","X","useCallback","useState","useRef","useEffect","useState","useCallback","Fragment","jsx","jsxs","useState","useCallback","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","X","AlignLeft","AlignCenter","AlignRight","Image","Youtube","useState","X","Fragment","jsx","jsxs","useState","X","useState","useEffect","X","jsx","jsxs","useState","useEffect","X","Fragment","jsx","jsxs","useState","useRef","useEffect","Superscript","Subscript","Table","useCallback","Loader2","useState","useCallback","X","Check","Loader2","RotateCcw","jsx","jsxs","useState","useCallback","RotateCcw","X","Loader2","Check","useState","useRef","useEffect","useCallback","Link","useRouter","Plus","FileText","Globe","Trash2","Search","jsx","jsxs","useRouter","useState","useRef","useCallback","useEffect","Link","Plus","Search","FileText","Globe","Trash2","Link","Pencil","Trash2","jsx","jsxs","Link","Pencil","Trash2","useState","jsx","jsxs","useState","useState","useRouter","Search","Trash2","Check","ImageIcon","jsx","jsxs","formatSize","useRouter","useState","Search","ImageIcon","Check","Trash2","Link","FileText","ImageIcon","useState","jsx","jsxs","useState","FileText","ImageIcon","Link","jsx","jsxs","jsx","jsxs","useEffect","useEffect"]}