Repository: roller Updated Branches: refs/heads/bootstrap-ui 77e003d88 -> 840f46c63
More tweaks to Theme Edit page. Project: http://git-wip-us.apache.org/repos/asf/roller/repo Commit: http://git-wip-us.apache.org/repos/asf/roller/commit/840f46c6 Tree: http://git-wip-us.apache.org/repos/asf/roller/tree/840f46c6 Diff: http://git-wip-us.apache.org/repos/asf/roller/diff/840f46c6 Branch: refs/heads/bootstrap-ui Commit: 840f46c63c86cbfe7da092ff0e956eac3fff3567 Parents: 77e003d Author: Dave Johnson <[email protected]> Authored: Sun Aug 19 16:26:15 2018 -0400 Committer: Dave Johnson <[email protected]> Committed: Sun Aug 19 16:26:15 2018 -0400 ---------------------------------------------------------------------- .../weblogger/business/MediaFileManager.java | 7 + .../business/jpa/JPAMediaFileManagerImpl.java | 21 ++ .../business/themes/ThemeManagerImpl.java | 14 +- .../resources/ApplicationResources.properties | 4 +- .../webapp/WEB-INF/jsps/editor/ThemeEdit.jsp | 252 +++++++++++-------- .../jsps/tiles/tiles-simple-tabbedpage.jsp | 52 ++++ app/src/main/webapp/WEB-INF/tiles.xml | 15 +- app/src/main/webapp/roller-ui/styles/roller.css | 19 +- 8 files changed, 266 insertions(+), 118 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/roller/blob/840f46c6/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java b/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java index 71a7bcd..e345ddd 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java @@ -53,6 +53,13 @@ public interface MediaFileManager { RollerMessages errors) throws WebloggerException; /** + * Create theme media file. + * Same as createMediaFile() except no checks are done for uploads disabled, etc. + */ + void createThemeMediaFile(Weblog weblog, MediaFile mediaFile, + RollerMessages errors) throws WebloggerException; + + /** * Update metadata for a media file */ void updateMediaFile(Weblog weblog, MediaFile mediaFile) http://git-wip-us.apache.org/repos/asf/roller/blob/840f46c6/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java index ab3dc7b..4ebc046 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java @@ -221,6 +221,27 @@ public class JPAMediaFileManagerImpl implements MediaFileManager { } } + public void createThemeMediaFile(Weblog weblog, MediaFile mediaFile, + RollerMessages errors) throws WebloggerException { + + FileContentManager cmgr = WebloggerFactory.getWeblogger().getFileContentManager(); + strategy.store(mediaFile); + + // Refresh associated parent for changes + roller.flush(); + strategy.refresh(mediaFile.getDirectory()); + + // update weblog last modified date. date updated by saveWeblog() + roller.getWeblogManager().saveWeblog(weblog); + + cmgr.saveFileContent(weblog, mediaFile.getId(), + mediaFile.getInputStream()); + + if (mediaFile.isImageFile()) { + updateThumbnail(mediaFile); + } + } + private void updateThumbnail(MediaFile mediaFile) { try { FileContentManager cmgr = WebloggerFactory.getWeblogger() http://git-wip-us.apache.org/repos/asf/roller/blob/840f46c6/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java index ed5f6a9..4f6367c 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java @@ -317,19 +317,15 @@ public class ThemeManagerImpl implements ThemeManager { justName = resourcePath; } else { - justPath = resourcePath.substring(0, - resourcePath.lastIndexOf('/')); + justPath = resourcePath.substring(0, resourcePath.lastIndexOf('/')); if (!justPath.startsWith("/")) { justPath = "/" + justPath; } - justName = resourcePath.substring(resourcePath - .lastIndexOf('/') + 1); - mdir = fileMgr.getMediaFileDirectoryByName(weblog, - justPath); + justName = resourcePath.substring(resourcePath.lastIndexOf('/') + 1); + mdir = fileMgr.getMediaFileDirectoryByName(weblog, justPath); if (mdir == null) { log.debug(" Creating directory: " + justPath); - mdir = fileMgr.createMediaFileDirectory(weblog, - justPath); + mdir = fileMgr.createMediaFileDirectory(weblog, justPath); roller.flush(); } } @@ -354,7 +350,7 @@ public class ThemeManagerImpl implements ThemeManager { log.debug(" Saving file: " + justName); log.debug(" Saving in directory = " + mf.getDirectory()); RollerMessages errors = new RollerMessages(); - fileMgr.createMediaFile(weblog, mf, errors); + fileMgr.createThemeMediaFile(weblog, mf, errors); try { resource.getInputStream().close(); } catch (IOException ex) { http://git-wip-us.apache.org/repos/asf/roller/blob/840f46c6/app/src/main/resources/ApplicationResources.properties ---------------------------------------------------------------------- diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties index 7f4b225..ce46a24 100644 --- a/app/src/main/resources/ApplicationResources.properties +++ b/app/src/main/resources/ApplicationResources.properties @@ -1285,7 +1285,7 @@ searchSummary.text=Showing {0} - {1} of total {2} search results # ----------------------------------------------------------------------- Theme themeEditor.title=Weblog Theme -themeEditor.subtitle=Select theme for weblog <span>{0}</span> +themeEditor.subtitle=Define the theme for weblog <span>{0}</span>. themeEditor.sharedTheme=Shared Theme themeEditor.sharedThemeDescription=This option is for users who don''t \ @@ -1303,6 +1303,8 @@ themeEditor.yourThemeStyleSheet=using the <em>Shared Theme</em> default styleshe themeEditor.youAreUsingACustomTheme=This weblog is using a custom theme. +themeEditor.thisTheme=This theme: + themeEditor.proposedChangeToShared=You are proposing to switch from a Custom Theme to a new Shared Theme. themeEditor.proposedSharedThemeChange=You are proposing to switch to a new Shared Theme. http://git-wip-us.apache.org/repos/asf/roller/blob/840f46c6/app/src/main/webapp/WEB-INF/jsps/editor/ThemeEdit.jsp ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/ThemeEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/ThemeEdit.jsp index 4a07c3e..53d27b1 100644 --- a/app/src/main/webapp/WEB-INF/jsps/editor/ThemeEdit.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/ThemeEdit.jsp @@ -29,128 +29,142 @@ <%-- Two choices side-by-side: choose Shared or Custom Theme --%> - <div class="row equal"> - - <div id="sharedChooser" class="col-md-6 panel"> - <div class="panel-heading"> - <h3 class="panel-title"> - <input id="sharedRadio" type="radio" name="themeType" value="shared" - <s:if test="!customTheme">checked</s:if> onclick="proposeThemeTypeChange($(this))"/> - <s:text name="themeEditor.sharedTheme"/> - </h3> - </div> - <div class="chooser panel-body"> - <s:text name="themeEditor.sharedThemeDescription"/> + <div class="row row-display-flex"> + + <div class="col-xs-6"> + <div class="panel panel-default"> + <div class="panel-body" id="sharedChooser"> + <h3> + <input id="sharedRadio" type="radio" name="themeType" value="shared" + <s:if test="!customTheme">checked</s:if> onclick="proposeThemeTypeChange($(this))"/> + <s:text name="themeEditor.sharedTheme"/> + </h3> + <s:text name="themeEditor.sharedThemeDescription"/> + </div> </div> </div> - <div id="customChooser" class="col-md-6 panel"> - <div class="panel-heading"> - <h3 class="panel-title"> - <input id="customRadio" type="radio" name="themeType" value="custom" - <s:if test="customTheme">checked</s:if> onclick="proposeThemeTypeChange($(this))"/> - <s:text name="themeEditor.customTheme"/> - </h3> - </div> - <div class="chooser panel-body"> - <s:text name="themeEditor.customThemeDescription"/> + <div class="col-xs-6"> + <div class="panel panel-default"> + <div class="panel-body" id="customChooser"> + <h3> + <input id="customRadio" type="radio" name="themeType" value="custom" + <s:if test="customTheme">checked</s:if> onclick="proposeThemeTypeChange($(this))"/> + <s:text name="themeEditor.customTheme"/> + </h3> + <s:text name="themeEditor.customThemeDescription"/> + </div> </div> </div> </div> - <%-- ********************************************************************************************************* --%> + <%-- ================================================= --%> - <div id="sharedNoChange" style="display:none;"> - - <%-- you have shared theme X --%> - <p class="lead"> - <s:text name="themeEditor.yourCurrentTheme"/> - <b><s:property value="actionWeblog.theme.name"/></b> - <s:if test="%{sharedThemeCustomStylesheet}"> - <s:text name="themeEditor.yourCustomStylesheet"/> - </s:if> - <s:else> - <s:text name="themeEditor.yourThemeStyleSheet"/> - </s:else> - </p> + <div id="sharedNoChange" style="display:none;"> - </div> + <%-- you have shared theme X --%> + <p class="lead"> + <s:text name="themeEditor.yourCurrentTheme"/> + <b><s:property value="actionWeblog.theme.name"/></b> + <s:if test="%{sharedThemeCustomStylesheet}"> + <s:text name="themeEditor.yourCustomStylesheet"/> + </s:if> + <s:else> + <s:text name="themeEditor.yourThemeStyleSheet"/> + </s:else> + </p> - <div id="themeChooser" style="display:none;"> + </div> - <%-- theme selector with preview image --%> - <p><s:text name="themeEditor.selectTheme"/></p> - <p> - <s:select id="themeSelector" name="selectedThemeId" list="themes" - listKey="id" listValue="name" size="1" - onchange="proposeSharedThemeChange(this[selectedIndex].value)"/> - </p> - <p id="themeDescription"></p> - <p><img id="themeThumbnail" src=""/></p> + <%-- ================================================= --%> - </div> + <div id="themeChooser" style="display:none;"> - <div id="sharedChangeToShared" style="display:none;"> + <%-- theme selector with preview image --%> + <p class="lead"><s:text name="themeEditor.selectTheme"/></p> + <p> + <s:select id="themeSelector" name="selectedThemeId" list="themes" style="width:20em" + listKey="id" listValue="name" size="1" + onchange="proposeSharedThemeChange(this[selectedIndex].value)"/> + </p> + <p><s:text name="themeEditor.thisTheme"/> <p id="themeDescription"></p> + <p><img id="themeThumbnail" src=""/></p> - <div class="alert-warning" style="margin-top:3em; margin-bottom:2em; padding: 1em"> - <s:text name="themeEditor.proposedSharedThemeChange"/> - </div> + </div> - <%-- Preview and Update buttons --%> - <p> <s:text name="themeEditor.previewDescription"/> </p> - <input type="button" name="themePreview" class="btn" - value="<s:text name='themeEditor.preview' />" - onclick="fullPreview($('#themeSelector').get(0))"/> + <%-- ================================================= --%> - <s:submit cssClass="btn btn-default" value="%{getText('themeEditor.save')}"/> + <div id="sharedChangeToShared" style="display:none;"> + <div class="alert-warning" style="margin-top:3em; margin-bottom:2em; padding: 1em"> + <s:text name="themeEditor.proposedSharedThemeChange"/> </div> - <div id="sharedChangeToCustom" style="display:none;"> + <%-- Preview and Update buttons --%> + <p> <s:text name="themeEditor.previewDescription"/> </p> + <input type="button" name="themePreview" class="btn" + value="<s:text name='themeEditor.preview' />" + onclick="fullPreview($('#themeSelector').get(0))"/> - <div class="alert-warning" style="margin-top:3em; margin-bottom:2em; padding: 1em"> - <s:text name="themeEditor.proposedSharedChangeToCustom"/> - </div> + <s:submit cssClass="btn btn-default" value="%{getText('themeEditor.save')}"/> - <s:if test="firstCustomization"> - <p> - <s:text name="themeEditor.importRequired"/> - <s:hidden name="importTheme" value="true"/> - </p> - </s:if> - <s:else> - <p><s:text name="themeEditor.existingTemplatesWarning"/></p> - <s:checkbox name="importTheme" label="%{getText('themeEditor.importAndOverwriteTemplates')}"/> - </s:else> + <input type="button" class="btn" onclick="cancelChanges()" value="<s:text name='generic.cancel'/>" /> - <%-- Update button --%> - <s:submit cssClass="btn btn-default" value="%{getText('themeEditor.save')}"/> + </div> - </div> + <%-- ================================================= --%> - <%-- ********************************************************************************************************* --%> + <div id="sharedChangeToCustom" style="display:none;"> - <div id="customNoChange" style="display:none;"> - <p class="lead"><s:text name="themeEditor.youAreUsingACustomTheme"/></p> + <div class="alert-warning" style="margin-top:3em; margin-bottom:2em; padding: 1em"> + <s:text name="themeEditor.proposedSharedChangeToCustom"/> </div> - <div id="customChangeToShared" style="display:none;"> + <s:if test="firstCustomization"> + <p> + <s:text name="themeEditor.importRequired"/> + <s:hidden name="importTheme" value="true"/> + </p> + </s:if> + <s:else> + <p><s:text name="themeEditor.existingTemplatesWarning"/></p> + <s:checkbox name="importTheme" label="%{getText('themeEditor.importAndOverwriteTemplates')}"/> + </s:else> + + <%-- Update button --%> + <s:submit cssClass="btn btn-default" value="%{getText('themeEditor.save')}"/> - <div class="alert-warning" style="margin-top:3em; margin-bottom:2em; padding: 1em"> - <s:text name="themeEditor.proposedChangeToShared"/> - </div> + <input type="button" class="btn" onclick="cancelChanges()" value="<s:text name='generic.cancel'/>" /> + + </div> + + <%-- ================================================= --%> + + <div id="customNoChange" style="display:none;"> + <p class="lead"><s:text name="themeEditor.youAreUsingACustomTheme"/></p> + </div> - <%-- Preview and Update buttons --%> - <p> <s:text name="themeEditor.previewDescription"/> </p> - <input type="button" name="themePreview" class="btn" style="margin-bottom:2em" - value="<s:text name='themeEditor.preview' />" - onclick="fullPreview($('#themeSelector').get(0))"/> + <%-- ================================================= --%> - <s:submit cssClass="btn btn-default" value="%{getText('themeEditor.save')}"/> + <div id="customChangeToShared" style="display:none;"> + <div class="alert-warning" style="margin-top:3em; margin-bottom:2em; padding: 1em"> + <s:text name="themeEditor.proposedChangeToShared"/> </div> + <%-- Preview and Update buttons --%> + <p> <s:text name="themeEditor.previewDescription"/> </p> + <input type="button" name="themePreview" class="btn" + value="<s:text name='themeEditor.preview' />" + onclick="fullPreview($('#themeSelector').get(0))"/> + + <s:submit cssClass="btn btn-default" value="%{getText('themeEditor.save')}"/> + + <input type="button" class="btn" onclick="cancelChanges()" value="<s:text name='generic.cancel'/>" /> + + </div> + </s:form> <script type="text/javascript"> @@ -185,6 +199,7 @@ previewImage(themeSelector.options[index].value) } else { + proposedThemeId = originalThemeId proposedChangeType = "custom" } updateView(selected) @@ -192,10 +207,39 @@ function proposeSharedThemeChange(themeId) { proposedThemeId = themeId; - if ( originalType !== "custom" && proposedThemeId !== originalThemeId ) { - } previewImage(themeId) - updateView($('sharedRadio')) + updateView($('#sharedRadio')) + } + + function cancelChanges() { + + proposedThemeId = originalThemeId; + proposedChangeType = originalType; + + hideAll(); + + if ( originalType === "custom" ) { + $("#sharedRadio").prop("checked", false); + $("#customRadio").prop("checked", true); + updateView($("#customRadio")); + + } else { + $("#sharedRadio").prop("checked", true); + $("#customRadio").prop("checked", false); + updateView($("#sharedRadio")); + $("#themeSelector").val(originalThemeId).change(); + previewImage(originalThemeId) + } + + } + + function hideAll() { + $('#themeChooser').hide(); + $('#customNoChange').hide(); + $('#customChangeToShared').hide(); + $('#sharedChangeToShared').hide(); + $('#sharedNoChange').hide(); + $('#sharedChangeToCustom').hide(); } function previewImage(themeId) { @@ -216,21 +260,26 @@ function updateView(selected) { + changed = + (proposedThemeId !== "" && proposedThemeId !== originalThemeId) + || (proposedChangeType !== "" && proposedChangeType !== originalType ) + if (selected[0].value === 'shared') { - $('#sharedChooser').addClass("panel-success"); - $('#customChooser').removeClass("panel-success"); + $('#sharedChooser').css("background", "#bfb") + $('#customChooser').css("background", "white") $('#themeChooser').show(); $('#customNoChange').hide(); $('#customChangeToShared').hide(); - if ( proposedThemeId === "") { + if ( !changed ) { + $('#sharedNoChange').show(); $('#sharedChangeToShared').hide(); $('#sharedChangeToCustom').hide(); - } else if ( proposedThemeId != originalThemeId ) { + } else { if ( originalType === "shared" ) { $('#sharedChangeToShared').show(); @@ -244,19 +293,22 @@ } else { - $('#customChooser').addClass("panel-success"); - $('#sharedChooser').removeClass("panel-success"); + $('#sharedChooser').css("background", "white") + $('#customChooser').css("background", "#bfb") $('#themeChooser').hide(); $('#sharedNoChange').hide(); + $('#sharedChangeToShared').hide(); + $('#sharedChangeToCustom').hide(); + $('#customChangeToShared').hide(); - if ( proposedChangeType !== "" || proposedChangeType !== originalType ) { + if ( !changed ) { + $('#customNoChange').show(); + } else { $('#sharedChangeToCustom').show(); $('#customNoChange').hide(); - } else { - $('#customNoChange').show(); } } http://git-wip-us.apache.org/repos/asf/roller/blob/840f46c6/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simple-tabbedpage.jsp ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simple-tabbedpage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simple-tabbedpage.jsp new file mode 100644 index 0000000..a2bff81 --- /dev/null +++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simple-tabbedpage.jsp @@ -0,0 +1,52 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. The ASF licenses this file to You + under the Apache License, Version 2.0 (the "License"); you may not + use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. For additional information regarding + copyright in this work, please see the NOTICE file in the top level + directory of this distribution. +--%> +<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <link rel="icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon"> + <title><s:property value="getProp('site.shortName')"/>: <s:property value="pageTitle"/></title> + <tiles:insertAttribute name="head"/> + <style> <tiles:insertAttribute name="styles" /> </style> +</head> +<body> + +<tiles:insertAttribute name="bannerStatus"/> + +<div class="row"> + <div class="col-md-12 roller-column-left"> + <div class="panel panel-default"> + <div class="panel-body"> + <tiles:insertAttribute name="messages"/> + <h2 class="roller-page-title"><s:property value="pageTitle"/></h2> + <tiles:insertAttribute name="content"/> + </div> + </div> + </div> +</div> + +<footer class="footer"> + <div class="container"> + <tiles:insertAttribute name="footer"/> + </div> +</footer> + +</body> +</html> http://git-wip-us.apache.org/repos/asf/roller/blob/840f46c6/app/src/main/webapp/WEB-INF/tiles.xml ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/WEB-INF/tiles.xml b/app/src/main/webapp/WEB-INF/tiles.xml index 5804b0f..eef1052 100644 --- a/app/src/main/webapp/WEB-INF/tiles.xml +++ b/app/src/main/webapp/WEB-INF/tiles.xml @@ -43,7 +43,18 @@ <put-attribute name="sidebar" value="/WEB-INF/jsps/tiles/empty.jsp" /> <put-attribute name="footer" value="/WEB-INF/jsps/tiles/footer.jsp" /> </definition> - + + <definition name=".tiles-simple-tabbedpage" template="/WEB-INF/jsps/tiles/tiles-simple-tabbedpage.jsp"> + <put-attribute name="bannerStatus" value="/WEB-INF/jsps/tiles/bannerStatus.jsp" /> + <put-attribute name="userStatus" value="/WEB-INF/jsps/tiles/userStatus.jsp" /> + <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" /> + <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" /> + <put-attribute name="menu" value="/WEB-INF/jsps/tiles/menu.jsp" /> + <put-attribute name="messages" value="/WEB-INF/jsps/tiles/messages.jsp" /> + <put-attribute name="content" value="${content}" /> + <put-attribute name="footer" value="/WEB-INF/jsps/tiles/footer.jsp" /> + </definition> + <definition name=".tiles-simplepage" template="/WEB-INF/jsps/tiles/tiles-simplepage.jsp"> <put-attribute name="banner" value="/WEB-INF/jsps/tiles/empty.jsp" /> <put-attribute name="bannerStatus" value="/WEB-INF/jsps/tiles/bannerStatus.jsp" /> @@ -347,7 +358,7 @@ <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" /> </definition> - <definition name=".ThemeEdit" extends=".tiles-tabbedpage" > + <definition name=".ThemeEdit" extends=".tiles-simple-tabbedpage" > <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" /> <put-attribute name="content" value="/WEB-INF/jsps/editor/ThemeEdit.jsp" /> </definition> http://git-wip-us.apache.org/repos/asf/roller/blob/840f46c6/app/src/main/webapp/roller-ui/styles/roller.css ---------------------------------------------------------------------- diff --git a/app/src/main/webapp/roller-ui/styles/roller.css b/app/src/main/webapp/roller-ui/styles/roller.css index 31206a8..319a59a 100644 --- a/app/src/main/webapp/roller-ui/styles/roller.css +++ b/app/src/main/webapp/roller-ui/styles/roller.css @@ -293,12 +293,19 @@ div.image-controls input { display: inline; } -#sharedChooser, #customChooser { - height: 7em; -} -.equal{ - display: -ms-flexbox; - display: -webkit-flex; + +/* theme edit */ + +.row-display-flex { + display: flex; +} +.row-display-flex > [class*='col-'] { display: flex; + flex-direction: column; } + +#sharedChooser, #customChooser { + height: 10em; +} +
