Skip to main content

Design & Styling Guide

Guidelines for building Connected Apps that look and feel native to the Facilio platform.

Design Principles#

  1. Blend in — Your widget should feel like a natural part of Facilio, not a foreign embed.
  2. Keep it light — Use whitespace, subtle borders, and a neutral color palette.
  3. Be responsive — Widgets appear in panels, sidebars, and dialogs of varying sizes. Design for flexible widths.
  4. Prioritize readability — Use clear typography, adequate contrast, and logical information hierarchy.

Design tokens#

The primitives that drive the Facilio platform's look and feel — typography, color, spacing, radius, shadow, and gradient. Use these values directly in your widget's CSS so it visually matches Facilio. Tokens follow the DTCG format.

Typography#

Two font families and two weights drive the whole type scale.

FamilyStack
Sans (default)Roboto, "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica
Display serif"Roboto Serif", Roboto, "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica

Weights: regular 400, medium 500.

TokenFamilySizeWeightNotes
display-medium-32serif32px500Page hero
display-med-20serif20px500
display-med-16serif16px500
heading-med-32sans32px500Section title
heading-med-20sans20px500Subsection
heading-med-16sans16px500Card / dialog title
heading-med-14sans14px500Inline heading
body-reg-14sans14px400Default body
body-reg-ul-14sans14px400+ text-decoration: underline (links)
body-reg-st-14sans14px400+ text-decoration: line-through
caption-med-12sans12px500Strong caption
caption-reg-12sans12px400Caption
caption-med-ii-10sans10px500+ line-height: 130%
caption-med-10sans10px500+ letter-spacing: 0.5px; text-transform: uppercase (tags / chips)
caption-reg-10sans10px400Small caption
avatar-ssans8px500Avatar initials, S
avatar-xssans6px500Avatar initials, XS

All styles use line-height: normal unless noted.


Color palette#

Each color has 9 steps from 05 (lightest) to 90 (darkest). Steps 4060 are the workhorses for backgrounds, fills, and text; 0520 for subtle surfaces; 7090 for high-contrast text and dark surfaces.

Blue#

StepSwatchHex
blue.05#f0f6ff
blue.10#cce2ff
blue.20#a2c8fe
blue.30#6ca8fc
blue.40#3d8bfa
blue.50#1673f6
blue.60#0059d6 (primary brand)
blue.70#0047ab
blue.80#002c6a
blue.90#00214e

Green (semantic — success / positive)#

StepSwatchHex
green.05#f1fff0
green.10#cbf3c7
green.20#a7e7a1
green.30#73d06a
green.40#49b83f
green.50#29a01e
green.60#0f6f06
green.70#0a3e06
green.80#072605
green.90#061904

Orange (semantic — warning)#

StepSwatchHex
orange.05#fff6f0
orange.10#fad0b4
orange.20#f5ac7b
orange.30#fd8635
orange.40#ff6700
orange.50#d85903
orange.60#8a3f0c
orange.70#64300e
orange.80#3d200c
orange.90#221309

Red (semantic — error / danger)#

StepSwatchHex
red.05#fff2f2
red.10#f7cccc
red.20#f0a8a8
red.30#dd6c6c
red.40#c93d3d
red.50#b61919
red.60#870000
red.70#500000
red.80#340000
red.90#240000

Yellow#

StepSwatchHex
yellow.05#fffae0
yellow.10#ffed94
yellow.20#ffe257
yellow.30#ffd405
yellow.40#e2bc00
yellow.50#c6a400
yellow.60#8d7500
yellow.70#4d410a
yellow.80#3b330b
yellow.90#29240a
Accent ramps — Cyan, Pink, Purple, Violet
Cyan#
StepSwatchHex
cyan.05#f0feff
cyan.10#c6f4f8
cyan.20#9eebf2
cyan.30#64d5e0
cyan.40#34c0ce
cyan.50#168f9b
cyan.60#0c6068
cyan.70#09494f
cyan.80#073135
cyan.90#062527
Pink#
StepSwatchHex
pink.05#fffbfd
pink.10#ffdbed
pink.20#ffbadc
pink.30#fd82b9
pink.40#f5519b
pink.50#ed2780
pink.60#ab185a
pink.70#8a1549
pink.80#480f28
pink.90#320c1d
Purple#
StepSwatchHex
purple.05#fcf2ff
purple.10#ebd4f3
purple.20#dbb7e7
purple.30#bd87cf
purple.40#a160b7
purple.50#88439f
purple.60#5b1d6f
purple.70#461257
purple.80#330d3f
purple.90#200927
Violet#
StepSwatchHex
violet.05#f3f0ff
violet.10#ddd5fa
violet.20#c7baf6
violet.30#9e89ed
violet.40#7d63dc
violet.50#5e3ed3
violet.60#3c229d
violet.70#311e77
violet.80#251952
violet.90#16102d

