STAC Browser has a pluggable widget system that lets you inject custom Vue components into specific locations on the page. Widgets can display pretty much any content you need - using either the pre-defined widgets or your own Vue components.
Widgets are configured in widgets.config.js at the project root.
The file exports an object where each key is a hook ID (the location on the page, see below)
and each value is an array of widget definitions to render at that location.
Multiple widgets can be added to the same hook — they render in array order.
After editing the file, restart or rebuild STAC Browser for changes to take effect.
For pre-defined widgets (located in src/widgets), specify the id
(filename without the .vue extension) and any props:
{
id: 'AlertBox',
props: {
title: 'Warning',
text: 'This catalog is currently under maintenance.'
}
}To use a component from outside src/widgets/, import it with Vue's defineAsyncComponent
and assign it to the component property:
{
id: 'MyCustomWidget',
component: defineAsyncComponent(() => import('../MyCustomWidget.vue')),
props: {
myOption: true
}
}Make sure the beginning of the config file includes:
import { defineAsyncComponent } from 'vue';All pre-defined widgets are stored in src/widgets.
Renders a dismissible alert banner.
| Props | Type | Default | Description |
|---|---|---|---|
title |
String | '' |
Bold heading shown before the text. |
text |
String | '' |
The alert message body. |
variant |
String | 'warning' |
Color variant: 'warning', 'danger', 'success', 'info', etc. |
dismissible |
Boolean | false |
Whether the user can close the alert. |
Renders a simple text with a heading.
| Props | Type | Default | Description |
|---|---|---|---|
title |
String | '' |
Rendered as an <h3> heading. |
text |
String | '' |
Rendered as a <p> paragraph. |
Hooks are named insertion points in the STAC Browser UI where widgets get rendered.
Each hook has an ID like view-catalog-meta-start that you use as the key in
widgets.config.js.
footer-startroot-before-contentroot-endroot-start
view-search-filters-collections-endview-search-filters-collections-startview-search-filters-endview-search-filters-items-endview-search-filters-items-startview-search-filters-startview-search-results-endview-search-results-start
view-catalog-catalogs-endview-catalog-catalogs-startview-catalog-items-endview-catalog-items-startview-catalog-meta-endview-catalog-meta-start
view-item-primary-endview-item-primary-startview-item-secondary-endview-item-secondary-start
view-select-data-source-start
Note: This list is auto-generated. Run npm run docs:hooks to update it after adding new hooks.
A widget is a standard Vue single-file component (.vue file). To create one:
-
Create the component file in
src/widgets/or at another location of your choice. The filename (without extension) must match the component'snameproperty exactly (case-sensitive).For example,
src/widgets/BannerImage.vue:<template> <div class="banner-image"> <img :src="url" :alt="alt" /> </div> </template> <script> export default { name: "BannerImage", props: { url: { type: String, required: true }, alt: { type: String, default: '' } } }; </script> <style lang="scss" scoped> @import "../theme/variables.scss"; .banner-image { margin-bottom: $block-margin; img { max-width: 100%; } } </style>
-
Register it in
widgets.config.jsunder the desired hook:export default { 'view-catalog-meta-start': [ { id: 'BannerImage', props: { url: '/banner.jpg', alt: 'Catalog banner' } }, ], };
-
Rebuild STAC Browser. The widget will be dynamically imported when the hook renders.
Tips:
- Use
@import "../theme/variables.scss"to access shared SCSS variables like$block-margin. - Widgets only receive the
propsdefined inwidgets.config.js— they do not automatically receive page data such as the STAC object or items. You can import them from the Vuex store. - You can place the same widget at multiple hooks with different props.
To add a new widget insertion point to a view:
-
Add a
<WidgetHook>tag in the Vue template of the relevant view or component:<WidgetHook id="view-catalog-custom-start" />WidgetHookis registered as a global component, so no import is needed. -
Update the docs by running:
npm run docs:hooks
This scans all
.vuefiles for<WidgetHook>tags and updates the hook list in this document automatically.