file_explorer.css 86 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535
  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: #ffffff;
  48. --popup_header_txt: #1f2328;
  49. --popup_btn_border: #dedede;
  50. --popup_btn_hover: rgba(238, 238, 238, 0.932);
  51. --popup_btn_primary_bg: #51aded;
  52. --popup_btn_primary_txt: white;
  53. --popup_btn_primary_bg_hover: #76c0f5;
  54. --popup_btn_negative_bg: #ed5151;
  55. --popup_btn_negative_txt: white;
  56. --popup_btn_negative_bg_hover: #f57676;
  57. --modulelist_bg: white;
  58. --modulelist_hover: rgba(35, 35, 35, 0.06);
  59. --contextmenu_background: #ffffff;
  60. --contextmenu_hover: #f9f9f9;
  61. --contextmenu_textcolor: rgb(78, 78, 78);
  62. /* Transfer panel bars. The pale legacy greens/reds washed out against the
  63. new card surface, so these are the saturated status colours. */
  64. --upload_progressbar: var(--fs-accent);
  65. --upload_progresstext: rgb(255, 255, 255);
  66. --upload_progress_succ: #1e8e3e;
  67. --upload_progress_failed: #d93025;
  68. --fs-danger-soft: #fce8e6;
  69. --open_with_selected: #51aded;
  70. --open_with_selected_text: white;
  71. --open_with_item_hover_background:rgba(35,35,35,0.14);
  72. --popup_wrapper_background: rgba(15, 20, 30, 0.18);
  73. --code_bg: #f7f7f9;
  74. --code_txt: #bd4147;
  75. --uploadtab_bg: #f5f5f5;
  76. --uploadtab_txt: rgb(78, 78, 78);
  77. --upload_bg: #ffffff;
  78. }
  79. body.darkTheme{
  80. /*
  81. Legacy variable set, re-sampled to match the palette in
  82. shared/fs-theme.css so the parts of the UI that still read these
  83. (popups, upload tab, context menu, file object rows) sit in the same
  84. colour family as everything already ported to the --fs-* tokens.
  85. */
  86. /* ao.css's own dark values are a neutral grey; pull them onto the sampled
  87. palette so semantic-ui widgets inside this app match the rest of it. */
  88. --body_background: var(--fs-bg);
  89. --body_text: var(--fs-text);
  90. --text_color: var(--fs-text);
  91. --text_color_secondary: var(--fs-text-dim);
  92. --fileopr_btnTxt: #e6e9ee;
  93. --fileopr_oprtxt: #c7ced7;
  94. --fileopr_btnhover: #2a3039;
  95. --divider: #272c34;
  96. /* Surfaces come from the sampled tokens, not ao.css's --body_background_*.
  97. Those resolve to a neutral grey that is lighter than the file area, which
  98. inverts the mockup's depth order (content darkest, chrome above it). */
  99. --navi_bgcolor: var(--fs-bg);
  100. --navi_theme: var(--theme_color, #272c34);
  101. --navi_theme_multiselect: #4a9eff;
  102. --navi_txt: #c7ced7;
  103. --dropdown_bg: #1c2129;
  104. --dropdown_txt: #e6e9ee;
  105. --vroot_active_bg: #262b33;
  106. --dir_item_color: #c7ced7;
  107. --text_active: #4a9eff;
  108. --dir_bg: #14181d;
  109. --dir_txt: #e6e9ee;
  110. --dir_border: #272c34;
  111. --dir_hover_text: #9aa3ae;
  112. --dir_hover_background: #1f242c;
  113. --dir_hover_active: #1e2d40;
  114. --normal_object_txt: #e6e9ee;
  115. --hex_folder_txt: #5fd48b;
  116. --um_file_txt: #7db8ff;
  117. --folder_view_background: var(--fs-content-bg);
  118. --folder_view_share: #3ecf6d;
  119. --fileobject_background_hover: #1f242c;
  120. --fileobject_background_selected: #17293f;
  121. --fileobject_text_selected: #e6e9ee;
  122. --address_text_border: #272c34;
  123. --address_text_background: #1c2129;
  124. --popup_bg: #1c2129;
  125. --popup_border: #272c34;
  126. --popup_header_bg: #1c2129;
  127. --popup_header_txt: #e6e9ee;
  128. --popup_btn_border: #323945;
  129. --popup_btn_hover: #2a3039;
  130. --popup_btn_primary_bg: #4a9eff;
  131. --popup_btn_primary_txt: #0d1014;
  132. --popup_btn_primary_bg_hover: #6bb0ff;
  133. --popup_btn_negative_bg: #e5484d;
  134. --popup_btn_negative_txt: #ffffff;
  135. --popup_btn_negative_bg_hover: #f06a6e;
  136. --modulelist_bg: transparent;
  137. --modulelist_hover: rgba(122, 138, 160, 0.18);
  138. --contextmenu_background: #1c2129;
  139. --contextmenu_hover: #2a3039;
  140. --contextmenu_textcolor: #e6e9ee;
  141. --upload_progressbar: var(--fs-accent);
  142. --upload_progresstext: #0d1014;
  143. --upload_progress_succ: #3ecf6d;
  144. --upload_progress_failed: #e5484d;
  145. --fs-danger-soft: #3a2224;
  146. --open_with_selected: #1e3450;
  147. --open_with_selected_text: #e6e9ee;
  148. --open_with_item_hover_background: rgba(122, 138, 160, 0.16);
  149. --popup_wrapper_background: rgba(0, 0, 0, 0.38);
  150. --code_bg: #12161b;
  151. --code_txt: #ff8f93;
  152. --uploadtab_bg: #16191f;
  153. --uploadtab_txt: #e6e9ee;
  154. --upload_bg: #1c2129;
  155. }
  156. body{
  157. color:var(--body_text);
  158. background-color:var(--body_background);
  159. height:100%;
  160. overflow: hidden;
  161. }
  162. h1, h2, h3, p, span, div, input, .dropdown { font-family: "Microsoft JhengHei","SimHei", "Apple LiGothic Medium", "STHeiti"}
  163. html{
  164. height:100%;
  165. overflow:hidden;
  166. }
  167. /* force override of semantic button rule */
  168. body.darkTheme .ui.icon.button{
  169. color: var(--text_color) !important;
  170. }
  171. /*
  172. Navigation Bar
  173. The top bar of the interface
  174. see subparts for more detail configs
  175. */
  176. .navibar{
  177. width:100%;
  178. padding-left:12px;
  179. padding-right:12px;
  180. padding-top:6px;
  181. padding-bottom:3px;
  182. z-index: 99;
  183. background-color:var(--navi_bgcolor);
  184. border-bottom:2px solid var(--navi_theme);
  185. }
  186. .navibar.ctrl{
  187. border-bottom:2px solid var(--navi_theme_multiselect);
  188. }
  189. .navibar.mobile{
  190. padding-top: 0;
  191. }
  192. .button.standard{
  193. box-shadow: 0 1px 1px 0px rgb(190, 190, 190);
  194. border: 0px;
  195. }
  196. .button.standard:hover{
  197. background-color:#82c2f0 !important;
  198. color:white !important;
  199. }
  200. /*
  201. File operation bar
  202. */
  203. .navibar .fileOprBtn{
  204. vertical-align: top;
  205. border: 1px solid transparent;
  206. cursor: pointer;
  207. background-color: transparent;
  208. text-align: center;
  209. padding-bottom: 0.4em;
  210. padding-top: 0.5em;
  211. border-radius: 0.4em;
  212. }
  213. .navibar .fileOprBtn:hover{
  214. border: 1px solid var(--fileopr_btnhover);
  215. opacity: 0.8;
  216. }
  217. .navibar .fileOprBtn .opricon{
  218. width: 46px;
  219. }
  220. .navibar .fileOprBtn .oprtxt{
  221. color:var(--fileopr_oprtxt);
  222. }
  223. .navibar .twolines.fileOprBtn{
  224. padding-top: 0.1em;
  225. padding-bottom: 0.1em;
  226. }
  227. .navibar .twolines.fileOprBtn .opricon{
  228. width: 40px;
  229. }
  230. .navibar .twolines.fileOprBtn .oprtxt{
  231. font-size: 1em;
  232. }
  233. .navibar.mobile .fileOprBtn{
  234. padding-bottom: 0.4em;
  235. padding-top: 0.2em;
  236. border-radius: 0.4em;
  237. }
  238. .navibar.mobile .fileOprBtn .opricon{
  239. width: 36px;
  240. }
  241. .navibar.mobile .twolines.fileOprBtn .opricon{
  242. width: 28px;
  243. }
  244. .navibar.mobile .twolines.fileOprBtn .oprtxt{
  245. font-size: 0.7em;
  246. }
  247. .navibar .fileoprSmallBtn{
  248. cursor: pointer;
  249. border: 1px solid transparent;
  250. color:var(--navi_txt);
  251. background-color: transparent;
  252. padding: 0.3em;
  253. width: fit-content;
  254. text-align: left;
  255. }
  256. .navibar .fileoprSmallBtn:hover{
  257. opacity: 0.8;
  258. border: 1px solid var(--divider);
  259. border-radius: 0.4em;
  260. }
  261. .navibar.mobile .fileoprSmallBtn{
  262. font-size: 0.9em;
  263. padding: 0.2em;
  264. }
  265. .navibar .fileoprGroupDivider{
  266. padding-right: 0.2em;
  267. margin-right: 0.2em;
  268. border-right: 1px solid var(--divider);
  269. height: 80px;
  270. }
  271. .navibar.mobile .fileoprGroupDivider{
  272. height: 64px;
  273. }
  274. .ui.selection.dropdown{
  275. background-color: var(--dropdown_bg) !important;
  276. color: var(--dropdown_txt) !important;
  277. min-width: 11.5em !important;
  278. }
  279. /* special case when using in mobile sidebar */
  280. #mobileSortDropdown .ui.selection.dropdown{
  281. width: 100%;
  282. border-radius: 0;
  283. padding: 1em;
  284. }
  285. .ui.selection.dropdown .menu > .item{
  286. border-top-color:var(--divider);
  287. background-color: var(--dropdown_bg) !important;
  288. color: var(--dropdown_txt) !important;
  289. }
  290. .ui.selection.active.dropdown .menu{
  291. border: 1px solid var(--divider) !important;
  292. }
  293. .ui.selection.visible.dropdown > .text:not(.default){
  294. color: var(--text_color_secondary) !important;
  295. }
  296. /* Mobile interface */
  297. .fileoprBtnMobile{
  298. position: relative;
  299. width: 100%;
  300. background-color: none;
  301. padding: 0.5em;
  302. padding-left: 1em;
  303. cursor: pointer;
  304. }
  305. #mobileNaviBar{
  306. height: 100vh !important;
  307. overflow-y: auto !important;
  308. }
  309. #mobileNaviBar .fileoprBtnMobile{
  310. border-bottom: 1px solid var(--divider);
  311. }
  312. .fileoprBtnMobile:hover{
  313. background-color: var(--popup_btn_hover) !important;
  314. }
  315. .fileoprBtnMobile .opricon{
  316. width: 30px;
  317. display: inline-block;
  318. vertical-align: middle;
  319. margin-right: 0.4em;
  320. }
  321. .fileoprBtnMobile p{
  322. display: inline-block;
  323. vertical-align: middle;
  324. }
  325. .fileoprSmallBtnMobile{
  326. cursor: pointer;
  327. border: 1px solid transparent;
  328. color:var(--navi_txt);
  329. background-color: transparent;
  330. padding: 0.5em;
  331. padding-left: 1em;
  332. width: 100%;
  333. text-align: left;
  334. }
  335. #mobileNaviBar .fileoprSmallBtnMobile{
  336. border-bottom: 1px solid var(--divider);
  337. }
  338. .fileoprSmallBtnMobile:hover{
  339. background-color: var(--popup_btn_hover) !important;
  340. }
  341. /*
  342. Address and search bar
  343. */
  344. .navibarBtn{
  345. cursor: pointer;
  346. border: 1px solid transparent;
  347. color:var(--navi_txt);
  348. background-color: transparent;
  349. padding: 0.3em;
  350. display: inline-block;
  351. border-radius: 0.4em;
  352. padding-right: 0.1em;
  353. padding-bottom: 0.4em;
  354. margin-left: 0.2em;
  355. }
  356. .navibarBtn:hover{
  357. opacity: 0.8;
  358. border: 1px solid var(--divider);
  359. }
  360. .navibarBtn.disabled{
  361. pointer-events: none;
  362. opacity: 0.5;
  363. user-select: none;
  364. }
  365. /* Special button for switching over to dark theme*/
  366. .navibarBtn.DarkThemeToggle.inverted{
  367. color:var(--dark_theme_toggle_text);
  368. background-color: var(--dark_theme_toggle);
  369. }
  370. .navibarBtn.DarkThemeToggle{
  371. color: var(--white_theme_toggle_text);
  372. background-color: var(--white_theme_toggle);
  373. }
  374. .navibarBtn.DarkThemeToggle:hover{
  375. border: 1px solid transparent;
  376. }
  377. .navibarBtn:hover{
  378. opacity: 0.8;
  379. }
  380. /* View mode buttons */
  381. .videmode.button{
  382. color:var(--navi_txt) !important;
  383. background-color: transparent;
  384. }
  385. .videmode.button:hover{
  386. background-color: transparent;
  387. opacity: 0.8;
  388. }
  389. .videmode.button:focus:not(#togglePropertiesViewBtn){
  390. background-color: transparent !important;
  391. }
  392. .addressBar{
  393. border-top: 1px solid var(--divider);
  394. width:100%;
  395. padding: 0.4em;
  396. padding-left: 0;
  397. padding-right: 0;
  398. padding-top: 0.6em;
  399. min-height: 35px;
  400. margin-top:0.4em;
  401. vertical-align: top;
  402. display: flex;
  403. position: relative;
  404. }
  405. .addressBar .divider{
  406. color: var(--text_color_secondary) !important;
  407. }
  408. #pathDisplayField{
  409. margin-left: 0.4em !important;
  410. }
  411. .addressText{
  412. padding:5px;
  413. border-radius: 0.5em;
  414. /* border: 1px solid var(--address_text_border); */
  415. flex-grow: 1;
  416. background-color: var(--address_text_background);
  417. }
  418. #pathInputField{
  419. margin-left: 0.4em !important;
  420. font-size: 1rem;
  421. height: 27px;
  422. width: 100%;
  423. }
  424. #pathInputField input{
  425. background-color: var(--address_text_background);
  426. color: var(--text_color);
  427. }
  428. .selectable{
  429. cursor:pointer;
  430. }
  431. .viewportBtns.mobile{
  432. order: 2;
  433. margin-left: auto !important;
  434. height: 30px;
  435. border-right: none;
  436. margin-top: -10px;
  437. }
  438. /* Mobile file operation menus */
  439. .mobileFileOprMenu{
  440. position: fixed;
  441. top: 0.6em;
  442. right: 0.6em;
  443. background-color: var(--navi_bgcolor);
  444. border: none;
  445. color: var(--text_color);
  446. cursor: pointer;
  447. width: 50px;
  448. height: 50px;
  449. padding-top: 4px;
  450. padding-left: 10px;
  451. border-radius: 0.4em;
  452. }
  453. .mobileFileOprMenu:hover{
  454. opacity: 0.8;
  455. }
  456. .mobileFileOprMenuToggle{
  457. padding: 1em;
  458. border: 0px solid transparent;
  459. color: var(--text_color);
  460. border-bottom:2px solid var(--navi_theme);
  461. text-align: right;
  462. cursor: pointer;
  463. }
  464. .mobileFileOprMenuToggle .logo{
  465. position: absolute;
  466. top: 0.8em;
  467. left: 0.5em;
  468. width: 100px;
  469. opacity: 0.6;
  470. }
  471. /*
  472. Search bar
  473. */
  474. .searchbar{
  475. width:100%;
  476. padding: 0.4em;
  477. padding-left: 0;
  478. padding-right: 0;
  479. min-height: 35px;
  480. margin-top:0.4em;
  481. vertical-align: top;
  482. display: flex;
  483. align-items: center;
  484. }
  485. .searchbar .searInputBar{
  486. flex-grow: 1;
  487. }
  488. .searchbar .navibarBtn.active{
  489. color: var(--text_active);
  490. font-weight: bold;
  491. }
  492. /*
  493. Main Window scalling
  494. */
  495. #mainWindow{
  496. display: flex;
  497. align-items:flex-start;
  498. }
  499. /*
  500. Directory Sidebar
  501. */
  502. #directorySidebar{
  503. padding-top:1em;
  504. padding-bottom: 1em;
  505. overflow-y:auto;
  506. padding-bottom:20px;
  507. border-right:2px solid var(--dir_border);
  508. background-color:var(--dir_bg);
  509. color:var(--dir_txt);
  510. /*
  511. Starting size only. splitter.js rewrites width and min-width together as
  512. the handle is dragged - min-width is what stops flexbox from shrinking
  513. the pane, so it has to follow width down rather than pin it.
  514. */
  515. width: 250px;
  516. min-width: 250px;
  517. flex: 0 0 auto;
  518. scrollbar-width: thin;
  519. }
  520. .rightmargin.icon{
  521. margin-right:8px !important;
  522. }
  523. .dir{
  524. cursor:pointer;
  525. }
  526. .dir:not(.active):hover{
  527. color: var(--dir_hover_text) !important;
  528. }
  529. .dir.active:hover{
  530. background-color:var(--dir_hover_active);
  531. }
  532. .dir.item{
  533. padding-top: 0.4em !important;
  534. padding-bottom: 0.4em !important;
  535. padding-left: 1.4em !important;
  536. padding-right: 1.4em !important;
  537. color:var(--dir_item_color);
  538. }
  539. .vroot.active{
  540. background-color: var(--vroot_active_bg);
  541. }
  542. #selectInfo{
  543. padding-left: 1.2em;
  544. padding-right: 1.2em;
  545. color: var(--text_color_secondary);
  546. }
  547. .pathDisplay{
  548. cursor: text;
  549. overflow:hidden;
  550. white-space: nowrap;
  551. text-align: left;
  552. }
  553. .measure {
  554. position: absolute;
  555. visibility: hidden;
  556. left: -1000px;
  557. top: -1000px;
  558. }
  559. /*
  560. Folder Viewer (Main viewer)
  561. */
  562. /*
  563. Pane splitters
  564. A 7px grab strip that straddles the border between two panes. The negative
  565. side margins pull its own width back out of the flex line, so adding the
  566. handle does not shift the layout by a pixel - it sits on top of the border
  567. that was already there.
  568. Hidden on the touch layout: splitter.js does not bind them there, and a
  569. 7px target is not a sensible touch affordance anyway.
  570. */
  571. .fmSplitter{
  572. flex: 0 0 auto;
  573. align-self: stretch;
  574. width: 7px;
  575. margin-left: -3px;
  576. margin-right: -4px;
  577. position: relative;
  578. z-index: 6;
  579. cursor: col-resize;
  580. background-color: transparent;
  581. transition: background-color 0.12s ease;
  582. }
  583. .fmSplitter:hover,
  584. .fmSplitter.dragging{
  585. background-color: var(--fs-accent);
  586. opacity: 0.55;
  587. }
  588. /*
  589. While a handle is being dragged the pointer regularly ends up over the panes
  590. either side of it. Without this the cursor flickers back to the default and
  591. stray text gets selected on the way past.
  592. */
  593. body.fmResizing{
  594. cursor: col-resize;
  595. user-select: none;
  596. -webkit-user-select: none;
  597. }
  598. body.fmResizing *{
  599. cursor: col-resize !important;
  600. user-select: none;
  601. -webkit-user-select: none;
  602. }
  603. #folderView{
  604. flex-grow:1;
  605. padding-left:2em;
  606. padding-right:2em;
  607. padding-top:1.4em;
  608. overflow-y:auto;
  609. background-color: var(--folder_view_background);
  610. scrollbar-width: thin;
  611. }
  612. #folderList{
  613. margin-bottom:1em;
  614. }
  615. .fileviewList{
  616. position: relative;
  617. }
  618. /* Common spacing for list view and grid view */
  619. .fileviewList .fileObject.item,.fileviewList .fileObject.card{
  620. display:block !important;
  621. cursor:pointer;
  622. overflow-wrap: break-word !important;
  623. user-select: none;
  624. border: 1px solid var(--divider);
  625. }
  626. /*
  627. Hidden entries, shown only when the user turns them on. Dimmed so they stay
  628. distinguishable from ordinary content at a glance; they lift to full
  629. strength on hover and while selected so they are still readable to work
  630. with.
  631. */
  632. .fileObject[data-hidden="true"]{
  633. opacity: 0.45;
  634. }
  635. .fileObject[data-hidden="true"]:hover,
  636. .fileObject[data-hidden="true"].selected{
  637. opacity: 1;
  638. }
  639. .fileviewList .fileObject.item:hover,.fileviewList .fileObject.card:hover{
  640. background-color: var(--fileobject_background_hover) !important;
  641. }
  642. .fileviewList .fileObject.item.selected, .fileviewList .fileObject.card.selected{
  643. background-color: var(--fileobject_background_selected) !important;
  644. color: var(--fileobject_text_selected) !important;
  645. }
  646. /* Filelist in list mode */
  647. .fileviewList .fileObject.item{
  648. padding: 0.8em;
  649. padding-left: 1.2em;
  650. padding-right: 1em;
  651. }
  652. .fileviewList .fileObject.item:first-child{
  653. border-top-left-radius: 0.4em;
  654. border-top-right-radius: 0.4em;
  655. }
  656. .fileviewList .fileObject.item:last-child{
  657. border-bottom-left-radius: 0.4em;
  658. border-bottom-right-radius: 0.4em;
  659. }
  660. .fileviewList .fileObject.item.selected.renaming{
  661. padding-top: 0.6em !important;
  662. padding-bottom: 0.6em !important;
  663. }
  664. .fileviewList .fileObject.item:not(:first-child) {
  665. border-top: 0;
  666. }
  667. /* Filelist in grid mode.
  668. Width is set by the status bar zoom slider (--fm-tile / inline style), so the
  669. old fixed 148px !important is gone - it silently defeated the slider. */
  670. .fileviewList .fileObject.card{
  671. border-radius: 0.4em;
  672. position: relative;
  673. margin-bottom: 1em;
  674. }
  675. /*
  676. Grid tiles are square at every width. aspect-ratio keeps the box square so
  677. the responsive breakpoint no longer has to fight fixed pixel sizes.
  678. Icons use contain so they are never distorted; a real thumbnail (marked by
  679. .hasThumbnail from thumbnail.js) uses cover so it fills the square instead
  680. of letterboxing.
  681. display:block matters as much as the sizing here: an inline <img> sits on
  682. the text baseline, which leaves a few pixels of the container's background
  683. showing as a grey strip under every thumbnail.
  684. */
  685. .fileviewList .fileObject.card img{
  686. display: block;
  687. width: 100%;
  688. aspect-ratio: 1 / 1;
  689. height: auto;
  690. object-fit: contain;
  691. }
  692. .fileviewList .fileObject.card.hasThumbnail img{
  693. object-fit: cover;
  694. object-position: center;
  695. }
  696. /*
  697. The tinted plate behind an icon is there to give a bare glyph a surface. A
  698. real thumbnail covers the whole square, so keeping the plate only risks it
  699. peeking out along an edge.
  700. */
  701. .fileviewList .fileObject.card.hasThumbnail .image{
  702. background: transparent;
  703. }
  704. .fileviewList .fileObject.card .content{
  705. padding-left: 1em;
  706. padding-right: 1em;
  707. padding-top: 1em;
  708. padding-bottom: 0.4em;
  709. }
  710. /* Share icon overlay for card view */
  711. .fileviewList .fileObject.card .image{
  712. position: relative;
  713. }
  714. .fileviewList .fileObject.card .shareOverlay.visible{
  715. position: absolute;
  716. bottom: 0.4em;
  717. left: 0.4em;
  718. padding-top: 4px;
  719. background-color: var(--navi_bgcolor);
  720. height: 28px;
  721. width: 28px;
  722. border-radius: 0.4em;
  723. border: 1px solid var(--divider);
  724. box-shadow: 3px 1px 5px 1px rgba(158,158,158,0.2);
  725. opacity: 0.9;
  726. }
  727. .fileviewList .fileObject.card .content .header{
  728. font-size: 1.2em;
  729. font-weight: 500;
  730. color: var(--text_color);
  731. }
  732. .fileviewList .fileObject.card .content .meta{
  733. font-size: 0.9em;
  734. color: var(--text_color_secondary);
  735. }
  736. .fileviewList .fileObject.card .content .description{
  737. font-size: 1em;
  738. color: var(--text_color);
  739. position: absolute;
  740. bottom: 1em;
  741. left: 1em;
  742. }
  743. /* fileview in detail mode */
  744. .fileviewList .fileObject.details{
  745. cursor:pointer;
  746. user-select: none;
  747. border: 1px solid var(--divider);
  748. color: var(--text_color);
  749. }
  750. .fileviewList .fileObject.details:hover{
  751. background-color:var(--fileobject_background_hover) !important;
  752. }
  753. .fileviewList .fileObject.details.selected{
  754. background-color:var(--fileobject_background_selected) !important;
  755. }
  756. #folderView th{
  757. color: var(--text_color);
  758. }
  759. .fileviewList .fileObject.details.selected.renaming td:first-child{
  760. padding: inherit;
  761. }
  762. .fileviewList .detailTableContent tr td:first-child{
  763. padding-left: 1em !important;
  764. }
  765. .fileviewList .fileObject.details .light-text{
  766. color: var(--text_color_secondary);
  767. }
  768. /* Share button */
  769. .sharebtn{
  770. cursor: pointer;
  771. border: 1px solid transparent;
  772. background-color: transparent;
  773. color: var(--folder_view_share);
  774. margin-left: 4px;
  775. margin-top: 1px;
  776. }
  777. /* Handle specific Chrome bug in rendering the share icon */
  778. @media screen and (-webkit-min-device-pixel-ratio:0)
  779. and (min-resolution:.001dpcm) {
  780. .sharebtn{
  781. padding: 0 !important;
  782. }
  783. }
  784. .sharebtn:hover{
  785. opacity: 0.5;
  786. }
  787. /*
  788. Properties View
  789. */
  790. #propertiesView{
  791. /* Starting size only - see the note on #directorySidebar */
  792. width: 300px;
  793. min-width: 300px;
  794. flex: 0 0 auto;
  795. padding: 1em;
  796. overflow-y: auto;
  797. scrollbar-width: thin;
  798. color: var(--text_color);
  799. border-left: 1px solid var(--divider);
  800. background-color: var(--folder_view_background);
  801. }
  802. /*
  803. Permission grid in the properties panel. Compact enough to sit inside the
  804. properties table cell without stretching the panel.
  805. */
  806. #propertiesView .fmPermTable{
  807. border-collapse: collapse;
  808. width: auto;
  809. font-size: 12px;
  810. line-height: 1.3;
  811. }
  812. #propertiesView .fmPermTable th{
  813. padding: 1px 7px 3px 7px;
  814. font-weight: 400;
  815. color: var(--fs-text-dim) !important;
  816. text-align: center;
  817. white-space: nowrap;
  818. }
  819. #propertiesView .fmPermTable td{
  820. padding: 1px 7px;
  821. text-align: center;
  822. }
  823. #propertiesView .fmPermTable td.fmPermWho{
  824. padding-left: 0px;
  825. padding-right: 10px;
  826. text-align: left;
  827. color: var(--fs-text-dim) !important;
  828. white-space: nowrap;
  829. }
  830. /* Granted reads as present, denied as a quiet dash rather than a red cross */
  831. #propertiesView .fmPermTable td.fmPermOn{
  832. color: var(--upload_progress_succ) !important;
  833. }
  834. #propertiesView .fmPermTable td.fmPermOff{
  835. color: var(--fs-text-faint) !important;
  836. }
  837. #propertiesView td, #propertiesView span, #propertiesView div{
  838. color: var(--text_color);
  839. }
  840. /*
  841. Context Menu
  842. This is a complete rewrite / re-implement of the
  843. ts contextmenu after migration
  844. */
  845. /*
  846. Styled to match the .fsMenu component in shared/fs-components.css so the
  847. right click menu, the "..." menu and the sort menu all read as the same
  848. control: rounded card, inset rows that round on hover, and icons a step
  849. dimmer than the label text.
  850. */
  851. .contextmenu{
  852. position: fixed;
  853. display: none;
  854. width: 200px;
  855. padding: 4px;
  856. background-color: var(--contextmenu_background);
  857. border: 1px solid var(--divider);
  858. border-radius: 10px;
  859. -webkit-box-shadow: 0px 8px 28px var(--fs-shadow);
  860. -moz-box-shadow: 0px 8px 28px var(--fs-shadow);
  861. box-shadow: 0px 8px 28px var(--fs-shadow);
  862. z-index: 999;
  863. max-height: calc(100vh - 16px);
  864. overflow-y: auto;
  865. }
  866. .contextmenu.visible{
  867. display: block;
  868. }
  869. .contextmenu .item{
  870. display: flex;
  871. align-items: center;
  872. gap: 7px;
  873. padding: 5px 7px;
  874. border-radius: 6px;
  875. cursor: pointer;
  876. font-size: 13.5px;
  877. white-space: nowrap;
  878. color: var(--contextmenu_textcolor);
  879. }
  880. .contextmenu .item:hover{
  881. background-color: var(--contextmenu_hover);
  882. }
  883. /* Label expands to fill the row so the trailing element is always right-aligned */
  884. .contextmenu .item > span:not(.description){
  885. flex-grow: 1;
  886. }
  887. /*
  888. The rows carry semantic-ui font icons. Pin to a fixed box and push to the
  889. trailing edge with margin-left: auto. Items that carry a .description
  890. (Copy / Paste / Cut) hide their icon — the hotkey text is the indicator.
  891. The colour needs !important: ao.css styles every <i> and <span> under a
  892. themed body with a blanket rule whose :not() chain scores higher than any
  893. reasonable selector here, so it would otherwise repaint the icons to the
  894. same colour as the label and flatten the two-tone look.
  895. */
  896. .contextmenu .item > i.icon{
  897. width: 16px;
  898. min-width: 16px;
  899. height: auto;
  900. margin-left: auto;
  901. font-size: 14px;
  902. text-align: center;
  903. color: var(--fs-icon) !important;
  904. opacity: 0.6;
  905. }
  906. /* Items that already show a hotkey — no icon needed */
  907. .contextmenu .item.hasHotkey > i.icon {
  908. display: none;
  909. }
  910. /* Keyboard hint, pushed to the trailing edge */
  911. .contextmenu .description{
  912. margin-left: auto;
  913. color: var(--fs-text-faint) !important;
  914. font-size: 12px;
  915. }
  916. .contextmenu .divider{
  917. width: auto;
  918. height: 1px;
  919. margin: 3px;
  920. background-color: var(--fs-line-soft);
  921. border-bottom: 0px;
  922. }
  923. /*
  924. Message box and popups
  925. */
  926. /*
  927. Toast
  928. A dark pill centred along the bottom edge. It auto dismisses, and the
  929. trailing button closes it early.
  930. Colours are hardcoded to the toast tokens rather than the theme surfaces:
  931. the pill floats above the content instead of belonging to it, so it stays
  932. dark in the light theme too. That also means #msgbox has to win over the
  933. blanket ao.css rule that paints every span and <i> under a themed body,
  934. which the id in the selector does without needing !important.
  935. */
  936. #msgbox.msgbox{
  937. position: fixed;
  938. bottom: 24px;
  939. left: 50%;
  940. transform: translateX(-50%) translateY(10px);
  941. z-index: 999;
  942. display: flex;
  943. align-items: center;
  944. gap: 11px;
  945. max-width: min(560px, calc(100% - 32px));
  946. padding: 11px 10px 11px 18px;
  947. border-radius: 999px;
  948. background-color: var(--fs-toast-bg);
  949. color: var(--fs-toast-fg);
  950. box-shadow: 0px 6px 22px rgba(0, 0, 0, 0.35);
  951. opacity: 0;
  952. transition: opacity 0.18s ease, transform 0.18s ease;
  953. /*
  954. Belt and braces with the display:none that hideMsgBox sets after the
  955. fade: while faded out the pill must never swallow clicks aimed at the
  956. content beneath it, and that must not depend on a timer firing.
  957. */
  958. pointer-events: none;
  959. }
  960. #msgbox.msgbox.visible{
  961. opacity: 1;
  962. transform: translateX(-50%) translateY(0px);
  963. pointer-events: auto;
  964. }
  965. #msgbox.msgbox.error{
  966. background-color: var(--fs-toast-error-bg);
  967. color: var(--fs-toast-error-fg);
  968. }
  969. #msgbox .msgboxText{
  970. flex: 1 1 auto;
  971. min-width: 0px;
  972. color: inherit;
  973. font-size: 13.5px;
  974. line-height: 1.45;
  975. overflow: hidden;
  976. text-overflow: ellipsis;
  977. white-space: nowrap;
  978. }
  979. #msgbox > i.icon{
  980. flex: 0 0 auto;
  981. width: 16px;
  982. height: auto;
  983. margin: 0px;
  984. font-size: 15px;
  985. text-align: center;
  986. color: inherit;
  987. opacity: 0.9;
  988. }
  989. #msgbox .closeMsgButton{
  990. flex: 0 0 auto;
  991. width: 26px;
  992. height: 26px;
  993. display: flex;
  994. align-items: center;
  995. justify-content: center;
  996. border-radius: 50%;
  997. cursor: pointer;
  998. color: var(--fs-toast-dim);
  999. }
  1000. #msgbox.msgbox.error .closeMsgButton{
  1001. color: var(--fs-toast-error-fg);
  1002. opacity: 0.85;
  1003. }
  1004. #msgbox .closeMsgButton:hover{
  1005. background-color: rgba(255, 255, 255, 0.14);
  1006. color: var(--fs-toast-fg);
  1007. }
  1008. #msgbox .closeMsgButton svg{
  1009. width: 15px;
  1010. height: 15px;
  1011. display: block;
  1012. }
  1013. /*
  1014. File operation dialogs
  1015. The embedded dialogs (overwrite, delete, rename, new file/folder, share,
  1016. open with). Drawn as a rounded card docked to the right edge rather than a
  1017. full bleed panel with a dark title bar.
  1018. The progress dialog that runs in a floatWindow over a websocket is a
  1019. separate page and is deliberately not restyled here.
  1020. */
  1021. .popup{
  1022. position: fixed;
  1023. /*
  1024. Anchored to the bottom right and only as tall as its content: top is
  1025. deliberately auto, because pinning both top and bottom is what used to
  1026. stretch a three line confirmation over the full window height. The cap
  1027. keeps a long file list inside the viewport, and .popupcontent scrolls
  1028. once that cap is reached.
  1029. */
  1030. top: auto;
  1031. right: 10px;
  1032. bottom: 10px;
  1033. /* Above the transfer panel (500), below the toast and context menu (999) */
  1034. z-index: 601;
  1035. width: 23em;
  1036. max-width: calc(100% - 20px);
  1037. max-height: calc(100% - 20px);
  1038. display: flex;
  1039. flex-direction: column;
  1040. overflow: hidden;
  1041. border: 1px solid var(--popup_border);
  1042. border-radius: 12px;
  1043. background-color: var(--popup_bg);
  1044. box-shadow: 0px 8px 28px var(--fs-shadow);
  1045. }
  1046. .popup.wide{
  1047. width: 44em;
  1048. }
  1049. /*
  1050. The header carries the card's own surface now. It used to be a dark bar with
  1051. an accent underline, which read as a separate title bar sitting on top of
  1052. the panel rather than part of one card.
  1053. */
  1054. .popupheader{
  1055. flex: 0 0 auto;
  1056. display: flex;
  1057. align-items: center;
  1058. gap: 9px;
  1059. width: 100%;
  1060. height: auto;
  1061. padding: 12px 10px 12px 16px;
  1062. border-bottom: 1px solid var(--divider);
  1063. background-color: var(--popup_header_bg);
  1064. color: var(--popup_header_txt);
  1065. font-size: 14px;
  1066. }
  1067. /*
  1068. The title is a bare text node between the icon and the closer, so it cannot
  1069. be targeted directly - pushing the closer instead is what right aligns it.
  1070. */
  1071. .popupheader > span{
  1072. flex: 1 1 auto;
  1073. min-width: 0px;
  1074. overflow: hidden;
  1075. text-overflow: ellipsis;
  1076. white-space: nowrap;
  1077. }
  1078. .popupheader > i.icon{
  1079. flex: 0 0 auto;
  1080. width: 16px;
  1081. margin: 0px;
  1082. font-size: 15px;
  1083. text-align: center;
  1084. opacity: 0.85;
  1085. }
  1086. .popupcontent{
  1087. /*
  1088. Grows to its content and only shrinks when the card hits its cap.
  1089. min-height:0 is what lets it actually scroll then - a flex item's
  1090. default min-height:auto refuses to shrink below its content.
  1091. */
  1092. flex: 0 1 auto;
  1093. min-height: 0;
  1094. height: auto;
  1095. padding: 14px 16px 16px 16px;
  1096. overflow-y: auto;
  1097. overflow-x: hidden;
  1098. scrollbar-width: thin;
  1099. color: var(--normal_object_txt);
  1100. }
  1101. .popupcontent p,
  1102. .popupcontent small{
  1103. color: var(--fs-text-dim) !important;
  1104. line-height: 1.5;
  1105. }
  1106. .popupcloser{
  1107. position: static;
  1108. flex: 0 0 auto;
  1109. width: 26px;
  1110. height: 26px;
  1111. display: flex;
  1112. align-items: center;
  1113. justify-content: center;
  1114. border-radius: 6px;
  1115. font-size: 100%;
  1116. cursor: pointer;
  1117. opacity: 0.75;
  1118. }
  1119. .popupcloser:hover{
  1120. background-color: var(--popup_btn_hover);
  1121. opacity: 1;
  1122. }
  1123. .popupcloser i.icon{
  1124. margin: 0px;
  1125. }
  1126. /* ---------- Option rows ---------- */
  1127. .popupbuttons{
  1128. display: flex;
  1129. align-items: center;
  1130. gap: 10px;
  1131. cursor: pointer;
  1132. padding: 10px 13px;
  1133. margin-bottom: 7px;
  1134. border: 1px solid var(--popup_btn_border);
  1135. border-radius: 9px;
  1136. font-size: 13.5px;
  1137. line-height: 1.35;
  1138. color: var(--normal_object_txt);
  1139. }
  1140. .popupbuttons > i.icon{
  1141. flex: 0 0 auto;
  1142. width: 16px;
  1143. height: auto;
  1144. margin: 0px;
  1145. font-size: 14px;
  1146. text-align: center;
  1147. opacity: 0.75;
  1148. }
  1149. .popupbuttons.primary{
  1150. background-color: var(--popup_btn_primary_bg);
  1151. border: 1px solid transparent;
  1152. color: var(--popup_btn_primary_txt) !important;
  1153. }
  1154. .popupbuttons.primary > i.icon{
  1155. color: var(--popup_btn_primary_txt) !important;
  1156. opacity: 1;
  1157. }
  1158. .popupbuttons.negative{
  1159. background-color: var(--popup_btn_negative_bg);
  1160. border: 1px solid transparent;
  1161. color: var(--popup_btn_negative_txt) !important;
  1162. }
  1163. .popupbuttons.negative > i.icon{
  1164. color: var(--popup_btn_negative_txt) !important;
  1165. opacity: 1;
  1166. }
  1167. .popupbuttons.disabled{
  1168. opacity: 0.4;
  1169. pointer-events: none;
  1170. }
  1171. .popupbuttons.primary.disabled{
  1172. opacity: 0.4;
  1173. pointer-events: none;
  1174. }
  1175. /* Rename dialog */
  1176. .renameinput input{
  1177. box-shadow: none;
  1178. border: 1px solid var(--divider);
  1179. padding-left: 0.4em;
  1180. padding-right: 0.4em;
  1181. padding-top: 0.2em;
  1182. padding-bottom: 0.2em;
  1183. width: 100%;
  1184. }
  1185. .renameinput input:focus {
  1186. outline: none !important;
  1187. border: 1px solid var(--navi_theme);
  1188. }
  1189. .allowHover:hover{
  1190. background-color:var(--popup_btn_hover);
  1191. }
  1192. .allowHover.primary:hover{
  1193. background-color:var(--popup_btn_primary_bg_hover);
  1194. }
  1195. .allowHover.negative:hover{
  1196. background-color:var(--popup_btn_negative_bg_hover);
  1197. }
  1198. .newFileFormat{
  1199. cursor:pointer;
  1200. }
  1201. .popupWrapper{
  1202. position:fixed;
  1203. top:0px;
  1204. left:0px;
  1205. width:100%;
  1206. height:100%;
  1207. /* Directly under .popup, so the scrim covers the transfer panel too */
  1208. z-index:600;
  1209. background-color: var(--popup_wrapper_background);
  1210. display:none;
  1211. }
  1212. /*
  1213. The scrim is much lighter than it used to be, and no longer blurs: the
  1214. mockup shows the file list plainly behind the card. Some dimming is kept
  1215. rather than none, because the wrapper still swallows clicks - an invisible
  1216. overlay that silently eats them would be worse than a faint one that
  1217. explains itself.
  1218. */
  1219. /*
  1220. The Open With picker. Laid out like the standalone opener dialog
  1221. (SystemAO/file_system/defaultOpener.html): the WebApps that registered the
  1222. selected file's extension are listed first and everything else stays folded
  1223. behind the toggle row, so a long module list no longer buries the two apps
  1224. that can actually open the file.
  1225. The box grows with its content up to a cap rather than always standing 50vh
  1226. tall - a two app suggestion list used to leave most of the card empty.
  1227. */
  1228. #openWithModuleList{
  1229. max-height:42vh;
  1230. overflow-y:auto;
  1231. overflow-x:hidden;
  1232. scrollbar-width: thin;
  1233. padding: 4px;
  1234. background-color: var(--modulelist_bg);
  1235. border: 1px solid var(--divider);
  1236. border-radius: 8px;
  1237. }
  1238. #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{
  1239. flex: 0 0 auto;
  1240. width: 28px;
  1241. height: 28px;
  1242. margin: 0px;
  1243. border-radius: 0;
  1244. object-fit: contain;
  1245. }
  1246. .openWithSectionLabel{
  1247. padding: 6px 8px 4px 8px;
  1248. color: var(--fs-text-dim);
  1249. font-size: 12.5px;
  1250. }
  1251. #openWithModuleList .item{
  1252. padding: 8px 10px;
  1253. border-radius: 6px;
  1254. display: flex;
  1255. align-items: center;
  1256. gap: 10px;
  1257. }
  1258. #openWithModuleList .item .content{
  1259. flex: 1 1 auto;
  1260. min-width: 0px;
  1261. }
  1262. #openWithModuleList .item .header{
  1263. white-space: nowrap;
  1264. overflow: hidden;
  1265. text-overflow: ellipsis;
  1266. }
  1267. /* Hidden until the row is picked, so the list does not look pre-ticked */
  1268. #openWithModuleList .item .tick{
  1269. flex: 0 0 auto;
  1270. width: 20px;
  1271. text-align: center;
  1272. color: inherit;
  1273. visibility: hidden;
  1274. }
  1275. #openWithModuleList .item.selected .tick{
  1276. visibility: visible;
  1277. }
  1278. #openWithModuleList .item:hover{
  1279. background-color: var(--modulelist_hover) !important;
  1280. }
  1281. #openWithModuleList .item.selected{
  1282. background-color: var(--open_with_selected) !important;
  1283. color:var(--open_with_selected_text);
  1284. }
  1285. #openWithModuleList .item.selectable:hover{
  1286. background-color:var(--open_with_item_hover_background);
  1287. }
  1288. /* The one row that unfolds the WebApps which did not register this file type */
  1289. .openWithToggleRow{
  1290. display: flex;
  1291. align-items: center;
  1292. gap: 10px;
  1293. padding: 8px 10px;
  1294. margin-top: 4px;
  1295. border-top: 1px solid var(--divider);
  1296. border-radius: 6px;
  1297. color: var(--fs-text-dim);
  1298. cursor: pointer;
  1299. user-select: none;
  1300. }
  1301. .openWithToggleRow:hover{
  1302. background-color: var(--open_with_item_hover_background);
  1303. }
  1304. .openWithToggleRow i.icon{
  1305. flex: 0 0 auto;
  1306. width: 20px;
  1307. margin: 0px;
  1308. text-align: center;
  1309. }
  1310. .openWithEmptyNote{
  1311. padding: 14px 10px;
  1312. text-align: center;
  1313. color: var(--fs-text-dim);
  1314. font-size: 13px;
  1315. }
  1316. /*
  1317. New Item List
  1318. */
  1319. .newfilelist{
  1320. border: 1px solid var(--divider);
  1321. border-radius: 0.4em;
  1322. margin-bottom: 0.6em;
  1323. }
  1324. .newfilelist .item{
  1325. padding: 0.6em;
  1326. }
  1327. .newfilelist .item:not(:last-child){
  1328. border-bottom: 1px solid var(--divider);
  1329. }
  1330. .newfilelist .item.selected{
  1331. background-color: var(--open_with_selected) !important;
  1332. color:var(--open_with_selected_text);
  1333. }
  1334. /*
  1335. Transfer panel
  1336. The floating upload / zip task card at the bottom right. Markup shell lives
  1337. in file_explorer.html, rows are drawn by js/explorer/uploadui.js.
  1338. */
  1339. #uploadTab{
  1340. position: fixed;
  1341. right: 16px;
  1342. bottom: 16px;
  1343. width: 360px;
  1344. max-width: calc(100% - 32px);
  1345. background-color: var(--upload_bg);
  1346. border: 1px solid var(--divider);
  1347. border-radius: 12px;
  1348. box-shadow: 0px 8px 28px var(--fs-shadow);
  1349. overflow: hidden;
  1350. z-index: 500;
  1351. }
  1352. /* ---------- Header ---------- */
  1353. #uploadTab .uploadHeader{
  1354. display: flex;
  1355. align-items: center;
  1356. gap: 4px;
  1357. padding: 12px 10px 12px 16px;
  1358. background-color: var(--uploadtab_bg);
  1359. }
  1360. #uploadTab .uploadHeaderTitle{
  1361. flex: 1 1 auto;
  1362. min-width: 0px;
  1363. font-size: 15px;
  1364. color: var(--uploadtab_txt);
  1365. white-space: nowrap;
  1366. overflow: hidden;
  1367. text-overflow: ellipsis;
  1368. }
  1369. #uploadTab .uploadHeaderBtn{
  1370. flex: 0 0 auto;
  1371. width: 28px;
  1372. height: 28px;
  1373. display: flex;
  1374. align-items: center;
  1375. justify-content: center;
  1376. border-radius: 6px;
  1377. cursor: pointer;
  1378. color: var(--fs-icon);
  1379. }
  1380. #uploadTab .uploadHeaderBtn:hover{
  1381. background-color: var(--fs-fill-hover);
  1382. }
  1383. #uploadTab .uploadHeaderBtn svg{
  1384. width: 17px;
  1385. height: 17px;
  1386. display: block;
  1387. }
  1388. /* ---------- Task list ---------- */
  1389. #uploadTab .uploadList{
  1390. padding: 0px 16px;
  1391. max-height: 300px;
  1392. overflow-y: auto;
  1393. overflow-x: hidden;
  1394. scrollbar-width: thin;
  1395. }
  1396. /*
  1397. Three rows: name, byte counter + status, progress bar. The action button
  1398. spans the first two so it centres against the text block while the bar
  1399. still runs the full width of the card.
  1400. */
  1401. #uploadTab .uploadTask{
  1402. display: grid;
  1403. grid-template-columns: 1fr auto;
  1404. column-gap: 10px;
  1405. padding: 14px 0px 2px 0px;
  1406. }
  1407. #uploadTab .uploadTaskName{
  1408. grid-column: 1;
  1409. grid-row: 1;
  1410. font-size: 13.5px;
  1411. line-height: 1.45;
  1412. color: var(--normal_object_txt);
  1413. word-break: break-word;
  1414. overflow: hidden;
  1415. display: -webkit-box;
  1416. -webkit-line-clamp: 2;
  1417. -webkit-box-orient: vertical;
  1418. }
  1419. #uploadTab .uploadTaskMeta{
  1420. grid-column: 1;
  1421. grid-row: 2;
  1422. display: flex;
  1423. align-items: center;
  1424. justify-content: space-between;
  1425. gap: 10px;
  1426. margin-top: 7px;
  1427. font-size: 12px;
  1428. color: var(--fs-text-dim);
  1429. }
  1430. #uploadTab .uploadTaskSize,
  1431. #uploadTab .uploadTaskStatus{
  1432. color: var(--fs-text-dim);
  1433. }
  1434. /*
  1435. A row with no byte counter has an empty size cell, and the flex gap after it
  1436. would indent whatever comes next - which is what the download link on a
  1437. finished download would otherwise be, sitting a notch right of the task name
  1438. */
  1439. #uploadTab .uploadTaskSize:empty{
  1440. display: none;
  1441. }
  1442. /*
  1443. Byte counters update several times a second, so every glyph has to keep its
  1444. x position or the text is unreadable. Two things are needed: tabular figures
  1445. so "1" occupies the same advance as "8", and a fixed cell per part so a
  1446. changing digit count cannot push the neighbouring parts around.
  1447. Widths are in ch (the width of a digit at the current size), so they track
  1448. the font rather than assuming one.
  1449. */
  1450. #uploadTab .uploadTaskSize,
  1451. #uploadTab .uploadSummaryText{
  1452. font-variant-numeric: tabular-nums;
  1453. -moz-font-feature-settings: "tnum";
  1454. -webkit-font-feature-settings: "tnum";
  1455. font-feature-settings: "tnum";
  1456. }
  1457. /* Right aligned: the ones column stays put as the value grows into 4 digits */
  1458. #uploadTab .uploadNum{
  1459. display: inline-block;
  1460. text-align: right;
  1461. }
  1462. /*
  1463. Left aligned and padded off the number, so the unit starts at a fixed x.
  1464. This one is a hard width, not a min-width: unit letters are not digit width
  1465. and differ from each other ("MB" is wider than "KB", which is wider than
  1466. "B"), so a min-width still lets the cell grow and shove everything after it
  1467. when a transfer crosses a unit boundary. The value is sized for the widest
  1468. unit rather than measured per string.
  1469. */
  1470. #uploadTab .uploadUnit{
  1471. display: inline-block;
  1472. width: 4.4ch;
  1473. text-align: left;
  1474. padding-left: 4px;
  1475. }
  1476. #uploadTab .uploadSep{
  1477. display: inline-block;
  1478. width: 16px;
  1479. text-align: center;
  1480. }
  1481. /*
  1482. Always the right hand end of the status line, whatever is to its left: a
  1483. byte counter, the download link of a finished download, or nothing at all.
  1484. An auto margin rather than the row's space-between, which only reaches the
  1485. edge when there happen to be two items on the line.
  1486. */
  1487. #uploadTab .uploadTaskStatus{
  1488. flex: 0 0 auto;
  1489. margin-left: auto;
  1490. white-space: nowrap;
  1491. }
  1492. /*
  1493. The action column holds up to two controls: cancel, which only appears once
  1494. the transfer is paused, and the main pause/resume/retry button. Cancel is
  1495. deliberately hidden while uploading - the pause button is the one to reach
  1496. for, and putting a destructive control next to it invites misclicks.
  1497. */
  1498. #uploadTab .uploadTaskActions{
  1499. grid-column: 2;
  1500. grid-row: 1 / span 2;
  1501. /*
  1502. Bottom rather than centre: the column spans the name and the status
  1503. line, and centring it hung the buttons between the two with a gap under
  1504. them. Ending the column lines their base up with the status text.
  1505. */
  1506. align-self: end;
  1507. display: flex;
  1508. align-items: center;
  1509. gap: 2px;
  1510. }
  1511. #uploadTab .uploadTaskCancel{
  1512. display: none;
  1513. width: 28px;
  1514. height: 28px;
  1515. align-items: center;
  1516. justify-content: center;
  1517. border-radius: 50%;
  1518. cursor: pointer;
  1519. color: var(--fs-text-faint);
  1520. }
  1521. #uploadTab .uploadTask.paused .uploadTaskCancel{
  1522. /*
  1523. Shown by state class alone, so nothing has to rewrite this button on a
  1524. progress tick - which is what used to swallow clicks on its neighbour.
  1525. */
  1526. display: flex;
  1527. }
  1528. #uploadTab .uploadTaskCancel:hover{
  1529. background-color: var(--fs-fill-hover);
  1530. color: var(--upload_progress_failed);
  1531. }
  1532. #uploadTab .uploadTaskCancel svg{
  1533. width: 22px;
  1534. height: 22px;
  1535. display: block;
  1536. pointer-events: none;
  1537. }
  1538. /*
  1539. The "Download again" link on a finished download.
  1540. A completed download row shows this instead of the tick: the browser may
  1541. have blocked the download that started on its own, and a tick would then be
  1542. the only thing on screen while nothing had actually been saved.
  1543. It lives in the status line rather than the button column, so it reads as
  1544. one row with the label opposite it - the link at the left of the line, and
  1545. "Completed" pinned to its right hand end.
  1546. */
  1547. #uploadTab .uploadTaskDoneLink{
  1548. display: none;
  1549. white-space: nowrap;
  1550. color: var(--upload_progressbar);
  1551. cursor: pointer;
  1552. }
  1553. #uploadTab .uploadTask.withDoneLink .uploadTaskDoneLink{
  1554. display: inline-block;
  1555. }
  1556. #uploadTab .uploadTaskDoneLink:hover{
  1557. text-decoration: underline;
  1558. }
  1559. /* No control on a finished row - see renderUploadTask() */
  1560. #uploadTab .uploadTask.done .uploadTaskAction{
  1561. display: none;
  1562. }
  1563. #uploadTab .uploadTaskAction{
  1564. width: 30px;
  1565. height: 30px;
  1566. display: flex;
  1567. align-items: center;
  1568. justify-content: center;
  1569. border-radius: 50%;
  1570. cursor: pointer;
  1571. color: var(--upload_progressbar);
  1572. }
  1573. #uploadTab .uploadTaskAction svg{
  1574. width: 26px;
  1575. height: 26px;
  1576. display: block;
  1577. /*
  1578. The glyph must not be the event target. It is swapped out whenever the
  1579. task changes state, and a press that spans the swap would leave mousedown
  1580. and mouseup on two different elements - which produces no click at all.
  1581. Letting the pointer fall through to the button itself makes the whole
  1582. 30px control clickable regardless of what the icon does underneath.
  1583. */
  1584. pointer-events: none;
  1585. }
  1586. #uploadTab .uploadTask.failed .uploadTaskAction{
  1587. color: var(--upload_progress_failed);
  1588. }
  1589. #uploadTab .uploadTaskAction:hover{
  1590. background-color: var(--fs-fill-hover);
  1591. }
  1592. /* ---------- Progress bar ---------- */
  1593. #uploadTab .uploadTaskBar{
  1594. grid-column: 1 / -1;
  1595. grid-row: 3;
  1596. height: 4px;
  1597. margin-top: 10px;
  1598. border-radius: 999px;
  1599. background-color: var(--fs-line);
  1600. overflow: hidden;
  1601. }
  1602. #uploadTab .uploadTaskBarFill{
  1603. width: 0%;
  1604. height: 100%;
  1605. border-radius: 999px;
  1606. background-color: var(--upload_progressbar);
  1607. transition: width 0.2s linear;
  1608. }
  1609. #uploadTab .uploadTask.done .uploadTaskBarFill{
  1610. background-color: var(--upload_progress_succ);
  1611. }
  1612. #uploadTab .uploadTask.failed .uploadTaskBarFill{
  1613. background-color: var(--upload_progress_failed);
  1614. }
  1615. #uploadTab .uploadTask.paused .uploadTaskBarFill{
  1616. background-color: var(--fs-text-faint);
  1617. }
  1618. /* A task with no announced total sweeps instead of filling */
  1619. #uploadTab .uploadTask.indeterminate .uploadTaskBarFill{
  1620. width: 40%;
  1621. transition: none;
  1622. animation: uploadSweep 1.4s ease-in-out infinite;
  1623. }
  1624. @keyframes uploadSweep {
  1625. 0% { transform: translateX(-105%); }
  1626. 100% { transform: translateX(255%); }
  1627. }
  1628. /* ---------- Summary row ---------- */
  1629. #uploadTab .uploadSummary{
  1630. display: flex;
  1631. align-items: center;
  1632. gap: 10px;
  1633. padding: 12px 16px;
  1634. margin-top: 6px;
  1635. border-top: 1px solid var(--divider);
  1636. }
  1637. #uploadTab .uploadSummaryIcon{
  1638. flex: 0 0 auto;
  1639. color: var(--fs-icon);
  1640. }
  1641. #uploadTab .uploadSummaryIcon svg{
  1642. width: 19px;
  1643. height: 19px;
  1644. display: block;
  1645. }
  1646. /* The filled part of the ring, sized by setUploadSummaryRing() */
  1647. #uploadTab .uploadSummaryIcon .taskProgressArc{
  1648. color: var(--upload_progressbar);
  1649. transition: stroke-dasharray 0.25s linear;
  1650. }
  1651. #uploadTab .uploadSummaryText{
  1652. flex: 1 1 auto;
  1653. min-width: 0px;
  1654. font-size: 12.5px;
  1655. color: var(--fs-text-dim);
  1656. white-space: nowrap;
  1657. overflow: hidden;
  1658. text-overflow: ellipsis;
  1659. }
  1660. /* ---------- Footer buttons ---------- */
  1661. #uploadTab .uploadActions{
  1662. display: flex;
  1663. align-items: center;
  1664. gap: 10px;
  1665. padding: 4px 16px 16px 16px;
  1666. }
  1667. #uploadTab .uploadActionBtn{
  1668. display: flex;
  1669. align-items: center;
  1670. gap: 7px;
  1671. padding: 8px 14px;
  1672. border: 1px solid var(--popup_btn_border);
  1673. border-radius: 8px;
  1674. cursor: pointer;
  1675. font-size: 12.5px;
  1676. white-space: nowrap;
  1677. color: var(--normal_object_txt);
  1678. }
  1679. #uploadTab .uploadActionBtn:hover{
  1680. background-color: var(--fs-fill-hover);
  1681. }
  1682. #uploadTab .uploadActionBtn svg{
  1683. width: 15px;
  1684. height: 15px;
  1685. display: block;
  1686. color: var(--fs-icon);
  1687. }
  1688. #uploadTab .uploadActionBtn.primary{
  1689. margin-left: auto;
  1690. border-color: var(--upload_progressbar);
  1691. color: var(--upload_progressbar);
  1692. }
  1693. #uploadTab .uploadActionBtn.primary:hover{
  1694. background-color: var(--fs-accent-soft);
  1695. }
  1696. @media screen and (max-width: 500px) {
  1697. #uploadTab{
  1698. right: 12px;
  1699. left: 12px;
  1700. bottom: 12px;
  1701. width: auto;
  1702. max-width: none;
  1703. }
  1704. .uploadList{
  1705. max-height: 40vh;
  1706. }
  1707. }
  1708. /*
  1709. Special message or exceptions
  1710. */
  1711. .ui.themed.header{
  1712. color: var(--text_color);
  1713. }
  1714. .ui.themed.header .sub.header{
  1715. color: var(--text_color_secondary);
  1716. }
  1717. code{
  1718. background-color: var(--code_bg);
  1719. color: var(--code_txt);
  1720. line-height: 2.5;
  1721. padding: 0.1em;
  1722. padding-left: 0.4em;
  1723. padding-right: 0.4em;
  1724. border-radius: 0.2em;
  1725. }
  1726. /*
  1727. Legacy supports (Deprecated)
  1728. */
  1729. .normal.object{
  1730. color:var(--normal_object_txt);
  1731. }
  1732. .hex.foldername{
  1733. color: var(--hex_folder_txt) !important;
  1734. }
  1735. .um.filename{
  1736. color: var(--um_file_txt) !important;
  1737. }
  1738. /*
  1739. Hot Search Related
  1740. */
  1741. i.blue{
  1742. color: #345eeb;
  1743. }
  1744. .fileObject.hotSearchHighlight{
  1745. background-color: #d2f2f7 !important;
  1746. }
  1747. /*
  1748. Responsive
  1749. */
  1750. @media (max-width:1035px) {
  1751. .viewportBtns{
  1752. display: block;
  1753. float: right;
  1754. }
  1755. }
  1756. @media (max-width:840px) {
  1757. .viewportBtns{
  1758. float: none;
  1759. }
  1760. .tabletAndDesktopOnly{
  1761. display:none !important;
  1762. }
  1763. .mobileFileOprMenu{
  1764. display:block !important;
  1765. }
  1766. .navibar.mobile .fileOprBtn{
  1767. padding-top: 0.1em;
  1768. padding-bottom: 0em;
  1769. }
  1770. .navibar.mobile .twolines.fileOprBtn{
  1771. padding-top: 0.1em;
  1772. padding-bottom: 0em;
  1773. }
  1774. .navibar.mobile .twolines.fileOprBtn .opricon{
  1775. width: 36px;
  1776. }
  1777. .navibar.mobile .twolines.fileOprBtn .oprtxt{
  1778. display:none !important;
  1779. }
  1780. .navibar.mobile .wideScreenOnly{
  1781. display:none;
  1782. }
  1783. .navibar.mobile .fileoprGroupDivider{
  1784. height: 42px;
  1785. }
  1786. .mobileFileOprMenu{
  1787. top: 0;
  1788. right: 0.4em;
  1789. margin-top: -0.2em;
  1790. }
  1791. }
  1792. @media (max-width:620px) {
  1793. #pathInputField{
  1794. width: 100%;
  1795. }
  1796. #pathInputField input{
  1797. margin-left: 0;
  1798. }
  1799. .ui.selection.dropdown{
  1800. min-width: 8em;
  1801. }
  1802. /*Directory sidebar, full width */
  1803. #directorySidebar{
  1804. width: 100%;
  1805. min-width: 100%;
  1806. }
  1807. /* grid mode preview */
  1808. .fileviewList .fileObject.card{
  1809. border-radius: 0.4em;
  1810. position: relative;
  1811. margin-bottom:1em;
  1812. width: calc(33% - 4px) !important;
  1813. min-width: 100px;
  1814. max-width: 148px;
  1815. }
  1816. /*
  1817. Dialogs centre in the viewport instead of hugging a corner.
  1818. Centred with inset:0 + margin:auto rather than a translate(-50%,-50%),
  1819. because these are shown with semantic's transition("slide left in") -
  1820. its keyframes set transform themselves, so a centring transform would be
  1821. dropped for the length of the animation and the card would visibly jump
  1822. into place at the end. Auto margins are untouched by the animation.
  1823. The auto margins need a definite height to resolve against, which is
  1824. what height:fit-content provides - plain auto height would stretch to
  1825. fill the insets instead.
  1826. */
  1827. .popup{
  1828. right: 0;
  1829. bottom: 2em;
  1830. left: 0;
  1831. margin: auto;
  1832. width: calc(100% - 28px);
  1833. max-width: 420px;
  1834. height: -webkit-fit-content;
  1835. height: fit-content;
  1836. max-height: calc(100% - 40px);
  1837. }
  1838. /* Properties view, disable function in small display size*/
  1839. #propertiesView{
  1840. display:none !important;
  1841. }
  1842. #togglePropertiesViewBtn{
  1843. display:none !important;
  1844. }
  1845. /* ...and with no pane to resize, neither does its handle */
  1846. #fmPropsSplitter{
  1847. display:none !important;
  1848. }
  1849. }
  1850. @media (max-width:450px) {
  1851. .viewportBtns{
  1852. float: right;
  1853. }
  1854. }
  1855. /* ======================================================================
  1856. Redesigned navigation row and sidebar (Phase 2.3 / 2.4)
  1857. Colours come from shared/fs-theme.css, components from
  1858. shared/fs-components.css. Only layout lives here.
  1859. ====================================================================== */
  1860. .navibar {
  1861. padding: 0 !important;
  1862. height: auto !important;
  1863. }
  1864. .fmNav {
  1865. display: flex;
  1866. align-items: center;
  1867. gap: 8px;
  1868. padding: 8px 12px;
  1869. position: relative;
  1870. background: var(--fs-bg);
  1871. border-bottom: 1px solid var(--fs-line);
  1872. }
  1873. .fmNavBtns {
  1874. display: flex;
  1875. align-items: center;
  1876. gap: 4px;
  1877. flex-shrink: 0;
  1878. }
  1879. .fmNav .fsIconBtn.disabled,
  1880. .fmNav .fsIconBtn:disabled {
  1881. opacity: 0.35;
  1882. pointer-events: none;
  1883. }
  1884. /* ---------- Breadcrumb pill ---------- */
  1885. .fmPathbar {
  1886. flex-grow: 1;
  1887. min-width: 0;
  1888. cursor: text;
  1889. padding-left: 4px;
  1890. padding-right: 0px;
  1891. }
  1892. .fmPathHome {
  1893. width: 26px;
  1894. height: 26px;
  1895. min-width: 26px;
  1896. border: none;
  1897. background: transparent;
  1898. border-radius: 6px;
  1899. padding: 4px;
  1900. color: var(--fs-icon);
  1901. cursor: pointer;
  1902. flex-shrink: 0;
  1903. }
  1904. .fmPathHome:hover { background: var(--fs-fill); color: var(--fs-text); }
  1905. .fmPathbar .pathDisplay {
  1906. flex-grow: 1;
  1907. min-width: 0;
  1908. overflow: hidden;
  1909. white-space: nowrap;
  1910. font-size: 14px;
  1911. margin: 0 !important;
  1912. color: var(--fs-text);
  1913. }
  1914. .fmPathbar .pathDisplay .section {
  1915. padding: 3px 7px;
  1916. border-radius: 6px;
  1917. cursor: pointer;
  1918. }
  1919. .fmPathbar .pathDisplay .section:hover { background: var(--fs-fill); }
  1920. .fmPathbar .pathDisplay .divider { color: var(--fs-text-faint); }
  1921. .fmPathInput {
  1922. display: flex;
  1923. align-items: center;
  1924. gap: 6px;
  1925. flex-grow: 1;
  1926. min-width: 0;
  1927. }
  1928. .fmPathInput input {
  1929. flex-grow: 1;
  1930. min-width: 0;
  1931. border: none;
  1932. outline: none;
  1933. background: transparent;
  1934. font-size: 14px;
  1935. font-family: inherit;
  1936. color: var(--fs-text);
  1937. padding: 4px 2px;
  1938. }
  1939. /* ---------- Search pill ---------- */
  1940. .fmSearch {
  1941. width: 240px;
  1942. flex-shrink: 0;
  1943. padding-right: 8px;
  1944. }
  1945. .fmSearch input {
  1946. flex-grow: 1;
  1947. min-width: 0;
  1948. border: none;
  1949. outline: none;
  1950. background: transparent;
  1951. font-size: 14px;
  1952. font-family: inherit;
  1953. color: var(--fs-text);
  1954. }
  1955. .fmSearchIcon {
  1956. width: 17px;
  1957. height: 17px;
  1958. flex-shrink: 0;
  1959. color: var(--fs-text-dim);
  1960. }
  1961. .fmSearchIcon svg { display: block; width: 100%; height: 100%; }
  1962. .fmCaseBtn {
  1963. border: none;
  1964. background: transparent;
  1965. color: var(--fs-text-dim);
  1966. font-size: 12px;
  1967. font-weight: 600;
  1968. border-radius: 5px;
  1969. padding: 3px 5px;
  1970. cursor: pointer;
  1971. flex-shrink: 0;
  1972. }
  1973. .fmCaseBtn:hover { background: var(--fs-fill); color: var(--fs-text); }
  1974. .fmCaseBtn.active { background: var(--fs-accent-soft); color: var(--fs-accent-strong); }
  1975. /* ---------- View toggle ---------- */
  1976. .fsViewToggle {
  1977. display: flex;
  1978. background: var(--fs-fill);
  1979. border-radius: 8px;
  1980. padding: 2px;
  1981. gap: 2px;
  1982. flex-shrink: 0;
  1983. }
  1984. .fsViewToggle button {
  1985. width: 30px;
  1986. height: 26px;
  1987. border: none;
  1988. background: transparent;
  1989. border-radius: 6px;
  1990. padding: 5px;
  1991. color: var(--fs-icon);
  1992. cursor: pointer;
  1993. }
  1994. .fsViewToggle button:hover { background: var(--fs-fill-hover); }
  1995. .fsViewToggle button.disabled,
  1996. .fsViewToggle button:disabled {
  1997. background: var(--fs-surface);
  1998. color: var(--fs-accent);
  1999. box-shadow: 0 1px 2px rgba(0,0,0,0.12);
  2000. pointer-events: none;
  2001. opacity: 1;
  2002. }
  2003. .fsViewToggle button svg { display: block; width: 100%; height: 100%; }
  2004. /* ---------- Overflow menu button ---------- */
  2005. .fsMoreBtn {
  2006. width: 32px;
  2007. height: 32px;
  2008. min-width: 32px;
  2009. border: 1px solid var(--fs-line);
  2010. background: var(--fs-surface);
  2011. border-radius: 8px;
  2012. padding: 7px;
  2013. color: var(--fs-text);
  2014. cursor: pointer;
  2015. flex-shrink: 0;
  2016. }
  2017. .fsMoreBtn:hover { background: var(--fs-fill); }
  2018. .fsMoreBtn.active {
  2019. background: var(--fs-accent-soft);
  2020. color: var(--fs-accent);
  2021. border-color: transparent;
  2022. }
  2023. .fsMoreBtn svg { display: block; width: 100%; height: 100%; }
  2024. .fmMoreMenu {
  2025. right: 12px;
  2026. top: 46px;
  2027. max-height: 70vh;
  2028. overflow-y: auto;
  2029. overflow-x: hidden;
  2030. }
  2031. .fmSortRow select {
  2032. flex-grow: 1;
  2033. border: 1px solid var(--fs-line);
  2034. border-radius: 6px;
  2035. background: var(--fs-surface);
  2036. color: var(--fs-text);
  2037. font-family: inherit;
  2038. font-size: 13px;
  2039. padding: 3px 6px;
  2040. outline: none;
  2041. }
  2042. .fmSortRow:hover { background: transparent; }
  2043. /* ---------- Sidebar ---------- */
  2044. #directorySidebar {
  2045. padding: 10px 8px 10px 10px !important;
  2046. background: var(--fs-bg);
  2047. border-right: 1px solid var(--fs-line);
  2048. }
  2049. .fsSideTitle {
  2050. font-size: 12px;
  2051. color: var(--fs-text-faint);
  2052. padding: 4px 8px;
  2053. margin-top: 4px;
  2054. }
  2055. .fsSideTitle:first-child { margin-top: 0; }
  2056. .fmSideGroup { margin-bottom: 6px; }
  2057. #directorySidebar .fsSideItem {
  2058. display: flex !important;
  2059. align-items: center;
  2060. gap: 10px;
  2061. padding: 5px 8px !important;
  2062. border-radius: 7px;
  2063. cursor: pointer;
  2064. white-space: nowrap;
  2065. overflow: hidden;
  2066. color: var(--fs-text);
  2067. margin: 0 !important;
  2068. }
  2069. #directorySidebar .fsSideItem:hover { background: var(--fs-fill); }
  2070. #directorySidebar .fsSideItem.active {
  2071. background: var(--fs-accent-soft);
  2072. color: var(--fs-accent-strong);
  2073. }
  2074. #directorySidebar .fsSideItem .fsSideIcon {
  2075. width: 20px;
  2076. height: 20px;
  2077. min-width: 20px;
  2078. }
  2079. #directorySidebar .fsSideItem .fsSideIcon svg { display: block; width: 100%; height: 100%; }
  2080. #directorySidebar .fsSideItem .fsSideLabel {
  2081. overflow: hidden;
  2082. text-overflow: ellipsis;
  2083. }
  2084. /*
  2085. Separates the mounted storage devices above from the special views below
  2086. them - the trash bin and anything that joins it later. Without it the two
  2087. kinds run together and the bin reads as another drive.
  2088. */
  2089. #directorySidebar .fsSideDivider {
  2090. height: 1px;
  2091. background: var(--fs-line);
  2092. margin: 7px 8px;
  2093. }
  2094. #selectInfo {
  2095. font-size: 12px;
  2096. color: var(--fs-text-faint);
  2097. padding: 8px;
  2098. margin: 0;
  2099. }
  2100. /* ---------- Narrow windows ---------- */
  2101. @media only screen and (max-width: 900px) {
  2102. .fmSearch { width: 170px; }
  2103. }
  2104. @media only screen and (max-width: 720px) {
  2105. .fmSearch { display: none; }
  2106. }
  2107. /* ======================================================================
  2108. Redesigned file list, grid and status bar (Phase 2.5 - 2.8)
  2109. ====================================================================== */
  2110. /* ---------- Shared row icon ---------- */
  2111. .fmRowIcon {
  2112. width: 20px;
  2113. height: 20px;
  2114. min-width: 20px;
  2115. display: inline-block;
  2116. vertical-align: middle;
  2117. flex-shrink: 0;
  2118. }
  2119. .fmRowIcon .fsSmallIcon { width: 100%; height: 100%; }
  2120. /* ---------- List view (single column) ---------- */
  2121. .fileviewList .fileObject.item {
  2122. display: flex !important;
  2123. align-items: center;
  2124. gap: 9px;
  2125. height: 38px;
  2126. padding: 0 14px 0 16px !important;
  2127. cursor: pointer;
  2128. border-bottom: 1px solid var(--fs-line-soft);
  2129. }
  2130. .fileviewList .fileObject.item .filename {
  2131. overflow: hidden;
  2132. text-overflow: ellipsis;
  2133. white-space: nowrap;
  2134. }
  2135. /* ---------- Details view: the mockup's columned list ---------- */
  2136. #folderView.fmDetailsView {
  2137. padding-top: 0px;
  2138. border-top: 10px solid var(--folder_view_background);
  2139. }
  2140. #fmListHeader {
  2141. position: sticky;
  2142. top: 0;
  2143. z-index: 6;
  2144. background: var(--fs-bg);
  2145. border-bottom: 1px solid var(--fs-line);
  2146. }
  2147. .detailstable {
  2148. table-layout: fixed !important;
  2149. width: 100% !important;
  2150. margin: 0 !important;
  2151. border-collapse: collapse !important;
  2152. }
  2153. #fmListHeader th {
  2154. font-size: 13px !important;
  2155. font-weight: 400 !important;
  2156. color: var(--fs-text-dim) !important;
  2157. padding: 6px 8px !important;
  2158. text-align: left;
  2159. background: transparent !important;
  2160. border: none !important;
  2161. white-space: nowrap;
  2162. }
  2163. #fmListHeader th.fmSortable { cursor: pointer; }
  2164. #fmListHeader th.fmSortable:hover { background: var(--fs-fill) !important; }
  2165. #fmListHeader th.sorted { color: var(--fs-text) !important; }
  2166. .fmSortMark {
  2167. margin-left: 5px;
  2168. font-size: 11px;
  2169. color: var(--fs-text-dim);
  2170. }
  2171. .detailstable tr.fileObject.details { cursor: pointer; }
  2172. .detailstable tr.fileObject.details td {
  2173. padding: 6px 8px !important;
  2174. border: none !important;
  2175. border-bottom: 1px solid var(--fs-line-soft) !important;
  2176. font-size: 14px;
  2177. overflow: hidden;
  2178. text-overflow: ellipsis;
  2179. white-space: nowrap;
  2180. vertical-align: middle;
  2181. }
  2182. /*
  2183. The name cell must stay a real table-cell: display:flex on a <td> drops it
  2184. out of the table formatting context and collapses the column to zero width.
  2185. The flex row goes on an inner wrapper instead.
  2186. */
  2187. .detailstable td.fmColName { color: var(--fs-text); }
  2188. .detailstable td.fmColName .fmNameCell {
  2189. display: flex;
  2190. align-items: center;
  2191. gap: 9px;
  2192. min-width: 0;
  2193. }
  2194. .detailstable td.fmColName .filename {
  2195. overflow: hidden;
  2196. text-overflow: ellipsis;
  2197. white-space: nowrap;
  2198. }
  2199. .detailstable td.fmColDate,
  2200. .detailstable td.fmColType,
  2201. .detailstable td.fmColSize { color: var(--fs-text-dim); }
  2202. /*
  2203. ---------- Selection highlight, all three modes ----------
  2204. Selection is shown by the row/tile fill alone - there is no check badge in
  2205. any view mode. #folderView still gains .fmMultiSelect while ctrl/shift is
  2206. held or mobile multi-select is on, but nothing keys off it visually.
  2207. */
  2208. .fileviewList .fileObject.item:hover,
  2209. .detailstable tr.fileObject.details:hover { background: var(--fs-row-hover); }
  2210. .fileviewList .fileObject.item.selected,
  2211. .detailstable tr.fileObject.details.selected {
  2212. background: var(--fs-selected) !important;
  2213. }
  2214. .fileviewList .fileObject.item.selected .filename,
  2215. .detailstable tr.fileObject.details.selected td { color: var(--fs-text) !important; }
  2216. /* ---------- Grid view ---------- */
  2217. #folderView { --fm-tile: 170px; }
  2218. #folderList.fileviewList,
  2219. #fileList.fileviewList { padding: 0 !important; }
  2220. .fileviewList .fileObject.card {
  2221. width: var(--fm-tile);
  2222. display: inline-block !important;
  2223. vertical-align: top;
  2224. margin: 0 !important;
  2225. padding: 8px;
  2226. border: 1px solid transparent;
  2227. border-radius: 10px;
  2228. background: transparent;
  2229. box-shadow: none !important;
  2230. overflow: hidden;
  2231. cursor: pointer;
  2232. }
  2233. .fileviewList .fileObject.card:hover { background: var(--fs-row-hover); }
  2234. .fileviewList .fileObject.card.selected {
  2235. background: var(--fs-selected) !important;
  2236. border-color: var(--fs-selected-line);
  2237. }
  2238. .fileviewList .fileObject.card .image {
  2239. position: relative;
  2240. text-align: center;
  2241. border-radius: 8px;
  2242. overflow: hidden;
  2243. background: var(--fs-thumb-bg);
  2244. }
  2245. .fileviewList .fileObject.card .content {
  2246. padding: 7px 2px 2px 2px !important;
  2247. border: none !important;
  2248. }
  2249. .fileviewList .fileObject.card .content .header {
  2250. font-size: 13px !important;
  2251. font-weight: 400 !important;
  2252. color: var(--fs-text) !important;
  2253. overflow: hidden;
  2254. text-overflow: ellipsis;
  2255. white-space: nowrap;
  2256. }
  2257. .fileviewList .fileObject.card .content .description {
  2258. font-size: 11px;
  2259. color: var(--fs-text-faint);
  2260. margin-top: 2px;
  2261. }
  2262. /* Date group headers */
  2263. .fmGroupHeader {
  2264. font-size: 13px;
  2265. font-weight: 600;
  2266. color: var(--fs-text);
  2267. padding: 14px 6px 6px 6px;
  2268. }
  2269. .fmGroup { display: block; }
  2270. /* ======================================================================
  2271. Trash bin view
  2272. Rendered into #folderList by js/explorer/trash.js when the path is the
  2273. %trashbin% sentinel. It replaces the file listing entirely, so it owns the
  2274. full width of the file area rather than sitting alongside file objects.
  2275. ====================================================================== */
  2276. .fmTrashLoading{
  2277. padding: 28px 4px;
  2278. color: var(--fs-text-dim);
  2279. }
  2280. .fmTrashHeader{
  2281. position: relative;
  2282. display: flex;
  2283. align-items: center;
  2284. gap: 16px;
  2285. padding: 4px 4px 20px 4px;
  2286. }
  2287. .fmTrashIcon{
  2288. flex: 0 0 auto;
  2289. width: 56px;
  2290. height: 56px;
  2291. display: flex;
  2292. align-items: center;
  2293. justify-content: center;
  2294. border-radius: 50%;
  2295. background: var(--fs-fill);
  2296. color: var(--fs-text-dim);
  2297. }
  2298. .fmTrashIcon svg{
  2299. width: 28px;
  2300. height: 28px;
  2301. display: block;
  2302. }
  2303. .fmTrashHeadText{
  2304. flex: 1 1 auto;
  2305. min-width: 0px;
  2306. }
  2307. .fmTrashTitle{
  2308. font-size: 20px;
  2309. color: var(--fs-text);
  2310. margin-bottom: 3px;
  2311. }
  2312. .fmTrashDesc{
  2313. font-size: 12.5px;
  2314. color: var(--fs-text-dim);
  2315. line-height: 1.5;
  2316. }
  2317. /* Usage readout. Its numbers are placeholders until retention lands. */
  2318. .fmTrashUsage{
  2319. flex: 0 0 auto;
  2320. width: 190px;
  2321. }
  2322. .fmTrashUsageLabel{
  2323. font-size: 12px;
  2324. color: var(--fs-text-dim);
  2325. }
  2326. .fmTrashUsageValue{
  2327. font-size: 19px;
  2328. color: var(--fs-accent);
  2329. margin: 2px 0px 6px 0px;
  2330. }
  2331. .fmTrashUsageBar{
  2332. height: 6px;
  2333. border-radius: 999px;
  2334. background: var(--fs-line);
  2335. overflow: hidden;
  2336. }
  2337. .fmTrashUsageFill{
  2338. height: 100%;
  2339. border-radius: 999px;
  2340. background: var(--fs-accent);
  2341. }
  2342. .fmTrashUsageTotal{
  2343. margin-top: 5px;
  2344. font-size: 12px;
  2345. color: var(--fs-text-dim);
  2346. }
  2347. .fmTrashEmptyBtn{
  2348. flex: 0 0 auto;
  2349. display: flex;
  2350. align-items: center;
  2351. gap: 8px;
  2352. padding: 10px 16px;
  2353. border: none;
  2354. border-radius: 9px;
  2355. cursor: pointer;
  2356. font-size: 13.5px;
  2357. white-space: nowrap;
  2358. background: var(--upload_progress_failed);
  2359. color: #ffffff;
  2360. }
  2361. .fmTrashEmptyBtn:hover{
  2362. opacity: 0.9;
  2363. }
  2364. .fmTrashBtnIcon svg{
  2365. width: 16px;
  2366. height: 16px;
  2367. display: block;
  2368. }
  2369. .fmTrashMoreBtn{
  2370. flex: 0 0 auto;
  2371. width: 30px;
  2372. height: 30px;
  2373. padding: 6px;
  2374. border: none;
  2375. background: transparent;
  2376. border-radius: 6px;
  2377. cursor: pointer;
  2378. color: var(--fs-icon);
  2379. }
  2380. .fmTrashMoreBtn:hover{ background: var(--fs-fill); }
  2381. .fmTrashMoreBtn svg{ width: 100%; height: 100%; display: block; }
  2382. .fmTrashBulkMenu{
  2383. position: absolute;
  2384. top: 44px;
  2385. right: 0px;
  2386. min-width: 220px;
  2387. }
  2388. /* ---------- Listing ---------- */
  2389. .fmTrashTable{
  2390. width: 100%;
  2391. border-collapse: collapse;
  2392. font-size: 13px;
  2393. }
  2394. .fmTrashTable th{
  2395. padding: 10px 10px;
  2396. text-align: left;
  2397. font-weight: 400;
  2398. color: var(--fs-text-dim) !important;
  2399. border-top: 1px solid var(--fs-line);
  2400. border-bottom: 1px solid var(--fs-line);
  2401. white-space: nowrap;
  2402. }
  2403. .fmTrashTable td{
  2404. padding: 9px 10px;
  2405. border-bottom: 1px solid var(--fs-line-soft);
  2406. color: var(--fs-text) !important;
  2407. vertical-align: middle;
  2408. }
  2409. .fmTrashRow:hover{ background: var(--fs-row-hover); }
  2410. .fmTrashRow.selected{ background: var(--fs-selected); }
  2411. .fmTrashDim{ color: var(--fs-text-dim) !important; white-space: nowrap; }
  2412. /*
  2413. The flex row lives on a span inside the cell, never on the <td> itself.
  2414. display:flex on a table cell drops it out of the table formatting context,
  2415. which collapses the column and leaves its bottom border out of line with
  2416. every other cell in the row.
  2417. */
  2418. .fmTrashName{
  2419. display: flex;
  2420. align-items: center;
  2421. gap: 9px;
  2422. min-width: 0px;
  2423. }
  2424. .fmTrashNameText{
  2425. overflow: hidden;
  2426. text-overflow: ellipsis;
  2427. white-space: nowrap;
  2428. }
  2429. /* ---------- Sortable headers ---------- */
  2430. .fmTrashSortable{ cursor: pointer; }
  2431. .fmTrashSortable:hover{ background: var(--fs-fill); }
  2432. .fmTrashTable th.sorted{ color: var(--fs-text) !important; }
  2433. .fmTrashSortMark{
  2434. display: inline-block;
  2435. width: 12px;
  2436. margin-left: 3px;
  2437. font-size: 11px;
  2438. }
  2439. /* ---------- Details dialog ---------- */
  2440. .fmTrashDetailTable{
  2441. width: 100%;
  2442. border-collapse: collapse;
  2443. font-size: 13px;
  2444. margin-bottom: 14px;
  2445. }
  2446. .fmTrashDetailTable td{
  2447. padding: 7px 0px;
  2448. border-bottom: 1px solid var(--fs-line-soft);
  2449. word-break: break-all;
  2450. color: var(--normal_object_txt) !important;
  2451. }
  2452. .fmTrashDetailKey{
  2453. width: 38%;
  2454. color: var(--fs-text-dim) !important;
  2455. white-space: nowrap;
  2456. }
  2457. /* ---------- Special view root chip in the address bar ---------- */
  2458. .fmSpecialRoot{
  2459. display: inline-flex !important;
  2460. align-items: center;
  2461. gap: 7px;
  2462. }
  2463. .fmSpecialRootIcon{
  2464. width: 16px;
  2465. height: 16px;
  2466. color: var(--fs-icon);
  2467. }
  2468. .fmSpecialRootIcon svg{ width: 100%; height: 100%; display: block; }
  2469. .fmTrashRowIcon{
  2470. flex: 0 0 auto;
  2471. width: 20px;
  2472. height: 20px;
  2473. color: var(--fs-icon);
  2474. }
  2475. .fmTrashRowIcon svg{ width: 100%; height: 100%; display: block; }
  2476. .fmTrashColCheck{ width: 34px; }
  2477. /* Drawn rather than an <input>, to match the check styling used elsewhere */
  2478. .fmTrashCheck{
  2479. display: inline-block;
  2480. width: 16px;
  2481. height: 16px;
  2482. border: 1.5px solid var(--fs-line);
  2483. border-radius: 4px;
  2484. background: var(--fs-surface);
  2485. cursor: pointer;
  2486. position: relative;
  2487. vertical-align: middle;
  2488. }
  2489. .fmTrashCheck.checked{
  2490. background: var(--fs-accent);
  2491. border-color: var(--fs-accent);
  2492. }
  2493. .fmTrashCheck.checked::after{
  2494. content: "";
  2495. position: absolute;
  2496. left: 4.5px;
  2497. top: 1px;
  2498. width: 4px;
  2499. height: 8px;
  2500. border: solid var(--fs-primary-fg);
  2501. border-width: 0px 2px 2px 0px;
  2502. transform: rotate(45deg);
  2503. }
  2504. .fmTrashActionCell{ width: 1%; white-space: nowrap; text-align: right; }
  2505. .fmTrashRestoreBtn{
  2506. padding: 6px 14px;
  2507. border: 1px solid var(--popup_btn_border);
  2508. border-radius: 7px;
  2509. background: transparent;
  2510. cursor: pointer;
  2511. font-size: 12.5px;
  2512. color: var(--fs-text);
  2513. }
  2514. .fmTrashRestoreBtn:hover{ background: var(--fs-fill-hover); }
  2515. .fmTrashRowMore{
  2516. width: 26px;
  2517. height: 26px;
  2518. padding: 4px;
  2519. border: none;
  2520. background: transparent;
  2521. border-radius: 6px;
  2522. cursor: pointer;
  2523. color: var(--fs-icon);
  2524. }
  2525. .fmTrashRowMore:hover{ background: var(--fs-fill); }
  2526. .fmTrashRowMore svg{ width: 100%; height: 100%; display: block; }
  2527. .fmTrashRowMenu{
  2528. position: fixed;
  2529. min-width: 210px;
  2530. z-index: 610;
  2531. }
  2532. .fmTrashEmpty{
  2533. padding: 40px 10px !important;
  2534. text-align: center;
  2535. color: var(--fs-text-dim) !important;
  2536. }
  2537. /*
  2538. Sits at the end of the table while the server is still walking the file
  2539. system, with rows appearing above it as they are found.
  2540. */
  2541. .fmTrashScanning{
  2542. padding: 14px 10px !important;
  2543. color: var(--fs-text-dim) !important;
  2544. }
  2545. /*
  2546. The flex box is an inner element rather than the cell itself: display:flex
  2547. on a <td> takes it out of the table's formatting context, which drops the
  2548. colspan and squeezes the row into the width of the first column.
  2549. */
  2550. .fmTrashScanInner{
  2551. display: flex;
  2552. align-items: center;
  2553. gap: 9px;
  2554. }
  2555. .fmTrashSpinner{
  2556. width: 13px;
  2557. height: 13px;
  2558. min-width: 13px;
  2559. border: 2px solid var(--fs-line);
  2560. border-top-color: var(--fs-accent);
  2561. border-radius: 50%;
  2562. display: inline-block;
  2563. animation: fmTrashSpin 0.7s linear infinite;
  2564. }
  2565. @keyframes fmTrashSpin {
  2566. to { transform: rotate(360deg); }
  2567. }
  2568. /* A spinning ring is exactly what this setting asks to be spared */
  2569. @media (prefers-reduced-motion: reduce) {
  2570. .fmTrashSpinner{ animation: none; }
  2571. }
  2572. .fmTrashFootnote{
  2573. display: flex;
  2574. align-items: center;
  2575. gap: 9px;
  2576. margin-top: 16px;
  2577. padding: 12px 14px;
  2578. border-radius: 9px;
  2579. background: var(--fs-fill);
  2580. font-size: 12.5px;
  2581. color: var(--fs-text-dim);
  2582. }
  2583. .fmTrashFootIcon{
  2584. flex: 0 0 auto;
  2585. width: 17px;
  2586. height: 17px;
  2587. color: var(--fs-accent);
  2588. }
  2589. .fmTrashFootIcon svg{ width: 100%; height: 100%; display: block; }
  2590. /*
  2591. The original path is the widest column in the table and the one the layout
  2592. can most afford to lose. Driven by a class from updateListDensity() rather
  2593. than a media query, because the file area is bounded by two draggable panes
  2594. and the viewport width says nothing useful about it.
  2595. */
  2596. #folderView.fmTrashHideOrigin .fmTrashColOrigin{ display: none !important; }
  2597. @media only screen and (max-width: 720px) {
  2598. /* The usage readout is the first thing to go when space is tight */
  2599. .fmTrashHeader{ flex-wrap: wrap; }
  2600. .fmTrashUsage{ display: none; }
  2601. .fmTrashTable th:nth-child(4), .fmTrashTable td:nth-child(4){ display: none; }
  2602. }
  2603. /* ---------- Trash bin: card layout (phones and very narrow panes) ---------- */
  2604. /*
  2605. Drawn instead of the table below FM_TRASH_CARD_MAX_WIDTH - see
  2606. useTrashCardLayout() in js/explorer/trash.js. The same rows, restacked:
  2607. one line per item, with restore and delete moved to a bar along the bottom
  2608. where they act on the selection.
  2609. */
  2610. .fmTrashCardHead{
  2611. background: var(--fs-surface);
  2612. border: 1px solid var(--fs-line);
  2613. border-radius: 14px;
  2614. padding: 16px;
  2615. margin: 10px 10px 12px 10px;
  2616. }
  2617. .fmTrashCardTop{
  2618. display: flex;
  2619. align-items: center;
  2620. gap: 13px;
  2621. }
  2622. .fmTrashCardHead .fmTrashIcon{
  2623. flex: 0 0 auto;
  2624. width: 46px;
  2625. height: 46px;
  2626. border-radius: 50%;
  2627. background: var(--fs-fill);
  2628. display: flex;
  2629. align-items: center;
  2630. justify-content: center;
  2631. color: var(--fs-icon);
  2632. }
  2633. .fmTrashCardHead .fmTrashIcon svg{ width: 24px; height: 24px; display: block; }
  2634. .fmTrashCardHead .fmTrashTitle{
  2635. font-size: 17px;
  2636. font-weight: 600;
  2637. color: var(--fs-text) !important;
  2638. }
  2639. .fmTrashCardHead .fmTrashDesc{
  2640. font-size: 12px;
  2641. line-height: 1.45;
  2642. color: var(--fs-text-dim) !important;
  2643. margin-top: 2px;
  2644. }
  2645. .fmTrashCardUsage{ margin-top: 15px; }
  2646. .fmTrashCardUsage .fmTrashUsageLabel{
  2647. font-size: 12px;
  2648. color: var(--fs-text-dim) !important;
  2649. }
  2650. .fmTrashUsageRow{
  2651. display: flex;
  2652. align-items: baseline;
  2653. justify-content: space-between;
  2654. gap: 10px;
  2655. margin-top: 2px;
  2656. }
  2657. .fmTrashCardUsage .fmTrashUsageValue{
  2658. font-size: 21px;
  2659. font-weight: 600;
  2660. color: var(--fs-accent) !important;
  2661. }
  2662. .fmTrashCardUsage .fmTrashUsageTotal{
  2663. font-size: 12px;
  2664. color: var(--fs-text-dim) !important;
  2665. }
  2666. .fmTrashCardUsage .fmTrashUsageBar{
  2667. margin-top: 8px;
  2668. width: 100%;
  2669. height: 6px;
  2670. border-radius: 3px;
  2671. background: var(--fs-fill);
  2672. overflow: hidden;
  2673. }
  2674. .fmTrashCardUsage .fmTrashUsageFill{
  2675. height: 100%;
  2676. border-radius: 3px;
  2677. background: var(--fs-accent);
  2678. }
  2679. .fmTrashCardEmptyBtn{
  2680. margin-top: 15px;
  2681. display: flex;
  2682. align-items: center;
  2683. gap: 8px;
  2684. width: 100%;
  2685. padding: 0;
  2686. border: none;
  2687. background: none;
  2688. cursor: pointer;
  2689. font-size: 14px;
  2690. font-family: inherit;
  2691. color: var(--upload_progress_failed);
  2692. }
  2693. .fmTrashCardEmptyBtn .fmTrashBtnIcon{ width: 16px; height: 16px; }
  2694. .fmTrashCardEmptyBtn .fmTrashBtnIcon svg{ width: 100%; height: 100%; display: block; }
  2695. /* Kind filter chips, standing in for the table's sortable headers */
  2696. .fmTrashChips{
  2697. position: relative;
  2698. display: flex;
  2699. align-items: center;
  2700. gap: 8px;
  2701. padding: 0 10px 10px 10px;
  2702. overflow-x: auto;
  2703. scrollbar-width: none;
  2704. }
  2705. .fmTrashChips::-webkit-scrollbar{ display: none; }
  2706. .fmTrashChip{
  2707. flex: 0 0 auto;
  2708. padding: 6px 13px;
  2709. border-radius: 999px;
  2710. border: 1px solid var(--fs-line);
  2711. background: var(--fs-bg);
  2712. color: var(--fs-text-dim);
  2713. font-size: 12.5px;
  2714. font-family: inherit;
  2715. cursor: pointer;
  2716. white-space: nowrap;
  2717. }
  2718. .fmTrashChip.active{
  2719. background: var(--fs-accent-soft);
  2720. border-color: transparent;
  2721. color: var(--fs-accent-strong);
  2722. font-weight: 500;
  2723. }
  2724. .fmTrashChipSpacer{ flex: 1 1 auto; }
  2725. .fmTrashChipMore{
  2726. flex: 0 0 auto;
  2727. width: 30px;
  2728. height: 30px;
  2729. padding: 6px;
  2730. border: none;
  2731. border-radius: 8px;
  2732. background: none;
  2733. cursor: pointer;
  2734. color: var(--fs-icon);
  2735. }
  2736. .fmTrashChipMore svg{ width: 100%; height: 100%; display: block; }
  2737. .fmTrashChips .fmTrashBulkMenu{ right: 10px; top: 38px; }
  2738. /* The rows themselves */
  2739. .fmTrashCards{ padding: 0px; }
  2740. .fmTrashCardRow{
  2741. display: flex;
  2742. align-items: center;
  2743. gap: 11px;
  2744. padding: 10px 10px;
  2745. border-bottom: 1px solid var(--fs-line-soft);
  2746. }
  2747. .fmTrashCardRow .fmTrashCheck{ flex: 0 0 auto; }
  2748. .fmTrashCardIcon{
  2749. flex: 0 0 auto;
  2750. width: 30px;
  2751. height: 30px;
  2752. display: flex;
  2753. align-items: center;
  2754. justify-content: center;
  2755. }
  2756. .fmTrashCardIcon svg,
  2757. .fmTrashCardIcon img{ width: 100%; height: 100%; display: block; object-fit: contain; }
  2758. .fmTrashCardText{
  2759. flex: 1 1 auto;
  2760. min-width: 0; /* lets the name ellipsis instead of stretching the row */
  2761. }
  2762. .fmTrashCardName{
  2763. font-size: 13.5px;
  2764. color: var(--fs-text) !important;
  2765. overflow: hidden;
  2766. text-overflow: ellipsis;
  2767. white-space: nowrap;
  2768. }
  2769. .fmTrashCardMeta{
  2770. font-size: 11.5px;
  2771. color: var(--fs-text-dim) !important;
  2772. margin-top: 2px;
  2773. overflow: hidden;
  2774. text-overflow: ellipsis;
  2775. white-space: nowrap;
  2776. }
  2777. .fmTrashCardDays{
  2778. flex: 0 0 auto;
  2779. font-size: 11.5px;
  2780. color: var(--fs-text-dim) !important;
  2781. white-space: nowrap;
  2782. }
  2783. .fmTrashCardRow .fmTrashRowMore{
  2784. flex: 0 0 auto;
  2785. width: 26px;
  2786. height: 26px;
  2787. padding: 5px;
  2788. }
  2789. .fmTrashCards .fmTrashEmpty{ padding: 40px 10px !important; }
  2790. .fmTrashCards .fmTrashScanRow{ padding: 14px 4px; }
  2791. /*
  2792. Action bar. In normal flow rather than fixed: the file area is the thing
  2793. that scrolls, and a fixed bar would sit over the desktop chrome outside it.
  2794. */
  2795. .fmTrashActionBar{
  2796. /*
  2797. Sticky to the foot of the file area: the list can run well past one
  2798. screen, and the two buttons are the whole point of selecting anything,
  2799. so they follow the scroll instead of sitting at the very bottom.
  2800. */
  2801. position: sticky;
  2802. bottom: 8px;
  2803. z-index: 2;
  2804. display: flex;
  2805. align-items: center;
  2806. gap: 10px;
  2807. margin: 12px 10px 14px 10px;
  2808. padding: 11px 12px;
  2809. border: 1px solid var(--fs-line);
  2810. border-radius: 12px;
  2811. background: var(--fs-surface);
  2812. }
  2813. .fmTrashBarCount{
  2814. flex: 1 1 auto;
  2815. font-size: 12px;
  2816. color: var(--fs-text-dim) !important;
  2817. overflow: hidden;
  2818. text-overflow: ellipsis;
  2819. white-space: nowrap;
  2820. }
  2821. .fmTrashBarBtn{
  2822. flex: 0 0 auto;
  2823. display: flex;
  2824. align-items: center;
  2825. gap: 6px;
  2826. padding: 7px 12px;
  2827. border: 1px solid var(--fs-line);
  2828. border-radius: 9px;
  2829. background: var(--fs-bg);
  2830. color: var(--fs-text);
  2831. font-size: 12.5px;
  2832. font-family: inherit;
  2833. cursor: pointer;
  2834. white-space: nowrap;
  2835. }
  2836. .fmTrashBarBtn.danger{
  2837. border-color: transparent;
  2838. background: var(--fs-danger-soft);
  2839. color: var(--upload_progress_failed);
  2840. font-weight: 500;
  2841. }
  2842. .fmTrashBarBtn .fmTrashBtnIcon{ width: 14px; height: 14px; }
  2843. .fmTrashBarBtn .fmTrashBtnIcon svg{ width: 100%; height: 100%; display: block; }
  2844. /* Nothing selected yet: the buttons are still there, just visibly inert */
  2845. .fmTrashActionBar:not(.hasSelection) .fmTrashBarBtn{ opacity: 0.5; }
  2846. /* ---------- Status bar ---------- */
  2847. #fmStatusBar {
  2848. display: flex;
  2849. align-items: center;
  2850. gap: 10px;
  2851. padding: 6px 12px;
  2852. border-top: 1px solid var(--fs-line);
  2853. background: var(--fs-bg);
  2854. font-size: 12px;
  2855. color: var(--fs-text-dim);
  2856. flex-shrink: 0;
  2857. }
  2858. .fmStatusSpacer { flex-grow: 1; }
  2859. #fmSelectionSize { color: var(--fs-text); }
  2860. #fmZoom {
  2861. display: flex;
  2862. align-items: center;
  2863. gap: 6px;
  2864. }
  2865. .fmZoomIcon {
  2866. /*
  2867. inline-block, because width and height do not apply to a non-replaced
  2868. inline element. As a bare <span> this box silently loses its size the
  2869. moment anything stops #fmZoom being a flex container, and the SVG inside
  2870. then renders at its 300px intrinsic size.
  2871. */
  2872. display: inline-block;
  2873. flex-shrink: 0;
  2874. width: 14px;
  2875. height: 14px;
  2876. color: var(--fs-text-faint);
  2877. }
  2878. .fmZoomIcon svg { display: block; width: 100%; height: 100%; }
  2879. #fmZoomSlider {
  2880. width: 96px;
  2881. accent-color: var(--fs-accent);
  2882. cursor: pointer;
  2883. }
  2884. .fmStatusToggle button { width: 26px; height: 22px; padding: 4px; }
  2885. .fmStatusBtn {
  2886. width: 26px;
  2887. height: 26px;
  2888. border: none;
  2889. background: transparent;
  2890. border-radius: 6px;
  2891. padding: 5px;
  2892. color: var(--fs-icon);
  2893. cursor: pointer;
  2894. }
  2895. .fmStatusBtn:hover { background: var(--fs-fill); }
  2896. .fmStatusBtn svg { display: block; width: 100%; height: 100%; }
  2897. /*
  2898. Collapsed transfer panel
  2899. Scoped to the id rather than .fmStatusBtn.active so the properties toggle,
  2900. which also carries an .active class, keeps its current look.
  2901. */
  2902. #fmUploadListBtn.active{
  2903. background: var(--fs-fill-active);
  2904. color: var(--fs-accent);
  2905. }
  2906. /*
  2907. Slow pulse while something is still transferring, so background progress is
  2908. noticeable without being a distraction. Animating the colour rather than the
  2909. whole button keeps the hit area and the hover fill steady.
  2910. */
  2911. #fmUploadListBtn.transferring{
  2912. animation: uploadBtnPulse 2.2s ease-in-out infinite;
  2913. }
  2914. @keyframes uploadBtnPulse {
  2915. 0% { color: var(--fs-icon); }
  2916. 50% { color: var(--fs-accent); }
  2917. 100% { color: var(--fs-icon); }
  2918. }
  2919. /* A blinking control is exactly what this setting asks to be spared */
  2920. @media (prefers-reduced-motion: reduce) {
  2921. #fmUploadListBtn.transferring{
  2922. animation: none;
  2923. color: var(--fs-accent);
  2924. }
  2925. }
  2926. @media only screen and (max-width: 720px) {
  2927. /*
  2928. updateZoomControlVisibility() shows this with an inline style, which
  2929. outranks a plain media query - hence !important. Without it the zoom
  2930. control rendered at full size on phones and pushed the status bar over.
  2931. */
  2932. /*
  2933. Only the zoom slider is too wide for a phone. The view toggle and the
  2934. properties button are small enough to keep, and hiding them left the
  2935. footer with no controls at all.
  2936. */
  2937. #fmZoom { display: none !important; }
  2938. .fmStatusToggle button { width: 30px; height: 26px; }
  2939. }
  2940. /* ---------- Details column widths + responsive column dropping ----------
  2941. With table-layout:fixed the first row defines the columns, so these widths
  2942. apply to the header table and both row tables identically. Hiding a cell
  2943. collapses its column, which a <colgroup> could not do. */
  2944. .detailstable .fmColDate { width: 170px; }
  2945. .detailstable .fmColType { width: 120px; }
  2946. .detailstable .fmColSize { width: 90px; }
  2947. .detailstable .fmColName { width: auto; }
  2948. /* Force identical box geometry between the header and the row tables */
  2949. #fmListHeader table.detailstable,
  2950. .fileviewList table.detailstable {
  2951. border: none !important;
  2952. box-shadow: none !important;
  2953. background: transparent !important;
  2954. }
  2955. #folderView.fmNarrow .fmColType { display: none !important; }
  2956. #folderView.fmVeryNarrow .fmColDate { display: none !important; }
  2957. /* The legacy .fileObject.details rule put a 1px border on the <tr>, which inset
  2958. every row cell by 1px and left the columns misaligned with the header table. */
  2959. .detailstable tr.fileObject.details {
  2960. border: none !important;
  2961. }
  2962. /* ---------- Classic file operation toolbar ---------- */
  2963. /*
  2964. Sits above the nav row; toggled from the overflow menu and remembered server
  2965. side under file_explorer/oprbar.
  2966. It must never wrap to a second row - that was the old behaviour and it ate
  2967. vertical space the file list needs. Instead the bar collapses in stages as
  2968. the window narrows: first the stacked text-button groups drop out (rightmost
  2969. first, since those actions are the least used), then the big buttons lose
  2970. their labels and become icons. Anything dropped reappears in the overflow
  2971. menu automatically, because syncOprMenuDuplicates() checks what is actually
  2972. visible rather than assuming.
  2973. */
  2974. .fileOprBar {
  2975. display: flex;
  2976. align-items: flex-start;
  2977. flex-wrap: nowrap;
  2978. gap: 2px;
  2979. padding: 6px 12px 4px 12px;
  2980. border-bottom: 1px solid var(--fs-line);
  2981. background: var(--fs-bg);
  2982. overflow: hidden;
  2983. white-space: nowrap;
  2984. }
  2985. .fileOprBar .fileOprBtn {
  2986. flex-shrink: 0;
  2987. min-width: 0;
  2988. }
  2989. /*
  2990. One line per split. The legacy .navibar .fileoprGroupDivider rule already
  2991. draws a border-right; adding a border-left here rendered two lines side by
  2992. side wherever two groups met.
  2993. */
  2994. .fileOprBar .fileoprGroupDivider {
  2995. display: inline-block;
  2996. vertical-align: top;
  2997. border-left: none;
  2998. border-right: 1px solid var(--fs-line-soft);
  2999. margin: 0 6px 0 2px;
  3000. padding-right: 8px;
  3001. flex-shrink: 0;
  3002. }
  3003. .fileOprBar .fileOprBtn .oprtxt {
  3004. font-size: 12px;
  3005. margin: 2px 0 0 0;
  3006. white-space: nowrap;
  3007. }
  3008. /* Stage 1: drop the stacked groups, rightmost (least used) first */
  3009. @media only screen and (max-width: 960px) {
  3010. .fileOprBar .fileoprGroupDivider:nth-of-type(4) { display: none; }
  3011. }
  3012. @media only screen and (max-width: 840px) {
  3013. .fileOprBar .fileoprGroupDivider:nth-of-type(3) { display: none; }
  3014. }
  3015. @media only screen and (max-width: 600px) {
  3016. .fileOprBar .fileoprGroupDivider { display: none; }
  3017. }
  3018. /* Stage 2: big buttons become icon-only */
  3019. @media only screen and (max-width: 720px) {
  3020. .fileOprBar .fileOprBtn .oprtxt { display: none; }
  3021. .fileOprBar .fileOprBtn .opricon { width: 32px; }
  3022. .fileOprBar { padding-bottom: 6px; }
  3023. }
  3024. /* Stage 3: below this the nav row alone is the interface */
  3025. @media only screen and (max-width: 720px) {
  3026. .fileOprBar { display: none !important; }
  3027. }
  3028. /* ---------- Grid tile corrections ---------- */
  3029. /*
  3030. The legacy .card .content .description rule positions the size absolutely
  3031. against the card, which only worked while cards had a fixed 20em height.
  3032. Cards are content-sized now, so it has to sit in the normal flow or it
  3033. lands on top of the filename.
  3034. */
  3035. .fileviewList .fileObject.card .content .description {
  3036. position: static !important;
  3037. bottom: auto !important;
  3038. left: auto !important;
  3039. font-size: 11px;
  3040. color: var(--fs-text-faint);
  3041. margin-top: 2px;
  3042. }
  3043. /* Folders are drawn glyphs, not photos - the thumbnail plate behind them just
  3044. boxes in the icon. Files keep it so real thumbnails have something to sit on. */
  3045. .fileviewList .fileObject.card[type="folder"] .image {
  3046. background: transparent !important;
  3047. }
  3048. /* ---------- Sort menu ---------- */
  3049. /* Anchored to the sort button on the right of the nav row, like the "..." menu */
  3050. .fmSortMenu {
  3051. right: 52px;
  3052. top: 46px;
  3053. min-width: 210px;
  3054. }
  3055. /* Greyed section label above the options */
  3056. .fsMenuHeader {
  3057. padding: 3px 6px 4px 6px;
  3058. font-size: 12px;
  3059. color: var(--fs-text-faint);
  3060. cursor: default;
  3061. user-select: none;
  3062. }
  3063. /* The tick sits in the icon column, so the labels stay aligned whether or not
  3064. a mode is active */
  3065. .fmSortOption .fmSortCheck { visibility: hidden; color: var(--fs-accent); }
  3066. .fmSortOption.active .fmSortCheck { visibility: visible; }
  3067. .fmSortOption.active { color: var(--fs-text); }
  3068. /* ======================================================================
  3069. Mobile layout
  3070. ====================================================================== */
  3071. @media only screen and (max-width: 720px) {
  3072. /*
  3073. The nav row becomes two rows: controls on top, the path on its own row
  3074. underneath. A single row cannot hold the breadcrumb and the buttons at
  3075. phone widths without the path collapsing to nothing.
  3076. */
  3077. .fmNav {
  3078. flex-wrap: wrap;
  3079. row-gap: 6px;
  3080. padding: 6px 8px;
  3081. }
  3082. .fmNavBtns { flex-shrink: 0; }
  3083. .fmPathbar {
  3084. order: 10;
  3085. flex-basis: 100%;
  3086. min-width: 0;
  3087. }
  3088. /*
  3089. Push the sort and overflow buttons to the right edge. margin-left:auto on
  3090. the first of them absorbs the free space, so both end up flush right
  3091. regardless of how many nav buttons precede them.
  3092. */
  3093. .fmNav #fmSortBtn { margin-left: auto; }
  3094. /* Menus anchor to the row above the path */
  3095. .fmMoreMenu, .fmSortMenu {
  3096. top: 44px;
  3097. max-width: calc(100vw - 24px);
  3098. }
  3099. /* Status bar: text only, no controls to overflow */
  3100. #fmStatusBar {
  3101. padding: 5px 10px;
  3102. gap: 8px;
  3103. min-height: 0;
  3104. }
  3105. #fmStatusBar .fmStatusBtn { flex-shrink: 0; }
  3106. #selectInfo, #fmSelectionSize { white-space: nowrap; }
  3107. /* Guard: every icon in the bar stays at its intended box even if some
  3108. future rule forgets to size the button around it */
  3109. #fmStatusBar svg { width: 100%; height: 100%; }
  3110. #fmStatusBar .fmStatusBtn { width: 26px; height: 26px; }
  3111. }
  3112. /* Menu entries that cannot act on the current selection are hidden outright
  3113. rather than greyed - the menu is long enough already. */
  3114. .fsMenuItem.fmOprUnusable { display: none !important; }
  3115. /*
  3116. An operation the current special view does not support. Dimmed rather than
  3117. removed from the toolbar: the bar keeps its shape as the user moves in and
  3118. out of the trash bin, and a button that has visibly gone grey explains
  3119. itself better than one that has vanished.
  3120. */
  3121. .fileOprBar .fmOprBlocked,
  3122. .fileOprBar .fmOprBlocked:hover {
  3123. opacity: 0.35;
  3124. pointer-events: none;
  3125. cursor: default;
  3126. background: none;
  3127. }
  3128. /* Menu entries that only make sense on a touch device */
  3129. .fmMobileOnly { display: none; }