summaryrefslogtreecommitdiffstats
path: root/browser/components/storybook/.storybook/preview.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/storybook/.storybook/preview.mjs')
-rw-r--r--browser/components/storybook/.storybook/preview.mjs111
1 files changed, 111 insertions, 0 deletions
diff --git a/browser/components/storybook/.storybook/preview.mjs b/browser/components/storybook/.storybook/preview.mjs
new file mode 100644
index 0000000000..55e7f00f10
--- /dev/null
+++ b/browser/components/storybook/.storybook/preview.mjs
@@ -0,0 +1,111 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import { css, html } from "lit.all.mjs";
+import { MozLitElement } from "toolkit/content/widgets/lit-utils.mjs";
+import { setCustomElementsManifest } from "@storybook/web-components";
+import customElementsManifest from "../custom-elements.json";
+import { insertFTLIfNeeded, connectFluent } from "./fluent-utils.mjs";
+
+// Base Fluent set up.
+connectFluent();
+
+// Any fluent imports should go through MozXULElement.insertFTLIfNeeded.
+window.MozXULElement = {
+ insertFTLIfNeeded,
+
+ // For some reason Storybook doesn't watch the static folder. By creating a
+ // method with a dynamic import we can pull the desired files into the bundle.
+ async importCss(resourceName) {
+ // eslint-disable-next-line no-unsanitized/method
+ let file = await import(
+ /* webpackInclude: /.*[\/\\].*\.css$/ */
+ `browser/themes/shared/${resourceName}`
+ );
+ // eslint-disable-next-line no-unsanitized/method
+ file = await import(
+ /* webpackInclude: /.*[\/\\].*\.css$/ */
+ `browser/components/firefoxview/${resourceName}`
+ );
+ return file;
+ },
+};
+
+/**
+ * Wrapper component used to decorate all of our stories by providing access to
+ * `in-content/common.css` without leaking styles that conflict Storybook's CSS.
+ *
+ * More information on decorators can be found at:
+ * https://storybook.js.org/docs/web-components/writing-stories/decorators
+ *
+ * @property {Function} story
+ * Storybook uses this internally to render stories. We call `story` in our
+ * render function so that the story contents have the same shadow root as
+ * `with-common-styles` and styles from `in-content/common` get applied.
+ * @property {Object} context
+ * Another Storybook provided property containing additional data stories use
+ * to render. If we don't make this a reactive property Lit seems to optimize
+ * away any re-rendering of components inside `with-common-styles`.
+ */
+class WithCommonStyles extends MozLitElement {
+ static styles = css`
+ :host {
+ display: block;
+ height: 100%;
+ padding: 1rem;
+ box-sizing: border-box;
+ }
+
+ :host,
+ :root {
+ font: message-box;
+ appearance: none;
+ background-color: var(--in-content-page-background);
+ color: var(--in-content-page-color);
+ -moz-box-layout: flex;
+ }
+
+ :host,
+ :root:not(.system-font-size) {
+ font-size: 15px;
+ }
+ `;
+
+ static properties = {
+ story: { type: Function },
+ context: { type: Object },
+ };
+
+ storyContent() {
+ if (this.story) {
+ return this.story();
+ }
+ return html` <slot></slot> `;
+ }
+
+ render() {
+ return html`
+ <link
+ rel="stylesheet"
+ href="chrome://global/skin/in-content/common.css"
+ />
+ ${this.storyContent()}
+ `;
+ }
+}
+customElements.define("with-common-styles", WithCommonStyles);
+
+// Wrap all stories in `with-common-styles`.
+export const decorators = [
+ (story, context) =>
+ html`
+ <with-common-styles
+ .story=${story}
+ .context=${context}
+ ></with-common-styles>
+ `,
+];
+
+// Enable props tables documentation.
+setCustomElementsManifest(customElementsManifest);