discourse/app/assets/stylesheets/common/admin/customize.scss
David Taylor 880311dd4d
FEATURE: Support for localized themes (#6848)
- Themes can supply translation files in a format like `/locales/{locale}.yml`. These files should be valid YAML, with a single top level key equal to the locale being defined. For now these can only be defined using the `discourse_theme` CLI, importing a `.tar.gz`, or from a GIT repository.

- Fallback is handled on a global level (if the locale is not defined in the theme), as well as on individual keys (if some keys are missing from the selected interface language).

- Administrators can override individual keys on a per-theme basis in the /admin/customize/themes user interface.

- Theme developers should access defined translations using the new theme prefix variables:
  JavaScript: `I18n.t(themePrefix("my_translation_key"))`
  Handlebars: `{{theme-i18n "my_translation_key"}}` or `{{i18n (theme-prefix "my_translation_key")}}`

- To design for backwards compatibility, theme developers can check for the presence of the `themePrefix` variable in JavaScript

- As part of this, the old `{{themeSetting.setting_name}}` syntax is deprecated in favour of `{{theme-setting "setting_name"}}`
2019-01-17 11:46:11 +00:00

757 lines
12 KiB
SCSS

// Customise area
// email templates
.content-editor {
min-height: 500px;
float: left;
width: 54.054%;
margin-left: 1.8018%;
p.description {
color: $primary;
}
.controls {
margin-top: 10px;
}
textarea.plain {
width: 98%;
height: 200px;
}
.d-editor-input {
width: 98%;
height: 200px;
}
.ace-wrapper {
position: relative;
height: 600px;
width: 100%;
}
.ace_editor {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
}
.email-template {
input {
width: 100%;
}
label {
font-weight: bold;
}
}
.create-theme-modal {
div.input {
margin-bottom: 12px;
.label {
width: 20%;
display: inline-block;
}
}
.error {
color: $danger;
}
}
.admin-customize.admin-customize-themes {
.customize-themes-header {
border-bottom: 1px solid $primary-low;
padding-bottom: 8px;
display: flex;
.title {
color: $primary-medium;
flex-grow: 1;
h3 {
margin-bottom: 0;
}
}
.create-actions {
margin-left: auto;
}
}
.admin-container {
padding: 0;
}
.error-message {
margin-top: 5px;
margin-bottom: 5px;
.fa {
color: $danger;
}
}
.raw-error {
background-color: $primary-very-low;
padding: 5px;
}
}
.admin-customize {
h1 {
margin-bottom: 10px;
input {
margin-bottom: 0;
font-size: $font-down-2;
}
}
.field-error {
margin-top: 10px;
margin-bottom: 10px;
background-color: $quaternary-low;
padding: 5px;
}
.edit-main-nav {
.nav-pills:after,
.nav-pills:before {
display: inline;
content: "";
}
.show-overidden {
float: right;
}
margin-bottom: 10px;
}
.admin-container {
padding-left: 10px;
padding-right: 10px;
}
.admin-footer {
margin-top: 20px;
}
.color-schemes li {
.fa {
margin-right: 6px;
color: dark-light-choose($primary-medium, $secondary-medium);
}
}
.show-current-style {
display: inline-block;
vertical-align: top;
.url {
margin-bottom: 10px;
}
.title {
font-size: $font-up-4;
font-weight: bold;
margin-bottom: 10px;
}
.remote-url,
.about-url,
.license-url {
display: block;
margin-bottom: 10px;
}
.remote-url {
margin-top: -5px;
font-size: $font-down-1;
font-style: italic;
}
.mini-title {
font-size: $font-up-1;
font-weight: bold;
margin-bottom: 7px;
}
.control-unit {
margin-bottom: 25px;
margin-top: 15px;
}
.control {
margin-bottom: 10px;
}
.description {
margin-bottom: 12px;
}
}
.add-component-button {
vertical-align: middle;
}
.themes-intro {
display: inline-block;
width: 51%;
vertical-align: top;
margin-left: 20%;
margin-top: 60px;
img {
display: inline-block;
margin-right: 10px;
width: 10%;
vertical-align: top;
margin-top: 5px;
}
.content-wrapper {
display: inline-block;
vertical-align: top;
width: 65%;
h1 {
display: inline-block;
}
}
.external-link {
display: inline-block;
display: block;
margin-bottom: 5px;
}
}
.themes-list {
border-right: 1px solid $primary-low;
border-bottom: 1px solid $primary-low;
display: inline-block;
overflow: hidden;
}
.themes-list-header {
width: 100%;
border-bottom: 1px solid $primary-low;
.tab {
display: inline-block;
padding: 10px;
width: 50%;
box-sizing: border-box;
text-align: center;
border-left: 1px solid $primary-low;
&.active {
font-weight: bold;
color: $tertiary;
}
&:not(.active) {
cursor: pointer;
&:hover {
background-color: $primary-very-low;
}
}
}
}
.themes-list-container {
overflow-y: scroll;
box-sizing: content-box;
max-height: 700px;
width: 100%; /* overridden in javascript to hide scrollbar */
.themes-list-item:last-child {
border-bottom: none;
}
.themes-list-item {
color: $primary;
border-bottom: 1px solid $primary-low;
display: flex;
border-left: 1px solid $primary-low;
&.inactive-indicator {
border-right: 0;
border-left: 0;
font-weight: bold;
color: $primary-medium;
span.empty {
padding-left: 5px;
padding-top: 15px;
}
}
&:not(.inactive-indicator):not(.selected):hover {
background-color: $primary-very-low;
.component {
border-color: $primary-low-mid;
}
}
&.selected {
color: $secondary;
background-color: $tertiary;
.fa {
color: inherit;
}
}
&:not(.selected) {
.broken-indicator {
color: $danger;
}
.fa {
opacity: 0.7;
}
.default-indicator {
color: $success;
}
}
.light-grey-icon {
color: $primary-medium;
}
.info {
overflow: hidden;
font-weight: bold;
font-size: $font-up-1;
.name {
float: left;
}
.icons {
float: right;
}
}
.components-list {
margin-top: 5px;
display: inline-block;
font-size: $font-down-1;
align-items: baseline;
color: $primary-high;
.others-count,
.others-count:hover {
text-decoration: underline;
}
}
.inner-wrapper {
padding: 10px;
cursor: pointer;
}
span.empty {
padding: 3px 10px 3px 10px;
}
.inner-wrapper,
span.empty {
color: inherit;
width: 100%;
}
}
}
.theme.settings {
.theme-setting,
.theme-translation {
padding-bottom: 0;
margin-top: 18px;
min-height: 35px;
}
.setting-label {
width: 25%;
h3 {
margin-top: 0;
margin-bottom: 0.5rem;
}
}
}
.current-style.maximized {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: z("fullscreen");
background-color: white;
width: 100%;
padding: 0;
margin: 0;
.wrapper {
position: absolute;
top: 20px;
bottom: 10px;
left: 20px;
right: 20px;
}
}
.nav-pills.fields {
margin-left: 10px;
}
.content-list,
.current-style {
float: left;
}
.content-list ul {
margin-bottom: 10px;
}
.current-style {
width: 100%;
.admin-container {
margin: 0;
}
.nav.target {
margin-top: 15px;
li {
position: relative;
a {
display: flex;
align-items: center;
justify-content: space-between;
}
}
.fa {
margin-left: 8px;
}
.d-icon-mobile {
position: relative;
top: -3px;
font-size: $font-up-3;
max-height: 20px;
}
}
.toggle-maximize {
position: absolute;
right: -5px;
}
.ace-wrapper {
position: relative;
height: 600px;
width: 100%;
}
&.maximized {
.admin-container {
position: absolute;
bottom: 50px;
top: 80px;
width: 100%;
}
.admin-footer {
position: absolute;
bottom: 10px;
}
.ace-wrapper {
height: calc(100% - 200px);
}
}
.ace_editor {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
.status-actions {
float: right;
margin-top: 7px;
span {
margin-right: 10px;
}
}
.buttons {
float: left;
width: 200px;
.saving {
padding: 5px 0 0 0;
margin-left: 10px;
width: 80px;
color: $primary;
}
}
}
.color-scheme {
.controls {
span,
button,
a {
margin-right: 10px;
}
}
}
.colors {
thead th {
border: none;
}
td.hex {
width: 160px;
}
td.actions {
width: 200px;
}
.hex-input {
width: 80px;
margin-bottom: 0;
}
.hex {
text-align: center;
}
.description {
color: dark-light-choose($primary-medium, $secondary-medium);
}
.invalid .hex input {
background-color: white;
color: black;
border-color: $danger;
}
}
.status-message {
display: block;
font-size: $font-down-1;
margin-top: 8px;
}
.removable-list {
list-style: none;
margin-left: 0;
li {
display: table-row;
.col:first-child {
padding-right: 10px;
padding-bottom: 10px;
min-width: 80px;
}
.col {
display: table-cell;
}
}
}
}
.add-upload-modal {
input[type="file"] {
display: block;
margin-bottom: 0.25em;
+ label {
color: $primary-medium;
}
}
label {
display: inline-block;
}
}
#custom_emoji {
width: 27%;
}
.modal-body .inputs .branch {
margin-top: 10px;
}
.modal-body .inputs .check-private {
margin-top: 10px;
label {
padding-left: 0;
}
label input {
width: auto;
margin: 3px 0;
}
.public-key {
margin-top: 10px;
textarea {
cursor: auto;
height: 150px;
}
}
}
// Permalinks
.permalinks {
.url,
.topic,
.category,
.external_url,
.post {
text-overflow: ellipsis;
}
&.grid tr.admin-list-item {
grid-template-columns: unset;
}
}
.permalink-search {
text-align: left;
@media screen and (min-width: map-get($breakpoints, tablet)) {
text-align: right;
}
}
.permalink-form {
align-items: flex-start;
display: flex;
flex-direction: column;
flex-wrap: wrap;
@media screen and (min-width: map-get($breakpoints, tablet)) {
align-items: center;
flex-direction: row;
}
.select-kit {
width: 150px;
}
input {
margin: 5px 0;
@media screen and (min-width: map-get($breakpoints, tablet)) {
margin: 0 5px;
}
}
}
.permalink-title {
margin-bottom: 10px;
}
// embedding
.embeddable-hosts {
margin-bottom: 2em;
table.grid {
margin-bottom: 1em;
tr td {
word-wrap: break-word;
max-width: 25vw;
align-self: start;
}
td.controls {
min-width: 6em;
}
.select-kit.combo-box.category-chooser {
width: calc(100% - 10px);
}
}
@media screen and (max-width: 880px) {
table.grid {
thead {
display: none;
}
div.label {
display: block;
font-size: $font-down-1;
color: $primary-medium;
}
td.controls,
td.editing-controls {
align-self: end;
}
tr {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
}
}
@media screen and (max-width: 580px) {
table.grid {
tr td.editing-input {
grid-column-start: 1;
grid-column-end: 4;
max-width: 100%;
input {
width: calc(100% - 20px);
}
}
td.editing-controls {
margin-top: 1em;
max-width: 100%;
}
}
}
@media screen and (max-width: 350px) {
table.grid tr {
grid-template-columns: repeat(2, 1fr);
td.controls {
text-align: left;
}
}
}
}
.embedding-secondary {
h3 {
margin: 1em 0;
}
margin-bottom: 2em;
.embed-setting {
input[type="text"] {
width: 50%;
}
margin: 0.75em 0;
}
p.description {
color: dark-light-choose($primary-medium, $secondary-medium);
margin-bottom: 1em;
max-width: 700px;
}
}
.embedding td input {
margin-bottom: 0;
}
.user-fields {
h2 {
margin-bottom: 10px;
}
.user-field {
padding: 10px;
margin-bottom: 10px;
border-bottom: 1px solid $primary-low;
.form-display {
width: 25%;
display: inline-block;
float: left;
}
.form-element,
.form-element-desc {
float: left;
min-height: 30px;
padding: 0.25em 0;
&.input-area {
width: 75%;
.value-list,
.select-kit,
input[type="text"] {
width: 50%;
}
.value-list {
.select-kit {
width: 100%;
}
}
}
&.label-area {
width: 25%;
label {
margin: 0.5em 1em 0 0;
text-align: right;
font-weight: bold;
}
}
}
.controls {
float: right;
text-align: right;
}
.clearfix {
clear: both;
}
}
}