# Configuring components

There are a number of global configuration options you can set to determine how Fractal handles components.

Additionally, components and component collections can also have their own (optional) configuration files associated with them. Component variants are configured within their parent component's configuration file.

# Global configuration options

These options can be set on your Fractal instance using the fractal.components.set() method. See the project settings documentation for more details.

# default.collated

Whether variants should default to being collated in rendered previews.

fractal.components.set('default.collated', true); // default is false

# default.collator

Default collation function, responsible for collating components.

fractal.components.set('default.collator', function(markup, item) {
    return `<!-- Start: @${item.handle} -->\n${markup}\n<!-- End: @${item.handle} -->\n`
});

# default.context

Global context data that will be made available to all components when rendering previews, unless overridden in a collection or component configuration file.

fractal.components.set('default.context', {
    'site-name': 'FooCorp'
});

# default.display

Default global CSS property key/value pairs that preview UIs may choose to use to apply to the preview rendering area.

This does not leak into the styling of the component itself; it is just applied to the area (typically an iframe) that the component is previewed within in plugins such as the web preview UI.

fractal.components.set('default.display', {
    'max-width': '400px'
});

# default.prefix

Global prefix to apply to all generated handles unless overridden in a collection or component configuration file.

fractal.components.set('default.prefix', 'foobar'); // default is null

# default.preview

Which layout (specified by its handle) to use to when rendering previews of this layout. See the preview layouts documentation for more details

fractal.components.set('default.preview', '@my-preview-layout');

# default.status

The status to apply to all components unless overridden in a collection or component configuration file.

fractal.components.set('default.status', 'wip'); // default is 'ready'

# exclude

Glob or array of globs that should be excluded by Fractal when parsing the components directory for component view files.

fractal.components.set('exclude', '**/node_modules/**');

or

fractal.components.set('exclude', ['**/node_modules/**', '**/tests/**']);

# ext

The file extension that will be used for all component view templates. Note that this must include the leading .

fractal.components.set('ext', '.handlebars'); // default is '.hbs'

# label

How the collection of components will be referenced in any navigation.

fractal.components.set('label', 'Patterns'); // default is 'Components'

# path

The path to the directory where your components live.

fractal.components.set('path', __dirname + '/src/components');

# statuses

The set of available statuses that can be assigned to components. See the statuses documentation for details of the default values and how to override them as required.

fractal.components.set('statuses', {
    doing: {
        label: "Doing",
        description: "I'm doing it.",
        color: '#F00'
    },
    done: {
        label: "Done",
        description: "I'm done with this.",
        color: "green"
    }
});

# title

How the collection of components will be referenced in any titles.

fractal.components.set('title', 'Patterns'); // default is 'Components'

# yield

The name of the variable that will be used in preview layouts as a placeholder for the rendered content. See the preview layouts documentation for more information.

fractal.components.set('yield', 'rendered_content'); // default is 'yield'

# Component properties

The following properties can be specified in a component configuration file:

# collated

If set to true, individual variants of this component will not be visible in the web UI - instead the preview of this component will concatenate all variants together into a single preview.

collated: false

# collator

Function to be used when collating components. Can only be specified if using JS formatted config files.

{
    collator: function(markup, item) {
        return `<!-- Start: @${item.handle} -->\n${markup}\n<!-- End: @${item.handle} -->\n`
    }
}

# context

The context data to pass to the template when rendering previews.

context is an inheritable property. Any context data set on the component will be merged with context data set upstream in the configuration cascade.

context:
  buttonText: 'Click here!'
  listItems: ['foo','bar','baz']

# default

The name of the variant that should be used as the default variant. Defaults to default.

default: primary

# display

CSS property key/value pairs that preview UIs may choose to use to apply to the preview rendering area. Useful for doing things like setting max-widths for components that are designed to only be used in sidebars.

This does not leak into the styling of the component itself; it is just applied to the area (typically an iframe) that the component is previewed within in plugins such as the web preview UI.

display:
  max-width: 400px
  min-width: 250px

# handle

Override the generated handle. Note that this will also have the side effect of preventing any prefixes set in upstream collections being applied to the handle.

handle: my-great-component

# hidden

Specifies whether the component is hidden (i.e. does not show up in listings or navigation) or not. Overrides the inferred value from an underscore-prefixed file name if set.

hidden: true

# label

The label is typically displayed in any UI navigation items that refer to the component. Defaults to a title-cased version of the component name if not specified.

label: 'Mega Buttons'

# name

Overrides the component name, which is otherwise extracted from the component view filename. Name values must be all lowercase, and contain only alphanumeric characters with hyphens or underscores for word seperators.

Setting this will also have the affect of changing the component's handle.

name: 'mega-buttons'

# notes

Any notes about the component. Displayed in the web preview UI if present. Any notes set here override content taken from the component's README.md file, if there is one. Accepts markdown.

