diff --git a/docs/widgets.md b/docs/widgets.md
index 109bdf2a..7cf34112 100644
--- a/docs/widgets.md
+++ b/docs/widgets.md
@@ -261,6 +261,32 @@ Shows recent price history for a given publicly-traded stock or share
apiKey: PGUWSWD6CZTXMT8N
```
+### Joke
+
+Renders a programming or generic joke. Data is fetched from the [JokesAPI](https://github.com/Sv443/JokeAPI) by @Sv443
+
+

+
+##### Options
+
+**Field** | **Type** | **Required** | **Description**
+--- | --- | --- | ---
+**`category`** | `string` | _Optional_ | Set the category of jokes to return. Use a string to specify a single category, or an array to pass in multiple options. Available options are: `all`, `programming`, `pun`, `dark`, `spooky`, `christmas` and `misc`. An up-to-date list of supported categories can be found [here](https://v2.jokeapi.dev/categories). Defaults to `all`
+**`safeMode`** | `boolean` | _Optional_ | Set to `true`, to prevent the fetching of any NSFW jokes. Defaults to `false`
+**`language`** | `string` | _Optional_ | Specify the language for returned jokes. The following languages are supported: `en`, `cs`, `de`, `es`, `fr` and `pt`, and an up-to-date list of supported languages can be found [here](https://v2.jokeapi.dev/languages). By default, your system language will be used, if it's supported, otherwise English
+
+##### Example
+
+```yaml
+- name: Joke
+ icon: fas fa-laugh
+ type: joke
+ options:
+ safeMode: true
+ language: en
+ category: Programming
+```
+
---
## Dynamic Widgets
diff --git a/src/components/Widgets/Jokes.vue b/src/components/Widgets/Jokes.vue
new file mode 100644
index 00000000..ebbaf83e
--- /dev/null
+++ b/src/components/Widgets/Jokes.vue
@@ -0,0 +1,92 @@
+
+
+
{{ jokeLine1 }}
+
{{ jokeLine2 }}
+
+
+
+
+
+
diff --git a/src/components/Widgets/WidgetBase.vue b/src/components/Widgets/WidgetBase.vue
index ba78aae4..678f0b6e 100644
--- a/src/components/Widgets/WidgetBase.vue
+++ b/src/components/Widgets/WidgetBase.vue
@@ -19,6 +19,7 @@
+
@@ -33,6 +34,7 @@ import CryptoWatchList from '@/components/Widgets/CryptoWatchList.vue';
import XkcdComic from '@/components/Widgets/XkcdComic.vue';
import ExchangeRates from '@/components/Widgets/ExchangeRates.vue';
import StockPriceChart from '@/components/Widgets/StockPriceChart.vue';
+import Jokes from '@/components/Widgets/Jokes.vue';
import Collapsable from '@/components/LinkItems/Collapsable.vue';
export default {
@@ -48,6 +50,7 @@ export default {
XkcdComic,
ExchangeRates,
StockPriceChart,
+ Jokes,
},
props: {
widget: Object,
diff --git a/src/utils/defaults.js b/src/utils/defaults.js
index 8f978675..1e3d7a24 100644
--- a/src/utils/defaults.js
+++ b/src/utils/defaults.js
@@ -213,6 +213,7 @@ module.exports = {
xkcdComic: 'https://xkcd.vercel.app/',
exchangeRates: 'https://v6.exchangerate-api.com/v6/',
stockPriceChart: 'https://www.alphavantage.co/query',
+ jokes: 'https://v2.jokeapi.dev/joke/',
},
/* URLs for web search engines */
searchEngineUrls: {