gavaengine 2.3.0 → 2.4.1

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.
@@ -3,7 +3,8 @@ import { Editor, NodeViewProps } from '@tiptap/react';
3
3
  import * as _tiptap_core from '@tiptap/core';
4
4
  import { Node } from '@tiptap/core';
5
5
  import * as _tiptap_extension_youtube from '@tiptap/extension-youtube';
6
- import { m as GEMedia } from './registry-Do5nzO7_.js';
6
+ import { n as GEMedia, o as GENavItem } from './registry-kAqFTg2C.js';
7
+ import { ReactNode } from 'react';
7
8
  import { LucideIcon } from 'lucide-react';
8
9
 
9
10
  interface ArticleData {
@@ -137,13 +138,29 @@ interface MediaPickerModalProps {
137
138
  }
138
139
  declare function MediaPickerModal({ open, onClose, onSelect, }: MediaPickerModalProps): react_jsx_runtime.JSX.Element | null;
139
140
 
140
- declare function DashboardNavbar(): react_jsx_runtime.JSX.Element;
141
+ interface DashboardNavbarProps {
142
+ navigation?: GENavItem[];
143
+ className?: string;
144
+ renderLogo?: () => ReactNode;
145
+ renderUser?: (user: {
146
+ name?: string | null;
147
+ role?: string;
148
+ }) => ReactNode;
149
+ }
150
+ declare function useDefaultNavigation(): GENavItem[];
151
+ declare function DashboardNavbar({ navigation: navProp, className, renderLogo, renderUser, }?: DashboardNavbarProps): react_jsx_runtime.JSX.Element;
141
152
 
153
+ interface CustomAccent {
154
+ border: string;
155
+ bg: string;
156
+ text: string;
157
+ }
158
+ type AccentPreset = "blue" | "green" | "purple" | "amber" | "red" | "pink" | "teal";
142
159
  interface StatCardProps {
143
160
  label: string;
144
161
  value: number | string;
145
162
  icon: LucideIcon;
146
- accent?: "blue" | "green" | "purple" | "amber";
163
+ accent?: AccentPreset | CustomAccent;
147
164
  }
148
165
  declare function StatCard({ label, value, icon: Icon, accent, }: StatCardProps): react_jsx_runtime.JSX.Element;
149
166
 
@@ -151,4 +168,4 @@ declare function SplashScreen(): react_jsx_runtime.JSX.Element | null;
151
168
 
152
169
  declare function DashboardSplashTrigger(): null;
153
170
 
154
- export { ArticleEditor as A, CoverImageUpload as C, DashboardNavbar as D, EditorToolbar as E, ImageEditModal as I, MediaGrid as M, ResizableImage as R, SplashScreen as S, UserForm as U, VideoExtension as V, ArticleList as a, DashboardSplashTrigger as b, DraggableYoutube as c, DraggableYoutubeView as d, MediaPickerModal as e, ResizableImageView as f, RevisionPanel as g, StatCard as h, UserTable as i, VideoView as j };
171
+ export { ArticleEditor as A, CoverImageUpload as C, DashboardNavbar as D, EditorToolbar as E, ImageEditModal as I, MediaGrid as M, ResizableImage as R, SplashScreen as S, UserForm as U, VideoExtension as V, ArticleList as a, type DashboardNavbarProps as b, DashboardSplashTrigger as c, DraggableYoutube as d, DraggableYoutubeView as e, MediaPickerModal as f, ResizableImageView as g, RevisionPanel as h, StatCard as i, UserTable as j, VideoView as k, useDefaultNavigation as u };
@@ -1,9 +1,11 @@
1
1
  "use client";
2
+ import {
3
+ createNextAuthAdapter
4
+ } from "../chunk-IYUHCOF5.js";
2
5
  import {
3
6
  AuthProvider,
4
- createNextAuthAdapter,
5
7
  useGavaAuth
6
- } from "../chunk-QO42DDRU.js";
8
+ } from "../chunk-IU2SMMVV.js";
7
9
  export {
8
10
  AuthProvider,
9
11
  createNextAuthAdapter,
@@ -4,7 +4,7 @@ import {
4
4
  ComponentRegistryProvider,
5
5
  ConfigProvider,
6
6
  SplashProvider
7
- } from "./chunk-PHT76VW6.js";
7
+ } from "./chunk-MANXBV2D.js";
8
8
 
9
9
  // src/providers/GavaEngineProvider.tsx
10
10
  import { useRouter } from "next/navigation";
@@ -65,4 +65,4 @@ export {
65
65
  GavaEngineProvider,
66
66
  ThemeToggle
67
67
  };
68
- //# sourceMappingURL=chunk-3ZYJ4C6R.js.map
68
+ //# sourceMappingURL=chunk-AMARPSPH.js.map
@@ -1,43 +1,5 @@
1
1
  "use client";
2
2
 
3
- // src/auth/next-auth-adapter.ts
4
- function createNextAuthAdapter({
5
- auth,
6
- signIn,
7
- signOut
8
- }) {
9
- return {
10
- async getSession() {
11
- const session = await auth();
12
- if (!session?.user) return null;
13
- return {
14
- user: {
15
- id: session.user.id,
16
- name: session.user.name,
17
- email: session.user.email,
18
- role: session.user.role
19
- }
20
- };
21
- },
22
- async getCurrentUser() {
23
- const session = await this.getSession();
24
- return session?.user ?? null;
25
- },
26
- async signIn(credentials) {
27
- if (!signIn) throw new Error("signIn not configured");
28
- try {
29
- await signIn("credentials", credentials);
30
- } catch (error) {
31
- return { error: error.message ?? "Authentication failed" };
32
- }
33
- },
34
- async signOut() {
35
- if (!signOut) throw new Error("signOut not configured");
36
- await signOut();
37
- }
38
- };
39
- }
40
-
41
3
  // src/auth/context.tsx
