Kiln API

CSS Classes

Kiln exports a number of CSS classes that may be used by plugins.

Class

Description

kiln-hide

generic class to hide elements

kiln-clearfix

clearfix, so we don't keep reinventing the wheel

kiln-normal-text

inherit text styles from component

kiln-display1

large display text

kiln-headline

smaller display text

kiln-title

same size as form headers

kiln-subheading

same size as drawer section headers

kiln-body

standard kiln size

kiln-caption

smaller text

kiln-button

all caps button text

kiln-list-header

very small all caps text with background

kiln-link

link styling

kiln-keyboard

keyboard shortcut styling

kiln-code

code styling

kiln-primary-color

kiln primary color (blue-grey)

kiln-accent-color

kiln accent color (ingigo)

JavaScript API

Kiln attaches a window.kiln object when it has loaded, which contains utilities, vue components, and places to put custom helpers, inputs, validators, etc. Note that you may always override built-in inputs, helpers, validators, etc with your own code if you need to.

Property

Description

componentModels

compiled model.js files, used by kiln to save / render components

componentTemplates

compiled handlebars templates, used by kiln to re-render components

helpers

handlebars helper functions. attach custom helpers here

inputs

form inputs, defined by vue components. attach custom inputs and attachedButton components here

isInvalidDrag

boolean that prevents dragging components when selecting text

locals

object with url and query params as well as site and user data

modals

vue components that may be displayed by calling store.dispatch('openModal')

plugins

vuex plugins that are called when kiln loads. may subscribe to state changes

preloadData

read-only composed page data, used to bootstrap kiln on load

preloadSchemas

read-only object that contains schemas for all loaded components. used to bootstrap kiln

selectorButtons

custom vue components that will be applied to all component selectors

toolbarButtons

custom vue components that will be added to the edit toolbar

navButtons

custom vue components that will be added to the clay nav

navContent

custom vue components that should be rendered inside the clay nav when their corresponding navButton is clicked. Make sure to use the same object key for corresponding navButton + navContent.

transformers

object containing all magic-button transform functions. attach custom transformers here

utils

various utilities, useful for plugins

validators

object containing all validators. attach custom validators here

Custom Nav Menu Items

You may add options to the Clay menu to be displayed between New Page and Sign Out options. The trigger buttons should extend the navMenuButton component included in window.kiln.components and should be added to window.kiln.navButtons.

Custom nav buttons should dispatch the openDrawer action with the same id used to name the nav button and nav content in the global kiln object.

The body of the nav option should be added to window.kiln.navContent using the same object key that was used to add the corresponding nav button.

Note that due to the vast difference in functionality and state data between view mode and edit mode, external nav menu options will not be loaded into the nav outside of edit mode.

Custom Validators

You may add custom validation to window.kiln.validators. A validator should export label, description, type (either error or warning), and a validate method. The validate method receives the whole page state, so validators can be extremely flexible.

Most validators concern themselves with components and/or fields, and should make use of the helper functions in kiln.utils.validationHelpers such as forEachComponent and forEachField. The built-in validators such as required are good examples to work off of.

Validators must return an array of errors (or warnings), where each issue includes uri, and field properties. Optionally, an issue may include location (which creates a link to the relevant form) and preview (which displays context for an issue).

Validating The DOM

While validators may do DOM lookups to determine validity, remember that DOM lookups are slow compared to reducing on the state object directly. Please keep this in mind when writing validators that only concern themselves with page/component/etc data.

Utilities

Kiln exports a number of JavaScript utils to the browser in the window.kiln.utils object.

Property

Description

componentElements

methods for finding component elements

caret

methods for getting/setting caret in text fields

create()

function to create new component instances

headComponents

methods for finding head components

interpolate()

function to interpolate data the same way placeholders do

label()

function to generate labels the same way selectors and forms do

promises

native Promise versions of bluebird methods

references

constants used by kiln, as well as common methods

urls

methods for dealing with urls and uris

getAvailableComponents()

function to determine which components are allowed in a list

local

methods to get/set localstorage

validationHelpers

methods to help with pre-publish validation

fieldHelpers

methods to help with custom inputs

logger()

function to create a new logger for a file (pass in the __filename when calling this)

version

current Kiln version

components

Vue.js components, exported by Kiln

Vue Components

Kiln exports a number of KeenUI and custom Vue.js components that may be used in plugins.

Component

Description

avatar

circular avatar image

filterableList

filterable list, useful for many types of UI

person

name, avatar, and subheader for a person, with actions

timepicker

