diff --git a/common/header.html b/common/header.html
deleted file mode 100644
index a85e49c..0000000
--- a/common/header.html
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
diff --git a/javascripts/discourse/connectors/category-title-before/category-icon-template.hbs b/javascripts/discourse/connectors/category-title-before/category-icon-template.hbs
new file mode 100644
index 0000000..8fb8eb5
--- /dev/null
+++ b/javascripts/discourse/connectors/category-title-before/category-icon-template.hbs
@@ -0,0 +1 @@
+{{mount-widget widget="category-icon" args=(hash category=category)}}
\ No newline at end of file
diff --git a/javascripts/discourse/initializers/category-icons.js b/javascripts/discourse/initializers/category-icons.js
new file mode 100644
index 0000000..7841953
--- /dev/null
+++ b/javascripts/discourse/initializers/category-icons.js
@@ -0,0 +1,139 @@
+import { withPluginApi } from "discourse/lib/plugin-api";
+import Category from "discourse/models/category";
+
+import { iconHTML, iconNode } from "discourse-common/lib/icon-library";
+import isRTL from "discourse/lib/text-direction";
+import { h } from "virtual-dom";
+import getURL from "discourse-common/lib/get-url";
+
+export default {
+ name: "category-icons",
+
+ initialize() {
+ withPluginApi("0.8.26", (api) => {
+ let categoryThemeList = settings.category_icon_list.split("|");
+ let lockIcon = settings.category_lock_icon || "lock";
+ var get = Em.get,
+ escapeExpression = Handlebars.Utils.escapeExpression;
+
+ function categoryStripe(color, classes) {
+ var style = color ? "style='background-color: #" + color + ";'" : "";
+ return "";
+ }
+
+ function getIconItem(categorySlug) {
+ if (!categorySlug) return;
+
+ let categoryThemeItem = categoryThemeList.find((str) =>
+ str.indexOf(",") > -1
+ ? categorySlug.indexOf(str.substr(0, str.indexOf(","))) > -1
+ : ""
+ );
+ if (categoryThemeItem) {
+ let iconItem = categoryThemeItem.split(",");
+ // Test partial/exact match
+ if (iconItem[3] == "partial") {
+ return iconItem;
+ } else if (iconItem[0] === categorySlug) {
+ return iconItem;
+ }
+ }
+ }
+
+ function categoryIconsRenderer(category, opts) {
+ let description = get(category, "description_text");
+ let restricted = get(category, "read_restricted");
+ let url = opts.url
+ ? opts.url
+ : getURL(`/c/${Category.slugFor(category)}/${get(category, "id")}`);
+ let href = opts.link === false ? "" : url;
+ let tagName =
+ opts.link === false || opts.link === "false" ? "span" : "a";
+ let extraClasses = opts.extraClasses ? " " + opts.extraClasses : "";
+ let color = get(category, "color");
+ let html = "";
+ let parentCat = null;
+ let categoryDir = "";
+
+ if (!opts.hideParent) {
+ parentCat = Category.findById(get(category, "parent_category_id"));
+ }
+
+ const categoryStyle =
+ opts.categoryStyle || Discourse.SiteSettings.category_style;
+ if (categoryStyle !== "none") {
+ if (parentCat && parentCat !== category) {
+ html += categoryStripe(
+ get(parentCat, "color"),
+ "badge-category-parent-bg"
+ );
+ }
+ html += categoryStripe(color, "badge-category-bg");
+ }
+
+ let classNames = "badge-category clear-badge";
+ if (restricted) {
+ classNames += " restricted";
+ }
+
+ let style = "";
+ if (categoryStyle === "box") {
+ style = `style="color: #${get(category, "text_color")};"`;
+ }
+
+ html +=
+ `";
+
+ /// Add custom category icon from theme settings
+ let iconItem = getIconItem(category.slug);
+ if (iconItem) {
+ let itemColor = iconItem[2] ? `style="color: ${iconItem[2]}"` : "";
+ let itemIcon = iconItem[1] != "" ? iconHTML(iconItem[1]) : "";
+ html += `${itemIcon}`;
+ }
+ /// End custom category icon
+
+ let categoryName = escapeExpression(get(category, "name"));
+
+ if (Discourse.SiteSettings.support_mixed_text_direction) {
+ categoryDir = isRTL(categoryName) ? 'dir="rtl"' : 'dir="ltr"';
+ }
+
+ if (restricted) {
+ html += iconHTML(lockIcon);
+ }
+ html += `${categoryName}`;
+
+ if (href) {
+ href = ` href="${href}" `;
+ }
+
+ extraClasses = categoryStyle
+ ? categoryStyle + extraClasses
+ : extraClasses;
+ return `<${tagName} class="badge-wrapper ${extraClasses}" ${href}>${html}${tagName}>`;
+ }
+
+ api.replaceCategoryLinkRenderer(categoryIconsRenderer);
+
+ api.createWidget("category-icon", {
+ tagName: "div.category-icon-widget",
+ html(attrs) {
+ let iconItem = getIconItem(attrs.category.slug);
+ if (iconItem && !attrs.category.parent_category_id) {
+ let itemColor = iconItem[2] ? `color: ${iconItem[2]}` : "";
+ let itemIcon = iconItem[1] != "" ? iconNode(iconItem[1]) : "";
+ return h("span.category-icon", { style: itemColor }, itemIcon);
+ }
+ },
+ });
+ });
+ },
+};