42
4
  import {
43
5
  createContext,
@@ -106,8 +68,7 @@ function AuthProvider({
106
68
  }
107
69
 
108
70
  export {
109
- createNextAuthAdapter,
110
71
  useGavaAuth,
111
72
  AuthProvider
112
73
  };
113
- //# sourceMappingURL=chunk-QO42DDRU.js.map
74
+ //# sourceMappingURL=chunk-IU2SMMVV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/context.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n type ReactNode,\n} from \"react\";\n\ninterface GEAuthUser {\n id: string;\n name?: string | null;\n email?: string | null;\n role: string;\n}\n\ninterface GEAuthSession {\n user: GEAuthUser;\n}\n\ninterface GEAuthContextValue {\n session: GEAuthSession | null;\n user: GEAuthUser | null;\n status: \"loading\" | \"authenticated\" | \"unauthenticated\";\n signIn?: (credentials: Record<string, unknown>) => Promise<{ error?: string } | void>;\n signOut?: () => Promise<void>;\n}\n\nconst AuthContext = createContext<GEAuthContextValue>({\n session: null,\n user: null,\n status: \"loading\",\n});\n\nexport function useGavaAuth(): GEAuthContextValue {\n return useContext(AuthContext);\n}\n\ninterface AuthProviderProps {\n children: ReactNode;\n getSession: () => Promise<GEAuthSession | null>;\n signIn?: (credentials: Record<string, unknown>) => Promise<{ error?: string } | void>;\n signOut?: () => Promise<void>;\n}\n\nexport function AuthProvider({\n children,\n getSession,\n signIn,\n signOut,\n}: AuthProviderProps) {\n const [session, setSession] = useState<GEAuthSession | null>(null);\n const [status, setStatus] = useState<\"loading\" | \"authenticated\" | \"unauthenticated\">(\n \"loading\"\n );\n\n useEffect(() => {\n getSession().then((s) => {\n setSession(s);\n setStatus(s ? \"authenticated\" : \"unauthenticated\");\n });\n }, [getSession]);\n\n const handleSignIn = useCallback(\n async (credentials: Record<string, unknown>) => {\n if (!signIn) return;\n const result = await signIn(credentials);\n if (!result?.error) {\n const s = await getSession();\n setSession(s);\n setStatus(s ? \"authenticated\" : \"unauthenticated\");\n }\n return result;\n },\n [signIn, getSession]\n );\n\n const handleSignOut = useCallback(async () => {\n if (!signOut) return;\n await signOut();\n setSession(null);\n setStatus(\"unauthenticated\");\n }, [signOut]);\n\n return (\n <AuthContext.Provider\n value={{\n session,\n user: session?.user ?? null,\n status,\n signIn: signIn ? handleSignIn : undefined,\n signOut: signOut ? handleSignOut : undefined,\n }}\n >\n {children}\n </AuthContext.Provider>\n );\n}\n"],"mappings":";;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AA8EH;AAzDJ,IAAM,cAAc,cAAkC;AAAA,EACpD,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AACV,CAAC;AAEM,SAAS,cAAkC;AAChD,SAAO,WAAW,WAAW;AAC/B;AASO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,CAAC,SAAS,UAAU,IAAI,SAA+B,IAAI;AACjE,QAAM,CAAC,QAAQ,SAAS,IAAI;AAAA,IAC1B;AAAA,EACF;AAEA,YAAU,MAAM;AACd,eAAW,EAAE,KAAK,CAAC,MAAM;AACvB,iBAAW,CAAC;AACZ,gBAAU,IAAI,kBAAkB,iBAAiB;AAAA,IACnD,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,eAAe;AAAA,IACnB,OAAO,gBAAyC;AAC9C,UAAI,CAAC,OAAQ;AACb,YAAM,SAAS,MAAM,OAAO,WAAW;AACvC,UAAI,CAAC,QAAQ,OAAO;AAClB,cAAM,IAAI,MAAM,WAAW;AAC3B,mBAAW,CAAC;AACZ,kBAAU,IAAI,kBAAkB,iBAAiB;AAAA,MACnD;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ,UAAU;AAAA,EACrB;AAEA,QAAM,gBAAgB,YAAY,YAAY;AAC5C,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,eAAW,IAAI;AACf,cAAU,iBAAiB;AAAA,EAC7B,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE;AAAA,IAAC,YAAY;AAAA,IAAZ;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA,MAAM,SAAS,QAAQ;AAAA,QACvB;AAAA,QACA,QAAQ,SAAS,eAAe;AAAA,QAChC,SAAS,UAAU,gBAAgB;AAAA,MACrC;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -0,0 +1,44 @@
1
+ "use client";
2
+
3
+ // src/auth/next-auth-adapter.ts
4
+ function createNextAuthAdapter({
5
+ auth,
6
+ signIn,
7
+ signOut
8
+ }) {
9
+ return {
10
+ async getSession() {
11
+ const session = await auth();
12
+ if (!session?.user) return null;
13
+ return {
14
+ user: {
15
+ id: session.user.id,
16
+ name: session.user.name,
17
+ email: session.user.email,
18
+ role: session.user.role
19
+ }
20
+ };
21
+ },
22
+ async getCurrentUser() {
23
+ const session = await this.getSession();
24
+ return session?.user ?? null;
25
+ },
26
+ async signIn(credentials) {
27
+ if (!signIn) throw new Error("signIn not configured");
28
+ try {
29
+ await signIn("credentials", credentials);
30
+ } catch (error) {
31
+ return { error: error.message ?? "Authentication failed" };
32
+ }
33
+ },
34
+ async signOut() {
35
+ if (!signOut) throw new Error("signOut not configured");
36
+ await signOut();
37
+ }
38
+ };
39
+ }
40
+
41
+ export {
42
+ createNextAuthAdapter
43
+ };
44
+ //# sourceMappingURL=chunk-IYUHCOF5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/next-auth-adapter.ts"],"sourcesContent":["import type { GEAuthAdapter, GESession } from \"./types.js\";\n\ninterface NextAuthFunctions {\n auth: () => Promise<any>;\n signIn?: (provider: string, credentials: Record<string, unknown>) => Promise<any>;\n signOut?: () => Promise<void>;\n}\n\nexport function createNextAuthAdapter({\n auth,\n signIn,\n signOut,\n}: NextAuthFunctions): GEAuthAdapter {\n return {\n async getSession(): Promise<GESession | null> {\n const session = await auth();\n if (!session?.user) return null;\n return {\n user: {\n id: session.user.id,\n name: session.user.name,\n email: session.user.email,\n role: session.user.role,\n },\n };\n },\n\n async getCurrentUser() {\n const session = await this.getSession();\n return session?.user ?? null;\n },\n\n async signIn(credentials: Record<string, unknown>) {\n if (!signIn) throw new Error(\"signIn not configured\");\n try {\n await signIn(\"credentials\", credentials);\n } catch (error: any) {\n return { error: error.message ?? \"Authentication failed\" };\n }\n },\n\n async signOut() {\n if (!signOut) throw new Error(\"signOut not configured\");\n await signOut();\n },\n };\n}\n"],"mappings":";;;AAQO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAAqC;AACnC,SAAO;AAAA,IACL,MAAM,aAAwC;AAC5C,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,CAAC,SAAS,KAAM,QAAO;AAC3B,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,IAAI,QAAQ,KAAK;AAAA,UACjB,MAAM,QAAQ,KAAK;AAAA,UACnB,OAAO,QAAQ,KAAK;AAAA,UACpB,MAAM,QAAQ,KAAK;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,iBAAiB;AACrB,YAAM,UAAU,MAAM,KAAK,WAAW;AACtC,aAAO,SAAS,QAAQ;AAAA,IAC1B;AAAA,IAEA,MAAM,OAAO,aAAsC;AACjD,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,uBAAuB;AACpD,UAAI;AACF,cAAM,OAAO,eAAe,WAAW;AAAA,MACzC,SAAS,OAAY;AACnB,eAAO,EAAE,OAAO,MAAM,WAAW,wBAAwB;AAAA,MAC3D;AAAA,IACF;AAAA,IAEA,MAAM,UAAU;AACd,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,wBAAwB;AACtD,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AACF;","names":[]}
@@ -36,7 +36,44 @@ var it = {
36
36
  beforeRestore: "Prima del ripristino",
37
37
  publishedNote: "Pubblicato",
38
38
  preview: "Anteprima",
39
- placeholder: "Inizia a scrivere il tuo articolo..."
39
+ placeholder: "Inizia a scrivere il tuo articolo...",
40
+ bold: "Grassetto",
41
+ italic: "Corsivo",
42
+ underline: "Sottolineato",
43
+ strikethrough: "Barrato",
44
+ superscript: "Apice",
45
+ subscript: "Pedice",
46
+ textColor: "Colore testo",
47
+ highlight: "Evidenzia",
48
+ heading2: "H2",
49
+ heading3: "H3",
50
+ bulletList: "Elenco puntato",
51
+ numberedList: "Elenco numerato",
52
+ quote: "Citazione",
53
+ codeBlock: "Blocco codice",
54
+ divider: "Separatore",
55
+ alignLeft: "Allinea a sinistra",
56
+ alignCenter: "Allinea al centro",
57
+ alignRight: "Allinea a destra",
58
+ table: "Tabella",
59
+ insertTable: "Inserisci tabella 3\xD73",
60
+ addRowAbove: "Aggiungi riga sopra",
61
+ addRowBelow: "Aggiungi riga sotto",
62
+ addColumnLeft: "Aggiungi colonna a sinistra",
63
+ addColumnRight: "Aggiungi colonna a destra",
64
+ deleteRow: "Elimina riga",
65
+ deleteColumn: "Elimina colonna",
66
+ deleteTable: "Elimina tabella",
67
+ link: "Link",
68
+ image: "Immagine",
69
+ youtube: "YouTube",
70
+ video: "Video",
71
+ undo: "Annulla",
72
+ redo: "Ripeti",
73
+ defaultColor: "Predefinito",
74
+ removeHighlight: "Rimuovi",
75
+ linkPrompt: "URL:",
76
+ youtubePrompt: "URL YouTube:"
40
77
  },
41
78
  media: {
42
79
  media: "Media",
@@ -138,7 +175,44 @@ var en = {
138
175
  beforeRestore: "Before restore",
139
176
  publishedNote: "Published",
140
177
  preview: "Preview",
141
- placeholder: "Start writing your article..."
178
+ placeholder: "Start writing your article...",
179
+ bold: "Bold",
180
+ italic: "Italic",
181
+ underline: "Underline",
182
+ strikethrough: "Strikethrough",
183
+ superscript: "Superscript",
184
+ subscript: "Subscript",
185
+ textColor: "Text color",
186
+ highlight: "Highlight",
187
+ heading2: "H2",
188
+ heading3: "H3",
189
+ bulletList: "Bullet list",
190
+ numberedList: "Numbered list",
191
+ quote: "Quote",
192
+ codeBlock: "Code block",
193
+ divider: "Divider",
194
+ alignLeft: "Align left",
195
+ alignCenter: "Align center",
196
+ alignRight: "Align right",
197
+ table: "Table",
198
+ insertTable: "Insert 3\xD73 table",
199
+ addRowAbove: "Add row above",
200
+ addRowBelow: "Add row below",
201
+ addColumnLeft: "Add column left",
202
+ addColumnRight: "Add column right",
203
+ deleteRow: "Delete row",
204
+ deleteColumn: "Delete column",
205
+ deleteTable: "Delete table",
206
+ link: "Link",
207
+ image: "Image",
208
+ youtube: "YouTube",
209
+ video: "Video",
210
+ undo: "Undo",
211
+ redo: "Redo",
212
+ defaultColor: "Default",
213
+ removeHighlight: "Remove",
214
+ linkPrompt: "URL:",
215
+ youtubePrompt: "YouTube URL:"
142
216
  },
143
217
  media: {
144
218
  media: "Media",
@@ -335,7 +409,45 @@ function localeToStrings(locale) {
335
409
  unpublishConfirm: locale.common.unpublishConfirm,
336
410
  deleteUserConfirm: locale.common.deleteUserConfirm,
337
411
  totalArticles: locale.common.totalArticles,
338
- totalFiles: locale.common.totalFiles
412
+ totalFiles: locale.common.totalFiles,
413
+ // Toolbar
414
+ bold: locale.editor.bold,
415
+ italic: locale.editor.italic,
416
+ underline: locale.editor.underline,
417
+ strikethrough: locale.editor.strikethrough,
418
+ superscript: locale.editor.superscript,
419
+ subscript: locale.editor.subscript,
420
+ textColor: locale.editor.textColor,
421
+ highlight: locale.editor.highlight,
422
+ heading2: locale.editor.heading2,
423
+ heading3: locale.editor.heading3,
424
+ bulletList: locale.editor.bulletList,
425
+ numberedList: locale.editor.numberedList,
426
+ quote: locale.editor.quote,
427
+ codeBlock: locale.editor.codeBlock,
428
+ divider: locale.editor.divider,
429
+ alignLeft: locale.editor.alignLeft,
430
+ alignCenter: locale.editor.alignCenter,
431
+ alignRight: locale.editor.alignRight,
432
+ table: locale.editor.table,
433
+ insertTable: locale.editor.insertTable,
434
+ addRowAbove: locale.editor.addRowAbove,
435
+ addRowBelow: locale.editor.addRowBelow,
436
+ addColumnLeft: locale.editor.addColumnLeft,
437
+ addColumnRight: locale.editor.addColumnRight,
438
+ deleteRow: locale.editor.deleteRow,
439
+ deleteColumn: locale.editor.deleteColumn,
440
+ deleteTable: locale.editor.deleteTable,
441
+ link: locale.editor.link,
442
+ image: locale.editor.image,
443
+ youtube: locale.editor.youtube,
444
+ video: locale.editor.video,
445
+ undo: locale.editor.undo,
446
+ redo: locale.editor.redo,
447
+ defaultColor: locale.editor.defaultColor,
448
+ removeHighlight: locale.editor.removeHighlight,
449
+ linkPrompt: locale.editor.linkPrompt,
450
+ youtubePrompt: locale.editor.youtubePrompt
339
451
  };
340
452
  }
341
453
  var DEFAULT_STRINGS = localeToStrings(loadLocale("it"));
@@ -398,6 +510,7 @@ var DEFAULT_CONFIG = {
398
510
  userNew: "/dashboard/utenti/nuovo",
399
511
  media: "/dashboard/media",
400
512
  dashboard: "/dashboard",
513
+ statistics: "/dashboard/statistiche",
401
514
  login: "/login",
402
515
  home: "/"
403
516
  },
@@ -555,4 +668,4 @@ export {
555
668
  useRegisteredComponent,
556
669
  useComponentRegistry
557
670
  };
558
- //# sourceMappingURL=chunk-PHT76VW6.js.map
671
+ //# sourceMappingURL=chunk-MANXBV2D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/it.ts","../src/i18n/en.ts","../src/i18n/index.ts","../src/config.ts","../src/providers/ConfigContext.tsx","../src/providers/ActionsContext.tsx","../src/providers/SplashContext.tsx","../src/components/registry.tsx"],"sourcesContent":["import type { GELocale } from \"./types.js\";\n\nexport const it: GELocale = {\n content: {\n articles: \"Articoli\",\n newArticle: \"Nuovo articolo\",\n titlePlaceholder: \"Titolo dell'articolo\",\n excerptPlaceholder: \"Breve descrizione dell'articolo...\",\n slugPlaceholder: \"slug-articolo\",\n authorPlaceholder: \"Nome dell'autore\",\n category: \"Categoria\",\n selectCategory: \"Seleziona categoria\",\n excerpt: \"Estratto\",\n author: \"Autore\",\n slugUrl: \"Slug URL\",\n noArticles: \"Nessun articolo.\",\n noArticlesSearch: \"Nessun articolo trovato.\",\n searchArticles: \"Cerca articoli...\",\n coverImageLabel: \"Immagine di copertina\",\n coverImageHint: \"Scegli dalla libreria o carica un nuovo file\",\n viewArticle: \"Vedi articolo pubblicato\",\n untitled: \"Senza titolo\",\n },\n editor: {\n publish: \"Pubblica\",\n unpublish: \"Ritira\",\n saveDraft: \"Salva bozza\",\n revisions: \"Cronologia\",\n saving: \"Salvando...\",\n saved: \"Salvato\",\n saveError: \"Errore nel salvataggio\",\n noRevisions: \"Nessuna revisione salvata.\",\n restore: \"Ripristina\",\n restoreConfirm:\n \"Ripristinare questa revisione? Lo stato attuale verrà salvato prima del ripristino.\",\n beforeRestore: \"Prima del ripristino\",\n publishedNote: \"Pubblicato\",\n preview: \"Anteprima\",\n placeholder: \"Inizia a scrivere il tuo articolo...\",\n bold: \"Grassetto\",\n italic: \"Corsivo\",\n underline: \"Sottolineato\",\n strikethrough: \"Barrato\",\n superscript: \"Apice\",\n subscript: \"Pedice\",\n textColor: \"Colore testo\",\n highlight: \"Evidenzia\",\n heading2: \"H2\",\n heading3: \"H3\",\n bulletList: \"Elenco puntato\",\n numberedList: \"Elenco numerato\",\n quote: \"Citazione\",\n codeBlock: \"Blocco codice\",\n divider: \"Separatore\",\n alignLeft: \"Allinea a sinistra\",\n alignCenter: \"Allinea al centro\",\n alignRight: \"Allinea a destra\",\n table: \"Tabella\",\n insertTable: \"Inserisci tabella 3×3\",\n addRowAbove: \"Aggiungi riga sopra\",\n addRowBelow: \"Aggiungi riga sotto\",\n addColumnLeft: \"Aggiungi colonna a sinistra\",\n addColumnRight: \"Aggiungi colonna a destra\",\n deleteRow: \"Elimina riga\",\n deleteColumn: \"Elimina colonna\",\n deleteTable: \"Elimina tabella\",\n link: \"Link\",\n image: \"Immagine\",\n youtube: \"YouTube\",\n video: \"Video\",\n undo: \"Annulla\",\n redo: \"Ripeti\",\n defaultColor: \"Predefinito\",\n removeHighlight: \"Rimuovi\",\n linkPrompt: \"URL:\",\n youtubePrompt: \"URL YouTube:\",\n },\n media: {\n media: \"Media\",\n noMedia: \"Nessun file caricato.\",\n noMediaSearch: \"Nessun file trovato.\",\n chooseFile: \"Scegli file\",\n dragHint: \"Trascina un'immagine qui oppure\",\n uploadHint: \"JPEG, PNG, WebP, GIF (max 5MB)\",\n mediaLibrary: \"Libreria media\",\n uploadNew: \"Carica nuovo\",\n searchFiles: \"Cerca file...\",\n selectImage: \"Seleziona immagine\",\n noImages: \"Nessuna immagine nella libreria.\",\n noImagesSearch: \"Nessuna immagine trovata.\",\n copyUrl: \"Copia URL\",\n editImage: \"Modifica immagine\",\n restoreOriginal: \"Ripristina originale\",\n freeAspect: \"Libero\",\n },\n users: {\n users: \"Utenti\",\n name: \"Nome\",\n email: \"Email\",\n password: \"Password\",\n passwordEditHint: \" (lascia vuoto per non modificarla)\",\n role: \"Ruolo\",\n createdAt: \"Creato il\",\n actions: \"Azioni\",\n createUser: \"Crea utente\",\n unauthorized: \"Non autorizzato\",\n notAuthenticated: \"Non autenticato\",\n allFieldsRequired: \"Tutti i campi sono obbligatori.\",\n passwordMinLength: \"La password deve avere almeno 6 caratteri.\",\n emailExists: \"Esiste già un utente con questa email.\",\n invalidRole: \"Ruolo non valido.\",\n cannotDeleteSelf: \"Non puoi eliminare il tuo stesso account.\",\n },\n common: {\n statistics: \"Statistiche\",\n settings: \"Impostazioni\",\n delete: \"Elimina\",\n edit: \"Modifica\",\n search: \"Cerca\",\n draft: \"Bozza\",\n published: \"Pubblicato\",\n all: \"Tutti\",\n drafts: \"Bozze\",\n loading: \"Caricamento...\",\n confirm: \"Conferma\",\n cancel: \"Annulla\",\n apply: \"Applica\",\n change: \"Cambia\",\n logout: \"Esci\",\n saveChanges: \"Salva modifiche\",\n updated: \"Aggiornato\",\n status: \"Stato\",\n title: \"Titolo\",\n deleteConfirm: (title) => `Eliminare \"${title || \"Senza titolo\"}\"?`,\n unpublishConfirm: (title) =>\n `Ritirare \"${title || \"Senza titolo\"}\"? L'articolo tornerà in bozza.`,\n deleteUserConfirm: (name) =>\n `Sei sicuro di voler eliminare l'utente \"${name}\"?`,\n totalArticles: (count) =>\n `${count} articol${count === 1 ? \"o\" : \"i\"} totali`,\n totalFiles: (count) => `${count} file caricati`,\n },\n};\n","import type { GELocale } from \"./types.js\";\n\nexport const en: GELocale = {\n content: {\n articles: \"Articles\",\n newArticle: \"New article\",\n titlePlaceholder: \"Article title\",\n excerptPlaceholder: \"Brief description of the article...\",\n slugPlaceholder: \"article-slug\",\n authorPlaceholder: \"Author name\",\n category: \"Category\",\n selectCategory: \"Select category\",\n excerpt: \"Excerpt\",\n author: \"Author\",\n slugUrl: \"URL Slug\",\n noArticles: \"No articles.\",\n noArticlesSearch: \"No articles found.\",\n searchArticles: \"Search articles...\",\n coverImageLabel: \"Cover image\",\n coverImageHint: \"Choose from library or upload a new file\",\n viewArticle: \"View published article\",\n untitled: \"Untitled\",\n },\n editor: {\n publish: \"Publish\",\n unpublish: \"Unpublish\",\n saveDraft: \"Save draft\",\n revisions: \"History\",\n saving: \"Saving...\",\n saved: \"Saved\",\n saveError: \"Error saving\",\n noRevisions: \"No revisions saved.\",\n restore: \"Restore\",\n restoreConfirm:\n \"Restore this revision? The current state will be saved before restoring.\",\n beforeRestore: \"Before restore\",\n publishedNote: \"Published\",\n preview: \"Preview\",\n placeholder: \"Start writing your article...\",\n bold: \"Bold\",\n italic: \"Italic\",\n underline: \"Underline\",\n strikethrough: \"Strikethrough\",\n superscript: \"Superscript\",\n subscript: \"Subscript\",\n textColor: \"Text color\",\n highlight: \"Highlight\",\n heading2: \"H2\",\n heading3: \"H3\",\n bulletList: \"Bullet list\",\n numberedList: \"Numbered list\",\n quote: \"Quote\",\n codeBlock: \"Code block\",\n divider: \"Divider\",\n alignLeft: \"Align left\",\n alignCenter: \"Align center\",\n alignRight: \"Align right\",\n table: \"Table\",\n insertTable: \"Insert 3×3 table\",\n addRowAbove: \"Add row above\",\n addRowBelow: \"Add row below\",\n addColumnLeft: \"Add column left\",\n addColumnRight: \"Add column right\",\n deleteRow: \"Delete row\",\n deleteColumn: \"Delete column\",\n deleteTable: \"Delete table\",\n link: \"Link\",\n image: \"Image\",\n youtube: \"YouTube\",\n video: \"Video\",\n undo: \"Undo\",\n redo: \"Redo\",\n defaultColor: \"Default\",\n removeHighlight: \"Remove\",\n linkPrompt: \"URL:\",\n youtubePrompt: \"YouTube URL:\",\n },\n media: {\n media: \"Media\",\n noMedia: \"No files uploaded.\",\n noMediaSearch: \"No files found.\",\n chooseFile: \"Choose file\",\n dragHint: \"Drag an image here or\",\n uploadHint: \"JPEG, PNG, WebP, GIF (max 5MB)\",\n mediaLibrary: \"Media library\",\n uploadNew: \"Upload new\",\n searchFiles: \"Search files...\",\n selectImage: \"Select image\",\n noImages: \"No images in library.\",\n noImagesSearch: \"No images found.\",\n copyUrl: \"Copy URL\",\n editImage: \"Edit image\",\n restoreOriginal: \"Restore original\",\n freeAspect: \"Free\",\n },\n users: {\n users: \"Users\",\n name: \"Name\",\n email: \"Email\",\n password: \"Password\",\n passwordEditHint: \" (leave blank to keep current)\",\n role: \"Role\",\n createdAt: \"Created at\",\n actions: \"Actions\",\n createUser: \"Create user\",\n unauthorized: \"Unauthorized\",\n notAuthenticated: \"Not authenticated\",\n allFieldsRequired: \"All fields are required.\",\n passwordMinLength: \"Password must be at least 6 characters.\",\n emailExists: \"A user with this email already exists.\",\n invalidRole: \"Invalid role.\",\n cannotDeleteSelf: \"You cannot delete your own account.\",\n },\n common: {\n statistics: \"Statistics\",\n settings: \"Settings\",\n delete: \"Delete\",\n edit: \"Edit\",\n search: \"Search\",\n draft: \"Draft\",\n published: \"Published\",\n all: \"All\",\n drafts: \"Drafts\",\n loading: \"Loading...\",\n confirm: \"Confirm\",\n cancel: \"Cancel\",\n apply: \"Apply\",\n change: \"Change\",\n logout: \"Logout\",\n saveChanges: \"Save changes\",\n updated: \"Updated\",\n status: \"Status\",\n title: \"Title\",\n deleteConfirm: (title) => `Delete \"${title || \"Untitled\"}\"?`,\n unpublishConfirm: (title) =>\n `Unpublish \"${title || \"Untitled\"}\"? The article will go back to draft.`,\n deleteUserConfirm: (name) =>\n `Are you sure you want to delete user \"${name}\"?`,\n totalArticles: (count) =>\n `${count} total article${count === 1 ? \"\" : \"s\"}`,\n totalFiles: (count) => `${count} uploaded file${count === 1 ? \"\" : \"s\"}`,\n },\n};\n","import type { GELocale } from \"./types.js\";\nimport { it } from \"./it.js\";\nimport { en } from \"./en.js\";\n\nexport type { GELocale } from \"./types.js\";\nexport { it } from \"./it.js\";\nexport { en } from \"./en.js\";\n\nconst builtinLocales: Record<string, GELocale> = { it, en };\n\nexport function loadLocale(locale: string): GELocale {\n const found = builtinLocales[locale];\n if (!found) {\n throw new Error(\n `Locale \"${locale}\" not found. Available: ${Object.keys(builtinLocales).join(\", \")}`\n );\n }\n return found;\n}\n\nexport function defineLocale(locale: GELocale): GELocale {\n return locale;\n}\n\nexport function mergeLocales(\n base: GELocale,\n overrides: DeepPartial<GELocale>\n): GELocale {\n return deepMergeLocale(base, overrides);\n}\n\nexport function registerLocale(key: string, locale: GELocale): void {\n builtinLocales[key] = locale;\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends (...args: any[]) => any\n ? T[P]\n : T[P] extends object\n ? DeepPartial<T[P]>\n : T[P];\n};\n\nfunction deepMergeLocale<T extends Record<string, any>>(\n target: T,\n source: DeepPartial<T>\n): T {\n const result = { ...target };\n for (const key of Object.keys(source) as (keyof T)[]) {\n const sourceVal = source[key];\n const targetVal = target[key];\n if (\n sourceVal &&\n typeof sourceVal === \"object\" &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === \"object\" &&\n !Array.isArray(targetVal) &&\n typeof sourceVal !== \"function\"\n ) {\n (result as any)[key] = deepMergeLocale(\n targetVal as Record<string, any>,\n sourceVal as Record<string, any>\n );\n } else if (sourceVal !== undefined) {\n (result as any)[key] = sourceVal;\n }\n }\n return result;\n}\n","import { loadLocale } from \"./i18n/index.js\";\nimport type { GELocale } from \"./i18n/types.js\";\nimport type { GEAuthAdapter } from \"./auth/types.js\";\nimport type { GEContentType } from \"./content/types.js\";\nimport type { GEComponentOverrides } from \"./components/registry.js\";\nimport type { GENavItem, GESplashConfig, GEColorOption } from \"./types.js\";\n\nexport interface GavaEngineConfig {\n branding: {\n name: string;\n logo?: string;\n };\n roles: {\n list: string[];\n labels: Record<string, string>;\n canEdit: (role: string) => boolean;\n canPublish: (role: string) => boolean;\n adminRole: string;\n };\n statuses: {\n draft: string;\n published: string;\n };\n locale: string;\n models: {\n article: string;\n articleRevision: string;\n articleView: string;\n media: string;\n user: string;\n };\n navigation?: GENavItem[];\n splash?: GESplashConfig;\n editorToolbar?: {\n textColors?: GEColorOption[];\n highlightColors?: GEColorOption[];\n };\n auth?: GEAuthAdapter;\n contentTypes?: GEContentType[];\n components?: GEComponentOverrides;\n categories: string[];\n upload: {\n endpoint: string;\n imageTypes: string[];\n videoTypes: string[];\n maxImageSize: number;\n maxVideoSize: number;\n };\n editor: {\n placeholder: string;\n autoSaveDelay: number;\n revisionThrottleMinutes: number;\n headingLevels: number[];\n };\n routes: {\n articles: string;\n articleEdit: (id: string) => string;\n articleNew: string;\n articleView: (slug: string) => string;\n articlePreview: (id: string) => string;\n users: string;\n userEdit: (id: string) => string;\n userNew: string;\n media: string;\n dashboard: string;\n statistics: string;\n login: string;\n home: string;\n };\n strings: {\n articles: string;\n newArticle: string;\n media: string;\n users: string;\n statistics: string;\n settings: string;\n revisions: string;\n publish: string;\n unpublish: string;\n saveDraft: string;\n delete: string;\n edit: string;\n search: string;\n titlePlaceholder: string;\n excerptPlaceholder: string;\n slugPlaceholder: string;\n authorPlaceholder: string;\n category: string;\n selectCategory: string;\n excerpt: string;\n author: string;\n slugUrl: string;\n draft: string;\n published: string;\n all: string;\n drafts: string;\n saving: string;\n saved: string;\n saveError: string;\n noArticles: string;\n noArticlesSearch: string;\n noMedia: string;\n noMediaSearch: string;\n noRevisions: string;\n loading: string;\n confirm: string;\n cancel: string;\n apply: string;\n change: string;\n logout: string;\n viewArticle: string;\n preview: string;\n restore: string;\n restoreConfirm: string;\n beforeRestore: string;\n publishedNote: string;\n deleteConfirm: (title: string) => string;\n unpublishConfirm: (title: string) => string;\n deleteUserConfirm: (name: string) => string;\n totalArticles: (count: number) => string;\n totalFiles: (count: number) => string;\n coverImageLabel: string;\n coverImageHint: string;\n chooseFile: string;\n dragHint: string;\n uploadHint: string;\n mediaLibrary: string;\n uploadNew: string;\n searchFiles: string;\n searchArticles: string;\n selectImage: string;\n noImages: string;\n noImagesSearch: string;\n copyUrl: string;\n editImage: string;\n restoreOriginal: string;\n freeAspect: string;\n unauthorized: string;\n notAuthenticated: string;\n allFieldsRequired: string;\n passwordMinLength: string;\n emailExists: string;\n invalidRole: string;\n cannotDeleteSelf: string;\n name: string;\n email: string;\n password: string;\n passwordEditHint: string;\n role: string;\n createdAt: string;\n actions: string;\n createUser: string;\n saveChanges: string;\n updated: string;\n status: string;\n title: string;\n untitled: string;\n // Toolbar\n bold: string;\n italic: string;\n underline: string;\n strikethrough: string;\n superscript: string;\n subscript: string;\n textColor: string;\n highlight: string;\n heading2: string;\n heading3: string;\n bulletList: string;\n numberedList: string;\n quote: string;\n codeBlock: string;\n divider: string;\n alignLeft: string;\n alignCenter: string;\n alignRight: string;\n table: string;\n insertTable: string;\n addRowAbove: string;\n addRowBelow: string;\n addColumnLeft: string;\n addColumnRight: string;\n deleteRow: string;\n deleteColumn: string;\n deleteTable: string;\n link: string;\n image: string;\n youtube: string;\n video: string;\n undo: string;\n redo: string;\n defaultColor: string;\n removeHighlight: string;\n linkPrompt: string;\n youtubePrompt: string;\n };\n}\n\nfunction localeToStrings(locale: GELocale): GavaEngineConfig[\"strings\"] {\n return {\n // content\n articles: locale.content.articles,\n newArticle: locale.content.newArticle,\n titlePlaceholder: locale.content.titlePlaceholder,\n excerptPlaceholder: locale.content.excerptPlaceholder,\n slugPlaceholder: locale.content.slugPlaceholder,\n authorPlaceholder: locale.content.authorPlaceholder,\n category: locale.content.category,\n selectCategory: locale.content.selectCategory,\n excerpt: locale.content.excerpt,\n author: locale.content.author,\n slugUrl: locale.content.slugUrl,\n noArticles: locale.content.noArticles,\n noArticlesSearch: locale.content.noArticlesSearch,\n searchArticles: locale.content.searchArticles,\n coverImageLabel: locale.content.coverImageLabel,\n coverImageHint: locale.content.coverImageHint,\n viewArticle: locale.content.viewArticle,\n untitled: locale.content.untitled,\n // editor\n publish: locale.editor.publish,\n unpublish: locale.editor.unpublish,\n saveDraft: locale.editor.saveDraft,\n revisions: locale.editor.revisions,\n saving: locale.editor.saving,\n saved: locale.editor.saved,\n saveError: locale.editor.saveError,\n noRevisions: locale.editor.noRevisions,\n restore: locale.editor.restore,\n restoreConfirm: locale.editor.restoreConfirm,\n beforeRestore: locale.editor.beforeRestore,\n publishedNote: locale.editor.publishedNote,\n preview: locale.editor.preview,\n // media\n media: locale.media.media,\n noMedia: locale.media.noMedia,\n noMediaSearch: locale.media.noMediaSearch,\n chooseFile: locale.media.chooseFile,\n dragHint: locale.media.dragHint,\n uploadHint: locale.media.uploadHint,\n mediaLibrary: locale.media.mediaLibrary,\n uploadNew: locale.media.uploadNew,\n searchFiles: locale.media.searchFiles,\n selectImage: locale.media.selectImage,\n noImages: locale.media.noImages,\n noImagesSearch: locale.media.noImagesSearch,\n copyUrl: locale.media.copyUrl,\n editImage: locale.media.editImage,\n restoreOriginal: locale.media.restoreOriginal,\n freeAspect: locale.media.freeAspect,\n // users\n users: locale.users.users,\n name: locale.users.name,\n email: locale.users.email,\n password: locale.users.password,\n passwordEditHint: locale.users.passwordEditHint,\n role: locale.users.role,\n createdAt: locale.users.createdAt,\n actions: locale.users.actions,\n createUser: locale.users.createUser,\n unauthorized: locale.users.unauthorized,\n notAuthenticated: locale.users.notAuthenticated,\n allFieldsRequired: locale.users.allFieldsRequired,\n passwordMinLength: locale.users.passwordMinLength,\n emailExists: locale.users.emailExists,\n invalidRole: locale.users.invalidRole,\n cannotDeleteSelf: locale.users.cannotDeleteSelf,\n // common\n statistics: locale.common.statistics,\n settings: locale.common.settings,\n delete: locale.common.delete,\n edit: locale.common.edit,\n search: locale.common.search,\n draft: locale.common.draft,\n published: locale.common.published,\n all: locale.common.all,\n drafts: locale.common.drafts,\n loading: locale.common.loading,\n confirm: locale.common.confirm,\n cancel: locale.common.cancel,\n apply: locale.common.apply,\n change: locale.common.change,\n logout: locale.common.logout,\n saveChanges: locale.common.saveChanges,\n updated: locale.common.updated,\n status: locale.common.status,\n title: locale.common.title,\n deleteConfirm: locale.common.deleteConfirm,\n unpublishConfirm: locale.common.unpublishConfirm,\n deleteUserConfirm: locale.common.deleteUserConfirm,\n totalArticles: locale.common.totalArticles,\n totalFiles: locale.common.totalFiles,\n // Toolbar\n bold: locale.editor.bold,\n italic: locale.editor.italic,\n underline: locale.editor.underline,\n strikethrough: locale.editor.strikethrough,\n superscript: locale.editor.superscript,\n subscript: locale.editor.subscript,\n textColor: locale.editor.textColor,\n highlight: locale.editor.highlight,\n heading2: locale.editor.heading2,\n heading3: locale.editor.heading3,\n bulletList: locale.editor.bulletList,\n numberedList: locale.editor.numberedList,\n quote: locale.editor.quote,\n codeBlock: locale.editor.codeBlock,\n divider: locale.editor.divider,\n alignLeft: locale.editor.alignLeft,\n alignCenter: locale.editor.alignCenter,\n alignRight: locale.editor.alignRight,\n table: locale.editor.table,\n insertTable: locale.editor.insertTable,\n addRowAbove: locale.editor.addRowAbove,\n addRowBelow: locale.editor.addRowBelow,\n addColumnLeft: locale.editor.addColumnLeft,\n addColumnRight: locale.editor.addColumnRight,\n deleteRow: locale.editor.deleteRow,\n deleteColumn: locale.editor.deleteColumn,\n deleteTable: locale.editor.deleteTable,\n link: locale.editor.link,\n image: locale.editor.image,\n youtube: locale.editor.youtube,\n video: locale.editor.video,\n undo: locale.editor.undo,\n redo: locale.editor.redo,\n defaultColor: locale.editor.defaultColor,\n removeHighlight: locale.editor.removeHighlight,\n linkPrompt: locale.editor.linkPrompt,\n youtubePrompt: locale.editor.youtubePrompt,\n };\n}\n\nconst DEFAULT_STRINGS = localeToStrings(loadLocale(\"it\"));\n\nconst DEFAULT_CONFIG: GavaEngineConfig = {\n branding: {\n name: \"GavaEngine\",\n },\n roles: {\n list: [\"admin\", \"redattore\", \"scrittore\", \"lettore\"],\n labels: {\n admin: \"Amministratore\",\n redattore: \"Redattore\",\n scrittore: \"Scrittore\",\n lettore: \"Lettore\",\n },\n canEdit: (role: string) => role !== \"lettore\",\n canPublish: (role: string) => role === \"admin\" || role === \"redattore\",\n adminRole: \"admin\",\n },\n statuses: {\n draft: \"bozza\",\n published: \"pubblicato\",\n },\n locale: \"it\",\n models: {\n article: \"article\",\n articleRevision: \"articleRevision\",\n articleView: \"articleView\",\n media: \"media\",\n user: \"user\",\n },\n categories: [\n \"Cultura ed Intercultura\",\n \"Fatti ed Eventi\",\n \"Poeti e Prosatori\",\n \"Famiglia, Istituzioni e Territorio\",\n \"Amici del Meucci\",\n ],\n upload: {\n endpoint: \"/api/upload\",\n imageTypes: [\"image/jpeg\", \"image/png\", \"image/webp\", \"image/gif\"],\n videoTypes: [\"video/mp4\", \"video/webm\", \"video/quicktime\"],\n maxImageSize: 5 * 1024 * 1024,\n maxVideoSize: 50 * 1024 * 1024,\n },\n editor: {\n placeholder: \"Inizia a scrivere il tuo articolo...\",\n autoSaveDelay: 2000,\n revisionThrottleMinutes: 5,\n headingLevels: [2, 3],\n },\n routes: {\n articles: \"/dashboard/articoli\",\n articleEdit: (id) => `/dashboard/articoli/${id}`,\n articleNew: \"/dashboard/articoli/nuovo\",\n articleView: (slug) => `/articoli/${slug}`,\n articlePreview: (id) => `/anteprima/${id}`,\n users: \"/dashboard/utenti\",\n userEdit: (id) => `/dashboard/utenti/${id}`,\n userNew: \"/dashboard/utenti/nuovo\",\n media: \"/dashboard/media\",\n dashboard: \"/dashboard\",\n statistics: \"/dashboard/statistiche\",\n login: \"/login\",\n home: \"/\",\n },\n strings: DEFAULT_STRINGS,\n};\n\nfunction deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n for (const key of Object.keys(source) as (keyof T)[]) {\n const sourceVal = source[key];\n const targetVal = target[key];\n if (\n sourceVal &&\n typeof sourceVal === \"object\" &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === \"object\" &&\n !Array.isArray(targetVal) &&\n typeof sourceVal !== \"function\"\n ) {\n (result as any)[key] = deepMerge(\n targetVal as Record<string, any>,\n sourceVal as Record<string, any>\n );\n } else if (sourceVal !== undefined) {\n (result as any)[key] = sourceVal;\n }\n }\n return result;\n}\n\nexport function defineConfig(\n overrides: Partial<GavaEngineConfig> = {}\n): GavaEngineConfig {\n // If a different locale is specified, load it as base strings\n const locale = overrides.locale ?? DEFAULT_CONFIG.locale;\n const baseStrings = localeToStrings(loadLocale(locale));\n\n // Build config with locale-based strings as default\n const configWithLocale = {\n ...DEFAULT_CONFIG,\n strings: baseStrings,\n };\n\n // Also update editor.placeholder from locale if not overridden\n if (!overrides.editor?.placeholder) {\n const localeData = loadLocale(locale);\n configWithLocale.editor = {\n ...configWithLocale.editor,\n placeholder: localeData.editor.placeholder,\n };\n }\n\n return deepMerge(configWithLocale, overrides);\n}\n\nexport { DEFAULT_CONFIG, localeToStrings };\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { type GavaEngineConfig, DEFAULT_CONFIG } from \"../config.js\";\n\nconst ConfigContext = createContext<GavaEngineConfig>(DEFAULT_CONFIG);\n\nexport function useGavaConfig() {\n return useContext(ConfigContext);\n}\n\nexport function ConfigProvider({\n config,\n children,\n}: {\n config: GavaEngineConfig;\n children: ReactNode;\n}) {\n return (\n <ConfigContext.Provider value={config}>{children}</ConfigContext.Provider>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport type { GEActions } from \"../types.js\";\n\nconst ActionsContext = createContext<GEActions | null>(null);\n\nexport function useGavaActions(): GEActions {\n const ctx = useContext(ActionsContext);\n if (!ctx) {\n throw new Error(\n \"useGavaActions must be used within a <GavaEngineProvider> with actions provided.\"\n );\n }\n return ctx;\n}\n\nexport function ActionsProvider({\n actions,\n children,\n}: {\n actions: GEActions;\n children: ReactNode;\n}) {\n return (\n <ActionsContext.Provider value={actions}>{children}</ActionsContext.Provider>\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n type ReactNode,\n} from \"react\";\n\ntype Phase = \"idle\" | \"closing\" | \"closed\" | \"opening\";\n\ninterface SplashContextValue {\n phase: Phase;\n navigateWithSplash: (url: string) => void;\n openSplash: () => void;\n}\n\nconst SplashContext = createContext<SplashContextValue>({\n phase: \"idle\",\n navigateWithSplash: () => {},\n openSplash: () => {},\n});\n\nexport function useSplash() {\n return useContext(SplashContext);\n}\n\nexport function SplashProvider({\n children,\n navigate,\n}: {\n children: ReactNode;\n navigate: (url: string) => void;\n}) {\n const [phase, setPhase] = useState<Phase>(\"idle\");\n\n const navigateWithSplash = useCallback(\n (url: string) => {\n if (phase !== \"idle\") return;\n setPhase(\"closing\");\n\n setTimeout(() => {\n setPhase(\"closed\");\n navigate(url);\n }, 700);\n },\n [phase, navigate]\n );\n\n const openSplash = useCallback(() => {\n if (phase !== \"closed\") return;\n requestAnimationFrame(() => {\n setPhase(\"opening\");\n setTimeout(() => setPhase(\"idle\"), 900);\n });\n }, [phase]);\n\n return (\n <SplashContext.Provider value={{ phase, navigateWithSplash, openSplash }}>\n {children}\n </SplashContext.Provider>\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n type ComponentType,\n type ReactNode,\n} from \"react\";\nimport type { ContentEditorProps } from \"./content/ContentEditor.js\";\nimport type { ContentListProps } from \"./content/ContentList.js\";\n\nexport interface GEComponentOverrides {\n DashboardNavbar?: ComponentType<any>;\n DashboardLayout?: ComponentType<{ children: ReactNode }>;\n EditorToolbar?: ComponentType<{ editor: any }>;\n ContentEditor?: ComponentType<ContentEditorProps>;\n ContentList?: ComponentType<ContentListProps>;\n MediaGrid?: ComponentType<any>;\n UserTable?: ComponentType<any>;\n LoginPage?: ComponentType<any>;\n StatCard?: ComponentType<any>;\n}\n\nconst RegistryContext = createContext<GEComponentOverrides>({});\n\nexport function ComponentRegistryProvider({\n overrides,\n children,\n}: {\n overrides: GEComponentOverrides;\n children: ReactNode;\n}) {\n return (\n <RegistryContext.Provider value={overrides}>\n {children}\n </RegistryContext.Provider>\n );\n}\n\nexport function useRegisteredComponent<K extends keyof GEComponentOverrides>(\n name: K,\n fallback: NonNullable<GEComponentOverrides[K]>\n): NonNullable<GEComponentOverrides[K]> {\n const registry = useContext(RegistryContext);\n return (registry[name] as NonNullable<GEComponentOverrides[K]>) ?? fallback;\n}\n\nexport function useComponentRegistry(): GEComponentOverrides {\n return useContext(RegistryContext);\n}\n"],"mappings":"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","names":["createContext","useContext","jsx","createContext","useContext","jsx","createContext","useContext","jsx"]}