web-mojo 2.1.46

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 (91) hide show
  1. package/LICENSE +198 -0
  2. package/README.md +510 -0
  3. package/dist/admin.cjs.js +2 -0
  4. package/dist/admin.cjs.js.map +1 -0
  5. package/dist/admin.css +621 -0
  6. package/dist/admin.es.js +7973 -0
  7. package/dist/admin.es.js.map +1 -0
  8. package/dist/auth.cjs.js +2 -0
  9. package/dist/auth.cjs.js.map +1 -0
  10. package/dist/auth.css +804 -0
  11. package/dist/auth.es.js +2168 -0
  12. package/dist/auth.es.js.map +1 -0
  13. package/dist/charts.cjs.js +2 -0
  14. package/dist/charts.cjs.js.map +1 -0
  15. package/dist/charts.css +1002 -0
  16. package/dist/charts.es.js +16 -0
  17. package/dist/charts.es.js.map +1 -0
  18. package/dist/chunks/ContextMenu-BrHqj0fn.js +80 -0
  19. package/dist/chunks/ContextMenu-BrHqj0fn.js.map +1 -0
  20. package/dist/chunks/ContextMenu-gEcpSz56.js +2 -0
  21. package/dist/chunks/ContextMenu-gEcpSz56.js.map +1 -0
  22. package/dist/chunks/DataView-DPryYpEW.js +2 -0
  23. package/dist/chunks/DataView-DPryYpEW.js.map +1 -0
  24. package/dist/chunks/DataView-DjZQrpba.js +843 -0
  25. package/dist/chunks/DataView-DjZQrpba.js.map +1 -0
  26. package/dist/chunks/Dialog-BsRx4eg3.js +2 -0
  27. package/dist/chunks/Dialog-BsRx4eg3.js.map +1 -0
  28. package/dist/chunks/Dialog-DSlctbon.js +1377 -0
  29. package/dist/chunks/Dialog-DSlctbon.js.map +1 -0
  30. package/dist/chunks/FilePreviewView-BmFHzK5K.js +5868 -0
  31. package/dist/chunks/FilePreviewView-BmFHzK5K.js.map +1 -0
  32. package/dist/chunks/FilePreviewView-DcdRl_ta.js +2 -0
  33. package/dist/chunks/FilePreviewView-DcdRl_ta.js.map +1 -0
  34. package/dist/chunks/FormView-CmBuwKGD.js +2 -0
  35. package/dist/chunks/FormView-CmBuwKGD.js.map +1 -0
  36. package/dist/chunks/FormView-DqUBMPJ9.js +5054 -0
  37. package/dist/chunks/FormView-DqUBMPJ9.js.map +1 -0
  38. package/dist/chunks/MetricsChart-CM4CI6eA.js +2095 -0
  39. package/dist/chunks/MetricsChart-CM4CI6eA.js.map +1 -0
  40. package/dist/chunks/MetricsChart-CPidSMaN.js +2 -0
  41. package/dist/chunks/MetricsChart-CPidSMaN.js.map +1 -0
  42. package/dist/chunks/PDFViewer-BNQlnS83.js +2 -0
  43. package/dist/chunks/PDFViewer-BNQlnS83.js.map +1 -0
  44. package/dist/chunks/PDFViewer-Dyo-Oeyd.js +946 -0
  45. package/dist/chunks/PDFViewer-Dyo-Oeyd.js.map +1 -0
  46. package/dist/chunks/Page-B524zSQs.js +351 -0
  47. package/dist/chunks/Page-B524zSQs.js.map +1 -0
  48. package/dist/chunks/Page-BFgj0pAA.js +2 -0
  49. package/dist/chunks/Page-BFgj0pAA.js.map +1 -0
  50. package/dist/chunks/TokenManager-BXNva8Jk.js +287 -0
  51. package/dist/chunks/TokenManager-BXNva8Jk.js.map +1 -0
  52. package/dist/chunks/TokenManager-Bzn4guFm.js +2 -0
  53. package/dist/chunks/TokenManager-Bzn4guFm.js.map +1 -0
  54. package/dist/chunks/TopNav-D3I3_25f.js +371 -0
  55. package/dist/chunks/TopNav-D3I3_25f.js.map +1 -0
  56. package/dist/chunks/TopNav-MDjL4kV0.js +2 -0
  57. package/dist/chunks/TopNav-MDjL4kV0.js.map +1 -0
  58. package/dist/chunks/User-BalfYTEF.js +3 -0
  59. package/dist/chunks/User-BalfYTEF.js.map +1 -0
  60. package/dist/chunks/User-DwIT-CTQ.js +1937 -0
  61. package/dist/chunks/User-DwIT-CTQ.js.map +1 -0
  62. package/dist/chunks/WebApp-B6mgbNn2.js +4767 -0
  63. package/dist/chunks/WebApp-B6mgbNn2.js.map +1 -0
  64. package/dist/chunks/WebApp-DqDowtkl.js +2 -0
  65. package/dist/chunks/WebApp-DqDowtkl.js.map +1 -0
  66. package/dist/chunks/WebSocketClient-D6i85jl2.js +2 -0
  67. package/dist/chunks/WebSocketClient-D6i85jl2.js.map +1 -0
  68. package/dist/chunks/WebSocketClient-Dvl3AYx1.js +297 -0
  69. package/dist/chunks/WebSocketClient-Dvl3AYx1.js.map +1 -0
  70. package/dist/core.css +1181 -0
  71. package/dist/css/web-mojo.css +17 -0
  72. package/dist/css-manifest.json +6 -0
  73. package/dist/docit.cjs.js +2 -0
  74. package/dist/docit.cjs.js.map +1 -0
  75. package/dist/docit.es.js +959 -0
  76. package/dist/docit.es.js.map +1 -0
  77. package/dist/index.cjs.js +2 -0
  78. package/dist/index.cjs.js.map +1 -0
  79. package/dist/index.es.js +2681 -0
  80. package/dist/index.es.js.map +1 -0
  81. package/dist/lightbox.cjs.js +2 -0
  82. package/dist/lightbox.cjs.js.map +1 -0
  83. package/dist/lightbox.css +606 -0
  84. package/dist/lightbox.es.js +3737 -0
  85. package/dist/lightbox.es.js.map +1 -0
  86. package/dist/loader.es.js +115 -0
  87. package/dist/loader.umd.js +85 -0
  88. package/dist/portal.css +2446 -0
  89. package/dist/table.css +639 -0
  90. package/dist/toast.css +181 -0
  91. package/package.json +179 -0
