@@ -1,157 +1,893 @@
@ import url ( 'https://fonts.googleapis.com/css2?family=Inter :wght@400;500;600;700&display=swap' ) ;
@ import url ( 'https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;500;600;700&family=Sora :wght@400;500;600;700;800 &display=swap' ) ;
* { margin : 0 ; padding : 0 ; box-sizing : border-box ; }
: root {
--bg : #0f1117 ;
--surface : #1a1d27 ;
--card : #1e2235 ;
--border : #2a2d3e ;
--accent : #5865f2 ;
--accent-hov er : #4752c4 ;
--success : #57f287 ;
--warning : #fee75c ;
--danger : #ed4245 ;
--text : #e0e0e0 ;
--text-muted : #888 ;
/* Palette — "indifferent broccoli": deep near-black + chartreuse primary */
--bg : #0D0F13 ;
--surface : #151920 ;
--surface-2 : #1E242C ;
--card : #151920 ;
--bord er : #262C35 ;
--border-strong : #3A4150 ;
--primary : #C7E94D ;
--primary-hover : #B5D83D ;
--primary-dim : rgba ( 199 , 233 , 77 , 0.12 ) ;
--primary-dim-2 : rgba ( 199 , 233 , 77 , 0.06 ) ;
--secondary : #FFB84D ;
--danger : #FF5A52 ;
--warning : #FFD66B ;
--success : #7EE0A3 ;
--text : #EFEEE8 ;
--text-muted : #9CA3AE ;
--text-dim : #6B7280 ;
--sidebar-width : 260 px ;
--topbar-height : 60 px ;
--font-title : 'Sora' , system-ui , - apple-system , sans-serif ;
--font-body : 'Open Sans' , system-ui , - apple-system , sans-serif ;
--font-mono : ui-monospace , 'SF Mono' , 'JetBrains Mono' , Menlo , monospace ;
}
body { font-family : 'Inter' , sans-serif ; background : var ( - - bg ) ; color : var ( - - text ) ; display : flex ; min-height : 100 vh ; }
body {
font-family : var ( - - font - body ) ;
background : var ( - - bg ) ;
color : var ( - - text ) ;
display : flex ;
min-height : 100 vh ;
font-size : 14 px ;
line-height : 1.5 ;
-webkit- font-smoothing : antialiased ;
-moz- osx-font-smoothing : grayscale ;
}
/* Ambient atmospheric glow — a single diffused lime pool, top-left */
body :: before {
content : '' ;
position : fixed ;
top : -200 px ;
left : -100 px ;
width : 640 px ;
height : 640 px ;
background : radial-gradient ( circle , rgba ( 199 , 233 , 77 , 0.08 ) , transparent 60 % ) ;
filter : blur ( 60 px ) ;
pointer-events : none ;
z-index : 0 ;
}
/* Top bar */
. topbar { position : fixed ; top : 0 ; left : var ( - - sidebar - width ) ; right : 0 ; height : 56 px ; background : var ( - - surface ) ; border-bottom : 1 px solid var ( - - border ) ; display : flex ; align-items : center ; justify-content : space-between ; padding : 0 24 px ; z-index : 100 ; }
. topbar h1 { font-size : 16 px ; font-weight : 600 ; }
. topbar . status { display : flex ; align-items : center ; gap : 8 px ; font-size : 13 px ; color : var ( - - text - muted ) ; }
. topbar . status . dot { width : 8 px ; height : 8 px ; border-radius : 50 % ; }
. topbar . status . dot . online { background : var ( - - success ) ; }
. topbar {
position : fixed ;
top : 0 ;
left : var ( - - sidebar - width ) ;
right : 0 ;
height : var ( - - topbar - height ) ;
background : var ( - - surface ) ;
border-bottom : 1 px solid var ( - - border ) ;
display : flex ;
align-items : center ;
justify-content : space-between ;
padding : 0 24 px ;
z-index : 100 ;
gap : 16 px ;
}
. topbar h1 {
font-family : var ( - - font - title ) ;
font-size : 13 px ;
font-weight : 700 ;
text-transform : uppercase ;
letter-spacing : 0.18 em ;
color : var ( - - text ) ;
}
. topbar h1 :: after {
content : ' (:|)' ;
color : var ( - - primary ) ;
margin-left : 2 px ;
letter-spacing : 0 ;
font-weight : 500 ;
}
. topbar . status {
display : flex ;
align-items : center ;
gap : 10 px ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 600 ;
color : var ( - - text - muted ) ;
text-transform : uppercase ;
letter-spacing : 0.14 em ;
}
. topbar . status . dot { width : 8 px ; height : 8 px ; border-radius : 0 ; flex-shrink : 0 ; }
. topbar . status . dot . online { background : var ( - - primary ) ; box-shadow : 0 0 14 px var ( - - primary - dim ) ; }
. topbar . status . dot . offline { background : var ( - - danger ) ; }
. topbar . actions { display : flex ; gap : 12 px ; align-items : center ; }
. topbar . actions button { background : none ; border : 1 px solid var ( - - border ) ; color : var ( - - text - muted ) ; padding : 6 px 14 px ; border-radius : 6 px ; font-size : 13 px ; cursor : pointer ; transition : all 200 ms ; }
. topbar . actions button : hover { border-color : var ( - - accent ) ; color : var ( - - text ) ; }
. topbar . actions { display : flex ; gap : 10 px ; align-items : center ; }
. topbar . actions button {
background : transparent ;
border : 1 px solid var ( - - border - strong ) ;
color : var ( - - text ) ;
padding : 8 px 16 px ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 600 ;
text-transform : uppercase ;
letter-spacing : 0.14 em ;
cursor : pointer ;
transition : border-color 180 ms ease , color 180 ms ease , background 180 ms ease ;
}
. topbar . actions button : hover {
border-color : var ( - - primary ) ;
color : var ( - - primary ) ;
background : var ( - - primary - dim -2 ) ;
}
/* Sidebar */
. sidebar { position : fixed ; top : 0 ; left : 0 ; width : var ( - - sidebar - width ) ; height : 100 vh ; background : var ( - - surface ) ; border-right : 1 px solid var ( - - border ) ; padding : 16 px 0 ; overflow-y : auto ; z-index : 101 ; }
. sidebar . logo { padding : 12 px 20 px 24 px ; font-size : 18 px ; font-weight : 700 ; }
. sidebar a { display : flex ; align-items : center ; gap : 10 px ; padding : 10 px 20 px ; color : var ( - - text - muted ) ; text-decoration : none ; font-size : 13 px ; font-weight : 50 0; border-left : 3 px solid transparent ; transition : all 200 ms ; }
. sidebar a : hover { color : var ( - - text ) ; background : rgba ( 88 , 101 , 242 , 0.08 ) ; }
. sidebar a . active { color : var ( - - accent ) ; border-left-color : var ( - - accent ) ; background : rgba ( 88 , 101 , 242 , 0.1 ) ; }
. sidebar {
position : fixed ;
top : 0 ;
left : 0 ;
width : var ( - - sidebar - width ) ;
height : 100 vh ;
background : var ( - - surface ) ;
border-right : 1 px solid var ( - - border ) ;
padding : 20 px 0 24 px ;
overflow-y : auto ;
z-index : 101 ;
}
. sidebar . logo {
padding : 8 px 20 px 24 px ;
font-family : var ( - - font - title ) ;
font-size : 13 px ;
font-weight : 700 ;
letter-spacing : 0.16 em ;
text-transform : uppercase ;
color : var ( - - text ) ;
line-height : 1.3 ;
position : relative ;
}
. sidebar . logo :: after {
content : '(:|)' ;
display : block ;
margin-top : 4 px ;
font-size : 11 px ;
letter-spacing : 0 ;
color : var ( - - primary ) ;
font-weight : 500 ;
}
. sidebar a {
display : flex ;
align-items : center ;
padding : 11 px 20 px ;
color : var ( - - text - muted ) ;
text-decoration : none ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 600 ;
letter-spacing : 0.12 em ;
text-transform : uppercase ;
border-left : 3 px solid transparent ;
transition : color 160 ms ease , background 160 ms ease , border-color 160 ms ease ;
}
. sidebar a : hover {
color : var ( - - text ) ;
background : var ( - - primary - dim -2 ) ;
}
. sidebar a . active {
color : var ( - - primary ) ;
border-left-color : var ( - - primary ) ;
background : var ( - - primary - dim -2 ) ;
}
/* Main */
. main { margin-left : var ( - - sidebar - width ) ; margin-top : 56 px ; padding : 24 px ; flex : 1 ; padding-bottom : 100 px ; }
/* Main content */
. main {
margin-left : var ( - - sidebar - width ) ;
margin-top : var ( - - topbar - height ) ;
padding : 32 px ;
flex : 1 ;
padding-bottom : 140 px ;
position : relative ;
z-index : 1 ;
}
/* Section card s */
. section { margin-bottom : 24 px ; }
. section-header { background : var ( - - card ) ; border : 1 px solid var ( - - border ) ; border-radius : 12 px 12 px 0 0 ; padding : 20 px 24 px ; cursor : pointer ; display : flex ; align-items : center ; gap : 12 px ; transition : background 200 ms ; }
. section-header : hover { background : #232740 ; }
. section-header h2 { font-size : 15 px ; font-weight : 600 ; flex : 1 ; }
. section-header p { font-size : 12 px ; color : var ( - - text - muted ) ; }
. section-header . chevron { transition : transform 200 ms ; font-size : 18 px ; color : var ( - - text - muted ) ; }
. section . collapsed . section-header { border-radius : 12 px ; }
/* Sections */
. section { margin-bottom : 20 px ; }
. section-header {
background : var ( - - surface ) ;
border : 1 px solid var ( - - border ) ;
border-bottom : none ;
padding : 18 px 22 px ;
cursor : pointer ;
display : flex ;
align-items : center ;
gap : 14 px ;
transition : background 180 ms ease , border-color 180 ms ease ;
}
. section-header : hover {
background : var ( - - surface -2 ) ;
border-color : var ( - - border - strong ) ;
}
. section-header h2 {
font-family : var ( - - font - title ) ;
font-size : 14 px ;
font-weight : 700 ;
text-transform : uppercase ;
letter-spacing : 0.12 em ;
color : var ( - - text ) ;
flex : 1 ;
display : flex ;
align-items : center ;
gap : 12 px ;
}
. section-header h2 :: before {
content : '' ;
display : inline-block ;
width : 6 px ;
height : 6 px ;
background : var ( - - primary ) ;
flex-shrink : 0 ;
}
. section-header p {
font-family : var ( - - font - body ) ;
font-size : 12 px ;
font-weight : 400 ;
color : var ( - - text - muted ) ;
text-transform : none ;
letter-spacing : 0 ;
line-height : 1.4 ;
}
. section-header . chevron {
transition : transform 200 ms ease ;
font-size : 12 px ;
color : var ( - - primary ) ;
}
. section . collapsed . section-header { border-bottom : 1 px solid var ( - - border ) ; }
. section . collapsed . section-body { display : none ; }
. section . collapsed . chevron { transform : rotate ( -90 deg ) ; }
. section-body { background : var ( - - card ) ; border : 1 px solid var ( - - border ) ; border-top : none ; border-radius : 0 0 12 px 12 px ; padding : 24 px ; }
. section-body {
background : var ( - - surface ) ;
border : 1 px solid var ( - - border ) ;
padding : 28 px 24 px ;
}
/* Field grid */
. field-grid { display : grid ; grid-template-columns : repeat ( auto - fill , minmax ( 320 px , 1 fr ) ) ; gap : 16 px ; }
. field { display : flex ; flex-direction : column ; gap : 6 px ; }
. field-grid {
display : grid ;
grid-template-columns : repeat ( auto - fill , minmax ( 320 px , 1 fr ) ) ;
gap : 22 px ;
}
. field { display : flex ; flex-direction : column ; gap : 8 px ; }
. field . full-width { grid-column : 1 / -1 ; }
. field label { font-size : 12 px ; font-weight : 600 ; color : var ( - - text - muted ) ; text-transform : uppercase ; letter-spacing : 0.5 px ; }
. field input , . field select , . field textarea { background : var ( - - bg ) ; border : 1 px solid var ( - - border ) ; border-radius : 8 px ; padding : 10 px 14 px ; color : var ( - - text ) ; font-size : 14 px ; font-family : inherit ; outline : none ; transition : border-color 200 ms ; }
. field input : focus , . field select : focus , . field textarea : focus { border-color : var ( - - accent ) ; box-shadow : 0 0 0 2 px rgba ( 88 , 101 , 242 , 0.2 ) ; }
. field textarea { min-height : 80 px ; resize : vertical ; }
. field input . changed , . field select . changed , . field textarea . changed { border- color: var ( - - warning ) ; }
. field . hint { font-size : 11 px ; col or: var ( - - text - muted ) ; }
. field label {
font-family : var ( - - font - title ) ;
font-size : 10 px ;
font-weight : 700 ;
color : var ( - - text - muted ) ;
text-transf orm : uppercase ;
letter-spacing : 0.16 em ;
}
. field input ,
. field select ,
. field textarea {
background : var ( - - bg ) ;
border : 1 px solid var ( - - border ) ;
border-radius : 2 px ;
padding : 11 px 14 px ;
color : var ( - - text ) ;
font-family : var ( - - font - body ) ;
font-size : 14 px ;
outline : none ;
transition : border-color 180 ms ease , box-shadow 180 ms ease ;
}
. field input :: placeholder ,
. field textarea :: placeholder { color : var ( - - text - dim ) ; }
. field input : focus ,
. field select : focus ,
. field textarea : focus {
border-color : var ( - - primary ) ;
box-shadow : 0 0 0 3 px var ( - - primary - dim -2 ) ;
}
. field textarea {
min-height : 88 px ;
resize : vertical ;
line-height : 1.55 ;
}
. field input . changed ,
. field select . changed ,
. field textarea . changed {
border-color : var ( - - warning ) ;
box-shadow : 0 0 0 3 px rgba ( 255 , 214 , 107 , 0.1 ) ;
}
. field . hint {
font-size : 12 px ;
color : var ( - - text - muted ) ;
font-style : italic ;
line-height : 1.4 ;
}
/* Toggle switch */
. toggle-wrap { display : flex ; align-items : center ; gap : 12 px ; }
. toggle { position : relative ; width : 44 px ; height : 24 px ; }
. toggle-wrap > span {
font-family : var ( - - font - title ) ;
font-size : 10 px ;
font-weight : 600 ;
text-transform : uppercase ;
letter-spacing : 0.14 em ;
color : var ( - - text - muted ) ;
}
. toggle { position : relative ; width : 44 px ; height : 22 px ; }
. toggle input { opacity : 0 ; width : 0 ; height : 0 ; }
. toggle . slider { position : absolute ; inset : 0 ; background : var ( - - border ) ; border-radius : 12 px ; cursor : pointer ; transition : background 200 ms ; }
. toggle . slider :: before { content : '' ; position : absolute ; left : 3 px ; top : 3 px ; width : 18 px ; height : 18 px ; background : #fff ; border-radius : 50 % ; transition : transform 200 ms ; }
. toggle input : checked + . slider { background : var ( - - accent ) ; }
. toggle input : checked + . slider :: before { transform : translateX ( 20 px ) ; }
. toggle . slider {
position : absolute ;
inset : 0 ;
background : var ( - - surface -2 ) ;
border : 1 px solid var ( - - border - strong ) ;
cursor : pointer ;
transition : background 180 ms ease , border-color 180 ms ease ;
}
. toggle . slider :: before {
content : '' ;
position : absolute ;
left : 3 px ;
top : 3 px ;
width : 14 px ;
height : 14 px ;
background : var ( - - text - muted ) ;
transition : transform 200 ms ease , background 180 ms ease ;
}
. toggle input : checked + . slider {
border-color : var ( - - primary ) ;
background : var ( - - primary - dim ) ;
}
. toggle input : checked + . slider :: before {
transform : translateX ( 20 px ) ;
background : var ( - - primary ) ;
}
/* Color picker */
. color-field { display : flex ; align-items : center ; gap : 10 px ; }
. color-field input [ type = "color" ] { width : 40 px ; height : 40 px ; border : 1 px solid var ( - - border ) ; border-radius : 8 px ; cursor : pointer ; background : none ; padding : 2 px ; }
. color-field { display : flex ; align-items : center ; gap : 12 px ; }
. color-field input [ type = "color" ] {
width : 44 px ;
height : 44 px ;
border : 1 px solid var ( - - border ) ;
cursor : pointer ;
background : var ( - - bg ) ;
padding : 3 px ;
border-radius : 0 ;
}
. color-field span {
font-family : var ( - - font - body ) ;
color : var ( - - text - muted ) ;
font-size : 13 px ;
}
/* Smart select */
. smart-select { position : relative ; }
. smart-select-display { background : var ( - - bg ) ; border : 1 px solid var ( - - border ) ; border-radius : 8 px ; padding : 10 px 14 px ; cursor : pointer ; display : flex ; align-items : center ; gap : 8 px ; min-height : 42 px ; transition : border-color 200 ms ; }
. smart-select-display : hover { border-color : var ( - - accent ) ; }
. smart-select-dropdown { position : absolute ; top : 100 % ; left : 0 ; right : 0 ; background : var ( - - card ) ; border : 1 px solid var ( - - border ) ; border-radius : 10 px ; margin-top : 4 px ; z-index : 200 ; box-shadow : 0 8 px 24 px rgba ( 0 , 0 , 0 , 0.5 ) ; max-height : 300 px ; overflow : hidden ; display : flex ; flex-direction : column ; }
. smart-select-display {
background : var ( - - bg ) ;
border : 1 px solid var ( - - border ) ;
border-radius : 2 px ;
padding : 11 px 14 px ;
cursor : pointer ;
display : flex ;
align-items : center ;
gap : 10 px ;
min-height : 44 px ;
transition : border-color 180 ms ease ;
font-size : 14 px ;
}
. smart-select-display : hover { border-color : var ( - - primary ) ; }
. smart-select-dropdown {
position : absolute ;
top : 100 % ;
left : 0 ;
right : 0 ;
background : var ( - - surface ) ;
border : 1 px solid var ( - - border - strong ) ;
margin-top : 4 px ;
z-index : 200 ;
box-shadow : 0 16 px 48 px rgba ( 0 , 0 , 0 , 0.55 ) ;
max-height : 320 px ;
overflow : hidden ;
display : flex ;
flex-direction : column ;
}
. smart-select-dropdown . hidden { display : none ; }
. ss-search { background : var ( - - bg ) ; border : none ; border-bottom : 1 px solid var ( - - border ) ; padding : 10 px 14 px ; color : var ( - - text ) ; font-size : 13 px ; outline : none ; }
. ss-list { overflow-y : auto ; max-height : 250 px ; padding : 4 px ; }
. ss-option { padding : 8 px 12 px ; border-radius : 6 px ; cursor : pointer ; display : flex ; align-items : center ; gap : 8 px ; font-size : 13 px ; transition : background 200 ms ; }
. ss-option : hover { background : rgba ( 88 , 101 , 242 , 0.15 ) ; }
. ss-option . selected { background : rgba ( 88 , 101 , 242 , 0.2 ) ; }
. ss-search {
background : var ( - - bg ) ;
border : none ;
border-bottom : 1 px solid var ( - - border ) ;
padding : 12 px 14 px ;
color : var ( - - text ) ;
font-family : var ( - - font - body ) ;
font-size : 13 px ;
outline : none ;
}
. ss-list {
overflow-y : auto ;
max-height : 260 px ;
padding : 4 px ;
}
. ss-option {
padding : 10 px 12 px ;
cursor : pointer ;
display : flex ;
align-items : center ;
gap : 10 px ;
font-size : 13 px ;
transition : background 120 ms ease , color 120 ms ease ;
}
. ss-option : hover { background : var ( - - primary - dim -2 ) ; color : var ( - - primary ) ; }
. ss-option . selected { background : var ( - - primary - dim ) ; color : var ( - - primary ) ; }
. ss-option . ss-clear { color : var ( - - text - muted ) ; font-style : italic ; }
. ss-label { flex : 1 ; }
. ss-sub { font-size : 11 px ; color : var ( - - text - muted ) ; }
. ss-id { font-size : 11 px ; color : var ( - - text - muted ) ; font-family : monospace ; }
. ss-placeholder { color : var ( - - text - muted ) ; }
. ss-id { font-size : 11 px ; color : var ( - - text - dim ) ; font-family : var ( - - font - mono ) ; }
. ss-placeholder { color : var ( - - text - dim ) ; }
. ss-avatar { width : 20 px ; height : 20 px ; border-radius : 50 % ; }
. ss-dot { width : 12 px ; height : 12 px ; border-radius : 50 % ; flex-shrink : 0 ; }
. ss-dot { width : 10 px ; height : 10 px ; border-radius : 0 ; flex-shrink : 0 ; }
/* Save bar */
. save-bar { position : fixed ; bottom : 0 ; left : var ( - - sidebar - width ) ; right : 0 ; background : var ( - - surface ) ; border-top : 1 px solid var ( - - border ) ; padding : 12 px 24 px ; display : flex ; align-items : center ; justify-content : space-between ; transform : translateY ( 100 % ) ; transition : transform 300 ms ease ; z-index : 100 ; }
. save-bar {
position : fixed ;
bottom : 0 ;
left : var ( - - sidebar - width ) ;
right : 0 ;
background : var ( - - surface ) ;
border-top : 2 px solid var ( - - primary ) ;
padding : 16 px 24 px ;
display : flex ;
align-items : center ;
justify-content : space-between ;
transform : translateY ( 100 % ) ;
transition : transform 320 ms cubic-bezier ( 0.4 , 0 , 0.2 , 1 ) ;
z-index : 100 ;
box-shadow : 0 -16 px 40 px rgba ( 0 , 0 , 0 , 0.35 ) ;
gap : 16 px ;
}
. save-bar . visible { transform : translateY ( 0 ) ; }
. save-bar span { font-size : 13 px ; color : var ( - - warning ) ; font-weight : 500 ; }
. save-actions { display : flex ; gap : 8 px ; }
. save-actions button { padding : 8 px 16 px ; border-radius : 6 px ; font-size : 13 px ; font-weight : 600 ; cursor : pointer ; border : none ; transition : all 200 ms ; }
. save-actions button : first-child { background : var ( - - accent ) ; color : #fff ; }
. save-actions button : first-child : hover { background : var ( - - accent - hover ) ; }
. save-actions button . secondary { background : var ( - - card ) ; col or: var ( - - text ) ; border : 1 px solid var ( - - border ) ; }
. save-actions button . secondary : hover { border-color : var ( - - accent ) ; }
. save-actions button . danger { background : var ( - - danger ) ; color : #fff ; }
. save-actions button . danger : hover { background : #c9363a ; }
. save-bar > span {
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 700 ;
color : var ( - - warning ) ;
text-transf orm : uppercase ;
letter-spacing : 0.16 em ;
display : inline-flex ;
align-items : center ;
gap : 10 px ;
}
. save-bar > span :: before {
content : '' ;
width : 7 px ;
height : 7 px ;
background : var ( - - warning ) ;
animation : pulse 1.6 s ease-in-out infinite ;
}
@ keyframes pulse {
0 % , 100 % { opacity : 1 ; transform : scale ( 1 ) ; }
50 % { opacity : 0.3 ; transform : scale ( 0.8 ) ; }
}
. save-actions { display : flex ; gap : 10 px ; flex-wrap : wrap ; }
. save-actions button {
padding : 11 px 22 px ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 700 ;
letter-spacing : 0.16 em ;
text-transform : uppercase ;
cursor : pointer ;
border : 1 px solid transparent ;
border-radius : 0 ;
transition : all 180 ms ease ;
}
. save-actions button : first-child {
background : var ( - - primary ) ;
color : var ( - - bg ) ;
border-color : var ( - - primary ) ;
}
. save-actions button : first-child : hover {
background : var ( - - primary - hover ) ;
border-color : var ( - - primary - hover ) ;
}
. save-actions button . secondary {
background : transparent ;
color : var ( - - text ) ;
border-color : var ( - - border - strong ) ;
}
. save-actions button . secondary : hover {
border-color : var ( - - primary ) ;
color : var ( - - primary ) ;
}
. save-actions button . danger {
background : transparent ;
color : var ( - - danger ) ;
border-color : var ( - - danger ) ;
}
. save-actions button . danger : hover {
background : var ( - - danger ) ;
color : var ( - - bg ) ;
}
. save-actions button : disabled { opacity : 0.4 ; cursor : not-allowed ; }
/* Toast */
# toast-container { position : fixed ; top : 72 px ; right : 24 px ; z-index : 300 ; display : flex ; flex-direction : column ; gap : 8 px ; }
. toast { padding : 12 px 20 px ; border-radius : 8 px ; font-size : 13 px ; font-weight : 500 ; animation : toast-in 300 ms ease ; }
. toast-success { background : rgba ( 87 , 242 , 135 , 0.15 ) ; color : var ( - - success ) ; border : 1 px solid rgba ( 87 , 242 , 135 , 0.3 ) ; }
. toast-warning { background : rgba ( 254 , 231 , 92 , 0.15 ) ; color : var ( - - warning ) ; border : 1 px solid rgba ( 254 , 231 , 92 , 0.3 ) ; }
. toast-error { background : rgba ( 237 , 66 , 69 , 0.15 ) ; color : var ( - - danger ) ; bor der : 1 px solid rgba ( 237 , 66 , 69 , 0.3 ) ; }
@ keyframes toast-in { from { opacity : 0 ; transform : translateX ( 20 px ) ; } to { opacity : 1 ; transform : translateX ( 0 ) ; } }
# toast-container {
position : fixed ;
top : 76 px ;
right : 24 px ;
z-in dex : 300 ;
display : flex ;
flex-direction : column ;
gap : 8 px ;
pointer-events : none ;
}
. toast {
padding : 12 px 18 px ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 700 ;
letter-spacing : 0.12 em ;
text-transform : uppercase ;
border-left : 3 px solid currentColor ;
background : var ( - - surface ) ;
animation : toast-in 260 ms ease ;
pointer-events : auto ;
max-width : 420 px ;
}
. toast-success { color : var ( - - primary ) ; background : rgba ( 199 , 233 , 77 , 0.06 ) ; }
. toast-warning { color : var ( - - warning ) ; background : rgba ( 255 , 214 , 107 , 0.08 ) ; }
. toast-error { color : var ( - - danger ) ; background : rgba ( 255 , 90 , 82 , 0.08 ) ; }
@ keyframes toast-in {
from { opacity : 0 ; transform : translateX ( 20 px ) ; }
to { opacity : 1 ; transform : translateX ( 0 ) ; }
}
/* Modal */
. modal { position : fixed ; inset : 0 ; background : rgba ( 0 , 0 , 0 , 0.6 ) ; display : flex ; align-items : center ; justify-content : center ; z-index : 400 ; }
. modal {
position : fixed ;
inset : 0 ;
background : rgba ( 0 , 0 , 0 , 0.72 ) ;
backdrop-filter : blur ( 4 px ) ;
-webkit- backdrop-filter : blur ( 4 px ) ;
display : flex ;
align-items : center ;
justify-content : center ;
z-index : 400 ;
}
. modal . hidden { display : none ; }
. modal-card { background : var ( - - card ) ; border : 1 px solid var ( - - border ) ; border-radius : 12 px ; padding : 24 px ; min-width : 340 px ; }
. modal-card h3 { margin-bottom : 16 px ; font-size : 16 px ; }
. modal-card input { width : 100 % ; padding : 10 px 14 px ; background : var ( - - bg ) ; border : 1 px solid var ( - - border ) ; border-radius : 8 px ; color : var ( - - text ) ; font-size : 14 px ; margin-bottom : 16 px ; }
. modal-card {
background : var ( - - surface ) ;
border : 1 px solid var ( - - border ) ;
border-top : 3 px solid var ( - - primary ) ;
padding : 28 px ;
min-width : 360 px ;
}
. modal-card h3 {
margin-bottom : 20 px ;
font-family : var ( - - font - title ) ;
font-size : 13 px ;
font-weight : 700 ;
letter-spacing : 0.16 em ;
text-transform : uppercase ;
}
. modal-card input {
width : 100 % ;
padding : 11 px 14 px ;
background : var ( - - bg ) ;
border : 1 px solid var ( - - border ) ;
color : var ( - - text ) ;
font-family : var ( - - font - body ) ;
font-size : 14 px ;
margin-bottom : 20 px ;
outline : none ;
transition : border-color 180 ms ease ;
}
. modal-card input : focus { border-color : var ( - - primary ) ; }
. modal-actions { display : flex ; gap : 8 px ; justify-content : flex-end ; }
. modal-actions button { padding : 8 px 16 px ; border-radius : 6 px ; font-size : 13 px ; font-weight : 600 ; cursor : pointer ; border : none ; }
. modal-actions button : first-child { background : var ( - - accent ) ; color : #fff ; }
. modal-actions button . secondary { background : var ( - - card ) ; color : var ( - - text ) ; border : 1 px solid var ( - - border ) ; }
. modal-actions button {
padding : 10 px 20 px ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 700 ;
letter-spacing : 0.14 em ;
text-transform : uppercase ;
cursor : pointer ;
border : 1 px solid transparent ;
}
. modal-actions button : first-child {
background : var ( - - primary ) ;
color : var ( - - bg ) ;
border-color : var ( - - primary ) ;
}
. modal-actions button : first-child : hover { background : var ( - - primary - hover ) ; }
. modal-actions button . secondary {
background : transparent ;
color : var ( - - text ) ;
border-color : var ( - - border - strong ) ;
}
. modal-actions button . secondary : hover { border-color : var ( - - primary ) ; color : var ( - - primary ) ; }
/* Loading */
. loading { position : fixed ; inset : 0 ; background : var ( - - bg ) ; display : flex ; align-items : center ; justify-content : center ; z-index : 500 ; }
. loading {
position : fixed ;
inset : 0 ;
background : var ( - - bg ) ;
display : flex ;
flex-direction : column ;
gap : 20 px ;
align-items : center ;
justify-content : center ;
z-index : 500 ;
}
. loading . hidden { display : none ; }
. spinner { width : 40 px ; height : 40 px ; border : 3 px solid var ( - - border ) ; border-top-color : var ( - - accent ) ; border-r adius : 50 % ; animation : spin 0.8 s linear infinite ; }
. lo ading :: after {
content : 'LOADING (:|)' ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 700 ;
letter-spacing : 0.32 em ;
color : var ( - - primary ) ;
}
. spinner {
width : 40 px ;
height : 40 px ;
border : 2 px solid var ( - - border ) ;
border-top-color : var ( - - primary ) ;
border-radius : 0 ;
animation : spin 0.9 s linear infinite ;
}
@ keyframes spin { to { transform : rotate ( 360 deg ) ; } }
/* Notifications section */
# s-notifications . notif-tabs { display : flex ; gap : 8 px ; flex-wrap : wrap ; margin-bottom : 16 px ; }
# s-notifications . notif-tab-btn { border : 1 px solid var ( - - border ) ; background : var ( - - surface ) ; color : var ( - - text ) ; border-radius : 8 px ; padding : 8 px 12 px ; cursor : pointer ; }
# s-notifications . notif-tab-btn . active { border-color : var ( - - accent ) ; color : var ( - - accent ) ; }
# s-notifications . notif-tabs {
display : flex ;
gap : 4 px ;
flex-wrap : wrap ;
margin-bottom : 22 px ;
border-bottom : 1 px solid var ( - - border ) ;
}
# s-notifications . notif-tab-btn {
border : none ;
background : transparent ;
color : var ( - - text - muted ) ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 600 ;
text-transform : uppercase ;
letter-spacing : 0.14 em ;
padding : 10 px 16 px ;
cursor : pointer ;
border-bottom : 2 px solid transparent ;
margin-bottom : -1 px ;
transition : color 160 ms ease , border-color 160 ms ease ;
}
# s-notifications . notif-tab-btn : hover { color : var ( - - text ) ; }
# s-notifications . notif-tab-btn . active { color : var ( - - primary ) ; border-bottom-color : var ( - - primary ) ; }
# s-notifications . notif-panel . hidden { display : none ; }
# s-notifications . notif-editor { border : 1 px solid var ( - - border ) ; border-radius : 10 px ; padding : 14 px ; margin-bottom : 14 px ; background : var ( - - surface ) ; }
# s-notifications . notif-chips { display : flex ; gap : 8 px ; flex-wrap : wrap ; margin : 10 px 0 ; min-height : 28 px ; }
# s-notifications . notif-chip { display : inline-flex ; align-items : center ; gap : 8 px ; border : 1 px solid var ( - - border ) ; background : var ( - - bg ) ; border-radius : 999 px ; padding : 4 px 10 px ; font-size : 12 px ; }
# s-notifications . notif-chip button { border : none ; background : transparent ; color : var ( - - text - muted ) ; cursor : pointer ; padding : 0 ; line-height : 1 ; font-size : 14 px ; }
# s-notifications . notif-input-row { display : flex ; gap : 8 px ; flex-wrap : wrap ; align-items : center ; }
# s-notifications . notif-editor {
border : 1 px solid var ( - - border ) ;
padding : 20 px ;
margin-bottom : 16 px ;
background : var ( - - surface -2 ) ;
}
# s-notifications . notif-chips {
display : flex ;
gap : 8 px ;
flex-wrap : wrap ;
margin : 14 px 0 ;
min-height : 32 px ;
}
# s-notifications . notif-chip {
display : inline-flex ;
align-items : center ;
gap : 10 px ;
border : 1 px solid var ( - - primary ) ;
background : var ( - - primary - dim ) ;
color : var ( - - primary ) ;
padding : 5 px 12 px ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 700 ;
letter-spacing : 0.08 em ;
text-transform : uppercase ;
}
# s-notifications . notif-chip button {
border : none ;
background : transparent ;
color : currentColor ;
cursor : pointer ;
padding : 0 ;
line-height : 1 ;
font-size : 14 px ;
opacity : 0.6 ;
}
# s-notifications . notif-chip button : hover { opacity : 1 ; }
# s-notifications . notif-input-row {
display : flex ;
gap : 8 px ;
flex-wrap : wrap ;
align-items : center ;
}
# s-notifications . notif-input-row input { width : 220 px ; }
# s-notifications . notif-presets { display : flex ; gap : 8 px ; flex-wrap : wrap ; margin-top : 10 px ; }
# s-notifications . notif-presets button { padding : 6 px 10 px ; border-radius : 8 px ; border : 1 px solid var ( - - border ) ; background : var ( - - bg ) ; color : var ( - - text ) ; cursor : pointer ; }
# s-notifications . notif-trigger { margin-to p: 10 px ; }
# s-notifications . notif-trigger summary { cursor : pointer ; color : var ( - - text - muted ) ; font-weight : 600 ; margin-bottom : 10 px ; }
# s-notifications . notif-presets {
display : flex ;
ga p : 6 px ;
flex-wrap : wrap ;
margin-top : 14 px ;
}
# s-notifications . notif-presets button ,
# s-notifications . notif-add-btn {
padding : 8 px 14 px ;
border : 1 px solid var ( - - border - strong ) ;
background : transparent ;
color : var ( - - text - muted ) ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 600 ;
letter-spacing : 0.12 em ;
text-transform : uppercase ;
cursor : pointer ;
transition : border-color 160 ms ease , color 160 ms ease , background 160 ms ease ;
}
# s-notifications . notif-presets button : hover ,
# s-notifications . notif-add-btn : hover {
border-color : var ( - - primary ) ;
color : var ( - - primary ) ;
background : var ( - - primary - dim -2 ) ;
}
# s-notifications . notif-trigger { margin-top : 16 px ; }
# s-notifications . notif-trigger summary {
cursor : pointer ;
color : var ( - - text - muted ) ;
font-family : var ( - - font - title ) ;
font-size : 11 px ;
font-weight : 700 ;
letter-spacing : 0.16 em ;
text-transform : uppercase ;
margin-bottom : 14 px ;
user-select : none ;
list-style : none ;
display : inline-flex ;
align-items : center ;
gap : 8 px ;
}
# s-notifications . notif-trigger summary :: -webkit-details-marker { display : none ; }
# s-notifications . notif-trigger summary :: before {
content : '+' ;
color : var ( - - primary ) ;
font-weight : 700 ;
font-size : 14 px ;
}
# s-notifications . notif-trigger [ open ] summary :: before { content : '− ' ; }
# s-notifications . notif-trigger [ open ] summary { color : var ( - - primary ) ; }
/* Logging section cross-link hint */
/* Logging hint link */
. logging-hint { color : var ( - - text - muted ) ; font-size : 13 px ; }
. logging-hint a { color : var ( - - accent ) ; }
. logging-hint a {
color : var ( - - primary ) ;
text-decoration : underline ;
text-decoration-style : wavy ;
text-decoration-thickness : 1.5 px ;
text-underline-offset : 4 px ;
}
. logging-hint a : hover { color : var ( - - primary - hover ) ; }
/* Logout form inline layout */
/* Legacy l ogout form wrapper (kept for compatibility) */
. logout-form { display : inline ; }
/* Select element styling (native appearance override) */
. field select {
appearance : none ;
-webkit- appearance : none ;
background-image : linear-gradient ( 45 deg , transparent 50 % , var ( - - primary ) 50 % ) ,
linear-gradient ( 135 deg , var ( - - primary ) 50 % , transparent 50 % ) ;
background-position : calc ( 100 % - 18 px ) center , calc ( 100 % - 13 px ) center ;
background-size : 5 px 5 px , 5 px 5 px ;
background-repeat : no-repeat ;
padding-right : 36 px ;
}
/* ---------- Mobile navigation primitives ---------- */
. menu-toggle {
display : none ;
align-items : center ;
justify-content : center ;
width : 44 px ;
height : 44 px ;
padding : 0 ;
margin-right : 4 px ;
background : transparent ;
border : 1 px solid var ( - - border - strong ) ;
border-radius : 0 ;
color : var ( - - text ) ;
cursor : pointer ;
transition : border-color 180 ms ease , color 180 ms ease , background 180 ms ease ;
}
. menu-toggle : hover { border-color : var ( - - primary ) ; color : var ( - - primary ) ; background : var ( - - primary - dim -2 ) ; }
. menu-toggle : focus-visible { outline : 2 px solid var ( - - primary ) ; outline-offset : 2 px ; }
. menu-toggle-bars ,
. menu-toggle-bars :: before ,
. menu-toggle-bars :: after {
display : block ;
width : 20 px ;
height : 2 px ;
background : currentColor ;
position : relative ;
transition : transform 200 ms ;
}
. menu-toggle-bars :: before ,
. menu-toggle-bars :: after { content : '' ; position : absolute ; left : 0 ; }
. menu-toggle-bars :: before { top : -6 px ; }
. menu-toggle-bars :: after { top : 6 px ; }
. sidebar-backdrop {
display : none ;
position : fixed ;
inset : 0 ;
background : rgba ( 0 , 0 , 0 , 0.72 ) ;
backdrop-filter : blur ( 3 px ) ;
-webkit- backdrop-filter : blur ( 3 px ) ;
opacity : 0 ;
pointer-events : none ;
transition : opacity 200 ms ease ;
z-index : 150 ;
}
/* ---------- Mobile breakpoint ---------- */
@ media ( max-width : 900px ) {
body . sidebar-open { overflow : hidden ; }
. sidebar {
transform : translateX ( -100 % ) ;
transition : transform 260 ms ease ;
z-index : 151 ;
box-shadow : 4 px 0 40 px rgba ( 0 , 0 , 0 , 0.7 ) ;
}
body . sidebar-open . sidebar { transform : translateX ( 0 ) ; }
. sidebar-backdrop { display : block ; }
body . sidebar-open . sidebar-backdrop { opacity : 1 ; pointer-events : auto ; }
. topbar { left : 0 ; padding : 0 14 px ; gap : 10 px ; height : 56 px ; }
. topbar h1 { font-size : 12 px ; flex : 1 ; min-width : 0 ; letter-spacing : 0.14 em ; }
. topbar . status { font-size : 10 px ; flex-shrink : 0 ; }
. topbar . actions button { min-height : 44 px ; padding : 10 px 14 px ; font-size : 10 px ; }
. menu-toggle { display : inline-flex ; }
. main {
margin-left : 0 ;
margin-top : 56 px ;
padding : 20 px 16 px ;
padding-bottom : 180 px ;
}
. field-grid { grid-template-columns : 1 fr ; }
. save-bar {
left : 0 ;
padding : 14 px 16 px calc ( 14 px + env ( safe - area - inset - bottom , 0 px ) ) ;
flex-wrap : wrap ;
gap : 10 px ;
}
. save-bar > span { width : 100 % ; }
. save-actions { width : 100 % ; display : flex ; flex-wrap : wrap ; gap : 8 px ; }
. save-actions button { flex : 1 1 140 px ; min-height : 44 px ; padding : 14 px 16 px ; font-size : 11 px ; }
. save-actions button : first-child { flex-basis : 100 % ; }
. sidebar a { padding : 14 px 20 px ; min-height : 44 px ; font-size : 12 px ; }
. section-header { padding : 18 px 20 px ; }
. smart-select-display { min-height : 44 px ; }
# s-notifications . notif-chip { padding : 8 px 12 px ; }
# s-notifications . notif-chip button { min-width : 28 px ; min-height : 28 px ; font-size : 18 px ; }
# s-notifications . notif-tab-btn ,
# s-notifications . notif-add-btn ,
# s-notifications . notif-presets button { min-height : 40 px ; padding : 10 px 14 px ; }
# s-notifications . notif-input-row input { flex : 1 1 auto ; width : auto ; min-width : 0 ; }
. modal-card { width : calc ( 100 vw - 32 px ) ; min-width : 0 ; max-width : 420 px ; }
# toast-container { right : 12 px ; left : 12 px ; top : 64 px ; }
. toast { max-width : none ; }
}