diff --git a/src/Umbraco.Web.UI.Client/.storybook/preview.js b/src/Umbraco.Web.UI.Client/.storybook/preview.js
index 42f76464dc..4d309febf7 100644
--- a/src/Umbraco.Web.UI.Client/.storybook/preview.js
+++ b/src/Umbraco.Web.UI.Client/.storybook/preview.js
@@ -20,6 +20,7 @@ import { UmbIconRegistry } from '../src/packages/core/icon-registry/icon.registr
import { UmbLitElement } from '../src/packages/core/lit-element';
import { umbLocalizationRegistry } from '../src/packages/core/localization';
import customElementManifests from '../dist-cms/custom-elements.json';
+import icons from '../src/packages/core/icon-registry/icons/icons';
import '../src/libs/context-api/provide/context-provider.element';
import '../src/packages/core/components';
@@ -36,6 +37,7 @@ class UmbStoryBookElement extends UmbLitElement {
constructor() {
super();
+ this._umbIconRegistry.setIcons(icons);
this._umbIconRegistry.attach(this);
this._registerExtensions(documentManifests);
new UmbModalManagerContext(this);
diff --git a/src/Umbraco.Web.UI.Client/devops/icons/index.js b/src/Umbraco.Web.UI.Client/devops/icons/index.js
index 909ee19094..10d3f84060 100644
--- a/src/Umbraco.Web.UI.Client/devops/icons/index.js
+++ b/src/Umbraco.Web.UI.Client/devops/icons/index.js
@@ -18,11 +18,10 @@ const run = async () => {
var icons = await collectDictionaryIcons();
icons = await collectDiskIcons(icons);
writeIconsToDisk(icons);
- generateJSON(icons);
+ generateJS(icons);
};
const collectDictionaryIcons = async () => {
-
const rawData = readFileSync(iconMapJson);
const fileRaw = rawData.toString();
const fileJSON = JSON.parse(fileRaw);
@@ -32,11 +31,11 @@ const collectDictionaryIcons = async () => {
// Lucide:
fileJSON.lucide.forEach((iconDef) => {
if (iconDef.file && iconDef.name) {
- const path = lucideSvgDirectory + "/" + iconDef.file;
+ const path = lucideSvgDirectory + '/' + iconDef.file;
try {
const rawData = readFileSync(path);
- // For Lucide icons specially we adjust the icons a bit for them to work in our case:
+ // For Lucide icons specially we adjust the icons a bit for them to work in our case: [NL]
let svg = rawData.toString().replace(' width="24"\n', '');
svg = svg.replace(' height="24"\n', '');
svg = svg.replace('stroke-width="2"', 'stroke-width="1.75"');
@@ -60,11 +59,11 @@ const collectDictionaryIcons = async () => {
// SimpleIcons:
fileJSON.simpleIcons.forEach((iconDef) => {
if (iconDef.file && iconDef.name) {
- const path = simpleIconsSvgDirectory + "/" + iconDef.file;
+ const path = simpleIconsSvgDirectory + '/' + iconDef.file;
try {
const rawData = readFileSync(path);
- let svg = rawData.toString()
+ let svg = rawData.toString();
const iconFileName = iconDef.name;
// SimpleIcons need to use fill="currentColor"
@@ -91,11 +90,11 @@ const collectDictionaryIcons = async () => {
// Umbraco:
fileJSON.umbraco.forEach((iconDef) => {
if (iconDef.file && iconDef.name) {
- const path = umbracoSvgDirectory + "/" + iconDef.file;
+ const path = umbracoSvgDirectory + '/' + iconDef.file;
try {
const rawData = readFileSync(path);
- const svg = rawData.toString()
+ const svg = rawData.toString();
const iconFileName = iconDef.name;
const icon = {
@@ -136,8 +135,7 @@ const collectDiskIcons = async (icons) => {
const iconName = iconFileName;
// Only append not already defined icons:
- if (!icons.find(x => x.name === iconName)) {
-
+ if (!icons.find((x) => x.name === iconName)) {
const icon = {
name: iconName,
legacy: true,
@@ -169,20 +167,20 @@ const writeIconsToDisk = (icons) => {
});
};
-const generateJSON = (icons) => {
- const JSONPath = `${iconsOutputDirectory}/icons.json`;
+const generateJS = (icons) => {
+ const JSPath = `${iconsOutputDirectory}/icons.ts`;
const iconDescriptors = icons.map((icon) => {
- return {
- name: icon.name,
- legacy: icon.legacy,
- path: `./icons/${icon.fileName}.js`,
- };
+ return `{
+ name: "${icon.name}",
+ ${icon.legacy ? 'legacy: true,' : ''}
+ path: "./icons/${icon.fileName}.js",
+ }`.replace(/\t/g, ''); // Regex removes white space [NL]
});
- const content = `${JSON.stringify(iconDescriptors)}`;
+ const content = `export default [${iconDescriptors.join(',')}];`;
- writeFileWithDir(JSONPath, content, (err) => {
+ writeFileWithDir(JSPath, content, (err) => {
if (err) {
// eslint-disable-next-line no-undef
console.log(err);
diff --git a/src/Umbraco.Web.UI.Client/devops/icons/todo_implement_this_data_thesaurus.json b/src/Umbraco.Web.UI.Client/devops/icons/todo_implement_this_data_thesaurus.json
new file mode 100644
index 0000000000..2573d281d8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/devops/icons/todo_implement_this_data_thesaurus.json
@@ -0,0 +1,5699 @@
+{
+ "$schema": "./thesaurus.schema.json",
+ "icon-zoom-out": {
+ "thesaurus": [
+ "magnifying glass",
+ "shrink",
+ "smaller"
+ ],
+ "group": "action zoom",
+ "related": [
+ "icon-zoom-in"
+ ]
+ },
+ "icon-truck": {
+ "thesaurus": [
+ "lorry",
+ "vehicle",
+ "van",
+ "shipping",
+ "delivery"
+ ],
+ "group": "transport vehicle",
+ "related": [
+ "icon-shipping"
+ ]
+ },
+ "icon-zoom-in": {
+ "thesaurus": [
+ "magnifying glass",
+ "grow",
+ "bigger"
+ ],
+ "group": "action zoom",
+ "related": [
+ "icon-zoom-out"
+ ]
+ },
+ "icon-zip": {
+ "thesaurus": [
+ "zipper"
+ ],
+ "group": "file",
+ "related": []
+ },
+ "icon-axis-rotation": {
+ "thesaurus": [
+ "refresh",
+ "recycle",
+ "sync"
+ ],
+ "group": "action rotate",
+ "related": [
+ "icon-sync",
+ "icon-axis-rotation-2",
+ "icon-axis-rotation-3",
+ "icon-refresh"
+ ]
+ },
+ "icon-yen-bag": {
+ "thesaurus": [
+ "cash",
+ "swag"
+ ],
+ "group": "item money bag",
+ "related": []
+ },
+ "icon-axis-rotation-2": {
+ "thesaurus": [
+ "refresh",
+ "recycle",
+ "sync"
+ ],
+ "group": "action rotate",
+ "related": [
+ "icon-axis-rotation",
+ "icon-axis-rotation-3",
+ "icon-sync",
+ "icon-refresh"
+ ]
+ },
+ "icon-axis-rotation-3": {
+ "thesaurus": [
+ "refresh",
+ "recycle"
+ ],
+ "group": "action rotate",
+ "related": [
+ "icon-axis-rotation",
+ "icon-axis-rotation-2",
+ "icon-refresh"
+ ]
+ },
+ "icon-wrench": {
+ "thesaurus": [
+ "spanner"
+ ],
+ "group": "item tool",
+ "related": [
+ "icon-umb-settings",
+ "icon-tools"
+ ]
+ },
+ "icon-wine-glass": {
+ "thesaurus": [
+ "goblets",
+ "wine",
+ "glasses",
+ "crockery",
+ "drinks",
+ "dinners",
+ "restaurants"
+ ],
+ "group": "item food drink",
+ "related": [
+ "icon-cocktail",
+ "icon-beer-glass",
+ "icon-takeaway-cup",
+ "icon-coffee"
+ ]
+ },
+ "icon-wrong": {
+ "thesaurus": [
+ "cross",
+ "x",
+ "exit",
+ "quit",
+ "close",
+ "error"
+ ],
+ "group": "action boolean",
+ "related": [
+ "icon-delete",
+ "icon-block",
+ "icon-delete-key",
+ "icon-backspace",
+ "icon-check",
+ "icon-checkbox",
+ "icon-checkbox-dotted-active",
+ "icon-circle-dotted-active",
+ "icon-application-error"
+ ]
+ },
+ "icon-windows": {
+ "thesaurus": [
+ "microsoft",
+ "ms"
+ ],
+ "group": "logo",
+ "related": [
+ "icon-os-x"
+ ]
+ },
+ "icon-window-sizes": {
+ "thesaurus": [
+ "square",
+ "multiple",
+ "rectangles",
+ "three",
+ "3",
+ "box"
+ ],
+ "group": "action window",
+ "related": []
+ },
+ "icon-window-popin": {
+ "thesaurus": [
+ "in",
+ "arrow",
+ "box",
+ "rectangle",
+ "square"
+ ],
+ "group": "action window",
+ "related": []
+ },
+ "icon-wifi": {
+ "thesaurus": [
+ "internet",
+ "broadcast",
+ "waves"
+ ],
+ "group": "item tech",
+ "related": []
+ },
+ "icon-width": {
+ "thesaurus": [
+ "arrow",
+ "size",
+ "resize",
+ "length"
+ ],
+ "group": "action size",
+ "related": []
+ },
+ "icon-weight": {
+ "thesaurus": [
+ "kg",
+ "tonne",
+ "mass",
+ "heavy",
+ "kilo",
+ "kilogram"
+ ],
+ "group": "item",
+ "related": [
+ "icon-legal"
+ ]
+ },
+ "icon-war": {
+ "thesaurus": [
+ "tank"
+ ],
+ "group": "transport vehicle",
+ "related": []
+ },
+ "icon-wand": {
+ "thesaurus": [
+ "magic",
+ "wizard"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-wallet": {
+ "thesaurus": [
+ "purse",
+ "money",
+ "cash",
+ "pay",
+ "payment",
+ "checkout"
+ ],
+ "group": "item money",
+ "related": []
+ },
+ "icon-wall-plug": {
+ "thesaurus": [
+ "power",
+ "electricity",
+ "cable"
+ ],
+ "group": "item tech",
+ "related": [
+ "icon-power-outlet",
+ "icon-dock-connector"
+ ]
+ },
+ "icon-voice": {
+ "thesaurus": [
+ "microphone",
+ "podcast",
+ "audio",
+ "record"
+ ],
+ "group": "item media",
+ "related": []
+ },
+ "icon-video": {
+ "thesaurus": [
+ "media",
+ "movie",
+ "film",
+ "camera",
+ "record"
+ ],
+ "group": "item media",
+ "related": []
+ },
+ "icon-vcard": {
+ "thesaurus": [
+ "business cards",
+ "id cards",
+ "profiles",
+ "personas",
+ "person",
+ "users"
+ ],
+ "group": "file",
+ "related": [
+ "icon-umb-members"
+ ]
+ },
+ "icon-utilities": {
+ "thesaurus": [
+ "toolbox",
+ "tools"
+ ],
+ "group": "item tool",
+ "related": [
+ "icon-briefcase"
+ ]
+ },
+ "icon-users": {
+ "thesaurus": [
+ "person",
+ "people",
+ "three",
+ "3",
+ "men",
+ "man",
+ "male"
+ ],
+ "group": "user multiple",
+ "related": [
+ "icon-users-alt",
+ "icon-user-females",
+ "icon-user-females-alt",
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users"
+ ]
+ },
+ "icon-users-alt": {
+ "thesaurus": [
+ "person",
+ "people",
+ "three",
+ "3",
+ "men",
+ "man",
+ "male"
+ ],
+ "group": "user multiple",
+ "related": [
+ "icon-users-alt",
+ "icon-user-females",
+ "icon-user-females-alt",
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users"
+ ]
+ },
+ "icon-user": {
+ "thesaurus": [
+ "person",
+ "people",
+ "man",
+ "men",
+ "male"
+ ],
+ "group": "user",
+ "related": [
+ "icon-user-female",
+ "icon-people",
+ "icon-people-alt",
+ "icon-people-alt-2",
+ "icon-users",
+ "icon-users-alt",
+ "icon-user-female",
+ "icon-umb-users",
+ "icon-user-glasses",
+ "icon-client",
+ "icon-employee",
+ "icon-piracy",
+ "icon-theif",
+ "icon-operator"
+ ]
+ },
+ "icon-user-glasses": {
+ "thesaurus": [
+ "person",
+ "people",
+ "man",
+ "men",
+ "male",
+ "specs",
+ "nerd"
+ ],
+ "group": "user special",
+ "related": [
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users",
+ "icon-client",
+ "icon-employee",
+ "icon-piracy",
+ "icon-theif",
+ "icon-operator"
+ ]
+ },
+ "icon-user-females": {
+ "thesaurus": [
+ "person",
+ "people",
+ "three",
+ "3",
+ "women",
+ "woman"
+ ],
+ "group": "user multiple",
+ "related": [
+ "icon-users-alt",
+ "icon-user-females",
+ "icon-user-females-alt",
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users"
+ ]
+ },
+ "icon-user-females-alt": {
+ "thesaurus": [
+ "person",
+ "people",
+ "three",
+ "3",
+ "women",
+ "woman"
+ ],
+ "group": "user multiple",
+ "related": [
+ "icon-users-alt",
+ "icon-user-females",
+ "icon-user-females-alt",
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users"
+ ]
+ },
+ "icon-user-female": {
+ "thesaurus": [
+ "person",
+ "people",
+ "woman",
+ "women"
+ ],
+ "group": "user",
+ "related": [
+ "icon-people-female",
+ "icon-user-females",
+ "icon-user-females-alt",
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users",
+ "icon-user-glasses",
+ "icon-client",
+ "icon-employee",
+ "icon-piracy",
+ "icon-theif",
+ "icon-operator"
+ ]
+ },
+ "icon-usb": {
+ "thesaurus": [],
+ "group": "item tech",
+ "related": [
+ "icon-usb-connector"
+ ]
+ },
+ "icon-usb-connector": {
+ "thesaurus": [
+ "plugs",
+ "peripherals",
+ "technology"
+ ],
+ "group": "item tech",
+ "related": [
+ "icon-usb",
+ "icon-wall-plug",
+ "icon-dock-connector"
+ ]
+ },
+ "icon-unlocked": {
+ "thesaurus": [
+ "padlock",
+ "insecure"
+ ],
+ "group": "item security lock",
+ "related": [
+ "icon-lock",
+ "icon-combination-lock-open",
+ "icon-keyhole",
+ "icon-old-key",
+ "icon-keychain",
+ "icon-key"
+ ]
+ },
+ "icon-universal": {
+ "thesaurus": [
+ "yin yang",
+ "circle",
+ "wave"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-undo": {
+ "thesaurus": [
+ "arrow",
+ "back"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-redo",
+ "icon-backspace",
+ "icon-arrow-left",
+ "icon-navigation-left",
+ "icon-left-double-arrow"
+ ]
+ },
+ "icon-umbrella": {
+ "thesaurus": [
+ "rain",
+ "shelter"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-umb-deploy": {
+ "thesaurus": [
+ "circle",
+ "arrow",
+ "upload",
+ "save"
+ ],
+ "group": "action arrow circle",
+ "related": [
+ "icon-save"
+ ]
+ },
+ "icon-umb-contour": {
+ "thesaurus": [
+ "forms",
+ "add",
+ "plus",
+ "boxes",
+ "fields",
+ "inputs",
+ "multiple",
+ "two",
+ "2",
+ "more"
+ ],
+ "group": "shape box",
+ "related": []
+ },
+ "icon-umb-settings": {
+ "thesaurus": [
+ "spanner",
+ "wrench"
+ ],
+ "group": "item tool",
+ "related": [
+ "icon-wrench",
+ "icon-tools"
+ ]
+ },
+ "icon-umb-users": {
+ "thesaurus": [
+ "person",
+ "people"
+ ],
+ "group": "user",
+ "related": [
+ "icon-user",
+ "icon-user-female",
+ "icon-user-glasses",
+ "icon-client",
+ "icon-employee",
+ "icon-piracy",
+ "icon-theif",
+ "icon-operator"
+ ]
+ },
+ "icon-umb-media": {
+ "thesaurus": [
+ "photograph",
+ "image",
+ "picture",
+ "mountains",
+ "scenery",
+ "landscape"
+ ],
+ "group": "picture",
+ "related": [
+ "icon-picture",
+ "icon-pictures",
+ "icon-pictures-alt",
+ "icon-pictures-alt-2",
+ "icon-photo-album",
+ "icon-mountain"
+ ]
+ },
+ "icon-umb-content": {
+ "thesaurus": [
+ "pages",
+ "papers",
+ "documents"
+ ],
+ "group": "document",
+ "related": [
+ "icon-document",
+ "icon-document-dashed-line",
+ "icon-documents",
+ "icon-article",
+ "icon-diploma-alt",
+ "icon-script",
+ "icon-script-alt"
+ ]
+ },
+ "icon-umb-developer": {
+ "thesaurus": [
+ "settings",
+ "cog",
+ "wheel",
+ "preferences"
+ ],
+ "group": "settings",
+ "related": [
+ "icon-settings",
+ "icon-settings-alt",
+ "icon-settings-alt-2"
+ ]
+ },
+ "icon-umb-members": {
+ "thesaurus": [
+ "business cards",
+ "id cards",
+ "profiles",
+ "personas",
+ "person",
+ "users"
+ ],
+ "group": "user",
+ "related": [
+ "icon-vcard"
+ ]
+ },
+ "icon-umb-translation": {
+ "thesaurus": [
+ "globe",
+ "i18n",
+ "internationalisation",
+ "internationalization",
+ "world",
+ "internet"
+ ],
+ "group": "item globe",
+ "related": [
+ "icon-globe-alt",
+ "icon-globe",
+ "icon-globe-inverted-europe-africa",
+ "icon-globe-inverted-asia",
+ "icon-globe-inverted-america",
+ "icon-globe-europe---africa",
+ "icon-globe-asia"
+ ]
+ },
+ "icon-tv": {
+ "thesaurus": [
+ "telly",
+ "tv",
+ "monitor",
+ "display"
+ ],
+ "group": "item tech",
+ "related": [
+ "icon-tv-old"
+ ]
+ },
+ "icon-tv-old": {
+ "thesaurus": [
+ "telly",
+ "tv",
+ "retro",
+ "crt"
+ ],
+ "group": "item tech",
+ "related": [
+ "icon-tv"
+ ]
+ },
+ "icon-trophy": {
+ "thesaurus": [
+ "awards",
+ "cups",
+ "winnings",
+ "rewards"
+ ],
+ "group": "item award",
+ "related": [
+ "icon-medal",
+ "icon-diploma",
+ "icon-diploma-alt"
+ ]
+ },
+ "icon-tree": {
+ "thesaurus": [
+ "plants",
+ "woods",
+ "forests",
+ "nature",
+ "outdoors"
+ ],
+ "group": "item nature",
+ "related": []
+ },
+ "icon-trash": {
+ "thesaurus": [
+ "bin",
+ "rubbish"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-trash-alt",
+ "icon-trash-alt-2"
+ ]
+ },
+ "icon-trash-alt": {
+ "thesaurus": [
+ "bin",
+ "rubbish"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-trash",
+ "icon-trash-alt-2"
+ ]
+ },
+ "icon-trash-alt-2": {
+ "thesaurus": [
+ "bin",
+ "rubbish"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-trash",
+ "icon-trash-alt"
+ ]
+ },
+ "icon-train": {
+ "thesaurus": [
+ "trams",
+ "railways",
+ "trains",
+ "public transport"
+ ],
+ "group": "transport vehicle",
+ "related": []
+ },
+ "icon-trafic": {
+ "thesaurus": [
+ "arrows",
+ "bi-directional",
+ "two",
+ "2",
+ "swap"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-traffic-alt",
+ "icon-shuffle",
+ "icon-repeat",
+ "icon-navigation-road"
+ ]
+ },
+ "icon-traffic-alt": {
+ "thesaurus": [
+ "arrows",
+ "bi-directional",
+ "two",
+ "2",
+ "swap",
+ "navigation"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-traffic",
+ "icon-tab-key",
+ "icon-shuffle",
+ "icon-repeat",
+ "icon-repeat-one",
+ "icon-navigation-road"
+ ]
+ },
+ "icon-top": {
+ "thesaurus": [
+ "vest"
+ ],
+ "group": "item clothing",
+ "related": [
+ "icon-t-shirt"
+ ]
+ },
+ "icon-tools": {
+ "thesaurus": [
+ "spanner",
+ "settings",
+ "wrench",
+ "screwdriver"
+ ],
+ "group": "item tool",
+ "related": [
+ "icon-wrench",
+ "icon-tools"
+ ]
+ },
+ "icon-timer": {
+ "thesaurus": [
+ "clock",
+ "stopwatch"
+ ],
+ "group": "item clock",
+ "related": []
+ },
+ "icon-time": {
+ "thesaurus": [
+ "clock",
+ "stopwatch"
+ ],
+ "group": "item clock",
+ "related": []
+ },
+ "icon-t-shirt": {
+ "thesaurus": [
+ "tshirt",
+ "top"
+ ],
+ "group": "item clothing",
+ "related": [
+ "icon-top"
+ ]
+ },
+ "icon-tab-key": {
+ "thesaurus": [
+ "arrow",
+ "line",
+ "end",
+ "stop"
+ ],
+ "group": "action key arrow",
+ "related": [
+ "icon-traffic-alt",
+ "icon-traffic",
+ "icon-shuffle",
+ "icon-repeat",
+ "icon-navigation-road"
+ ]
+ },
+ "icon-tab": {
+ "thesaurus": [
+ "tabs",
+ "matryoshka"
+ ],
+ "group": "action window tab",
+ "related": []
+ },
+ "icon-tactics": {
+ "thesaurus": [
+ "tic tac toe",
+ "arrows",
+ "naughts and crosses"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-tag": {
+ "thesaurus": [
+ "prices",
+ "labels",
+ "tags"
+ ],
+ "group": "item",
+ "related": [
+ "icon-tags"
+ ]
+ },
+ "icon-tags": {
+ "thesaurus": [
+ "two",
+ "2",
+ "prices",
+ "labels",
+ "tags"
+ ],
+ "group": "item",
+ "related": [
+ "icon-tag"
+ ]
+ },
+ "icon-takeaway-cup": {
+ "thesaurus": [
+ "coffee",
+ "mug",
+ "tea"
+ ],
+ "group": "item food drink",
+ "related": [
+ "icon-coffee",
+ "icon-cocktail",
+ "icon-beer-glass",
+ "icon-wine-glass"
+ ]
+ },
+ "icon-target": {
+ "thesaurus": [
+ "circles",
+ "two",
+ "2",
+ "nested",
+ "nesting",
+ "bullet point",
+ "radio buttons",
+ "radios"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-temperatrure-alt": {
+ "thesaurus": [
+ "temperature",
+ "thermometer",
+ "guage",
+ "speed",
+ "scale",
+ "fuel"
+ ],
+ "group": "measure",
+ "related": [
+ "icon-speed-gauge",
+ "icon-temperature"
+ ]
+ },
+ "icon-temperature": {
+ "thesaurus": [
+ "thermometer",
+ "health"
+ ],
+ "group": "measure",
+ "related": [
+ "icon-temperatrure-alt"
+ ]
+ },
+ "icon-terminal": {
+ "thesaurus": [
+ "console",
+ "commands",
+ "line",
+ "code",
+ "developers",
+ "cli"
+ ],
+ "group": "action window",
+ "related": []
+ },
+ "icon-theater": {
+ "thesaurus": [
+ "theatre",
+ "masks",
+ "arts",
+ "theatrical",
+ "costume"
+ ],
+ "group": "building",
+ "related": []
+ },
+ "icon-theif": {
+ "thesaurus": [
+ "burglar",
+ "criminal",
+ "secret agent",
+ "spy",
+ "bandit"
+ ],
+ "group": "user special",
+ "related": [
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users",
+ "icon-user-glasses",
+ "icon-client",
+ "icon-employee",
+ "icon-piracy",
+ "icon-operator"
+ ]
+ },
+ "icon-thought-bubble": {
+ "thesaurus": [
+ "thinking",
+ "speech bubble",
+ "thought",
+ "idea"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-thumb-down": {
+ "thesaurus": [
+ "no",
+ "thumbs down"
+ ],
+ "group": "item hand thumb",
+ "related": [
+ "icon-thumb-up"
+ ]
+ },
+ "icon-thumb-up": {
+ "thesaurus": [
+ "yes",
+ "thumbs up"
+ ],
+ "group": "item hand thumb",
+ "related": [
+ "icon-thumb-down"
+ ]
+ },
+ "icon-thumbnail-list": {
+ "thesaurus": [
+ "media"
+ ],
+ "group": "shape box layout",
+ "related": []
+ },
+ "icon-thumbnails-small": {
+ "thesaurus": [
+ "grid",
+ "boxes",
+ "squares",
+ "nine",
+ "9"
+ ],
+ "group": "shape box layout",
+ "related": [
+ "icon-thumbnails",
+ "icon-grid",
+ "icon-stop",
+ "icon-thumbnail-list",
+ "icon-item-arrangement"
+ ]
+ },
+ "icon-thumbnails": {
+ "thesaurus": [
+ "grid",
+ "boxes",
+ "squares",
+ "four",
+ "4"
+ ],
+ "group": "shape box layout",
+ "related": [
+ "icon-thumbnails-small",
+ "icon-grid",
+ "icon-stop",
+ "icon-thumbnail-list"
+ ]
+ },
+ "icon-ticket": {
+ "thesaurus": [
+ "one",
+ "1"
+ ],
+ "group": "item money note ticket",
+ "related": [
+ "icon-coins",
+ "icon-bills"
+ ]
+ },
+ "icon-sync": {
+ "thesaurus": [
+ "refresh",
+ "recycle",
+ "sync"
+ ],
+ "group": "action rotate",
+ "related": [
+ "icon-axis-rotation",
+ "icon-axis-rotation-2",
+ "icon-axis-rotation-3",
+ "icon-refresh",
+ "icon-re-post"
+ ]
+ },
+ "icon-sweatshirt": {
+ "thesaurus": [
+ "jumper",
+ "pullover"
+ ],
+ "group": "item clothing",
+ "related": [
+ "icon-top",
+ "icon-t-shirt"
+ ]
+ },
+ "icon-sunny": {
+ "thesaurus": [
+ "weather",
+ "summer"
+ ],
+ "group": "weather",
+ "related": [
+ "icon-snow",
+ "icon-cloudy",
+ "icon-cloud"
+ ]
+ },
+ "icon-stream": {
+ "thesaurus": [
+ "circle",
+ "wave",
+ "sine",
+ "alternating current"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-store": {
+ "thesaurus": [
+ "shop",
+ "market",
+ "supermarket",
+ "superstore"
+ ],
+ "group": "building",
+ "related": []
+ },
+ "icon-stop": {
+ "thesaurus": [
+ "square"
+ ],
+ "group": "shape box",
+ "related": [
+ "icon-thumbnails",
+ "icon-thumbnails-small",
+ "icon-record",
+ "icon-play",
+ "icon-pause"
+ ]
+ },
+ "icon-stop-hand": {
+ "thesaurus": [
+ "palm"
+ ],
+ "group": "item hand",
+ "related": [
+ "icon-stop-alt",
+ "icon-stop-hand"
+ ]
+ },
+ "icon-stop-alt": {
+ "thesaurus": [
+ "sign",
+ "octagon",
+ "eight",
+ "8"
+ ],
+ "group": "misc",
+ "related": [
+ "icon-stop",
+ "icon-stop-hand"
+ ]
+ },
+ "icon-stamp": {
+ "thesaurus": [
+ "frame",
+ "photos",
+ "photographs",
+ "pictures",
+ "images",
+ "icon-shipping-box"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-stacked-disks": {
+ "thesaurus": [
+ "hard drives",
+ "ssd",
+ "hdd",
+ "servers",
+ "rack",
+ "hardware"
+ ],
+ "group": "item tech hardware",
+ "related": [
+ "icon-server",
+ "icon-disk-image",
+ "icon-ssd"
+ ]
+ },
+ "icon-ssd": {
+ "thesaurus": [
+ "disk",
+ "hdd",
+ "sata",
+ "hardware"
+ ],
+ "group": "item tech hardware",
+ "related": [
+ "icon-server",
+ "icon-disk-image",
+ "icon-ssd"
+ ]
+ },
+ "icon-squiggly-line": {
+ "thesaurus": [
+ "wave",
+ "random",
+ "squiggle"
+ ],
+ "group": "misc",
+ "related": [
+ "icon-stream"
+ ]
+ },
+ "icon-sprout": {
+ "thesaurus": [
+ "plant",
+ "sapling",
+ "spring"
+ ],
+ "group": "item nature",
+ "related": [
+ "icon-tree"
+ ]
+ },
+ "icon-split": {
+ "thesaurus": [
+ "arrows",
+ "fork",
+ "two",
+ "2"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-split-alt"
+ ]
+ },
+ "icon-split-alt": {
+ "thesaurus": [
+ "arrows",
+ "fork",
+ "three",
+ "3"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-split"
+ ]
+ },
+ "icon-speed-gauge": {
+ "thesaurus": [
+ "guage",
+ "speed",
+ "scale",
+ "fuel"
+ ],
+ "group": "measure",
+ "related": [
+ "icon-temperatrure-alt"
+ ]
+ },
+ "icon-speaker": {
+ "thesaurus": [
+ "sounds",
+ "audio",
+ "music",
+ "speakers",
+ "amplifiers",
+ "amps"
+ ],
+ "group": "item media",
+ "related": [
+ "icon-sound",
+ "icon-sound-waves"
+ ]
+ },
+ "icon-sound": {
+ "thesaurus": [
+ "sounds",
+ "audio",
+ "music",
+ "speakers",
+ "amplifiers",
+ "amps",
+ "volume",
+ "maximum"
+ ],
+ "group": "item media",
+ "related": [
+ "icon-sound-medium",
+ "icon-sound-low",
+ "icon-sound-off",
+ "icon-sound-waves",
+ "icon-speaker"
+ ]
+ },
+ "icon-spades": {
+ "thesaurus": [],
+ "group": "misc game",
+ "related": []
+ },
+ "icon-sound-waves": {
+ "thesaurus": [
+ "sounds",
+ "audio",
+ "music"
+ ],
+ "group": "item media",
+ "related": []
+ },
+ "icon-shipping-box": {
+ "thesaurus": [
+ "grid",
+ "grill",
+ "lines"
+ ],
+ "group": "shape box",
+ "related": []
+ },
+ "icon-shipping": {
+ "thesaurus": [
+ "trailer",
+ "sack truck",
+ "boxes",
+ "lift",
+ "carry"
+ ],
+ "group": "commerce",
+ "related": [
+ "icon-truck"
+ ]
+ },
+ "icon-shoe": {
+ "thesaurus": [
+ "trainers",
+ "sneakers"
+ ],
+ "group": "item clothing",
+ "related": []
+ },
+ "icon-shopping-basket-alt-2": {
+ "thesaurus": [
+ "carts",
+ "checkouts"
+ ],
+ "group": "commerce",
+ "related": [
+ "icon-shopping-basket",
+ "item-shopping-basket-alt"
+ ]
+ },
+ "icon-shopping-basket": {
+ "thesaurus": [
+ "trolley",
+ "trollies",
+ "supermarket"
+ ],
+ "group": "commerce",
+ "related": [
+ "icon-shopping-basket-alt",
+ "item-shopping-basket-alt-2"
+ ]
+ },
+ "icon-shopping-basket-alt": {
+ "thesaurus": [
+ "bag",
+ "gift"
+ ],
+ "group": "commerce",
+ "related": [
+ "icon-shopping-basket",
+ "item-shopping-basket-alt-2"
+ ]
+ },
+ "icon-shorts": {
+ "thesaurus": [
+ "trousers",
+ "bottoms",
+ "pants"
+ ],
+ "group": "item clothing",
+ "related": []
+ },
+ "icon-shuffle": {
+ "thesaurus": [
+ "arrows",
+ "two",
+ "2",
+ "mix",
+ "random"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-traffic-alt",
+ "icon-tab-key",
+ "icon-traffic",
+ "icon-repeat",
+ "icon-navigation-road"
+ ]
+ },
+ "icon-sience": {
+ "thesaurus": [
+ "nuclear",
+ "orbit"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-simcard": {
+ "thesaurus": [
+ "technology",
+ "telephony",
+ "phones",
+ "mobiles",
+ "cellphones"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-single-note": {
+ "thesaurus": [
+ "music",
+ "sounds",
+ "audio"
+ ],
+ "group": "item media",
+ "related": []
+ },
+ "icon-sitemap": {
+ "thesaurus": [
+ "trees",
+ "family trees",
+ "hierachies",
+ "hierachy",
+ "structure",
+ "flowcharts",
+ "flow charts",
+ "flow diagrams"
+ ],
+ "group": "data",
+ "related": []
+ },
+ "icon-sleep": {
+ "thesaurus": [
+ "moons",
+ "crescent",
+ "nighttime"
+ ],
+ "group": "weather",
+ "related": []
+ },
+ "icon-slideshow": {
+ "thesaurus": [
+ "powerpoints",
+ "data",
+ "keynotes",
+ "presentations",
+ "slideshows",
+ "slide shows"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-smiley-inverted": {
+ "thesaurus": [
+ "emojis",
+ "emoticons",
+ "faces",
+ "people",
+ "person",
+ "user",
+ "happy",
+ "happiness"
+ ],
+ "group": "user",
+ "related": [
+ "icon-smiley"
+ ]
+ },
+ "icon-smiley": {
+ "thesaurus": [
+ "emojis",
+ "emoticons",
+ "faces",
+ "people",
+ "person",
+ "user",
+ "happy",
+ "happiness"
+ ],
+ "group": "user",
+ "related": [
+ "icon-smiley-inverted"
+ ]
+ },
+ "icon-snow": {
+ "thesaurus": [
+ "snowing",
+ "cold",
+ "winter",
+ "hailing"
+ ],
+ "group": "weather cloud",
+ "related": []
+ },
+ "icon-sound-low": {
+ "thesaurus": [
+ "sounds",
+ "audio",
+ "music",
+ "speakers",
+ "amplifiers",
+ "amps",
+ "volume",
+ "minimum"
+ ],
+ "group": "item media",
+ "related": [
+ "icon-sound-medium",
+ "icon-sound",
+ "icon-sound-off",
+ "icon-sound-waves",
+ "icon-speaker"
+ ]
+ },
+ "icon-sound-medium": {
+ "thesaurus": [
+ "sounds",
+ "audio",
+ "music",
+ "speakers",
+ "amplifiers",
+ "amps",
+ "volume",
+ "medium"
+ ],
+ "group": "item media",
+ "related": [
+ "icon-sound",
+ "icon-sound-low",
+ "icon-sound-off",
+ "icon-sound-waves",
+ "icon-speaker"
+ ]
+ },
+ "icon-sound-off": {
+ "thesaurus": [
+ "sounds",
+ "audio",
+ "music",
+ "speakers",
+ "amplifiers",
+ "amps",
+ "volume",
+ "muted"
+ ],
+ "group": "item media",
+ "related": [
+ "icon-sound-medium",
+ "icon-sound-low",
+ "icon-sound",
+ "icon-sound-waves",
+ "icon-speaker"
+ ]
+ },
+ "icon-shift": {
+ "thesaurus": [
+ "arrows",
+ "up"
+ ],
+ "group": "action key",
+ "related": []
+ },
+ "icon-shield": {
+ "thesaurus": [
+ "security",
+ "protect",
+ "secure",
+ "badge"
+ ],
+ "group": "item security",
+ "related": []
+ },
+ "icon-sharing-iphone": {
+ "thesaurus": [
+ "share",
+ "export",
+ "arrows",
+ "boxes"
+ ],
+ "group": "action arrow box",
+ "related": []
+ },
+ "icon-share": {
+ "thesaurus": [
+ "networks",
+ "social media"
+ ],
+ "group": "action",
+ "related": []
+ },
+ "icon-share-alt": {
+ "thesaurus": [
+ "broadcasts",
+ "waves"
+ ],
+ "group": "action",
+ "related": []
+ },
+ "icon-share-alt-2": {
+ "thesaurus": [
+ "eyes",
+ "hands",
+ "sharing",
+ "holding"
+ ],
+ "group": "action",
+ "related": []
+ },
+ "icon-settings": {
+ "thesaurus": [
+ "settings",
+ "cog",
+ "wheel",
+ "preferences"
+ ],
+ "group": "settings",
+ "related": [
+ "icon-umb-developer",
+ "icon-settings-alt",
+ "icon-settings-alt-2"
+ ]
+ },
+ "icon-settings-alt": {
+ "thesaurus": [
+ "settings",
+ "cog",
+ "wheel",
+ "preferences"
+ ],
+ "group": "settings",
+ "related": [
+ "icon-settings",
+ "icon-umb-developer",
+ "icon-settings-alt-2"
+ ]
+ },
+ "icon-settings-alt-2": {
+ "thesaurus": [
+ "settings",
+ "cog",
+ "wheel",
+ "preferences"
+ ],
+ "group": "settings",
+ "related": [
+ "icon-settings",
+ "icon-settings-alt",
+ "icon-umb-developer"
+ ]
+ },
+ "icon-server": {
+ "thesaurus": [
+ "servers",
+ "rack",
+ "hardware"
+ ],
+ "group": "item tech hardware",
+ "related": [
+ "icon-stacked-disks",
+ "icon-disk-image",
+ "icon-ssd"
+ ]
+ },
+ "icon-server-alt": {
+ "thesaurus": [
+ "db",
+ "databases",
+ "data store"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-sensor": {
+ "thesaurus": [
+ "waves",
+ "earthquake",
+ "epicentre",
+ "epicenter"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-security-camera": {
+ "thesaurus": [
+ "webcams",
+ "cctv"
+ ],
+ "group": "item tech",
+ "related": []
+ },
+ "icon-search": {
+ "thesaurus": [
+ "magnifying glass"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-scull": {
+ "thesaurus": [
+ "dead",
+ "death",
+ "expired",
+ "old",
+ "skull",
+ "pirate",
+ "piracy"
+ ],
+ "group": "item",
+ "related": [
+ "icon-piracy"
+ ]
+ },
+ "icon-script": {
+ "thesaurus": [
+ "scroll",
+ "javascript",
+ "js"
+ ],
+ "group": "file",
+ "related": [
+ "icon-script-alt"
+ ]
+ },
+ "icon-script-alt": {
+ "thesaurus": [
+ "scroll",
+ "javascript",
+ "js"
+ ],
+ "group": "file",
+ "related": [
+ "icon-script"
+ ]
+ },
+ "icon-screensharing": {
+ "thesaurus": [
+ "boxes",
+ "multiple",
+ "two",
+ "2",
+ "nested",
+ "restore"
+ ],
+ "group": "shape box",
+ "related": [
+ "icon-layers-alt"
+ ]
+ },
+ "icon-school": {
+ "thesaurus": [
+ "clock tower",
+ "town hall",
+ "building",
+ "university"
+ ],
+ "group": "building",
+ "related": []
+ },
+ "icon-scan": {
+ "thesaurus": [
+ "radar"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-refresh": {
+ "thesaurus": [
+ "arrow",
+ "recycle",
+ "sync",
+ "repeat"
+ ],
+ "group": "action rotate",
+ "related": [
+ "icon-axis-rotation",
+ "icon-axis-rotation-2",
+ "icon-axis-rotation-3",
+ "icon-sync",
+ "icon-re-post"
+ ]
+ },
+ "icon-remote": {
+ "thesaurus": [
+ "remote controls",
+ "buttons"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-remove": {
+ "thesaurus": [
+ "minus",
+ "subtracts",
+ "lines",
+ "deletes"
+ ],
+ "group": "maths",
+ "related": []
+ },
+ "icon-repeat-one": {
+ "thesaurus": [
+ "arrows",
+ "bi-directional",
+ "two",
+ "2",
+ "swap",
+ "loop",
+ "reverse"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-repeat",
+ "icon-traffic-alt",
+ "icon-tab-key",
+ "icon-shuffle",
+ "icon-traffic",
+ "icon-navigation-road"
+ ]
+ },
+ "icon-repeat": {
+ "thesaurus": [
+ "arrows",
+ "bi-directional",
+ "two",
+ "2",
+ "swap",
+ "loop",
+ "reverse"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-repeat-one",
+ "icon-traffic-alt",
+ "icon-tab-key",
+ "icon-shuffle",
+ "icon-traffic",
+ "icon-navigation-road"
+ ]
+ },
+ "icon-resize": {
+ "thesaurus": [
+ "arrows",
+ "move",
+ "resizes",
+ "scales"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-reply-arrow": {
+ "thesaurus": [
+ "arrows",
+ "back"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-return-to-top": {
+ "thesaurus": [
+ "loops",
+ "repeats",
+ "arrows"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-right-double-arrow": {
+ "thesaurus": [
+ "chevrons",
+ "two",
+ "2"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-road": {
+ "thesaurus": [
+ "streets",
+ "highways",
+ "lanes",
+ "motorways",
+ "roads"
+ ],
+ "group": "transport",
+ "related": []
+ },
+ "icon-roadsign": {
+ "thesaurus": [
+ "warnings"
+ ],
+ "group": "transport",
+ "related": []
+ },
+ "icon-rocket": {
+ "thesaurus": [
+ "space",
+ "launches"
+ ],
+ "group": "transport vehicle",
+ "related": []
+ },
+ "icon-rss": {
+ "thesaurus": [
+ "rss feed",
+ "syndication",
+ "broadcasts",
+ "waves"
+ ],
+ "group": "item tech",
+ "related": []
+ },
+ "icon-ruler-alt": {
+ "thesaurus": [
+ "triangles",
+ "set squares",
+ "measures",
+ "tools"
+ ],
+ "group": "item tool",
+ "related": []
+ },
+ "icon-ruler": {
+ "thesaurus": [
+ "measures",
+ "tools"
+ ],
+ "group": "item tool",
+ "related": []
+ },
+ "icon-sandbox-toys": {
+ "thesaurus": [
+ "bucket",
+ "spade"
+ ],
+ "group": "item tool",
+ "related": []
+ },
+ "icon-satellite-dish": {
+ "thesaurus": [
+ "broadcasts",
+ "transmits",
+ "receiver"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-save": {
+ "thesaurus": [
+ "imports",
+ "circles",
+ "arrows"
+ ],
+ "group": "action arrow circle",
+ "related": [
+ "icon-umb-deploy"
+ ]
+ },
+ "icon-safedial": {
+ "thesaurus": [
+ "codes",
+ "secrets",
+ "locked"
+ ],
+ "group": "item security lock",
+ "related": []
+ },
+ "icon-safe": {
+ "thesaurus": [
+ "codes",
+ "secrets",
+ "locked",
+ "dial"
+ ],
+ "group": "item security lock",
+ "related": []
+ },
+ "icon-redo": {
+ "thesaurus": [
+ "arrow",
+ "forward"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-undo",
+ "icon-delete-key",
+ "icon-arrow-right",
+ "icon-navigation-right",
+ "icon-right-double-arrow"
+ ]
+ },
+ "icon-printer-alt": {
+ "thesaurus": [
+ "printers",
+ "peripherals"
+ ],
+ "group": "item tech hardware",
+ "related": [
+ "icon-print"
+ ]
+ },
+ "icon-planet": {
+ "thesaurus": [
+ "space",
+ "saturn"
+ ],
+ "group": "item globe",
+ "related": []
+ },
+ "icon-paste-in": {
+ "thesaurus": [
+ "clipboard"
+ ],
+ "group": "action",
+ "related": []
+ },
+ "icon-os-x": {
+ "thesaurus": [
+ "mac",
+ "apple"
+ ],
+ "group": "logo",
+ "related": [
+ "icon-windows"
+ ]
+ },
+ "icon-navigation-left": {
+ "thesaurus": [
+ "arrows",
+ "triangles"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-message": {
+ "thesaurus": [
+ "emails",
+ "envelopes",
+ "letters",
+ "sms"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-message-unopened",
+ "icon-message-open"
+ ]
+ },
+ "icon-lock": {
+ "thesaurus": [
+ "padlocks",
+ "locks",
+ "security",
+ "secret",
+ "locked"
+ ],
+ "group": "item security",
+ "related": [
+ "icon-lock",
+ "icon-combination-lock",
+ "icon-keyhole",
+ "icon-old-key",
+ "icon-keychain",
+ "icon-key"
+ ]
+ },
+ "icon-layers-alt": {
+ "thesaurus": [
+ "boxes",
+ "multiple",
+ "three",
+ "3",
+ "nested",
+ "restore"
+ ],
+ "group": "shape box",
+ "related": [
+ "icon-screensharing"
+ ]
+ },
+ "icon-record": {
+ "thesaurus": [
+ "circles"
+ ],
+ "group": "shape",
+ "related": []
+ },
+ "icon-print": {
+ "thesaurus": [
+ "printer",
+ "print"
+ ],
+ "group": "item tech hardware",
+ "related": [
+ "icon-printer-alt"
+ ]
+ },
+ "icon-plane": {
+ "thesaurus": [
+ "airplanes",
+ "aeroplanes",
+ "aircraft",
+ "flying",
+ "flight"
+ ],
+ "group": "transport vehicle",
+ "related": []
+ },
+ "icon-partly-cloudy": {
+ "thesaurus": [
+ "sunny spells"
+ ],
+ "group": "weather cloud",
+ "related": []
+ },
+ "icon-ordered-list": {
+ "thesaurus": [
+ "numbered list",
+ "numbers"
+ ],
+ "group": "action format",
+ "related": []
+ },
+ "icon-navigation-last": {
+ "thesaurus": [
+ "end",
+ "finish"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-message-unopened": {
+ "thesaurus": [
+ "emails",
+ "envelopes",
+ "letters",
+ "sms"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-message",
+ "icon-message-open"
+ ]
+ },
+ "icon-location-nearby": {
+ "thesaurus": [
+ "geolocation",
+ "maps",
+ "pins"
+ ],
+ "group": "misc",
+ "related": [
+ "icon-pin-location",
+ "icon-location-near-me"
+ ]
+ },
+ "icon-laptop": {
+ "thesaurus": [
+ "pc",
+ "computers",
+ "macbooks"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-reception": {
+ "thesaurus": [
+ "receptionists",
+ "desks",
+ "working"
+ ],
+ "group": "user",
+ "related": []
+ },
+ "icon-price-yen": {
+ "thesaurus": [
+ "buy",
+ "money"
+ ],
+ "group": "item money",
+ "related": []
+ },
+ "icon-piracy": {
+ "thesaurus": [
+ "pirates",
+ "person",
+ "people",
+ "users"
+ ],
+ "group": "user special",
+ "related": [
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users",
+ "icon-user-glasses",
+ "icon-client",
+ "icon-employee",
+ "icon-piracy",
+ "icon-theif",
+ "icon-operator",
+ "icon-scull"
+ ]
+ },
+ "icon-parental-control": {
+ "thesaurus": [
+ "children",
+ "parents",
+ "family",
+ "families",
+ "mom",
+ "mum",
+ "mummy",
+ "mommy",
+ "mother",
+ "father",
+ "dad",
+ "son",
+ "daughter"
+ ],
+ "group": "user",
+ "related": []
+ },
+ "icon-operator": {
+ "thesaurus": [
+ "microphones",
+ "users",
+ "people",
+ "person",
+ "support",
+ "phonecalls",
+ "call centres",
+ "call centers"
+ ],
+ "group": "user special",
+ "related": [
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users",
+ "icon-user-glasses",
+ "icon-client",
+ "icon-employee",
+ "icon-piracy",
+ "icon-theif",
+ "icon-operator"
+ ]
+ },
+ "icon-navigation-horizontal": {
+ "thesaurus": [
+ "arrows",
+ "lengths",
+ "widths",
+ "measure"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-message-open": {
+ "thesaurus": [
+ "emails",
+ "envelopes",
+ "letters",
+ "sms"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-message-unopened",
+ "icon-message"
+ ]
+ },
+ "icon-lab": {
+ "thesaurus": [
+ "science",
+ "beaker",
+ "test tube",
+ "testtube"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-location-near-me": {
+ "thesaurus": [
+ "geolocation",
+ "maps",
+ "pins"
+ ],
+ "group": "misc",
+ "related": [
+ "icon-pin-location",
+ "icon-location-nearby"
+ ]
+ },
+ "icon-receipt-yen": {
+ "thesaurus": [
+ "invoice"
+ ],
+ "group": "item money receipt",
+ "related": [
+ "icon-receipt-pound",
+ "icon-receipt-euro",
+ "icon-receipt-dollar",
+ "icon-receipt-alt"
+ ]
+ },
+ "icon-price-pound": {
+ "thesaurus": [],
+ "group": "item money",
+ "related": []
+ },
+ "icon-pin-location": {
+ "thesaurus": [
+ "geolocation",
+ "maps",
+ "pins"
+ ],
+ "group": "misc",
+ "related": [
+ "icon-location-nearby",
+ "icon-location-near-me"
+ ]
+ },
+ "icon-parachute-drop": {
+ "thesaurus": [],
+ "group": "sport",
+ "related": []
+ },
+ "icon-old-phone": {
+ "thesaurus": [
+ "telephones"
+ ],
+ "group": "item household phone",
+ "related": [
+ "icon-iphone",
+ "icon-phone",
+ "icon-phone-ring"
+ ]
+ },
+ "icon-merge": {
+ "thesaurus": [],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-navigation-first": {
+ "thesaurus": [
+ "start",
+ "beginning"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-locate": {
+ "thesaurus": [
+ "crosshairs",
+ "gps",
+ "location"
+ ],
+ "group": "space",
+ "related": []
+ },
+ "icon-keyhole": {
+ "thesaurus": [],
+ "group": "item security",
+ "related": [
+ "icon-lock",
+ "icon-keyhole",
+ "icon-old-key",
+ "icon-keychain",
+ "icon-key"
+ ]
+ },
+ "icon-receipt-pound": {
+ "thesaurus": [],
+ "group": "item money receipt",
+ "related": [
+ "icon-receipt-yen",
+ "icon-receipt-euro",
+ "icon-receipt-dollar",
+ "icon-receipt-alt"
+ ]
+ },
+ "icon-price-euro": {
+ "thesaurus": [],
+ "group": "item money",
+ "related": []
+ },
+ "icon-piggy-bank": {
+ "thesaurus": [
+ "animals",
+ "farms",
+ "pigs"
+ ],
+ "group": "item money",
+ "related": []
+ },
+ "icon-paper-plane": {
+ "thesaurus": [
+ "paper aeroplane",
+ "paper airplane",
+ "sending",
+ "sends",
+ "sent",
+ "delivers"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-paper-plane-alt"
+ ]
+ },
+ "icon-old-key": {
+ "thesaurus": [],
+ "group": "item security",
+ "related": [
+ "icon-lock",
+ "icon-keyhole",
+ "icon-old-key",
+ "icon-keychain",
+ "icon-key"
+ ]
+ },
+ "icon-navigation-down": {
+ "thesaurus": [
+ "arrows",
+ "triangles"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-megaphone": {
+ "thesaurus": [
+ "announcements"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-loading": {
+ "thesaurus": [
+ "watches",
+ "clocks",
+ "time"
+ ],
+ "group": "item clock",
+ "related": []
+ },
+ "icon-keychain": {
+ "thesaurus": [],
+ "group": "item security",
+ "related": [
+ "icon-lock",
+ "icon-keyhole",
+ "icon-old-key",
+ "icon-keychain",
+ "icon-key"
+ ]
+ },
+ "icon-receipt-euro": {
+ "thesaurus": [],
+ "group": "item money receipt",
+ "related": [
+ "icon-receipt-yen",
+ "icon-receipt-pound",
+ "icon-receipt-dollar",
+ "icon-receipt-alt"
+ ]
+ },
+ "icon-price-dollar": {
+ "thesaurus": [],
+ "group": "item money",
+ "related": []
+ },
+ "icon-pie-chart": {
+ "thesaurus": [
+ "pie graph",
+ "pie chart",
+ "piece",
+ "quarters",
+ "fourths",
+ "pizzas",
+ "cakes"
+ ],
+ "group": "data",
+ "related": []
+ },
+ "icon-paper-plane-alt": {
+ "thesaurus": [
+ "paper aeroplane",
+ "paper airplane",
+ "sending",
+ "sends",
+ "sent",
+ "delivers"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-paper-plane"
+ ]
+ },
+ "icon-notepad": {
+ "thesaurus": [
+ "notebook",
+ "text",
+ "txt"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-navigation-bottom": {
+ "thesaurus": [
+ "last",
+ "end",
+ "arrows",
+ "triangles"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-page-up",
+ "icon-page-down",
+ "icon-navigation-top"
+ ]
+ },
+ "icon-meeting": {
+ "thesaurus": [
+ "boardroom",
+ "table",
+ "dinner"
+ ],
+ "group": "user",
+ "related": []
+ },
+ "icon-keyboard": {
+ "thesaurus": [
+ "type",
+ "inputs"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-load": {
+ "thesaurus": [
+ "downloads"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-navigation-bottom"
+ ]
+ },
+ "icon-receipt-dollar": {
+ "thesaurus": [],
+ "group": "item money receipt",
+ "related": [
+ "icon-receipt-yen",
+ "icon-receipt-pound",
+ "icon-receipt-euro",
+ "icon-receipt-alt"
+ ]
+ },
+ "icon-previous": {
+ "thesaurus": [
+ "arrows",
+ "triangles"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-pictures": {
+ "thesaurus": [
+ "photograph",
+ "photography",
+ "image",
+ "picture",
+ "cameras"
+ ],
+ "group": "picture",
+ "related": [
+ "icon-picture",
+ "icon-umb-media",
+ "icon-pictures-alt",
+ "icon-pictures-alt-2",
+ "icon-photo-album"
+ ]
+ },
+ "icon-notepad-alt": {
+ "thesaurus": [],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-paper-bag": {
+ "thesaurus": [
+ "carrier",
+ "container",
+ "sack"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-name-badge": {
+ "thesaurus": [
+ "brooch",
+ "sheriff",
+ "sticker"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-medicine": {
+ "thesaurus": [
+ "bottles",
+ "pills",
+ "medicines"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-medical-emergency"
+ ]
+ },
+ "icon-list": {
+ "thesaurus": [
+ "menus",
+ "hamburgers",
+ "three",
+ "3",
+ "catalogue",
+ "catalog",
+ "inventory",
+ "record"
+ ],
+ "group": "shape box layout",
+ "related": [
+ "icon-thumbnails",
+ "icon-thumbnails-small",
+ "icon-thumbnail-list",
+ "icon-umb-contour"
+ ]
+ },
+ "icon-key": {
+ "thesaurus": [
+ "key",
+ "lock",
+ "house",
+ "home"
+ ],
+ "group": "item security",
+ "related": [
+ "icon-lock",
+ "icon-keyhole",
+ "icon-old-key",
+ "icon-keychain",
+ "icon-key"
+ ]
+ },
+ "icon-receipt-alt": {
+ "thesaurus": [],
+ "group": "item money receipt",
+ "related": [
+ "icon-receipt-yen",
+ "icon-receipt-pound",
+ "icon-receipt-euro",
+ "icon-receipt-dollar"
+ ]
+ },
+ "icon-previous-media": {
+ "thesaurus": [
+ "rewind",
+ "skip"
+ ],
+ "group": "item media",
+ "related": [
+ "icon-next-media"
+ ]
+ },
+ "icon-pictures-alt": {
+ "thesaurus": [
+ "photograph",
+ "image",
+ "picture",
+ "mountains",
+ "scenery",
+ "landscape"
+ ],
+ "group": "picture",
+ "related": [
+ "icon-picture",
+ "icon-pictures",
+ "icon-umb-media",
+ "icon-pictures-alt-2",
+ "icon-photo-album",
+ "icon-mountain"
+ ]
+ },
+ "icon-pants": {
+ "thesaurus": [
+ "trousers"
+ ],
+ "group": "item clothing",
+ "related": []
+ },
+ "icon-nodes": {
+ "thesaurus": [
+ "git",
+ "line",
+ "graph"
+ ],
+ "group": "data",
+ "related": []
+ },
+ "icon-music": {
+ "thesaurus": [
+ "notes",
+ "musical",
+ "sounds"
+ ],
+ "group": "item media",
+ "related": []
+ },
+ "icon-readonly": {
+ "thesaurus": [
+ "uneditable"
+ ],
+ "group": "action",
+ "related": []
+ },
+ "icon-presentation": {
+ "thesaurus": [
+ "audience",
+ "talks",
+ "powerpoints",
+ "slideshows",
+ "keynotes",
+ "speakers",
+ "conference"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-pictures-alt-2": {
+ "thesaurus": [
+ "photograph",
+ "image",
+ "picture",
+ "mountains",
+ "scenery",
+ "landscape"
+ ],
+ "group": "picture",
+ "related": [
+ "icon-picture",
+ "icon-pictures",
+ "icon-pictures-alt",
+ "icon-umb-media",
+ "icon-photo-album",
+ "icon-mountain"
+ ]
+ },
+ "icon-pannel-close": {
+ "thesaurus": [
+ "panels",
+ "down",
+ "triangles",
+ "minimize",
+ "minimise"
+ ],
+ "group": "action window",
+ "related": [
+ "icon-panel-show"
+ ]
+ },
+ "icon-next": {
+ "thesaurus": [
+ "right",
+ "triangles",
+ "forwards"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-play"
+ ]
+ },
+ "icon-multiple-windows": {
+ "thesaurus": [
+ "stacked",
+ "minimize",
+ "restore"
+ ],
+ "group": "action window",
+ "related": []
+ },
+ "icon-medical-emergency": {
+ "thesaurus": [
+ "medicine",
+ "hospitals",
+ "ambulances",
+ "health"
+ ],
+ "group": "logo",
+ "related": [
+ "icon-medicine"
+ ]
+ },
+ "icon-medal": {
+ "thesaurus": [
+ "awards",
+ "prizes",
+ "stars",
+ "heroes"
+ ],
+ "group": "item award",
+ "related": [
+ "icon-diploma",
+ "icon-diploma-alt",
+ "icon-trophy"
+ ]
+ },
+ "icon-link": {
+ "thesaurus": [
+ "chains",
+ "links",
+ "hyperlinks"
+ ],
+ "group": "item tech",
+ "related": []
+ },
+ "icon-linux-tux": {
+ "thesaurus": [
+ "penguins"
+ ],
+ "group": "logo",
+ "related": [
+ "icon-os-x"
+ ]
+ },
+ "icon-junk": {
+ "thesaurus": [
+ "trash",
+ "recycling bin",
+ "recycle bin",
+ "bin",
+ "reuses"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-item-arrangement": {
+ "thesaurus": [
+ "rows",
+ "grid",
+ "boxes",
+ "squares",
+ "six",
+ "6"
+ ],
+ "group": "shape box layout",
+ "related": [
+ "icon-thumbnails",
+ "icon-grid",
+ "icon-stop",
+ "icon-thumbnail-list",
+ "icon-item-arrangement"
+ ]
+ },
+ "icon-iphone": {
+ "thesaurus": [
+ "mobiles",
+ "telephones",
+ "cellphones",
+ "cell phones"
+ ],
+ "group": "item household phone",
+ "related": [
+ "icon-old-phone",
+ "icon-phone",
+ "icon-phone-ring"
+ ]
+ },
+ "icon-lightning": {
+ "thesaurus": [
+ "storms",
+ "electricity"
+ ],
+ "group": "weather cloud",
+ "related": []
+ },
+ "icon-map": {
+ "thesaurus": [
+ "partitions",
+ "screens",
+ "leaflets",
+ "flyers"
+ ],
+ "group": "item globe",
+ "related": []
+ },
+ "icon-multiple-credit-cards": {
+ "thesaurus": [
+ "payments",
+ "debit cards",
+ "credit cards",
+ "contactless",
+ "cashless",
+ "loyalty cards",
+ "store cards",
+ "business cards"
+ ],
+ "group": "item money card",
+ "related": [
+ "icon-credit-card",
+ "icon-credit-card-alt",
+ "icon-multiple-credit-cards"
+ ]
+ },
+ "icon-next-media": {
+ "thesaurus": [
+ "fast forward",
+ "skip"
+ ],
+ "group": "item media",
+ "related": [
+ "icon-previous-media"
+ ]
+ },
+ "icon-panel-show": {
+ "thesaurus": [
+ "panels",
+ "up",
+ "triangles",
+ "maximize",
+ "maximise",
+ "expand"
+ ],
+ "group": "action window",
+ "related": [
+ "icon-pannel-close"
+ ]
+ },
+ "icon-picture": {
+ "thesaurus": [
+ "photograph",
+ "image",
+ "picture",
+ "mountains",
+ "scenery",
+ "landscape"
+ ],
+ "group": "picture",
+ "related": [
+ "icon-umb-media",
+ "icon-pictures",
+ "icon-pictures-alt",
+ "icon-pictures-alt-2",
+ "icon-photo-album",
+ "icon-mountain"
+ ]
+ },
+ "icon-power": {
+ "thesaurus": [
+ "shut down",
+ "on",
+ "off"
+ ],
+ "group": "item tech",
+ "related": []
+ },
+ "icon-re-post": {
+ "thesaurus": [
+ "retweet",
+ "share",
+ "repost"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-axis-rotation",
+ "icon-axis-rotation-2",
+ "icon-axis-rotation-3",
+ "icon-sync",
+ "icon-refresh"
+ ]
+ },
+ "icon-rate": {
+ "thesaurus": [
+ "stars"
+ ],
+ "group": "shape",
+ "related": []
+ },
+ "icon-rain": {
+ "thesaurus": [
+ "raining",
+ "precipitation"
+ ],
+ "group": "weather cloud",
+ "related": []
+ },
+ "icon-radio": {
+ "thesaurus": [
+ "broadcast",
+ "tv",
+ "fm",
+ "television",
+ "aerials",
+ "ariels",
+ "transmitters",
+ "podcasts"
+ ],
+ "group": "item tech hardware",
+ "related": [
+ "icon-radio-alt",
+ "icon-radio-receiver"
+ ]
+ },
+ "icon-radio-receiver": {
+ "thesaurus": [
+ "broadcast",
+ "tv",
+ "fm",
+ "television",
+ "receivers",
+ "podcasts",
+ "retro"
+ ],
+ "group": "item tech hardware",
+ "related": [
+ "icon-radio-alt",
+ "icon-radio"
+ ]
+ },
+ "icon-radio-alt": {
+ "thesaurus": [
+ "broadcast",
+ "tv",
+ "fm",
+ "television",
+ "aerials",
+ "ariels",
+ "transmitters",
+ "podcasts"
+ ],
+ "group": "item tech hardware",
+ "related": [
+ "icon-radio-alt",
+ "icon-radio-receiver"
+ ]
+ },
+ "icon-quote": {
+ "thesaurus": [
+ "quotation marks",
+ "speech marks",
+ "speakers",
+ "talks",
+ "quotes",
+ "talking",
+ "chatting",
+ "testimonials"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-qr-code": {
+ "thesaurus": [
+ "barcode",
+ "qr codes"
+ ],
+ "group": "item tech",
+ "related": []
+ },
+ "icon-pushpin": {
+ "thesaurus": [
+ "map pins",
+ "thumb tack",
+ "noticeboard"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-pulse": {
+ "thesaurus": [
+ "heartbeat",
+ "health",
+ "line charts",
+ "monitors",
+ "line graphs"
+ ],
+ "group": "data",
+ "related": []
+ },
+ "icon-projector": {
+ "thesaurus": [
+ "home cinema",
+ "slideshows",
+ "presentations"
+ ],
+ "group": "item media",
+ "related": []
+ },
+ "icon-play": {
+ "thesaurus": [
+ "right",
+ "arrows",
+ "triangles",
+ "continue"
+ ],
+ "group": "item media",
+ "related": [
+ "icon-next"
+ ]
+ },
+ "icon-playing-cards": {
+ "thesaurus": [
+ "slideshows",
+ "carousels",
+ "poker",
+ "card games",
+ "playing cards"
+ ],
+ "group": "misc game",
+ "related": []
+ },
+ "icon-playlist": {
+ "thesaurus": [
+ "music",
+ "musical notes"
+ ],
+ "group": "item media",
+ "related": []
+ },
+ "icon-plugin": {
+ "thesaurus": [
+ "puzzle piece",
+ "jigsaws",
+ "games",
+ "kids",
+ "children",
+ "plugins",
+ "plug-ins",
+ "extensions",
+ "packages"
+ ],
+ "group": "misc game",
+ "related": []
+ },
+ "icon-podcast": {
+ "thesaurus": [
+ "person",
+ "users",
+ "people"
+ ],
+ "group": "user special",
+ "related": []
+ },
+ "icon-poker-chip": {
+ "thesaurus": [
+ "1",
+ "one",
+ "coins",
+ "money",
+ "cash",
+ "change",
+ "poker chips"
+ ],
+ "group": "misc game",
+ "related": []
+ },
+ "icon-poll": {
+ "thesaurus": [
+ "bar graphs",
+ "bar charts"
+ ],
+ "group": "data",
+ "related": []
+ },
+ "icon-post-it": {
+ "thesaurus": [
+ "postits",
+ "post-its",
+ "post its",
+ "labels",
+ "stickers",
+ "notes",
+ "pages",
+ "sheets"
+ ],
+ "group": "document",
+ "related": []
+ },
+ "icon-pound-bag": {
+ "thesaurus": [
+ "cash",
+ "swag"
+ ],
+ "group": "item money bag",
+ "related": []
+ },
+ "icon-power-outlet": {
+ "thesaurus": [
+ "power sockets",
+ "power outlets",
+ "electric",
+ "electricity"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-photo-album": {
+ "thesaurus": [
+ "books",
+ "photo albums"
+ ],
+ "group": "picture",
+ "related": []
+ },
+ "icon-phone": {
+ "thesaurus": [
+ "telephones",
+ "phones",
+ "calling"
+ ],
+ "group": "item household phone",
+ "related": []
+ },
+ "icon-phone-ring": {
+ "thesaurus": [
+ "telephones",
+ "phones",
+ "calling"
+ ],
+ "group": "item household phone",
+ "related": []
+ },
+ "icon-people": {
+ "thesaurus": [
+ "person",
+ "man",
+ "men",
+ "male"
+ ],
+ "group": "user",
+ "related": []
+ },
+ "icon-people-female": {
+ "thesaurus": [
+ "person",
+ "people",
+ "woman",
+ "female",
+ "women"
+ ],
+ "group": "user",
+ "related": []
+ },
+ "icon-people-alt": {
+ "thesaurus": [
+ "person",
+ "man",
+ "men",
+ "male"
+ ],
+ "group": "user",
+ "related": []
+ },
+ "icon-people-alt-2": {
+ "thesaurus": [
+ "person",
+ "man",
+ "men",
+ "male"
+ ],
+ "group": "user",
+ "related": []
+ },
+ "icon-pc": {
+ "thesaurus": [
+ "computers",
+ "servers",
+ "desktops",
+ "pcs"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-pause": {
+ "thesaurus": [],
+ "group": "item media",
+ "related": []
+ },
+ "icon-path": {
+ "thesaurus": [
+ "routes",
+ "paths",
+ "winding"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-out": {
+ "thesaurus": [
+ "export",
+ "external",
+ "arrows"
+ ],
+ "group": "action arrow box",
+ "related": []
+ },
+ "icon-outbox": {
+ "thesaurus": [
+ "out tray",
+ "trays"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-outdent": {
+ "thesaurus": [
+ "move",
+ "indentation",
+ "padding",
+ "spacing",
+ "margin"
+ ],
+ "group": "action arrow box",
+ "related": [
+ "icon-indent"
+ ]
+ },
+ "icon-page-add": {
+ "thesaurus": [
+ "new",
+ "create",
+ "documents",
+ "pages"
+ ],
+ "group": "document",
+ "related": []
+ },
+ "icon-page-down": {
+ "thesaurus": [
+ "bottom"
+ ],
+ "group": "action arrow box",
+ "related": [
+ "icon-page-up",
+ "icon-navigation-top",
+ "icon-navigation-bottom"
+ ]
+ },
+ "icon-page-remove": {
+ "thesaurus": [
+ "delete",
+ "documents",
+ "pages"
+ ],
+ "group": "document",
+ "related": []
+ },
+ "icon-page-restricted": {
+ "thesaurus": [
+ "documents",
+ "pages",
+ "disabled",
+ "restricted"
+ ],
+ "group": "document",
+ "related": []
+ },
+ "icon-page-up": {
+ "thesaurus": [
+ "top"
+ ],
+ "group": "action arrow box",
+ "related": [
+ "icon-page-down",
+ "icon-navigation-top",
+ "icon-navigation-bottom"
+ ]
+ },
+ "icon-paint-roller": {
+ "thesaurus": [
+ "decorate",
+ "decoration",
+ "decorating",
+ "themes",
+ "theming",
+ "colour",
+ "color",
+ "paint"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-palette": {
+ "thesaurus": [
+ "artist",
+ "painting",
+ "painter",
+ "themes",
+ "theming",
+ "colour",
+ "color",
+ "paint"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-newspaper": {
+ "thesaurus": [
+ "blogs",
+ "articles",
+ "journalism",
+ "journalist",
+ "press",
+ "media",
+ "magazine"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-newspaper-alt": {
+ "thesaurus": [
+ "blogs",
+ "articles",
+ "journalism",
+ "journalist",
+ "press",
+ "media",
+ "magazine"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-network-alt": {
+ "thesaurus": [
+ "graphs",
+ "charts",
+ "networks",
+ "trees",
+ "hierarchy",
+ "flowcharts",
+ "flow charts",
+ "branches",
+ "paths",
+ "forks"
+ ],
+ "group": "data",
+ "related": [
+ "icon-mindmap"
+ ]
+ },
+ "icon-navigational-arrow": {
+ "thesaurus": [
+ "satnav",
+ "sat nav",
+ "satellite navigation",
+ "gps"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-navigation": {
+ "thesaurus": [
+ "move",
+ "drag and drop",
+ "drag & drop",
+ "pan"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-navigation-vertical": {
+ "thesaurus": [
+ "up",
+ "down",
+ "scroll"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-navigation-up": {
+ "thesaurus": [
+ "triangles",
+ "arrows"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-navigation-right"
+ ]
+ },
+ "icon-navigation-top": {
+ "thesaurus": [
+ "start",
+ "top",
+ "arrows",
+ "triangles"
+ ],
+ "group": "action arrow box",
+ "related": [
+ "icon-page-up",
+ "icon-page-down",
+ "icon-navigation-bottom"
+ ]
+ },
+ "icon-navigation-road": {
+ "thesaurus": [],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-navigation-right": {
+ "thesaurus": [
+ "arrows",
+ "triangles"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-navigation-up"
+ ]
+ },
+ "icon-microscope": {
+ "thesaurus": [
+ "science",
+ "lab"
+ ],
+ "group": "item",
+ "related": [
+ "icon-lab"
+ ]
+ },
+ "icon-mindmap": {
+ "thesaurus": [
+ "chart",
+ "flow chart",
+ "diagram",
+ "decision tree"
+ ],
+ "group": "data",
+ "related": []
+ },
+ "icon-molecular-network": {
+ "thesaurus": [
+ "molecule",
+ "atoms",
+ "network",
+ "hub"
+ ],
+ "group": "misc",
+ "related": [
+ "icon-molecular"
+ ]
+ },
+ "icon-molecular": {
+ "thesaurus": [
+ "molecule",
+ "atoms",
+ "network",
+ "hub",
+ "virus"
+ ],
+ "group": "misc",
+ "related": [
+ "icon-molecular-network"
+ ]
+ },
+ "icon-mountain": {
+ "thesaurus": [
+ "landscape",
+ "geography",
+ "nature",
+ "natural feature"
+ ],
+ "group": "item nature",
+ "related": []
+ },
+ "icon-mouse-cursor": {
+ "thesaurus": [
+ "cursors",
+ "pointers",
+ "arrows",
+ "mouse",
+ "mice"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-mouse": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-movie-alt": {
+ "thesaurus": [
+ "movies",
+ "films",
+ "hollywood",
+ "action",
+ "clapperboards",
+ "filmmaking",
+ "directors",
+ "crew"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-map-marker": {
+ "thesaurus": [
+ "pins",
+ "maps",
+ "markers",
+ "locations",
+ "lollipop",
+ "lolly"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-movie": {
+ "thesaurus": [
+ "movies",
+ "films",
+ "reels"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-map-loaction": {
+ "thesaurus": [],
+ "group": "item",
+ "related": []
+ },
+ "icon-map-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-male-symbol": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-male-and-female": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-mailbox": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-magnet": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-loupe": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-mobile": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-logout": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-log-out": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-layers": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-left-double-arrow": {
+ "thesaurus": [
+ "chevrons",
+ "arrows",
+ "backwards"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-layout": {
+ "thesaurus": [
+ "media",
+ "newspaper",
+ "layouts",
+ "magazines"
+ ],
+ "group": "shape box layout",
+ "related": []
+ },
+ "icon-legal": {
+ "thesaurus": [
+ "scales",
+ "weight",
+ "mass",
+ "compare",
+ "balance"
+ ],
+ "group": "item household",
+ "related": [
+ "icon-weight"
+ ]
+ },
+ "icon-lense": {
+ "thesaurus": [
+ "circles",
+ "orbits",
+ "planets",
+ "eyeballs",
+ "target"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-library": {
+ "thesaurus": [
+ "temple",
+ "institution",
+ "government"
+ ],
+ "group": "building",
+ "related": [
+ "icon-school"
+ ]
+ },
+ "icon-light-down": {
+ "thesaurus": [
+ "brightness"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-light-up": {
+ "thesaurus": [
+ "brightness"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-lightbulb-active": {
+ "thesaurus": [
+ "on",
+ "switch",
+ "lamps",
+ "bulbs",
+ "lights"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-lightbulb": {
+ "thesaurus": [
+ "off",
+ "lights",
+ "bulbs",
+ "lamps"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-ipad": {
+ "thesaurus": [
+ "tablet"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-invoice": {
+ "thesaurus": [
+ "bills",
+ "invoices",
+ "dollar",
+ "usd",
+ "currency"
+ ],
+ "group": "item money invoice",
+ "related": []
+ },
+ "icon-info": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-infinity": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-indent": {
+ "thesaurus": [
+ "move",
+ "indentation",
+ "padding",
+ "spacing",
+ "margin"
+ ],
+ "group": "action arrow box",
+ "related": [
+ "icon-outdent"
+ ]
+ },
+ "icon-inbox": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-inbox-full": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-inactive-line": {
+ "thesaurus": [
+ "slashes",
+ "backslashes",
+ "lines",
+ "disabled",
+ "crossed"
+ ],
+ "group": "shape",
+ "related": []
+ },
+ "icon-imac": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-hourglass": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-home": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-grid": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-food": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-favorite": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-door-open-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-diagnostics": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-contrast": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coins-dollar-alt": {
+ "thesaurus": [
+ "money",
+ "us",
+ "usa"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-circle-dotted-active": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-cinema": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-chip": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-chip-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-chess": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-checkbox": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-checkbox-empty": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-checkbox-dotted": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-checkbox-dotted-active": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-check": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-chat": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-chat-active": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-chart": {
+ "thesaurus": [
+ "lines",
+ "graphs",
+ "charts",
+ "stocks",
+ "finance",
+ "financial"
+ ],
+ "group": "data",
+ "related": []
+ },
+ "icon-chart-curve": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-certificate": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-categories": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-cash-register": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-car": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-caps-lock": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-candy": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-circle-dotted": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-circuits": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-circus": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-client": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-clothes-hanger": {
+ "thesaurus": [
+ "clothes",
+ "clothing",
+ "wardrobes"
+ ],
+ "group": "item clothing",
+ "related": []
+ },
+ "icon-cloud-drive": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-cloud-upload": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-cloud": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-cloudy": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-clubs": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-cocktail": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-code": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coffee": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coin-dollar": {
+ "thesaurus": [
+ "money",
+ "us",
+ "usa",
+ "paper",
+ "cash"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-coin-pound": {
+ "thesaurus": [
+ "money",
+ "sterling",
+ "cash"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-coin-yen": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coin": {
+ "thesaurus": [
+ "money",
+ "cash"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-coins-alt": {
+ "thesaurus": [
+ "money",
+ "cash"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-console": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-connection": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-compress": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-company": {
+ "thesaurus": [
+ "city",
+ "cities",
+ "towns",
+ "companies",
+ "sky scrapers",
+ "buildings",
+ "offices"
+ ],
+ "group": "building",
+ "related": []
+ },
+ "icon-command": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coin-euro": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-combination-lock": {
+ "thesaurus": [],
+ "group": "",
+ "related": [
+ "icon-combination-lock-open",
+ "icon-lock",
+ "icon-keyhole",
+ "icon-old-key",
+ "icon-keychain",
+ "icon-key"
+ ]
+ },
+ "icon-combination-lock-open": {
+ "thesaurus": [],
+ "group": "",
+ "related": [
+ "icon-combination-lock",
+ "icon-unlocked",
+ "icon-keyhole",
+ "icon-old-key",
+ "icon-keychain",
+ "icon-key"
+ ]
+ },
+ "icon-comb": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-columns": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-colorpicker": {
+ "thesaurus": [
+ "pipettes",
+ "eyedroppers",
+ "eye droppers",
+ "eye-droppers",
+ "color pickers",
+ "colour pickers",
+ "colorpickers",
+ "colourpickers",
+ "styles"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-color-bucket": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coins": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coins-yen": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coins-yen-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coins-pound": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coins-pound-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coins-euro": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coins-euro-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coins-dollar": {
+ "thesaurus": [
+ "money",
+ "us",
+ "usa",
+ "cash"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-conversation-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-conversation": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-coverflow": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-credit-card-alt": {
+ "thesaurus": [
+ "payments",
+ "debit cards",
+ "credit cards",
+ "contactless",
+ "cashless",
+ "loyalty cards",
+ "store cards",
+ "business cards"
+ ],
+ "group": "item money card",
+ "related": [
+ "icon-credit-card",
+ "icon-credit-card-alt",
+ "icon-multiple-credit-cards"
+ ]
+ },
+ "icon-credit-card": {
+ "thesaurus": [
+ "payments",
+ "debit cards",
+ "credit cards",
+ "contactless",
+ "cashless",
+ "loyalty cards",
+ "store cards",
+ "business cards"
+ ],
+ "group": "item money card",
+ "related": [
+ "icon-credit-card",
+ "icon-credit-card-alt",
+ "icon-multiple-credit-cards"
+ ]
+ },
+ "icon-crop": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-crosshair": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-crown-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-crown": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-cupcake": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-curve": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-cut": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-dashboard": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-defrag": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-delete": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-delete-key": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-departure": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-desk": {
+ "thesaurus": [
+ "benches",
+ "desks",
+ "horses",
+ "gymnastics",
+ "hurdles"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-desktop": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-donate": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-dollar-bag": {
+ "thesaurus": [
+ "money",
+ "us",
+ "usa",
+ "cash",
+ "sack"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-documents": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-document": {
+ "thesaurus": [
+ "papers",
+ "documents",
+ "pages",
+ "sheets",
+ "leaf",
+ "leaves",
+ "new",
+ "blank"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-document-dashed-line": {
+ "thesaurus": [
+ "documents",
+ "new",
+ "create",
+ "pages",
+ "papers",
+ "drafts"
+ ],
+ "group": "document",
+ "related": []
+ },
+ "icon-dock-connector": {
+ "thesaurus": [
+ "usb",
+ "apple",
+ "30-pin",
+ "adaptor",
+ "cable",
+ "charges",
+ "charging"
+ ],
+ "group": "item tech",
+ "related": []
+ },
+ "icon-dna": {
+ "thesaurus": [
+ "biology",
+ "id",
+ "identity"
+ ],
+ "group": "item science",
+ "related": []
+ },
+ "icon-display": {
+ "thesaurus": [
+ "displays",
+ "monitors",
+ "screens",
+ "tvs",
+ "televisions",
+ "computers",
+ "pcs"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-disk-image": {
+ "thesaurus": [
+ "cds",
+ "dvds",
+ "disk",
+ "disc",
+ "drive"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-disc": {
+ "thesaurus": [
+ "cds",
+ "discs",
+ "disks",
+ "record",
+ "dvds",
+ "blurays",
+ "bluerays",
+ "blu-rays",
+ "blue rays",
+ "blue-rays",
+ "movies",
+ "films",
+ "music"
+ ],
+ "group": "item tech",
+ "related": []
+ },
+ "icon-directions": {
+ "thesaurus": [
+ "signs",
+ "signposts"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-directions-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-diploma": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-diploma-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-dice": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-diamonds": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-diamond": {
+ "thesaurus": [
+ "diamonds",
+ "gems",
+ "special",
+ "expensive",
+ "commodities",
+ "commodity",
+ "precious",
+ "valuable"
+ ],
+ "group": "item money",
+ "related": []
+ },
+ "icon-diagonal-arrow": {
+ "thesaurus": [
+ "arrows",
+ "grows",
+ "expands",
+ "bigger"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-diagonal-arrow-alt"
+ ]
+ },
+ "": {
+ "thesaurus": [
+ "arrows",
+ "grows",
+ "expands",
+ "bigger"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-diagonal-arrow"
+ ]
+ },
+ "icon-door-open": {
+ "thesaurus": [
+ "doors",
+ "entrances",
+ "exits",
+ "log out",
+ "logout",
+ "log in",
+ "login"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-download-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-download": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-drop": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-eco": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-economy": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-edit": {
+ "thesaurus": [
+ "pencils",
+ "pens",
+ "edits",
+ "writers",
+ "authors",
+ "writes"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-eject": {
+ "thesaurus": [
+ "ejects",
+ "up",
+ "top"
+ ],
+ "group": "action arrow box",
+ "related": []
+ },
+ "icon-employee": {
+ "thesaurus": [],
+ "group": "user special",
+ "related": [
+ "icon-user",
+ "icon-user-female",
+ "icon-umb-users",
+ "icon-user-glasses",
+ "icon-client",
+ "icon-employee",
+ "icon-piracy",
+ "icon-theif",
+ "icon-operator"
+ ]
+ },
+ "icon-energy-saving-bulb": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-enter": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-equalizer": {
+ "thesaurus": [
+ "equalizers",
+ "equaliser",
+ "equalisers",
+ "settings",
+ "options",
+ "configuration"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-escape": {
+ "thesaurus": [
+ "out",
+ "escapes",
+ "exits"
+ ],
+ "group": "action arrow circle",
+ "related": []
+ },
+ "icon-ethernet": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-euro-bag": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-exit-fullscreen": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-eye": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-facebook-like": {
+ "thesaurus": [
+ "thumbs up",
+ "likes",
+ "social media"
+ ],
+ "group": "item hand thumb",
+ "related": []
+ },
+ "icon-factory": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-font": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-folders": {
+ "thesaurus": [
+ "files",
+ "documents",
+ "storage",
+ "library",
+ "components"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-folder": {
+ "thesaurus": [
+ "folders",
+ "filing",
+ "documents",
+ "stroage"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-folder-outline": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-folder-open": {
+ "thesaurus": [
+ "filing",
+ "documents"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-flowerpot": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-flashlight": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-flash": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-flag": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-flag-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-firewire": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-firewall": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-fire": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-fingerprint": {
+ "thesaurus": [
+ "fingerprints",
+ "crimes",
+ "criminals",
+ "id",
+ "identification",
+ "biometrics"
+ ],
+ "group": "item security",
+ "related": []
+ },
+ "icon-filter": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-filter-arrows": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-files": {
+ "thesaurus": [
+ "storage",
+ "filing",
+ "filing cabinets",
+ "repository",
+ "repositories"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-file-cabinet": {
+ "thesaurus": [
+ "filing cabinets",
+ "offices",
+ "drawers",
+ "storage"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-female-symbol": {
+ "thesaurus": [
+ "woman",
+ "women",
+ "females",
+ "sexes",
+ "genders"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-footprints": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-hammer": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-hand-active-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-forking": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-hand-active": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-hand-pointer-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-hand-pointer": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-handprint": {
+ "thesaurus": [
+ "hands",
+ "personalisation",
+ "personalization",
+ "ids",
+ "profiles"
+ ],
+ "group": "item hand",
+ "related": []
+ },
+ "icon-handshake": {
+ "thesaurus": [
+ "meetings",
+ "handshakes",
+ "greetings",
+ "business"
+ ],
+ "group": "item hand",
+ "related": []
+ },
+ "icon-handtool": {
+ "thesaurus": [
+ "hands",
+ "grabs",
+ "cursor"
+ ],
+ "group": "item hand",
+ "related": []
+ },
+ "icon-hard-drive": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-help": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-graduate": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-gps": {
+ "thesaurus": [
+ "satellites",
+ "space",
+ "satnav",
+ "sat nav",
+ "satellite navigation",
+ "gps"
+ ],
+ "group": "item tech hardware",
+ "related": []
+ },
+ "icon-help-alt": {
+ "thesaurus": [
+ "questions",
+ "question marks",
+ "assistance"
+ ],
+ "group": "misc",
+ "related": []
+ },
+ "icon-height": {
+ "thesaurus": [
+ "heights",
+ "distances",
+ "spaces",
+ "spacing",
+ "vertical"
+ ],
+ "group": "action arrow box",
+ "related": []
+ },
+ "icon-globe": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-hearts": {
+ "thesaurus": [
+ "love",
+ "care",
+ "caring",
+ "health"
+ ],
+ "group": "shape",
+ "related": []
+ },
+ "icon-globe-inverted-europe-africa": {
+ "thesaurus": [
+ "planets",
+ "earth",
+ "world"
+ ],
+ "group": "item globe",
+ "related": []
+ },
+ "icon-headset": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-globe-inverted-asia": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-headphones": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-globe-inverted-america": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-hd": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-globe-europe---africa": {
+ "thesaurus": [
+ "planets",
+ "earth",
+ "world"
+ ],
+ "group": "item globe",
+ "related": []
+ },
+ "icon-hat": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-globe-asia": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-globe-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-hard-drive-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-glasses": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-gift": {
+ "thesaurus": [
+ "gifts",
+ "presents",
+ "christmas",
+ "birthdays",
+ "giving",
+ "rewards",
+ "surprises"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-handtool-alt": {
+ "thesaurus": [
+ "hands",
+ "grabs",
+ "cursor"
+ ],
+ "group": "item hand",
+ "related": []
+ },
+ "icon-geometry": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-game": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-fullscreen": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-fullscreen-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-frame": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-frame-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-camera-roll": {
+ "thesaurus": [
+ "films",
+ "cameras"
+ ],
+ "group": "item tech",
+ "related": []
+ },
+ "icon-bookmark": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bill": {
+ "thesaurus": [
+ "currency",
+ "money",
+ "notes",
+ "one",
+ "1",
+ "bills"
+ ],
+ "group": "item money note",
+ "related": []
+ },
+ "icon-baby-stroller": {
+ "thesaurus": [
+ "pram",
+ "pushchair"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-alarm-clock": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-adressbook": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-add": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-activity": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-untitled": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-camcorder": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-calendar": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-calendar-alt": {
+ "thesaurus": [
+ "dates",
+ "calendars",
+ "events"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-calculator": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bus": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-burn": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bulleted-list": {
+ "thesaurus": [
+ "bulletpoints",
+ "bullets",
+ "ul",
+ "lists"
+ ],
+ "group": "shape box layout",
+ "related": []
+ },
+ "icon-bug": {
+ "thesaurus": [
+ "ladybugs",
+ "lady bugs",
+ "ladybirds",
+ "lady birds",
+ "bugs",
+ "insects",
+ "minibeasts",
+ "wildlife",
+ "issues"
+ ],
+ "group": "item nature",
+ "related": []
+ },
+ "icon-brush": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-brush-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-brush-alt-2": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-browser-window": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-briefcase": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-brick": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-brackets": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-box": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-box-open": {
+ "thesaurus": [
+ "boxes",
+ "storage",
+ "dropbox",
+ "packages",
+ "parcels",
+ "packaging",
+ "opens"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-box-alt": {
+ "thesaurus": [
+ "filing",
+ "boxes",
+ "storage"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-books": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-billboard": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bills-dollar": {
+ "thesaurus": [
+ "money",
+ "us",
+ "usa",
+ "paper",
+ "cash"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-bills-euro": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bills-pound": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bills-yen": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bills": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-binarycode": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-binoculars": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bird": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-birthday-cake": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-blueprint": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-block": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bluetooth": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-boat-shipping": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bomb": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-book-alt-2": {
+ "thesaurus": [
+ "books",
+ "reading",
+ "documentation",
+ "library"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-bones": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-book-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-book": {
+ "thesaurus": [
+ "books",
+ "dictionary",
+ "dictionaries",
+ "thesaurus",
+ "thesauruses",
+ "library",
+ "authors",
+ "manuals"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-bill-yen": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-award": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bill-pound": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-autofill": {
+ "thesaurus": [
+ "edits",
+ "editing",
+ "editor",
+ "writes",
+ "writing",
+ "text boxes",
+ "textboxes",
+ "pencils",
+ "pens"
+ ],
+ "group": "action",
+ "related": []
+ },
+ "icon-bill-euro": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-auction-hammer": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bill-dollar": {
+ "thesaurus": [
+ "money",
+ "us",
+ "usa",
+ "paper",
+ "cash"
+ ],
+ "group": "",
+ "related": []
+ },
+ "icon-attachment": {
+ "thesaurus": [
+ "paperclips",
+ "clippy",
+ "attachments",
+ "stationery"
+ ],
+ "group": "item workplace",
+ "related": []
+ },
+ "icon-bell": {
+ "thesaurus": [
+ "bells",
+ "notifications",
+ "alerts"
+ ],
+ "group": "item",
+ "related": []
+ },
+ "icon-article": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bell-off": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-art-easel": {
+ "thesaurus": [
+ "artworks",
+ "painting",
+ "paints",
+ "artist",
+ "gallary"
+ ],
+ "group": "picture",
+ "related": []
+ },
+ "icon-beer-glass": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-arrow-up": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-battery-low": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-arrow-right": {
+ "thesaurus": [
+ "arrows",
+ "forwards"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-battery-full": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-arrow-left": {
+ "thesaurus": [
+ "arrows",
+ "back"
+ ],
+ "group": "action arrow",
+ "related": []
+ },
+ "icon-bars": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-arrow-down": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-barcode": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-arrivals": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-bar-chart": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-application-window": {
+ "thesaurus": [
+ "screen",
+ "window",
+ "sidebar"
+ ],
+ "group": "action window",
+ "related": [
+ "icon-application-window-alt",
+ "icon-application-error",
+ "icon-section"
+ ]
+ },
+ "icon-band-aid": {
+ "thesaurus": [
+ "bandaids",
+ "plasters",
+ "band aids",
+ "health",
+ "first aid",
+ "medical"
+ ],
+ "group": "item household",
+ "related": []
+ },
+ "icon-application-window-alt": {
+ "thesaurus": [
+ "screen",
+ "window"
+ ],
+ "group": "action window",
+ "related": [
+ "icon-application-window",
+ "icon-application-error",
+ "icon-section"
+ ]
+ },
+ "icon-ball": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-application-error": {
+ "thesaurus": [
+ "screen",
+ "window",
+ "404",
+ "500",
+ "page not found",
+ "server error",
+ "fault"
+ ],
+ "group": "action window",
+ "related": [
+ "icon-application-window-alt",
+ "icon-application",
+ "icon-section"
+ ]
+ },
+ "icon-badge-restricted": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-app": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-badge-remove": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-anchor": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-badge-count": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-badge-add": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-alert": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-backspace": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-alert-alt": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-addressbook": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-badge": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-chevron-down": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-chevron-up": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-folder-close": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-globe-europe-africa": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-map-location": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-panel-close": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-science": {
+ "thesaurus": [],
+ "group": "",
+ "related": []
+ },
+ "icon-section": {
+ "thesaurus": [
+ "screen",
+ "window",
+ "sidebar"
+ ],
+ "group": "action window",
+ "related": [
+ "icon-application-window-alt",
+ "icon-application-error",
+ "icon-application"
+ ]
+ },
+ "icon-traffic": {
+ "thesaurus": [
+ "arrows",
+ "left",
+ "right",
+ "bi-directional",
+ "two",
+ "2",
+ "swap",
+ "loop",
+ "reverse",
+ "navigation"
+ ],
+ "group": "action arrow",
+ "related": [
+ "icon-traffic-alt",
+ "icon-tab-key",
+ "icon-shuffle",
+ "icon-repeat",
+ "icon-repeat-one",
+ "icon-navigation-road"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json
index af16267d46..3a51ab3741 100644
--- a/src/Umbraco.Web.UI.Client/package-lock.json
+++ b/src/Umbraco.Web.UI.Client/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@umbraco-cms/backoffice",
- "version": "14.0.0-rc1",
+ "version": "14.0.0-rc2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@umbraco-cms/backoffice",
- "version": "14.0.0-rc1",
+ "version": "14.0.0-rc2",
"license": "MIT",
"dependencies": {
"@types/diff": "^5.0.9",
diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json
index a8d5468163..73eef9f83d 100644
--- a/src/Umbraco.Web.UI.Client/package.json
+++ b/src/Umbraco.Web.UI.Client/package.json
@@ -1,7 +1,7 @@
{
"name": "@umbraco-cms/backoffice",
"license": "MIT",
- "version": "14.0.0-rc1",
+ "version": "14.0.0-rc2",
"type": "module",
"exports": {
".": null,
diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-error.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-error.element.ts
index a071967bc6..92027afa18 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/app/app-error.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-error.element.ts
@@ -1,19 +1,28 @@
import { css, html, nothing, customElement, property } from '@umbraco-cms/backoffice/external/lit';
import type { ProblemDetails } from '@umbraco-cms/backoffice/external/backend-api';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
+import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
/**
* A full page error element that can be used either solo or for instance as the error 500 page and BootFailed
*/
@customElement('umb-app-error')
export class UmbAppErrorElement extends UmbLitElement {
+ /**
+ * The headline to display
+ *
+ * @attr
+ */
+ @property()
+ errorHeadline?: string | null;
+
/**
* The error message to display
*
* @attr
*/
@property()
- errorMessage?: string;
+ errorMessage?: string | null;
/**
* The error to display
@@ -23,31 +32,128 @@ export class UmbAppErrorElement extends UmbLitElement {
@property()
error?: unknown;
- private renderProblemDetails = (problemDetails: ProblemDetails) => html`
-
${problemDetails.title}
+ constructor() {
+ super();
+
+ this.#generateErrorFromSearchParams();
+ }
+
+ /**
+ * Generates an error from the search params before the properties are set
+ */
+ #generateErrorFromSearchParams() {
+ const searchParams = new URLSearchParams(window.location.search);
+
+ const flow = searchParams.get('flow');
+
+ if (flow === 'external-login-callback') {
+ this.errorHeadline = this.localize.term('errors_externalLoginError');
+ console.log('External login error', searchParams.get('error'));
+
+ const status = searchParams.get('status');
+
+ // "Status" is controlled by Umbraco and is a string
+ if (status) {
+ switch (status) {
+ case 'unauthorized':
+ this.errorMessage = this.localize.term('errors_unauthorized');
+ break;
+ case 'user-not-found':
+ this.errorMessage = this.localize.term('errors_userNotFound');
+ break;
+ case 'external-info-not-found':
+ this.errorMessage = this.localize.term('errors_externalInfoNotFound');
+ break;
+ case 'failed':
+ this.errorMessage = this.localize.term('errors_externalLoginFailed');
+ break;
+ default:
+ this.errorMessage = this.localize.term('errors_defaultError');
+ break;
+ }
+ }
+ return;
+ }
+
+ if (flow === 'external-login') {
+ /**
+ * "Error" is controlled by OpenID and is a string
+ * @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1
+ */
+ const error = searchParams.get('error');
+
+ this.errorHeadline = this.localize.term('errors_externalLoginError');
+
+ switch (error) {
+ case 'access_denied':
+ this.errorMessage = this.localize.term('openidErrors_accessDenied');
+ break;
+ case 'invalid_request':
+ this.errorMessage = this.localize.term('openidErrors_invalidRequest');
+ break;
+ case 'invalid_client':
+ this.errorMessage = this.localize.term('openidErrors_invalidClient');
+ break;
+ case 'invalid_grant':
+ this.errorMessage = this.localize.term('openidErrors_invalidGrant');
+ break;
+ case 'unauthorized_client':
+ this.errorMessage = this.localize.term('openidErrors_unauthorizedClient');
+ break;
+ case 'unsupported_grant_type':
+ this.errorMessage = this.localize.term('openidErrors_unsupportedGrantType');
+ break;
+ case 'invalid_scope':
+ this.errorMessage = this.localize.term('openidErrors_invalidScope');
+ break;
+ case 'server_error':
+ this.errorMessage = this.localize.term('openidErrors_serverError');
+ break;
+ case 'temporarily_unavailable':
+ this.errorMessage = this.localize.term('openidErrors_temporarilyUnavailable');
+ break;
+ default:
+ this.errorMessage = this.localize.term('errors_defaultError');
+ break;
+ }
+
+ // Set the error object with the original error parameters from the search params
+ let detail = searchParams.get('error_description');
+ const errorUri = searchParams.get('error_uri');
+ if (errorUri) {
+ detail = `${detail} (${errorUri})`;
+ }
+ this.error = { title: `External error code: ${error}`, detail };
+
+ return;
+ }
+ }
+
+ #renderProblemDetails = (problemDetails: ProblemDetails) => html`
+ ${problemDetails.title}
${problemDetails.detail}
${problemDetails.stack}
`;
- private renderErrorObj = (error: Error) => html`
- ${error.name}
+ #renderErrorObj = (error: Error) => html`
+ ${error.name}
${error.message}
${error.stack}
`;
- private isProblemDetails(error: unknown): error is ProblemDetails {
+ #isProblemDetails(error: unknown): error is ProblemDetails {
return typeof error === 'object' && error !== null && 'detail' in error && 'title' in error;
}
- private isError(error: unknown): error is Error {
+ #isError(error: unknown): error is Error {
return typeof error === 'object' && error !== null && error instanceof Error;
}
- private renderError(error: unknown) {
- if (this.isProblemDetails(error)) {
- return this.renderProblemDetails(error);
- } else if (this.isError(error)) {
- return this.renderErrorObj(error);
+ #renderError(error: unknown) {
+ if (this.#isProblemDetails(error)) {
+ return this.#renderProblemDetails(error);
+ } else if (this.#isError(error)) {
+ return this.#renderErrorObj(error);
}
return nothing;
@@ -56,73 +162,93 @@ export class UmbAppErrorElement extends UmbLitElement {
render = () => html`
-
-

+
+
-
-
- Something went wrong
- ${this.errorMessage}
+
+
+ (location.href = '')}>
+
+ ${this.errorHeadline
+ ? this.errorHeadline
+ : html` An unknown failure has occured `}
+
+ ${this.errorMessage}
${this.error
? html`
- Details
- ${this.renderError(this.error)}
+ Details
+ ${this.#renderError(this.error)}
- `
+ `
: nothing}
`;
- static styles = css`
- #background {
- position: fixed;
- overflow: hidden;
- background-position: 50%;
- background-repeat: no-repeat;
- background-size: cover;
- background-image: url('/umbraco/backoffice/assets/umbraco_background.jpg');
- width: 100vw;
- height: 100vh;
- }
+ static styles = [
+ UmbTextStyles,
+ css`
+ #background {
+ position: fixed;
+ overflow: hidden;
+ background-position: 50%;
+ background-repeat: no-repeat;
+ background-size: cover;
+ background-image: url('/umbraco/backoffice/assets/installer-illustration.svg');
+ width: 100vw;
+ height: 100vh;
+ }
- #logo {
- position: fixed;
- top: var(--uui-size-space-5);
- left: var(--uui-size-space-5);
- height: 30px;
- }
+ #logo {
+ position: fixed;
+ top: var(--uui-size-space-5);
+ left: var(--uui-size-space-5);
+ height: 30px;
+ }
- #logo img {
- height: 100%;
- }
+ #logo img {
+ height: 100%;
+ }
- #container {
- position: relative;
- display: flex;
- align-items: center;
- justify-content: center;
- width: 100vw;
- height: 100vh;
- }
+ #container {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100vw;
+ height: 100vh;
+ }
- #box {
- width: 50vw;
- padding: var(--uui-size-space-6) var(--uui-size-space-5) var(--uui-size-space-5) var(--uui-size-space-5);
- }
+ #box {
+ width: 400px;
+ max-width: 80vw;
+ }
- details {
- padding: var(--uui-size-space-2) var(--uui-size-space-3);
- background: var(--uui-color-surface-alt);
- }
+ #message {
+ margin-bottom: var(--uui-size-space-3);
+ }
- pre {
- width: 100%;
- overflow: auto;
- }
- `;
+ details {
+ padding: var(--uui-size-space-2) var(--uui-size-space-3);
+ background: var(--uui-color-surface-alt);
+ }
+
+ details summary {
+ cursor: pointer;
+ }
+
+ pre {
+ width: 100%;
+ overflow: auto;
+ }
+ `,
+ ];
}
export default UmbAppErrorElement;
diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts
index 3991d8ad3e..475daede32 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts
@@ -7,7 +7,6 @@ import type { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';
import { UmbAuthContext } from '@umbraco-cms/backoffice/auth';
import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit';
import { UUIIconRegistryEssential } from '@umbraco-cms/backoffice/external/uui';
-import { UmbIconRegistry } from '@umbraco-cms/backoffice/icon';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import type { Guard, UmbRoute } from '@umbraco-cms/backoffice/router';
import { pathWithoutBasePath } from '@umbraco-cms/backoffice/router';
@@ -50,6 +49,10 @@ export class UmbAppElement extends UmbLitElement {
bypassAuth = false;
private _routes: UmbRoute[] = [
+ {
+ path: 'error',
+ component: () => import('./app-error.element.js'),
+ },
{
path: 'install',
component: () => import('../installer/installer.element.js'),
@@ -85,7 +88,6 @@ export class UmbAppElement extends UmbLitElement {
new UmbBundleExtensionInitializer(this, umbExtensionsRegistry);
new UmbAppEntryPointExtensionInitializer(this, umbExtensionsRegistry);
- new UmbIconRegistry().attach(this);
new UUIIconRegistryEssential().attach(this);
new UmbContextDebugController(this);
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index 2bf0c934e5..79b526fe29 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -10,33 +10,31 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import './components/index.js';
-// TODO: temp solution to load core packages
const CORE_PACKAGES = [
- import('../../packages/audit-log/umbraco-package.js'),
- import('../../packages/block/umbraco-package.js'),
- import('../../packages/data-type/umbraco-package.js'),
- import('../../packages/dictionary/umbraco-package.js'),
+ import('../../packages/umbraco-news/umbraco-package.js'),
import('../../packages/documents/umbraco-package.js'),
- import('../../packages/dynamic-root/umbraco-package.js'),
- import('../../packages/health-check/umbraco-package.js'),
- import('../../packages/language/umbraco-package.js'),
- import('../../packages/log-viewer/umbraco-package.js'),
- import('../../packages/markdown-editor/umbraco-package.js'),
+ import('../../packages/data-type/umbraco-package.js'),
import('../../packages/media/umbraco-package.js'),
import('../../packages/members/umbraco-package.js'),
- import('../../packages/models-builder/umbraco-package.js'),
- //import('../../packages/object-type/umbraco-package.js'),// This had nothing to register.
- import('../../packages/packages/umbraco-package.js'),
- import('../../packages/relations/umbraco-package.js'),
import('../../packages/search/umbraco-package.js'),
import('../../packages/settings/umbraco-package.js'),
+ import('../../packages/language/umbraco-package.js'),
import('../../packages/static-file/umbraco-package.js'),
+ import('../../packages/dynamic-root/umbraco-package.js'),
+ import('../../packages/block/umbraco-package.js'),
import('../../packages/tags/umbraco-package.js'),
- import('../../packages/templating/umbraco-package.js'),
import('../../packages/tiny-mce/umbraco-package.js'),
- import('../../packages/umbraco-news/umbraco-package.js'),
+ import('../../packages/markdown-editor/umbraco-package.js'),
+ import('../../packages/templating/umbraco-package.js'),
+ import('../../packages/dictionary/umbraco-package.js'),
import('../../packages/user/umbraco-package.js'),
+ import('../../packages/health-check/umbraco-package.js'),
+ import('../../packages/audit-log/umbraco-package.js'),
import('../../packages/webhook/umbraco-package.js'),
+ import('../../packages/relations/umbraco-package.js'),
+ import('../../packages/models-builder/umbraco-package.js'),
+ import('../../packages/log-viewer/umbraco-package.js'),
+ import('../../packages/packages/umbraco-package.js'),
];
@customElement('umb-backoffice')
@@ -55,13 +53,13 @@ export class UmbBackofficeElement extends UmbLitElement {
new UmbBackofficeEntryPointExtensionInitializer(this, umbExtensionsRegistry);
new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry);
- new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerPrivateExtensions();
-
// So far local packages are this simple to registerer, so no need for a manager to do that:
CORE_PACKAGES.forEach(async (packageImport) => {
const packageModule = await packageImport;
umbExtensionsRegistry.registerMany(packageModule.extensions);
});
+
+ new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerPrivateExtensions();
}
render() {
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-sections.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-sections.element.ts
index 5dd782a1a0..2fa50ce543 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-sections.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-sections.element.ts
@@ -81,7 +81,7 @@ export class UmbBackofficeHeaderSectionsElement extends UmbLitElement {
#tabs {
height: 60px;
flex-basis: 100%;
- font-size: 16px;
+ font-size: 16px; /* specific for the header */
--uui-tab-text: var(--uui-color-header-contrast);
--uui-tab-text-hover: var(--uui-color-header-contrast-emphasis);
--uui-tab-text-active: var(--uui-color-header-contrast-emphasis);
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts
index a04f0fad35..0eddd8fbc8 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts
@@ -1,6 +1,6 @@
import type { UmbBackofficeContext } from '../backoffice.context.js';
import { UMB_BACKOFFICE_CONTEXT } from '../backoffice.context.js';
-import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit';
+import { css, html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit';
import { UmbSectionContext, UMB_SECTION_CONTEXT } from '@umbraco-cms/backoffice/section';
import type { UmbRoute, UmbRouterSlotChangeEvent } from '@umbraco-cms/backoffice/router';
import type { ManifestSection, UmbSectionElement } from '@umbraco-cms/backoffice/extension-registry';
@@ -99,17 +99,18 @@ export class UmbBackofficeMainElement extends UmbLitElement {
render() {
return this._routes.length > 0
? html``
- : '';
+ : nothing;
}
static styles = [
css`
:host {
- background-color: var(--uui-color-background);
display: block;
+ background-color: var(--uui-color-background);
+ width: 100%;
height: calc(
100% - 60px
- ); // 60 => top header height, TODO: Make sure this comes from somewhere so it is maintainable and eventually responsive.
+ ); /* 60 => top header height, TODO: Make sure this comes from somewhere so it is maintainable and eventually responsive. */
}
`,
];
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts
index 15ae7c0767..f72683150c 100644
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts
@@ -690,6 +690,8 @@ export default {
errorRegExpWithoutTab: '%0% er ikke i et korrekt format',
},
errors: {
+ defaultError: 'Der er sket en ukendt fejl',
+ concurrencyError: 'Optimistisk samtidighedsfejl, objektet er blevet ændret',
receivedErrorFromServer: 'Der skete en fejl på severen',
dissallowedMediaType: 'Denne filttype er blevet deaktiveret af administratoren',
codemirroriewarning:
@@ -707,8 +709,22 @@ export default {
tableColMergeLeft: 'Du skal stå til venstre for de 2 celler du ønsker at samle!',
tableSplitNotSplittable: 'Du kan ikke opdele en celle, som ikke allerede er delt.',
propertyHasErrors: 'Denne egenskab er ugyldig',
- defaultError: 'An unknown failure has occurred',
- concurrencyError: 'Optimistic concurrency failure, object has been modified',
+ externalLoginError: 'Der opstod en fejl under login med eksternt login',
+ unauthorized: 'Du har ikke tilladelse til at udføre denne handling',
+ userNotFound: 'Den angivne bruger blev ikke fundet i databasen',
+ externalInfoNotFound: 'Serveren kunne ikke kommunikere med den eksterne loginudbyder',
+ externalLoginFailed: 'Serveren mislykkedes i at logge ind med den eksterne loginudbyder',
+ },
+ openidErrors: {
+ accessDenied: 'Access denied',
+ invalidRequest: 'Ugyldig forespørgsel',
+ invalidClient: 'Ugyldig klient',
+ invalidGrant: 'Ugyldig tildeling',
+ unauthorizedClient: 'Uautoriseret klient',
+ unsupportedGrantType: 'Ikke understøttet tildelingstype',
+ invalidScope: 'Ugyldigt område',
+ serverError: 'Serverfejl',
+ temporarilyUnavailable: 'Servicen er midlertidigt utilgængelig',
},
general: {
options: 'Valgmuligheder',
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts
index ebfa4a1fae..8f1bfe7b9a 100644
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts
@@ -714,6 +714,22 @@ export default {
tableColMergeLeft: 'Please place cursor at the left of the two cells you wish to merge',
tableSplitNotSplittable: "You cannot split a cell that hasn't been merged.",
propertyHasErrors: 'This property is invalid',
+ externalLoginError: 'External login',
+ unauthorized: 'You were not authorized before performing this action',
+ userNotFound: 'The local user was not found in the database',
+ externalInfoNotFound: 'The server did not succeed in communicating with the external login provider',
+ externalLoginFailed: 'The server failed to authorize you against the external login provider',
+ },
+ openidErrors: {
+ accessDenied: 'Access denied',
+ invalidRequest: 'Invalid request',
+ invalidClient: 'Invalid client',
+ invalidGrant: 'Invalid grant',
+ unauthorizedClient: 'Unauthorized client',
+ unsupportedGrantType: 'Unsupported grant type',
+ invalidScope: 'Invalid scope',
+ serverError: 'Server error',
+ temporarilyUnavailable: 'The service is temporarily unavailable',
},
general: {
options: 'Options',
diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts
index 20da4fec15..4806994c0d 100644
--- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts
+++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts
@@ -3,151 +3,164 @@ const { rest } = window.MockServiceWorker;
import type { PackageManifestResponse } from '../../packages/packages/types.js';
import { umbracoPath } from '@umbraco-cms/backoffice/utils';
+const privateManifests: PackageManifestResponse = [
+ {
+ name: 'My Package Name',
+ version: '1.0.0',
+ extensions: [
+ {
+ type: 'bundle',
+ alias: 'My.Package.Bundle',
+ name: 'My Package Bundle',
+ js: '/App_Plugins/custom-bundle-package/index.js',
+ },
+ ],
+ },
+ {
+ name: 'Named Package',
+ version: '1.0.0',
+ extensions: [
+ {
+ type: 'section',
+ alias: 'My.Section.Custom',
+ name: 'Custom Section',
+ js: '/App_Plugins/section.js',
+ elementName: 'my-section-custom',
+ weight: 1,
+ meta: {
+ label: 'Custom',
+ pathname: 'my-custom',
+ },
+ },
+ {
+ type: 'propertyEditorUi',
+ alias: 'My.PropertyEditorUI.Custom',
+ name: 'My Custom Property Editor UI',
+ js: '/App_Plugins/property-editor.js',
+ elementName: 'my-property-editor-ui-custom',
+ meta: {
+ label: 'My Custom Property',
+ icon: 'document',
+ group: 'Common',
+ propertyEditorSchema: 'Umbraco.TextBox',
+ },
+ },
+ ],
+ },
+ {
+ name: 'Package with an entry point',
+ extensions: [
+ {
+ type: 'backofficeEntryPoint',
+ name: 'My Custom Entry Point',
+ alias: 'My.Entrypoint.Custom',
+ js: '/App_Plugins/custom-entrypoint.js',
+ },
+ ],
+ },
+ {
+ name: 'My MFA Package',
+ extensions: [
+ {
+ type: 'mfaLoginProvider',
+ alias: 'My.MfaLoginProvider.Custom.Google',
+ name: 'My Custom Google MFA Provider',
+ forProviderName: 'Google Authenticator',
+ },
+ {
+ type: 'mfaLoginProvider',
+ alias: 'My.MfaLoginProvider.Custom.SMS',
+ name: 'My Custom SMS MFA Provider',
+ forProviderName: 'sms',
+ meta: {
+ label: 'Setup SMS Verification',
+ },
+ },
+ ],
+ },
+ {
+ name: 'Package with a view',
+ extensions: [
+ {
+ type: 'packageView',
+ alias: 'My.PackageView.Custom',
+ name: 'My Custom Package View',
+ js: '/App_Plugins/package-view.js',
+ meta: {
+ packageName: 'Package with a view',
+ },
+ },
+ ],
+ },
+ {
+ name: 'My MFA Package',
+ extensions: [
+ {
+ type: 'mfaLoginProvider',
+ alias: 'My.MfaLoginProvider.Custom',
+ name: 'My Custom MFA Provider',
+ forProviderName: 'sms',
+ meta: {
+ label: 'Setup SMS Verification',
+ },
+ },
+ ],
+ },
+];
+
+const publicManifests: PackageManifestResponse = [
+ {
+ name: 'My Auth Package',
+ extensions: [
+ {
+ type: 'authProvider',
+ alias: 'My.AuthProvider.Google',
+ name: 'My Custom Auth Provider',
+ forProviderName: 'Umbraco.Google',
+ meta: {
+ label: 'Google',
+ defaultView: {
+ icon: 'icon-google',
+ },
+ linking: {
+ allowManualLinking: true,
+ },
+ },
+ },
+ {
+ type: 'authProvider',
+ alias: 'My.AuthProvider.Github',
+ name: 'My Github Auth Provider',
+ forProviderName: 'Umbraco.Github',
+ meta: {
+ label: 'GitHub',
+ defaultView: {
+ look: 'primary',
+ icon: 'icon-github',
+ color: 'success',
+ },
+ linking: {
+ allowManualLinking: true,
+ },
+ },
+ },
+ ],
+ },
+];
+
export const manifestDevelopmentHandlers = [
rest.get(umbracoPath('/manifest/manifest/private'), (_req, res, ctx) => {
return res(
// Respond with a 200 status code
ctx.status(200),
- ctx.json([
- {
- name: 'My Package Name',
- version: '1.0.0',
- extensions: [
- {
- type: 'bundle',
- alias: 'My.Package.Bundle',
- name: 'My Package Bundle',
- js: '/App_Plugins/custom-bundle-package/index.js',
- },
- ],
- },
- {
- name: 'Named Package',
- version: '1.0.0',
- extensions: [
- {
- type: 'section',
- alias: 'My.Section.Custom',
- name: 'Custom Section',
- js: '/App_Plugins/section.js',
- elementName: 'my-section-custom',
- weight: 1,
- meta: {
- label: 'Custom',
- pathname: 'my-custom',
- },
- },
- {
- type: 'propertyEditorUi',
- alias: 'My.PropertyEditorUI.Custom',
- name: 'My Custom Property Editor UI',
- js: '/App_Plugins/property-editor.js',
- elementName: 'my-property-editor-ui-custom',
- meta: {
- label: 'My Custom Property',
- icon: 'document',
- group: 'Common',
- propertyEditorSchema: 'Umbraco.TextBox',
- },
- },
- ],
- },
- {
- name: 'Package with an entry point',
- extensions: [
- {
- type: 'backofficeEntryPoint',
- name: 'My Custom Entry Point',
- alias: 'My.Entrypoint.Custom',
- js: '/App_Plugins/custom-entrypoint.js',
- },
- ],
- },
- {
- name: 'My MFA Package',
- extensions: [
- {
- type: 'mfaLoginProvider',
- alias: 'My.MfaLoginProvider.Custom.Google',
- name: 'My Custom Google MFA Provider',
- forProviderName: 'Google Authenticator',
- },
- {
- type: 'mfaLoginProvider',
- alias: 'My.MfaLoginProvider.Custom.SMS',
- name: 'My Custom SMS MFA Provider',
- forProviderName: 'sms',
- meta: {
- label: 'Setup SMS Verification',
- },
- },
- ],
- },
- {
- name: 'Package with a view',
- extensions: [
- {
- type: 'packageView',
- alias: 'My.PackageView.Custom',
- name: 'My Custom Package View',
- js: '/App_Plugins/package-view.js',
- meta: {
- packageName: 'Package with a view',
- },
- },
- ],
- },
- {
- name: 'My MFA Package',
- extensions: [
- {
- type: 'mfaLoginProvider',
- alias: 'My.MfaLoginProvider.Custom',
- name: 'My Custom MFA Provider',
- forProviderName: 'sms',
- meta: {
- label: 'Setup SMS Verification',
- },
- },
- ],
- },
- ]),
+ ctx.json(privateManifests),
);
}),
rest.get(umbracoPath('/manifest/manifest/public'), (_req, res, ctx) => {
- return res(
- ctx.status(200),
- ctx.json([
- {
- name: 'My Auth Package',
- extensions: [
- {
- type: 'authProvider',
- alias: 'My.AuthProvider.Google',
- name: 'My Custom Auth Provider',
- forProviderName: 'Umbraco.Google',
- meta: {
- label: 'Sign in with Google',
- },
- },
- {
- type: 'authProvider',
- alias: 'My.AuthProvider.Github',
- name: 'My Github Auth Provider',
- forProviderName: 'Umbraco.Github',
- meta: {
- label: 'GitHub',
- defaultView: {
- look: 'primary',
- icon: 'icon-github',
- color: 'success',
- },
- },
- },
- ],
- },
- ]),
- );
+ return res(ctx.status(200), ctx.json(publicManifests));
+ }),
+ rest.get(umbracoPath('/manifest/manifest'), (_req, res, ctx) => {
+ return res(ctx.status(200), ctx.json([...privateManifests, ...publicManifests]));
}),
];
@@ -158,4 +171,7 @@ export const manifestEmptyHandlers = [
rest.get(umbracoPath('/manifest/manifest/public'), (_req, res, ctx) => {
return res(ctx.status(200), ctx.json([]));
}),
+ rest.get(umbracoPath('/manifest/manifest'), (_req, res, ctx) => {
+ return res(ctx.status(200), ctx.json([]));
+ }),
];
diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts
index 248e9e92a8..9454d23c56 100644
--- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts
+++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts
@@ -1,6 +1,7 @@
const { rest } = window.MockServiceWorker;
import { umbUserMockDb } from '../../data/user/user.db.js';
import { UMB_SLUG } from './slug.js';
+import type { LinkedLoginsRequestModel } from '@umbraco-cms/backoffice/external/backend-api';
import { umbracoPath } from '@umbraco-cms/backoffice/utils';
export const handlers = [
@@ -8,6 +9,19 @@ export const handlers = [
const loggedInUser = umbUserMockDb.getCurrentUser();
return res(ctx.status(200), ctx.json(loggedInUser));
}),
+ rest.get(umbracoPath(`${UMB_SLUG}/current/logins`), (_req, res, ctx) => {
+ return res(
+ ctx.status(200),
+ ctx.json({
+ linkedLogins: [
+ {
+ providerKey: 'google',
+ providerName: 'Umbraco.Google',
+ },
+ ],
+ }),
+ );
+ }),
rest.get(umbracoPath(`${UMB_SLUG}/current/2fa`), (_req, res, ctx) => {
const mfaLoginProviders = umbUserMockDb.getMfaLoginProviders();
return res(ctx.status(200), ctx.json(mfaLoginProviders));
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts
index f4e8f8679a..a09e8f9bf0 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts
@@ -92,7 +92,10 @@ export class UmbExtensionSlotElement extends UmbLitElement {
public defaultElement?: string;
@property()
- public renderMethod?: (extension: UmbExtensionElementInitializer) => TemplateResult | HTMLElement | null | undefined;
+ public renderMethod?: (
+ extension: UmbExtensionElementInitializer,
+ index: number,
+ ) => TemplateResult | HTMLElement | null | undefined;
connectedCallback(): void {
super.connectedCallback();
@@ -130,7 +133,7 @@ export class UmbExtensionSlotElement extends UmbLitElement {
? repeat(
this._permitted,
(ext) => ext.alias,
- (ext) => (this.renderMethod ? this.renderMethod(ext) : ext.component),
+ (ext, i) => (this.renderMethod ? this.renderMethod(ext, i) : ext.component),
)
: html``;
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts
index 4a3ef2eccb..e056b60241 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts
@@ -139,6 +139,7 @@ export class UmbExtensionWithApiSlotElement extends UmbLitElement {
@property()
public renderMethod?: (
extension: UmbExtensionElementAndApiInitializer,
+ index: number,
) => TemplateResult | HTMLElement | null | undefined;
connectedCallback(): void {
@@ -181,7 +182,7 @@ export class UmbExtensionWithApiSlotElement extends UmbLitElement {
? repeat(
this._permitted,
(ext) => ext.alias,
- (ext) => (this.renderMethod ? this.renderMethod(ext) : ext.component),
+ (ext, i) => (this.renderMethod ? this.renderMethod(ext, i) : ext.component),
)
: html``;
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts
index 8d0dea332e..c3afe98927 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts
@@ -246,7 +246,7 @@ export class UmbContentTypeContainerStructureHelper {
+ if (container.name === '') {
+ const newName = 'Unnamed';
+ this.updateContainer(null, container.id, {
+ name: this.makeContainerNameUniqueForOwnerContentType(container.id, newName, type, parentId) ?? newName,
+ });
+ }
+ });
+ }
+
async createContainer(
contentTypeUnique: string | null,
parentId: string | null = null,
@@ -295,9 +311,11 @@ export class UmbContentTypeStructureManager<
sortOrder: sortOrder ?? 0,
};
- const containers = [
- ...(this.#contentTypes.getValue().find((x) => x.unique === contentTypeUnique)?.containers ?? []),
- ];
+ // Ensure
+ this.ensureContainerNames(contentTypeUnique, type, parentId);
+
+ const contentTypes = this.#contentTypes.getValue();
+ const containers = [...(contentTypes.find((x) => x.unique === contentTypeUnique)?.containers ?? [])];
containers.push(container);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -308,7 +326,7 @@ export class UmbContentTypeStructureManager<
return container;
}
- async insertContainer(contentTypeUnique: string | null, container: UmbPropertyTypeContainerModel) {
+ /*async insertContainer(contentTypeUnique: string | null, container: UmbPropertyTypeContainerModel) {
await this.#init;
contentTypeUnique = contentTypeUnique ?? this.#ownerContentTypeUnique!;
@@ -330,24 +348,34 @@ export class UmbContentTypeStructureManager<
// @ts-ignore
// TODO: fix TS partial complaint
this.#contentTypes.updateOne(contentTypeUnique, { containers });
- }
+ }*/
+ makeEmptyContainerName(
+ containerId: string,
+ containerType: UmbPropertyContainerTypes,
+ parentId: string | null = null,
+ ) {
+ return (
+ this.makeContainerNameUniqueForOwnerContentType(containerId, 'Unnamed', containerType, parentId) ?? 'Unnamed'
+ );
+ }
makeContainerNameUniqueForOwnerContentType(
+ containerId: string,
newName: string,
- containerType: UmbPropertyContainerTypes = 'Tab',
+ containerType: UmbPropertyContainerTypes,
parentId: string | null = null,
) {
const ownerRootContainers = this.getOwnerContainers(containerType, parentId); //getRootContainers() can't differentiates between compositions and locals
+ if (!ownerRootContainers) {
+ return null;
+ }
let changedName = newName;
- if (ownerRootContainers) {
- while (ownerRootContainers.find((tab) => tab.name === changedName && tab.id !== parentId)) {
- changedName = incrementString(changedName);
- }
-
- return changedName === newName ? null : changedName;
+ while (ownerRootContainers.find((con) => con.name === changedName && con.id !== containerId)) {
+ changedName = incrementString(changedName);
}
- return null;
+
+ return changedName === newName ? null : changedName;
}
async updateContainer(
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/types.ts
index 76eeb7a5c7..4d513c7b4d 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/types.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/types.ts
@@ -6,7 +6,7 @@ export type UmbPropertyContainerTypes = 'Group' | 'Tab';
export interface UmbPropertyTypeContainerModel {
id: string;
parent: { id: string } | null; // TODO: change to unique
- name: string | null;
+ name: string;
type: UmbPropertyContainerTypes;
sortOrder: number;
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts
index fcd24ef4f9..540d32257f 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts
@@ -1,6 +1,6 @@
import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui';
-import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
-import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit';
+import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element';
+import { css, html, customElement, property, state, nothing } from '@umbraco-cms/backoffice/external/lit';
import type {
UmbContentTypeContainerStructureHelper,
UmbContentTypeModel,
@@ -92,11 +92,24 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement {
let newName = (e.target as HTMLInputElement).value;
const changedName = this.groupStructureHelper
.getStructureManager()!
- .makeContainerNameUniqueForOwnerContentType(newName, 'Group', this._group.parent?.id ?? null);
+ .makeContainerNameUniqueForOwnerContentType(this._group.id, newName, 'Group', this._group.parent?.id ?? null);
if (changedName) {
newName = changedName;
}
this._singleValueUpdate('name', newName);
+ (e.target as HTMLInputElement).value = newName;
+ }
+
+ #blurGroup(e: InputEvent) {
+ if (!this.groupStructureHelper || !this._group) return;
+ const newName = (e.target as HTMLInputElement).value;
+ if (newName === '') {
+ const changedName = this.groupStructureHelper
+ .getStructureManager()!
+ .makeEmptyContainerName(this._group.id, 'Group', this._group.parent?.id ?? null);
+ this._singleValueUpdate('name', changedName);
+ (e.target as HTMLInputElement).value = changedName;
+ }
}
render() {
@@ -118,9 +131,11 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement {
+ @change=${this.#renameGroup}
+ @blur=${this.#blurGroup}
+ ${this._group!.name === '' ? umbFocus() : nothing}>
${this.sortModeActive
? html`
{
- this._groups = groups;
- this.#sorter.setModel(this._groups);
- });
- this.observe(this.#groupStructureHelper.hasProperties, (hasProperties) => {
- this._hasProperties = hasProperties;
- this.requestUpdate('_hasProperties');
- });
+ this.observe(
+ this.#groupStructureHelper.mergedContainers,
+ (groups) => {
+ this._groups = groups;
+ this.#sorter.setModel(this._groups);
+ },
+ null,
+ );
+ this.observe(
+ this.#groupStructureHelper.hasProperties,
+ (hasProperties) => {
+ this._hasProperties = hasProperties;
+ this.requestUpdate('_hasProperties');
+ },
+ null,
+ );
}
#onAddGroup = () => {
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts
index 02fe49daab..0431c3e3c3 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts
@@ -292,9 +292,9 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements
let newName = (event.target as HTMLInputElement).value;
const changedName = this.#workspaceContext?.structure.makeContainerNameUniqueForOwnerContentType(
+ tab.id,
newName,
'Tab',
- tab.id,
);
// Check if it collides with another tab name of this same content-type, if so adjust name:
@@ -309,7 +309,19 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements
});
}
- async #tabNameBlur() {
+ async #tabNameBlur(event: FocusEvent, tab: UmbPropertyTypeContainerModel) {
+ if (!this._activeTabId) return;
+ const newName = (event.target as HTMLInputElement | undefined)?.value;
+ if (newName === '') {
+ const changedName = this.#workspaceContext!.structure.makeEmptyContainerName(this._activeTabId, 'Tab');
+
+ (event.target as HTMLInputElement).value = changedName;
+
+ this.#tabsStructureHelper.partialUpdateContainer(tab.id!, {
+ name: changedName,
+ });
+ }
+
this._activeTabId = undefined;
}
@@ -476,7 +488,7 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements
auto-width
@change=${(e: InputEvent) => this.#tabNameChanged(e, tab)}
@input=${(e: InputEvent) => this.#tabNameChanged(e, tab)}
- @blur=${() => this.#tabNameBlur()}>
+ @blur=${(e: FocusEvent) => this.#tabNameBlur(e, tab)}>
${this.renderDeleteFor(tab)}
`;
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/default/entity-action.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/default/entity-action.element.ts
index de1f6cab4e..a778685a5f 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/default/entity-action.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/default/entity-action.element.ts
@@ -1,4 +1,5 @@
import type { UmbEntityAction } from '../entity-action.interface.js';
+import type { UmbEntityActionElement } from '../entity-action-element.interface.js';
import { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event';
import { html, nothing, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit';
import type { UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui';
@@ -6,10 +7,13 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import type { ManifestEntityAction, MetaEntityActionDefaultKind } from '@umbraco-cms/backoffice/extension-registry';
@customElement('umb-entity-action')
-export class UmbEntityActionElement<
- MetaType extends MetaEntityActionDefaultKind = MetaEntityActionDefaultKind,
- ApiType extends UmbEntityAction = UmbEntityAction,
-> extends UmbLitElement {
+export class UmbEntityActionDefaultElement<
+ MetaType extends MetaEntityActionDefaultKind = MetaEntityActionDefaultKind,
+ ApiType extends UmbEntityAction = UmbEntityAction,
+ >
+ extends UmbLitElement
+ implements UmbEntityActionElement
+{
#api?: ApiType;
// TODO: Do these need to be properties? [NL]
@@ -36,6 +40,11 @@ export class UmbEntityActionElement<
@state()
_href?: string;
+ async focus() {
+ await this.updateComplete;
+ this.shadowRoot?.querySelector('uui-menu-item')?.focus();
+ }
+
async #onClickLabel(event: UUIMenuItemEvent) {
if (!this._href) {
event.stopPropagation();
@@ -66,10 +75,10 @@ export class UmbEntityActionElement<
`;
}
}
-export default UmbEntityActionElement;
+export default UmbEntityActionDefaultElement;
declare global {
interface HTMLElementTagNameMap {
- 'umb-entity-action': UmbEntityActionElement;
+ 'umb-entity-action': UmbEntityActionDefaultElement;
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-element.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-element.interface.ts
new file mode 100644
index 0000000000..de7365b9b7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-element.interface.ts
@@ -0,0 +1,3 @@
+import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
+
+export interface UmbEntityActionElement extends UmbControllerHostElement {}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-list.element.ts
index 3b06e5b891..a9d077242f 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-list.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-list.element.ts
@@ -30,6 +30,7 @@ export class UmbEntityActionListElement extends UmbLitElement {
return this._props.unique;
}
public set unique(value: string | null | undefined) {
+ if (value === this._props.unique) return;
this._props.unique = value;
this.#generateApiArgs();
this.requestUpdate('_props');
@@ -51,12 +52,14 @@ export class UmbEntityActionListElement extends UmbLitElement {
this.#entityContext.setEntityType(this._props.entityType);
this.#entityContext.setUnique(this._props.unique);
+ this.#hasRenderedOnce = false;
this._apiArgs = (manifest: ManifestEntityAction) => {
return [{ entityType: this._props.entityType!, unique: this._props.unique!, meta: manifest.meta }];
};
}
+ #hasRenderedOnce?: boolean;
render() {
return this._filter
? html`
@@ -64,7 +67,22 @@ export class UmbEntityActionListElement extends UmbLitElement {
type="entityAction"
.filter=${this._filter}
.elementProps=${this._props}
- .apiArgs=${this._apiArgs}>
+ .apiArgs=${this._apiArgs}
+ .renderMethod=${(ext: any, i: number) => {
+ if (!this.#hasRenderedOnce && i === 0) {
+ // TODO: Replace this block:
+ ext.component?.updateComplete.then(async () => {
+ const menuitem = ext.component?.shadowRoot?.querySelector('uui-menu-item');
+ menuitem?.updateComplete.then(async () => {
+ menuitem?.shadowRoot?.querySelector('#label-button')?.focus?.();
+ });
+ });
+ // end of block, with this, when this PR is part of UI Lib: https://github.com/umbraco/Umbraco.UI/pull/789
+ // ext.component?.focus();
+ this.#hasRenderedOnce = true;
+ }
+ return ext.component;
+ }}>
`
: '';
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts
index c6591a58f3..05cf739eaa 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts
@@ -4,6 +4,7 @@ export * from './entity-action-list.element.js';
export * from './entity-action.event.js';
export * from './entity-action.interface.js';
export * from './types.js';
+export type * from './entity-action-element.interface.js';
export { UmbRequestReloadStructureForEntityEvent } from './request-reload-structure-for-entity.event.js';
export { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from './default/default.action.kind.js';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts
index 58a607be4f..1b49c71c2e 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts
@@ -1,6 +1,5 @@
import type { ConditionTypes } from '../conditions/types.js';
-import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
-import type { UmbEntityAction } from '@umbraco-cms/backoffice/entity-action';
+import type { UmbEntityAction, UmbEntityActionElement } from '@umbraco-cms/backoffice/entity-action';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
import type { UmbModalToken, UmbPickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal';
@@ -9,7 +8,7 @@ import type { UmbModalToken, UmbPickerModalData, UmbPickerModalValue } from '@um
* For example for content you may wish to create a new document etc
*/
export interface ManifestEntityAction
- extends ManifestElementAndApi>,
+ extends ManifestElementAndApi>,
ManifestWithDynamicConditions {
type: 'entityAction';
forEntityTypes: Array;
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/icons.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/icons.model.ts
new file mode 100644
index 0000000000..97015f568e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/icons.model.ts
@@ -0,0 +1,6 @@
+import type { UmbIconDictionary } from '@umbraco-cms/backoffice/icon';
+import type { ManifestPlainJs } from '@umbraco-cms/backoffice/extension-api';
+
+export interface ManifestIcons extends ManifestPlainJs<{ default: UmbIconDictionary }> {
+ type: 'icons';
+}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts
index 3a50d513c9..58cac8ebaa 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts
@@ -27,6 +27,8 @@ import type { ManifestExternalLoginProvider } from './external-login-provider.mo
import type { ManifestGlobalContext } from './global-context.model.js';
import type { ManifestHeaderApp, ManifestHeaderAppButtonKind } from './header-app.model.js';
import type { ManifestHealthCheck } from './health-check.model.js';
+import type { ManifestIcons } from './icons.model.js';
+import type { ManifestLocalization } from './localization.model.js';
import type { ManifestMenu } from './menu.model.js';
import type { ManifestMenuItem, ManifestMenuItemTreeKind } from './menu-item.model.js';
import type { ManifestModal } from './modal.model.js';
@@ -40,7 +42,6 @@ import type { ManifestSectionView } from './section-view.model.js';
import type { ManifestStore, ManifestTreeStore, ManifestItemStore } from './store.model.js';
import type { ManifestTheme } from './theme.model.js';
import type { ManifestTinyMcePlugin } from './tinymce-plugin.model.js';
-import type { ManifestLocalization } from './localization.model.js';
import type { ManifestTree } from './tree.model.js';
import type { ManifestTreeItem } from './tree-item.model.js';
import type { ManifestUserProfileApp } from './user-profile-app.model.js';
@@ -66,6 +67,7 @@ import type { ManifestBackofficeEntryPoint } from './backoffice-entry-point.mode
import type { ManifestEntryPoint } from './entry-point.model.js';
import type { ManifestBase, ManifestBundle, ManifestCondition } from '@umbraco-cms/backoffice/extension-api';
+export type * from './app-entry-point.model.js';
export type * from './auth-provider.model.js';
export type * from './backoffice-entry-point.model.js';
export type * from './block-editor-custom-view.model.js';
@@ -84,6 +86,7 @@ export type * from './external-login-provider.model.js';
export type * from './global-context.model.js';
export type * from './header-app.model.js';
export type * from './health-check.model.js';
+export type * from './icons.model.js';
export type * from './localization.model.js';
export type * from './menu-item.model.js';
export type * from './menu.model.js';
@@ -109,7 +112,6 @@ export type * from './workspace-context.model.js';
export type * from './workspace-footer-app.model.js';
export type * from './workspace-view.model.js';
export type * from './workspace.model.js';
-export type * from './app-entry-point.model.js';
export type ManifestEntityActions =
| ManifestEntityAction
@@ -163,6 +165,7 @@ export type ManifestTypes =
| ManifestHeaderApp
| ManifestHeaderAppButtonKind
| ManifestHealthCheck
+ | ManifestIcons
| ManifestItemStore
| ManifestMenu
| ManifestMenuItem
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-registry.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-registry.context-token.ts
new file mode 100644
index 0000000000..a0658a6a47
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-registry.context-token.ts
@@ -0,0 +1,4 @@
+import type { UmbIconRegistryContext } from './icon-registry.context.js';
+import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
+
+export const UMB_ICON_REGISTRY_CONTEXT = new UmbContextToken('UmbIconRegistryContext');
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-registry.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-registry.context.ts
new file mode 100644
index 0000000000..2dfbcca3bf
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-registry.context.ts
@@ -0,0 +1,49 @@
+import { UmbIconRegistry } from './icon.registry.js';
+import type { UmbIconDefinition } from './types.js';
+import { UMB_ICON_REGISTRY_CONTEXT } from './icon-registry.context-token.js';
+import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
+import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
+import { loadManifestPlainJs } from '@umbraco-cms/backoffice/extension-api';
+import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api';
+import { type ManifestIcons, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
+
+export class UmbIconRegistryContext extends UmbContextBase {
+ #registry: UmbIconRegistry;
+ #manifestMap = new Map();
+ #icons = new UmbArrayState([], (x) => x.name);
+ readonly icons = this.#icons.asObservable();
+ readonly approvedIcons = this.#icons.asObservablePart((icons) => icons.filter((x) => x.legacy !== true));
+
+ constructor(host: UmbControllerHost) {
+ super(host, UMB_ICON_REGISTRY_CONTEXT);
+ this.#registry = new UmbIconRegistry();
+ this.#registry.attach(host.getHostElement());
+
+ this.observe(this.icons, (icons) => {
+ //if (icons.length > 0) {
+ this.#registry.setIcons(icons);
+ //}
+ });
+
+ this.observe(umbExtensionsRegistry.byType('icons'), (manifests) => {
+ manifests.forEach((manifest) => {
+ if (this.#manifestMap.has(manifest.alias)) return;
+ this.#manifestMap.set(manifest.alias, manifest);
+ // TODO: Should we unInit a entry point if is removed?
+ this.instantiateEntryPoint(manifest);
+ });
+ });
+ }
+
+ async instantiateEntryPoint(manifest: ManifestIcons) {
+ if (manifest.js) {
+ const js = await loadManifestPlainJs<{ default?: any }>(manifest.js);
+ if (!js || !js.default || !Array.isArray(js.default)) {
+ throw new Error('Icon manifest JS-file must export an array of icons as the default export.');
+ }
+ this.#icons.append(js.default);
+ }
+ }
+}
+
+export { UmbIconRegistryContext as api };
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon.registry.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon.registry.ts
index ada1f0e660..022241168e 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon.registry.ts
@@ -1,5 +1,4 @@
-import icons from './icons/icons.json' assert { type: 'json' };
-import { UUIIconRegistry } from '@umbraco-cms/backoffice/external/uui';
+import { type UUIIconHost, UUIIconRegistry } from '@umbraco-cms/backoffice/external/uui';
interface UmbIconDescriptor {
name: string;
@@ -13,26 +12,66 @@ interface UmbIconDescriptor {
* @description - Icon Registry. Provides icons from the icon manifest. Icons are loaded on demand. All icons are prefixed with 'icon-'
*/
export class UmbIconRegistry extends UUIIconRegistry {
+ #initResolve?: () => void;
+ #init: Promise = new Promise((resolve) => {
+ this.#initResolve = resolve;
+ });
+
+ #icons: UmbIconDescriptor[] = [];
+ #unhandledProviders: Map = new Map();
+
+ setIcons(icons: UmbIconDescriptor[]) {
+ const oldIcons = this.#icons;
+ this.#icons = icons;
+ if (this.#initResolve) {
+ this.#initResolve();
+ this.#initResolve = undefined;
+ }
+ // Go figure out which of the icons are new.
+ const newIcons = this.#icons.filter((i) => !oldIcons.find((o) => o.name === i.name));
+ newIcons.forEach((icon) => {
+ // Do we already have a request for this one, then lets initiate the load for those:
+ const unhandled = this.#unhandledProviders.get(icon.name);
+ if (unhandled) {
+ this.#loadIcon(icon.name, unhandled).then(() => {
+ this.#unhandledProviders.delete(icon.name);
+ });
+ }
+ });
+ }
+ appendIcons(icons: UmbIconDescriptor[]) {
+ this.#icons = [...this.#icons, ...icons];
+ }
/**
* @param {string} iconName
* @return {*} {boolean}
* @memberof UmbIconStore
*/
acceptIcon(iconName: string): boolean {
- const iconManifest = icons.find((i: UmbIconDescriptor) => i.name === iconName);
- if (!iconManifest) return false;
+ const iconProvider = this.provideIcon(iconName);
+ this.#loadIcon(iconName, iconProvider);
+
+ return true;
+ }
+
+ async #loadIcon(iconName: string, iconProvider: UUIIconHost): Promise {
+ await this.#init;
+ const iconManifest = this.#icons.find((i: UmbIconDescriptor) => i.name === iconName);
+ // Icon not found, so lets add it to a list of unhandled requests.
+ if (!iconManifest) {
+ this.#unhandledProviders.set(iconName, iconProvider);
+ return false;
+ }
- const icon = this.provideIcon(iconName);
const iconPath = iconManifest.path;
import(/* @vite-ignore */ iconPath)
.then((iconModule) => {
- icon.svg = iconModule.default;
+ iconProvider.svg = iconModule.default;
})
.catch((err) => {
console.error(`Failed to load icon ${iconName} on path ${iconPath}`, err.message);
});
-
return true;
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon.stories.ts
index bcb3013f5b..180c09f639 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon.stories.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon.stories.ts
@@ -1,5 +1,5 @@
import type { Meta, Story } from '@storybook/web-components';
-import icons from './icons/icons.json';
+import icons from './icons/icons.js';
import { html, repeat } from '@umbraco-cms/backoffice/external/lit';
export default {
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json
deleted file mode 100644
index 70d9dce5be..0000000000
--- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"name":"icon-activity","path":"./icons/icon-activity.js"},{"name":"icon-add","path":"./icons/icon-add.js"},{"name":"icon-addressbook","path":"./icons/icon-addressbook.js"},{"name":"icon-alarm-clock","path":"./icons/icon-alarm-clock.js"},{"name":"icon-alert-alt","path":"./icons/icon-alert-alt.js"},{"name":"icon-alert","path":"./icons/icon-alert.js"},{"name":"icon-alt","path":"./icons/icon-alt.js"},{"name":"icon-anchor","path":"./icons/icon-anchor.js"},{"name":"icon-app","path":"./icons/icon-app.js"},{"name":"icon-application-error","path":"./icons/icon-application-error.js"},{"name":"icon-application-window-alt","path":"./icons/icon-application-window-alt.js"},{"name":"icon-application-window","path":"./icons/icon-application-window.js"},{"name":"icon-arrivals","path":"./icons/icon-arrivals.js"},{"name":"icon-arrow-down","path":"./icons/icon-arrow-down.js"},{"name":"icon-arrow-left","path":"./icons/icon-arrow-left.js"},{"name":"icon-arrow-right","path":"./icons/icon-arrow-right.js"},{"name":"icon-arrow-up","path":"./icons/icon-arrow-up.js"},{"name":"icon-attachment","path":"./icons/icon-attachment.js"},{"name":"icon-autofill","path":"./icons/icon-autofill.js"},{"name":"icon-award","path":"./icons/icon-award.js"},{"name":"icon-axis-rotation-2","path":"./icons/icon-axis-rotation-2.js"},{"name":"icon-axis-rotation-3","path":"./icons/icon-axis-rotation-3.js"},{"name":"icon-axis-rotation","path":"./icons/icon-axis-rotation.js"},{"name":"icon-backspace","path":"./icons/icon-backspace.js"},{"name":"icon-badge-add","path":"./icons/icon-badge-add.js"},{"name":"icon-badge-remove","path":"./icons/icon-badge-remove.js"},{"name":"icon-badge-restricted","legacy":true,"path":"./icons/icon-badge-restricted.js"},{"name":"icon-ball","path":"./icons/icon-ball.js"},{"name":"icon-bar-chart","path":"./icons/icon-bar-chart.js"},{"name":"icon-barcode","path":"./icons/icon-barcode.js"},{"name":"icon-bars","path":"./icons/icon-bars.js"},{"name":"icon-battery-full","path":"./icons/icon-battery-full.js"},{"name":"icon-battery-low","path":"./icons/icon-battery-low.js"},{"name":"icon-beer-glass","path":"./icons/icon-beer-glass.js"},{"name":"icon-bell-off","path":"./icons/icon-bell-off.js"},{"name":"icon-bell","path":"./icons/icon-bell.js"},{"name":"icon-binarycode","path":"./icons/icon-binarycode.js"},{"name":"icon-bird","path":"./icons/icon-bird.js"},{"name":"icon-birthday-cake","path":"./icons/icon-birthday-cake.js"},{"name":"icon-block","path":"./icons/icon-block.js"},{"name":"icon-bluetooth","path":"./icons/icon-bluetooth.js"},{"name":"icon-boat-shipping","path":"./icons/icon-boat-shipping.js"},{"name":"icon-bones","path":"./icons/icon-bones.js"},{"name":"icon-book-alt-2","path":"./icons/icon-book-alt-2.js"},{"name":"icon-book-alt","path":"./icons/icon-book-alt.js"},{"name":"icon-book","path":"./icons/icon-book.js"},{"name":"icon-bookmark","path":"./icons/icon-bookmark.js"},{"name":"icon-books","path":"./icons/icon-books.js"},{"name":"icon-box-alt","path":"./icons/icon-box-alt.js"},{"name":"icon-box-open","path":"./icons/icon-box-open.js"},{"name":"icon-box","path":"./icons/icon-box.js"},{"name":"icon-brackets","path":"./icons/icon-brackets.js"},{"name":"icon-brick","path":"./icons/icon-brick.js"},{"name":"icon-briefcase","path":"./icons/icon-briefcase.js"},{"name":"icon-browser-window","path":"./icons/icon-browser-window.js"},{"name":"icon-brush-alt-2","path":"./icons/icon-brush-alt-2.js"},{"name":"icon-brush-alt","path":"./icons/icon-brush-alt.js"},{"name":"icon-brush","path":"./icons/icon-brush.js"},{"name":"icon-bug","path":"./icons/icon-bug.js"},{"name":"icon-bulleted-list","path":"./icons/icon-bulleted-list.js"},{"name":"icon-burn","path":"./icons/icon-burn.js"},{"name":"icon-bus","path":"./icons/icon-bus.js"},{"name":"icon-calculator","path":"./icons/icon-calculator.js"},{"name":"icon-calendar-alt","path":"./icons/icon-calendar-alt.js"},{"name":"icon-calendar","path":"./icons/icon-calendar.js"},{"name":"icon-camcorder","legacy":true,"path":"./icons/icon-camcorder.js"},{"name":"icon-camera-roll","path":"./icons/icon-camera-roll.js"},{"name":"icon-candy","path":"./icons/icon-candy.js"},{"name":"icon-caps-lock","path":"./icons/icon-caps-lock.js"},{"name":"icon-car","path":"./icons/icon-car.js"},{"name":"icon-categories","path":"./icons/icon-categories.js"},{"name":"icon-certificate","path":"./icons/icon-certificate.js"},{"name":"icon-chart-curve","path":"./icons/icon-chart-curve.js"},{"name":"icon-chart","path":"./icons/icon-chart.js"},{"name":"icon-chat-active","legacy":true,"path":"./icons/icon-chat-active.js"},{"name":"icon-chat","path":"./icons/icon-chat.js"},{"name":"icon-check","path":"./icons/icon-check.js"},{"name":"icon-checkbox-dotted","path":"./icons/icon-checkbox-dotted.js"},{"name":"icon-checkbox-empty","legacy":true,"path":"./icons/icon-checkbox-empty.js"},{"name":"icon-checkbox","path":"./icons/icon-checkbox.js"},{"name":"icon-chip-alt","legacy":true,"path":"./icons/icon-chip-alt.js"},{"name":"icon-chip","path":"./icons/icon-chip.js"},{"name":"icon-cinema","path":"./icons/icon-cinema.js"},{"name":"icon-circle-dotted-active","path":"./icons/icon-circle-dotted-active.js"},{"name":"icon-circle-dotted","path":"./icons/icon-circle-dotted.js"},{"name":"icon-circuits","path":"./icons/icon-circuits.js"},{"name":"icon-client","legacy":true,"path":"./icons/icon-client.js"},{"name":"icon-cloud-drive","path":"./icons/icon-cloud-drive.js"},{"name":"icon-cloud-upload","path":"./icons/icon-cloud-upload.js"},{"name":"icon-cloud","path":"./icons/icon-cloud.js"},{"name":"icon-cloudy","path":"./icons/icon-cloudy.js"},{"name":"icon-clubs","path":"./icons/icon-clubs.js"},{"name":"icon-cocktail","path":"./icons/icon-cocktail.js"},{"name":"icon-code","path":"./icons/icon-code.js"},{"name":"icon-coffee","path":"./icons/icon-coffee.js"},{"name":"icon-coin-dollar","path":"./icons/icon-coin-dollar.js"},{"name":"icon-coin-euro","path":"./icons/icon-coin-euro.js"},{"name":"icon-coin-pound","path":"./icons/icon-coin-pound.js"},{"name":"icon-coin-yen","path":"./icons/icon-coin-yen.js"},{"name":"icon-coins-alt","legacy":true,"path":"./icons/icon-coins-alt.js"},{"name":"icon-coins","path":"./icons/icon-coins.js"},{"name":"icon-color-bucket","path":"./icons/icon-color-bucket.js"},{"name":"icon-colorpicker","path":"./icons/icon-colorpicker.js"},{"name":"icon-columns","path":"./icons/icon-columns.js"},{"name":"icon-combination-lock-open","path":"./icons/icon-combination-lock-open.js"},{"name":"icon-combination-lock","path":"./icons/icon-combination-lock.js"},{"name":"icon-command","path":"./icons/icon-command.js"},{"name":"icon-company","path":"./icons/icon-company.js"},{"name":"icon-compress","path":"./icons/icon-compress.js"},{"name":"icon-connection","path":"./icons/icon-connection.js"},{"name":"icon-console","path":"./icons/icon-console.js"},{"name":"icon-contrast","path":"./icons/icon-contrast.js"},{"name":"icon-conversation-alt","path":"./icons/icon-conversation-alt.js"},{"name":"icon-conversation","legacy":true,"path":"./icons/icon-conversation.js"},{"name":"icon-coverflow","path":"./icons/icon-coverflow.js"},{"name":"icon-credit-card-alt","legacy":true,"path":"./icons/icon-credit-card-alt.js"},{"name":"icon-credit-card","path":"./icons/icon-credit-card.js"},{"name":"icon-crop","path":"./icons/icon-crop.js"},{"name":"icon-crosshair","path":"./icons/icon-crosshair.js"},{"name":"icon-crown-alt","legacy":true,"path":"./icons/icon-crown-alt.js"},{"name":"icon-crown","path":"./icons/icon-crown.js"},{"name":"icon-cupcake","legacy":true,"path":"./icons/icon-cupcake.js"},{"name":"icon-curve","path":"./icons/icon-curve.js"},{"name":"icon-cut","path":"./icons/icon-cut.js"},{"name":"icon-dashboard","path":"./icons/icon-dashboard.js"},{"name":"icon-defrag","path":"./icons/icon-defrag.js"},{"name":"icon-delete-key","path":"./icons/icon-delete-key.js"},{"name":"icon-delete","path":"./icons/icon-delete.js"},{"name":"icon-departure","path":"./icons/icon-departure.js"},{"name":"icon-desktop","legacy":true,"path":"./icons/icon-desktop.js"},{"name":"icon-diagnostics","path":"./icons/icon-diagnostics.js"},{"name":"icon-diagonal-arrow-alt","path":"./icons/icon-diagonal-arrow-alt.js"},{"name":"icon-diagonal-arrow","path":"./icons/icon-diagonal-arrow.js"},{"name":"icon-diamond","path":"./icons/icon-diamond.js"},{"name":"icon-diamonds","path":"./icons/icon-diamonds.js"},{"name":"icon-dice","path":"./icons/icon-dice.js"},{"name":"icon-diploma-alt","legacy":true,"path":"./icons/icon-diploma-alt.js"},{"name":"icon-diploma","path":"./icons/icon-diploma.js"},{"name":"icon-directions-alt","path":"./icons/icon-directions-alt.js"},{"name":"icon-directions","path":"./icons/icon-directions.js"},{"name":"icon-disc","path":"./icons/icon-disc.js"},{"name":"icon-disk-image","path":"./icons/icon-disk-image.js"},{"name":"icon-display","path":"./icons/icon-display.js"},{"name":"icon-dna","path":"./icons/icon-dna.js"},{"name":"icon-dock-connector","path":"./icons/icon-dock-connector.js"},{"name":"icon-document-dashed-line","path":"./icons/icon-document-dashed-line.js"},{"name":"icon-document","path":"./icons/icon-document.js"},{"name":"icon-documents","path":"./icons/icon-documents.js"},{"name":"icon-donate","legacy":true,"path":"./icons/icon-donate.js"},{"name":"icon-door-open-alt","legacy":true,"path":"./icons/icon-door-open-alt.js"},{"name":"icon-door-open","path":"./icons/icon-door-open.js"},{"name":"icon-download-alt","path":"./icons/icon-download-alt.js"},{"name":"icon-download","path":"./icons/icon-download.js"},{"name":"icon-drop","path":"./icons/icon-drop.js"},{"name":"icon-eco","path":"./icons/icon-eco.js"},{"name":"icon-economy","legacy":true,"path":"./icons/icon-economy.js"},{"name":"icon-edit","path":"./icons/icon-edit.js"},{"name":"icon-employee","legacy":true,"path":"./icons/icon-employee.js"},{"name":"icon-energy-saving-bulb","path":"./icons/icon-energy-saving-bulb.js"},{"name":"icon-enter","path":"./icons/icon-enter.js"},{"name":"icon-equalizer","path":"./icons/icon-equalizer.js"},{"name":"icon-escape","path":"./icons/icon-escape.js"},{"name":"icon-ethernet","path":"./icons/icon-ethernet.js"},{"name":"icon-eye","path":"./icons/icon-eye.js"},{"name":"icon-exit-fullscreen","path":"./icons/icon-exit-fullscreen.js"},{"name":"icon-facebook-like","path":"./icons/icon-facebook-like.js"},{"name":"icon-factory","path":"./icons/icon-factory.js"},{"name":"icon-favorite","path":"./icons/icon-favorite.js"},{"name":"icon-file-cabinet","path":"./icons/icon-file-cabinet.js"},{"name":"icon-files","path":"./icons/icon-files.js"},{"name":"icon-filter-arrows","path":"./icons/icon-filter-arrows.js"},{"name":"icon-filter","path":"./icons/icon-filter.js"},{"name":"icon-fingerprint","path":"./icons/icon-fingerprint.js"},{"name":"icon-fire","path":"./icons/icon-fire.js"},{"name":"icon-firewire","legacy":true,"path":"./icons/icon-firewire.js"},{"name":"icon-flag-alt","path":"./icons/icon-flag-alt.js"},{"name":"icon-flag","path":"./icons/icon-flag.js"},{"name":"icon-flash","path":"./icons/icon-flash.js"},{"name":"icon-flashlight","path":"./icons/icon-flashlight.js"},{"name":"icon-flowerpot","path":"./icons/icon-flowerpot.js"},{"name":"icon-folder","path":"./icons/icon-folder.js"},{"name":"icon-folders","path":"./icons/icon-folders.js"},{"name":"icon-font","path":"./icons/icon-font.js"},{"name":"icon-food","path":"./icons/icon-food.js"},{"name":"icon-footprints","path":"./icons/icon-footprints.js"},{"name":"icon-forking","path":"./icons/icon-forking.js"},{"name":"icon-frame-alt","legacy":true,"path":"./icons/icon-frame-alt.js"},{"name":"icon-frame","path":"./icons/icon-frame.js"},{"name":"icon-fullscreen-alt","path":"./icons/icon-fullscreen-alt.js"},{"name":"icon-fullscreen","path":"./icons/icon-fullscreen.js"},{"name":"icon-game","path":"./icons/icon-game.js"},{"name":"icon-geometry","legacy":true,"path":"./icons/icon-geometry.js"},{"name":"icon-gift","path":"./icons/icon-gift.js"},{"name":"icon-glasses","path":"./icons/icon-glasses.js"},{"name":"icon-globe-alt","path":"./icons/icon-globe-alt.js"},{"name":"icon-globe-asia","legacy":true,"path":"./icons/icon-globe-asia.js"},{"name":"icon-globe-europe-africa","legacy":true,"path":"./icons/icon-globe-europe-africa.js"},{"name":"icon-globe-inverted-america","legacy":true,"path":"./icons/icon-globe-inverted-america.js"},{"name":"icon-globe-inverted-asia","legacy":true,"path":"./icons/icon-globe-inverted-asia.js"},{"name":"icon-globe-inverted-europe-africa","legacy":true,"path":"./icons/icon-globe-inverted-europe-africa.js"},{"name":"icon-globe","path":"./icons/icon-globe.js"},{"name":"icon-gps","path":"./icons/icon-gps.js"},{"name":"icon-graduate","path":"./icons/icon-graduate.js"},{"name":"icon-grid","path":"./icons/icon-grid.js"},{"name":"icon-hammer","path":"./icons/icon-hammer.js"},{"name":"icon-hand-active-alt","legacy":true,"path":"./icons/icon-hand-active-alt.js"},{"name":"icon-hand-active","path":"./icons/icon-hand-active.js"},{"name":"icon-hand-pointer-alt","legacy":true,"path":"./icons/icon-hand-pointer-alt.js"},{"name":"icon-hand-pointer","path":"./icons/icon-hand-pointer.js"},{"name":"icon-handshake","path":"./icons/icon-handshake.js"},{"name":"icon-handtool-alt","legacy":true,"path":"./icons/icon-handtool-alt.js"},{"name":"icon-handtool","path":"./icons/icon-handtool.js"},{"name":"icon-hard-drive-alt","legacy":true,"path":"./icons/icon-hard-drive-alt.js"},{"name":"icon-hard-drive","legacy":true,"path":"./icons/icon-hard-drive.js"},{"name":"icon-headphones","path":"./icons/icon-headphones.js"},{"name":"icon-headset","legacy":true,"path":"./icons/icon-headset.js"},{"name":"icon-hearts","path":"./icons/icon-hearts.js"},{"name":"icon-height","path":"./icons/icon-height.js"},{"name":"icon-help-alt","path":"./icons/icon-help-alt.js"},{"name":"icon-help","path":"./icons/icon-help.js"},{"name":"icon-home","path":"./icons/icon-home.js"},{"name":"icon-hourglass","path":"./icons/icon-hourglass.js"},{"name":"icon-imac","legacy":true,"path":"./icons/icon-imac.js"},{"name":"icon-inbox-full","legacy":true,"path":"./icons/icon-inbox-full.js"},{"name":"icon-inbox","path":"./icons/icon-inbox.js"},{"name":"icon-indent","path":"./icons/icon-indent.js"},{"name":"icon-infinity","path":"./icons/icon-infinity.js"},{"name":"icon-info","path":"./icons/icon-info.js"},{"name":"icon-invoice","legacy":true,"path":"./icons/icon-invoice.js"},{"name":"icon-ipad","legacy":true,"path":"./icons/icon-ipad.js"},{"name":"icon-iphone","legacy":true,"path":"./icons/icon-iphone.js"},{"name":"icon-item-arrangement","legacy":true,"path":"./icons/icon-item-arrangement.js"},{"name":"icon-junk","path":"./icons/icon-junk.js"},{"name":"icon-key","path":"./icons/icon-key.js"},{"name":"icon-keyboard","path":"./icons/icon-keyboard.js"},{"name":"icon-lab","path":"./icons/icon-lab.js"},{"name":"icon-laptop","path":"./icons/icon-laptop.js"},{"name":"icon-layers-alt","legacy":true,"path":"./icons/icon-layers-alt.js"},{"name":"icon-layers","path":"./icons/icon-layers.js"},{"name":"icon-layout","path":"./icons/icon-layout.js"},{"name":"icon-left-double-arrow","path":"./icons/icon-left-double-arrow.js"},{"name":"icon-legal","path":"./icons/icon-legal.js"},{"name":"icon-lense","legacy":true,"path":"./icons/icon-lense.js"},{"name":"icon-library","path":"./icons/icon-library.js"},{"name":"icon-light-down","path":"./icons/icon-light-down.js"},{"name":"icon-light-up","path":"./icons/icon-light-up.js"},{"name":"icon-lightbulb-active","path":"./icons/icon-lightbulb-active.js"},{"name":"icon-lightbulb","legacy":true,"path":"./icons/icon-lightbulb.js"},{"name":"icon-lightning","path":"./icons/icon-lightning.js"},{"name":"icon-link","path":"./icons/icon-link.js"},{"name":"icon-list","path":"./icons/icon-list.js"},{"name":"icon-load","legacy":true,"path":"./icons/icon-load.js"},{"name":"icon-loading","legacy":true,"path":"./icons/icon-loading.js"},{"name":"icon-locate","path":"./icons/icon-locate.js"},{"name":"icon-location-near-me","legacy":true,"path":"./icons/icon-location-near-me.js"},{"name":"icon-location-nearby","path":"./icons/icon-location-nearby.js"},{"name":"icon-lock","path":"./icons/icon-lock.js"},{"name":"icon-log-out","path":"./icons/icon-log-out.js"},{"name":"icon-logout","legacy":true,"path":"./icons/icon-logout.js"},{"name":"icon-loupe","legacy":true,"path":"./icons/icon-loupe.js"},{"name":"icon-magnet","path":"./icons/icon-magnet.js"},{"name":"icon-mailbox","path":"./icons/icon-mailbox.js"},{"name":"icon-map-alt","path":"./icons/icon-map-alt.js"},{"name":"icon-map-location","legacy":true,"path":"./icons/icon-map-location.js"},{"name":"icon-map-marker","path":"./icons/icon-map-marker.js"},{"name":"icon-map","path":"./icons/icon-map.js"},{"name":"icon-medal","path":"./icons/icon-medal.js"},{"name":"icon-medical-emergency","path":"./icons/icon-medical-emergency.js"},{"name":"icon-medicine","path":"./icons/icon-medicine.js"},{"name":"icon-meeting","legacy":true,"path":"./icons/icon-meeting.js"},{"name":"icon-megaphone","path":"./icons/icon-megaphone.js"},{"name":"icon-merge","path":"./icons/icon-merge.js"},{"name":"icon-message-open","path":"./icons/icon-message-open.js"},{"name":"icon-message-unopened","legacy":true,"path":"./icons/icon-message-unopened.js"},{"name":"icon-message","path":"./icons/icon-message.js"},{"name":"icon-microscope","path":"./icons/icon-microscope.js"},{"name":"icon-mindmap","legacy":true,"path":"./icons/icon-mindmap.js"},{"name":"icon-mobile","path":"./icons/icon-mobile.js"},{"name":"icon-mountain","path":"./icons/icon-mountain.js"},{"name":"icon-mouse-cursor","path":"./icons/icon-mouse-cursor.js"},{"name":"icon-mouse","path":"./icons/icon-mouse.js"},{"name":"icon-movie-alt","path":"./icons/icon-movie-alt.js"},{"name":"icon-movie","path":"./icons/icon-movie.js"},{"name":"icon-multiple-credit-cards","path":"./icons/icon-multiple-credit-cards.js"},{"name":"icon-multiple-windows","path":"./icons/icon-multiple-windows.js"},{"name":"icon-music","path":"./icons/icon-music.js"},{"name":"icon-name-badge","legacy":true,"path":"./icons/icon-name-badge.js"},{"name":"icon-navigation-bottom","legacy":true,"path":"./icons/icon-navigation-bottom.js"},{"name":"icon-navigation-down","legacy":true,"path":"./icons/icon-navigation-down.js"},{"name":"icon-navigation-first","legacy":true,"path":"./icons/icon-navigation-first.js"},{"name":"icon-navigation-horizontal","legacy":true,"path":"./icons/icon-navigation-horizontal.js"},{"name":"icon-navigation-last","legacy":true,"path":"./icons/icon-navigation-last.js"},{"name":"icon-navigation-left","legacy":true,"path":"./icons/icon-navigation-left.js"},{"name":"icon-navigation-right","legacy":true,"path":"./icons/icon-navigation-right.js"},{"name":"icon-navigation-road","legacy":true,"path":"./icons/icon-navigation-road.js"},{"name":"icon-navigation-top","legacy":true,"path":"./icons/icon-navigation-top.js"},{"name":"icon-navigation-up","legacy":true,"path":"./icons/icon-navigation-up.js"},{"name":"icon-navigation-vertical","legacy":true,"path":"./icons/icon-navigation-vertical.js"},{"name":"icon-navigation","legacy":true,"path":"./icons/icon-navigation.js"},{"name":"icon-navigational-arrow","path":"./icons/icon-navigational-arrow.js"},{"name":"icon-network-alt","path":"./icons/icon-network-alt.js"},{"name":"icon-newspaper-alt","legacy":true,"path":"./icons/icon-newspaper-alt.js"},{"name":"icon-newspaper","path":"./icons/icon-newspaper.js"},{"name":"icon-next-media","legacy":true,"path":"./icons/icon-next-media.js"},{"name":"icon-next","legacy":true,"path":"./icons/icon-next.js"},{"name":"icon-nodes","legacy":true,"path":"./icons/icon-nodes.js"},{"name":"icon-notepad-alt","legacy":true,"path":"./icons/icon-notepad-alt.js"},{"name":"icon-notepad","path":"./icons/icon-notepad.js"},{"name":"icon-old-key","path":"./icons/icon-old-key.js"},{"name":"icon-old-phone","legacy":true,"path":"./icons/icon-old-phone.js"},{"name":"icon-operator","path":"./icons/icon-operator.js"},{"name":"icon-ordered-list","path":"./icons/icon-ordered-list.js"},{"name":"icon-out","path":"./icons/icon-out.js"},{"name":"icon-outbox","legacy":true,"path":"./icons/icon-outbox.js"},{"name":"icon-outdent","path":"./icons/icon-outdent.js"},{"name":"icon-page-add","path":"./icons/icon-page-add.js"},{"name":"icon-page-down","path":"./icons/icon-page-down.js"},{"name":"icon-page-remove","path":"./icons/icon-page-remove.js"},{"name":"icon-page-restricted","path":"./icons/icon-page-restricted.js"},{"name":"icon-page-up","path":"./icons/icon-page-up.js"},{"name":"icon-paint-roller","legacy":true,"path":"./icons/icon-paint-roller.js"},{"name":"icon-palette","path":"./icons/icon-palette.js"},{"name":"icon-panel-show","path":"./icons/icon-panel-show.js"},{"name":"icon-pannel-close","path":"./icons/icon-pannel-close.js"},{"name":"icon-paper-bag","legacy":true,"path":"./icons/icon-paper-bag.js"},{"name":"icon-paper-plane-alt","path":"./icons/icon-paper-plane-alt.js"},{"name":"icon-paper-plane","path":"./icons/icon-paper-plane.js"},{"name":"icon-partly-cloudy","path":"./icons/icon-partly-cloudy.js"},{"name":"icon-paste-in","legacy":true,"path":"./icons/icon-paste-in.js"},{"name":"icon-pause","path":"./icons/icon-pause.js"},{"name":"icon-pc","legacy":true,"path":"./icons/icon-pc.js"},{"name":"icon-people-alt-2","legacy":true,"path":"./icons/icon-people-alt-2.js"},{"name":"icon-people-alt","legacy":true,"path":"./icons/icon-people-alt.js"},{"name":"icon-people-female","legacy":true,"path":"./icons/icon-people-female.js"},{"name":"icon-people","path":"./icons/icon-people.js"},{"name":"icon-phone-ring","path":"./icons/icon-phone-ring.js"},{"name":"icon-phone","path":"./icons/icon-phone.js"},{"name":"icon-photo-album","path":"./icons/icon-photo-album.js"},{"name":"icon-picture","path":"./icons/icon-picture.js"},{"name":"icon-pictures-alt-2","path":"./icons/icon-pictures-alt-2.js"},{"name":"icon-pictures-alt","legacy":true,"path":"./icons/icon-pictures-alt.js"},{"name":"icon-pictures","path":"./icons/icon-pictures.js"},{"name":"icon-pie-chart","path":"./icons/icon-pie-chart.js"},{"name":"icon-piggy-bank","path":"./icons/icon-piggy-bank.js"},{"name":"icon-pin-location","path":"./icons/icon-pin-location.js"},{"name":"icon-plane","path":"./icons/icon-plane.js"},{"name":"icon-planet","legacy":true,"path":"./icons/icon-planet.js"},{"name":"icon-play","path":"./icons/icon-play.js"},{"name":"icon-playing-cards","legacy":true,"path":"./icons/icon-playing-cards.js"},{"name":"icon-playlist","path":"./icons/icon-playlist.js"},{"name":"icon-plugin","path":"./icons/icon-plugin.js"},{"name":"icon-podcast","path":"./icons/icon-podcast.js"},{"name":"icon-poll","legacy":true,"path":"./icons/icon-poll.js"},{"name":"icon-post-it","path":"./icons/icon-post-it.js"},{"name":"icon-power-outlet","legacy":true,"path":"./icons/icon-power-outlet.js"},{"name":"icon-power","path":"./icons/icon-power.js"},{"name":"icon-presentation","path":"./icons/icon-presentation.js"},{"name":"icon-previous-media","path":"./icons/icon-previous-media.js"},{"name":"icon-previous","path":"./icons/icon-previous.js"},{"name":"icon-price-dollar","legacy":true,"path":"./icons/icon-price-dollar.js"},{"name":"icon-price-euro","legacy":true,"path":"./icons/icon-price-euro.js"},{"name":"icon-price-pound","legacy":true,"path":"./icons/icon-price-pound.js"},{"name":"icon-price-yen","legacy":true,"path":"./icons/icon-price-yen.js"},{"name":"icon-print","path":"./icons/icon-print.js"},{"name":"icon-printer-alt","legacy":true,"path":"./icons/icon-printer-alt.js"},{"name":"icon-projector","path":"./icons/icon-projector.js"},{"name":"icon-pulse","path":"./icons/icon-pulse.js"},{"name":"icon-pushpin","path":"./icons/icon-pushpin.js"},{"name":"icon-qr-code","path":"./icons/icon-qr-code.js"},{"name":"icon-quote","path":"./icons/icon-quote.js"},{"name":"icon-radio-alt","path":"./icons/icon-radio-alt.js"},{"name":"icon-radio-receiver","path":"./icons/icon-radio-receiver.js"},{"name":"icon-radio","path":"./icons/icon-radio.js"},{"name":"icon-rain","path":"./icons/icon-rain.js"},{"name":"icon-rate","legacy":true,"path":"./icons/icon-rate.js"},{"name":"icon-re-post","path":"./icons/icon-re-post.js"},{"name":"icon-readonly","legacy":true,"path":"./icons/icon-readonly.js"},{"name":"icon-receipt-alt","path":"./icons/icon-receipt-alt.js"},{"name":"icon-reception","path":"./icons/icon-reception.js"},{"name":"icon-record","legacy":true,"path":"./icons/icon-record.js"},{"name":"icon-rectangle-ellipsis","path":"./icons/icon-rectangle-ellipsis.js"},{"name":"icon-redo","path":"./icons/icon-redo.js"},{"name":"icon-refresh","path":"./icons/icon-refresh.js"},{"name":"icon-remote","legacy":true,"path":"./icons/icon-remote.js"},{"name":"icon-remove","path":"./icons/icon-remove.js"},{"name":"icon-repeat-one","path":"./icons/icon-repeat-one.js"},{"name":"icon-repeat","path":"./icons/icon-repeat.js"},{"name":"icon-reply-arrow","path":"./icons/icon-reply-arrow.js"},{"name":"icon-resize","path":"./icons/icon-resize.js"},{"name":"icon-return-to-top","legacy":true,"path":"./icons/icon-return-to-top.js"},{"name":"icon-right-double-arrow","legacy":true,"path":"./icons/icon-right-double-arrow.js"},{"name":"icon-roadsign","legacy":true,"path":"./icons/icon-roadsign.js"},{"name":"icon-rocket","path":"./icons/icon-rocket.js"},{"name":"icon-rss","path":"./icons/icon-rss.js"},{"name":"icon-ruler-alt","path":"./icons/icon-ruler-alt.js"},{"name":"icon-ruler","path":"./icons/icon-ruler.js"},{"name":"icon-satellite-dish","path":"./icons/icon-satellite-dish.js"},{"name":"icon-save","path":"./icons/icon-save.js"},{"name":"icon-scan","path":"./icons/icon-scan.js"},{"name":"icon-school","path":"./icons/icon-school.js"},{"name":"icon-screensharing","path":"./icons/icon-screensharing.js"},{"name":"icon-script-alt","legacy":true,"path":"./icons/icon-script-alt.js"},{"name":"icon-script","path":"./icons/icon-script.js"},{"name":"icon-scull","path":"./icons/icon-scull.js"},{"name":"icon-search","path":"./icons/icon-search.js"},{"name":"icon-sensor","path":"./icons/icon-sensor.js"},{"name":"icon-server-alt","legacy":true,"path":"./icons/icon-server-alt.js"},{"name":"icon-server","path":"./icons/icon-server.js"},{"name":"icon-settings-alt","legacy":true,"path":"./icons/icon-settings-alt.js"},{"name":"icon-settings","path":"./icons/icon-settings.js"},{"name":"icon-share-alt","path":"./icons/icon-share-alt.js"},{"name":"icon-share","path":"./icons/icon-share.js"},{"name":"icon-sharing-iphone","path":"./icons/icon-sharing-iphone.js"},{"name":"icon-shield","path":"./icons/icon-shield.js"},{"name":"icon-shift","path":"./icons/icon-shift.js"},{"name":"icon-shipping-box","path":"./icons/icon-shipping-box.js"},{"name":"icon-shipping","path":"./icons/icon-shipping.js"},{"name":"icon-shoe","path":"./icons/icon-shoe.js"},{"name":"icon-shopping-basket-alt-2","legacy":true,"path":"./icons/icon-shopping-basket-alt-2.js"},{"name":"icon-shopping-basket-alt","path":"./icons/icon-shopping-basket-alt.js"},{"name":"icon-shopping-basket","path":"./icons/icon-shopping-basket.js"},{"name":"icon-shuffle","path":"./icons/icon-shuffle.js"},{"name":"icon-sience","path":"./icons/icon-sience.js"},{"name":"icon-single-note","path":"./icons/icon-single-note.js"},{"name":"icon-sitemap","legacy":true,"path":"./icons/icon-sitemap.js"},{"name":"icon-sleep","path":"./icons/icon-sleep.js"},{"name":"icon-slideshow","legacy":true,"path":"./icons/icon-slideshow.js"},{"name":"icon-smiley-inverted","legacy":true,"path":"./icons/icon-smiley-inverted.js"},{"name":"icon-smiley","path":"./icons/icon-smiley.js"},{"name":"icon-snow","path":"./icons/icon-snow.js"},{"name":"icon-sound-low","path":"./icons/icon-sound-low.js"},{"name":"icon-sound-medium","legacy":true,"path":"./icons/icon-sound-medium.js"},{"name":"icon-sound-off","path":"./icons/icon-sound-off.js"},{"name":"icon-sound-waves","path":"./icons/icon-sound-waves.js"},{"name":"icon-sound","path":"./icons/icon-sound.js"},{"name":"icon-spades","path":"./icons/icon-spades.js"},{"name":"icon-speaker","path":"./icons/icon-speaker.js"},{"name":"icon-speed-gauge","path":"./icons/icon-speed-gauge.js"},{"name":"icon-split-alt","path":"./icons/icon-split-alt.js"},{"name":"icon-split","path":"./icons/icon-split.js"},{"name":"icon-sprout","path":"./icons/icon-sprout.js"},{"name":"icon-squiggly-line","legacy":true,"path":"./icons/icon-squiggly-line.js"},{"name":"icon-ssd","legacy":true,"path":"./icons/icon-ssd.js"},{"name":"icon-stacked-disks","legacy":true,"path":"./icons/icon-stacked-disks.js"},{"name":"icon-stamp","legacy":true,"path":"./icons/icon-stamp.js"},{"name":"icon-stop-alt","path":"./icons/icon-stop-alt.js"},{"name":"icon-stop-hand","legacy":true,"path":"./icons/icon-stop-hand.js"},{"name":"icon-stop","path":"./icons/icon-stop.js"},{"name":"icon-store","path":"./icons/icon-store.js"},{"name":"icon-stream","legacy":true,"path":"./icons/icon-stream.js"},{"name":"icon-sunny","path":"./icons/icon-sunny.js"},{"name":"icon-sweatshirt","legacy":true,"path":"./icons/icon-sweatshirt.js"},{"name":"icon-sync","path":"./icons/icon-sync.js"},{"name":"icon-t-shirt","path":"./icons/icon-t-shirt.js"},{"name":"icon-tab-key","path":"./icons/icon-tab-key.js"},{"name":"icon-tag","path":"./icons/icon-tag.js"},{"name":"icon-tags","path":"./icons/icon-tags.js"},{"name":"icon-takeaway-cup","legacy":true,"path":"./icons/icon-takeaway-cup.js"},{"name":"icon-target","path":"./icons/icon-target.js"},{"name":"icon-temperatrure-alt","path":"./icons/icon-temperatrure-alt.js"},{"name":"icon-temperature","path":"./icons/icon-temperature.js"},{"name":"icon-terminal","path":"./icons/icon-terminal.js"},{"name":"icon-theater","path":"./icons/icon-theater.js"},{"name":"icon-thumb-down","path":"./icons/icon-thumb-down.js"},{"name":"icon-thumb-up","path":"./icons/icon-thumb-up.js"},{"name":"icon-thumbnail-list","path":"./icons/icon-thumbnail-list.js"},{"name":"icon-thumbnails-small","path":"./icons/icon-thumbnails-small.js"},{"name":"icon-thumbnails","path":"./icons/icon-thumbnails.js"},{"name":"icon-ticket","path":"./icons/icon-ticket.js"},{"name":"icon-time","path":"./icons/icon-time.js"},{"name":"icon-timer","path":"./icons/icon-timer.js"},{"name":"icon-tools","legacy":true,"path":"./icons/icon-tools.js"},{"name":"icon-top","legacy":true,"path":"./icons/icon-top.js"},{"name":"icon-traffic-alt","legacy":true,"path":"./icons/icon-traffic-alt.js"},{"name":"icon-trafic","path":"./icons/icon-trafic.js"},{"name":"icon-train","path":"./icons/icon-train.js"},{"name":"icon-trash-alt-2","legacy":true,"path":"./icons/icon-trash-alt-2.js"},{"name":"icon-trash-alt","legacy":true,"path":"./icons/icon-trash-alt.js"},{"name":"icon-trash","path":"./icons/icon-trash.js"},{"name":"icon-tree","path":"./icons/icon-tree.js"},{"name":"icon-trophy","path":"./icons/icon-trophy.js"},{"name":"icon-truck","path":"./icons/icon-truck.js"},{"name":"icon-tv-old","path":"./icons/icon-tv-old.js"},{"name":"icon-tv","path":"./icons/icon-tv.js"},{"name":"icon-umb-content","legacy":true,"path":"./icons/icon-umb-content.js"},{"name":"icon-umb-developer","legacy":true,"path":"./icons/icon-umb-developer.js"},{"name":"icon-umb-media","legacy":true,"path":"./icons/icon-umb-media.js"},{"name":"icon-umb-settings","legacy":true,"path":"./icons/icon-umb-settings.js"},{"name":"icon-umb-users","legacy":true,"path":"./icons/icon-umb-users.js"},{"name":"icon-umbrella","path":"./icons/icon-umbrella.js"},{"name":"icon-undo","path":"./icons/icon-undo.js"},{"name":"icon-unlocked","path":"./icons/icon-unlocked.js"},{"name":"icon-untitled","legacy":true,"path":"./icons/icon-untitled.js"},{"name":"icon-usb-connector","legacy":true,"path":"./icons/icon-usb-connector.js"},{"name":"icon-usb","path":"./icons/icon-usb.js"},{"name":"icon-user-female","legacy":true,"path":"./icons/icon-user-female.js"},{"name":"icon-user-females-alt","legacy":true,"path":"./icons/icon-user-females-alt.js"},{"name":"icon-user-females","legacy":true,"path":"./icons/icon-user-females.js"},{"name":"icon-user-glasses","legacy":true,"path":"./icons/icon-user-glasses.js"},{"name":"icon-user","path":"./icons/icon-user.js"},{"name":"icon-users-alt","legacy":true,"path":"./icons/icon-users-alt.js"},{"name":"icon-users","path":"./icons/icon-users.js"},{"name":"icon-utilities","path":"./icons/icon-utilities.js"},{"name":"icon-vcard","path":"./icons/icon-vcard.js"},{"name":"icon-video","path":"./icons/icon-video.js"},{"name":"icon-voice","path":"./icons/icon-voice.js"},{"name":"icon-wall-plug","path":"./icons/icon-wall-plug.js"},{"name":"icon-wallet","path":"./icons/icon-wallet.js"},{"name":"icon-wand","path":"./icons/icon-wand.js"},{"name":"icon-webhook","path":"./icons/icon-webhook.js"},{"name":"icon-weight","path":"./icons/icon-weight.js"},{"name":"icon-width","path":"./icons/icon-width.js"},{"name":"icon-wifi","path":"./icons/icon-wifi.js"},{"name":"icon-window-popin","path":"./icons/icon-window-popin.js"},{"name":"icon-window-sizes","path":"./icons/icon-window-sizes.js"},{"name":"icon-wine-glass","path":"./icons/icon-wine-glass.js"},{"name":"icon-wrench","path":"./icons/icon-wrench.js"},{"name":"icon-wrong","path":"./icons/icon-wrong.js"},{"name":"icon-zip","path":"./icons/icon-zip.js"},{"name":"icon-zom-out","legacy":true,"path":"./icons/icon-zom-out.js"},{"name":"icon-zoom-in","path":"./icons/icon-zoom-in.js"},{"name":"icon-zoom-out","path":"./icons/icon-zoom-out.js"},{"name":"icon-star","path":"./icons/icon-star.js"},{"name":"icon-database","path":"./icons/icon-database.js"},{"name":"icon-azure","path":"./icons/icon-azure.js"},{"name":"icon-facebook","path":"./icons/icon-facebook.js"},{"name":"icon-gitbook","path":"./icons/icon-gitbook.js"},{"name":"icon-github","path":"./icons/icon-github.js"},{"name":"icon-gitlab","path":"./icons/icon-gitlab.js"},{"name":"icon-google","path":"./icons/icon-google.js"},{"name":"icon-linkedin","path":"./icons/icon-linkedin.js"},{"name":"icon-mastodon","path":"./icons/icon-mastodon.js"},{"name":"icon-microsoft","path":"./icons/icon-microsoft.js"},{"name":"icon-twitter-x","path":"./icons/icon-twitter-x.js"},{"name":"icon-umbraco","path":"./icons/icon-umbraco.js"},{"name":"icon-art-easel","legacy":true,"path":"./icons/icon-art-easel.js"},{"name":"icon-article","legacy":true,"path":"./icons/icon-article.js"},{"name":"icon-auction-hammer","legacy":true,"path":"./icons/icon-auction-hammer.js"},{"name":"icon-baby-stroller","legacy":true,"path":"./icons/icon-baby-stroller.js"},{"name":"icon-badge-count","legacy":true,"path":"./icons/icon-badge-count.js"},{"name":"icon-band-aid","legacy":true,"path":"./icons/icon-band-aid.js"},{"name":"icon-bill-dollar","legacy":true,"path":"./icons/icon-bill-dollar.js"},{"name":"icon-bill-euro","legacy":true,"path":"./icons/icon-bill-euro.js"},{"name":"icon-bill-pound","legacy":true,"path":"./icons/icon-bill-pound.js"},{"name":"icon-bill-yen","legacy":true,"path":"./icons/icon-bill-yen.js"},{"name":"icon-bill","legacy":true,"path":"./icons/icon-bill.js"},{"name":"icon-billboard","legacy":true,"path":"./icons/icon-billboard.js"},{"name":"icon-bills-dollar","legacy":true,"path":"./icons/icon-bills-dollar.js"},{"name":"icon-bills-euro","legacy":true,"path":"./icons/icon-bills-euro.js"},{"name":"icon-bills-pound","legacy":true,"path":"./icons/icon-bills-pound.js"},{"name":"icon-bills-yen","legacy":true,"path":"./icons/icon-bills-yen.js"},{"name":"icon-bills","legacy":true,"path":"./icons/icon-bills.js"},{"name":"icon-binoculars","legacy":true,"path":"./icons/icon-binoculars.js"},{"name":"icon-blueprint","legacy":true,"path":"./icons/icon-blueprint.js"},{"name":"icon-bomb","legacy":true,"path":"./icons/icon-bomb.js"},{"name":"icon-cash-register","legacy":true,"path":"./icons/icon-cash-register.js"},{"name":"icon-checkbox-dotted-active","legacy":true,"path":"./icons/icon-checkbox-dotted-active.js"},{"name":"icon-chess","legacy":true,"path":"./icons/icon-chess.js"},{"name":"icon-circus","legacy":true,"path":"./icons/icon-circus.js"},{"name":"icon-clothes-hanger","legacy":true,"path":"./icons/icon-clothes-hanger.js"},{"name":"icon-coin","legacy":true,"path":"./icons/icon-coin.js"},{"name":"icon-coins-dollar-alt","legacy":true,"path":"./icons/icon-coins-dollar-alt.js"},{"name":"icon-coins-dollar","legacy":true,"path":"./icons/icon-coins-dollar.js"},{"name":"icon-coins-euro-alt","legacy":true,"path":"./icons/icon-coins-euro-alt.js"},{"name":"icon-coins-euro","legacy":true,"path":"./icons/icon-coins-euro.js"},{"name":"icon-coins-pound-alt","legacy":true,"path":"./icons/icon-coins-pound-alt.js"},{"name":"icon-coins-pound","legacy":true,"path":"./icons/icon-coins-pound.js"},{"name":"icon-coins-yen-alt","legacy":true,"path":"./icons/icon-coins-yen-alt.js"},{"name":"icon-coins-yen","legacy":true,"path":"./icons/icon-coins-yen.js"},{"name":"icon-comb","legacy":true,"path":"./icons/icon-comb.js"},{"name":"icon-desk","legacy":true,"path":"./icons/icon-desk.js"},{"name":"icon-dollar-bag","legacy":true,"path":"./icons/icon-dollar-bag.js"},{"name":"icon-eject","legacy":true,"path":"./icons/icon-eject.js"},{"name":"icon-euro-bag","legacy":true,"path":"./icons/icon-euro-bag.js"},{"name":"icon-female-symbol","legacy":true,"path":"./icons/icon-female-symbol.js"},{"name":"icon-firewall","legacy":true,"path":"./icons/icon-firewall.js"},{"name":"icon-folder-open","legacy":true,"path":"./icons/icon-folder-open.js"},{"name":"icon-folder-outline","legacy":true,"path":"./icons/icon-folder-outline.js"},{"name":"icon-handprint","legacy":true,"path":"./icons/icon-handprint.js"},{"name":"icon-hat","legacy":true,"path":"./icons/icon-hat.js"},{"name":"icon-hd","legacy":true,"path":"./icons/icon-hd.js"},{"name":"icon-inactive-line","legacy":true,"path":"./icons/icon-inactive-line.js"},{"name":"icon-keychain","legacy":true,"path":"./icons/icon-keychain.js"},{"name":"icon-keyhole","legacy":true,"path":"./icons/icon-keyhole.js"},{"name":"icon-linux-tux","legacy":true,"path":"./icons/icon-linux-tux.js"},{"name":"icon-male-and-female","legacy":true,"path":"./icons/icon-male-and-female.js"},{"name":"icon-male-symbol","legacy":true,"path":"./icons/icon-male-symbol.js"},{"name":"icon-molecular-network","legacy":true,"path":"./icons/icon-molecular-network.js"},{"name":"icon-molecular","legacy":true,"path":"./icons/icon-molecular.js"},{"name":"icon-os-x","legacy":true,"path":"./icons/icon-os-x.js"},{"name":"icon-pants","legacy":true,"path":"./icons/icon-pants.js"},{"name":"icon-parachute-drop","legacy":true,"path":"./icons/icon-parachute-drop.js"},{"name":"icon-parental-control","legacy":true,"path":"./icons/icon-parental-control.js"},{"name":"icon-path","legacy":true,"path":"./icons/icon-path.js"},{"name":"icon-piracy","legacy":true,"path":"./icons/icon-piracy.js"},{"name":"icon-poker-chip","legacy":true,"path":"./icons/icon-poker-chip.js"},{"name":"icon-pound-bag","legacy":true,"path":"./icons/icon-pound-bag.js"},{"name":"icon-receipt-dollar","legacy":true,"path":"./icons/icon-receipt-dollar.js"},{"name":"icon-receipt-euro","legacy":true,"path":"./icons/icon-receipt-euro.js"},{"name":"icon-receipt-pound","legacy":true,"path":"./icons/icon-receipt-pound.js"},{"name":"icon-receipt-yen","legacy":true,"path":"./icons/icon-receipt-yen.js"},{"name":"icon-road","legacy":true,"path":"./icons/icon-road.js"},{"name":"icon-safe","legacy":true,"path":"./icons/icon-safe.js"},{"name":"icon-safedial","legacy":true,"path":"./icons/icon-safedial.js"},{"name":"icon-sandbox-toys","legacy":true,"path":"./icons/icon-sandbox-toys.js"},{"name":"icon-security-camera","legacy":true,"path":"./icons/icon-security-camera.js"},{"name":"icon-settings-alt-2","legacy":true,"path":"./icons/icon-settings-alt-2.js"},{"name":"icon-share-alt-2","legacy":true,"path":"./icons/icon-share-alt-2.js"},{"name":"icon-shorts","legacy":true,"path":"./icons/icon-shorts.js"},{"name":"icon-simcard","legacy":true,"path":"./icons/icon-simcard.js"},{"name":"icon-tab","legacy":true,"path":"./icons/icon-tab.js"},{"name":"icon-tactics","legacy":true,"path":"./icons/icon-tactics.js"},{"name":"icon-theif","legacy":true,"path":"./icons/icon-theif.js"},{"name":"icon-thought-bubble","legacy":true,"path":"./icons/icon-thought-bubble.js"},{"name":"icon-twitter","legacy":true,"path":"./icons/icon-twitter.js"},{"name":"icon-umb-contour","legacy":true,"path":"./icons/icon-umb-contour.js"},{"name":"icon-umb-deploy","legacy":true,"path":"./icons/icon-umb-deploy.js"},{"name":"icon-umb-members","legacy":true,"path":"./icons/icon-umb-members.js"},{"name":"icon-universal","legacy":true,"path":"./icons/icon-universal.js"},{"name":"icon-war","legacy":true,"path":"./icons/icon-war.js"},{"name":"icon-windows","legacy":true,"path":"./icons/icon-windows.js"},{"name":"icon-yen-bag","legacy":true,"path":"./icons/icon-yen-bag.js"}]
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.ts
new file mode 100644
index 0000000000..6a79e57053
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.ts
@@ -0,0 +1,2489 @@
+export default [{
+name: "icon-activity",
+
+path: "./icons/icon-activity.js",
+},{
+name: "icon-add",
+
+path: "./icons/icon-add.js",
+},{
+name: "icon-addressbook",
+
+path: "./icons/icon-addressbook.js",
+},{
+name: "icon-alarm-clock",
+
+path: "./icons/icon-alarm-clock.js",
+},{
+name: "icon-alert-alt",
+
+path: "./icons/icon-alert-alt.js",
+},{
+name: "icon-alert",
+
+path: "./icons/icon-alert.js",
+},{
+name: "icon-alt",
+
+path: "./icons/icon-alt.js",
+},{
+name: "icon-anchor",
+
+path: "./icons/icon-anchor.js",
+},{
+name: "icon-app",
+
+path: "./icons/icon-app.js",
+},{
+name: "icon-application-error",
+
+path: "./icons/icon-application-error.js",
+},{
+name: "icon-application-window-alt",
+
+path: "./icons/icon-application-window-alt.js",
+},{
+name: "icon-application-window",
+
+path: "./icons/icon-application-window.js",
+},{
+name: "icon-arrivals",
+
+path: "./icons/icon-arrivals.js",
+},{
+name: "icon-arrow-down",
+
+path: "./icons/icon-arrow-down.js",
+},{
+name: "icon-arrow-left",
+
+path: "./icons/icon-arrow-left.js",
+},{
+name: "icon-arrow-right",
+
+path: "./icons/icon-arrow-right.js",
+},{
+name: "icon-arrow-up",
+
+path: "./icons/icon-arrow-up.js",
+},{
+name: "icon-attachment",
+
+path: "./icons/icon-attachment.js",
+},{
+name: "icon-autofill",
+
+path: "./icons/icon-autofill.js",
+},{
+name: "icon-award",
+
+path: "./icons/icon-award.js",
+},{
+name: "icon-axis-rotation-2",
+
+path: "./icons/icon-axis-rotation-2.js",
+},{
+name: "icon-axis-rotation-3",
+
+path: "./icons/icon-axis-rotation-3.js",
+},{
+name: "icon-axis-rotation",
+
+path: "./icons/icon-axis-rotation.js",
+},{
+name: "icon-backspace",
+
+path: "./icons/icon-backspace.js",
+},{
+name: "icon-badge-add",
+
+path: "./icons/icon-badge-add.js",
+},{
+name: "icon-badge-remove",
+
+path: "./icons/icon-badge-remove.js",
+},{
+name: "icon-badge-restricted",
+legacy: true,
+path: "./icons/icon-badge-restricted.js",
+},{
+name: "icon-ball",
+
+path: "./icons/icon-ball.js",
+},{
+name: "icon-bar-chart",
+
+path: "./icons/icon-bar-chart.js",
+},{
+name: "icon-barcode",
+
+path: "./icons/icon-barcode.js",
+},{
+name: "icon-bars",
+
+path: "./icons/icon-bars.js",
+},{
+name: "icon-battery-full",
+
+path: "./icons/icon-battery-full.js",
+},{
+name: "icon-battery-low",
+
+path: "./icons/icon-battery-low.js",
+},{
+name: "icon-beer-glass",
+
+path: "./icons/icon-beer-glass.js",
+},{
+name: "icon-bell-off",
+
+path: "./icons/icon-bell-off.js",
+},{
+name: "icon-bell",
+
+path: "./icons/icon-bell.js",
+},{
+name: "icon-binarycode",
+
+path: "./icons/icon-binarycode.js",
+},{
+name: "icon-bird",
+
+path: "./icons/icon-bird.js",
+},{
+name: "icon-birthday-cake",
+
+path: "./icons/icon-birthday-cake.js",
+},{
+name: "icon-block",
+
+path: "./icons/icon-block.js",
+},{
+name: "icon-bluetooth",
+
+path: "./icons/icon-bluetooth.js",
+},{
+name: "icon-boat-shipping",
+
+path: "./icons/icon-boat-shipping.js",
+},{
+name: "icon-bones",
+
+path: "./icons/icon-bones.js",
+},{
+name: "icon-book-alt-2",
+
+path: "./icons/icon-book-alt-2.js",
+},{
+name: "icon-book-alt",
+
+path: "./icons/icon-book-alt.js",
+},{
+name: "icon-book",
+
+path: "./icons/icon-book.js",
+},{
+name: "icon-bookmark",
+
+path: "./icons/icon-bookmark.js",
+},{
+name: "icon-books",
+
+path: "./icons/icon-books.js",
+},{
+name: "icon-box-alt",
+
+path: "./icons/icon-box-alt.js",
+},{
+name: "icon-box-open",
+
+path: "./icons/icon-box-open.js",
+},{
+name: "icon-box",
+
+path: "./icons/icon-box.js",
+},{
+name: "icon-brackets",
+
+path: "./icons/icon-brackets.js",
+},{
+name: "icon-brick",
+
+path: "./icons/icon-brick.js",
+},{
+name: "icon-briefcase",
+
+path: "./icons/icon-briefcase.js",
+},{
+name: "icon-browser-window",
+
+path: "./icons/icon-browser-window.js",
+},{
+name: "icon-brush-alt-2",
+
+path: "./icons/icon-brush-alt-2.js",
+},{
+name: "icon-brush-alt",
+
+path: "./icons/icon-brush-alt.js",
+},{
+name: "icon-brush",
+
+path: "./icons/icon-brush.js",
+},{
+name: "icon-bug",
+
+path: "./icons/icon-bug.js",
+},{
+name: "icon-bulleted-list",
+
+path: "./icons/icon-bulleted-list.js",
+},{
+name: "icon-burn",
+
+path: "./icons/icon-burn.js",
+},{
+name: "icon-bus",
+
+path: "./icons/icon-bus.js",
+},{
+name: "icon-calculator",
+
+path: "./icons/icon-calculator.js",
+},{
+name: "icon-calendar-alt",
+
+path: "./icons/icon-calendar-alt.js",
+},{
+name: "icon-calendar",
+
+path: "./icons/icon-calendar.js",
+},{
+name: "icon-camcorder",
+legacy: true,
+path: "./icons/icon-camcorder.js",
+},{
+name: "icon-camera-roll",
+
+path: "./icons/icon-camera-roll.js",
+},{
+name: "icon-candy",
+
+path: "./icons/icon-candy.js",
+},{
+name: "icon-caps-lock",
+
+path: "./icons/icon-caps-lock.js",
+},{
+name: "icon-car",
+
+path: "./icons/icon-car.js",
+},{
+name: "icon-categories",
+
+path: "./icons/icon-categories.js",
+},{
+name: "icon-certificate",
+
+path: "./icons/icon-certificate.js",
+},{
+name: "icon-chart-curve",
+
+path: "./icons/icon-chart-curve.js",
+},{
+name: "icon-chart",
+
+path: "./icons/icon-chart.js",
+},{
+name: "icon-chat-active",
+legacy: true,
+path: "./icons/icon-chat-active.js",
+},{
+name: "icon-chat",
+
+path: "./icons/icon-chat.js",
+},{
+name: "icon-check",
+
+path: "./icons/icon-check.js",
+},{
+name: "icon-checkbox-dotted",
+
+path: "./icons/icon-checkbox-dotted.js",
+},{
+name: "icon-checkbox-empty",
+legacy: true,
+path: "./icons/icon-checkbox-empty.js",
+},{
+name: "icon-checkbox",
+
+path: "./icons/icon-checkbox.js",
+},{
+name: "icon-chip-alt",
+legacy: true,
+path: "./icons/icon-chip-alt.js",
+},{
+name: "icon-chip",
+
+path: "./icons/icon-chip.js",
+},{
+name: "icon-cinema",
+
+path: "./icons/icon-cinema.js",
+},{
+name: "icon-circle-dotted-active",
+
+path: "./icons/icon-circle-dotted-active.js",
+},{
+name: "icon-circle-dotted",
+
+path: "./icons/icon-circle-dotted.js",
+},{
+name: "icon-circuits",
+
+path: "./icons/icon-circuits.js",
+},{
+name: "icon-client",
+legacy: true,
+path: "./icons/icon-client.js",
+},{
+name: "icon-cloud-drive",
+
+path: "./icons/icon-cloud-drive.js",
+},{
+name: "icon-cloud-upload",
+
+path: "./icons/icon-cloud-upload.js",
+},{
+name: "icon-cloud",
+
+path: "./icons/icon-cloud.js",
+},{
+name: "icon-cloudy",
+
+path: "./icons/icon-cloudy.js",
+},{
+name: "icon-clubs",
+
+path: "./icons/icon-clubs.js",
+},{
+name: "icon-cocktail",
+
+path: "./icons/icon-cocktail.js",
+},{
+name: "icon-code",
+
+path: "./icons/icon-code.js",
+},{
+name: "icon-coffee",
+
+path: "./icons/icon-coffee.js",
+},{
+name: "icon-coin-dollar",
+
+path: "./icons/icon-coin-dollar.js",
+},{
+name: "icon-coin-euro",
+
+path: "./icons/icon-coin-euro.js",
+},{
+name: "icon-coin-pound",
+
+path: "./icons/icon-coin-pound.js",
+},{
+name: "icon-coin-yen",
+
+path: "./icons/icon-coin-yen.js",
+},{
+name: "icon-coins-alt",
+legacy: true,
+path: "./icons/icon-coins-alt.js",
+},{
+name: "icon-coins",
+
+path: "./icons/icon-coins.js",
+},{
+name: "icon-color-bucket",
+
+path: "./icons/icon-color-bucket.js",
+},{
+name: "icon-colorpicker",
+
+path: "./icons/icon-colorpicker.js",
+},{
+name: "icon-columns",
+
+path: "./icons/icon-columns.js",
+},{
+name: "icon-combination-lock-open",
+
+path: "./icons/icon-combination-lock-open.js",
+},{
+name: "icon-combination-lock",
+
+path: "./icons/icon-combination-lock.js",
+},{
+name: "icon-command",
+
+path: "./icons/icon-command.js",
+},{
+name: "icon-company",
+
+path: "./icons/icon-company.js",
+},{
+name: "icon-compress",
+
+path: "./icons/icon-compress.js",
+},{
+name: "icon-connection",
+
+path: "./icons/icon-connection.js",
+},{
+name: "icon-console",
+
+path: "./icons/icon-console.js",
+},{
+name: "icon-contrast",
+
+path: "./icons/icon-contrast.js",
+},{
+name: "icon-conversation-alt",
+
+path: "./icons/icon-conversation-alt.js",
+},{
+name: "icon-conversation",
+legacy: true,
+path: "./icons/icon-conversation.js",
+},{
+name: "icon-coverflow",
+
+path: "./icons/icon-coverflow.js",
+},{
+name: "icon-credit-card-alt",
+legacy: true,
+path: "./icons/icon-credit-card-alt.js",
+},{
+name: "icon-credit-card",
+
+path: "./icons/icon-credit-card.js",
+},{
+name: "icon-crop",
+
+path: "./icons/icon-crop.js",
+},{
+name: "icon-crosshair",
+
+path: "./icons/icon-crosshair.js",
+},{
+name: "icon-crown-alt",
+legacy: true,
+path: "./icons/icon-crown-alt.js",
+},{
+name: "icon-crown",
+
+path: "./icons/icon-crown.js",
+},{
+name: "icon-cupcake",
+legacy: true,
+path: "./icons/icon-cupcake.js",
+},{
+name: "icon-curve",
+
+path: "./icons/icon-curve.js",
+},{
+name: "icon-cut",
+
+path: "./icons/icon-cut.js",
+},{
+name: "icon-dashboard",
+
+path: "./icons/icon-dashboard.js",
+},{
+name: "icon-defrag",
+
+path: "./icons/icon-defrag.js",
+},{
+name: "icon-delete-key",
+
+path: "./icons/icon-delete-key.js",
+},{
+name: "icon-delete",
+
+path: "./icons/icon-delete.js",
+},{
+name: "icon-departure",
+
+path: "./icons/icon-departure.js",
+},{
+name: "icon-desktop",
+legacy: true,
+path: "./icons/icon-desktop.js",
+},{
+name: "icon-diagnostics",
+
+path: "./icons/icon-diagnostics.js",
+},{
+name: "icon-diagonal-arrow-alt",
+
+path: "./icons/icon-diagonal-arrow-alt.js",
+},{
+name: "icon-diagonal-arrow",
+
+path: "./icons/icon-diagonal-arrow.js",
+},{
+name: "icon-diamond",
+
+path: "./icons/icon-diamond.js",
+},{
+name: "icon-diamonds",
+
+path: "./icons/icon-diamonds.js",
+},{
+name: "icon-dice",
+
+path: "./icons/icon-dice.js",
+},{
+name: "icon-diploma-alt",
+legacy: true,
+path: "./icons/icon-diploma-alt.js",
+},{
+name: "icon-diploma",
+
+path: "./icons/icon-diploma.js",
+},{
+name: "icon-directions-alt",
+
+path: "./icons/icon-directions-alt.js",
+},{
+name: "icon-directions",
+
+path: "./icons/icon-directions.js",
+},{
+name: "icon-disc",
+
+path: "./icons/icon-disc.js",
+},{
+name: "icon-disk-image",
+
+path: "./icons/icon-disk-image.js",
+},{
+name: "icon-display",
+
+path: "./icons/icon-display.js",
+},{
+name: "icon-dna",
+
+path: "./icons/icon-dna.js",
+},{
+name: "icon-dock-connector",
+
+path: "./icons/icon-dock-connector.js",
+},{
+name: "icon-document-dashed-line",
+
+path: "./icons/icon-document-dashed-line.js",
+},{
+name: "icon-document",
+
+path: "./icons/icon-document.js",
+},{
+name: "icon-documents",
+
+path: "./icons/icon-documents.js",
+},{
+name: "icon-donate",
+legacy: true,
+path: "./icons/icon-donate.js",
+},{
+name: "icon-door-open-alt",
+legacy: true,
+path: "./icons/icon-door-open-alt.js",
+},{
+name: "icon-door-open",
+
+path: "./icons/icon-door-open.js",
+},{
+name: "icon-download-alt",
+
+path: "./icons/icon-download-alt.js",
+},{
+name: "icon-download",
+
+path: "./icons/icon-download.js",
+},{
+name: "icon-drop",
+
+path: "./icons/icon-drop.js",
+},{
+name: "icon-eco",
+
+path: "./icons/icon-eco.js",
+},{
+name: "icon-economy",
+legacy: true,
+path: "./icons/icon-economy.js",
+},{
+name: "icon-edit",
+
+path: "./icons/icon-edit.js",
+},{
+name: "icon-employee",
+legacy: true,
+path: "./icons/icon-employee.js",
+},{
+name: "icon-energy-saving-bulb",
+
+path: "./icons/icon-energy-saving-bulb.js",
+},{
+name: "icon-enter",
+
+path: "./icons/icon-enter.js",
+},{
+name: "icon-equalizer",
+
+path: "./icons/icon-equalizer.js",
+},{
+name: "icon-escape",
+
+path: "./icons/icon-escape.js",
+},{
+name: "icon-ethernet",
+
+path: "./icons/icon-ethernet.js",
+},{
+name: "icon-eye",
+
+path: "./icons/icon-eye.js",
+},{
+name: "icon-exit-fullscreen",
+
+path: "./icons/icon-exit-fullscreen.js",
+},{
+name: "icon-facebook-like",
+
+path: "./icons/icon-facebook-like.js",
+},{
+name: "icon-factory",
+
+path: "./icons/icon-factory.js",
+},{
+name: "icon-favorite",
+
+path: "./icons/icon-favorite.js",
+},{
+name: "icon-file-cabinet",
+
+path: "./icons/icon-file-cabinet.js",
+},{
+name: "icon-files",
+
+path: "./icons/icon-files.js",
+},{
+name: "icon-filter-arrows",
+
+path: "./icons/icon-filter-arrows.js",
+},{
+name: "icon-filter",
+
+path: "./icons/icon-filter.js",
+},{
+name: "icon-fingerprint",
+
+path: "./icons/icon-fingerprint.js",
+},{
+name: "icon-fire",
+
+path: "./icons/icon-fire.js",
+},{
+name: "icon-firewire",
+legacy: true,
+path: "./icons/icon-firewire.js",
+},{
+name: "icon-flag-alt",
+
+path: "./icons/icon-flag-alt.js",
+},{
+name: "icon-flag",
+
+path: "./icons/icon-flag.js",
+},{
+name: "icon-flash",
+
+path: "./icons/icon-flash.js",
+},{
+name: "icon-flashlight",
+
+path: "./icons/icon-flashlight.js",
+},{
+name: "icon-flowerpot",
+
+path: "./icons/icon-flowerpot.js",
+},{
+name: "icon-folder",
+
+path: "./icons/icon-folder.js",
+},{
+name: "icon-folders",
+
+path: "./icons/icon-folders.js",
+},{
+name: "icon-font",
+
+path: "./icons/icon-font.js",
+},{
+name: "icon-food",
+
+path: "./icons/icon-food.js",
+},{
+name: "icon-footprints",
+
+path: "./icons/icon-footprints.js",
+},{
+name: "icon-forking",
+
+path: "./icons/icon-forking.js",
+},{
+name: "icon-frame-alt",
+legacy: true,
+path: "./icons/icon-frame-alt.js",
+},{
+name: "icon-frame",
+
+path: "./icons/icon-frame.js",
+},{
+name: "icon-fullscreen-alt",
+
+path: "./icons/icon-fullscreen-alt.js",
+},{
+name: "icon-fullscreen",
+
+path: "./icons/icon-fullscreen.js",
+},{
+name: "icon-game",
+
+path: "./icons/icon-game.js",
+},{
+name: "icon-geometry",
+legacy: true,
+path: "./icons/icon-geometry.js",
+},{
+name: "icon-gift",
+
+path: "./icons/icon-gift.js",
+},{
+name: "icon-glasses",
+
+path: "./icons/icon-glasses.js",
+},{
+name: "icon-globe-alt",
+
+path: "./icons/icon-globe-alt.js",
+},{
+name: "icon-globe-asia",
+legacy: true,
+path: "./icons/icon-globe-asia.js",
+},{
+name: "icon-globe-europe-africa",
+legacy: true,
+path: "./icons/icon-globe-europe-africa.js",
+},{
+name: "icon-globe-inverted-america",
+legacy: true,
+path: "./icons/icon-globe-inverted-america.js",
+},{
+name: "icon-globe-inverted-asia",
+legacy: true,
+path: "./icons/icon-globe-inverted-asia.js",
+},{
+name: "icon-globe-inverted-europe-africa",
+legacy: true,
+path: "./icons/icon-globe-inverted-europe-africa.js",
+},{
+name: "icon-globe",
+
+path: "./icons/icon-globe.js",
+},{
+name: "icon-gps",
+
+path: "./icons/icon-gps.js",
+},{
+name: "icon-graduate",
+
+path: "./icons/icon-graduate.js",
+},{
+name: "icon-grid",
+
+path: "./icons/icon-grid.js",
+},{
+name: "icon-hammer",
+
+path: "./icons/icon-hammer.js",
+},{
+name: "icon-hand-active-alt",
+legacy: true,
+path: "./icons/icon-hand-active-alt.js",
+},{
+name: "icon-hand-active",
+
+path: "./icons/icon-hand-active.js",
+},{
+name: "icon-hand-pointer-alt",
+legacy: true,
+path: "./icons/icon-hand-pointer-alt.js",
+},{
+name: "icon-hand-pointer",
+
+path: "./icons/icon-hand-pointer.js",
+},{
+name: "icon-handshake",
+
+path: "./icons/icon-handshake.js",
+},{
+name: "icon-handtool-alt",
+legacy: true,
+path: "./icons/icon-handtool-alt.js",
+},{
+name: "icon-handtool",
+
+path: "./icons/icon-handtool.js",
+},{
+name: "icon-hard-drive-alt",
+legacy: true,
+path: "./icons/icon-hard-drive-alt.js",
+},{
+name: "icon-hard-drive",
+legacy: true,
+path: "./icons/icon-hard-drive.js",
+},{
+name: "icon-headphones",
+
+path: "./icons/icon-headphones.js",
+},{
+name: "icon-headset",
+legacy: true,
+path: "./icons/icon-headset.js",
+},{
+name: "icon-hearts",
+
+path: "./icons/icon-hearts.js",
+},{
+name: "icon-height",
+
+path: "./icons/icon-height.js",
+},{
+name: "icon-help-alt",
+
+path: "./icons/icon-help-alt.js",
+},{
+name: "icon-help",
+
+path: "./icons/icon-help.js",
+},{
+name: "icon-home",
+
+path: "./icons/icon-home.js",
+},{
+name: "icon-hourglass",
+
+path: "./icons/icon-hourglass.js",
+},{
+name: "icon-imac",
+legacy: true,
+path: "./icons/icon-imac.js",
+},{
+name: "icon-inbox-full",
+legacy: true,
+path: "./icons/icon-inbox-full.js",
+},{
+name: "icon-inbox",
+
+path: "./icons/icon-inbox.js",
+},{
+name: "icon-indent",
+
+path: "./icons/icon-indent.js",
+},{
+name: "icon-infinity",
+
+path: "./icons/icon-infinity.js",
+},{
+name: "icon-info",
+
+path: "./icons/icon-info.js",
+},{
+name: "icon-invoice",
+legacy: true,
+path: "./icons/icon-invoice.js",
+},{
+name: "icon-ipad",
+legacy: true,
+path: "./icons/icon-ipad.js",
+},{
+name: "icon-iphone",
+legacy: true,
+path: "./icons/icon-iphone.js",
+},{
+name: "icon-item-arrangement",
+legacy: true,
+path: "./icons/icon-item-arrangement.js",
+},{
+name: "icon-junk",
+
+path: "./icons/icon-junk.js",
+},{
+name: "icon-key",
+
+path: "./icons/icon-key.js",
+},{
+name: "icon-keyboard",
+
+path: "./icons/icon-keyboard.js",
+},{
+name: "icon-lab",
+
+path: "./icons/icon-lab.js",
+},{
+name: "icon-laptop",
+
+path: "./icons/icon-laptop.js",
+},{
+name: "icon-layers-alt",
+legacy: true,
+path: "./icons/icon-layers-alt.js",
+},{
+name: "icon-layers",
+
+path: "./icons/icon-layers.js",
+},{
+name: "icon-layout",
+
+path: "./icons/icon-layout.js",
+},{
+name: "icon-left-double-arrow",
+
+path: "./icons/icon-left-double-arrow.js",
+},{
+name: "icon-legal",
+
+path: "./icons/icon-legal.js",
+},{
+name: "icon-lense",
+legacy: true,
+path: "./icons/icon-lense.js",
+},{
+name: "icon-library",
+
+path: "./icons/icon-library.js",
+},{
+name: "icon-light-down",
+
+path: "./icons/icon-light-down.js",
+},{
+name: "icon-light-up",
+
+path: "./icons/icon-light-up.js",
+},{
+name: "icon-lightbulb-active",
+
+path: "./icons/icon-lightbulb-active.js",
+},{
+name: "icon-lightbulb",
+legacy: true,
+path: "./icons/icon-lightbulb.js",
+},{
+name: "icon-lightning",
+
+path: "./icons/icon-lightning.js",
+},{
+name: "icon-link",
+
+path: "./icons/icon-link.js",
+},{
+name: "icon-list",
+
+path: "./icons/icon-list.js",
+},{
+name: "icon-load",
+legacy: true,
+path: "./icons/icon-load.js",
+},{
+name: "icon-loading",
+legacy: true,
+path: "./icons/icon-loading.js",
+},{
+name: "icon-locate",
+
+path: "./icons/icon-locate.js",
+},{
+name: "icon-location-near-me",
+legacy: true,
+path: "./icons/icon-location-near-me.js",
+},{
+name: "icon-location-nearby",
+
+path: "./icons/icon-location-nearby.js",
+},{
+name: "icon-lock",
+
+path: "./icons/icon-lock.js",
+},{
+name: "icon-log-out",
+
+path: "./icons/icon-log-out.js",
+},{
+name: "icon-logout",
+legacy: true,
+path: "./icons/icon-logout.js",
+},{
+name: "icon-loupe",
+legacy: true,
+path: "./icons/icon-loupe.js",
+},{
+name: "icon-magnet",
+
+path: "./icons/icon-magnet.js",
+},{
+name: "icon-mailbox",
+
+path: "./icons/icon-mailbox.js",
+},{
+name: "icon-map-alt",
+
+path: "./icons/icon-map-alt.js",
+},{
+name: "icon-map-location",
+legacy: true,
+path: "./icons/icon-map-location.js",
+},{
+name: "icon-map-marker",
+
+path: "./icons/icon-map-marker.js",
+},{
+name: "icon-map",
+
+path: "./icons/icon-map.js",
+},{
+name: "icon-medal",
+
+path: "./icons/icon-medal.js",
+},{
+name: "icon-medical-emergency",
+
+path: "./icons/icon-medical-emergency.js",
+},{
+name: "icon-medicine",
+
+path: "./icons/icon-medicine.js",
+},{
+name: "icon-meeting",
+legacy: true,
+path: "./icons/icon-meeting.js",
+},{
+name: "icon-megaphone",
+
+path: "./icons/icon-megaphone.js",
+},{
+name: "icon-merge",
+
+path: "./icons/icon-merge.js",
+},{
+name: "icon-message-open",
+
+path: "./icons/icon-message-open.js",
+},{
+name: "icon-message-unopened",
+legacy: true,
+path: "./icons/icon-message-unopened.js",
+},{
+name: "icon-message",
+
+path: "./icons/icon-message.js",
+},{
+name: "icon-microscope",
+
+path: "./icons/icon-microscope.js",
+},{
+name: "icon-mindmap",
+legacy: true,
+path: "./icons/icon-mindmap.js",
+},{
+name: "icon-mobile",
+
+path: "./icons/icon-mobile.js",
+},{
+name: "icon-mountain",
+
+path: "./icons/icon-mountain.js",
+},{
+name: "icon-mouse-cursor",
+
+path: "./icons/icon-mouse-cursor.js",
+},{
+name: "icon-mouse",
+
+path: "./icons/icon-mouse.js",
+},{
+name: "icon-movie-alt",
+
+path: "./icons/icon-movie-alt.js",
+},{
+name: "icon-movie",
+
+path: "./icons/icon-movie.js",
+},{
+name: "icon-multiple-credit-cards",
+
+path: "./icons/icon-multiple-credit-cards.js",
+},{
+name: "icon-multiple-windows",
+
+path: "./icons/icon-multiple-windows.js",
+},{
+name: "icon-music",
+
+path: "./icons/icon-music.js",
+},{
+name: "icon-name-badge",
+legacy: true,
+path: "./icons/icon-name-badge.js",
+},{
+name: "icon-navigation-bottom",
+legacy: true,
+path: "./icons/icon-navigation-bottom.js",
+},{
+name: "icon-navigation-down",
+legacy: true,
+path: "./icons/icon-navigation-down.js",
+},{
+name: "icon-navigation-first",
+legacy: true,
+path: "./icons/icon-navigation-first.js",
+},{
+name: "icon-navigation-horizontal",
+legacy: true,
+path: "./icons/icon-navigation-horizontal.js",
+},{
+name: "icon-navigation-last",
+legacy: true,
+path: "./icons/icon-navigation-last.js",
+},{
+name: "icon-navigation-left",
+legacy: true,
+path: "./icons/icon-navigation-left.js",
+},{
+name: "icon-navigation-right",
+legacy: true,
+path: "./icons/icon-navigation-right.js",
+},{
+name: "icon-navigation-road",
+legacy: true,
+path: "./icons/icon-navigation-road.js",
+},{
+name: "icon-navigation-top",
+legacy: true,
+path: "./icons/icon-navigation-top.js",
+},{
+name: "icon-navigation-up",
+legacy: true,
+path: "./icons/icon-navigation-up.js",
+},{
+name: "icon-navigation-vertical",
+legacy: true,
+path: "./icons/icon-navigation-vertical.js",
+},{
+name: "icon-navigation",
+legacy: true,
+path: "./icons/icon-navigation.js",
+},{
+name: "icon-navigational-arrow",
+
+path: "./icons/icon-navigational-arrow.js",
+},{
+name: "icon-network-alt",
+
+path: "./icons/icon-network-alt.js",
+},{
+name: "icon-newspaper-alt",
+legacy: true,
+path: "./icons/icon-newspaper-alt.js",
+},{
+name: "icon-newspaper",
+
+path: "./icons/icon-newspaper.js",
+},{
+name: "icon-next-media",
+legacy: true,
+path: "./icons/icon-next-media.js",
+},{
+name: "icon-next",
+legacy: true,
+path: "./icons/icon-next.js",
+},{
+name: "icon-nodes",
+legacy: true,
+path: "./icons/icon-nodes.js",
+},{
+name: "icon-notepad-alt",
+legacy: true,
+path: "./icons/icon-notepad-alt.js",
+},{
+name: "icon-notepad",
+
+path: "./icons/icon-notepad.js",
+},{
+name: "icon-old-key",
+
+path: "./icons/icon-old-key.js",
+},{
+name: "icon-old-phone",
+legacy: true,
+path: "./icons/icon-old-phone.js",
+},{
+name: "icon-operator",
+
+path: "./icons/icon-operator.js",
+},{
+name: "icon-ordered-list",
+
+path: "./icons/icon-ordered-list.js",
+},{
+name: "icon-out",
+
+path: "./icons/icon-out.js",
+},{
+name: "icon-outbox",
+legacy: true,
+path: "./icons/icon-outbox.js",
+},{
+name: "icon-outdent",
+
+path: "./icons/icon-outdent.js",
+},{
+name: "icon-page-add",
+
+path: "./icons/icon-page-add.js",
+},{
+name: "icon-page-down",
+
+path: "./icons/icon-page-down.js",
+},{
+name: "icon-page-remove",
+
+path: "./icons/icon-page-remove.js",
+},{
+name: "icon-page-restricted",
+
+path: "./icons/icon-page-restricted.js",
+},{
+name: "icon-page-up",
+
+path: "./icons/icon-page-up.js",
+},{
+name: "icon-paint-roller",
+legacy: true,
+path: "./icons/icon-paint-roller.js",
+},{
+name: "icon-palette",
+
+path: "./icons/icon-palette.js",
+},{
+name: "icon-panel-show",
+
+path: "./icons/icon-panel-show.js",
+},{
+name: "icon-pannel-close",
+
+path: "./icons/icon-pannel-close.js",
+},{
+name: "icon-paper-bag",
+legacy: true,
+path: "./icons/icon-paper-bag.js",
+},{
+name: "icon-paper-plane-alt",
+
+path: "./icons/icon-paper-plane-alt.js",
+},{
+name: "icon-paper-plane",
+
+path: "./icons/icon-paper-plane.js",
+},{
+name: "icon-partly-cloudy",
+
+path: "./icons/icon-partly-cloudy.js",
+},{
+name: "icon-paste-in",
+legacy: true,
+path: "./icons/icon-paste-in.js",
+},{
+name: "icon-pause",
+
+path: "./icons/icon-pause.js",
+},{
+name: "icon-pc",
+legacy: true,
+path: "./icons/icon-pc.js",
+},{
+name: "icon-people-alt-2",
+legacy: true,
+path: "./icons/icon-people-alt-2.js",
+},{
+name: "icon-people-alt",
+legacy: true,
+path: "./icons/icon-people-alt.js",
+},{
+name: "icon-people-female",
+legacy: true,
+path: "./icons/icon-people-female.js",
+},{
+name: "icon-people",
+
+path: "./icons/icon-people.js",
+},{
+name: "icon-phone-ring",
+
+path: "./icons/icon-phone-ring.js",
+},{
+name: "icon-phone",
+
+path: "./icons/icon-phone.js",
+},{
+name: "icon-photo-album",
+
+path: "./icons/icon-photo-album.js",
+},{
+name: "icon-picture",
+
+path: "./icons/icon-picture.js",
+},{
+name: "icon-pictures-alt-2",
+
+path: "./icons/icon-pictures-alt-2.js",
+},{
+name: "icon-pictures-alt",
+legacy: true,
+path: "./icons/icon-pictures-alt.js",
+},{
+name: "icon-pictures",
+
+path: "./icons/icon-pictures.js",
+},{
+name: "icon-pie-chart",
+
+path: "./icons/icon-pie-chart.js",
+},{
+name: "icon-piggy-bank",
+
+path: "./icons/icon-piggy-bank.js",
+},{
+name: "icon-pin-location",
+
+path: "./icons/icon-pin-location.js",
+},{
+name: "icon-plane",
+
+path: "./icons/icon-plane.js",
+},{
+name: "icon-planet",
+legacy: true,
+path: "./icons/icon-planet.js",
+},{
+name: "icon-play",
+
+path: "./icons/icon-play.js",
+},{
+name: "icon-playing-cards",
+legacy: true,
+path: "./icons/icon-playing-cards.js",
+},{
+name: "icon-playlist",
+
+path: "./icons/icon-playlist.js",
+},{
+name: "icon-plugin",
+
+path: "./icons/icon-plugin.js",
+},{
+name: "icon-podcast",
+
+path: "./icons/icon-podcast.js",
+},{
+name: "icon-poll",
+legacy: true,
+path: "./icons/icon-poll.js",
+},{
+name: "icon-post-it",
+
+path: "./icons/icon-post-it.js",
+},{
+name: "icon-power-outlet",
+legacy: true,
+path: "./icons/icon-power-outlet.js",
+},{
+name: "icon-power",
+
+path: "./icons/icon-power.js",
+},{
+name: "icon-presentation",
+
+path: "./icons/icon-presentation.js",
+},{
+name: "icon-previous-media",
+
+path: "./icons/icon-previous-media.js",
+},{
+name: "icon-previous",
+
+path: "./icons/icon-previous.js",
+},{
+name: "icon-price-dollar",
+legacy: true,
+path: "./icons/icon-price-dollar.js",
+},{
+name: "icon-price-euro",
+legacy: true,
+path: "./icons/icon-price-euro.js",
+},{
+name: "icon-price-pound",
+legacy: true,
+path: "./icons/icon-price-pound.js",
+},{
+name: "icon-price-yen",
+legacy: true,
+path: "./icons/icon-price-yen.js",
+},{
+name: "icon-print",
+
+path: "./icons/icon-print.js",
+},{
+name: "icon-printer-alt",
+legacy: true,
+path: "./icons/icon-printer-alt.js",
+},{
+name: "icon-projector",
+
+path: "./icons/icon-projector.js",
+},{
+name: "icon-pulse",
+
+path: "./icons/icon-pulse.js",
+},{
+name: "icon-pushpin",
+
+path: "./icons/icon-pushpin.js",
+},{
+name: "icon-qr-code",
+
+path: "./icons/icon-qr-code.js",
+},{
+name: "icon-quote",
+
+path: "./icons/icon-quote.js",
+},{
+name: "icon-radio-alt",
+
+path: "./icons/icon-radio-alt.js",
+},{
+name: "icon-radio-receiver",
+
+path: "./icons/icon-radio-receiver.js",
+},{
+name: "icon-radio",
+
+path: "./icons/icon-radio.js",
+},{
+name: "icon-rain",
+
+path: "./icons/icon-rain.js",
+},{
+name: "icon-rate",
+legacy: true,
+path: "./icons/icon-rate.js",
+},{
+name: "icon-re-post",
+
+path: "./icons/icon-re-post.js",
+},{
+name: "icon-readonly",
+legacy: true,
+path: "./icons/icon-readonly.js",
+},{
+name: "icon-receipt-alt",
+
+path: "./icons/icon-receipt-alt.js",
+},{
+name: "icon-reception",
+
+path: "./icons/icon-reception.js",
+},{
+name: "icon-record",
+legacy: true,
+path: "./icons/icon-record.js",
+},{
+name: "icon-rectangle-ellipsis",
+
+path: "./icons/icon-rectangle-ellipsis.js",
+},{
+name: "icon-redo",
+
+path: "./icons/icon-redo.js",
+},{
+name: "icon-refresh",
+
+path: "./icons/icon-refresh.js",
+},{
+name: "icon-remote",
+legacy: true,
+path: "./icons/icon-remote.js",
+},{
+name: "icon-remove",
+
+path: "./icons/icon-remove.js",
+},{
+name: "icon-repeat-one",
+
+path: "./icons/icon-repeat-one.js",
+},{
+name: "icon-repeat",
+
+path: "./icons/icon-repeat.js",
+},{
+name: "icon-reply-arrow",
+
+path: "./icons/icon-reply-arrow.js",
+},{
+name: "icon-resize",
+
+path: "./icons/icon-resize.js",
+},{
+name: "icon-return-to-top",
+legacy: true,
+path: "./icons/icon-return-to-top.js",
+},{
+name: "icon-right-double-arrow",
+legacy: true,
+path: "./icons/icon-right-double-arrow.js",
+},{
+name: "icon-roadsign",
+legacy: true,
+path: "./icons/icon-roadsign.js",
+},{
+name: "icon-rocket",
+
+path: "./icons/icon-rocket.js",
+},{
+name: "icon-rss",
+
+path: "./icons/icon-rss.js",
+},{
+name: "icon-ruler-alt",
+
+path: "./icons/icon-ruler-alt.js",
+},{
+name: "icon-ruler",
+
+path: "./icons/icon-ruler.js",
+},{
+name: "icon-satellite-dish",
+
+path: "./icons/icon-satellite-dish.js",
+},{
+name: "icon-save",
+
+path: "./icons/icon-save.js",
+},{
+name: "icon-scan",
+
+path: "./icons/icon-scan.js",
+},{
+name: "icon-school",
+
+path: "./icons/icon-school.js",
+},{
+name: "icon-screensharing",
+
+path: "./icons/icon-screensharing.js",
+},{
+name: "icon-script-alt",
+legacy: true,
+path: "./icons/icon-script-alt.js",
+},{
+name: "icon-script",
+
+path: "./icons/icon-script.js",
+},{
+name: "icon-scull",
+
+path: "./icons/icon-scull.js",
+},{
+name: "icon-search",
+
+path: "./icons/icon-search.js",
+},{
+name: "icon-sensor",
+
+path: "./icons/icon-sensor.js",
+},{
+name: "icon-server-alt",
+legacy: true,
+path: "./icons/icon-server-alt.js",
+},{
+name: "icon-server",
+
+path: "./icons/icon-server.js",
+},{
+name: "icon-settings-alt",
+legacy: true,
+path: "./icons/icon-settings-alt.js",
+},{
+name: "icon-settings",
+
+path: "./icons/icon-settings.js",
+},{
+name: "icon-share-alt",
+
+path: "./icons/icon-share-alt.js",
+},{
+name: "icon-share",
+
+path: "./icons/icon-share.js",
+},{
+name: "icon-sharing-iphone",
+
+path: "./icons/icon-sharing-iphone.js",
+},{
+name: "icon-shield",
+
+path: "./icons/icon-shield.js",
+},{
+name: "icon-shift",
+
+path: "./icons/icon-shift.js",
+},{
+name: "icon-shipping-box",
+
+path: "./icons/icon-shipping-box.js",
+},{
+name: "icon-shipping",
+
+path: "./icons/icon-shipping.js",
+},{
+name: "icon-shoe",
+
+path: "./icons/icon-shoe.js",
+},{
+name: "icon-shopping-basket-alt-2",
+legacy: true,
+path: "./icons/icon-shopping-basket-alt-2.js",
+},{
+name: "icon-shopping-basket-alt",
+
+path: "./icons/icon-shopping-basket-alt.js",
+},{
+name: "icon-shopping-basket",
+
+path: "./icons/icon-shopping-basket.js",
+},{
+name: "icon-shuffle",
+
+path: "./icons/icon-shuffle.js",
+},{
+name: "icon-sience",
+
+path: "./icons/icon-sience.js",
+},{
+name: "icon-single-note",
+
+path: "./icons/icon-single-note.js",
+},{
+name: "icon-sitemap",
+legacy: true,
+path: "./icons/icon-sitemap.js",
+},{
+name: "icon-sleep",
+
+path: "./icons/icon-sleep.js",
+},{
+name: "icon-slideshow",
+legacy: true,
+path: "./icons/icon-slideshow.js",
+},{
+name: "icon-smiley-inverted",
+legacy: true,
+path: "./icons/icon-smiley-inverted.js",
+},{
+name: "icon-smiley",
+
+path: "./icons/icon-smiley.js",
+},{
+name: "icon-snow",
+
+path: "./icons/icon-snow.js",
+},{
+name: "icon-sound-low",
+
+path: "./icons/icon-sound-low.js",
+},{
+name: "icon-sound-medium",
+legacy: true,
+path: "./icons/icon-sound-medium.js",
+},{
+name: "icon-sound-off",
+
+path: "./icons/icon-sound-off.js",
+},{
+name: "icon-sound-waves",
+
+path: "./icons/icon-sound-waves.js",
+},{
+name: "icon-sound",
+
+path: "./icons/icon-sound.js",
+},{
+name: "icon-spades",
+
+path: "./icons/icon-spades.js",
+},{
+name: "icon-speaker",
+
+path: "./icons/icon-speaker.js",
+},{
+name: "icon-speed-gauge",
+
+path: "./icons/icon-speed-gauge.js",
+},{
+name: "icon-split-alt",
+
+path: "./icons/icon-split-alt.js",
+},{
+name: "icon-split",
+
+path: "./icons/icon-split.js",
+},{
+name: "icon-sprout",
+
+path: "./icons/icon-sprout.js",
+},{
+name: "icon-squiggly-line",
+legacy: true,
+path: "./icons/icon-squiggly-line.js",
+},{
+name: "icon-ssd",
+legacy: true,
+path: "./icons/icon-ssd.js",
+},{
+name: "icon-stacked-disks",
+legacy: true,
+path: "./icons/icon-stacked-disks.js",
+},{
+name: "icon-stamp",
+legacy: true,
+path: "./icons/icon-stamp.js",
+},{
+name: "icon-stop-alt",
+
+path: "./icons/icon-stop-alt.js",
+},{
+name: "icon-stop-hand",
+legacy: true,
+path: "./icons/icon-stop-hand.js",
+},{
+name: "icon-stop",
+
+path: "./icons/icon-stop.js",
+},{
+name: "icon-store",
+
+path: "./icons/icon-store.js",
+},{
+name: "icon-stream",
+legacy: true,
+path: "./icons/icon-stream.js",
+},{
+name: "icon-sunny",
+
+path: "./icons/icon-sunny.js",
+},{
+name: "icon-sweatshirt",
+legacy: true,
+path: "./icons/icon-sweatshirt.js",
+},{
+name: "icon-sync",
+
+path: "./icons/icon-sync.js",
+},{
+name: "icon-t-shirt",
+
+path: "./icons/icon-t-shirt.js",
+},{
+name: "icon-tab-key",
+
+path: "./icons/icon-tab-key.js",
+},{
+name: "icon-tag",
+
+path: "./icons/icon-tag.js",
+},{
+name: "icon-tags",
+
+path: "./icons/icon-tags.js",
+},{
+name: "icon-takeaway-cup",
+legacy: true,
+path: "./icons/icon-takeaway-cup.js",
+},{
+name: "icon-target",
+
+path: "./icons/icon-target.js",
+},{
+name: "icon-temperatrure-alt",
+
+path: "./icons/icon-temperatrure-alt.js",
+},{
+name: "icon-temperature",
+
+path: "./icons/icon-temperature.js",
+},{
+name: "icon-terminal",
+
+path: "./icons/icon-terminal.js",
+},{
+name: "icon-theater",
+
+path: "./icons/icon-theater.js",
+},{
+name: "icon-thumb-down",
+
+path: "./icons/icon-thumb-down.js",
+},{
+name: "icon-thumb-up",
+
+path: "./icons/icon-thumb-up.js",
+},{
+name: "icon-thumbnail-list",
+
+path: "./icons/icon-thumbnail-list.js",
+},{
+name: "icon-thumbnails-small",
+
+path: "./icons/icon-thumbnails-small.js",
+},{
+name: "icon-thumbnails",
+
+path: "./icons/icon-thumbnails.js",
+},{
+name: "icon-ticket",
+
+path: "./icons/icon-ticket.js",
+},{
+name: "icon-time",
+
+path: "./icons/icon-time.js",
+},{
+name: "icon-timer",
+
+path: "./icons/icon-timer.js",
+},{
+name: "icon-tools",
+legacy: true,
+path: "./icons/icon-tools.js",
+},{
+name: "icon-top",
+legacy: true,
+path: "./icons/icon-top.js",
+},{
+name: "icon-traffic-alt",
+legacy: true,
+path: "./icons/icon-traffic-alt.js",
+},{
+name: "icon-trafic",
+
+path: "./icons/icon-trafic.js",
+},{
+name: "icon-train",
+
+path: "./icons/icon-train.js",
+},{
+name: "icon-trash-alt-2",
+legacy: true,
+path: "./icons/icon-trash-alt-2.js",
+},{
+name: "icon-trash-alt",
+legacy: true,
+path: "./icons/icon-trash-alt.js",
+},{
+name: "icon-trash",
+
+path: "./icons/icon-trash.js",
+},{
+name: "icon-tree",
+
+path: "./icons/icon-tree.js",
+},{
+name: "icon-trophy",
+
+path: "./icons/icon-trophy.js",
+},{
+name: "icon-truck",
+
+path: "./icons/icon-truck.js",
+},{
+name: "icon-tv-old",
+
+path: "./icons/icon-tv-old.js",
+},{
+name: "icon-tv",
+
+path: "./icons/icon-tv.js",
+},{
+name: "icon-umb-content",
+legacy: true,
+path: "./icons/icon-umb-content.js",
+},{
+name: "icon-umb-developer",
+legacy: true,
+path: "./icons/icon-umb-developer.js",
+},{
+name: "icon-umb-media",
+legacy: true,
+path: "./icons/icon-umb-media.js",
+},{
+name: "icon-umb-settings",
+legacy: true,
+path: "./icons/icon-umb-settings.js",
+},{
+name: "icon-umb-users",
+legacy: true,
+path: "./icons/icon-umb-users.js",
+},{
+name: "icon-umbrella",
+
+path: "./icons/icon-umbrella.js",
+},{
+name: "icon-undo",
+
+path: "./icons/icon-undo.js",
+},{
+name: "icon-unlocked",
+
+path: "./icons/icon-unlocked.js",
+},{
+name: "icon-untitled",
+legacy: true,
+path: "./icons/icon-untitled.js",
+},{
+name: "icon-usb-connector",
+legacy: true,
+path: "./icons/icon-usb-connector.js",
+},{
+name: "icon-usb",
+
+path: "./icons/icon-usb.js",
+},{
+name: "icon-user-female",
+legacy: true,
+path: "./icons/icon-user-female.js",
+},{
+name: "icon-user-females-alt",
+legacy: true,
+path: "./icons/icon-user-females-alt.js",
+},{
+name: "icon-user-females",
+legacy: true,
+path: "./icons/icon-user-females.js",
+},{
+name: "icon-user-glasses",
+legacy: true,
+path: "./icons/icon-user-glasses.js",
+},{
+name: "icon-user",
+
+path: "./icons/icon-user.js",
+},{
+name: "icon-users-alt",
+legacy: true,
+path: "./icons/icon-users-alt.js",
+},{
+name: "icon-users",
+
+path: "./icons/icon-users.js",
+},{
+name: "icon-utilities",
+
+path: "./icons/icon-utilities.js",
+},{
+name: "icon-vcard",
+
+path: "./icons/icon-vcard.js",
+},{
+name: "icon-video",
+
+path: "./icons/icon-video.js",
+},{
+name: "icon-voice",
+
+path: "./icons/icon-voice.js",
+},{
+name: "icon-wall-plug",
+
+path: "./icons/icon-wall-plug.js",
+},{
+name: "icon-wallet",
+
+path: "./icons/icon-wallet.js",
+},{
+name: "icon-wand",
+
+path: "./icons/icon-wand.js",
+},{
+name: "icon-webhook",
+
+path: "./icons/icon-webhook.js",
+},{
+name: "icon-weight",
+
+path: "./icons/icon-weight.js",
+},{
+name: "icon-width",
+
+path: "./icons/icon-width.js",
+},{
+name: "icon-wifi",
+
+path: "./icons/icon-wifi.js",
+},{
+name: "icon-window-popin",
+
+path: "./icons/icon-window-popin.js",
+},{
+name: "icon-window-sizes",
+
+path: "./icons/icon-window-sizes.js",
+},{
+name: "icon-wine-glass",
+
+path: "./icons/icon-wine-glass.js",
+},{
+name: "icon-wrench",
+
+path: "./icons/icon-wrench.js",
+},{
+name: "icon-wrong",
+
+path: "./icons/icon-wrong.js",
+},{
+name: "icon-zip",
+
+path: "./icons/icon-zip.js",
+},{
+name: "icon-zom-out",
+legacy: true,
+path: "./icons/icon-zom-out.js",
+},{
+name: "icon-zoom-in",
+
+path: "./icons/icon-zoom-in.js",
+},{
+name: "icon-zoom-out",
+
+path: "./icons/icon-zoom-out.js",
+},{
+name: "icon-star",
+
+path: "./icons/icon-star.js",
+},{
+name: "icon-database",
+
+path: "./icons/icon-database.js",
+},{
+name: "icon-azure",
+
+path: "./icons/icon-azure.js",
+},{
+name: "icon-facebook",
+
+path: "./icons/icon-facebook.js",
+},{
+name: "icon-gitbook",
+
+path: "./icons/icon-gitbook.js",
+},{
+name: "icon-github",
+
+path: "./icons/icon-github.js",
+},{
+name: "icon-gitlab",
+
+path: "./icons/icon-gitlab.js",
+},{
+name: "icon-google",
+
+path: "./icons/icon-google.js",
+},{
+name: "icon-linkedin",
+
+path: "./icons/icon-linkedin.js",
+},{
+name: "icon-mastodon",
+
+path: "./icons/icon-mastodon.js",
+},{
+name: "icon-microsoft",
+
+path: "./icons/icon-microsoft.js",
+},{
+name: "icon-twitter-x",
+
+path: "./icons/icon-twitter-x.js",
+},{
+name: "icon-umbraco",
+
+path: "./icons/icon-umbraco.js",
+},{
+name: "icon-art-easel",
+legacy: true,
+path: "./icons/icon-art-easel.js",
+},{
+name: "icon-article",
+legacy: true,
+path: "./icons/icon-article.js",
+},{
+name: "icon-auction-hammer",
+legacy: true,
+path: "./icons/icon-auction-hammer.js",
+},{
+name: "icon-baby-stroller",
+legacy: true,
+path: "./icons/icon-baby-stroller.js",
+},{
+name: "icon-badge-count",
+legacy: true,
+path: "./icons/icon-badge-count.js",
+},{
+name: "icon-band-aid",
+legacy: true,
+path: "./icons/icon-band-aid.js",
+},{
+name: "icon-bill-dollar",
+legacy: true,
+path: "./icons/icon-bill-dollar.js",
+},{
+name: "icon-bill-euro",
+legacy: true,
+path: "./icons/icon-bill-euro.js",
+},{
+name: "icon-bill-pound",
+legacy: true,
+path: "./icons/icon-bill-pound.js",
+},{
+name: "icon-bill-yen",
+legacy: true,
+path: "./icons/icon-bill-yen.js",
+},{
+name: "icon-bill",
+legacy: true,
+path: "./icons/icon-bill.js",
+},{
+name: "icon-billboard",
+legacy: true,
+path: "./icons/icon-billboard.js",
+},{
+name: "icon-bills-dollar",
+legacy: true,
+path: "./icons/icon-bills-dollar.js",
+},{
+name: "icon-bills-euro",
+legacy: true,
+path: "./icons/icon-bills-euro.js",
+},{
+name: "icon-bills-pound",
+legacy: true,
+path: "./icons/icon-bills-pound.js",
+},{
+name: "icon-bills-yen",
+legacy: true,
+path: "./icons/icon-bills-yen.js",
+},{
+name: "icon-bills",
+legacy: true,
+path: "./icons/icon-bills.js",
+},{
+name: "icon-binoculars",
+legacy: true,
+path: "./icons/icon-binoculars.js",
+},{
+name: "icon-blueprint",
+legacy: true,
+path: "./icons/icon-blueprint.js",
+},{
+name: "icon-bomb",
+legacy: true,
+path: "./icons/icon-bomb.js",
+},{
+name: "icon-cash-register",
+legacy: true,
+path: "./icons/icon-cash-register.js",
+},{
+name: "icon-checkbox-dotted-active",
+legacy: true,
+path: "./icons/icon-checkbox-dotted-active.js",
+},{
+name: "icon-chess",
+legacy: true,
+path: "./icons/icon-chess.js",
+},{
+name: "icon-circus",
+legacy: true,
+path: "./icons/icon-circus.js",
+},{
+name: "icon-clothes-hanger",
+legacy: true,
+path: "./icons/icon-clothes-hanger.js",
+},{
+name: "icon-coin",
+legacy: true,
+path: "./icons/icon-coin.js",
+},{
+name: "icon-coins-dollar-alt",
+legacy: true,
+path: "./icons/icon-coins-dollar-alt.js",
+},{
+name: "icon-coins-dollar",
+legacy: true,
+path: "./icons/icon-coins-dollar.js",
+},{
+name: "icon-coins-euro-alt",
+legacy: true,
+path: "./icons/icon-coins-euro-alt.js",
+},{
+name: "icon-coins-euro",
+legacy: true,
+path: "./icons/icon-coins-euro.js",
+},{
+name: "icon-coins-pound-alt",
+legacy: true,
+path: "./icons/icon-coins-pound-alt.js",
+},{
+name: "icon-coins-pound",
+legacy: true,
+path: "./icons/icon-coins-pound.js",
+},{
+name: "icon-coins-yen-alt",
+legacy: true,
+path: "./icons/icon-coins-yen-alt.js",
+},{
+name: "icon-coins-yen",
+legacy: true,
+path: "./icons/icon-coins-yen.js",
+},{
+name: "icon-comb",
+legacy: true,
+path: "./icons/icon-comb.js",
+},{
+name: "icon-desk",
+legacy: true,
+path: "./icons/icon-desk.js",
+},{
+name: "icon-dollar-bag",
+legacy: true,
+path: "./icons/icon-dollar-bag.js",
+},{
+name: "icon-eject",
+legacy: true,
+path: "./icons/icon-eject.js",
+},{
+name: "icon-euro-bag",
+legacy: true,
+path: "./icons/icon-euro-bag.js",
+},{
+name: "icon-female-symbol",
+legacy: true,
+path: "./icons/icon-female-symbol.js",
+},{
+name: "icon-firewall",
+legacy: true,
+path: "./icons/icon-firewall.js",
+},{
+name: "icon-folder-open",
+legacy: true,
+path: "./icons/icon-folder-open.js",
+},{
+name: "icon-folder-outline",
+legacy: true,
+path: "./icons/icon-folder-outline.js",
+},{
+name: "icon-handprint",
+legacy: true,
+path: "./icons/icon-handprint.js",
+},{
+name: "icon-hat",
+legacy: true,
+path: "./icons/icon-hat.js",
+},{
+name: "icon-hd",
+legacy: true,
+path: "./icons/icon-hd.js",
+},{
+name: "icon-inactive-line",
+legacy: true,
+path: "./icons/icon-inactive-line.js",
+},{
+name: "icon-keychain",
+legacy: true,
+path: "./icons/icon-keychain.js",
+},{
+name: "icon-keyhole",
+legacy: true,
+path: "./icons/icon-keyhole.js",
+},{
+name: "icon-linux-tux",
+legacy: true,
+path: "./icons/icon-linux-tux.js",
+},{
+name: "icon-male-and-female",
+legacy: true,
+path: "./icons/icon-male-and-female.js",
+},{
+name: "icon-male-symbol",
+legacy: true,
+path: "./icons/icon-male-symbol.js",
+},{
+name: "icon-molecular-network",
+legacy: true,
+path: "./icons/icon-molecular-network.js",
+},{
+name: "icon-molecular",
+legacy: true,
+path: "./icons/icon-molecular.js",
+},{
+name: "icon-os-x",
+legacy: true,
+path: "./icons/icon-os-x.js",
+},{
+name: "icon-pants",
+legacy: true,
+path: "./icons/icon-pants.js",
+},{
+name: "icon-parachute-drop",
+legacy: true,
+path: "./icons/icon-parachute-drop.js",
+},{
+name: "icon-parental-control",
+legacy: true,
+path: "./icons/icon-parental-control.js",
+},{
+name: "icon-path",
+legacy: true,
+path: "./icons/icon-path.js",
+},{
+name: "icon-piracy",
+legacy: true,
+path: "./icons/icon-piracy.js",
+},{
+name: "icon-poker-chip",
+legacy: true,
+path: "./icons/icon-poker-chip.js",
+},{
+name: "icon-pound-bag",
+legacy: true,
+path: "./icons/icon-pound-bag.js",
+},{
+name: "icon-receipt-dollar",
+legacy: true,
+path: "./icons/icon-receipt-dollar.js",
+},{
+name: "icon-receipt-euro",
+legacy: true,
+path: "./icons/icon-receipt-euro.js",
+},{
+name: "icon-receipt-pound",
+legacy: true,
+path: "./icons/icon-receipt-pound.js",
+},{
+name: "icon-receipt-yen",
+legacy: true,
+path: "./icons/icon-receipt-yen.js",
+},{
+name: "icon-road",
+legacy: true,
+path: "./icons/icon-road.js",
+},{
+name: "icon-safe",
+legacy: true,
+path: "./icons/icon-safe.js",
+},{
+name: "icon-safedial",
+legacy: true,
+path: "./icons/icon-safedial.js",
+},{
+name: "icon-sandbox-toys",
+legacy: true,
+path: "./icons/icon-sandbox-toys.js",
+},{
+name: "icon-security-camera",
+legacy: true,
+path: "./icons/icon-security-camera.js",
+},{
+name: "icon-settings-alt-2",
+legacy: true,
+path: "./icons/icon-settings-alt-2.js",
+},{
+name: "icon-share-alt-2",
+legacy: true,
+path: "./icons/icon-share-alt-2.js",
+},{
+name: "icon-shorts",
+legacy: true,
+path: "./icons/icon-shorts.js",
+},{
+name: "icon-simcard",
+legacy: true,
+path: "./icons/icon-simcard.js",
+},{
+name: "icon-tab",
+legacy: true,
+path: "./icons/icon-tab.js",
+},{
+name: "icon-tactics",
+legacy: true,
+path: "./icons/icon-tactics.js",
+},{
+name: "icon-theif",
+legacy: true,
+path: "./icons/icon-theif.js",
+},{
+name: "icon-thought-bubble",
+legacy: true,
+path: "./icons/icon-thought-bubble.js",
+},{
+name: "icon-twitter",
+legacy: true,
+path: "./icons/icon-twitter.js",
+},{
+name: "icon-umb-contour",
+legacy: true,
+path: "./icons/icon-umb-contour.js",
+},{
+name: "icon-umb-deploy",
+legacy: true,
+path: "./icons/icon-umb-deploy.js",
+},{
+name: "icon-umb-members",
+legacy: true,
+path: "./icons/icon-umb-members.js",
+},{
+name: "icon-universal",
+legacy: true,
+path: "./icons/icon-universal.js",
+},{
+name: "icon-war",
+legacy: true,
+path: "./icons/icon-war.js",
+},{
+name: "icon-windows",
+legacy: true,
+path: "./icons/icon-windows.js",
+},{
+name: "icon-yen-bag",
+legacy: true,
+path: "./icons/icon-yen-bag.js",
+}];
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/index.ts
index bfae467f5a..0ede7960cd 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/index.ts
@@ -1 +1,4 @@
+export * from './icon-registry.context-token.js';
+export * from './icon-registry.context.js';
export * from './icon.registry.js';
+export * from './types.js';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/manifests.ts
new file mode 100644
index 0000000000..55678e75ea
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/manifests.ts
@@ -0,0 +1,14 @@
+export const manifests = [
+ {
+ type: 'icons',
+ alias: 'Umb.Icons.Backoffice',
+ name: 'Backoffice Icons',
+ js: () => import('./icons/icons.js'),
+ },
+ {
+ type: 'globalContext',
+ alias: 'Umb.GlobalContext.Icons',
+ name: 'Icons Context',
+ api: () => import('./icon-registry.context.js'),
+ },
+];
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/types.ts
new file mode 100644
index 0000000000..d4f1f8a98c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/types.ts
@@ -0,0 +1,7 @@
+export interface UmbIconDefinition {
+ name: string;
+ path: string;
+ legacy?: boolean;
+}
+
+export type UmbIconDictionary = Array;
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts
index 63bd854535..8e110bfebe 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts
@@ -6,6 +6,7 @@ import { manifests as cultureManifests } from './culture/manifests.js';
import { manifests as debugManifests } from './debug/manifests.js';
import { manifests as entityActionManifests } from './entity-action/manifests.js';
import { manifests as extensionManifests } from './extension-registry/manifests.js';
+import { manifests as iconRegistryManifests } from './icon-registry/manifests.js';
import { manifests as localizationManifests } from './localization/manifests.js';
import { manifests as modalManifests } from './modal/common/manifests.js';
import { manifests as propertyActionManifests } from './property-action/manifests.js';
@@ -23,6 +24,7 @@ import type { ManifestTypes, UmbBackofficeManifestKind } from './extension-regis
export const manifests: Array = [
...authManifests,
...extensionManifests,
+ ...iconRegistryManifests,
...cultureManifests,
...localizationManifests,
...themeManifests,
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/confirm/confirm-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/confirm/confirm-modal.element.ts
index a994540316..0e236841bf 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/confirm/confirm-modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/confirm/confirm-modal.element.ts
@@ -1,7 +1,7 @@
import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import type { UmbConfirmModalData, UmbConfirmModalValue, UmbModalContext } from '@umbraco-cms/backoffice/modal';
-import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
+import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element';
@customElement('umb-confirm-modal')
export class UmbConfirmModalElement extends UmbLitElement {
@@ -31,7 +31,8 @@ export class UmbConfirmModalElement extends UmbLitElement {
color="${this.data?.color || 'positive'}"
look="primary"
label="${this.data?.confirmLabel || 'Confirm'}"
- @click=${this._handleConfirm}>
+ @click=${this._handleConfirm}
+ ${umbFocus()}>
`;
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/icon-picker/icon-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/icon-picker/icon-picker-modal.element.ts
index 6d454f5156..9df97c18cb 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/icon-picker/icon-picker-modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/icon-picker/icon-picker-modal.element.ts
@@ -1,81 +1,97 @@
-import icons from '../../../icon-registry/icons/icons.json' assert { type: 'json' };
-import type { UUIColorSwatchesEvent } from '@umbraco-cms/backoffice/external/uui';
+import type { UUIColorSwatchesEvent, UUIIconElement } from '@umbraco-cms/backoffice/external/uui';
-import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit';
+import { css, html, customElement, state, repeat, query, nothing } from '@umbraco-cms/backoffice/external/lit';
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import type { UmbIconPickerModalData, UmbIconPickerModalValue } from '@umbraco-cms/backoffice/modal';
import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal';
import { extractUmbColorVariable, umbracoColors } from '@umbraco-cms/backoffice/resources';
import { umbFocus } from '@umbraco-cms/backoffice/lit-element';
+import { UMB_ICON_REGISTRY_CONTEXT, type UmbIconDefinition } from '@umbraco-cms/backoffice/icon';
-// TODO: Make use of UmbPickerLayoutBase
-// TODO: to prevent element extension we need to move the Picker logic into a separate class we can reuse across all pickers
@customElement('umb-icon-picker-modal')
export class UmbIconPickerModalElement extends UmbModalBaseElement {
- private _iconList = icons.filter((icon) => !icon.legacy);
+ #icons?: Array;
+
+ @query('#search')
+ private _searchInput?: HTMLInputElement;
@state()
- private _iconListFiltered: Array<(typeof icons)[0]> = [];
+ private _iconsFiltered?: Array;
@state()
- private _colorList = umbracoColors;
+ private _colorList = umbracoColors.filter((color) => !color.legacy);
@state()
- private _modalValue?: UmbIconPickerModalValue;
+ private _currentIcon?: string;
@state()
- private _currentAlias = 'text';
+ private _currentColor = 'text';
- #changeIcon(e: { target: HTMLInputElement; type: string; key: unknown }) {
- if (e.type == 'click' || (e.type == 'keyup' && e.key == 'Enter')) {
- this.modalContext?.updateValue({ icon: e.target.id });
- }
+ constructor() {
+ super();
+ this.consumeContext(UMB_ICON_REGISTRY_CONTEXT, (context) => {
+ this.observe(context.approvedIcons, (icons) => {
+ this.#icons = icons;
+ this.#filterIcons();
+ });
+ });
}
- #filterIcons(e: { target: HTMLInputElement }) {
- if (e.target.value) {
- this._iconListFiltered = this._iconList.filter((icon) =>
- icon.name.toLowerCase().includes(e.target.value.toLowerCase()),
- );
+ #filterIcons() {
+ if (!this.#icons) return;
+ const value = this._searchInput?.value;
+ if (value) {
+ this._iconsFiltered = this.#icons.filter((icon) => icon.name.toLowerCase().includes(value.toLowerCase()));
} else {
- this._iconListFiltered = this._iconList;
+ this._iconsFiltered = this.#icons;
}
}
- #onColorChange(e: UUIColorSwatchesEvent) {
- this.modalContext?.updateValue({ color: e.target.value });
- this._currentAlias = e.target.value;
- }
-
connectedCallback() {
super.connectedCallback();
- this._iconListFiltered = this._iconList;
+ this._iconsFiltered = this.#icons;
if (this.modalContext) {
this.observe(
this.modalContext?.value,
(newValue) => {
- this._modalValue = newValue;
- this._currentAlias = newValue?.color ?? 'text';
+ this._currentIcon = newValue?.icon;
+ this._currentColor = newValue?.color ?? 'text';
},
'_observeModalContextValue',
);
}
}
+ #changeIcon(e: InputEvent | KeyboardEvent) {
+ if (e.type == 'click' || (e.type == 'keyup' && (e as KeyboardEvent).key == 'Enter')) {
+ const iconName = (e.target as UUIIconElement).name;
+ if (iconName) {
+ this.modalContext?.updateValue({ icon: iconName });
+ }
+ }
+ }
+
+ #onColorChange(e: UUIColorSwatchesEvent) {
+ const colorAlias = e.target.value;
+ this.modalContext?.updateValue({ color: colorAlias });
+ this._currentColor = colorAlias;
+ }
+
render() {
+ // TODO: Missing localization in general. [NL]
return html`
- ${this.renderSearchbar()}
+ ${this.renderSearch()}
${
- // TODO: Missing translation for the color aliases.
+ // TODO: Missing localization for the color aliases. [NL]
this._colorList.map(
(color) => html`
- ${this.renderIconSelection()}
+ ${this.renderIcons()}
-
+
`;
}
- renderIconSelection() {
- return repeat(
- this._iconListFiltered,
- (icon) => icon.name,
- (icon) => html`
-
-
- `,
- );
+ renderIcons() {
+ return this._iconsFiltered
+ ? repeat(
+ this._iconsFiltered,
+ (icon) => icon.name,
+ (icon) => html`
+
+
+
+
+ `,
+ )
+ : nothing;
}
static styles = [
@@ -160,15 +177,15 @@ export class UmbIconPickerModalElement extends UmbModalBaseElement = [
eyeDropper,
iconPicker,
label,
- memberPicker,
multipleTextString,
multiUrlPicker,
numberRange,
orderDirection,
overlaySize,
radioButtonList,
+ select,
slider,
textArea,
toggle,
uploadField,
- userPicker,
valueType,
...collectionView,
...numbers,
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/member-picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/member-picker/manifests.ts
deleted file mode 100644
index c8c52770e4..0000000000
--- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/member-picker/manifests.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/extension-registry';
-
-export const manifest: ManifestPropertyEditorUi = {
- type: 'propertyEditorUi',
- alias: 'Umb.PropertyEditorUi.MemberPicker',
- name: 'Member Picker Property Editor UI',
- element: () => import('./property-editor-ui-member-picker.element.js'),
- meta: {
- label: 'Member Picker',
- propertyEditorSchemaAlias: 'Umbraco.MemberPicker',
- icon: 'icon-user',
- group: 'people',
- },
-};
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/select/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/select/manifests.ts
new file mode 100644
index 0000000000..06657a35e6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/select/manifests.ts
@@ -0,0 +1,22 @@
+import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/extension-registry';
+
+export const manifest: ManifestPropertyEditorUi = {
+ type: 'propertyEditorUi',
+ alias: 'Umb.PropertyEditorUi.Select',
+ name: 'Select Property Editor UI',
+ element: () => import('./property-editor-ui-select.element.js'),
+ meta: {
+ label: 'Select',
+ icon: 'icon-list',
+ group: 'pickers',
+ settings: {
+ properties: [
+ {
+ alias: 'items',
+ label: 'Add options',
+ propertyEditorUiAlias: 'Umb.PropertyEditorUi.MultipleTextString',
+ },
+ ],
+ },
+ },
+};
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/select/property-editor-ui-select.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/select/property-editor-ui-select.element.ts
new file mode 100644
index 0000000000..6397494094
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/select/property-editor-ui-select.element.ts
@@ -0,0 +1,42 @@
+import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit';
+import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
+import { UmbPropertyValueChangeEvent } from '@umbraco-cms/backoffice/property-editor';
+import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor';
+import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry';
+import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui';
+
+/**
+ * @element umb-property-editor-ui-select
+ */
+@customElement('umb-property-editor-ui-select')
+export class UmbPropertyEditorUISelectElement extends UmbLitElement implements UmbPropertyEditorUiElement {
+ @property()
+ value?: string = '';
+
+ @state()
+ private _list: Array
`
- : html`${nothing}`;
+ : nothing;
}
#renderDashboards() {
@@ -117,7 +117,7 @@ export class UmbSectionMainViewElement extends UmbLitElement {
})}
`
- : '';
+ : nothing;
}
#renderViews() {
@@ -140,7 +140,7 @@ export class UmbSectionMainViewElement extends UmbLitElement {
})}
`
- : '';
+ : nothing;
}
static styles = [
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/submit/submit.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/submit/submit.action.ts
index 1656a63439..03af0c4306 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/submit/submit.action.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/submit/submit.action.ts
@@ -23,6 +23,8 @@ export class UmbSubmitWorkspaceAction extends UmbWorkspaceActionBase {
diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts
index 23019e7fa2..761b8b7422 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts
@@ -9,7 +9,7 @@ import type {
import { DocumentTypeService } from '@umbraco-cms/backoffice/external/backend-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources';
-import type { UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type';
+import type { UmbPropertyContainerTypes, UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type';
/**
* A data source for the Document Type that fetches data from the server
@@ -236,7 +236,15 @@ export class UmbDocumentTypeDetailServerDataSource implements UmbDetailDataSourc
appearance: property.appearance,
};
}),
- containers: model.containers,
+ containers: model.containers.map((container) => {
+ return {
+ id: container.id,
+ parent: container.parent ? { id: container.parent.id } : null,
+ name: container.name ?? '',
+ type: container.type as UmbPropertyContainerTypes, // TODO: check if the value is valid
+ sortOrder: container.sortOrder,
+ };
+ }),
allowedDocumentTypes: model.allowedContentTypes.map((allowedContentType) => {
return {
documentType: { id: allowedContentType.contentType.unique },
diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.server.data-source.ts
index a8908fa616..55f1efb5d1 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.server.data-source.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.server.data-source.ts
@@ -9,7 +9,7 @@ import type {
import { MediaTypeService } from '@umbraco-cms/backoffice/external/backend-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources';
-import type { UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type';
+import type { UmbPropertyContainerTypes, UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type';
/**
* A data source for the Media Type that fetches data from the server
@@ -100,7 +100,15 @@ export class UmbMediaTypeServerDataSource implements UmbDetailDataSource {
+ return {
+ id: container.id,
+ parent: container.parent ? { id: container.parent.id } : null,
+ name: container.name ?? '',
+ type: container.type as UmbPropertyContainerTypes, // TODO: check if the value is valid
+ sortOrder: container.sortOrder,
+ };
+ }),
allowedContentTypes: data.allowedMediaTypes.map((allowedMediaType) => {
return {
contentType: { unique: allowedMediaType.mediaType.id },
diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts
index aac637749c..118babc5a9 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts
@@ -104,7 +104,7 @@ export class UmbMemberTypeServerDataSource implements UmbDetailDataSource = [
+ {
+ type: 'propertyEditorUi',
+ alias: 'Umb.PropertyEditorUi.MemberPicker',
+ name: 'Member Picker Property Editor UI',
+ element: () => import('./property-editor-ui-member-picker.element.js'),
+ meta: {
+ label: 'Member Picker',
+ propertyEditorSchemaAlias: 'Umbraco.MemberPicker',
+ icon: 'icon-user',
+ group: 'people',
+ },
+ },
+];
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/member-picker/property-editor-ui-member-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/property-editor/member-picker/property-editor-ui-member-picker.element.ts
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/member-picker/property-editor-ui-member-picker.element.ts
rename to src/Umbraco.Web.UI.Client/src/packages/members/member/property-editor/member-picker/property-editor-ui-member-picker.element.ts
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/member-picker/property-editor-ui-member-picker.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/property-editor/member-picker/property-editor-ui-member-picker.stories.ts
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/member-picker/property-editor-ui-member-picker.stories.ts
rename to src/Umbraco.Web.UI.Client/src/packages/members/member/property-editor/member-picker/property-editor-ui-member-picker.stories.ts
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/member-picker/property-editor-ui-member-picker.test.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/property-editor/member-picker/property-editor-ui-member-picker.test.ts
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/member-picker/property-editor-ui-member-picker.test.ts
rename to src/Umbraco.Web.UI.Client/src/packages/members/member/property-editor/member-picker/property-editor-ui-member-picker.test.ts
diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/mfa-providers-current-user-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/mfa-providers-current-user-app.element.ts
deleted file mode 100644
index f48ab2e4ed..0000000000
--- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/mfa-providers-current-user-app.element.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { UMB_CURRENT_USER_MFA_MODAL } from '../modals/current-user-mfa/current-user-mfa-modal.token.js';
-import { html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit';
-import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
-import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
-import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
-import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
-import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs';
-
-@customElement('umb-mfa-providers-current-user-app')
-export class UmbMfaProvidersCurrentUserAppElement extends UmbLitElement {
- @state()
- _hasProviders = false;
-
- constructor() {
- super();
- this.#init();
- }
-
- async #init() {
- this._hasProviders = (await firstValueFrom(umbExtensionsRegistry.byType('mfaLoginProvider'))).length > 0;
- }
-
- render() {
- if (!this._hasProviders) {
- return nothing;
- }
-
- return html`
-
-
- Configure Two Factor
-
- `;
- }
-
- async #onClick() {
- const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
- await modalManagerContext.open(this, UMB_CURRENT_USER_MFA_MODAL).onSubmit();
- }
-
- static styles = [UmbTextStyles];
-}
-
-export default UmbMfaProvidersCurrentUserAppElement;
-
-declare global {
- interface HTMLElementTagNameMap {
- 'umb-mfa-providers-current-user-app': UmbMfaProvidersCurrentUserAppElement;
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user-mfa/current-user-mfa-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user-mfa/current-user-mfa-modal.element.ts
index c2a2f04bd0..ffa32541ae 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user-mfa/current-user-mfa-modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user-mfa/current-user-mfa-modal.element.ts
@@ -79,9 +79,7 @@ export class UmbCurrentUserMfaModalElement extends UmbLitElement {
)}
-
- ${this.localize.term('general_close')}
-
+
`;
@@ -98,7 +96,6 @@ export class UmbCurrentUserMfaModalElement extends UmbLitElement {
() => html`
This two-factor provider is enabled
-
-
- ${this.localize.term('general_close')}
-
+
`;
@@ -98,7 +96,6 @@ export class UmbUserMfaModalElement extends UmbLitElement {
() => html`
This two-factor provider is enabled
-
= [
+ {
+ type: 'propertyEditorUi',
+ alias: 'Umb.PropertyEditorUi.UserPicker',
+ name: 'User Picker Property Editor UI',
+ element: () => import('./property-editor-ui-user-picker.element.js'),
+ meta: {
+ label: 'User Picker',
+ propertyEditorSchemaAlias: 'Umbraco.UserPicker',
+ icon: 'icon-user',
+ group: 'people',
+ },
+ },
+];
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/user-picker/property-editor-ui-user-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/property-editor/user-picker/property-editor-ui-user-picker.element.ts
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/user-picker/property-editor-ui-user-picker.element.ts
rename to src/Umbraco.Web.UI.Client/src/packages/user/user/property-editor/user-picker/property-editor-ui-user-picker.element.ts
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/user-picker/property-editor-ui-user-picker.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/property-editor/user-picker/property-editor-ui-user-picker.stories.ts
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/user-picker/property-editor-ui-user-picker.stories.ts
rename to src/Umbraco.Web.UI.Client/src/packages/user/user/property-editor/user-picker/property-editor-ui-user-picker.stories.ts
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/user-picker/property-editor-ui-user-picker.test.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/property-editor/user-picker/property-editor-ui-user-picker.test.ts
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/user-picker/property-editor-ui-user-picker.test.ts
rename to src/Umbraco.Web.UI.Client/src/packages/user/user/property-editor/user-picker/property-editor-ui-user-picker.test.ts