@oktis-works/admin 0.4.14 → 0.4.16

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.
Files changed (58) hide show
  1. package/dist/client/_astro/{ActivityWidget.C2ETg6u_.js → ActivityWidget.BoV5JMFM.js} +1 -1
  2. package/dist/client/_astro/{AdminBar.Dc_oT_my.js → AdminBar.Bzzeux86.js} +23 -4
  3. package/dist/client/_astro/{AtGlanceWidget.BVCJB3QT.js → AtGlanceWidget.GxAJdK5M.js} +1 -1
  4. package/dist/client/_astro/{ContentEditor.CoCaseap.js → ContentEditor.Bdh3rpdn.js} +1 -1
  5. package/dist/client/_astro/{ContentList.Qp90yZEx.js → ContentList.D1XcWg2t.js} +1 -1
  6. package/dist/client/_astro/{CustomFieldsManager.B2JEuxBb.js → CustomFieldsManager.6c3e_83f.js} +1 -1
  7. package/dist/client/_astro/{DashboardHome.CgDrZavo.js → DashboardHome.C0c91P5X.js} +1 -1
  8. package/dist/client/_astro/{DashboardLayout.astro_astro_type_script_index_0_lang.nXh9K0OY.js → DashboardLayout.astro_astro_type_script_index_0_lang.CMtAy9r3.js} +1 -1
  9. package/dist/client/_astro/{Footer.BpxMjlJE.js → Footer.D-LUQUJu.js} +8 -8
  10. package/dist/client/_astro/{GeneralSettings.BVFwXCbR.js → GeneralSettings.BFAXjOA2.js} +1 -1
  11. package/dist/client/_astro/{MediaLibrary.CGzXvUbD.js → MediaLibrary.BvtJOo5A.js} +1 -1
  12. package/dist/client/_astro/{PluginManager.CQW7_Hl-.js → PluginManager.BYI4SRec.js} +1 -1
  13. package/dist/client/_astro/{PostTypesManager.CFX0sR5p.js → PostTypesManager.bQc6yww5.js} +1 -1
  14. package/dist/client/_astro/{QuickDraftWidget.DLaU-WiG.js → QuickDraftWidget.D3E1Yzh3.js} +1 -1
  15. package/dist/client/_astro/{ResourceHubs.DasaSiMK.js → ResourceHubs.MrbWi-Z_.js} +1 -1
  16. package/dist/client/_astro/{TaxonomiesManager.CralM7Ne.js → TaxonomiesManager.kwogAOFS.js} +1 -1
  17. package/dist/client/_astro/{ThemeManager.C9mBa-po.js → ThemeManager.Hw1k4IW5.js} +1 -1
  18. package/dist/client/_astro/{UserCreateForm.D6rRUn0J.js → UserCreateForm.CHb7uDCX.js} +1 -1
  19. package/dist/client/_astro/{UsersManager.DdpgI0mN.js → UsersManager.Btde4I0r.js} +1 -1
  20. package/dist/client/_astro/api.DD5u5p4h.js +1 -0
  21. package/dist/client/_astro/{extensions.roNfOg-_.js → extensions.Y_1XaoRs.js} +1 -1
  22. package/dist/client/_astro/{i18n.D0KNEGgP.js → i18n.RrM42yx5.js} +1 -1
  23. package/dist/client/_astro/{login.astro_astro_type_script_index_0_lang.CdYoT76J.js → login.astro_astro_type_script_index_0_lang.BPE3sVZJ.js} +1 -1
  24. package/dist/client/_astro/{src.DyLYQxi2.js → src.B10HDgSa.js} +1 -1
  25. package/dist/client/_astro/{version.CoiXQYz6.js → version.Cp72NTVg.js} +1 -1
  26. package/dist/client/favicon.svg +10 -0
  27. package/dist/server/chunks/BaseLayout_D1PbsjNG.mjs +33 -0
  28. package/dist/server/chunks/{ContentEditor_Dtmf4Zk6.mjs → ContentEditor_BqU0DtNq.mjs} +2 -2
  29. package/dist/server/chunks/{DashboardLayout_DnE23ArY.mjs → DashboardLayout_CERD-e40.mjs} +8 -9
  30. package/dist/server/chunks/{MediaLibrary_CKvvgCI6.mjs → MediaLibrary_thsJLAY1.mjs} +2 -2
  31. package/dist/server/chunks/{ResourceHubs_Aoy5L4qj.mjs → ResourceHubs_SnzUKv2d.mjs} +1 -1
  32. package/dist/server/chunks/{_slug__DtzYz9Uz.mjs → _slug__jxqFOvVR.mjs} +1 -1
  33. package/dist/server/chunks/{access_BNFcmbp2.mjs → access_DnXWrcyZ.mjs} +2 -2
  34. package/dist/server/chunks/{custom-fields_90Jyw521.mjs → custom-fields_CVeHeuFb.mjs} +2 -2
  35. package/dist/server/chunks/{edit_BmWxJDZa.mjs → edit_B6-0te22.mjs} +2 -2
  36. package/dist/server/chunks/{general_AGjbJVe-.mjs → general_asqAXx0m.mjs} +2 -2
  37. package/dist/server/chunks/{i18n_Csb4GGX2.mjs → i18n_BZdCNETS.mjs} +141 -54
  38. package/dist/server/chunks/{index_C7yZO-zD.mjs → index_6BqA8HYu.mjs} +2 -2
  39. package/dist/server/chunks/{index_b00ttelz.mjs → index_BxeeUWDl.mjs} +1 -1
  40. package/dist/server/chunks/{index_BKm7s1bn.mjs → index_Da0FgE7x.mjs} +2 -2
  41. package/dist/server/chunks/{index_D5IP16pU.mjs → index_DgrVUEky.mjs} +2 -2
  42. package/dist/server/chunks/{index_CUsSNKEq.mjs → index_b7iLx7FW.mjs} +2 -2
  43. package/dist/server/chunks/{login_lEEcbYs3.mjs → login_xmDNRy6-.mjs} +1 -2
  44. package/dist/server/chunks/{new_BjtzqhsE.mjs → new_BHhp1ZKL.mjs} +2 -2
  45. package/dist/server/chunks/{new_BDjFzd-l.mjs → new_C-cNjXfA.mjs} +2 -2
  46. package/dist/server/chunks/{operations_D7TMl0mB.mjs → operations_YU2sibBT.mjs} +2 -2
  47. package/dist/server/chunks/{plugins_KhRV7kiu.mjs → plugins_-SorPwyl.mjs} +11 -7
  48. package/dist/server/chunks/{post-types_DfXwkNIg.mjs → post-types_DDfEe_oY.mjs} +2 -2
  49. package/dist/server/chunks/{resources_BbhlUSXs.mjs → resources_JN4lGjm6.mjs} +2 -2
  50. package/dist/server/chunks/{taxonomies_CF7qpKG3.mjs → taxonomies_D8g1jVNp.mjs} +2 -2
  51. package/dist/server/chunks/{themes_RAw8tJmy.mjs → themes_COhkCzw1.mjs} +11 -7
  52. package/dist/server/chunks/{upload_BBZ9ttmU.mjs → upload_V2BvJy1c.mjs} +2 -2
  53. package/dist/server/entry.mjs +21 -21
  54. package/dist/server/virtual_astro_middleware.mjs +3 -2
  55. package/package.json +1 -1
  56. package/dist/client/_astro/api.CDW61rqX.js +0 -1
  57. package/dist/server/chunks/BaseLayout_4yJ0PQCS.mjs +0 -15
  58. package/dist/server/chunks/script_CPGt5jAh.mjs +0 -19
