Guidelines for building Connected Apps that look and feel native to the Facilio platform.
Design Principles# Blend in — Your widget should feel like a natural part of Facilio, not a foreign embed.Keep it light — Use whitespace, subtle borders, and a neutral color palette.Be responsive — Widgets appear in panels, sidebars, and dialogs of varying sizes. Design for flexible widths.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.
Family Stack Sans (default)Roboto, "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", HelveticaDisplay serif "Roboto Serif", Roboto, "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica
Weights: regular 400, medium 500.
Token Family Size Weight Notes display-medium-32serif 32px 500 Page hero display-med-20serif 20px 500 display-med-16serif 16px 500 heading-med-32sans 32px 500 Section title heading-med-20sans 20px 500 Subsection heading-med-16sans 16px 500 Card / dialog title heading-med-14sans 14px 500 Inline heading body-reg-14sans 14px 400 Default body body-reg-ul-14sans 14px 400 + text-decoration: underline (links) body-reg-st-14sans 14px 400 + text-decoration: line-through caption-med-12sans 12px 500 Strong caption caption-reg-12sans 12px 400 Caption caption-med-ii-10sans 10px 500 + line-height: 130% caption-med-10sans 10px 500 + letter-spacing: 0.5px; text-transform: uppercase (tags / chips) caption-reg-10sans 10px 400 Small caption avatar-ssans 8px 500 Avatar initials, S avatar-xssans 6px 500 Avatar initials, XS
All styles use line-height: normal unless noted.
Color palette# Each color has 9 steps from 05 (lightest) to 90 (darkest). Steps 40–60 are the workhorses for backgrounds, fills, and text; 05–20 for subtle surfaces; 70–90 for high-contrast text and dark surfaces.
Blue# Step Swatch Hex blue.05#f0f6ffblue.10#cce2ffblue.20#a2c8feblue.30#6ca8fcblue.40#3d8bfablue.50#1673f6blue.60#0059d6 (primary brand)blue.70#0047abblue.80#002c6ablue.90#00214e
Green (semantic — success / positive)# Step Swatch Hex green.05#f1fff0green.10#cbf3c7green.20#a7e7a1green.30#73d06agreen.40#49b83fgreen.50#29a01egreen.60#0f6f06green.70#0a3e06green.80#072605green.90#061904
Orange (semantic — warning)# Step Swatch Hex orange.05#fff6f0orange.10#fad0b4orange.20#f5ac7borange.30#fd8635orange.40#ff6700orange.50#d85903orange.60#8a3f0corange.70#64300eorange.80#3d200corange.90#221309
Red (semantic — error / danger)# Step Swatch Hex red.05#fff2f2red.10#f7ccccred.20#f0a8a8red.30#dd6c6cred.40#c93d3dred.50#b61919red.60#870000red.70#500000red.80#340000red.90#240000
Yellow# Step Swatch Hex yellow.05#fffae0yellow.10#ffed94yellow.20#ffe257yellow.30#ffd405yellow.40#e2bc00yellow.50#c6a400yellow.60#8d7500yellow.70#4d410ayellow.80#3b330byellow.90#29240a
Accent ramps — Cyan, Pink, Purple, Violet Cyan# Step Swatch Hex cyan.05#f0feffcyan.10#c6f4f8cyan.20#9eebf2cyan.30#64d5e0cyan.40#34c0cecyan.50#168f9bcyan.60#0c6068cyan.70#09494fcyan.80#073135cyan.90#062527
Pink# Step Swatch Hex pink.05#fffbfdpink.10#ffdbedpink.20#ffbadcpink.30#fd82b9pink.40#f5519bpink.50#ed2780pink.60#ab185apink.70#8a1549pink.80#480f28pink.90#320c1d
Purple# Step Swatch Hex purple.05#fcf2ffpurple.10#ebd4f3purple.20#dbb7e7purple.30#bd87cfpurple.40#a160b7purple.50#88439fpurple.60#5b1d6fpurple.70#461257purple.80#330d3fpurple.90#200927
Violet# Step Swatch Hex violet.05#f3f0ffviolet.10#ddd5faviolet.20#c7baf6violet.30#9e89edviolet.40#7d63dcviolet.50#5e3ed3violet.60#3c229dviolet.70#311e77violet.80#251952violet.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)# Step Swatch Hex neutral.01.05#fcfeffneutral.01.10#edf5ffneutral.01.20#d8e3f1neutral.01.30#c4d1e4neutral.01.40#9cafcaneutral.01.50#7b91b0neutral.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)# Step Swatch Hex neutral.02.05#fafafaneutral.02.10#f5f5f5neutral.02.20#eae9e9neutral.02.30#dbdbdbneutral.02.40#c7c7c7neutral.02.50#a8aaaaneutral.02.60#898b8bneutral.02.70#555757neutral.02.80#414242neutral.02.90#2d2e2e
Backdrops (overlays with alpha)# Token Swatch Hex (incl. alpha) backdrops.white#ffffffbackdrops.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# Token Resolves to Hex text.default / text.mainneutral.01.80#283648text.descriptionneutral.01.70#384a62text.captionneutral.01.60#607796text.inverse-default / inverse-mainneutral.01.10#edf5fftext.inverse-descriptionneutral.01.20#d8e3f1text.inverse-captionneutral.01.50#7b91b0text.primary.defaultblue.60#0059d6text.primary.hoveredblue.40#3d8bfatext.primary.pressedblue.70#0047abtext.semantic-greengreen.50#29a01etext.semantic-orangeorange.50#d85903text.semantic-redred.50#b61919
Background# Surfaces# Token Resolves to Hex Use 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)# Token Resolves to Hex background.primary.defaultblue.60#0059d6background.primary.hoveredblue.40#3d8bfabackground.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 group subtle light medium dark darkest background.semantic-green.* #f1fff0 #cbf3c7 #49b83f #0f6f06 #0a3e06background.semantic-orange.* #fff6f0 #fad0b4 #ff6700 #8a3f0c #64300ebackground.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# Token Resolves to Hex Use 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:
Token Resolves to Hex Use 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# Token Resolves to Hex Use 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#1673f6icon.primary.pressedblue.70#0047abicon.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.
Group Steps available widget.accent-bluesubtle, light, medium, dark, darker, darkestwidget.accent-cyansubtle, light, medium, dark, darkestwidget.accent-pinksubtle, light, medium, dark, darkestwidget.accent-purplesubtle, light, medium, dark, darkestwidget.accent-violetsubtle, light, medium, dark, darkestwidget.accent-yellowsubtler, subtle, light, medium, dark, darker, darkestwidget.semantic-greensubtle, light, medium, dark, darkestwidget.semantic-orangesubtle, light, medium, dark, darkestwidget.semantic-redsubtler, subtle, light, medium, dark, darkestwidget.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.medium → blue.40 → #3d8bfa.
Spacing# The spacing scale is in 4-px increments. Use it for padding, margins, and gaps.
Token Value spacing.scale.none0pxspacing.scale.half2pxspacing.scale.014pxspacing.scale.028pxspacing.scale.0312pxspacing.scale.0416pxspacing.scale.0520pxspacing.scale.0624pxspacing.scale.0728pxspacing.scale.0832pxspacing.scale.0936pxspacing.scale.1040px
Semantic aliases — prefer these when the intent is clear:
Token Resolves to Value Use 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# Token Value Use 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.
Token Use for Raw 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-02Cards 0px 2px 4px 0px rgba(5, 16, 30, 0.10), 0px 1px 2px 0px rgba(5, 16, 30, 0.25)shadow.elevation.light-medPopovers, dropdowns 0px 8px 8px 0px rgba(5, 16, 30, 0.08), 0px 0px 2px 0px rgba(5, 16, 30, 0.05)shadow.elevation.light-highModals, dialogs 0px 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.
Token Preview CSS 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 ; color : #283648 ; border : 1 px solid #d8e3f1 ; border-radius : 8 px ; padding : 16 px ; box-shadow : 0 px 2 px 4 px 0 px rgba ( 5 , 16 , 30 , 0.10 ) , 0 px 1 px 2 px 0 px rgba ( 5 , 16 , 30 , 0.25 ) ; font : 400 14 px /normal Roboto , "SF Pro Display" , -apple-system , BlinkMacSystemFont , "Segoe UI" , Helvetica ; }
.card__title { font : 500 16 px /normal Roboto , "SF Pro Display" , -apple-system , BlinkMacSystemFont , "Segoe UI" , Helvetica ; margin-bottom : 8 px ; }
.card__action { background : #0059d6 ; color : #ffffff ; border-radius : 4 px ; padding : 8 px 16 px ; } .card__action :hover { background : #3d8bfa ; } .card__action :active { background : #0047ab ; } Copy