file_explorer.css 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211
  1. /*
  2. ArozOS File Manager css file
  3. This file is used to overwrite the default css
  4. on segmentic ui (or formantic if it is later upgraded)
  5. */
  6. /*
  7. Color definations
  8. */
  9. :root{
  10. --dark_theme_toggle: #333333;
  11. --dark_theme_toggle_text: rgb(218, 218, 218);
  12. --white_theme_toggle: #dadada;
  13. --white_theme_toggle_text: rgb(27, 27, 27);
  14. }
  15. body.whiteTheme {
  16. --fileopr_btnTxt: rgb(226, 226, 226);
  17. --fileopr_oprtxt: rgb(56, 52, 52);
  18. --fileopr_btnhover: #f0f0f0;
  19. --divider: #f0f0f0;
  20. --navi_bgcolor: var(--body_background_secondary, #fcfcfc);
  21. --navi_theme: var(--theme_color, #92cfe7);
  22. --navi_theme_multiselect: #6c06ba;
  23. --navi_txt: rgb(114, 114, 114);
  24. --dropdown_bg: white;
  25. --dropdown_txt: black;
  26. --vroot_active_bg: #dadada;
  27. --dir_item_color: rgb(78, 78, 78);
  28. --text_active: #23cc28;
  29. --dir_bg: #f5f5f5;
  30. --dir_txt: rgb(44, 44, 44);
  31. --dir_border: rgba(219, 226, 241, 0.7);
  32. --dir_hover_text: #a3a3a3;
  33. --dir_hover_background: #f3f3f3;
  34. --dir_hover_active: #c9e7f1;
  35. --normal_object_txt: #303030;
  36. --hex_folder_txt: #2b9447;
  37. --um_file_txt: #69aaff;
  38. --folder_view_background: #ffffff;
  39. --folder_view_share: #24cc29;
  40. --fileobject_background_hover: #f2f2f2;
  41. --fileobject_background_selected: #d2f2f7;
  42. --fileobject_text_selected: black;
  43. --address_text_border:#cfcfcf;
  44. --address_text_background: white;
  45. --popup_bg: white;
  46. --popup_border: rgb(226, 226, 226);
  47. --popup_header_bg: #171719;
  48. --popup_header_txt: white;
  49. --popup_header_bottom: #34b7eb;
  50. --popup_btn_border: #dedede;
  51. --popup_btn_hover: rgba(238, 238, 238, 0.932);
  52. --popup_btn_primary_bg: #51aded;
  53. --popup_btn_primary_txt: white;
  54. --popup_btn_primary_bg_hover: #76c0f5;
  55. --popup_btn_negative_bg: #ed5151;
  56. --popup_btn_negative_txt: white;
  57. --popup_btn_negative_bg_hover: #f57676;
  58. --modulelist_bg: white;
  59. --contextmenu_background: #ffffff;
  60. --contextmenu_hover: #f9f9f9;
  61. --contextmenu_textcolor: rgb(78, 78, 78);
  62. --upload_progressbar: #92cfe7;
  63. --upload_progresstext: rgb(255, 255, 255);
  64. --upload_progress_succ: #8cd68f;
  65. --upload_progress_failed: #d68c8c;
  66. --open_with_selected: #51aded;
  67. --open_with_selected_text: white;
  68. --open_with_item_hover_background:rgba(35,35,35,0.14);
  69. --popup_wrapper_background: rgba(27,27,27,0.5);
  70. --code_bg: #f7f7f9;
  71. --code_txt: #bd4147;
  72. --uploadtab_bg: #f5f5f5;
  73. --uploadtab_txt: rgb(78, 78, 78);
  74. --upload_bg: #ffffff;
  75. }
  76. body.darkTheme{
  77. /*
  78. Legacy variable set, re-sampled to match the palette in
  79. shared/fs-theme.css so the parts of the UI that still read these
  80. (popups, upload tab, context menu, file object rows) sit in the same
  81. colour family as everything already ported to the --fs-* tokens.
  82. */
  83. /* ao.css's own dark values are a neutral grey; pull them onto the sampled
  84. palette so semantic-ui widgets inside this app match the rest of it. */
  85. --body_background: var(--fs-bg);
  86. --body_text: var(--fs-text);
  87. --text_color: var(--fs-text);
  88. --text_color_secondary: var(--fs-text-dim);
  89. --fileopr_btnTxt: #e6e9ee;
  90. --fileopr_oprtxt: #c7ced7;
  91. --fileopr_btnhover: #2a3039;
  92. --divider: #272c34;
  93. /* Surfaces come from the sampled tokens, not ao.css's --body_background_*.
  94. Those resolve to a neutral grey that is lighter than the file area, which
  95. inverts the mockup's depth order (content darkest, chrome above it). */
  96. --navi_bgcolor: var(--fs-bg);
  97. --navi_theme: var(--theme_color, #272c34);
  98. --navi_theme_multiselect: #4a9eff;
  99. --navi_txt: #c7ced7;
  100. --dropdown_bg: #1c2129;
  101. --dropdown_txt: #e6e9ee;
  102. --vroot_active_bg: #262b33;
  103. --dir_item_color: #c7ced7;
  104. --text_active: #4a9eff;
  105. --dir_bg: #14181d;
  106. --dir_txt: #e6e9ee;
  107. --dir_border: #272c34;
  108. --dir_hover_text: #9aa3ae;
  109. --dir_hover_background: #1f242c;
  110. --dir_hover_active: #1e2d40;
  111. --normal_object_txt: #e6e9ee;
  112. --hex_folder_txt: #5fd48b;
  113. --um_file_txt: #7db8ff;
  114. --folder_view_background: var(--fs-content-bg);
  115. --folder_view_share: #3ecf6d;
  116. --fileobject_background_hover: #1f242c;
  117. --fileobject_background_selected: #17293f;
  118. --fileobject_text_selected: #e6e9ee;
  119. --address_text_border: #272c34;
  120. --address_text_background: #1c2129;
  121. --popup_bg: #1c2129;
  122. --popup_border: #272c34;
  123. --popup_header_bg: #12161b;
  124. --popup_header_txt: #e6e9ee;
  125. --popup_header_bottom: #4a9eff;
  126. --popup_btn_border: #323945;
  127. --popup_btn_hover: #2a3039;
  128. --popup_btn_primary_bg: #4a9eff;
  129. --popup_btn_primary_txt: #0d1014;
  130. --popup_btn_primary_bg_hover: #6bb0ff;
  131. --popup_btn_negative_bg: #e5484d;
  132. --popup_btn_negative_txt: #ffffff;
  133. --popup_btn_negative_bg_hover: #f06a6e;
  134. --modulelist_bg: transparent;
  135. --modulelist_hover: rgba(122, 138, 160, 0.18);
  136. --contextmenu_background: #1c2129;
  137. --contextmenu_hover: #2a3039;
  138. --contextmenu_textcolor: #e6e9ee;
  139. --upload_progressbar: #4a9eff;
  140. --upload_progresstext: #0d1014;
  141. --upload_progress_succ: #3ecf6d;
  142. --upload_progress_failed: #e5484d;
  143. --open_with_selected: #1e3450;
  144. --open_with_selected_text: #e6e9ee;
  145. --open_with_item_hover_background: rgba(122, 138, 160, 0.16);
  146. --popup_wrapper_background: rgba(8, 10, 13, 0.62);
  147. --code_bg: #12161b;
  148. --code_txt: #ff8f93;
  149. --uploadtab_bg: #16191f;
  150. --uploadtab_txt: #e6e9ee;
  151. --upload_bg: #1c2129;
  152. }
  153. body{
  154. color:var(--body_text);
  155. background-color:var(--body_background);
  156. height:100%;
  157. overflow: hidden;
  158. }
  159. h1, h2, h3, p, span, div, input, .dropdown { font-family: "Microsoft JhengHei","SimHei", "Apple LiGothic Medium", "STHeiti"}
  160. html{
  161. height:100%;
  162. overflow:hidden;
  163. }
  164. /* force override of semantic button rule */
  165. body.darkTheme .ui.icon.button{
  166. color: var(--text_color) !important;
  167. }
  168. /*
  169. Navigation Bar
  170. The top bar of the interface
  171. see subparts for more detail configs
  172. */
  173. .navibar{
  174. width:100%;
  175. padding-left:12px;
  176. padding-right:12px;
  177. padding-top:6px;
  178. padding-bottom:3px;
  179. z-index: 99;
  180. background-color:var(--navi_bgcolor);
  181. border-bottom:2px solid var(--navi_theme);
  182. }
  183. .navibar.ctrl{
  184. border-bottom:2px solid var(--navi_theme_multiselect);
  185. }
  186. .navibar.mobile{
  187. padding-top: 0;
  188. }
  189. .button.standard{
  190. box-shadow: 0 1px 1px 0px rgb(190, 190, 190);
  191. border: 0px;
  192. }
  193. .button.standard:hover{
  194. background-color:#82c2f0 !important;
  195. color:white !important;
  196. }
  197. /*
  198. File operation bar
  199. */
  200. .navibar .fileOprBtn{
  201. vertical-align: top;
  202. border: 1px solid transparent;
  203. cursor: pointer;
  204. background-color: transparent;
  205. text-align: center;
  206. padding-bottom: 0.4em;
  207. padding-top: 0.5em;
  208. border-radius: 0.4em;
  209. }
  210. .navibar .fileOprBtn:hover{
  211. border: 1px solid var(--fileopr_btnhover);
  212. opacity: 0.8;
  213. }
  214. .navibar .fileOprBtn .opricon{
  215. width: 46px;
  216. }
  217. .navibar .fileOprBtn .oprtxt{
  218. color:var(--fileopr_oprtxt);
  219. }
  220. .navibar .twolines.fileOprBtn{
  221. padding-top: 0.1em;
  222. padding-bottom: 0.1em;
  223. }
  224. .navibar .twolines.fileOprBtn .opricon{
  225. width: 40px;
  226. }
  227. .navibar .twolines.fileOprBtn .oprtxt{
  228. font-size: 1em;
  229. }
  230. .navibar.mobile .fileOprBtn{
  231. padding-bottom: 0.4em;
  232. padding-top: 0.2em;
  233. border-radius: 0.4em;
  234. }
  235. .navibar.mobile .fileOprBtn .opricon{
  236. width: 36px;
  237. }
  238. .navibar.mobile .twolines.fileOprBtn .opricon{
  239. width: 28px;
  240. }
  241. .navibar.mobile .twolines.fileOprBtn .oprtxt{
  242. font-size: 0.7em;
  243. }
  244. .navibar .fileoprSmallBtn{
  245. cursor: pointer;
  246. border: 1px solid transparent;
  247. color:var(--navi_txt);
  248. background-color: transparent;
  249. padding: 0.3em;
  250. width: fit-content;
  251. text-align: left;
  252. }
  253. .navibar .fileoprSmallBtn:hover{
  254. opacity: 0.8;
  255. border: 1px solid var(--divider);
  256. border-radius: 0.4em;
  257. }
  258. .navibar.mobile .fileoprSmallBtn{
  259. font-size: 0.9em;
  260. padding: 0.2em;
  261. }
  262. .navibar .fileoprGroupDivider{
  263. padding-right: 0.2em;
  264. margin-right: 0.2em;
  265. border-right: 1px solid var(--divider);
  266. height: 80px;
  267. }
  268. .navibar.mobile .fileoprGroupDivider{
  269. height: 64px;
  270. }
  271. .ui.selection.dropdown{
  272. background-color: var(--dropdown_bg) !important;
  273. color: var(--dropdown_txt) !important;
  274. min-width: 11.5em !important;
  275. }
  276. /* special case when using in mobile sidebar */
  277. #mobileSortDropdown .ui.selection.dropdown{
  278. width: 100%;
  279. border-radius: 0;
  280. padding: 1em;
  281. }
  282. .ui.selection.dropdown .menu > .item{
  283. border-top-color:var(--divider);
  284. background-color: var(--dropdown_bg) !important;
  285. color: var(--dropdown_txt) !important;
  286. }
  287. .ui.selection.active.dropdown .menu{
  288. border: 1px solid var(--divider) !important;
  289. }
  290. .ui.selection.visible.dropdown > .text:not(.default){
  291. color: var(--text_color_secondary) !important;
  292. }
  293. /* Mobile interface */
  294. .fileoprBtnMobile{
  295. position: relative;
  296. width: 100%;
  297. background-color: none;
  298. padding: 0.5em;
  299. padding-left: 1em;
  300. cursor: pointer;
  301. }
  302. #mobileNaviBar{
  303. height: 100vh !important;
  304. overflow-y: auto !important;
  305. }
  306. #mobileNaviBar .fileoprBtnMobile{
  307. border-bottom: 1px solid var(--divider);
  308. }
  309. .fileoprBtnMobile:hover{
  310. background-color: var(--popup_btn_hover) !important;
  311. }
  312. .fileoprBtnMobile .opricon{
  313. width: 30px;
  314. display: inline-block;
  315. vertical-align: middle;
  316. margin-right: 0.4em;
  317. }
  318. .fileoprBtnMobile p{
  319. display: inline-block;
  320. vertical-align: middle;
  321. }
  322. .fileoprSmallBtnMobile{
  323. cursor: pointer;
  324. border: 1px solid transparent;
  325. color:var(--navi_txt);
  326. background-color: transparent;
  327. padding: 0.5em;
  328. padding-left: 1em;
  329. width: 100%;
  330. text-align: left;
  331. }
  332. #mobileNaviBar .fileoprSmallBtnMobile{
  333. border-bottom: 1px solid var(--divider);
  334. }
  335. .fileoprSmallBtnMobile:hover{
  336. background-color: var(--popup_btn_hover) !important;
  337. }
  338. /*
  339. Address and search bar
  340. */
  341. .navibarBtn{
  342. cursor: pointer;
  343. border: 1px solid transparent;
  344. color:var(--navi_txt);
  345. background-color: transparent;
  346. padding: 0.3em;
  347. display: inline-block;
  348. border-radius: 0.4em;
  349. padding-right: 0.1em;
  350. padding-bottom: 0.4em;
  351. margin-left: 0.2em;
  352. }
  353. .navibarBtn:hover{
  354. opacity: 0.8;
  355. border: 1px solid var(--divider);
  356. }
  357. .navibarBtn.disabled{
  358. pointer-events: none;
  359. opacity: 0.5;
  360. user-select: none;
  361. }
  362. /* Special button for switching over to dark theme*/
  363. .navibarBtn.DarkThemeToggle.inverted{
  364. color:var(--dark_theme_toggle_text);
  365. background-color: var(--dark_theme_toggle);
  366. }
  367. .navibarBtn.DarkThemeToggle{
  368. color: var(--white_theme_toggle_text);
  369. background-color: var(--white_theme_toggle);
  370. }
  371. .navibarBtn.DarkThemeToggle:hover{
  372. border: 1px solid transparent;
  373. }
  374. .navibarBtn:hover{
  375. opacity: 0.8;
  376. }
  377. /* View mode buttons */
  378. .videmode.button{
  379. color:var(--navi_txt) !important;
  380. background-color: transparent;
  381. }
  382. .videmode.button:hover{
  383. background-color: transparent;
  384. opacity: 0.8;
  385. }
  386. .videmode.button:focus:not(#togglePropertiesViewBtn){
  387. background-color: transparent !important;
  388. }
  389. .addressBar{
  390. border-top: 1px solid var(--divider);
  391. width:100%;
  392. padding: 0.4em;
  393. padding-left: 0;
  394. padding-right: 0;
  395. padding-top: 0.6em;
  396. min-height: 35px;
  397. margin-top:0.4em;
  398. vertical-align: top;
  399. display: flex;
  400. position: relative;
  401. }
  402. .addressBar .divider{
  403. color: var(--text_color_secondary) !important;
  404. }
  405. #pathDisplayField{
  406. margin-left: 0.4em !important;
  407. }
  408. .addressText{
  409. padding:5px;
  410. border-radius: 0.4em;
  411. border: 1px solid var(--address_text_border);
  412. flex-grow: 1;
  413. background-color: var(--address_text_background);
  414. }
  415. #pathInputField{
  416. margin-left: 0.4em !important;
  417. font-size: 1rem;
  418. height: 27px;
  419. width: 100%;
  420. }
  421. #pathInputField input{
  422. background-color: var(--address_text_background);
  423. color: var(--text_color);
  424. }
  425. .selectable{
  426. cursor:pointer;
  427. }
  428. .viewportBtns.mobile{
  429. order: 2;
  430. margin-left: auto !important;
  431. height: 30px;
  432. border-right: none;
  433. margin-top: -10px;
  434. }
  435. /* Mobile file operation menus */
  436. .mobileFileOprMenu{
  437. position: fixed;
  438. top: 0.6em;
  439. right: 0.6em;
  440. background-color: var(--navi_bgcolor);
  441. border: none;
  442. color: var(--text_color);
  443. cursor: pointer;
  444. width: 50px;
  445. height: 50px;
  446. padding-top: 4px;
  447. padding-left: 10px;
  448. border-radius: 0.4em;
  449. }
  450. .mobileFileOprMenu:hover{
  451. opacity: 0.8;
  452. }
  453. .mobileFileOprMenuToggle{
  454. padding: 1em;
  455. border: 0px solid transparent;
  456. color: var(--text_color);
  457. border-bottom:2px solid var(--navi_theme);
  458. text-align: right;
  459. cursor: pointer;
  460. }
  461. .mobileFileOprMenuToggle .logo{
  462. position: absolute;
  463. top: 0.8em;
  464. left: 0.5em;
  465. width: 100px;
  466. opacity: 0.6;
  467. }
  468. /*
  469. Search bar
  470. */
  471. .searchbar{
  472. width:100%;
  473. padding: 0.4em;
  474. padding-left: 0;
  475. padding-right: 0;
  476. min-height: 35px;
  477. margin-top:0.4em;
  478. vertical-align: top;
  479. display: flex;
  480. align-items: center;
  481. }
  482. .searchbar .searInputBar{
  483. flex-grow: 1;
  484. }
  485. .searchbar .navibarBtn.active{
  486. color: var(--text_active);
  487. font-weight: bold;
  488. }
  489. /*
  490. Main Window scalling
  491. */
  492. #mainWindow{
  493. display: flex;
  494. align-items:flex-start;
  495. }
  496. /*
  497. Directory Sidebar
  498. */
  499. #directorySidebar{
  500. padding-top:1em;
  501. padding-bottom: 1em;
  502. overflow-y:auto;
  503. padding-bottom:20px;
  504. border-right:2px solid var(--dir_border);
  505. background-color:var(--dir_bg);
  506. color:var(--dir_txt);
  507. width: 250px;
  508. min-width: 250px;
  509. scrollbar-width: thin;
  510. }
  511. .rightmargin.icon{
  512. margin-right:8px !important;
  513. }
  514. .dir{
  515. cursor:pointer;
  516. }
  517. .dir:not(.active):hover{
  518. color: var(--dir_hover_text) !important;
  519. }
  520. .dir.active:hover{
  521. background-color:var(--dir_hover_active);
  522. }
  523. .dir.item{
  524. padding-top: 0.4em !important;
  525. padding-bottom: 0.4em !important;
  526. padding-left: 1.4em !important;
  527. padding-right: 1.4em !important;
  528. color:var(--dir_item_color);
  529. }
  530. .vroot.active{
  531. background-color: var(--vroot_active_bg);
  532. }
  533. #selectInfo{
  534. padding-left: 1.2em;
  535. padding-right: 1.2em;
  536. color: var(--text_color_secondary);
  537. }
  538. .mobilePathDisplayWrapper{
  539. width:100%;
  540. margin-bottom:5px;
  541. }
  542. #mobilePathDisplay .divider{
  543. color: var(--text_color_secondary) !important;
  544. }
  545. .pathDisplay{
  546. cursor: text;
  547. overflow:hidden;
  548. white-space: nowrap;
  549. text-align: left;
  550. }
  551. .measure {
  552. position: absolute;
  553. visibility: hidden;
  554. left: -1000px;
  555. top: -1000px;
  556. }
  557. /*
  558. Folder Viewer (Main viewer)
  559. */
  560. #folderView{
  561. flex-grow:1;
  562. padding-left:2em;
  563. padding-right:2em;
  564. padding-top:2em;
  565. overflow-y:auto;
  566. background-color: var(--folder_view_background);
  567. scrollbar-width: thin;
  568. }
  569. #folderList{
  570. margin-bottom:1em;
  571. }
  572. .fileviewList{
  573. position: relative;
  574. }
  575. /* Common spacing for list view and grid view */
  576. .fileviewList .fileObject.item,.fileviewList .fileObject.card{
  577. display:block !important;
  578. cursor:pointer;
  579. overflow-wrap: break-word !important;
  580. user-select: none;
  581. border: 1px solid var(--divider);
  582. }
  583. .fileviewList .fileObject.item:hover,.fileviewList .fileObject.card:hover{
  584. background-color: var(--fileobject_background_hover) !important;
  585. }
  586. .fileviewList .fileObject.item.selected, .fileviewList .fileObject.card.selected{
  587. background-color: var(--fileobject_background_selected) !important;
  588. color: var(--fileobject_text_selected) !important;
  589. }
  590. /* Filelist in list mode */
  591. .fileviewList .fileObject.item{
  592. padding: 0.8em;
  593. padding-left: 1.2em;
  594. padding-right: 1em;
  595. }
  596. .fileviewList .fileObject.item:first-child{
  597. border-top-left-radius: 0.4em;
  598. border-top-right-radius: 0.4em;
  599. }
  600. .fileviewList .fileObject.item:last-child{
  601. border-bottom-left-radius: 0.4em;
  602. border-bottom-right-radius: 0.4em;
  603. }
  604. .fileviewList .fileObject.item.selected.renaming{
  605. padding-top: 0.6em !important;
  606. padding-bottom: 0.6em !important;
  607. }
  608. .fileviewList .fileObject.item:not(:first-child) {
  609. border-top: 0;
  610. }
  611. /* Filelist in grid mode.
  612. Width is set by the status bar zoom slider (--fm-tile / inline style), so the
  613. old fixed 148px !important is gone - it silently defeated the slider. */
  614. .fileviewList .fileObject.card{
  615. border-radius: 0.4em;
  616. position: relative;
  617. margin-bottom: 1em;
  618. }
  619. /*
  620. Grid tiles are square at every width. aspect-ratio keeps the box square so
  621. the responsive breakpoint no longer has to fight fixed pixel sizes.
  622. Icons use contain so they are never distorted; a real thumbnail (marked by
  623. .hasThumbnail from thumbnail.js) uses cover so it fills the square instead
  624. of letterboxing.
  625. */
  626. .fileviewList .fileObject.card img{
  627. width: 100%;
  628. max-width: 148px;
  629. aspect-ratio: 1 / 1;
  630. height: auto;
  631. object-fit: contain;
  632. }
  633. .fileviewList .fileObject.card.hasThumbnail img{
  634. object-fit: cover;
  635. object-position: center top;
  636. }
  637. .fileviewList .fileObject.card .content{
  638. padding-left: 1em;
  639. padding-right: 1em;
  640. padding-top: 1em;
  641. padding-bottom: 0.4em;
  642. }
  643. /* Share icon overlay for card view */
  644. .fileviewList .fileObject.card .image{
  645. position: relative;
  646. }
  647. .fileviewList .fileObject.card .shareOverlay.visible{
  648. position: absolute;
  649. bottom: 0.4em;
  650. left: 0.4em;
  651. padding-top: 4px;
  652. background-color: var(--navi_bgcolor);
  653. height: 28px;
  654. width: 28px;
  655. border-radius: 0.4em;
  656. border: 1px solid var(--divider);
  657. box-shadow: 3px 1px 5px 1px rgba(158,158,158,0.2);
  658. opacity: 0.9;
  659. }
  660. .fileviewList .fileObject.card .content .header{
  661. font-size: 1.2em;
  662. font-weight: 500;
  663. color: var(--text_color);
  664. }
  665. .fileviewList .fileObject.card .content .meta{
  666. font-size: 0.9em;
  667. color: var(--text_color_secondary);
  668. }
  669. .fileviewList .fileObject.card .content .description{
  670. font-size: 1em;
  671. color: var(--text_color);
  672. position: absolute;
  673. bottom: 1em;
  674. left: 1em;
  675. }
  676. /* fileview in detail mode */
  677. .fileviewList .fileObject.details{
  678. cursor:pointer;
  679. user-select: none;
  680. border: 1px solid var(--divider);
  681. color: var(--text_color);
  682. }
  683. .fileviewList .fileObject.details:hover{
  684. background-color:var(--fileobject_background_hover) !important;
  685. }
  686. .fileviewList .fileObject.details.selected{
  687. background-color:var(--fileobject_background_selected) !important;
  688. }
  689. #folderView th{
  690. color: var(--text_color);
  691. }
  692. .fileviewList .fileObject.details.selected.renaming td:first-child{
  693. padding: inherit;
  694. }
  695. .fileviewList .detailTableContent tr td:first-child{
  696. padding-left: 1em !important;
  697. }
  698. .fileviewList .fileObject.details .light-text{
  699. color: var(--text_color_secondary);
  700. }
  701. /* Share button */
  702. .sharebtn{
  703. cursor: pointer;
  704. border: 1px solid transparent;
  705. background-color: transparent;
  706. color: var(--folder_view_share);
  707. margin-left: 4px;
  708. margin-top: 1px;
  709. }
  710. /* Handle specific Chrome bug in rendering the share icon */
  711. @media screen and (-webkit-min-device-pixel-ratio:0)
  712. and (min-resolution:.001dpcm) {
  713. .sharebtn{
  714. padding: 0 !important;
  715. }
  716. }
  717. .sharebtn:hover{
  718. opacity: 0.5;
  719. }
  720. /*
  721. Properties View
  722. */
  723. #propertiesView{
  724. width: 300px;
  725. min-width: 300px;
  726. padding: 1em;
  727. overflow-y: auto;
  728. scrollbar-width: thin;
  729. color: var(--text_color);
  730. border-left: 1px solid var(--divider);
  731. background-color: var(--folder_view_background);
  732. }
  733. #propertiesView td, #propertiesView span, #propertiesView div{
  734. color: var(--text_color);
  735. }
  736. /*
  737. Context Menu
  738. This is a complete rewrite / re-implement of the
  739. ts contextmenu after migration
  740. */
  741. /*
  742. Styled to match the .fsMenu component in shared/fs-components.css so the
  743. right click menu, the "..." menu and the sort menu all read as the same
  744. control: rounded card, inset rows that round on hover, and icons a step
  745. dimmer than the label text.
  746. */
  747. .contextmenu{
  748. position: fixed;
  749. display: none;
  750. width: 200px;
  751. padding: 6px;
  752. background-color: var(--contextmenu_background);
  753. border: 1px solid var(--divider);
  754. border-radius: 10px;
  755. -webkit-box-shadow: 0px 8px 28px var(--fs-shadow);
  756. -moz-box-shadow: 0px 8px 28px var(--fs-shadow);
  757. box-shadow: 0px 8px 28px var(--fs-shadow);
  758. z-index: 999;
  759. }
  760. .contextmenu.visible{
  761. display: block;
  762. }
  763. .contextmenu .item{
  764. display: flex;
  765. align-items: center;
  766. gap: 10px;
  767. padding: 7px 10px;
  768. border-radius: 6px;
  769. cursor: pointer;
  770. font-size: 13.5px;
  771. white-space: nowrap;
  772. color: var(--contextmenu_textcolor);
  773. }
  774. .contextmenu .item:hover{
  775. background-color: var(--contextmenu_hover);
  776. }
  777. /*
  778. The rows carry semantic-ui font icons. Their default em based width and
  779. right margin fight the flex gap, so pin them to a fixed box instead.
  780. The colour needs !important: ao.css styles every <i> and <span> under a
  781. themed body with a blanket rule whose :not() chain scores higher than any
  782. reasonable selector here, so it would otherwise repaint the icons to the
  783. same colour as the label and flatten the two-tone look.
  784. */
  785. .contextmenu .item > i.icon{
  786. width: 16px;
  787. min-width: 16px;
  788. height: auto;
  789. margin: 0px;
  790. font-size: 14px;
  791. text-align: center;
  792. color: var(--fs-icon) !important;
  793. opacity: 1;
  794. }
  795. /* Keyboard hint, pushed to the trailing edge */
  796. .contextmenu .description{
  797. margin-left: auto;
  798. padding-left: 18px;
  799. color: var(--fs-text-faint) !important;
  800. font-size: 12px;
  801. }
  802. .contextmenu .divider{
  803. width: auto;
  804. height: 1px;
  805. margin: 5px 4px;
  806. background-color: var(--fs-line-soft);
  807. border-bottom: 0px;
  808. }
  809. /*
  810. Message box and popups
  811. */
  812. .msgbox{
  813. position: absolute;
  814. bottom: 0;
  815. left: 3em;
  816. width: 20em;
  817. padding: 1.2em;
  818. padding-right: 2em;
  819. background-color: var(--navi_bgcolor);
  820. border-top-right-radius: 0.4em;
  821. border-top-left-radius: 0.4em;
  822. border: 1px solid var(--divider) !important;
  823. color: var(--text_color);
  824. }
  825. .closeMsgButton{
  826. position:absolute;
  827. top:8px;
  828. right:12px;
  829. }
  830. .closeMsgButton{
  831. cursor:pointer;
  832. }
  833. .popup{
  834. position:fixed;
  835. top:0;
  836. z-index:200;
  837. right:0;
  838. bottom:30px;
  839. padding-bottom:24px;
  840. border: 0px solid transparent !important;
  841. width: 30em;
  842. height: 100%;
  843. max-width: 100%;
  844. border: 1px solid var(--popup_border);
  845. background-color:var(--popup_bg);
  846. }
  847. .popup.wide{
  848. width: 60em;
  849. }
  850. .popupheader{
  851. width:100%;
  852. padding:3px;
  853. padding-left:12px;
  854. border-bottom:2px solid var(--popup_header_bottom);
  855. background-color: var(--popup_header_bg);
  856. color: var(--popup_header_txt);
  857. height:29px;
  858. }
  859. .popupcontent{
  860. height: calc(100% - 29px);
  861. overflow:auto;
  862. }
  863. .popupcloser{
  864. position:absolute;
  865. top:5px;
  866. right:0px;
  867. font-size: 120%;
  868. cursor:pointer;
  869. }
  870. .popupbuttons{
  871. cursor:pointer;
  872. padding:5px;
  873. padding-left:12px;
  874. margin-bottom:4px;
  875. border: 1px solid var(--popup_btn_border);
  876. border-radius: 4px;
  877. }
  878. .popupbuttons.primary{
  879. background-color:var(--popup_btn_primary_bg);
  880. border: 1px solid transparent;
  881. color:var(--popup_btn_primary_txt);
  882. }
  883. .popupbuttons.negative{
  884. background-color:var(--popup_btn_negative_bg);
  885. border: 1px solid transparent;
  886. color:var(--popup_btn_negative_txt);
  887. }
  888. .popupbuttons.disabled{
  889. opacity: 0.4;
  890. pointer-events: none;
  891. }
  892. .popupbuttons.primary.disabled{
  893. opacity: 0.4;
  894. pointer-events: none;
  895. }
  896. /* Rename dialog */
  897. .renameinput input{
  898. box-shadow: none;
  899. border: 1px solid var(--divider);
  900. padding-left: 0.4em;
  901. padding-right: 0.4em;
  902. padding-top: 0.2em;
  903. padding-bottom: 0.2em;
  904. width: 100%;
  905. }
  906. .renameinput input:focus {
  907. outline: none !important;
  908. border: 1px solid var(--navi_theme);
  909. }
  910. .allowHover:hover{
  911. background-color:var(--popup_btn_hover);
  912. }
  913. .allowHover.primary:hover{
  914. background-color:var(--popup_btn_primary_bg_hover);
  915. }
  916. .allowHover.negative:hover{
  917. background-color:var(--popup_btn_negative_bg_hover);
  918. }
  919. .newFileFormat{
  920. cursor:pointer;
  921. }
  922. .popupWrapper{
  923. position:fixed;
  924. top:0px;
  925. left:0px;
  926. width:100%;
  927. height:100%;
  928. z-index:199;
  929. background-color: var(--popup_wrapper_background);
  930. display:none;
  931. }
  932. @supports (backdrop-filter: none) {
  933. .popupWrapper {
  934. backdrop-filter: blur(5px);
  935. }
  936. }
  937. #openWithModuleList{
  938. height:50vh;
  939. overflow-y:auto;
  940. background-color: var(--modulelist_bg);
  941. border: 1px solid var(--divider);
  942. border-radius: 0;
  943. }
  944. #openWithModuleList .ui.avatar.image, #openWithModuleList .ui.avatar.image img, #openWithModuleList .ui.avatar.image svg, #openWithModuleList .ui.avatar.images .image, #openWithModuleList .ui.avatar.images img, #openWithModuleList .ui.avatar.images svg{
  945. border-radius: 0;
  946. }
  947. #openWithModuleList .item{
  948. padding:8px;
  949. padding-left:22px;
  950. border-radius: 2px;
  951. display: flex;
  952. flex-wrap: wrap;
  953. }
  954. #openWithModuleList .item:hover{
  955. background-color: var(--modulelist_hover) !important;
  956. }
  957. #openWithModuleList .item.selected{
  958. background-color: var(--open_with_selected) !important;
  959. color:var(--open_with_selected_text);
  960. }
  961. #openWithModuleList .item.selectable:hover{
  962. background-color:var(--open_with_item_hover_background);
  963. }
  964. /*
  965. New Item List
  966. */
  967. .newfilelist{
  968. border: 1px solid var(--divider);
  969. border-radius: 0.4em;
  970. margin-bottom: 0.6em;
  971. }
  972. .newfilelist .item{
  973. padding: 0.6em;
  974. }
  975. .newfilelist .item:not(:last-child){
  976. border-bottom: 1px solid var(--divider);
  977. }
  978. .newfilelist .item.selected{
  979. background-color: var(--open_with_selected) !important;
  980. color:var(--open_with_selected_text);
  981. }
  982. /*
  983. Upload Related
  984. */
  985. #uploadTab{
  986. position:fixed;
  987. right:0px;
  988. bottom: 0px;
  989. width:300px;
  990. margin-bottom:0px !important;
  991. padding:0px !important;
  992. background-color: var(--upload_bg) !important;
  993. overflow-x: hidden;
  994. }
  995. .statusBar{
  996. height:32px;
  997. background-color:var(--uploadtab_bg);
  998. padding:8px;
  999. }
  1000. .statusBar{
  1001. color:var(--uploadtab_txt);
  1002. }
  1003. .hideUploadButton{
  1004. float: right;
  1005. cursor:pointer;
  1006. }
  1007. .uploadList{
  1008. margin:8px;
  1009. padding-bottom:3px;
  1010. margin-bottom:0px;
  1011. max-height: 250px;
  1012. overflow-y:auto;
  1013. }
  1014. .uploadTask{
  1015. margin-top:6px;
  1016. position: relative;
  1017. }
  1018. .uploadTaskRemoveIcon{
  1019. position:absolute;
  1020. top:0px;
  1021. right:0px;
  1022. cursor:pointer;
  1023. }
  1024. .saving {
  1025. -moz-animation: saving 3s ease-out;
  1026. -moz-animation-iteration-count: infinite;
  1027. -webkit-animation: saving 3s ease-out;
  1028. -webkit-animation-iteration-count: infinite;
  1029. -ms-animation: saving 3s ease-out;
  1030. -ms-animation-iteration-count: infinite;
  1031. }
  1032. @keyframes saving {
  1033. 0% { opacity: 0.6; }
  1034. 50% { opacity: 1; }
  1035. 100% { opacity: 0.6; }
  1036. }
  1037. @-webkit-keyframes saving {
  1038. 0% { opacity: 0.6; }
  1039. 50% { opacity: 1; }
  1040. 100% { opacity: 0.6; }
  1041. }
  1042. @-moz-keyframes saving {
  1043. 0% { opacity: 0.6; }
  1044. 50% { opacity: 1; }
  1045. 100% { opacity: 0.6; }
  1046. }
  1047. @-ms-keyframes saving {
  1048. 0% { opacity: 0.3; }
  1049. 50% { opacity: 1; }
  1050. 100% { opacity: 0.3; }
  1051. }
  1052. .clearallButton{
  1053. padding:8px;
  1054. cursor:pointer;
  1055. }
  1056. .themed.progress .bar{
  1057. background-color: var(--upload_progressbar);
  1058. }
  1059. .themed.progress .percentage{
  1060. color: var(--upload_progresstext) !important;
  1061. }
  1062. .success.progress .bar{
  1063. background-color: var(--upload_progress_succ);
  1064. }
  1065. .error.progress .bar{
  1066. background-color: var(--upload_progress_failed);
  1067. }
  1068. .ui.progress{
  1069. margin-bottom: 1em !important;
  1070. }
  1071. /*
  1072. Special message or exceptions
  1073. */
  1074. .ui.themed.header{
  1075. color: var(--text_color);
  1076. }
  1077. .ui.themed.header .sub.header{
  1078. color: var(--text_color_secondary);
  1079. }
  1080. code{
  1081. background-color: var(--code_bg);
  1082. color: var(--code_txt);
  1083. line-height: 2.5;
  1084. padding: 0.1em;
  1085. padding-left: 0.4em;
  1086. padding-right: 0.4em;
  1087. border-radius: 0.2em;
  1088. }
  1089. /*
  1090. Legacy supports (Deprecated)
  1091. */
  1092. .normal.object{
  1093. color:var(--normal_object_txt);
  1094. }
  1095. .hex.foldername{
  1096. color: var(--hex_folder_txt) !important;
  1097. }
  1098. .um.filename{
  1099. color: var(--um_file_txt) !important;
  1100. }
  1101. /*
  1102. Hot Search Related
  1103. */
  1104. i.blue{
  1105. color: #345eeb;
  1106. }
  1107. .fileObject.hotSearchHighlight{
  1108. background-color: #d2f2f7 !important;
  1109. }
  1110. /*
  1111. Responsive
  1112. */
  1113. @media (max-width:1035px) {
  1114. .viewportBtns{
  1115. display: block;
  1116. float: right;
  1117. }
  1118. }
  1119. @media (max-width:840px) {
  1120. .viewportBtns{
  1121. float: none;
  1122. }
  1123. .tabletAndDesktopOnly{
  1124. display:none !important;
  1125. }
  1126. .mobileFileOprMenu{
  1127. display:block !important;
  1128. }
  1129. .navibar.mobile .fileOprBtn{
  1130. padding-top: 0.1em;
  1131. padding-bottom: 0em;
  1132. }
  1133. .navibar.mobile .twolines.fileOprBtn{
  1134. padding-top: 0.1em;
  1135. padding-bottom: 0em;
  1136. }
  1137. .navibar.mobile .twolines.fileOprBtn .opricon{
  1138. width: 36px;
  1139. }
  1140. .navibar.mobile .twolines.fileOprBtn .oprtxt{
  1141. display:none !important;
  1142. }
  1143. .navibar.mobile .wideScreenOnly{
  1144. display:none;
  1145. }
  1146. .navibar.mobile .fileoprGroupDivider{
  1147. height: 42px;
  1148. }
  1149. .mobileFileOprMenu{
  1150. top: 0;
  1151. right: 0.4em;
  1152. margin-top: -0.2em;
  1153. }
  1154. }
  1155. @media (max-width:620px) {
  1156. #pathInputField{
  1157. width: 100%;
  1158. }
  1159. #pathInputField input{
  1160. margin-left: 0;
  1161. }
  1162. .ui.selection.dropdown{
  1163. min-width: 8em;
  1164. }
  1165. /*Directory sidebar, full width */
  1166. #directorySidebar{
  1167. width: 100%;
  1168. min-width: 100%;
  1169. }
  1170. /* grid mode preview */
  1171. .fileviewList .fileObject.card{
  1172. border-radius: 0.4em;
  1173. position: relative;
  1174. margin-bottom:1em;
  1175. width: calc(33% - 4px) !important;
  1176. min-width: 100px;
  1177. max-width: 148px;
  1178. }
  1179. /* aspect-ratio above already keeps this square; only the cap needs lifting */
  1180. .fileviewList .fileObject.card img{
  1181. max-width: none;
  1182. }
  1183. /* Properties view, disable function in small display size*/
  1184. #propertiesView{
  1185. display:none !important;
  1186. }
  1187. #togglePropertiesViewBtn{
  1188. display:none !important;
  1189. }
  1190. /* popups */
  1191. .popup{
  1192. top: 5em;
  1193. bottom: 5em;
  1194. width:100%;
  1195. height: auto;
  1196. }
  1197. /* msgbox */
  1198. .msgbox{
  1199. left: 0.4em;
  1200. border: 0px solid transparent;
  1201. }
  1202. }
  1203. @media (max-width:450px) {
  1204. .viewportBtns{
  1205. float: right;
  1206. }
  1207. }
  1208. /* ======================================================================
  1209. Redesigned navigation row and sidebar (Phase 2.3 / 2.4)
  1210. Colours come from shared/fs-theme.css, components from
  1211. shared/fs-components.css. Only layout lives here.
  1212. ====================================================================== */
  1213. .navibar {
  1214. padding: 0 !important;
  1215. height: auto !important;
  1216. }
  1217. .fmNav {
  1218. display: flex;
  1219. align-items: center;
  1220. gap: 8px;
  1221. padding: 8px 12px;
  1222. position: relative;
  1223. background: var(--fs-bg);
  1224. border-bottom: 1px solid var(--fs-line);
  1225. }
  1226. .fmNavBtns {
  1227. display: flex;
  1228. align-items: center;
  1229. gap: 4px;
  1230. flex-shrink: 0;
  1231. }
  1232. .fmNav .fsIconBtn.disabled,
  1233. .fmNav .fsIconBtn:disabled {
  1234. opacity: 0.35;
  1235. pointer-events: none;
  1236. }
  1237. /* ---------- Breadcrumb pill ---------- */
  1238. .fmPathbar {
  1239. flex-grow: 1;
  1240. min-width: 0;
  1241. cursor: text;
  1242. padding-left: 4px;
  1243. }
  1244. .fmPathHome {
  1245. width: 26px;
  1246. height: 26px;
  1247. min-width: 26px;
  1248. border: none;
  1249. background: transparent;
  1250. border-radius: 6px;
  1251. padding: 4px;
  1252. color: var(--fs-icon);
  1253. cursor: pointer;
  1254. flex-shrink: 0;
  1255. }
  1256. .fmPathHome:hover { background: var(--fs-fill); color: var(--fs-text); }
  1257. .fmPathbar .pathDisplay {
  1258. flex-grow: 1;
  1259. min-width: 0;
  1260. overflow: hidden;
  1261. white-space: nowrap;
  1262. font-size: 14px;
  1263. margin: 0 !important;
  1264. color: var(--fs-text);
  1265. }
  1266. .fmPathbar .pathDisplay .section {
  1267. padding: 3px 7px;
  1268. border-radius: 6px;
  1269. cursor: pointer;
  1270. }
  1271. .fmPathbar .pathDisplay .section:hover { background: var(--fs-fill); }
  1272. .fmPathbar .pathDisplay .divider { color: var(--fs-text-faint); }
  1273. .fmPathInput {
  1274. display: flex;
  1275. align-items: center;
  1276. gap: 6px;
  1277. flex-grow: 1;
  1278. min-width: 0;
  1279. }
  1280. .fmPathInput input {
  1281. flex-grow: 1;
  1282. min-width: 0;
  1283. border: none;
  1284. outline: none;
  1285. background: transparent;
  1286. font-size: 14px;
  1287. font-family: inherit;
  1288. color: var(--fs-text);
  1289. padding: 4px 2px;
  1290. }
  1291. /* ---------- Search pill ---------- */
  1292. .fmSearch {
  1293. width: 240px;
  1294. flex-shrink: 0;
  1295. padding-right: 8px;
  1296. }
  1297. .fmSearch input {
  1298. flex-grow: 1;
  1299. min-width: 0;
  1300. border: none;
  1301. outline: none;
  1302. background: transparent;
  1303. font-size: 14px;
  1304. font-family: inherit;
  1305. color: var(--fs-text);
  1306. }
  1307. .fmSearchIcon {
  1308. width: 17px;
  1309. height: 17px;
  1310. flex-shrink: 0;
  1311. color: var(--fs-text-dim);
  1312. }
  1313. .fmSearchIcon svg { display: block; width: 100%; height: 100%; }
  1314. .fmCaseBtn {
  1315. border: none;
  1316. background: transparent;
  1317. color: var(--fs-text-dim);
  1318. font-size: 12px;
  1319. font-weight: 600;
  1320. border-radius: 5px;
  1321. padding: 3px 5px;
  1322. cursor: pointer;
  1323. flex-shrink: 0;
  1324. }
  1325. .fmCaseBtn:hover { background: var(--fs-fill); color: var(--fs-text); }
  1326. .fmCaseBtn.active { background: var(--fs-accent-soft); color: var(--fs-accent-strong); }
  1327. /* ---------- View toggle ---------- */
  1328. .fsViewToggle {
  1329. display: flex;
  1330. background: var(--fs-fill);
  1331. border-radius: 8px;
  1332. padding: 2px;
  1333. gap: 2px;
  1334. flex-shrink: 0;
  1335. }
  1336. .fsViewToggle button {
  1337. width: 30px;
  1338. height: 26px;
  1339. border: none;
  1340. background: transparent;
  1341. border-radius: 6px;
  1342. padding: 5px;
  1343. color: var(--fs-icon);
  1344. cursor: pointer;
  1345. }
  1346. .fsViewToggle button:hover { background: var(--fs-fill-hover); }
  1347. .fsViewToggle button.disabled,
  1348. .fsViewToggle button:disabled {
  1349. background: var(--fs-surface);
  1350. color: var(--fs-accent);
  1351. box-shadow: 0 1px 2px rgba(0,0,0,0.12);
  1352. pointer-events: none;
  1353. opacity: 1;
  1354. }
  1355. .fsViewToggle button svg { display: block; width: 100%; height: 100%; }
  1356. /* ---------- Overflow menu button ---------- */
  1357. .fsMoreBtn {
  1358. width: 32px;
  1359. height: 32px;
  1360. min-width: 32px;
  1361. border: 1px solid var(--fs-line);
  1362. background: var(--fs-surface);
  1363. border-radius: 8px;
  1364. padding: 7px;
  1365. color: var(--fs-text);
  1366. cursor: pointer;
  1367. flex-shrink: 0;
  1368. }
  1369. .fsMoreBtn:hover { background: var(--fs-fill); }
  1370. .fsMoreBtn.active {
  1371. background: var(--fs-accent-soft);
  1372. color: var(--fs-accent);
  1373. border-color: transparent;
  1374. }
  1375. .fsMoreBtn svg { display: block; width: 100%; height: 100%; }
  1376. .fmMoreMenu {
  1377. right: 12px;
  1378. top: 46px;
  1379. max-height: 70vh;
  1380. overflow-y: auto;
  1381. overflow-x: hidden;
  1382. }
  1383. .fmSortRow select {
  1384. flex-grow: 1;
  1385. border: 1px solid var(--fs-line);
  1386. border-radius: 6px;
  1387. background: var(--fs-surface);
  1388. color: var(--fs-text);
  1389. font-family: inherit;
  1390. font-size: 13px;
  1391. padding: 3px 6px;
  1392. outline: none;
  1393. }
  1394. .fmSortRow:hover { background: transparent; }
  1395. /* ---------- Sidebar ---------- */
  1396. #directorySidebar {
  1397. padding: 10px 8px 10px 10px !important;
  1398. background: var(--fs-bg);
  1399. border-right: 1px solid var(--fs-line);
  1400. }
  1401. .fsSideTitle {
  1402. font-size: 12px;
  1403. color: var(--fs-text-faint);
  1404. padding: 4px 8px;
  1405. margin-top: 4px;
  1406. }
  1407. .fsSideTitle:first-child { margin-top: 0; }
  1408. .fmSideGroup { margin-bottom: 6px; }
  1409. #directorySidebar .fsSideItem {
  1410. display: flex !important;
  1411. align-items: center;
  1412. gap: 10px;
  1413. padding: 5px 8px !important;
  1414. border-radius: 7px;
  1415. cursor: pointer;
  1416. white-space: nowrap;
  1417. overflow: hidden;
  1418. color: var(--fs-text);
  1419. margin: 0 !important;
  1420. }
  1421. #directorySidebar .fsSideItem:hover { background: var(--fs-fill); }
  1422. #directorySidebar .fsSideItem.active {
  1423. background: var(--fs-accent-soft);
  1424. color: var(--fs-accent-strong);
  1425. }
  1426. #directorySidebar .fsSideItem .fsSideIcon {
  1427. width: 20px;
  1428. height: 20px;
  1429. min-width: 20px;
  1430. }
  1431. #directorySidebar .fsSideItem .fsSideIcon svg { display: block; width: 100%; height: 100%; }
  1432. #directorySidebar .fsSideItem .fsSideLabel {
  1433. overflow: hidden;
  1434. text-overflow: ellipsis;
  1435. }
  1436. #selectInfo {
  1437. font-size: 12px;
  1438. color: var(--fs-text-faint);
  1439. padding: 8px;
  1440. margin: 0;
  1441. }
  1442. /* ---------- Narrow windows ---------- */
  1443. @media only screen and (max-width: 900px) {
  1444. .fmSearch { width: 170px; }
  1445. }
  1446. @media only screen and (max-width: 720px) {
  1447. .fmSearch { display: none; }
  1448. }
  1449. /* ======================================================================
  1450. Redesigned file list, grid and status bar (Phase 2.5 - 2.8)
  1451. ====================================================================== */
  1452. /* ---------- Shared row icon ---------- */
  1453. .fmRowIcon {
  1454. width: 20px;
  1455. height: 20px;
  1456. min-width: 20px;
  1457. display: inline-block;
  1458. vertical-align: middle;
  1459. flex-shrink: 0;
  1460. }
  1461. .fmRowIcon .fsSmallIcon { width: 100%; height: 100%; }
  1462. /* ---------- List view (single column) ---------- */
  1463. .fileviewList .fileObject.item {
  1464. display: flex !important;
  1465. align-items: center;
  1466. gap: 9px;
  1467. height: 38px;
  1468. padding: 0 14px 0 16px !important;
  1469. cursor: pointer;
  1470. border-bottom: 1px solid var(--fs-line-soft);
  1471. }
  1472. .fileviewList .fileObject.item .filename {
  1473. overflow: hidden;
  1474. text-overflow: ellipsis;
  1475. white-space: nowrap;
  1476. }
  1477. /* ---------- Details view: the mockup's columned list ---------- */
  1478. #fmListHeader {
  1479. position: sticky;
  1480. top: 0;
  1481. z-index: 6;
  1482. background: var(--fs-bg);
  1483. border-bottom: 1px solid var(--fs-line);
  1484. }
  1485. .detailstable {
  1486. table-layout: fixed !important;
  1487. width: 100% !important;
  1488. margin: 0 !important;
  1489. border-collapse: collapse !important;
  1490. }
  1491. #fmListHeader th {
  1492. font-size: 13px !important;
  1493. font-weight: 400 !important;
  1494. color: var(--fs-text-dim) !important;
  1495. padding: 6px 8px !important;
  1496. text-align: left;
  1497. background: transparent !important;
  1498. border: none !important;
  1499. white-space: nowrap;
  1500. }
  1501. #fmListHeader th.fmSortable { cursor: pointer; }
  1502. #fmListHeader th.fmSortable:hover { background: var(--fs-fill) !important; }
  1503. #fmListHeader th.sorted { color: var(--fs-text) !important; }
  1504. .fmSortMark {
  1505. margin-left: 5px;
  1506. font-size: 11px;
  1507. color: var(--fs-text-dim);
  1508. }
  1509. .detailstable tr.fileObject.details { cursor: pointer; }
  1510. .detailstable tr.fileObject.details td {
  1511. padding: 6px 8px !important;
  1512. border: none !important;
  1513. border-bottom: 1px solid var(--fs-line-soft) !important;
  1514. font-size: 14px;
  1515. overflow: hidden;
  1516. text-overflow: ellipsis;
  1517. white-space: nowrap;
  1518. vertical-align: middle;
  1519. }
  1520. /*
  1521. The name cell must stay a real table-cell: display:flex on a <td> drops it
  1522. out of the table formatting context and collapses the column to zero width.
  1523. The flex row goes on an inner wrapper instead.
  1524. */
  1525. .detailstable td.fmColName { color: var(--fs-text); }
  1526. .detailstable td.fmColName .fmNameCell {
  1527. display: flex;
  1528. align-items: center;
  1529. gap: 9px;
  1530. min-width: 0;
  1531. }
  1532. .detailstable td.fmColName .filename {
  1533. overflow: hidden;
  1534. text-overflow: ellipsis;
  1535. white-space: nowrap;
  1536. }
  1537. .detailstable td.fmColDate,
  1538. .detailstable td.fmColType,
  1539. .detailstable td.fmColSize { color: var(--fs-text-dim); }
  1540. /* Checkbox column, shown on hover or when the row is selected */
  1541. .fmCheck {
  1542. display: inline-block;
  1543. width: 16px;
  1544. height: 16px;
  1545. border: 1.5px solid var(--fs-line);
  1546. border-radius: 4px;
  1547. background: var(--fs-surface);
  1548. opacity: 0;
  1549. transition: opacity 0.12s ease;
  1550. vertical-align: middle;
  1551. }
  1552. /*
  1553. Check marks belong to multi-select, not to selection: a single click only
  1554. highlights. #folderView gains .fmMultiSelect once ctrl/shift is held, mobile
  1555. multi-select is on, or more than one item is already picked.
  1556. */
  1557. .fmCheck { display: none; }
  1558. #folderView.fmMultiSelect .fmCheck { display: inline-block; }
  1559. #folderView.fmMultiSelect .detailstable tr.fileObject:hover .fmCheck { opacity: 1; }
  1560. #folderView.fmMultiSelect .detailstable tr.fileObject.selected .fmCheck {
  1561. opacity: 1;
  1562. background: var(--fs-accent);
  1563. border-color: var(--fs-accent);
  1564. position: relative;
  1565. }
  1566. #folderView.fmMultiSelect .detailstable tr.fileObject.selected .fmCheck::after {
  1567. content: "";
  1568. position: absolute;
  1569. left: 4.5px;
  1570. top: 1px;
  1571. width: 4px;
  1572. height: 8px;
  1573. border: solid var(--fs-primary-fg);
  1574. border-width: 0 2px 2px 0;
  1575. transform: rotate(45deg);
  1576. }
  1577. /* ---------- Selection highlight, all three modes ---------- */
  1578. .fileviewList .fileObject.item:hover,
  1579. .detailstable tr.fileObject.details:hover { background: var(--fs-row-hover); }
  1580. .fileviewList .fileObject.item.selected,
  1581. .detailstable tr.fileObject.details.selected {
  1582. background: var(--fs-selected) !important;
  1583. }
  1584. .fileviewList .fileObject.item.selected .filename,
  1585. .detailstable tr.fileObject.details.selected td { color: var(--fs-text) !important; }
  1586. /* ---------- Grid view ---------- */
  1587. #folderView { --fm-tile: 170px; }
  1588. #folderList.fileviewList,
  1589. #fileList.fileviewList { padding: 0 !important; }
  1590. .fileviewList .fileObject.card {
  1591. width: var(--fm-tile);
  1592. display: inline-block !important;
  1593. vertical-align: top;
  1594. margin: 0 !important;
  1595. padding: 8px;
  1596. border: 1px solid transparent;
  1597. border-radius: 10px;
  1598. background: transparent;
  1599. box-shadow: none !important;
  1600. overflow: hidden;
  1601. cursor: pointer;
  1602. }
  1603. .fileviewList .fileObject.card:hover { background: var(--fs-row-hover); }
  1604. .fileviewList .fileObject.card.selected {
  1605. background: var(--fs-selected) !important;
  1606. border-color: var(--fs-selected-line);
  1607. }
  1608. .fileviewList .fileObject.card .image {
  1609. position: relative;
  1610. text-align: center;
  1611. border-radius: 8px;
  1612. overflow: hidden;
  1613. background: var(--fs-thumb-bg);
  1614. }
  1615. .fileviewList .fileObject.card .content {
  1616. padding: 7px 2px 2px 2px !important;
  1617. border: none !important;
  1618. }
  1619. .fileviewList .fileObject.card .content .header {
  1620. font-size: 13px !important;
  1621. font-weight: 400 !important;
  1622. color: var(--fs-text) !important;
  1623. overflow: hidden;
  1624. text-overflow: ellipsis;
  1625. white-space: nowrap;
  1626. }
  1627. .fileviewList .fileObject.card .content .description {
  1628. font-size: 11px;
  1629. color: var(--fs-text-faint);
  1630. margin-top: 2px;
  1631. }
  1632. /* Selected tick badge on a tile, like the mockup */
  1633. .fmTileCheck {
  1634. position: absolute;
  1635. top: 6px;
  1636. right: 6px;
  1637. width: 20px;
  1638. height: 20px;
  1639. border-radius: 50%;
  1640. background: var(--fs-accent);
  1641. display: none;
  1642. }
  1643. .fmTileCheck::after {
  1644. content: "";
  1645. position: absolute;
  1646. left: 7px;
  1647. top: 3.5px;
  1648. width: 5px;
  1649. height: 10px;
  1650. border: solid var(--fs-primary-fg);
  1651. border-width: 0 2px 2px 0;
  1652. transform: rotate(45deg);
  1653. }
  1654. #folderView.fmMultiSelect .fileObject.card.selected .fmTileCheck { display: block; }
  1655. /* Date group headers */
  1656. .fmGroupHeader {
  1657. font-size: 13px;
  1658. font-weight: 600;
  1659. color: var(--fs-text);
  1660. padding: 14px 6px 6px 6px;
  1661. }
  1662. .fmGroup { display: block; }
  1663. /* ---------- Status bar ---------- */
  1664. #fmStatusBar {
  1665. display: flex;
  1666. align-items: center;
  1667. gap: 10px;
  1668. padding: 6px 12px;
  1669. border-top: 1px solid var(--fs-line);
  1670. background: var(--fs-bg);
  1671. font-size: 12px;
  1672. color: var(--fs-text-dim);
  1673. flex-shrink: 0;
  1674. }
  1675. .fmStatusSpacer { flex-grow: 1; }
  1676. #fmSelectionSize { color: var(--fs-text); }
  1677. #fmZoom {
  1678. display: flex;
  1679. align-items: center;
  1680. gap: 6px;
  1681. }
  1682. .fmZoomIcon {
  1683. width: 14px;
  1684. height: 14px;
  1685. color: var(--fs-text-faint);
  1686. }
  1687. .fmZoomIcon svg { display: block; width: 100%; height: 100%; }
  1688. #fmZoomSlider {
  1689. width: 96px;
  1690. accent-color: var(--fs-accent);
  1691. cursor: pointer;
  1692. }
  1693. .fmStatusToggle button { width: 26px; height: 22px; padding: 4px; }
  1694. .fmStatusBtn {
  1695. width: 26px;
  1696. height: 26px;
  1697. border: none;
  1698. background: transparent;
  1699. border-radius: 6px;
  1700. padding: 5px;
  1701. color: var(--fs-icon);
  1702. cursor: pointer;
  1703. }
  1704. .fmStatusBtn:hover { background: var(--fs-fill); }
  1705. .fmStatusBtn svg { display: block; width: 100%; height: 100%; }
  1706. @media only screen and (max-width: 720px) {
  1707. /*
  1708. updateZoomControlVisibility() shows this with an inline style, which
  1709. outranks a plain media query - hence !important. Without it the zoom
  1710. control rendered at full size on phones and pushed the status bar over.
  1711. */
  1712. /*
  1713. Only the zoom slider is too wide for a phone. The view toggle and the
  1714. properties button are small enough to keep, and hiding them left the
  1715. footer with no controls at all.
  1716. */
  1717. #fmZoom { display: none !important; }
  1718. .fmStatusToggle button { width: 30px; height: 26px; }
  1719. }
  1720. /* ---------- Details column widths + responsive column dropping ----------
  1721. With table-layout:fixed the first row defines the columns, so these widths
  1722. apply to the header table and both row tables identically. Hiding a cell
  1723. collapses its column, which a <colgroup> could not do. */
  1724. .detailstable .fmColCheck { width: 38px; }
  1725. .detailstable .fmColDate { width: 170px; }
  1726. .detailstable .fmColType { width: 120px; }
  1727. .detailstable .fmColSize { width: 90px; }
  1728. .detailstable .fmColName { width: auto; }
  1729. /* Force identical box geometry between the header and the row tables */
  1730. #fmListHeader table.detailstable,
  1731. .fileviewList table.detailstable {
  1732. border: none !important;
  1733. box-shadow: none !important;
  1734. background: transparent !important;
  1735. }
  1736. #folderView.fmNarrow .fmColType { display: none !important; }
  1737. #folderView.fmVeryNarrow .fmColDate { display: none !important; }
  1738. /* The legacy .fileObject.details rule put a 1px border on the <tr>, which inset
  1739. every row cell by 1px and left the columns misaligned with the header table. */
  1740. .detailstable tr.fileObject.details {
  1741. border: none !important;
  1742. }
  1743. /* ---------- Classic file operation toolbar ---------- */
  1744. /*
  1745. Sits above the nav row; toggled from the overflow menu and remembered server
  1746. side under file_explorer/oprbar.
  1747. It must never wrap to a second row - that was the old behaviour and it ate
  1748. vertical space the file list needs. Instead the bar collapses in stages as
  1749. the window narrows: first the stacked text-button groups drop out (rightmost
  1750. first, since those actions are the least used), then the big buttons lose
  1751. their labels and become icons. Anything dropped reappears in the overflow
  1752. menu automatically, because syncOprMenuDuplicates() checks what is actually
  1753. visible rather than assuming.
  1754. */
  1755. .fileOprBar {
  1756. display: flex;
  1757. align-items: flex-start;
  1758. flex-wrap: nowrap;
  1759. gap: 2px;
  1760. padding: 6px 12px 4px 12px;
  1761. border-bottom: 1px solid var(--fs-line);
  1762. background: var(--fs-bg);
  1763. overflow: hidden;
  1764. white-space: nowrap;
  1765. }
  1766. .fileOprBar .fileOprBtn {
  1767. flex-shrink: 0;
  1768. min-width: 0;
  1769. }
  1770. /*
  1771. One line per split. The legacy .navibar .fileoprGroupDivider rule already
  1772. draws a border-right; adding a border-left here rendered two lines side by
  1773. side wherever two groups met.
  1774. */
  1775. .fileOprBar .fileoprGroupDivider {
  1776. display: inline-block;
  1777. vertical-align: top;
  1778. border-left: none;
  1779. border-right: 1px solid var(--fs-line-soft);
  1780. margin: 0 6px 0 2px;
  1781. padding-right: 8px;
  1782. flex-shrink: 0;
  1783. }
  1784. .fileOprBar .fileOprBtn .oprtxt {
  1785. font-size: 12px;
  1786. margin: 2px 0 0 0;
  1787. white-space: nowrap;
  1788. }
  1789. /* Stage 1: drop the stacked groups, rightmost (least used) first */
  1790. @media only screen and (max-width: 960px) {
  1791. .fileOprBar .fileoprGroupDivider:nth-of-type(4) { display: none; }
  1792. }
  1793. @media only screen and (max-width: 840px) {
  1794. .fileOprBar .fileoprGroupDivider:nth-of-type(3) { display: none; }
  1795. }
  1796. @media only screen and (max-width: 600px) {
  1797. .fileOprBar .fileoprGroupDivider { display: none; }
  1798. }
  1799. /* Stage 2: big buttons become icon-only */
  1800. @media only screen and (max-width: 720px) {
  1801. .fileOprBar .fileOprBtn .oprtxt { display: none; }
  1802. .fileOprBar .fileOprBtn .opricon { width: 32px; }
  1803. .fileOprBar { padding-bottom: 6px; }
  1804. }
  1805. /* Stage 3: below this the nav row alone is the interface */
  1806. @media only screen and (max-width: 720px) {
  1807. .fileOprBar { display: none !important; }
  1808. }
  1809. /* ---------- Grid tile corrections ---------- */
  1810. /*
  1811. The legacy .card .content .description rule positions the size absolutely
  1812. against the card, which only worked while cards had a fixed 20em height.
  1813. Cards are content-sized now, so it has to sit in the normal flow or it
  1814. lands on top of the filename.
  1815. */
  1816. .fileviewList .fileObject.card .content .description {
  1817. position: static !important;
  1818. bottom: auto !important;
  1819. left: auto !important;
  1820. font-size: 11px;
  1821. color: var(--fs-text-faint);
  1822. margin-top: 2px;
  1823. }
  1824. /* Folders are drawn glyphs, not photos - the thumbnail plate behind them just
  1825. boxes in the icon. Files keep it so real thumbnails have something to sit on. */
  1826. .fileviewList .fileObject.card[type="folder"] .image {
  1827. background: transparent !important;
  1828. }
  1829. /* ---------- Sort menu ---------- */
  1830. /* Anchored to the sort button on the right of the nav row, like the "..." menu */
  1831. .fmSortMenu {
  1832. right: 52px;
  1833. top: 46px;
  1834. min-width: 210px;
  1835. }
  1836. /* Greyed section label above the options */
  1837. .fsMenuHeader {
  1838. padding: 4px 9px 6px 9px;
  1839. font-size: 12px;
  1840. color: var(--fs-text-faint);
  1841. cursor: default;
  1842. user-select: none;
  1843. }
  1844. /* The tick sits in the icon column, so the labels stay aligned whether or not
  1845. a mode is active */
  1846. .fmSortOption .fmSortCheck { visibility: hidden; color: var(--fs-accent); }
  1847. .fmSortOption.active .fmSortCheck { visibility: visible; }
  1848. .fmSortOption.active { color: var(--fs-text); }
  1849. /* ======================================================================
  1850. Mobile layout
  1851. ====================================================================== */
  1852. @media only screen and (max-width: 720px) {
  1853. /*
  1854. The nav row becomes two rows: controls on top, the path on its own row
  1855. underneath. A single row cannot hold the breadcrumb and the buttons at
  1856. phone widths without the path collapsing to nothing.
  1857. */
  1858. .fmNav {
  1859. flex-wrap: wrap;
  1860. row-gap: 6px;
  1861. padding: 6px 8px;
  1862. }
  1863. .fmNavBtns { flex-shrink: 0; }
  1864. .fmPathbar {
  1865. order: 10;
  1866. flex-basis: 100%;
  1867. min-width: 0;
  1868. }
  1869. /*
  1870. Push the sort and overflow buttons to the right edge. margin-left:auto on
  1871. the first of them absorbs the free space, so both end up flush right
  1872. regardless of how many nav buttons precede them.
  1873. */
  1874. .fmNav #fmSortBtn { margin-left: auto; }
  1875. /* Menus anchor to the row above the path */
  1876. .fmMoreMenu, .fmSortMenu {
  1877. top: 44px;
  1878. max-width: calc(100vw - 24px);
  1879. }
  1880. /* Status bar: text only, no controls to overflow */
  1881. #fmStatusBar {
  1882. padding: 5px 10px;
  1883. gap: 8px;
  1884. min-height: 0;
  1885. }
  1886. #fmStatusBar .fmStatusBtn { flex-shrink: 0; }
  1887. #selectInfo, #fmSelectionSize { white-space: nowrap; }
  1888. /* Guard: every icon in the bar stays at its intended box even if some
  1889. future rule forgets to size the button around it */
  1890. #fmStatusBar svg { width: 100%; height: 100%; }
  1891. #fmStatusBar .fmStatusBtn { width: 26px; height: 26px; }
  1892. }
  1893. /* Menu entries that cannot act on the current selection are hidden outright
  1894. rather than greyed - the menu is long enough already. */
  1895. .fsMenuItem.fmOprUnusable { display: none !important; }
  1896. /* Menu entries that only make sense on a touch device */
  1897. .fmMobileOnly { display: none; }