diff --git a/package.json b/package.json index 4f93a3161..6f7469c36 100644 --- a/package.json +++ b/package.json @@ -96,8 +96,8 @@ "redux-throttle": "0.1.1", "rimraf": "^2.6.1", "scratch-audio": "0.1.0-prerelease.20180625202813", - "scratch-blocks": "0.1.0-prerelease.1533219167", - "scratch-l10n": "3.0.20180719145856", + "scratch-blocks": "0.1.0-prerelease.1533301486", + "scratch-l10n": "3.0.20180803171042", "scratch-paint": "0.2.0-prerelease.20180803171604", "scratch-render": "0.1.0-prerelease.20180724152606", "scratch-storage": "0.5.1", diff --git a/src/components/action-menu/action-menu.css b/src/components/action-menu/action-menu.css index 8f39946c1..e82103ca1 100644 --- a/src/components/action-menu/action-menu.css +++ b/src/components/action-menu/action-menu.css @@ -1,4 +1,5 @@ @import "../../css/colors.css"; +@import "../../css/z-index.css"; $main-button-size: 2.75rem; $more-button-size: 2.25rem; @@ -44,7 +45,7 @@ button::-moz-focus-inner { width: $main-button-size; height: $main-button-size; box-shadow: 0 0 0 4px $motion-transparent; - z-index: 20; /* TODO reorder layout to prevent z-index need */ + z-index: $z-index-add-button; transition: transform, box-shadow 0.5s; } @@ -58,6 +59,10 @@ button::-moz-focus-inner { height: calc($main-button-size - 1rem); } +[dir="rtl"] .main-icon { + transform: scaleX(-1); +} + .more-buttons-outer { /* Need to use two divs to set different overflow x/y @@ -71,6 +76,7 @@ button::-moz-focus-inner { border-top-right-radius: $more-button-size; width: $more-button-size; margin-left: calc(($main-button-size - $more-button-size) / 2); + margin-right: calc(($main-button-size - $more-button-size) / 2); position: absolute; bottom: calc($main-button-size); @@ -150,7 +156,7 @@ button::-moz-focus-inner { border-radius: .25rem !important; box-shadow: 0 0 .5rem hsla(0, 0%, 0%, .25) !important; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important; - z-index: 100 !important; + z-index: $z-index-tooltip !important; } $arrow-size: 0.5rem; diff --git a/src/components/action-menu/action-menu.jsx b/src/components/action-menu/action-menu.jsx index 2725c502b..90555dfd8 100644 --- a/src/components/action-menu/action-menu.jsx +++ b/src/components/action-menu/action-menu.jsx @@ -101,6 +101,7 @@ class ActionMenu extends React.Component { img: mainImg, title: mainTitle, moreButtons, + tooltipPlace, onClick } = this.props; @@ -134,7 +135,7 @@ class ActionMenu extends React.Component { className={styles.tooltip} effect="solid" id={mainTooltipId} - place="left" + place={tooltipPlace || 'left'} />
@@ -142,7 +143,7 @@ class ActionMenu extends React.Component { fileAccept, fileChange, fileInput}, keyId) => { const isComingSoon = !handleClick; const hasFileInput = fileInput; - const tooltipId = title; + const tooltipId = `${mainTooltipId}-${title}`; return (
); @@ -198,7 +199,8 @@ ActionMenu.propTypes = { fileInput: PropTypes.func // Optional, only for file upload })), onClick: PropTypes.func.isRequired, - title: PropTypes.node.isRequired + title: PropTypes.node.isRequired, + tooltipPlace: PropTypes.string }; export default ActionMenu; diff --git a/src/components/asset-panel/selector.css b/src/components/asset-panel/selector.css index 132f7d71d..535c38b0b 100644 --- a/src/components/asset-panel/selector.css +++ b/src/components/asset-panel/selector.css @@ -32,6 +32,7 @@ $fade-out-distance: 100px; position: absolute; bottom: 0; left: 0; + right:0; background: linear-gradient(rgba(232,237,241, 0),rgba(232,237,241, 1)); height: $fade-out-distance; width: 100%; diff --git a/src/components/coming-soon/coming-soon.css b/src/components/coming-soon/coming-soon.css index bdd7f87eb..091d2dd34 100644 --- a/src/components/coming-soon/coming-soon.css +++ b/src/components/coming-soon/coming-soon.css @@ -16,7 +16,7 @@ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important; font-size: 1rem !important; line-height: 1.25rem !important; - z-index: $z-index-coming-soon !important; + z-index: $z-index-tooltip !important; } .coming-soon:after { diff --git a/src/components/forms/label.css b/src/components/forms/label.css index 759a731d3..14691f105 100644 --- a/src/components/forms/label.css +++ b/src/components/forms/label.css @@ -9,13 +9,20 @@ .input-label, .input-label-secondary { font-size: 0.625rem; - margin-right: .5rem; user-select: none; cursor: default; white-space: nowrap; } +[dir="ltr"] .input-label, .input-label-secondary { + margin-right: .5rem; +} + +[dir="rtl"] .input-label, .input-label-secondary { + margin-left: .5rem; +} + .input-label { font-weight: bold; } diff --git a/src/components/gui/gui.css b/src/components/gui/gui.css index e40b02573..1924bd8c4 100644 --- a/src/components/gui/gui.css +++ b/src/components/gui/gui.css @@ -63,7 +63,6 @@ flex-grow: 1; height: 80%; margin-bottom: 0; - margin-left: -0.5rem; border-radius: 1rem 1rem 0 0; border: 1px solid $ui-black-transparent; @@ -82,9 +81,24 @@ white-space: nowrap; } +[dir="ltr"] .tab { + margin-left: -0.5rem; +} + +[dir="rtl"] .tab { + margin-right: -0.5rem; +} + +[dir="ltr"] .tab:nth-of-type(1) { + margin-left: 0; +} + +[dir="rtl"] .tab:nth-of-type(1) { + margin-right: 0; +} + /* Use z-indices to force left-on-top for tabs */ .tab:nth-of-type(1) { - margin-left: 0; z-index: 3; } .tab:nth-of-type(2) { @@ -106,11 +120,19 @@ } .tab img { - margin-right: 0.125rem; width: 1.375rem; filter: grayscale(100%); } +[dir="ltr"] .tab img { + margin-right: 0.125rem; +} + +[dir="rtl"] .tab img { + margin-left: 0.125rem; + transform: scaleX(-1); +} + .tab.is-selected img { filter: none; } @@ -191,7 +213,7 @@ padding-right: $space; min-height: 0; /* this makes it work in Firefox */ - + /* For making the sprite-selector a scrollable pane @todo: Not working in Safari @@ -206,6 +228,7 @@ position: absolute; bottom: 0; left: 0; + right: 0; z-index: $z-index-extension-button; background: $motion-primary; @@ -240,6 +263,10 @@ $fade-out-distance: 15px; height: 1.75rem; } +[dir="rtl"] .extension-button-icon { + transform: scaleX(-1); +} + .extension-button > div { margin-top: 0; } diff --git a/src/components/gui/gui.jsx b/src/components/gui/gui.jsx index 8d251bd14..c3b7cff71 100644 --- a/src/components/gui/gui.jsx +++ b/src/components/gui/gui.jsx @@ -65,6 +65,7 @@ const GUIComponent = props => { importInfoVisible, intl, isPlayerOnly, + isRtl, loading, onExtensionButtonClick, onActivateCostumesTab, @@ -110,6 +111,7 @@ const GUIComponent = props => { ) : ( {previewInfoVisible ? ( @@ -282,6 +284,7 @@ GUIComponent.propTypes = { importInfoVisible: PropTypes.bool, intl: intlShape.isRequired, isPlayerOnly: PropTypes.bool, + isRtl: PropTypes.bool, loading: PropTypes.bool, onActivateCostumesTab: PropTypes.func, onActivateSoundsTab: PropTypes.func, diff --git a/src/components/sound-editor/sound-editor.css b/src/components/sound-editor/sound-editor.css index 7703802e3..c6e620001 100644 --- a/src/components/sound-editor/sound-editor.css +++ b/src/components/sound-editor/sound-editor.css @@ -14,6 +14,10 @@ align-items: center; } +[dir="rtl"] .row-reverse { + flex-direction: row-reverse; +} + .row + .row { margin-top: calc(2 * $space); } @@ -23,15 +27,31 @@ flex-direction: row; } -.input-group + .input-group { +[dir="ltr"] .input-group + .input-group { margin-left: calc(2 * $space); } -.input-group { +[dir="rtl"] .input-group + .input-group { + margin-right: calc(2 * $space); +} + +[dir="ltr"] .input-group { padding-right: calc(2 * $space); border-right: 1px dashed $ui-black-transparent; } +[dir="rtl"] .input-group { + padding-left: calc(2 * $space); + border-left: 1px dashed $ui-black-transparent; +} + +[dir="rtl"] .row-reverse > .input-group { + padding-left: 0; + padding-right: calc(2 * $space); + border-left: none; + border-right: 1px dashed $ui-black-transparent; +} + .waveform-container { display: flex; justify-content: space-around; @@ -87,26 +107,31 @@ $border-radius: 0.25rem; /*min-width: 1.5rem;*/ } +[dir="rtl"] .undo-icon, [dir="rtl"] .redo-icon { + transform: scaleX(-1); +} + .trim-button { display: flex; align-items: center; color: $text-primary; font-size: 0.625rem; - margin-left: 1rem; user-select: none; } +[dir="ltr"] .trim-button { + margin-left: 1rem; +} + +[dir="rtl"] .trim-button { + margin-right: 1rem; +} + .trim-button > img { width: 1.25rem; margin-bottom: -0.375rem; } -.input-group-right { - flex-grow: 1; - display: flex; - flex-direction: row-reverse; -} - .effect-button { flex-basis: 60px; color: $text-primary; @@ -124,26 +149,47 @@ $border-radius: 0.25rem; margin-bottom: -0.375rem; } -.button-group { +[dir="ltr"] .button-group { margin-left: 1rem; } +[dir="rtl"] .button-group { + margin-right: 1rem; +} + .button-group .button { border-radius: 0; - border-left: none; } -.button-group .button:last-of-type { +[dir="ltr"] .button-group .button { + border-left: none; +} +[dir="rtl"] .button-group .button { + border-right: none; +} + +[dir="ltr"] .button-group .button:last-of-type { border-top-right-radius: $border-radius; border-bottom-right-radius: $border-radius; } -.button-group .button:first-of-type { +[dir="ltr"] .button-group .button:first-of-type { border-left: 1px solid $ui-black-transparent; border-top-left-radius: $border-radius; border-bottom-left-radius: $border-radius; } +[dir="rtl"] .button-group .button:last-of-type { + border-top-left-radius: $border-radius; + border-bottom-left-radius: $border-radius; +} + +[dir="rtl"] .button-group .button:first-of-type { + border-right: 1px solid $ui-black-transparent; + border-top-right-radius: $border-radius; + border-bottom-right-radius: $border-radius; +} + .button:disabled > img { opacity: 0.25; } diff --git a/src/components/sound-editor/sound-editor.jsx b/src/components/sound-editor/sound-editor.jsx index a4aafcd91..f97338e06 100644 --- a/src/components/sound-editor/sound-editor.jsx +++ b/src/components/sound-editor/sound-editor.jsx @@ -122,6 +122,7 @@ const SoundEditor = props => ( onClick={props.onUndo} > @@ -133,6 +134,7 @@ const SoundEditor = props => ( onClick={props.onRedo} > @@ -168,7 +170,7 @@ const SoundEditor = props => ( />
-
+
{props.playhead ? (