@beehexa/design-rules 0.0.0-stage → 2611.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -2
- package/dist/AGENTS.md +24 -0
- package/dist/catalog.json +1814 -0
- package/dist/docs/public/_redirects +7 -0
- package/dist/docs/public/apple-touch-icon.png +0 -0
- package/dist/docs/public/brand/logos/app/apple-touch-icon.png +0 -0
- package/dist/docs/public/brand/logos/app/avatar-800.png +0 -0
- package/dist/docs/public/brand/logos/app/icon-192.png +0 -0
- package/dist/docs/public/brand/logos/app/icon-512.png +0 -0
- package/dist/docs/public/brand/logos/app/icon-maskable-512.png +0 -0
- package/dist/docs/public/brand/logos/archive/d-550/beehexa-horizontal-1-light.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/beehexa-horizontal-2-dark.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/beehexa-horizontal-3-white.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/beehexa-horizontal-4-graphite.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/hexasync-horizontal-1-light.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/hexasync-horizontal-2-dark.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/hexasync-horizontal-3-white.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/hexasync-horizontal-4-graphite.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/ui/beehexa-d-550-dark.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/ui/beehexa-d-550-light.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/ui/beehexa-design-d-550-dark.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/ui/beehexa-design-d-550-light.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/ui/hexasync-d-550-dark.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/ui/hexasync-d-550-light.svg +1 -0
- package/dist/docs/public/brand/logos/archive/d-550/ui/png/beehexa-design-d-550-dark@3x.png +0 -0
- package/dist/docs/public/brand/logos/archive/d-550/ui/png/beehexa-design-d-550-light@3x.png +0 -0
- package/dist/docs/public/brand/logos/beehexa-logo.zip +0 -0
- package/dist/docs/public/brand/logos/fig/anatomy-en.png +0 -0
- package/dist/docs/public/brand/logos/fig/anatomy-vi.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-dark-12.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-dark-14.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-dark-28.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-dark-32.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-dark-56.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-graphite-28.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-graphite-32.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-14.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-21.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-22.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-24.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-28.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-32.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-36-7c3aed7c3aed.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-36-swap.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-36.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-light-56.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-white-20.png +0 -0
- package/dist/docs/public/brand/logos/fig/beehexa-white-32.png +0 -0
- package/dist/docs/public/brand/logos/fig/clearspace.png +0 -0
- package/dist/docs/public/brand/logos/fig/construction-en.png +0 -0
- package/dist/docs/public/brand/logos/fig/construction-vi.png +0 -0
- package/dist/docs/public/brand/logos/fig/container-en.png +0 -0
- package/dist/docs/public/brand/logos/fig/container-vi.png +0 -0
- package/dist/docs/public/brand/logos/fig/hexasync-dark-20.png +0 -0
- package/dist/docs/public/brand/logos/fig/hexasync-dark-28.png +0 -0
- package/dist/docs/public/brand/logos/fig/hexasync-dark-48.png +0 -0
- package/dist/docs/public/brand/logos/fig/hexasync-light-19.png +0 -0
- package/dist/docs/public/brand/logos/fig/hexasync-light-28.png +0 -0
- package/dist/docs/public/brand/logos/fig/hexasync-light-48.png +0 -0
- package/dist/docs/public/brand/logos/fig/icon-graphite-14.png +0 -0
- package/dist/docs/public/brand/logos/fig/icon-graphite-16.png +0 -0
- package/dist/docs/public/brand/logos/fig/icon-light-16.png +0 -0
- package/dist/docs/public/brand/logos/fig/icon-light-24.png +0 -0
- package/dist/docs/public/brand/logos/fig/icon-light-48.png +0 -0
- package/dist/docs/public/brand/logos/fig/icon-light-92.png +0 -0
- package/dist/docs/public/brand/logos/fig/meaning-bee-en.png +0 -0
- package/dist/docs/public/brand/logos/fig/meaning-bee-vi.png +0 -0
- package/dist/docs/public/brand/logos/fig/meaning-outline-en.png +0 -0
- package/dist/docs/public/brand/logos/fig/meaning-outline-vi.png +0 -0
- package/dist/docs/public/brand/logos/fig/meaning-stack-en.png +0 -0
- package/dist/docs/public/brand/logos/fig/meaning-stack-vi.png +0 -0
- package/dist/docs/public/brand/logos/fig/misuse-serif.png +0 -0
- package/dist/docs/public/brand/logos/icon/beehexa-icon-graphite.svg +1 -0
- package/dist/docs/public/brand/logos/icon/beehexa-icon-white.svg +1 -0
- package/dist/docs/public/brand/logos/icon/beehexa-icon-yellow.svg +1 -0
- package/dist/docs/public/brand/logos/lockups/beehexa-horizontal-1-light.svg +1 -0
- package/dist/docs/public/brand/logos/lockups/beehexa-horizontal-2-dark.svg +1 -0
- package/dist/docs/public/brand/logos/lockups/beehexa-horizontal-3-white.svg +1 -0
- package/dist/docs/public/brand/logos/lockups/beehexa-horizontal-4-graphite.svg +1 -0
- package/dist/docs/public/brand/logos/lockups/hexasync-horizontal-1-light.svg +1 -0
- package/dist/docs/public/brand/logos/lockups/hexasync-horizontal-2-dark.svg +1 -0
- package/dist/docs/public/brand/logos/lockups/hexasync-horizontal-3-white.svg +1 -0
- package/dist/docs/public/brand/logos/lockups/hexasync-horizontal-4-graphite.svg +1 -0
- package/dist/docs/public/brand/logos/ui/beehexa-dark.svg +1 -0
- package/dist/docs/public/brand/logos/ui/beehexa-design-dark.svg +1 -0
- package/dist/docs/public/brand/logos/ui/beehexa-design-light.svg +1 -0
- package/dist/docs/public/brand/logos/ui/beehexa-icon-yellow.svg +1 -0
- package/dist/docs/public/brand/logos/ui/beehexa-light.svg +1 -0
- package/dist/docs/public/brand/logos/ui/hexasync-dark.svg +1 -0
- package/dist/docs/public/brand/logos/ui/hexasync-light.svg +1 -0
- package/dist/docs/public/brand/logos/ui/png/beehexa-design-dark@3x.png +0 -0
- package/dist/docs/public/brand/logos/ui/png/beehexa-design-light@3x.png +0 -0
- package/dist/docs/public/favicon.ico +0 -0
- package/dist/docs/public/favicon.svg +1 -0
- package/dist/docs/public/fonts/LICENSE-Inter.txt +93 -0
- package/dist/docs/public/fonts/LICENSE-JetBrainsMono.txt +93 -0
- package/dist/docs/public/fonts/inter-latin-ext-opsz-wght-italic.woff2 +0 -0
- package/dist/docs/public/fonts/inter-latin-ext-opsz-wght-normal.woff2 +0 -0
- package/dist/docs/public/fonts/inter-latin-opsz-wght-italic.woff2 +0 -0
- package/dist/docs/public/fonts/inter-latin-opsz-wght-normal.woff2 +0 -0
- package/dist/docs/public/fonts/inter-vietnamese-opsz-wght-italic.woff2 +0 -0
- package/dist/docs/public/fonts/inter-vietnamese-opsz-wght-normal.woff2 +0 -0
- package/dist/docs/public/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 +0 -0
- package/dist/docs/public/fonts/jetbrains-mono-latin-wght-normal.woff2 +0 -0
- package/dist/docs/public/fonts/jetbrains-mono-vietnamese-wght-normal.woff2 +0 -0
- package/dist/docs/public/icon-192.png +0 -0
- package/dist/docs/public/icon-512.png +0 -0
- package/dist/docs/public/icon-maskable-512.png +0 -0
- package/dist/docs/public/robots.txt +4 -0
- package/dist/docs/public/site.webmanifest +21 -0
- package/dist/docs/scripts/color-pairs.mjs +46 -0
- package/dist/docs/scripts/contrast-exceptions.mjs +6 -0
- package/dist/docs/scripts/token-utils.d.mts +26 -0
- package/dist/docs/scripts/token-utils.mjs +114 -0
- package/dist/docs/src/brand/Beehexa-brandguide-full-mar12.pdf +0 -0
- package/dist/docs/src/brand/color+typoDirections.pdf +0 -0
- package/dist/docs/src/brand/structure-proposal.md +227 -0
- package/dist/docs/src/components/ChildPages.astro +25 -0
- package/dist/docs/src/components/CodeExample.astro +18 -0
- package/dist/docs/src/components/ColorDemo.astro +794 -0
- package/dist/docs/src/components/ColorExample.astro +32 -0
- package/dist/docs/src/components/ColorSwatch.astro +20 -0
- package/dist/docs/src/components/ComponentTabs.astro +21 -0
- package/dist/docs/src/components/DocsFooter.astro +25 -0
- package/dist/docs/src/components/HelpOptions.astro +20 -0
- package/dist/docs/src/components/IconBrowser.astro +257 -0
- package/dist/docs/src/components/IconDemo.astro +185 -0
- package/dist/docs/src/components/InDevelopment.astro +29 -0
- package/dist/docs/src/components/LayoutDemo.astro +384 -0
- package/dist/docs/src/components/Logo.astro +25 -0
- package/dist/docs/src/components/PhaseTable.astro +22 -0
- package/dist/docs/src/components/RoleGuides.astro +48 -0
- package/dist/docs/src/components/ShapeDemo.astro +239 -0
- package/dist/docs/src/components/ShapePin.astro +22 -0
- package/dist/docs/src/components/Sidebar.astro +206 -0
- package/dist/docs/src/components/SiteHeader.astro +211 -0
- package/dist/docs/src/components/SpacingDemo.astro +172 -0
- package/dist/docs/src/components/StatusBadge.astro +22 -0
- package/dist/docs/src/components/SystemAreas.astro +29 -0
- package/dist/docs/src/components/TableOfContents.astro +47 -0
- package/dist/docs/src/components/TokenTable.astro +40 -0
- package/dist/docs/src/components/TypeDemo.astro +249 -0
- package/dist/docs/src/components/logos/Fig.astro +28 -0
- package/dist/docs/src/components/logos/LogoAnatomy.astro +101 -0
- package/dist/docs/src/components/logos/LogoClearSpace.astro +81 -0
- package/dist/docs/src/components/logos/LogoColourVersions.astro +45 -0
- package/dist/docs/src/components/logos/LogoConstruction.astro +84 -0
- package/dist/docs/src/components/logos/LogoContainer.astro +84 -0
- package/dist/docs/src/components/logos/LogoHero.astro +42 -0
- package/dist/docs/src/components/logos/LogoInUse.astro +197 -0
- package/dist/docs/src/components/logos/LogoMeanings.astro +75 -0
- package/dist/docs/src/components/logos/LogoMinSize.astro +55 -0
- package/dist/docs/src/components/logos/LogoMistakes.astro +109 -0
- package/dist/docs/src/components/logos/LogoMisuse.astro +96 -0
- package/dist/docs/src/components/logos/LogoPair.astro +26 -0
- package/dist/docs/src/components/logos/LogoSvg.astro +68 -0
- package/dist/docs/src/content/components/button/accessibility.mdx +18 -0
- package/dist/docs/src/content/components/button/changelog.mdx +6 -0
- package/dist/docs/src/content/components/button/code.mdx +27 -0
- package/dist/docs/src/content/components/button/examples.mdx +21 -0
- package/dist/docs/src/content/components/button/meta.json +5 -0
- package/dist/docs/src/content/components/button/usage.mdx +18 -0
- package/dist/docs/src/content/foundations/guidelines/accessibility.mdx +19 -0
- package/dist/docs/src/content/foundations/guidelines/content.mdx +25 -0
- package/dist/docs/src/content/foundations/index.mdx +9 -0
- package/dist/docs/src/content/foundations/styles/border.mdx +89 -0
- package/dist/docs/src/content/foundations/styles/color/accessibility.mdx +32 -0
- package/dist/docs/src/content/foundations/styles/color/dark-mode.mdx +22 -0
- package/dist/docs/src/content/foundations/styles/color/index.mdx +65 -0
- package/dist/docs/src/content/foundations/styles/color/palette.mdx +57 -0
- package/dist/docs/src/content/foundations/styles/color/tokens.mdx +55 -0
- package/dist/docs/src/content/foundations/styles/color/usage.mdx +111 -0
- package/dist/docs/src/content/foundations/styles/data-visualization.mdx +11 -0
- package/dist/docs/src/content/foundations/styles/elevation.mdx +12 -0
- package/dist/docs/src/content/foundations/styles/icons/accessibility.mdx +72 -0
- package/dist/docs/src/content/foundations/styles/icons/code.mdx +171 -0
- package/dist/docs/src/content/foundations/styles/icons/index.mdx +62 -0
- package/dist/docs/src/content/foundations/styles/icons/library.mdx +19 -0
- package/dist/docs/src/content/foundations/styles/icons/usage.mdx +100 -0
- package/dist/docs/src/content/foundations/styles/illustration.mdx +9 -0
- package/dist/docs/src/content/foundations/styles/interaction-states.mdx +49 -0
- package/dist/docs/src/content/foundations/styles/layout/app-frame.mdx +81 -0
- package/dist/docs/src/content/foundations/styles/layout/breakpoints.mdx +56 -0
- package/dist/docs/src/content/foundations/styles/layout/grid.mdx +87 -0
- package/dist/docs/src/content/foundations/styles/layout/index.mdx +24 -0
- package/dist/docs/src/content/foundations/styles/layout/overlays.mdx +45 -0
- package/dist/docs/src/content/foundations/styles/layout/page-widths.mdx +38 -0
- package/dist/docs/src/content/foundations/styles/logos/downloads-and-terms.mdx +65 -0
- package/dist/docs/src/content/foundations/styles/logos/index.mdx +64 -0
- package/dist/docs/src/content/foundations/styles/logos/placement-and-containers.mdx +96 -0
- package/dist/docs/src/content/foundations/styles/logos/product-logos.mdx +56 -0
- package/dist/docs/src/content/foundations/styles/logos/using-the-logo.mdx +70 -0
- package/dist/docs/src/content/foundations/styles/motion.mdx +11 -0
- package/dist/docs/src/content/foundations/styles/opacity.mdx +9 -0
- package/dist/docs/src/content/foundations/styles/radius.mdx +98 -0
- package/dist/docs/src/content/foundations/styles/size-and-density.mdx +41 -0
- package/dist/docs/src/content/foundations/styles/spacing.mdx +70 -0
- package/dist/docs/src/content/foundations/styles/typography/code.mdx +53 -0
- package/dist/docs/src/content/foundations/styles/typography/index.mdx +58 -0
- package/dist/docs/src/content/foundations/styles/typography/usage.mdx +144 -0
- package/dist/docs/src/content/foundations/styles/typography/vietnamese.mdx +46 -0
- package/dist/docs/src/content/foundations/styles/z-index.mdx +9 -0
- package/dist/docs/src/content/foundations/tokens/all-tokens.mdx +36 -0
- package/dist/docs/src/content/foundations/tokens/index.mdx +27 -0
- package/dist/docs/src/content/get-started/content.mdx +14 -0
- package/dist/docs/src/content/get-started/design.mdx +30 -0
- package/dist/docs/src/content/get-started/develop.mdx +59 -0
- package/dist/docs/src/content/get-started/get-help.mdx +19 -0
- package/dist/docs/src/content/get-started/index.mdx +50 -0
- package/dist/docs/src/content/news/2026-10-16-site-structure.md +15 -0
- package/dist/docs/src/content/news/2026-10-20-docs-site.md +13 -0
- package/dist/docs/src/content/release-phases/index.mdx +12 -0
- package/dist/docs/src/content/tools/ai-agents.mdx +49 -0
- package/dist/docs/src/content/tools/ant-design-vue-theme.mdx +138 -0
- package/dist/docs/src/content/tools/eslint.mdx +15 -0
- package/dist/docs/src/content/tools/index.mdx +7 -0
- package/dist/docs/src/content/tools/stylelint.mdx +19 -0
- package/dist/docs/src/content-vi/foundations/styles/border.mdx +89 -0
- package/dist/docs/src/content-vi/foundations/styles/color/accessibility.mdx +32 -0
- package/dist/docs/src/content-vi/foundations/styles/color/dark-mode.mdx +22 -0
- package/dist/docs/src/content-vi/foundations/styles/color/index.mdx +65 -0
- package/dist/docs/src/content-vi/foundations/styles/color/palette.mdx +57 -0
- package/dist/docs/src/content-vi/foundations/styles/color/tokens.mdx +55 -0
- package/dist/docs/src/content-vi/foundations/styles/color/usage.mdx +111 -0
- package/dist/docs/src/content-vi/foundations/styles/data-visualization.mdx +11 -0
- package/dist/docs/src/content-vi/foundations/styles/icons/accessibility.mdx +72 -0
- package/dist/docs/src/content-vi/foundations/styles/icons/code.mdx +170 -0
- package/dist/docs/src/content-vi/foundations/styles/icons/index.mdx +62 -0
- package/dist/docs/src/content-vi/foundations/styles/icons/library.mdx +19 -0
- package/dist/docs/src/content-vi/foundations/styles/icons/usage.mdx +100 -0
- package/dist/docs/src/content-vi/foundations/styles/illustration.mdx +9 -0
- package/dist/docs/src/content-vi/foundations/styles/interaction-states.mdx +49 -0
- package/dist/docs/src/content-vi/foundations/styles/layout/app-frame.mdx +77 -0
- package/dist/docs/src/content-vi/foundations/styles/layout/breakpoints.mdx +56 -0
- package/dist/docs/src/content-vi/foundations/styles/layout/grid.mdx +87 -0
- package/dist/docs/src/content-vi/foundations/styles/layout/index.mdx +24 -0
- package/dist/docs/src/content-vi/foundations/styles/layout/page-widths.mdx +34 -0
- package/dist/docs/src/content-vi/foundations/styles/logos/downloads-and-terms.mdx +65 -0
- package/dist/docs/src/content-vi/foundations/styles/logos/index.mdx +64 -0
- package/dist/docs/src/content-vi/foundations/styles/logos/placement-and-containers.mdx +96 -0
- package/dist/docs/src/content-vi/foundations/styles/logos/product-logos.mdx +56 -0
- package/dist/docs/src/content-vi/foundations/styles/logos/using-the-logo.mdx +70 -0
- package/dist/docs/src/content-vi/foundations/styles/opacity.mdx +9 -0
- package/dist/docs/src/content-vi/foundations/styles/radius.mdx +98 -0
- package/dist/docs/src/content-vi/foundations/styles/size-and-density.mdx +41 -0
- package/dist/docs/src/content-vi/foundations/styles/spacing.mdx +70 -0
- package/dist/docs/src/content-vi/foundations/styles/typography/code.mdx +53 -0
- package/dist/docs/src/content-vi/foundations/styles/typography/index.mdx +58 -0
- package/dist/docs/src/content-vi/foundations/styles/typography/usage.mdx +144 -0
- package/dist/docs/src/content-vi/foundations/styles/typography/vietnamese.mdx +46 -0
- package/dist/docs/src/content-vi/foundations/styles/z-index.mdx +9 -0
- package/dist/docs/src/content.config.ts +68 -0
- package/dist/docs/src/lib/brand.ts +57 -0
- package/dist/docs/src/lib/contrast.ts +34 -0
- package/dist/docs/src/lib/i18n.ts +152 -0
- package/dist/docs/src/lib/icons.ts +46 -0
- package/dist/docs/src/lib/logo-geometry.ts +30 -0
- package/dist/docs/src/lib/lucide-categories.json +1 -0
- package/dist/docs/src/lib/lucide-data.ts +40 -0
- package/dist/docs/src/lib/navigation.ts +222 -0
- package/dist/docs/src/lib/release-phases.ts +10 -0
- package/dist/docs/src/lib/routes.ts +40 -0
- package/dist/docs/src/lib/token-descriptions-vi.ts +40 -0
- package/dist/docs/src/lib/tokens.ts +67 -0
- package/dist/docs/src/lib/tri-grid.ts +28 -0
- package/dist/docs/src/styles/chrome.css +122 -0
- package/dist/docs/src/styles/color.css +270 -0
- package/dist/docs/src/styles/docs.css +323 -0
- package/dist/docs/src/styles/global.css +66 -0
- package/dist/docs/src/styles/icons.css +135 -0
- package/dist/docs/src/styles/layout.css +165 -0
- package/dist/docs/src/styles/logos.css +236 -0
- package/dist/docs/src/styles/shapes.css +139 -0
- package/dist/docs/src/styles/tokens.css +461 -0
- package/dist/docs/src/styles/tokens.js +425 -0
- package/dist/docs/src/styles/typography.css +91 -0
- package/dist/docs/tokens/border.json +26 -0
- package/dist/docs/tokens/breakpoints.json +8 -0
- package/dist/docs/tokens/color.json +1350 -0
- package/dist/docs/tokens/elevation.json +26 -0
- package/dist/docs/tokens/layout.json +29 -0
- package/dist/docs/tokens/motion.json +12 -0
- package/dist/docs/tokens/radius.json +44 -0
- package/dist/docs/tokens/size.json +13 -0
- package/dist/docs/tokens/spacing.json +18 -0
- package/dist/docs/tokens/states.json +12 -0
- package/dist/docs/tokens/typography.json +220 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +1823 -0
- package/package.json +31 -4
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Tokens
|
|
3
|
+
description: How colour token names are built, every role token with its light and dark value, how to use them in code, and how to ask for a new one.
|
|
4
|
+
order: 4
|
|
5
|
+
---
|
|
6
|
+
import ColorDemo from '../../../../components/ColorDemo.astro';
|
|
7
|
+
|
|
8
|
+
**Every colour token name says what is painted, what it means, how strong it is and what is happening.**
|
|
9
|
+
|
|
10
|
+
## How names are built
|
|
11
|
+
|
|
12
|
+
`color.{property}.{role}.{emphasis}.{state}`. A part is left out when it is the default.
|
|
13
|
+
|
|
14
|
+
<ColorDemo kind="anatomy" />
|
|
15
|
+
|
|
16
|
+
| Part | Values |
|
|
17
|
+
|---|---|
|
|
18
|
+
| Property | `text`, `icon`, `link`, `surface`, `background`, `border`, `skeleton` |
|
|
19
|
+
| Role | `neutral` (left out), `brand`, `danger`, `warning`, `success`, `info`, `inverse`, `disabled`; surfaces: `page`, `subtle`, `inverse`, `scrim` |
|
|
20
|
+
| Emphasis | Text: default, `subtle`, `subtlest`. Fills: `subtle`, default, `bold`. Borders: default, `bold` |
|
|
21
|
+
| State | `hover`, `pressed`, `selected`, `focus` |
|
|
22
|
+
|
|
23
|
+
`color.background.danger.bold.hover` is the solid danger fill on hover. Two names name the fill under the text instead of a role: `text.on-bold` (on any solid status fill) and `text.on-brand` (on the brand yellow).
|
|
24
|
+
|
|
25
|
+
In CSS, write `--bh-` and the name with dots as hyphens: `color.text.subtle` is `var(--bh-color-text-subtle)`.
|
|
26
|
+
|
|
27
|
+
Use role tokens. The [palette](/foundations/styles/color/palette/) feeds them and is never used directly (see [How colour works](/foundations/styles/color/#how-colour-works)).
|
|
28
|
+
|
|
29
|
+
## Text and icons
|
|
30
|
+
|
|
31
|
+
<ColorDemo kind="roles" group="text" />
|
|
32
|
+
|
|
33
|
+
<ColorDemo kind="roles" group="icon" />
|
|
34
|
+
|
|
35
|
+
## Surfaces
|
|
36
|
+
|
|
37
|
+
<ColorDemo kind="roles" group="surface" />
|
|
38
|
+
|
|
39
|
+
## Backgrounds
|
|
40
|
+
|
|
41
|
+
<ColorDemo kind="roles" group="background" />
|
|
42
|
+
|
|
43
|
+
## Borders
|
|
44
|
+
|
|
45
|
+
<ColorDemo kind="roles" group="border" />
|
|
46
|
+
|
|
47
|
+
## Missing a token
|
|
48
|
+
|
|
49
|
+
1. Check [Find the token](/foundations/styles/color/usage/#find-the-token) and the list below.
|
|
50
|
+
2. Ask the design system team. Say where you need it, and propose a name from the four parts that points at a step with the right job (fill at 3, border at 7, text at 11).
|
|
51
|
+
3. The team checks its contrast in both themes and adds it. Use it only after it is released.
|
|
52
|
+
|
|
53
|
+
## All colour tokens
|
|
54
|
+
|
|
55
|
+
<ColorDemo kind="tokens" />
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Usage
|
|
3
|
+
description: Which token to use for each part of a screen, how status, emphasis and states are coloured, and what not to do.
|
|
4
|
+
order: 2
|
|
5
|
+
---
|
|
6
|
+
import ColorDemo from '../../../../components/ColorDemo.astro';
|
|
7
|
+
|
|
8
|
+
**Pick a token by what you are painting and what it means, not by how it looks.**
|
|
9
|
+
|
|
10
|
+
<ColorDemo kind="example" />
|
|
11
|
+
|
|
12
|
+
## Find the token
|
|
13
|
+
|
|
14
|
+
| I need | Use |
|
|
15
|
+
|---|---|
|
|
16
|
+
| Page background | `surface.page` |
|
|
17
|
+
| Card, panel, dialog | `surface`, edge `border` |
|
|
18
|
+
| Sidebar, table header, quiet area | `surface.subtle` |
|
|
19
|
+
| Body text, headings, labels | `text` |
|
|
20
|
+
| Descriptions, secondary table columns, navigation | `text.subtle` |
|
|
21
|
+
| Metadata, timestamps, helper text, breadcrumbs | `text.subtlest` |
|
|
22
|
+
| Placeholder | `text.subtlest` |
|
|
23
|
+
| Link | `link`; on hover `link.hover` |
|
|
24
|
+
| Icon next to text | `icon`; less important `icon.subtle` |
|
|
25
|
+
| Divider, card edge | `border` |
|
|
26
|
+
| Edge of an input, checkbox or select | `border.bold` |
|
|
27
|
+
| Keyboard focus ring | `border.focus`, 2 px, 2 px away |
|
|
28
|
+
| Primary button | `background.neutral.bold`, `text.inverse` |
|
|
29
|
+
| Default button | `surface`, `border`, `text`; on hover `background.neutral.subtle.hover` |
|
|
30
|
+
| Destructive button | `background.danger.bold`, `text.on-bold` |
|
|
31
|
+
| Row or menu item on hover | `background.neutral.subtle.hover` |
|
|
32
|
+
| Selected row, tab or menu item | `background.selected` and a second cue |
|
|
33
|
+
| Current page in the navigation | `border.selected` bar, `background.selected`, `aria-current="page"` |
|
|
34
|
+
| Error under a field | `text.danger`, `icon.danger` |
|
|
35
|
+
| Banner for a status | `background.{role}.subtle`, `border.{role}.subtle`, `text`, `icon.{role}` |
|
|
36
|
+
| Status in a table row | A [label](#labels) |
|
|
37
|
+
| Tooltip, toast | `surface.inverse`, `text.inverse` |
|
|
38
|
+
| Layer behind a dialog or drawer | `surface.scrim` |
|
|
39
|
+
| Loading placeholder | `skeleton`, sheen `skeleton.subtle` |
|
|
40
|
+
| Code block | `code.background`, `code.text` |
|
|
41
|
+
| Brand note | `background.brand.subtle`, `border.brand.subtle` |
|
|
42
|
+
| Disabled control | `background.disabled`, `text.disabled`, `border.disabled` |
|
|
43
|
+
|
|
44
|
+
Not in the table? Build the name from its four parts (see [Tokens](/foundations/styles/color/tokens/)). If no token exists, ask for one; don't pick the nearest colour.
|
|
45
|
+
|
|
46
|
+
## Surfaces and backgrounds
|
|
47
|
+
|
|
48
|
+
**Surfaces are the layers of a screen; backgrounds fill the things on them.**
|
|
49
|
+
|
|
50
|
+
<ColorDemo kind="surfaces" />
|
|
51
|
+
|
|
52
|
+
`surface.scrim` goes behind dialogs and drawers only, one layer, at its own opacity.
|
|
53
|
+
|
|
54
|
+
## Emphasis
|
|
55
|
+
|
|
56
|
+
<ColorDemo kind="emphasis" />
|
|
57
|
+
|
|
58
|
+
## Status
|
|
59
|
+
|
|
60
|
+
**Every status is one of five roles. Pick by what the person needs to do, and always say it in words.**
|
|
61
|
+
|
|
62
|
+
### Choosing a status
|
|
63
|
+
|
|
64
|
+
| Role | Use when | HexaSync examples |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| Info | Something is happening or worth knowing; no action needed. | Syncing, queued, importing |
|
|
67
|
+
| Success | It worked. | Synced, connected, completed |
|
|
68
|
+
| Warning | It works now but needs attention soon. | Partial sync, token expires in 3 days, rate limited |
|
|
69
|
+
| Danger | It failed or is blocked, or the action destroys something. | Failed, disconnected, delete |
|
|
70
|
+
| Neutral | Nothing is happening and nothing is wrong. | Paused, draft, skipped, archived |
|
|
71
|
+
|
|
72
|
+
Warning is orange, not yellow: yellow is the brand. There is no sixth level; say the difference in words ("Failed 3 times").
|
|
73
|
+
|
|
74
|
+
### Status colours
|
|
75
|
+
|
|
76
|
+
<ColorDemo kind="status" />
|
|
77
|
+
|
|
78
|
+
<ColorDemo kind="banners" />
|
|
79
|
+
|
|
80
|
+
<ColorDemo kind="dodont" item="warning" />
|
|
81
|
+
|
|
82
|
+
### Labels
|
|
83
|
+
|
|
84
|
+
<ColorDemo kind="labels" />
|
|
85
|
+
|
|
86
|
+
| | Label | State label |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| Looks | Outline in the role's `border`, text in its `text` | Fill in the role's `bold`, text and icon in `text.on-bold` |
|
|
89
|
+
| Size | 20 px, padding 6 px; large 24 px, 8 px | 32 px, padding 12 px |
|
|
90
|
+
| Use | Many per screen: table rows, tags | One per page: the status the page is about |
|
|
91
|
+
|
|
92
|
+
## Interaction states
|
|
93
|
+
|
|
94
|
+
**Add `.hover` or `.pressed` to the token at rest; never use opacity or an overlay.**
|
|
95
|
+
|
|
96
|
+
<ColorDemo kind="states" />
|
|
97
|
+
|
|
98
|
+
| State | Use |
|
|
99
|
+
|---|---|
|
|
100
|
+
| Hover, pressed | The rest token plus `.hover` or `.pressed` |
|
|
101
|
+
| Selected | `background.selected` and a second cue |
|
|
102
|
+
| Focus | 2 px `border.focus` ring, 2 px away |
|
|
103
|
+
| Disabled | `background.disabled`, `text.disabled`, `border.disabled` |
|
|
104
|
+
|
|
105
|
+
On a row or menu item each state sits one step further from the background: hover, then selected, then selected on hover. A hovered row is always lighter than a selected one, so it never looks selected.
|
|
106
|
+
|
|
107
|
+
More on [Interaction states](/foundations/styles/interaction-states/).
|
|
108
|
+
|
|
109
|
+
## Buttons
|
|
110
|
+
|
|
111
|
+
<ColorDemo kind="actions" />
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Data visualization"
|
|
3
|
+
description: "Colours, type and rules for charts, KPI tiles and other data displays."
|
|
4
|
+
order: 13
|
|
5
|
+
planned:
|
|
6
|
+
- "A chart palette for series, with contrast in light and dark"
|
|
7
|
+
- "Status colours in charts"
|
|
8
|
+
- "Chart types and when to use each"
|
|
9
|
+
- "Axis, legend, tooltip and number formats"
|
|
10
|
+
- "Accessible charts: not by colour alone, text alternatives"
|
|
11
|
+
---
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Elevation
|
|
3
|
+
description: Shadows that show which surfaces sit above others.
|
|
4
|
+
order: 8
|
|
5
|
+
---
|
|
6
|
+
import TokenTable from '../../../components/TokenTable.astro';
|
|
7
|
+
|
|
8
|
+
- `elevation.shadow.raised`: cards that sit on the page.
|
|
9
|
+
- `elevation.shadow.overlay`: dropdowns, popovers and dialogs that float above content.
|
|
10
|
+
|
|
11
|
+
## Tokens
|
|
12
|
+
<TokenTable prefix="elevation" />
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Accessibility
|
|
3
|
+
description: How icons get a name or stay silent, why icon-only buttons need a tooltip, and the contrast and target size icons must meet.
|
|
4
|
+
order: 3
|
|
5
|
+
---
|
|
6
|
+
import IconDemo from '../../../../components/IconDemo.astro';
|
|
7
|
+
|
|
8
|
+
**An icon is either decorative and hidden, or it has a name. A clickable icon is always inside a button or a link of at least 24 × 24.**
|
|
9
|
+
|
|
10
|
+
| Check | Rule | WCAG 2.2 |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| Decorative icon | Hidden with `aria-hidden="true"` | 1.1.1 |
|
|
13
|
+
| Icon-only button or link | Has a name (`aria-label`) and a matching tooltip | 1.1.1, 2.5.3, 4.1.2 |
|
|
14
|
+
| Icon that carries meaning | 3:1 contrast or more with its background | 1.4.11 |
|
|
15
|
+
| Status | Written in words, never icon or colour alone | 1.4.1 |
|
|
16
|
+
| Target | 24 × 24 or more; 32 × 32 icon buttons in products | 2.5.8 |
|
|
17
|
+
|
|
18
|
+
## Decorative icons
|
|
19
|
+
|
|
20
|
+
**When text sits next to the icon, the icon is decorative.** Hide it, so screen readers read the label once.
|
|
21
|
+
|
|
22
|
+
Lucide does this for you: an icon with no `aria-label`, `aria-labelledby`, `role` or `title` gets `aria-hidden="true"`. Don’t add a label to an icon that already has text next to it.
|
|
23
|
+
|
|
24
|
+
<IconDemo kind="dodont" item="decorative" />
|
|
25
|
+
|
|
26
|
+
## Icon-only buttons
|
|
27
|
+
|
|
28
|
+
**Name the button, not the icon.** Put the name on the `<button>` or `<a>` with `aria-label`. The icon inside stays hidden.
|
|
29
|
+
|
|
30
|
+
- The name says what happens: “Delete store”, not “Trash” or “Icon”.
|
|
31
|
+
- Add a tooltip with the same words, on hover and on keyboard focus. The tooltip must start with the button’s name, so speech input users can say what they see (WCAG 2.5.3).
|
|
32
|
+
- Use an icon-only button only for well-known actions. See [Icon and label](/foundations/styles/icons/usage/#icon-and-label).
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<button type="button" aria-label="Settings">
|
|
36
|
+
<svg aria-hidden="true">…</svg>
|
|
37
|
+
</button>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
<IconDemo kind="dodont" item="tooltip" />
|
|
41
|
+
|
|
42
|
+
## Meaningful icons on their own
|
|
43
|
+
|
|
44
|
+
When an icon is the only sign of something, such as a status icon in a narrow table column, give the icon itself a name: `role="img"` and `aria-label="Failed"`. Prefer writing the status in words.
|
|
45
|
+
|
|
46
|
+
## Contrast
|
|
47
|
+
|
|
48
|
+
**Icons that carry meaning need 3:1 against their background** (WCAG 1.4.11). Every `color.icon.*` token meets 3:1 on the backgrounds it is paired with, in light and dark; the build checks it. Decorative icons and icons in disabled controls have no minimum.
|
|
49
|
+
|
|
50
|
+
See every pair in [Color › Accessibility](/foundations/styles/color/accessibility/).
|
|
51
|
+
|
|
52
|
+
## Target size
|
|
53
|
+
|
|
54
|
+
**Anything you can click is at least 24 × 24** (WCAG 2.5.8). In Beehexa products, icon buttons are 32 × 32 with a 16 px icon. The icon is never the only thing to click.
|
|
55
|
+
|
|
56
|
+
<IconDemo kind="target" />
|
|
57
|
+
|
|
58
|
+
<IconDemo kind="dodont" item="target" />
|
|
59
|
+
|
|
60
|
+
## Keyboard and focus
|
|
61
|
+
|
|
62
|
+
- The button or link gets focus, never the icon. Don’t add `tabindex` to an `<svg>`.
|
|
63
|
+
- The focus ring goes around the whole 32 × 32 button.
|
|
64
|
+
- A tooltip opens on focus as well as hover, and closes with Escape.
|
|
65
|
+
|
|
66
|
+
## Checklist
|
|
67
|
+
|
|
68
|
+
- Every icon next to text is hidden from screen readers.
|
|
69
|
+
- Every icon-only button has a name and a tooltip with the same words.
|
|
70
|
+
- No status is shown by an icon or colour alone.
|
|
71
|
+
- Meaningful icons reach 3:1; the token already does if you use the right one.
|
|
72
|
+
- Every clickable icon sits in a target of 24 × 24 or more.
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Code
|
|
3
|
+
description: How Vue products install, import, size, colour and label Lucide icons, with short notes for React and Astro.
|
|
4
|
+
order: 4
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
**Products use Lucide directly. Install the Lucide package for your framework, pin the version and import each icon by name.**
|
|
8
|
+
|
|
9
|
+
## Packages
|
|
10
|
+
|
|
11
|
+
| Framework | Package | Version |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| Vue, for Beehexa products | `@lucide/vue` | 1.62.0 |
|
|
14
|
+
| React | `lucide-react` | 1.62.0 |
|
|
15
|
+
|
|
16
|
+
Every product uses the same Lucide version as this site, so the icons match the [Library](/foundations/styles/icons/library/). The icons are bundled into the app at build time. There is no request to a CDN.
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @lucide/vue@1.62.0 --save-exact
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Pin the exact version, with no `^` or `~`. A new Lucide version can change a shape or rename an icon, so raise the version on purpose. See [Updating Lucide](#updating-lucide).
|
|
25
|
+
|
|
26
|
+
## Import
|
|
27
|
+
|
|
28
|
+
Import each icon by name. Names are the Library names in PascalCase: `refresh-cw` becomes `RefreshCw`. Only the icons you import end up in the bundle.
|
|
29
|
+
|
|
30
|
+
```vue
|
|
31
|
+
<script setup lang="ts">
|
|
32
|
+
import { RefreshCw } from '@lucide/vue';
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<template>
|
|
36
|
+
<button type="button" class="bh-button">
|
|
37
|
+
<RefreshCw :size="16" />
|
|
38
|
+
Sync now
|
|
39
|
+
</button>
|
|
40
|
+
</template>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Don’t import the whole set with `import * as`. It puts every icon in the bundle.
|
|
44
|
+
|
|
45
|
+
## Default size
|
|
46
|
+
|
|
47
|
+
Lucide draws icons at 24 px. Beehexa products use 16 px by default. Set it once in the root component:
|
|
48
|
+
|
|
49
|
+
```vue
|
|
50
|
+
<!-- App.vue -->
|
|
51
|
+
<script setup lang="ts">
|
|
52
|
+
import { setLucideProps } from '@lucide/vue';
|
|
53
|
+
|
|
54
|
+
setLucideProps({ size: 16 });
|
|
55
|
+
</script>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Then set `size` only for a 20, 24 or 32 px icon.
|
|
59
|
+
|
|
60
|
+
## Props
|
|
61
|
+
|
|
62
|
+
| Prop | Lucide default | Beehexa rule |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| `size` | 24 | 16 by default. 20, 24 or 32 only where Usage says so. Nothing else. |
|
|
65
|
+
| `color` | `currentColor` | Leave it. Set the colour on the parent with an icon colour token. |
|
|
66
|
+
| `stroke-width` | 2 | Don’t change it. |
|
|
67
|
+
| `non-scaling-stroke` | `false` | Don’t turn it on. Don’t use its older name, absolute-stroke-width, either. |
|
|
68
|
+
| `aria-label` | none | Only for a meaningful icon on its own, together with the img role. |
|
|
69
|
+
|
|
70
|
+
## Size
|
|
71
|
+
|
|
72
|
+
Use the `size` prop, or set the size in CSS on the `svg`. Both keep the stroke in scale.
|
|
73
|
+
|
|
74
|
+
```vue
|
|
75
|
+
<RefreshCw :size="20" />
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Colour
|
|
79
|
+
|
|
80
|
+
```css
|
|
81
|
+
.sync-status {
|
|
82
|
+
color: var(--bh-color-icon-success);
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
```vue
|
|
87
|
+
<span class="sync-status"><CircleCheck /> Synced</span>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Spacing
|
|
91
|
+
|
|
92
|
+
Set the gap on the control, from its size: 4 px (`space.050`) with a 16 px icon in small and default controls, 8 px (`space.100`) with a 20 or 24 px icon. See [Usage › Spacing](/foundations/styles/icons/usage/#spacing).
|
|
93
|
+
|
|
94
|
+
```css
|
|
95
|
+
.bh-button {
|
|
96
|
+
display: inline-flex;
|
|
97
|
+
align-items: center;
|
|
98
|
+
gap: var(--bh-space-050);
|
|
99
|
+
}
|
|
100
|
+
.bh-button.is-large {
|
|
101
|
+
gap: var(--bh-space-100);
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Accessibility
|
|
106
|
+
|
|
107
|
+
Lucide hides an icon from screen readers with `aria-hidden="true"`, unless you give it an `aria-*`, `role` or `title` prop. Name icon-only buttons on the button, and add a tooltip with the same text.
|
|
108
|
+
|
|
109
|
+
```vue
|
|
110
|
+
<a-tooltip title="Settings">
|
|
111
|
+
<button type="button" class="icon-button" aria-label="Settings">
|
|
112
|
+
<Settings />
|
|
113
|
+
</button>
|
|
114
|
+
</a-tooltip>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
A meaningful icon on its own gets a role and a label, which also removes `aria-hidden`:
|
|
118
|
+
|
|
119
|
+
```vue
|
|
120
|
+
<CircleX role="img" aria-label="Failed" />
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Inside Ant Design Vue
|
|
124
|
+
|
|
125
|
+
Put the icon in the `icon` slot and add the `anticon` class, so Ant Design Vue lines it up like its own icons.
|
|
126
|
+
|
|
127
|
+
```vue
|
|
128
|
+
<a-button>
|
|
129
|
+
<template #icon><Plus class="anticon" /></template>
|
|
130
|
+
Add store
|
|
131
|
+
</a-button>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## React
|
|
135
|
+
|
|
136
|
+
`lucide-react` has the same icons and props, in camelCase. Set the default size once with `LucideProvider`.
|
|
137
|
+
|
|
138
|
+
```tsx
|
|
139
|
+
import { LucideProvider, RefreshCw } from 'lucide-react';
|
|
140
|
+
|
|
141
|
+
<LucideProvider size={16}>
|
|
142
|
+
<button type="button">
|
|
143
|
+
<RefreshCw />
|
|
144
|
+
Sync now
|
|
145
|
+
</button>
|
|
146
|
+
</LucideProvider>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Astro
|
|
150
|
+
|
|
151
|
+
beehexa.design uses `@lucide/astro`. Import each icon from its own file, so the build stays fast:
|
|
152
|
+
|
|
153
|
+
```astro
|
|
154
|
+
---
|
|
155
|
+
import Search from '@lucide/astro/icons/search';
|
|
156
|
+
---
|
|
157
|
+
<button class="icon-button" type="button" aria-label="Search">
|
|
158
|
+
<Search size={20} />
|
|
159
|
+
</button>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
## Custom icons
|
|
164
|
+
|
|
165
|
+
Lucide covers what Beehexa needs today. If an icon is ever missing, draw it on Lucide’s 24 px grid with the same stroke and caps, name it in kebab-case with a `bh-` prefix, and add it to the library.
|
|
166
|
+
|
|
167
|
+
## Updating Lucide
|
|
168
|
+
|
|
169
|
+
1. Read the Lucide release notes for renamed or changed icons.
|
|
170
|
+
2. Check that every icon in [Common actions](/foundations/styles/icons/usage/#common-actions) still exists.
|
|
171
|
+
3. Raise the pinned version in the product, and ask the design system team to update the Library, so it shows the same icons.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Icons
|
|
3
|
+
description: Beehexa products use Lucide, an open-source set of outline icons, directly. A few rules cover size, colour, spacing, labels and accessibility.
|
|
4
|
+
order: 11
|
|
5
|
+
sidebarLabel: Overview
|
|
6
|
+
---
|
|
7
|
+
import IconDemo from '../../../../components/IconDemo.astro';
|
|
8
|
+
|
|
9
|
+
Icons help people scan a screen and recognise an action. In Beehexa products they never replace words: a status is written, and most actions have a label.
|
|
10
|
+
|
|
11
|
+
Beehexa uses **[Lucide](https://lucide.dev)**: about 1,900 outline icons on a 24 × 24 grid, under the ISC licence. Products import Lucide directly. There is no Beehexa icon package. We add usage rules on top.
|
|
12
|
+
|
|
13
|
+
<IconDemo kind="sizes" />
|
|
14
|
+
|
|
15
|
+
## Principles
|
|
16
|
+
|
|
17
|
+
### Words first
|
|
18
|
+
|
|
19
|
+
An icon supports a label. Use an icon on its own only for an action everyone knows, such as close, search or more, and give it a name and a tooltip.
|
|
20
|
+
|
|
21
|
+
### One icon, one meaning
|
|
22
|
+
|
|
23
|
+
The same idea always has the same icon, in every product. Sync is `refresh-cw` everywhere. See the [common actions](/foundations/styles/icons/usage/#common-actions).
|
|
24
|
+
|
|
25
|
+
### Outline only
|
|
26
|
+
|
|
27
|
+
Lucide has no filled icons. Show a selected item with the selected background and an indicator bar, not with a different icon.
|
|
28
|
+
|
|
29
|
+
### Colour follows the text
|
|
30
|
+
|
|
31
|
+
An icon takes the colour of the text next to it. Use a status colour only when the icon shows that status.
|
|
32
|
+
|
|
33
|
+
## The rules at a glance
|
|
34
|
+
|
|
35
|
+
| Rule | Value |
|
|
36
|
+
|---|---|
|
|
37
|
+
| Icon set | Lucide, outline only |
|
|
38
|
+
| Sizes | 16 (default), 20 (next to 16 px text, toolbars), 24 (icon on its own), 32 (empty states only) |
|
|
39
|
+
| Stroke | Lucide’s default, scaled with the icon: 1.33 px at 16, 1.67 at 20, 2 at 24 |
|
|
40
|
+
| Grid | 24 × 24, at least 1 unit of padding, round caps and joins |
|
|
41
|
+
| Colour | `currentColor`, with the `color.icon.*` tokens |
|
|
42
|
+
| Next to text | Centred on the first line. The gap follows the text size: 4 px next to 14 px text or smaller, 8 px next to 16 px text or larger |
|
|
43
|
+
| Labels | Icon with a label by default; icon-only for well-known actions, with a name and a tooltip |
|
|
44
|
+
| Decorative icons | Hidden from screen readers (`aria-hidden="true"`) |
|
|
45
|
+
| Contrast | 3:1 or more for icons that carry meaning (WCAG 1.4.11) |
|
|
46
|
+
| Target | 24 × 24 or more (WCAG 2.5.8); icon buttons in products are 32 × 32 |
|
|
47
|
+
| Names | One name per meaning, kebab-case, such as `circle-check` |
|
|
48
|
+
| Package | Lucide for Vue 1.62.0, pinned, imported by name |
|
|
49
|
+
| Right to left | Not needed: products are in Vietnamese and English |
|
|
50
|
+
|
|
51
|
+
## In this section
|
|
52
|
+
|
|
53
|
+
| Page | What is in it |
|
|
54
|
+
|---|---|
|
|
55
|
+
| [Library](/foundations/styles/icons/library/) | Every icon. Search, filter and copy a name. |
|
|
56
|
+
| [Usage](/foundations/styles/icons/usage/) | Size, stroke, colour, text alignment, labels, and the icon for each common action. |
|
|
57
|
+
| [Accessibility](/foundations/styles/icons/accessibility/) | Names, decorative icons, tooltips, contrast and target size. |
|
|
58
|
+
| [Code](/foundations/styles/icons/code/) | Installing, importing, sizing and labelling Lucide icons in Vue, with notes for React and Astro. |
|
|
59
|
+
|
|
60
|
+
## Licence
|
|
61
|
+
|
|
62
|
+
Lucide is © Lucide Contributors and released under the [ISC licence](https://lucide.dev/license). Parts of it come from Feather, © Cole Bemis, under the MIT licence. Both allow commercial use. Keep the licence notice when you ship the icons. The Lucide package keeps it for you.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Library
|
|
3
|
+
description: Every Lucide icon Beehexa can use. Search by name or tag, filter by category, switch the size and click an icon to copy its name.
|
|
4
|
+
order: 1
|
|
5
|
+
---
|
|
6
|
+
import IconBrowser from '../../../../components/IconBrowser.astro';
|
|
7
|
+
|
|
8
|
+
**Click an icon to copy its name.** Names are kebab-case, such as `circle-check`. In Vue the same icon is `CircleCheck`.
|
|
9
|
+
|
|
10
|
+
Before you pick an icon, check [Common actions](/foundations/styles/icons/usage/#common-actions): if the meaning is listed there, use that icon. The library opens on the category **Common actions**, which shows only those icons; a search looks through every icon, and **All** lists them all. They are Lucide icons chosen for common Beehexa actions. None is redrawn or renamed.
|
|
11
|
+
|
|
12
|
+
<IconBrowser />
|
|
13
|
+
|
|
14
|
+
## Using the library
|
|
15
|
+
|
|
16
|
+
- Search matches icon names first, then the tags Lucide gives each icon. “Sync” finds `refresh-cw`.
|
|
17
|
+
- The size switch shows 16, 20 and 24 px. Products use 16 px by default.
|
|
18
|
+
- With the keyboard: Tab to the icons, move with the arrow keys, Home and End, and press Enter to copy.
|
|
19
|
+
- Don’t see what you need? Search by meaning as well as by name. Two icons that each make sense alone rarely make a good third one. See [Custom icons](/foundations/styles/icons/code/#custom-icons).
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Usage
|
|
3
|
+
description: Which size to use, how stroke, colour and alignment work next to text, when an icon needs a label, and the one icon for each common Beehexa action.
|
|
4
|
+
order: 2
|
|
5
|
+
---
|
|
6
|
+
import IconDemo from '../../../../components/IconDemo.astro';
|
|
7
|
+
import ColorDemo from '../../../../components/ColorDemo.astro';
|
|
8
|
+
|
|
9
|
+
**Use 16 px icons in the colour of the text, with a label, and the same icon for the same meaning everywhere.**
|
|
10
|
+
|
|
11
|
+
## Sizes
|
|
12
|
+
|
|
13
|
+
**Pick the size from the text next to the icon.**
|
|
14
|
+
|
|
15
|
+
| Size | Use it for |
|
|
16
|
+
|---|---|
|
|
17
|
+
| 16 px | Default. Buttons, menus, tables, form fields, next to 14 px text. |
|
|
18
|
+
| 20 px | Next to 16 px text, in toolbars and in the page header. |
|
|
19
|
+
| 24 px | An icon on its own, such as a status in a card or a small empty state. |
|
|
20
|
+
| 32 px | Empty states only. |
|
|
21
|
+
|
|
22
|
+
Don’t use other sizes. Don’t scale an icon to fit a box: change the box.
|
|
23
|
+
|
|
24
|
+
<IconDemo kind="dodont" item="size" />
|
|
25
|
+
|
|
26
|
+
## Stroke
|
|
27
|
+
|
|
28
|
+
**Keep Lucide’s stroke.** It is 2 units on the 24 grid and scales with the icon: 1.33 px at 16, 1.67 px at 20, 2 px at 24. Don’t set `stroke-width` or `absoluteStrokeWidth`. A fixed 2 px stroke fills in the small details of a 16 px icon.
|
|
29
|
+
|
|
30
|
+
<IconDemo kind="dodont" item="stroke" />
|
|
31
|
+
|
|
32
|
+
## Colour
|
|
33
|
+
|
|
34
|
+
**An icon takes the colour of its text.** Icons draw with `currentColor`, so an icon in a button or a link is right without extra code. Set a colour only with a `color.icon.*` token:
|
|
35
|
+
|
|
36
|
+
<ColorDemo kind="roles" group="icon" />
|
|
37
|
+
|
|
38
|
+
- Status icons use the status token, such as `icon.danger`, and always sit next to the status in words.
|
|
39
|
+
- Never give an icon a colour to decorate it, and never use the brand yellow for an icon.
|
|
40
|
+
|
|
41
|
+
<IconDemo kind="dodont" item="colour" />
|
|
42
|
+
|
|
43
|
+
## Alignment with text
|
|
44
|
+
|
|
45
|
+
**Centre the icon on the line height of the text.** Use `display: flex; align-items: center`. Next to several lines, centre the icon on the first line.
|
|
46
|
+
|
|
47
|
+
<IconDemo kind="align" />
|
|
48
|
+
|
|
49
|
+
<IconDemo kind="dodont" item="align" />
|
|
50
|
+
|
|
51
|
+
## Spacing
|
|
52
|
+
|
|
53
|
+
**The gap between an icon and its text follows the text size: 4 px next to 14 px text or smaller, 8 px next to 16 px text or larger.**
|
|
54
|
+
|
|
55
|
+
| Text | Icon | Gap | Token | Where |
|
|
56
|
+
|---|---|---|---|---|
|
|
57
|
+
| 12 or 14 px | 16 px | 4 px | `space.050` | Small and default controls, menus, tabs, table cells |
|
|
58
|
+
| 16 px or larger | 20 or 24 px | 8 px | `space.100` | Large controls, toolbars, the page header, a status in a card |
|
|
59
|
+
|
|
60
|
+
Set the gap on the control with `gap`, not with a margin on the icon.
|
|
61
|
+
|
|
62
|
+
<IconDemo kind="spacing" />
|
|
63
|
+
|
|
64
|
+
## Icon and label
|
|
65
|
+
|
|
66
|
+
**Give an icon a label by default.** The label says what happens; the icon helps people find it again.
|
|
67
|
+
|
|
68
|
+
Use an icon on its own only when all three are true:
|
|
69
|
+
|
|
70
|
+
- The action is well known: close, search, add, edit, delete, copy, refresh, settings, filter, more, menu.
|
|
71
|
+
- Space is tight, such as a table row or a toolbar.
|
|
72
|
+
- The button has a name (`aria-label`) and a tooltip with the same words. See [Accessibility](/foundations/styles/icons/accessibility/).
|
|
73
|
+
|
|
74
|
+
<IconDemo kind="dodont" item="label" />
|
|
75
|
+
|
|
76
|
+
## Selected state
|
|
77
|
+
|
|
78
|
+
**Lucide icons are outline only.** Show a selected item with `background.selected` and the indicator bar, not by filling the icon.
|
|
79
|
+
|
|
80
|
+
<IconDemo kind="dodont" item="selected" />
|
|
81
|
+
|
|
82
|
+
## Common actions
|
|
83
|
+
|
|
84
|
+
**One icon per meaning.** Use this icon whenever you show one of these actions or objects, in every product. If a meaning is missing, ask before you choose one, so it is added here.
|
|
85
|
+
|
|
86
|
+
<IconDemo kind="actions" />
|
|
87
|
+
|
|
88
|
+
<IconDemo kind="dodont" item="meaning" />
|
|
89
|
+
|
|
90
|
+
## Do and don’t
|
|
91
|
+
|
|
92
|
+
| Do | Don’t |
|
|
93
|
+
|---|---|
|
|
94
|
+
| Use 16, 20, 24 or 32 px. | Scale icons to other sizes. |
|
|
95
|
+
| Keep the icon in the text colour. | Colour icons to decorate. |
|
|
96
|
+
| Add a label to most icons. | Use an unfamiliar icon on its own. |
|
|
97
|
+
| Use the same icon for the same meaning. | Use a different icon in each product. |
|
|
98
|
+
| Use outline icons with a selected background. | Fill an icon to show it is selected. |
|
|
99
|
+
| Write the status next to a status icon. | Let an icon or its colour carry the status alone. |
|
|
100
|
+
| Use one icon per button. | Combine two icons into one action. |
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Illustration"
|
|
3
|
+
description: "Diagrams, illustrations and images that explain Beehexa products."
|
|
4
|
+
order: 14
|
|
5
|
+
planned:
|
|
6
|
+
- "When to use a diagram, an illustration or a screenshot"
|
|
7
|
+
- "The diagram style from the brand guide: structured, built on the hexagon grid"
|
|
8
|
+
- "Empty states and onboarding images"
|
|
9
|
+
---
|