@@ -1,9 +1,8 @@
1
1
  import "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, p as addAttribute, s as renderSlot, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
4
- import { t as renderScript } from "./script_CPGt5jAh.mjs";
5
- import { a as LOCALE_LABELS, i as LOCALE_FLAGS, n as useTranslation, o as SUPPORTED_LOCALES, r as apiClient } from "./i18n_Csb4GGX2.mjs";
6
- import { t as $$BaseLayout } from "./BaseLayout_4yJ0PQCS.mjs";
4
+ import { n as renderScript, t as $$BaseLayout } from "./BaseLayout_D1PbsjNG.mjs";
5
+ import { a as LOCALE_LABELS, i as LOCALE_FLAGS, n as useTranslation, o as SUPPORTED_LOCALES, r as apiClient } from "./i18n_BZdCNETS.mjs";
7
6
  import { t as require_semver } from "./semver_WbqCUY_o.mjs";
8
7
  import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey, ssrStyle } from "solid-js/web";
9
8
  import { For, For as For2, Show, Show as Show2, createMemo as createMemo$1, createSignal, createSignal as createSignal$1, onMount, onMount as onMount$1 } from "solid-js";
@@ -395,7 +394,7 @@ function PluginExtensionsSlot() {
395
394
  }
396
395
  //#endregion
397
396
  //#region src/components/admin-bar/AdminBar.tsx