Neutrals#

Two neutral ramps: 01 (cool, blue-tinted) for primary UI surfaces and text, 02 (warm, true grey) for chrome and dividers.

Neutral 01 (cool)#
StepSwatchHex
neutral.01.05#fcfeff
neutral.01.10#edf5ff
neutral.01.20#d8e3f1
neutral.01.30#c4d1e4
neutral.01.40#9cafca
neutral.01.50#7b91b0
neutral.01.60#607796 (caption text)
neutral.01.70#384a62 (description text)
neutral.01.80#283648 (default text)
neutral.01.90#192432
Neutral 02 (warm grey)#
StepSwatchHex
neutral.02.05#fafafa
neutral.02.10#f5f5f5
neutral.02.20#eae9e9
neutral.02.30#dbdbdb
neutral.02.40#c7c7c7
neutral.02.50#a8aaaa
neutral.02.60#898b8b
neutral.02.70#555757
neutral.02.80#414242
neutral.02.90#2d2e2e

Backdrops (overlays with alpha)#

TokenSwatchHex (incl. alpha)
backdrops.white#ffffff
backdrops.white-frost#ffffff66 (40%)
backdrops.white-half-tone#ffffff7f (50%)
backdrops.grey-frost#1924324c (30%)
backdrops.grey-frost-high#283648b2 (70%)
backdrops.grey-half-tone#192432b2 (70% — modal blanket)

Semantic colors#

Pick a semantic token by intent, not by hex. The same token resolves to the right primitive across themes — for example, swapping primary later changes nothing in your code.

Text#

TokenResolves toHex
text.default / text.mainneutral.01.80#283648
text.descriptionneutral.01.70#384a62
text.captionneutral.01.60#607796
text.inverse-default / inverse-mainneutral.01.10#edf5ff
text.inverse-descriptionneutral.01.20#d8e3f1
text.inverse-captionneutral.01.50#7b91b0
text.primary.defaultblue.60#0059d6
text.primary.hoveredblue.40#3d8bfa
text.primary.pressedblue.70#0047ab
text.semantic-greengreen.50#29a01e
text.semantic-orangeorange.50#d85903
text.semantic-redred.50#b61919

Background#

Surfaces#
TokenResolves toHexUse for
background.canvasbackdrops.white#ffffffApp background
background.containerbackdrops.white#ffffffCards, panels
background.container-halftonebackdrops.white-half-tone#ffffff7fOver imagery
background.midground-subtleneutral.02.05#fafafaPage strips
background.midground-mediumneutral.02.10#f5f5f5Section background
background.midground-darkneutral.02.20#eae9e9Heavier section background
background.blanketbackdrops.grey-half-tone#192432b2Modal scrim
background.frostbackdrops.white-frost#ffffff66Glass overlay
background.frost-high#fafafacc (80%)#fafafaccStronger glass overlay
background.selectionblue.05#f0f6ffSelected row / highlight
Primary (brand)#
TokenResolves toHex
background.primary.defaultblue.60#0059d6
background.primary.hoveredblue.40#3d8bfa
background.primary.pressedblue.70#0047ab
Semantic — green / orange / red#

Each semantic color has 5 background steps. Use subtle / light for tinted backgrounds (alerts, badges) and medium / dark / darkest for solid fills (chip backgrounds, banners).

Token groupsubtlelightmediumdarkdarkest
background.semantic-green.* #f1fff0 #cbf3c7 #49b83f #0f6f06 #0a3e06
background.semantic-orange.* #fff6f0 #fad0b4 #ff6700 #8a3f0c #64300e
background.semantic-red.* #f7cccc (subtle) — also subtler=#fff2f2 #c93d3d (light) #b61919 #870000 #500000
Accent — blue / yellow / pink / purple / violet / cyan#

Use accents for non-status color expression: tags, categories, charts, illustrations. Avoid using them to communicate state — that's what semantic-* is for.

