Security News
New Python Packaging Proposal Aims to Solve Phantom Dependency Problem with SBOMs
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
@otovo/rainbow-tailwind
Advanced tools
Otovo's design system implemented using Tailwind
Setup Tailwind by following the instructions in the official Tailwind installation documentation.
Install @otovo/rainbow-tailwind
yarn add @otovo/rainbow-tailwind
tailwind.config.js
at the root of your project. This is where we add the Rainbow overrides:const plugin = require('tailwindcss/plugin');
const { theme, variants, plugins } = require('@otovo/rainbow-tailwind/dist');
module.exports = {
theme,
variants,
plugins: Object.values(plugins).map((p) => plugin(p)),
prefix: '_',
};
Rainbow documentation is available at https://rainbow.otovo.com, and updated using the rainbow-documentation repo. Remember to update the documentation when making changes.
It is highly recommended to read the official Tailwind documentation, as this projects depend upon it heavily.
To make it easier to test changes to rainbow-tailwind
locally, you can set up a link to cloud or rainbow-documentation (or both). Linking the repo can be done as follows (assuming you have placed the repos in ~/projects
):
cd ~/projects/rainbow-tailwind
yarn link
cd ~/projects/cloud
yarn link @otovo/rainbow-tailwind
Great! You're almost set. To rebuild the distribution whenever you change something, run...
yarn dev
To release a new version to NPM, run...
yarn release
The script will hold your hand through the rest of the process. Remember to use semantic versioning.
To use rainbow-tailwind
In order to use tailwind with the raibow-tailwind, some classes name need to be adapted when you will have to code some UI using rainbow-tailwind
Prefix '_' to use Tailwind in Cloud:
To be able to use Tailwind classes, they need to be call with the prefix '_' For instance, if you want to set a fixed width, you will see in the Tailwind's documentation the following syntax:
<div class="w-8 ..."></div>
In cloud, you will have to write:
<div class="_w-8 ..."></div>
Responsive classes:
Rainbow has its own breakpoint delimiters. If you want to use the responsive classes described in Tailwind's documentation, you will have to use the matching syntax in Rainbow:
Tailwind Breakpoint prefix | Rainbow-tailwind equivalent | Minimum width |
---|---|---|
❌ | s2 | 368px |
❌ | s3 | 480px |
sm | m | 640px |
md | m2 | 768px |
❌ | m3 | 960px |
lg | l | 1024px |
xl | l2 | 1280px |
2xl | l3 | 1536px |
Font classes:
Font classes used in Rainbow are matching the ones used in Tailwind except text-base:
Taiwind class | Rainbow-tailwind class |
---|---|
text-base | _text-md |
Width:
Taiwind class | Rainbow-tailwind class | Properties |
---|---|---|
w- | _w-0 | width: 0px; |
w-0.5 | ❌ | 0.125 rem; |
w-1 | _w-1 | width: 0.25rem; |
w-1.5 | ❌ | width: 0.375rem; |
w-2 | _w-2 | width: 0.5rem; |
w-2.5 | ❌ | width: 0.625rem; |
w-3 | _w-3 | width: 0.75rem; |
w-3.5 | ❌ | width: 0.875rem; |
w-4 | _w-4 | width: 1rem; |
w-5 | _w-5 | width: 1.25rem; |
w-6 | _w-6 | width: 1.5rem; |
w-7 | ❌ | width: 1.75rem; |
w-8 | _w-8 | width: 2rem; |
w-9 | ❌ | width: 2.25rem; |
w-10 | _w-8 | width: 2.5rem; |
w-11 | ❌ | width: 2.75rem; |
w-12 | _w-12 | width: 3rem; |
w-14 | ❌ | width: 3.5rem; |
w-16 | _w-16 | width: 4rem; |
w-20 | _w-20 | width: 5rem; |
w-24 | _w-24 | width: 6rem; |
w-28 | ❌ | width: 7rem; |
w-32 | _w-32 | width: 8rem; |
w-36 | ❌ | width: 9rem; |
w-40 | _w-40 | width: 10rem; |
w-44 | ❌ | width: 11rem; |
w-48 | _w-48 | width: 12rem; |
w-52 | ❌ | width: 13rem; |
w-56 | _w-56 | width: 14rem; |
w-60 | ❌ | width: 15rem; |
w-64 | _w-64 | width: 16rem; |
w-72 | ❌ | width: 18rem; |
w-80 | _w-80 | width: 20rem; |
w-96 | _w-96 | width: 24rem; |
❌ | _w-112 | 28rem |
❌ | _w-128 | 32rem |
❌ | _w-160 | 40rem |
❌ | _w-192 | 48rem |
❌ | _w-224 | 56rem |
❌ | _w-256 | 64rem |
❌ | _w-320 | 80rem |
❌ | _w-384 | 96rem |
w-auto | _w-auto | width: auto; |
w-px | _w-px | width: 1px; |
w-1/2 | _w-1/2 | width: 50%; |
w-1/3 | _w-1/3 | width: 33.333333%; |
w-2/3 | _w-2/3 | width: 66.666667%; |
w-1/4 | _w-1/4 | width: 25%; |
w-2/4 | _w-2/4 | width: 50%; |
w-3/4 | _w-3/4 | width: 75%; |
w-1/5 | _w-1/5 | width: 20%; |
w-2/5 | _w-2/5 | width: 40%; |
w-3/5 | _w-3/5 | width: 60%; |
w-4/5 | _w-4/5 | width: 80%; |
w-1/6 | _w-1/6 | width: 16.666667%; |
w-2/6 | _w-2/6 | width: 33.333333%; |
w-3/6 | _w-3/6 | width: 50%; |
w-4/6 | _w-4/6 | width: 66.666667%; |
w-5/6 | _w-5/6 | width: 83.333333%; |
w-1/12 | _w-1/12 | width: 8.333333%; |
w-2/12 | _w-2/12 | width: 16.666667%; |
w-3/12 | _w-3/12 | width: 25%; |
w-4/12 | _w-4/12 | width: 33.333333%; |
w-5/12 | _w-5/12 | width: 41.666667%; |
w-6/12 | _w-6/12 | width: 50%; |
w-7/12 | _w-7/12 | width: 58.333333%; |
w-8/12 | _w-1/2 | width: 66.666667%; |
w-9/12 | _w-8/12 | width: 75%; |
w-10/12 | _w-10/12 | width: 83.333333%; |
w-11/12 | _w-11/12 | width: 91.666667%; |
w-full | _w-full | width: 100%; |
w-screen | _w-screen | width: 100vw; |
Max-width:
Taiwind class | Rainbow-tailwind class | Properties |
---|---|---|
max-w-0 | _w-max-0 | max-width: 0rem; |
max-w-none | _max-w-none | max-width: none; |
max-w-xs | _max-w-80 | max-width: 20rem; |
max-w-sm | _max-w-96 | max-width: 24rem; |
max-w-md | _max-w-112 | max-width: 28rem; |
max-w-lg | _max-w-128 | max-width: 32rem; |
max-w-xl | ❌ | max-width: 36rem; |
max-w-2xl | ❌ | max-width: 42rem; |
max-w-3xl | _max-w-128 | max-width: 48rem; |
max-w-4xl | _max-w-224 | max-width: 56rem; |
max-w-5xl | _max-w-256 | max-width: 64rem; |
max-w-6xl | ❌ | max-width: 72rem; |
max-w-7xl | _max-w-320 | max-width: 80rem; |
max-w-full | _max-w-full | max-width: 100%; |
max-w-min | ❌ | max-width: min-content; |
max-w-max | ❌ | max-width: max-content; |
max-w-prose | ❌ | max-width: 65ch; |
max-w-screen-sm | ?tbd | max-width: 640px; |
max-w-screen-md | ? | max-width: 768px; |
max-w-screen-lg | ? tbd | max-width: 1024px; |
max-w-screen-xl | ❌ | max-width: 1280px; |
max-w-screen-2xl | ❌ | max-width: 1536px; |
Min-width:
Taiwind class | Rainbow-tailwind class | Properties |
---|---|---|
min-w-0 | _w-min-0 | min-width: 0rem; |
❌ | _min-w-none | min-width: none; |
❌ | _min-w-80 | min-width: 20rem; |
❌ | _min-w-96 | min-width: 24rem; |
❌ | _minw-112 | min-width: 28rem; |
❌ | _min-w-128 | min-width: 32rem; |
❌ | _min-w-128 | min-width: 48rem; |
❌ | _min-w-224 | min-width: 56rem; |
❌ | _min-w-256 | min-width: 64rem; |
❌ | _min-w-320 | min-width: 80rem; |
min-w-full | _min-w-full | min-width: 100%; |
❌ | _min-screen | screen: '100vw' |
Height:
Taiwind class | Rainbow-tailwind class | Properties |
---|---|---|
h-0 | _h-0 | height: 0px; |
h-0.5 | ❌ | height: 0.125rem; |
h-1 | _h-1 | height: 0.25rem; |
h-1.5 | ❌ | height: 0.375rem; |
h-2 | _h-2 | height: 0.5rem; |
h-2.5 | ❌ | height: 0.625rem; |
h-3 | _h-3 | height: 0.75rem; |
h-3.5 | ❌ | height: 0.875rem; |
h-4 | _h-4 | height: 1rem; |
h-5 | _h-5 | height: 1.25rem; |
h-6 | _h-6 | height: 1.5rem; |
h-7 | ❌ | height: 1.75rem; |
h-8 | _h-8 | height: 2rem; |
h-9 | ❌ | height: 2.25rem; |
h-10 | _h-10 | height: 2.5rem; |
h-11 | ❌ | height: 2.75rem; |
h-12 | _h-12 | height: 3rem; |
h-14 | ❌ | height: 3.5rem; |
h-16 | _h-16 | height: 4rem; |
h-20 | _h-20 | height: 5rem; |
h-24 | _h-24 | height: 6rem; |
h-28 | ❌ | height: 7rem; |
h-32 | _h-32 | height: 8rem; |
h-36 | ❌ | height: 9rem; |
h-40 | _h-40 | height: 10rem; |
h-44 | ❌ | height: 11rem; |
h-48 | _h-48 | height: 12rem; |
h-52 | _h-52 | height: 13rem; |
h-56 | _h-56 | height: 14rem; |
h-60 | ❌ | height: 15rem; |
h-64 | _h-64 | height: 16rem; |
h-72 | ❌ | height: 18rem; |
h-80 | _h-80 | height: 20rem; |
h-96 | _h-96 | height: 24rem; |
h-auto | _h-auto | height: auto; |
h-px | _h-px | height: 1px; |
h-1/2 | _h-1/2 | height: 50%; |
h-1/3 | _h-1/3 | height: 33.333333%; |
h-2/3 | _h-2/3 | height: 66.666667%; |
h-1/4 | _h-1/4 | height: 25%; |
h-2/4 | _h-2/4 | height: 50%; |
h-3/4 | _h-3/4 | height: 75%; |
h-1/5 | _h-1/5 | height: 20%; |
h-2/5 | _h-2/5 | height: 40%; |
h-3/5 | _h-3/5 | height: 60%; |
h-4/5 | _h-4/5 | height: 80%; |
h-1/6 | _h-1/6 | height: 16.666667%; |
h-2/6 | _h-2/6 | height: 33.333333%; |
h-3/6 | _h-3/6 | height: 50%; |
h-4/6 | _h-4/6 | height: 66.666667%; |
h-5/6 | _h-5/6 | height: 83.333333%; |
h-full | _h-full | height: 100%; |
h-screen | _h-screen | height: 100vh; |
Max-height:
Taiwind class | Rainbow-tailwind class | Properties |
---|---|---|
max-h-0 | _max-h-0 | max-height: 0px; |
max-h-0.5 | ❌ | max-height: 0.125rem; |
max-h-1 | _max-h-1 | max-height: 0.25rem; |
max-h-1.5 | ❌ | max-height: 0.375rem; |
max-h-2 | _max-h-2 | max-height: 0.5rem; |
max-h-2.5 | ❌ | max-height: 0.625rem; |
max-h-3 | _max-h-3 | max-height: 0.75rem; |
max-h-3.5 | ❌ | max-height: 0.875rem; |
max-h-4 | _max-h-4 | max-height: 1rem; |
max-h-5 | _max-h-5 | max-height: 1.25rem; |
max-h-6 | _max-h-6 | max-height: 1.5rem; |
max-h-7 | ❌ | max-height: 1.75rem; |
max-h-8 | _max-h-8 | max-height: 2rem; |
max-h-9 | ❌ | max-height: 2.25rem; |
max-h-10 | _max-h-10 | max-height: 2.5rem; |
max-h-11 | ❌ | max-height: 2.75rem; |
max-h-12 | _max-h-12 | max-height: 3rem; |
max-h-14 | ❌ | max-height: 3.5rem; |
max-h-16 | _max-h-16 | max-height: 4rem; |
max-h-20 | _max-h-20 | max-height: 5rem; |
max-h-24 | _max-h-24 | max-height: 6rem; |
max-h-28 | ❌ | max-height: 7rem; |
max-h-32 | _max-h-32 | max-height: 8rem; |
max-h-36 | ❌ | max-height: 9rem; |
max-h-40 | _max-h-40 | max-height: 10rem; |
max-h-44 | ❌ | max-height: 11rem; |
max-h-48 | _max-h-48 | max-height: 12rem; |
max-h-52 | ❌ | max-height: 13rem; |
max-h-56 | _max-h-56 | max-height: 14rem; |
max-h-60 | ❌ | max-height: 15rem; |
max-h-64 | _max-h-64 | max-height: 16rem; |
max-h-72 | ❌ | max-height: 18rem; |
max-h-80 | _max-h-80 | max-height: 20rem; |
max-h-96 | _max-h-96 | max-height: 24rem; |
max-h-px | _max-h-px | max-height: 1px; |
max-h-full | _max-h-full | max-height: 100%; |
max-h-screen | _max-h-screen | max-height: 100vh; |
Min-height:
Taiwind class | Rainbow-tailwind class | Properties |
---|---|---|
min-h-0 | _w-0 | min-width: 0rem; |
❌ | _min-h-none | min-width: none; |
❌ | _min-h-80 | min-width: 20rem; |
❌ | _min-h-96 | min-width: 24rem; |
❌ | _min-h-112 | min-width: 28rem; |
❌ | _min-h-128 | min-width: 32rem; |
❌ | _min-h-128 | max-width: 48rem; |
❌ | _min-h-224 | min-width: 56rem; |
❌ | _min-h-256 | min-width: 64rem; |
❌ | _min-h-320 | min-width: 80rem; |
min-h-full | _min-h-full | min-width: 100%; |
❌ | _min-screen | screen: '100vw' |
MEMO: REM/PX equivalents 1rem = 16px by default
REM | PIXELS |
---|---|
0rem | 0px |
0.125 rem | 2px |
0.25rem | 4px |
0.375rem | 6px |
0.5rem | 8px |
0.625rem | 10px |
0.75rem | 12px |
0.875rem | 14px |
1rem | 16px |
1.25rem | 20px |
1.5rem | 24px |
1.75rem | 28px |
2rem | 32px |
2.25rem | 36px |
2.5rem | 40px |
2.75rem | 44px |
3rem | 48px |
3.5rem | 56px |
4rem | 64px |
5rem | 80px |
6rem | 96px |
7rem | 112px |
8rem | 128px |
9rem | 144px |
10rem | 160px |
12rem | 192px |
13rem | 208px |
14rem | 224px |
15rem | 240px |
16rem | 256px |
18rem | 288px |
20rem | 320px |
24rem | 384px |
28rem | 448px |
32rem | 512px |
40rem | 640px |
48rem | 768px |
56rem | 896px |
64rem | 1024px |
Colors:
use rainbow colors described at official Rainbow colors
Kitchen sink
You will find in installerweb a file named kitchen-sink.html
that shows different rainbow components developped with Tailwind/Jinja2 :
kitchen sink in installerweb
FAQs
Otovo's design system implemented using Tailwind
We found that @otovo/rainbow-tailwind demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 10 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
Security News
Socket CEO Feross Aboukhadijeh discusses open source security challenges, including zero-day attacks and supply chain risks, on the Cyber Security Council podcast.
Security News
Research
Socket researchers uncover how threat actors weaponize Out-of-Band Application Security Testing (OAST) techniques across the npm, PyPI, and RubyGems ecosystems to exfiltrate sensitive data.