initial files

This commit is contained in:
2026-04-22 11:55:23 +02:00
commit 92444ff38c
85 changed files with 16324 additions and 0 deletions

131
public/styles/colors.css Normal file
View File

@@ -0,0 +1,131 @@
/* #region OS */
#desktop { background:var(--theme-desktop-backcolor); background-image:var(--theme-desktop-image); }
#taskbar { background:var(--theme-taskbar-backcolor); color:var(--theme-taskbar-color); }
#tutorial-tooltip {background:var(--theme-window-backcolor); color:var(--theme-window-color);}
#tutorial-tooltip img {filter: invert(1);}
#start-btn { background:var(--theme-accent-default-backcolor); color:var(--theme-accent-default-color); }
#start-btn:hover { background:var(--theme-accent-hover-backcolor); color:var(--theme-accent-hover-color); }
#start-btn:active { background:var(--theme-accent-active-backcolor); color:var(--theme-accent-active-color); }
/* #start-menu, .submenu { background:var(--theme-taskbar-backcolor); color:var(--theme-taskbar-color); } */
#start-menu { padding-bottom:10px; background:var(--theme-startmenu-backcolor); color:var(--theme-startmenu-color); border:3px solid rgb(128,128,128); }
.start-submenu-head { background:var(--theme-startmenu-submenu-header-backcolor); color:var(--theme-startmenu-submenu-header-backcolor) }
.start-icon { background:var(--theme-accent-default-backcolor); }
/* .start-item:hover, .start-sys-item:hover { color:var(--theme-accent-hover-color); background:var(--theme-accent-hover-backcolor); } */
.start-item.has-submenu.open > .menu-label , .start-item:not(.has-submenu.open), .start-sys-item { background-color:var(--theme-startmenu-item-default-backcolor); color:var(--theme-startmenu-item-default-color); }
.start-item:not(.has-submenu.open):not(.unload):hover, .start-sys-item:hover { background-color:var(--theme-startmenu-item-hover-backcolor); color:var(--theme-startmenu-item-hover-color); }
.start-item:not(.has-submenu):not(.has-submenu.open):not(.unload):active, .start-sys-item:active { color:var(--theme-accent-active-color); background:var(--theme-accent-active-backcolor); }
.start-item-sys-container { background:var(--theme-startmenu-syscontainer-backcolor);}
.start-item .unload { background:var(--theme-startmenu-item-disabled-backcolor); color:var(--theme-startmenu-item-disabled-color); }
/* #taskbar .taskbar-item { background:var(--theme-taskbar-item-backcolor); } */
.taskbar-item { position: relative;}
.taskbar-item::before { background: var(--theme-accent-active-color); }
.taskbar-item.focus::before { background: var(--theme-accent-active-backcolor); }
/* .taskbar-item.minimized { background:var(--theme-taskbar-item-minimized-backcolor); color:var(--theme-taskbar-item-minimized-color); border-color:var(--theme-taskbar-item-minimized-border-color);} */
.taskbar-item.default { background:var(--theme-taskbar-item-default-backcolor); color:var(--theme-taskbar-item-default-color); border-color:var(--theme-taskbar-item-default-border-color);}
.taskbar-item:hover { background-color:var(--theme-startmenu-item-hover-backcolor); color:var(--theme-startmenu-item-hover-color); }
.window { border:2px solid var(--theme-window-titlebar-backcolor); background:var(--theme-window-backcolor); }
.window-content { color:var(--theme-window-color); background:var(--theme-window-backcolor); }
.window-titlebar { color:var(--theme-window-titlebar-color); background:var(--theme-window-titlebar-backcolor); }
.window .controls button { color:var(--theme-window-titlebar-color); background:transparent; }
.window .controls button:hover { color:var(--theme-accent-hover-color); background:var(--theme-accent-hover-backcolor); }
/* #endregion */
/* #region Table */
table, tr, td, th { border-color:var(--theme-table-border-color); }
table thead th { background-color:var(--theme-table-header-backcolor); color:var(--theme-table-header-color); border-color:var(--theme-table-border-color); }
table tbody tr:nth-child(even) { background-color:var(--theme-table-rows-even-backcolor); color:var(--theme-table-rows-even-color); }
table tbody tr:nth-child(odd) { background-color:var(--theme-table-rows-odd-backcolor); color:var(--theme-table-rows-odd-color); }
table tbody tr:not(.grouprow):not(.no-hover):hover { color:var(--theme-accent-hover-color); background:var(--theme-accent-hover-backcolor); }
table tbody tr.grouprow { background-color:var(--theme-table-rows-grouprow-backcolor); color:var(--theme-table-rows-grouprow-color); }
table tbody tr.active, table tbody td.active { color:var(--theme-accent-active-color); background:var(--theme-accent-active-backcolor); }
.table-filter-container { border-color:var(--theme-table-border-color); background-color:var(--theme-table-header-backcolor); color:var(--theme-table-header-color); }
/* #endregion */
/* #region Scrollbar */
::-webkit-scrollbar-track, ::-webkit-scrollbar-corner { background:var(--theme-scrollbar-backcolor); }
::-webkit-scrollbar-thumb { background-color:var(--theme-scrollbar-thumb-default-backcolor); border-color:var(--theme-scrollbar-thumb-default-border-color); }
::-webkit-scrollbar-thumb:hover { background-color:var(--theme-scrollbar-thumb-hover-backcolor); border-color:var(--theme-scrollbar-thumb-hover-border-color); }
/* #endregion */
/* #region Tooltip */
.global-tooltip { background:var(--theme-tooltip-backcolor); color:var(--theme-tooltip-color); border-color:var(--theme-tooltip-border-color) }
/* #endregion */
/* #region feedbox */
.feedbox { background:var(--theme-feedbox-backcolor); color:var(--theme-feedbox-color);box-shadow:0 5px 25px rgba(0,0,0,0.3); }
.feedbox-overlay { background:rgba(0,0,0,0.5); }
/* #endregion */
/* #region Messagbox */
.test, .test .countdown { color:var(--theme-message-test-color); background-color:var(--theme-message-test-backcolor); border-color:var(--theme-message-test-border-color); }
.success, .success .countdown { color:var(--theme-message-success-color); background-color:var(--theme-message-success-backcolor); border-color:var(--theme-message-success-border-color); }
.error, .error .countdown { color:var(--theme-message-error-color); background:var(--theme-message-error-backcolor); border-color:var(--theme-message-error-border-color); }
.info, .info .countdown { color:var(--theme-message-info-color); background-color:var(--theme-message-info-backcolor); border-color:var(--theme-message-info-border-color); }
.warn, .warn .countdown { color:var(--theme-message-warn-color); background-color:var(--theme-message-warn-backcolor); border-color:var(--theme-message-warn-border-color); }
.throw_exception, .throw_exception .countdown { color:var(--theme-message-throw-color); background-color:var(--theme-message-throw-backcolor); border-color:var(--theme-message-throw-border-color); }
.message { box-shadow:0 4px 10px rgba(0,0,0,0.3); } /* SHADOW? */
/* #endregion */
.error-field { background:var(--theme-message-error-backcolor); border-color:var(--theme-message-error-border-color); color:var(--theme-message-error-color); }
.success-field { background:var(--theme-message-success-backcolor); border-color: var(--theme-message-success-border-color); color:var(--theme-message-success-color); }
/* region Container*/
.card { background:var(--theme-container-card-backcolor); border-color:var(--theme-container-card-border); }
/* #endregion */
/* #region Checkbox */
.cb-box { border-color:var(--theme-checkbox-default-border-color); box-shadow:0 1px 2px var(--theme-checkbox-shadow-color) inset; }
.cb input:checked + .cb-box { background:var(--theme-checkbox-default-thumb); border-color:var(--theme-checkbox-default-thumb); }
.cb input:disabled + .cb-box { background:var(--theme-checkbox-disabled-backcolor); border-color:var(--theme-checkbox-disabled-border-color); }
.cb-label { color:var(--theme-checkbox-color); }
/* #endregion */
/* #region Switch */
.cb-switch .cb-label { color:var(--theme-switch-color); }
.switch-track { background:var(--theme-switch-backcolor); border-color:var(--theme-switch-border-color); }
/* #endregion */
/* #region Required */
.is-required-empty { border-width:2px; border-color:var(--theme-required-empty); border-style:solid; }
.is-required-filled { border-color:var(--theme-required-accept); }
/* #endregion */
/* #region Tabs */
.tabs { border-bottom-color: #ccc; }
.tab-content { border-color: #ccc; }
.tab:hover { background-color: var(--theme-accent-hover-backcolor); color: var(--theme-accent-hover-color); }
.tab.active { background-color: var(--theme-accent-active-backcolor); color: var(--theme-accent-active-color); border-color: var(--theme-accent-active-border-color); border-bottom-color: var(--theme-accent-active-backcolor); }
/* #endregion */
/* #region DOM */
button:not(:disabled).monolyth { background-color:var(--theme-button-monolyth-default-backcolor); color:var(--theme-button-monolyth-default-color); }
button:not(:disabled).monolyth:hover { background-color:var(--theme-button-monolyth-hover-backcolor); color:var(--theme-button-monolyth-hover-color); }
button:not(:disabled).monolyth:hover, button:not(:disabled).bluebutton:hover, button:not(:disabled).redbutton:hover, button:not(:disabled).yellowbutton:hover, button:not(:disabled).greenbutton:hover { box-shadow:0 6px 8px rgba(0,0,0,0.15); }
select { background:var(--theme-select-default-backcolor); color:var(--theme-select-default-color); box-shadow:0 0 5px var(--theme-select-default-border-color); }
input:hover, input[type="text"]:hover, input[type="email"]:hover, input[type="password"]:hover, input[type="number"]:hover, input[type="date"]:hover,textarea:hover, select:hover { background:var(--theme-input-hover-backcolor); color:var(--theme-input-hover-color); box-shadow:0 0 5px var(--theme-input-hover-border-color); }
input:focus, input[type="text"]:focus, input[type="email"]:focus, input[type="password"]:focus, input[type="number"]:focus, input[type="date"]:focus, textarea:focus, select:focus { background:var(--theme-input-focus-backcolor); color:var(--theme-input-focus-color); box-shadow:0 0 5px var(--theme-input-focus-border-color); }
input.valid { border: 2px solid var(--theme-input-accept-border-color); }
input.invalid { border: 2px solid var(--theme-input-decline-border-color); }
*::placeholder, input[id="sAMAccountName"] { color:var(--theme-input-placeholder-color); }
textarea, input { border-color:var(--theme-input-default-border-color); background:var(--theme-input-default-backcolor); color:var(--theme-input-default-color); }
textarea:not([required]):hover, input:not([required]):hover { border-color:var(--theme-input-hover-border-color); background-color:var(--theme-input-hover-backcolor); color:var(--theme-input-hover-color); }
textarea:focus, input:focus { border-color:var(--theme-input-focus-border-color); background-color:var(--theme-input-focus-backcolor); color:var(--theme-input-focus-color); }
select, select option { border-color:var(--theme-select-border-color); background-color:var(--theme-select-backcolor); color:var(--theme-select-color); }
select:focus, select:not([required]):hover, select:focus option,select:not([required]):hover option { border-color:var(--theme-select-hover-border-color); background-color:var(--theme-select-hover-backcolor); color:var(--theme-select-hover-color); }
/* #endregion */

View File

@@ -0,0 +1,79 @@
.ctx-menu {
position: fixed;
min-width: 180px;
background: var(--theme-contextmenu-backcolor);
border: 1px solid var(--theme-contextmenu-border-color);
color: var(--theme-contextmenu-color);
border-radius: 6px;
padding: 4px 0;
box-shadow: 0 8px 20px rgba(0,0,0,0.15);
z-index: 2;
}
.ctx-menu.hidden {
opacity: 0;
display: none;
}
.ctx-list {
list-style: none;
margin: 0;
padding: 0;
}
.ctx-item {
padding: 5px 7px 5px 20px;
margin-left: 1px;
white-space: nowrap;
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
}
.ctx-item:hover {
background: var(--theme-contextmenu-hover-backcolor);
color: var(--theme-contextmenu-hover-color);
}
.ctx-item .icon {
display: inline-flex;
position: relative;
justify-content: flex-start;
width: 20px;
}
.ctx-disabled {
opacity: 0.5;
/* cursor: default; */
}
.ctx-divider {
border-top: 1px solid var(--theme-contextmenu-divider);
margin: 4px 0;
}
.ctx-submenu {
position: absolute;
left: 100%;
top: 0;
min-width: 160px;
background: var(--theme-contextmenu-backcolor);
border: 1px solid var(--theme-contextmenu-border-color);
color: var(--theme-contextmenu-color);
padding: 4px 0;
border-radius: 6px;
display: none;
z-index: 99999;
}
.ctx-submenu.open {
display: block;
}
.ctx-arrow {
font-size: 11px;
opacity: 0.6;
}

434
public/styles/default.css Normal file
View File

@@ -0,0 +1,434 @@
/* #region DOM */
*::placeholder { text-align:center; }
* {
user-select:none;
cursor: var(--theme-cursor-default) 1 1, auto;
}
.selectable { user-select: text !important; cursor: var(--theme-cursor-pointer) 0 16, pointer; }
input, input[type="text"], input[type="email"], input[type="password"], input[type="search"], input[type="date"], textarea, select { border-width:2px; border-style:solid; font-size: var(--fontSize); font-family: var(--fontFamily); border-radius:10px; padding:10px 12px; outline:none; transition:all .5s ease; width:auto; }
input.width\:100px { width:100px; }
input.width\:90px { width:90px; }
input.width\:75px { width:75px; }
input.width\:50px { width:50px; }
input.width\:25px { width:25px; }
*::placeholder, input[id="sAMAccountName"] { font-style:italic; font-weight:100; letter-spacing:3px; }
html, button { font-size: var(--fontSize); font-family: var(--fontFamily); }
button.monolyth, button.bluebutton, button.greenbutton, button.yellowbutton, button.redbutton { display:inline-block; padding:8px 10px; margin:0.2rem 1.6rem; font-weight:600; text-align:center; text-decoration:none; color:rgb(255, 255, 255); border:none; border-radius:8px; box-shadow:0 4px 6px rgba(0,0,0,0.1); transition:all 0.2s ease; }
button.monolyth { background-color:transparent; }
button:not(:disabled).monolyth:hover { opacity:0.9; }
button.bluebutton { color:var(--theme-button-blue-default-color); background:var(--theme-button-blue-default-backcolor); }
button.greenbutton { color:var(--theme-button-green-default-color); background:var(--theme-button-green-default-backcolor); }
button.yellowbutton { color:var(--theme-button-yellow-default-color); background:var(--theme-button-yellow-default-backcolor); }
button.redbutton { color:var(--theme-button-red-default-color); background:var(--theme-button-red-default-backcolor); }
button:disabled { color:var(--theme-button-disabled-color); background:var(--theme-button-disabled-backcolor); }
button:not(:disabled).redbutton:hover { background:var(--theme-button-red-hover-color); background:var(--theme-button-red-hover-backcolor); }
button:not(:disabled).greenbutton:hover { background:var(--theme-button-green-hover-color); background:var(--theme-button-green-hover-backcolor); }
button:not(:disabled).bluebutton:hover { background:var(--theme-button-blue-hover-color); background:var(--theme-button-blue-hover-backcolor); }
button:not(:disabled).yellowbutton:hover { background:var(--theme-button-yellow-hover-color); background:var(--theme-button-yellow-hover-backcolor); }
/* #endregion */
/* #region Container */
.container.static { width:calc(100% - 20px); margin:10px auto; display:flex; gap:12px; min-height:0; overflow:auto; max-height:100%; flex-direction: column;}
/* .card.static { display:flex; flex-direction:column;flex: 0 0 auto; } */
.card.static.row { overflow:hidden; display:flex; flex-direction:row; flex-wrap: wrap;}
.card.static { overflow:hidden; display:flex; flex-direction:column; }
.container { width:calc(100% - 20px); margin:10px auto; display:grid; grid-template-columns:100%; gap:12px; min-height:0; overflow:auto; max-height:100%; }
.container:not(.static) * { box-sizing:border-box; }
.card { border-width:1px; border-style:solid; border-radius:8px; padding:20px; }
.grid { display:grid; gap:16px; grid-template-columns:repeat(auto-fit, minmax(200px, 1fr)); }
/* #endregion */
/* #region Copy icon */
.copy-icon { transition:opacity .25s; cursor:var(--theme-cursor-pointer) -16 16, pointer; opacity:0.7; }
.copy-icon:hover { opacity:1; }
/* #endregion */
/* #region Tooltip */
.global-tooltip { position:fixed; padding:6px 8px; border-width:1px; border-style:solid; border-radius:10px; max-width:50vw; white-space:normal; z-index:999; pointer-events:none; opacity:0; transform:translateY(-30px); transition:opacity .12s ease; }
.global-tooltip.visible { opacity:1; }
/* #endregion*/
/* #region Scrollbar */
::-webkit-scrollbar { width:12px; height:12px; }
::-webkit-scrollbar-track { border-radius:0px; }
::-webkit-scrollbar-thumb { border-radius:6px; border-width:2px; border-style:solid; }
/* #endregion */
/* #region Messagebox */
#message-container { position: fixed; top: 1rem; right: 1px; display: flex; flex-direction: column; gap: 0.5rem; z-index: 1000; max-height: 80vh; padding-left: 15px; overflow-y: auto; overflow-x: visible; scrollbar-width: none; -ms-overflow-style: none; }
#message-container::-webkit-scrollbar { display: none; }
.message { border-radius: 8px; margin: 8px 8px 8px 0; padding: 10px 14px; width: auto; max-width: 45vw; animation: slideIn 0.4s ease-out; transition: transform 0.2s ease; word-break: break-word; overflow-wrap: anywhere; }
.message:hover { transform:scale(1.02); }
.message-header { display:flex; justify-content:space-between; align-items:center; margin-bottom:6px; }
.message-title { flex:1; font-weight:600; }
.countdown { margin-right:8px; white-space:nowrap; }
.pin-div { margin-left:8px; cursor:var(--theme-cursor-pointer) -16 16, pointer; user-select:none; transition:transform 0.2s ease, color 0.2s ease; }
.pin-div:hover { transform:scale(1.2); }
.pin-div.pinned { transform:scale(1.1); }
@keyframes slideIn { 0% { opacity:0; transform:translateX(100%); } 60% { opacity:1; transform:translateX(-10px); } 80% { opacity:1; transform:translateX(5px); } 100% { opacity:1; transform:translateX(-10px); } }
@keyframes slideOut { 0% { opacity:1; transform:translateX(0); } 100% { opacity:1; transform:translateX(100%); } }
/* #endregion */
/* #region Toggle switch */
/*
<label class="cb cb-switch">
<input data-status="{{name}}" type="checkbox" {{#if active}}checked{{/if}} >
<span class="switch-track" aria-hidden="true">
<span class="switch-thumb" aria-hidden="true"></span>
</span>
<span class="cb-label">Ein / Aus</span>
</label>
*/
.cb-switch { --w:45px; --h:27px; display:inline-flex; align-items:center; }
.cb-switch input { position:absolute; opacity:0; width:0; height:0; pointer-events:none; }
.switch-track { width:var(--w); height:var(--h); border-radius:999px; padding:3px; border-width:1px; border-style:solid; box-sizing:border-box; display:inline-flex; align-items:center; transition:background .18s ease, transform .12s ease, border-color .25s ease; }
.switch-thumb { min-width:calc(var(--h) - 2 * 3px); width:calc(var(--h) - 2 * 3px); height:calc(var(--h) - 2 * 3px); background:var(--theme-switch-thumb); border-radius:50%; box-shadow:0 2px 6px rgba(0,0,0,.15); transform:translateX(-1px); transition:transform .25s cubic-bezier(.2,.9,.2,1), background .18s ease }
.cb-switch input:disabled + .switch-track { background-color: dimgray;}
.cb-switch input:disabled + .switch-track .switch-thumb { background-color: rgb(54, 50, 50); }
.cb-switch input:not(:disabled):checked + .switch-track { background:var(--theme-switch-active); }
.cb-switch input:not(:disabled):hover + .switch-track { border-color:var(--theme-switch-hover); }
.cb-switch input:focus-visible + .switch-track { box-shadow:0 0 0 6px rgba(6,193,103,0.12); }
.cb-switch input:checked + .switch-track .switch-thumb { transform:translateX(calc(var(--w) - var(--h))); }
.cb-switch label { width: calc(100% - var(--w)); }
/* #endregion */
/* #region CheckBox */
/*
<label class="cb cb-modern">
<input data-status="{{name}}" type="checkbox" {{#if active}}checked{{/if}} disabled>
<span class="cb-box" aria-hidden="true"></span>
</label>
*/
.cb { display:inline-flex; align-items:center; gap:10px; user-select:none; transform:translateY(2px); }
.cb input { position:absolute; opacity:0; width:0; height:0; pointer-events:none; }
.cb-box { width:20px; height:20px; border-radius:6px; background:var(--theme-checkbox-backcolor); border-width:2px; border-style:solid; display:inline-grid; place-items:center; transition:transform .12s ease, border-color .12s ease, background .12s ease; }
.cb-box::after { content:""; width:12px; height:8px; transform:scale(0) translateY(-2px); background-repeat:no-repeat; background-position:center; background-size:contain; background-image:url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 4L4 7l7-7' stroke='%23fff' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); transition:transform .18s cubic-bezier(.2,.9,.2,1); }
.cb input:checked + .cb-box { transform:translateY(-1px); }
.cb input:checked + .cb-box::after { transform:scale(1) translate(-1px, 1px); }
table .cb input:checked + .cb-box::after { transform:scale(1) translate(1px, 1px); }
.cb input:focus-visible + .cb-box { outline:none; }
/* #endregion */
/* #region Required */
.is-required-empty { border-width:2px; border-style:solid; }
/* #endregion */
/* #region Tabs */
.tabs { display: flex; margin-bottom: 10px; border-bottom-width: 2px; border-bottom-style: solid; }
.tab { padding: 10px 20px; border: 1px solid transparent; border-top-left-radius: 5px; border-top-right-radius: 5px; margin-right: 5px; transition: background .25s, color .25s, border-color .25s; }
.tab-content { border-width: 1px; border-style: solid; border-radius: 5px; padding: 15px; }
.item { margin-bottom: 5px; }
/* #endregion */
/* #region Feebox */
.feedbox-overlay { position:fixed; top:0; left:0; width:100vw; height:100vh; display:flex; align-items:center; justify-content:center; z-index:999; }
.feedbox { border-radius:8px; max-width:50vw; width:100%; padding:20px; animation:feedboxFadeIn 0.2s ease-out; max-height:80vh; display:flex; flex-direction:column; overflow:hidden; }
.feedbox h3 { margin:0 0 10px 0; }
.feedbox-message { margin-bottom:20px; line-height:1.4; flex:1; overflow-y: auto; /* font-size:1rem; */ }
.feedbox-actions { display:flex; justify-content:flex-end; gap:10px; flex-wrap:wrap; flex-shrink:0; }
@keyframes feedboxFadeIn { from { transform:translateY(-20px); opacity:0; } to { transform:translateY(0); opacity:1; } }
.feedbox-btn {
padding:6px 14px;
/* font-size:0.95rem; */
border-radius:4px;
border:1px solid #ccc;
background:#f5f5f5;
transition:all 0.15s;
}
.feedbox-btn:hover {
background:#e5e5e5;
}
.feedbox-btn.primary {
background:#4a90e2;
color:#fff;
border-color:#4a90e2;
}
.feedbox-btn.primary:hover {
background:#357ABD;
}
.feedbox-btn.danger {
background:#e94e3c;
color:#fff;
border-color:#e94e3c;
}
.feedbox-btn.danger:hover {
background:#c0392b;
}
.feedbox-input {
width:100%;
padding:6px 8px;
/* font-size:0.95rem; */
margin-top:8px;
margin-bottom:12px;
border:1px solid #ccc;
border-radius:4px;
box-sizing:border-box;
}
.feedbox-btn:focus, .feedbox-input:focus {
outline:2px solid #4a90e2;
outline-offset:2px;
}
/* Responsive Small Screens */
@media (max-width:400px) {
.feedbox {
padding:15px;
}
.feedbox-actions {
flex-direction:column-reverse;
gap:8px;
}
.feedbox-btn {
width:100%;
}
}
/* #endregion */
.select-wrapper {
position: relative;
width: 250px;
}
.select-wrapper select {
width: 100%;
padding: 12px 40px 12px 14px;
font-size: 16px;
border: 2px solid #ddd;
border-radius: 10px;
background-color: #fff;
color: #333;
appearance: none; /* entfernt Standard-Styling */
-webkit-appearance: none;
-moz-appearance: none;
cursor: pointer;
transition: all 0.2s ease;
}
/* Hover / Focus */
.select-wrapper select:hover {
border-color: #999;
}
.select-wrapper select:focus {
outline: none;
border-color: #4a90e2;
box-shadow: 0 0 0 3px rgba(74,144,226,0.2);
}
/* Custom Pfeil */
.select-wrapper::after {
content: "▾";
position: absolute;
right: 14px;
top: 50%;
transform: translateY(-50%);
pointer-events: none;
font-size: 14px;
color: #666;
}
.error-field { padding:12px 16px; border-radius:10px; border-width:1px; border-style:solid; }
.success-field { border-width: 1px; border-style: solid; padding:12px 16px; border-radius:10px; }
label { color:var(--muted); display:block; margin-bottom:6px; }
/* #region Dropzone */
.dropzone {
max-width:360px;
padding:12px;
box-shadow:0 6px 18px rgba(0,0,0,.08);
background:var(--theme-dropzone-default-backcolor);
border:1px dashed #aaa;
border-radius:8px;
padding:10px;
/* font-size:13px; */
text-align:center;
margin-bottom:8px;
color:var(--theme-dropzone-default-color);
}
.dropzone.active {
border-color:var(--theme-dropzone-active-border-color);
color:var(--theme-dropzone-active-color);
background:var(--theme-dropzone-active-backcolor);
}
.dropzone-area ul {
list-style:none;
padding:0;
margin:0;
max-height:120px;
overflow-y:auto;
}
.dropzone-area li {
display:flex;
justify-content:space-between;
align-items:center;
/* font-size:13px; */
padding:4px 0;
border-bottom:1px solid #eee;
}
button.removeButton {
border:none;
background:none;
color:#d11a2a;
cursor:var(--theme-cursor-pointer) -16 16, pointer;
/* font-size:14px; */
}
input[type="file"] {
display:none;
}
tr.drop-hover {
outline:3px dashed var(--theme-dropzone-active-border-color);
/* outline:2px dashed var(--primary-color, #4a90e2);
background:rgba(74, 144, 226, 0.08); */
}
tr.no-drop-hover {
outline:3px dashed red;
cursor:no-drop !important;
/* outline:2px dashed var(--primary-color, #4a90e2);
background:rgba(74, 144, 226, 0.08); */
}
/* #endregion */
/* #region Multiselect textbox */
.mst-wrapper {
position:relative;
display:block;
border-radius:4px;
padding:4px 8px;
background:var(--theme-window-backcolor);
cursor:text;
width:300px; /* optional, je nach gewünschter Breite */
}
/* Eingabefeld oben */
.mst-input {
width:100%;
border:none;
outline:none;
/* font-size:14px; */
padding:4px 0;
}
/* Container für Chips unterhalb des Inputs */
.mst-chips-container {
display:flex;
flex-wrap:wrap; /* Chips umbrechen */
gap:4px;
margin-top:4px;
}
/* Einzelner Chip */
.mst-chip {
display:inline-flex;
align-items:center;
background-color:#007bff;
color:#fff;
border-radius:8px;
padding:8px 8px;
/* font-size:13px; */
}
/* Entfernen-Button im Chip */
.mst-chip-remove {
margin-left:4px;
cursor:var(--theme-cursor-pointer) -16 16, pointer;
font-weight:bold;
}
/* Dropdown-Liste */
.mst-dropdown {
position:absolute;
top:100%;
left:0;
right:0;
max-height:200px;
overflow-y:auto;
border:1px solid #ccc;
background:inherit;
z-index:1000;
}
.mst-item {
padding:6px 8px;
cursor:var(--theme-cursor-pointer) -16 16, pointer;
}
.mst-item:hover {
background-color:var(--theme-accent-hover-backcolor);
}
.mst-item.new {
font-style:italic;
color:#555;
}
/* #endregion */
.tutorial-highlight {
transition: all 0.3s ease;
}

View File

@@ -0,0 +1,79 @@
.json-controls {
position: sticky;
top: -8px;
backdrop-filter: blur(5px);
padding: 8px;
border-bottom: 2px solid var(--theme-window-titlebar-backcolor);
z-index: 1;
}
.json-controls button {
background: var(--theme-window-backcolor) !important;
color: var(--theme-window-color) !important;
}
.json-line {
padding: 3px 0;
white-space: pre;
}
.json-key {
color: #d73a49;
}
.json-input {
padding: 3px 8px;
border: none;
background: transparent;
outline: none;
}
.json-input.string {
color: #032f62;
}
.json-input.number {
color: #005cc5;
}
.json-toggle {
cursor:var(--theme-cursor-pointer) -16 16, pointer;
color: #6f42c1;
}
.json-children {
padding: 3px 0;
}
.json-children.collapsed {
display: none;
}
.json-header {
display: flex;
align-items: center;
gap: 6px;
}
.json-add {
cursor:var(--theme-cursor-pointer) -16 16, pointer;
color: #28a745;
opacity: 0.7;
font-size: 13px;
}
.json-add:hover {
opacity: 1;
}
.json-remove {
cursor:var(--theme-cursor-pointer) -16 16, pointer;
color: #dc3545;
opacity: 0.6;
margin-left: 6px;
font-size: 12px;
}
.json-remove:hover {
opacity: 1;
}

217
public/styles/os.css Normal file
View File

@@ -0,0 +1,217 @@
/* public/css/desktop.css */
body, html { margin:0; padding:0; height:100%; overflow: hidden; font-family: var(--fontFamily); font-size: var(--fontSize); }
#desktop { position:relative; height:100vh; overflow:hidden; background-size:var(--theme-desktop-background-size); background-repeat: no-repeat; background-position: center; touch-action: none; }
#windows { z-index: 1; position:absolute; inset:0; padding:8px; box-sizing:border-box; }
.window { position:absolute; width: 800px; height: 600px; border-radius:6px; box-shadow: 0 6px 20px rgba(0,0,0,0.4); overflow:hidden; top:50px; left:50px; display:flex; flex-direction:column; resize:both; }
.window-titlebar { padding: 0 0 1px 0; height: 28px; display:flex; justify-content:space-between; align-items:center; }
.window-icon { height: 20px; background-size:contain; transform: translate(1px, -1px); background-repeat: no-repeat; background-position: left; background-color: rgb(144, 179, 144); padding:4px;border-radius: 8px;}
.window-content { display: flex; flex-direction: column; flex:1; padding:8px; overflow: auto; }
.window .controls button { transition: background-color .3s, color .3s; padding: 6px 10px; border:none; }
.window[class="max"] .window-resize-handle { display: none; }
.window-resize-handle { position:absolute; right:0; bottom:0; width:12px; height:12px; cursor:se-resize; z-index: 10; }
.window-resize-n { top: -4px; left: 0; right: 0; height: 8px; cursor: n-resize; }
.window-resize-s { bottom: -4px; left: 0; right: 0; height: 8px; cursor: s-resize; }
.window-resize-e { right: -4px; top: 0; bottom: 0; width: 8px; cursor: e-resize; }
.window-resize-w { left: -4px; top: 0; bottom: 0; width: 8px; cursor: w-resize; }
.window-resize-ne { top: -4px; right: -4px; width: 12px; height: 12px; cursor: ne-resize; }
.window-resize-nw { top: -4px; left: -4px; width: 12px; height: 12px; cursor: nw-resize; }
.window-resize-se { bottom: -4px; right: -4px; width: 12px; height: 12px; cursor: se-resize; }
.window-resize-sw { bottom: -4px; left: -4px; width: 12px; height: 12px; cursor: sw-resize; }
#taskbar { z-index: 2; position: absolute; width:100%; bottom:0; left:0; height:42px; overflow:visible; display:flex; flex: 0 0 auto; min-width:0; align-items:center; padding:0 8px; box-sizing:border-box; }
#start-btn { transition: background-color 0.3s ease; padding: 8px 15px; border-radius: 5px; border: none; margin-right:8px; }
#taskbar-windows { display:flex; gap:6px; align-items:center; flex:1; overflow-y:hidden;overflow-x: auto; min-width: 0; }
.taskbar-item { display: flex; position: relative; padding:7px 10px; border-radius:4px; }
.taskbar-item::before { content: ''; position: absolute; bottom:1px; left:50%; width:40%; height: 4px; border-radius:4px; transform:translateX(-50%) scaleX(0); transform-origin:center; transition:transform 0.3s ease; }
.taskbar-item.focus::before { transform: translateX(-50%) scaleX(1); }
.notify-button { margin-left:auto; flex: 0 0 auto; display: flex; align-items: center; justify-content: center; }
.notify-button.resume, .notify-button.pulse { animation: pulse 1.5s infinite; animation-play-state: running; }
.notify-button.pause, .notify-button.pause *, .notify-button.active, .notify-button.active * { animation-play-state: paused; }
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.1);
}
100% {
transform: scale(1);
}
}
.hidden { opacity: 0; pointer-events: none; }
/* Open submenu vertical */
#start-menu { z-index: 2; transition: opacity 0.3s; display:flex; flex-direction:column; position: absolute; bottom: 50px; left: 8px; width: auto; min-width: 300px; border-radius: 8px; overflow: hidden; }
.start-header { display: flex; align-items: center; padding: 8px; font-weight: 600; }
.start-header > img { height: 24px; width: 24px; margin-right: 5px; }
.start-list { list-style: none; margin: 0; padding: 8px 0; height: 60vh; overflow-y: auto; }
.start-item { padding: 8px 12px 16px 20px; display: flex; gap: 8px; transition: background 0.2s; border-radius: 4px; }
.start-item:not(:has(.submenu)) { padding: 12px;align-items:center; }
.start-icon, #start-menu-icon { height: 20px; width: 20px; border-radius: 8px; padding:4px; }
.menu-label { display: block; margin-top: 4px; padding-bottom: 0; margin-left: 26px }
.start-item.has-submenu { position: relative; display: flex; flex-direction: column; padding-bottom: 8px; }
.start-item.has-submenu > .submenu { width: 100%; list-style: none; padding-left: 2px; max-height: 0; overflow: hidden; transition: max-height 0.3s ease; margin: 2px 0 0 8px; }
.start-item-sys-container { position: relative; left:0; bottom: -8px; padding: 5px 0px; width:100%; display:flex; height:30px; flex-direction:row; justify-content:flex-end; }
.start-sys-item { margin: 0 10px 0 8px !important; }
.start-submenu-head { position: relative; margin-left: 16px; height:32px; display:flex; flex-direction: row; align-items: center; gap:8px; }
.start-item.has-submenu > .menu-label::after { content: ""; position: absolute; right: 14px; transform: translateY(50%) rotate(0deg); border: 5px solid transparent; border-top-color: #aaa; transition: transform 0.3s; }
.start-item.has-submenu.open > .menu-label::after { content: ""; position: absolute; right: 14px; transform: translateY(50%) rotate(180deg); border: 5px solid transparent; border-top-color: #aaa; transition: transform 0.3s; }
.start-item.has-submenu.open > .submenu { max-height: 500px; }
.start-item.has-submenu > .submenu li { opacity: 0; transform: translateY(-5px); transition: opacity 0.2s, transform 0.2s; }
.start-item.has-submenu.open > .submenu li { opacity: 1; transform: translateY(0); }
img.icon { width: auto; height:20px; object-fit: contain; filter: var(--theme-notifybubble-filter); transform: translate(2px, 2px) }
@media (max-width: 768px) {
body, html {
overflow: auto;
}
#desktop {
height: 100dvh;
}
/* Fenster = Fullscreen */
.window {
width: 100% !important;
height: calc(100% - 54px) !important;
top: 0 !important;
left: 0 !important;
border-radius: 0;
resize: none;
}
.window-resize-handle {
display: none !important;
}
.window-titlebar {
height: 29px;
padding: 0 0px;
}
.window-content {
padding: 12px;
}
/* Taskbar größer für Touch */
#taskbar {
height: 50px;
padding: 0 6px;
}
#start-btn {
padding: 10px 14px;
font-size: 16px;
}
.taskbar-item {
padding: 10px;
}
.start-list { list-style: none; margin: 0; padding: 8px 0; height: 100%; overflow-y: auto; }
#start-menu {
bottom: 50px !important;
height: calc(100dvh - 65px) !important;
width: calc(100dvw - 5px);
left: 0 !important;
border-radius: 0 !important;
} */
.start-item {
padding: 14px;
font-size: 16px;
}
.start-icon {
height: 24px;
width: 24px;
}
.start-item.has-submenu > .menu-label { margin: 8px 0 0 40px; }
.start-item-sys-container { margin:auto; bottom: -10px; }
/* Buttons besser klickbar */
.window .controls button {
padding: 10px 12px;
}
/* Notify Button */
.notify-button {
padding: 8px;
}
}
@media (max-width: 1000px) AND (orientation: landscape) {
body, html {
overflow: auto;
}
#desktop {
height: 100dvh;
}
/* Fenster IMMER fullscreen */
.window {
width: 100% !important;
height: calc(100dvh - 46px) !important;
top: 0 !important;
left: 0 !important;
border-radius: 0 !important;
}
/* Resize komplett aus */
.window-resize-handle {
display: none !important;
}
.window-titlebar {
height: 30px;
padding: 0 0px;
}
/* Startmenü bis ganz oben */
#start-menu {
bottom: 44px !important;
height: calc(100dvh - 60px) !important;
width: 300px;
max-width: 35dvw;
left: 0 !important;
border-radius: 0 !important;
}
/* Taskbar bleibt sichtbar, aber oben drüber sauber */
#taskbar {
z-index: 9999;
}
/* Startliste nutzt volle Höhe */
.start-list {
height: 100%;
}
.start-item-sys-container { bottom: -10px;}
.start-item.has-submenu > .menu-label { margin: 8px 0 0 28px; }
}