Each accent color has subtle (05), light (10), medium (40), dark (60), darkest (70). accent-blue and accent-violet additionally have darker (70/60); accent-violet has selection (60).

Neutral#
TokenResolves toHexUse for
background.neutral.defaultneutral.02.10#f5f5f5Default neutral fill
background.neutral.hoveredneutral.02.20#eae9e9Hover state
background.neutral.pressedneutral.02.30#dbdbdbPressed state
background.neutral-inverseneutral.01.70#384a62Dark surface
background.neutral-inverse.hoveredneutral.01.80#283648Dark hover
background.neutral-inverse.pressedneutral.01.90#192432Dark pressed

Plus full neutral-base.*, neutral-inverse-base.*, neutral-grey-01.*, neutral-grey-02.* ramps (subtler → darkest) mirroring the primitive neutrals — use these when you need consistent neutral steps across surfaces.

Border#

Mirror the same intents as background. Most common:

TokenResolves toHexUse for
border.primary.defaultblue.60#0059d6Primary button / input focus ring
border.primary.focusedblue.60#0059d6Focused input
border.neutral-base.subtleneutral.02.30#dbdbdbDefault divider
border.neutral-base.lightneutral.02.50#a8aaaaStronger divider
border.neutral-grey-01.subtleneutral.01.10#edf5ffSubtle separator
border.neutral-grey-01.lightneutral.01.20#d8e3f1Card border
border.semantic-green.mediumgreen.40#49b83fSuccess input border
border.semantic-orange.mediumorange.40#ff6700Warning input border
border.semantic-red.mediumred.50#b61919Error input border

Full border.semantic-*, border.accent-*, border.neutral-* ramps exist with the same subtle / light / medium / dark / darkest steps as their background.* counterparts.

Icon#

TokenResolves toHexUse for
icon.neutral.default / mainneutral.01.80#283648Default icon
icon.neutral.mediumneutral.01.70#384a62Secondary icon
icon.neutral.lightneutral.01.50#7b91b0Tertiary icon
icon.neutral.subtleneutral.01.20#d8e3f1Disabled icon
icon.neutral-inverse / mainneutral.01.05#fcfeffIcon on dark surface
icon.primary.defaultblue.60#0059d6Primary icon
icon.primary.hoveredblue.50#1673f6
icon.primary.pressedblue.70#0047ab
icon.semantic-greengreen.30#73d06aSuccess icon
icon.semantic-orangeorange.40#ff6700Warning icon
icon.semantic-redred.50#b61919Error icon
icon.accent-cyancyan.50#168f9bTag / category icon
icon.accent-pinkpink.50#ed2780Tag / category icon
icon.accent-purplepurple.50#88439fTag / category icon
icon.accent-violetviolet.50#5e3ed3Tag / category icon
icon.accent-yellowyellow.30#ffd405Tag / category icon

A full icon.neutral-grey-01.* ramp (subtler → darkest) is also available.

Widget (chart / illustration palette)#

Use these in dashboards and visualisations. Every widget color has 5–7 steps (subtle → darkest) so you can build harmonious palettes without picking from primitives.

GroupSteps available
widget.accent-bluesubtle, light, medium, dark, darker, darkest
widget.accent-cyansubtle, light, medium, dark, darkest
widget.accent-pinksubtle, light, medium, dark, darkest
widget.accent-purplesubtle, light, medium, dark, darkest
widget.accent-violetsubtle, light, medium, dark, darkest
widget.accent-yellowsubtler, subtle, light, medium, dark, darker, darkest
widget.semantic-greensubtle, light, medium, dark, darkest
widget.semantic-orangesubtle, light, medium, dark, darkest
widget.semantic-redsubtler, subtle, light, medium, dark, darkest
widget.grey-*subtler, subtle, light, medium, dark, darker, darkest (single-level keys, e.g. widget.grey-dark)

Each step resolves to the matching palette.<color>.<NN> primitive — for example widget.accent-blue.mediumblue.40#3d8bfa.


Spacing#

The spacing scale is in 4-px increments. Use it for padding, margins, and gaps.

TokenValue
spacing.scale.none0px
spacing.scale.half2px
spacing.scale.014px
spacing.scale.028px
spacing.scale.0312px
spacing.scale.0416px
spacing.scale.0520px
spacing.scale.0624px
spacing.scale.0728px
spacing.scale.0832px
spacing.scale.0936px
spacing.scale.1040px

Semantic aliases — prefer these when the intent is clear:

TokenResolves toValueUse for
spacing.container.nonescale.none0pxFlush
spacing.container.smallscale.half2pxIcon-to-text
spacing.container.mediumscale.014pxInline gap
spacing.container.largescale.028pxDefault control gap
spacing.container.x-largescale.0312pxStacked controls
spacing.container.xx-largescale.0416pxCard padding
spacing.section.x-smallscale.0416pxSection padding (compact)
spacing.section.smallscale.0624pxSection padding (default)
spacing.section.mediumscale.0832pxSection padding (loose)
spacing.section.largescale.1040pxPage-level padding

Border radius#

TokenValueUse for
radius.none (scale.00)0pxTables, edge-to-edge surfaces
radius.low (scale.01)2pxTags, chips
radius.medium (scale.02)4pxInputs, buttons (default)
radius.high (scale.03)8pxCards, dialogs
radius.large (scale.04)12pxHero panels
radius.scale.0524pxLarge illustrations
radius.full (scale.06)40pxPills, full-rounded buttons

Shadow (elevation)#

Five elevation levels, each a stack of two shadows. Use the Raw CSS column verbatim.

TokenUse forRaw CSS
shadow.elevation.light-low-01Subtle lift (inputs, table rows)0px 1px 1px 0px rgba(5, 16, 30, 0.25), 0px 0px 1px 0px rgba(5, 16, 30, 0.32)
shadow.elevation.light-low-02Cards0px 2px 4px 0px rgba(5, 16, 30, 0.10), 0px 1px 2px 0px rgba(5, 16, 30, 0.25)
shadow.elevation.light-medPopovers, dropdowns0px 8px 8px 0px rgba(5, 16, 30, 0.08), 0px 0px 2px 0px rgba(5, 16, 30, 0.05)
shadow.elevation.light-highModals, dialogs0px 16px 16px 0px rgba(5, 16, 30, 0.14), 0px 2px 4px 0px rgba(5, 16, 30, 0.14)
shadow.elevation.light-reverse-highBottom sheets (light from below)0px -12px 12px 0px rgba(5, 16, 30, 0.15), 0px 0px 4px 0px rgba(5, 16, 30, 0.10)

Gradient#

Ten preset linear gradients. Use the CSS column verbatim in background.

TokenPreviewCSS
gradient.bluelinear-gradient(270deg, #3D8BFA 0%, #0047AB 100%)
gradient.violetlinear-gradient(270deg, #7D63DC 0%, #3C229D 100%)
gradient.purplelinear-gradient(270deg, #88439F 0%, #461257 100%)
gradient.greenlinear-gradient(90deg, #0A3E06 0%, #29A01E 100%)
gradient.yellowlinear-gradient(90deg, #8D7500 0%, #FFD405 100%)
gradient.redlinear-gradient(90deg, #500000 0%, #C93D3D 100%)
gradient.greylinear-gradient(90deg, #384A62 0%, #607796 100%)
gradient.neutral-lowlinear-gradient(180deg, #A2C8FE 0%, #F0F6FF 99%)
gradient.neutral-mediumlinear-gradient(180deg, #9CAFCA 0%, #EDF5FF 100%)
gradient.neutral-highlinear-gradient(180deg, #192432 0%, #384A62 100%)

Putting it together#

A typical Connected App card, styled with tokens:

.card {  background: #ffffff;                       /* background.container */  color: #283648;                             /* text.default */  border: 1px solid #d8e3f1;                  /* border.neutral-grey-01.light */  border-radius: 8px;                         /* radius.high */  padding: 16px;                              /* spacing.container.xx-large */  box-shadow:                                  /* shadow.elevation.light-low-02 */    0px 2px 4px 0px rgba(5, 16, 30, 0.10),    0px 1px 2px 0px rgba(5, 16, 30, 0.25);  font: 400 14px/normal Roboto, "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica;  /* body-reg-14 */}
.card__title {  font: 500 16px/normal Roboto, "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica;  /* heading-med-16 */  margin-bottom: 8px;                         /* spacing.container.large */}
.card__action {  background: #0059d6;                        /* background.primary.default */  color: #ffffff;  border-radius: 4px;                         /* radius.medium */  padding: 8px 16px;                          /* container.large container.xx-large */}.card__action:hover { background: #3d8bfa; } /* background.primary.hovered */.card__action:active { background: #0047ab; } /* background.primary.pressed */