text input that wraps UiTextbox for time-formatted inputs

navMenuButton

button component that should be used for custom navButtons

UiAutocomplete

KeenUI autocomplete

UiButton

KeenUI button

UiCheckbox

single KeenUI checkbox

UiCheckboxGroup

group of KeenUI checkboxes

UiCollapsible

KeenUI collapsible content

UiDatepicker

KeenUI datepicker

UiFileupload

KeenUI file upload button

UiIcon

KeenUI icon that uses material design icons

UiIconButton

KeenUI icon button

UiMenu

KeenUI menu

UiProgressCircular

KeenUI circular progress indicator

UiRadioGroup

group of KeenUI radio inputs

UiRippleInk

KeenUI ripple ink effect

UiSelect

KeenUI enhanced select dropdown

UiSlider

KeenUI slider

UiSwitch

KeenUI switch

UiTabs

KeenUI tabs

UiTab

individual KeenUI tab

UiTextbox

KeenUI textbox

UiTooltip

KeenUI tooltip

Vuex State

The Vuex state looks similar to this:

{
components: {
// component instance data, keyed by uri
// components that have been removed from the page will be empty objects
'domain.com/_components/some-component/instances/some-instance': { /* some data */ }
},
componentDefaults: {
// default component data, used when creating new components
'some-component': { /* some data */ }
},
page: {
uri: 'domain.com/_pages/current-page',
data: { /* page areas, layout, and customURL */ },
state: {
// this page's representation in the list (data that's sent to the page list)
published: false,
scheduled: false,
createdAt: 0,
publishTime: null,
scheduledTime: null,
siteSlug: 'some-site',
title: '',
updateTime: null,
uri: 'domain.com/_pages/current-page',
url: ''
}
},
layout: {
// this layout's representation in the layouts list
published: false,
scheduled: false,
createTime: 'Wed May 23 2018 16:20:05 GMT-0400 (EDT)',
publishTime: null,
scheduleTime: null,
siteSlug: 'some-site',
title: '',
updateTime: null,
updateUser: null,
uri: 'domain.com/_components/some-layout/instances/some-id'
}
user: {
// currently logged-in user
auth: 'write',
imageUrl: 'avatar url',
name: 'Name of User',
provider: 'some-provider',
username: 'some username or email'
},
// ui state management
ui: {
currentForm: { uri, path, data }, // currently opened form
currentAddComponentModal: { currentURI, parentURI, path, available }, // current "add component" modal
currentModal: { title, type, size, data }, // current "simple" modal
currentConfirm: { title, text, button, onConfirm }, // current "confirmation" modal
currentDrawer: null, // current drawer menu, both left and right drawers
currentSelection: null, // currently selected component, gets uri
currentFocus: { uri, path }, // currently focused field/group
currentProgress: 0, // progress bar, gets random number (to prevent flashes)
currentlySaving: false, // don't focus components while forms are saving, gets boolean
metaKey: false, // set to true when meta key is pressed, enables additional functionality in kiln
alerts: [], // array of alerts to display to the user
snackbar: null // current (or previous) snackbar.
// note: snackbars are created imperatively (settings this simply informs the toolbar to create a new snackbar),
// so this won't always be the snackbar displayed (it will be either the one displayed or the previous one displayed)
},
// publishing validation
validation: {
// errors and warnings are arrays of { label, description, items },
// with each item being { field, location, path, uri, preview }
errors: [],
warnings: []
},
// read-only
schemas: {
'some-component': { /* some schema, converted to kiln 5.x syntax */ }
},
locals: {
components: ['list', 'of', 'all', 'components'],
edit: 'true',
params: { /* url params */ },
query: { /* url query params */ },
routes: ['/available', '/routes', '/in', '/current', '/site'],
site: { /* config for current site */ },
url: 'http://current-url',
user: { /* current user data */ }
},
models: {
'some-component': { /* object with save() and/or render() methods */ }
},
templates: {
'some-component': () => {} // render function, precompiled handlebars template
},
site: { /* config for current site */ },
allSites: {
// configs for all sites in the current clay instance
'slug': { /* config */ }
},
url: null,
lists: {
// data from `/_lists`, populated as needed
isLoading: false,
'new-pages': {
error: null,
isLoading: false,
items: [ /* array of list items */ ]
}
},
isLoading: true, // preloading has started
undo: {
atStart: true, // boolean if we're at the start of the history (no undo)
atEnd: true, // boolean if we're at the end of the history (no redo)
cursor: 0 // current snapshot the user is on. used to undo/redo non-destructively
}
}