86
public/styles/table.css Normal file
View File

@@ -0,0 +1,86 @@
/* .table-wrapper { display:grid; grid-column:auto; overflow:auto; min-height:0; min-width:0;} */
.table-wrapper { overflow:auto; min-width:0; }
.table-wrapper.fit-table { grid-template-columns:calc(1fr - 150px); }
/* .table-wrapper { flex:1 1 auto; overflow-y:auto; } */
/* .table-wrapper.fit-table { width:100%; max-width:100%; } */
/* .table-wrapper.fit-table th.word-wrap, .table-wrapper.fit-table td.word-wrap { white-space:normal; word-wrap:break-word; word-break:break-word; overflow-wrap:anywhere; } */
/* #region Dont's */
th.no-wrap, td.no-wrap { white-space:nowrap !important; }
th.wrap, td.wrap { white-space:wrap; word-wrap: break-word; word-break: keep-all; }
table.no-background tr, table.no-background td { background:none !important; }
table.border * { border:1px solid white; }
/* #endregion */
/* #region performance optimizing */
table thead { position:sticky; top:0; z-index:20; will-change:transform; transform:translateZ(0);}
/* #endregion */
/* echte Tabelle */
table { width:calc(100%); border-spacing:0 5px; }
table th, table td { min-width:100px; max-width:250px; overflow:hidden; white-space:nowrap; }
table tr.grouprow:hover { background: rgba(0,0,0,0.05);}
/* Header sticky — aber innerhalb echter Tabelle */
thead th { position:sticky; top:var(--filter-height); }
/* KEIN display:block mehr! */
thead, tbody { display:table-row-group; }
table thead th { padding:5px; }
/* table tbody td { padding:5px 0px 5px 20px; } */
table tbody td:not(:first-child):not(:last-child), table thead th:not(:first-child):not(:last-child) { border-width:0; border-style:solid; }
table tbody tr.grouprow { font-weight:700; }
table .text-align\:center { text-align:center; }
table .text-align\:right { text-align:right; }
table .text-align\:left { text-align:left; }
td { overflow:hidden; text-overflow:ellipsis; /* verhindert, dass Inhalt die Zelle sprengt */ }
.table-filter-container {
border-bottom-width:8px;
border-bottom-style:solid;
display:flex;
justify-content:flex-start;
flex-direction:column;
flex-wrap:wrap;
gap:10px;
position:sticky;
left:0px;
top:0px;
/* z-index:20; */
padding:5px 10px;
border-radius:var(--border-raduis) var(--border-raduis) 0 0;
}
.table-filter-container .live-counter { position:absolute; right:18px; margin-left:auto; font-weight:bold; }
.table-filter-container input, .table-filter-container select { padding:5px !important; }
th.sort-asc::after {
content:" ▲";
}
th.sort-desc::after {
content:" ▼";
}
td.vote { width:28px; height:28px; position:relative; padding:0; }
td.vote:hover { background:rgba(0,0,0,0.05); /* cursor:pointer;*/ }
td.vote::before,
td.vote::after { position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); }
td.yes::before { content:""; width:8px; height:16px; border:solid #2ecc71; border-width:0 3px 3px 0; transform:translate(-50%, -60%) rotate(45deg); }
td.no::before, td.no::after { content:""; width:3px; height:18px; background:#e74c3c; }
td.no::before { transform:translate(-50%, -50%) rotate(45deg); }
td.no::after { transform:translate(-50%, -50%) rotate(-45deg); }
td.maybe::before { content:""; width:0px; height:0px; border-radius:50%; border:10px solid #f1c40f; transform:translate(-50%, -50%); }

View File

@@ -0,0 +1,67 @@
/* Bubble-Container */
#notify-bubble {
position: absolute;
bottom: 125%;
right: 3px;
min-width: 200px;
max-height: 50vh;
width: max-content; /* 🔑 wächst mit Inhalt */
max-width: 600px; /* aber capped */
background: var(--theme-taskbar-tray-backcolor);
color: var(--theme-taskbar-tray-color);
border-color: var(--theme-taskbar-tray-border-color);
border-radius: 10px;
overflow-y: auto; /* vertikal scrollen */
overflow-x: hidden; /* horizontal verhindern */
box-shadow: 0 8px 20px rgba(0,0,0,0.4);
padding: 10px 10px 6px 10px;
opacity: 0;
pointer-events: none;
transform: translateY(10px);
transition: all 0.25s ease;
z-index: 99999999;
text-align: end;
font-weight: normal;
}
/* Bubble-Items als Grid */
.bubble-item {
display: grid;
grid-template-columns: minmax(0, auto) 250px;
gap: 10px;
padding: 6px 8px;
border-radius: 6px;
/* cursor: pointer; */
align-items: center;
transition: transform 0.25s;
}
/* linke Spalte */
.bubble-item > :nth-child(1) {
min-width: 0; /* wichtig für Grid Shrink */
white-space: normal; /* Text darf umbrechen */
overflow-wrap: normal; /* Wörter nur bei Bedarf umbrechen */
word-break: normal; /* nicht mitten in Wörtern */
text-align: left;
}
/* rechte Spalte fix */
.bubble-item > :nth-child(2) {
width: 250px;
height: 50px;
overflow: hidden;
}
/* hover Effekt */
.bubble-item:hover {
background: rgba(64,64,64,0.4);
transform: scale(1.01);
}
/* Bubble sichtbar machen */
.notify-button.active #notify-bubble {
pointer-events: auto;
opacity:1;
transform: translateY(0);
}