file_explorer.css 48 KB

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