diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | cmake/modules/ECMAddAppIcon.cmake | 24 | ||||
-rw-r--r-- | src/common/utility_win.cpp | 10 | ||||
-rw-r--r-- | src/gui/CMakeLists.txt | 103 | ||||
-rw-r--r-- | src/gui/configgui.h.in | 4 | ||||
-rw-r--r-- | theme/colored/icons/Nextcloud-icon-win-folder.svg | 278 |
6 files changed, 401 insertions, 19 deletions
diff --git a/.gitignore b/.gitignore index 15a7371a0..dcd25d421 100644 --- a/.gitignore +++ b/.gitignore @@ -184,6 +184,7 @@ compile_commands.json convert.exe .dir-locals.el *-icon.png +*-icon-win-folder.png *-sidebar.png *-w10startmenu.png theme.qrc diff --git a/cmake/modules/ECMAddAppIcon.cmake b/cmake/modules/ECMAddAppIcon.cmake index 3934491bd..61dba6c42 100644 --- a/cmake/modules/ECMAddAppIcon.cmake +++ b/cmake/modules/ECMAddAppIcon.cmake @@ -41,7 +41,7 @@ # target does not have the ``WIN32_EXECUTABLE`` property set. # * One of the tools png2ico (See :find-module:`FindPng2Ico`) or # icotool (see :find-module:`FindIcoTool`) is required. -# * Supported sizes: 16, 24, 32, 48, 64, 128, 256, 512 and 1024. +# * Supported sizes: 16, 20, 24, 32, 40, 48, 64, 128, 256, 512 and 1024. # # Mac OS X notes # * The executable target must have the ``MACOSX_BUNDLE`` property set. @@ -102,9 +102,12 @@ include(CMakeParseArguments) function(ecm_add_app_icon appsources) set(options) - set(oneValueArgs OUTFILE_BASENAME) - set(multiValueArgs ICONS SIDEBAR_ICONS) + set(oneValueArgs OUTFILE_BASENAME ICON_INDEX) + set(multiValueArgs ICONS SIDEBAR_ICONS RC_DEPENDENCIES) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + if (NOT ARG_ICON_INDEX) + set(ARG_ICON_INDEX 1) + endif() if(NOT ARG_ICONS) message(FATAL_ERROR "No ICONS argument given to ecm_add_app_icon") @@ -138,8 +141,11 @@ function(ecm_add_app_icon appsources) endforeach() endif() - - _ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;24;32;48;64;128;256;512;1024") + if (WIN32) + _ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;20;24;32;40;48;64;128;256;512;1024") + else() + _ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;24;32;48;64;128;256;512;1024") + endif() if(ARG_SIDEBAR_ICONS) _ecm_add_app_icon_categorize_icons("${ARG_SIDEBAR_ICONS}" "sidebar_icons" "16;32;64;128;256") endif() @@ -168,8 +174,10 @@ function(ecm_add_app_icon appsources) set(windows_icons ${icons_at_16px} + ${icons_at_20px} ${icons_at_24px} ${icons_at_32px} + ${icons_at_40px} ${icons_at_48px} ${icons_at_64px} ${icons_at_128px} @@ -204,12 +212,12 @@ function(ecm_add_app_icon appsources) WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) # this bit's a little hacky to make the dependency stuff work - file(WRITE "${_outfilename}.rc.in" "IDI_ICON1 ICON DISCARDABLE \"${_outfilename}.ico\"\n") + file(WRITE "${_outfilename}.rc.in" "IDI_ICON${ARG_ICON_INDEX} ICON DISCARDABLE \"${_outfilename}.ico\"\n") add_custom_command( OUTPUT "${_outfilename}.rc" COMMAND ${CMAKE_COMMAND} ARGS -E copy "${_outfilename}.rc.in" "${_outfilename}.rc" - DEPENDS "${_outfilename}.ico" + DEPENDS ${ARG_RC_DEPENDENCIES} "${_outfilename}.ico" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) endfunction() @@ -226,7 +234,7 @@ function(ecm_add_app_icon appsources) endif() endforeach() - foreach(size 16 24 32 48 64 128 ${maxSize}) + foreach(size 16 20 24 32 40 48 64 128 ${maxSize}) if(NOT icons_at_${size}px) continue() endif() diff --git a/src/common/utility_win.cpp b/src/common/utility_win.cpp index 5637a023e..80907ea5d 100644 --- a/src/common/utility_win.cpp +++ b/src/common/utility_win.cpp @@ -18,6 +18,7 @@ #include "asserts.h" #include "utility.h" +#include "gui/configgui.h" #include <comdef.h> #include <Lmcons.h> @@ -48,7 +49,14 @@ static void setupFavLink_private(const QString &folder) desktopIni.open(QFile::WriteOnly); desktopIni.write("[.ShellClassInfo]\r\nIconResource="); desktopIni.write(QDir::toNativeSeparators(qApp->applicationFilePath()).toUtf8()); - desktopIni.write(",0\r\n"); +#ifdef APPLICATION_FOLDER_ICON_INDEX + const auto iconIndex = APPLICATION_FOLDER_ICON_INDEX; +#else + const auto iconIndex = "0"; +#endif + desktopIni.write(","); + desktopIni.write(iconIndex); + desktopIni.write("\r\n"); desktopIni.close(); // Set the folder as system and Desktop.ini as hidden+system for explorer to pick it. diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 794f44f27..abf2a190a 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -258,6 +258,10 @@ if (NOT DEFINED APPLICATION_ICON_NAME) set(APPLICATION_ICON_NAME ${APPLICATION_SHORTNAME}) endif() +if(NOT DEFINED APPLICATION_FOLDER_ICON_INDEX) + set(APPLICATION_FOLDER_ICON_INDEX 0) +endif() + # Generate png icons from svg find_program(SVG_CONVERTER NAMES inkscape inkscape.exe rsvg-convert @@ -269,9 +273,24 @@ if (NOT SVG_CONVERTER) endif() function(generate_sized_png_from_svg icon_path size) + set(options) + set(oneValueArgs OUTPUT_ICON_NAME OUTPUT_ICON_PATH) + set(multiValueArgs) + + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + get_filename_component(icon_name_dir ${icon_path} DIRECTORY) get_filename_component(icon_name_wle ${icon_path} NAME_WLE) + if (ARG_OUTPUT_ICON_NAME) + set(icon_name_wle ${ARG_OUTPUT_ICON_NAME}) + endif () + + if (ARG_OUTPUT_ICON_PATH) + set(icon_name_dir ${ARG_OUTPUT_ICON_PATH}) + endif () + + if (EXISTS "${icon_name_dir}/${size}-${icon_name_wle}.png") return() endif() @@ -317,22 +336,84 @@ if(WIN32) endif() set(APP_ICON_SVG "${theme_dir}/colored/${APPLICATION_ICON_NAME}-icon.svg") -generate_sized_png_from_svg(${APP_ICON_SVG} 16) -generate_sized_png_from_svg(${APP_ICON_SVG} 24) -generate_sized_png_from_svg(${APP_ICON_SVG} 32) -generate_sized_png_from_svg(${APP_ICON_SVG} 48) -generate_sized_png_from_svg(${APP_ICON_SVG} 64) -generate_sized_png_from_svg(${APP_ICON_SVG} 128) -generate_sized_png_from_svg(${APP_ICON_SVG} 256) -generate_sized_png_from_svg(${APP_ICON_SVG} 512) -generate_sized_png_from_svg(${APP_ICON_SVG} 1024) + +# generate secondary icon if available (currently for Windows only)-------------------------------------- +set(APP_SECONDARY_ICONS "${theme_dir}/colored/icons") +set(APP_ICON_WIN_FOLDER_SVG "${APP_SECONDARY_ICONS}/${APPLICATION_ICON_NAME}-icon-win-folder.svg") + +set(RC_DEPENDENCIES "") + +if (EXISTS ${APP_ICON_WIN_FOLDER_SVG}) + get_filename_component(output_icon_name_win ${APP_ICON_WIN_FOLDER_SVG} NAME_WLE) + # Product icon (for smallest size) + foreach(size IN ITEMS 16;20) + generate_sized_png_from_svg(${APP_ICON_SVG} ${size} OUTPUT_ICON_NAME ${output_icon_name_win} OUTPUT_ICON_PATH "${APP_SECONDARY_ICONS}/") + endforeach() + + # Product icon with Windows folder (for sizes larger than 20) + foreach(size IN ITEMS 24;32;40;48;64;128;256;512;1024) + generate_sized_png_from_svg(${APP_ICON_WIN_FOLDER_SVG} ${size} OUTPUT_ICON_NAME ${output_icon_name_win} OUTPUT_ICON_PATH "${APP_SECONDARY_ICONS}/") + endforeach() + + file(GLOB_RECURSE OWNCLOUD_ICONS_WIN_FOLDER "${APP_SECONDARY_ICONS}/*-${APPLICATION_ICON_NAME}-icon*") + set(APP_ICON_WIN_FOLDER_ICO_NAME "${APPLICATION_ICON_NAME}-win-folder") + set(RC_DEPENDENCIES "${RC_DEPENDENCIES} ${APP_ICON_WIN_FOLDER_ICO_NAME}.ico") + ecm_add_app_icon(APP_ICON_WIN_FOLDER ICONS "${OWNCLOUD_ICONS_WIN_FOLDER}" SIDEBAR_ICONS "${OWNCLOUD_SIDEBAR_ICONS}" OUTFILE_BASENAME "${APP_ICON_WIN_FOLDER_ICO_NAME}" ICON_INDEX 2) +endif() +# -------------------------------------- + +if (NOT ${RC_DEPENDENCIES} STREQUAL "") + string(STRIP ${RC_DEPENDENCIES} RC_DEPENDENCIES) +endif() + +# generate primary icon from SVG (due to Win .ico vs .rc dependency issues, primary icon must always be generated last)-------------------------------------- +if(WIN32) + foreach(size IN ITEMS 16;20;24;32;40;48;64;128;256;512;1024) + generate_sized_png_from_svg(${APP_ICON_SVG} ${size}) + endforeach() +else() + foreach(size IN ITEMS 16;24;32;48;64;128;256;512;1024) + generate_sized_png_from_svg(${APP_ICON_SVG} ${size}) + endforeach() +endif() file(GLOB_RECURSE OWNCLOUD_ICONS "${theme_dir}/colored/*-${APPLICATION_ICON_NAME}-icon*") + if(APPLE) file(GLOB_RECURSE OWNCLOUD_SIDEBAR_ICONS "${theme_dir}/colored/*-${APPLICATION_ICON_NAME}-sidebar*") MESSAGE(STATUS "OWNCLOUD_SIDEBAR_ICONS: ${APPLICATION_ICON_NAME}: ${OWNCLOUD_SIDEBAR_ICONS}") endif() -ecm_add_app_icon(APP_ICON ICONS "${OWNCLOUD_ICONS}" SIDEBAR_ICONS "${OWNCLOUD_SIDEBAR_ICONS}" OUTFILE_BASENAME "${APPLICATION_ICON_NAME}") + +ecm_add_app_icon(APP_ICON RC_DEPENDENCIES ${RC_DEPENDENCIES} ICONS "${OWNCLOUD_ICONS}" SIDEBAR_ICONS "${OWNCLOUD_SIDEBAR_ICONS}" OUTFILE_BASENAME "${APPLICATION_ICON_NAME}" ICON_INDEX 1) +# -------------------------------------- + +if(WIN32) +# merge *.rc.in files for Windows (multiple ICON resources must be placed in a single file, otherwise, this won't work de to a bug in Windows compiler https://developercommunity.visualstudio.com/t/visual-studio-2017-prof-1557-cvt1100-duplicate-res/363156) + function(merge_files IN_FILE OUT_FILE) + file(READ ${IN_FILE} CONTENTS) + message("Merging ${IN_FILE} into ${OUT_FILE}") + file(APPEND ${OUT_FILE} "${CONTENTS}") + endfunction() + message("APP_ICON is: ${APP_ICON}") + if(APP_ICON) + get_filename_component(RC_IN_FOLDER ${APP_ICON}} DIRECTORY) + + file(GLOB_RECURSE RC_IN_FILES "${RC_IN_FOLDER}/*rc.in") + + foreach(rc_in_file IN ITEMS ${RC_IN_FILES}) + get_filename_component(rc_in_file_name ${rc_in_file} NAME) + get_filename_component(app_icon_name "${APP_ICON}.in" NAME) + if(NOT "${rc_in_file_name}" STREQUAL "${app_icon_name}") + merge_files(${rc_in_file} "${APP_ICON}.in") + if (DEFINED APPLICATION_FOLDER_ICON_INDEX) + MATH(EXPR APPLICATION_FOLDER_ICON_INDEX "${APPLICATION_FOLDER_ICON_INDEX}+1") + message("APPLICATION_FOLDER_ICON_INDEX is now set to: ${APPLICATION_FOLDER_ICON_INDEX}") + endif() + endif() + endforeach() + endif() +endif() +# -------------------------------------- if(UNIX AND NOT APPLE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE") @@ -545,3 +626,5 @@ if(NOT BUILD_OWNCLOUD_OSX_BUNDLE AND NOT WIN32) update_xdg_mimetypes( ${CMAKE_INSTALL_DATADIR}/mime/packages ) endif(SharedMimeInfo_FOUND) endif() + +configure_file(configgui.h.in ${CMAKE_CURRENT_BINARY_DIR}/configgui.h) diff --git a/src/gui/configgui.h.in b/src/gui/configgui.h.in new file mode 100644 index 000000000..36bc6fbfc --- /dev/null +++ b/src/gui/configgui.h.in @@ -0,0 +1,4 @@ +#ifndef CONFIG_GUI_H +#define CONFIG_GUI_H +#cmakedefine APPLICATION_FOLDER_ICON_INDEX "@APPLICATION_FOLDER_ICON_INDEX@" +#endif diff --git a/theme/colored/icons/Nextcloud-icon-win-folder.svg b/theme/colored/icons/Nextcloud-icon-win-folder.svg new file mode 100644 index 000000000..2fbba0bdb --- /dev/null +++ b/theme/colored/icons/Nextcloud-icon-win-folder.svg @@ -0,0 +1,278 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 26.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Ebene_1" + x="0px" + y="0px" + viewBox="0 0 300 300" + style="enable-background:new 0 0 300 300;" + xml:space="preserve" + sodipodi:docname="Windows_Folder.svg" + inkscape:version="1.1.1 (1:1.1+202109281949+c3084ef5ed)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs74"> + + + + <linearGradient + id="Pfad_499_00000161620552563728473090000003454445015337385602_" + gradientUnits="userSpaceOnUse" + x1="3.5778999" + y1="299.08331" + x2="3.5778999" + y2="297.29568" + gradientTransform="matrix(72,0,0,-72,49,21673)"> + <stop + offset="0" + style="stop-color:#FE319A" + id="stop59" /> + <stop + offset="1" + style="stop-color:#E20074" + id="stop61" /> + </linearGradient> + + + + + <linearGradient + gradientTransform="matrix(0.9909162,0,0,0.99091623,283.08824,126.10294)" + inkscape:collect="always" + xlink:href="#linearGradient857" + id="linearGradient1192" + gradientUnits="userSpaceOnUse" + x1="18.230097" + y1="150" + x2="150.00002" + y2="-7.6293945e-06" /><linearGradient + inkscape:collect="always" + id="linearGradient857"><stop + style="stop-color:#0082c9;stop-opacity:1;" + offset="0" + id="stop853" /><stop + style="stop-color:#1cafff;stop-opacity:1" + offset="1" + id="stop855" /></linearGradient></defs><sodipodi:namedview + id="namedview72" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="1.9233304" + inkscape:cx="123.48372" + inkscape:cy="174.17704" + inkscape:window-width="1920" + inkscape:window-height="1046" + inkscape:window-x="0" + inkscape:window-y="34" + inkscape:window-maximized="1" + inkscape:current-layer="Ebene_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:url(#SVGID_1_);} + .st1{fill:url(#SVGID_00000073698049827524260440000006626317865822427277_);} + .st2{fill:url(#SVGID_00000058549202148666045310000006535695705354523308_);} + .st3{fill:url(#SVGID_00000135661076229880923210000014324535628046543800_);} + .st4{fill:url(#SVGID_00000090993352524005697930000005123350809455339168_);} + .st5{fill:#FDE07F;} + .st6{fill:#FFEEB6;} + .st7{clip-path:url(#SVGID_00000027581996385575992730000014613207578918336175_);} + .st8{fill:url(#Pfad_499_00000154407742523961947240000000935762443450757262_);} + .st9{fill:#FFFFFF;} + .st10{fill:#F2F2F2;} +</style> +<g + id="g51"> + <linearGradient + id="SVGID_1_" + gradientUnits="userSpaceOnUse" + x1="224.238" + y1="251.2621" + x2="235.5521" + y2="229.8477"> + <stop + offset="0" + style="stop-color:#E5E5E5" + id="stop4" /> + <stop + offset="1" + style="stop-color:#F2F2F2;stop-opacity:0" + id="stop6" /> + </linearGradient> + <polygon + class="st0" + points="221,245 251,236 221,222 " + id="polygon9" /> + + <linearGradient + id="SVGID_00000168800218275837730680000003462325949068373151_" + gradientUnits="userSpaceOnUse" + x1="108.238" + y1="292.2621" + x2="119.5521" + y2="270.8477"> + <stop + offset="0" + style="stop-color:#E5E5E5" + id="stop11" /> + <stop + offset="1" + style="stop-color:#F2F2F2;stop-opacity:0" + id="stop13" /> + </linearGradient> + <polygon + style="fill:url(#SVGID_00000168800218275837730680000003462325949068373151_);" + points="105,286 135,277 105,263 " + id="polygon16" /> + + <linearGradient + id="SVGID_00000003802560936691988940000016049607085827979708_" + gradientUnits="userSpaceOnUse" + x1="51.9582" + y1="185.0925" + x2="200.6586" + y2="104.7857"> + <stop + offset="0.3193" + style="stop-color:#EBC863" + id="stop18" /> + <stop + offset="1" + style="stop-color:#FEE182" + id="stop20" /> + </linearGradient> + <path + style="fill:url(#SVGID_00000003802560936691988940000016049607085827979708_);" + d="M219,246H56c-1.7,0-3-1.3-3-3V33h151 c1.7,0,3,1.3,3,3v125.2c0,0.8,0.3,1.5,0.9,2.1l13.3,13.6c0.5,0.6,0.9,1.3,0.9,2.1V243C222,244.7,220.7,246,219,246z" + id="path23" /> + <g + id="g39"> + + <linearGradient + id="SVGID_00000088830071281327557650000012927193665735863469_" + gradientUnits="userSpaceOnUse" + x1="81.921" + y1="116.6131" + x2="83.1607" + y2="222.7924"> + <stop + offset="0" + style="stop-color:#FFEFBC" + id="stop25" /> + <stop + offset="1" + style="stop-color:#FFE495" + id="stop27" /> + </linearGradient> + <path + style="fill:url(#SVGID_00000088830071281327557650000012927193665735863469_);" + d="M103.5,286L54,246V33l55.9,44.1 c0.7,0.6,1.1,1.4,1.1,2.4V211l-5,7v66.9C106,286.1,104.5,286.8,103.5,286z" + id="path30" /> + + <linearGradient + id="SVGID_00000075125985038499810010000013334681634146325900_" + gradientUnits="userSpaceOnUse" + x1="58.9558" + y1="126.3097" + x2="117.1869" + y2="218.9498"> + <stop + offset="0" + style="stop-color:#FFEAA5" + id="stop32" /> + <stop + offset="1" + style="stop-color:#FFE086" + id="stop34" /> + </linearGradient> + <path + style="fill:url(#SVGID_00000075125985038499810010000013334681634146325900_);" + d="M102.5,285.7l-49.5-40V33l55.8,44 c0.7,0.6,1.1,1.4,1.1,2.4v131.4l-5,7v66.8C104.9,285.8,103.5,286.5,102.5,285.7z" + id="path37" /> + </g> + <g + id="g49"> + <rect + x="60" + y="46" + class="st5" + width="1" + height="200" + id="rect41" /> + <rect + x="56.5" + y="46" + class="st5" + width="1" + height="200" + id="rect43" /> + <rect + x="57.5" + y="46" + class="st6" + width="1" + height="200" + id="rect45" /> + <rect + x="61" + y="46" + class="st6" + width="1" + height="200" + id="rect47" /> + </g> +</g> +<g + id="g69" + transform="translate(0,-100)"> + <defs + id="defs54"> + <rect + id="SVGID_00000093176395783954265780000012512996052019405743_" + x="122.3" + y="139" + width="128.7" + height="128.7" /> + </defs> + <clipPath + id="SVGID_00000106127748250350940740000017471206982484828042_"> + <use + xlink:href="#SVGID_00000093176395783954265780000012512996052019405743_" + style="overflow:visible" + id="use56" + x="0" + y="0" + width="100%" + height="100%" /> + </clipPath> + + <g + id="g925" + transform="matrix(0.81518987,0,0,0.81518987,-44.170655,200.60216)"><circle + r="79" + cy="126.10294" + cx="283.08823" + id="circle1050" + style="fill:url(#linearGradient1192);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.0990916;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:export-filename="nextcloud-icon.png" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" /><path + inkscape:connector-curvature="0" + id="path1052" + d="m 283.18965,95.813064 c -13.79313,0 -25.48394,9.350826 -29.10731,22.020146 -3.14909,-6.72 -9.97328,-11.42792 -17.83356,-11.42792 -10.80973,0 -19.69562,8.88589 -19.69562,19.69562 0,10.80972 8.88589,19.69967 19.69562,19.69967 7.86028,0 14.68447,-4.7108 17.83356,-11.43198 3.62337,12.67028 15.31418,22.02422 29.10731,22.02422 13.69111,0 25.32232,-9.21286 29.03837,-21.74023 3.20726,6.56859 9.94698,11.14799 17.69562,11.14799 10.80974,0 19.69967,-8.88995 19.69967,-19.69967 0,-10.80973 -8.88993,-19.69562 -19.69967,-19.69562 -7.74864,0 -14.48836,4.57653 -17.69562,11.14395 -3.71605,-12.5264 -15.34726,-21.736176 -29.03837,-21.736176 z m 0,11.561796 c 10.41225,0 18.73011,8.31383 18.73011,18.72605 0,10.41221 -8.31786,18.73011 -18.73011,18.73011 -10.41219,0 -18.72603,-8.3179 -18.72603,-18.73011 0,-10.41222 8.31384,-18.72605 18.72603,-18.72605 z m -46.94087,10.59222 c 4.56183,0 8.13788,3.57198 8.13788,8.13383 0,4.56184 -3.57605,8.13787 -8.13788,8.13787 -4.56183,0 -8.13385,-3.57603 -8.13385,-8.13787 0,-4.56185 3.57202,-8.13383 8.13385,-8.13383 z m 93.67486,0 c 4.56187,0 8.1379,3.57198 8.1379,8.13383 0,4.56184 -3.57605,8.13787 -8.1379,8.13787 -4.56181,0 -8.13381,-3.57603 -8.13381,-8.13787 0,-4.56185 3.57201,-8.13383 8.13381,-8.13383 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.50314;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + inkscape:export-filename="Nextcloud Hub logo variants.png" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" /></g> +</g> +</svg> |