2026-09-20 12:27:47 +03:00
: root { --bg : #f4f6f9 ; --card : #fff ; --line : #dde3ea ; --line-strong : #c5ced9 ; --text : #18212f ; --muted : #58657a ; --faint : #8a95a5 ; --primary : #2450c8 ; --head : #f8fafc ; --hover : #f3f7ff ;
2026-09-27 17:44:48 +03:00
--sans : 'IBM Plex Sans' , system-ui , sans-serif ; --mono : 'IBM Plex Mono' , ui-monospace , monospace ;
/* изменение 038: токены поверхностей/акцентов — вынесены прежние прописанные цвета, значения не изменились */
--input-bg : #fff ; --primary-soft : #f3f7ff ; --selected-bg : #eef3ff ; --row-alt : #fbfcfd ; --neutral-bg : #eef1f5 ; --badge-fg : #3c4859 ;
--on-primary : #fff ; --toast-bg : #18212f ; --toast-fg : #fff ;
--overlay : rgba ( 24 , 33 , 47 , .45 ); --shadow-sm : rgba ( 20 , 33 , 60 , .16 ); --shadow-lg : rgba ( 20 , 33 , 60 , .25 ); --focus-ring : rgba ( 36 , 80 , 200 , .15 );
--danger : #a32020 ; --danger-strong : #c62828 ; --danger-bg : #fbe6e6 ;
--warn : #7c4a00 ; --warn-strong : #d97706 ; --warn-bg : #fdf0d5 ;
--ok : #14683a ; --ok-bg : #e3f4ea ;
--info : #1e449e ; --info-bg : #eaf0ff ;
--purple : #5b2a9e ; --purple-bg : #efe8fb ;
--select-arrow : #18212f ; /* совпадает со --text; для тёмной темы переопределяется вместе с фоном .select ниже */
color-scheme : light dark }
2026-09-20 12:27:47 +03:00
* { box-sizing : border-box }
body { margin : 0 ; background : var ( -- bg ); font-family : var ( -- sans ); color : var ( -- text )}
a { color : var ( -- primary ); text-decoration : none }
h1 , h2 { margin : 0 }
button { font-family : var ( -- sans )}
/* app bar */
2026-09-27 17:44:48 +03:00
. appbar { height : 56 px ; background : var ( -- card ); border-bottom : 1 px solid var ( -- line ); display : flex ; align-items : center ; padding : 0 24 px ; gap : 32 px }
2026-09-20 12:27:47 +03:00
. brand { display : flex ; align-items : center ; gap : 10 px ; font : 600 16 px / 1 var ( -- sans )}
2026-09-27 17:44:48 +03:00
. brand-logo { width : 28 px ; height : 28 px ; border-radius : 8 px ; background : var ( -- primary ); color : var ( -- on - primary ); display : flex ; align-items : center ; justify-content : center }
2026-09-20 12:27:47 +03:00
. nav { display : flex ; height : 100 % ; gap : 4 px }
. nav a { display : flex ; align-items : center ; height : 100 % ; padding : 0 14 px ; font : 500 14 px / 1 var ( -- sans ); color : var ( -- muted ); border-bottom : 2 px solid transparent }
. nav a . active { color : var ( -- text ); border-bottom-color : var ( -- primary )}
. grow { flex : 1 }
2026-09-27 16:14:58 +03:00
/* изменение 036: .appbar .user удалено — логин заменён на триггер меню (.user-menu .btn.ghost) */
2026-09-20 12:27:47 +03:00
/* buttons */
2026-09-27 17:44:48 +03:00
. btn { display : inline-flex ; align-items : center ; justify-content : center ; gap : 8 px ; height : 36 px ; margin : 0 ; border-radius : 8 px ; font : 500 14 px / 1 var ( -- sans ); white-space : nowrap ; cursor : pointer ; padding : 0 14 px ; background : var ( -- card ); color : var ( -- text ); border : 1 px solid var ( -- line - strong )}
. btn . primary { background : var ( -- primary ); color : var ( -- on - primary ); border-color : var ( -- primary )}
. btn . outline-primary { background : var ( -- card ); color : var ( -- primary ); border-color : var ( -- primary )}
2026-09-20 12:27:47 +03:00
. btn . ghost { background : transparent ; color : var ( -- muted ); border-color : transparent ; padding : 0 10 px }
2026-09-27 17:44:48 +03:00
. btn . danger { color : var ( -- danger )}
2026-09-20 12:27:47 +03:00
. btn : disabled { opacity : .6 ; cursor : default }
. icon-btn { display : inline-flex ; align-items : center ; justify-content : center ; width : 36 px ; height : 36 px ; margin : 0 ; border-radius : 8 px ; cursor : pointer ; background : transparent ; color : var ( -- muted ); border : 1 px solid transparent ; padding : 0 }
2026-09-27 17:44:48 +03:00
. icon-btn : hover { background : var ( -- neutral - bg )}
2026-09-20 12:27:47 +03:00
. icon-btn . sm { width : 28 px ; height : 28 px ; border-radius : 6 px }
. icon-btn : disabled { color : var ( -- line - strong ); cursor : default ; background : transparent }
svg { flex : none }
/* layout */
. page { padding : 0 24 px }
. crumbs { display : flex ; align-items : center ; gap : 6 px ; padding : 16 px 0 0 ; font : 500 13 px / 1 var ( -- sans ); color : var ( -- muted )}
. crumbs . cur { font-weight : 600 ; color : var ( -- text )}
. head { display : flex ; align-items : flex-end ; justify-content : space-between ; margin : 24 px 0 16 px }
. crumbs + . head { margin : 8 px 0 16 px }
. head h1 { font : 600 24 px / 1.2 var ( -- sans ); color : var ( -- text )}
. head . sub { margin-top : 4 px ; font : 400 14 px / 1.4 var ( -- sans ); color : var ( -- muted )}
. head . actions { display : flex ; gap : 8 px }
2026-09-27 17:44:48 +03:00
. card { background : var ( -- card ); border : 1 px solid var ( -- line ); border-radius : 12 px }
2026-09-20 12:27:47 +03:00
. right-link { display : flex ; justify-content : flex-end ; margin-bottom : 12 px }
. right-link a , . link-muted { display : flex ; align-items : center ; gap : 6 px ; font : 500 13 px / 1 var ( -- sans ); color : var ( -- muted ); cursor : pointer ; background : none ; border : 0 ; padding : 0 }
/* tabs */
. tabs { display : flex ; align-items : center ; gap : 24 px ; border-bottom : 1 px solid var ( -- line ); margin-bottom : 16 px }
. tab { padding : 10 px 2 px 12 px ; margin-bottom : -1 px ; font : 500 14 px / 1 var ( -- sans ); color : var ( -- muted ); border-bottom : 2 px solid transparent ; cursor : pointer ; background : none ; border-top : 0 ; border-left : 0 ; border-right : 0 }
. tab . active { font-weight : 600 ; color : var ( -- text ); border-bottom-color : var ( -- primary )}
. tab . n { font-weight : 400 ; color : var ( -- muted ); margin-left : 2 px }
. tabs . link-muted { padding : 10 px 2 px 12 px ; margin-bottom : -1 px }
/* filters */
. filters { display : flex ; align-items : center ; gap : 8 px ; height : 64 px ; padding : 0 16 px ; position : relative }
. vsep { width : 1 px ; height : 24 px ; background : var ( -- line ); flex : none }
. search { position : relative ; display : inline-flex ; align-items : center ; flex : none }
. search . ico { position : absolute ; left : 12 px ; color : var ( -- muted ); display : flex }
2026-09-27 17:44:48 +03:00
. search input { width : 100 % ; height : 36 px ; padding : 0 12 px 0 36 px ; border : 1 px solid var ( -- line - strong ); border-radius : 8 px ; background : var ( -- input - bg ); color : var ( -- text ); font : 400 14 px / 1 var ( -- sans ); margin : 0 }
2026-09-20 12:27:47 +03:00
. filter-btn { justify-content : space-between ; width : 180 px }
2026-09-27 17:44:48 +03:00
. org-btn { display : inline-flex ; align-items : center ; gap : 8 px ; height : 36 px ; border-radius : 8 px ; font : 500 14 px / 1 var ( -- sans ); cursor : pointer ; background : var ( -- primary - soft ); color : var ( -- text ); border : 1 px solid var ( -- primary ); padding : 0 12 px ; flex : none ; min-width : 260 px }
2026-09-20 12:27:47 +03:00
. org-btn . lbl { color : var ( -- muted ); font-weight : 400 }
. org-btn . val { font-weight : 600 ; flex : 1 ; text-align : left ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis }
2026-09-27 17:44:48 +03:00
. pop { position : absolute ; top : 52 px ; z-index : 20 ; min-width : 220 px ; max-height : 320 px ; overflow : auto ; background : var ( -- card ); border : 1 px solid var ( -- line ); border-radius : 8 px ; box-shadow : 0 8 px 24 px var ( -- shadow - sm ); padding : 4 px }
2026-09-20 12:27:47 +03:00
. pop button { display : block ; width : 100 % ; text-align : left ; height : 36 px ; padding : 0 12 px ; border : 0 ; background : none ; border-radius : 6 px ; font : 400 14 px / 1 var ( -- sans ); color : var ( -- text ); cursor : pointer ; white-space : nowrap }
. pop button : hover { background : var ( -- hover )}
. pop button . sel { font-weight : 600 }
2026-09-27 17:44:48 +03:00
. pop button . danger { color : var ( -- danger )}
2026-09-20 12:27:47 +03:00
. row-pop { top : 40 px ; right : 0 ; min-width : 180 px }
. rel { position : relative }
/* table */
. tr { display : grid ; grid-template-columns : var ( -- cols ); column-gap : 12 px ; align-items : center ; height : var ( -- h , 56 px ); padding : 0 16 px ; border-bottom : 1 px solid var ( -- line ); font : 400 14 px / 1.3 var ( -- sans )}
. tr . th { height : 40 px ; background : var ( -- head ); border-top : 1 px solid var ( -- line ); color : var ( -- muted )}
. tr . th span { font : 600 12 px / 1 var ( -- sans ); color : var ( -- muted )}
. tr . hoverable : hover { background : var ( -- hover )}
. tr . clickable { cursor : pointer }
2026-09-27 17:44:48 +03:00
. tr . child { background : var ( -- row - alt )}
2026-09-20 12:27:47 +03:00
. tr . free { background : var ( -- head )}
. tr . free span , . tr . free . mono { color : var ( -- faint )}
. tr . last { border-bottom : 0 }
. foot { display : flex ; align-items : center ; height : 44 px ; padding : 0 16 px ; font : 400 13 px / 1 var ( -- sans ); color : var ( -- muted )}
. foot a { margin-left : 4 px ; cursor : pointer }
. empty { padding : 32 px 16 px ; text-align : center ; color : var ( -- muted ); font-size : 14 px }
. mono { font-family : var ( -- mono )}
. m13 { font : 500 13 px / 1 var ( -- mono )}
. muted { color : var ( -- muted )}
. ell { white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis }
. cell-actions { display : flex ; justify-content : flex-end }
. chev { display : flex ; justify-content : center }
. chev button { background : none ; border : 0 ; cursor : pointer ; color : var ( -- muted ); display : flex ; padding : 0 }
. chev svg { transition : transform .12 s }
. chev . open svg { transform : rotate ( 90 deg )}
. bar { display : flex ; align-items : center ; gap : 8 px }
. bar . track { flex : 1 ; height : 4 px ; border-radius : 2 px ; background : var ( -- line )}
. bar . fill { height : 100 % ; border-radius : 2 px }
. bar . pct { font : 400 12 px / 1 var ( -- sans ); color : var ( -- muted ); white-space : nowrap }
/* badges */
2026-09-27 17:44:48 +03:00
. badge { display : inline-flex ; align-items : center ; gap : 4 px ; height : 22 px ; padding : 0 8 px ; border-radius : 6 px ; font : 500 12 px / 1 var ( -- sans ); background : var ( -- neutral - bg ); color : var ( -- badge - fg )}
. badge . green { background : var ( -- ok - bg ); color : var ( -- ok )}
. badge . blue { background : var ( -- info - bg ); color : var ( -- info )}
. badge . red { background : var ( -- danger - bg ); color : var ( -- danger )}
. badge . amber { background : var ( -- warn - bg ); color : var ( -- warn )}
. badge . purple { background : var ( -- purple - bg ); color : var ( -- purple )}
. more { margin-left : 4 px ; display : inline-flex ; align-items : center ; height : 18 px ; padding : 0 5 px ; border-radius : 4 px ; background : var ( -- info - bg ); color : var ( -- info ); font : 500 11 px / 1 var ( -- sans )}
2026-09-20 12:27:47 +03:00
/* overview */
. stats { display : grid ; grid-template-columns : repeat ( 4 , minmax ( 0 , 1 fr )); gap : 16 px ; margin-bottom : 24 px }
. stat { padding : 20 px 24 px }
. stat . l { font : 400 13 px / 1.3 var ( -- sans ); color : var ( -- muted ); margin-bottom : 8 px }
. stat . v { font : 600 32 px / 1 var ( -- sans )}
. stat . s { margin-top : 6 px ; font : 400 13 px / 1.3 var ( -- sans ); color : var ( -- muted )}
. stat . track { margin-top : 8 px ; height : 6 px ; border-radius : 3 px ; background : var ( -- line )}
. stat . track div { height : 100 % ; border-radius : 3 px ; background : var ( -- primary )}
. two { display : grid ; grid-template-columns : 1 fr 1 fr ; gap : 16 px }
. card-title { padding : 16 px 16 px 12 px ; font : 600 16 px / 1.2 var ( -- sans )}
/* address usage */
. usage { padding : 16 px ; margin-bottom : 16 px ; display : flex ; align-items : center ; gap : 16 px }
. usage . track { flex : 1 ; height : 8 px ; border-radius : 4 px ; background : var ( -- line ); overflow : hidden ; display : flex }
. legend { display : flex ; gap : 20 px ; font : 400 13 px / 1 var ( -- sans )}
. legend span { display : flex ; align-items : center ; gap : 6 px }
. legend i { width : 8 px ; height : 8 px ; border-radius : 2 px ; display : inline-block }
/* dialogs */
2026-09-27 17:44:48 +03:00
. overlay { position : fixed ; inset : 0 ; background : var ( -- overlay ); display : flex ; align-items : flex-start ; justify-content : center ; padding-top : 96 px ; overflow : auto ; z-index : 50 }
. dialog { box-sizing : content-box ; background : var ( -- card ); border : 1 px solid var ( -- line ); border-radius : 12 px ; box-shadow : 0 16 px 48 px var ( -- shadow - lg ); flex : none ; margin-bottom : 40 px }
2026-09-20 12:27:47 +03:00
. dialog-head { display : flex ; align-items : center ; justify-content : space-between ; padding : 16 px 16 px 0 24 px }
. dialog-head h2 { font : 600 18 px / 1.2 var ( -- sans )}
. dialog-note { padding : 4 px 24 px 0 ; font : 400 13 px / 1.4 var ( -- sans ); color : var ( -- muted )}
. dialog-body { display : flex ; flex-direction : column ; gap : 16 px ; padding : 16 px 24 px 24 px }
. dialog-foot { display : flex ; align-items : center ; justify-content : flex-end ; gap : 8 px ; padding : 16 px 24 px ; border-top : 1 px solid var ( -- line )}
. grid2 { display : grid ; grid-template-columns : 1 fr 1 fr ; gap : 12 px }
. field { display : flex ; flex-direction : column ; gap : 6 px ; font : 500 13 px / 1.3 var ( -- sans )}
. field . opt { font-weight : 400 ; color : var ( -- muted )}
2026-09-27 17:44:48 +03:00
. input , . select , . textarea { width : 100 % ; height : 36 px ; margin : 0 ; padding : 0 12 px ; border : 1 px solid var ( -- line - strong ); border-radius : 8 px ; background : var ( -- input - bg ); color : var ( -- text ); font : 400 14 px / 1 var ( -- sans )}
2026-09-20 12:27:47 +03:00
. input . mono , . textarea . mono { font-family : var ( -- mono )}
. input . mono { font-size : 14 px }
2026-09-27 17:44:48 +03:00
. select { appearance : none ; font-weight : 500 ; padding : 0 34 px 0 14 px ; background : var ( -- input - bg ) url ( "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2318212f' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E" ) no-repeat right 14 px center ; cursor : pointer }
2026-09-20 12:27:47 +03:00
. textarea { height : 56 px ; padding : 10 px 12 px ; line-height : 1.4 ; resize : vertical }
2026-09-27 17:44:48 +03:00
. input . bad , . select . bad , . textarea . bad { border-color : var ( -- danger - strong )}
. info { padding : 10 px 12 px ; border-radius : 8 px ; background : var ( -- info - bg ); color : var ( -- info ); font : 400 13 px / 1.4 var ( -- sans )}
. err-banner { padding : 10 px 12 px ; border-radius : 8 px ; background : var ( -- danger - bg ); color : var ( -- danger ); font : 400 13 px / 1.4 var ( -- sans )}
2026-09-20 12:27:47 +03:00
. check { display : flex ; align-items : flex-start ; gap : 10 px ; font : 500 14 px / 1.3 var ( -- sans )}
. check input { width : 16 px ; height : 16 px ; margin : 2 px 0 0 ; accent-color : var ( -- primary )}
. check small { display : block ; font : 400 12 px / 1.3 var ( -- sans ); color : var ( -- muted )}
. mini-table { border : 1 px solid var ( -- line ); border-radius : 8 px ; overflow : hidden ; margin : 16 px 24 px 8 px }
. mini-table . tr { height : 48 px ; padding : 0 12 px }
. mini-table . tr . th { height : 36 px ; border-top : 0 }
. mini-table . tr : last-child { border-bottom : 0 }
. add-row { display : flex ; align-items : center ; gap : 8 px ; padding : 0 24 px 20 px }
. add-row . input { flex : 1 }
/* misc */
# toast-root { position : fixed ; bottom : 16 px ; right : 16 px ; pointer-events : none ; z-index : 100 ; display : flex ; flex-direction : column ; gap : 8 px }
2026-09-27 17:44:48 +03:00
. toast { background : var ( -- toast - bg ); color : var ( -- toast - fg ); padding : 10 px 14 px ; border-radius : 8 px ; font : 400 14 px / 1.3 var ( -- sans ); box-shadow : 0 8 px 24 px var ( -- shadow - lg )}
. toast . err { background : var ( -- danger )}
2026-09-20 12:27:47 +03:00
. login { max-width : 380 px ; margin : 120 px auto 0 ; padding : 32 px }
. login h1 { font : 600 22 px / 1.2 var ( -- sans ); margin : 20 px 0 4 px }
. login . field { margin-top : 16 px }
. login . btn { width : 100 % ; margin-top : 20 px }
2026-09-27 17:44:48 +03:00
. input : focus , . select : focus , . textarea : focus , . search input : focus { outline : none ; border-color : var ( -- primary ); box-shadow : 0 0 0 3 px var ( -- focus - ring )}
2026-09-20 12:27:47 +03:00
. btn : focus-visible , . icon-btn : focus-visible , . tab : focus-visible { outline : 2 px solid var ( -- primary ); outline-offset : 2 px }
/* выпадающие списки в диалогах */
. cselect { position : relative }
button . select { display : block ; text-align : left ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis }
button . select . ph { color : var ( -- faint )}
. pop . dd { top : 40 px ; left : 0 ; right : 0 ; min-width : 0 ; max-height : 240 px }
. pop . dd [ hidden ] { display : none }
. pop button . sel { background : var ( -- hover )}
/* журнал */
2026-09-27 17:44:48 +03:00
. datebox { position : relative ; display : inline-flex ; align-items : center ; gap : 8 px ; height : 36 px ; padding : 0 12 px ; width : 170 px ; border : 1 px solid var ( -- line - strong ); border-radius : 8 px ; background : var ( -- input - bg ); font : 400 14 px / 1 var ( -- sans ); flex : none }
2026-09-20 12:27:47 +03:00
. datebox input { flex : 1 ; min-width : 0 ; border : 0 ; padding : 0 ; background : transparent ; color : var ( -- text ); font : 400 13 px / 1 var ( -- mono ); outline : none }
. datebox input :: -webkit-calendar-picker-indicator { position : absolute ; inset : 0 ; width : 100 % ; height : 100 % ; opacity : 0 ; cursor : pointer }
. datebox . cal { display : flex ; color : var ( -- muted ); pointer-events : none }
2026-09-27 17:44:48 +03:00
. datebox : focus-within { border-color : var ( -- primary ); box-shadow : 0 0 0 3 px var ( -- focus - ring )}
2026-09-20 12:27:47 +03:00
. kv { display : grid ; grid-template-columns : 130 px 1 fr ; gap : 12 px ; align-items : center ; min-height : 32 px ; font : 400 14 px / 1.4 var ( -- sans )}
. json { margin : 0 ; padding : 12 px ; border-radius : 8 px ; background : var ( -- head ); border : 1 px solid var ( -- line ); font : 400 13 px / 1.2 var ( -- mono ); white-space : pre-wrap ; overflow-wrap : anywhere }
. statbox { padding : 12 px ; border-radius : 8 px ; background : var ( -- head ); border : 1 px solid var ( -- line ); font : 400 13 px / 1.5 var ( -- sans ); color : var ( -- muted )}
. statbox b { color : var ( -- text ); font-weight : 600 }
2026-09-27 17:44:48 +03:00
. warn { padding : 10 px 12 px ; border-radius : 8 px ; background : var ( -- warn - bg ); color : var ( -- warn ); font : 400 13 px / 1.4 var ( -- sans )}
. btn . danger : disabled { background : var ( -- bg ); color : var ( -- faint ); border-color : var ( -- line ); cursor : not-allowed ; opacity : 1 }
2026-09-20 12:27:47 +03:00
. tr . clickable : focus-visible { outline : 2 px solid var ( -- primary ); outline-offset : -2 px }
2026-09-26 13:25:33 +03:00
. sel-cell { display : flex ; align-items : center ; justify-content : center ; height : 100 % ; cursor : pointer }
. sel-cell input { width : 16 px ; height : 16 px ; margin : 0 ; accent-color : var ( -- primary ); cursor : pointer }
. sel-cell input : disabled { cursor : not-allowed }
2026-09-27 17:44:48 +03:00
. tr . selected , . tr . selected : hover { background : var ( -- selected - bg )}
. bulkbar { display : flex ; align-items : center ; gap : 8 px ; height : 48 px ; padding : 0 16 px ; background : var ( -- primary - soft ); border-top : 1 px solid var ( -- line ); font : 400 14 px / 1 var ( -- sans ); position : relative }
2026-09-26 13:25:33 +03:00
. bulkbar . pop { top : 40 px }
2026-09-27 17:44:48 +03:00
/* изменение 038: тёмная тема — «авто» по prefers-color-scheme (если пользователь не выбрал явно) и принудительная через [data-theme] (ставит web/theme.js по localStorage["ipam.theme"]).
Палитра продублирована в двух блоках намеренно — иначе пришлось бы дублировать вручную через var() с запасным значением, что менее читаемо. Контраст текста — не ниже WCAG AA. */
@ media ( prefers-color-scheme : dark ) {
: root : not ([ data-theme = "light" ]) {
--bg : #0f1419 ; --card : #182029 ; --line : #262f3a ; --line-strong : #37414d ; --text : #e6edf3 ; --muted : #9aa7b8 ; --faint : #6b7789 ; --primary : #6b9bff ; --head : #131920 ; --hover : #1b2635 ;
--input-bg : #101722 ; --primary-soft : #16233a ; --selected-bg : #18243a ; --row-alt : #141b24 ; --neutral-bg : #232c37 ; --badge-fg : #c7d0dc ;
--on-primary : #0b1220 ; --toast-bg : #080b10 ; --toast-fg : #fff ;
--overlay : rgba ( 4 , 8 , 14 , .6 ); --shadow-sm : rgba ( 0 , 0 , 0 , .5 ); --shadow-lg : rgba ( 0 , 0 , 0 , .6 ); --focus-ring : rgba ( 107 , 155 , 255 , .3 );
--danger : #ff8080 ; --danger-strong : #ff5252 ; --danger-bg : #3b1518 ;
--warn : #f0b429 ; --warn-strong : #f2994a ; --warn-bg : #3a2a08 ;
--ok : #4ade80 ; --ok-bg : #123924 ;
--info : #8fb3ff ; --info-bg : #142a4d ;
--purple : #c7a6f7 ; --purple-bg : #2c1f45 ;
--select-arrow : #e6edf3 ;
color-scheme : dark }
: root : not ([ data-theme = "light" ]) . select { background-image : url ( "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23e6edf3' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E" )}
}
: root [ data-theme = "dark" ] {
--bg : #0f1419 ; --card : #182029 ; --line : #262f3a ; --line-strong : #37414d ; --text : #e6edf3 ; --muted : #9aa7b8 ; --faint : #6b7789 ; --primary : #6b9bff ; --head : #131920 ; --hover : #1b2635 ;
--input-bg : #101722 ; --primary-soft : #16233a ; --selected-bg : #18243a ; --row-alt : #141b24 ; --neutral-bg : #232c37 ; --badge-fg : #c7d0dc ;
--on-primary : #0b1220 ; --toast-bg : #080b10 ; --toast-fg : #fff ;
--overlay : rgba ( 4 , 8 , 14 , .6 ); --shadow-sm : rgba ( 0 , 0 , 0 , .5 ); --shadow-lg : rgba ( 0 , 0 , 0 , .6 ); --focus-ring : rgba ( 107 , 155 , 255 , .3 );
--danger : #ff8080 ; --danger-strong : #ff5252 ; --danger-bg : #3b1518 ;
--warn : #f0b429 ; --warn-strong : #f2994a ; --warn-bg : #3a2a08 ;
--ok : #4ade80 ; --ok-bg : #123924 ;
--info : #8fb3ff ; --info-bg : #142a4d ;
--purple : #c7a6f7 ; --purple-bg : #2c1f45 ;
--select-arrow : #e6edf3 ;
color-scheme : dark }
: root [ data-theme = "dark" ] . select { background-image : url ( "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23e6edf3' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E" )}
: root [ data-theme = "light" ] { color-scheme : light }
/* изменение 038: QR-код 2FA — намеренно остаётся тёмным на белом фоне независимо от темы (лучше сканируется), см. .qr-frame в app.js */
. qr-frame { background : #fff ; border-radius : 8 px ; display : inline-flex ; padding : 12 px }