├── .gitignore ├── .idea ├── codeStyles │ └── Project.xml ├── dbnavigator.xml ├── discord.xml ├── misc.xml ├── modules.xml ├── vcs.xml └── widgetbot-docs.iml ├── .vitepress └── config.mts ├── README.md ├── bot └── moderation.md ├── embed ├── crate │ ├── api.md │ ├── examples.md │ ├── index.md │ ├── options.md │ └── tutorial.md ├── embed-api │ ├── commands.md │ ├── events.md │ └── index.md ├── html-embed │ ├── api.md │ ├── attributes.md │ ├── index.md │ └── tutorial.md ├── index.md └── react-embed │ ├── api.md │ ├── index.md │ └── props.md ├── guides ├── automod.md ├── css.md ├── custom-colors.md ├── index.md └── patreon.md ├── index.md ├── package.json ├── pnpm-lock.yaml ├── public ├── _headers ├── logo-black.svg └── logo.svg └── tutorial ├── iframes.md └── index.md /.gitignore: -------------------------------------------------------------------------------- 1 | site 2 | .DS_Store 3 | .idea/workspace.xml 4 | /.vuepress/dist/ 5 | .vitepress/dist 6 | .vitepress/cache 7 | /node_modules/ 8 | debug.log 9 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 13 | 14 | 15 | 21 | 22 | 26 | 27 | 28 | 29 | 35 | 36 | 37 | 38 | 39 | 45 | 46 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /.idea/dbnavigator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | -------------------------------------------------------------------------------- /.idea/discord.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/widgetbot-docs.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.vitepress/config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress' 2 | 3 | // https://vitepress.dev/reference/site-config 4 | export default defineConfig({ 5 | title: 'WidgetBot', 6 | description: 'Embed your Discord server on your website with WidgetBot!', 7 | cleanUrls: true, 8 | head: [ 9 | ['link', { rel: 'icon', href: '/logo.svg' }], 10 | [ 11 | 'script', 12 | { src: 'https://cdn.jsdelivr.net/npm/@widgetbot/crate@3', async: '', defer: '' }, 13 | `new Crate({ 14 | server: '299881420891881473', 15 | channel: '368427726358446110', 16 | shard: 'https://emerald.widgetbot.io' 17 | }) 18 | ` 19 | ] 20 | ], 21 | sitemap: { 22 | hostname: 'https://docs.widgetbot.io' 23 | }, 24 | themeConfig: { 25 | // https://vitepress.dev/reference/default-theme-config 26 | logo: { dark: '/logo.svg', light: '/logo-black.svg' }, 27 | nav: [ 28 | { text: 'Home', link: 'https://widgetbot.io', target: '_self' }, 29 | { text: 'Docs', link: '/', activeMatch: '^(\/$|\/[^g])' }, 30 | { text: 'Guides', link: '/guides/', activeMatch: '/guides/' }, 31 | { text: 'Pricing', link: 'https://widgetbot.io/pricing', target: '_self' }, 32 | { text: 'Blog', link: 'https://blog.widgetbot.io', target: '_self'} 33 | ], 34 | sidebar: { 35 | '/guides/': [ 36 | { 37 | text: 'Helpful Guides', 38 | link: '/guides/', 39 | items: [ 40 | { text: 'Automod', link: '/guides/automod' }, 41 | { text: 'Custom Colors', link: '/guides/custom-colors' }, 42 | ] 43 | }, 44 | ], 45 | '/': [ 46 | { 47 | text: 'WidgetBot', 48 | link: '/' 49 | }, 50 | { 51 | text: 'Tutorial', 52 | link: '/tutorial/', 53 | items: [ 54 | { text: 'Crate', link: '/embed/crate/tutorial' }, 55 | { text: 'html-embed', link: '/embed/html-embed/tutorial' }, 56 | { text: 'iframes', link: '/tutorial/iframes' } 57 | ] 58 | }, 59 | { 60 | text: 'Embed', 61 | link: '/embed/', 62 | items: [ 63 | { 64 | text: 'Crate', 65 | link: '/embed/crate/', 66 | items: [ 67 | { text: 'Intro', link: '/embed/crate/' }, 68 | { text: 'Tutorial', link: 'embed/crate/tutorial' }, 69 | { text: 'Options', link: 'embed/crate/options' }, 70 | { text: 'API', link: 'embed/crate/api' }, 71 | { text: 'Examples', link: 'embed/crate/examples' } 72 | ] 73 | }, 74 | { 75 | text: 'html-embed', 76 | link: '/embed/html-embed/', 77 | items: [ 78 | { text: 'Intro', link: '/embed/html-embed/' }, 79 | { text: 'Tutorial', link: 'embed/html-embed/tutorial' }, 80 | { text: 'Attributes', link: 'embed/html-embed/attributes' }, 81 | { text: 'API', link: 'embed/html-embed/api' } 82 | ] 83 | }, 84 | { 85 | text: 'react-embed', 86 | link: '/embed/react-embed/', 87 | items: [ 88 | { text: 'Intro', link: '/embed/react-embed/' }, 89 | { text: 'Props', link: 'embed/react-embed/props' }, 90 | { text: 'API', link: 'embed/react-embed/api' } 91 | ] 92 | }, 93 | { 94 | text: 'embed-api', 95 | link: '/embed/embed-api/', 96 | items: [ 97 | { text: 'Intro', link: '/embed/embed-api/' }, 98 | { text: 'Commands', link: 'embed/embed-api/commands' }, 99 | { text: 'Events', link: 'embed/embed-api/events' } 100 | ] 101 | } 102 | ] 103 | }, 104 | { 105 | text: 'Bot', 106 | items: [ 107 | { text: 'Moderation', link: '/bot/moderation' }, 108 | ] 109 | } 110 | ] 111 | }, 112 | socialLinks: [ 113 | { icon: 'discord', link: 'https://discord.gg/RVNmwdy' }, 114 | { icon: 'github', link: 'https://github.com/widgetbot-io/embed' }, 115 | { icon: 'twitter', link: 'https://twitter.com/widgetbot_io' } 116 | ], 117 | search: { 118 | provider: 'local' 119 | }, 120 | editLink: { 121 | pattern: 'https://github.com/widgetbot-io/documentation/edit/master/:path', 122 | text: 'Help us improve this page!' 123 | } 124 | } 125 | }) 126 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WidgetBot Docs 2 | 3 | https://docs.widgetbot.io 4 | -------------------------------------------------------------------------------- /bot/moderation.md: -------------------------------------------------------------------------------- 1 | # Moderation 2 | 3 | WidgetBot messages can be seen and deleted in Discord clients and by other bots. However, you cannot see WidgetBot user details or ban them from your server like normal users. Instead, we have set up context menu commands to let you moderate WidgetBot users as easily as moderating regular users. On mobile, you'll need to send a command for now. 4 | 5 | WidgetBot has 3 moderation actions: 6 | 7 | - **Ban**: Prevents the user who sent this message from sending more messages through WidgetBot 8 | - **Unban**: Removes a ban if the user is already banned, allowing them to send messages again 9 | - **User**: Shows some information about the user who sent the message 10 | 11 | The **Ban Members** Discord permission is required to use these. 12 | 13 | ## Context Menus 14 | 15 | You can moderate using the message context menu. In the desktop client, you can open this by right-clicking the message sent through WidgetBot. You can also open it by hovering over the message and clicking the three-dot button at the right. On mobile, hold the message. 16 | 17 | In the context menu, you should see an "Apps" button. Hover over it or tap it on mobile, and the WidgetBot commands should appear, along with commands from other applications you might have in your server. Click an action to do it. 18 | 19 | ![The context menu, showing WidgetBot's commands](https://i.imgur.com/KWk64Zd.png) 20 | 21 | :::tip Don't see it? 22 | If you have WidgetBot in your server but you do not see the Apps button, or it does not include any WidgetBot commands, you'll have to [give it access](https://discord.com/api/oauth2/authorize?client_id=543225764036870167&scope=applications.commands). In most servers, the commands should show without needing to do this. 23 | ::: 24 | 25 | ## Commands 26 | 27 | As an alternative to context menus, you can moderate with slash commands. 28 | 29 | To use the /ban or /user commands, you'll need to first copy the ID of the WidgetBot message. There are 2 ways to do this: 30 | - Enable Developer Mode in User Settings > Appearance, then hold the message to show its context menu on mobile, and tap "Copy ID" 31 | - Hold the message to show its context menu on mobile, tap "Copy Message Link", then copy just the ID at the end of the link 32 | 33 | Discord IDs are long numbers, an example is 543225764036870167. 34 | 35 | You'll need to use a WidgetBot slash command. Type / to show commands, and type the command name to filter it. 36 | - /ban id: 543225764036870167 37 | - /unban id: 543225764036870167 38 | - /user id: 543225764036870167 39 | 40 | ![WidgetBot slash command response](https://i.imgur.com/3AeucLz.png) 41 | 42 | The /unban slash command supports autocomplete to see the currently banned users and select one. You can also use the /listbans command to see all the banned users. 43 | -------------------------------------------------------------------------------- /embed/crate/api.md: -------------------------------------------------------------------------------- 1 | # Crate API 2 | 3 | Once you've initialised a new constructor, you can manipulate it using the following methods 4 | 5 | ## Crate APIs 6 | 7 | ### Toggle 8 | 9 | :::tip Definition 10 | 11 | ```ts 12 | type toggle = (open?: boolean) => void 13 | ``` 14 | ::: 15 | 16 | Toggles the widget's visibility, with an optional param to set it. 17 | 18 | ::: tip Usage 19 | 20 | ```js 21 | // Toggle 22 | crate.toggle() 23 | 24 | // Toggle open 25 | crate.toggle(true) 26 | 27 | // Toggle closed 28 | crate.toggle(false) 29 | ``` 30 | ::: 31 | Try it: 32 | 33 | 34 | 35 | --- 36 | 37 | ### Notify 38 | 39 | ::: tip Definition 40 | ```ts 41 | type notify = ( 42 | content: 43 | | string 44 | | Notification & { 45 | content: string 46 | timeout?: number 47 | } 48 | ) => { hide: Function; delete: Function } 49 | ``` 50 | ::: 51 | Displays a notification message to the user. Markdown supported 52 | 53 | ::: tip Usage 54 | ```js 55 | // Hello world 56 | crate.notify(`**hello** world`) 57 | 58 | // Display for 2 seconds + custom avatar 59 | crate.notify({ 60 | content: '`2 seconds`', 61 | timeout: 2000, 62 | avatar: 'https://cdn.discordapp.com/avatars/293731150239891456/f7d78d0c7e6522ed296bfa315b3a1969.png' 63 | }) 64 | 65 | // Programmatically hide notification 66 | const notification = crate.notify({ 67 | content: 'Test', 68 | timeout: false 69 | }) 70 | /* business logic */ 71 | notification.hide() 72 | ``` 73 | ::: 74 | Try it: 75 | 76 | 77 | --- 78 | 79 | ### Update options 80 | 81 | ::: tip Definition 82 | 83 | ```ts 84 | type setOptions = (newOptions: Options) => Options 85 | ``` 86 | ::: 87 | Updates the options for crate in real time. [Available options](options) 88 | 89 | ::: tip Usage 90 | 91 | ```js 92 | // Update an option by mutating it 93 | crate.options.color = '#'+Math.random().toString(16).slice(2, 8) // random color 94 | 95 | // Update options by passing an object 96 | crate.setOptions({ 97 | location: [-Math.random() * 200), 'right'], // Random position 98 | }) 99 | ``` 100 | ::: 101 | Try it: 102 | 103 | 104 | --- 105 | 106 | ### Visibility 107 | 108 | ::: tip Definition 109 | 110 | ```ts 111 | type hide = () => void 112 | type show = () => void 113 | ``` 114 | ::: 115 | Hides / un-hides the crate instance, eg. the button, notifications and widget 116 | 117 | ::: tip Usage 118 | 119 | ```js 120 | // Button will now disappear 121 | crate.hide() 122 | 123 | // Button will now re-appear 124 | crate.show() 125 | ``` 126 | ::: 127 | Try it: 128 | 129 | --- 130 | 131 | ### Navigation 132 | 133 | ::: tip Definition 134 | 135 | ```ts 136 | type navigate = (channelID: string) => void 137 | ``` 138 | ::: 139 | Navigates to a different channel and opens the widget if it's closed 140 | 141 | ::: tip Usage 142 | 143 | ```js 144 | // Navigates to #general 145 | crate.navigate('368427726358446110') 146 | 147 | // Navigates to #live-demo 148 | crate.navigate('355719584830980096') 149 | ``` 150 | ::: 151 | Try it: 152 | 153 | --- 154 | 155 | ## Embed API 156 | 157 | 158 | ### Emit 159 | 160 | ::: tip Definition 161 | 162 | ```ts 163 | type emit = (event: Event, data?: Events[Event]) => void 164 | ``` 165 | ::: 166 | Emits an event to the `embed-api` 167 | 168 | For details, see [embed-api commands](/embed/embed-api/commands) 169 | 170 | ::: tip Usage 171 | 172 | ```js 173 | // Navigate to a different server/channel 174 | crate.emit('navigate', { 175 | guild: '299881420891881473', 176 | channel: '368427726358446110' 177 | }) 178 | 179 | // Request login 180 | crate.emit('login') 181 | 182 | // Log out 183 | crate.emit('logout') 184 | ``` 185 | ::: 186 | --- 187 | 188 | ### On 189 | 190 | ::: tip Definition 191 | 192 | ```ts 193 | type on = (event: Event, (data?: Events[Event]) => void) => void 194 | ``` 195 | ::: 196 | Listens for a specific event from the `embed-api` 197 | 198 | For details, see [embed-api events](/embed/embed-api/events) 199 | 200 | ::: tip Usage 201 | 202 | ```js 203 | // Listens for when the user has signed in 204 | crate.on('signIn', (user) => { 205 | console.log(`User signed in as ${user.username}`, user) 206 | }) 207 | 208 | // Listen for discord message events 209 | crate.on('message', ({ message, channel }) => { 210 | console.log(`New message in #${channel.name}`, message) 211 | }) 212 | 213 | // Listen for discord message delete events 214 | crate.on('messageDelete', ({ channel, id }) => { 215 | console.log(`Message ${id} in #${channel.name} was deleted`) 216 | }) 217 | ``` 218 | ::: 219 | -------------------------------------------------------------------------------- /embed/crate/examples.md: -------------------------------------------------------------------------------- 1 | # Crate Examples 2 | 3 | ## Async 4 | 5 | ### [Default `window.crate` object](https://codepen.io/advaith1/pen/xmXpeG) 6 | 10 | 11 | ### [Custom glyph](https://codepen.io/advaith1/pen/dyMOOjb) 12 | 16 | 17 | ### [Initialising a custom crate object](https://codepen.io/advaith1/pen/MZErRx) 18 | 22 | 23 | ### [Multiple instances at the same time](https://codepen.io/advaith1/pen/oJGpRz) 24 | 28 | 29 | ### [Updating the state](https://codepen.io/advaith1/pen/jXGYoQ) 30 | 34 | 35 | ### [Dynamically interacting with the button](https://codepen.io/advaith1/pen/oJGEvY) 36 | 40 | 41 | ## Sync 42 | We recommend using the **[async](#async)** version of the API, as it'll make your website *way faster*. The synchronous version should only be used if it's being dynamically inserted into your website after the page's initial load (eg. A custom JS script) 43 | 44 | ### [Initialising a custom crate object](https://codepen.io/advaith1/pen/OrxQLv) 45 | 49 | -------------------------------------------------------------------------------- /embed/crate/index.md: -------------------------------------------------------------------------------- 1 | # Crate 2 | 3 | ![Demo](https://i.imgur.com/oq4W4Rk.gif) 4 | 5 | --- 6 | ::: tip Crate (recommended) 7 | [`@widgetbot/crate`](/embed/crate/tutorial) provides a little chat button in the corner of your website. It shows message notifications from your server and provides an extensive API. 8 | ::: 9 | 10 | ```html 11 | 17 | ``` 18 | -------------------------------------------------------------------------------- /embed/crate/options.md: -------------------------------------------------------------------------------- 1 | # Crate Options 2 | 3 | You can pass custom options to Crate when initializing it, for example: 4 | 5 | ```ts 6 | new Crate({ server: '299881420891881473', location: ['top', 'left'] }) 7 | ``` 8 | 9 | ## Definitions 10 | 11 | ::: tip TypeScript definitions 12 | 13 | ```ts 14 | type url = string 15 | type size = string 16 | 17 | export type vertical = 'top' | 'bottom' | number 18 | export type horizontal = 'left' | 'right' | number 19 | 20 | interface Options { 21 | // Server + channel IDs 22 | server: string 23 | channel?: string 24 | 25 | // Thread ID 26 | thread?: string 27 | 28 | // Dynamic username 29 | username?: string 30 | // Dynamic avatar 31 | avatar?: string 32 | 33 | // Accessibility settings 34 | accessibility?: string[] 35 | // The settings group to use 36 | settingsGroup?: string 37 | 38 | // JWT login 39 | token?: string 40 | 41 | // Where the button should appear on-screen 42 | location?: [vertical, horizontal] 43 | 44 | // The color of the button 45 | color?: string 46 | // The glyph to display on the button 47 | glyph?: [url, size] 48 | // Custom CSS to be injected into the Shadow root 49 | css?: string 50 | 51 | // Crate message notifications 52 | notifications?: boolean 53 | // Crate unread message indicator 54 | indicator?: boolean 55 | // Crate notification timeout 56 | timeout?: number 57 | 58 | // Enables notifications to be triggered for all channels, in crate and embed 59 | allChannelNotifications?: boolean 60 | // Embed notification timeout 61 | embedNotificationTimeout?: number 62 | 63 | // Only load the widget once the user opens it 64 | defer?: boolean 65 | // Connect to a custom WidgetBot server 66 | shard?: url 67 | } 68 | 69 | export default Options 70 | ``` 71 | -------------------------------------------------------------------------------- /embed/crate/tutorial.md: -------------------------------------------------------------------------------- 1 | # Crate Tutorial 2 | 3 | Welcome to the Crate tutorial! 4 | 5 | ::: warning Important 6 | **This tutorial assumes you have already completed the [Getting Started with WidgetBot](/tutorial/) tutorial.** If you have not, please read it and **invite the bot**. 7 | ::: 8 | 9 | ::: tip Need help? 10 | If you need any assistance adding WidgetBot, please ask in [the server](https://discord.gg/NYBEhN7). **However**, please make sure you mention **what the issue is**, **send your code** in a codeblock (` ``` `), include **your server and channel IDs**, and optionally include **a link to your site**. 11 | ::: 12 | 13 | ## Getting Started 14 | 15 | **To get started with Crate, use `/crate` in your server.** You should run it in the channel you want to show as default on your website. (Note that users can switch between the public channels in the sidebar). WidgetBot should send code that looks like this: 16 | 17 | ```html 18 | 24 | ``` 25 | 26 | The code sent by the bot goes in your site's HTML source at the end of your website's `body`, right before the closing `` tag. This might be in your theme or layout's code. 27 | 28 | If you run your site with this code, you should see the little crate button in the bottom right corner. If you click it, it should show your server, with the correct default channel. 29 | 30 | (If there's an issue, please go to [the WidgetBot server](https://discord.gg/NYBEhN7), and make sure you mention **what the issue is**, **send your code** in a codeblock (` ``` `), include **your server and channel IDs**, and optionally include **a link to your site**.) 31 | 32 | ::: tip Complete! 33 | You have successfully set up WidgetBot. However you can further customize WidgetBot to your needs. Read below for more info. 34 | ::: 35 | 36 | ## Further customization 37 | 38 | ### Options 39 | This tutorial showed you the `server` and `channel` options. However, there are many other options you can set, letting you do things such as change the location, the color and icon, toggling message notifications, and more. For a full list of options, click [here](/embed/crate/options). 40 | 41 | ### API 42 | You can use Crate's API to do things such as changing options, showing notifications, and toggling the widget through JavaScript. You can also access WidgetBot's [embed-api](/embed/embed-api/). For more info, click [here](/embed/crate/api). 43 | 44 | ### Examples 45 | You can see tons of Crate examples [here](/embed/crate/examples). 46 | -------------------------------------------------------------------------------- /embed/embed-api/commands.md: -------------------------------------------------------------------------------- 1 | # Commands 2 | 3 | `embed-api` commands (client events) are used to control the state of the embed. 4 | 5 | ### navigate 6 | 7 | The navigate command changes the active channel of the embed. 8 | 9 | ::: tip Usage 10 | ```js 11 | embed.emit('navigate', { 12 | guild: '299881420891881473', 13 | channel: '368427726358446110' 14 | }) 15 | ``` 16 | ::: 17 | 18 | ### login 19 | 20 | The login command requests the user to log in, if they aren't already logged in. It will show a guest login modal or a Discord login button, depending on whether the guild has guests enabled. 21 | 22 | ::: tip Usage 23 | ```js 24 | embed.emit('login') 25 | ``` 26 | ::: 27 | 28 | ### logout 29 | 30 | The logout command logs the user out, if they are logged in. 31 | 32 | ::: tip Usage 33 | ```js 34 | embed.emit('logout') 35 | ``` 36 | ::: 37 | 38 | ### Demo 39 | 40 | -------------------------------------------------------------------------------- /embed/embed-api/events.md: -------------------------------------------------------------------------------- 1 | # Events 2 | 3 | `embed-api` events (server events) are used to listen to actions that occur in the embed. 4 | 5 | :::tip Note 6 | Object fields are subject to change with embed updates. Your application should be able to handle missing fields. 7 | ::: 8 | 9 | ### signIn 10 | 11 | The signIn event is emitted when the user logs in to the widget. The payload is a [user object](https://github.com/widgetbot-io/embed-api/blob/master/src/user.ts). 12 | 13 | ::: tip Example 14 | ```js 15 | embed.on('signIn', (user) => { 16 | console.log(`User signed in as ${user.username}`, user) 17 | }) 18 | ``` 19 | ::: 20 | 21 | ### alreadySignedIn 22 | 23 | The alreadySignedIn event is emitted when the widget loads and the user is already logged in. The payload is a [user object](https://github.com/widgetbot-io/embed-api/blob/master/src/user.ts). 24 | 25 | ::: tip Example 26 | ```js 27 | embed.on('alreadySignedIn', (user) => { 28 | console.log(`User already signed in as ${user.username}`, user) 29 | }) 30 | ``` 31 | ::: 32 | 33 | ### signOut 34 | 35 | The signOut event is emitted when the user logs out of the widget. There is no payload. 36 | 37 | ::: tip Example 38 | ```js 39 | embed.on('signOut', () => { 40 | console.log('User signed out') 41 | }) 42 | ``` 43 | ::: 44 | 45 | ### message 46 | 47 | The message event is emitted when a message is sent in a channel. If notifications are enabled for the embed, this event will be emitted for all channels, otherwise it will only be emitted for the current channel. The payload contains a [channel object](https://github.com/widgetbot-io/embed-api/blob/master/src/embed/Channels.ts) and a [new message object](https://github.com/widgetbot-io/embed-api/blob/master/src/embed/NewMessage.ts). 48 | 49 | ::: tip Example 50 | ```js 51 | embed.on('message', ({ message, channel }) => { 52 | console.log(`New message in #${channel.name}`, message) 53 | }) 54 | ``` 55 | ::: 56 | 57 | ### messageUpdate 58 | 59 | The messageUpdate event is emitted when a message is edited in the current channel. The payload contains a [channel object](https://github.com/widgetbot-io/embed-api/blob/master/src/embed/Channels.ts) and an [updated message object](https://github.com/widgetbot-io/embed-api/blob/master/src/embed/MessageUpdated.ts). 60 | 61 | ::: tip Example 62 | ```js 63 | embed.on('messageUpdate', ({ message, channel }) => { 64 | console.log(`Message in #${channel.name} was edited`, message) 65 | }) 66 | ``` 67 | ::: 68 | 69 | ### messageDelete 70 | 71 | The messageDelete event is emitted when a message is deleted in the current channel. The payload contains a [channel object](https://github.com/widgetbot-io/embed-api/blob/master/src/embed/Channels.ts) and the ID of the deleted message. 72 | 73 | ::: tip Example 74 | ```js 75 | embed.on('messageDelete', ({ channel, id }) => { 76 | console.log(`Message ${id} in #${channel.name} was deleted`) 77 | }) 78 | ``` 79 | ::: 80 | 81 | ### messageDeleteBulk 82 | 83 | The messageDeleteBulk event is emitted when messages are bulk deleted in the current channel. The payload contains a [channel object](https://github.com/widgetbot-io/embed-api/blob/master/src/embed/Channels.ts) and an array of deleted message IDs. 84 | 85 | ::: tip Example 86 | ```js 87 | embed.on('messageDeleteBulk', ({ channel, ids }) => { 88 | console.log(`Messages ${ids.join(', ')} in #${channel.name} were deleted`) 89 | }) 90 | ``` 91 | ::: 92 | 93 | ### sentMessage 94 | 95 | The sentMessage event is emitted when a message is sent from the widget. The payload contains a [channel object](https://github.com/widgetbot-io/embed-api/blob/master/src/embed/Channels.ts), the content of the sent message, the thread ID if sent in a thread, and uploaded file data. 96 | 97 | ::: tip Definition 98 | ```ts 99 | sentMessage: { 100 | channel: Channel; 101 | content: string; 102 | thread?: string | null; 103 | fileData?: string | null; 104 | fileName?: string | null; 105 | fileAlt?: string | null; 106 | } 107 | ``` 108 | ::: 109 | 110 | ::: tip Example 111 | ```js 112 | embed.on('sentMessage', (data) => { 113 | console.log(`Sent message in #${data.channel.name}`, data) 114 | }) 115 | ``` 116 | ::: 117 | -------------------------------------------------------------------------------- /embed/embed-api/index.md: -------------------------------------------------------------------------------- 1 | # embed-api 2 | 3 | `embed-api` lets you interface with WidgetBot from your website's JavaScript. It provides [commands](commands) to control the embed and [events](events) to listen to actions. You can use `embed-api` with all of our client libraries: Crate, html-embed, and react-embed. 4 | -------------------------------------------------------------------------------- /embed/html-embed/api.md: -------------------------------------------------------------------------------- 1 | # html-embed API 2 | 3 | Once you've created a new WidgetBot element, the `html-embed` script adds the API methods onto the Elements prototype. 4 | 5 | You can access them by simply querying the `` element, example: 6 | 7 | ```html 8 | 9 | ... 10 | 14 | ``` 15 | 16 | ## Embed API 17 | 18 | ### Emit 19 | 20 | ::: tip Definition 21 | 22 | ```ts 23 | type emit = (event: Event, data?: Events[Event]) => void 24 | ``` 25 | ::: 26 | 27 | Emits an event to the `embed-api` 28 | 29 | For details, see [embed-api commands](/embed/embed-api/commands) 30 | 31 | ::: tip Usage 32 | 33 | ```js 34 | // Send a message on the active Discord channel 35 | embed.emit('sendMessage', 'hi') 36 | 37 | // Send a message on a specific Discord channel 38 | embed.emit('sendMessage', { 39 | channel: '123456789', 40 | message: 'hi' 41 | }) 42 | ``` 43 | ::: 44 | --- 45 | 46 | ### On 47 | 48 | ::: tip Definition 49 | 50 | ```ts 51 | type on = (event: Event, (data?: Events[Event]) => void) => void 52 | ``` 53 | ::: 54 | 55 | Listens for a specific event from the `embed-api` 56 | 57 | For details, see [embed-api events](/embed/embed-api/events) 58 | 59 | ::: tip Usage 60 | 61 | ```js 62 | // Listens for when the user has signed in 63 | embed.on('signIn', (user) => { 64 | console.log(`User signed in as ${user.username}`, user) 65 | }) 66 | 67 | // Listen for discord message events 68 | embed.on('message', ({ message, channel }) => { 69 | console.log(`New message in #${channel.name}`, message) 70 | }) 71 | 72 | // Listen for discord message delete events 73 | embed.on('messageDelete', ({ channel, id }) => { 74 | console.log(`Message ${id} in #${channel.name} was deleted`) 75 | }) 76 | ``` 77 | ::: 78 | -------------------------------------------------------------------------------- /embed/html-embed/attributes.md: -------------------------------------------------------------------------------- 1 | # html-embed Attributes 2 | 3 | You can pass custom attributes to the `` element, to change the options when initializing it, for example: 4 | 5 | ```html 6 | 12 | ``` 13 | 14 | ## Available options 15 | 16 | ::: tip Definitions 17 | 18 | ```ts 19 | type url = string 20 | 21 | interface Attributes { 22 | // Server + channel IDs 23 | server: string 24 | channel?: string 25 | 26 | // Thread ID 27 | thread?: string 28 | 29 | // Dynamic username and avatar 30 | username?: string 31 | avatar?: url 32 | 33 | // JWT login 34 | token?: string 35 | 36 | // Enables notifications for messages in other channels 37 | notifications?: boolean 38 | // Embed notification timeout 39 | notificationtimeout?: number 40 | 41 | // The height and width. You can specify a number to 42 | // use pixels or use CSS units eg. 100% 43 | width?: number | string 44 | height?: number | string 45 | 46 | // Connect to a custom WidgetBot server (Only set this if you are explicitly told to) 47 | shard?: url 48 | } 49 | 50 | export default Attributes 51 | ``` 52 | ::: 53 | -------------------------------------------------------------------------------- /embed/html-embed/index.md: -------------------------------------------------------------------------------- 1 | # html-embed 2 | 3 | ![Demo](https://i.imgur.com/Dgd7dKI.png) 4 | 5 | --- 6 | 7 | ::: tip html-embed 8 | 9 | [`@widgetbot/html-embed`](/embed/html-embed/) is a lightweight iframe wrapper, which provides access to the `embed-api`. It can be used with any framework and has no dependencies. 10 | 11 | ```html 12 | 18 | 19 | ``` 20 | ::: 21 | -------------------------------------------------------------------------------- /embed/html-embed/tutorial.md: -------------------------------------------------------------------------------- 1 | # html-embed Tutorial 2 | 3 | Welcome to the html-embed tutorial! 4 | 5 | :::tip Important 6 | **This tutorial assumes you have already completed the [Getting Started with WidgetBot](/tutorial/) tutorial.** If you have not, please read it and **invite the bot**. 7 | ::: 8 | 9 | :::tip Need help? 10 | If you need any assistance adding WidgetBot, please ask in [the server](https://discord.gg/NYBEhN7). **However**, please make sure you mention **what the issue is**, **send your code** in a codeblock (` ``` `), include **your server and channel IDs**, and optionally include **a link to your site**. 11 | ::: 12 | 13 | ## Getting Started 14 | 15 | To get started, add the following code where you want the widget to display. 16 | 17 | ::: tip Example Code 18 | ```html 19 | 25 | 26 | ``` 27 | ::: 28 | 29 | If you run your site with this code, you should see the widget, showing the official WidgetBot server. 30 | 31 | ## Setting your server 32 | 33 | As you can see, there are 2 parts to this code: the **Server ID**, **Channel ID**. (There's also the width and height for setting the size of the embed.) 34 | 35 | You can get the Server and Channel IDs from Discord: Go to the Appearance tab in User Settings, and turn on Developer Mode. Then, right-click the server icon or channel and click `Copy ID`. 36 | 37 | :::tip Note 38 | The Channel ID you choose will be the default channel that will show when Crate opens. However, the user can switch the channel. 39 | ::: 40 | Once you set the Server ID and Channel ID, the widget should now show your server when you open it. 41 | 42 | :::tip Complete! 43 | You have successfully set up WidgetBot. However you can further customize WidgetBot to your needs. Read below for more info. 44 | ::: 45 | ## API 46 | You can use html-embed's API to access WidgetBot's [embed-api](/embed/embed-api/). For more info, click [here](/embed/html-embed/api). 47 | -------------------------------------------------------------------------------- /embed/index.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ::: tip Getting started 4 | 5 | WidgetBot provides rich client-side wrappers around the widgets. Each wrapper provides access to the [embed-api](/embed/embed-api/), allowing your website to programatically: 6 | 7 | - Listen for message events 8 | - Track and manage the logged-in user 9 | - Navigate to a different channel 10 | 11 | *and more* 12 | ::: 13 | 14 | ## Integrations 15 | 16 | [Crate](/embed/crate/) 17 | 18 | --- 19 | 20 | [html-embed](/embed/html-embed/) 21 | 22 | --- 23 | 24 | [react-embed](/embed/react-embed/) 25 | -------------------------------------------------------------------------------- /embed/react-embed/api.md: -------------------------------------------------------------------------------- 1 | # react-embed API 2 | 3 | You can access [embed-api](/embed/embed-api/) by passing a function to the `onAPI` prop. 4 | 5 | ```ts 6 | import WidgetBot from '@widgetbot/react-embed' 7 | 8 | const onAPI = (api: WidgetBot['api']) => { 9 | api.on('signIn', (user) => { 10 | console.log(`User signed in as ${user.username}`, user) 11 | }) 12 | } 13 | 14 | const App = () => ( 15 | 20 | ) 21 | 22 | export default App 23 | ``` 24 | -------------------------------------------------------------------------------- /embed/react-embed/index.md: -------------------------------------------------------------------------------- 1 | # react-embed 2 | 3 | ![Demo](https://i.imgur.com/b2SirC2.png) 4 | 5 | --- 6 | 7 | :::tip react-embed 8 | [`@widgetbot/react-embed`](/embed/react-embed/) provides access to the embed as a React component. It provides syntactical sugar for the `embed-api`, with 100% type safety (using TypeScript). 9 | ::: 10 | ```tsx 11 | import WidgetBot from '@widgetbot/react-embed' 12 | 13 | const App = () => ( 14 | 18 | ) 19 | 20 | export default App 21 | ``` 22 | -------------------------------------------------------------------------------- /embed/react-embed/props.md: -------------------------------------------------------------------------------- 1 | The WidgetBot component accepts the following props 2 | 3 | ## Props 4 | 5 | ::: tip Definitions 6 | 7 | ```ts 8 | interface IProps { 9 | server: string 10 | channel?: string 11 | 12 | thread?: string 13 | 14 | username?: string 15 | avatar?: string 16 | 17 | accessibility?: string[] 18 | settingsGroup?: string 19 | 20 | token?: string 21 | 22 | notifications?: boolean 23 | notificationTimeout?: number 24 | 25 | defer?: boolean 26 | 27 | shard?: string 28 | 29 | className?: string 30 | onAPI?: (api: Client) => void 31 | 32 | style?: React.CSSProperties 33 | height?: number 34 | width?: number 35 | 36 | options?: { [key: string]: string } 37 | } 38 | 39 | export default IProps 40 | ``` 41 | ::: 42 | -------------------------------------------------------------------------------- /guides/automod.md: -------------------------------------------------------------------------------- 1 | # Automod 2 | 3 | Many automod bots will ignore messages sent via WidgetBot, which can be annoying to admins. A solution is using [Pylon](https://pylon.bot) and coding it yourself. In this guide, we'll make a simple check to delete invite links. 4 | 5 | First, you'll need to [add the Pylon bot to your server](https://pylon.bot/studio/add-guild). 6 | Then, click your server in the list and click "Open Code Editor". Delete the example code in the editor, so it's blank. 7 | 8 | This code will delete all messages sent invite links detected with a [regex](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions): 9 | ```ts 10 | const inviteRegex = /(discord\.(gg|io|me|li)|discord(app)?\.com\/invite)(\/.+)/i; 11 | 12 | discord.on('MESSAGE_CREATE', async (msg) => { 13 | if (inviteRegex.test(msg.content)) await msg.delete(); 14 | }); 15 | ``` 16 | Paste that in and save. Pylon should now instantly delete messages containing an invite link. 17 | 18 | ::: tip Need help with Pylon? 19 | Go to the [Pylon Discord server](https://discord.gg/dY42R4SFAJ) to get help with using Pylon. 20 | ::: 21 | -------------------------------------------------------------------------------- /guides/css.md: -------------------------------------------------------------------------------- 1 | # Custom CSS 2 | ::: warning Read Me! 3 | Custom CSS is Patreon only. You can subscribe [here](https://patreon.com/widgetbot) 4 | ::: 5 | 6 | These docs are WIP. 7 | -------------------------------------------------------------------------------- /guides/custom-colors.md: -------------------------------------------------------------------------------- 1 | # Custom Colors 2 | 3 | :::tip Note 4 | Setting Custom Colors requires buying any tier on Patreon, or boosting our Discord server. 5 | ::: 6 | 7 | You can set custom colors to customize the embed to your website via the Discord bot's `??setcolor` command. 8 | 9 | Before you set any colors, the embed will have the default look: 10 | ![](https://advaith.is-in-hyper.space/2e6609653f.png) 11 | 12 | There are 3 colors you can set: `primary` (the color of the text), white by default, `accent` (the color of buttons and tags, blurple by default), and `background` (gray by default). 13 | You can write colors using [css syntax](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value). 14 | 15 | Let's set the background to a pure black. Send `??setcolor background black` in the server: 16 | ![](https://advaith.is-in-hyper.space/6b562a74ee.png) 17 | 18 | Now, let's set the accent color to a nice neon green. `??setcolor accent #00d101`: 19 | ![](https://advaith.is-in-hyper.space/6d7d87674e.png) 20 | 21 | Next, we'll try setting the text color to red: `??setcolor primary red` 22 | ![](https://advaith.is-in-hyper.space/a8003473b6.png) 23 | 24 | I don't think this looks that good, but we can easily reset any color with the `--reset` flag: 25 | ![](https://advaith.is-in-hyper.space/838af6e9f4.png) 26 | 27 | You've finished the guide! You can use whatever colors you want to customize your embed to match your website. Thanks for being a patron/booster! 28 | -------------------------------------------------------------------------------- /guides/index.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | Welcome to the guides section! These guides help you get more out of WidgetBot. 4 | 5 | ::: tip 6 | The guides assume you have already completed the [Getting Started with WidgetBot](/tutorial/) tutorial, or that WidgetBot has been added to your server and site. 7 | ::: 8 | 9 | ## Current Guides 10 | - [Automod](automod) 11 | - [Custom Colors](custom-colors) 12 | -------------------------------------------------------------------------------- /guides/patreon.md: -------------------------------------------------------------------------------- 1 | # Patreon 2 | 3 | ## Patreon Red 4 | 5 | ## Patreon Gold 6 | 7 | ## Patreon Emerald 8 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | --- 4 | 5 | # Welcome to the official WidgetBot documentation site! 6 | 7 | * Check out our [tutorial](/tutorial/) for setting up WidgetBot 8 | * Access the [documentation](/embed/) for WidgetBot's embed integrations 9 | 10 | Need more help? Ask us in #support on [our Discord server](https://discord.gg/NYBEhN7). 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "documentation", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "repository": "git@github.com:widgetbot-io/documentation.git", 6 | "author": "Daave ", 7 | "scripts": { 8 | "docs:dev": "vitepress dev", 9 | "docs:build": "vitepress build", 10 | "docs:preview": "vitepress preview" 11 | }, 12 | "dependencies": { 13 | "vitepress": "^1.0.0-rc.30" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | vitepress: 9 | specifier: ^1.0.0-rc.30 10 | version: 1.0.0-rc.30(@algolia/client-search@4.20.0)(search-insights@2.11.0) 11 | 12 | packages: 13 | 14 | /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.11.0): 15 | resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} 16 | dependencies: 17 | '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.11.0) 18 | '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) 19 | transitivePeerDependencies: 20 | - '@algolia/client-search' 21 | - algoliasearch 22 | - search-insights 23 | dev: false 24 | 25 | /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.11.0): 26 | resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} 27 | peerDependencies: 28 | search-insights: '>= 1 < 3' 29 | dependencies: 30 | '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) 31 | search-insights: 2.11.0 32 | transitivePeerDependencies: 33 | - '@algolia/client-search' 34 | - algoliasearch 35 | dev: false 36 | 37 | /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0): 38 | resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} 39 | peerDependencies: 40 | '@algolia/client-search': '>= 4.9.1 < 6' 41 | algoliasearch: '>= 4.9.1 < 6' 42 | dependencies: 43 | '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) 44 | '@algolia/client-search': 4.20.0 45 | algoliasearch: 4.20.0 46 | dev: false 47 | 48 | /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0): 49 | resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} 50 | peerDependencies: 51 | '@algolia/client-search': '>= 4.9.1 < 6' 52 | algoliasearch: '>= 4.9.1 < 6' 53 | dependencies: 54 | '@algolia/client-search': 4.20.0 55 | algoliasearch: 4.20.0 56 | dev: false 57 | 58 | /@algolia/cache-browser-local-storage@4.20.0: 59 | resolution: {integrity: sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==} 60 | dependencies: 61 | '@algolia/cache-common': 4.20.0 62 | dev: false 63 | 64 | /@algolia/cache-common@4.20.0: 65 | resolution: {integrity: sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ==} 66 | dev: false 67 | 68 | /@algolia/cache-in-memory@4.20.0: 69 | resolution: {integrity: sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==} 70 | dependencies: 71 | '@algolia/cache-common': 4.20.0 72 | dev: false 73 | 74 | /@algolia/client-account@4.20.0: 75 | resolution: {integrity: sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==} 76 | dependencies: 77 | '@algolia/client-common': 4.20.0 78 | '@algolia/client-search': 4.20.0 79 | '@algolia/transporter': 4.20.0 80 | dev: false 81 | 82 | /@algolia/client-analytics@4.20.0: 83 | resolution: {integrity: sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==} 84 | dependencies: 85 | '@algolia/client-common': 4.20.0 86 | '@algolia/client-search': 4.20.0 87 | '@algolia/requester-common': 4.20.0 88 | '@algolia/transporter': 4.20.0 89 | dev: false 90 | 91 | /@algolia/client-common@4.20.0: 92 | resolution: {integrity: sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==} 93 | dependencies: 94 | '@algolia/requester-common': 4.20.0 95 | '@algolia/transporter': 4.20.0 96 | dev: false 97 | 98 | /@algolia/client-personalization@4.20.0: 99 | resolution: {integrity: sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==} 100 | dependencies: 101 | '@algolia/client-common': 4.20.0 102 | '@algolia/requester-common': 4.20.0 103 | '@algolia/transporter': 4.20.0 104 | dev: false 105 | 106 | /@algolia/client-search@4.20.0: 107 | resolution: {integrity: sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==} 108 | dependencies: 109 | '@algolia/client-common': 4.20.0 110 | '@algolia/requester-common': 4.20.0 111 | '@algolia/transporter': 4.20.0 112 | dev: false 113 | 114 | /@algolia/logger-common@4.20.0: 115 | resolution: {integrity: sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ==} 116 | dev: false 117 | 118 | /@algolia/logger-console@4.20.0: 119 | resolution: {integrity: sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==} 120 | dependencies: 121 | '@algolia/logger-common': 4.20.0 122 | dev: false 123 | 124 | /@algolia/requester-browser-xhr@4.20.0: 125 | resolution: {integrity: sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==} 126 | dependencies: 127 | '@algolia/requester-common': 4.20.0 128 | dev: false 129 | 130 | /@algolia/requester-common@4.20.0: 131 | resolution: {integrity: sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng==} 132 | dev: false 133 | 134 | /@algolia/requester-node-http@4.20.0: 135 | resolution: {integrity: sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==} 136 | dependencies: 137 | '@algolia/requester-common': 4.20.0 138 | dev: false 139 | 140 | /@algolia/transporter@4.20.0: 141 | resolution: {integrity: sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==} 142 | dependencies: 143 | '@algolia/cache-common': 4.20.0 144 | '@algolia/logger-common': 4.20.0 145 | '@algolia/requester-common': 4.20.0 146 | dev: false 147 | 148 | /@babel/helper-string-parser@7.23.4: 149 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 150 | engines: {node: '>=6.9.0'} 151 | dev: false 152 | 153 | /@babel/helper-validator-identifier@7.22.20: 154 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 155 | engines: {node: '>=6.9.0'} 156 | dev: false 157 | 158 | /@babel/parser@7.23.4: 159 | resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} 160 | engines: {node: '>=6.0.0'} 161 | hasBin: true 162 | dependencies: 163 | '@babel/types': 7.23.4 164 | dev: false 165 | 166 | /@babel/types@7.23.4: 167 | resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} 168 | engines: {node: '>=6.9.0'} 169 | dependencies: 170 | '@babel/helper-string-parser': 7.23.4 171 | '@babel/helper-validator-identifier': 7.22.20 172 | to-fast-properties: 2.0.0 173 | dev: false 174 | 175 | /@docsearch/css@3.5.2: 176 | resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} 177 | dev: false 178 | 179 | /@docsearch/js@3.5.2(@algolia/client-search@4.20.0)(search-insights@2.11.0): 180 | resolution: {integrity: sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==} 181 | dependencies: 182 | '@docsearch/react': 3.5.2(@algolia/client-search@4.20.0)(search-insights@2.11.0) 183 | preact: 10.19.2 184 | transitivePeerDependencies: 185 | - '@algolia/client-search' 186 | - '@types/react' 187 | - react 188 | - react-dom 189 | - search-insights 190 | dev: false 191 | 192 | /@docsearch/react@3.5.2(@algolia/client-search@4.20.0)(search-insights@2.11.0): 193 | resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} 194 | peerDependencies: 195 | '@types/react': '>= 16.8.0 < 19.0.0' 196 | react: '>= 16.8.0 < 19.0.0' 197 | react-dom: '>= 16.8.0 < 19.0.0' 198 | search-insights: '>= 1 < 3' 199 | peerDependenciesMeta: 200 | '@types/react': 201 | optional: true 202 | react: 203 | optional: true 204 | react-dom: 205 | optional: true 206 | search-insights: 207 | optional: true 208 | dependencies: 209 | '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.11.0) 210 | '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) 211 | '@docsearch/css': 3.5.2 212 | algoliasearch: 4.20.0 213 | search-insights: 2.11.0 214 | transitivePeerDependencies: 215 | - '@algolia/client-search' 216 | dev: false 217 | 218 | /@esbuild/android-arm64@0.19.7: 219 | resolution: {integrity: sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w==} 220 | engines: {node: '>=12'} 221 | cpu: [arm64] 222 | os: [android] 223 | requiresBuild: true 224 | dev: false 225 | optional: true 226 | 227 | /@esbuild/android-arm@0.19.7: 228 | resolution: {integrity: sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww==} 229 | engines: {node: '>=12'} 230 | cpu: [arm] 231 | os: [android] 232 | requiresBuild: true 233 | dev: false 234 | optional: true 235 | 236 | /@esbuild/android-x64@0.19.7: 237 | resolution: {integrity: sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw==} 238 | engines: {node: '>=12'} 239 | cpu: [x64] 240 | os: [android] 241 | requiresBuild: true 242 | dev: false 243 | optional: true 244 | 245 | /@esbuild/darwin-arm64@0.19.7: 246 | resolution: {integrity: sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw==} 247 | engines: {node: '>=12'} 248 | cpu: [arm64] 249 | os: [darwin] 250 | requiresBuild: true 251 | dev: false 252 | optional: true 253 | 254 | /@esbuild/darwin-x64@0.19.7: 255 | resolution: {integrity: sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ==} 256 | engines: {node: '>=12'} 257 | cpu: [x64] 258 | os: [darwin] 259 | requiresBuild: true 260 | dev: false 261 | optional: true 262 | 263 | /@esbuild/freebsd-arm64@0.19.7: 264 | resolution: {integrity: sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ==} 265 | engines: {node: '>=12'} 266 | cpu: [arm64] 267 | os: [freebsd] 268 | requiresBuild: true 269 | dev: false 270 | optional: true 271 | 272 | /@esbuild/freebsd-x64@0.19.7: 273 | resolution: {integrity: sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA==} 274 | engines: {node: '>=12'} 275 | cpu: [x64] 276 | os: [freebsd] 277 | requiresBuild: true 278 | dev: false 279 | optional: true 280 | 281 | /@esbuild/linux-arm64@0.19.7: 282 | resolution: {integrity: sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g==} 283 | engines: {node: '>=12'} 284 | cpu: [arm64] 285 | os: [linux] 286 | requiresBuild: true 287 | dev: false 288 | optional: true 289 | 290 | /@esbuild/linux-arm@0.19.7: 291 | resolution: {integrity: sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww==} 292 | engines: {node: '>=12'} 293 | cpu: [arm] 294 | os: [linux] 295 | requiresBuild: true 296 | dev: false 297 | optional: true 298 | 299 | /@esbuild/linux-ia32@0.19.7: 300 | resolution: {integrity: sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g==} 301 | engines: {node: '>=12'} 302 | cpu: [ia32] 303 | os: [linux] 304 | requiresBuild: true 305 | dev: false 306 | optional: true 307 | 308 | /@esbuild/linux-loong64@0.19.7: 309 | resolution: {integrity: sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw==} 310 | engines: {node: '>=12'} 311 | cpu: [loong64] 312 | os: [linux] 313 | requiresBuild: true 314 | dev: false 315 | optional: true 316 | 317 | /@esbuild/linux-mips64el@0.19.7: 318 | resolution: {integrity: sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w==} 319 | engines: {node: '>=12'} 320 | cpu: [mips64el] 321 | os: [linux] 322 | requiresBuild: true 323 | dev: false 324 | optional: true 325 | 326 | /@esbuild/linux-ppc64@0.19.7: 327 | resolution: {integrity: sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ==} 328 | engines: {node: '>=12'} 329 | cpu: [ppc64] 330 | os: [linux] 331 | requiresBuild: true 332 | dev: false 333 | optional: true 334 | 335 | /@esbuild/linux-riscv64@0.19.7: 336 | resolution: {integrity: sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw==} 337 | engines: {node: '>=12'} 338 | cpu: [riscv64] 339 | os: [linux] 340 | requiresBuild: true 341 | dev: false 342 | optional: true 343 | 344 | /@esbuild/linux-s390x@0.19.7: 345 | resolution: {integrity: sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg==} 346 | engines: {node: '>=12'} 347 | cpu: [s390x] 348 | os: [linux] 349 | requiresBuild: true 350 | dev: false 351 | optional: true 352 | 353 | /@esbuild/linux-x64@0.19.7: 354 | resolution: {integrity: sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ==} 355 | engines: {node: '>=12'} 356 | cpu: [x64] 357 | os: [linux] 358 | requiresBuild: true 359 | dev: false 360 | optional: true 361 | 362 | /@esbuild/netbsd-x64@0.19.7: 363 | resolution: {integrity: sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ==} 364 | engines: {node: '>=12'} 365 | cpu: [x64] 366 | os: [netbsd] 367 | requiresBuild: true 368 | dev: false 369 | optional: true 370 | 371 | /@esbuild/openbsd-x64@0.19.7: 372 | resolution: {integrity: sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ==} 373 | engines: {node: '>=12'} 374 | cpu: [x64] 375 | os: [openbsd] 376 | requiresBuild: true 377 | dev: false 378 | optional: true 379 | 380 | /@esbuild/sunos-x64@0.19.7: 381 | resolution: {integrity: sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw==} 382 | engines: {node: '>=12'} 383 | cpu: [x64] 384 | os: [sunos] 385 | requiresBuild: true 386 | dev: false 387 | optional: true 388 | 389 | /@esbuild/win32-arm64@0.19.7: 390 | resolution: {integrity: sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw==} 391 | engines: {node: '>=12'} 392 | cpu: [arm64] 393 | os: [win32] 394 | requiresBuild: true 395 | dev: false 396 | optional: true 397 | 398 | /@esbuild/win32-ia32@0.19.7: 399 | resolution: {integrity: sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A==} 400 | engines: {node: '>=12'} 401 | cpu: [ia32] 402 | os: [win32] 403 | requiresBuild: true 404 | dev: false 405 | optional: true 406 | 407 | /@esbuild/win32-x64@0.19.7: 408 | resolution: {integrity: sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==} 409 | engines: {node: '>=12'} 410 | cpu: [x64] 411 | os: [win32] 412 | requiresBuild: true 413 | dev: false 414 | optional: true 415 | 416 | /@jridgewell/sourcemap-codec@1.4.15: 417 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 418 | dev: false 419 | 420 | /@rollup/rollup-android-arm-eabi@4.5.2: 421 | resolution: {integrity: sha512-ee7BudTwwrglFYSc3UnqInDDjCLWHKrFmGNi4aK7jlEyg4CyPa1DCMrZfsN1O13YT76UFEqXz2CoN7BCGpUlJw==} 422 | cpu: [arm] 423 | os: [android] 424 | requiresBuild: true 425 | dev: false 426 | optional: true 427 | 428 | /@rollup/rollup-android-arm64@4.5.2: 429 | resolution: {integrity: sha512-xOuhj9HHtn8128ir8veoQsBbAUBasDbHIBniYTEx02pAmu9EXL+ZjJqngnNEy6ZgZ4h1JwL33GMNu3yJL5Mzow==} 430 | cpu: [arm64] 431 | os: [android] 432 | requiresBuild: true 433 | dev: false 434 | optional: true 435 | 436 | /@rollup/rollup-darwin-arm64@4.5.2: 437 | resolution: {integrity: sha512-NTGJWoL8bKyqyWFn9/RzSv4hQ4wTbaAv0lHHRwf4OnpiiP4P8W0jiXbm8Nc5BCXKmWAwuvJY82mcIU2TayC20g==} 438 | cpu: [arm64] 439 | os: [darwin] 440 | requiresBuild: true 441 | dev: false 442 | optional: true 443 | 444 | /@rollup/rollup-darwin-x64@4.5.2: 445 | resolution: {integrity: sha512-hlKqj7bpPvU15sZo4za14u185lpMzdwWLMc9raMqPK4wywt0wR23y1CaVQ4oAFXat3b5/gmRntyfpwWTKl+vvA==} 446 | cpu: [x64] 447 | os: [darwin] 448 | requiresBuild: true 449 | dev: false 450 | optional: true 451 | 452 | /@rollup/rollup-linux-arm-gnueabihf@4.5.2: 453 | resolution: {integrity: sha512-7ZIZx8c3u+pfI0ohQsft/GywrXez0uR6dUP0JhBuCK3sFO5TfdLn/YApnVkvPxuTv3+YKPIZend9Mt7Cz6sS3Q==} 454 | cpu: [arm] 455 | os: [linux] 456 | requiresBuild: true 457 | dev: false 458 | optional: true 459 | 460 | /@rollup/rollup-linux-arm64-gnu@4.5.2: 461 | resolution: {integrity: sha512-7Pk/5mO11JW/cH+a8lL/i0ZxmRGrbpYqN0VwO2DHhU+SJWWOH2zE1RAcPaj8KqiwC8DCDIJOSxjV9+9lLb6aeA==} 462 | cpu: [arm64] 463 | os: [linux] 464 | requiresBuild: true 465 | dev: false 466 | optional: true 467 | 468 | /@rollup/rollup-linux-arm64-musl@4.5.2: 469 | resolution: {integrity: sha512-KrRnuG5phJx756e62wxvWH2e+TK84MP2IVuPwfge+GBvWqIUfVzFRn09TKruuQBXzZp52Vyma7FjMDkwlA9xpg==} 470 | cpu: [arm64] 471 | os: [linux] 472 | requiresBuild: true 473 | dev: false 474 | optional: true 475 | 476 | /@rollup/rollup-linux-x64-gnu@4.5.2: 477 | resolution: {integrity: sha512-My+53GasPa2D2tU5dXiyHYwrELAUouSfkNlZ3bUKpI7btaztO5vpALEs3mvFjM7aKTvEbc7GQckuXeXIDKQ0fg==} 478 | cpu: [x64] 479 | os: [linux] 480 | requiresBuild: true 481 | dev: false 482 | optional: true 483 | 484 | /@rollup/rollup-linux-x64-musl@4.5.2: 485 | resolution: {integrity: sha512-/f0Q6Sc+Vw54Ws6N8fxaEe4R7at3b8pFyv+O/F2VaQ4hODUJcRUcCBJh6zuqtgQQt7w845VTkGLFgWZkP3tUoQ==} 486 | cpu: [x64] 487 | os: [linux] 488 | requiresBuild: true 489 | dev: false 490 | optional: true 491 | 492 | /@rollup/rollup-win32-arm64-msvc@4.5.2: 493 | resolution: {integrity: sha512-NCKuuZWLht6zj7s6EIFef4BxCRX1GMr83S2W4HPCA0RnJ4iHE4FS1695q6Ewoa6A9nFjJe1//yUu0kgBU07Edw==} 494 | cpu: [arm64] 495 | os: [win32] 496 | requiresBuild: true 497 | dev: false 498 | optional: true 499 | 500 | /@rollup/rollup-win32-ia32-msvc@4.5.2: 501 | resolution: {integrity: sha512-J5zL3riR4AOyU/J3M/i4k/zZ8eP1yT+nTmAKztCXJtnI36jYH0eepvob22mAQ/kLwfsK2TB6dbyVY1F8c/0H5A==} 502 | cpu: [ia32] 503 | os: [win32] 504 | requiresBuild: true 505 | dev: false 506 | optional: true 507 | 508 | /@rollup/rollup-win32-x64-msvc@4.5.2: 509 | resolution: {integrity: sha512-pL0RXRHuuGLhvs7ayX/SAHph1hrDPXOM5anyYUQXWJEENxw3nfHkzv8FfVlEVcLyKPAEgDRkd6RKZq2SMqS/yg==} 510 | cpu: [x64] 511 | os: [win32] 512 | requiresBuild: true 513 | dev: false 514 | optional: true 515 | 516 | /@types/hast@3.0.3: 517 | resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} 518 | dependencies: 519 | '@types/unist': 3.0.2 520 | dev: false 521 | 522 | /@types/linkify-it@3.0.5: 523 | resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} 524 | dev: false 525 | 526 | /@types/markdown-it@13.0.7: 527 | resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==} 528 | dependencies: 529 | '@types/linkify-it': 3.0.5 530 | '@types/mdurl': 1.0.5 531 | dev: false 532 | 533 | /@types/mdast@4.0.3: 534 | resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} 535 | dependencies: 536 | '@types/unist': 3.0.2 537 | dev: false 538 | 539 | /@types/mdurl@1.0.5: 540 | resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} 541 | dev: false 542 | 543 | /@types/unist@3.0.2: 544 | resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} 545 | dev: false 546 | 547 | /@types/web-bluetooth@0.0.20: 548 | resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} 549 | dev: false 550 | 551 | /@ungap/structured-clone@1.2.0: 552 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 553 | dev: false 554 | 555 | /@vitejs/plugin-vue@4.5.0(vite@5.0.2)(vue@3.3.8): 556 | resolution: {integrity: sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==} 557 | engines: {node: ^14.18.0 || >=16.0.0} 558 | peerDependencies: 559 | vite: ^4.0.0 || ^5.0.0 560 | vue: ^3.2.25 561 | dependencies: 562 | vite: 5.0.2 563 | vue: 3.3.8 564 | dev: false 565 | 566 | /@vue/compiler-core@3.3.8: 567 | resolution: {integrity: sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==} 568 | dependencies: 569 | '@babel/parser': 7.23.4 570 | '@vue/shared': 3.3.8 571 | estree-walker: 2.0.2 572 | source-map-js: 1.0.2 573 | dev: false 574 | 575 | /@vue/compiler-dom@3.3.8: 576 | resolution: {integrity: sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==} 577 | dependencies: 578 | '@vue/compiler-core': 3.3.8 579 | '@vue/shared': 3.3.8 580 | dev: false 581 | 582 | /@vue/compiler-sfc@3.3.8: 583 | resolution: {integrity: sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==} 584 | dependencies: 585 | '@babel/parser': 7.23.4 586 | '@vue/compiler-core': 3.3.8 587 | '@vue/compiler-dom': 3.3.8 588 | '@vue/compiler-ssr': 3.3.8 589 | '@vue/reactivity-transform': 3.3.8 590 | '@vue/shared': 3.3.8 591 | estree-walker: 2.0.2 592 | magic-string: 0.30.5 593 | postcss: 8.4.31 594 | source-map-js: 1.0.2 595 | dev: false 596 | 597 | /@vue/compiler-ssr@3.3.8: 598 | resolution: {integrity: sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==} 599 | dependencies: 600 | '@vue/compiler-dom': 3.3.8 601 | '@vue/shared': 3.3.8 602 | dev: false 603 | 604 | /@vue/devtools-api@6.5.1: 605 | resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==} 606 | dev: false 607 | 608 | /@vue/reactivity-transform@3.3.8: 609 | resolution: {integrity: sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==} 610 | dependencies: 611 | '@babel/parser': 7.23.4 612 | '@vue/compiler-core': 3.3.8 613 | '@vue/shared': 3.3.8 614 | estree-walker: 2.0.2 615 | magic-string: 0.30.5 616 | dev: false 617 | 618 | /@vue/reactivity@3.3.8: 619 | resolution: {integrity: sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==} 620 | dependencies: 621 | '@vue/shared': 3.3.8 622 | dev: false 623 | 624 | /@vue/runtime-core@3.3.8: 625 | resolution: {integrity: sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==} 626 | dependencies: 627 | '@vue/reactivity': 3.3.8 628 | '@vue/shared': 3.3.8 629 | dev: false 630 | 631 | /@vue/runtime-dom@3.3.8: 632 | resolution: {integrity: sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==} 633 | dependencies: 634 | '@vue/runtime-core': 3.3.8 635 | '@vue/shared': 3.3.8 636 | csstype: 3.1.2 637 | dev: false 638 | 639 | /@vue/server-renderer@3.3.8(vue@3.3.8): 640 | resolution: {integrity: sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==} 641 | peerDependencies: 642 | vue: 3.3.8 643 | dependencies: 644 | '@vue/compiler-ssr': 3.3.8 645 | '@vue/shared': 3.3.8 646 | vue: 3.3.8 647 | dev: false 648 | 649 | /@vue/shared@3.3.8: 650 | resolution: {integrity: sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==} 651 | dev: false 652 | 653 | /@vueuse/core@10.6.1(vue@3.3.8): 654 | resolution: {integrity: sha512-Pc26IJbqgC9VG1u6VY/xrXXfxD33hnvxBnKrLlA2LJlyHII+BSrRoTPJgGYq7qZOu61itITFUnm6QbacwZ4H8Q==} 655 | dependencies: 656 | '@types/web-bluetooth': 0.0.20 657 | '@vueuse/metadata': 10.6.1 658 | '@vueuse/shared': 10.6.1(vue@3.3.8) 659 | vue-demi: 0.14.6(vue@3.3.8) 660 | transitivePeerDependencies: 661 | - '@vue/composition-api' 662 | - vue 663 | dev: false 664 | 665 | /@vueuse/integrations@10.6.1(focus-trap@7.5.4)(vue@3.3.8): 666 | resolution: {integrity: sha512-mPDupuofMJ4DPmtX/FfP1MajmWRzYDv8WSaTCo8LQ5kFznjWgmUQ16ApjYqgMquqffNY6+IRMdMgosLDRZOSZA==} 667 | peerDependencies: 668 | async-validator: '*' 669 | axios: '*' 670 | change-case: '*' 671 | drauu: '*' 672 | focus-trap: '*' 673 | fuse.js: '*' 674 | idb-keyval: '*' 675 | jwt-decode: '*' 676 | nprogress: '*' 677 | qrcode: '*' 678 | sortablejs: '*' 679 | universal-cookie: '*' 680 | peerDependenciesMeta: 681 | async-validator: 682 | optional: true 683 | axios: 684 | optional: true 685 | change-case: 686 | optional: true 687 | drauu: 688 | optional: true 689 | focus-trap: 690 | optional: true 691 | fuse.js: 692 | optional: true 693 | idb-keyval: 694 | optional: true 695 | jwt-decode: 696 | optional: true 697 | nprogress: 698 | optional: true 699 | qrcode: 700 | optional: true 701 | sortablejs: 702 | optional: true 703 | universal-cookie: 704 | optional: true 705 | dependencies: 706 | '@vueuse/core': 10.6.1(vue@3.3.8) 707 | '@vueuse/shared': 10.6.1(vue@3.3.8) 708 | focus-trap: 7.5.4 709 | vue-demi: 0.14.6(vue@3.3.8) 710 | transitivePeerDependencies: 711 | - '@vue/composition-api' 712 | - vue 713 | dev: false 714 | 715 | /@vueuse/metadata@10.6.1: 716 | resolution: {integrity: sha512-qhdwPI65Bgcj23e5lpGfQsxcy0bMjCAsUGoXkJ7DsoeDUdasbZ2DBa4dinFCOER3lF4gwUv+UD2AlA11zdzMFw==} 717 | dev: false 718 | 719 | /@vueuse/shared@10.6.1(vue@3.3.8): 720 | resolution: {integrity: sha512-TECVDTIedFlL0NUfHWncf3zF9Gc4VfdxfQc8JFwoVZQmxpONhLxFrlm0eHQeidHj4rdTPL3KXJa0TZCk1wnc5Q==} 721 | dependencies: 722 | vue-demi: 0.14.6(vue@3.3.8) 723 | transitivePeerDependencies: 724 | - '@vue/composition-api' 725 | - vue 726 | dev: false 727 | 728 | /algoliasearch@4.20.0: 729 | resolution: {integrity: sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==} 730 | dependencies: 731 | '@algolia/cache-browser-local-storage': 4.20.0 732 | '@algolia/cache-common': 4.20.0 733 | '@algolia/cache-in-memory': 4.20.0 734 | '@algolia/client-account': 4.20.0 735 | '@algolia/client-analytics': 4.20.0 736 | '@algolia/client-common': 4.20.0 737 | '@algolia/client-personalization': 4.20.0 738 | '@algolia/client-search': 4.20.0 739 | '@algolia/logger-common': 4.20.0 740 | '@algolia/logger-console': 4.20.0 741 | '@algolia/requester-browser-xhr': 4.20.0 742 | '@algolia/requester-common': 4.20.0 743 | '@algolia/requester-node-http': 4.20.0 744 | '@algolia/transporter': 4.20.0 745 | dev: false 746 | 747 | /ccount@2.0.1: 748 | resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 749 | dev: false 750 | 751 | /character-entities-html4@2.1.0: 752 | resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 753 | dev: false 754 | 755 | /character-entities-legacy@3.0.0: 756 | resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 757 | dev: false 758 | 759 | /comma-separated-tokens@2.0.3: 760 | resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 761 | dev: false 762 | 763 | /csstype@3.1.2: 764 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 765 | dev: false 766 | 767 | /dequal@2.0.3: 768 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 769 | engines: {node: '>=6'} 770 | dev: false 771 | 772 | /devlop@1.1.0: 773 | resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 774 | dependencies: 775 | dequal: 2.0.3 776 | dev: false 777 | 778 | /entities@4.5.0: 779 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 780 | engines: {node: '>=0.12'} 781 | dev: false 782 | 783 | /esbuild@0.19.7: 784 | resolution: {integrity: sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ==} 785 | engines: {node: '>=12'} 786 | hasBin: true 787 | requiresBuild: true 788 | optionalDependencies: 789 | '@esbuild/android-arm': 0.19.7 790 | '@esbuild/android-arm64': 0.19.7 791 | '@esbuild/android-x64': 0.19.7 792 | '@esbuild/darwin-arm64': 0.19.7 793 | '@esbuild/darwin-x64': 0.19.7 794 | '@esbuild/freebsd-arm64': 0.19.7 795 | '@esbuild/freebsd-x64': 0.19.7 796 | '@esbuild/linux-arm': 0.19.7 797 | '@esbuild/linux-arm64': 0.19.7 798 | '@esbuild/linux-ia32': 0.19.7 799 | '@esbuild/linux-loong64': 0.19.7 800 | '@esbuild/linux-mips64el': 0.19.7 801 | '@esbuild/linux-ppc64': 0.19.7 802 | '@esbuild/linux-riscv64': 0.19.7 803 | '@esbuild/linux-s390x': 0.19.7 804 | '@esbuild/linux-x64': 0.19.7 805 | '@esbuild/netbsd-x64': 0.19.7 806 | '@esbuild/openbsd-x64': 0.19.7 807 | '@esbuild/sunos-x64': 0.19.7 808 | '@esbuild/win32-arm64': 0.19.7 809 | '@esbuild/win32-ia32': 0.19.7 810 | '@esbuild/win32-x64': 0.19.7 811 | dev: false 812 | 813 | /estree-walker@2.0.2: 814 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 815 | dev: false 816 | 817 | /focus-trap@7.5.4: 818 | resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} 819 | dependencies: 820 | tabbable: 6.2.0 821 | dev: false 822 | 823 | /fsevents@2.3.3: 824 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 825 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 826 | os: [darwin] 827 | requiresBuild: true 828 | dev: false 829 | optional: true 830 | 831 | /hast-util-from-parse5@8.0.1: 832 | resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} 833 | dependencies: 834 | '@types/hast': 3.0.3 835 | '@types/unist': 3.0.2 836 | devlop: 1.1.0 837 | hastscript: 8.0.0 838 | property-information: 6.4.0 839 | vfile: 6.0.1 840 | vfile-location: 5.0.2 841 | web-namespaces: 2.0.1 842 | dev: false 843 | 844 | /hast-util-parse-selector@4.0.0: 845 | resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} 846 | dependencies: 847 | '@types/hast': 3.0.3 848 | dev: false 849 | 850 | /hast-util-raw@9.0.1: 851 | resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} 852 | dependencies: 853 | '@types/hast': 3.0.3 854 | '@types/unist': 3.0.2 855 | '@ungap/structured-clone': 1.2.0 856 | hast-util-from-parse5: 8.0.1 857 | hast-util-to-parse5: 8.0.0 858 | html-void-elements: 3.0.0 859 | mdast-util-to-hast: 13.0.2 860 | parse5: 7.1.2 861 | unist-util-position: 5.0.0 862 | unist-util-visit: 5.0.0 863 | vfile: 6.0.1 864 | web-namespaces: 2.0.1 865 | zwitch: 2.0.4 866 | dev: false 867 | 868 | /hast-util-to-html@9.0.0: 869 | resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} 870 | dependencies: 871 | '@types/hast': 3.0.3 872 | '@types/unist': 3.0.2 873 | ccount: 2.0.1 874 | comma-separated-tokens: 2.0.3 875 | hast-util-raw: 9.0.1 876 | hast-util-whitespace: 3.0.0 877 | html-void-elements: 3.0.0 878 | mdast-util-to-hast: 13.0.2 879 | property-information: 6.4.0 880 | space-separated-tokens: 2.0.2 881 | stringify-entities: 4.0.3 882 | zwitch: 2.0.4 883 | dev: false 884 | 885 | /hast-util-to-parse5@8.0.0: 886 | resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} 887 | dependencies: 888 | '@types/hast': 3.0.3 889 | comma-separated-tokens: 2.0.3 890 | devlop: 1.1.0 891 | property-information: 6.4.0 892 | space-separated-tokens: 2.0.2 893 | web-namespaces: 2.0.1 894 | zwitch: 2.0.4 895 | dev: false 896 | 897 | /hast-util-whitespace@3.0.0: 898 | resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 899 | dependencies: 900 | '@types/hast': 3.0.3 901 | dev: false 902 | 903 | /hastscript@8.0.0: 904 | resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} 905 | dependencies: 906 | '@types/hast': 3.0.3 907 | comma-separated-tokens: 2.0.3 908 | hast-util-parse-selector: 4.0.0 909 | property-information: 6.4.0 910 | space-separated-tokens: 2.0.2 911 | dev: false 912 | 913 | /html-void-elements@3.0.0: 914 | resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 915 | dev: false 916 | 917 | /magic-string@0.30.5: 918 | resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} 919 | engines: {node: '>=12'} 920 | dependencies: 921 | '@jridgewell/sourcemap-codec': 1.4.15 922 | dev: false 923 | 924 | /mark.js@8.11.1: 925 | resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} 926 | dev: false 927 | 928 | /mdast-util-to-hast@13.0.2: 929 | resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} 930 | dependencies: 931 | '@types/hast': 3.0.3 932 | '@types/mdast': 4.0.3 933 | '@ungap/structured-clone': 1.2.0 934 | devlop: 1.1.0 935 | micromark-util-sanitize-uri: 2.0.0 936 | trim-lines: 3.0.1 937 | unist-util-position: 5.0.0 938 | unist-util-visit: 5.0.0 939 | dev: false 940 | 941 | /micromark-util-character@2.0.1: 942 | resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} 943 | dependencies: 944 | micromark-util-symbol: 2.0.0 945 | micromark-util-types: 2.0.0 946 | dev: false 947 | 948 | /micromark-util-encode@2.0.0: 949 | resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} 950 | dev: false 951 | 952 | /micromark-util-sanitize-uri@2.0.0: 953 | resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} 954 | dependencies: 955 | micromark-util-character: 2.0.1 956 | micromark-util-encode: 2.0.0 957 | micromark-util-symbol: 2.0.0 958 | dev: false 959 | 960 | /micromark-util-symbol@2.0.0: 961 | resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} 962 | dev: false 963 | 964 | /micromark-util-types@2.0.0: 965 | resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} 966 | dev: false 967 | 968 | /minisearch@6.3.0: 969 | resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} 970 | dev: false 971 | 972 | /mrmime@1.0.1: 973 | resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} 974 | engines: {node: '>=10'} 975 | dev: false 976 | 977 | /nanoid@3.3.7: 978 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 979 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 980 | hasBin: true 981 | dev: false 982 | 983 | /parse5@7.1.2: 984 | resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} 985 | dependencies: 986 | entities: 4.5.0 987 | dev: false 988 | 989 | /picocolors@1.0.0: 990 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 991 | dev: false 992 | 993 | /postcss@8.4.31: 994 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 995 | engines: {node: ^10 || ^12 || >=14} 996 | dependencies: 997 | nanoid: 3.3.7 998 | picocolors: 1.0.0 999 | source-map-js: 1.0.2 1000 | dev: false 1001 | 1002 | /preact@10.19.2: 1003 | resolution: {integrity: sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg==} 1004 | dev: false 1005 | 1006 | /property-information@6.4.0: 1007 | resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} 1008 | dev: false 1009 | 1010 | /rollup@4.5.2: 1011 | resolution: {integrity: sha512-CRK1uoROBfkcqrZKyaFcqCcZWNsvJ6yVYZkqTlRocZhO2s5yER6Z3f/QaYtO8RGyloPnmhwgzuPQpNGeK210xQ==} 1012 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1013 | hasBin: true 1014 | optionalDependencies: 1015 | '@rollup/rollup-android-arm-eabi': 4.5.2 1016 | '@rollup/rollup-android-arm64': 4.5.2 1017 | '@rollup/rollup-darwin-arm64': 4.5.2 1018 | '@rollup/rollup-darwin-x64': 4.5.2 1019 | '@rollup/rollup-linux-arm-gnueabihf': 4.5.2 1020 | '@rollup/rollup-linux-arm64-gnu': 4.5.2 1021 | '@rollup/rollup-linux-arm64-musl': 4.5.2 1022 | '@rollup/rollup-linux-x64-gnu': 4.5.2 1023 | '@rollup/rollup-linux-x64-musl': 4.5.2 1024 | '@rollup/rollup-win32-arm64-msvc': 4.5.2 1025 | '@rollup/rollup-win32-ia32-msvc': 4.5.2 1026 | '@rollup/rollup-win32-x64-msvc': 4.5.2 1027 | fsevents: 2.3.3 1028 | dev: false 1029 | 1030 | /search-insights@2.11.0: 1031 | resolution: {integrity: sha512-Uin2J8Bpm3xaZi9Y8QibSys6uJOFZ+REMrf42v20AA3FUDUrshKkMEP6liJbMAHCm71wO6ls4mwAf7a3gFVxLw==} 1032 | dev: false 1033 | 1034 | /shikiji-transformers@0.7.4: 1035 | resolution: {integrity: sha512-oykilNekcW2FnRGbvZm+RNWHYroSeCVMOaMMwAbxozZgpTdcJtHoA+1+MDFw6/o2hCkX88kKbxG6FwAZoUZ6WQ==} 1036 | dependencies: 1037 | shikiji: 0.7.4 1038 | dev: false 1039 | 1040 | /shikiji@0.7.4: 1041 | resolution: {integrity: sha512-N5dmPvyhH/zfcsuWysUEAMwRJDMz26LUns2VEUs5y4Ozbf5jkAODU0Yswjcf/tZAwpFnk5x3y34dupFMnF2+NA==} 1042 | dependencies: 1043 | hast-util-to-html: 9.0.0 1044 | dev: false 1045 | 1046 | /source-map-js@1.0.2: 1047 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1048 | engines: {node: '>=0.10.0'} 1049 | dev: false 1050 | 1051 | /space-separated-tokens@2.0.2: 1052 | resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 1053 | dev: false 1054 | 1055 | /stringify-entities@4.0.3: 1056 | resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} 1057 | dependencies: 1058 | character-entities-html4: 2.1.0 1059 | character-entities-legacy: 3.0.0 1060 | dev: false 1061 | 1062 | /tabbable@6.2.0: 1063 | resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} 1064 | dev: false 1065 | 1066 | /to-fast-properties@2.0.0: 1067 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1068 | engines: {node: '>=4'} 1069 | dev: false 1070 | 1071 | /trim-lines@3.0.1: 1072 | resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 1073 | dev: false 1074 | 1075 | /unist-util-is@6.0.0: 1076 | resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} 1077 | dependencies: 1078 | '@types/unist': 3.0.2 1079 | dev: false 1080 | 1081 | /unist-util-position@5.0.0: 1082 | resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 1083 | dependencies: 1084 | '@types/unist': 3.0.2 1085 | dev: false 1086 | 1087 | /unist-util-stringify-position@4.0.0: 1088 | resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 1089 | dependencies: 1090 | '@types/unist': 3.0.2 1091 | dev: false 1092 | 1093 | /unist-util-visit-parents@6.0.1: 1094 | resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} 1095 | dependencies: 1096 | '@types/unist': 3.0.2 1097 | unist-util-is: 6.0.0 1098 | dev: false 1099 | 1100 | /unist-util-visit@5.0.0: 1101 | resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 1102 | dependencies: 1103 | '@types/unist': 3.0.2 1104 | unist-util-is: 6.0.0 1105 | unist-util-visit-parents: 6.0.1 1106 | dev: false 1107 | 1108 | /vfile-location@5.0.2: 1109 | resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} 1110 | dependencies: 1111 | '@types/unist': 3.0.2 1112 | vfile: 6.0.1 1113 | dev: false 1114 | 1115 | /vfile-message@4.0.2: 1116 | resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} 1117 | dependencies: 1118 | '@types/unist': 3.0.2 1119 | unist-util-stringify-position: 4.0.0 1120 | dev: false 1121 | 1122 | /vfile@6.0.1: 1123 | resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} 1124 | dependencies: 1125 | '@types/unist': 3.0.2 1126 | unist-util-stringify-position: 4.0.0 1127 | vfile-message: 4.0.2 1128 | dev: false 1129 | 1130 | /vite@5.0.2: 1131 | resolution: {integrity: sha512-6CCq1CAJCNM1ya2ZZA7+jS2KgnhbzvxakmlIjN24cF/PXhRMzpM/z8QgsVJA/Dm5fWUWnVEsmtBoMhmerPxT0g==} 1132 | engines: {node: ^18.0.0 || >=20.0.0} 1133 | hasBin: true 1134 | peerDependencies: 1135 | '@types/node': ^18.0.0 || >=20.0.0 1136 | less: '*' 1137 | lightningcss: ^1.21.0 1138 | sass: '*' 1139 | stylus: '*' 1140 | sugarss: '*' 1141 | terser: ^5.4.0 1142 | peerDependenciesMeta: 1143 | '@types/node': 1144 | optional: true 1145 | less: 1146 | optional: true 1147 | lightningcss: 1148 | optional: true 1149 | sass: 1150 | optional: true 1151 | stylus: 1152 | optional: true 1153 | sugarss: 1154 | optional: true 1155 | terser: 1156 | optional: true 1157 | dependencies: 1158 | esbuild: 0.19.7 1159 | postcss: 8.4.31 1160 | rollup: 4.5.2 1161 | optionalDependencies: 1162 | fsevents: 2.3.3 1163 | dev: false 1164 | 1165 | /vitepress@1.0.0-rc.30(@algolia/client-search@4.20.0)(search-insights@2.11.0): 1166 | resolution: {integrity: sha512-OolAbFU2hjs0KuIpPq0wRd4vJlTMvrFgHSh/hB+XQid7U31KtB6F1NxWihMwKkwncpxu9mt2Somet5AGiyTgPA==} 1167 | hasBin: true 1168 | peerDependencies: 1169 | markdown-it-mathjax3: ^4.3.2 1170 | postcss: ^8.4.31 1171 | peerDependenciesMeta: 1172 | markdown-it-mathjax3: 1173 | optional: true 1174 | postcss: 1175 | optional: true 1176 | dependencies: 1177 | '@docsearch/css': 3.5.2 1178 | '@docsearch/js': 3.5.2(@algolia/client-search@4.20.0)(search-insights@2.11.0) 1179 | '@types/markdown-it': 13.0.7 1180 | '@vitejs/plugin-vue': 4.5.0(vite@5.0.2)(vue@3.3.8) 1181 | '@vue/devtools-api': 6.5.1 1182 | '@vueuse/core': 10.6.1(vue@3.3.8) 1183 | '@vueuse/integrations': 10.6.1(focus-trap@7.5.4)(vue@3.3.8) 1184 | focus-trap: 7.5.4 1185 | mark.js: 8.11.1 1186 | minisearch: 6.3.0 1187 | mrmime: 1.0.1 1188 | shikiji: 0.7.4 1189 | shikiji-transformers: 0.7.4 1190 | vite: 5.0.2 1191 | vue: 3.3.8 1192 | transitivePeerDependencies: 1193 | - '@algolia/client-search' 1194 | - '@types/node' 1195 | - '@types/react' 1196 | - '@vue/composition-api' 1197 | - async-validator 1198 | - axios 1199 | - change-case 1200 | - drauu 1201 | - fuse.js 1202 | - idb-keyval 1203 | - jwt-decode 1204 | - less 1205 | - lightningcss 1206 | - nprogress 1207 | - qrcode 1208 | - react 1209 | - react-dom 1210 | - sass 1211 | - search-insights 1212 | - sortablejs 1213 | - stylus 1214 | - sugarss 1215 | - terser 1216 | - typescript 1217 | - universal-cookie 1218 | dev: false 1219 | 1220 | /vue-demi@0.14.6(vue@3.3.8): 1221 | resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} 1222 | engines: {node: '>=12'} 1223 | hasBin: true 1224 | requiresBuild: true 1225 | peerDependencies: 1226 | '@vue/composition-api': ^1.0.0-rc.1 1227 | vue: ^3.0.0-0 || ^2.6.0 1228 | peerDependenciesMeta: 1229 | '@vue/composition-api': 1230 | optional: true 1231 | dependencies: 1232 | vue: 3.3.8 1233 | dev: false 1234 | 1235 | /vue@3.3.8: 1236 | resolution: {integrity: sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==} 1237 | peerDependencies: 1238 | typescript: '*' 1239 | peerDependenciesMeta: 1240 | typescript: 1241 | optional: true 1242 | dependencies: 1243 | '@vue/compiler-dom': 3.3.8 1244 | '@vue/compiler-sfc': 3.3.8 1245 | '@vue/runtime-dom': 3.3.8 1246 | '@vue/server-renderer': 3.3.8(vue@3.3.8) 1247 | '@vue/shared': 3.3.8 1248 | dev: false 1249 | 1250 | /web-namespaces@2.0.1: 1251 | resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 1252 | dev: false 1253 | 1254 | /zwitch@2.0.4: 1255 | resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 1256 | dev: false 1257 | -------------------------------------------------------------------------------- /public/_headers: -------------------------------------------------------------------------------- 1 | /assets/* 2 | cache-control: max-age=31536000 3 | cache-control: immutable 4 | -------------------------------------------------------------------------------- /public/logo-black.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tutorial/iframes.md: -------------------------------------------------------------------------------- 1 | # iframe Tutorial 2 | 3 | Welcome to the iframe tutorial! 4 | 5 | ::: tip Important 6 | **This tutorial assumes you have already completed the [Getting Started with WidgetBot](/tutorial/) tutorial.** If you have not, please read it and **invite the bot**. 7 | ::: 8 | 9 | ::: tip Need help? 10 | If you need any assistance adding WidgetBot, please ask in [the server](https://discord.gg/NYBEhN7). **However**, please make sure you mention **what the issue is**, **send your code** in a codeblock (` ``` `), include **your server and channel IDs**, and optionally include **a link to your site**. 11 | ::: 12 | 13 | ::: warning Important 14 | Using an iframe may break the browser's back button. We recommend using [html-embed](/embed/html-embed/tutorial) or [react-embed](/embed/react-embed/) when you can use JavaScript. 15 | ::: 16 | 17 | ## Getting Started 18 | 19 | To get started, add the following code where you want the widget to display. 20 | 21 | :::tip Example Code 22 | ```html 23 | 24 | ``` 25 | ::: 26 | If you run your site with this code, you should see the widget, showing the official WidgetBot server. 27 | 28 | ## Setting your server 29 | 30 | The WidgetBot URL has the following format: 31 | ``` 32 | https://e.widgetbot.io/channels/SERVERID/CHANNELID 33 | ``` 34 | 35 | In the example code, the SERVERID is `299881420891881473` and the CHANNELID is `355719584830980096`. 36 | 37 | To set it to your server, you must change the Server ID and Channel ID. 38 | 39 | You can get your URL by right-clicking the channel in Discord, clicking **Copy Link**, and editing `discord.com` to `e.widgetbot.io`. Alternatively, you can manually get the IDs and create the URL: 40 | 41 | You can get the Server and Channel IDs from Discord: Go to the Appearance tab in User Settings, and turn on Developer Mode. Then, right-click the server icon or channel and click `Copy ID`. 42 | 43 | ::: tip Note 44 | The Channel ID you choose will be the default channel that will show when the widget loads. However, the user can switch the channel. 45 | ::: 46 | Once you set the Server ID and Channel ID, the widget should now show your server. 47 | 48 | ::: tip Complete! 49 | You have successfully set up WidgetBot. 50 | ::: 51 | -------------------------------------------------------------------------------- /tutorial/index.md: -------------------------------------------------------------------------------- 1 | # Tutorial 2 | 3 | To get started with WidgetBot, first you must invite the bot to your server. 4 | 5 | ::: tip Need help? 6 | If you need any assistance adding WidgetBot, please ask in [the server](https://discord.gg/NYBEhN7). **However**, please make sure you mention **what the issue is**, **send your code** in a codeblock (` ``` `), include **your server and channel IDs**, and optionally include **a link to your site**. 7 | ::: 8 | 9 | ## Adding the Bot 10 | 11 | **[Add the official bot](https://add.widgetbot.io)** 12 | 13 | ::: tip Important 14 | WidgetBot will not work if you don't add the bot to your server! 15 | ::: 16 | 17 | ::: tip Quick Setup 18 | You can use the /setup command to quickly setup WidgetBot! 19 | ::: 20 | 21 | After you add the bot to your server, you need to pick a format to use in your website. 22 | You can choose between Crate and one of our inline formats. 23 | 24 | ## Formats 25 | 26 | * **[Crate (recommended)](/embed/crate/tutorial)**: Shows a little chat button in the corner of your website. It shows message notifications and provides an API. [Tutorial](/embed/crate/tutorial), [Documentation](/embed/crate/) 27 | 28 | ### Inline formats 29 | These let you put a chat box in your site you can change the size, etc. 30 | 31 | * **[html-embed](/embed/html-embed/tutorial)**: A lightweight iframe wrapper which provides access to the [embed-api](/embed/embed-api/). Requires JavaScript. [Tutorial](/embed/html-embed/tutorial), [Documentation](/embed/html-embed/) 32 | * **[react-embed](/embed/react-embed/)**: Provides access to the embed as a React component, and lets you use the [embed-api](/embed/embed-api/). [Documentation](/embed/react-embed/) 33 | * **[iframe](iframes)**: Use this when you can't use JavaScript. It does not provide access to the [embed-api](/embed/embed-api/), and may break the browser back button. [Tutorial](iframes) 34 | 35 | Choose one of the formats to continue the tutorial and learn about adding the embed to your website. 36 | --------------------------------------------------------------------------------