web-mojo 2.1.531 → 2.1.533
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.
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.es.js +10 -10
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.cjs.js.map +1 -1
- package/dist/auth.es.js +3 -3
- package/dist/auth.es.js.map +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.cjs.js.map +1 -1
- package/dist/charts.css +6 -0
- package/dist/charts.es.js +32 -16
- package/dist/charts.es.js.map +1 -1
- package/dist/chunks/{ChatView-BwazIhTw.js → ChatView-DLrdDqYC.js} +6 -6
- package/dist/chunks/{ChatView-BwazIhTw.js.map → ChatView-DLrdDqYC.js.map} +1 -1
- package/dist/chunks/{ChatView-siPKtjEy.js → ChatView-Dv5_jkEl.js} +2 -2
- package/dist/chunks/{ChatView-siPKtjEy.js.map → ChatView-Dv5_jkEl.js.map} +1 -1
- package/dist/chunks/{ContextMenu-BJlCv6JA.js → ContextMenu-Dxnc7zGe.js} +2 -2
- package/dist/chunks/{ContextMenu-BJlCv6JA.js.map → ContextMenu-Dxnc7zGe.js.map} +1 -1
- package/dist/chunks/{ContextMenu-DmPpGvRg.js → ContextMenu-rQItz6uC.js} +2 -2
- package/dist/chunks/{ContextMenu-DmPpGvRg.js.map → ContextMenu-rQItz6uC.js.map} +1 -1
- package/dist/chunks/{DataView-DIJNkBzQ.js → DataView-BQ_wYIMp.js} +2 -2
- package/dist/chunks/{DataView-DIJNkBzQ.js.map → DataView-BQ_wYIMp.js.map} +1 -1
- package/dist/chunks/{DataView-DohifQcG.js → DataView-COAngsJb.js} +2 -2
- package/dist/chunks/{DataView-DohifQcG.js.map → DataView-COAngsJb.js.map} +1 -1
- package/dist/chunks/{Dialog-CqJQlXoj.js → Dialog-BVVHBbb1.js} +5 -5
- package/dist/chunks/{Dialog-CqJQlXoj.js.map → Dialog-BVVHBbb1.js.map} +1 -1
- package/dist/chunks/{Dialog-CcCWITnV.js → Dialog-BpVcHVyt.js} +2 -2
- package/dist/chunks/{Dialog-CcCWITnV.js.map → Dialog-BpVcHVyt.js.map} +1 -1
- package/dist/chunks/{FormView-CMdyHmf3.js → FormView-Bso-0GfY.js} +2 -2
- package/dist/chunks/{FormView-CMdyHmf3.js.map → FormView-Bso-0GfY.js.map} +1 -1
- package/dist/chunks/{FormView-zxAz97lg.js → FormView-C_n7MeK4.js} +2 -2
- package/dist/chunks/{FormView-zxAz97lg.js.map → FormView-C_n7MeK4.js.map} +1 -1
- package/dist/chunks/{MetricsChart-Bbn-L_9C.js → MetricsChart-BCAdhZH1.js} +3 -3
- package/dist/chunks/{MetricsChart-Bbn-L_9C.js.map → MetricsChart-BCAdhZH1.js.map} +1 -1
- package/dist/chunks/{MetricsChart-BfeD0WY-.js → MetricsChart-EjbUNKxU.js} +2 -2
- package/dist/chunks/{MetricsChart-BfeD0WY-.js.map → MetricsChart-EjbUNKxU.js.map} +1 -1
- package/dist/chunks/{PDFViewer-BUAS2Hkr.js → PDFViewer-CFBhDasW.js} +3 -3
- package/dist/chunks/{PDFViewer-BUAS2Hkr.js.map → PDFViewer-CFBhDasW.js.map} +1 -1
- package/dist/chunks/{PDFViewer-DQvqJVD2.js → PDFViewer-Dn1Jx7t1.js} +2 -2
- package/dist/chunks/{PDFViewer-DQvqJVD2.js.map → PDFViewer-Dn1Jx7t1.js.map} +1 -1
- package/dist/chunks/{Page-BvVfjiCv.js → Page-BobsRBF8.js} +2 -2
- package/dist/chunks/{Page-BvVfjiCv.js.map → Page-BobsRBF8.js.map} +1 -1
- package/dist/chunks/{Page-BZA8Inm2.js → Page-Cvz7ziJA.js} +2 -2
- package/dist/chunks/{Page-BZA8Inm2.js.map → Page-Cvz7ziJA.js.map} +1 -1
- package/dist/chunks/{TopNav-BjPDz8n_.js → TopNav-CeCIt_Mv.js} +2 -2
- package/dist/chunks/{TopNav-BjPDz8n_.js.map → TopNav-CeCIt_Mv.js.map} +1 -1
- package/dist/chunks/{TopNav-ChmlxQ5s.js → TopNav-DuAz_KgP.js} +2 -2
- package/dist/chunks/{TopNav-ChmlxQ5s.js.map → TopNav-DuAz_KgP.js.map} +1 -1
- package/dist/chunks/{WebApp-KZbQxSrZ.js → WebApp-CO6Mdt_i.js} +2 -2
- package/dist/chunks/{WebApp-KZbQxSrZ.js.map → WebApp-CO6Mdt_i.js.map} +1 -1
- package/dist/chunks/{WebApp-zyQ4x8MK.js → WebApp-CfHuLFxV.js} +13 -13
- package/dist/chunks/{WebApp-zyQ4x8MK.js.map → WebApp-CfHuLFxV.js.map} +1 -1
- package/dist/css/web-mojo.css +1 -1
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +5 -5
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +11 -11
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +4 -4
- package/package.json +1 -1
package/dist/css/web-mojo.css
CHANGED
|
@@ -14,4 +14,4 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Or import in CSS:
|
|
16
16
|
* @import url('path/to/mojo/src/css/auth.css');
|
|
17
|
-
*/:root{--mojo-auth-bg: #f4f7f6;--mojo-auth-panel-bg: #ffffff;--mojo-auth-panel-border: rgba(0, 0, 0, .1);--mojo-auth-panel-shadow: 0 8px 32px rgba(0, 0, 0, .1);--mojo-auth-panel-text: var(--bs-body-color);--mojo-auth-panel-text-muted: var(--bs-secondary-color);--mojo-auth-panel-input-bg: var(--bs-body-bg);--mojo-auth-panel-input-border: var(--bs-border-color);--mojo-auth-panel-input-color: var(--bs-body-color);--mojo-auth-panel-hr-bg: var(--bs-body-bg);--mojo-auth-primary: #667eea;--mojo-auth-primary-dark: #5a6fd4;--mojo-auth-secondary: #764ba2;--mojo-auth-border-radius: var(--bs-border-radius-lg, 1rem);--mojo-auth-card-padding: 2rem;--mojo-auth-transition: all .2s ease}body.auth-bg-light{--mojo-auth-bg: #f4f7f6}body.auth-bg-dark{--mojo-auth-bg: #1a202c}body.auth-bg-gradient{--mojo-auth-bg: linear-gradient( 135deg, var(--mojo-auth-primary) 0%, var(--mojo-auth-secondary) 100% )}body.auth-panel-light{--mojo-auth-panel-bg: #ffffff;--mojo-auth-panel-border: rgba(0, 0, 0, .1);--mojo-auth-panel-shadow: 0 8px 32px rgba(0, 0, 0, .1);--mojo-auth-panel-text: var(--bs-body-color);--mojo-auth-panel-text-muted: var(--bs-secondary-color);--mojo-auth-panel-input-bg: var(--bs-body-bg);--mojo-auth-panel-input-border: var(--bs-border-color);--mojo-auth-panel-input-color: var(--bs-body-color);--mojo-auth-panel-hr-bg: var(--bs-body-bg)}body.auth-panel-dark{--mojo-auth-panel-bg: #2d3748;--mojo-auth-panel-border: rgba(255, 255, 255, .15);--mojo-auth-panel-shadow: 0 8px 32px rgba(0, 0, 0, .25);--mojo-auth-panel-text: #f7fafc;--mojo-auth-panel-text-muted: #a0aec0;--mojo-auth-panel-input-bg: #1a202c;--mojo-auth-panel-input-border: #4a5568;--mojo-auth-panel-input-color: #f7fafc;--mojo-auth-panel-hr-bg: #2d3748}body.auth-panel-translucent{--mojo-auth-panel-bg: rgba(255, 255, 255, .85);--mojo-auth-panel-border: rgba(255, 255, 255, .2);--mojo-auth-panel-shadow: 0 8px 32px rgba(0, 0, 0, .1);--mojo-auth-panel-text: #2d3748;--mojo-auth-panel-text-muted: #4a5568;--mojo-auth-panel-input-bg: rgba(255, 255, 255, .7);--mojo-auth-panel-input-border: rgba(0, 0, 0, .1);--mojo-auth-panel-input-color: #2d3748;--mojo-auth-panel-hr-bg: transparent}body.auth-bg-dark.auth-panel-translucent,body.auth-bg-gradient.auth-panel-translucent{--mojo-auth-panel-bg: rgba(45, 55, 72, .75);--mojo-auth-panel-border: rgba(255, 255, 255, .1);--mojo-auth-panel-text: #f7fafc;--mojo-auth-panel-text-muted: #a0aec0;--mojo-auth-panel-input-bg: rgba(26, 32, 44, .7);--mojo-auth-panel-input-border: rgba(255, 255, 255, .2);--mojo-auth-panel-input-color: #f7fafc;--mojo-auth-panel-hr-bg: transparent}.auth-page{background:var(--mojo-auth-bg);min-height:100vh;font-family:var(--bs-font-sans-serif);transition:background .3s ease-in-out}.auth-page .card{background:var(--mojo-auth-panel-bg)!important;border:1px solid var(--mojo-auth-panel-border);border-radius:var(--mojo-auth-border-radius);box-shadow:var(--mojo-auth-panel-shadow);color:var(--mojo-auth-panel-text);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:transform .2s ease,box-shadow .2s ease,background .3s ease,border .3s 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-label{font-weight:500;color:var(--mojo-auth-panel-text)}.auth-page .form-text{color:var(--mojo-auth-panel-text-muted)}.auth-page .form-control{background-color:var(--mojo-auth-panel-input-bg);border:1px solid var(--mojo-auth-panel-input-border);color:var(--mojo-auth-panel-input-color);border-radius:var(--bs-border-radius);transition:var(--mojo-auth-transition)}.auth-page .form-control::placeholder{color:var(--mojo-auth-panel-text-muted);opacity:.7}.auth-page .form-control:focus,.auth-page .form-check-input:focus{border-color:var(--mojo-auth-primary);box-shadow:0 0 0 .25rem #667eea40;outline:none}.auth-page .text-muted{color:var(--mojo-auth-panel-text-muted)!important}.auth-page .position-relative hr{border-color:var(--mojo-auth-panel-border);opacity:.75}.auth-page .position-relative .position-absolute{background:var(--mojo-auth-panel-hr-bg);color:var(--mojo-auth-panel-text-muted);padding:0 1rem;font-size:.875rem;font-weight:500}.auth-page .btn-primary{background:linear-gradient(135deg,var(--mojo-auth-primary) 0%,var(--mojo-auth-secondary) 100%);border:none;border-radius:var(--bs-border-radius);font-weight:500;transition:var(--mojo-auth-transition)}.auth-page .btn-primary:hover:not(:disabled){background:linear-gradient(135deg,var(--mojo-auth-primary-dark) 0%,var(--mojo-auth-secondary) 100%);transform:translateY(-1px);box-shadow:0 4px 12px #667eea4d}.auth-page a{color:var(--mojo-auth-primary);text-decoration:none;transition:color .2s ease}.auth-page a:hover{color:var(--mojo-auth-primary-dark);text-decoration:underline}.auth-footer-links a{color:var(--mojo-auth-panel-text-muted);text-decoration:none;transition:all .2s ease}.auth-footer-links a:hover{color:var(--mojo-auth-primary);text-decoration:underline}body.auth-panel-dark .auth-footer-links a{opacity:.8}body.auth-panel-dark .auth-footer-links a:hover{opacity:1}body.auth-panel-dark .alert-danger{background-color:#dc354533;color:#f8d7da}body.auth-panel-dark .alert-success{background-color:#19875433;color:#d1e7dd}.auth-page .form-check-input:checked{background-color:var(--mojo-auth-primary);border-color:var(--mojo-auth-primary)}.auth-page .progress{background-color:#e9ecef;border-radius:2px;height:4px}.auth-page .alert{border-radius:var(--bs-border-radius);border:none;box-shadow:var(--bs-box-shadow-sm)}@media (max-width: 768px){.auth-page{padding:1rem 0}.auth-page .card{margin:0 1rem}}.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}}.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}}.mini-chart{display:block;width:100%}.mini-chart-wrapper{position:relative;display:block;width:100%}.mini-chart-svg{display:block;width:100%;height:100%}@keyframes mini-chart-draw{to{stroke-dashoffset:0}}@keyframes mini-chart-bar-grow{to{transform:scaleY(1)}}.metrics-mini-chart-container{display:flex;align-items:center;gap:1rem;padding:1rem;background:var(--chart-bg);border:1px solid var(--chart-border);border-radius:.5rem;transition:all .2s ease}.metrics-mini-chart-container:hover{box-shadow:var(--chart-shadow);border-color:var(--bs-primary)}.metrics-mini-chart-vertical{flex-direction:column;align-items:stretch;text-align:center}.metrics-mini-chart-vertical .metrics-chart{margin-top:.5rem}.metrics-mini-chart-horizontal{flex-direction:row;justify-content:space-between}.metrics-info{flex:1;min-width:0}.metrics-label{font-size:.875rem;color:var(--chart-text-muted);font-weight:500;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.metrics-value-row{display:flex;align-items:baseline;gap:.5rem;flex-wrap:wrap}.metrics-value{font-size:1.5rem;font-weight:700;color:var(--chart-text);line-height:1.2}.metrics-trend{display:inline-flex;align-items:center;gap:.25rem;padding:.125rem .5rem;font-size:.75rem;font-weight:600;border-radius:.25rem;line-height:1.5}.metrics-trend.trend-up{color:#198754;background-color:#1987541a}.metrics-trend.trend-down{color:#dc3545;background-color:#dc35451a}.metrics-trend i{font-size:.875rem}.metrics-chart{flex-shrink:0;display:flex;align-items:center}.metrics-mini-chart-sm .metrics-value{font-size:1.25rem}.metrics-mini-chart-sm .metrics-label{font-size:.75rem}.metrics-mini-chart-sm .metrics-chart{width:80px;height:30px}.metrics-mini-chart-md .metrics-chart{width:100px;height:40px}.metrics-mini-chart-lg .metrics-value{font-size:2rem}.metrics-mini-chart-lg .metrics-label{font-size:1rem}.metrics-mini-chart-lg .metrics-chart{width:120px;height:50px}.metrics-mini-chart-success{border-left:4px solid #198754}.metrics-mini-chart-success .metrics-value{color:#198754}.metrics-mini-chart-danger{border-left:4px solid #dc3545}.metrics-mini-chart-danger .metrics-value{color:#dc3545}.metrics-mini-chart-warning{border-left:4px solid #ffc107}.metrics-mini-chart-warning .metrics-value{color:#ffc107}.metrics-mini-chart-info{border-left:4px solid #0dcaf0}.metrics-mini-chart-info .metrics-value{color:#0dcaf0}[data-theme=dark] .metrics-trend.trend-up{color:#75b798;background-color:#75b79826}[data-theme=dark] .metrics-trend.trend-down{color:#ea868f;background-color:#ea868f26}@media (max-width: 575.98px){.metrics-mini-chart-container{flex-direction:column;align-items:flex-start}.metrics-mini-chart-horizontal .metrics-chart{align-self:stretch}.metrics-mini-chart-horizontal .mini-chart-svg{width:100%;height:40px}}@media (prefers-reduced-motion: reduce){.mini-chart-svg path,.mini-chart-svg rect{animation:none!important}.metrics-mini-chart-container{transition:none}}.mini-chart-tooltip{position:absolute;background:#000000d9;color:#fff;padding:.375rem .625rem;border-radius:.375rem;font-size:.75rem;line-height:1.4;pointer-events:none;white-space:nowrap;z-index:1000;box-shadow:0 2px 8px #00000026}.mini-chart-tooltip strong{font-weight:600}[data-theme=dark] .mini-chart-tooltip{background:#ffffffe6;color:#212529}: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}}
|
|
17
|
+
*/:root{--mojo-auth-bg: #f4f7f6;--mojo-auth-panel-bg: #ffffff;--mojo-auth-panel-border: rgba(0, 0, 0, .1);--mojo-auth-panel-shadow: 0 8px 32px rgba(0, 0, 0, .1);--mojo-auth-panel-text: var(--bs-body-color);--mojo-auth-panel-text-muted: var(--bs-secondary-color);--mojo-auth-panel-input-bg: var(--bs-body-bg);--mojo-auth-panel-input-border: var(--bs-border-color);--mojo-auth-panel-input-color: var(--bs-body-color);--mojo-auth-panel-hr-bg: var(--bs-body-bg);--mojo-auth-primary: #667eea;--mojo-auth-primary-dark: #5a6fd4;--mojo-auth-secondary: #764ba2;--mojo-auth-border-radius: var(--bs-border-radius-lg, 1rem);--mojo-auth-card-padding: 2rem;--mojo-auth-transition: all .2s ease}body.auth-bg-light{--mojo-auth-bg: #f4f7f6}body.auth-bg-dark{--mojo-auth-bg: #1a202c}body.auth-bg-gradient{--mojo-auth-bg: linear-gradient( 135deg, var(--mojo-auth-primary) 0%, var(--mojo-auth-secondary) 100% )}body.auth-panel-light{--mojo-auth-panel-bg: #ffffff;--mojo-auth-panel-border: rgba(0, 0, 0, .1);--mojo-auth-panel-shadow: 0 8px 32px rgba(0, 0, 0, .1);--mojo-auth-panel-text: var(--bs-body-color);--mojo-auth-panel-text-muted: var(--bs-secondary-color);--mojo-auth-panel-input-bg: var(--bs-body-bg);--mojo-auth-panel-input-border: var(--bs-border-color);--mojo-auth-panel-input-color: var(--bs-body-color);--mojo-auth-panel-hr-bg: var(--bs-body-bg)}body.auth-panel-dark{--mojo-auth-panel-bg: #2d3748;--mojo-auth-panel-border: rgba(255, 255, 255, .15);--mojo-auth-panel-shadow: 0 8px 32px rgba(0, 0, 0, .25);--mojo-auth-panel-text: #f7fafc;--mojo-auth-panel-text-muted: #a0aec0;--mojo-auth-panel-input-bg: #1a202c;--mojo-auth-panel-input-border: #4a5568;--mojo-auth-panel-input-color: #f7fafc;--mojo-auth-panel-hr-bg: #2d3748}body.auth-panel-translucent{--mojo-auth-panel-bg: rgba(255, 255, 255, .85);--mojo-auth-panel-border: rgba(255, 255, 255, .2);--mojo-auth-panel-shadow: 0 8px 32px rgba(0, 0, 0, .1);--mojo-auth-panel-text: #2d3748;--mojo-auth-panel-text-muted: #4a5568;--mojo-auth-panel-input-bg: rgba(255, 255, 255, .7);--mojo-auth-panel-input-border: rgba(0, 0, 0, .1);--mojo-auth-panel-input-color: #2d3748;--mojo-auth-panel-hr-bg: transparent}body.auth-bg-dark.auth-panel-translucent,body.auth-bg-gradient.auth-panel-translucent{--mojo-auth-panel-bg: rgba(45, 55, 72, .75);--mojo-auth-panel-border: rgba(255, 255, 255, .1);--mojo-auth-panel-text: #f7fafc;--mojo-auth-panel-text-muted: #a0aec0;--mojo-auth-panel-input-bg: rgba(26, 32, 44, .7);--mojo-auth-panel-input-border: rgba(255, 255, 255, .2);--mojo-auth-panel-input-color: #f7fafc;--mojo-auth-panel-hr-bg: transparent}.auth-page{background:var(--mojo-auth-bg);min-height:100vh;font-family:var(--bs-font-sans-serif);transition:background .3s ease-in-out}.auth-page .card{background:var(--mojo-auth-panel-bg)!important;border:1px solid var(--mojo-auth-panel-border);border-radius:var(--mojo-auth-border-radius);box-shadow:var(--mojo-auth-panel-shadow);color:var(--mojo-auth-panel-text);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:transform .2s ease,box-shadow .2s ease,background .3s ease,border .3s 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-label{font-weight:500;color:var(--mojo-auth-panel-text)}.auth-page .form-text{color:var(--mojo-auth-panel-text-muted)}.auth-page .form-control{background-color:var(--mojo-auth-panel-input-bg);border:1px solid var(--mojo-auth-panel-input-border);color:var(--mojo-auth-panel-input-color);border-radius:var(--bs-border-radius);transition:var(--mojo-auth-transition)}.auth-page .form-control::placeholder{color:var(--mojo-auth-panel-text-muted);opacity:.7}.auth-page .form-control:focus,.auth-page .form-check-input:focus{border-color:var(--mojo-auth-primary);box-shadow:0 0 0 .25rem #667eea40;outline:none}.auth-page .text-muted{color:var(--mojo-auth-panel-text-muted)!important}.auth-page .position-relative hr{border-color:var(--mojo-auth-panel-border);opacity:.75}.auth-page .position-relative .position-absolute{background:var(--mojo-auth-panel-hr-bg);color:var(--mojo-auth-panel-text-muted);padding:0 1rem;font-size:.875rem;font-weight:500}.auth-page .btn-primary{background:linear-gradient(135deg,var(--mojo-auth-primary) 0%,var(--mojo-auth-secondary) 100%);border:none;border-radius:var(--bs-border-radius);font-weight:500;transition:var(--mojo-auth-transition)}.auth-page .btn-primary:hover:not(:disabled){background:linear-gradient(135deg,var(--mojo-auth-primary-dark) 0%,var(--mojo-auth-secondary) 100%);transform:translateY(-1px);box-shadow:0 4px 12px #667eea4d}.auth-page a{color:var(--mojo-auth-primary);text-decoration:none;transition:color .2s ease}.auth-page a:hover{color:var(--mojo-auth-primary-dark);text-decoration:underline}.auth-footer-links a{color:var(--mojo-auth-panel-text-muted);text-decoration:none;transition:all .2s ease}.auth-footer-links a:hover{color:var(--mojo-auth-primary);text-decoration:underline}body.auth-panel-dark .auth-footer-links a{opacity:.8}body.auth-panel-dark .auth-footer-links a:hover{opacity:1}body.auth-panel-dark .alert-danger{background-color:#dc354533;color:#f8d7da}body.auth-panel-dark .alert-success{background-color:#19875433;color:#d1e7dd}.auth-page .form-check-input:checked{background-color:var(--mojo-auth-primary);border-color:var(--mojo-auth-primary)}.auth-page .progress{background-color:#e9ecef;border-radius:2px;height:4px}.auth-page .alert{border-radius:var(--bs-border-radius);border:none;box-shadow:var(--bs-box-shadow-sm)}@media (max-width: 768px){.auth-page{padding:1rem 0}.auth-page .card{margin:0 1rem}}.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}}.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}}.mini-chart{display:block;width:100%}.mini-chart-wrapper{position:relative;display:block;width:100%}.mini-chart-svg{display:block;width:100%;height:100%}@keyframes mini-chart-draw{to{stroke-dashoffset:0}}@keyframes mini-chart-bar-grow{to{transform:scaleY(1)}}.metrics-mini-chart-container{display:flex;align-items:center;gap:1rem;padding:1rem;background:var(--chart-bg);border:1px solid var(--chart-border);border-radius:.5rem;transition:all .2s ease}.metrics-mini-chart-container:hover{box-shadow:var(--chart-shadow);border-color:var(--bs-primary)}.metrics-mini-chart-vertical{flex-direction:column;align-items:stretch;text-align:center}.metrics-mini-chart-vertical .metrics-chart{margin-top:.5rem}.metrics-mini-chart-horizontal{flex-direction:row;justify-content:space-between}.metrics-info{flex:1;min-width:0}.metrics-label{font-size:.875rem;color:var(--chart-text-muted);font-weight:500;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.metrics-value-row{display:flex;align-items:baseline;gap:.5rem;flex-wrap:wrap}.metrics-value{font-size:1.5rem;font-weight:700;color:var(--chart-text);line-height:1.2}.metrics-trend{display:inline-flex;align-items:center;gap:.25rem;padding:.125rem .5rem;font-size:.75rem;font-weight:600;border-radius:.25rem;line-height:1.5}.metrics-trend.trend-up{color:#198754;background-color:#1987541a}.metrics-trend.trend-down{color:#dc3545;background-color:#dc35451a}.metrics-trend i{font-size:.875rem}.metrics-chart{flex-shrink:0;display:flex;align-items:center}.metrics-mini-chart-sm .metrics-value{font-size:1.25rem}.metrics-mini-chart-sm .metrics-label{font-size:.75rem}.metrics-mini-chart-sm .metrics-chart{width:80px;height:30px}.metrics-mini-chart-md .metrics-chart{width:100px;height:40px}.metrics-mini-chart-lg .metrics-value{font-size:2rem}.metrics-mini-chart-lg .metrics-label{font-size:1rem}.metrics-mini-chart-lg .metrics-chart{width:120px;height:50px}.metrics-mini-chart-success{border-left:4px solid #198754}.metrics-mini-chart-success .metrics-value{color:#198754}.metrics-mini-chart-danger{border-left:4px solid #dc3545}.metrics-mini-chart-danger .metrics-value{color:#dc3545}.metrics-mini-chart-warning{border-left:4px solid #ffc107}.metrics-mini-chart-warning .metrics-value{color:#ffc107}.metrics-mini-chart-info{border-left:4px solid #0dcaf0}.metrics-mini-chart-info .metrics-value{color:#0dcaf0}[data-theme=dark] .metrics-trend.trend-up{color:#75b798;background-color:#75b79826}[data-theme=dark] .metrics-trend.trend-down{color:#ea868f;background-color:#ea868f26}@media (max-width: 575.98px){.metrics-mini-chart-container{flex-direction:column;align-items:flex-start}.metrics-mini-chart-horizontal .metrics-chart{align-self:stretch}.metrics-mini-chart-horizontal .mini-chart-svg{width:100%;height:40px}}@media (prefers-reduced-motion: reduce){.mini-chart-svg path,.mini-chart-svg rect{animation:none!important}.metrics-mini-chart-container{transition:none}}.mini-chart-tooltip{position:absolute;background:#000000d9;color:#fff;padding:.375rem .625rem;border-radius:.375rem;font-size:.75rem;line-height:1.4;pointer-events:none;white-space:nowrap;z-index:1000;box-shadow:0 2px 8px #00000026}.mini-chart-tooltip strong{font-weight:600}.mini-chart-tooltip-label{font-size:.6875rem;opacity:.8;margin-bottom:.125rem}[data-theme=dark] .mini-chart-tooltip{background:#ffffffe6;color:#212529}: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}}
|
package/dist/docit.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./chunks/WebApp-KZbQxSrZ.js"),e=require("./chunks/TopNav-ChmlxQ5s.js"),o=require("./chunks/Page-BvVfjiCv.js"),i=require("./chunks/ContextMenu-DmPpGvRg.js"),s=require("./chunks/TokenManager-Bv9T1Pxb.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 i.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 i.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 i.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 i.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 i.ToastService,this.currentBook=null,this.sidebar=null,this.isDocItReady=!1,this.tokenManager=new s.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 i.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;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./chunks/WebApp-CO6Mdt_i.js"),e=require("./chunks/TopNav-DuAz_KgP.js"),o=require("./chunks/Page-BobsRBF8.js"),i=require("./chunks/ContextMenu-rQItz6uC.js"),s=require("./chunks/TokenManager-Bv9T1Pxb.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 i.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 i.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 i.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 i.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 i.ToastService,this.currentBook=null,this.sidebar=null,this.isDocItReady=!1,this.tokenManager=new s.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 i.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
2
|
//# sourceMappingURL=docit.cjs.js.map
|
package/dist/docit.es.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { V as View, W as WebApp } from "./chunks/WebApp-
|
|
2
|
-
import { B, b, a, c, e, f } from "./chunks/WebApp-
|
|
3
|
-
import { T as TopNav } from "./chunks/TopNav-
|
|
4
|
-
import { P as Page } from "./chunks/Page-
|
|
5
|
-
import { M as Model, C as Collection, b as ContextMenu, T as ToastService, U as User } from "./chunks/ContextMenu-
|
|
1
|
+
import { V as View, W as WebApp } from "./chunks/WebApp-CfHuLFxV.js";
|
|
2
|
+
import { B, b, a, c, e, f } from "./chunks/WebApp-CfHuLFxV.js";
|
|
3
|
+
import { T as TopNav } from "./chunks/TopNav-CeCIt_Mv.js";
|
|
4
|
+
import { P as Page } from "./chunks/Page-Cvz7ziJA.js";
|
|
5
|
+
import { M as Model, C as Collection, b as ContextMenu, T as ToastService, U as User } from "./chunks/ContextMenu-Dxnc7zGe.js";
|
|
6
6
|
import { T as TokenManager } from "./chunks/TokenManager-Fjt083wv.js";
|
|
7
7
|
class DocNavSidebar extends View {
|
|
8
8
|
constructor(options = {}) {
|