@kedem/okdb 1.0.1 → 1.0.4
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/bin/okdb.js +1 -1
- package/keys/public.pem +3 -0
- package/okdb.js +1 -1
- package/package.json +2 -2
- package/public/admin-app.js +1 -1
- package/public/components/admin-route-host.ok.js +1 -1
- package/public/components/env-picker.ok.js +1 -1
- package/public/components/field-path-input.ok.js +1 -1
- package/public/components/field.html +154 -2
- package/public/components/geo-map.ok.js +1 -1
- package/public/components/ok-cron-input.ok.js +1 -1
- package/public/components/ok-dropzone.ok.js +1 -1
- package/public/components/ok-js-input.ok.js +1 -1
- package/public/components/ok-json-input.ok.js +1 -1
- package/public/components/ok-text-monaco-input.ok.js +1 -1
- package/public/components/theme-toggle.ok.js +1 -1
- package/public/index.html +29 -2
- package/public/layouts/_default.ok.html +1 -1
- package/public/layouts/okdb-cube.ok.html +1 -1
- package/public/login-app.js +1 -1
- package/public/login.html +205 -1
- package/public/modules/ok.js +1 -1
- package/public/sections/api/index.ok.html +1 -1
- package/public/sections/api/parts/api-endpoint.ok.js +1 -1
- package/public/sections/auth/index.ok.html +1 -1
- package/public/sections/auth/modals/create-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/edit-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/perm-info-popover.ok.js +1 -1
- package/public/sections/auth/parts/token-detail.ok.js +1 -1
- package/public/sections/auth/parts/token-list.ok.js +1 -1
- package/public/sections/db/index.ok.html +1 -1
- package/public/sections/db/modals/add-item-modal.ok.js +1 -1
- package/public/sections/db/modals/create-env-modal.ok.js +1 -1
- package/public/sections/db/modals/create-fts-modal.ok.js +1 -1
- package/public/sections/db/modals/create-index-modal.ok.js +1 -1
- package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -1
- package/public/sections/db/modals/demo-env-modal.ok.js +1 -1
- package/public/sections/db/modals/remove-env-modal.ok.js +1 -1
- package/public/sections/db/modals/schema-edit-modal.ok.js +1 -1
- package/public/sections/db/parts/db-overview.ok.js +1 -1
- package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -1
- package/public/sections/db/parts/edit-row.ok.js +1 -1
- package/public/sections/db/parts/tm-timeline.ok.js +1 -1
- package/public/sections/db/parts/type-changelog.ok.js +1 -1
- package/public/sections/db/parts/type-list.ok.js +1 -1
- package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -1
- package/public/sections/db/parts/type-schema-tab.ok.js +1 -1
- package/public/sections/db/parts/type-viewer.ok.js +1 -1
- package/public/sections/db/parts/type-violations-tab.ok.js +1 -1
- package/public/sections/docs/index.ok.html +1 -1
- package/public/sections/embeddings/index.ok.html +1 -1
- package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/engines-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -1
- package/public/sections/engines/engine-panel-shared-style.js +1 -1
- package/public/sections/engines/engine-ui-utils.js +1 -1
- package/public/sections/engines/index.ok.html +1 -1
- package/public/sections/engines/modals/engine-modal.ok.js +1 -1
- package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -1
- package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -1
- package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -1
- package/public/sections/engines/parts/engine-resource-card.ok.js +1 -1
- package/public/sections/engines/parts/engine-row-item.ok.js +1 -1
- package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -1
- package/public/sections/files/index.ok.html +1 -1
- package/public/sections/files/parts/files-blob-status.ok.js +1 -1
- package/public/sections/files/parts/files-collection-list.ok.js +1 -1
- package/public/sections/files/parts/files-collection-panel.ok.js +1 -1
- package/public/sections/files/parts/files-file-list.ok.js +1 -1
- package/public/sections/files/parts/files-overview.ok.js +1 -1
- package/public/sections/files/parts/files-path-browser.ok.js +1 -1
- package/public/sections/files/parts/files-upload-panel.ok.js +1 -1
- package/public/sections/functions/index.ok.html +1 -1
- package/public/sections/functions/modals/function-modal.ok.js +1 -1
- package/public/sections/functions/parts/function-detail.ok.js +1 -1
- package/public/sections/functions/parts/function-logs.ok.js +1 -1
- package/public/sections/functions/parts/function-runner.ok.js +1 -1
- package/public/sections/functions/parts/functions-list.ok.js +1 -1
- package/public/sections/license/index.ok.html +1 -1
- package/public/sections/license/parts/license-panel.ok.js +1 -1
- package/public/sections/processors/index.ok.html +1 -1
- package/public/sections/queue/index.ok.html +1 -1
- package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/job-type-modal.ok.js +1 -1
- package/public/sections/queue/parts/ok-job-form.ok.js +1 -1
- package/public/sections/queue/parts/queue-buckets.ok.js +1 -1
- package/public/sections/queue/parts/queue-job-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-jobs.ok.js +1 -1
- package/public/sections/queue/parts/queue-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-workers.ok.js +1 -1
- package/public/sections/sync/index.ok.html +1 -1
- package/public/sections/sync/parts/sync-node-detail.ok.js +1 -1
- package/public/sections/sync/parts/sync-retention.ok.js +1 -1
- package/public/sections/sync/parts/sync-topology.ok.js +1 -1
- package/public/sections/system/index.ok.html +1 -1
- package/public/sections/system/modals/data-ops-modal.ok.js +1 -1
- package/public/sections/system/parts/system-api-panel.ok.js +1 -1
- package/public/sections/system/parts/system-auth-panel.ok.js +1 -1
- package/public/sections/system/parts/system-log-history.ok.js +1 -1
- package/public/sections/system/parts/system-log.ok.js +1 -1
- package/public/sections/system/parts/system-status.ok.js +1 -1
- package/public/sections/system/parts/system-sync-panel.ok.js +1 -1
- package/public/sections/views/index.ok.html +1 -1
- package/public/sections/views/modals/create-view-modal.ok.js +1 -1
- package/public/sections/views/parts/view-detail.ok.js +1 -1
- package/public/sections/views/parts/views-list.ok.js +1 -1
- package/public/sections/views/parts/views-overview.ok.js +1 -1
- package/public/setup-app.js +1 -1
- package/public/setup.html +189 -1
- package/public/stores/auth-store.js +1 -1
- package/public/stores/events-store.js +1 -1
- package/public/stores/functions-store.js +1 -1
- package/public/stores/okdb-store.js +1 -1
- package/public/stores/theme-store.js +1 -1
- package/public/test-cron-input.html +53 -3
- package/public/test-json-input.html +182 -3
- package/public/util/permissions.js +1 -1
- package/public/util/sift-schema.js +1 -1
- package/public/vendor/okjs/ok.esm.min.js +1 -2
- package/public/view-models/type-query-vm.js +1 -1
- package/okdb-data/default/data.mdb +0 -0
- package/okdb-data/default/lock.mdb +0 -0
- package/okdb-data/~log/data.mdb +0 -0
- package/okdb-data/~log/lock.mdb +0 -0
- package/okdb-data/~system/data.mdb +0 -0
- package/okdb-data/~system/lock.mdb +0 -0
- package/public/images/logo.png +0 -0
- package/public/images/logo.svg +0 -333
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import e from"@toolkit/components/ok-monaco.ok.js";import t from"../stores/theme-store.js";let n=!1,o=!1;export default{tag:"ok-js-input",dependencies:[e],attr:{value:{},theme:{default:"vs-dark"},options:{},language:{default:"javascript"},unsafe:{default:!1}},context:e=>({editorEl:null,lastText:"",get monacoTheme(){return"light"===t.current?"vs":"vs-dark"},get options(){return{minimap:{enabled:!1},automaticLayout:!0,wordWrap:"on",fontSize:13,lineNumbersMinChars:3,scrollBeyondLastLine:!1,renderWhitespace:"selection",tabSize:2,insertSpaces:!0,fixedOverflowWidgets:!0,...e.$attr.options}},onText(t){this.lastText=t??"",e.$dispatch("edit",this.lastText)},reset(){this.lastText="string"==typeof e.$attr.value?e.$attr.value:""}}),init(e){!function(){const e=globalThis.monaco;if(!e||n)return;n=!0;const t={ctx:"Execution context passed to the stored function. Shape depends on scope.","ctx.payload":"User-provided payload for the current run.","ctx.info":"Execution metadata: runId, scope, env, functionName, trigger, requestedAt.","ctx.log":"Structured logger for this run. Emits persisted function logs and live log events.","ctx.env":"Live facade for the function's environment. Includes data operations plus env.queue and env.files.","ctx.env.queue":"Queue facade scoped to the current environment.","ctx.env.files":"Files facade scoped to the current environment.","ctx.okdb":"⚠ UNSAFE: Full cross-environment database access. Only available when the function is marked unsafe: true.","ctx.signal":"AbortSignal tied to the runtime timeout for this execution."};e.languages.registerCompletionItemProvider("javascript",{triggerCharacters:[".","c"],provideCompletionItems(n,a){const i=n.getLineContent(a.lineNumber).slice(0,a.column-1),s=[],r=new e.Range(a.lineNumber,a.column,a.lineNumber,a.column);if((/\bctx?$/.test(i)||/(^|[^\w$])$/.test(i))&&s.push({label:"ctx",kind:e.languages.CompletionItemKind.Variable,insertText:"ctx",documentation:t.ctx,range:r}),/\bctx\.$/.test(i)){const n=["payload","info","log","signal","env"];o&&n.push("okdb");for(const o of n)s.push({label:o,kind:e.languages.CompletionItemKind.Property,insertText:o,documentation:t[`ctx.${o}`]||"",range:r})}if(/\bctx\.log\.?$/.test(i))for(const t of["info","warn","error","debug"])s.push({label:t,kind:e.languages.CompletionItemKind.Method,insertText:`${t}($1)`,insertTextRules:e.languages.CompletionItemInsertTextRule.InsertAsSnippet,documentation:`Log a ${t} message for this function run.`,range:r});if(/\bctx\.env\.$/.test(i))for(const n of["name","get","put","update","create","remove","query","getCount","registerType","queue","files"])s.push({label:n,kind:e.languages.CompletionItemKind.Property,insertText:n,documentation:t[`ctx.env.${n}`]||`Env facade member: ${n}`,range:r});if(/\bctx\.env\.queue\.$/.test(i))for(const t of["enqueue","getJob","list","updateJob","removeJob","addBucket","getBucket","listBuckets"])s.push({label:t,kind:e.languages.CompletionItemKind.Method,insertText:`${t}($1)`,insertTextRules:e.languages.CompletionItemInsertTextRule.InsertAsSnippet,documentation:`Env queue facade method: ${t}`,range:r});if(/\bctx\.env\.files\.$/.test(i))for(const t of["upload","stream","remove","get","list","getByPath"])s.push({label:t,kind:e.languages.CompletionItemKind.Method,insertText:`${t}($1)`,insertTextRules:e.languages.CompletionItemInsertTextRule.InsertAsSnippet,documentation:`Env files facade method: ${t}`,range:r});if(o&&/\bctx\.okdb\.$/.test(i))for(const n of["env","createEnvironment","removeEnvironment","get","put","update","create","remove","query","ensureType","registerType","queue","files"])s.push({label:n,kind:e.languages.CompletionItemKind.Property,insertText:n,documentation:t[`ctx.okdb.${n}`]||`Global OKDB facade member: ${n}`,range:r});return{suggestions:s}}})}(),o=!!e.$attr.unsafe,e.$watch(()=>e.$attr.unsafe,e=>{o=!!e}),e.$watch(()=>e.$attr.value,()=>{(e.$attr.value??"")!==this.lastText&&this.reset()}),this.reset()},template:'\n <ok-monaco\n style="height:100%; width:100%;"\n language="javascript"\n @mount="editorEl = $el"\n @editor-change="onText($event.detail)"\n :value="lastText"\n :theme="monacoTheme"\n :options\n ></ok-monaco>\n ',style:"\n [tag] {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n }\n\n [tag] ok-monaco {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n }\n\n [tag] ok-monaco > div {\n flex: 1;\n width: 100% !important;\n height: 100% !important;\n box-sizing: border-box;\n }\n "};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x3b476e=_0x27ac;(function(_0x183ba9,_0x35ea45){const _0x58d879=_0x27ac,_0x4aa83d=_0x183ba9();while(!![]){try{const _0xdbd933=-parseInt(_0x58d879(0xef))/0x1*(parseInt(_0x58d879(0x10b))/0x2)+-parseInt(_0x58d879(0xd9))/0x3+-parseInt(_0x58d879(0x11d))/0x4*(-parseInt(_0x58d879(0xfa))/0x5)+-parseInt(_0x58d879(0xf4))/0x6*(parseInt(_0x58d879(0x118))/0x7)+-parseInt(_0x58d879(0x103))/0x8*(parseInt(_0x58d879(0xe0))/0x9)+parseInt(_0x58d879(0x109))/0xa+parseInt(_0x58d879(0x10d))/0xb;if(_0xdbd933===_0x35ea45)break;else _0x4aa83d['push'](_0x4aa83d['shift']());}catch(_0x3e7e96){_0x4aa83d['push'](_0x4aa83d['shift']());}}}(_0x174b,0xb4a45));import _0x58259a from'@toolkit/components/ok-monaco.ok.js';import _0x22e818 from'../stores/theme-store.js';function _0x174b(){const _0x1c4c94=['shiftKey','editorEl','parse','7zUUUjp','push','getEditor','KeyCode','monaco','224836DqjhFP','none','change','input','175482sUSmwt','languages','message','mode','$ok','options','schema','9cFhdiN','lineNumber','parse-error','mergeClass','lastValid','$attr','stopPropagation','auto','\x0a\x20\x20\x20\x20\x20\x20\x20\x20[tag].textbox\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex:1;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex-direction:column;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20min-height:0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:100%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20[tag].input\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:inline-flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex:0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:auto;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20min-width:12rem;\x20/*\x20or\x20whatever\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:2rem;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20the\x20editor\x20container\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20[tag]\x20ok-monaco\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20min-width:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20min-height:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20force\x20monaco\x20inner\x20container\x20to\x20fill\x20space\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20[tag]\x20ok-monaco\x20>\x20div\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x20100%\x20!important;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:\x20100%\x20!important;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20box-sizing:\x20border-box;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20','metaKey','hidden','$dispatch','toString','_schemaUri','jsonDefaults','10tsRTsk','getPositionAt','resetEditor','commitOnEnter','setDiagnosticsOptions','482772oFVnVQ','solid','$watch','stringify','MarkerSeverity','off','35LnGUsE','onKeyDown','column','updateOptions','match','current','delete','set','onText','5100808tBTCSP','$cache','value','json','getModel','util','7434070DMAKFu','editor','114074tJrIcu','setModelMarkers','10449626MnIASI','textbox','applyValidationMarkers','vs-dark','edit','lastText','Enter','ok-json-input'];_0x174b=function(){return _0x1c4c94;};return _0x174b();}const n=new Map();function i(){const _0x492175=_0x27ac,_0x3adc9c=window['monaco'];if(!_0x3adc9c?.[_0x492175(0xda)]?.['json']?.[_0x492175(0xee)])return;const _0x34ae41=[];for(const [_0xdc5241,_0x455218]of n)_0x34ae41[_0x492175(0x119)]({'uri':_0xdc5241,'fileMatch':[_0xdc5241],'schema':_0x455218});_0x3adc9c[_0x492175(0xda)][_0x492175(0x106)][_0x492175(0xee)][_0x492175(0xf3)]({'validate':!0x0,'allowComments':!0x1,'enableSchemaRequest':!0x1,'schemas':_0x34ae41});}function _0x27ac(_0x5f3f4f,_0x289300){_0x5f3f4f=_0x5f3f4f-0xd9;const _0x174b2a=_0x174b();let _0x27acfa=_0x174b2a[_0x5f3f4f];return _0x27acfa;}export default{'tag':_0x3b476e(0x114),'dependencies':[_0x58259a],'attr':{'value':{},'mode':{'default':_0x3b476e(0x10e)},'theme':{'default':_0x3b476e(0x110)},'class':{'transform':(_0x5422b2,_0x255e87)=>_0x5422b2[_0x3b476e(0xdd)][_0x3b476e(0x108)][_0x3b476e(0xe3)](_0x255e87,_0x5422b2[_0x3b476e(0xe5)]['mode'])},'options':{},'commitOnEnter':{'default':!0x0},'schema':{}},'context':_0x3e6440=>({'editorEl':null,'lastValid':null,'lastText':'','_schemaUri':null,get 'monacoTheme'(){const _0x4062a1=_0x3b476e;return'light'===_0x22e818[_0x4062a1(0xff)]?'vs':'vs-dark';},get 'mode'(){const _0x586519=_0x3b476e;return _0x3e6440[_0x586519(0xe5)][_0x586519(0xdc)];},get 'options'(){const _0x56e355=_0x3b476e,_0xa6a1e1=!!_0x3e6440[_0x56e355(0xe5)][_0x56e355(0xdf)];return{'lineNumbers':'off','glyphMargin':!0x1,'folding':!0x1,'renderLineHighlight':_0x56e355(0x11e),'lineDecorationsWidth':0x0,'lineNumbersMinChars':0x0,'minimap':{'enabled':!0x1},'overviewRulerBorder':!0x1,'overviewRulerLanes':0x0,'renderWhitespace':_0x56e355(0x11e),'renderIndentGuides':!0x1,'guides':{'indentation':!0x1,'highlightActiveIndentation':!0x1},'padding':{'top':0x0,'bottom':0x0},'cursorSmoothCaretAnimation':!0x1,'cursorBlinking':_0x56e355(0xf5),'quickSuggestions':_0xa6a1e1,'suggestOnTriggerCharacters':_0xa6a1e1,'parameterHints':{'enabled':!0x1},'contextmenu':!0x1,'rulers':[],'fixedOverflowWidgets':!0x0,..._0x56e355(0x120)===this[_0x56e355(0xdc)]?{'wordWrap':_0x56e355(0xf9),'scrollbar':{'vertical':_0x56e355(0xea),'horizontal':'hidden','useShadows':!0x1}}:{'wordWrap':'on','scrollbar':{'vertical':_0x56e355(0xe7),'horizontal':_0x56e355(0xea),'useShadows':!0x1}},..._0x3e6440['$attr'][_0x56e355(0xde)]};},'stringify'(_0x366680){const _0x35ae85=_0x3b476e;if(void 0x0===_0x366680)return'';try{return _0x35ae85(0x120)===this[_0x35ae85(0xdc)]?JSON[_0x35ae85(0xf7)](_0x366680):JSON[_0x35ae85(0xf7)](_0x366680,null,'\x09');}catch{return String(_0x366680??'');}},'applyValidationMarkers'(_0x55a466){const _0x53bb64=_0x3b476e,_0x3e9d34=window[_0x53bb64(0x11c)],_0x5a5595=this[_0x53bb64(0x11a)]();if(!_0x3e9d34||!_0x5a5595)return null;const _0x243f6b=_0x5a5595[_0x53bb64(0x107)]();try{const _0x5013ff=JSON[_0x53bb64(0x117)](_0x55a466);return _0x3e9d34[_0x53bb64(0x10a)][_0x53bb64(0x10c)](_0x243f6b,_0x53bb64(0x106),[]),_0x5013ff;}catch(_0x2643e9){const _0x4c84b3=_0x2643e9[_0x53bb64(0xdb)],_0x52ebe3=_0x4c84b3[_0x53bb64(0xfe)](/at position (\d+)/),_0x1cebdf=_0x52ebe3?parseInt(_0x52ebe3[0x1],0xa):0x0,_0x1259e9=_0x243f6b[_0x53bb64(0xf0)](_0x1cebdf);return _0x3e9d34[_0x53bb64(0x10a)][_0x53bb64(0x10c)](_0x243f6b,_0x53bb64(0x106),[{'startLineNumber':_0x1259e9[_0x53bb64(0xe1)],'startColumn':_0x1259e9[_0x53bb64(0xfc)],'endLineNumber':_0x1259e9[_0x53bb64(0xe1)],'endColumn':_0x1259e9[_0x53bb64(0xfc)]+0x1,'message':_0x4c84b3,'severity':_0x3e9d34[_0x53bb64(0xf8)]['Error']}]),_0x2643e9;}},'getEditor'(){const _0x37892f=_0x3b476e;return this[_0x37892f(0x116)]?.['$scope']?.[_0x37892f(0x104)]?.[_0x37892f(0x10a)]||null;},'onText'(_0xb97c98,_0x17fb67=!0x0){const _0x1e3236=_0x3b476e;if(_0xb97c98===this['lastText'])return;this[_0x1e3236(0x112)]=_0xb97c98;const _0x5bafa0=this[_0x1e3236(0x10f)](_0xb97c98);_0x5bafa0 instanceof Error?_0x17fb67&&_0x3e6440[_0x1e3236(0xeb)](_0x1e3236(0xe2),!0x0):(this['lastValid']=_0x5bafa0,_0x17fb67&&(_0x3e6440[_0x1e3236(0xeb)](_0x1e3236(0x111),_0x5bafa0),_0x3e6440[_0x1e3236(0xeb)](_0x1e3236(0xe2),!0x1)));},'resetEditor'(_0x57dec6=!0x0){const _0x59f20e=_0x3b476e,_0x4af27f=this[_0x59f20e(0xf7)](_0x3e6440[_0x59f20e(0xe5)][_0x59f20e(0x105)]);this[_0x59f20e(0x102)](_0x4af27f,_0x57dec6);}}),'init'(_0x4975ca){const _0x149337=_0x3b476e;_0x4975ca['$watch'](()=>_0x4975ca[_0x149337(0xe5)]['value'],()=>{const _0x44b184=_0x149337;_0x4975ca[_0x44b184(0xe5)][_0x44b184(0x105)]!==this[_0x44b184(0xe4)]&&this[_0x44b184(0xf1)]();}),this['getEditor']()[_0x149337(0xfb)](_0x3c6d22=>{const _0x19549c=_0x149337;_0x3c6d22['keyCode']===monaco[_0x19549c(0x11b)][_0x19549c(0x113)]&&(_0x4975ca[_0x19549c(0xe5)][_0x19549c(0xf2)]&&!_0x3c6d22[_0x19549c(0x115)]||!_0x4975ca[_0x19549c(0xe5)][_0x19549c(0xf2)]&&(_0x3c6d22['ctrlKey']||_0x3c6d22[_0x19549c(0xe9)]))&&(_0x3c6d22['preventDefault'](),_0x3c6d22[_0x19549c(0xe6)](),''===this[_0x19549c(0x112)]?_0x4975ca[_0x19549c(0xeb)](_0x19549c(0x11f),void 0x0):null!==this[_0x19549c(0xe4)]&&_0x4975ca[_0x19549c(0xeb)]('change',this[_0x19549c(0xe4)]));}),this[_0x149337(0xf1)](!0x1);const _0x4ff671=()=>{const _0xb1f424=_0x149337;if(this['_schemaUri'])return this[_0xb1f424(0xed)];const _0x5dd08f=this['getEditor']();return _0x5dd08f?(this[_0xb1f424(0xed)]=_0x5dd08f['getModel']()?.['uri']?.[_0xb1f424(0xec)]()??null,this['_schemaUri']):null;},_0x4cceee=_0x16cfb7=>{const _0x573476=_0x149337,_0x7818f3=_0x4ff671();if(!_0x7818f3)return;if(_0x16cfb7){let _0xfa3773;try{_0xfa3773=JSON[_0x573476(0x117)](JSON['stringify'](_0x16cfb7));}catch{_0xfa3773=_0x16cfb7;}n[_0x573476(0x101)](_0x7818f3,_0xfa3773);}else n[_0x573476(0x100)](_0x7818f3);i();const _0x264d95=this[_0x573476(0x11a)]();_0x264d95&&_0x264d95[_0x573476(0xfd)]({'quickSuggestions':!!_0x16cfb7,'suggestOnTriggerCharacters':!!_0x16cfb7,'fixedOverflowWidgets':!0x0});};_0x4975ca[_0x149337(0xe5)][_0x149337(0xdf)]&&_0x4cceee(_0x4975ca[_0x149337(0xe5)]['schema']),_0x4975ca[_0x149337(0xf6)](()=>_0x4975ca[_0x149337(0xe5)][_0x149337(0xdf)],_0x1aba90=>{_0x4cceee(_0x1aba90);});},'unmount'(){const _0xf00b7c=_0x3b476e;this[_0xf00b7c(0xed)]&&(n[_0xf00b7c(0x100)](this[_0xf00b7c(0xed)]),i(),this[_0xf00b7c(0xed)]=null);},'template':'\x0a\x20\x20\x20\x20\x20\x20\x20\x20<ok-monaco\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22height:\x20100%\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20language=\x22json\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@mount=\x22editorEl\x20=\x20$el\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@editor-change=\x22onText($event.detail)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22lastText\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:theme=\x22monacoTheme\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:options\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></ok-monaco>\x0a\x20\x20\x20\x20','style':_0x3b476e(0xe8)};
|
|
1
|
+
import t from"@toolkit/components/ok-monaco.ok.js";import e from"../stores/theme-store.js";const n=new Map;function i(){const t=window.monaco;if(!t?.languages?.json?.jsonDefaults)return;const e=[];for(const[t,i]of n)e.push({uri:t,fileMatch:[t],schema:i});t.languages.json.jsonDefaults.setDiagnosticsOptions({validate:!0,allowComments:!1,enableSchemaRequest:!1,schemas:e})}export default{tag:"ok-json-input",dependencies:[t],attr:{value:{},mode:{default:"textbox"},theme:{default:"vs-dark"},class:{transform:(t,e)=>t.$ok.util.mergeClass(e,t.$attr.mode)},options:{},commitOnEnter:{default:!0},schema:{}},context:t=>({editorEl:null,lastValid:null,lastText:"",_schemaUri:null,get monacoTheme(){return"light"===e.current?"vs":"vs-dark"},get mode(){return t.$attr.mode},get options(){const e=!!t.$attr.schema;return{lineNumbers:"off",glyphMargin:!1,folding:!1,renderLineHighlight:"none",lineDecorationsWidth:0,lineNumbersMinChars:0,minimap:{enabled:!1},overviewRulerBorder:!1,overviewRulerLanes:0,renderWhitespace:"none",renderIndentGuides:!1,guides:{indentation:!1,highlightActiveIndentation:!1},padding:{top:0,bottom:0},cursorSmoothCaretAnimation:!1,cursorBlinking:"solid",quickSuggestions:e,suggestOnTriggerCharacters:e,parameterHints:{enabled:!1},contextmenu:!1,rulers:[],fixedOverflowWidgets:!0,..."input"===this.mode?{wordWrap:"off",scrollbar:{vertical:"hidden",horizontal:"hidden",useShadows:!1}}:{wordWrap:"on",scrollbar:{vertical:"auto",horizontal:"hidden",useShadows:!1}},...t.$attr.options}},stringify(t){if(void 0===t)return"";try{return"input"===this.mode?JSON.stringify(t):JSON.stringify(t,null,"\t")}catch{return String(t??"")}},applyValidationMarkers(t){const e=window.monaco,n=this.getEditor();if(!e||!n)return null;const i=n.getModel();try{const n=JSON.parse(t);return e.editor.setModelMarkers(i,"json",[]),n}catch(t){const n=t.message,r=n.match(/at position (\d+)/),o=r?parseInt(r[1],10):0,s=i.getPositionAt(o);return e.editor.setModelMarkers(i,"json",[{startLineNumber:s.lineNumber,startColumn:s.column,endLineNumber:s.lineNumber,endColumn:s.column+1,message:n,severity:e.MarkerSeverity.Error}]),t}},getEditor(){return this.editorEl?.$scope?.$cache?.editor||null},onText(e,n=!0){if(e===this.lastText)return;this.lastText=e;const i=this.applyValidationMarkers(e);i instanceof Error?n&&t.$dispatch("parse-error",!0):(this.lastValid=i,n&&(t.$dispatch("edit",i),t.$dispatch("parse-error",!1)))},resetEditor(e=!0){const n=this.stringify(t.$attr.value);this.onText(n,e)}}),init(t){t.$watch(()=>t.$attr.value,()=>{t.$attr.value!==this.lastValid&&this.resetEditor()}),this.getEditor().onKeyDown(e=>{e.keyCode===monaco.KeyCode.Enter&&(t.$attr.commitOnEnter&&!e.shiftKey||!t.$attr.commitOnEnter&&(e.ctrlKey||e.metaKey))&&(e.preventDefault(),e.stopPropagation(),""===this.lastText?t.$dispatch("change",void 0):null!==this.lastValid&&t.$dispatch("change",this.lastValid))}),this.resetEditor(!1);const e=()=>{if(this._schemaUri)return this._schemaUri;const t=this.getEditor();return t?(this._schemaUri=t.getModel()?.uri?.toString()??null,this._schemaUri):null},r=t=>{const r=e();if(!r)return;if(t){let e;try{e=JSON.parse(JSON.stringify(t))}catch{e=t}n.set(r,e)}else n.delete(r);i();const o=this.getEditor();o&&o.updateOptions({quickSuggestions:!!t,suggestOnTriggerCharacters:!!t,fixedOverflowWidgets:!0})};t.$attr.schema&&r(t.$attr.schema),t.$watch(()=>t.$attr.schema,t=>{r(t)})},unmount(){this._schemaUri&&(n.delete(this._schemaUri),i(),this._schemaUri=null)},template:'\n <ok-monaco\n style="height: 100%"\n language="json"\n @mount="editorEl = $el"\n @editor-change="onText($event.detail)"\n :value="lastText"\n :theme="monacoTheme"\n :options\n ></ok-monaco>\n ',style:"\n [tag].textbox {\n display:flex;\n flex:1;\n flex-direction:column;\n min-height:0;\n width:100%;\n }\n \n [tag].input {\n display:inline-flex;\n flex:0;\n width:auto;\n min-width:12rem; /* or whatever */\n height:2rem;\n }\n \n /* the editor container */\n [tag] ok-monaco {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n }\n\n /* force monaco inner container to fill space */\n [tag] ok-monaco > div {\n flex: 1;\n width: 100% !important;\n height: 100% !important;\n box-sizing: border-box;\n }\n "};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import t from"@toolkit/components/ok-monaco.ok.js";import e from"../stores/theme-store.js";export default{tag:"ok-text-monaco-input",dependencies:[t],attr:{value:{},theme:{default:"vs-dark"},options:{},language:{default:"json"}},context:t=>({lastText:"",get monacoTheme(){return"light"===e.current?"vs":"vs-dark"},get options(){return{minimap:{enabled:!1},automaticLayout:!0,wordWrap:"on",fontSize:13,scrollBeyondLastLine:!1,fixedOverflowWidgets:!0,...t.$attr.options}},onText(e){this.lastText=e??"",t.$dispatch("edit",this.lastText)},reset(){this.lastText="string"==typeof t.$attr.value?t.$attr.value:""}}),init(t){t.$watch(()=>t.$attr.value,()=>{(t.$attr.value??"")!==this.lastText&&this.reset()}),this.reset()},template:'\n <ok-monaco\n style="height:100%; width:100%;"\n :language="$attr.language"\n @editor-change="onText($event.detail)"\n :value="lastText"\n :theme="monacoTheme"\n :options\n ></ok-monaco>\n ',style:"\n [tag] {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n }\n\n [tag] ok-monaco {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n }\n\n [tag] ok-monaco > div {\n flex: 1;\n width: 100% !important;\n height: 100% !important;\n box-sizing: border-box;\n }\n "};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import n from"../stores/theme-store.js";export default{tag:"theme-toggle",context(t){const r={current:n.current,toggle(){n.toggle()}},e=n.subscribe(n=>{r.current=n});return t.$ext("unmount",e),r},template:'\n <button\n class="theme-toggle__btn"\n :title="current === \'dark\' ? \'Switch to light mode\' : \'Switch to dark mode\'"\n :aria-label="current === \'dark\' ? \'Switch to light mode\' : \'Switch to dark mode\'"\n @click="toggle()"\n >\n <if :="current === \'dark\'">\n \x3c!-- sun icon (currently dark, click → light) --\x3e\n <svg viewBox="0 0 24 24" width="16" height="16" fill="none"\n stroke="currentColor" stroke-width="2"\n stroke-linecap="round" stroke-linejoin="round">\n <circle cx="12" cy="12" r="4"/>\n <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"/>\n </svg>\n </if>\n <if :="current === \'light\'">\n \x3c!-- moon icon (currently light, click → dark) --\x3e\n <svg viewBox="0 0 24 24" width="16" height="16" fill="none"\n stroke="currentColor" stroke-width="2"\n stroke-linecap="round" stroke-linejoin="round">\n <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>\n </svg>\n </if>\n </button>\n ',style:"\n [tag] {\n position: fixed;\n top: 8px;\n right: 8px;\n z-index: 9999;\n line-height: 0;\n }\n [tag] .theme-toggle__btn {\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n border: 1px solid var(--okdb-app-border);\n background: var(--okdb-app-surface-2);\n color: var(--okdb-app-fg-muted);\n cursor: pointer;\n transition: background .15s, color .15s, border-color .15s, transform .1s;\n }\n [tag] .theme-toggle__btn:hover {\n background: var(--okdb-app-surface-3);\n border-color: var(--okdb-app-border-strong);\n color: var(--okdb-app-fg);\n transform: none;\n box-shadow: none;\n }\n [tag] .theme-toggle__btn:active {\n transform: scale(0.94);\n }\n "};
|
package/public/index.html
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
|
-
<!DOCTYPE html
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<base href="./">
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<title>OKDB</title>
|
|
7
|
+
<link rel="stylesheet" href="styles.css">
|
|
8
|
+
<link rel="icon" type="image/png" href="favicon.ico">
|
|
9
|
+
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png">
|
|
10
|
+
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
|
|
11
|
+
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
|
|
12
|
+
<link rel="manifest" href="site.webmanifest">
|
|
13
|
+
<script type="importmap">
|
|
14
|
+
{
|
|
2
15
|
"imports": {
|
|
3
16
|
"@toolkit/": "./vendor/okjs/toolkit/",
|
|
4
17
|
"@okjs": "./vendor/okjs/ok.esm.min.js"
|
|
5
18
|
}
|
|
6
|
-
}
|
|
19
|
+
}
|
|
20
|
+
</script>
|
|
21
|
+
</head>
|
|
22
|
+
<body>
|
|
23
|
+
<hash-router let:router="$router">
|
|
24
|
+
<var :$route="$router.match('./:section/*') || {params: { section: 'db' }}">
|
|
25
|
+
<admin-route-host :section="$route?.params?.section || 'db'"></admin-route-host>
|
|
26
|
+
</var>
|
|
27
|
+
</hash-router>
|
|
28
|
+
|
|
29
|
+
<theme-toggle></theme-toggle>
|
|
30
|
+
|
|
31
|
+
<script type="module" src="admin-app.js"></script>
|
|
32
|
+
</body>
|
|
33
|
+
</html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<script type="module">import envPicker from"../components/env-picker.ok.js";import createEnvModal from"../sections/db/modals/create-env-modal.ok.js";import demoEnvModal from"../sections/db/modals/demo-env-modal.ok.js";import eventsStore from"../stores/events-store.js";export default{tag:"default-layout",unwrap:!0,dependencies:[envPicker,createEnvModal,demoEnvModal],context:e=>({noticesExpanded:!1,dismissNotices(n){n&&(n.stopPropagation(),n.preventDefault()),e.$ok.stores.auth.dismissNotices()},hasEnvOption:n=>!!n&&(e.$ok.stores.okdb.envs||[]).some(e=>e?.name===n),syncEnvSearch(n){const o=e.$vars.$router;if(!o)return;const t=n??null;if((o._search?.env??null)===t)return;const s={...o._search||{}};t?s.env=t:delete s.env,o.replace(o.resolve(o._path||"",s,o._anchor||""))},applyEnvFromSearch(){const n=e.$vars.$router,o=n?._search?.env??null;return!(!o||!this.hasEnvOption(o))&&(e.$ok.stores.okdb.selectedEnv!==o&&e.$ok.stores.okdb.selectEnv(o),!0)},goToSection(n){const o=e.$vars.$router;if(!o)return;const t={},s=e.$ok.stores.okdb.selectedEnv;s&&(t.env=s);const r="system"===n?"/system/overview":`/${n}`;o.push(o.resolve(r,t))},async switchEnv(n){e.$ok.stores.okdb.selectEnv(n),e.$ok.shared?.toast?.info?.(`Environment: ${n}`)},async openCreateEnvModal(){await e.$ok.shared.modal.open({owner:e,title:"Create Environment",content:'<create-env-modal :modal="modal" :on-done="onDone" />',context:n=>({modal:n,onDone:async n=>{await e.$ok.stores.okdb.reloadEnvs(),e.$ok.stores.okdb.selectEnv(n),e.$ok.shared?.toast?.success?.(`Environment created: ${n}`)}})})},async openDemoModal(){await e.$ok.shared.modal.open({owner:e,title:'<span style="background:linear-gradient(135deg,#4FC1FF,#c084fc 50%,#4ade80);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;font-weight:700;font-size:15px;">✦ Demo Environment</span>',canDrag:!0,content:'<demo-env-modal :modal="modal" :on-done="onDone" />',context:n=>({modal:n,onDone:async n=>{await e.$ok.stores.okdb.reloadEnvs(),e.$ok.stores.okdb.selectEnv(n),e.$ok.shared?.toast?.success?.(`Demo environment "${n}" ready`)}})})}}),init(e){const n=()=>e.$ok.shared?.toast;e.$cache._unsubs=[eventsStore.on("type:registered",e=>n()?.info?.(`Type registered: ${e?.type??""}`)),eventsStore.on("type:drop",e=>n()?.info?.(`Type dropped: ${e?.type??""}`)),eventsStore.on("index:registered",e=>n()?.info?.(`Index registered on ${e?.type??""}: ${e?.key??""}`)),eventsStore.on("index:drop",e=>n()?.info?.(`Index dropped on ${e?.type??""}: ${e?.key??""}`)),eventsStore.on("fts:registered",e=>n()?.info?.(`FTS index created on ${e?.type??""}: ${e?.key??""}`)),eventsStore.on("fts:drop",e=>n()?.info?.(`FTS index dropped on ${e?.type??""}: ${e?.key??""}`)),eventsStore.on("env:opened",e=>n()?.info?.(`Environment ready: ${e?.name??""}`)),eventsStore.on("env:removed",e=>n()?.info?.(`Environment removed: ${e?.name??""}`)),eventsStore.on("engine:started",e=>n()?.success?.(`Engine started: ${e?.name??""}`)),eventsStore.on("engine:stopped",e=>n()?.info?.(`Engine stopped: ${e?.name??""}`)),eventsStore.on("engine:error",e=>n()?.error?.(`Engine error: ${e?.name??""}: ${e?.error??""}`)),eventsStore.on("engine:installed",e=>n()?.success?.(`Engine installed: ${e?.name??""}`)),eventsStore.on("engine:uninstalled",e=>n()?.info?.(`Engine uninstalled: ${e?.name??""}`)),eventsStore.on("embeddings:pipeline:ready",e=>n()?.success?.(`Pipeline ready: ${e?.name??""}`)),eventsStore.on("embeddings:indexer:flushed",e=>n()?.success?.(`Embeddings flushed: ${e?.name??""}`))],e.$ext("unmount",()=>{for(const n of e.$cache._unsubs||[])n();e.$cache._unsubs=[]}),this.applyEnvFromSearch()||this.syncEnvSearch(e.$ok.stores.okdb.selectedEnv??null),e.$watch(()=>e.$vars.$router?._search?.env,()=>{const n=e.$vars.$router?._search?.env??null;n&&this.hasEnvOption(n)?e.$ok.stores.okdb.selectedEnv!==n&&e.$ok.stores.okdb.selectEnv(n):this.syncEnvSearch(e.$ok.stores.okdb.selectedEnv??null)}),e.$watch(()=>e.$ok.stores.okdb.selectedEnv,()=>this.syncEnvSearch(e.$ok.stores.okdb.selectedEnv??null))}}</script><template><div class="layout"><aside class="layout__sidebar"><div class="layout__sidebar-cube"><component import="./okdb-cube.ok.html"></component><span class="layout__version">v{{ $ok.stores.okdb.info?.version ?? '…' }}</span></div><div class="layout__env-picker"><env-picker :selected="$ok.stores.okdb.selectedEnv" :envs="$ok.stores.okdb.envs || []" @change="switchEnv($event.detail)" @create="openCreateEnvModal()"/></div><div class="layout__sidebar-body"><if :="$ok.stores.okdb.selectedEnv"><slot name="sidebar"></slot></if></div><div class="layout__sidebar-footer"><div class="layout__auth-chip layout__auth-chip--sidebar" :title="$ok.stores.auth?.modeLabel || 'Authentication'"><div class="layout__auth-meta"><div class="layout__auth-userblock"><div class="layout__auth-user">{{ $ok.stores.auth?.username || 'anonymous' }}</div><if :="$ok.stores.auth?.rolesLabel"><div class="layout__auth-roles">{{ $ok.stores.auth.rolesLabel }}</div></if></div></div><if :="!$ok.stores.auth?.openAccess"><button class="layout__auth-logout" @click="$ok.stores.auth.logout()">Logout</button></if></div></div></aside><div class="layout__right-col"><nav class="layout__section-nav"><button :class="{ active: $route.params.section === 'db' }" :disabled="!$ok.stores.auth.canSection('db')" :title="$ok.stores.auth.canSection('db') ? '' : 'Requires data:read or env:read permission'" @click="$ok.stores.auth.canSection('db') && goToSection('db')"><span class="layout__nav-icon">⬡</span> DB<if :="!$ok.stores.auth.canSection('db')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'engines' || $route.params.section === 'embeddings' }" :disabled="!$ok.stores.auth.canSection('engines')" :title="$ok.stores.auth.canSection('engines') ? '' : 'Requires env:read permission'" @click="$ok.stores.auth.canSection('engines') && goToSection('engines')"><span class="layout__nav-icon">⛓</span> Engines<if :="!$ok.stores.auth.canSection('engines')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'files' }" :disabled="!$ok.stores.auth.canSection('files')" :title="$ok.stores.auth.canSection('files') ? '' : 'Requires files:read permission'" @click="$ok.stores.auth.canSection('files') && goToSection('files')"><span class="layout__nav-icon">⬚</span> Files<if :="!$ok.stores.auth.canSection('files')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'queue' }" :disabled="!$ok.stores.auth.canSection('queue')" :title="$ok.stores.auth.canSection('queue') ? '' : 'Requires queue:read permission'" @click="$ok.stores.auth.canSection('queue') && goToSection('queue')"><span class="layout__nav-icon">⇶</span> Queue<if :="!$ok.stores.auth.canSection('queue')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'functions' }" :disabled="!$ok.stores.auth.canSection('functions')" :title="$ok.stores.auth.canSection('functions') ? '' : 'Requires functions:read permission'" @click="$ok.stores.auth.canSection('functions') && goToSection('functions')"><span class="layout__nav-icon">ƒ</span> Functions<if :="!$ok.stores.auth.canSection('functions')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'views' }" @click="goToSection('views')"><span class="layout__nav-icon">⊞</span> Views</button> <button :class="{ active: $route.params.section === 'system' }" :disabled="!$ok.stores.auth.canSection('system')" :title="$ok.stores.auth.canSection('system') ? '' : 'Requires system:read permission'" @click="$ok.stores.auth.canSection('system') && goToSection('system')"><span class="layout__nav-icon">⚙</span> System<if :="!$ok.stores.auth.canSection('system')"><span class="layout__nav-lock">🔒</span></if></button><div class="layout__live-indicator" :title="$ok.stores.events?.connected ? 'Event stream live' : 'Event stream disconnected'"><span :class="$ok.stores.events?.connected ? 'layout__live-dot layout__live-dot--on' : 'layout__live-dot layout__live-dot--off'"></span> <span class="layout__live-label">{{ $ok.stores.events?.connected ? 'Live' : 'Off' }}</span></div><div class="layout__security-pill" :title="($ok.stores.auth?.modeLabel || 'Authentication') + ' · ' + ($ok.stores.auth?.username || 'anonymous')"><span class="layout__security-dot" :class="$ok.stores.auth?.openAccess ? 'layout__security-dot layout__security-dot--open' : 'layout__security-dot layout__security-dot--secure'"></span> <span class="layout__security-label">{{ $ok.stores.auth?.openAccess ? 'Open access' : 'Secure' }}</span></div></nav><div class="layout__main"><if :="$ok.stores.auth?.visibleNotices?.length > 0"><div class="layout__notices"><div class="layout__notices-bar" @click="noticesExpanded = !noticesExpanded"><span class="layout__notices-icon">⚠</span> <span class="layout__notices-summary">{{ $ok.stores.auth.visibleNotices.length }} security notice{{ $ok.stores.auth.visibleNotices.length > 1 ? 's' : '' }}<if :="$ok.stores.auth.visibleNotices[0]">· {{ $ok.stores.auth.visibleNotices[0].title }}<if :="$ok.stores.auth.visibleNotices.length > 1">and {{ $ok.stores.auth.visibleNotices.length - 1 }} more</if></if></span><span class="layout__notices-chevron">{{ noticesExpanded ? '▴' : '▾' }}</span> <button class="layout__notices-dismiss" @click="dismissNotices($event)" title="Dismiss for this session">✕</button></div><if :="noticesExpanded"><div class="layout__notices-detail"><each :of="$ok.stores.auth.visibleNotices" let:item="n"><div class="layout__notice-item"><div class="layout__notice-title">{{ n.title }}</div><div class="layout__notice-msg">{{ n.message }}</div><if :="n.hint"><div class="layout__notice-hint">{{ n.hint }}</div></if><if :="n.action"><a class="layout__notice-action" :href="n.action.href">{{ n.action.label }} →</a></if></div></each></div></if></div></if><header class="layout__header"><slot name="header"></slot></header><main class="layout__content"><if :="$ok.stores.okdb.selectedEnv"><slot></slot></if><if :="!$ok.stores.okdb.selectedEnv"><div class="layout__no-env"><div class="layout__no-env-icon">⬡</div><div class="layout__no-env-title">No environment selected</div><div class="layout__no-env-sub">Create a new environment or load the demo to get started.</div><div class="layout__no-env-actions"><button @click="openCreateEnvModal()" class="layout__no-env-btn">+ Create environment</button> <button @click="openDemoModal()" class="layout__no-env-btn layout__no-env-btn--demo">✦ Load demo</button></div></div></if></main></div></div></div></template><style>.layout{display:flex;flex-direction:row;height:100%;width:100%;min-height:0}.layout__sidebar{display:flex;flex-direction:column;width:210px;flex-shrink:0;border-right:1px solid var(--okdb-app-surface-2);background:var(--okdb-app-bg-deep);overflow:visible}.layout__sidebar-cube{height:150px;flex-shrink:0;display:flex;align-items:center;justify-content:center;position:relative}.layout__version{position:absolute;bottom:8px;right:10px;font-size:10px;font-family:monospace;color:var(--okdb-app-fg-faint);letter-spacing:.04em;pointer-events:none;user-select:none;transition:color .2s}.layout__sidebar-cube:hover .layout__version{color:var(--okdb-app-fg-subtle)}.layout__env-picker{flex-shrink:0;padding:8px 10px 6px;border-top:1px solid var(--okdb-app-surface-2);border-bottom:1px solid var(--okdb-app-surface-2)}.layout__sidebar-body{flex:1;min-height:0;display:flex;flex-direction:column;gap:3px;padding:10px;border-top:1px solid var(--okdb-app-surface-2);overflow-y:auto;overflow-x:visible}.layout__sidebar-footer{flex-shrink:0;padding:8px 10px 10px;border-top:1px solid var(--okdb-app-surface-2);background:var(--okdb-app-bg-deep)}.layout__right-col{flex:1;min-width:0;display:flex;flex-direction:column;min-height:0}.layout__section-nav{display:flex;flex-direction:row;align-items:flex-end;height:150px;padding:0 8px;flex-shrink:0;background:var(--okdb-app-bg-deep);border-bottom:1px solid var(--okdb-app-surface-2)}.layout__section-nav button{display:flex;align-items:center;gap:7px;padding:0 16px;height:44px;border-radius:0;font-size:13px;font-weight:500;background:0 0;border:none;border-bottom:2px solid transparent;color:var(--okdb-app-fg-subtle);cursor:pointer;white-space:nowrap;letter-spacing:.01em;transition:color .15s,border-color .15s,background .15s;margin-bottom:-1px}.layout__section-nav button:hover{background:rgba(255,255,255,.03);border-color:transparent;color:var(--okdb-app-fg-muted);border-bottom-color:var(--okdb-app-border-subtle);transform:none;box-shadow:none}.layout__section-nav button:disabled{opacity:.35;cursor:not-allowed;background:0 0!important;border-color:transparent!important;border-bottom-color:transparent!important;color:var(--okdb-app-fg-faint)!important}.layout__section-nav button:disabled:hover{background:0 0;transform:none;box-shadow:none}.layout__section-nav button.active{background:0 0;border-color:transparent;color:var(--okdb-accent);border-bottom-color:var(--okdb-accent)}.layout__nav-icon{font-size:14px;opacity:.7;flex-shrink:0}.layout__nav-lock{font-size:10px;margin-left:4px;opacity:.7;flex-shrink:0;vertical-align:middle}.layout__section-nav button:hover .layout__nav-icon{opacity:.9}.layout__section-nav button.active .layout__nav-icon{opacity:1}.layout__live-indicator{margin-left:auto;margin-right:8px;margin-bottom:11px;display:flex;align-items:center;gap:5px;cursor:default}.layout__live-dot{width:7px;height:7px;border-radius:50%;display:inline-block;flex-shrink:0}.layout__live-dot--on{background:var(--okdb-success);box-shadow:0 0 5px color-mix(in srgb,var(--okdb-success) 40%,transparent);animation:nav-pulse 2.5s ease-in-out infinite}.layout__live-dot--off{background:var(--okdb-danger);opacity:.6}.layout__live-label{font-size:10px;color:var(--okdb-app-fg-faint);letter-spacing:.04em;text-transform:uppercase}@keyframes nav-pulse{0%,100%{opacity:1}50%{opacity:.35}}.layout__security-pill{margin-bottom:9px;display:inline-flex;align-items:center;gap:7px;padding:6px 10px;border-radius:999px;border:1px solid var(--okdb-app-border);background:var(--okdb-app-bg);color:var(--okdb-app-fg-muted)}.layout__security-dot{width:7px;height:7px;border-radius:50%;display:inline-block;flex-shrink:0}.layout__security-dot--secure{background:var(--okdb-accent);box-shadow:0 0 6px var(--okdb-accent-soft-border)}.layout__security-dot--open{background:var(--okdb-warning);box-shadow:0 0 6px color-mix(in srgb,var(--okdb-warning) 33%,transparent)}.layout__security-label{font-size:10px;line-height:1;text-transform:uppercase;letter-spacing:.08em;white-space:nowrap}.layout__auth-chip{margin-bottom:9px;display:inline-flex;align-items:center;gap:10px;padding:6px 10px;border-radius:10px;border:1px solid var(--okdb-app-border);background:var(--okdb-app-bg)}.layout__auth-chip--sidebar{width:100%;margin-bottom:0;align-items:center;justify-content:space-between;gap:12px;padding:0;border-radius:0;background:0 0;border:none;box-shadow:none}.layout__auth-meta{display:flex;align-items:center;gap:0;min-width:0;flex:1}.layout__auth-userblock{display:flex;flex-direction:column;min-width:0}.layout__auth-badge{font-size:10px;line-height:1;text-transform:uppercase;letter-spacing:.05em;padding:4px 7px;border-radius:999px;border:1px solid transparent;white-space:nowrap}.layout__auth-badge--open{color:var(--okdb-success);background:#4ade8011;border-color:#4ade8033}.layout__auth-badge--users{color:var(--okdb-accent);background:#4fc1FF11;border-color:#4fc1FF33}.layout__auth-user{font-size:11px;font-weight:600;color:var(--okdb-app-fg);line-height:1.1;text-transform:uppercase;letter-spacing:.05em}.layout__auth-roles{font-size:10px;color:var(--okdb-app-fg-muted);line-height:1.1;margin-top:2px;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layout__auth-logout{font-size:11px;padding:0;border-radius:0;border:none;background:0 0;color:var(--okdb-danger);cursor:pointer;white-space:nowrap;align-self:center;letter-spacing:.04em;text-transform:uppercase;opacity:.88}.layout__auth-logout:hover{background:0 0;color:var(--okdb-danger-hover);opacity:1;transform:none;box-shadow:none}.layout__main{flex:1;display:flex;flex-direction:column;min-height:0;overflow:auto;padding:20px 24px 6px}.layout__header{flex-shrink:0}.layout__content{flex:1;min-height:0;min-width:0}.layout__content>*{animation:layout-fade-in .2s ease backwards}.layout__sidebar-body>*{animation:layout-fade-in .18s ease backwards}@keyframes layout-fade-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.layout__no-env{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:12px;animation:layout-fade-in .25s ease backwards}.layout__no-env-icon{font-size:48px;opacity:.12;line-height:1;margin-bottom:4px}.layout__no-env-title{font-size:18px;font-weight:600;color:var(--okdb-app-fg-muted)}.layout__no-env-sub{font-size:13px;color:var(--okdb-app-fg-subtle);text-align:center;max-width:320px;line-height:1.6}.layout__no-env-actions{display:flex;gap:10px;margin-top:8px}.layout__no-env-btn{padding:8px 18px;font-size:13px;border-radius:7px;border:1px solid var(--okdb-app-border);background:var(--okdb-app-surface);color:var(--okdb-app-fg-subtle);cursor:pointer;transition:background .12s,border-color .12s,color .12s}.layout__no-env-btn:hover{background:var(--okdb-app-surface-2);border-color:var(--okdb-app-border-strong);color:var(--okdb-app-fg-muted);transform:none;box-shadow:none}.layout__no-env-btn--demo{border-color:var(--okdb-accent-2-soft-border);background:var(--okdb-accent-2-soft-bg);color:var(--okdb-accent-2)}.layout__no-env-btn--demo:hover{background:var(--okdb-accent-2-soft-bg);border-color:var(--okdb-accent-2-soft-border);color:var(--okdb-accent-2);transform:none;box-shadow:none}.layout__notices{flex-shrink:0;margin:-20px -24px 16px;border-bottom:1px solid color-mix(in srgb,var(--okdb-warning) 22%,transparent);background:color-mix(in srgb,var(--okdb-warning) 5%,transparent)}.layout__notices-bar{display:flex;align-items:center;gap:10px;padding:9px 16px;cursor:pointer;user-select:none;transition:background .12s}.layout__notices-bar:hover{background:color-mix(in srgb,var(--okdb-warning) 9%,transparent)}.layout__notices-icon{font-size:15px;color:var(--okdb-warning);flex-shrink:0}.layout__notices-summary{font-size:12px;color:var(--okdb-warning-text);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layout__notices-chevron{font-size:14px;color:var(--okdb-warning-text);flex-shrink:0;line-height:1}.layout__notices-dismiss{font-size:14px;color:var(--okdb-warning-text);background:0 0;border:none;cursor:pointer;padding:3px 7px;border-radius:4px;flex-shrink:0;line-height:1;transition:color .1s,background .1s}.layout__notices-dismiss:hover{color:var(--okdb-warning);background:color-mix(in srgb,var(--okdb-warning) 15%,transparent)}.layout__notices-detail{padding:0 16px 14px;display:flex;flex-direction:column;gap:10px}.layout__notice-item{padding:12px 14px;border:1px solid color-mix(in srgb,var(--okdb-warning) 20%,transparent);border-radius:6px;background:color-mix(in srgb,var(--okdb-warning) 5%,transparent);display:flex;flex-direction:column;gap:6px}.layout__notice-title{font-size:13px;font-weight:600;color:var(--okdb-warning)}.layout__notice-msg{font-size:12px;color:var(--okdb-warning-text);line-height:1.55}.layout__notice-hint{font-size:12px;color:var(--okdb-warning-text);line-height:1.55;font-style:italic}.layout__notice-action{font-size:12px;color:var(--okdb-accent);text-decoration:none;margin-top:2px;display:inline-block}.layout__notice-action:hover{text-decoration:underline}</style>
|
|
1
|
+
<script type="module">import e from"../components/env-picker.ok.js";import n from"../sections/db/modals/create-env-modal.ok.js";import o from"../sections/db/modals/demo-env-modal.ok.js";import s from"../stores/events-store.js";export default{tag:"default-layout",unwrap:!0,dependencies:[e,n,o],context:e=>({noticesExpanded:!1,dismissNotices(n){n&&(n.stopPropagation(),n.preventDefault()),e.$ok.stores.auth.dismissNotices()},hasEnvOption:n=>!!n&&(e.$ok.stores.okdb.envs||[]).some(e=>e?.name===n),syncEnvSearch(n){const o=e.$vars.$router;if(!o)return;const s=n??null;if((o._search?.env??null)===s)return;const t={...o._search||{}};s?t.env=s:delete t.env,o.replace(o.resolve(o._path||"",t,o._anchor||""))},applyEnvFromSearch(){const n=e.$vars.$router,o=n?._search?.env??null;return!(!o||!this.hasEnvOption(o)||(e.$ok.stores.okdb.selectedEnv!==o&&e.$ok.stores.okdb.selectEnv(o),0))},goToSection(n){const o=e.$vars.$router;if(!o)return;const s={},t=e.$ok.stores.okdb.selectedEnv;t&&(s.env=t);const r="system"===n?"/system/overview":`/${n}`;o.push(o.resolve(r,s))},async switchEnv(n){e.$ok.stores.okdb.selectEnv(n),e.$ok.shared?.toast?.info?.(`Environment: ${n}`)},async openCreateEnvModal(){await e.$ok.shared.modal.open({owner:e,title:"Create Environment",content:'<create-env-modal :modal="modal" :on-done="onDone" />',context:n=>({modal:n,onDone:async n=>{await e.$ok.stores.okdb.reloadEnvs(),e.$ok.stores.okdb.selectEnv(n),e.$ok.shared?.toast?.success?.(`Environment created: ${n}`)}})})},async openDemoModal(){await e.$ok.shared.modal.open({owner:e,title:'<span style="background:linear-gradient(135deg,#4FC1FF,#c084fc 50%,#4ade80);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;font-weight:700;font-size:15px;">✦ Demo Environment</span>',canDrag:!0,content:'<demo-env-modal :modal="modal" :on-done="onDone" />',context:n=>({modal:n,onDone:async n=>{await e.$ok.stores.okdb.reloadEnvs(),e.$ok.stores.okdb.selectEnv(n),e.$ok.shared?.toast?.success?.(`Demo environment "${n}" ready`)}})})}}),init(e){const n=()=>e.$ok.shared?.toast;e.$cache._unsubs=[s.on("type:registered",e=>n()?.info?.(`Type registered: ${e?.type??""}`)),s.on("type:drop",e=>n()?.info?.(`Type dropped: ${e?.type??""}`)),s.on("index:registered",e=>n()?.info?.(`Index registered on ${e?.type??""}: ${e?.key??""}`)),s.on("index:drop",e=>n()?.info?.(`Index dropped on ${e?.type??""}: ${e?.key??""}`)),s.on("fts:registered",e=>n()?.info?.(`FTS index created on ${e?.type??""}: ${e?.key??""}`)),s.on("fts:drop",e=>n()?.info?.(`FTS index dropped on ${e?.type??""}: ${e?.key??""}`)),s.on("env:opened",e=>n()?.info?.(`Environment ready: ${e?.name??""}`)),s.on("env:removed",e=>n()?.info?.(`Environment removed: ${e?.name??""}`)),s.on("engine:started",e=>n()?.success?.(`Engine started: ${e?.name??""}`)),s.on("engine:stopped",e=>n()?.info?.(`Engine stopped: ${e?.name??""}`)),s.on("engine:error",e=>n()?.error?.(`Engine error: ${e?.name??""}: ${e?.error??""}`)),s.on("engine:installed",e=>n()?.success?.(`Engine installed: ${e?.name??""}`)),s.on("engine:uninstalled",e=>n()?.info?.(`Engine uninstalled: ${e?.name??""}`)),s.on("embeddings:pipeline:ready",e=>n()?.success?.(`Pipeline ready: ${e?.name??""}`)),s.on("embeddings:indexer:flushed",e=>n()?.success?.(`Embeddings flushed: ${e?.name??""}`))],e.$ext("unmount",()=>{for(const n of e.$cache._unsubs||[])n();e.$cache._unsubs=[]}),this.applyEnvFromSearch()||this.syncEnvSearch(e.$ok.stores.okdb.selectedEnv??null),e.$watch(()=>e.$vars.$router?._search?.env,()=>{const n=e.$vars.$router?._search?.env??null;n&&this.hasEnvOption(n)?e.$ok.stores.okdb.selectedEnv!==n&&e.$ok.stores.okdb.selectEnv(n):this.syncEnvSearch(e.$ok.stores.okdb.selectedEnv??null)}),e.$watch(()=>e.$ok.stores.okdb.selectedEnv,()=>this.syncEnvSearch(e.$ok.stores.okdb.selectedEnv??null))}};</script><template><div class="layout"><aside class="layout__sidebar"><div class="layout__sidebar-cube"><component import="./okdb-cube.ok.html"></component><span class="layout__version">v{{ $ok.stores.okdb.info?.version ?? '…' }}</span></div><div class="layout__env-picker"><env-picker :selected="$ok.stores.okdb.selectedEnv" :envs="$ok.stores.okdb.envs || []" @change="switchEnv($event.detail)" @create="openCreateEnvModal()"/></div><div class="layout__sidebar-body"><if :="$ok.stores.okdb.selectedEnv"><slot name="sidebar"></slot></if></div><div class="layout__sidebar-footer"><div class="layout__auth-chip layout__auth-chip--sidebar" :title="$ok.stores.auth?.modeLabel || 'Authentication'"><div class="layout__auth-meta"><div class="layout__auth-userblock"><div class="layout__auth-user">{{ $ok.stores.auth?.username || 'anonymous' }}</div><if :="$ok.stores.auth?.rolesLabel"><div class="layout__auth-roles">{{ $ok.stores.auth.rolesLabel }}</div></if></div></div><if :="!$ok.stores.auth?.openAccess"><button class="layout__auth-logout" @click="$ok.stores.auth.logout()">Logout</button></if></div></div></aside><div class="layout__right-col"><nav class="layout__section-nav"><button :class="{ active: $route.params.section === 'db' }" :disabled="!$ok.stores.auth.canSection('db')" :title="$ok.stores.auth.canSection('db') ? '' : 'Requires data:read or env:read permission'" @click="$ok.stores.auth.canSection('db') && goToSection('db')"><span class="layout__nav-icon">⬡</span> DB<if :="!$ok.stores.auth.canSection('db')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'engines' || $route.params.section === 'embeddings' }" :disabled="!$ok.stores.auth.canSection('engines')" :title="$ok.stores.auth.canSection('engines') ? '' : 'Requires env:read permission'" @click="$ok.stores.auth.canSection('engines') && goToSection('engines')"><span class="layout__nav-icon">⛓</span> Engines<if :="!$ok.stores.auth.canSection('engines')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'files' }" :disabled="!$ok.stores.auth.canSection('files')" :title="$ok.stores.auth.canSection('files') ? '' : 'Requires files:read permission'" @click="$ok.stores.auth.canSection('files') && goToSection('files')"><span class="layout__nav-icon">⬚</span> Files<if :="!$ok.stores.auth.canSection('files')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'queue' }" :disabled="!$ok.stores.auth.canSection('queue')" :title="$ok.stores.auth.canSection('queue') ? '' : 'Requires queue:read permission'" @click="$ok.stores.auth.canSection('queue') && goToSection('queue')"><span class="layout__nav-icon">⇶</span> Queue<if :="!$ok.stores.auth.canSection('queue')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'functions' }" :disabled="!$ok.stores.auth.canSection('functions')" :title="$ok.stores.auth.canSection('functions') ? '' : 'Requires functions:read permission'" @click="$ok.stores.auth.canSection('functions') && goToSection('functions')"><span class="layout__nav-icon">ƒ</span> Functions<if :="!$ok.stores.auth.canSection('functions')"><span class="layout__nav-lock">🔒</span></if></button> <button :class="{ active: $route.params.section === 'views' }" @click="goToSection('views')"><span class="layout__nav-icon">⊞</span> Views</button> <button :class="{ active: $route.params.section === 'system' }" :disabled="!$ok.stores.auth.canSection('system')" :title="$ok.stores.auth.canSection('system') ? '' : 'Requires system:read permission'" @click="$ok.stores.auth.canSection('system') && goToSection('system')"><span class="layout__nav-icon">⚙</span> System<if :="!$ok.stores.auth.canSection('system')"><span class="layout__nav-lock">🔒</span></if></button><div class="layout__live-indicator" :title="$ok.stores.events?.connected ? 'Event stream live' : 'Event stream disconnected'"><span :class="$ok.stores.events?.connected ? 'layout__live-dot layout__live-dot--on' : 'layout__live-dot layout__live-dot--off'"></span> <span class="layout__live-label">{{ $ok.stores.events?.connected ? 'Live' : 'Off' }}</span></div><div class="layout__security-pill" :title="($ok.stores.auth?.modeLabel || 'Authentication') + ' · ' + ($ok.stores.auth?.username || 'anonymous')"><span class="layout__security-dot" :class="$ok.stores.auth?.openAccess ? 'layout__security-dot layout__security-dot--open' : 'layout__security-dot layout__security-dot--secure'"></span> <span class="layout__security-label">{{ $ok.stores.auth?.openAccess ? 'Open access' : 'Secure' }}</span></div></nav><div class="layout__main"><if :="$ok.stores.auth?.visibleNotices?.length > 0"><div class="layout__notices"><div class="layout__notices-bar" @click="noticesExpanded = !noticesExpanded"><span class="layout__notices-icon">⚠</span> <span class="layout__notices-summary">{{ $ok.stores.auth.visibleNotices.length }} security notice{{ $ok.stores.auth.visibleNotices.length > 1 ? 's' : '' }}<if :="$ok.stores.auth.visibleNotices[0]">· {{ $ok.stores.auth.visibleNotices[0].title }}<if :="$ok.stores.auth.visibleNotices.length > 1">and {{ $ok.stores.auth.visibleNotices.length - 1 }} more</if></if></span><span class="layout__notices-chevron">{{ noticesExpanded ? '▴' : '▾' }}</span> <button class="layout__notices-dismiss" @click="dismissNotices($event)" title="Dismiss for this session">✕</button></div><if :="noticesExpanded"><div class="layout__notices-detail"><each :of="$ok.stores.auth.visibleNotices" let:item="n"><div class="layout__notice-item"><div class="layout__notice-title">{{ n.title }}</div><div class="layout__notice-msg">{{ n.message }}</div><if :="n.hint"><div class="layout__notice-hint">{{ n.hint }}</div></if><if :="n.action"><a class="layout__notice-action" :href="n.action.href">{{ n.action.label }} →</a></if></div></each></div></if></div></if><header class="layout__header"><slot name="header"></slot></header><main class="layout__content"><if :="$ok.stores.okdb.selectedEnv"><slot></slot></if><if :="!$ok.stores.okdb.selectedEnv"><div class="layout__no-env"><div class="layout__no-env-icon">⬡</div><div class="layout__no-env-title">No environment selected</div><div class="layout__no-env-sub">Create a new environment or load the demo to get started.</div><div class="layout__no-env-actions"><button @click="openCreateEnvModal()" class="layout__no-env-btn">+ Create environment</button> <button @click="openDemoModal()" class="layout__no-env-btn layout__no-env-btn--demo">✦ Load demo</button></div></div></if></main></div></div></div></template><style>.layout{display:flex;flex-direction:row;height:100%;width:100%;min-height:0}.layout__sidebar{display:flex;flex-direction:column;width:210px;flex-shrink:0;border-right:1px solid var(--okdb-app-surface-2);background:var(--okdb-app-bg-deep);overflow:visible}.layout__sidebar-cube{height:150px;flex-shrink:0;display:flex;align-items:center;justify-content:center;position:relative}.layout__version{position:absolute;bottom:8px;right:10px;font-size:10px;font-family:monospace;color:var(--okdb-app-fg-faint);letter-spacing:.04em;pointer-events:none;user-select:none;transition:color .2s}.layout__sidebar-cube:hover .layout__version{color:var(--okdb-app-fg-subtle)}.layout__env-picker{flex-shrink:0;padding:8px 10px 6px;border-top:1px solid var(--okdb-app-surface-2);border-bottom:1px solid var(--okdb-app-surface-2)}.layout__sidebar-body{flex:1;min-height:0;display:flex;flex-direction:column;gap:3px;padding:10px;border-top:1px solid var(--okdb-app-surface-2);overflow-y:auto;overflow-x:visible}.layout__sidebar-footer{flex-shrink:0;padding:8px 10px 10px;border-top:1px solid var(--okdb-app-surface-2);background:var(--okdb-app-bg-deep)}.layout__right-col{flex:1;min-width:0;display:flex;flex-direction:column;min-height:0}.layout__section-nav{display:flex;flex-direction:row;align-items:flex-end;height:150px;padding:0 8px;flex-shrink:0;background:var(--okdb-app-bg-deep);border-bottom:1px solid var(--okdb-app-surface-2)}.layout__section-nav button{display:flex;align-items:center;gap:7px;padding:0 16px;height:44px;border-radius:0;font-size:13px;font-weight:500;background:0 0;border:none;border-bottom:2px solid transparent;color:var(--okdb-app-fg-subtle);cursor:pointer;white-space:nowrap;letter-spacing:.01em;transition:color .15s,border-color .15s,background .15s;margin-bottom:-1px}.layout__section-nav button:hover{background:rgba(255,255,255,.03);border-color:transparent;color:var(--okdb-app-fg-muted);border-bottom-color:var(--okdb-app-border-subtle);transform:none;box-shadow:none}.layout__section-nav button:disabled{opacity:.35;cursor:not-allowed;background:0 0!important;border-color:transparent!important;border-bottom-color:transparent!important;color:var(--okdb-app-fg-faint)!important}.layout__section-nav button:disabled:hover{background:0 0;transform:none;box-shadow:none}.layout__section-nav button.active{background:0 0;border-color:transparent;color:var(--okdb-accent);border-bottom-color:var(--okdb-accent)}.layout__nav-icon{font-size:14px;opacity:.7;flex-shrink:0}.layout__nav-lock{font-size:10px;margin-left:4px;opacity:.7;flex-shrink:0;vertical-align:middle}.layout__section-nav button:hover .layout__nav-icon{opacity:.9}.layout__section-nav button.active .layout__nav-icon{opacity:1}.layout__live-indicator{margin-left:auto;margin-right:8px;margin-bottom:11px;display:flex;align-items:center;gap:5px;cursor:default}.layout__live-dot{width:7px;height:7px;border-radius:50%;display:inline-block;flex-shrink:0}.layout__live-dot--on{background:var(--okdb-success);box-shadow:0 0 5px color-mix(in srgb,var(--okdb-success) 40%,transparent);animation:nav-pulse 2.5s ease-in-out infinite}.layout__live-dot--off{background:var(--okdb-danger);opacity:.6}.layout__live-label{font-size:10px;color:var(--okdb-app-fg-faint);letter-spacing:.04em;text-transform:uppercase}@keyframes nav-pulse{0%,100%{opacity:1}50%{opacity:.35}}.layout__security-pill{margin-bottom:9px;display:inline-flex;align-items:center;gap:7px;padding:6px 10px;border-radius:999px;border:1px solid var(--okdb-app-border);background:var(--okdb-app-bg);color:var(--okdb-app-fg-muted)}.layout__security-dot{width:7px;height:7px;border-radius:50%;display:inline-block;flex-shrink:0}.layout__security-dot--secure{background:var(--okdb-accent);box-shadow:0 0 6px var(--okdb-accent-soft-border)}.layout__security-dot--open{background:var(--okdb-warning);box-shadow:0 0 6px color-mix(in srgb,var(--okdb-warning) 33%,transparent)}.layout__security-label{font-size:10px;line-height:1;text-transform:uppercase;letter-spacing:.08em;white-space:nowrap}.layout__auth-chip{margin-bottom:9px;display:inline-flex;align-items:center;gap:10px;padding:6px 10px;border-radius:10px;border:1px solid var(--okdb-app-border);background:var(--okdb-app-bg)}.layout__auth-chip--sidebar{width:100%;margin-bottom:0;align-items:center;justify-content:space-between;gap:12px;padding:0;border-radius:0;background:0 0;border:none;box-shadow:none}.layout__auth-meta{display:flex;align-items:center;gap:0;min-width:0;flex:1}.layout__auth-userblock{display:flex;flex-direction:column;min-width:0}.layout__auth-badge{font-size:10px;line-height:1;text-transform:uppercase;letter-spacing:.05em;padding:4px 7px;border-radius:999px;border:1px solid transparent;white-space:nowrap}.layout__auth-badge--open{color:var(--okdb-success);background:#4ade8011;border-color:#4ade8033}.layout__auth-badge--users{color:var(--okdb-accent);background:#4fc1FF11;border-color:#4fc1FF33}.layout__auth-user{font-size:11px;font-weight:600;color:var(--okdb-app-fg);line-height:1.1;text-transform:uppercase;letter-spacing:.05em}.layout__auth-roles{font-size:10px;color:var(--okdb-app-fg-muted);line-height:1.1;margin-top:2px;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layout__auth-logout{font-size:11px;padding:0;border-radius:0;border:none;background:0 0;color:var(--okdb-danger);cursor:pointer;white-space:nowrap;align-self:center;letter-spacing:.04em;text-transform:uppercase;opacity:.88}.layout__auth-logout:hover{background:0 0;color:var(--okdb-danger-hover);opacity:1;transform:none;box-shadow:none}.layout__main{flex:1;display:flex;flex-direction:column;min-height:0;overflow:auto;padding:20px 24px 6px}.layout__header{flex-shrink:0}.layout__content{flex:1;min-height:0;min-width:0}.layout__content>*{animation:layout-fade-in .2s ease backwards}.layout__sidebar-body>*{animation:layout-fade-in .18s ease backwards}@keyframes layout-fade-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.layout__no-env{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:12px;animation:layout-fade-in .25s ease backwards}.layout__no-env-icon{font-size:48px;opacity:.12;line-height:1;margin-bottom:4px}.layout__no-env-title{font-size:18px;font-weight:600;color:var(--okdb-app-fg-muted)}.layout__no-env-sub{font-size:13px;color:var(--okdb-app-fg-subtle);text-align:center;max-width:320px;line-height:1.6}.layout__no-env-actions{display:flex;gap:10px;margin-top:8px}.layout__no-env-btn{padding:8px 18px;font-size:13px;border-radius:7px;border:1px solid var(--okdb-app-border);background:var(--okdb-app-surface);color:var(--okdb-app-fg-subtle);cursor:pointer;transition:background .12s,border-color .12s,color .12s}.layout__no-env-btn:hover{background:var(--okdb-app-surface-2);border-color:var(--okdb-app-border-strong);color:var(--okdb-app-fg-muted);transform:none;box-shadow:none}.layout__no-env-btn--demo{border-color:var(--okdb-accent-2-soft-border);background:var(--okdb-accent-2-soft-bg);color:var(--okdb-accent-2)}.layout__no-env-btn--demo:hover{background:var(--okdb-accent-2-soft-bg);border-color:var(--okdb-accent-2-soft-border);color:var(--okdb-accent-2);transform:none;box-shadow:none}.layout__notices{flex-shrink:0;margin:-20px -24px 16px;border-bottom:1px solid color-mix(in srgb,var(--okdb-warning) 22%,transparent);background:color-mix(in srgb,var(--okdb-warning) 5%,transparent)}.layout__notices-bar{display:flex;align-items:center;gap:10px;padding:9px 16px;cursor:pointer;user-select:none;transition:background .12s}.layout__notices-bar:hover{background:color-mix(in srgb,var(--okdb-warning) 9%,transparent)}.layout__notices-icon{font-size:15px;color:var(--okdb-warning);flex-shrink:0}.layout__notices-summary{font-size:12px;color:var(--okdb-warning-text);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layout__notices-chevron{font-size:14px;color:var(--okdb-warning-text);flex-shrink:0;line-height:1}.layout__notices-dismiss{font-size:14px;color:var(--okdb-warning-text);background:0 0;border:none;cursor:pointer;padding:3px 7px;border-radius:4px;flex-shrink:0;line-height:1;transition:color .1s,background .1s}.layout__notices-dismiss:hover{color:var(--okdb-warning);background:color-mix(in srgb,var(--okdb-warning) 15%,transparent)}.layout__notices-detail{padding:0 16px 14px;display:flex;flex-direction:column;gap:10px}.layout__notice-item{padding:12px 14px;border:1px solid color-mix(in srgb,var(--okdb-warning) 20%,transparent);border-radius:6px;background:color-mix(in srgb,var(--okdb-warning) 5%,transparent);display:flex;flex-direction:column;gap:6px}.layout__notice-title{font-size:13px;font-weight:600;color:var(--okdb-warning)}.layout__notice-msg{font-size:12px;color:var(--okdb-warning-text);line-height:1.55}.layout__notice-hint{font-size:12px;color:var(--okdb-warning-text);line-height:1.55;font-style:italic}.layout__notice-action{font-size:12px;color:var(--okdb-accent);text-decoration:none;margin-top:2px;display:inline-block}.layout__notice-action:hover{text-decoration:underline}</style>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<script>export default{tag:"okdb-cube",mounted(e){const t=e.$el,n=t.querySelector(".cube"),o=t.querySelector(".okdb-wrapper"),i=n.querySelector(".core-glow"),r=n.querySelector(".core-light");n.classList.add("idle");let a=!1,s=null,l=0,c=0,u=-15,d=45,m=0,y=0,p=null;const v=e=>Math.max(-75,Math.min(75,e));function f(){p&&(cancelAnimationFrame(p),p=null)}function L(){n.style.transform=`rotateX(${u}deg) rotateY(${d}deg)`;const e=`rotateY(${-d}deg) rotateX(${-u}deg)`;i.style.transform=`${e} translateZ(0px)`,r.style.transform=`${e} translateZ(10px)`}function b(){const e=Math.abs(m)+Math.abs(y),t=Math.min(2.5,1+.08*e);o.style.setProperty("--energy",t.toFixed(2))}function g(e){a=!0,s=e.pointerId,o.setPointerCapture(s),f(),l=e.clientX,c=e.clientY,m=y=0,n.classList.remove("idle"),n.style.animation="none",i.style.animation="none",r.style.animation="none",o.style.animation="none"}function h(e){if(!a||e.pointerId!==s)return;const t=e.clientX-l,n=e.clientY-c;l=e.clientX,c=e.clientY,m=.4*t,y=.4*n,d+=m,u=v(u-y),L(),b()}function E(e){if(!a||e.pointerId!==s)return;a=!1,o.releasePointerCapture(s),s=null;!function e(){m*=.92,y*=.92,d+=m,u=v(u-y),u+=.06*(-15-u),d+=.06*(45-d),L(),b(),Math.abs(m)+Math.abs(y)>.12?p=requestAnimationFrame(e):(o.style.setProperty("--energy","1"),n.style.transition="transform 1s cubic-bezier(0.175, 0.885, 0.32, 1.15)",u=-15,d=45,L(),setTimeout(()=>{n.style.transition="none",n.classList.add("idle"),n.style.animation="",i.style.animation="",r.style.animation="",o.style.animation=""},1e3),p=null)}()}o.addEventListener("pointerdown",g),o.addEventListener("pointermove",h),o.addEventListener("pointerup",E),o.addEventListener("pointercancel",E),e.$ext("unmount",()=>{f(),o.removeEventListener("pointerdown",g),o.removeEventListener("pointermove",h),o.removeEventListener("pointerup",E),o.removeEventListener("pointercancel",E)})}}</script><template><div class="okdb-wrapper" style="--energy:1"><div class="cube-container"><div class="cube"><div class="core-light"></div><div class="core-glow"></div><div class="face front"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face back"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face right"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face left"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face top"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face bottom"><svg class="logo"><use href="#okdb-logo"/></svg></div></div></div><div class="underglow-system"><div class="light-spill"></div></div><svg style="display:none"><symbol id="okdb-logo" viewBox="330 120 330 425"><path d="M428.062 313.837c5.695 6.112 4.378 13.108 3.833 21.705-6.767-6.329-16.863-6.237-19.448-16.383-1.193-4.685-7.473-7.788-12.087-6.534-5.25 1.426-8.191 6.404-7.13 12.068.928 4.95 5.508 8.698 10.558 7.727 3.365-.647 5.68.395 8.297 2.03 15.819 9.883 31.655 19.74 47.607 29.406 3.852 2.334 5.699 5.288 5.652 9.725-.086 8.122-.025 16.245-.025 25.06-5.645-1.53-9.614-4.637-13.833-7.054-23.99-13.74-47.853-27.698-71.814-41.487-2.739-1.577-4.044-3.377-4.037-6.69.098-45.151.066-90.302.09-135.453.001-1.453-.347-3.006 1.194-4.98 6.198 3.44 12.573 6.857 18.835 10.471 35.772 20.646 71.493 41.381 107.318 61.935 3.023 1.734 4.2 3.605 4.194 7.045-.08 44.65-.03 89.302-.043 133.953 0 1.77.437 3.673-.896 5.282-2.078.733-3.483-.752-4.996-1.612-6.517-3.701-12.813-7.837-19.52-11.142-4.643-2.287-6.091-5.725-6.099-10.364-.015-8.997-.106-17.995 0-26.99.075-6.23-2.355-10.869-7.738-14.092-7-4.193-13.803-8.727-20.897-12.75-3.35-1.9-4.718-4.16-4.47-7.986.301-4.645.117-9.326.049-13.99-.03-2.087.537-3.761 1.86-5.475 3.604-4.666 3.751-9.465.408-13.2-3.01-3.36-6.715-4.872-11.199-2.843-4.967 2.248-6.903 6.336-5.663 12.618m60.624 44.857 4.67 5.634 1.42-.89c.405-10.385.762-20.781-.217-31.167-.286-3.025-2.704-4.863-5.16-6.4-5.217-3.267-10.348-6.69-15.711-9.7-3.309-1.855-4.822-4.35-4.824-8.023-.003-5.329-.127-10.657-.12-15.985.006-5.421-1.98-9.404-6.927-12.263-16.288-9.41-32.414-19.1-48.59-28.705-7.39-4.388-14.749-8.826-22.187-13.281-1.31 2.325-.554 4.167.195 6.009 2.549 6.266 6.907 10.793 12.8 14.125 13.333 7.537 26.1 16.248 39.944 22.651 12.487 5.776 16.897 14.214 15.032 27.17-1.069 7.428 1.713 12.93 8.847 16.124 2.703 1.21 4.892 3.585 7.606 4.751 8.26 3.547 11.128 9.599 9.85 18.314-.57 3.896-.679 8.08 3.372 11.636m70.236-103.827c30.283-17.375 60.242-34.579 90.16-51.759 1.691 2.442 1.21 4.329 1.217 6.105.047 11.33-.206 22.667.097 33.989.243 9.108-3.744 15.932-10.952 20.604-16.63 10.78-33.572 21.074-50.34 31.642-2.094 1.32-4.126.875-6.26.628-5.825-.674-10.193 2.427-11.354 8.04-1.025 4.96 1.91 9.754 6.881 11.234 5.146 1.532 10.614-1.161 12.237-6.56.876-2.912 2.78-4.393 5.066-5.798 14.617-8.986 29.204-18.02 43.871-26.924 3.431-2.083 6.485-4.587 9.21-7.339 2.268.933 1.567 2.68 1.57 4.004.046 23.66-.02 47.32.078 70.98.013 3.084-1.146 4.845-3.748 6.342-38.258 22.003-76.462 44.099-114.717 66.107-3.118 1.794-5.88 4.325-9.365 5.265-2.076-1.786-1.462-3.92-1.45-5.827.123-18.822.452-37.644.445-56.465-.008-23.132-.132-46.267-.52-69.395-.142-8.501 1.144-14.994 10.307-18.99 9.549-4.166 18.2-10.388 27.567-15.883m8.19 19.798c-6.077 3.778-12.083 7.68-18.256 11.294-4.5 2.634-6.528 6.46-6.577 11.5-.066 6.825-.288 13.659-.037 20.474.16 4.35-.974 8.05-4.327 10.626-6.861 5.27-4.45 12.202-4.508 20.175 4.205-6.167 8.242-10.62 12.94-14.314 4.51-3.545 6.139-8.14 6.23-13.508.116-6.824.19-13.654.01-20.474-.099-3.793 1.432-6.14 4.632-8.067 10.694-6.437 21.277-13.06 31.866-19.67 4.215-2.632 8.037-5.296 13.75-4.092 4.8 1.012 8.998-3.134 9.79-7.966.803-4.897-1.91-9.421-6.586-10.986-4.793-1.603-10.264.043-11.763 4.72-1.524 4.757-4.959 6.762-8.643 8.987-5.984 3.613-11.93 7.287-18.52 11.301m63.18 40.521c-5.96-5.573-14.618-2.323-16.383 3.75-1.184 4.075-3.791 5.863-6.959 7.78a14037 14037 0 0 0-63.915 38.908c-6.241 3.823-9.668 12.069-7.822 17.745 26.016-17.85 53.419-33.607 80.177-50.384 1.663-1.042 3.329-1.438 5.21-.925 4.833 1.319 8.582-.54 11.24-4.388 2.836-4.102 1.911-8.19-1.548-12.486m-84.65-68.459c-9.697 5.59-19.14 10.888-28.433 16.439-2.768 1.654-4.873 1.744-7.742.075-27.788-16.166-55.675-32.163-83.51-48.246-2.41-1.392-5.036-2.562-6.69-4.818-.106-1.47.927-1.834 1.768-2.304 15.126-8.433 30.282-16.812 45.362-25.325 2.195-1.24 4.102-1.576 6.576-.9 4.81 1.314 9.654-1.367 11.26-5.825 1.639-4.542-.47-9.77-4.791-11.875-4.475-2.18-10.956-.912-12.577 3.62-1.913 5.349-6.147 7.12-10.304 9.417-14.87 8.214-29.807 16.306-44.611 24.636-3.314 1.864-6.08 2.08-9.203-.146-3.847-2.741-8.59-4.2-12.471-8.33 7.187-4.28 13.822-8.31 20.532-12.211 32.966-19.172 65.972-38.275 98.891-57.527 2.567-1.501 4.401-1.324 6.817.079 38.59 22.409 77.222 44.743 115.838 67.107 1.274.738 2.724 1.337 3.567 3.976-29.858 17.245-59.913 34.603-90.279 52.158m-59.159-52.652c-4.558 2.422-9.107 4.862-13.679 7.26-1.607.842-3.232 2.05-5.15 1.449-7.949-2.489-14.074 1.724-21.67 5.79 8.817 2.455 12.479 13.069 22.94 10.253 1.244-.335 3.053 1.063 4.486 1.86 9.747 5.429 19.5 10.85 29.173 16.406 4.028 2.313 7.718 2.267 11.718-.143 8.985-5.413 18.149-10.526 27.132-15.941 3.13-1.887 6.178-2.693 9.89-2.342 6.016.57 10.07-2.89 10.88-8.558.651-4.563-2.539-9.036-7.441-10.433-5.072-1.445-9.917.998-11.82 6.4-.91 2.585-2.444 4.146-4.73 5.425-8.718 4.878-17.425 9.782-26.025 14.865-2.937 1.736-5.398 1.723-8.338.003-7.33-4.287-14.827-8.286-22.214-12.475-1.495-.848-3.64-.981-4.203-3.636 8.9-4.653 17.899-9.273 26.806-14.061 2.782-1.495 5.42-2.016 8.573-1.292 5 1.146 9.221-1.36 10.66-5.858 1.594-4.978-.434-9.638-5.055-11.619-4.61-1.976-10.054-.603-12.076 3.782-1.484 3.22-3.85 4.795-6.72 6.204-4.185 2.056-8.325 4.203-13.137 6.66m74.309-7.428c8.665 5.276 17.38 10.471 25.976 15.857 4.836 3.03 8.046 2.708 12.508-1.897-2.106-3.289-5.186-5.486-8.492-7.45-20.018-11.894-40.013-23.824-60.06-35.668-2.644-1.562-4.616-3.204-5.748-6.368-1.8-5.03-7.57-7.228-12.389-5.453-4.44 1.637-7.056 6.818-5.748 11.384 1.621 5.66 6.193 8.658 11.74 7.21 2.494-.65 4.403-.417 6.558.898 11.64 7.1 23.347 14.086 35.655 21.487" fill="currentColor"/><text fill="currentColor" x="365" y="540" font-family="monospace" letter-spacing="-4" font-size="130" font-weight="bolder">OKDB</text></symbol></svg></div></template><style>.okdb-wrapper{--cube-size:90px;--brand-blue:#00a2ff;--glow-color:rgba(0, 162, 255, calc(0.35 * var(--energy)));width:150px;height:150px;perspective:1000px;display:flex;justify-content:center;align-items:center;user-select:none;touch-action:none;overflow:hidden}.cube-container{width:var(--cube-size);height:var(--cube-size);transform-style:preserve-3d;cursor:grab;position:relative;z-index:2}.cube{width:100%;height:100%;position:relative;transform-style:preserve-3d}@keyframes idle-spin{from{transform:rotateX(-15deg) rotateY(45deg)}to{transform:rotateX(-15deg) rotateY(405deg)}}@keyframes idle-counter-spin{from{transform:rotateY(-45deg) rotateX(15deg) translateZ(-18px)}to{transform:rotateY(-405deg) rotateX(15deg) translateZ(-18px)}}.cube{animation:none}.cube.idle{animation:idle-spin 20s linear infinite}.cube.idle .core-glow,.cube.idle .core-light{animation:idle-counter-spin 20s linear infinite}.face{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgb(133 152 166 / calc(.18 + var(--energy) * .06));border:2px solid rgba(0,162,255,.45);box-shadow:inset 0 0 18px rgba(0,162,255,.25),0 0 22px var(--glow-color);backface-visibility:visible}.logo{width:70%;height:70%;color:#fff;filter:drop-shadow(0 0 6px var(--brand-blue))}.front{transform:rotateY(0) translateZ(calc(var(--cube-size)/ 2))}.back{transform:rotateY(180deg) translateZ(calc(var(--cube-size)/ 2))}.right{transform:rotateY(90deg) translateZ(calc(var(--cube-size)/ 2))}.left{transform:rotateY(-90deg) translateZ(calc(var(--cube-size)/ 2))}.top{transform:rotateX(90deg) translateZ(calc(var(--cube-size)/ 2))}.bottom{transform:rotateX(-90deg) translateZ(calc(var(--cube-size)/ 2))}.core-glow{position:absolute;inset:18%;background:var(--brand-blue);border-radius:50%;filter:blur(26px);opacity:calc(.8 * var(--energy));transform:translateZ(-26px) scale(1);pointer-events:none}.core-light{position:absolute;inset:32%;background:#fff;border-radius:50%;filter:blur(12px);width:60px;height:60px;opacity:calc(1 * var(--energy));transform:translateZ(-14px);pointer-events:none}.underglow-system{position:absolute;bottom:-10px;width:160px;height:160px;transform-style:preserve-3d;transform:translateZ(-80px) rotateX(75deg);pointer-events:none;z-index:1}.core-glow{transform:translateZ(-18px);opacity:calc(.5 + 1 * var(--energy))}.core-light{transform:translateZ(-8px)}.core-glow,.core-light{transform-style:preserve-3d}.light-spill{position:absolute;inset:0;background:radial-gradient(circle,var(--brand-blue),transparent 70%);filter:blur(18px);opacity:calc(.8 * var(--energy))}.cube-container:active{cursor:grabbing}@property --energy{syntax:'<number>';inherits:true;initial-value:1}@keyframes pulse-energy{0%,100%{--energy:0.3}50%{--energy:1}}.okdb-wrapper{overflow:visible;animation:pulse-energy 4s ease-in-out infinite}.underglow-system{bottom:-80px;transform:translateZ(-120px) rotateX(90deg)}</style>
|
|
1
|
+
<script>export default{tag:"okdb-cube",mounted(e){const t=e.$el,n=t.querySelector(".cube"),o=t.querySelector(".okdb-wrapper"),i=n.querySelector(".core-glow"),r=n.querySelector(".core-light");n.classList.add("idle");let a=!1,s=null,l=0,c=0,u=-15,d=45,m=0,y=0,p=null;const v=e=>Math.max(-75,Math.min(75,e));function f(){p&&(cancelAnimationFrame(p),p=null)}function L(){n.style.transform=`rotateX(${u}deg) rotateY(${d}deg)`;const e=`rotateY(${-d}deg) rotateX(${-u}deg)`;i.style.transform=`${e} translateZ(0px)`,r.style.transform=`${e} translateZ(10px)`}function b(){const e=Math.abs(m)+Math.abs(y),t=Math.min(2.5,1+.08*e);o.style.setProperty("--energy",t.toFixed(2))}function g(e){a=!0,s=e.pointerId,o.setPointerCapture(s),f(),l=e.clientX,c=e.clientY,m=y=0,n.classList.remove("idle"),n.style.animation="none",i.style.animation="none",r.style.animation="none",o.style.animation="none"}function h(e){if(!a||e.pointerId!==s)return;const t=e.clientX-l,n=e.clientY-c;l=e.clientX,c=e.clientY,m=.4*t,y=.4*n,d+=m,u=v(u-y),L(),b()}function E(e){a&&e.pointerId===s&&(a=!1,o.releasePointerCapture(s),s=null,function e(){m*=.92,y*=.92,d+=m,u=v(u-y),u+=.06*(-15-u),d+=.06*(45-d),L(),b(),Math.abs(m)+Math.abs(y)>.12?p=requestAnimationFrame(e):(o.style.setProperty("--energy","1"),n.style.transition="transform 1s cubic-bezier(0.175, 0.885, 0.32, 1.15)",u=-15,d=45,L(),setTimeout(()=>{n.style.transition="none",n.classList.add("idle"),n.style.animation="",i.style.animation="",r.style.animation="",o.style.animation=""},1e3),p=null)}())}o.addEventListener("pointerdown",g),o.addEventListener("pointermove",h),o.addEventListener("pointerup",E),o.addEventListener("pointercancel",E),e.$ext("unmount",()=>{f(),o.removeEventListener("pointerdown",g),o.removeEventListener("pointermove",h),o.removeEventListener("pointerup",E),o.removeEventListener("pointercancel",E)})}};</script><template><div class="okdb-wrapper" style="--energy:1"><div class="cube-container"><div class="cube"><div class="core-light"></div><div class="core-glow"></div><div class="face front"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face back"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face right"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face left"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face top"><svg class="logo"><use href="#okdb-logo"/></svg></div><div class="face bottom"><svg class="logo"><use href="#okdb-logo"/></svg></div></div></div><div class="underglow-system"><div class="light-spill"></div></div><svg style="display:none"><symbol id="okdb-logo" viewBox="330 120 330 425"><path d="M428.062 313.837c5.695 6.112 4.378 13.108 3.833 21.705-6.767-6.329-16.863-6.237-19.448-16.383-1.193-4.685-7.473-7.788-12.087-6.534-5.25 1.426-8.191 6.404-7.13 12.068.928 4.95 5.508 8.698 10.558 7.727 3.365-.647 5.68.395 8.297 2.03 15.819 9.883 31.655 19.74 47.607 29.406 3.852 2.334 5.699 5.288 5.652 9.725-.086 8.122-.025 16.245-.025 25.06-5.645-1.53-9.614-4.637-13.833-7.054-23.99-13.74-47.853-27.698-71.814-41.487-2.739-1.577-4.044-3.377-4.037-6.69.098-45.151.066-90.302.09-135.453.001-1.453-.347-3.006 1.194-4.98 6.198 3.44 12.573 6.857 18.835 10.471 35.772 20.646 71.493 41.381 107.318 61.935 3.023 1.734 4.2 3.605 4.194 7.045-.08 44.65-.03 89.302-.043 133.953 0 1.77.437 3.673-.896 5.282-2.078.733-3.483-.752-4.996-1.612-6.517-3.701-12.813-7.837-19.52-11.142-4.643-2.287-6.091-5.725-6.099-10.364-.015-8.997-.106-17.995 0-26.99.075-6.23-2.355-10.869-7.738-14.092-7-4.193-13.803-8.727-20.897-12.75-3.35-1.9-4.718-4.16-4.47-7.986.301-4.645.117-9.326.049-13.99-.03-2.087.537-3.761 1.86-5.475 3.604-4.666 3.751-9.465.408-13.2-3.01-3.36-6.715-4.872-11.199-2.843-4.967 2.248-6.903 6.336-5.663 12.618m60.624 44.857 4.67 5.634 1.42-.89c.405-10.385.762-20.781-.217-31.167-.286-3.025-2.704-4.863-5.16-6.4-5.217-3.267-10.348-6.69-15.711-9.7-3.309-1.855-4.822-4.35-4.824-8.023-.003-5.329-.127-10.657-.12-15.985.006-5.421-1.98-9.404-6.927-12.263-16.288-9.41-32.414-19.1-48.59-28.705-7.39-4.388-14.749-8.826-22.187-13.281-1.31 2.325-.554 4.167.195 6.009 2.549 6.266 6.907 10.793 12.8 14.125 13.333 7.537 26.1 16.248 39.944 22.651 12.487 5.776 16.897 14.214 15.032 27.17-1.069 7.428 1.713 12.93 8.847 16.124 2.703 1.21 4.892 3.585 7.606 4.751 8.26 3.547 11.128 9.599 9.85 18.314-.57 3.896-.679 8.08 3.372 11.636m70.236-103.827c30.283-17.375 60.242-34.579 90.16-51.759 1.691 2.442 1.21 4.329 1.217 6.105.047 11.33-.206 22.667.097 33.989.243 9.108-3.744 15.932-10.952 20.604-16.63 10.78-33.572 21.074-50.34 31.642-2.094 1.32-4.126.875-6.26.628-5.825-.674-10.193 2.427-11.354 8.04-1.025 4.96 1.91 9.754 6.881 11.234 5.146 1.532 10.614-1.161 12.237-6.56.876-2.912 2.78-4.393 5.066-5.798 14.617-8.986 29.204-18.02 43.871-26.924 3.431-2.083 6.485-4.587 9.21-7.339 2.268.933 1.567 2.68 1.57 4.004.046 23.66-.02 47.32.078 70.98.013 3.084-1.146 4.845-3.748 6.342-38.258 22.003-76.462 44.099-114.717 66.107-3.118 1.794-5.88 4.325-9.365 5.265-2.076-1.786-1.462-3.92-1.45-5.827.123-18.822.452-37.644.445-56.465-.008-23.132-.132-46.267-.52-69.395-.142-8.501 1.144-14.994 10.307-18.99 9.549-4.166 18.2-10.388 27.567-15.883m8.19 19.798c-6.077 3.778-12.083 7.68-18.256 11.294-4.5 2.634-6.528 6.46-6.577 11.5-.066 6.825-.288 13.659-.037 20.474.16 4.35-.974 8.05-4.327 10.626-6.861 5.27-4.45 12.202-4.508 20.175 4.205-6.167 8.242-10.62 12.94-14.314 4.51-3.545 6.139-8.14 6.23-13.508.116-6.824.19-13.654.01-20.474-.099-3.793 1.432-6.14 4.632-8.067 10.694-6.437 21.277-13.06 31.866-19.67 4.215-2.632 8.037-5.296 13.75-4.092 4.8 1.012 8.998-3.134 9.79-7.966.803-4.897-1.91-9.421-6.586-10.986-4.793-1.603-10.264.043-11.763 4.72-1.524 4.757-4.959 6.762-8.643 8.987-5.984 3.613-11.93 7.287-18.52 11.301m63.18 40.521c-5.96-5.573-14.618-2.323-16.383 3.75-1.184 4.075-3.791 5.863-6.959 7.78a14037 14037 0 0 0-63.915 38.908c-6.241 3.823-9.668 12.069-7.822 17.745 26.016-17.85 53.419-33.607 80.177-50.384 1.663-1.042 3.329-1.438 5.21-.925 4.833 1.319 8.582-.54 11.24-4.388 2.836-4.102 1.911-8.19-1.548-12.486m-84.65-68.459c-9.697 5.59-19.14 10.888-28.433 16.439-2.768 1.654-4.873 1.744-7.742.075-27.788-16.166-55.675-32.163-83.51-48.246-2.41-1.392-5.036-2.562-6.69-4.818-.106-1.47.927-1.834 1.768-2.304 15.126-8.433 30.282-16.812 45.362-25.325 2.195-1.24 4.102-1.576 6.576-.9 4.81 1.314 9.654-1.367 11.26-5.825 1.639-4.542-.47-9.77-4.791-11.875-4.475-2.18-10.956-.912-12.577 3.62-1.913 5.349-6.147 7.12-10.304 9.417-14.87 8.214-29.807 16.306-44.611 24.636-3.314 1.864-6.08 2.08-9.203-.146-3.847-2.741-8.59-4.2-12.471-8.33 7.187-4.28 13.822-8.31 20.532-12.211 32.966-19.172 65.972-38.275 98.891-57.527 2.567-1.501 4.401-1.324 6.817.079 38.59 22.409 77.222 44.743 115.838 67.107 1.274.738 2.724 1.337 3.567 3.976-29.858 17.245-59.913 34.603-90.279 52.158m-59.159-52.652c-4.558 2.422-9.107 4.862-13.679 7.26-1.607.842-3.232 2.05-5.15 1.449-7.949-2.489-14.074 1.724-21.67 5.79 8.817 2.455 12.479 13.069 22.94 10.253 1.244-.335 3.053 1.063 4.486 1.86 9.747 5.429 19.5 10.85 29.173 16.406 4.028 2.313 7.718 2.267 11.718-.143 8.985-5.413 18.149-10.526 27.132-15.941 3.13-1.887 6.178-2.693 9.89-2.342 6.016.57 10.07-2.89 10.88-8.558.651-4.563-2.539-9.036-7.441-10.433-5.072-1.445-9.917.998-11.82 6.4-.91 2.585-2.444 4.146-4.73 5.425-8.718 4.878-17.425 9.782-26.025 14.865-2.937 1.736-5.398 1.723-8.338.003-7.33-4.287-14.827-8.286-22.214-12.475-1.495-.848-3.64-.981-4.203-3.636 8.9-4.653 17.899-9.273 26.806-14.061 2.782-1.495 5.42-2.016 8.573-1.292 5 1.146 9.221-1.36 10.66-5.858 1.594-4.978-.434-9.638-5.055-11.619-4.61-1.976-10.054-.603-12.076 3.782-1.484 3.22-3.85 4.795-6.72 6.204-4.185 2.056-8.325 4.203-13.137 6.66m74.309-7.428c8.665 5.276 17.38 10.471 25.976 15.857 4.836 3.03 8.046 2.708 12.508-1.897-2.106-3.289-5.186-5.486-8.492-7.45-20.018-11.894-40.013-23.824-60.06-35.668-2.644-1.562-4.616-3.204-5.748-6.368-1.8-5.03-7.57-7.228-12.389-5.453-4.44 1.637-7.056 6.818-5.748 11.384 1.621 5.66 6.193 8.658 11.74 7.21 2.494-.65 4.403-.417 6.558.898 11.64 7.1 23.347 14.086 35.655 21.487" fill="currentColor"/><text fill="currentColor" x="365" y="540" font-family="monospace" letter-spacing="-4" font-size="130" font-weight="bolder">OKDB</text></symbol></svg></div></template><style>.okdb-wrapper{--cube-size:90px;--brand-blue:#00a2ff;--glow-color:rgba(0, 162, 255, calc(0.35 * var(--energy)));width:150px;height:150px;perspective:1000px;display:flex;justify-content:center;align-items:center;user-select:none;touch-action:none;overflow:hidden}.cube-container{width:var(--cube-size);height:var(--cube-size);transform-style:preserve-3d;cursor:grab;position:relative;z-index:2}.cube{width:100%;height:100%;position:relative;transform-style:preserve-3d}@keyframes idle-spin{from{transform:rotateX(-15deg) rotateY(45deg)}to{transform:rotateX(-15deg) rotateY(405deg)}}@keyframes idle-counter-spin{from{transform:rotateY(-45deg) rotateX(15deg) translateZ(-18px)}to{transform:rotateY(-405deg) rotateX(15deg) translateZ(-18px)}}.cube{animation:none}.cube.idle{animation:idle-spin 20s linear infinite}.cube.idle .core-glow,.cube.idle .core-light{animation:idle-counter-spin 20s linear infinite}.face{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgb(133 152 166 / calc(.18 + var(--energy) * .06));border:2px solid rgba(0,162,255,.45);box-shadow:inset 0 0 18px rgba(0,162,255,.25),0 0 22px var(--glow-color);backface-visibility:visible}.logo{width:70%;height:70%;color:#fff;filter:drop-shadow(0 0 6px var(--brand-blue))}.front{transform:rotateY(0) translateZ(calc(var(--cube-size)/ 2))}.back{transform:rotateY(180deg) translateZ(calc(var(--cube-size)/ 2))}.right{transform:rotateY(90deg) translateZ(calc(var(--cube-size)/ 2))}.left{transform:rotateY(-90deg) translateZ(calc(var(--cube-size)/ 2))}.top{transform:rotateX(90deg) translateZ(calc(var(--cube-size)/ 2))}.bottom{transform:rotateX(-90deg) translateZ(calc(var(--cube-size)/ 2))}.core-glow{position:absolute;inset:18%;background:var(--brand-blue);border-radius:50%;filter:blur(26px);opacity:calc(.8 * var(--energy));transform:translateZ(-26px) scale(1);pointer-events:none}.core-light{position:absolute;inset:32%;background:#fff;border-radius:50%;filter:blur(12px);width:60px;height:60px;opacity:calc(1 * var(--energy));transform:translateZ(-14px);pointer-events:none}.underglow-system{position:absolute;bottom:-10px;width:160px;height:160px;transform-style:preserve-3d;transform:translateZ(-80px) rotateX(75deg);pointer-events:none;z-index:1}.core-glow{transform:translateZ(-18px);opacity:calc(.5 + 1 * var(--energy))}.core-light{transform:translateZ(-8px)}.core-glow,.core-light{transform-style:preserve-3d}.light-spill{position:absolute;inset:0;background:radial-gradient(circle,var(--brand-blue),transparent 70%);filter:blur(18px);opacity:calc(.8 * var(--energy))}.cube-container:active{cursor:grabbing}@property --energy{syntax:'<number>';inherits:true;initial-value:1}@keyframes pulse-energy{0%,100%{--energy:0.3}50%{--energy:1}}.okdb-wrapper{overflow:visible;animation:pulse-energy 4s ease-in-out infinite}.underglow-system{bottom:-80px;transform:translateZ(-120px) rotateX(90deg)}</style>
|
package/public/login-app.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const params=new URLSearchParams(window.location.search),error=params.get("error"),redirect=params.get("redirect")||"/admin/index.html";if(error){const e=document.getElementById("errorBox");e.hidden=!1,e.textContent=error}async function loadConfig(){const e=await fetch("/admin/login/config",{credentials:"same-origin"}),t=(await e.json().catch(()=>({}))).data||{};if(t.openAccess)return void window.location.replace("/admin/index.html");if(t.bootstrap)return void window.location.replace("/admin/setup.html");const n=document.getElementById("loginStack"),o=document.getElementById("basicForm"),r=document.getElementById("oauthWrap"),i=document.getElementById("divider"),a=document.getElementById("providerLabel"),d=document.getElementById("providerButtonLabel"),c=document.getElementById("noteBox"),s=!!t.login?.enabled,m=!!t.oauth?.enabled;if(o.hidden=!s,r.hidden=!m,i.hidden=!(s&&m),n.hidden=!(s||m),m){const e=t.oauth?.label||"Use a provider";a.textContent=e,d.textContent=e,document.getElementById("loginButton").href=`/admin/auth/start?redirect=${encodeURIComponent(redirect)}`}c.textContent=s&&!m?"Use your local admin credentials to create a secure browser session.":!s&&m?"Use your organization account. API and MCP clients should use OAuth access tokens directly.":s&&m?"Sign in with local admin credentials or continue with your configured provider.":"No login method is configured."}function showError(e){const t=document.getElementById("errorBox");t.hidden=!1,t.textContent=e}function formatDate(e){return e?new Date(e).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"}):""}function formatPermissions(e){if(!Array.isArray(e)||0===e.length)return"";const t=e.join(", ");return t.length>40?t.slice(0,37)+"...":t}document.getElementById("basicForm").addEventListener("submit",async e=>{e.preventDefault();const t=document.getElementById("user").value,n=document.getElementById("password").value,o=await fetch("/auth/login",{method:"POST",headers:{"content-type":"application/json"},credentials:"same-origin",body:JSON.stringify({username:t,password:n})}),r=await o.json().catch(()=>({}));if(!o.ok)return void showError(r?.error?.message||r?.error||r?.result?.error||"Login failed");const i=r?.data;if(i?.ambiguous){document.getElementById("basicForm").hidden=!0,document.getElementById("pickerSection").hidden=!1;const e=document.getElementById("pickerList");e.innerHTML="";for(const o of i.tokens||[]){const r=document.createElement("button");r.type="button",r.className="picker-item";const i=formatPermissions(o.permissions),a=formatDate(o.createdAt);r.innerHTML=`<span class="picker-item-label">${o.label||"(unset)"}</span><span class="picker-item-meta">${i}${i&&a?" · ":""}${a}</span>`,r.addEventListener("click",async()=>{const e=await fetch("/auth/login/select",{method:"POST",headers:{"content-type":"application/json"},credentials:"same-origin",body:JSON.stringify({username:t,password:n,tokenId:o.tokenId})}),r=await e.json().catch(()=>({}));if(!e.ok)return document.getElementById("pickerSection").hidden=!0,document.getElementById("basicForm").hidden=!1,void showError(r?.error?.message||r?.error||"Selection failed");window.location.replace(redirect)}),e.appendChild(r)}return}window.location.replace(redirect)}),loadConfig().catch(e=>{const t=document.getElementById("errorBox");t.hidden=!1,t.textContent=e?.message||"Failed to load login methods"});
|