Home

Awesome

Figma Plugin DS

A lightweight UI library for creating Figma plugins.

Contents

Intro

This package contains CSS and Javascript to closely match the look, feel and function of those found in Figma. It has been created without any frameworks (like React, Vue, etc.) and only leverages (native) javascript for components not possible without.

Getting started

You can install this package as a dependecy on your own project: npm install figma-plugin-ds

Styles To use the styles, you can use them via a link tag, or import them like a module using a CSS loader.

<!-- Standard link tag-->
<link rel="stylesheet" href="../../node_modules/figma-plugin-ds/dist/figma-plugin-ds.css">
//You could also inport the css via a CSS Loader in your JS environment (refer to syntax of whatever loader you are using)
import styles from 'figma-plugin-ds/dist/figma-plugin-ds.css'

To use the Select menu or Disclosure components, you will need to import the Javascript files as well. This package supports both standard IIFE (Immediately Invoked Function Expressions) and ES6 Modules. There are a number of ways to get started.

Scripts: IIFE hosted on CDN (quick and easy, I don't want to mess with npm packages)

<script src="https://cdn.jsdelivr.net/gh/thomas-lowry/figma-plugin-ds/dist/iife/figma-plugin-ds.js"></script>
<script>
    selectMenu.init(); //initiates the select menu component
    disclosure.init(); //initiates the disclosure component
<script>

Scripts: IIFE

<!-- Standard link tag-->
<script src="../node_modules/figma-plugin-ds/dist/iife/figma-plugin-ds.js"></script> 

Scripts: ES6 Modules

import { selectMenu, disclosure } from 'figma-plugin-ds';

Roadmap


Components

Button

To use the button, use the following HTML markup. Each button has a destructive option. Teritary buttons are styled like hyperlinks.

<!-- Primary -->
<button class='button button--primary'>Label</button> 
<button class='button button--primary-destructive'>Label</button>
<button class='button button--primary' disabled>Label</button> 

<!-- Secondary -->
<button class='button button--secondary'>Label</button>
<button class='button button--secondary-destructive'>Label</button>
<button class='button button--secondary' disabled>Label</button>

<!-- Tertirary (Hyperlink style button) -->
<button class='button button--tertiary'>Label</button>
<button class='button button--tertiary-destructive'>Label</button>
<button class='button button--tertiary' disabled>Label</button>

Modifiers

Modifier classDescription
button--primaryPrimary button
button--primary-destructivePrimary button with red destructive variant for actions such as deleting something
button--secondarySecondary button with outline style
button--secondary-destructiveSecondary button with red destructive variant for actions such as deleting something
button--tertiaryTertiary button with hyperlink style
button--tertiary-destructiveTertiary button with red destructive variant for actions such as deleting something

Checkbox

To use the checkbox, use the following HTML markup. Remember each checkbox should get a unique ID that is referenced in the label. This ensures the checkbox and the entire label are clickable.

<!-- Checkbox unchecked -->
<div class="checkbox">
  <input id="uniqueId" type="checkbox" class="checkbox__box">
  <label for="uniqueId" class="checkbox__label">Label</label>
</div>

<!-- Checkbox checked -->
<div class="checkbox">
  <input id="uniqueId" type="checkbox" class="checkbox__box" checked>
  <label for="uniqueId" class="checkbox__label">Label</label>
</div>

<!-- Checkbox disabled -->
<div class="checkbox">
  <input id="uniqueId" type="checkbox" class="checkbox__box" disabled>
  <label for="uniqueId" class="checkbox__label">Label</label>
</div>

Disclosure

To use a disclosure panel, you must use the following markup and also make sure you initialize the Javascript for the disclosure to work.

<!-- Disclosure -->
<ul class="disclosure">
  <li class="disclosure__item disclosure--expanded">
    <div class="disclosure__label disclosure--section">Disclosure heading</div> <!-- This item is styled as a section -->
    <div class="disclosure__content">Panel content here</div>
  </li>

  <li class="disclosure__item disclosure--expanded"> <!-- This item is expanded on load -->
    <div class="disclosure__label">Disclosure heading</div>
    <div class="disclosure__content">Panel content here</div>
  </li>

  <li class="disclosure__item">
    <div class="disclosure__label">Disclosure heading</div>
    <div class="disclosure__content">Panel content here</div>
  </li>
</ul>

To initialize with Javascript:

//initialize all disclosure panels
disclosure.init();

//uninitialize all disclosure panels
disclosure.destroy();

Modifiers

Modifier classDescription
disclosure--sectionAdd this class to the disclosure__label to style it like a heading
disclosure--expandedAdd this class to the disclosure__item to have it expanded on load

Icon

To use the icon component, use the following markup. Apply the appropriate modifier class to select the item you wish to use, you can also add additional modifiers to change the color, or even spin the icon. You can also specify no icon name to use a text character as an icon (for example, like found in the width + height icon inputs in Figma)

<!-- Icon -->
<div class="icon icon--theme"></div>

<!-- Icon with blue modifier class to change color -->
<div class="icon icon--theme icon--blue"></div>

<!-- Spinner icon with spinning animation-->
<div class="icon icon--spinner icon--spin"></div>

<!-- Text icon -->
<div class="icon">W</div>

Modifiers

Modifier classDescription
icon--iconName*Sepcify which icon to use. Ex: icon--adjust or icon--settings
icon--spinCauses the icon to spin in an endless loop (for example: a loader used with icon--spinner)
icon--colorName*Pass the name of any Figma color var to this prop. Ex: icon--blue or icon--black3

*Colors accepted: icon--blue, icon--purple, icon--purple4, icon--hot-pink, icon--green, icon--red, icon--yellow, icon--black, icon--black8, icon--black3, icon--white, icon--white8, icon--white4

Icons

To use an icon, add one of the following modifier classes (see markup example above).

IconModifier class
IconAdjusticon--adjust
IconAlerticon--alert
IconAngleicon--angle
IconArrowLeftRighticon--arrow-left-right
IconUpDownicon--updown
IconAutoLayoutHorizontalicon--auto-layout-horizontal
IconAutoLayoutVerticalicon--auto-layout-vertical
IconBackicon--back
IconBlendEmptyicon--blend-empty
IconBlendicon--blend
IconBreakicon--break
IconCaretDownicon--caret-down
IconCaretLefticon--caret-left
IconCaretRighticon--caret-right
IconCaretUpicon--caret-up
IconCheckicon--check
IconCloseicon--close
IconComponenticon--component
IconCornerRadiusicon--corner-radius
IconCornersicon--corners
IconDistributeHorizontalSpacingicon--distribute-horizontal-spacing
IconDistributeVerticalSpacingicon--distribute-vertical-spacing
IconDrafticon--draft
IconEffectsicon--effects
IconEllipsesicon--ellipses
IconEyedroppericon--eyedropper
IconForwardicon--forward
IconFrameicon--frame
IconGroupicon--group
IconHiddenicon--hidden
IconHorizontalPaddingicon--horizontal-padding
IconHyperlinkicon--hyperlink
IconImageicon--image
IconInstanceicon--instance
IconKeyicon--key
IconLayoutAlignBottomicon--layout-align-bottom
IconAlignHorizontalCentersicon--align-horizontal-centers
IconAlignLefticon--align-left
IconAlignRighticon--align-right
IconAlignTopicon--align-top
IconAlignVerticalCentersicon--align-vertical-centers
IconLayoutGridColumnsicon--layout-grid-columns
IconLayoutGridRowsicon--layout-grid-rows
IconLayoutGridUniformicon--layout-grid-uniform
IconLibraryicon--library
IconLinkBrokenicon--link-broken
IconLinkConnectedicon--link-connected
IconListDetailedicon--list-detailed
IconListTileicon--list-tile
IconListicon--list
IconLockOfficon--lock-off
IconLockOnicon--lock-on
IconMinusicon--minus
IconPlayicon--play
IconPlusicon--plus
IconRandomicon--random
IconRecenticon--recent
IconResizeToFiticon--resize-to-fit
IconResolveFilledicon--resolve-filled
IconResolveicon--resolve
IconReverseicon--reverse
IconSearchLargeicon--search-large
IconSearchicon--search
IconSettingsicon--settings
IconShareicon--share
IconSmileyicon--smiley
IconSortAlphaAscicon--sort-alpha-asc
IconSortAlphaDscicon--sort-alpha-dsc
IconSortTopBottomicon--sort-top-bottom
IconSpacingicon--spacing
IconSpinnericon--spinner
IconStarOfficon--star-off
IconStarOnicon--star-on
IconStrokeWeighticon--stroke-weight
IconStylesicon--styles
IconSwapicon--swap
IconThemeicon--theme
IconTidyUpGridicon--tidy-up-grid
IconTidyUpListHorizontalicon--tidy-up-list-horizontal
IconTidyUpListVerticalicon--tidy-up-list-vertical
IconTimericon--timer
IconTrashicon--trash
IconVerticalPaddingicon--vertical-padding
IconVisibleicon--visible
IconWarningLargeicon--warning-large
IconWarningicon--warning

Icon button

The icon button is essentially a wrapper for the icon component. Refer to the icon component above for its usage.

<!-- Icon button with a blend icon -->
<div class="icon-button">
  <div class="icon icon--blend"></div>
</div>

<!-- Icon button with selected modifier -->
<div class="icon-button icon-button--selected">
  <div class="icon icon--blend"></div>
</div>

Input

To use the input, use the following markup. You can also insert an icon into the input (see Icon component for usage).

<!-- Input with placeholder -->
<div class="input">
  <input type="input" class="input__field" placeholder="Placeholder">
</div>

<!-- Input with initial value -->
<div class="input">
  <input type="input" class="input__field" value="Initial value">
</div>

<!-- Disabled input -->
<div class="input">
  <input type="input" class="input__field" value="Initial value" disabled>
</div>

<!-- Input with icon -->
<div class="input input--with-icon">
  <div class="icon icon--angle"></div>
  <input type="input" class="input__field" value="Value">
</div>

Modifiers

Modifier classDescription
input--with-icon*Add this modifier class if you plan to include the icon component within the input

Labels and sections

To use a label or section, use the following markup.

<!-- Label -->
<div class="label">Label</div>

<!-- Section title -->
<div class="section-title">Section title</div>

Onboarding tip

To create an onboarding tip, use the following markup. The tip also makes use of the icon component (see Icon component for usage).

<div class="onboarding-tip">
  <div class="icon icon--styles"></div>
  <div class="onboarding-tip__msg">Onboarding tip goes here.</div>
</div>

Radio button

To create an radio button, use the following markup. Remember each group of radio buttons must share the same name so that they are related to one another. Each button should have a unique id so that its label is associated with it and remains part of the clickable hit area.

<!-- Radio button -->
<div class="radio">
    <input id="radioButton1"type="radio" class="radio__button" value="Value" name="radioGroup" >
    <label for="radioButton1" class="radio__label">Radio button</label>
</div>

<!-- Radio button checked -->
<div class="radio">
    <input id="radioButton2"type="radio" class="radio__button" value="Value" name="radioGroup" checked>
    <label for="radioButton2" class="radio__label">Radio button</label>
</div>

<!-- Radio button disabled-->
<div class="radio">
    <input id="radioButton3"type="radio" class="radio__button" value="Value" name="radioGroup" disabled>
    <label for="radioButton3" class="radio__label">Radio button</label>
</div>

Select menu

To create an select menu, use the following markup. The select menu also requires you to initalize it with Javascript. If your plugin requires you to add or remove items in the select menu, simply use Javascript to modify the select menu and the select will reinitialize.

The select menu will open and position the menu to the selected object. If there is no vertical room inside your plugin's iFrame, the position of the menu will be moved to ensure it fits inside the iframe. If you have a select menu with too many options to fit within the iFrame, the menu will scroll vertically.

<!-- Select menu, default behavior is for the initial item to get selected -->
<select id="uniqueId" class="select-menu">
  <option value="1" >Item 1</option>
  <option value="2" >Item 2</option>
  <option value="3" >Item 3</option>
</select>

<!-- Select menu, provide an initial item with no value to have no items selected -->
<select id="uniqueId" class="select-menu">
  <option>Please make a selection</option>
  <option value="2" >Item 2</option>
  <option value="3" >Item 3</option>
</select>

<!-- Disabled select menu -->
<select id="uniqueId" class="select-menu" disabled>
  <option value="1" >Item 1</option>
  <option value="2" >Item 2</option>
  <option value="3" >Item 3</option>
</select>

To initialize with Javascript:

//initialize all select menus
selectMenu.init();

//uninitialize all select menus
selectMenu.destroy();

Switch

To use the switch, use the following HTML markup. Remember each switch should get a unique ID that is referenced in the label. This ensures the switch and the entire label are clickable.

<!-- Switch -->
<div class="switch">
    <input class="switch__toggle" type="checkbox" id="uniqueId">
    <label class="switch__label" for="uniqueIdA">Label</label>
</div>

<!-- Switch checked -->
<div class="switch">
    <input class="switch__toggle" type="checkbox" id="uniqueId" checked>
    <label class="switch__label" for="uniqueId">Label</label>
</div>

<!-- Disabled switch -->
<div class="switch">
    <input class="switch__toggle" type="checkbox" id="uniqueId" disabled>
    <label class="switch__label" for="uniqueId">Label</label>
</div>

Textarea

To use the textarea, use the following HTML markup.

<!-- Textarea -->
<textarea class="textarea" rows="2">Initial value</textarea>

<!-- Disabled textarea -->
<textarea class="textarea" rows="2" disabled>Initial value</textarea>

Type

To use the typography that is styled like it is in the Figma UI, use the following markup plus additional modifier classes to modify the size, weight, and letterspacing that is optimized for positive (dark text on light background) and negative (light text on dark background) applications.

<div class="type">UI11, size: xsmall (default) weight: normal, positive</div>
<div class="type type--large type--bold">UI13, size: large, weight: bold, positive</div>
<div class="type type--small type--medium type--inverse">UI12, size: large, weight: medium, negative</div>

Modifiers

Modifier classDescription
type--smallFont size 12px
type--largeFont size 13px
type--xlargeFont size 14px
type--mediumFont weight medium
type--boldFont weight bold
type--inverseInversed (negative) application where light text is on dark background with increased letterspacing

Defaults: Font size 11px, normal weight, positive application