diff --git a/docs/pages/kicon.vue b/docs/pages/kicon.vue index c4aa74cb2..a8621dcce 100644 --- a/docs/pages/kicon.vue +++ b/docs/pages/kicon.vue @@ -2,7 +2,7 @@ - See for design guidance and a list of available icons. + See for design guidance and a list of available icons. If an invalid icon is used, in development Vue.js validation will warn about the error. The icon will display as a broken image icon. diff --git a/docs/rstIconReplacements.txt b/docs/rstIconReplacements.txt index 6bc778115..c5a808e6f 100644 --- a/docs/rstIconReplacements.txt +++ b/docs/rstIconReplacements.txt @@ -8,6 +8,7 @@ .. |back| replace:: :raw-html:`` .. |bookmarkEmpty| replace:: :raw-html:`` .. |bookmark| replace:: :raw-html:`` +.. |brokenImage| replace:: :raw-html:`` .. |channel| replace:: :raw-html:`` .. |checked| replace:: :raw-html:`` .. |check| replace:: :raw-html:`` diff --git a/lib/KIcon/iconDefinitions.js b/lib/KIcon/iconDefinitions.js index 1dea79c3a..04a66bc7f 100644 --- a/lib/KIcon/iconDefinitions.js +++ b/lib/KIcon/iconDefinitions.js @@ -1,4 +1,4 @@ -import { themeTokens } from '../styles/theme'; +import { themePalette, themeTokens } from '../styles/theme'; /** * Defines all icons in the Kolibri Design System @@ -60,6 +60,10 @@ const KolibriIcons = { icon: require('./precompiled-icons/material-icons/error/baseline.vue').default, defaultColor: themeTokens().error, }, + brokenImage: { + icon: require('./precompiled-icons/material-icons/broken_image/baseline.vue').default, + defaultColor: themePalette().grey.v_400, + }, // Features and links learn: { icon: require('./precompiled-icons/material-icons/school/baseline.vue').default }, diff --git a/lib/KIcon/index.vue b/lib/KIcon/index.vue index ed0d92118..4ebb1afc6 100644 --- a/lib/KIcon/index.vue +++ b/lib/KIcon/index.vue @@ -50,22 +50,28 @@ }, }, computed: { + selectedIcon() { + if (!KolibriIcons[this.icon]) { + return KolibriIcons.brokenImage; + } + return KolibriIcons[this.icon]; + }, computedColor() { if (this.disableColor) { return null; } if (this.color) { return this.color; - } else if (KolibriIcons[this.icon].defaultColor) { - return KolibriIcons[this.icon].defaultColor; + } else if (this.selectedIcon.defaultColor) { + return this.selectedIcon.defaultColor; } return this.$themeTokens.text; }, rtlFlip() { - return KolibriIcons[this.icon].rtlFlip && this.isRtl; + return this.selectedIcon.rtlFlip && this.isRtl; }, svgIconComponent() { - return KolibriIcons[this.icon].icon; + return this.selectedIcon.icon; }, }, };