398
- var _tmpl$$4 = ["<style", ">\n #admin-bar {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 46px;\n background: #0A0A0A;\n border-bottom: 1px solid #333;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 1rem;\n z-index: 2000;\n font-family: inherit;\n }\n #admin-bar * { box-sizing: border-box; }\n .admin-bar-left, .admin-bar-right {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n .admin-bar-brand {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #FAF5E8;\n font-weight: 600;\n font-size: 1.125rem;\n text-decoration: none;\n padding: 0.375rem 0.75rem;\n border-radius: 0.375rem;\n transition: background 0.15s;\n }\n .admin-bar-brand:hover {\n background: rgba(255,255,255,0.08);\n }\n .admin-bar-brand svg { width: 28px; height: 28px; }\n .admin-bar-separator { width: 1px; height: 24px; background: #333; }\n .admin-bar-menu { display: flex; gap: 0.25rem; }\n .admin-bar-menu-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n color: rgba(255,255,255,0.7);\n font-size: 0.8125rem;\n font-weight: 500;\n border-radius: 0.375rem;\n text-decoration: none;\n transition: all 0.15s;\n }\n .admin-bar-menu-item:hover {\n background: rgba(255,255,255,0.1);\n color: #fff;\n }\n .admin-bar-menu-item svg { width: 18px; height: 18px; }\n .admin-bar-right { gap: 0.75rem; }\n .notifications-btn {\n position: relative;\n background: none;\n border: none;\n color: rgba(255,255,255,0.7);\n padding: 0.375rem;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: all 0.15s;\n }\n .notifications-btn:hover { background: rgba(255,255,255,0.1); color: #fff; }\n .notifications-badge {\n position: absolute;\n top: 2px;\n right: 2px;\n min-width: 16px;\n height: 16px;\n background: #EF4444;\n color: #fff;\n font-size: 0.625rem;\n font-weight: 600;\n border-radius: 9999px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 4px;\n }\n .notifications-dropdown { position: relative; }\n .notifications-panel {\n position: absolute;\n top: calc(100% + 0.5rem);\n right: 0;\n min-width: 280px;\n max-width: 90vw;\n background: #FFFFFF;\n border: 1px solid #DCDCDE;\n border-radius: 0.5rem;\n box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1);\n z-index: 2100;\n overflow: hidden;\n animation: slideIn 0.15s ease-out;\n }\n .notifications-header {\n padding: 0.75rem 1rem;\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: #646970;\n border-bottom: 1px solid #DCDCDE;\n }\n .notifications-item {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n padding: 0.625rem 1rem;\n border-bottom: 1px solid #F6F7F7;\n }\n .notifications-item:last-child { border-bottom: none; }\n .notifications-action {\n font-size: 0.8125rem;\n font-weight: 600;\n color: #2C3338;\n font-family: ui-monospace, SFMono-Regular, monospace;\n word-break: break-word;\n }\n .notifications-meta {\n display: flex;\n justify-content: space-between;\n gap: 0.75rem;\n font-size: 0.6875rem;\n color: #646970;\n }\n .notifications-empty { padding: 1rem; margin: 0; font-size: 0.8125rem; color: #646970; }\n .user-menu-trigger {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: none;\n color: #fff;\n padding: 0.375rem 0.75rem;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n transition: background 0.15s;\n }\n .user-menu-trigger:hover { background: rgba(255,255,255,0.1); }\n .user-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: linear-gradient(135deg, #D8B45E 0%, #B99542 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n font-size: 0.875rem;\n color: #0A0A0A;\n }\n .user-menu-dropdown {\n position: absolute;\n top: calc(100% + 0.5rem);\n right: 0;\n min-width: 200px;\n background: #FFFFFF;\n border: 1px solid #DCDCDE;\n border-radius: 0.5rem;\n box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1);\n z-index: 2100;\n overflow: hidden;\n animation: slideIn 0.15s ease-out;\n }\n @keyframes slideIn { from { opacity: 0; transform: translateY(-0.5rem); } to { opacity: 1; transform: translateY(0); } }\n .user-menu-header {\n padding: 1rem;\n border-bottom: 1px solid #DCDCDE;\n }\n .user-menu-name { font-weight: 600; color: #0A0A0A; font-size: 0.875rem; }\n .user-menu-email { color: #646970; font-size: 0.75rem; margin-top: 0.125rem; }\n .user-menu-divider { height: 1px; background: #DCDCDE; }\n .user-menu-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.625rem 1rem;\n background: none;\n border: none;\n color: #2C3338;\n font-size: 0.8125rem;\n font-weight: 500;\n text-align: left;\n cursor: pointer;\n transition: background 0.15s;\n }\n .user-menu-item:hover { background: #F6F7F7; }\n .user-menu-item svg { width: 18px; height: 18px; color: #646970; }\n .user-menu-item.danger { color: #EF4444; }\n .user-menu-item.danger:hover { background: #FEF2F2; }\n .lang-menu-dropdown {\n position: absolute;\n top: calc(100% + 0.5rem);\n right: 0;\n min-width: 180px;\n background: #FFFFFF;\n border: 1px solid #DCDCDE;\n border-radius: 0.5rem;\n box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1);\n z-index: 2100;\n overflow: hidden;\n animation: slideIn 0.15s ease-out;\n }\n @keyframes slideIn { from { opacity: 0; transform: translateY(-0.5rem); } to { opacity: 1; transform: translateY(0); } }\n .lang-menu-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.625rem 1rem;\n background: none;\n border: none;\n color: #2C3338;\n font-size: 0.8125rem;\n font-weight: 500;\n text-align: left;\n cursor: pointer;\n }\n .lang-menu-item:hover { background: #F6F7F7; }\n .lang-menu-item.active { background: #FAF5E8; color: #B99542; font-weight: 600; }\n .lang-menu-item .flag { font-size: 1rem; }\n @media (max-width: 782px) {\n .admin-bar-menu { display: none; }\n }\n </style>"];
397
+ var _tmpl$$4 = ["<style", ">\n #admin-bar {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 46px;\n background: #0A0A0A;\n border-bottom: 1px solid #333;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 1rem;\n z-index: 2000;\n font-family: inherit;\n }\n #admin-bar * { box-sizing: border-box; }\n .admin-bar-left, .admin-bar-right {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n .admin-bar-brand {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: #FAF5E8;\n font-weight: 600;\n font-size: 1.125rem;\n text-decoration: none;\n padding: 0.375rem 0.75rem;\n border-radius: 0.375rem;\n transition: background 0.15s;\n }\n .admin-bar-brand:hover {\n background: rgba(255,255,255,0.08);\n }\n .admin-bar-brand svg { width: 28px; height: 28px; }\n .admin-bar-separator { width: 1px; height: 24px; background: #333; }\n .admin-bar-menu { display: flex; gap: 0.25rem; }\n .admin-bar-menu-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n color: rgba(255,255,255,0.7);\n font-size: 0.8125rem;\n font-weight: 500;\n border-radius: 0.375rem;\n text-decoration: none;\n transition: all 0.15s;\n }\n .admin-bar-menu-item:hover {\n background: rgba(255,255,255,0.1);\n color: #fff;\n }\n .admin-bar-menu-item svg { width: 18px; height: 18px; }\n .admin-bar-right { gap: 0.75rem; }\n .notifications-btn {\n position: relative;\n background: none;\n border: none;\n color: rgba(255,255,255,0.7);\n padding: 0.375rem;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: all 0.15s;\n }\n .notifications-btn:hover { background: rgba(255,255,255,0.1); color: #fff; }\n .notifications-badge {\n position: absolute;\n top: 2px;\n right: 2px;\n min-width: 16px;\n height: 16px;\n background: #EF4444;\n color: #fff;\n font-size: 0.625rem;\n font-weight: 600;\n border-radius: 9999px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 4px;\n }\n .notifications-dropdown { position: relative; }\n .lang-dropdown {\n position: relative;\n display: flex;\n align-items: center;\n }\n .lang-dropdown > .notifications-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n min-height: 32px;\n line-height: 1;\n white-space: nowrap;\n }\n .notifications-panel {\n position: absolute;\n top: calc(100% + 0.5rem);\n right: 0;\n min-width: 280px;\n max-width: 90vw;\n background: #FFFFFF;\n border: 1px solid #DCDCDE;\n border-radius: 0.5rem;\n box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1);\n z-index: 2100;\n overflow: hidden;\n animation: slideIn 0.15s ease-out;\n }\n .notifications-header {\n padding: 0.75rem 1rem;\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: #646970;\n border-bottom: 1px solid #DCDCDE;\n }\n .notifications-item {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n padding: 0.625rem 1rem;\n border-bottom: 1px solid #F6F7F7;\n }\n .notifications-item:last-child { border-bottom: none; }\n .notifications-action {\n font-size: 0.8125rem;\n font-weight: 600;\n color: #2C3338;\n font-family: ui-monospace, SFMono-Regular, monospace;\n word-break: break-word;\n }\n .notifications-meta {\n display: flex;\n justify-content: space-between;\n gap: 0.75rem;\n font-size: 0.6875rem;\n color: #646970;\n }\n .notifications-empty { padding: 1rem; margin: 0; font-size: 0.8125rem; color: #646970; }\n .user-menu-trigger {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: none;\n color: #fff;\n padding: 0.375rem 0.75rem;\n border-radius: 0.375rem;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n transition: background 0.15s;\n }\n .user-menu-trigger:hover { background: rgba(255,255,255,0.1); }\n .user-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: linear-gradient(135deg, #D8B45E 0%, #B99542 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n font-size: 0.875rem;\n color: #0A0A0A;\n }\n .user-menu-dropdown {\n position: absolute;\n top: calc(100% + 0.5rem);\n right: 0;\n min-width: 200px;\n background: #FFFFFF;\n border: 1px solid #DCDCDE;\n border-radius: 0.5rem;\n box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1);\n z-index: 2100;\n overflow: hidden;\n animation: slideIn 0.15s ease-out;\n }\n @keyframes slideIn { from { opacity: 0; transform: translateY(-0.5rem); } to { opacity: 1; transform: translateY(0); } }\n .user-menu-header {\n padding: 1rem;\n border-bottom: 1px solid #DCDCDE;\n }\n .user-menu-name { font-weight: 600; color: #0A0A0A; font-size: 0.875rem; }\n .user-menu-email { color: #646970; font-size: 0.75rem; margin-top: 0.125rem; }\n .user-menu-divider { height: 1px; background: #DCDCDE; }\n .user-menu-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.625rem 1rem;\n background: none;\n border: none;\n color: #2C3338;\n font-size: 0.8125rem;\n font-weight: 500;\n text-align: left;\n cursor: pointer;\n transition: background 0.15s;\n }\n .user-menu-item:hover { background: #F6F7F7; }\n .user-menu-item svg { width: 18px; height: 18px; color: #646970; }\n .user-menu-item.danger { color: #EF4444; }\n .user-menu-item.danger:hover { background: #FEF2F2; }\n .lang-menu-dropdown {\n position: absolute;\n top: calc(100% + 0.5rem);\n right: 0;\n min-width: 192px;\n max-height: min(18rem, calc(100vh - 3.5rem));\n background: #FFFFFF;\n border: 1px solid #DCDCDE;\n border-radius: 0.5rem;\n box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1);\n z-index: 2100;\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n scrollbar-gutter: stable;\n animation: slideIn 0.15s ease-out;\n }\n @keyframes slideIn { from { opacity: 0; transform: translateY(-0.5rem); } to { opacity: 1; transform: translateY(0); } }\n .lang-menu-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.625rem 1rem;\n background: none;\n border: none;\n color: #2C3338;\n font-size: 0.8125rem;\n font-weight: 500;\n text-align: left;\n cursor: pointer;\n min-height: 36px;\n }\n .lang-menu-item:hover { background: #F6F7F7; }\n .lang-menu-item.active { background: #FAF5E8; color: #B99542; font-weight: 600; }\n .lang-menu-item .flag { font-size: 1rem; }\n @media (max-width: 782px) {\n .admin-bar-menu { display: none; }\n }\n </style>"];
399
398
  var _tmpl$2$3 = [
400
399
  "<span",
401
400
  " class=\"notifications-badge\">",
@@ -480,7 +479,7 @@ function AdminBar(props) {
480
479
  const [showLangMenu, setShowLangMenu] = createSignal(false);
481
480
  const [showNotifications, setShowNotifications] = createSignal(false);
482
481
  const [notifications, setNotifications] = createSignal([]);
483
- const currentLocale = locale;
482
+ const currentLocale = () => locale;
484
483
  const translate = t;
485
484
  const handleClickOutside = (e) => {
486
485
  if (!e.target.closest("#admin-bar")) {
@@ -551,12 +550,12 @@ function AdminBar(props) {
551
550
  }
552
551
  })));
