<%= f.text_area :css, :cols => 70, :class => 'large observe_textlength' %>
<%= live_validation_for_field("skin_css", maximum_length: ArchiveConfig.CONTENT_MAX_DISPLAYED) %>
From 7020232dd21aabbffe0d05e05b9bc0ef79d8bb43 Mon Sep 17 00:00:00 2001
From: Hunter Smith <1946720+hunternet93@users.noreply.github.com>
Date: Wed, 21 Jan 2026 12:21:08 -0800
Subject: [PATCH 4/7] added css translation
---
config/locales/views/en.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/config/locales/views/en.yml b/config/locales/views/en.yml
index 8def73c71dc..803aa582f31 100644
--- a/config/locales/views/en.yml
+++ b/config/locales/views/en.yml
@@ -2327,6 +2327,7 @@ en:
skin_type: Type
skins_creating_help_title: Creating skins
title: Title
+ css: CSS
revert_skin_form:
revert_to_default: Revert to Default Skin
wizard_form:
From c4864d44e8e862ee5acba3e4a9d0721baf10b625 Mon Sep 17 00:00:00 2001
From: Hunter Smith <1946720+hunternet93@users.noreply.github.com>
Date: Wed, 21 Jan 2026 12:31:10 -0800
Subject: [PATCH 5/7] normalize
---
config/locales/views/en.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/locales/views/en.yml b/config/locales/views/en.yml
index 803aa582f31..f4e962178eb 100644
--- a/config/locales/views/en.yml
+++ b/config/locales/views/en.yml
@@ -2321,13 +2321,13 @@ en:
confirm_delete:
confirm_html: Are you sure you want to delete the skin "%{skin_title}"?
form:
+ css: CSS
description: Description
icon: Upload a preview (png, jpeg or gif)
public: Apply to make public
skin_type: Type
skins_creating_help_title: Creating skins
title: Title
- css: CSS
revert_skin_form:
revert_to_default: Revert to Default Skin
wizard_form:
From 8835f7c49c7ace54ea6a80305038e62c80d52253 Mon Sep 17 00:00:00 2001
From: Hunter Smith <1946720+hunternet93@users.noreply.github.com>
Date: Wed, 21 Jan 2026 13:11:58 -0800
Subject: [PATCH 6/7] reverted .one_declaration_per_ruleset.description changes
to match source exactly
---
app/views/help/skins_creating.html.erb | 11 +++++------
config/locales/views/en.yml | 4 +---
2 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/app/views/help/skins_creating.html.erb b/app/views/help/skins_creating.html.erb
index 1b04ecbcfb4..5f77c33439f 100644
--- a/app/views/help/skins_creating.html.erb
+++ b/app/views/help/skins_creating.html.erb
@@ -61,17 +61,16 @@
<%= t(
- ".one_declaration_per_ruleset.description.one_declaration_html",
- background_code: tag.code("background")
- ) %>
-
+ ".one_declaration_per_ruleset.description_html",
+ repeated_declarations_css_code: tag.code(tag.pre(%{
.my-class {
background: -moz-linear-gradient(top, #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%);
background: -o-linear-gradient(top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%);
background: -webkit-linear-gradient(top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%);
}
-
- <%= t(".one_declaration_per_ruleset.description.split_rulesets") %>
+ })),
+ background_code: tag.code("background")
+ ) %>
.my-class { background: -moz-linear-gradient(top, #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%); }
.my-class { background: -o-linear-gradient(top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); }
diff --git a/config/locales/views/en.yml b/config/locales/views/en.yml
index f4e962178eb..ed22b869996 100644
--- a/config/locales/views/en.yml
+++ b/config/locales/views/en.yml
@@ -1139,9 +1139,7 @@ en:
various_units: various units
header: Numeric Values
one_declaration_per_ruleset:
- description:
- one_declaration_html: The CSS parser we use retains only one declaration for each property, meaning that rulesets like the following will have all but the last %{background_code} declaration removed (so your gradient would only show up in WebKit browsers).
- split_rulesets: 'To avoid losing declarations with repeated properties, split each one into its own ruleset, like so:'
+ description_html: 'The CSS parser we use retains only one declaration for each property, meaning that rulesets like %{repeated_declarations_css_code} will have all but the last %{background_code} declaration removed (so your gradient would only show up in WebKit browsers). To avoid losing declarations with repeated properties, split each one into its own ruleset, like so:'
header: Use only one declaration per property per ruleset
scale:
description_html: You can specify scale (for the %{transform_code} property) as %{scale_numeric_value_code} where the numeric value can be specified up to two decimal places.
From 7a9394dfd9730faffb70e6817b93b855250b2905 Mon Sep 17 00:00:00 2001
From: Hunter Smith <1946720+hunternet93@users.noreply.github.com>
Date: Sun, 1 Feb 2026 19:09:19 -0800
Subject: [PATCH 7/7] Updates per review
---
app/views/help/skins_creating.html.erb | 214 +++++++++++++------------
config/config.yml | 2 +-
config/locales/views/en.yml | 8 +-
3 files changed, 118 insertions(+), 106 deletions(-)
diff --git a/app/views/help/skins_creating.html.erb b/app/views/help/skins_creating.html.erb
index 5f77c33439f..2375ad9da14 100644
--- a/app/views/help/skins_creating.html.erb
+++ b/app/views/help/skins_creating.html.erb
@@ -6,13 +6,19 @@
<%= t(".allowed_properties") %>
- background, border, column, cue, flex, font, layer-background,
+
+
+ background, border, column, cue, flex, font, layer-background,
layout-grid, list-style, margin, marker, outline, overflow, padding,
- page-break, pause, scrollbar, text, transform, transition
+ page-break, pause, scrollbar, text, transform, transition
+
+
<%= t(".allowed_specific_properties") %>
- -replace, -use-link-source, accelerator, accent-color, align-content,
+
+
+ -replace, -use-link-source, accelerator, accent-color, align-content,
align-items, align-self, alignment-adjust, alignment-baseline,
appearance, azimuth, baseline-shift, behavior, binding, bookmark-label,
bookmark-level, bookmark-target, bottom, box-align, box-direction,
@@ -47,30 +53,31 @@
vertical-align, visibility, voice-balance, voice-duration,
voice-family, voice-pitch, voice-pitch-range, voice-rate, voice-stress,
voice-volume, volume, white-space, white-space-collapse, widows, width,
- word-break, word-spacing, word-wrap, writing-mode, z-index
+ word-break, word-spacing, word-wrap, writing-mode, z-index
+
+
<%= t(".skin_examples.header") %>
- <%= t(
- ".skin_examples.description_html",
- public_skins_link: link_to(t(".skin_examples.public_skins"), skins_path)
- ) %>
+
+ <%= t(".skin_examples.description_html",
+ public_skins_link: link_to(t(".skin_examples.public_skins"), skins_path)) %>
+
<%= t(".one_declaration_per_ruleset.header") %>
- <%= t(
- ".one_declaration_per_ruleset.description_html",
- repeated_declarations_css_code: tag.code(tag.pre(%{
+
+ <%= t(".one_declaration_per_ruleset.description_html",
+ repeated_declarations_css_code: tag.br + tag.code(tag.pre(%{
.my-class {
background: -moz-linear-gradient(top, #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%);
background: -o-linear-gradient(top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%);
background: -webkit-linear-gradient(top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%);
}
})),
- background_code: tag.code("background")
- ) %>
+ background_code: tag.code("background")) %>
.my-class { background: -moz-linear-gradient(top, #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%); }
.my-class { background: -o-linear-gradient(top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); }
@@ -81,93 +88,95 @@
<%= t(".font_family.header") %>
- <%= t(
- ".font_family.description.separate_properties_html",
- font_code: tag.code("font")
- ) %>
- font-size: 1.1em; font-weight: bold; font-family: Cambria, Constantia, Palatino, Georgia, serif;
- <%= t(
- ".font_family.description.font_names_html",
- font_family_code: tag.code("font-family"),
- web_safe_fonts_link:
- link_to(
- t(".font_family.description.web_safe_fonts"),
- "https://www.w3schools.com/cssref/css_fonts_fallbacks.asp"
- )
- ) %>
- <%= t(
- ".font_family.description.no_font_face_html",
- cannot_bold: tag.strong(t(".font_family.description.cannot")),
- font_face_code: tag.code("@font-face")
- ) %>
+
+ <%= t(".font_family.description.separate_properties_html",
+ font_code: tag.code("font"),
+ font_properties_css_code: tag.code("font-size: 1.1em; font-weight: bold; font-family: Cambria, Constantia, Palatino, Georgia, serif;")) %>
+
+
+ <%= t(".font_family.description.font_names_html",
+ font_family_code: tag.code("font-family"),
+ web_safe_fonts_link:
+ link_to(t(".font_family.description.web_safe_fonts"),
+ "https://www.w3schools.com/cssref/css_fonts_fallbacks.asp")) %>
+
+
+ <%= t(".font_family.description.no_font_face_html",
+ cannot_bold: tag.strong(t(".font_family.description.cannot")),
+ font_face_code: tag.code("@font-face")) %>
+
<%= t(".custom_properties.header") %>
<%= t(".custom_properties.description.names") %>
- <%= t(
- ".custom_properties.description.accepting_properties_html",
- font_family_code: tag.code("font-family"),
- content_code: tag.code("content"),
- var_code: tag.code("var()")
- ) %>
+
+ <%= t(".custom_properties.description.accepting_properties_html",
+ font_family_code: tag.code("font-family"),
+ content_code: tag.code("content"),
+ var_code: tag.code("var()")) %>
+
<%= t(".custom_properties.description.availability_html", var_code: tag.code("var()")) %>
<%= t(".external_urls.header") %>
- <%= t(
- ".external_urls.description_html",
- example_url_code: tag.code("url('https://example.com/my_awesome_image.jpg')")
- ) %>
+
+ <%= t(".external_urls.description_html",
+ example_url_code: tag.code("url('https://example.com/my_awesome_image.jpg')")) %>
+
<%= t(".allowed_keywords.header") %>
- <%= t(
- ".allowed_keywords.description_html",
- absolute_code: tag.code("absolute"),
- bottom_code: tag.code("bottom"),
- center_code: tag.code("center"),
- underline_code: tag.code("underline")
- ) %>
+
+ <%= t(".allowed_keywords.description_html",
+ absolute_code: tag.code("absolute"),
+ bottom_code: tag.code("bottom"),
+ center_code: tag.code("center"),
+ underline_code: tag.code("underline")) %>
+
<%= t(".numeric_values.header") %>
- <%= t(
- ".numeric_values.description.precision_html",
- various_units_link:
- link_to(
- t(".numeric_values.description.various_units"),
- "https://w3schools.com/css/css_units.asp"
- )
- ) %>
cm, em, ex, in, mm, pc, pt, px
+
+ <%= t(".numeric_values.description.precision_html",
+ various_units_link:
+ link_to(t(".numeric_values.description.various_units"),
+ "https://w3schools.com/css/css_units.asp"),
+ units_list_code: tag.br + tag.code(t(".numeric_values.description.units_list",
+ cm_code: "cm",
+ em_code: "em",
+ ex_code: "ex",
+ in_code: "in",
+ mm_code: "mm",
+ pc_code: "pc",
+ pt_code: "pt",
+ px_code: "px"))) %>
+
<%= t(".numeric_values.description.em_unit_html", em_code: tag.code("em")) %>
<%= t(".colors.header") %>
- <%= t(
- ".colors.description_html",
- black_hex_code: tag.code("#000000"),
- black_rgb_code: tag.code("rgb(0,0,0)"),
- black_rgba_code: tag.code("rgba(0,0,0,0)"),
- common_color_names_link:
- link_to(
- t(".colors.common_color_names"),
- "https://www.w3schools.com/colors/colors_names.asp"
- )
- ) %>
+
+ <%= t(".colors.description_html",
+ black_hex_code: tag.code("#000000"),
+ black_rgb_code: tag.code("rgb(0,0,0)"),
+ black_rgba_code: tag.code("rgba(0,0,0,0)"),
+ common_color_names_link: link_to(t(".colors.common_color_names"),
+ "https://www.w3schools.com/colors/colors_names.asp")) %>
+
<%= t(".scale.header") %>
- <%= t(
- ".scale.description_html",
- transform_code: tag.code("transform"),
- scale_numeric_value_code: tag.code("scale(#{t('.scale.numeric_value')})")
- ) %>
+
+ <%= t(".scale.description_html",
+ transform_code: tag.code("transform"),
+ scale_numeric_value_code: tag.code("scale(#{t('.scale.numeric_value')})")) %>
+
<%= t(".comments.header") %>
@@ -177,39 +186,40 @@
<%= t(".css_basics.header") %>
- <%= t(
- ".css_basics.description.line_of_css_html",
- example_css_code: tag.code("selector {property: value;}")
- ) %>
- <%= t(
- ".css_basics.description.css_selectors_and_rules_html",
- selector_bold: tag.strong(t(".css_basics.description.selector")),
- body_tag_code: tag.code("body"),
- h1_tag_code: tag.code("h1"),
- property_bold: tag.strong("property"),
- value_bold: tag.strong(t(".css_basics.description.value"))
- ) %>
- <%= t(".css_basics.description.examples_header") %>
- - <%= t(
- ".css_basics.description.font_size_example_html",
- font_size_css_code: tag.code("body {font-size: 1.1em;}")
- ) %>
- - <%= t(
- ".css_basics.description.background_color_example_html",
- background_color_css_code: tag.code("#header {background-color: purple}")
- ) %>
- - <%= t(
- ".css_basics.description.blink_example_html",
- blink_css_code: tag.code(".meta {font-style: blink}")
- ) %>
+
+ <%= t(".css_basics.description.line_of_css_html",
+ example_css_code: tag.code("#{t('.css_basics.description.selector')} {#{t('.css_basics.description.property')}: #{t('.css_basics.description.value')};}")) %>
+
+
+ <%= t(".css_basics.description.css_selectors_and_rules_html",
+ selector_bold: tag.strong(t(".css_basics.description.selector")),
+ body_tag_code: tag.code("body"),
+ h1_tag_code: tag.code("h1"),
+ property_bold: tag.strong(t(".css_basics.description.property")),
+ value_bold: tag.strong(t(".css_basics.description.value"))) %>
+
+
+ <%= t(".css_basics.description.examples_header") %>
+
+
+ -
+ <%= t(".css_basics.description.font_size_example_html",
+ font_size_css_code: tag.code("body {font-size: 1.1em;}")) %>
+
+ -
+ <%= t(".css_basics.description.background_color_example_html",
+ background_color_css_code: tag.code("#header {background-color: purple}")) %>
+
+ -
+ <%= t(".css_basics.description.blink_example_html",
+ blink_css_code: tag.code(".meta {font-style: blink}")) %>
+
-
<%= t(".css_basics.description.css_tutorials") %>
-
diff --git a/config/config.yml b/config/config.yml
index 447e6004ba7..9815631c2a8 100644
--- a/config/config.yml
+++ b/config/config.yml
@@ -361,7 +361,7 @@ BANNED_MULTIMEDIA_SRCS: []
# Allowed CSS
#
# *** IMPORTANT: if you edit these values please also update the
-# skins-creating.html.erb file in app/views/help ***
+# skins_creating.html.erb file in app/views/help ***
#
# the following properties and keywords will be ADDED to the default set allowed
# in user-submitted CSS code, along with:
diff --git a/config/locales/views/en.yml b/config/locales/views/en.yml
index ed22b869996..c7f401ad26d 100644
--- a/config/locales/views/en.yml
+++ b/config/locales/views/en.yml
@@ -1109,6 +1109,7 @@ en:
examples_header: 'Examples:'
font_size_example_html: 'Inside the "body" tag, set the font size slightly larger than the baseline: %{font_size_css_code}'
line_of_css_html: 'A line of CSS code looks pretty much like this: %{example_css_code}'
+ property: property
selector: selector
value: value
header: 'If you are new to CSS, here are the basics:'
@@ -1126,7 +1127,7 @@ en:
cannot: cannot
font_names_html: In the %{font_family_code} property, we allow you to specify any font with an alphanumeric name. You can (but don't have to) specify the name with single or double quotes around it, just make sure the quotes match. (e.g., 'Gill Sans' and "Gill Sans" are both fine; 'Gill Sans" won't work.) Keep in mind that a font has to be installed on the user's operating system to work. It's a good idea when specifying fonts to use fallbacks in case your first-choice font isn't available. See %{web_safe_fonts_link}.
no_font_face_html: We %{cannot_bold} allow the %{font_face_code} attribute. Sorry! If you have an uncommon font that you want to use in a skin you would like to share, we suggest adding a comment in the skin's "Description" field with a pointer to a place for users to download the font themselves, and using web-safe fonts as fallbacks.
- separate_properties_html: Unfortunately, you cannot use the %{font_code} shorthand in your CSS. All font properties have to be specified separately, e.g.,
+ separate_properties_html: Unfortunately, you cannot use the %{font_code} shorthand in your CSS. All font properties have to be specified separately, e.g., %{font_properties_css_code}
web_safe_fonts: a set of web-safe fonts with fallbacks
header: Font and Font Family
intro:
@@ -1135,7 +1136,8 @@ en:
numeric_values:
description:
em_unit_html: 'PS: we highly encourage learning about and using %{em_code}, which lets you set things relative to the viewer''s current font size! It will make your layouts much more flexible and responsive to different browser/font settings.'
- precision_html: 'You can specify numeric values up to two decimal places, either as percentages or in %{various_units_link}:'
+ precision_html: 'You can specify numeric values up to two decimal places, either as percentages or in %{various_units_link}: %{units_list_code}'
+ units_list: "%{cm_code}, %{em_code}, %{ex_code}, %{in_code}, %{mm_code}, %{pc_code}, %{pt_code}, %{px_code}"
various_units: various units
header: Numeric Values
one_declaration_per_ruleset:
@@ -2324,7 +2326,7 @@ en:
icon: Upload a preview (png, jpeg or gif)
public: Apply to make public
skin_type: Type
- skins_creating_help_title: Creating skins
+ skins_creating_help_title: Skins creating
title: Title
revert_skin_form:
revert_to_default: Revert to Default Skin