Skip to content

Storybook

Demoing components that uses contexts is not different from standard ones in most cases.

Context consumed with class mixins

If the context is consumed using class mixins, i.e., reflected in a property, just pass the value using args:

js
export default {
  title: 'Components/MyComponent',
  component: 'my-component',  
  // my-component consumes a context reflected in foo property
  args: {
    foo: 'bar',
  },
}

export const Default = {
  args: {},
}
export default {
  title: 'Components/MyComponent',
  component: 'my-component',  
  // my-component consumes a context reflected in foo property
  args: {
    foo: 'bar',
  },
}

export const Default = {
  args: {},
}

Context consumed with controller/dedicated elements

For contexts of child components, consumed with ContextConsumer controller or context-consumer element, is necessary to provide the contexts in the root component. This can be accomplished using a custom render function and same techniques described in testing guide.

While it works, it makes harder to create stories. Using wc-context low level API is possible to create a story decorator that accepts a contexts hash parameter and provides the respective contexts:

js
import { registerContext } from 'wc-context'

export function withContexts = (story, context) => {
  const el = story()

  const contexts = context.parameters.contexts
  if (contexts) {
    for (const [context, value] of Object.entries(contexts)) {
      registerContext(el, context, value)
    }
  }

  return el
}
import { registerContext } from 'wc-context'

export function withContexts = (story, context) => {
  const el = story()

  const contexts = context.parameters.contexts
  if (contexts) {
    for (const [context, value] of Object.entries(contexts)) {
      registerContext(el, context, value)
    }
  }

  return el
}

To use, register the decorator for each story or globally in storybook 'preview.js'

js
import { withContexts } from './withContexts.js'

export default {
  title: 'Components/MyComponent',
  component: 'my-component',
  decorators: [withContexts],
  // my-component consumes the "foo" context using controller or has a child element that consumes it
  parameters: {
    contexts: {
      foo: 'bar'
    }
  },
}

export const Default = {
  args: {},
}
import { withContexts } from './withContexts.js'

export default {
  title: 'Components/MyComponent',
  component: 'my-component',
  decorators: [withContexts],
  // my-component consumes the "foo" context using controller or has a child element that consumes it
  parameters: {
    contexts: {
      foo: 'bar'
    }
  },
}

export const Default = {
  args: {},
}

Released under the MIT License.