diff --git a/studio/src/main/resources/static/api.html b/studio/src/main/resources/static/api.html index 4cc108491a..026e36c062 100644 --- a/studio/src/main/resources/static/api.html +++ b/studio/src/main/resources/static/api.html @@ -1,139 +1,621 @@
-
-
-

HTTP API

-
-
- -
- -
-
-
-
- Method -
-
- URL -
-
- Documentation -
+
+ +
+
+ HTTP API Reference + + +
-
-
GET
-
-
/api/v1/ready
-
-
- Get server status +
+ +
+ +
+ GET + /api/v1/ready + Server readiness check +
-
-
-
GET
-
-
/api/v1/server
-
-
- Get server information + +
+ +
+ POST + /api/v1/login + Authenticate with credentials +
+
+ POST + /api/v1/logout + End current session +
-
- - - -
-
GET
-
-
/api/v1/databases
-
- -
-
-
GET
-
-
/api/v1/exists/{database}
+ +
+ +
+ GET + /api/v1/query/{db}/{lang}/{cmd} + Execute a query via GET +
+
+ POST + /api/v1/query/{db} + Execute a query via POST +
- -
-
-
GET
-
-
/api/v1/query/{database}/{language}/{query}
-
-
- Execute a query (GET) + +
+ +
+ POST + /api/v1/command/{db} + Execute a database command +
-
-
-
POST
-
-
/api/v1/query/{database}
-
-
- Execute a query (POST) + +
+ +
+ POST + /api/v1/begin/{db} + Begin a new transaction +
+
+ POST + /api/v1/commit/{db} + Commit current transaction +
+
+ POST + /api/v1/rollback/{db} + Rollback current transaction +
-
-
-
POST
-
-
/api/v1/command/{database}
-
-
- Execute a command + +
+ +
+ GET + /api/v1/server + Get server information +
+
+ POST + /api/v1/server + Execute server command +
-
-
-
POST
-
-
/api/v1/begin/{database}
+ +
+ +
+ GET + /api/v1/databases + List all databases +
+
+ GET + /api/v1/exists/{db} + Check if database exists +
- -
-
-
POST
-
-
/api/v1/commit/{database}
-
-
- Commit a transaction + +
+ +
+ GET + /docs + Swagger UI (interactive) +
+
-
-
POST
-
-
/api/v1/rollback/{database}
-
- + +
+
+
+
HTTP API Reference
+

Select an endpoint from the sidebar to view its documentation, including request format, parameters, and response examples.

+

All endpoints use JSON for request and response bodies. Authentication is via Authorization: Bearer {token} header after login.