553
552
  }
554
- })), ssrAttribute("aria-label", escape(t("common.language"), true), false) + ssrAttribute("aria-expanded", escape(showLangMenu(), true), false), escape(LOCALE_FLAGS[currentLocale] ?? "🌐"), escape(LOCALE_LABELS[currentLocale] ?? currentLocale), escape(createComponent(Show, {
553
+ })), ssrAttribute("aria-label", escape(t("common.language"), true), false) + ssrAttribute("aria-expanded", escape(showLangMenu(), true), false), escape(LOCALE_FLAGS[currentLocale()] ?? "🌐"), escape(LOCALE_LABELS[currentLocale()] ?? currentLocale()), escape(createComponent(Show, {
555
554
  get when() {
556
555
  return showLangMenu();
557
556
  },
558
557
  get children() {
559
- return ssr(_tmpl$4$3, ssrHydrationKey(), ssrAttribute("aria-label", escape(t("common.language"), true), false), escape(SUPPORTED_LOCALES.map((loc) => ssr(_tmpl$1, ssrHydrationKey() + ssrAttribute("class", currentLocale === loc ? "lang-menu-item active" : "lang-menu-item", false), escape(LOCALE_FLAGS[loc] ?? "🌐"), escape(LOCALE_LABELS[loc] ?? loc)))));
558
+ return ssr(_tmpl$4$3, ssrHydrationKey(), ssrAttribute("aria-label", escape(t("common.language"), true), false), escape(SUPPORTED_LOCALES.map((loc) => ssr(_tmpl$1, ssrHydrationKey() + ssrAttribute("class", currentLocale() === loc ? "lang-menu-item active" : "lang-menu-item", false), escape(LOCALE_FLAGS[loc] ?? "🌐"), escape(LOCALE_LABELS[loc] ?? loc)))));
560
559
  }
561
560
  })), escape(createComponent(Show, {
562
561
  get when() {
@@ -586,7 +585,7 @@ function AdminBar(props) {
586
585
  /** Versão do release atual (ex.: "0.4.0"). */
587
586
  var APP_VERSION = {
588
587
  name: "okcms",
589
- version: "0.4.14",
588
+ version: "0.4.16",
590
589
  "private": true,
591
590
  description: "Hybrid, modular, API-first CMS",
592
591
  engines: {
@@ -957,7 +956,7 @@ var _tmpl$ = [
957
956
  "</a><a href=\"https://docs.oktisworks.com\" target=\"_blank\" rel=\"noopener noreferrer\">",
958
957
  "</a><a href=\"https://oktisworks.com/community\" target=\"_blank\" rel=\"noopener noreferrer\">",
959
958
  "</a></nav><div class=\"footer-right\"><p class=\"footer-powered\">",
960
- "</p></div></div><style>\n .admin-footer {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n height: 48px;\n background: #2d2d2d;\n border-top: 1px solid var(--color-border);\n padding: 0 1.5rem;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.75rem;\n color: var(--color-muted);\n }\n\n .footer-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-width: 1400px;\n margin: 0 auto;\n gap: 1.5rem;\n }\n\n .footer-left { display: flex; flex-direction: column; gap: 0.125rem; }\n\n .footer-version {\n display: flex; align-items: center; gap: 0.5rem;\n font-weight: 600; color: var(--color-text); font-size: 0.8125rem;\n }\n\n .version-badge {\n background: var(--color-primary-soft);\n color: var(--color-primary-hover);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n font-size: 0.6875rem;\n font-weight: 700;\n }\n\n .footer-links {\n display: flex; gap: 1.5rem;\n }\n\n .footer-links a {\n color: var(--color-muted);\n font-size: 0.75rem;\n font-weight: 500;\n text-decoration: none;\n transition: color 0.15s;\n }\n\n .footer-links a:hover { color: var(--color-primary); }\n\n .footer-right { text-align: right; }\n .footer-powered { font-size: 0.6875rem; color: var(--color-muted); }\n\n @media (max-width: 768px) {\n .admin-footer { flex-direction: column; height: auto; padding: 0.75rem 1rem; gap: 0.5rem; }\n .footer-content { flex-direction: column; gap: 0.5rem; }\n .footer-links { flex-wrap: wrap; justify-content: center; }\n }\n\n /* RTL adjustments */\n [dir=\"rtl\"] .footer-links { flex-direction: row-reverse; }\n [dir=\"rtl\"] .footer-right { text-align: left; }\n [dir=\"rtl\"] .footer-left { align-items: flex-end; }\n </style></footer>"
959
+ "</p></div></div><style>\n .admin-footer {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n height: 48px;\n background: #2d2d2d;\n border-top: 1px solid #4a4a4a;\n padding: 0 1.5rem;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.75rem;\n color: #e5e7eb;\n }\n\n .footer-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-width: 1400px;\n margin: 0 auto;\n gap: 1.5rem;\n }\n\n .footer-left { display: flex; flex-direction: column; gap: 0.125rem; }\n\n .footer-version {\n display: flex; align-items: center; gap: 0.5rem;\n font-weight: 600; color: #ffffff; font-size: 0.8125rem;\n }\n\n .version-badge {\n background: var(--color-primary-soft);\n color: #2d2d2d;\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n font-size: 0.6875rem;\n font-weight: 700;\n }\n\n .footer-links {\n display: flex; gap: 1.5rem;\n }\n\n .footer-links a {\n color: #e5e7eb;\n font-size: 0.75rem;\n font-weight: 500;\n text-decoration: none;\n transition: color 0.15s;\n }\n\n .footer-links a:hover { color: #f0c96a; }\n\n .footer-right { text-align: right; }\n .footer-powered { font-size: 0.6875rem; color: #d1d5db; }\n\n @media (max-width: 768px) {\n .admin-footer { flex-direction: column; height: auto; padding: 0.75rem 1rem; gap: 0.5rem; }\n .footer-content { flex-direction: column; gap: 0.5rem; }\n .footer-links { flex-wrap: wrap; justify-content: center; }\n }\n\n /* RTL adjustments */\n [dir=\"rtl\"] .footer-links { flex-direction: row-reverse; }\n [dir=\"rtl\"] .footer-right { text-align: left; }\n [dir=\"rtl\"] .footer-left { align-items: flex-end; }\n </style></footer>"
961
960
  ];
962
961
  function Footer() {
963
962
  const { t } = useTranslation();
@@ -1,5 +1,5 @@
1
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
2
- import { a as For2, c as Select, f as createSignal, l as Show2, o as Input, p as onMount, r as Button, s as Pagination } from "./DashboardLayout_DnE23ArY.mjs";
1
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
2
+ import { a as For2, c as Select, f as createSignal, l as Show2, o as Input, p as onMount, r as Button, s as Pagination } from "./DashboardLayout_CERD-e40.mjs";
3
3
  import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey, ssrStyleProperty } from "solid-js/web";
4
4
  //#region src/components/media/MediaLibrary.tsx
5
5
  var _tmpl$ = [
@@ -1,4 +1,4 @@
1
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
1
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
2
2
  import { createComponent, escape, memo, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
3
3
  import { For, Show, createSignal, onMount } from "solid-js";
4
4
  //#region src/components/apps/settings/ResourceHubs.tsx
@@ -1,7 +1,7 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, p as addAttribute, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent } from "./compiler_O7J1rlsi.mjs";
4
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
4
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
5
5
  //#region src/pages/plugins/[slug].astro
6
6
  var _slug__exports = /* @__PURE__ */ __exportAll({
7
7
  default: () => $$Slug,
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent } from "./compiler_O7J1rlsi.mjs";
4
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
5
- import { t as AccessManager } from "./ResourceHubs_Aoy5L4qj.mjs";
4
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
5
+ import { t as AccessManager } from "./ResourceHubs_SnzUKv2d.mjs";
6
6
  //#region src/pages/settings/access.astro
7
7
  var access_exports = /* @__PURE__ */ __exportAll({
8
8
  default: () => $$Access,
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
4
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
5
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
4
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
5
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
6
6
  import { t as FieldTypePicker } from "./FieldTypePicker_CXwpmcQ3.mjs";
7
7
  import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
8
8
  import { For, Show, createMemo, createSignal, onMount } from "solid-js";
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent } from "./compiler_O7J1rlsi.mjs";
4
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
5
- import { t as ContentEditor } from "./ContentEditor_Dtmf4Zk6.mjs";
4
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
5
+ import { t as ContentEditor } from "./ContentEditor_BqU0DtNq.mjs";
6
6
  //#region src/pages/content/edit.astro
7
7
  var edit_exports = /* @__PURE__ */ __exportAll({
8
8
  default: () => $$Edit,
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
4
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
5
- import { c as Select, d as createMemo, f as createSignal, i as Card, l as Show2, o as Input, p as onMount, r as Button, t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
4
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
5
+ import { c as Select, d as createMemo, f as createSignal, i as Card, l as Show2, o as Input, p as onMount, r as Button, t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
6
6
  import { createComponent, escape, memo, ssr, ssrHydrationKey } from "solid-js/web";
7
7
  //#region src/components/apps/settings/GeneralSettings.tsx
8
8
  var _tmpl$ = [
@@ -108,24 +108,34 @@ async function loadLocale(locale) {
108
108
  }
109
109
  //#endregion
110
110
  //#region src/lib/api.ts
111
- var API_BASE = "http://localhost:3000";
111
+ function resolveApiBase() {
112
+ if (typeof document !== "undefined") {
113
+ const runtimeUrl = document.querySelector("meta[name=\"okcms-api-url\"]")?.getAttribute("content")?.trim();
114
+ if (runtimeUrl) return runtimeUrl.replace(/\/$/, "");
115
+ }
116
+ return "";
117
+ }
118
+ var API_BASE = resolveApiBase();
112
119
  var ApiClient = class {
113
120
  baseUrl;
114
121
  csrfToken = null;
115
- isRefreshing = false;
122
+ refreshPromise = null;
123
+ refreshOwner = typeof globalThis.crypto?.randomUUID === "function" ? globalThis.crypto.randomUUID() : Math.random().toString(36).slice(2);
124
+ refreshLockKey = "okcms:auth:refresh-lock";
116
125
  constructor(baseUrl = API_BASE) {
117
126
  this.baseUrl = baseUrl;
118
127
  }
119
128
  /** Inicializa lendo CSRF do cookie (chamado no boot da app) */
120
129
  async init() {
121
130
  try {
122
- await fetch(`${this.baseUrl}/api/v1/auth/me`, { credentials: "include" });
131
+ await this.ensureCsrfToken();
123
132
  } catch {}
124
133
  }
125
134
  /** Sessão válida — verifica via /me (usa cookies HttpOnly automaticamente) */
126
135
  async isLoggedIn() {
127
136
  try {
128
- return (await fetch(`${this.baseUrl}/api/v1/auth/me`, { credentials: "include" })).ok;
137
+ await this.request("GET", "/api/v1/auth/me");
138
+ return true;
129
139
  } catch {
130
140
  return false;
131
141
  }
@@ -133,9 +143,7 @@ var ApiClient = class {
133
143
  /** Obtém tenantId do backend via /me */
134
144
  async getTenantId() {
135
145
  try {
136
- const res = await fetch(`${this.baseUrl}/api/v1/auth/me`, { credentials: "include" });
137
- if (!res.ok) return null;
138
- return (await res.json()).tenantId ?? null;
146
+ return (await this.request("GET", "/api/v1/auth/me")).tenantId ?? null;
139
147
  } catch {
140
148
  return null;
141
149
  }
@@ -143,9 +151,7 @@ var ApiClient = class {
143
151
  /** Obtém locale do usuário logado via /me/locale */
144
152
  async getUserLocale() {
145
153
  try {
146
- const res = await fetch(`${this.baseUrl}/api/v1/users/me/locale`, { credentials: "include" });
147
- if (!res.ok) return "pt-BR";
148
- return (await res.json()).locale ?? "pt-BR";
154
+ return (await this.request("GET", "/api/v1/users/me/locale")).locale ?? "pt-BR";
149
155
  } catch {
150
156
  return "pt-BR";
151
157
  }
@@ -164,6 +170,7 @@ var ApiClient = class {
164
170
  }
165
171
  /** Login — o backend seta cookies HttpOnly e CSRF; retorna user + tenantId */
166
172
  async login(input) {
173
+ await this.ensureCsrfToken();
167
174
  return await this.request("POST", "/api/v1/auth/login", input);
168
175
  }
169
176
  /** Logout — limpa cookies no backend */
@@ -173,12 +180,55 @@ var ApiClient = class {
173
180
  }
174
181
  /** Refresh de access token via cookie refresh_token */
175
182
  async refreshTokens() {
176
- if (this.isRefreshing) return;
177
- this.isRefreshing = true;
183
+ if (this.refreshPromise) return this.refreshPromise;
184
+ this.refreshPromise = this.refreshWithCrossTabLock().finally(() => {
185
+ this.refreshPromise = null;
186
+ });
187
+ return this.refreshPromise;
188
+ }
189
+ async refreshWithCrossTabLock() {
190
+ if (typeof window === "undefined" || typeof localStorage === "undefined") {
191
+ await this.request("POST", "/api/v1/auth/refresh", {}, void 0, { skipRefresh: true });
192
+ return;
193
+ }
194
+ const now = Date.now();
195
+ let current;
178
196
  try {
179
- await this.request("POST", "/api/v1/auth/refresh", {});
197
+ current = JSON.parse(localStorage.getItem(this.refreshLockKey) ?? "null");
198
+ } catch {
199
+ await this.request("POST", "/api/v1/auth/refresh", {}, void 0, { skipRefresh: true });
200
+ return;
201
+ }
202
+ if (current?.owner && current.owner !== this.refreshOwner && Number(current.expiresAt) > now) {
203
+ await this.waitForOtherTabRefresh(Number(current.expiresAt));
204
+ return;
205
+ }
206
+ try {
207
+ localStorage.setItem(this.refreshLockKey, JSON.stringify({
208
+ owner: this.refreshOwner,
209
+ expiresAt: now + 1e4
210
+ }));
211
+ } catch {
212
+ await this.request("POST", "/api/v1/auth/refresh", {}, void 0, { skipRefresh: true });
213
+ return;
214
+ }
215
+ try {
216
+ await this.request("POST", "/api/v1/auth/refresh", {}, void 0, { skipRefresh: true });
180
217
  } finally {
181
- this.isRefreshing = false;
218
+ try {
219
+ if (JSON.parse(localStorage.getItem(this.refreshLockKey) ?? "null")?.owner === this.refreshOwner) localStorage.removeItem(this.refreshLockKey);
220
+ } catch {}
221
+ }
222
+ }
223
+ async waitForOtherTabRefresh(expiresAt) {
224
+ while (Date.now() < Math.min(expiresAt, Date.now() + 1e4)) {
225
+ await new Promise((resolve) => setTimeout(resolve, 100));
226
+ try {
227
+ const lock = JSON.parse(localStorage.getItem(this.refreshLockKey) ?? "null");
228
+ if (!lock || Number(lock.expiresAt) <= Date.now()) return;
229
+ } catch {
230
+ return;
231
+ }
182
232
  }
183
233
  }
184
234
  /** Requisição genérica com:
@@ -186,54 +236,74 @@ var ApiClient = class {
186
236
  * - auto-refresh em 401
187
237
  * - CSRF header para mutações
188
238
  */
189
- async request(method, path, body, headers) {
239
+ async request(method, path, body, headers, options) {
190
240
  const url = `${this.baseUrl}${path}`;
191
- const requestHeaders = {
192
- "Content-Type": "application/json",
193
- ...headers
194
- };
195
- if (![
196
- "GET",
197
- "HEAD",
198
- "OPTIONS"
199
- ].includes(method.toUpperCase())) {
200
- const csrf = this.getCsrfToken();
201
- if (csrf) requestHeaders["x-csrf-token"] = csrf;
202
- }
203
- let response = await fetch(url, {
204
- method,
205
- headers: requestHeaders,
206
- credentials: "include",
207
- body: body ? JSON.stringify(body) : void 0
208
- });
209
- if (response.status === 401 && !path.includes("/auth/refresh") && !path.includes("/auth/logout")) {
210
- await this.refreshTokens();
211
- response = await fetch(url, {
241
+ const send = async () => {
242
+ const requestHeaders = {
243
+ "Content-Type": "application/json",
244
+ ...headers
245
+ };
246
+ if (![
247
+ "GET",
248
+ "HEAD",
249
+ "OPTIONS"
250
+ ].includes(method.toUpperCase())) {
251
+ const csrf = await this.ensureCsrfToken();
252
+ if (csrf) requestHeaders["x-csrf-token"] = csrf;
253
+ }
254
+ return fetch(url, {
212
255
  method,
213
256
  headers: requestHeaders,
214
257
  credentials: "include",
215
258
  body: body ? JSON.stringify(body) : void 0
216
259
  });
260
+ };
261
+ let response = await send();
262
+ if (response.status === 401 && !options?.skipRefresh && !path.includes("/auth/refresh") && !path.includes("/auth/logout")) {
263
+ await this.refreshTokens();
264
+ response = await send();
265
+ }
266
+ if (response.status === 403 && !options?.skipCsrfRecovery) {
267
+ let errorCode = "";
268
+ try {
269
+ errorCode = (await (typeof response.clone === "function" ? response.clone() : response).json()).error ?? "";
270
+ } catch {}
271
+ if (errorCode === "CSRF_TOKEN_INVALID") {
272
+ await this.ensureCsrfToken(true);
273
+ response = await send();
274
+ }
217
275
  }
218
276
  if (!response.ok) {
219
277
  const error = await response.json().catch(() => ({ error: "Request failed" }));
220
278
  throw new Error(error.error ?? `Request failed: ${response.status}`);
221
279
  }
222
- const setCookie = response.headers.get("set-cookie");
223
- if (setCookie) {
224
- const csrfMatch = setCookie.match(/csrf_token=([^;]+)/);
225
- if (csrfMatch?.[1]) this.csrfToken = csrfMatch[1];
226
- }
227
280
  return response.json();
228
281
  }
229
- /** Lê CSRF token do cookie (document.cookie) */
230
- getCsrfToken() {
231
- if (this.csrfToken) return this.csrfToken;
282
+ /** Garante um token CSRF sincronizado com o cookie do browser. */
283
+ async ensureCsrfToken(force = false) {
284
+ const cookieToken = this.readCsrfCookie();
285
+ if (!force && cookieToken) {
286
+ this.csrfToken = cookieToken;
287
+ return cookieToken;
288
+ }
289
+ if (!force && this.csrfToken) return this.csrfToken;
290
+ try {
291
+ const response = await fetch(`${this.baseUrl}/api/v1/auth/csrf`, {
292
+ credentials: "include",
293
+ headers: { Accept: "application/json" }
294
+ });
295
+ if (!response.ok) return this.csrfToken;
296
+ const data = await response.json();
297
+ this.csrfToken = data.csrfToken ?? this.readCsrfCookie();
298
+ } catch {}
299
+ return this.csrfToken;
300
+ }
301
+ readCsrfCookie() {
232
302
  if (typeof document !== "undefined") {
233
303
  const match = document.cookie.match(/(?:^|;\s*)csrf_token=([^;]+)/);
234
304
  if (match?.[1]) return match[1];
235
305
  }
236
- return null;
306
+ return this.csrfToken;
237
307
  }
238
308
  async getContent(options) {
239
309
  const params = new URLSearchParams();
@@ -429,15 +499,32 @@ var ApiClient = class {
429
499
  if (options?.alt) formData.append("alt", options.alt);
430
500
  if (options?.caption) formData.append("caption", options.caption);
431
501
  const url = `${this.baseUrl}/api/v1/media/upload`;
432
- const requestHeaders = {};
433
- const csrf = this.getCsrfToken();
434
- if (csrf) requestHeaders["x-csrf-token"] = csrf;
435
- const response = await fetch(url, {
436
- method: "POST",
437
- headers: requestHeaders,
438
- credentials: "include",
439
- body: formData
440
- });
502
+ const send = async () => {
503
+ const csrf = await this.ensureCsrfToken();
504
+ const requestHeaders = {};
505
+ if (csrf) requestHeaders["x-csrf-token"] = csrf;
506
+ return fetch(url, {
507
+ method: "POST",
508
+ headers: requestHeaders,
509
+ credentials: "include",
510
+ body: formData
511
+ });
512
+ };
513
+ let response = await send();
514
+ if (response.status === 401) {
515
+ await this.refreshTokens();
516
+ response = await send();
517
+ }
518
+ if (response.status === 403) {
519
+ let errorCode = "";
520
+ try {
521
+ errorCode = (await response.clone().json()).error ?? "";
522
+ } catch {}
523
+ if (errorCode === "CSRF_TOKEN_INVALID") {
524
+ await this.ensureCsrfToken(true);
525
+ response = await send();
526
+ }
527
+ }
441
528
  if (!response.ok) {
442
529
  const error = await response.json().catch(() => ({ error: `Upload failed: ${response.status}` }));
443
530
  throw new Error(error.error ?? `Upload failed: ${response.status}`);
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
4
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
5
- import { a as For2, c as Select, f as createSignal, l as Show2, n as Badge, o as Input, p as onMount, r as Button, s as Pagination, t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
4
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
5
+ import { a as For2, c as Select, f as createSignal, l as Show2, n as Badge, o as Input, p as onMount, r as Button, s as Pagination, t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
6
6
  import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
7
7
  //#region src/components/apps/users/UsersManager.tsx
8
8
  var _tmpl$ = [
@@ -1,7 +1,7 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent } from "./compiler_O7J1rlsi.mjs";
4
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
4
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
5
5
  //#region src/pages/settings/index.astro
6
6
  var settings_exports = /* @__PURE__ */ __exportAll({
7
7
  default: () => $$Index,
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent } from "./compiler_O7J1rlsi.mjs";
4
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
5
- import { t as MediaLibrary } from "./MediaLibrary_CKvvgCI6.mjs";
4
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
5
+ import { t as MediaLibrary } from "./MediaLibrary_thsJLAY1.mjs";
6
6
  //#region src/pages/media/index.astro
7
7
  var media_exports = /* @__PURE__ */ __exportAll({
8
8
  default: () => $$Index,
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
4
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
5
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
4
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
5
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
6
6
  import { createComponent, escape, ssr, ssrHydrationKey } from "solid-js/web";
7
7
  import { For, Show, createSignal, onMount } from "solid-js";
8
8
  //#region src/components/apps/dashboard/DashboardHome.tsx
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
4
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
5
- import { c as Select, i as Card, n as Badge, o as Input, r as Button, s as Pagination, t as $$DashboardLayout, u as Table } from "./DashboardLayout_DnE23ArY.mjs";
4
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
5
+ import { c as Select, i as Card, n as Badge, o as Input, r as Button, s as Pagination, t as $$DashboardLayout, u as Table } from "./DashboardLayout_CERD-e40.mjs";
6
6
  import { createComponent, escape, ssr, ssrHydrationKey } from "solid-js/web";
7
7
  import { Show, createMemo, createSignal, onMount } from "solid-js";
8
8
  //#region src/components/content/ContentList.tsx
@@ -1,8 +1,7 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent } from "./compiler_O7J1rlsi.mjs";
4
- import { t as renderScript } from "./script_CPGt5jAh.mjs";
5
- import { t as $$BaseLayout } from "./BaseLayout_4yJ0PQCS.mjs";
4
+ import { n as renderScript, t as $$BaseLayout } from "./BaseLayout_D1PbsjNG.mjs";
6
5
  //#region src/pages/login.astro
7
6
  var login_exports = /* @__PURE__ */ __exportAll({
8
7
  default: () => $$Login,
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
4
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
5
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
4
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
5
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
6
6
  import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
7
7
  import { For, Show, createSignal, onMount } from "solid-js";
8
8
  //#region src/components/apps/users/UserCreateForm.tsx
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent } from "./compiler_O7J1rlsi.mjs";
4
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
5
- import { t as ContentEditor } from "./ContentEditor_Dtmf4Zk6.mjs";
4
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
5
+ import { t as ContentEditor } from "./ContentEditor_BqU0DtNq.mjs";
6
6
  //#region src/pages/content/new.astro
7
7
  var new_exports = /* @__PURE__ */ __exportAll({
8
8
  default: () => $$New,
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent } from "./compiler_O7J1rlsi.mjs";
4
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
5
- import { r as OperationsManager } from "./ResourceHubs_Aoy5L4qj.mjs";
4
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
5
+ import { r as OperationsManager } from "./ResourceHubs_SnzUKv2d.mjs";
6
6
  //#region src/pages/settings/operations.astro
7
7
  var operations_exports = /* @__PURE__ */ __exportAll({
8
8
  default: () => $$Operations,
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
- import { i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
2
+ import { S as createAstro, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
4
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
5
- import { t as $$BaseLayout } from "./BaseLayout_4yJ0PQCS.mjs";
4
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
5
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
6
6
  import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
7
7
  import { For, Show, createSignal, onMount } from "solid-js";
8
8
  //#region src/components/apps/plugins/PluginManager.tsx
@@ -84,7 +84,7 @@ function PluginManager() {
84
84
  setLoading(true);
85
85
  const data = await apiClient.getPlugins();
86
86
  setPlugins(data);
87
- } catch (err) {
87
+ } catch {
88
88
  setError(t("plugins.loadError"));
89
89
  } finally {
90
90
  setLoading(false);
@@ -132,10 +132,14 @@ var plugins_exports = /* @__PURE__ */ __exportAll({
132
132
  file: () => $$file,
133
133
  url: () => $$url
134
134
  });
135
+ createAstro("https://astro.build");
135
136
  var $$Plugins = createComponent$1(($$result, $$props, $$slots) => {
136
- return renderTemplate`${renderComponent($$result, "BaseLayout", $$BaseLayout, {
137
- "title": "Plugins",
138
- "description": "Gerencie plugins do sistema"
137
+ const Astro = $$result.createAstro($$props, $$slots);
138
+ Astro.self = $$Plugins;
139
+ const { t } = Astro.locals;
140
+ return renderTemplate`${renderComponent($$result, "DashboardLayout", $$DashboardLayout, {
141
+ "title": t("plugins.title"),
142
+ "description": t("plugins.description")
139
143
  }, { "default": ($$result) => renderTemplate`${renderComponent($$result, "PluginManager", PluginManager, {
140
144
  "client:load": true,
141
145
  "client:component-hydration": "load",
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
2
2
  import { S as createAstro, d as maybeRenderHead, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
3
3
  import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
4
- import { n as useTranslation, r as apiClient } from "./i18n_Csb4GGX2.mjs";
5
- import { t as $$DashboardLayout } from "./DashboardLayout_DnE23ArY.mjs";
4
+ import { n as useTranslation, r as apiClient } from "./i18n_BZdCNETS.mjs";
5
+ import { t as $$DashboardLayout } from "./DashboardLayout_CERD-e40.mjs";
6
6
  import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
7
7
  import { For, Show, createMemo, createSignal, onMount } from "solid-js";
8
8
  //#region src/components/apps/settings/PostTypesManager.tsx