diff --git a/src/assets/css/dashboard.scss b/src/assets/css/dashboard.scss
index a5209d2604..0bd22a2954 100644
--- a/src/assets/css/dashboard.scss
+++ b/src/assets/css/dashboard.scss
@@ -117,8 +117,15 @@ div[data-role=controlgroup] a[data-role=button]:last-child {
}
div[data-role=controlgroup] a[data-role=button] + a[data-role=button] {
- border-left-width: 0 !important;
- margin: 0 0 0 -0.4em !important;
+ [dir="ltr"] & {
+ border-left-width: 0 !important;
+ margin: 0 0 0 -0.4em !important;
+ }
+
+ [dir="rtl"] & {
+ border-right-width: 0 !important;
+ margin: 0 -0.4em 0 0 !important;
+ }
}
div[data-role=controlgroup] a.ui-btn-active {
diff --git a/src/assets/css/librarybrowser.scss b/src/assets/css/librarybrowser.scss
index 202fd66e08..319c629fe5 100644
--- a/src/assets/css/librarybrowser.scss
+++ b/src/assets/css/librarybrowser.scss
@@ -32,6 +32,39 @@
}
}
+@mixin header-poster-padding-rtl() {
+ padding-left: unset;
+ padding-right: 37.5%;
+
+ @media all and (min-width: 43.75em) {
+ padding-right: 25%;
+ }
+
+ @media all and (min-width: 50em) {
+ padding-right: 20%;
+ }
+
+ @media all and (min-width: 75em) {
+ padding-right: 16.666666666666666666666666666667%;
+ }
+
+ @media all and (min-width: 87.5em) {
+ padding-right: 14.285714285714285714285714285714%;
+ }
+
+ @media all and (min-width: 100em) {
+ padding-right: 12.5%;
+ }
+
+ @media all and (min-width: 120em) {
+ padding-right: 11.111111111111111111111111111111%;
+ }
+
+ @media all and (min-width: 131.25em) {
+ padding-right: 10%;
+ }
+}
+
.headerUserImage,
.navMenuOption,
.pageTitle {
@@ -137,10 +170,17 @@
.pageTitle {
display: inline-flex;
- margin: 0 0 0 0.5em;
height: 1.7em;
align-items: center;
flex-shrink: 1;
+
+ [dir="ltr"] & {
+ margin: 0 0 0 0.5em;
+ }
+
+ [dir="rtl"] & {
+ margin: 0 0.5em 0 0;
+ }
}
.pageTitleWithDefaultLogo {
@@ -162,6 +202,10 @@
background-size: contain;
background-repeat: no-repeat;
width: 13.2em;
+
+ [dir='rtl'] & {
+ background-position: right center;
+ }
}
.skinHeader {
@@ -211,16 +255,30 @@
align-items: center;
text-decoration: none;
color: inherit;
- padding: 0.9em 0 0.9em 2.4em !important;
flex-grow: 1;
font-weight: 400 !important;
margin: 0 !important;
border-radius: 0 !important;
+
+ [dir="ltr"] & {
+ padding: 0.9em 0 0.9em 2.4em !important;
+ }
+
+ [dir="rtl"] & {
+ padding: 0.9em 2.4em 0.9em 0 !important;
+ }
}
.navMenuOptionIcon {
- margin-right: 1.2em;
flex-shrink: 0;
+
+ [dir="ltr"] & {
+ margin-right: 1.2em;
+ }
+
+ [dir="rtl"] & {
+ margin-left: 1.2em;
+ }
}
.navMenuOptionText {
@@ -229,8 +287,15 @@
}
.sidebarHeader {
- padding-left: 1.2em;
margin: 1em 0 0.5em;
+
+ [dir="ltr"] & {
+ padding-left: 1.2em;
+ }
+
+ [dir="rtl"] & {
+ padding-right: 1.2em;
+ }
}
.dashboardDocument .skinBody {
@@ -240,6 +305,10 @@
right: 0;
bottom: 0;
left: 0;
+
+ [dir="rtl"] & {
+ transition: right ease-in-out 0.3s, padding ease-in-out 0.3s;
+ }
}
.centerMessage {
@@ -267,6 +336,14 @@
box-shadow: none !important;
width: 20.205em !important;
font-size: 94%;
+
+ [dir="ltr"] & {
+ left: 0 !important;
+ }
+
+ [dir="rtl"] & {
+ right: 0 !important;
+ }
}
.dashboardDocument .mainDrawer-scrollContainer {
@@ -274,7 +351,13 @@
}
.dashboardDocument .skinBody {
- left: 20em;
+ [dir="ltr"] & {
+ left: 20em;
+ }
+
+ [dir="rtl"] & {
+ right: 20em;
+ }
}
}
@@ -340,7 +423,14 @@
.headerArrowImage {
height: 20px;
- margin-left: 0.5em;
+
+ [dir="ltr"] & {
+ margin-left: 0.5em;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 0.5em;
+ }
}
.backdropContainer {
@@ -370,15 +460,28 @@
}
.viewControls + .listTopPaging {
- margin-left: 0.5em !important;
+ [dir="ltr"] & {
+ margin-left: 0.5em !important;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 0.5em !important;
+ }
}
.criticReview {
margin: 1.5em 0;
background: #222;
- padding: 0.8em 0.8em 0.8em 3em;
border-radius: 0.3em;
position: relative;
+
+ [dir="ltr"] & {
+ padding: 0.8em 0.8em 0.8em 3em;
+ }
+
+ [dir="rtl"] & {
+ padding: 0.8em 3em 0.8em 0.8em;
+ }
}
.detailLogo {
@@ -431,12 +534,25 @@
}
.reviewDate {
- margin-left: 1em;
+ [dir="ltr"] & {
+ margin-left: 1em;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 1em;
+ }
}
.reviewScore {
position: absolute;
- left: 0.8em;
+
+ [dir="ltr"] & {
+ left: 0.8em;
+ }
+
+ [dir="rtl"] & {
+ right: 0.8em;
+ }
}
.itemBackdrop {
@@ -473,8 +589,6 @@
.detailPageContent {
display: flex;
flex-direction: column;
- padding-left: 32.45vw;
- padding-right: 2%;
.layout-mobile & {
padding-left: 5%;
@@ -484,9 +598,25 @@
.layout-desktop &,
.layout-tv & {
.emby-scroller {
- margin-left: 0;
+ [dir="ltr"] & {
+ margin-left: 0;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 0;
+ }
}
}
+
+ [dir="ltr"] & {
+ padding-left: 32.45vw;
+ padding-right: 2%;
+ }
+
+ [dir="rtl"] & {
+ padding-right: 32.45vw;
+ padding-left: 2%;
+ }
}
.detailSectionContent a {
@@ -613,7 +743,6 @@
.layout-mobile .mainDetailButtons {
margin-top: 1em;
margin-bottom: 0.5em;
- margin-left: 0;
@include header-poster-padding;
@@ -622,6 +751,21 @@
margin-bottom: 0;
padding-left: 0;
}
+
+ [dir="ltr"] & {
+ margin-left: 0;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 0;
+ padding-left: unset !important;
+
+ @include header-poster-padding-rtl;
+
+ @media all and (max-width: 32em) {
+ padding-right: 0 !important;
+ }
+ }
}
.subtitle {
@@ -651,15 +795,21 @@
.layout-desktop & {
position: relative;
- padding-left: 32.45vw;
}
.layout-tv & {
display: block;
- padding-left: 32.45vw;
}
}
+.layout-desktop [dir="rtl"] .detailPagePrimaryContainer {
+ padding-right: 32.45vw;
+}
+
+.layout-desktop [dir="ltr"] .detailPagePrimaryContainer {
+ padding-left: 32.45vw;
+}
+
.layout-desktop .detailRibbon {
margin-top: -7.2em;
height: 7.2em;
@@ -676,7 +826,13 @@
flex: 1 0 0;
.layout-mobile & {
- @include header-poster-padding;
+ [dir="ltr"] {
+ @include header-poster-padding;
+ }
+
+ [dir="rtl"] & {
+ @include header-poster-padding-rtl;
+ }
@media all and (max-width: 32em) {
position: relative;
@@ -685,9 +841,16 @@
}
.infoText {
- text-align: left;
min-width: 0;
max-width: 100%;
+
+ [dir="ltr"] & {
+ text-align: left;
+ }
+
+ [dir="rtl"] & {
+ text-align: right;
+ }
}
.detailPageSecondaryContainer {
@@ -749,6 +912,19 @@
width: 25vw;
transform: translateY(-50%);
}
+
+ [dir="rtl"] & {
+ left: unset;
+
+ .layout-mobile &,
+ .layout-tv & {
+ right: 5%;
+ }
+
+ .layout-desktop & {
+ right: 3.3%;
+ }
+ }
}
.detailPagePrimaryContent {
@@ -768,6 +944,10 @@
.itemDetailImage {
width: 100% !important;
box-shadow: 0 0.1em 0.5em 0 rgba(0, 0, 0, 0.75);
+
+ [dir="rtl"] & {
+ box-shadow: 0 0 0.5em 0.1em rgba(0, 0, 0, 0.75);
+ }
}
div.itemDetailGalleryLink.defaultCardBackground {
@@ -871,9 +1051,17 @@ div.itemDetailGalleryLink.defaultCardBackground {
}
.recordingFields button {
- margin-left: 0;
- margin-right: 0.5em;
flex-shrink: 0;
+
+ [dir="ltr"] & {
+ margin-left: 0;
+ margin-right: 0.5em;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 0;
+ margin-left: 0.5em;
+ }
}
.mainDetailButtons.hide + .recordingFields {
@@ -1016,8 +1204,15 @@ div.itemDetailGalleryLink.defaultCardBackground {
}
.mediaInfoLabel {
- margin-right: 1em;
font-weight: 600;
+
+ [dir="ltr"] & {
+ margin-right: 1em;
+ }
+
+ [dir="rtl"] & {
+ margin-left: 1em;
+ }
}
.recordingProgressBar::-moz-progress-bar {
@@ -1107,19 +1302,39 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
}
.sectionTitleButton {
- margin-left: 1.5em !important;
flex-shrink: 0;
+
+ [dir="ltr"] & {
+ margin-left: 1.5em !important;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 1.5em !important;
+ }
}
.sectionTitleButton + .sectionTitleButton {
- margin-left: 0.5em !important;
+ [dir="ltr"] & {
+ margin-left: 0.5em !important;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 0.5em !important;
+ }
}
.sectionTitleIconButton {
- margin-left: 1.5em !important;
flex-shrink: 0;
font-size: 84% !important;
padding: 0.5em !important;
+
+ [dir="ltr"] & {
+ margin-left: 1.5em !important;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 1.5em !important;
+ }
}
.horizontalItemsContainer {
@@ -1148,13 +1363,27 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
}
.padded-left {
- padding-left: 3.3%;
- padding-left: max(env(safe-area-inset-left), 3.3%);
+ [dir="ltr"] & {
+ padding-left: 3.3%;
+ padding-left: max(env(safe-area-inset-left), 3.3%);
+ }
+
+ [dir="rtl"] & {
+ padding-right: 3.3%;
+ padding-right: max(env(safe-area-inset-right), 3.3%);
+ }
}
.padded-right {
- padding-right: 3.3%;
- padding-right: max(env(safe-area-inset-right), 3.3%);
+ [dir="ltr"] & {
+ padding-right: 3.3%;
+ padding-right: max(env(safe-area-inset-right), 3.3%);
+ }
+
+ [dir="rtl"] & {
+ padding-left: 3.3%;
+ padding-left: max(env(safe-area-inset-left), 3.3%);
+ }
}
.padded-top {
diff --git a/src/assets/css/metadataeditor.scss b/src/assets/css/metadataeditor.scss
index 190f53187f..9521728a6e 100644
--- a/src/assets/css/metadataeditor.scss
+++ b/src/assets/css/metadataeditor.scss
@@ -7,7 +7,13 @@
}
.libraryTree {
- margin-left: 0.25em;
+ [dir="ltr"] & {
+ margin-left: 0.25em;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 0.25em;
+ }
}
.offlineEditorNode {
@@ -56,15 +62,30 @@
position: fixed;
top: 5.2em;
bottom: 0;
- left: 0;
width: 30%;
- border-right: 1px solid #555;
display: block;
+
+ [dir="ltr"] & {
+ left: 0;
+ border-right: 1px solid #555;
+ }
+
+ [dir="rtl"] & {
+ right: 0;
+ border-left: 1px solid #555;
+ }
}
.editPageInnerContent {
- float: right;
width: 68.5%;
+
+ [dir="ltr"] & {
+ float: right;
+ }
+
+ [dir="rtl"] & {
+ float: left;
+ }
}
}
diff --git a/src/assets/css/videoosd.scss b/src/assets/css/videoosd.scss
index efe9ab83e3..ff5e94e727 100644
--- a/src/assets/css/videoosd.scss
+++ b/src/assets/css/videoosd.scss
@@ -125,6 +125,10 @@
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
+
+ [dir="rtl"] & {
+ flex-direction: row-reverse;
+ }
}
.osdVolumeSliderContainer {
diff --git a/src/components/actionSheet/actionSheet.scss b/src/components/actionSheet/actionSheet.scss
index 7c1da7ad18..9a9234ffcf 100644
--- a/src/components/actionSheet/actionSheet.scss
+++ b/src/components/actionSheet/actionSheet.scss
@@ -45,7 +45,13 @@
}
.actionsheetListItemBody {
- padding: 0.4em 1em 0.4em 0.6em !important;
+ [dir="ltr"] & {
+ padding: 0.4em 1em 0.4em 0.6em !important;
+ }
+
+ [dir="rtl"] & {
+ padding: 0.4em 0.6em 0.4em 1em !important;
+ }
}
.actionSheetItemText {
@@ -64,8 +70,16 @@
display: flex;
justify-content: flex-end;
flex-shrink: 0;
- margin-left: 5em;
- margin-right: 0.5em;
+
+ [dir="ltr"] & {
+ margin-left: 5em;
+ margin-right: 0.5em;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 5em;
+ margin-left: 0.5em;
+ }
}
.actionSheetScroller {
@@ -101,8 +115,15 @@
}
.actionsheetMenuItemIcon {
- margin: 0 0.85em 0 0.45em !important;
padding: 0 !important;
+
+ [dir="ltr"] & {
+ margin: 0 0.85em 0 0.45em !important;
+ }
+
+ [dir="rtl"] & {
+ margin: 0 0.45em 0 0.85em !important;
+ }
}
.actionsheet-xlargeFont {
@@ -112,5 +133,12 @@
.btnCloseActionSheet {
position: fixed;
top: 0.75em;
- left: 0.5em;
+
+ [dir="ltr"] & {
+ left: 0.5em;
+ }
+
+ [dir="rtl"] & {
+ right: 0.5em;
+ }
}
diff --git a/src/components/alphaPicker/style.scss b/src/components/alphaPicker/style.scss
index 7a3f6eaf87..86d7e773e1 100644
--- a/src/components/alphaPicker/style.scss
+++ b/src/components/alphaPicker/style.scss
@@ -110,14 +110,28 @@
}
.alphaPicker-fixed-right {
- right: 0.4em;
- right: max(env(safe-area-inset-right), 0.4em);
+ [dir="ltr"] & {
+ right: 0.4em;
+ right: max(env(safe-area-inset-right), 0.4em);
+ }
+
+ [dir="rtl"] & {
+ left: 0.4em;
+ left: max(env(safe-area-inset-left), 0.4em);
+ }
}
@media all and (min-width: 62.5em) {
.alphaPicker-fixed-right {
- right: 1em;
- right: max(env(safe-area-inset-right), 1em);
+ [dir="ltr"] & {
+ right: 1em;
+ right: max(env(safe-area-inset-right), 1em);
+ }
+
+ [dir="rtl"] & {
+ left: 1em;
+ left: max(env(safe-area-inset-left), 1em);
+ }
}
}
diff --git a/src/components/cardbuilder/card.scss b/src/components/cardbuilder/card.scss
index ffd395a733..e43b488dbe 100644
--- a/src/components/cardbuilder/card.scss
+++ b/src/components/cardbuilder/card.scss
@@ -302,7 +302,14 @@ button::-moz-focus-inner {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
- text-align: left;
+
+ [dir="ltr"] & {
+ text-align: left;
+ }
+
+ [dir="rtl"] & {
+ text-align: right;
+ }
}
.dialog .cardText {
@@ -364,7 +371,7 @@ button::-moz-focus-inner {
.cardTextCentered,
.cardTextCentered > .textActionButton {
- text-align: center;
+ text-align: center !important;
}
.cardText-rightmargin {
@@ -396,21 +403,35 @@ button::-moz-focus-inner {
}
.cardIndicators {
- right: 0.225em;
top: 0.225em;
position: absolute;
display: flex;
align-items: center;
contain: layout style;
+
+ [dir="ltr"] & {
+ right: 0.225em;
+ }
+
+ [dir="rtl"] & {
+ left: 0.225em;
+ }
}
.cardProgramAttributeIndicators {
top: 0;
- left: 0;
position: absolute;
display: flex;
text-transform: uppercase;
font-size: 92%;
+
+ [dir="ltr"] & {
+ left: 0;
+ }
+
+ [dir="rtl"] & {
+ right: 0;
+ }
}
.programAttributeIndicator {
@@ -430,7 +451,14 @@ button::-moz-focus-inner {
.cardOverlayButton-br {
position: absolute;
bottom: 0;
- right: 0;
+
+ [dir="ltr"] & {
+ right: 0;
+ }
+
+ [dir="rtl"] & {
+ left: 0;
+ }
}
.cardOverlayButtonIcon {
diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js
index 5bc6bf88ad..658837df83 100644
--- a/src/components/cardbuilder/cardBuilder.js
+++ b/src/components/cardbuilder/cardBuilder.js
@@ -705,7 +705,7 @@ import { appRouter } from '../appRouter';
if (text) {
html += "
";
- html += text;
+ html += '' + text + '';
html += '
';
valid++;
@@ -908,19 +908,20 @@ import { appRouter } from '../appRouter';
}
if (options.showYear || options.showSeriesYear) {
+ const productionYear = item.ProductionYear && datetime.toLocaleString(item.ProductionYear, {useGrouping: false});
if (item.Type === 'Series') {
if (item.Status === 'Continuing') {
- lines.push(globalize.translate('SeriesYearToPresent', item.ProductionYear || ''));
+ lines.push(globalize.translate('SeriesYearToPresent', productionYear || ''));
} else {
if (item.EndDate && item.ProductionYear) {
- const endYear = datetime.parseISO8601Date(item.EndDate).getFullYear();
- lines.push(item.ProductionYear + ((endYear === item.ProductionYear) ? '' : (' - ' + endYear)));
+ const endYear = datetime.toLocaleString(datetime.parseISO8601Date(item.EndDate).getFullYear(), {useGrouping: false});
+ lines.push(productionYear + ((endYear === item.ProductionYear) ? '' : (' - ' + endYear)));
} else {
- lines.push(item.ProductionYear || '');
+ lines.push(productionYear || '');
}
}
} else {
- lines.push(item.ProductionYear || '');
+ lines.push(productionYear || '');
}
}
diff --git a/src/components/dialog/dialog.template.html b/src/components/dialog/dialog.template.html
index 6d4310c0f4..a424edab9e 100644
--- a/src/components/dialog/dialog.template.html
+++ b/src/components/dialog/dialog.template.html
@@ -1,5 +1,5 @@
diff --git a/src/components/formdialog.scss b/src/components/formdialog.scss
index 9edd2aa1b2..68dca09589 100644
--- a/src/components/formdialog.scss
+++ b/src/components/formdialog.scss
@@ -12,15 +12,27 @@
}
.formDialogHeaderTitle {
- margin-left: 0.25em;
-
/* In case of h1, h2, h3 */
margin-top: 0;
margin-bottom: 0;
+
+ [dir="ltr"] & {
+ margin-left: 0.25em;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 0.25em;
+ }
}
.formDialogHeaderTitle:first-child {
- margin-left: 1em;
+ [dir="ltr"] & {
+ margin-left: 1em;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 1em;
+ }
}
.formDialogContent:not(.no-grow) {
@@ -98,8 +110,8 @@
.formDialogFooterItem-autosize {
flex-basis: initial;
flex-grow: initial;
- padding-left: 2em;
padding-right: 2em;
+ padding-left: 2em;
}
@media all and (min-width: 50em) {
diff --git a/src/components/guide/guide.scss b/src/components/guide/guide.scss
index 4373f697ec..0ec6885281 100644
--- a/src/components/guide/guide.scss
+++ b/src/components/guide/guide.scss
@@ -307,13 +307,20 @@
}
.programIcon {
- margin-left: 0.5em;
height: 1em;
width: 1em;
font-size: 1.6em;
color: #ddd;
flex-shrink: 0;
flex-grow: 0;
+
+ [dir="ltr"] & {
+ margin-left: 0.5em;
+ }
+
+ [dir="rtl"] & {
+ margin-right: 0.5em;
+ }
}
.guide-programTextIcon {
@@ -340,11 +347,19 @@
}
.guideChannelName {
- margin-left: auto;
- margin-right: 1em;
text-overflow: ellipsis;
overflow: hidden;
max-width: 70%;
+
+ [dir="ltr"] & {
+ margin-left: auto;
+ margin-right: 1em;
+ }
+
+ [dir="rtl"] & {
+ margin-right: auto;
+ margin-left: 1em;
+ }
}
.guideChannelImage {
diff --git a/src/components/imageUploader/imageUploader.template.html b/src/components/imageUploader/imageUploader.template.html
index 8903aa0106..0286991c63 100644
--- a/src/components/imageUploader/imageUploader.template.html
+++ b/src/components/imageUploader/imageUploader.template.html
@@ -13,7 +13,7 @@
${HeaderAddUpdateImage}
-