+ Full HTTP API Documentation
- -
+ + diff --git a/studio/src/main/resources/static/css/studio.css b/studio/src/main/resources/static/css/studio.css index 29e8ac9573..fcd4b450fb 100644 --- a/studio/src/main/resources/static/css/studio.css +++ b/studio/src/main/resources/static/css/studio.css @@ -1,24 +1,233 @@ +/* ===== CSS Custom Properties (Theme Tokens) ===== */ + +:root { + --color-brand: #00aeee; + --color-brand-hover: #0098d4; + --color-brand-light: #e8f4fd; + --color-brand-border: #0e76bc; + --color-brand-link: #02a3ff; + + --bg-page: white; + --bg-sidebar: #f8f9fa; + --bg-sidebar-header: #f0f1f3; + --bg-active-tab: #f7f7f7; + --bg-card: white; + --bg-input: white; + --bg-code: #1e293b; + --bg-reference: #f0f1f3; + --bg-nav: white; + --bg-hover: #e8f4fd; + --bg-hover-alt: #b9d8f9; + --bg-note: #f0f9ff; + --bg-note-code: #e0f2fe; + + --text-primary: #333; + --text-secondary: #555; + --text-muted: #666; + --text-faint: #777; + --text-nav: #545454; + --text-lighter: #888; + --text-lightest: #999; + --text-placeholder: #bbb; + --text-code: #e2e8f0; + + --border-main: #e0e0e0; + --border-light: #eee; + --border-ddd: #ddd; + --border-table: #dee2e6; + --border-f0: #f0f0f0; + + --btn-secondary-bg: #f7f7f7; + --table-hover: #e8f4fd; + --link-color: #545454; + --modal-bg: white; + --shadow-dropdown: rgba(0,0,0,0.1); + + --icon-color: #545454; + --icon-muted: #999; + --icon-light: #ccc; + --icon-lighter: #ddd; +} + +[data-theme="dark"] { + --color-brand: #29b6f6; + --color-brand-hover: #4fc3f7; + --color-brand-light: #1a3a4a; + --color-brand-border: #29b6f6; + --color-brand-link: #4fc3f7; + + --bg-page: #1a1d21; + --bg-sidebar: #22262b; + --bg-sidebar-header: #1e2227; + --bg-active-tab: #2a2f36; + --bg-card: #22262b; + --bg-input: #2a2f36; + --bg-code: #0d1117; + --bg-reference: #2a2f36; + --bg-nav: #1e2227; + --bg-hover: #2a3a4a; + --bg-hover-alt: #1a3a5a; + --bg-note: #1a2a3a; + --bg-note-code: #1a3a4a; + + --text-primary: #e2e8f0; + --text-secondary: #cbd5e1; + --text-muted: #94a3b8; + --text-faint: #64748b; + --text-nav: #cbd5e1; + --text-lighter: #94a3b8; + --text-lightest: #64748b; + --text-placeholder: #475569; + --text-code: #e2e8f0; + + --border-main: #2d3748; + --border-light: #374151; + --border-ddd: #374151; + --border-table: #374151; + --border-f0: #2d3748; + + --btn-secondary-bg: #2a2f36; + --table-hover: #2a3a4a; + --link-color: #cbd5e1; + --modal-bg: #22262b; + --shadow-dropdown: rgba(0,0,0,0.4); + + --icon-color: #cbd5e1; + --icon-muted: #64748b; + --icon-light: #475569; + --icon-lighter: #374151; +} + +/* ===== Base Styles ===== */ + +html { + height: 100%; +} + body { - font-family: Poppins, Verdana, sans-serif, Tahoma; - background-color: white; + font-family: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', Verdana, sans-serif; + background-color: var(--bg-page); + height: 100%; + margin: 0; + overflow: hidden; + font-size: 0.9rem; + color: var(--text-primary); + font-weight: 400; +} + +/* Global font overrides to ensure Poppins everywhere */ +h1, h2, h3, h4, h5, h6, +.nav-link, +.btn, +label, +select, +input, +table, +.form-select, +.form-control, +.dropdown-item, +.card-header, +.modal-title, +.modal-body { + font-family: inherit; +} + +#studioPanel { + height: 100vh; + margin: 0 !important; + border: none !important; + border-radius: 0 !important; + display: flex; + flex-direction: column; + background-color: var(--bg-page); +} + +#studioPanel > .card-header-tab.card-header { + flex: 1; + min-height: 0; + padding: 0; + display: flex; + background-color: var(--bg-page); + border-bottom: none; +} + +#studioPanel > .card-header > .row { + flex: 1; + min-height: 0; + margin: 0; + width: 100%; + display: flex; + flex-wrap: nowrap; +} + +#studioPanel > .card-header > .row > .col-1 { + padding: 0; +} + +#studioPanel > .card-header > .row > .col-11 { + padding: 0; + display: flex; + flex-direction: column; + min-height: 0; +} + +#studioPanel > .card-header > .row > .col-11 > .tab-content { + flex: 1; + min-height: 0; + position: relative; +} + +#studioPanel > .card-header > .row > .col-11 > .tab-content > .tab-pane { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow-y: auto; + visibility: hidden; +} + +#studioPanel > .card-header > .row > .col-11 > .tab-content > .tab-pane.active.show { + visibility: visible; +} + +#tab-query { + overflow-y: hidden !important; +} + +#tab-database { + overflow-y: hidden !important; +} + +#tab-database > .tab-content > .tab-pane { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow-y: auto; +} + +#tab-schema { + overflow: hidden !important; } a, a:visited { - color: #545454; + color: var(--link-color); } .link { - color: #02a3ff !important; + color: var(--color-brand-link) !important; } .btn-secondary { - color: black; - background-color: #f7f7f7 !important; + color: var(--text-primary); + background-color: var(--btn-secondary-bg) !important; border: 0px; } .btn-secondary:hover { - background-color: #b9d8f9 !important; + background-color: var(--bg-hover-alt) !important; } .btn-outline-primary { @@ -26,80 +235,234 @@ a:visited { } .nav-link { - background-color: white; - color: #545454; + background-color: var(--bg-nav); + color: var(--text-nav); + font-size: 0.85rem; + font-weight: 500; } .nav-link:hover { - background-color: #b9d8f9 !important; + background-color: var(--bg-hover-alt) !important; } a.vertical-tab.nav-link.active.show { - background-color: #f7f7f7; - border-right-color: #f7f7f7; + background-color: var(--bg-active-tab); + border-right-color: var(--bg-active-tab); border-top-right-radius: 0; } .nav-label { font-size: 0.65rem; margin-top: 2px; - color: #666; + color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; } a.nav-link.active.show { - background-color: #f7f7f7; - border-bottom-color: #f7f7f7; + background-color: var(--bg-active-tab); + border-bottom-color: var(--bg-active-tab); } .btn-primary { - background-color: #00aeee; - border-color: #0e76bc; + background-color: var(--color-brand); + border-color: var(--color-brand-border); } .btn-primary:hover, .page-item.active .page-link { - background-color: #b9d8f9; - border-color: #b9d8f9; + background-color: var(--bg-hover-alt); + border-color: var(--bg-hover-alt); +} + +.query-editor-container { + display: flex; + align-items: stretch; + border: 1px solid var(--border-ddd); + border-radius: 8px; + background: var(--bg-card); + overflow: hidden; + margin-bottom: 8px; +} + +.query-editor-area { + flex: 1; + min-width: 0; +} + +.query-editor-actions { + display: flex; + align-items: flex-start; + gap: 0; + padding: 8px 6px; + flex-shrink: 0; +} + +.editor-action-btn { + display: flex; + align-items: center; + justify-content: center; + border: none; + background: transparent; + cursor: pointer; + color: var(--text-faint); + transition: color 0.15s, background-color 0.15s; +} + +.editor-save-btn { + width: 32px; + height: 32px; + border-radius: 4px; + font-size: 0.95rem; +} + +.editor-save-btn:hover { + color: var(--color-brand); + background-color: var(--color-brand-light); +} + +.editor-action-divider { + width: 1px; + height: 28px; + background-color: var(--border-ddd); + margin: 2px 4px; + align-self: center; +} + +.editor-run-btn { + width: 34px; + height: 34px; + border-radius: 50%; + font-size: 0.85rem; + color: #fff; + background-color: var(--color-brand); +} + +.editor-run-btn:hover { + background-color: var(--color-brand-hover); + color: #fff; +} + +.editor-run-btn i { + color: #fff !important; } .CodeMirror { - color: black; - border-size: 2px; - font-size: 1.2em; - padding: 8px; + color: var(--text-primary); + font-size: 1rem; + padding: 4px 0; width: 100%; height: auto; + border: none !important; + background-color: var(--bg-card); } .CodeMirror-scroll { overflow-y: hidden; overflow-x: auto; - min-height: 30px; + min-height: 80px; max-height: 400px; } -div.dt-buttons { - float: left; +.CodeMirror-gutters { + background-color: var(--bg-card); + border-right: none; +} + +.CodeMirror-linenumber { + color: var(--text-placeholder); + font-size: 0.85em; } + div.dt-length { float: left; - margin-left: 50px; + margin-left: 10px; } div.dt-search { float: right; } +/* Export dropdown */ +.dt-export-dropdown { + float: right; + position: relative; + margin-left: 8px; + padding: 7px 0; +} + +.dt-export-btn { + display: flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + border: 1px solid var(--border-ddd); + border-radius: 6px; + background: var(--bg-reference); + color: var(--text-secondary); + font-size: 0.9rem; + cursor: pointer; + transition: background-color 0.15s, color 0.15s; +} + +.dt-export-btn:hover { + background-color: var(--color-brand-light); + border-color: var(--color-brand); + color: var(--color-brand); +} + +.dt-export-btn i { + color: inherit !important; +} + +.dt-export-menu { + display: none; + position: fixed; + z-index: 10000; + min-width: 150px; + background: var(--bg-card); + border: 1px solid var(--border-ddd); + border-radius: 8px; + box-shadow: 0 4px 12px var(--shadow-dropdown); + padding: 4px 0; +} + +.dt-export-menu.open { + display: block; +} + +.dt-export-menu-item { + display: block; + width: 100%; + padding: 7px 14px; + border: none; + background: none; + color: var(--text-primary); + font-size: 0.82rem; + text-align: left; + cursor: pointer; + transition: background-color 0.1s; +} + +.dt-export-menu-item:hover { + background-color: var(--color-brand-light); + color: var(--color-brand); +} + +.dt-export-menu-item i { + color: inherit !important; + width: 18px; + text-align: center; + margin-right: 6px; +} + #graphMainPanel { transition: width 0.3s ease; } #graphPropertiesPanel { - /* for the animation */ transition: margin 0.3s ease; } .collapsed { - /* hide it for small displays*/ display: none; } @@ -109,7 +472,7 @@ div.dt-search { .nav-link i.fas, .nav-link i.far, .nav-link i.fab { - color: #545454 !important; + color: var(--icon-color) !important; } .nav-link:hover i[class*="fa-"], @@ -117,7 +480,7 @@ div.dt-search { .nav-link:hover i.fas, .nav-link:hover i.far, .nav-link:hover i.fab { - color: #545454 !important; + color: var(--icon-color) !important; } .nav-link.active i[class*="fa-"], @@ -125,7 +488,7 @@ div.dt-search { .nav-link.active i.fas, .nav-link.active i.far, .nav-link.active i.fab { - color: #545454 !important; + color: var(--icon-color) !important; } /* Fix database dropdown layout */ @@ -146,4 +509,2083 @@ div.dt-search { min-width: auto; width: auto; display: inline-block; + font-size: 0.85rem; +} + +/* Consistent form element sizing */ +.form-select, +.form-control { + font-size: 0.85rem; +} + +.btn { + font-size: 0.85rem; + font-weight: 500; +} + +/* Icon Sidebar */ +#queryIconSidebar { + width: 45px; + min-width: 45px; + flex-shrink: 0; + height: 100%; + background-color: var(--bg-reference); + border-right: 1px solid var(--border-main); + display: flex; + flex-direction: column; + align-items: center; + padding-top: 6px; +} + +.icon-sidebar-btn { + width: 45px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + border: none; + background: transparent; + color: var(--text-faint); + font-size: 1rem; + cursor: pointer; + border-left: 3px solid transparent; + transition: background-color 0.15s, color 0.15s; +} + +.icon-sidebar-btn:hover { + background-color: var(--color-brand-light); + color: var(--text-secondary); +} + +.icon-sidebar-btn.active { + border-left: 3px solid var(--color-brand); + background-color: var(--color-brand-light); + color: var(--color-brand); +} + +.icon-sidebar-btn i { + color: inherit !important; +} + +/* Query Sidebar */ +#querySidebar { + width: 210px; + min-width: 210px; + flex-shrink: 0; + height: 100%; + overflow-y: auto; + background-color: var(--bg-sidebar); + border-right: 1px solid var(--border-main); +} + +.sidebar-header { + position: sticky; + top: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 12px; + background-color: var(--bg-sidebar); + border-bottom: 1px solid var(--border-main); +} + +.sidebar-title { + font-size: 0.8rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text-secondary); +} + +.sidebar-refresh-btn { + padding: 2px 6px; + font-size: 0.75rem; + line-height: 1; + border: none; +} + +.sidebar-section { + padding: 10px 12px 4px; +} + +.sidebar-section-header { + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text-faint); + margin-bottom: 6px; +} + +.sidebar-section-header i { + color: var(--icon-muted) !important; + font-size: 0.65rem; + margin-right: 2px; +} + +.sidebar-count { + font-weight: 400; + color: var(--text-lightest); +} + +.sidebar-badges { + display: flex; + flex-wrap: wrap; + gap: 5px; + margin-bottom: 6px; +} + +.sidebar-badge { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 3px 8px; + border-radius: 12px; + font-size: 0.72rem; + color: #fff !important; + text-decoration: none; + max-width: 100%; + transition: opacity 0.15s, transform 0.15s; + line-height: 1.3; +} + +.sidebar-badge:hover { + opacity: 0.85; + transform: translateY(-1px); + text-decoration: none; + color: #fff !important; +} + +.sidebar-badge-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 110px; +} + +.sidebar-badge-count { + font-size: 0.62rem; + opacity: 0.8; + white-space: nowrap; +} + +.sidebar-empty { + padding: 20px 12px; + text-align: center; + color: var(--text-lightest); + font-size: 0.85rem; +} + +/* Sidebar Panels */ +.sidebar-panel { + display: none; +} + +.sidebar-panel.active { + display: block; +} + +#queryWorkArea { + padding-left: 12px; +} + +/* Result stats styling */ +.result-stats .result-stat-value { + font-weight: 700; + color: var(--color-brand); +} + +/* Table improvements */ +.table, +.dataTables_wrapper, +.dt-length, +.dt-search, +.dt-info, +.dt-paging { + font-family: inherit; +} + +/* DataTables footer: info + paging on same row */ +.dt-layout-row { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.dt-layout-row .dt-layout-cell { + flex: none; +} + +.dt-layout-cell.dt-layout-end { + margin-left: auto; +} + +.dt-info { + white-space: nowrap; +} + +.dt-paging { + margin-left: auto; +} + +/* Allow export dropdown to overflow; dataTables wrapper handles scrolling */ +#tab-table .table-responsive { + overflow: visible; +} + +#tab-table .dataTables_wrapper { + overflow-x: auto; +} + +/* Ensure footer stretches to table width when table overflows */ +#tab-table .dataTables_wrapper > .dt-layout-row:last-child { + width: 100%; + min-width: fit-content; +} + +#tab-table .table thead th { + text-transform: uppercase; + font-size: 0.72rem; + font-weight: 600; + letter-spacing: 0.3px; + color: var(--text-muted); + padding: 8px 10px; + border-bottom: 2px solid var(--border-table); +} + +#tab-table .table tbody td { + font-size: 0.84rem; + padding: 6px 10px; + vertical-align: middle; +} + +#tab-table .table tbody tr:hover { + background-color: var(--table-hover); +} + +/* History Panel */ +.history-date-group { + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text-faint); + padding: 8px 12px 4px; + background-color: var(--bg-reference); + position: sticky; + top: 0; + z-index: 5; +} + +.history-entry { + padding: 6px 10px 6px 8px; + border-bottom: 1px solid var(--border-light); + cursor: pointer; + display: flex; + align-items: flex-start; + gap: 6px; + transition: background-color 0.1s; +} + +.history-entry:hover { + background-color: var(--color-brand-light); +} + +.history-entry .history-checkbox { + margin-top: 2px; + flex-shrink: 0; +} + +.history-entry-content { + flex: 1; + min-width: 0; + overflow: hidden; +} + +.history-meta { + display: flex; + align-items: center; + gap: 6px; + margin-bottom: 2px; +} + +.history-time { + font-size: 0.68rem; + color: var(--text-lightest); +} + +.history-lang { + font-size: 0.6rem; + text-transform: uppercase; + font-weight: 600; + color: #fff; + background-color: var(--color-brand); + padding: 1px 5px; + border-radius: 3px; + letter-spacing: 0.3px; +} + +.history-cmd { + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 0.75rem; + color: var(--text-primary); + word-break: break-all; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + line-height: 1.35; +} + +.history-toolbar { + display: flex; + align-items: center; + gap: 8px; + padding: 6px 10px; + border-bottom: 1px solid var(--border-main); + background-color: var(--bg-sidebar); +} + +.history-toolbar .form-check { + margin-bottom: 0; +} + +.history-search { + width: 100%; + padding: 5px 10px; + border: 1px solid var(--border-ddd); + border-radius: 4px; + font-size: 0.78rem; + margin: 6px 10px; + outline: none; + background-color: var(--bg-input); + color: var(--text-primary); +} + +.history-search:focus { + border-color: var(--color-brand); +} + +/* Saved Query Entries */ +.saved-query-entry { + padding: 8px 10px; + border-bottom: 1px solid var(--border-light); + cursor: pointer; + transition: background-color 0.1s; + position: relative; +} + +.saved-query-entry:hover { + background-color: var(--color-brand-light); +} + +.saved-query-name { + font-size: 0.8rem; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 2px; + display: flex; + align-items: center; + justify-content: space-between; +} + +.saved-query-name .saved-query-delete { + opacity: 0; + color: #cc4444; + font-size: 0.7rem; + cursor: pointer; + transition: opacity 0.15s; +} + +.saved-query-entry:hover .saved-query-delete { + opacity: 1; +} + +.saved-query-preview { + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 0.72rem; + color: var(--text-muted); + word-break: break-all; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + line-height: 1.3; +} + +.saved-query-lang { + font-size: 0.58rem; + text-transform: uppercase; + font-weight: 600; + color: #fff; + background-color: #6366f1; + padding: 1px 5px; + border-radius: 3px; + margin-left: 6px; +} + +/* Reference Panel */ +.reference-section { + border-bottom: 1px solid var(--border-light); +} + +.reference-section-header { + padding: 8px 12px; + font-size: 0.78rem; + font-weight: 600; + color: var(--text-primary); + cursor: pointer; + display: flex; + align-items: center; + justify-content: space-between; + user-select: none; +} + +.reference-section-header:hover { + background-color: var(--bg-reference); +} + +.reference-section-header i.fa-chevron-right { + font-size: 0.6rem; + color: var(--icon-muted) !important; + transition: transform 0.2s; +} + +.reference-section-header i.fa-chevron-right.open { + transform: rotate(90deg); +} + +.reference-section-body { + display: none; + padding: 4px 12px 8px; +} + +.reference-section-body.open { + display: block; +} + +.reference-example { + padding: 4px 8px; + margin-bottom: 4px; + border-radius: 4px; + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 0.72rem; + color: var(--text-primary); + background-color: var(--bg-reference); + cursor: pointer; + transition: background-color 0.1s; + word-break: break-all; +} + +.reference-example:hover { + background-color: #dbeafe; +} + +/* Settings Panel */ +.settings-section { + padding: 12px; + border-bottom: 1px solid var(--border-light); +} + +.settings-section-header { + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text-secondary); + margin-bottom: 10px; +} + +.settings-row { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 8px; + font-size: 0.8rem; +} + +.settings-row label { + flex: 1; + color: var(--text-secondary); + margin-bottom: 0; +} + +.settings-row select { + font-size: 0.78rem; + padding: 2px 6px; + border: 1px solid var(--border-ddd); + border-radius: 4px; + background-color: var(--bg-input); + color: var(--text-primary); +} + +.sidebar-action-bar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 6px 10px; + border-bottom: 1px solid var(--border-main); +} + +.sidebar-action-btn { + background: none; + border: none; + color: var(--text-faint); + cursor: pointer; + font-size: 0.85rem; + padding: 2px 6px; + border-radius: 3px; +} + +.sidebar-action-btn:hover { + color: var(--color-brand); + background-color: var(--color-brand-light); +} + +/* Database Panel */ +#dbTypeSidebar { + width: 230px; + min-width: 230px; + flex-shrink: 0; + height: 100%; + overflow-y: auto; + background-color: var(--bg-sidebar); + border-right: 1px solid var(--border-main); +} + +#dbTypeDetail { + background-color: var(--bg-card); +} + +.db-type-empty { + padding: 60px 20px; + text-align: center; + color: var(--text-lightest); + font-size: 0.9rem; +} + +.db-type-category-badge { + display: inline-block; + padding: 2px 10px; + border-radius: 12px; + font-size: 0.72rem; + font-weight: 600; + color: #fff; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.db-type-meta { + font-size: 0.85rem; + color: var(--text-muted); + margin-bottom: 6px; +} + +.db-type-meta a { + color: var(--color-brand) !important; + font-weight: 600; +} + +.db-detail-section { + margin-bottom: 20px; +} + +.db-detail-section h6 { + font-size: 0.8rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.3px; + color: var(--text-secondary); + margin-bottom: 10px; + padding-bottom: 6px; + border-bottom: 1px solid var(--border-light); +} + +.db-detail-section h6 i { + color: var(--color-brand) !important; + margin-right: 4px; + font-size: 0.75rem; +} + +.db-detail-table thead th { + text-transform: uppercase; + font-size: 0.7rem; + letter-spacing: 0.3px; + color: var(--text-faint); + padding: 6px 8px; + border-bottom: 2px solid var(--border-table); + white-space: nowrap; +} + +.db-detail-table tbody td { + font-size: 0.82rem; + padding: 5px 8px; + vertical-align: middle; +} + +.db-detail-table tbody tr:hover { + background-color: var(--table-hover); +} + +.db-action-btn { + background-color: var(--bg-reference); + border: 1px solid var(--border-ddd); + color: var(--text-secondary); + font-size: 0.8rem; + border-radius: 6px; + transition: background-color 0.15s, color 0.15s; +} + +.db-action-btn:hover { + background-color: var(--color-brand-light); + border-color: var(--color-brand); + color: var(--color-brand); +} + +.db-action-btn i { + color: inherit !important; +} + +.db-action-btn-danger:hover { + background-color: #fef2f2; + border-color: #ef4444; + color: #ef4444; +} + +.db-badge-active { + outline: 2px solid var(--text-primary); + outline-offset: 1px; +} + +#dbTypeBadges .sidebar-badge-name { + max-width: 130px; +} + +/* ===== API & Info Panels (shared docs layout) ===== */ + +#tab-api, +#tab-resources { + overflow: hidden !important; +} + +.docs-panel { + display: flex; + width: 100%; + height: 100%; +} + +.docs-sidebar { + display: flex; + flex-direction: column; + flex-shrink: 0; + height: 100%; + background-color: var(--bg-sidebar); + border-right: 1px solid var(--border-main); +} + +.docs-sidebar-api { + width: 360px; + min-width: 300px; +} + +.docs-sidebar-info { + width: 280px; + min-width: 240px; +} + +.docs-sidebar-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 14px; + border-bottom: 1px solid var(--border-main); + background-color: var(--bg-sidebar-header); + flex-shrink: 0; +} + +.docs-sidebar-title { + font-size: 0.82rem; + font-weight: 600; + color: var(--text-primary); + letter-spacing: 0.2px; +} + +.docs-sidebar-title i { + color: var(--color-brand) !important; + margin-right: 6px; +} + +.docs-open-external { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 5px; + color: var(--text-faint); + cursor: pointer; + transition: background-color 0.15s, color 0.15s; + font-size: 0.8rem; +} + +.docs-open-external:hover { + background-color: var(--color-brand-light); + color: var(--color-brand); +} + +.docs-open-external i { + color: inherit !important; +} + +.docs-sidebar-body { + flex: 1; + overflow-y: auto; + padding: 6px 0; +} + +/* --- API Detail Panel --- */ + +.api-detail-container { + flex: 1; + min-width: 0; + height: 100%; + overflow-y: auto; + background-color: var(--bg-card); +} + +.api-detail-welcome { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + padding: 40px; + text-align: center; + color: var(--text-lighter); +} + +.api-detail-welcome-icon { + font-size: 2.5rem; + color: var(--icon-lighter); + margin-bottom: 16px; +} + +.api-detail-welcome h5 { + color: var(--text-secondary); + margin-bottom: 8px; +} + +.api-detail-welcome p { + max-width: 400px; + font-size: 0.85rem; + line-height: 1.5; +} + +.api-detail-welcome-hint { + font-size: 0.78rem !important; + color: var(--text-lightest); + margin-top: 4px; +} + +.api-detail-welcome-hint code { + font-size: 0.75rem; + background-color: var(--bg-reference); + padding: 1px 5px; + border-radius: 3px; +} + +.api-detail-docs-link { + display: inline-block; + margin-top: 16px; + font-size: 0.8rem; + color: var(--color-brand) !important; + text-decoration: none; +} + +.api-detail-docs-link:hover { + text-decoration: underline; +} + +.api-detail-docs-link i { + color: inherit !important; +} + +.api-detail-content { + padding: 24px 28px; +} + +.api-detail-header { + margin-bottom: 20px; + padding-bottom: 16px; + border-bottom: 1px solid var(--border-light); +} + +.api-detail-title-row { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 8px; +} + +.api-detail-path { + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 0.88rem; + color: var(--text-primary); +} + +.api-detail-title { + font-size: 1.1rem; + font-weight: 600; + color: var(--text-primary); + margin: 6px 0 8px; +} + +.api-detail-meta { + display: flex; + align-items: center; + gap: 8px; +} + +.api-detail-tag { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 0.7rem; + padding: 3px 8px; + border-radius: 4px; + font-weight: 500; + text-decoration: none; +} + +.api-detail-tag i { + color: inherit !important; + font-size: 0.65rem; +} + +.api-detail-tag-auth { + background-color: #fff3cd; + color: #856404; +} + +.api-detail-tag-public { + background-color: #d4edda; + color: #155724; +} + +.api-detail-tag-docs { + background-color: var(--color-brand-light); + color: var(--color-brand) !important; +} + +.api-detail-tag-docs:hover { + background-color: #d0ebfa; + text-decoration: none; +} + +.api-detail-tag-tryit { + background-color: var(--color-brand); + color: #fff !important; + cursor: pointer; + transition: background-color 0.15s; +} + +.api-detail-tag-tryit:hover { + background-color: var(--color-brand-hover); + text-decoration: none; +} + +.api-detail-section { + margin-bottom: 18px; +} + +.api-detail-section h6 { + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.4px; + color: var(--text-muted); + margin-bottom: 8px; +} + +.api-detail-section p { + font-size: 0.85rem; + color: var(--text-secondary); + line-height: 1.6; +} + +.api-detail-section p code { + font-size: 0.78rem; + background-color: var(--bg-reference); + padding: 1px 5px; + border-radius: 3px; + color: var(--text-primary); +} + +.api-detail-table { + width: 100%; + font-size: 0.82rem; + border-collapse: collapse; +} + +.api-detail-table th { + text-transform: uppercase; + font-size: 0.68rem; + font-weight: 600; + letter-spacing: 0.3px; + color: var(--text-lighter); + padding: 6px 10px; + border-bottom: 2px solid var(--border-light); + text-align: left; +} + +.api-detail-table td { + padding: 6px 10px; + border-bottom: 1px solid var(--border-f0); + color: var(--text-secondary); + vertical-align: top; +} + +.api-detail-table code { + font-size: 0.78rem; + background-color: var(--bg-reference); + padding: 1px 5px; + border-radius: 3px; + color: var(--text-primary); +} + +.api-detail-code { + background-color: var(--bg-code); + color: var(--text-code); + padding: 14px 16px; + border-radius: 6px; + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 0.8rem; + line-height: 1.5; + overflow-x: auto; + white-space: pre; +} + +.api-detail-response-code { + display: inline-block; + font-size: 0.75rem; + font-weight: 600; + color: #28a745; + margin-bottom: 8px; +} + +.api-detail-note { + background-color: var(--bg-note); + border-left: 3px solid var(--color-brand); + padding: 10px 14px; + border-radius: 0 4px 4px 0; + font-size: 0.82rem; + color: var(--text-secondary); + line-height: 1.5; +} + +.api-detail-note i { + color: var(--color-brand) !important; + margin-right: 4px; +} + +.api-detail-note code { + font-size: 0.75rem; + background-color: var(--bg-note-code); + padding: 1px 5px; + border-radius: 3px; +} + +/* --- Info Detail Panel --- */ + +.info-detail-container { + flex: 1; + min-width: 0; + height: 100%; + overflow-y: auto; + background-color: var(--bg-card); +} + +.info-overview { + padding: 40px 36px; + max-width: 800px; + margin: 0 auto; +} + +.info-overview-header { + text-align: center; + margin-bottom: 32px; +} + +.info-overview-header h4 { + color: var(--text-primary); + margin-bottom: 8px; +} + +.info-overview-header p { + font-size: 0.88rem; + color: var(--text-faint); + max-width: 500px; + margin: 0 auto; +} + +.info-cards { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; + margin-bottom: 32px; +} + +.info-card { + background-color: var(--bg-sidebar); + border: 1px solid var(--border-light); + border-radius: 8px; + padding: 20px 16px; + text-align: center; + transition: border-color 0.15s; +} + +.info-card:hover { + border-color: var(--color-brand); +} + +.info-card-icon { + font-size: 1.4rem; + color: var(--color-brand); + margin-bottom: 10px; +} + +.info-card-icon i { + color: inherit !important; +} + +.info-card h6 { + font-size: 0.82rem; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 6px; +} + +.info-card p { + font-size: 0.75rem; + color: var(--text-faint); + line-height: 1.4; + margin: 0; +} + +.info-quick-links { + display: flex; + justify-content: center; + gap: 12px; +} + +.info-quick-link { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 16px; + border: 1px solid var(--border-ddd); + border-radius: 6px; + font-size: 0.8rem; + color: var(--text-secondary) !important; + text-decoration: none; + transition: border-color 0.15s, color 0.15s, background-color 0.15s; +} + +.info-quick-link:hover { + border-color: var(--color-brand); + color: var(--color-brand) !important; + background-color: var(--color-brand-light); + text-decoration: none; +} + +.info-quick-link i { + color: inherit !important; + font-size: 0.85rem; +} + +/* --- API endpoint styles --- */ + +.api-section { + padding: 4px 0; +} + +.api-section-label { + font-size: 0.68rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text-lighter); + padding: 8px 14px 4px; +} + +.api-endpoint { + display: flex; + align-items: baseline; + gap: 8px; + padding: 6px 14px; + cursor: pointer; + transition: background-color 0.12s; + flex-wrap: wrap; +} + +.api-endpoint:hover { + background-color: var(--color-brand-light); +} + +.api-endpoint.active { + background-color: #dbeafe; + border-left: 3px solid var(--color-brand); + padding-left: 11px; +} + +.api-method { + display: inline-block; + font-size: 0.62rem; + font-weight: 700; + letter-spacing: 0.5px; + padding: 2px 7px; + border-radius: 3px; + color: #fff; + flex-shrink: 0; + text-align: center; + min-width: 38px; +} + +.api-method-get { + background-color: #28a745; +} + +.api-method-post { + background-color: #007bff; +} + +.api-method-put { + background-color: #fd7e14; +} + +.api-method-delete { + background-color: #dc3545; +} + +.api-path { + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 0.78rem; + color: var(--text-primary); + white-space: nowrap; +} + +.api-desc { + font-size: 0.72rem; + color: var(--text-lighter); + width: 100%; + padding-left: 46px; + margin-top: -2px; +} + +/* --- Info TOC styles --- */ + +.docs-toc-section { + border-bottom: 1px solid var(--border-light); +} + +.docs-toc-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 9px 14px; + font-size: 0.8rem; + font-weight: 600; + color: var(--text-primary); + cursor: pointer; + user-select: none; + transition: background-color 0.12s; +} + +.docs-toc-header:hover { + background-color: var(--bg-reference); +} + +.docs-toc-header > span > i { + color: var(--icon-muted) !important; + font-size: 0.75rem; + margin-right: 6px; + width: 16px; + text-align: center; +} + +.docs-toc-header > i.fa-chevron-right { + font-size: 0.55rem; + color: var(--text-placeholder) !important; + transition: transform 0.2s; +} + +.docs-toc-header > i.fa-chevron-right.open { + transform: rotate(90deg); +} + +.docs-toc-body { + display: none; + padding: 0 0 6px; +} + +.docs-toc-body.open { + display: block; +} + +.docs-toc-entry { + display: block; + padding: 5px 14px 5px 36px; + font-size: 0.78rem; + color: var(--text-secondary) !important; + cursor: pointer; + transition: background-color 0.12s, color 0.12s; + text-decoration: none; +} + +.docs-toc-entry:hover { + background-color: var(--color-brand-light); + color: var(--text-primary) !important; + text-decoration: none; +} + +.docs-toc-entry i { + color: inherit !important; + margin-right: 4px; + font-size: 0.72rem; + width: 14px; + text-align: center; +} + +.docs-toc-ext { + font-size: 0.58rem !important; + opacity: 0; + margin-left: 4px; + transition: opacity 0.15s; +} + +.docs-toc-entry:hover .docs-toc-ext { + opacity: 0.6; +} + +/* ===== API Playground ===== */ + +.api-playground { + border-top: 2px solid var(--border-main); + margin-top: 24px; + padding-top: 20px; +} + +.api-playground-title { + font-size: 0.82rem; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 16px; + display: flex; + align-items: center; + gap: 8px; +} + +.api-playground-title i { + color: var(--color-brand) !important; +} + +.api-playground-section { + margin-bottom: 14px; +} + +.api-playground-section label { + font-size: 0.72rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.3px; + color: var(--text-muted); + margin-bottom: 4px; + display: block; +} + +.api-playground-input { + width: 100%; + padding: 6px 10px; + border: 1px solid var(--border-ddd); + border-radius: 4px; + font-size: 0.82rem; + background-color: var(--bg-input); + color: var(--text-primary); +} + +.api-playground-input:focus { + border-color: var(--color-brand); + outline: none; +} + +.api-playground-body-editor { + width: 100%; + min-height: 100px; + padding: 10px 12px; + border: 1px solid var(--border-ddd); + border-radius: 6px; + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 0.8rem; + line-height: 1.5; + background-color: var(--bg-input); + color: var(--text-primary); + resize: vertical; +} + +.api-playground-body-editor:focus { + border-color: var(--color-brand); + outline: none; +} + +.api-playground-send { + background-color: var(--color-brand); + color: #fff; + border: none; + padding: 8px 20px; + border-radius: 6px; + font-size: 0.82rem; + font-weight: 600; + cursor: pointer; + transition: background-color 0.15s; +} + +.api-playground-send:hover { + background-color: var(--color-brand-hover); +} + +.api-playground-send:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.api-playground-response { + margin-top: 16px; +} + +.api-playground-response-header { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 8px; +} + +.api-playground-status { + font-size: 0.78rem; + font-weight: 600; + padding: 2px 8px; + border-radius: 4px; +} + +.api-playground-status-ok { + background-color: #d4edda; + color: #155724; +} + +.api-playground-status-error { + background-color: #f8d7da; + color: #721c24; +} + +.api-playground-timing { + font-size: 0.72rem; + color: var(--text-lightest); +} + +.api-playground-response-body { + background-color: var(--bg-code); + color: var(--text-code); + padding: 14px 16px; + border-radius: 6px; + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 0.78rem; + line-height: 1.5; + overflow-x: auto; + white-space: pre; + max-height: 400px; + overflow-y: auto; + position: relative; +} + +.api-playground-copy { + position: absolute; + top: 8px; + right: 8px; + background: rgba(255,255,255,0.1); + border: none; + color: var(--text-code); + padding: 4px 8px; + border-radius: 4px; + font-size: 0.7rem; + cursor: pointer; +} + +.api-playground-copy:hover { + background: rgba(255,255,255,0.2); +} + +.api-playground-auth-select { + width: 100%; + padding: 6px 10px; + border: 1px solid var(--border-ddd); + border-radius: 4px; + font-size: 0.82rem; + background-color: var(--bg-input); + color: var(--text-primary); +} + +.api-playground-auth-fields { + margin-top: 8px; +} + +.api-playground-param-row { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; +} + +.api-playground-param-row code { + font-size: 0.78rem; + min-width: 80px; + color: var(--text-primary); +} + +.api-playground-param-row input { + flex: 1; +} + +/* ===== Settings Tab (main sidebar) ===== */ + +.studio-settings-panel { + padding: 24px 28px; + max-width: 600px; +} + +.studio-settings-panel h5 { + color: var(--text-primary); + margin-bottom: 24px; + display: flex; + align-items: center; + gap: 8px; +} + +.studio-settings-panel h5 i { + color: var(--color-brand) !important; +} + +.studio-settings-section { + margin-bottom: 24px; +} + +.studio-settings-section h6 { + font-size: 0.8rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.3px; + color: var(--text-secondary); + margin-bottom: 12px; + padding-bottom: 6px; + border-bottom: 1px solid var(--border-light); +} + +.theme-option-group { + display: flex; + gap: 8px; +} + +.theme-option { + display: flex; + align-items: center; + gap: 6px; + padding: 8px 16px; + border: 2px solid var(--border-ddd); + border-radius: 8px; + cursor: pointer; + font-size: 0.82rem; + color: var(--text-secondary); + transition: border-color 0.15s, background-color 0.15s; + user-select: none; +} + +.theme-option:hover { + border-color: var(--color-brand); + background-color: var(--color-brand-light); +} + +.theme-option.active { + border-color: var(--color-brand); + background-color: var(--color-brand-light); + color: var(--color-brand); + font-weight: 600; +} + +.theme-option i { + font-size: 1rem; +} + +/* ===== Toast Container ===== */ + +.studio-toast { + min-width: 280px; + background-color: var(--bg-card); + border: 1px solid var(--border-ddd); + border-radius: 8px; + box-shadow: 0 4px 12px var(--shadow-dropdown); + color: var(--text-primary); +} + +.studio-toast .toast-header { + background-color: var(--bg-sidebar); + border-bottom: 1px solid var(--border-light); + color: var(--text-primary); +} + +.studio-toast .toast-body { + font-size: 0.85rem; +} + +/* ===== Global Modal Styles ===== */ + +#globalModal .modal-content { + background-color: var(--modal-bg); + color: var(--text-primary); + border: 1px solid var(--border-ddd); +} + +#globalModal .modal-header { + background-color: var(--bg-sidebar); + border-bottom: 1px solid var(--border-light); +} + +#globalModal .modal-footer { + border-top: 1px solid var(--border-light); +} + +#globalModal .modal-body { + color: var(--text-secondary); +} + +#globalModal .modal-body input, +#globalModal .modal-body textarea { + background-color: var(--bg-input); + color: var(--text-primary); + border: 1px solid var(--border-ddd); + border-radius: 4px; + padding: 6px 10px; + width: 100%; +} + +#globalModal .modal-body input:focus, +#globalModal .modal-body textarea:focus { + border-color: var(--color-brand); + outline: none; +} + +/* ===== Dark Theme Overrides for Bootstrap Components ===== */ + +[data-theme="dark"] .form-control, +[data-theme="dark"] .form-select, +[data-theme="dark"] textarea.form-control { + background-color: var(--bg-input); + color: var(--text-primary); + border-color: var(--border-ddd); +} + +[data-theme="dark"] .form-control:focus, +[data-theme="dark"] .form-select:focus { + background-color: var(--bg-input); + color: var(--text-primary); + border-color: var(--color-brand); + box-shadow: 0 0 0 0.15rem rgba(41, 182, 246, 0.25); +} + +[data-theme="dark"] .modal-content { + background-color: var(--modal-bg); + border-color: var(--border-ddd); + color: var(--text-primary); +} + +[data-theme="dark"] .modal-header { + border-bottom-color: var(--border-light); +} + +[data-theme="dark"] .modal-footer { + border-top-color: var(--border-light); +} + +[data-theme="dark"] .btn-close { + filter: invert(1) grayscale(100%) brightness(200%); +} + +[data-theme="dark"] .table { + color: var(--text-primary); + --bs-table-color: var(--text-primary); + --bs-table-bg: var(--bg-card); + --bs-table-striped-color: var(--text-primary); + --bs-table-striped-bg: var(--bg-sidebar); + --bs-table-hover-color: var(--text-primary); + --bs-table-hover-bg: var(--table-hover); + --bs-table-border-color: var(--border-ddd); + border-color: var(--border-ddd); +} + +[data-theme="dark"] .table > :not(caption) > * > * { + color: var(--text-primary); + border-bottom-color: var(--border-ddd); +} + +[data-theme="dark"] .table thead th { + color: var(--text-muted); + border-bottom-color: var(--border-ddd); +} + +[data-theme="dark"] .table tbody td { + color: var(--text-primary); +} + +[data-theme="dark"] div.dt-search input { + background-color: var(--bg-input); + color: var(--text-primary); + border-color: var(--border-ddd); +} + +[data-theme="dark"] div.dt-search label, +[data-theme="dark"] div.dt-length label, +[data-theme="dark"] div.dt-info, +[data-theme="dark"] .dataTables_wrapper label, +[data-theme="dark"] .dataTables_info { + color: var(--text-secondary); +} + +[data-theme="dark"] div.dt-length select { + background-color: var(--bg-input); + color: var(--text-primary); + border-color: var(--border-ddd); +} + +[data-theme="dark"] .dt-paging .page-link { + background-color: var(--bg-input); + color: var(--text-primary); + border-color: var(--border-ddd); +} + +[data-theme="dark"] .dt-paging .page-item.active .page-link { + background-color: var(--color-brand); + border-color: var(--color-brand); + color: #fff; +} + +[data-theme="dark"] .dt-paging .page-item.disabled .page-link { + background-color: var(--bg-sidebar); + color: var(--text-faint); + border-color: var(--border-ddd); +} + +[data-theme="dark"] .CodeMirror { + background-color: var(--bg-card); + color: var(--text-primary); +} + +[data-theme="dark"] .CodeMirror-gutters { + background-color: var(--bg-card); +} + +[data-theme="dark"] .CodeMirror-cursor { + border-left-color: var(--text-primary); +} + +[data-theme="dark"] .CodeMirror-linenumber { + color: var(--text-faint); +} + +[data-theme="dark"] .dropdown-menu { + background-color: var(--bg-card); + border-color: var(--border-ddd); + color: var(--text-primary); +} + +[data-theme="dark"] .dropdown-item { + color: var(--text-primary); +} + +[data-theme="dark"] .dropdown-item:hover { + background-color: var(--bg-hover); + color: var(--text-primary); +} + +[data-theme="dark"] #tabs { + background-color: var(--bg-nav) !important; +} + +[data-theme="dark"] .card { + background-color: var(--bg-card); + border-color: var(--border-ddd); +} + +[data-theme="dark"] .card-header { + background-color: var(--bg-sidebar); + border-bottom-color: var(--border-ddd); +} + +[data-theme="dark"] .alert-warning { + background-color: #332b00; + border-color: #664e00; + color: #ffc107; +} + +[data-theme="dark"] .alert-info { + background-color: #00263a; + border-color: #004d7a; + color: #17a2b8; +} + +[data-theme="dark"] .api-endpoint.active { + background-color: var(--color-brand-light); +} + +[data-theme="dark"] .api-path { + color: var(--text-primary); +} + +[data-theme="dark"] .api-desc { + color: var(--text-muted); +} + +[data-theme="dark"] .api-section-label { + color: var(--text-muted); +} + +[data-theme="dark"] .api-detail-tag-docs { + background-color: var(--color-brand-light); + color: var(--color-brand) !important; +} + +[data-theme="dark"] .api-detail-tag-docs:hover { + background-color: #1a4a5a; +} + +[data-theme="dark"] .docs-sidebar-title { + color: var(--text-primary); +} + +[data-theme="dark"] .docs-sidebar-header { + background-color: var(--bg-sidebar-header); +} + +[data-theme="dark"] .docs-open-external { + color: var(--text-muted); +} + +[data-theme="dark"] .api-detail-path { + color: var(--text-primary); +} + +[data-theme="dark"] .api-detail-title { + color: var(--text-primary); +} + +[data-theme="dark"] .api-detail-response-code { + color: #4ade80; +} + +[data-theme="dark"] .reference-example:hover { + background-color: var(--bg-hover); +} + +[data-theme="dark"] .db-action-btn-danger:hover { + background-color: #3a1010; + border-color: #ef4444; + color: #ef4444; +} + +[data-theme="dark"] .api-detail-tag-auth { + background-color: #3a2e00; + color: #ffc107; +} + +[data-theme="dark"] .api-detail-tag-public { + background-color: #0a3a1a; + color: #28a745; +} + +/* ApexCharts dark theme overrides */ +[data-theme="dark"] .apexcharts-text, +[data-theme="dark"] .apexcharts-text tspan { + fill: var(--text-secondary) !important; +} + +[data-theme="dark"] .apexcharts-datalabel-label { + fill: var(--text-muted) !important; +} + +[data-theme="dark"] .apexcharts-datalabel-value { + fill: var(--text-primary) !important; +} + +[data-theme="dark"] .apexcharts-title-text { + fill: var(--text-primary) !important; +} + +[data-theme="dark"] .apexcharts-yaxis-label tspan, +[data-theme="dark"] .apexcharts-xaxis-label tspan { + fill: var(--text-muted) !important; +} + +[data-theme="dark"] .apexcharts-yaxis-title text { + fill: var(--text-muted) !important; +} + +[data-theme="dark"] .apexcharts-legend-text { + color: var(--text-secondary) !important; +} + +[data-theme="dark"] .apexcharts-gridline { + stroke: var(--border-ddd); +} + +[data-theme="dark"] .apexcharts-grid-borders line { + stroke: var(--border-ddd); +} + +[data-theme="dark"] .apexcharts-tooltip { + background: var(--bg-card) !important; + border-color: var(--border-ddd) !important; + color: var(--text-primary) !important; +} + +[data-theme="dark"] .apexcharts-tooltip-title { + background: var(--bg-sidebar) !important; + border-bottom-color: var(--border-ddd) !important; + color: var(--text-primary) !important; +} + +[data-theme="dark"] .apexcharts-tooltip-text { + color: var(--text-primary) !important; +} + +[data-theme="dark"] .apexcharts-tooltip-series-group { + background: transparent !important; +} + +[data-theme="dark"] .apexcharts-xaxistooltip, +[data-theme="dark"] .apexcharts-yaxistooltip { + background: var(--bg-card) !important; + border-color: var(--border-ddd) !important; + color: var(--text-primary) !important; +} + +[data-theme="dark"] .apexcharts-xaxistooltip-text { + color: var(--text-primary) !important; +} + +[data-theme="dark"] kbd { + background-color: var(--bg-sidebar); + color: var(--text-primary); + border: 1px solid var(--border-ddd); +} + +[data-theme="dark"] .nav-tabs { + border-color: var(--border-ddd); +} + +[data-theme="dark"] .nav-tabs .nav-link { + border-color: transparent; + color: var(--text-secondary); +} + +[data-theme="dark"] .nav-tabs .nav-link:hover { + color: var(--text-primary); +} + +[data-theme="dark"] .nav-tabs .nav-link.active, +[data-theme="dark"] .nav-tabs .nav-link.active.show { + border-color: var(--border-ddd) var(--border-ddd) var(--bg-active-tab); + background-color: var(--bg-active-tab); + color: var(--text-primary); +} + +/* General dark theme text and form overrides */ +[data-theme="dark"] label { + color: var(--text-secondary); +} + +[data-theme="dark"] select { + background-color: var(--bg-input); + color: var(--text-primary); + border-color: var(--border-ddd); +} + +[data-theme="dark"] input[type="text"], +[data-theme="dark"] input[type="number"], +[data-theme="dark"] input[type="search"], +[data-theme="dark"] input[type="password"], +[data-theme="dark"] input[type="time"] { + background-color: var(--bg-input); + color: var(--text-primary); + border-color: var(--border-ddd); +} + +[data-theme="dark"] b, +[data-theme="dark"] strong { + color: var(--text-primary); +} + +[data-theme="dark"] span { + color: inherit; +} + +[data-theme="dark"] .btn-outline-primary { + color: var(--color-brand); + border-color: var(--color-brand); +} + +[data-theme="dark"] .btn-outline-primary:hover { + background-color: var(--color-brand); + color: #fff; +} + +[data-theme="dark"] .btn-pill { + color: var(--text-primary); +} + +[data-theme="dark"] .result-stats { + color: var(--text-secondary); +} + +[data-theme="dark"] textarea { + background-color: var(--bg-input); + color: var(--text-primary); + border-color: var(--border-ddd); +} + +[data-theme="dark"] .card-header-tab.card-header { + background-color: var(--bg-card); + border-color: var(--border-ddd); +} + +[data-theme="dark"] h1, [data-theme="dark"] h2, [data-theme="dark"] h3, +[data-theme="dark"] h4, [data-theme="dark"] h5, [data-theme="dark"] h6 { + color: var(--text-primary); +} + +[data-theme="dark"] p { + color: var(--text-secondary); +} + +[data-theme="dark"] .form-check-label { + color: var(--text-secondary); +} + +[data-theme="dark"] .btn-sm { + color: var(--text-primary); +} + +[data-theme="dark"] .btn-success { + color: #fff; +} + +[data-theme="dark"] .form-label { + color: var(--text-secondary); +} + +[data-theme="dark"] small, +[data-theme="dark"] .text-muted { + color: var(--text-muted) !important; +} + +/* ===== Record Editor ===== */ + +.record-editor-fields { + overflow-y: auto; + max-height: calc(100vh - 300px); + padding: 4px 0; +} + +.record-editor-fields .form-label { + font-size: 0.78rem; + font-weight: 600; + color: var(--text-secondary); + margin-bottom: 2px; +} + +.record-editor-fields .form-control { + background-color: var(--bg-input); + color: var(--text-primary); + border: 1px solid var(--border-ddd); + font-size: 0.84rem; + margin-bottom: 10px; +} + +.record-editor-fields .form-control:focus { + border-color: var(--color-brand); + box-shadow: 0 0 0 0.15rem rgba(0, 174, 238, 0.15); +} + +.record-editor-fields textarea.form-control { + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 0.8rem; + min-height: 60px; + resize: vertical; +} + +.record-editor-buttons { + display: flex; + gap: 6px; + padding-top: 10px; + border-top: 1px solid var(--border-light); + flex-wrap: wrap; +} + +.record-editor-overlay { + position: fixed; + top: 0; + bottom: 0; + right: -420px; + width: 400px; + background-color: var(--bg-card); + border-left: 1px solid var(--border-main); + box-shadow: -4px 0 12px var(--shadow-dropdown); + overflow-y: auto; + padding: 16px; + transition: right 0.25s ease; + z-index: 10050; +} + +.record-editor-overlay.open { + right: 0; +} + +.record-editor-close { + position: absolute; + top: 10px; + right: 10px; + background: none; + border: none; + color: var(--text-faint); + font-size: 1.1rem; + cursor: pointer; + padding: 4px 8px; + border-radius: 4px; + z-index: 101; +} + +.record-editor-close:hover { + color: var(--text-primary); + background-color: var(--bg-reference); +} + +#recordEditorContainer { + height: 100%; + overflow-y: auto; + padding: 16px; + background-color: var(--bg-card); + border-left: 1px solid var(--border-main); +} + +#graphPropertiesPanel.col-12 #recordEditorContainer { + max-width: 800px; + margin: 0 auto; + border-left: none; } diff --git a/studio/src/main/resources/static/database.html b/studio/src/main/resources/static/database.html index 5b0194cf53..b8279ef192 100644 --- a/studio/src/main/resources/static/database.html +++ b/studio/src/main/resources/static/database.html @@ -1,161 +1,108 @@ -
-
-
-

Database

+
+
+
+ + @ + +
+
+ + + +
-
-
-
-
- @ - + + +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ + Select a type from the sidebar to view its schema. +
-
- - - - -
-
- -
-
-
- -
-
- + +
+
+
+
+
+
-
-
-
-
- -
- -
+ +
+
+
-
-
-
-
-
Below you can find the declared Vertex Types with the number of defined properties in parentheses. Click on the type on the left to - display it properties and indexes.

-
-
-
-
- -
-
-
-
-
-
-
-
-
-
Below you can find the declared Edge Types with the number of defined properties in parentheses. Click on the type on the left to - display it properties and indexes.

-
-
-
-
- -
-
-
-
-
-
-
-
-
-
Below you can find the declared Document Types with the number of defined properties in parentheses. Click on the type on the left to - display it properties and indexes.

-
-
-
-
- -
-
-
-
-
+
+
Database Backups
+
+ +
-
-
-
-
-
- -
-
-
-
-
Database Backups
-
- - +
+
Backup Configuration & Statistics
+
+
+
+
+

Loading configuration...

-
-
- -
-
Backup Configuration & Statistics
-
-
-
-
-

Loading configuration...

+
+
+
+
Total Backups
+
-
-
-
-
-
-
Total Backups
-
-
-
-
-
Total Size
-
-
-
+
+
Total Size
+
-
+
-
-
Available Backups
-
-
-
-
+
+
Available Backups
+
+
+
diff --git a/studio/src/main/resources/static/index.html b/studio/src/main/resources/static/index.html index 836913e3f0..93ce82cb31 100644 --- a/studio/src/main/resources/static/index.html +++ b/studio/src/main/resources/static/index.html @@ -7,6 +7,15 @@ ArcadeDB - The Next Generation Multi-Model DBMS + + + @@ -17,7 +26,10 @@ - + + + + @@ -26,9 +38,6 @@ - - - @@ -66,69 +75,63 @@ @@ -141,6 +144,7 @@ +
@@ -154,12 +158,12 @@
- - ${include:popup-login.html} - + + + + +
+ + ${include:popup-login.html} diff --git a/studio/src/main/resources/static/server.html b/studio/src/main/resources/static/server.html index 778b8bfa6b..3818be63e4 100644 --- a/studio/src/main/resources/static/server.html +++ b/studio/src/main/resources/static/server.html @@ -1,20 +1,21 @@
-
-
-
-

Server

-
-
- -
+
+
+ + + + + + +
-
- +
+
-
-
diff --git a/studio/src/main/resources/static/settings.html b/studio/src/main/resources/static/settings.html new file mode 100644 index 0000000000..900bcaa86f --- /dev/null +++ b/studio/src/main/resources/static/settings.html @@ -0,0 +1,59 @@ +
+
+
Settings
+ +
+
Appearance
+
Theme
+
+
+ Light +
+
+ Dark +
+
+ System +
+
+
+
+
+ +