@@ -0,0 +1,17 @@
1
+ :root{--bs-primary: #1a73e8;--bs-secondary: #5f6368;--bs-success: #34a853;--bs-info: #4285f4;--bs-warning: #fbbc05;--bs-danger: #ea4335;--bs-light: #f1f3f4;--bs-dark: #202124;--bs-primary-bg-subtle: #e8f0fe;--bs-secondary-bg-subtle: #f1f3f4;--bs-success-bg-subtle: #e6f4ea;--bs-info-bg-subtle: #e8f0fe;--bs-warning-bg-subtle: #fef7e0;--bs-danger-bg-subtle: #fce8e6;--bs-primary-border-subtle: #aecbfa;--bs-secondary-border-subtle: #dadce0;--bs-success-border-subtle: #81c995;--bs-info-border-subtle: #aecbfa;--bs-warning-border-subtle: #fad2cf;--bs-danger-border-subtle: #f28b82;--bs-primary-text-emphasis: #174ea6;--bs-secondary-text-emphasis: #3c4043;--bs-success-text-emphasis: #0d652d;--bs-info-text-emphasis: #174ea6;--bs-warning-text-emphasis: #b06000;--bs-danger-text-emphasis: #a50e0e;--bs-btn-hover-bg: #e8f0fe}:root[data-bs-theme=ocean]{--bs-primary: #0077b6;--bs-secondary: #90e0ef;--bs-success: #00b4d8;--bs-info: #48cae4;--bs-warning: #ffd166;--bs-danger: #ef476f;--bs-light: #f1faff;--bs-dark: #03045e;--bs-primary-bg-subtle: #caf0f8;--bs-secondary-bg-subtle: #e0fbfc;--bs-success-bg-subtle: #ade8f4;--bs-info-bg-subtle: #caf0f8;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #fde2e4;--bs-primary-text-emphasis: #023e8a;--bs-success-text-emphasis: #0077b6;--bs-danger-text-emphasis: #9d0208}:root[data-bs-theme=sunrise]{--bs-primary: #ff6f00;--bs-secondary: #ffb703;--bs-success: #fb8500;--bs-info: #ffb4a2;--bs-warning: #ffd166;--bs-danger: #e63946;--bs-light: #fff3e6;--bs-dark: #432818;--bs-primary-bg-subtle: #fff4e1;--bs-secondary-bg-subtle: #fff8dc;--bs-success-bg-subtle: #ffe5b4;--bs-info-bg-subtle: #ffe0d9;--bs-warning-bg-subtle: #fff7d6;--bs-danger-bg-subtle: #fddede;--bs-primary-text-emphasis: #9d4b00;--bs-success-text-emphasis: #a85d00;--bs-danger-text-emphasis: #8d0000}:root[data-bs-theme=forest]{--bs-primary: #2b9348;--bs-secondary: #95d5b2;--bs-success: #55a630;--bs-info: #76c893;--bs-warning: #ffba08;--bs-danger: #d62828;--bs-light: #f0fdf4;--bs-dark: #081c15;--bs-primary-bg-subtle: #d8f3dc;--bs-secondary-bg-subtle: #e9f5eb;--bs-success-bg-subtle: #c7f9cc;--bs-info-bg-subtle: #e9fbee;--bs-warning-bg-subtle: #fff8e1;--bs-danger-bg-subtle: #ffe5e5;--bs-primary-text-emphasis: #1a472a;--bs-success-text-emphasis: #2f5233;--bs-danger-text-emphasis: #7a1a1a}:root[data-bs-theme=midnight]{--bs-primary: #5a189a;--bs-secondary: #7b2cbf;--bs-success: #06d6a0;--bs-info: #118ab2;--bs-warning: #ffd166;--bs-danger: #ef476f;--bs-light: #f8f9fa;--bs-dark: #03071e;--bs-primary-bg-subtle: #e0d4f7;--bs-secondary-bg-subtle: #f1e4ff;--bs-success-bg-subtle: #d0fdf2;--bs-info-bg-subtle: #d0ebff;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #fbdde2;--bs-primary-text-emphasis: #240046;--bs-success-text-emphasis: #056b53;--bs-danger-text-emphasis: #9d001f}:root[data-bs-theme=corporate]{--bs-primary: #2a5d9f;--bs-secondary: #6c757d;--bs-success: #4caf50;--bs-info: #17a2b8;--bs-warning: #f0ad4e;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-primary-bg-subtle: #e7f0fa;--bs-secondary-bg-subtle: #f1f3f5;--bs-success-bg-subtle: #eaf6ec;--bs-info-bg-subtle: #e6f7fa;--bs-warning-bg-subtle: #fff4e0;--bs-danger-bg-subtle: #fcebec;--bs-primary-border-subtle: #c2d7ed;--bs-secondary-border-subtle: #dee2e6;--bs-success-border-subtle: #c8e6c9;--bs-info-border-subtle: #bde3ea;--bs-warning-border-subtle: #ffe0b2;--bs-danger-border-subtle: #f5c2c7;--bs-primary-text-emphasis: #1d3f6e;--bs-secondary-text-emphasis: #495057;--bs-success-text-emphasis: #2e7d32;--bs-info-text-emphasis: #0d6673;--bs-warning-text-emphasis: #a46900;--bs-danger-text-emphasis: #8a1c24}:root{--mojo-primary: var(--bs-primary);--mojo-primary-rgb: var(--bs-primary-rgb);--mojo-secondary: var(--bs-secondary);--mojo-secondary-rgb: var(--bs-secondary-rgb);--mojo-success: var(--bs-success);--mojo-success-rgb: var(--bs-success-rgb);--mojo-info: var(--bs-info);--mojo-info-rgb: var(--bs-info-rgb);--mojo-warning: var(--bs-warning);--mojo-warning-rgb: var(--bs-warning-rgb);--mojo-danger: var(--bs-danger);--mojo-danger-rgb: var(--bs-danger-rgb);--mojo-light: var(--bs-light);--mojo-light-rgb: var(--bs-light-rgb);--mojo-dark: var(--bs-dark);--mojo-dark-rgb: var(--bs-dark-rgb);--mojo-body-bg: var(--bs-body-bg);--mojo-body-color: var(--bs-body-color);--mojo-emphasis-color: var(--bs-emphasis-color);--mojo-secondary-color: var(--bs-secondary-color);--mojo-tertiary-color: var(--bs-tertiary-color);--mojo-bg-primary: var(--bs-body-bg);--mojo-bg-secondary: var(--bs-secondary-bg);--mojo-bg-tertiary: var(--bs-tertiary-bg);--mojo-border-color: var(--bs-border-color);--mojo-border-color-translucent: var(--bs-border-color-translucent);--mojo-hover-bg: var(--bs-secondary-bg);--mojo-active-bg: var(--bs-primary);--mojo-focus-color: var(--bs-primary);--mojo-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb), .25);--mojo-transition-fast: .15s ease-in-out;--mojo-transition-base: .2s ease-in-out;--mojo-transition-slow: .3s ease-in-out;--mojo-border-radius-sm: var(--bs-border-radius-sm);--mojo-border-radius: var(--bs-border-radius);--mojo-border-radius-lg: var(--bs-border-radius-lg);--mojo-border-radius-xl: var(--bs-border-radius-xl);--mojo-spacer-xs: calc(var(--bs-spacer) * .25);--mojo-spacer-sm: calc(var(--bs-spacer) * .5);--mojo-spacer: var(--bs-spacer);--mojo-spacer-lg: calc(var(--bs-spacer) * 1.5);--mojo-spacer-xl: calc(var(--bs-spacer) * 3);--mojo-font-sans-serif: var(--bs-font-sans-serif);--mojo-font-monospace: var(--bs-font-monospace);--mojo-box-shadow-sm: var(--bs-box-shadow-sm);--mojo-box-shadow: var(--bs-box-shadow);--mojo-box-shadow-lg: var(--bs-box-shadow-lg);--mojo-zindex-dropdown: var(--bs-zindex-dropdown, 1000);--mojo-zindex-sticky: var(--bs-zindex-sticky, 1020);--mojo-zindex-fixed: var(--bs-zindex-fixed, 1030);--mojo-zindex-modal-backdrop: var(--bs-zindex-modal-backdrop, 1040);--mojo-zindex-offcanvas: var(--bs-zindex-offcanvas, 1045);--mojo-zindex-modal: var(--bs-zindex-modal, 1050);--mojo-zindex-popover: var(--bs-zindex-popover, 1070);--mojo-zindex-tooltip: var(--bs-zindex-tooltip, 1080)}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: var(--bs-primary);--bs-btn-border-color: var(--bs-primary);--bs-btn-hover-color: #fff;--bs-btn-hover-bg: color-mix(in srgb, var(--bs-primary) 88%, #000 12%);--bs-btn-hover-border-color: color-mix(in srgb, var(--bs-primary) 82%, #000 18%);--bs-btn-active-color: #fff;--bs-btn-active-bg: color-mix(in srgb, var(--bs-primary) 75%, #000 25%);--bs-btn-active-border-color: color-mix(in srgb, var(--bs-primary) 72%, #000 28%);--bs-btn-focus-shadow-rgb: var(--bs-primary-rgb, 13, 110, 253)}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: var(--bs-success);--bs-btn-border-color: var(--bs-success);--bs-btn-hover-color: #fff;--bs-btn-hover-bg: color-mix(in srgb, var(--bs-success) 88%, #000 12%);--bs-btn-hover-border-color: color-mix(in srgb, var(--bs-success) 82%, #000 18%);--bs-btn-active-color: #fff;--bs-btn-active-bg: color-mix(in srgb, var(--bs-success) 75%, #000 25%);--bs-btn-active-border-color: color-mix(in srgb, var(--bs-success) 72%, #000 28%);--bs-btn-focus-shadow-rgb: var(--bs-success-rgb, 25, 135, 84)}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: var(--bs-danger);--bs-btn-border-color: var(--bs-danger);--bs-btn-hover-color: #fff;--bs-btn-hover-bg: color-mix(in srgb, var(--bs-danger) 88%, #000 12%);--bs-btn-hover-border-color: color-mix(in srgb, var(--bs-danger) 82%, #000 18%);--bs-btn-active-color: #fff;--bs-btn-active-bg: color-mix(in srgb, var(--bs-danger) 75%, #000 25%);--bs-btn-active-border-color: color-mix(in srgb, var(--bs-danger) 72%, #000 28%);--bs-btn-focus-shadow-rgb: var(--bs-danger-rgb, 220, 53, 69)}.btn-warning{--bs-btn-color: #000;--bs-btn-bg: var(--bs-warning);--bs-btn-border-color: var(--bs-warning);--bs-btn-hover-color: #000;--bs-btn-hover-bg: color-mix(in srgb, var(--bs-warning) 88%, #000 12%);--bs-btn-hover-border-color: color-mix(in srgb, var(--bs-warning) 82%, #000 18%);--bs-btn-active-color: #000;--bs-btn-active-bg: color-mix(in srgb, var(--bs-warning) 75%, #000 25%);--bs-btn-active-border-color: color-mix(in srgb, var(--bs-warning) 72%, #000 28%);--bs-btn-focus-shadow-rgb: var(--bs-warning-rgb, 255, 193, 7)}.btn-info{--bs-btn-color: #000;--bs-btn-bg: var(--bs-info);--bs-btn-border-color: var(--bs-info);--bs-btn-hover-color: #000;--bs-btn-hover-bg: color-mix(in srgb, var(--bs-info) 88%, #000 12%);--bs-btn-hover-border-color: color-mix(in srgb, var(--bs-info) 82%, #000 18%);--bs-btn-active-color: #000;--bs-btn-active-bg: color-mix(in srgb, var(--bs-info) 75%, #000 25%);--bs-btn-active-border-color: color-mix(in srgb, var(--bs-info) 72%, #000 28%);--bs-btn-focus-shadow-rgb: var(--bs-info-rgb, 13, 202, 240)}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: var(--bs-secondary);--bs-btn-border-color: var(--bs-secondary);--bs-btn-hover-color: #fff;--bs-btn-hover-bg: color-mix(in srgb, var(--bs-secondary) 88%, #000 12%);--bs-btn-hover-border-color: color-mix(in srgb, var(--bs-secondary) 82%, #000 18%);--bs-btn-active-color: #fff;--bs-btn-active-bg: color-mix(in srgb, var(--bs-secondary) 75%, #000 25%);--bs-btn-active-border-color: color-mix(in srgb, var(--bs-secondary) 72%, #000 28%);--bs-btn-focus-shadow-rgb: var(--bs-secondary-rgb, 108, 117, 125)}.btn-outline-primary{--bs-btn-color: var(--bs-primary);--bs-btn-border-color: var(--bs-primary);--bs-btn-hover-color: #fff;--bs-btn-hover-bg: var(--bs-primary);--bs-btn-hover-border-color: var(--bs-primary);--bs-btn-active-color: #fff;--bs-btn-active-bg: color-mix(in srgb, var(--bs-primary) 75%, #000 25%);--bs-btn-active-border-color: color-mix(in srgb, var(--bs-primary) 75%, #000 25%);--bs-btn-focus-shadow-rgb: var(--bs-primary-rgb, 13, 110, 253)}.pagination{--bs-pagination-color: var(--bs-primary);--bs-pagination-hover-color: color-mix(in srgb, var(--bs-primary) 85%, #000 15%);--bs-pagination-focus-color: var(--bs-primary);--bs-pagination-focus-box-shadow: 0 0 0 .25rem color-mix(in srgb, var(--bs-primary) 25%, transparent);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: var(--bs-primary);--bs-pagination-active-border-color: var(--bs-primary);--bs-pagination-disabled-color: var(--bs-secondary, #6c757d)}.badge.bg-primary{--bs-badge-color: #fff;--bs-badge-bg: var(--bs-primary)}.nav-pills{--bs-nav-pills-link-active-bg: var(--bs-primary);--bs-nav-pills-link-active-color: #fff}.nav-tabs{--bs-nav-tabs-link-hover-border-color: color-mix(in srgb, var(--bs-primary) 35%, transparent);--bs-nav-tabs-link-active-color: var(--bs-primary);--bs-nav-tabs-link-active-border-color: var(--bs-primary)}.nav-tabs .nav-link{color:var(--bs-secondary)}.nav-tabs .nav-link.active{border-top-color:#1a73e8;border-right-color:#1a73e8;border-bottom-color:transparent;border-left-color:#1a73e8}.tab-view-select-style{display:inline-flex;align-items:center;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);background-color:var(--bs-body-bg);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border-top:1px solid var(--bs-border-color);border-right:1px solid var(--bs-border-color);border-left:1px solid var(--bs-border-color);border-top-left-radius:var(--bs-border-radius);border-top-right-radius:var(--bs-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}.tab-view-select-style:after{display:none}.tab-view-select-style:hover{border-color:var(--bs-secondary-border-subtle)}.tab-view-select-style:focus{border-color:var(--bs-primary);outline:0;box-shadow:0 0 0 .25rem rgba(var(--bs-primary-rgb),.25)}.tab-view-select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.alert-primary{--bs-alert-color: var( --bs-primary-text-emphasis, color-mix(in srgb, var(--bs-primary) 35%, #000) );--bs-alert-bg: var(--bs-primary-bg-subtle, color-mix(in srgb, var(--bs-primary) 10%, #fff));--bs-alert-border-color: var( --bs-primary-border-subtle, color-mix(in srgb, var(--bs-primary) 25%, #fff) )}:root{--bs-link-color: var(--bs-primary);--bs-link-hover-color: color-mix(in srgb, var(--bs-primary) 85%, #000 15%)}.form-check{margin-top:.9rem}@keyframes mojo-fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes mojo-slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.mojo-fade-in{animation:mojo-fadeIn var(--mojo-transition-slow) ease-in-out}.mojo-slide-up{animation:mojo-slideUp .4s ease-out}.mojo-spin{animation:mojo-spin 1s linear infinite;display:inline-block}.mojo-pulse{animation:mojo-pulse 2s ease-in-out infinite}.mojo-bounce{animation:mojo-bounce .5s ease-in-out}.bi-spin{animation:mojo-spin 1s linear infinite;display:inline-block}.mojo-text-truncate-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.mojo-text-truncate-3{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.mojo-transition-fast{transition:all var(--mojo-transition-fast)}.mojo-transition{transition:all var(--mojo-transition-base)}.mojo-transition-slow{transition:all var(--mojo-transition-slow)}.mojo-transform-center{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.mojo-transform-center-x{position:absolute;left:50%;transform:translate(-50%)}.mojo-transform-center-y{position:absolute;top:50%;transform:translateY(-50%)}.mojo-hover-lift:hover{transform:translateY(-2px);transition:transform var(--mojo-transition-fast)}.mojo-hover-shadow:hover{box-shadow:0 .5rem 1rem #00000026;transition:box-shadow var(--mojo-transition-fast)}.mojo-glass{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:#ffffff1a;border:1px solid rgba(255,255,255,.2)}[data-bs-theme=dark] .mojo-glass{background:#0003;border:1px solid rgba(255,255,255,.1)}.mojo-loading{pointer-events:none;opacity:.6;position:relative}.mojo-loading:after{content:"";position:absolute;top:50%;left:50%;width:1rem;height:1rem;margin:-.5rem 0 0 -.5rem;border:2px solid transparent;border-top:2px solid var(--mojo-primary);border-radius:50%;animation:mojo-spin 1s linear infinite;z-index:1}.mojo-focus-ring:focus{outline:none;box-shadow:var(--mojo-focus-shadow)}.mojo-focus-ring:focus-visible{outline:2px solid var(--mojo-focus-color);outline-offset:2px}.fs-7{font-size:.75rem!important}.fs-8{font-size:.6875rem!important}.fs-9{font-size:.625rem!important}.fs-10{font-size:.5625rem!important}@media print{.mojo-print-hide{display:none!important}.mojo-print-show{display:block!important}.mojo-no-print-shadow{box-shadow:none!important}.mojo-no-print-bg{background:#fff!important;color:#000!important}}.mojo-sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.mojo-skip-link{position:absolute;top:-40px;left:6px;background:var(--mojo-emphasis-color);color:var(--mojo-body-bg);padding:8px;text-decoration:none;z-index:var(--mojo-zindex-tooltip);border-radius:var(--mojo-border-radius)}.mojo-skip-link:focus{top:6px}@media (prefers-reduced-motion: reduce){.mojo-fade-in,.mojo-slide-up,.mojo-spin,.mojo-pulse,.mojo-bounce,.bi-spin,.mojo-loading:after{animation-duration:.01ms!important;animation-iteration-count:1!important}.mojo-transition-fast,.mojo-transition,.mojo-transition-slow,.mojo-hover-lift:hover,.mojo-hover-shadow:hover{transition:none!important}}@media (prefers-contrast: high){.mojo-glass{background:var(--mojo-body-bg);border:2px solid var(--mojo-border-color);-webkit-backdrop-filter:none;backdrop-filter:none}.mojo-focus-ring:focus,.mojo-focus-ring:focus-visible{outline:3px solid var(--mojo-focus-color);outline-offset:2px;box-shadow:0 0 0 .5rem rgba(var(--mojo-primary-rgb),.5)}}.mojo-app{min-height:100vh;font-family:var(--mojo-font-sans-serif);background-color:var(--mojo-body-bg);color:var(--mojo-body-color)}.mojo-app.mojo-loading{opacity:0}.mojo-app.mojo-ready{opacity:1;transition:opacity var(--mojo-transition-slow)}.mojo-component{position:relative}.mojo-component.mojo-disabled{pointer-events:none;opacity:.6}.mojo-debug *{outline:1px solid red!important}.mojo-debug *:hover{background:#ff00001a!important}.drag-over{border-color:var(--bs-primary)!important;background-color:var(--bs-primary-bg-subtle)!important;transition:all .2s ease}.drag-active{border-style:dashed!important;border-width:2px!important;box-shadow:0 0 0 .25rem rgba(var(--bs-primary-rgb),.25)!important}.drag-over.drag-active{transform:scale(1.02);box-shadow:0 0 0 .25rem rgba(var(--bs-primary-rgb),.25),0 .5rem 1rem #00000026!important}[data-bs-theme=dark] .drag-over{background-color:rgba(var(--bs-primary-rgb),.15)!important}@media (prefers-reduced-motion: reduce){.drag-over,.drag-active{transition:none!important;transform:none!important}}@media (min-width: 1px){.mojo-debug{display:none}}.mojo-debug-enabled .mojo-debug{display:block!important}.image-field-container{position:relative;display:inline-block;border-radius:.375rem;overflow:hidden}.image-drop-zone{position:relative;border-radius:.375rem;transition:all .2s ease;overflow:hidden}.image-drop-zone.droppable{border:2px dashed var(--bs-border-color)}.image-drop-zone.droppable:hover{border-color:var(--bs-primary);background-color:var(--bs-primary-bg-subtle)}.image-drop-zone.drag-over{border-color:var(--bs-primary)!important;background-color:var(--bs-primary-bg-subtle)!important;transform:scale(1.02)}.image-drop-zone.drag-active{border-color:var(--bs-success)!important;background-color:var(--bs-success-bg-subtle)!important;box-shadow:0 0 0 3px rgba(var(--bs-success-rgb),.25)}.image-field-xs{width:48px;height:48px}.image-field-sm{width:96px;height:96px}.image-field-md{width:150px;height:150px}.image-field-lg{width:200px;height:200px}.image-field-xl{width:300px;height:300px}.image-field-container img{transition:transform .2s ease}.image-field-container:hover img{transform:scale(1.05)}.image-field-container .btn{transition:opacity .2s ease}.image-field-container:not(:hover) .btn{opacity:.6}[data-bs-theme=dark] .image-drop-zone.droppable{border-color:var(--bs-border-color-translucent)}[data-bs-theme=dark] .image-drop-zone.droppable:hover{border-color:var(--bs-primary);background-color:rgba(var(--bs-primary-rgb),.1)}@media (max-width: 576px){.image-field-xl{width:250px;height:250px}.image-field-lg{width:180px;height:180px}}.image-drop-zone:focus{outline:2px solid var(--bs-primary);outline-offset:2px}@media (prefers-reduced-motion: reduce){.image-drop-zone,.image-field-container img,.image-field-container .btn{transition:none}.image-drop-zone.drag-over,.image-field-container:hover img{transform:none}}.mojo-form-group{margin-bottom:1rem}.mojo-form-group .h6{color:var(--bs-secondary);font-weight:600;margin-bottom:.75rem;padding-bottom:.25rem;border-bottom:1px solid var(--bs-border-color)}@media (max-width: 767.98px){.mojo-form-group{padding:.75rem;margin-bottom:.75rem}}.mojo-form-control{margin-bottom:1rem}.mojo-form-control .form-label{font-weight:500;margin-bottom:.5rem;color:var(--bs-body-color)}.mojo-form-control .form-text{margin-top:.25rem;font-size:.875rem;color:var(--bs-secondary)}.mojo-form-control .invalid-feedback{margin-top:.25rem}.mojo-form-control .form-check{margin-bottom:0}.mojo-form-control .form-check .form-check-label{font-weight:400}.mojo-form-control .image-field-container{margin-top:.5rem}.mojo-form-control input[type=range]{margin-top:.5rem;margin-bottom:.5rem}@media (max-width: 767.98px){.mojo-form-control{margin-bottom:.75rem}.mojo-form-control .form-label{margin-bottom:.375rem}}.mojo-modal-context-menu-btn{color:inherit!important;border:none;background:transparent;opacity:.7;transition:opacity .15s ease-in-out}.mojo-modal-context-menu-btn:hover,.mojo-modal-context-menu-btn:focus{color:inherit!important;background:rgba(var(--bs-emphasis-color-rgb),.1);opacity:1}.mojo-modal-context-menu-btn:active{background:rgba(var(--bs-emphasis-color-rgb),.2)}.modal.modal-info .mojo-modal-context-menu-btn,.modal.modal-success .mojo-modal-context-menu-btn{color:#fff!important}.modal.modal-warning .mojo-modal-context-menu-btn{color:#000!important}.modal.modal-error .mojo-modal-context-menu-btn,.modal.modal-dark .mojo-modal-context-menu-btn,[data-bs-theme=dark] .mojo-modal-context-menu-btn{color:#fff!important}.modal-header .mojo-modal-context-menu-btn{margin-left:auto;margin-right:0}:root{--mojo-sidebar-width: 250px;--mojo-sidebar-collapsed-width: 40px;--mojo-portal-gap: 0;--mojo-portal-bg: var(--bs-body-bg);--mojo-topnav-bg: var(--bs-primary, #121620);--mojo-topnav-color: var(#fff);--mojo-portal-muted: var(--bs-secondary-color);--mojo-portal-border: var(--bs-border-color);--mojo-portal-text: var(--bs-body-color);--mojo-sidebar-dark-color: #fff;--mojo-sidebar-dark-color-hover: #5388d6;--mojo-sidebar-dark-bg: #343a40}.portal-layout{display:flex;min-height:100vh;height:100vh;background:var(--mojo-portal-bg)}#portal-sidebar{flex:0 0 var(--mojo-sidebar-width);max-width:var(--mojo-sidebar-width);inline-size:var(--mojo-sidebar-width);height:100%;overflow-y:hidden;z-index:1;transition:inline-size .3s cubic-bezier(.4,0,.2,1),max-width .3s cubic-bezier(.4,0,.2,1),flex-basis .3s cubic-bezier(.4,0,.2,1),margin-left .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);will-change:inline-size,max-width,flex-basis,transform}.portal-container.collapse-sidebar #portal-sidebar{inline-size:var(--mojo-sidebar-collapsed-width);max-width:var(--mojo-sidebar-collapsed-width);flex-basis:var(--mojo-sidebar-collapsed-width)}.portal-container.hide-sidebar #portal-sidebar{margin-left:calc(-1 * var(--mojo-sidebar-width));border-inline-end:0}.portal-body{flex:1 1 auto;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden}#portal-topnav{flex:0 0 auto;background:var(--mojo-topnav-bg);color:var(--mojo-topnav-color);border-block-end:1px solid var(--mojo-portal-border)}.portal-content{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:16px;height:100%}.portal-content .muted{color:var(--mojo-portal-muted)}@media (prefers-reduced-motion: reduce){#portal-sidebar{transition:none}}.sidebar{display:flex;flex-direction:column;height:100%;width:100%;min-height:0;transition:all .3s cubic-bezier(.4,0,.2,1)}#portal-sidebar .sidebar{position:static;top:auto;left:auto;height:100%;width:100%;z-index:auto;transform:none}.sidebar-dark{background-color:var(--mojo-sidebar-dark-bg, --bs-dark);color:var(--bs-light);border-inline-end:1px solid var(--bs-border-color-translucent)}.sidebar-light{background-color:var(--bs-light);color:var(--bs-body-color);border-right:1px solid var(--bs-border-color)}.sidebar-clean{background-color:var(--bs-body-bg);color:var(--bs-body-color);border-right:1px solid var(--bs-border-color);box-shadow:var(--bs-box-shadow)}.sidebar-container{display:flex;flex-direction:column;height:100%;min-height:0;flex:1}.sidebar-body{flex:1;overflow-y:auto;min-height:0}.sidebar-brand{height:56px;text-align:center;padding-top:14px}.sidebar-dark .sidebar-brand{border-bottom:1px solid var(--bs-border-color-translucent)}.sidebar-light .sidebar-brand{border-bottom:1px solid var(--bs-border-color)}.sidebar-clean .sidebar-brand{border-bottom:1px solid var(--bs-border-color);background-color:var(--bs-secondary-bg)}.sidebar-brand.clickable{cursor:pointer;transition:background-color .2s ease}.sidebar-brand.clickable:hover{background-color:#ffffff1a}.sidebar-toggle{position:absolute;width:30px;height:30px;font-size:.875rem;background:none;top:.75rem;right:5px;border:none;border-radius:var(--bs-border-radius);color:var(--bs-body-color);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1),transform .15s ease-out;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10}.sidebar-toggle:hover{background:var(--bs-secondary-bg);transform:scale(1.1);box-shadow:0 4px 12px #00000026}.sidebar-toggle:active{transform:scale(.95);transition-duration:.1s}.sidebar-toggle .toggle-icon{transition:all .3s cubic-bezier(.4,0,.2,1)}.sidebar-toggle .bi-chevron-left{display:block}.sidebar-toggle .bi-chevron-right,.portal-container.collapse-sidebar .sidebar-toggle .bi-chevron-left{display:none}.portal-container.collapse-sidebar .sidebar-toggle .bi-chevron-right{display:block}.portal-container.hide-sidebar .sidebar-toggle{opacity:0;visibility:hidden;pointer-events:none}.sidebar-dark .sidebar-toggle{background:var(--bs-border-color-translucent);color:var(--bs-secondary-color);border-color:var(--bs-border-color-translucent)}.sidebar-dark .sidebar-toggle:hover{background:var(--bs-secondary-bg);color:var(--bs-light)}.sidebar-light .sidebar-toggle{background:var(--bs-secondary-bg);color:var(--bs-body-color);border-color:var(--bs-border-color)}.sidebar-light .sidebar-toggle:hover{background:var(--bs-tertiary-bg);color:var(--bs-emphasis-color)}.sidebar-clean .sidebar-toggle{background:var(--bs-light);color:var(--bs-primary);border-color:var(--bs-primary-border-subtle);box-shadow:var(--bs-box-shadow-sm)}.sidebar-clean .sidebar-toggle:hover{background:var(--bs-primary);color:#fff;box-shadow:0 4px 12px rgba(var(--bs-primary-rgb),.3)}.sidebar-toggle .toggle-icon{transform:rotate(0)}.topnav-sidebar-toggle{background:none!important;border:none!important;color:#ffffffe6;padding:.5rem;border-radius:.375rem;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.topnav-sidebar-toggle:hover{background:none!important;color:var(--bs-light);transform:scale(1.1)}.topnav-sidebar-toggle:focus{outline:none;box-shadow:none}.topnav-sidebar-toggle .toggle-chevron{font-size:1.1rem;transition:transform .3s cubic-bezier(.4,0,.2,1);transform:rotate(180deg)}.portal-container.collapse-sidebar .topnav-sidebar-toggle .toggle-chevron,.portal-container.hide-sidebar .topnav-sidebar-toggle .toggle-chevron{transform:rotate(0)}.navbar-dark .topnav-sidebar-toggle{color:#ccc}.navbar-dark .topnav-sidebar-toggle:hover{color:#fff;background:none!important}.navbar-light .topnav-sidebar-toggle{color:var(--bs-navbar-light-color)}.navbar-light .topnav-sidebar-toggle:hover{color:var(--bs-navbar-light-hover-color);background:var(--bs-secondary-bg)!important}@keyframes sidebar-toggle-pulse{0%{box-shadow:0 0 rgba(var(--bs-primary-rgb),.4)}70%{box-shadow:0 0 0 8px rgba(var(--bs-primary-rgb),0)}to{box-shadow:0 0 rgba(var(--bs-primary-rgb),0)}}.sidebar-toggle.pulse{animation:sidebar-toggle-pulse 2s infinite}.sidebar-toggle:focus{outline:none;box-shadow:0 0 0 .25rem rgba(var(--bs-primary-rgb),.25)}.sidebar-toggle:focus-visible{outline:2px solid var(--bs-primary);outline-offset:2px}[data-bs-theme=dark] .sidebar-toggle{background:#ffffff1a;color:var(--bs-light);border-color:#ffffff26}[data-bs-theme=dark] .sidebar-toggle:hover{background:#fff3;color:var(--bs-white);box-shadow:0 4px 12px #ffffff1a}[data-bs-theme=dark] .sidebar-clean .sidebar-toggle{background:var(--bs-primary);color:#fff;border-color:var(--bs-primary)}[data-bs-theme=dark] .sidebar-clean .sidebar-toggle:hover{background:var(--bs-primary);filter:brightness(1.1)}.brand-content{display:flex;flex-direction:column;align-items:center}.brand-logo{max-height:32px;width:auto;margin-bottom:.5rem}.brand-subtext{font-size:.75rem}.sidebar-group-header{cursor:pointer;border-bottom:1px solid rgba(0,0,0,.1)}.sidebar-group-header:hover{cursor:pointer;color:var(--mojo-primary);background-color:#1414641a}.sidebar-nav{display:flex;flex-direction:column;padding:.5rem 0;min-height:100%}.sidebar-nav .nav-link{display:flex;align-items:center;position:relative;padding:.75rem 1rem;text-decoration:none;border-radius:0;transition:all .3s cubic-bezier(.4,0,.2,1),transform .15s ease-out;cursor:pointer;transform:translate(0)}.sidebar-nav .nav-link:hover{margin-left:.4rem!important}.sidebar-nav .nav-link i{width:20px;text-align:center;transition:transform .2s ease-out,color .2s ease-out}.sidebar-nav .nav-link:hover i{transform:scale(1.1)}.portal-container.collapse-sidebar .sidebar-nav .nav-link:hover i{transform:scale(1.2)}.sidebar-nav .collapse .nav-link{padding:.5rem 1rem;font-size:.9rem}.sidebar-nav .bi-chevron-down{transition:transform .3s}.sidebar-nav .nav-link[aria-expanded=true] .bi-chevron-down{transform:rotate(180deg)}.sidebar-dark .sidebar-nav .nav-link{color:var(--mojo-sidebar-dark-color, #fff)}.sidebar-dark .sidebar-nav .nav-link:hover{color:var(--mojo-sidebar-dark-color-hover, #5388d6);background-color:var(--bs-secondary-bg)}.sidebar-dark .sidebar-nav .nav-link.active{color:var(--bs-light);background-color:var(--bs-primary)}.sidebar-light .sidebar-nav .nav-link{color:var(--bs-body-color);border-top-left-radius:8px;border-bottom-left-radius:8px;margin-left:.2rem}.sidebar-light .sidebar-nav .nav-link:hover{color:var(--bs-emphasis-color);background-color:var(--bs-secondary-bg)}.sidebar-light .sidebar-nav .nav-link.active{color:var(--bs-light);background-color:var(--bs-primary)}.sidebar-light .nav-link.has-children{border-top-left-radius:0;border-bottom-left-radius:0}.sidebar-nav .nav-link.has-children:hover{transform:none}.sidebar-light .nav-link.has-children.collapsed{border-left:none}.sidebar-light .nav-link.active.has-children{color:var(--bs-body-color);background-color:var(--bs-secondary-bg);animation:none}.sidebar-clean .sidebar-nav .nav-link{color:var(--bs-secondary-color);margin:.125rem .5rem;border-radius:var(--bs-border-radius)}.sidebar-clean .sidebar-nav .nav-link:hover{color:var(--bs-body-color);background-color:var(--bs-secondary-bg)}.sidebar-clean .sidebar-nav .nav-link.active{color:var(--bs-primary);background-color:var(--bs-primary-bg-subtle);font-weight:500}.nav-text{flex:1;white-space:nowrap;transition:opacity .3s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1),margin .3s cubic-bezier(.4,0,.2,1)}.nav-arrow{transition:transform .2s ease,opacity .3s cubic-bezier(.4,0,.2,1),margin .3s cubic-bezier(.4,0,.2,1);margin-left:auto}.nav-link[aria-expanded=true] .nav-arrow{transform:rotate(180deg)}.portal-container.collapse-sidebar .nav-text,.portal-container.collapse-sidebar .sidebar-collapse-hide{opacity:0;width:0;margin-right:0;overflow:hidden}.portal-container.collapse-sidebar .nav-arrow{opacity:0;margin-left:0}.portal-container.collapse-sidebar .sidebar-nav .nav-link{justify-content:center;padding-left:.5rem;padding-right:.5rem;transition:all .3s cubic-bezier(.4,0,.2,1)}.portal-container.collapse-sidebar .sidebar-nav .nav-link i{margin-right:0!important}.portal-container.collapse-sidebar .nav-submenu{display:none!important}.portal-container.collapse-sidebar .sidebar-header{text-align:center;overflow:hidden}.portal-container.collapse-sidebar .sidebar-header .fs-5{opacity:0;transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transform:scale(.8) translateY(-5px)}.portal-container.collapse-sidebar .sidebar-footer{opacity:0;transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transform:scale(.8) translateY(5px)}.portal-container.collapse-sidebar .sidebar .nav-link{position:relative;overflow:visible;width:var(--mojo-sidebar-collapsed-width, 48px)}@keyframes tooltip-slide-in{0%{opacity:0;visibility:hidden;transform:translateY(-50%) translate(-10px) scale(.9)}to{opacity:1;visibility:visible;transform:translateY(-50%) translate(0) scale(1)}}@keyframes tooltip-arrow-slide-in{0%{opacity:0;transform:translateY(-50%) translate(-3px)}to{opacity:1;transform:translateY(-50%) translate(0)}}[data-bs-theme=dark] .portal-container.collapse-sidebar .sidebar .nav-link:hover:after{background:var(--bs-light);color:var(--bs-dark)}[data-bs-theme=dark] .portal-container.collapse-sidebar .sidebar .nav-link:hover:before{border-right-color:var(--bs-light)}.portal-container.mobile-layout .nav-link:hover:after,.portal-container.mobile-layout .nav-link:hover:before{display:none!important}.portal-container.collapse-sidebar .sidebar .nav-link:hover{background-color:rgba(var(--bs-primary-rgb),.1);border-radius:var(--mojo-border-radius);transform:translate(0) scale(1.05);box-shadow:0 2px 8px #0000001a}.portal-container.collapse-sidebar .sidebar-light .nav-link:hover{background-color:rgba(var(--bs-primary-rgb),.08);box-shadow:0 2px 8px rgba(var(--bs-primary-rgb),.2)}.portal-container.collapse-sidebar .sidebar-dark .nav-link:hover{background-color:#ffffff1a;box-shadow:0 2px 8px #ffffff1a}.portal-container.collapse-sidebar .sidebar-clean .nav-link:hover{background-color:var(--bs-light);box-shadow:0 2px 8px rgba(var(--bs-primary-rgb),.15)}.nav-submenu .nav-link{padding-left:2.5rem;font-size:.9rem}.sidebar-dark .nav-submenu{background-color:#0003}.sidebar-light .nav-submenu{margin-left:1.8rem;border-left:4px solid #cdcdcd}.sidebar-clean .nav-submenu{background-color:transparent}.sidebar-clean .nav-submenu .nav-link{margin-left:1rem;margin-right:.5rem}.nav-divider{margin:.75rem 0;padding:0 1rem}.nav-divider-label{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;padding:.25rem 0;display:block}.sidebar-dark .nav-divider-label{color:var(--bs-secondary-color);border-bottom:1px solid var(--bs-border-color-translucent)}.sidebar-light .nav-divider-label{color:var(--bs-secondary-color);border-bottom:1px solid var(--bs-border-color)}.sidebar-clean .nav-divider-label{color:var(--bs-secondary-color);border-bottom:1px solid var(--bs-border-color);margin:0 .5rem}.nav-divider-item{margin:.25rem 0;padding:0;list-style:none}.nav-divider-line{margin:0 1rem;border:0;border-top:1px solid;opacity:.25}.sidebar-dark .nav-divider-line,.sidebar-light .nav-divider-line{border-color:var(--bs-secondary-color)}.sidebar-clean .nav-divider-line{border-color:var(--bs-border-color);margin:0 1.5rem}.nav-spacer-item{flex:1;list-style:none}.nav-section{margin-bottom:.5rem}.nav-section-header{padding:.5rem 1rem;font-size:.8rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.nav-section-header.collapsible{cursor:pointer;display:flex;align-items:center;justify-content:space-between;transition:color .2s ease}.sidebar-dark .nav-section-header{color:var(--bs-secondary-color)}.sidebar-dark .nav-section-header.collapsible:hover{color:var(--bs-light)}.sidebar-light .nav-section-header{color:var(--bs-secondary-color)}.sidebar-light .nav-section-header.collapsible:hover{color:var(--bs-body-color)}.sidebar-clean .nav-section-header{color:var(--bs-secondary-color);margin:0 .5rem}.sidebar-clean .nav-section-header.collapsible:hover{color:var(--bs-body-color)}.nav-section-items{padding-left:0}.sidebar-nav .badge{font-size:.7rem;padding:.25rem .5rem}.sidebar-footer{flex-shrink:0;margin-top:auto}.footer-content{padding:1rem;font-size:.85rem}.sidebar-dark .sidebar-footer{border-top:1px solid var(--bs-border-color-translucent)}.sidebar-dark .footer-content{color:var(--bs-secondary-color)}.sidebar-light .sidebar-footer{border-top:1px solid var(--bs-border-color)}.sidebar-light .footer-content{color:var(--bs-secondary-color)}.sidebar-clean .sidebar-footer{border-top:1px solid var(--bs-border-color);background-color:var(--bs-secondary-bg)}.sidebar-clean .footer-content{color:var(--bs-secondary-color)}.config-switcher{position:absolute;top:8px;right:8px}.config-menu{position:absolute;inset:0;background-color:rgba(var(--bs-dark-rgb),.95);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1050;padding:1rem}.config-menu-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding-bottom:.5rem;border-bottom:1px solid var(--bs-border-color-translucent)}.config-menu-body{display:flex;flex-direction:column;gap:.5rem}.config-option{padding:.75rem;border:1px solid var(--bs-border-color-translucent);border-radius:var(--bs-border-radius);background-color:var(--bs-secondary-bg);cursor:pointer;transition:all .2s ease}.config-option:hover{background-color:var(--bs-tertiary-bg);border-color:var(--bs-border-color)}.config-option.active{background-color:var(--bs-primary-bg-subtle);border-color:var(--bs-primary)}.config-name{font-weight:500;color:var(--bs-body-color)}.group-selector-container{padding:.75rem}.group-selector-wrapper{position:relative;width:100%}.group-selector{position:relative}.group-selector.disabled{opacity:.6;pointer-events:none}.group-selector .input-group-text{background-color:var(--bs-secondary-bg);border-color:var(--bs-border-color);color:var(--bs-secondary-color)}.group-selector .form-control{background-color:var(--bs-tertiary-bg);border-color:var(--bs-border-color);color:var(--bs-body-color)}.group-selector .form-control:focus{background-color:var(--bs-tertiary-bg);border-color:var(--bs-primary);color:var(--bs-body-color);box-shadow:0 0 0 .2rem rgba(var(--bs-primary-rgb),.25)}.group-selector .form-control::placeholder{color:var(--bs-secondary-color)}.group-selector .dropdown-toggle{background-color:var(--bs-secondary-bg);border-color:var(--bs-border-color);color:var(--bs-secondary-color)}.group-selector .dropdown-toggle:hover,.group-selector .dropdown-toggle:focus{background-color:var(--bs-tertiary-bg);border-color:var(--bs-border-color);color:var(--bs-body-color)}.dropdown-arrow{transition:transform .2s ease}.group-selector .dropdown-toggle[aria-expanded=true] .dropdown-arrow{transform:rotate(180deg)}.group-dropdown{position:absolute;top:100%;left:0;right:0;background-color:var(--bs-body-bg);border:1px solid var(--bs-border-color);border-top:none;border-radius:0 0 var(--bs-border-radius) var(--bs-border-radius);max-height:400px;overflow-y:auto;z-index:1050;box-shadow:var(--bs-box-shadow-lg);opacity:0;transform:translateY(-10px);transition:opacity .2s ease,transform .2s ease;display:none}.group-dropdown.show{display:block;opacity:1;transform:translateY(0)}.group-dropdown .dropdown-header{padding:.75rem 1rem;background-color:var(--bs-secondary-bg);border-bottom:1px solid var(--bs-border-color);color:var(--bs-secondary-color);font-size:.875rem}.group-results{max-height:300px;overflow-y:auto}.group-item{padding:0;border-bottom:1px solid var(--bs-border-color-translucent);cursor:pointer;transition:background-color .2s ease}.group-item:hover,.group-item.focused{background-color:var(--bs-secondary-bg)}.group-item.selected{background-color:var(--bs-primary-bg-subtle);border-left:3px solid var(--bs-primary)}.group-item.selected:hover{background-color:var(--bs-primary-bg-subtle)}.group-content{padding:.75rem 1rem;display:flex;justify-content:space-between;align-items:flex-start;gap:1rem}.group-main{flex:1;min-width:0}.group-meta{display:flex;flex-direction:column;align-items:flex-end;gap:.25rem}.group-name{display:flex;align-items:center;flex-wrap:wrap;gap:.25rem;margin-bottom:.25rem}.group-hierarchy{color:var(--bs-secondary-color);font-size:.85rem;font-weight:400}.group-name-text{color:var(--bs-body-color);font-weight:500}.group-type{font-size:.7rem;padding:.25rem .5rem}.group-description{color:var(--bs-secondary-color);font-size:.85rem;line-height:1.3;margin-top:.25rem}.group-item mark{background-color:var(--bs-warning-bg-subtle);color:var(--bs-body-color);padding:0;border-radius:var(--bs-border-radius-sm)}.group-member-count{display:flex;align-items:center;color:var(--bs-secondary-color);font-size:.8rem}.group-status{display:flex;align-items:center}.status-indicator{width:8px;height:8px;border-radius:50%;display:inline-block}.status-indicator.status-active{background-color:var(--bs-success)}.status-indicator.status-inactive{background-color:var(--bs-secondary)}.status-indicator.status-archived{background-color:var(--bs-danger)}.status-indicator.status-pending{background-color:var(--bs-warning)}.group-dropdown .dropdown-item-text{color:var(--bs-secondary-color);padding:1rem}.group-dropdown .dropdown-divider{border-top:1px solid var(--bs-border-color);margin:.5rem 0}.selected-group-display{animation:fadeInUp .3s ease}.selected-group-card{background-color:var(--bs-primary-bg-subtle);border:1px solid var(--bs-primary-border-subtle);border-radius:var(--bs-border-radius);padding:.75rem}.selected-group-icon{flex-shrink:0}.selected-group-info{min-width:0}.selected-group-name{color:var(--bs-body-color);margin-bottom:.25rem}.selected-group-desc{color:var(--bs-secondary-color);line-height:1.3}.selected-group-actions{flex-shrink:0}.group-dropdown::-webkit-scrollbar,.group-results::-webkit-scrollbar{width:6px}.group-dropdown::-webkit-scrollbar-track,.group-results::-webkit-scrollbar-track{background:var(--bs-secondary-bg)}.group-dropdown::-webkit-scrollbar-thumb,.group-results::-webkit-scrollbar-thumb{background:var(--bs-border-color);border-radius:var(--bs-border-radius-sm)}.group-dropdown::-webkit-scrollbar-thumb:hover,.group-results::-webkit-scrollbar-thumb:hover{background:var(--bs-secondary-color)}.context-menu-view.header-menu{margin-top:-.6rem}.context-menu-view.header-menu-absolute{top:1rem;right:1rem}.portal-container.mobile-layout #portal-sidebar{position:fixed!important;inset:0;width:100vw;height:100vh;z-index:var(--mojo-zindex-modal);transform:translate(0);transition:transform .35s cubic-bezier(.4,0,.2,1);box-shadow:0 0 20px #0000004d}.portal-container.mobile-layout #portal-sidebar .sidebar{height:100vh;width:100%}.portal-container.mobile-layout #portal-sidebar .sidebar-container{height:100%}.portal-container.mobile-layout.hide-sidebar #portal-sidebar{transform:translate(-100%);box-shadow:0 0 20px #0000}.portal-container.mobile-layout #portal-sidebar,.portal-container.mobile-layout.collapse-sidebar #portal-sidebar{inline-size:100vw!important;max-width:100vw!important;flex-basis:100vw!important}.portal-container.mobile-layout .nav-text,.portal-container.mobile-layout.collapse-sidebar .nav-text{opacity:1!important;width:auto!important;overflow:visible!important}.portal-container.mobile-layout .nav-arrow,.portal-container.mobile-layout.collapse-sidebar .nav-arrow{opacity:1!important}.portal-container.mobile-layout .sidebar-nav .nav-link,.portal-container.mobile-layout.collapse-sidebar .sidebar-nav .nav-link{justify-content:flex-start!important;padding:1rem!important;font-size:1rem}.portal-container.mobile-layout .nav-submenu,.portal-container.mobile-layout.collapse-sidebar .nav-submenu{display:block!important}.portal-container.mobile-layout .sidebar-toggle{display:none}.portal-container.mobile-layout .group-selector-container,.portal-container.mobile-layout .config-menu{padding:.5rem}.portal-container.mobile-layout .selected-group-card{padding:1rem}.portal-container.mobile-layout .group-dropdown{max-height:300px;left:-5px;right:-5px;border-radius:.5rem;border:1px solid #495057;box-shadow:0 1rem 3rem #0000004d}.portal-container.mobile-layout .group-content{padding:1rem .75rem;flex-direction:column;align-items:stretch;gap:.5rem}.portal-container.mobile-layout .group-meta{flex-direction:row;justify-content:space-between;align-items:center}.portal-sidebar-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#00000080;z-index:calc(var(--mojo-zindex-modal) - 1);opacity:0;visibility:hidden;transition:opacity .35s cubic-bezier(.4,0,.2,1),visibility .35s cubic-bezier(.4,0,.2,1),backdrop-filter .35s cubic-bezier(.4,0,.2,1);-webkit-backdrop-filter:blur(0px);backdrop-filter:blur(0px)}.portal-container.mobile-layout:not(.hide-sidebar) .portal-sidebar-backdrop{opacity:1;visibility:visible;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.portal-container #portal-sidebar,.sidebar-nav .nav-link,.nav-text,.nav-arrow,.sidebar-header,.sidebar-footer,.sidebar-header .fs-5{transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.sidebar-nav .nav-item:nth-child(1) .nav-link{transition-delay:0ms}.sidebar-nav .nav-item:nth-child(2) .nav-link{transition-delay:20ms}.sidebar-nav .nav-item:nth-child(3) .nav-link{transition-delay:40ms}.sidebar-nav .nav-item:nth-child(4) .nav-link{transition-delay:60ms}.sidebar-nav .nav-item:nth-child(5) .nav-link{transition-delay:80ms}.sidebar-nav .nav-item:nth-child(6) .nav-link{transition-delay:.1s}.sidebar-nav .nav-item:nth-child(7) .nav-link{transition-delay:.12s}.sidebar-nav .nav-item:nth-child(8) .nav-link{transition-delay:.14s}[data-bs-theme=dark] .group-dropdown{background-color:var(--bs-body-bg);border-color:var(--bs-border-color)}[data-bs-theme=dark] .config-menu{background-color:rgba(var(--bs-dark-rgb),.95)}[data-bs-theme=dark] .config-option{background-color:var(--bs-secondary-bg);border-color:var(--bs-border-color)}[data-bs-theme=dark] .group-selector .form-control{background-color:var(--bs-tertiary-bg);border-color:var(--bs-border-color);color:var(--bs-body-color)}[data-bs-theme=dark] .group-selector .input-group-text{background-color:var(--bs-secondary-bg);border-color:var(--bs-border-color);color:var(--bs-secondary-color)}[data-bs-theme=dark] .group-item:hover,[data-bs-theme=dark] .group-item.focused{background-color:var(--bs-secondary-bg)}[data-bs-theme=dark] .selected-group-card{background-color:var(--bs-primary-bg-subtle);border-color:var(--bs-primary-border-subtle)}@keyframes fadeInUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.group-item:focus{outline:2px solid #0d6efd;outline-offset:-2px}@media (prefers-contrast: high){.group-dropdown{border-width:2px;border-color:#fff}.group-item.selected{border-left-width:4px}.status-indicator{border:1px solid #fff}}@media (prefers-reduced-motion: reduce){.group-dropdown,.dropdown-arrow{transition:none}.selected-group-display{animation:none}.portal-container #portal-sidebar,.sidebar-nav .nav-link,.nav-text,.nav-arrow,.sidebar-header,.sidebar-footer,.sidebar-header .fs-5{transition:none!important;animation:none!important}.sidebar-nav .nav-link i{transition:none!important}.sidebar-nav .nav-link:hover,.portal-container.collapse-sidebar .sidebar .nav-link:hover{transform:none!important;box-shadow:none!important}.portal-sidebar-backdrop{transition:none!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important}.sidebar-nav .nav-item:nth-child(n) .nav-link{transition-delay:0ms!important}.portal-container:not(.collapse-sidebar) #portal-sidebar{animation:none!important}.sidebar-nav .nav-link.active{animation:none!important}.nav-link[data-bs-toggle=collapse] .bi-chevron-down{transition:none!important}.nav-link[aria-expanded=true] .bi-chevron-down{transform:rotate(180deg)!important}.portal-container.collapse-sidebar .sidebar .nav-link:hover:after,[data-bs-theme=dark] .portal-container.collapse-sidebar .sidebar .nav-link:hover:after,.portal-container.collapse-sidebar .sidebar .nav-link:hover:before{animation:none!important;transition:none!important;opacity:1!important;visibility:visible!important;transform:translateY(-50%) translate(0)!important}.sidebar-toggle,.sidebar-toggle .toggle-icon{transition:none!important;animation:none!important}.sidebar-toggle:hover{transform:none!important}}.mojo-sidebar-force-open .portal-container{--mojo-sidebar-width: 250px !important}.mojo-sidebar-force-open #portal-sidebar{inline-size:var(--mojo-sidebar-width)!important;max-width:var(--mojo-sidebar-width)!important;flex-basis:var(--mojo-sidebar-width)!important}.mojo-sidebar-force-collapsed .portal-container{--mojo-sidebar-width: var(--mojo-sidebar-collapsed-width) !important}.mojo-sidebar-force-collapsed #portal-sidebar{inline-size:var(--mojo-sidebar-collapsed-width)!important;max-width:var(--mojo-sidebar-collapsed-width)!important;flex-basis:var(--mojo-sidebar-collapsed-width)!important}.mojo-sidebar-force-hidden #portal-sidebar{inline-size:0!important;max-width:0!important;flex-basis:0!important;overflow:hidden!important}.mojo-sidebar-no-transition #portal-sidebar,.mojo-sidebar-no-transition .sidebar-nav .nav-link,.mojo-sidebar-no-transition .nav-text,.mojo-sidebar-no-transition .nav-arrow{transition:none!important}.portal-container.sidebar-opening #portal-sidebar{transition-duration:.35s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.portal-container.sidebar-closing #portal-sidebar{transition-duration:.25s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.portal-container:not(.collapse-sidebar) #portal-sidebar{animation:sidebar-expand .4s cubic-bezier(.34,1.56,.64,1)}@keyframes sidebar-expand{0%{transform:scale(.98) translate(-2px);opacity:.9}60%{transform:scale(1.01) translate(1px)}to{transform:scale(1) translate(0);opacity:1}}@keyframes nav-pulse{0%{box-shadow:0 0 rgba(var(--bs-primary-rgb),.4)}70%{box-shadow:0 0 0 6px rgba(var(--bs-primary-rgb),0)}to{box-shadow:0 0 rgba(var(--bs-primary-rgb),0)}}.sidebar-nav .nav-link.active{animation:nav-pulse 2s infinite}.nav-link[data-bs-toggle=collapse] .bi-chevron-down{transition:transform .25s cubic-bezier(.4,0,.2,1)}.nav-link[aria-expanded=true] .bi-chevron-down{transform:rotate(180deg) scale(1.1)}.mojo-sidebar-theme-auto .sidebar{background-color:var(--bs-body-bg);color:var(--bs-body-color);border-right:1px solid var(--bs-border-color)}.mojo-sidebar-theme-auto .sidebar-nav .nav-link{color:var(--bs-body-color)}.mojo-sidebar-theme-auto .sidebar-nav .nav-link:hover{background-color:var(--bs-secondary-bg)}.mojo-sidebar-theme-auto .sidebar-nav .nav-link.active{background-color:var(--bs-primary);color:var(--bs-white)}.mojo-sidebar-collapsed .nav-text,.mojo-sidebar-collapsed .nav-arrow{opacity:0;width:0;overflow:hidden}.mojo-sidebar-collapsed .sidebar-nav .nav-link{justify-content:center;padding-left:.5rem;padding-right:.5rem}.mojo-sidebar-collapsed .nav-submenu{display:none!important}.mojo-portal-fixed .portal-layout{position:fixed;inset:0;z-index:var(--mojo-zindex-fixed)}.mojo-portal-sticky-sidebar #portal-sidebar{position:sticky;top:0;height:100vh}.mojo-portal-content-padded .portal-content{padding:var(--mojo-spacer-lg)}.mojo-portal-content-flush .portal-content,.mobile-layout .portal-content{padding:0}.mojo-sidebar-slide #portal-sidebar{transition:transform var(--mojo-transition-base) ease-in-out}.mojo-sidebar-fade #portal-sidebar{transition:opacity var(--mojo-transition-base) ease-in-out}.mojo-sidebar-scale #portal-sidebar{transition:transform var(--mojo-transition-base) cubic-bezier(.34,1.56,.64,1)}.js-sidebar-transitioning *{pointer-events:none}.js-sidebar-ready{transition:all var(--mojo-transition-base)}@media (prefers-color-scheme: dark){.mojo-sidebar-theme-auto .sidebar{background-color:var(--bs-dark);color:var(--bs-light);border-right:1px solid var(--bs-gray-800)}.mojo-sidebar-theme-auto .sidebar-nav .nav-link{color:var(--bs-gray-300)}.mojo-sidebar-theme-auto .sidebar-nav .nav-link:hover{background-color:#ffffff1a;color:var(--bs-white)}}.mojo-sidebar-collapsed .nav-link:focus-visible{outline:2px solid var(--bs-primary);outline-offset:-2px;z-index:1}.mojo-skip-to-content{position:absolute;top:-40px;left:6px;background:var(--bs-primary);color:#fff;padding:8px;text-decoration:none;z-index:var(--mojo-zindex-tooltip);border-radius:var(--mojo-border-radius);font-size:.875rem}.mojo-skip-to-content:focus{top:6px}.portal-container.mobile-layout:not(.hide-sidebar){overflow:hidden}.portal-container.mobile-layout:not(.hide-sidebar) .portal-body{pointer-events:none}.group-selection-sidebar{background:#fff;border-right:1px solid var(--bs-border-color)}.group-selection-sidebar .form-control-sm{font-size:.875rem}.group-item{cursor:pointer;transition:all .2s ease;border-bottom:1px solid rgba(0,0,0,.05);position:relative}.group-item:last-child{border-bottom:none}.group-item:hover{background-color:#f8f9fa!important;border-left:3px solid var(--bs-primary)}.group-item:active{background-color:#e9ecef!important;transform:translate(1px)}.group-item .bi-chevron-right{opacity:0;transition:opacity .2s ease}.group-item:hover .bi-chevron-right{opacity:1}.group-header{margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid rgba(0,0,0,.1)}.group-header .cursor-pointer{cursor:pointer;padding:.5rem;border-radius:.375rem;transition:all .2s ease}.group-header .cursor-pointer:hover{background-color:#f8f9fa!important}.group-header .bi-chevron-down{transition:transform .2s ease}.group-header .cursor-pointer:hover .bi-chevron-down{transform:rotate(180deg)}.sidebar-dark .group-selection-sidebar{background:#2c3e50;border-right-color:#34495e}.sidebar-dark .group-item{border-bottom-color:#ffffff0d}.sidebar-dark .group-item:hover{background-color:#34495e!important}.sidebar-dark .group-item:active{background-color:#3d566e!important}.sidebar-dark .group-header{border-bottom-color:#ffffff1a}.sidebar-dark .group-header .cursor-pointer:hover{background-color:#34495e!important}.group-selection-sidebar .spinner-border-sm{width:1rem;height:1rem}.group-selection-sidebar .text-center{color:var(--bs-secondary)}.group-selection-sidebar .form-control:focus{border-color:var(--bs-primary);box-shadow:0 0 0 .2rem rgba(var(--bs-primary-rgb),.25)}.group-selection-sidebar .bi-inbox,.group-selection-sidebar .bi-search{color:var(--bs-secondary)}.group-selection-sidebar .bg-light{background-color:#00000005!important}.sidebar-dark .group-selection-sidebar .bg-light{background-color:#ffffff05!important}.group-selection-sidebar .text-decoration-none:hover{color:var(--bs-primary)!important}.simple-search-view{background-color:var(--bs-body-bg);color:var(--bs-body-color);border-right:1px solid var(--bs-border-color);box-shadow:var(--bs-box-shadow)}.collapse-sidebar .simple-search-view{background-color:var(--mojo-topnav-bg)!important}.collapse-sidebar .simple-search-view>*{display:none!important}.simple-search-item{cursor:pointer;transition:background-color .15s ease-in-out,transform .15s ease-in-out;border-radius:.25rem}.simple-search-item:hover{background-color:#0000320d;transform:translateY(-1px)}[data-bs-theme=dark] .simple-search-item:hover{background-color:#ffffff1a}.simple-search-exit-btn{width:20px;height:20px;margin-top:-5px}.simple-search-clear-btn{width:24px;height:24px;border-radius:50%}.timeline{position:relative;padding-left:2rem}.timeline:before{content:"";position:absolute;left:.75rem;top:0;bottom:0;width:2px;background-color:#dee2e6}.timeline-item{position:relative;margin-bottom:1.5rem}.timeline-marker{position:absolute;left:-2rem;top:.125rem;width:1.5rem;height:1.5rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.75rem;color:#fff;border:2px solid white;box-shadow:0 2px 4px #0000001a}.timeline-marker-info{background-color:#0dcaf0}.timeline-marker-primary{background-color:#0d6efd}.timeline-marker-success{background-color:#198754}.timeline-marker-danger{background-color:#dc3545}.timeline-marker-warning{background-color:#ffc107;color:#000}.timeline-marker-secondary{background-color:#6c757d}.timeline-content{background-color:#f8f9fa;padding:1rem;border-radius:.375rem;border:1px solid #dee2e6}.job-status-indicator{display:inline-flex;align-items:center;gap:.5rem}.job-health-indicator{width:12px;height:12px;border-radius:50%;display:inline-block}.health-healthy{background-color:#198754}.health-warning{background-color:#ffc107}.health-critical{background-color:#dc3545}.health-unknown{background-color:#6c757d}.job-stats-header .card{transition:transform .2s ease,box-shadow .2s ease}.job-stats-header .card:hover{transform:translateY(-2px);box-shadow:0 4px 12px #00000026!important}.job-health-header .health-indicator{animation:pulse 2s infinite}@keyframes pulse{0%{opacity:1}50%{opacity:.7}to{opacity:1}}.logs-container{background-color:#1e1e1e!important;color:#d4d4d4!important}.logs-container .text-info{color:#9cdcfe!important}.logs-container .text-warning{color:#dcdcaa!important}.logs-container .text-danger{color:#f14c4c!important}.logs-container .text-success{color:#4ec9b0!important}.job-details-view pre code{font-size:.875rem;line-height:1.4}@media (max-width: 768px){.timeline{padding-left:1.5rem}.timeline-marker{left:-1.75rem;width:1.25rem;height:1.25rem;font-size:.625rem}.timeline-content{padding:.75rem}}.channel-status-badge{font-size:.75rem;padding:.25rem .5rem}.runner-utilization{height:4px;background-color:#e9ecef;border-radius:2px;overflow:hidden}.runner-utilization-fill{height:100%;transition:width .3s ease}.runner-utilization-low{background-color:#198754}.runner-utilization-medium{background-color:#ffc107}.runner-utilization-high{background-color:#fd7e14}.runner-utilization-critical{background-color:#dc3545}.mojo-select-cell,.mojo-select-all-cell{background-color:transparent;cursor:pointer;transition:background-color .2s ease;text-align:center;vertical-align:middle;width:40px;height:40px;display:flex;align-items:center;justify-content:center}.mojo-select-cell.selected,.mojo-select-all-cell.selected{background-color:transparent}.mojo-checkbox{height:20px;width:20px;border-radius:6px;border:2px solid var(--bs-border-color);background-color:var(--bs-body-bg);display:flex;align-items:center;justify-content:center;transition:all .2s ease}.mojo-checkbok:focused,.mojo-checkbok:hover{box-shadow:0 0 0 .25rem #3874ff40}.mojo-select-cell:hover .mojo-checkbox{box-shadow:0 0 0 .25rem #3874ff40}.mojo-select-cell.selected .mojo-checkbox,.mojo-select-all-cell.selected .mojo-checkbox{color:#fff;background-color:var(--bs-primary);border-color:var(--bs-primary)}.mojo-checkbox i{font-size:1rem;opacity:0;transition:opacity .2s ease}.mojo-select-cell.selected .mojo-checkbox i,.mojo-select-all-cell.selected .mojo-checkbox i{opacity:1}.mojo-select-all-cell.indeterminate .mojo-checkbox{border-color:var(--bs-primary);background-color:var(--bs-primary)}.mojo-select-all-cell.indeterminate .mojo-checkbox i{opacity:1;color:#fff}.table-page-container{position:relative}.mojo-table-wrapper{padding:1rem}.mojo-table-loading{position:absolute;top:0;left:0;right:0;background-color:var(--bs-body-bg);opacity:.8;height:100%}.table-page-header{border-bottom:1px solid var(--bs-border-color);padding-bottom:1rem;margin-bottom:1.5rem}.page-title{font-size:1.75rem;font-weight:600;color:var(--bs-emphasis-color);margin-bottom:.5rem}.page-description{font-size:.95rem;color:var(--bs-secondary-color);margin-bottom:0}.table-container{position:relative;transition:opacity .3s ease}.table-container.is-loading{opacity:.7;pointer-events:none}.table-status-bar.table-status-top{border-top:none;border-bottom:1px solid var(--bs-border-color);padding-top:0;padding-bottom:.75rem;margin-bottom:1rem}.status-info{display:flex;align-items:center;gap:1rem;flex-wrap:wrap}.table-loading-overlay{position:absolute;inset:0;background:var(--bs-body-bg);opacity:.9;display:flex;align-items:center;justify-content:center;z-index:1000;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.loading-content{padding:2rem;text-align:center}.loading-message{margin-top:1rem;color:var(--bs-secondary-color);font-size:.95rem}.loading-indicator{display:inline-flex;align-items:center;gap:.5rem}.error-indicator{animation:mojo-pulse 2s ease-in-out infinite;display:inline-flex;align-items:center;gap:.25rem}.table-actions-bottom{border-bottom:none;border-top:1px solid var(--bs-border-color);padding-top:1rem;padding-bottom:0;margin-top:1rem;margin-bottom:0}.batch-actions-panel{position:sticky;bottom:10px;box-shadow:0 1rem 3rem #0006;background-color:var(--bs-body-bg);height:60px;z-index:20;margin:0 8px}div.batch-select-count{font-size:1.5rem!important;background-color:var(--bs-primary);color:var(--bs-white);min-width:50px;text-align:center;height:60px;line-height:60px}div.batch-select-title{font-size:1.5rem!important;line-height:60px;height:60px}div.batch-select-action{cursor:pointer;color:var(--bs-primary-text-emphasis);transition:color .2s ease}div.batch-select-action:hover{color:var(--bs-primary)}div.batch-select-end{border-radius:0 4px 4px 0;background-color:var(--bs-primary);height:60px;width:10px}.batch-actions-panel-top{border-left:4px solid var(--bs-primary);border-color:var(--bs-info-border-subtle);margin:0!important;padding:.4rem;animation:slideDown .3s ease-out}.batch-actions-panel-top .batch-select-count{font-weight:700;color:var(--bs-primary);font-size:1.1rem}.batch-actions-panel-top button{transition:transform .2s ease,box-shadow .2s ease}.batch-actions-panel-top button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.btn-refresh:not(:disabled):hover .bi-arrow-clockwise{animation:mojo-spin .5s ease-in-out}.btn-add:not(:disabled):hover{transform:translateY(-1px);box-shadow:0 .25rem .5rem #0000001a}.btn-export:not(:disabled):hover .bi-download,.btn-import:not(:disabled):hover .bi-upload{animation:mojo-bounce .5s ease-in-out}.collection-select-view{position:relative}.collection-select-view .form-control.is-invalid{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath d='m5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.collection-select-view .dropdown-item:has(.spinner-border){justify-content:center;align-items:center;min-height:3rem}.collection-select-view .dropdown-item:focus-visible{outline:2px solid var(--bs-primary);outline-offset:-2px}.collection-select-view .dropdown-menu::-webkit-scrollbar{width:6px}.collection-select-view .dropdown-menu::-webkit-scrollbar-track{background:var(--bs-secondary-bg);border-radius:var(--bs-border-radius-sm)}.collection-select-view .dropdown-menu::-webkit-scrollbar-thumb{background:var(--bs-border-color);border-radius:var(--bs-border-radius-sm)}.collection-select-view .dropdown-menu::-webkit-scrollbar-thumb:hover{background:var(--bs-secondary)}.collection-select-view .btn[data-action=clear-selection]{width:1.5rem;height:1.5rem;padding:0;display:flex;align-items:center;justify-content:center;background:none;border:none;color:var(--bs-secondary);transition:color .15s ease-in-out}.collection-select-view .btn[data-action=clear-selection]:hover{color:var(--bs-danger)}.collection-select-view .btn[data-action=clear-selection]:focus{box-shadow:none;outline:2px solid var(--bs-primary);outline-offset:2px}.collection-select-view .btn[data-action=clear-selection] i{font-size:1rem}.collection-select-view .form-control.pe-5{padding-right:2.5rem!important}.text-truncate-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.data-view-item .data-view-label{font-size:.6rem}.table-container::-webkit-scrollbar{height:8px;width:8px}.table-container::-webkit-scrollbar-track{background:var(--bs-secondary-bg);border-radius:var(--bs-border-radius-sm)}.table-container::-webkit-scrollbar-thumb{background:var(--bs-border-color);border-radius:var(--bs-border-radius-sm)}.table-container::-webkit-scrollbar-thumb:hover{background:var(--bs-secondary-color)}@keyframes mojo-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes mojo-pulse{0%,to{opacity:1}50%{opacity:.6}}@keyframes mojo-bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@media (max-width: 768px){.table-page-header{padding-bottom:.75rem;margin-bottom:1rem}.batch-actions-panel-top{padding:.75rem!important}.batch-actions-panel-top .d-flex{flex-direction:column;gap:.75rem}.batch-actions-panel-top .batch-select-count{font-size:1rem}.page-title{font-size:1.5rem}.page-description{font-size:.9rem}.table-status-bar{padding:.5rem .75rem}.status-info{flex-direction:column;align-items:flex-start;gap:.5rem}.collection-select-view .dropdown-menu{max-height:200px}.collection-select-view .dropdown-item{padding:.75rem 1rem;font-size:1rem}}@media (max-width: 576px){.table-container{overflow-x:auto}.page-title{font-size:1.25rem}.loading-content{padding:1rem}.batch-actions-panel-top button{font-size:.875rem;padding:.25rem .5rem}.batch-actions-panel-top .btn-group{flex-wrap:wrap}}[data-bs-theme=dark] .table-loading-overlay{background:var(--bs-dark);opacity:.9}[data-bs-theme=dark] .batch-actions-panel{background-color:var(--bs-dark)}[data-bs-theme=dark] .batch-actions-panel-top{background-color:#0d6efd1a;border-color:#0d6efd4d}[data-bs-theme=dark] .collection-select-view .dropdown-menu::-webkit-scrollbar-track{background:var(--bs-secondary-bg)}[data-bs-theme=dark] .collection-select-view .dropdown-menu::-webkit-scrollbar-thumb{background:var(--bs-border-color)}[data-bs-theme=dark] .collection-select-view .dropdown-menu::-webkit-scrollbar-thumb:hover{background:var(--bs-secondary-color)}[data-bs-theme=dark] .collection-select-view .btn[data-action=clear-selection]{color:var(--bs-secondary)}[data-bs-theme=dark] .collection-select-view .btn[data-action=clear-selection]:hover{color:var(--bs-danger)}[data-bs-theme=dark] .collection-select-view .btn[data-action=clear-selection]:focus{outline-color:var(--bs-primary)}[data-bs-theme=dark] .table-container::-webkit-scrollbar-track{background:var(--bs-secondary-bg)}[data-bs-theme=dark] .table-container::-webkit-scrollbar-thumb{background:var(--bs-border-color)}[data-bs-theme=dark] .table-container::-webkit-scrollbar-thumb:hover{background:var(--bs-secondary-color)}@media (prefers-contrast: high){.collection-select-view .dropdown-item.active{background-color:var(--bs-emphasis-color);color:var(--bs-body-bg)}.mojo-checkbox{border-width:2px}}@media (prefers-reduced-motion: reduce){.table-container,.mojo-checkbox,.batch-select-action,.batch-actions-panel-top,.batch-actions-panel-top button{transition:none}@keyframes slideDown{0%,to{opacity:1;transform:none}}.btn-refresh:not(:disabled):hover .bi-arrow-clockwise,.btn-export:not(:disabled):hover .bi-download,.btn-import:not(:disabled):hover .bi-upload{animation:none}}.toast-service-success{--bs-toast-bg: rgba(248, 249, 250, .98);--bs-toast-border-color: rgba(25, 135, 84, .3);color:var(--bs-body-color);border-left:4px solid rgba(25,135,84,.8)}.toast-service-error{--bs-toast-bg: rgba(248, 249, 250, .98);--bs-toast-border-color: rgba(220, 53, 69, .3);color:var(--bs-body-color);border-left:4px solid rgba(220,53,69,.8)}.toast-service-warning{--bs-toast-bg: rgba(248, 249, 250, .98);--bs-toast-border-color: rgba(255, 193, 7, .3);color:var(--bs-body-color);border-left:4px solid rgba(255,193,7,.9)}.toast-service-info{--bs-toast-bg: rgba(248, 249, 250, .98);--bs-toast-border-color: rgba(13, 110, 253, .3);color:var(--bs-body-color);border-left:4px solid rgba(13,110,253,.8)}.toast-service-plain{--bs-toast-bg: rgba(248, 249, 250, .98);--bs-toast-border-color: rgba(0, 0, 0, .08);color:var(--bs-body-color)}.toast-service-icon{width:20px;height:20px;flex-shrink:0}.toast-service-success .toast-service-icon{color:#198754e6}.toast-service-error .toast-service-icon{color:#dc3545e6}.toast-service-warning .toast-service-icon{color:#ffc107}.toast-service-info .toast-service-icon{color:#0d6efde6}.toast-service-plain .toast-service-icon{color:#6c757dcc}.toast-service-close{filter:none;opacity:.6}.toast-service-close:hover{opacity:1}.toast-container{max-width:400px}.toast{transition:all .3s ease-in-out}.toast.showing{opacity:0;transform:translate(100%)}.toast.show{opacity:1;transform:translate(0)}.toast.hide{opacity:0;transform:translate(100%)}@media (max-width: 576px){.toast-container{max-width:calc(100vw - 20px);left:10px!important;right:10px!important;transform:none!important}.toast-container.position-fixed.top-0.start-50.translate-middle-x,.toast-container.position-fixed.bottom-0.start-50.translate-middle-x{left:10px!important;right:10px!important;transform:none!important;width:calc(100% - 20px)}}.toast-header{padding:.5rem .75rem;border-bottom:1px solid rgba(0,0,0,.1)}.toast-service-success .toast-header,.toast-service-error .toast-header,.toast-service-info .toast-header,.toast-service-warning .toast-header{border-bottom-color:#0000000f}.toast-body{padding:.75rem;word-wrap:break-word}.toast-body .toast-message{line-height:1.4}.toast-container .toast+.toast{margin-top:.5rem}@media (prefers-color-scheme: dark){.toast-service-plain{--bs-toast-bg: rgba(33, 37, 41, .95);--bs-toast-border-color: rgba(255, 255, 255, .1);color:var(--bs-body-color)}}.toast-progress{position:absolute;bottom:0;left:0;height:3px;background-color:#ffffff4d;border-radius:0 0 .375rem .375rem;transition:width linear}.toast-actions{padding:.25rem .75rem .75rem;display:flex;gap:.5rem}.toast-actions .btn{font-size:.875rem;padding:.25rem .75rem}/**
2
+ * MOJO Authentication System CSS
3
+ * Complete styling for MOJO Framework authentication pages
4
+ *
5
+ * @version 2.0.0
6
+ * @license MIT
7
+ * @repository https://github.com/your-org/mojo-framework
8
+ *
9
+ * Usage in external projects:
10
+ * <link rel="stylesheet" href="node_modules/mojo-framework/src/css/auth.css">
11
+ *
12
+ * Or via CDN:
13
+ * <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/mojo-framework/css/auth.css">
14
+ *
15
+ * Or import in CSS:
16
+ * @import url('path/to/mojo/src/css/auth.css');
17
+ */:root{--mojo-auth-primary: var(--bs-primary, #667eea);--mojo-auth-primary-dark: var(--bs-primary-dark, #5a6fd4);--mojo-auth-secondary: var(--bs-secondary, #764ba2);--mojo-auth-success: var(--bs-success);--mojo-auth-danger: var(--bs-danger);--mojo-auth-warning: var(--bs-warning);--mojo-auth-info: var(--bs-info);--mojo-auth-border-radius: var(--bs-border-radius-lg, 1rem);--mojo-auth-card-padding: var(--bs-spacer, 2rem);--mojo-auth-transition: all .2s ease;--mojo-auth-box-shadow: var(--bs-box-shadow-lg, 0 8px 32px rgba(0, 0, 0, .1));--mojo-auth-card-bg: var(--bs-body-bg, rgba(255, 255, 255, .98));--mojo-auth-text-color: var(--bs-body-color);--mojo-auth-border-color: var(--bs-border-color);--mojo-auth-background: linear-gradient( 135deg, var(--mojo-auth-primary) 0%, var(--bs-body-bg, #ffffff) 100% )}.auth-page{background:var(--mojo-auth-background);min-height:100vh;font-family:var( --bs-font-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif );--auth-primary-color: var(--mojo-auth-primary);--auth-primary-dark: var(--mojo-auth-primary-dark);--auth-secondary-color: var(--mojo-auth-secondary);--auth-success-color: var(--mojo-auth-success);--auth-danger-color: var(--mojo-auth-danger);--auth-warning-color: var(--mojo-auth-warning);--auth-info-color: var(--mojo-auth-info);--auth-border-radius: var(--mojo-auth-border-radius);--auth-transition: var(--mojo-auth-transition);--auth-text-color: var(--mojo-auth-text-color);--auth-border-color: var(--mojo-auth-border-color)}.auth-page{background:var(--mojo-auth-background)!important}.mojo-auth-container{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:2rem 0}.mojo-auth-wrapper{width:100%;max-width:500px;margin:0 auto;padding:0 1rem}.mojo-auth-logo{max-height:80px;max-width:200px;object-fit:contain;margin-bottom:2rem}.mojo-auth-compact .auth-page{background:transparent;min-height:auto;padding:1rem 0}.mojo-auth-compact .auth-page .card{margin:0;box-shadow:0 4px 16px #0000001a}.mojo-auth-no-bg .auth-page{background:transparent;min-height:auto}.auth-page .card{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:var(--mojo-auth-card-bg)!important;border:1px solid rgba(255,255,255,.2);border-radius:var(--auth-border-radius);box-shadow:var(--mojo-auth-box-shadow);transition:transform .2s ease,box-shadow .2s ease}.auth-page .card:hover{transform:translateY(-2px);box-shadow:0 12px 40px #00000026}.auth-page .card-body{position:relative;padding:var(--mojo-auth-card-padding)}.auth-page .form-control:focus,.auth-page .form-check-input:focus{border-color:var(--auth-primary-color);box-shadow:0 0 0 .25rem #667eea40;outline:none}.auth-page .form-control{border-radius:var(--bs-border-radius, .5rem);border:1px solid var(--auth-border-color);transition:var(--auth-transition)}.auth-page .form-control:hover:not(:focus){border-color:var(--bs-border-color-translucent, #adb5bd)}.auth-page .form-control.is-invalid{border-color:var(--auth-danger-color);box-shadow:0 0 0 .25rem #dc354540}.auth-page .form-control.is-valid{border-color:var(--auth-success-color);box-shadow:0 0 0 .25rem #19875440}.auth-page .input-group .form-control:focus{z-index:5}.auth-page .input-group .btn{border-left:none}.auth-page .input-group .btn:hover{background-color:#f8f9fa;border-color:var(--auth-primary-color);color:var(--auth-primary-color)}.auth-page .btn-primary{background:linear-gradient(135deg,var(--auth-primary-color) 0%,var(--auth-secondary-color) 100%);border:none;border-radius:var(--bs-border-radius, .5rem);font-weight:500;transition:var(--auth-transition)}.auth-page .btn-primary:hover:not(:disabled){background:linear-gradient(135deg,var(--auth-primary-dark) 0%,var(--auth-secondary-color) 100%);transform:translateY(-1px);box-shadow:0 4px 12px #667eea4d}.auth-page .btn-primary:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 8px #667eea33}.auth-page .btn-outline-primary:hover:not(:disabled),.auth-page .btn-outline-secondary:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 12px #0000001a}.auth-page .btn-outline-primary{border-color:var(--auth-primary-color);color:var(--auth-primary-color)}.auth-page .btn-outline-primary:hover:not(:disabled){background-color:var(--auth-primary-color);border-color:var(--auth-primary-color);color:#fff}.auth-page .btn:disabled{opacity:.7;cursor:not-allowed;transform:none!important;box-shadow:none!important}.auth-page .spinner-border-sm{width:1rem;height:1rem}.auth-page .form-label{font-weight:500;color:var(--auth-text-color);margin-bottom:.5rem}.auth-page .form-label i{color:var(--auth-primary-color)}.auth-page .form-check-input:checked{background-color:var(--auth-primary-color);border-color:var(--auth-primary-color)}.auth-page .form-check-input:focus{box-shadow:0 0 0 .25rem #667eea40}.auth-page .form-check-label{font-size:.9rem;color:var(--bs-secondary-color, #6c757d)}.auth-page .form-text{font-size:.875rem;color:var(--bs-secondary-color, #6c757d)}.auth-page .invalid-feedback{font-size:.875rem;color:var(--auth-danger-color);margin-top:.25rem}.auth-page .progress{background-color:#e9ecef;border-radius:2px;height:4px;overflow:hidden}.auth-page .progress-bar{transition:width .3s ease}.auth-page .progress-bar.bg-danger{background-color:var(--auth-danger-color)!important}.auth-page .progress-bar.bg-warning{background-color:var(--auth-warning-color)!important}.auth-page .progress-bar.bg-info{background-color:var(--auth-info-color)!important}.auth-page .progress-bar.bg-success{background-color:var(--auth-success-color)!important}.auth-page .alert{border-radius:var(--bs-border-radius, .5rem);border:none;box-shadow:var(--bs-box-shadow-sm, 0 2px 4px rgba(0, 0, 0, .1))}.auth-page .alert-danger{background-color:var(--bs-danger-bg-subtle);color:var(--bs-danger-text-emphasis);border-left:4px solid var(--auth-danger-color)}.auth-page .alert-success{background-color:var(--bs-success-bg-subtle);color:var(--bs-success-text-emphasis);border-left:4px solid var(--auth-success-color)}.auth-page .alert-warning{background-color:var(--bs-warning-bg-subtle);color:var(--bs-warning-text-emphasis);border-left:4px solid var(--auth-warning-color)}.auth-page .alert-info{background-color:var(--bs-info-bg-subtle);color:var(--bs-info-text-emphasis);border-left:4px solid var(--auth-info-color)}.auth-page .alert .bi{font-size:1.1em;vertical-align:baseline}.auth-page a{color:var(--auth-primary-color);text-decoration:none;transition:color .2s ease}.auth-page a:hover{color:var(--auth-primary-dark);text-decoration:underline}.auth-page a:focus{color:var(--auth-primary-dark);outline:none;box-shadow:0 0 0 .25rem #667eea40;border-radius:.25rem}.auth-page .position-relative hr{border-color:var(--auth-border-color);opacity:.5}.auth-page .position-relative .position-absolute{background:var(--bs-body-bg, white);padding:0 1rem;color:var(--bs-secondary-color, #6c757d);font-size:.875rem;font-weight:500}.auth-page .text-success{color:var(--auth-success-color)!important}.auth-page .text-danger{color:var(--auth-danger-color)!important}.auth-page .text-warning{color:var(--auth-warning-color)!important}.auth-page .text-info{color:var(--auth-info-color)!important}.auth-page .text-muted{color:var(--bs-secondary-color, #6c757d)!important}.auth-page .spinner-border,.auth-page .spinner-border-primary{color:var(--auth-primary-color)}.bootstrap-theme .auth-page .btn-primary{background:var(--bs-primary, var(--auth-primary-color));border-color:var(--bs-primary, var(--auth-primary-color))}.bootstrap-theme .auth-page .form-control:focus{border-color:var(--bs-primary, var(--auth-primary-color));box-shadow:0 0 0 .25rem rgba(var(--bs-primary-rgb, 102, 126, 234),.25)}.tailwind-theme .auth-page{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif}@media (prefers-color-scheme: dark){.mojo-auth-auto .auth-page{background:linear-gradient(135deg,#4a5568,#2d3748)}.mojo-auth-auto .auth-page .card{background:#2d3748f2!important;border-color:#ffffff1a;color:#fff}.mojo-auth-auto .auth-page .form-control{background-color:#2d3748cc;border-color:#fff3;color:#fff}.mojo-auth-auto .auth-page .form-control::placeholder{color:#fff9}.mojo-auth-auto .auth-page .text-muted{color:#ffffffb3!important}}.mojo-auth-dark .auth-page{background:linear-gradient(135deg,#1a202c,#2d3748)}.mojo-auth-dark .auth-page .card{background:#1a202cf2!important;border-color:#ffffff1a;color:#fff}.mojo-auth-dark .auth-page .form-control{background-color:#1a202ccc;border-color:#fff3;color:#fff}.mojo-auth-dark .auth-page .form-control::placeholder{color:#fff9}.mojo-auth-dark .auth-page .text-muted{color:#ffffffb3!important}.mojo-auth-dark .auth-page .form-label{color:#ffffffe6}.mojo-auth-dark .auth-page .alert-danger{background-color:#dc354533;color:#f8d7da}.mojo-auth-dark .auth-page .alert-success{background-color:#19875433;color:#d1e7dd}@media (max-width: 768px){.auth-page{padding:1rem 0}.auth-page .card{margin:0 1rem;border-radius:.75rem}.auth-page .card-body{padding:2rem 1.5rem}.auth-page .btn-lg{padding:.75rem 1.25rem;font-size:1rem}.auth-page .form-control-lg{padding:.75rem 1rem;font-size:1rem}.auth-page h2{font-size:1.5rem}.mojo-auth-wrapper{padding:0 .5rem}}@media (max-width: 480px){.auth-page .card-body{padding:1.5rem 1rem}.auth-page .d-flex.justify-content-between{flex-direction:column;gap:.5rem}.auth-page .form-check{text-align:center}}@media (max-width: 575.98px){.mojo-auth-mobile-full .auth-page .card{border-radius:0;min-height:100vh;display:flex;flex-direction:column;justify-content:center}}@media (min-width: 992px){.mojo-auth-desktop-sidebar .mojo-auth-wrapper{max-width:400px;margin-left:auto;margin-right:3rem}}.auth-page .fade-in{animation:mojoAuthFadeIn .3s ease-in-out}@keyframes mojoAuthFadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.auth-page .slide-up{animation:mojoAuthSlideUp .4s ease-out}@keyframes mojoAuthSlideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.auth-page *:focus{outline:none}.auth-page .btn:focus,.auth-page .form-control:focus,.auth-page .form-check-input:focus,.auth-page a:focus{box-shadow:0 0 0 .25rem #667eea40}@supports selector(:focus-visible){.auth-page *:focus:not(:focus-visible){box-shadow:none;outline:none}}@media (prefers-contrast: high){.auth-page .btn-primary{background:#000;border:2px solid #000}.auth-page .form-control:focus{border-width:2px}.auth-page .btn{border-width:2px}}@media (prefers-reduced-motion: reduce){.auth-page *,.auth-page *:before,.auth-page *:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@media print{.auth-page,.mojo-auth-container,.mojo-auth-wrapper{background:#fff!important;color:#000!important}.auth-page .card{background:#fff!important;box-shadow:none!important;border:1px solid #000!important}.auth-page .btn{border:1px solid #000!important;background:#fff!important;color:#000!important}.mojo-auth-logo{max-height:60px}}.lightbox-component{position:relative;width:100%;height:100%;background:#000;overflow:hidden;font-family:var(--bs-font-sans-serif, system-ui, sans-serif)}.lightbox-overlay{position:absolute;inset:0;background:#000c;display:flex;align-items:center;justify-content:center;z-index:1}.lightbox-loading{text-align:center;color:#fff}.lightbox-loading .spinner-border{width:2rem;height:2rem;margin-bottom:1rem}.lightbox-component.loaded .lightbox-overlay{display:none}.image-viewer{position:relative;width:100%;height:100%;background:#000;overflow:hidden}.image-viewer-container{position:relative;width:100%;height:100%;min-height:400px}.image-viewer-content{position:relative;width:100%;height:100%;overflow:hidden;cursor:grab}.image-viewer-content:active,.image-viewer-content.dragging{cursor:grabbing}.image-viewer-image{position:absolute;top:50%;left:50%;transform-origin:center center;transition:transform .2s ease-out;max-width:none;max-height:none;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;pointer-events:none}.image-viewer-overlay{position:absolute;inset:0;background:#000c;display:flex;align-items:center;justify-content:center;z-index:1}.image-viewer.loaded .image-viewer-overlay{display:none}.image-viewer-controls{position:absolute;bottom:20px;left:50%;transform:translate(-50%);z-index:10;display:flex;gap:10px;align-items:center;background:#000c;padding:8px 12px;border-radius:6px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.image-viewer-info{color:#fff;font-size:12px;white-space:nowrap;margin-left:10px}.image-viewer-controls .btn{--bs-btn-border-color: rgba(255,255,255,.2);border-color:#fff3}.image-viewer-controls .btn:hover{--bs-btn-border-color: rgba(255,255,255,.4);border-color:#fff6}.image-editor{display:flex;flex-direction:column;height:100%;background:#f8f9fa}.image-editor-toolbar{padding:8px 12px;background:#fff;border-bottom:1px solid #dee2e6;flex-shrink:0}.image-editor-filters{background:#fff;border-bottom:1px solid #dee2e6;flex-shrink:0}.image-editor-filters .card{border:none;border-radius:0}.image-editor-workspace{flex:1;display:flex;flex-direction:column;overflow:hidden}.image-editor-content{flex:1;position:relative;background:#000;overflow:hidden;cursor:grab}.image-editor-content:active{cursor:grabbing}.image-editor-content.crop-mode{cursor:crosshair}.image-editor-image,.image-editor-canvas{position:absolute;top:50%;left:50%;transform-origin:center center;transition:transform .2s ease-out;max-width:none;max-height:none;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.image-editor-overlay{position:absolute;inset:0;background:#000c;display:flex;align-items:center;justify-content:center;z-index:1}.image-editor.loaded .image-editor-overlay{display:none}.image-editor-status{padding:4px 12px;background:#fff;border-top:1px solid #dee2e6;flex-shrink:0}.crop-overlay{position:absolute;inset:0;z-index:10}.crop-box{position:absolute;border:2px solid #007bff;background:#007bff1a;cursor:move}.crop-box:before{content:"";position:absolute;inset:0;border:1px dashed rgba(255,255,255,.5)}.crop-handle{position:absolute;width:8px;height:8px;background:#007bff;border:1px solid white;border-radius:1px}.crop-handle-nw{top:-4px;left:-4px;cursor:nw-resize}.crop-handle-ne{top:-4px;right:-4px;cursor:ne-resize}.crop-handle-sw{bottom:-4px;left:-4px;cursor:sw-resize}.crop-handle-se{bottom:-4px;right:-4px;cursor:se-resize}.crop-handle-n{top:-4px;left:50%;transform:translate(-50%);cursor:n-resize}.crop-handle-s{bottom:-4px;left:50%;transform:translate(-50%);cursor:s-resize}.crop-handle-w{left:-4px;top:50%;transform:translateY(-50%);cursor:w-resize}.crop-handle-e{right:-4px;top:50%;transform:translateY(-50%);cursor:e-resize}.form-range::-webkit-slider-thumb{background:#007bff}.form-range::-moz-range-thumb{background:#007bff}.btn.active{background-color:#007bff;border-color:#007bff;color:#fff}.pdf-viewer{display:flex;flex-direction:column;height:100%;background:#f8f9fa}.pdf-viewer-toolbar{padding:8px 12px;background:#fff;border-bottom:1px solid #dee2e6;flex-shrink:0}.pdf-viewer-toolbar .page-input{width:60px}.pdf-viewer-toolbar .page-total{background:transparent;border-left:none;font-size:.8em}.pdf-viewer-content{flex:1;position:relative;background:#525659;overflow:auto;display:flex;align-items:center;justify-content:center}.pdf-canvas-container{position:relative;background:#fff;box-shadow:0 4px 12px #0000004d;margin:20px}.pdf-canvas{display:block;max-width:100%;max-height:100%}.pdf-viewer-overlay{position:absolute;inset:0;background:#0000001a;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:1;color:#6c757d}.pdf-viewer.loaded .pdf-viewer-overlay{display:none}.pdf-viewer-error{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2;min-width:300px}.pdf-viewer-status{padding:4px 12px;background:#fff;border-top:1px solid #dee2e6;flex-shrink:0}.pdf-viewer-loading{text-align:center}.pdf-viewer-loading .spinner-border{width:2rem;height:2rem}.lightbox-toolbar .btn:disabled{opacity:.4}.lightbox-toolbar .btn-group{margin-right:.5rem}.lightbox-controls .btn{border-color:#fff3}.lightbox-controls .btn:hover:not(:disabled){border-color:#fff6;background-color:#ffffff1a}.lightbox-controls .btn:focus{box-shadow:0 0 0 .2rem #ffffff40}@media (max-width: 768px){.image-editor-toolbar .btn-group,.pdf-viewer-toolbar .btn-group{margin-bottom:4px}.image-editor-toolbar .btn-toolbar,.pdf-viewer-toolbar .btn-toolbar{flex-wrap:wrap}.image-viewer-controls{bottom:10px;left:10px;right:10px;transform:none;flex-wrap:wrap;justify-content:center}.image-editor-filters .row{margin:0}.image-editor-filters .col-md-6{margin-bottom:1rem}}@media (max-width: 576px){.lightbox-toolbar{padding:4px 8px}.lightbox-toolbar .btn-sm{padding:.125rem .25rem;font-size:.75rem}.image-viewer-controls{padding:6px 8px}.image-viewer-info{font-size:11px}}.lightbox-component:focus-within{outline:2px solid #007bff;outline-offset:2px}.crop-handle:focus{outline:2px solid #fff;outline-offset:1px}.lightbox-toolbar .btn:focus,.lightbox-controls .btn:focus{z-index:3}@media print{.lightbox-toolbar,.lightbox-controls,.lightbox-overlay,.crop-overlay{display:none!important}.pdf-canvas,.image-viewer-image{position:static!important;transform:none!important;max-width:100%!important;max-height:none!important}.lightbox-component{background:#fff!important;overflow:visible!important}}@media (prefers-color-scheme: dark){.image-editor,.pdf-viewer{background:#212529}.image-editor-toolbar,.pdf-viewer-toolbar,.image-editor-status,.pdf-viewer-status{background:#343a40;border-color:#495057;color:#fff}.image-editor-filters{background:#343a40;border-color:#495057}.image-editor-filters .card{background:#343a40;color:#fff}.form-control{background-color:#495057;border-color:#6c757d;color:#fff}.form-control:focus{background-color:#495057;border-color:#86b7fe;color:#fff}}.lightbox-component *{transition:opacity .2s ease-out,transform .2s ease-out}.crop-box{transition:all .1s ease-out}.lightbox-overlay{transition:opacity .3s ease-out}.btn{transition:all .15s ease-in-out}.pdf-viewer-content{scroll-behavior:smooth}@media (-webkit-min-device-pixel-ratio: 2),(min-resolution: 192dpi){.pdf-canvas{image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges}.crop-handle{width:10px;height:10px}}:root{--chart-bg: #ffffff;--chart-content-bg: #ffffff;--chart-border: #dee2e6;--chart-text: #212529;--chart-text-muted: #6c757d;--chart-overlay-bg: rgba(255, 255, 255, .95);--chart-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075);--chart-hover-bg: rgba(0, 0, 0, .05);--chart-focus-ring: rgba(13, 110, 253, .25);--chart-grid-color: rgba(0, 0, 0, .1);--chart-loading-bg: rgba(248, 249, 250, .95)}[data-theme=dark]{--chart-bg: #212529;--chart-content-bg: #2b3035;--chart-border: #404449;--chart-text: #ffffff;--chart-text-muted: #adb5bd;--chart-overlay-bg: rgba(33, 37, 41, .95);--chart-shadow: 0 .125rem .25rem rgba(0, 0, 0, .3);--chart-hover-bg: rgba(255, 255, 255, .1);--chart-focus-ring: rgba(13, 110, 253, .4);--chart-grid-color: rgba(255, 255, 255, .1);--chart-loading-bg: rgba(43, 48, 53, .95)}.chart-component{background:var(--chart-bg);border:1px solid var(--chart-border);border-radius:.375rem;box-shadow:var(--chart-shadow);color:var(--chart-text);padding:1rem;transition:all .15s ease-in-out;min-height:300px;font-family:var(--bs-font-sans-serif, system-ui, sans-serif)}.chart-component:hover{border-color:var(--bs-primary, #0d6efd);box-shadow:0 .25rem .5rem #0000001a}.chart-container{width:100%;height:100%;display:flex;flex-direction:column}.chart-title-section{flex:0 0 auto}.chart-title{color:var(--chart-text);margin-bottom:.25rem;font-weight:600}.last-updated{color:var(--chart-text-muted);font-size:.75rem;display:flex;align-items:center}.last-updated .timestamp{font-weight:500;margin-left:.25rem}.chart-controls{flex:0 0 auto}.chart-controls .btn-toolbar{gap:.5rem;flex-wrap:wrap}.chart-controls .btn-group{box-shadow:0 .125rem .25rem #00000013}.chart-controls .btn{position:relative;border-color:var(--chart-border);transition:all .15s ease-in-out}.chart-controls .btn:hover{transform:translateY(-1px);box-shadow:0 .25rem .5rem #00000026}.chart-controls .btn:focus{box-shadow:0 0 0 .2rem var(--chart-focus-ring)}.chart-controls .btn:active{transform:translateY(0)}.chart-type-switcher .btn.active{background-color:var(--bs-primary, #0d6efd);border-color:var(--bs-primary, #0d6efd);color:#fff;box-shadow:inset 0 1px #ffffff26}.refresh-btn .bi-arrow-clockwise.spin{animation:spin 1s linear infinite}.theme-toggle{position:relative}.theme-toggle:hover{background:var(--chart-hover-bg)}.chart-controls .dropdown-menu{background:var(--chart-bg);border:1px solid var(--chart-border);box-shadow:0 .5rem 1rem #0000002d}.chart-controls .dropdown-item{color:var(--chart-text);transition:background-color .15s ease-in-out}.chart-controls .dropdown-item:hover,.chart-controls .dropdown-item:focus{background-color:var(--chart-hover-bg)}.chart-controls .dropdown-item i{width:1rem;margin-right:.5rem}.chart-content{flex:1 1 auto;position:relative;background:var(--chart-content-bg);border-radius:.25rem;overflow:hidden;min-height:250px;display:flex;align-items:center;justify-content:center}.chart-canvas{max-width:100%;max-height:100%;display:block;background:transparent}.chart-overlay{position:absolute;inset:0;background:var(--chart-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);border-radius:.25rem}.chart-overlay .spinner-border{width:2rem;height:2rem;color:var(--bs-primary, #0d6efd)}.chart-overlay .text-muted{color:var(--chart-text-muted);font-size:.875rem;margin-top:.5rem}.chart-overlay .alert-danger{background:var(--bs-danger-bg-subtle, #f8d7da);border-color:var(--bs-danger-border-subtle, #f1aeb5);color:var(--bs-danger-text, #842029);max-width:400px;margin:1rem}[data-theme=dark] .chart-overlay .alert-danger{background:#f8d7da1a;border-color:#f1aeb533;color:#f8d7da}.chart-overlay .display-4{font-size:3rem;color:var(--chart-text-muted)}.chart-overlay .opacity-50{opacity:.5}.websocket-status{font-size:.75rem;padding:.25rem .5rem;border-radius:.25rem;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:all .2s ease}.websocket-status.bg-success{background-color:#198754e6!important;animation:pulse-success 2s infinite}.websocket-status.bg-danger{background-color:#dc3545e6!important;animation:pulse-danger 1s infinite}.websocket-status.bg-secondary{background-color:#6c757de6!important}@keyframes pulse-success{0%,to{opacity:.9}50%{opacity:1}}@keyframes pulse-danger{0%,to{opacity:.9}50%{opacity:.6}}.chart-footer{flex:0 0 auto;margin-top:1rem;padding-top:.75rem;border-top:1px solid var(--chart-border);font-size:.75rem;color:var(--chart-text-muted)}.chart-footer .row>div{display:flex;align-items:center}.chart-footer i{margin-right:.25rem;opacity:.7}.refresh-status{font-weight:500;color:var(--bs-success, #198754)}@media (max-width: 575.98px){.chart-component{padding:.75rem;margin-bottom:1rem}.chart-controls .btn-toolbar{justify-content:center}.chart-controls .btn-group{margin-bottom:.5rem}.chart-controls .btn-sm{padding:.25rem .5rem;font-size:.75rem}.chart-title{font-size:1.1rem;text-align:center}.chart-footer .row{text-align:center}.chart-footer .col{margin-bottom:.25rem}.chart-type-switcher{flex-direction:column}.chart-type-switcher .btn{margin-bottom:.25rem}}@media (min-width: 576px) and (max-width: 767.98px){.chart-component{padding:.875rem}.chart-controls .btn-toolbar{justify-content:space-between}}@media (min-width: 768px){.chart-component{min-height:400px}.chart-content{min-height:320px}}@media (min-width: 992px){.chart-component{min-height:450px}.chart-content{min-height:360px}}@media (min-width: 1200px){.chart-component{min-height:500px}.chart-content{min-height:400px}}.chart-component{animation:chartFadeIn .5s ease-out}@keyframes chartFadeIn{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.chart-overlay{transition:opacity .3s ease-in-out}.chart-overlay.d-none{opacity:0;pointer-events:none}.chart-controls .btn{transition:all .15s ease-in-out}.chart-canvas{opacity:0;animation:canvasFadeIn .3s ease-in-out .2s forwards}@keyframes canvasFadeIn{to{opacity:1}}@media (prefers-contrast: high){.chart-component,.chart-controls .btn{border-width:2px}.chart-footer{border-top-width:2px}}@media (prefers-reduced-motion: reduce){.chart-component,.chart-canvas,.chart-overlay,.chart-controls .btn{animation:none!important;transition:none!important}.refresh-btn .bi-arrow-clockwise.spin{animation:none!important}}.chart-component:focus-within{outline:2px solid var(--bs-primary, #0d6efd);outline-offset:2px}.chart-controls .btn:focus-visible{outline:2px solid var(--bs-primary, #0d6efd);outline-offset:2px;z-index:1}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.chart-component[data-chart-type=line] .chart-canvas,.chart-component[data-chart-type=bar] .chart-canvas{cursor:crosshair}.chart-component[data-chart-type=line] .chart-canvas:hover,.chart-component[data-chart-type=bar] .chart-canvas:hover,.chart-component[data-chart-type=pie] .chart-canvas{cursor:pointer}@media print{.chart-component{border:1px solid #000;box-shadow:none;background:#fff;color:#000;page-break-inside:avoid}.chart-controls,.websocket-status,.chart-overlay{display:none!important}.chart-canvas{max-width:100%!important;max-height:100%!important}.chart-footer{border-top:1px solid #000;color:#666}}.chart-sm{min-height:200px}.chart-sm .chart-content{min-height:150px}.chart-lg{min-height:600px}.chart-lg .chart-content{min-height:500px}.chart-xl{min-height:700px}.chart-xl .chart-content{min-height:600px}.chart-square{aspect-ratio:1 / 1}.chart-wide{aspect-ratio:16 / 9}.chart-tall{aspect-ratio:3 / 4}.chart-loading{pointer-events:none}.chart-loading .chart-canvas{opacity:.5;filter:blur(1px)}.chart-error .chart-canvas{opacity:.3;filter:grayscale(100%)}.chart-success{border-color:var(--bs-success, #198754)}.chart-success .chart-title{color:var(--bs-success, #198754)}.chart-warning{border-color:var(--bs-warning, #ffc107)}.chart-warning .chart-title{color:var(--bs-warning-text, #664d03)}.mojo-metrics-chart{display:flex;flex-direction:column;gap:1rem}.mojo-metrics-chart-container{width:100%;height:100%}.mojo-metrics-chart .chart-wrapper{flex:1;min-height:300px}.mojo-metrics-controls{background:var(--bs-light, #f8f9fa);border:1px solid var(--chart-border);border-radius:.375rem;padding:1rem;margin-bottom:1rem}[data-bs-theme=dark] .mojo-metrics-controls{background:var(--bs-dark, #212529);border-color:var(--chart-border)}.mojo-metrics-controls .form-label{font-size:.875rem;font-weight:600;color:var(--bs-body-color);margin-bottom:.25rem}.mojo-metrics-controls .btn-group .btn{font-size:.75rem;padding:.375rem .75rem;font-weight:500}.mojo-metrics-controls .quick-range-btn.active{background-color:var(--bs-primary);border-color:var(--bs-primary);color:#fff;font-weight:600}.mojo-metrics-controls .form-control,.mojo-metrics-controls .form-select{font-size:.875rem;border:1px solid var(--chart-border)}.mojo-metrics-controls .form-control:focus,.mojo-metrics-controls .form-select:focus{border-color:var(--bs-primary);box-shadow:0 0 0 .2rem #0d6efd40}.mojo-metrics-controls .dropdown-menu{background:var(--chart-bg);border:1px solid var(--chart-border);box-shadow:0 .5rem 1rem #00000026}.mojo-metrics-controls .form-check-input{margin-top:.125rem}.mojo-metrics-controls .form-check-label{font-size:.875rem;color:var(--bs-body-color)}.metrics-footer{border-top:1px solid var(--chart-border);padding-top:.5rem;font-size:.75rem;color:var(--chart-text-muted)}.metrics-footer .data-points{font-weight:600}.metrics-footer .last-updated{font-style:italic}.metrics-footer .timestamp{font-weight:500}@media (max-width: 767.98px){.mojo-metrics-controls .row{--bs-gutter-x: .75rem;--bs-gutter-y: 1rem}.mojo-metrics-controls .col-auto{flex:1 1 auto;min-width:0}.mojo-metrics-controls .btn-group{width:100%;justify-content:center}.mojo-metrics-controls .form-control,.mojo-metrics-controls .form-select{width:100%;max-width:none!important}.mojo-metrics-controls .input-group{flex-wrap:wrap}.mojo-metrics-controls .input-group .form-control{min-width:140px}}@media (max-width: 575.98px){.mojo-metrics-controls{padding:.75rem}.mojo-metrics-controls .row{--bs-gutter-x: .5rem;--bs-gutter-y: .75rem}.mojo-metrics-controls .form-label{margin-bottom:.125rem}.mojo-metrics-controls .btn-group .btn{padding:.25rem .5rem;font-size:.7rem}}.chart-header{flex:0 0 auto}.chart-toolbar-integrated{margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--chart-border)}.mojo-toolbar-form{background:transparent;border:none;padding:0}.mojo-toolbar-form .row{--bs-gutter-x: 1rem;--bs-gutter-y: .5rem}.mojo-toolbar-form .form-label-sm{font-size:.75rem;font-weight:600;color:var(--chart-text-muted);margin-bottom:.25rem;display:block}.mojo-toolbar-form .btn-group-sm .btn{font-size:.75rem;padding:.25rem .5rem;font-weight:500}.mojo-toolbar-form .form-select,.mojo-toolbar-form .form-control{font-size:.875rem;padding:.375rem .5rem;border:1px solid var(--chart-border)}.mojo-toolbar-form .form-select:focus,.mojo-toolbar-form .form-control:focus{border-color:var(--bs-primary);box-shadow:0 0 0 .2rem #0d6efd40}.mojo-toolbar-form .dropdown-menu{background:var(--chart-bg);border:1px solid var(--chart-border);box-shadow:0 .5rem 1rem #00000026;font-size:.875rem}.mojo-toolbar-form .form-check-input{margin-top:.125rem}.mojo-toolbar-form .form-check-label{font-size:.875rem;color:var(--chart-text)}.mojo-toolbar-form .btn-group .btn.active{background-color:var(--bs-primary);border-color:var(--bs-primary);color:#fff;font-weight:600}@media (max-width: 767.98px){.chart-toolbar-integrated{margin-top:.5rem;padding-top:.5rem}.mojo-toolbar-form .row{--bs-gutter-x: .5rem;--bs-gutter-y: .75rem}.mojo-toolbar-form .col-auto{flex:1 1 auto;min-width:0}.mojo-toolbar-form .btn-group{width:100%;justify-content:center}.mojo-toolbar-form .form-control,.mojo-toolbar-form .form-select{width:100%;max-width:none}}@media (max-width: 575.98px){.chart-toolbar-integrated{margin-top:.25rem;padding-top:.5rem}.mojo-toolbar-form .form-label-sm{margin-bottom:.125rem;font-size:.7rem}.mojo-toolbar-form .btn-group .btn{padding:.25rem .375rem;font-size:.7rem}}[data-theme=dark] .mojo-toolbar-form .dropdown-menu{background:var(--chart-bg);border-color:var(--chart-border)}[data-bs-theme=dark] .mojo-toolbar-form .form-check-label{color:var(--chart-text)}.metrics-toolbar-compact{background:var(--bs-light, #f8f9fa);border-radius:.375rem;padding:.75rem;border:1px solid var(--chart-border)}[data-bs-theme=dark] .metrics-toolbar-compact{background:var(--bs-dark, #212529)}.metrics-toolbar-compact .row{--bs-gutter-x: .75rem;--bs-gutter-y: .5rem}.metrics-toolbar-compact .form-label-sm{font-size:.7rem;font-weight:600;color:var(--chart-text-muted);margin-bottom:.125rem}.metrics-toolbar-compact .btn-group .btn{font-size:.7rem;padding:.25rem .375rem;font-weight:500}.metrics-toolbar-compact .form-select,.metrics-toolbar-compact .form-control{font-size:.8rem;padding:.25rem .375rem;min-height:auto}.metrics-toolbar-compact .dropdown-toggle{font-size:.75rem;padding:.25rem .5rem}@media (max-width: 575.98px){.metrics-toolbar-compact{padding:.5rem}.metrics-toolbar-compact .row{--bs-gutter-x: .5rem;--bs-gutter-y: .25rem}.metrics-toolbar-compact .col-auto{flex:1 1 auto;min-width:0}}:root{--docit-primary: #2563eb;--docit-primary-hover: #1d4ed8;--docit-primary-light: #dbeafe;--docit-bg-primary: #ffffff;--docit-bg-secondary: #f8fafc;--docit-bg-tertiary: #f1f5f9;--docit-text-primary: #1e293b;--docit-text-secondary: #64748b;--docit-text-muted: #94a3b8;--docit-border: #e2e8f0;--docit-sidebar-width: 280px;--docit-sidebar-collapsed-width: 0px;--docit-header-height: 56px;--docit-content-max-width: 900px;--docit-font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Helvetica Neue", Arial, sans-serif;--docit-font-mono: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", monospace}.docit-app-layout{display:flex;flex-direction:column;height:100vh}#topnav-container .navbar{height:var(--docit-header-height)}.docit-body-layout{display:flex;flex-grow:1;overflow:hidden}.docit-sidebar{width:var(--docit-sidebar-width);background:var(--docit-bg-secondary);border-right:1px solid var(--docit-border);overflow-y:auto;transition:width .3s ease,transform .3s ease;height:calc(100vh - var(--docit-header-height));position:sticky;top:var(--docit-header-height)}.docit-main{flex-grow:1;overflow-y:auto;height:calc(100vh - var(--docit-header-height))}.docit-content{width:100%;max-width:var(--docit-content-max-width);margin:0 auto;padding:2rem}.sidebar-collapsed .docit-sidebar{width:var(--docit-sidebar-collapsed-width);transform:translate(calc(-1 * var(--docit-sidebar-width)))}.sidebar-collapsed .toggle-chevron{transform:rotate(0)}.topnav-sidebar-toggle{background:none;border:none;color:#fff;padding:0 .5rem}.toggle-chevron{transition:transform .3s ease;transform:rotate(180deg)}.docit-sidebar-nav{height:100%;display:flex;flex-direction:column}.docit-nav-header{padding:1.5rem 1.25rem 1rem;border-bottom:1px solid var(--docit-border);background:var(--docit-bg-primary);position:sticky;top:0;z-index:10;display:flex;align-items:center}.docit-nav-title{font-size:1.125rem;font-weight:600;margin:0}.docit-nav-body{flex:1;overflow-y:auto;padding:1rem 0}.docit-page-toolbar{margin-top:-20px}.docit-nav-footer{padding:.75rem;border-top:1px solid var(--docit-border)}.docit-book-item,.docit-page-link{display:flex;align-items:center;padding:.625rem 1.25rem;margin:0 .75rem .25rem;border-radius:.375rem;cursor:pointer;transition:background-color .15s ease,color .15s ease;color:var(--docit-text-secondary);text-decoration:none}.docit-book-item:hover,.docit-page-link:hover{background:var(--docit-bg-tertiary);color:var(--docit-text-primary)}.docit-book-item.active,.docit-page-link.active{font-weight:700;color:var(--docit-text-primary)}.docit-book-item .book-title{flex:1;font-weight:500}.docit-page-container{animation:fadeIn .3s ease}.docit-page-header{margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--docit-border)}.docit-page-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem}.docit-page-title{font-size:2.25rem;font-weight:700;margin:0}.docit-page-meta{margin-top:.75rem;font-size:.875rem;color:var(--docit-text-muted)}.docit-page-meta span{margin-right:1rem}.docit-content h1,.docit-content h2,.docit-content h3,.docit-content h4{margin-bottom:1rem;font-weight:600}.docit-content p{margin-bottom:1.25rem}.docit-content a{color:var(--docit-primary);text-decoration:none}.docit-content a:hover{text-decoration:underline}.docit-content code{background:var(--docit-bg-tertiary);padding:.125rem .375rem;border-radius:.25rem;font-family:var(--docit-font-mono)}.docit-content pre{background:var(--docit-bg-secondary);border:1px solid var(--docit-border);border-radius:.5rem;padding:1rem;overflow-x:auto}.docit-edit-container{display:flex;flex-direction:column}.docit-edit-header{background:var(--docit-bg-secondary);border-bottom:1px solid var(--docit-border);padding:1rem 1.5rem}.docit-edit-title-row{display:flex;align-items:center;justify-content:space-between}.docit-edit-body{flex-grow:1}.docit-loading,.docit-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 1rem;text-align:center;color:var(--docit-text-muted)}.docit-empty-state i{font-size:3rem;opacity:.5;margin-bottom:1rem}.docit-empty-state h3{font-size:1.5rem;margin-bottom:.5rem;color:var(--docit-text-primary)}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#408080;font-style:italic}.highlight .err{border:1px solid #ff0000}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .ch,.highlight .cm{color:#408080;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .cpf,.highlight .c1,.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc,.highlight .kd,.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#b00040}.highlight .m{color:#666}.highlight .s{color:#ba2121}.highlight .na{color:#7d9029}.highlight .nb{color:green}.highlight .nc{color:#00f;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#d2413a;font-weight:700}.highlight .nf{color:#00f}.highlight .nl{color:#a0a000}.highlight .nn{color:#00f;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177c}.highlight .ow{color:#a2f;font-weight:700}.highlight .w{color:#bbb}.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#666}.highlight .sa,.highlight .sb,.highlight .sc,.highlight .dl{color:#ba2121}.highlight .sd{color:#ba2121;font-style:italic}.highlight .s2{color:#ba2121}.highlight .se{color:#b62;font-weight:700}.highlight .sh{color:#ba2121}.highlight .si{color:#b68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#b68}.highlight .s1{color:#ba2121}.highlight .ss{color:#19177c}.highlight .bp{color:green}.highlight .fm{color:#00f}.highlight .vc,.highlight .vg,.highlight .vi,.highlight .vm{color:#19177c}.highlight .il{color:#666}.mojo-task-management-page{padding:0}.mojo-task-management-container{max-width:100%;margin:0}.mojo-task-stats-header .card{transition:all .2s ease-in-out;border:1px solid var(--bs-border-color)}.mojo-task-stats-header .card:hover{transform:translateY(-2px);box-shadow:0 .25rem .75rem #0000001a!important}.mojo-task-stats-header .card-body{padding:1.5rem}.mojo-task-stats-header h3{font-size:2rem;font-weight:700;color:var(--bs-dark)}.mojo-task-stats-header .badge{font-size:.75rem;padding:.375rem .5rem;border-radius:.375rem}.mojo-task-stats-header .fs-2{opacity:.6;font-size:2.5rem!important}.task-runners-section .mojo-task-runner-list{max-height:400px;overflow-y:auto}.task-runners-section .mojo-task-runner-item{border:1px solid var(--bs-gray-200);transition:all .2s ease-in-out}.task-runners-section .mojo-task-runner-item:hover{border-color:var(--bs-primary);background-color:var(--bs-gray-50)!important}.task-runners-section .mojo-task-runner-info{min-width:0;flex:1}.task-runners-section .mojo-task-runner-name{font-size:.95rem;margin-bottom:.25rem}.task-runners-section .mojo-task-runner-channels{word-break:break-all;line-height:1.3}.task-runners-section .mojo-task-runner-list::-webkit-scrollbar{width:6px}.task-runners-section .mojo-task-runner-list::-webkit-scrollbar-track{background:var(--bs-gray-100);border-radius:3px}.task-runners-section .mojo-task-runner-list::-webkit-scrollbar-thumb{background:var(--bs-gray-400);border-radius:3px}.task-runners-section .mojo-task-runner-list::-webkit-scrollbar-thumb:hover{background:var(--bs-gray-500)}.task-runners-section .mojo-task-runner-status .badge{font-size:.8rem;padding:.5rem .75rem;border-radius:.5rem;font-weight:500}.task-runners-section .mojo-task-runner-actions{display:flex;align-items:center;gap:.5rem}.task-runners-section .dropdown-toggle{border:1px solid var(--bs-border-color);background:#fff;transition:all .2s ease}.task-runners-section .dropdown-toggle:hover{background:var(--bs-gray-50);border-color:var(--bs-primary)}.task-runners-section .dropdown-menu{box-shadow:0 .5rem 1rem #00000026;border:1px solid var(--bs-border-color);border-radius:.5rem;min-width:160px}.task-runners-section .dropdown-item{padding:.5rem 1rem;transition:all .2s ease}.task-runners-section .dropdown-item:hover{background-color:var(--bs-gray-100)}.task-runners-section .dropdown-item i{width:1rem;text-align:center}.mojo-task-charts-section .card{border:1px solid var(--bs-border-color);transition:all .2s ease-in-out}.mojo-task-charts-section .card:hover{box-shadow:0 .25rem .75rem #00000014!important}.mojo-task-charts-section .card-body{padding:1.5rem}.mojo-task-management-page .tab-view .nav-tabs{border-bottom:2px solid var(--bs-gray-200);margin-bottom:1.5rem}.mojo-task-management-page .tab-view .nav-link{color:var(--bs-gray-600);border:none;padding:.75rem 1.5rem;margin-right:.5rem;border-radius:.5rem .5rem 0 0;transition:all .2s ease;font-weight:500}.mojo-task-management-page .tab-view .nav-link:hover{color:var(--bs-primary);background-color:var(--bs-gray-50)}.mojo-task-management-page .tab-view .nav-link.active{color:var(--bs-primary);background-color:#fff;border-bottom:2px solid var(--bs-primary);transform:translateY(1px)}.mojo-task-management-page .tab-content{min-height:400px}.mojo-task-management-page .table-container{background:#fff;border-radius:.5rem}.badge.mojo-task-status-pending{background-color:var(--bs-primary)!important;color:#fff}.badge.mojo-task-status-running{background-color:var(--bs-success)!important;color:#fff}.badge.mojo-task-status-completed{background-color:var(--bs-info)!important;color:#fff}.badge.mojo-task-status-error{background-color:var(--bs-danger)!important;color:#fff}.mojo-task-management-page .btn-group .btn{transition:all .2s ease}.mojo-task-management-page .btn-group .btn:hover{transform:translateY(-1px)}.mojo-task-management-page .btn-sm{padding:.375rem .75rem;font-size:.875rem;border-radius:.375rem}.mojo-task-management-page .bi-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.spinning{animation:spin 1s linear infinite}@media (max-width: 768px){.mojo-task-stats-header .card-body{padding:1rem}.mojo-task-stats-header h3{font-size:1.5rem}.task-runners-section .mojo-task-runner-item .row{margin:0}.task-runners-section .mojo-task-runner-item .col-md-8,.task-runners-section .mojo-task-runner-item .col-md-4{padding-left:0;padding-right:0}.task-runners-section .mojo-task-runner-channels small{font-size:.75rem}.mojo-task-management-page .btn-group{flex-direction:column;width:100%}.mojo-task-management-page .btn-group .btn{margin-bottom:.25rem}}@media (max-width: 576px){.mojo-task-management-container{padding:.5rem}.mojo-task-stats-header .col-12{margin-bottom:.5rem!important}.mojo-task-charts-section .col-xl-6{margin-bottom:1rem!important}.mojo-task-management-page .tab-view .nav-link{padding:.5rem 1rem;margin-right:.25rem;font-size:.875rem}.task-runners-section .mojo-task-runner-item{padding:1rem!important}.task-runners-section .mojo-task-runner-name{font-size:.9rem}.task-runners-section .mojo-task-runner-channels small{font-size:.7rem;display:block;margin-top:.25rem}}.admin-dashboard-page,.admin-page{background-color:var(--bs-gray-50);min-height:100vh}.admin-page .card{border:1px solid var(--bs-border-color);box-shadow:0 .125rem .25rem #00000013;transition:all .2s ease-in-out}.admin-page .card:hover{box-shadow:0 .25rem .5rem #0000001a}.admin-page .card-header{background-color:#fff;border-bottom:1px solid var(--bs-border-color);padding:1rem 1.5rem}.admin-page .card-body{padding:1.5rem}.admin-page h1,.admin-page .h3{color:var(--bs-dark);font-weight:600}.admin-page .text-muted{color:var(--bs-gray-600)!important}.admin-page .alert{border:none;border-radius:.5rem;padding:1rem 1.5rem}.admin-page .alert-success{background-color:#1987541a;color:var(--bs-success-text-emphasis)}.admin-page .alert-info{background-color:#0dcaf01a;color:var(--bs-info-text-emphasis)}.admin-page .alert-warning{background-color:#ffc1071a;color:var(--bs-warning-text-emphasis)}.admin-page .alert-danger{background-color:#dc35451a;color:var(--bs-danger-text-emphasis)}.admin-page .text-truncate{max-width:200px}.admin-page .small-text{font-size:.875rem}.admin-page .micro-text{font-size:.75rem}.admin-page .breadcrumb{background-color:transparent;padding:0;margin-bottom:1rem}.admin-page .breadcrumb-item+.breadcrumb-item:before{color:var(--bs-gray-500)}.admin-page .breadcrumb-item a{color:var(--bs-primary);text-decoration:none}.admin-page .breadcrumb-item a:hover{text-decoration:underline}.mojo-task-details-modal .modal-dialog{max-width:800px}.mojo-task-details-modal .fw-mono{font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.9rem}.mojo-task-details-modal .log-entry{border-left:3px solid var(--bs-gray-300);transition:all .2s ease}.mojo-task-details-modal .log-entry:hover{border-left-color:var(--bs-primary);background-color:var(--bs-gray-50)!important}.mojo-task-details-modal pre code{font-size:.85rem;line-height:1.4}.mojo-task-details-modal .badge{font-weight:500}.mojo-runner-details-modal .modal-dialog{max-width:1200px}.mojo-runner-details-modal .performance-metric{transition:all .3s ease}.mojo-runner-details-modal .performance-metric:hover{transform:translateY(-2px);box-shadow:0 .25rem .5rem #0000001a}.runner-detailsPrint Styles */ .mojo-task-details-view,.mojo-runner-details-view{max-height:70vh;overflow-y:auto}.mojo-task-details-view .card,.mojo-runner-details-view .card{border:1px solid var(--bs-border-color)}.mojo-task-details-view .card-header,.mojo-runner-details-view .card-header{background-color:var(--bs-gray-50);font-weight:500}.mojo-task-details-view .log-entry,.mojo-runner-details-view .log-entry{transition:background-color .2s ease}.mojo-task-details-view .log-entry:hover,.mojo-runner-details-view .log-entry:hover{background-color:var(--bs-gray-50)!important}.mojo-task-details-view .progress,.mojo-runner-details-view .progress{border-radius:10px;overflow:hidden}.mojo-task-details-view .progress-bar,.mojo-runner-details-view .progress-bar{transition:width .3s ease}.mojo-task-details-view .badge,.mojo-runner-details-view .badge{font-weight:500}.mojo-task-details-view pre{font-size:.875rem;line-height:1.4;border:1px solid var(--bs-border-color)}.mojo-task-details-view pre code,.mojo-runner-details-view pre code{color:var(--bs-gray-800)}.mojo-runner-details-view .progress{background-color:var(--bs-gray-200)}.mojo-runner-details-view .progress-bar{font-size:.875rem;font-weight:500}.mojo-task-details-view .table,.mojo-runner-details-view .table{font-size:.875rem}.mojo-task-details-view .table th,.mojo-runner-details-view .table th{font-weight:600;color:var(--bs-gray-700);font-size:.8rem;text-transform:uppercase;letter-spacing:.5px}.mojo-task-details-view .table td,.mojo-runner-details-view .table td{vertical-align:middle}.mojo-task-details-view .btn-group-sm .btn,.mojo-runner-details-view .btn-group-sm .btn{padding:.25rem .5rem;font-size:.8rem}.mojo-runner-details-view .btn-group .btn.active{background-color:var(--bs-primary);border-color:var(--bs-primary);color:#fff}.mojo-task-logs-container,.mojo-runner-logs-container{border:1px solid var(--bs-border-color);border-radius:.375rem}.mojo-task-logs-container::-webkit-scrollbar,.mojo-runner-logs-container::-webkit-scrollbar{width:6px}.mojo-task-logs-container::-webkit-scrollbar-track,.mojo-runner-logs-container::-webkit-scrollbar-track{background:var(--bs-gray-100);border-radius:3px}.mojo-task-logs-container::-webkit-scrollbar-thumb,.mojo-runner-logs-container::-webkit-scrollbar-thumb{background:var(--bs-gray-400);border-radius:3px}.mojo-task-logs-container::-webkit-scrollbar-thumb:hover,.mojo-runner-logs-container::-webkit-scrollbar-thumb:hover{background:var(--bs-gray-500)}@media print{.admin-page .btn,.admin-page .dropdown,.admin-page .card-header .btn-group{display:none!important}.admin-page .card{border:1px solid #000!important;box-shadow:none!important}.admin-page{background-color:#fff!important}.mojo-task-details-view,.mojo-runner-details-view{max-height:none;overflow:visible}}
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "./web-mojo.css",
3
+ "styles": {
4
+ "web-mojo": "./css/web-mojo.css"
5
+ }
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./chunks/WebApp-DqDowtkl.js"),e=require("./chunks/TopNav-MDjL4kV0.js"),o=require("./chunks/Page-BFgj0pAA.js"),i=require("./chunks/ContextMenu-gEcpSz56.js"),s=require("./chunks/User-BalfYTEF.js"),a=require("./chunks/TokenManager-Bzn4guFm.js");class DocNavSidebar extends t.View{constructor(t={}){super({className:"docit-sidebar-nav",tagName:"nav",...t}),this.singleBookMode=t.singleBookMode||!1,this.books=t.books,this.docPages=t.docPages,this.activeUser=t.activeUser,this.currentBook=null,this.currentDocPage=null}async onInit(){await super.onInit(),this.getApp().events.on("page:show",this._onPageShow.bind(this))}async _onPageShow({query:t}){const e=t.doc_book,o=t.doc_page,i=this.getApp();if(e){const t=this.books.findWhere({slug:e});!t||this.currentBook&&this.currentBook.id===t.id||(await i.setActiveBook(t),this.currentBook=i.currentBook)}else this.currentBook&&(await i.setActiveBook(null),this.currentBook=null);this.currentDocPage=o?this.docPages.findWhere({slug:o}):null,this.render()}getTemplate(){return'\n <div class="docit-nav-body pt-3">\n {{#currentBook}}\n {{#docPages.models}}\n <a href="#" class="docit-page-link {{#isActive}}active{{/isActive}}"\n data-action="select-page" data-page-slug="{{slug}}">\n <i class="{{#metadata.icon}}{{metadata.icon}}{{/metadata.icon}}{{^metadata.icon}}bi bi-file-earmark-text{{/metadata.icon}} me-2"></i>\n <span>{{title|capitalize}}</span>\n </a>\n {{/docPages.models}}\n {{^docPages.models}}\n <div class="docit-nav-empty"><p>No pages in this book.</p></div>\n {{/docPages.models}}\n {{/currentBook}}\n {{^currentBook}}\n {{#books.models}}\n <a href="#" class="docit-book-item" data-action="select-book" data-book-slug="{{slug}}">\n <i class="bi bi-book me-2"></i>\n <span class="book-title">{{title}}</span>\n <span class="badge bg-secondary ms-auto">{{page_count}}</span>\n </a>\n {{/books.models}}\n {{/currentBook}}\n </div>\n {{#currentBook}}\n <div class="docit-nav-footer">\n {{#canEdit}}\n <button class="btn btn-link w-100 mb-2" data-action="create-page">\n <i class="bi bi-plus-circle me-2"></i>\n Create New Page\n </button>\n {{/canEdit}}\n <button class="btn btn-link w-100" data-action="back-to-books">\n <i class="bi bi-arrow-left me-2"></i>\n Back to Books\n </button>\n </div>\n {{/currentBook}}\n {{^currentBook}}\n {{#canEdit}}\n <div class="docit-nav-footer">\n <button class="btn btn-link w-100" data-action="create-book">\n <i class="bi bi-plus-circle me-2"></i>\n Create New Book\n </button>\n </div>\n {{/canEdit}}\n {{/currentBook}}\n '}async onBeforeRender(){await super.onBeforeRender(),this.canEdit=this.getApp().canEdit(),this.docPages&&this.currentDocPage&&this.docPages.forEach(t=>{t.isActive=t.id===this.currentDocPage.id})}async onActionSelectBook(t,e){t.preventDefault();const o=e.dataset.bookSlug,i=this.books.findWhere({slug:o});if(i){await this.getApp().setActiveBook(i);const t=this.docPages.at(0),e={doc_book:i.get("slug")};t&&(e.doc_page=t.get("slug")),this.getApp().showPage("docs",e,{})}}onActionSelectPage(t,e){t.preventDefault();const o=e.dataset.pageSlug;this.currentBook&&o&&this.getApp().showPage("docs",{doc_book:this.currentBook.get("slug"),doc_page:o},{})}async onActionBackToBooks(t,e){t.preventDefault(),await this.getApp().setActiveBook(null),this.getApp().showPage("home")}async onActionCreateBook(){await this.getApp().createNewBook()}async onActionCreatePage(){this.currentBook&&await this.getApp().createNewPage(this.currentBook)}setBooks(t){this.books=t,this.render()}setDocPages(t){this.docPages=t,this.render()}setCurrentBook(t){this.currentBook=t,this.render(),this.getApp().topnav&&(t?this.getApp().topnav.setBrand(t.get("title")):this.getApp().topnav.setBrand("Documentation"))}setUser(t){this.activeUser=t,this.render()}}class DocHomePage extends o.Page{constructor(t={}){super({pageName:"home",title:"Documentation",className:"docit-home-page",...t})}async getTemplate(){return'\n <div class="docit-empty-state vh-100 d-flex flex-column align-items-center justify-content-center">\n <i class="bi bi-collection" style="font-size: 4rem;"></i>\n <h3 class="mt-4">Welcome to the Documentation Portal</h3>\n <p class="text-muted">Please select a book from the sidebar to get started.</p>\n </div>\n '}}class DocitBook extends s.Model{static endpoint="/api/docit/book";buildUrl(t=null){return this.get("slug")&&!this.id?`/api/docit/book/slug/${this.get("slug")}`:this.id?`/api/docit/book/${this.id}`:this.endpoint}}class DocitBookList extends s.Collection{constructor(t={}){super({ModelClass:DocitBook,endpoint:"/api/docit/book",...t})}parse(t){return t.data&&t.data.status?(this.meta={...this.meta,total:t.data.count||0,graph:t.data.graph},t.data.data||[]):super.parse(t)}}class DocitPage extends s.Model{static endpoint="/api/docit/page";buildUrl(t=null){return this.get("slug")&&!this.id?`/api/docit/page/slug/${this.get("slug")}`:this.id?`/api/docit/page/${this.id}`:this.endpoint}}class DocitPageList extends s.Collection{constructor(t={}){super({ModelClass:DocitPage,endpoint:"/api/docit/page",...t})}parse(t){return t.data&&t.data.status?(this.meta={...this.meta,total:t.data.count||0,graph:t.data.graph,book:t.data.book},t.data.data||[]):super.parse(t)}}class DocPage extends o.Page{constructor(t={}){super({pageName:"docs",title:"Documentation",className:"docit-page",...t}),this.bookModel=null,this.model=null}async onInit(){await super.onInit(),this.pageContextMenu=new i.ContextMenu({config:this.getPageContextMenuConfig(),containerId:"page-context-menu"}),this.addChild(this.pageContextMenu)}getPageContextMenuConfig(){return{icon:"bi-three-dots",buttonClass:"btn btn-outline-secondary btn-sm",items:[{label:"View History",action:"view-history",icon:"bi-clock-history"},{type:"divider"},{label:"Edit Page Content",action:"edit-page",icon:"bi-pencil"},{label:"Edit Page Info",action:"edit-page-info",icon:"bi-list-ol"},{type:"divider"},{label:"Edit Book Info",action:"edit-book",icon:"bi-book"},{type:"divider"},{label:"Delete Page",action:"delete-page",icon:"bi-trash",danger:!0}]}}async getTemplate(){return'\n <div class="docit-page-container position-relative">\n {{#loading}}\n <div class="docit-loading">\n <div class="spinner-border" role="status">\n <span class="visually-hidden">Loading...</span>\n </div>\n </div>\n {{/loading}}\n\n {{^loading}}\n {{#model|bool}}\n <div class="docit-page-toolbar">\n <div class="row">\n <div class="col d-flex justify-content-end">\n <div data-container="page-context-menu"></div>\n </div>\n </div>\n </div>\n <article class="docit-page-content">\n {{{model.html}}}\n </article>\n\n <nav class="docit-page-nav">\n {{#prevPage}}\n <a href="#" class="docit-nav-prev" data-action="navigate-to-page" data-page-slug="{{slug}}">\n <i class="bi bi-arrow-left"></i>\n <div>\n <small>Previous</small>\n <span>{{title}}</span>\n </div>\n </a>\n {{/prevPage}}\n {{^prevPage}}\n <div></div>\n {{/prevPage}}\n\n {{#nextPage}}\n <a href="#" class="docit-nav-next" data-action="navigate-to-page" data-page-slug="{{slug}}">\n <div>\n <small>Next</small>\n <span>{{title}}</span>\n </div>\n <i class="bi bi-arrow-right"></i>\n </a>\n {{/nextPage}}\n\n <div class="my-3">\n <span class="text-muted">Last updated: {{model.modified|datetime}}</span>\n </div>\n </nav>\n {{/model|bool}}\n\n {{^model|bool}}\n <div class="docit-empty-state">\n <i class="bi bi-file-earmark-text"></i>\n <h3>Select a page</h3>\n <p>Choose a page from the sidebar to view its content.</p>\n </div>\n {{/model|bool}}\n {{/loading}}\n </div>\n '}async onParams(t={},e={}){await super.onParams(t,e),this.loading=!0,await this.render();const o=this.getApp(),i=o.bookSlug||e.doc_book,s=e.doc_page;if(i)try{if(i){if(!o.currentBook||o.currentBook.get("slug")!==i){const t=new DocitBook({slug:i});await t.fetch(),await o.setActiveBook(t)}if(this.bookModel=o.currentBook,s)this.model=new DocitPage({slug:s}),await this.model.fetch({graph:"html"});else{const t=o.docPages.at(0);t?(this.model=new DocitPage({id:t.id}),await this.model.fetch({graph:"html"})):this.model=null}}else this.bookModel=null,this.model=null;this.canEdit=o.canEdit(),this.setupNavigation()}catch(a){console.error("Failed to load page:",a),this.showError("Failed to load documentation page"),this.model=null}finally{this.loading=!1,await this.render(),o.events.emit("docit:page-rendered",{book:this.bookModel,page:this.model})}else setTimeout(()=>{o.showPage("home")},100)}setupNavigation(){if(!this.model)return this.prevPage=null,void(this.nextPage=null);const t=this.getApp().docPages.models,e=t.findIndex(t=>t.id===this.model.id);this.prevPage=e>0?{slug:t[e-1].get("slug"),title:t[e-1].get("title")}:null,this.nextPage=e<t.length-1?{slug:t[e+1].get("slug"),title:t[e+1].get("title")}:null}async onActionNavigateToPage(t,e){t.preventDefault();const o=e.dataset.pageSlug;o&&this.getApp().showPage("docs",{},{doc_book:this.bookModel.get("slug"),doc_page:o})}async onActionEditPage(t,e){t.preventDefault(),this.model&&this.getApp().showPage("edit",{id:this.model.id,doc_book:this.bookModel.get("slug"),doc_page:this.model.get("slug")},{})}async onActionViewHistory(t,e){this.showInfo("Revision history coming soon.")}async onActionEditPageInfo(t,e){this.model&&this.getApp().showModelForm({model:this.model,fields:[{label:"Title",name:"title",type:"text"},{label:"Order Priority",name:"order_priority"},{label:"Slug",name:"slug"}]})}async onActionEditBook(t,e){if(this.model){const t=this.getApp().sidebar.currentBook;if(!t)return;this.getApp().showModelForm({model:t,fields:[{label:"Title",name:"title",type:"text"},{label:"Order Priority",name:"order_priority"},{label:"Slug",name:"slug"},{label:"Is Active",name:"is_active",type:"switch"}]})}}async onActionDeletePage(t,e){if(this.model&&await this.getApp().showConfirm({title:"Delete Page",body:`Are you sure you want to delete "${this.model.get("title")}"?`,confirmText:"Delete",confirmClass:"btn-danger"})){await this.model.destroy(),this.showSuccess("Page deleted."),await this.getApp().setActiveBook(this.bookModel);const t=this.getApp().docPages.at(0);t?this.getApp().showPage("docs",{},{doc_book:this.bookModel.get("slug"),doc_page:t.get("slug")}):this.getApp().showPage("docs",{},{doc_book:this.bookModel.get("slug")})}}async onAfterRender(){await super.onAfterRender(),"undefined"!=typeof Prism&&this.model&&Prism.highlightAll()}}class DocEditPage extends o.Page{constructor(t={}){super({pageName:"edit",title:"Edit Page",className:"docit-edit-page",...t}),this.model=null,this.editor=null,this.isDirty=!1}async getTemplate(){return'\n <div class="docit-edit-container vh-100">\n {{#loading}}\n <div class="docit-loading"><div class="spinner-border"></div></div>\n {{/loading}}\n\n {{^loading}}{{#model}}\n <header class="docit-edit-header">\n <div class="docit-edit-title-row">\n <h2>Editing: {{model.title}}</h2>\n <div class="docit-edit-actions">\n <button class="btn btn-outline-secondary" data-action="cancel-edit">Cancel</button>\n <button class="btn btn-success" data-action="save-page">\n <i class="bi bi-check-lg"></i> Save Changes\n </button>\n </div>\n </div>\n </header>\n <div class="docit-edit-body flex-grow-1">\n <div id="editor"></div>\n </div>\n {{/model}}\n {{^model}}\n <div class="docit-error-state">\n <h3>Page Not Found</h3>\n <p>The page you\'re trying to edit could not be found.</p>\n <button class="btn btn-primary" data-action="go-back">Go Back</button>\n </div>\n {{/model}}{{/loading}}\n </div>\n '}async onParams(t={},e={}){await super.onParams(t,e);let o=null;e.id?o=new DocitPage({id:e.id}):e.doc_page&&(o=new DocitPage({slug:e.doc_page})),this.model=o,this.model&&await this.model.fetch({graph:"detail"})}initEditor(){!this.editor&&this.element.querySelector("#editor")&&(this.editor=new toastui.Editor({el:this.element.querySelector("#editor"),height:"100%",initialEditType:"markdown",previewStyle:"tab",initialValue:this.model.get("content")||""}),this.editor.on("change",()=>{this.isDirty=!0}))}async onActionSavePage(){if(this.model&&this.editor){this.saving=!0,this.getApp().showLoading("saving...");try{const t=this.editor.getMarkdown();await this.model.save({content:t}),this.isDirty=!1,this.getApp().toast.success("Page saved successfully."),this.getApp().showPage("docs",this.query)}catch(t){console.error("Failed to save page:",t),this.getApp().toast.error("Failed to save page.")}finally{this.saving=!1,this.getApp().hideLoading()}}}async onActionCancelEdit(){this.getApp().showPage("docs",this.query)}onActionGoBack(){this.getApp().showPage("docs")}async onBeforeRender(){await super.onBeforeRender(),this.editor&&(this.editor.destroy(),this.editor=null)}async onAfterRender(){await super.onAfterRender(),this.model&&this.initEditor()}async onBeforeDestroy(){this.editor?.destroy(),await super.onBeforeDestroy()}}class DocItApp extends t.WebApp{constructor(t={}){super({name:t.title||"DocIt Portal",version:t.version||"1.0.0",debug:t.debug||!1,container:t.container||"#app",defaultRoute:"home",basePath:t.basePath||"",...t}),this.bookSlug=t.bookSlug||null,this.showBookNav=void 0!==t.showBookNav?t.showBookNav:!this.bookSlug,this.theme=t.theme||"light",this.editPermissions=t.permissions?.edit||["manage_docit"],this.sidebarConfig={showSearch:!0,defaultCollapsed:!1,...t.sidebar},this.books=new DocitBookList,this.books.params.sort="-order_priority",this.docPages=new DocitPageList,this.docPages.params.sort="-order_priority",this.toast=new s.ToastService,this.currentBook=null,this.sidebar=null,this.isDocItReady=!1,this.tokenManager=new a.TokenManager,this.activeUser=null}async start(){try{console.log("Starting DocIt Portal..."),this.setupDocItLayout(),await this.setupTopNav(),await this.setupSidebar(),await this.checkAuthStatus(),this.registerDocItPages(),await super.start(),await this.loadInitialData(),this.isDocItReady=!0,this.events.emit("docit:ready",{app:this}),console.log("✅ DocIt Portal ready")}catch(t){throw console.error("Failed to start DocIt:",t),this.showError("Failed to initialize documentation portal"),t}}setupDocItLayout(){const t="string"==typeof this.container?document.querySelector(this.container):this.container;if(!t)throw new Error(`Container not found: ${this.container}`);t.classList.add("docit-app",`docit-theme-${this.theme}`),t.innerHTML='\n <div class="docit-app-layout">\n <div id="topnav-container"></div>\n <div class="docit-body-layout">\n <div class="docit-sidebar" id="docit-sidebar"></div>\n <div class="docit-main">\n <div class="docit-content" id="page-container"></div>\n </div>\n </div>\n </div>\n ',this.pageContainer="#page-container"}async setupTopNav(){this.topnav=new e.TopNav({containerId:"topnav-container",brand:this.name,theme:"navbar navbar-expand-lg bg-dark navbar-dark",showSidebarToggle:!1,displayMode:"brand",rightItems:[{id:"login",icon:"bi-box-arrow-in-right",href:"/examples/auth/",label:"Login"}],userMenu:{label:"User",icon:"bi-person-circle",items:[{label:"Profile",icon:"bi-person",action:"profile"},{divider:!0},{label:"Logout",icon:"bi-box-arrow-right",action:"logout"}]}}),await this.topnav.render()}onActionToggleSidebar(){document.querySelector(".docit-layout").classList.toggle("sidebar-collapsed")}async setupSidebar(){this.sidebar=new DocNavSidebar({containerId:"docit-sidebar",app:this,singleBookMode:!!this.bookSlug,showBookNav:this.showBookNav,books:this.books,docPages:this.docPages,activeUser:this.activeUser,...this.sidebarConfig}),await this.sidebar.render()}registerDocItPages(){this.registerPage("home",DocHomePage,{route:"/",permissions:null}),this.registerPage("docs",DocPage,{route:"/docs",permissions:null}),this.registerPage("edit",DocEditPage,{route:"/edit",permissions:this.editPermissions})}async loadInitialData(){try{if(this.bookSlug){const t=new DocitBook({slug:this.bookSlug});if(await t.fetch(),!t.id)throw new Error(`Book with slug '${this.bookSlug}' not found.`);this.books.add(t),await this.setActiveBook(t)}else await this.books.fetch({graph:"list"}),this.sidebar.render()}catch(t){console.error("Failed to load initial data:",t),this.showError("Failed to load documentation")}}async setActiveBook(t){this.currentBook&&t&&this.currentBook.id===t.id||(this.currentBook=t,this.docPages.reset(),t&&await this.docPages.fetch({book:t.get("id"),graph:"list"}),this.sidebar.setCurrentBook(t),this.sidebar.setDocPages(this.docPages),this.events.emit("docit:book-changed",{book:t}))}async saveDocPageContent(t,e){const o=this.docPages.get(t)||new DocitPage({id:t});o.set("content",e);const i=await o.save();if(!i.success||!i.data.status)throw new Error("Failed to save doc page");return o}canEdit(){const t=this.activeUser;return!!t&&this.editPermissions.some(e=>!!t.hasPermission&&t.hasPermission(e))}async checkAuthStatus(){try{const t=this.tokenManager.getTokenInstance();if(!t||!t.isValid())return void this.events.emit("auth:unauthorized",{app:this});if(t.isExpired())return void this.events.emit("auth:expired",{app:this});this.tokenManager.startAutoRefresh(this),this.rest.setAuthToken(t.token);const e=new s.User({id:t.getUserId()});await e.fetch(),this.setActiveUser(e)}catch(t){console.error("Failed to check auth status:",t),this.events.emit("auth:error",{error:t,app:this})}}setActiveUser(t){return this.activeUser=t,this.sidebar&&this.sidebar.setUser(t),this.topnav&&(this.topnav.setUser(t),this.tonnav.render()),this.events.emit("user:changed",{user:t,app:this}),this}clearActiveUser(){return this.activeUser=null,this.tokenManager.clearTokens(),this.rest.clearAuth(),this.sidebar&&this.sidebar.setUser(null),this.events.emit("user:cleared",{app:this}),this}async logout(){this.clearActiveUser(),this.books.reset(),this.docPages.reset(),this.currentBook=null,this.events.emit("auth:logout",{app:this}),window.location.reload()}async createNewBook(){const t=await this.showModelForm({title:"Create New Book",model:new DocitBook,fields:[{name:"title",label:"Title",required:!0},{name:"slug",label:"Slug",required:!0,helpText:"A URL-friendly identifier."}]});t&&t.success&&(this.books.add(t.data),this.sidebar.render(),this.showSuccess("Book created successfully."))}async createNewPage(t){if(!t)return;const e=await this.showForm({title:"Create New Page",fields:[{name:"title",label:"Title",required:!0},{name:"slug",label:"Slug",required:!0,helpText:"A URL-friendly identifier."}]});e&&e.slug&&(e.book=t.id);const o=new DocitPage,i=await o.save(e);i&&i.success&&(this.docPages.add(o),this.sidebar.render(),this.showPage("edit",{id:o.id,doc_book:t.get("slug"),doc_page:o.get("slug")},{}))}static create(t={}){return new DocItApp(t)}static createForBook(t,e={}){return new DocItApp({...e,bookSlug:t,showBookNav:!1})}}exports.BUILD_TIME=t.BUILD_TIME,exports.VERSION=t.VERSION,exports.VERSION_INFO=t.VERSION_INFO,exports.VERSION_MAJOR=t.VERSION_MAJOR,exports.VERSION_MINOR=t.VERSION_MINOR,exports.VERSION_REVISION=t.VERSION_REVISION,exports.WebApp=t.WebApp,exports.DocEditPage=DocEditPage,exports.DocHomePage=DocHomePage,exports.DocItApp=DocItApp,exports.DocNavSidebar=DocNavSidebar,exports.DocPage=DocPage,exports.DocitBook=DocitBook,exports.DocitBookList=DocitBookList,exports.DocitPage=DocitPage,exports.DocitPageList=DocitPageList;
2
+ //# sourceMappingURL=docit.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docit.cjs.js","sources":["../src/extensions/docit/views/DocNavSidebar.js","../src/extensions/docit/pages/DocHomePage.js","../src/extensions/docit/models/Book.js","../src/extensions/docit/models/Page.js","../src/extensions/docit/pages/DocPage.js","../src/extensions/docit/pages/DocEditPage.js","../src/extensions/docit/DocItApp.js"],"sourcesContent":["/**\n * DocNavSidebar - Navigation sidebar for DocIt documentation portal.\n * This view is reactive and relies on the parent DocItApp for state management.\n */\n\nimport View from '@core/View.js';\n\nclass DocNavSidebar extends View {\n constructor(options = {}) {\n super({\n className: 'docit-sidebar-nav',\n tagName: 'nav',\n ...options\n });\n\n this.singleBookMode = options.singleBookMode || false;\n this.books = options.books;\n this.docPages = options.docPages;\n this.activeUser = options.activeUser;\n this.currentBook = null;\n this.currentDocPage = null;\n }\n\n async onInit() {\n await super.onInit();\n this.getApp().events.on('page:show', this._onPageShow.bind(this));\n }\n\n async _onPageShow({ query }) {\n const bookSlug = query.doc_book;\n const pageSlug = query.doc_page;\n const app = this.getApp();\n\n if (bookSlug) {\n const book = this.books.findWhere({ slug: bookSlug });\n if (book && (!this.currentBook || this.currentBook.id !== book.id)) {\n await app.setActiveBook(book);\n this.currentBook = app.currentBook;\n }\n } else {\n if (this.currentBook) {\n await app.setActiveBook(null);\n this.currentBook = null;\n }\n }\n\n this.currentDocPage = pageSlug ? this.docPages.findWhere({ slug: pageSlug }) : null;\n this.render();\n }\n\n getTemplate() {\n return `\n <div class=\"docit-nav-body pt-3\">\n {{#currentBook}}\n {{#docPages.models}}\n <a href=\"#\" class=\"docit-page-link {{#isActive}}active{{/isActive}}\"\n data-action=\"select-page\" data-page-slug=\"{{slug}}\">\n <i class=\"{{#metadata.icon}}{{metadata.icon}}{{/metadata.icon}}{{^metadata.icon}}bi bi-file-earmark-text{{/metadata.icon}} me-2\"></i>\n <span>{{title|capitalize}}</span>\n </a>\n {{/docPages.models}}\n {{^docPages.models}}\n <div class=\"docit-nav-empty\"><p>No pages in this book.</p></div>\n {{/docPages.models}}\n {{/currentBook}}\n {{^currentBook}}\n {{#books.models}}\n <a href=\"#\" class=\"docit-book-item\" data-action=\"select-book\" data-book-slug=\"{{slug}}\">\n <i class=\"bi bi-book me-2\"></i>\n <span class=\"book-title\">{{title}}</span>\n <span class=\"badge bg-secondary ms-auto\">{{page_count}}</span>\n </a>\n {{/books.models}}\n {{/currentBook}}\n </div>\n {{#currentBook}}\n <div class=\"docit-nav-footer\">\n {{#canEdit}}\n <button class=\"btn btn-link w-100 mb-2\" data-action=\"create-page\">\n <i class=\"bi bi-plus-circle me-2\"></i>\n Create New Page\n </button>\n {{/canEdit}}\n <button class=\"btn btn-link w-100\" data-action=\"back-to-books\">\n <i class=\"bi bi-arrow-left me-2\"></i>\n Back to Books\n </button>\n </div>\n {{/currentBook}}\n {{^currentBook}}\n {{#canEdit}}\n <div class=\"docit-nav-footer\">\n <button class=\"btn btn-link w-100\" data-action=\"create-book\">\n <i class=\"bi bi-plus-circle me-2\"></i>\n Create New Book\n </button>\n </div>\n {{/canEdit}}\n {{/currentBook}}\n `;\n }\n\n async onBeforeRender() {\n await super.onBeforeRender();\n this.canEdit = this.getApp().canEdit();\n if (this.docPages && this.currentDocPage) {\n this.docPages.forEach(page => {\n page.isActive = (page.id === this.currentDocPage.id);\n });\n }\n }\n\n async onActionSelectBook(event, element) {\n event.preventDefault();\n const bookSlug = element.dataset.bookSlug;\n const book = this.books.findWhere({ slug: bookSlug });\n if (book) {\n await this.getApp().setActiveBook(book);\n const firstPage = this.docPages.at(0);\n const query = { doc_book: book.get('slug') };\n if (firstPage) {\n query.doc_page = firstPage.get('slug');\n }\n this.getApp().showPage('docs', query, {});\n }\n }\n\n onActionSelectPage(event, element) {\n event.preventDefault();\n const pageSlug = element.dataset.pageSlug;\n if (this.currentBook && pageSlug) {\n this.getApp().showPage('docs', {\n doc_book: this.currentBook.get('slug'),\n doc_page: pageSlug\n }, {});\n }\n }\n\n async onActionBackToBooks(event, element) {\n event.preventDefault();\n await this.getApp().setActiveBook(null);\n this.getApp().showPage('home');\n }\n\n async onActionCreateBook() {\n await this.getApp().createNewBook();\n }\n\n async onActionCreatePage() {\n if (this.currentBook) {\n await this.getApp().createNewPage(this.currentBook);\n }\n }\n\n setBooks(books) { this.books = books; this.render(); }\n setDocPages(docPages) { this.docPages = docPages; this.render(); }\n setCurrentBook(book) {\n this.currentBook = book;\n this.render();\n if (this.getApp().topnav) {\n if (book) {\n this.getApp().topnav.setBrand(book.get(\"title\"));\n } else {\n this.getApp().topnav.setBrand(\"Documentation\");\n }\n\n }\n }\n setUser(user) { this.activeUser = user; this.render(); }\n}\n\nexport default DocNavSidebar;\n","/**\n * DocHomePage - The default landing page for the documentation portal.\n * Instructs the user to select a book to begin.\n */\n\nimport Page from '@core/Page.js';\n\nclass DocHomePage extends Page {\n constructor(options = {}) {\n super({\n pageName: 'home',\n title: 'Documentation',\n className: 'docit-home-page',\n ...options\n });\n }\n\n async getTemplate() {\n return `\n <div class=\"docit-empty-state vh-100 d-flex flex-column align-items-center justify-content-center\">\n <i class=\"bi bi-collection\" style=\"font-size: 4rem;\"></i>\n <h3 class=\"mt-4\">Welcome to the Documentation Portal</h3>\n <p class=\"text-muted\">Please select a book from the sidebar to get started.</p>\n </div>\n `;\n }\n}\n\nexport default DocHomePage;","import Model from '@core/Model.js';\nimport Collection from '@core/Collection.js';\n\n/**\n * DocitBook - Model for documentation books.\n * Handles fetching book data by ID or slug.\n */\nexport class DocitBook extends Model {\n static endpoint = '/api/docit/book';\n\n buildUrl(id = null) {\n if (this.get('slug') && !this.id) {\n return `/api/docit/book/slug/${this.get('slug')}`;\n } else if (this.id) {\n return `/api/docit/book/${this.id}`;\n }\n return this.endpoint;\n }\n}\n\n/**\n * DocitBookList - Collection of documentation books.\n */\nexport class DocitBookList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: DocitBook,\n endpoint: '/api/docit/book',\n ...options\n });\n }\n\n /**\n * Custom parsing to handle the specific API response structure for book lists.\n */\n parse(response) {\n if (response.data && response.data.status) {\n this.meta = {\n ...this.meta,\n total: response.data.count || 0,\n graph: response.data.graph\n };\n return response.data.data || [];\n }\n return super.parse(response);\n }\n}\n\nexport default DocitBook;\n","import Model from '@core/Model.js';\nimport Collection from '@core/Collection.js';\n\n/**\n * DocitPage - Model for documentation pages.\n * Handles fetching page data by ID or slug.\n */\nexport class DocitPage extends Model {\n static endpoint = '/api/docit/page';\n\n buildUrl(id = null) {\n if (this.get('slug') && !this.id) {\n return `/api/docit/page/slug/${this.get('slug')}`;\n } else if (this.id) {\n return `/api/docit/page/${this.id}`;\n }\n return this.endpoint;\n }\n}\n\n/**\n * DocitPageList - Collection of documentation pages.\n */\nexport class DocitPageList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: DocitPage,\n endpoint: '/api/docit/page',\n ...options\n });\n }\n\n /**\n * Custom parsing to handle the specific API response structure for page lists.\n */\n parse(response) {\n if (response.data && response.data.status) {\n this.meta = {\n ...this.meta,\n total: response.data.count || 0,\n graph: response.data.graph,\n book: response.data.book\n };\n return response.data.data || [];\n }\n return super.parse(response);\n }\n}\n\nexport default DocitPage;\n","/**\n * DocPage - Main documentation page viewer\n * Displays rendered HTML content from markdown pages. This page is URL-driven.\n */\n\nimport Page from '@core/Page.js';\nimport ContextMenu from '@core/views/feedback/ContextMenu.js';\nimport { DocitBook } from '@ext/docit/models/Book.js';\nimport { DocitPage } from '@ext/docit/models/Page.js';\n\nclass DocPage extends Page {\n constructor(options = {}) {\n super({\n pageName: 'docs',\n title: 'Documentation',\n className: 'docit-page',\n ...options\n });\n\n this.bookModel = null;\n this.model = null;\n }\n\n async onInit() {\n await super.onInit();\n this.pageContextMenu = new ContextMenu({\n config: this.getPageContextMenuConfig(),\n containerId: 'page-context-menu'\n });\n this.addChild(this.pageContextMenu);\n }\n\n getPageContextMenuConfig() {\n return {\n icon: 'bi-three-dots',\n buttonClass: 'btn btn-outline-secondary btn-sm',\n items: [\n { label: 'View History', action: 'view-history', icon: 'bi-clock-history' },\n { type: 'divider' },\n { label: 'Edit Page Content', action: 'edit-page', icon: 'bi-pencil' },\n { label: 'Edit Page Info', action: 'edit-page-info', icon: 'bi-list-ol' },\n { type: 'divider' },\n { label: 'Edit Book Info', action: 'edit-book', icon: 'bi-book' },\n { type: 'divider' },\n { label: 'Delete Page', action: 'delete-page', icon: 'bi-trash', danger: true },\n ]\n };\n }\n\n async getTemplate() {\n return `\n <div class=\"docit-page-container position-relative\">\n {{#loading}}\n <div class=\"docit-loading\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n {{/loading}}\n\n {{^loading}}\n {{#model|bool}}\n <div class=\"docit-page-toolbar\">\n <div class=\"row\">\n <div class=\"col d-flex justify-content-end\">\n <div data-container=\"page-context-menu\"></div>\n </div>\n </div>\n </div>\n <article class=\"docit-page-content\">\n {{{model.html}}}\n </article>\n\n <nav class=\"docit-page-nav\">\n {{#prevPage}}\n <a href=\"#\" class=\"docit-nav-prev\" data-action=\"navigate-to-page\" data-page-slug=\"{{slug}}\">\n <i class=\"bi bi-arrow-left\"></i>\n <div>\n <small>Previous</small>\n <span>{{title}}</span>\n </div>\n </a>\n {{/prevPage}}\n {{^prevPage}}\n <div></div>\n {{/prevPage}}\n\n {{#nextPage}}\n <a href=\"#\" class=\"docit-nav-next\" data-action=\"navigate-to-page\" data-page-slug=\"{{slug}}\">\n <div>\n <small>Next</small>\n <span>{{title}}</span>\n </div>\n <i class=\"bi bi-arrow-right\"></i>\n </a>\n {{/nextPage}}\n\n <div class=\"my-3\">\n <span class=\"text-muted\">Last updated: {{model.modified|datetime}}</span>\n </div>\n </nav>\n {{/model|bool}}\n\n {{^model|bool}}\n <div class=\"docit-empty-state\">\n <i class=\"bi bi-file-earmark-text\"></i>\n <h3>Select a page</h3>\n <p>Choose a page from the sidebar to view its content.</p>\n </div>\n {{/model|bool}}\n {{/loading}}\n </div>\n `;\n }\n\n async onParams(params = {}, query = {}) {\n await super.onParams(params, query);\n this.loading = true;\n await this.render();\n\n const app = this.getApp();\n const bookSlug = app.bookSlug || query.doc_book;\n const pageSlug = query.doc_page;\n\n if (!bookSlug) {\n setTimeout(() => {\n app.showPage('home');\n }, 100);\n return;\n }\n\n try {\n if (bookSlug) {\n if (!app.currentBook || app.currentBook.get('slug') !== bookSlug) {\n const book = new DocitBook({ slug: bookSlug });\n await book.fetch();\n await app.setActiveBook(book);\n }\n this.bookModel = app.currentBook;\n\n if (pageSlug) {\n this.model = new DocitPage({ slug: pageSlug });\n await this.model.fetch({ graph: 'html' });\n } else {\n const firstPage = app.docPages.at(0);\n if (firstPage) {\n this.model = new DocitPage({ id: firstPage.id });\n await this.model.fetch({ graph: 'html' });\n } else {\n this.model = null;\n }\n }\n } else {\n this.bookModel = null;\n this.model = null;\n }\n\n this.canEdit = app.canEdit();\n this.setupNavigation();\n\n } catch (error) {\n console.error('Failed to load page:', error);\n this.showError('Failed to load documentation page');\n this.model = null;\n } finally {\n this.loading = false;\n await this.render();\n app.events.emit('docit:page-rendered', {\n book: this.bookModel,\n page: this.model\n });\n }\n }\n\n setupNavigation() {\n if (!this.model) {\n this.prevPage = null;\n this.nextPage = null;\n return;\n }\n\n const app = this.getApp();\n const pages = app.docPages.models;\n const currentIndex = pages.findIndex(p => p.id === this.model.id);\n\n this.prevPage = currentIndex > 0 ? { slug: pages[currentIndex - 1].get('slug'), title: pages[currentIndex - 1].get('title') } : null;\n this.nextPage = currentIndex < pages.length - 1 ? { slug: pages[currentIndex + 1].get('slug'), title: pages[currentIndex + 1].get('title') } : null;\n }\n\n async onActionNavigateToPage(event, element) {\n event.preventDefault();\n const pageSlug = element.dataset.pageSlug;\n if (pageSlug) {\n this.getApp().showPage('docs', {}, {\n doc_book: this.bookModel.get('slug'),\n doc_page: pageSlug\n });\n }\n }\n\n async onActionEditPage(event, element) {\n event.preventDefault();\n if (this.model) {\n this.getApp().showPage('edit', {\n id: this.model.id,\n doc_book: this.bookModel.get('slug'),\n doc_page: this.model.get('slug')\n }, {});\n }\n }\n\n async onActionViewHistory(event, element) {\n this.showInfo('Revision history coming soon.');\n }\n\n async onActionEditPageInfo(event, element) {\n if (this.model) {\n this.getApp().showModelForm({\n model: this.model,\n fields: [\n {label:\"Title\", name:\"title\", type: \"text\"},\n {label:\"Order Priority\", name:\"order_priority\"},\n {label:\"Slug\", name:\"slug\"}\n ]\n })\n }\n }\n\n async onActionEditBook(event, element) {\n if (this.model) {\n const book = this.getApp().sidebar.currentBook;\n if (!book) return;\n this.getApp().showModelForm({\n model: book,\n fields: [\n {label:\"Title\", name:\"title\", type: \"text\"},\n {label:\"Order Priority\", name:\"order_priority\"},\n {label:\"Slug\", name:\"slug\"},\n {label:\"Is Active\", name:\"is_active\", type:\"switch\"}\n ]\n })\n }\n }\n\n async onActionDeletePage(event, element) {\n if (!this.model) return;\n\n const confirmed = await this.getApp().showConfirm({\n title: 'Delete Page',\n body: `Are you sure you want to delete \"${this.model.get('title')}\"?`,\n confirmText: 'Delete',\n confirmClass: 'btn-danger'\n });\n\n if (confirmed) {\n await this.model.destroy();\n this.showSuccess('Page deleted.');\n // Reload the book's pages and navigate to the first one\n await this.getApp().setActiveBook(this.bookModel);\n const firstPage = this.getApp().docPages.at(0);\n if (firstPage) {\n this.getApp().showPage('docs', {}, { doc_book: this.bookModel.get('slug'), doc_page: firstPage.get('slug') });\n } else {\n this.getApp().showPage('docs', {}, { doc_book: this.bookModel.get('slug') });\n }\n }\n }\n\n async onAfterRender() {\n await super.onAfterRender();\n if (typeof Prism !== 'undefined' && this.model) {\n Prism.highlightAll();\n }\n }\n}\n\nexport default DocPage;\n","/**\n * DocEditPage - Markdown editor for documentation pages using TOAST UI Editor.\n */\n\nimport Page from '@core/Page.js';\nimport { DocitPage } from '@ext/docit/models/Page.js';\n\nclass DocEditPage extends Page {\n constructor(options = {}) {\n super({\n pageName: 'edit',\n title: 'Edit Page',\n className: 'docit-edit-page',\n ...options\n });\n\n this.model = null;\n this.editor = null;\n this.isDirty = false;\n }\n\n async getTemplate() {\n return `\n <div class=\"docit-edit-container vh-100\">\n {{#loading}}\n <div class=\"docit-loading\"><div class=\"spinner-border\"></div></div>\n {{/loading}}\n\n {{^loading}}{{#model}}\n <header class=\"docit-edit-header\">\n <div class=\"docit-edit-title-row\">\n <h2>Editing: {{model.title}}</h2>\n <div class=\"docit-edit-actions\">\n <button class=\"btn btn-outline-secondary\" data-action=\"cancel-edit\">Cancel</button>\n <button class=\"btn btn-success\" data-action=\"save-page\">\n <i class=\"bi bi-check-lg\"></i> Save Changes\n </button>\n </div>\n </div>\n </header>\n <div class=\"docit-edit-body flex-grow-1\">\n <div id=\"editor\"></div>\n </div>\n {{/model}}\n {{^model}}\n <div class=\"docit-error-state\">\n <h3>Page Not Found</h3>\n <p>The page you're trying to edit could not be found.</p>\n <button class=\"btn btn-primary\" data-action=\"go-back\">Go Back</button>\n </div>\n {{/model}}{{/loading}}\n </div>\n `;\n }\n\n async onParams(params = {}, query = {}) {\n await super.onParams(params, query);\n let model = null;\n if (query.id) {\n model = new DocitPage({ id: query.id });\n } else if (query.doc_page) {\n model = new DocitPage({ slug: query.doc_page });\n }\n this.model = model;\n if (this.model) {\n await this.model.fetch({ graph: 'detail' });\n }\n }\n\n initEditor() {\n if (this.editor || !this.element.querySelector('#editor')) return;\n\n this.editor = new toastui.Editor({\n el: this.element.querySelector('#editor'),\n height: '100%',\n initialEditType: 'markdown',\n previewStyle: 'tab',\n initialValue: this.model.get('content') || ''\n });\n\n this.editor.on('change', () => {\n this.isDirty = true;\n });\n }\n\n async onActionSavePage() {\n if (!this.model || !this.editor) return;\n\n this.saving = true;\n this.getApp().showLoading(\"saving...\");\n try {\n const content = this.editor.getMarkdown();\n await this.model.save({ content });\n this.isDirty = false;\n this.getApp().toast.success('Page saved successfully.');\n this.getApp().showPage('docs', this.query);\n } catch (error) {\n console.error('Failed to save page:', error);\n this.getApp().toast.error('Failed to save page.');\n } finally {\n this.saving = false;\n this.getApp().hideLoading();\n }\n }\n\n async onActionCancelEdit() {\n this.getApp().showPage('docs', this.query);\n }\n\n onActionGoBack() {\n this.getApp().showPage('docs');\n }\n\n async onBeforeRender() {\n await super.onBeforeRender();\n if (this.editor) {\n this.editor.destroy();\n this.editor = null;\n }\n }\n\n async onAfterRender() {\n await super.onAfterRender();\n if (this.model) {\n this.initEditor();\n }\n }\n\n async onBeforeDestroy() {\n this.editor?.destroy();\n await super.onBeforeDestroy();\n }\n}\n\nexport default DocEditPage;\n","/**\n * DocItApp - Documentation portal application\n * Supports both single-book and multi-book modes with automatic configuration\n */\n\nimport WebApp from '@core/WebApp.js';\nimport TopNav from '@core/views/navigation/TopNav.js';\nimport DocNavSidebar from '@ext/docit/views/DocNavSidebar.js';\nimport DocHomePage from '@ext/docit/pages/DocHomePage.js';\nimport DocPage from '@ext/docit/pages/DocPage.js';\nimport DocEditPage from '@ext/docit/pages/DocEditPage.js';\nimport { DocitBook, DocitBookList } from '@ext/docit/models/Book.js';\nimport { DocitPage, DocitPageList } from '@ext/docit/models/Page.js';\nimport TokenManager from '@core/services/TokenManager.js';\nimport { User } from '@core/models/User.js';\nimport ToastService from '@core/services/ToastService.js';\n\nclass DocItApp extends WebApp {\n constructor(config = {}) {\n // Set defaults for documentation app\n const defaults = {\n name: config.title || 'DocIt Portal',\n version: config.version || '1.0.0',\n debug: config.debug || false,\n container: config.container || '#app',\n defaultRoute: 'home',\n basePath: config.basePath || '',\n ...config\n };\n\n super(defaults);\n\n // DocIt specific configuration\n this.bookSlug = config.bookSlug || null; // If set, locks to single book\n this.showBookNav = config.showBookNav !== undefined ? config.showBookNav : !this.bookSlug;\n this.theme = config.theme || 'light';\n this.editPermissions = config.permissions?.edit || ['manage_docit'];\n\n // Sidebar configuration\n this.sidebarConfig = {\n showSearch: true,\n defaultCollapsed: false,\n ...config.sidebar\n };\n\n // Collections for managing data\n this.books = new DocitBookList();\n this.books.params.sort = \"-order_priority\";\n this.docPages = new DocitPageList();\n this.docPages.params.sort = \"-order_priority\";\n\n this.toast = new ToastService();\n\n // Current state\n this.currentBook = null;\n\n // Components\n this.sidebar = null;\n this.isDocItReady = false;\n\n // Authentication\n this.tokenManager = new TokenManager();\n this.activeUser = null;\n }\n\n /**\n * Start the DocIt application\n */\n async start() {\n try {\n console.log('Starting DocIt Portal...');\n\n // Setup container and basic layout\n this.setupDocItLayout();\n\n // Initialize TopNav\n await this.setupTopNav();\n\n // Initialize sidebar\n await this.setupSidebar();\n\n // Check authentication status first\n await this.checkAuthStatus();\n\n // Register pages\n this.registerDocItPages();\n\n // Start the web app (router, events, etc)\n await super.start();\n\n // Load initial data\n await this.loadInitialData();\n\n // Mark as ready\n this.isDocItReady = true;\n this.events.emit('docit:ready', { app: this });\n\n console.log('✅ DocIt Portal ready');\n } catch (error) {\n console.error('Failed to start DocIt:', error);\n this.showError('Failed to initialize documentation portal');\n throw error;\n }\n }\n\n /**\n * Setup DocIt specific layout\n */\n setupDocItLayout() {\n const container = typeof this.container === 'string'\n ? document.querySelector(this.container)\n : this.container;\n\n if (!container) {\n throw new Error(`Container not found: ${this.container}`);\n }\n\n // Apply theme\n container.classList.add('docit-app', `docit-theme-${this.theme}`);\n\n // Create layout structure\n container.innerHTML = `\n <div class=\"docit-app-layout\">\n <div id=\"topnav-container\"></div>\n <div class=\"docit-body-layout\">\n <div class=\"docit-sidebar\" id=\"docit-sidebar\"></div>\n <div class=\"docit-main\">\n <div class=\"docit-content\" id=\"page-container\"></div>\n </div>\n </div>\n </div>\n `;\n\n this.pageContainer = '#page-container';\n }\n\n async setupTopNav() {\n this.topnav = new TopNav({\n containerId: 'topnav-container',\n brand: this.name,\n theme: 'navbar navbar-expand-lg bg-dark navbar-dark',\n showSidebarToggle: false,\n displayMode: \"brand\",\n rightItems: [\n {\n id: \"login\",\n icon: 'bi-box-arrow-in-right',\n href: '/examples/auth/',\n label: 'Login'\n },\n ],\n userMenu: {\n label: 'User',\n icon: 'bi-person-circle',\n items: [\n {\n label: 'Profile',\n icon: 'bi-person',\n action: 'profile'\n },\n {\n divider: true\n },\n {\n label: 'Logout',\n icon: 'bi-box-arrow-right',\n action: 'logout'\n }\n ]\n }\n });\n await this.topnav.render();\n }\n\n onActionToggleSidebar() {\n const layout = document.querySelector('.docit-layout');\n layout.classList.toggle('sidebar-collapsed');\n }\n\n /**\n * Setup sidebar navigation\n */\n async setupSidebar() {\n this.sidebar = new DocNavSidebar({\n containerId: 'docit-sidebar',\n app: this,\n singleBookMode: !!this.bookSlug,\n showBookNav: this.showBookNav,\n books: this.books,\n docPages: this.docPages,\n activeUser: this.activeUser,\n ...this.sidebarConfig\n });\n\n await this.sidebar.render();\n }\n\n /**\n * Register DocIt pages\n */\n registerDocItPages() {\n this.registerPage('home', DocHomePage, {\n route: '/',\n permissions: null\n });\n\n this.registerPage('docs', DocPage, {\n route: '/docs',\n permissions: null // Public access\n });\n\n this.registerPage('edit', DocEditPage, {\n route: '/edit',\n permissions: this.editPermissions\n });\n }\n\n /**\n * Load initial data based on mode\n */\n async loadInitialData() {\n try {\n if (this.bookSlug) {\n // Single-book mode: Load the specified book\n const book = new DocitBook({ slug: this.bookSlug });\n await book.fetch();\n if (book.id) {\n this.books.add(book);\n await this.setActiveBook(book);\n } else {\n throw new Error(`Book with slug '${this.bookSlug}' not found.`);\n }\n } else {\n // Multi-book mode: Load all books\n await this.books.fetch({ graph: 'list' });\n this.sidebar.render();\n }\n } catch (error) {\n console.error('Failed to load initial data:', error);\n this.showError('Failed to load documentation');\n }\n }\n\n /**\n * Set the active book and load its pages\n * @param {DocitBook} book - The book to set as active\n */\n async setActiveBook(book) {\n if (this.currentBook && book && this.currentBook.id === book.id) {\n return;\n }\n\n this.currentBook = book;\n this.docPages.reset();\n\n if (book) {\n await this.docPages.fetch({\n book: book.get('id'),\n graph: 'list'\n });\n }\n\n this.sidebar.setCurrentBook(book);\n this.sidebar.setDocPages(this.docPages);\n\n this.events.emit('docit:book-changed', { book });\n }\n\n /**\n * Save doc page content using Model\n */\n async saveDocPageContent(docPageId, content) {\n const docPage = this.docPages.get(docPageId) || new DocitPage({ id: docPageId });\n\n docPage.set('content', content);\n const response = await docPage.save();\n\n if (!response.success || !response.data.status) {\n throw new Error('Failed to save doc page');\n }\n\n return docPage;\n }\n\n /**\n * Check if user can edit\n */\n canEdit() {\n const user = this.activeUser;\n if (!user) return false;\n return this.editPermissions.some(perm => user.hasPermission ? user.hasPermission(perm) : false);\n }\n\n /**\n * Check authentication status and load user\n */\n async checkAuthStatus() {\n try {\n const token = this.tokenManager.getTokenInstance();\n\n if (!token || !token.isValid()) {\n this.events.emit('auth:unauthorized', { app: this });\n return;\n }\n\n if (token.isExpired()) {\n this.events.emit('auth:expired', { app: this });\n return;\n }\n\n this.tokenManager.startAutoRefresh(this);\n this.rest.setAuthToken(token.token);\n\n const user = new User({ id: token.getUserId() });\n await user.fetch();\n this.setActiveUser(user);\n } catch (error) {\n console.error('Failed to check auth status:', error);\n this.events.emit('auth:error', { error, app: this });\n }\n }\n\n /**\n * Set the active authenticated user\n */\n setActiveUser(user) {\n this.activeUser = user;\n if (this.sidebar) {\n this.sidebar.setUser(user);\n }\n if (this.topnav) {\n this.topnav.setUser(user);\n this.tonnav.render();\n }\n this.events.emit('user:changed', { user, app: this });\n return this;\n }\n\n /**\n * Clear the active user (logout)\n */\n clearActiveUser() {\n this.activeUser = null;\n this.tokenManager.clearTokens();\n this.rest.clearAuth();\n if (this.sidebar) {\n this.sidebar.setUser(null);\n }\n this.events.emit('user:cleared', { app: this });\n return this;\n }\n\n /**\n * Handle logout\n */\n async logout() {\n this.clearActiveUser();\n this.books.reset();\n this.docPages.reset();\n this.currentBook = null;\n this.events.emit('auth:logout', { app: this });\n window.location.reload();\n }\n\n async createNewBook() {\n const result = await this.showModelForm({\n title: 'Create New Book',\n model: new DocitBook(),\n fields: [\n { name: 'title', label: 'Title', required: true },\n { name: 'slug', label: 'Slug', required: true, helpText: 'A URL-friendly identifier.' }\n ]\n });\n\n if (result && result.success) {\n this.books.add(result.data);\n this.sidebar.render();\n this.showSuccess('Book created successfully.');\n }\n }\n\n async createNewPage(book) {\n if (!book) return;\n\n const data = await this.showForm({\n title: 'Create New Page',\n fields: [\n { name: 'title', label: 'Title', required: true },\n { name: 'slug', label: 'Slug', required: true, helpText: 'A URL-friendly identifier.' }\n ]\n });\n\n if (data && data.slug) {\n data.book = book.id;\n }\n\n const newPage = new DocitPage();\n const result = await newPage.save(data);\n\n if (result && result.success) {\n this.docPages.add(newPage);\n this.sidebar.render();\n // this.showSuccess('Page created successfully.');\n\n this.showPage('edit', {\n id: newPage.id,\n doc_book: book.get('slug'),\n doc_page: newPage.get('slug')\n }, {});\n }\n }\n\n /**\n * Static factory method for quick setup\n */\n static create(config = {}) {\n return new DocItApp(config);\n }\n\n /**\n * Quick setup for single-book mode\n */\n static createForBook(bookSlug, config = {}) {\n return new DocItApp({\n ...config,\n bookSlug,\n showBookNav: false\n });\n }\n}\n\nexport default DocItApp;\n"],"names":["DocNavSidebar","View","constructor","options","super","className","tagName","this","singleBookMode","books","docPages","activeUser","currentBook","currentDocPage","onInit","getApp","events","on","_onPageShow","bind","query","bookSlug","doc_book","pageSlug","doc_page","app","book","findWhere","slug","id","setActiveBook","render","getTemplate","onBeforeRender","canEdit","forEach","page","isActive","onActionSelectBook","event","element","preventDefault","dataset","firstPage","at","get","showPage","onActionSelectPage","onActionBackToBooks","onActionCreateBook","createNewBook","onActionCreatePage","createNewPage","setBooks","setDocPages","setCurrentBook","topnav","setBrand","setUser","user","DocHomePage","Page","pageName","title","DocitBook","Model","static","buildUrl","endpoint","DocitBookList","Collection","ModelClass","parse","response","data","status","meta","total","count","graph","DocitPage","DocitPageList","DocPage","bookModel","model","pageContextMenu","ContextMenu","config","getPageContextMenuConfig","containerId","addChild","icon","buttonClass","items","label","action","type","danger","onParams","params","loading","fetch","setupNavigation","error","console","showError","emit","setTimeout","prevPage","nextPage","pages","models","currentIndex","findIndex","p","length","onActionNavigateToPage","onActionEditPage","onActionViewHistory","showInfo","onActionEditPageInfo","showModelForm","fields","name","onActionEditBook","sidebar","onActionDeletePage","showConfirm","body","confirmText","confirmClass","destroy","showSuccess","onAfterRender","Prism","highlightAll","DocEditPage","editor","isDirty","initEditor","querySelector","toastui","Editor","el","height","initialEditType","previewStyle","initialValue","onActionSavePage","saving","showLoading","content","getMarkdown","save","toast","success","hideLoading","onActionCancelEdit","onActionGoBack","onBeforeDestroy","DocItApp","WebApp","version","debug","container","defaultRoute","basePath","showBookNav","theme","editPermissions","permissions","edit","sidebarConfig","showSearch","defaultCollapsed","sort","ToastService","isDocItReady","tokenManager","TokenManager","start","log","setupDocItLayout","setupTopNav","setupSidebar","checkAuthStatus","registerDocItPages","loadInitialData","document","Error","classList","add","innerHTML","pageContainer","TopNav","brand","showSidebarToggle","displayMode","rightItems","href","userMenu","divider","onActionToggleSidebar","toggle","registerPage","route","reset","saveDocPageContent","docPageId","docPage","set","some","perm","hasPermission","token","getTokenInstance","isValid","isExpired","startAutoRefresh","rest","setAuthToken","User","getUserId","setActiveUser","tonnav","clearActiveUser","clearTokens","clearAuth","logout","window","location","reload","result","required","helpText","showForm","newPage","create","createForBook"],"mappings":"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"}