notes: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

# order

An integer order value, used when sorting components. Overrides any order value set as a property of the filename if set.

order: 4

# preview

Which layout (specified by handle) to use to when rendering previews of this layout. See the preview layouts documentation for more details

preview: '@my-preview-layout'

# status

The status of a component. See the statuses documentation for information on using and customising component statuses.

status is an inheritable property. If not set directly on the component it will inherit any status set further up in the configuration cascade.

status: 'wip'

# title

The title of a component is typically what is displayed at the top of any pages related to the component. Defaults to the same as the label if not specified.

title: 'Amazing Mega Buttons'

# tags

An array of tags to add to the component. Can be used by plugins and tasks to filter components.

tags is an inheritable property. Tags set on the component will be merged with tags set upstream in the configuration cascade.

tags: ['sprint-1', 'foobar']

# meta

An object of arbitrary custom metadata that can be used for whatever you need. For example, the example below is accessible in a preview layout via _target.meta.prop.

meta:
  prop: value

# variants

An array of variant configuration objects. See the variant properties options (below) and the variants documentation for more information on working with variants.

Many variant properties are inherited from the parent component, and all apart from the name value are optional.

variants:
  - name: 'large'
    status: 'ready'
    context:
      buttonText: "I'm a large button!"
  - name: 'small'
    context:
      isSmall: true

# Variant properties

Variants can be defined in the parent component's configuration file. See the variants documentation for full details on creating and configuring variants.

# context

The context data to pass to the variant view template when rendering previews.

Any context set on a variant will be merged with its parent component's (inherited and merged) context data.

context:
  buttonText: 'It's a unicorn button!'

# display

Set the component display property description for details. This is merged with any display properties assigned to the parent content.

display:
  max-width: 300px

# name

The name of the variant. This is the only mandatory property for variant definitions.

A variant with a name of 'large' that belongs to the component named 'button' will have a handle of @button--large.

name: 'unicorn'

# notes

Any notes about the variant. Displayed in the web preview UI if present. Accepts markdown.

notes: "Different from the default component because this one is *funky*."

# preview

Which layout (specified by its handle to use to when rendering previews of this layout. See the preview layouts documentation for more details.

This overrides any the (inherited) preview value of the parent component.

preview: '@my-special-layout'

# status

The status of the variant. Overrides the default status of its parent component.

status: 'wip'

# view

The view file to use. If not specified and a view file matching the variant's handle is found (i.e. component--variant.hbs or similar) then that view will be used. If none is specified and no matching template is found, then the view file for the parent component will be used.

view: 'component--funky.hbs'

# Collection properties

Collections can specify properties that should be applied to all child components of that collection via configuration cascade. See the documentations on collections for more details on how to work with collections, and for details on available non-inheritable properties like label and title.

The following properties can be set on page collections and will affect the pages within them:

# collated

Whether or not child components of this collection should be collated or not.

collated: false

# collator

Function to be used when collating components in the collection. Can only be specified if using JS formatted config files.

{
    collator: function(markup, item) {
        return `<!-- Start: @${item.handle} -->\n${markup}\n<!-- End: @${item.handle} -->\n`
    }
}

# context

context data to be applied to children of the collection. Any context set on a collection will be merged into any contexts set by its children.

context:
  buttonText: 'It's a unicorn button!'

# display

Display property options for child components. This is merged with any display properties set on individual child components.

display:
  max-width: 300px

# preview

The default preview layout (specified by its handle that child components should when being rendered as a preview. See the preview layouts documentation for more details.

preview: '@my-special-layout'

# prefix

A string to be prefixed on to the generated handles of all components (and variants) in that collection.

prefix: 'atoms'

Given the prefix above, a component with the name of button that lives within this collection will have the handle @atoms-button.

# status

The default status for all children of the collection.

status: 'wip'

# tags

An array of tags to add to all child components. Will be merged together with any tags specified on the components themselves.

tags: ['sprint-1', 'foobar']

# meta

An object of arbitrary custom metadata that can be used for whatever you need. For example, the example below is accessible in a preview layout via _target.meta.prop.

meta:
  prop: value

# Example component configuration file

A fairly full-featured, JS-formatted example component config file may look something like this:

module.exports = {
  title: 'Amazing Mega Buttons',
  status: 'prototype',
  tags: ['sprint-1', 'author:mark'],
  meta: {
    addedIn: '1.0'
  },
  preview: '@preview-layout',
  context: {
    'button-text': 'Click me!',
    'is-sparkly': true
  },
  variants: [{
    name: 'large',
    notes: 'Only use this when you need a really big button!',
    context: {
      modifier: 'is-large'
    }
  },{
    name: 'warning',
    status: 'wip',
    meta: {
      addedIn: '1.1'
    },
    context: {
      modifier: 'is-warning',
      'button-text': 'Do not click'
    }
  }]
};