@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.
Files changed (290) hide show
  1. package/README.md +56 -2
  2. package/dist/AGENTS.md +24 -0
  3. package/dist/catalog.json +1814 -0
  4. package/dist/docs/public/_redirects +7 -0
  5. package/dist/docs/public/apple-touch-icon.png +0 -0
  6. package/dist/docs/public/brand/logos/app/apple-touch-icon.png +0 -0
  7. package/dist/docs/public/brand/logos/app/avatar-800.png +0 -0
  8. package/dist/docs/public/brand/logos/app/icon-192.png +0 -0
  9. package/dist/docs/public/brand/logos/app/icon-512.png +0 -0
  10. package/dist/docs/public/brand/logos/app/icon-maskable-512.png +0 -0
  11. package/dist/docs/public/brand/logos/archive/d-550/beehexa-horizontal-1-light.svg +1 -0
  12. package/dist/docs/public/brand/logos/archive/d-550/beehexa-horizontal-2-dark.svg +1 -0
  13. package/dist/docs/public/brand/logos/archive/d-550/beehexa-horizontal-3-white.svg +1 -0
  14. package/dist/docs/public/brand/logos/archive/d-550/beehexa-horizontal-4-graphite.svg +1 -0
  15. package/dist/docs/public/brand/logos/archive/d-550/hexasync-horizontal-1-light.svg +1 -0
  16. package/dist/docs/public/brand/logos/archive/d-550/hexasync-horizontal-2-dark.svg +1 -0
  17. package/dist/docs/public/brand/logos/archive/d-550/hexasync-horizontal-3-white.svg +1 -0
  18. package/dist/docs/public/brand/logos/archive/d-550/hexasync-horizontal-4-graphite.svg +1 -0
  19. package/dist/docs/public/brand/logos/archive/d-550/ui/beehexa-d-550-dark.svg +1 -0
  20. package/dist/docs/public/brand/logos/archive/d-550/ui/beehexa-d-550-light.svg +1 -0
  21. package/dist/docs/public/brand/logos/archive/d-550/ui/beehexa-design-d-550-dark.svg +1 -0
  22. package/dist/docs/public/brand/logos/archive/d-550/ui/beehexa-design-d-550-light.svg +1 -0
  23. package/dist/docs/public/brand/logos/archive/d-550/ui/hexasync-d-550-dark.svg +1 -0
  24. package/dist/docs/public/brand/logos/archive/d-550/ui/hexasync-d-550-light.svg +1 -0
  25. package/dist/docs/public/brand/logos/archive/d-550/ui/png/beehexa-design-d-550-dark@3x.png +0 -0
  26. package/dist/docs/public/brand/logos/archive/d-550/ui/png/beehexa-design-d-550-light@3x.png +0 -0
  27. package/dist/docs/public/brand/logos/beehexa-logo.zip +0 -0
  28. package/dist/docs/public/brand/logos/fig/anatomy-en.png +0 -0
  29. package/dist/docs/public/brand/logos/fig/anatomy-vi.png +0 -0
  30. package/dist/docs/public/brand/logos/fig/beehexa-dark-12.png +0 -0
  31. package/dist/docs/public/brand/logos/fig/beehexa-dark-14.png +0 -0
  32. package/dist/docs/public/brand/logos/fig/beehexa-dark-28.png +0 -0
  33. package/dist/docs/public/brand/logos/fig/beehexa-dark-32.png +0 -0
  34. package/dist/docs/public/brand/logos/fig/beehexa-dark-56.png +0 -0
  35. package/dist/docs/public/brand/logos/fig/beehexa-graphite-28.png +0 -0
  36. package/dist/docs/public/brand/logos/fig/beehexa-graphite-32.png +0 -0
  37. package/dist/docs/public/brand/logos/fig/beehexa-light-14.png +0 -0
  38. package/dist/docs/public/brand/logos/fig/beehexa-light-21.png +0 -0
  39. package/dist/docs/public/brand/logos/fig/beehexa-light-22.png +0 -0
  40. package/dist/docs/public/brand/logos/fig/beehexa-light-24.png +0 -0
  41. package/dist/docs/public/brand/logos/fig/beehexa-light-28.png +0 -0
  42. package/dist/docs/public/brand/logos/fig/beehexa-light-32.png +0 -0
  43. package/dist/docs/public/brand/logos/fig/beehexa-light-36-7c3aed7c3aed.png +0 -0
  44. package/dist/docs/public/brand/logos/fig/beehexa-light-36-swap.png +0 -0
  45. package/dist/docs/public/brand/logos/fig/beehexa-light-36.png +0 -0
  46. package/dist/docs/public/brand/logos/fig/beehexa-light-56.png +0 -0
  47. package/dist/docs/public/brand/logos/fig/beehexa-white-20.png +0 -0
  48. package/dist/docs/public/brand/logos/fig/beehexa-white-32.png +0 -0
  49. package/dist/docs/public/brand/logos/fig/clearspace.png +0 -0
  50. package/dist/docs/public/brand/logos/fig/construction-en.png +0 -0
  51. package/dist/docs/public/brand/logos/fig/construction-vi.png +0 -0
  52. package/dist/docs/public/brand/logos/fig/container-en.png +0 -0
  53. package/dist/docs/public/brand/logos/fig/container-vi.png +0 -0
  54. package/dist/docs/public/brand/logos/fig/hexasync-dark-20.png +0 -0
  55. package/dist/docs/public/brand/logos/fig/hexasync-dark-28.png +0 -0
  56. package/dist/docs/public/brand/logos/fig/hexasync-dark-48.png +0 -0
  57. package/dist/docs/public/brand/logos/fig/hexasync-light-19.png +0 -0
  58. package/dist/docs/public/brand/logos/fig/hexasync-light-28.png +0 -0
  59. package/dist/docs/public/brand/logos/fig/hexasync-light-48.png +0 -0
  60. package/dist/docs/public/brand/logos/fig/icon-graphite-14.png +0 -0
  61. package/dist/docs/public/brand/logos/fig/icon-graphite-16.png +0 -0
  62. package/dist/docs/public/brand/logos/fig/icon-light-16.png +0 -0
  63. package/dist/docs/public/brand/logos/fig/icon-light-24.png +0 -0
  64. package/dist/docs/public/brand/logos/fig/icon-light-48.png +0 -0
  65. package/dist/docs/public/brand/logos/fig/icon-light-92.png +0 -0
  66. package/dist/docs/public/brand/logos/fig/meaning-bee-en.png +0 -0
  67. package/dist/docs/public/brand/logos/fig/meaning-bee-vi.png +0 -0
  68. package/dist/docs/public/brand/logos/fig/meaning-outline-en.png +0 -0
  69. package/dist/docs/public/brand/logos/fig/meaning-outline-vi.png +0 -0
  70. package/dist/docs/public/brand/logos/fig/meaning-stack-en.png +0 -0
  71. package/dist/docs/public/brand/logos/fig/meaning-stack-vi.png +0 -0
  72. package/dist/docs/public/brand/logos/fig/misuse-serif.png +0 -0
  73. package/dist/docs/public/brand/logos/icon/beehexa-icon-graphite.svg +1 -0
  74. package/dist/docs/public/brand/logos/icon/beehexa-icon-white.svg +1 -0
  75. package/dist/docs/public/brand/logos/icon/beehexa-icon-yellow.svg +1 -0
  76. package/dist/docs/public/brand/logos/lockups/beehexa-horizontal-1-light.svg +1 -0
  77. package/dist/docs/public/brand/logos/lockups/beehexa-horizontal-2-dark.svg +1 -0
  78. package/dist/docs/public/brand/logos/lockups/beehexa-horizontal-3-white.svg +1 -0
  79. package/dist/docs/public/brand/logos/lockups/beehexa-horizontal-4-graphite.svg +1 -0
  80. package/dist/docs/public/brand/logos/lockups/hexasync-horizontal-1-light.svg +1 -0
  81. package/dist/docs/public/brand/logos/lockups/hexasync-horizontal-2-dark.svg +1 -0
  82. package/dist/docs/public/brand/logos/lockups/hexasync-horizontal-3-white.svg +1 -0
  83. package/dist/docs/public/brand/logos/lockups/hexasync-horizontal-4-graphite.svg +1 -0
  84. package/dist/docs/public/brand/logos/ui/beehexa-dark.svg +1 -0
  85. package/dist/docs/public/brand/logos/ui/beehexa-design-dark.svg +1 -0
  86. package/dist/docs/public/brand/logos/ui/beehexa-design-light.svg +1 -0
  87. package/dist/docs/public/brand/logos/ui/beehexa-icon-yellow.svg +1 -0
  88. package/dist/docs/public/brand/logos/ui/beehexa-light.svg +1 -0
  89. package/dist/docs/public/brand/logos/ui/hexasync-dark.svg +1 -0
  90. package/dist/docs/public/brand/logos/ui/hexasync-light.svg +1 -0
  91. package/dist/docs/public/brand/logos/ui/png/beehexa-design-dark@3x.png +0 -0
  92. package/dist/docs/public/brand/logos/ui/png/beehexa-design-light@3x.png +0 -0
  93. package/dist/docs/public/favicon.ico +0 -0
  94. package/dist/docs/public/favicon.svg +1 -0
  95. package/dist/docs/public/fonts/LICENSE-Inter.txt +93 -0
  96. package/dist/docs/public/fonts/LICENSE-JetBrainsMono.txt +93 -0
  97. package/dist/docs/public/fonts/inter-latin-ext-opsz-wght-italic.woff2 +0 -0
  98. package/dist/docs/public/fonts/inter-latin-ext-opsz-wght-normal.woff2 +0 -0
  99. package/dist/docs/public/fonts/inter-latin-opsz-wght-italic.woff2 +0 -0
  100. package/dist/docs/public/fonts/inter-latin-opsz-wght-normal.woff2 +0 -0
  101. package/dist/docs/public/fonts/inter-vietnamese-opsz-wght-italic.woff2 +0 -0
  102. package/dist/docs/public/fonts/inter-vietnamese-opsz-wght-normal.woff2 +0 -0
  103. package/dist/docs/public/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 +0 -0
  104. package/dist/docs/public/fonts/jetbrains-mono-latin-wght-normal.woff2 +0 -0
  105. package/dist/docs/public/fonts/jetbrains-mono-vietnamese-wght-normal.woff2 +0 -0
  106. package/dist/docs/public/icon-192.png +0 -0
  107. package/dist/docs/public/icon-512.png +0 -0
  108. package/dist/docs/public/icon-maskable-512.png +0 -0
  109. package/dist/docs/public/robots.txt +4 -0
  110. package/dist/docs/public/site.webmanifest +21 -0
  111. package/dist/docs/scripts/color-pairs.mjs +46 -0
  112. package/dist/docs/scripts/contrast-exceptions.mjs +6 -0
  113. package/dist/docs/scripts/token-utils.d.mts +26 -0
  114. package/dist/docs/scripts/token-utils.mjs +114 -0
  115. package/dist/docs/src/brand/Beehexa-brandguide-full-mar12.pdf +0 -0
  116. package/dist/docs/src/brand/color+typoDirections.pdf +0 -0
  117. package/dist/docs/src/brand/structure-proposal.md +227 -0
  118. package/dist/docs/src/components/ChildPages.astro +25 -0
  119. package/dist/docs/src/components/CodeExample.astro +18 -0
  120. package/dist/docs/src/components/ColorDemo.astro +794 -0
  121. package/dist/docs/src/components/ColorExample.astro +32 -0
  122. package/dist/docs/src/components/ColorSwatch.astro +20 -0
  123. package/dist/docs/src/components/ComponentTabs.astro +21 -0
  124. package/dist/docs/src/components/DocsFooter.astro +25 -0
  125. package/dist/docs/src/components/HelpOptions.astro +20 -0
  126. package/dist/docs/src/components/IconBrowser.astro +257 -0
  127. package/dist/docs/src/components/IconDemo.astro +185 -0
  128. package/dist/docs/src/components/InDevelopment.astro +29 -0
  129. package/dist/docs/src/components/LayoutDemo.astro +384 -0
  130. package/dist/docs/src/components/Logo.astro +25 -0
  131. package/dist/docs/src/components/PhaseTable.astro +22 -0
  132. package/dist/docs/src/components/RoleGuides.astro +48 -0
  133. package/dist/docs/src/components/ShapeDemo.astro +239 -0
  134. package/dist/docs/src/components/ShapePin.astro +22 -0
  135. package/dist/docs/src/components/Sidebar.astro +206 -0
  136. package/dist/docs/src/components/SiteHeader.astro +211 -0
  137. package/dist/docs/src/components/SpacingDemo.astro +172 -0
  138. package/dist/docs/src/components/StatusBadge.astro +22 -0
  139. package/dist/docs/src/components/SystemAreas.astro +29 -0
  140. package/dist/docs/src/components/TableOfContents.astro +47 -0
  141. package/dist/docs/src/components/TokenTable.astro +40 -0
  142. package/dist/docs/src/components/TypeDemo.astro +249 -0
  143. package/dist/docs/src/components/logos/Fig.astro +28 -0
  144. package/dist/docs/src/components/logos/LogoAnatomy.astro +101 -0
  145. package/dist/docs/src/components/logos/LogoClearSpace.astro +81 -0
  146. package/dist/docs/src/components/logos/LogoColourVersions.astro +45 -0
  147. package/dist/docs/src/components/logos/LogoConstruction.astro +84 -0
  148. package/dist/docs/src/components/logos/LogoContainer.astro +84 -0
  149. package/dist/docs/src/components/logos/LogoHero.astro +42 -0
  150. package/dist/docs/src/components/logos/LogoInUse.astro +197 -0
  151. package/dist/docs/src/components/logos/LogoMeanings.astro +75 -0
  152. package/dist/docs/src/components/logos/LogoMinSize.astro +55 -0
  153. package/dist/docs/src/components/logos/LogoMistakes.astro +109 -0
  154. package/dist/docs/src/components/logos/LogoMisuse.astro +96 -0
  155. package/dist/docs/src/components/logos/LogoPair.astro +26 -0
  156. package/dist/docs/src/components/logos/LogoSvg.astro +68 -0
  157. package/dist/docs/src/content/components/button/accessibility.mdx +18 -0
  158. package/dist/docs/src/content/components/button/changelog.mdx +6 -0
  159. package/dist/docs/src/content/components/button/code.mdx +27 -0
  160. package/dist/docs/src/content/components/button/examples.mdx +21 -0
  161. package/dist/docs/src/content/components/button/meta.json +5 -0
  162. package/dist/docs/src/content/components/button/usage.mdx +18 -0
  163. package/dist/docs/src/content/foundations/guidelines/accessibility.mdx +19 -0
  164. package/dist/docs/src/content/foundations/guidelines/content.mdx +25 -0
  165. package/dist/docs/src/content/foundations/index.mdx +9 -0
  166. package/dist/docs/src/content/foundations/styles/border.mdx +89 -0
  167. package/dist/docs/src/content/foundations/styles/color/accessibility.mdx +32 -0
  168. package/dist/docs/src/content/foundations/styles/color/dark-mode.mdx +22 -0
  169. package/dist/docs/src/content/foundations/styles/color/index.mdx +65 -0
  170. package/dist/docs/src/content/foundations/styles/color/palette.mdx +57 -0
  171. package/dist/docs/src/content/foundations/styles/color/tokens.mdx +55 -0
  172. package/dist/docs/src/content/foundations/styles/color/usage.mdx +111 -0
  173. package/dist/docs/src/content/foundations/styles/data-visualization.mdx +11 -0
  174. package/dist/docs/src/content/foundations/styles/elevation.mdx +12 -0
  175. package/dist/docs/src/content/foundations/styles/icons/accessibility.mdx +72 -0
  176. package/dist/docs/src/content/foundations/styles/icons/code.mdx +171 -0
  177. package/dist/docs/src/content/foundations/styles/icons/index.mdx +62 -0
  178. package/dist/docs/src/content/foundations/styles/icons/library.mdx +19 -0
  179. package/dist/docs/src/content/foundations/styles/icons/usage.mdx +100 -0
  180. package/dist/docs/src/content/foundations/styles/illustration.mdx +9 -0
  181. package/dist/docs/src/content/foundations/styles/interaction-states.mdx +49 -0
  182. package/dist/docs/src/content/foundations/styles/layout/app-frame.mdx +81 -0
  183. package/dist/docs/src/content/foundations/styles/layout/breakpoints.mdx +56 -0
  184. package/dist/docs/src/content/foundations/styles/layout/grid.mdx +87 -0
  185. package/dist/docs/src/content/foundations/styles/layout/index.mdx +24 -0
  186. package/dist/docs/src/content/foundations/styles/layout/overlays.mdx +45 -0
  187. package/dist/docs/src/content/foundations/styles/layout/page-widths.mdx +38 -0
  188. package/dist/docs/src/content/foundations/styles/logos/downloads-and-terms.mdx +65 -0
  189. package/dist/docs/src/content/foundations/styles/logos/index.mdx +64 -0
  190. package/dist/docs/src/content/foundations/styles/logos/placement-and-containers.mdx +96 -0
  191. package/dist/docs/src/content/foundations/styles/logos/product-logos.mdx +56 -0
  192. package/dist/docs/src/content/foundations/styles/logos/using-the-logo.mdx +70 -0
  193. package/dist/docs/src/content/foundations/styles/motion.mdx +11 -0
  194. package/dist/docs/src/content/foundations/styles/opacity.mdx +9 -0
  195. package/dist/docs/src/content/foundations/styles/radius.mdx +98 -0
  196. package/dist/docs/src/content/foundations/styles/size-and-density.mdx +41 -0
  197. package/dist/docs/src/content/foundations/styles/spacing.mdx +70 -0
  198. package/dist/docs/src/content/foundations/styles/typography/code.mdx +53 -0
  199. package/dist/docs/src/content/foundations/styles/typography/index.mdx +58 -0
  200. package/dist/docs/src/content/foundations/styles/typography/usage.mdx +144 -0
  201. package/dist/docs/src/content/foundations/styles/typography/vietnamese.mdx +46 -0
  202. package/dist/docs/src/content/foundations/styles/z-index.mdx +9 -0
  203. package/dist/docs/src/content/foundations/tokens/all-tokens.mdx +36 -0
  204. package/dist/docs/src/content/foundations/tokens/index.mdx +27 -0
  205. package/dist/docs/src/content/get-started/content.mdx +14 -0
  206. package/dist/docs/src/content/get-started/design.mdx +30 -0
  207. package/dist/docs/src/content/get-started/develop.mdx +59 -0
  208. package/dist/docs/src/content/get-started/get-help.mdx +19 -0
  209. package/dist/docs/src/content/get-started/index.mdx +50 -0
  210. package/dist/docs/src/content/news/2026-10-16-site-structure.md +15 -0
  211. package/dist/docs/src/content/news/2026-10-20-docs-site.md +13 -0
  212. package/dist/docs/src/content/release-phases/index.mdx +12 -0
  213. package/dist/docs/src/content/tools/ai-agents.mdx +49 -0
  214. package/dist/docs/src/content/tools/ant-design-vue-theme.mdx +138 -0
  215. package/dist/docs/src/content/tools/eslint.mdx +15 -0
  216. package/dist/docs/src/content/tools/index.mdx +7 -0
  217. package/dist/docs/src/content/tools/stylelint.mdx +19 -0
  218. package/dist/docs/src/content-vi/foundations/styles/border.mdx +89 -0
  219. package/dist/docs/src/content-vi/foundations/styles/color/accessibility.mdx +32 -0
  220. package/dist/docs/src/content-vi/foundations/styles/color/dark-mode.mdx +22 -0
  221. package/dist/docs/src/content-vi/foundations/styles/color/index.mdx +65 -0
  222. package/dist/docs/src/content-vi/foundations/styles/color/palette.mdx +57 -0
  223. package/dist/docs/src/content-vi/foundations/styles/color/tokens.mdx +55 -0
  224. package/dist/docs/src/content-vi/foundations/styles/color/usage.mdx +111 -0
  225. package/dist/docs/src/content-vi/foundations/styles/data-visualization.mdx +11 -0
  226. package/dist/docs/src/content-vi/foundations/styles/icons/accessibility.mdx +72 -0
  227. package/dist/docs/src/content-vi/foundations/styles/icons/code.mdx +170 -0
  228. package/dist/docs/src/content-vi/foundations/styles/icons/index.mdx +62 -0
  229. package/dist/docs/src/content-vi/foundations/styles/icons/library.mdx +19 -0
  230. package/dist/docs/src/content-vi/foundations/styles/icons/usage.mdx +100 -0
  231. package/dist/docs/src/content-vi/foundations/styles/illustration.mdx +9 -0
  232. package/dist/docs/src/content-vi/foundations/styles/interaction-states.mdx +49 -0
  233. package/dist/docs/src/content-vi/foundations/styles/layout/app-frame.mdx +77 -0
  234. package/dist/docs/src/content-vi/foundations/styles/layout/breakpoints.mdx +56 -0
  235. package/dist/docs/src/content-vi/foundations/styles/layout/grid.mdx +87 -0
  236. package/dist/docs/src/content-vi/foundations/styles/layout/index.mdx +24 -0
  237. package/dist/docs/src/content-vi/foundations/styles/layout/page-widths.mdx +34 -0
  238. package/dist/docs/src/content-vi/foundations/styles/logos/downloads-and-terms.mdx +65 -0
  239. package/dist/docs/src/content-vi/foundations/styles/logos/index.mdx +64 -0
  240. package/dist/docs/src/content-vi/foundations/styles/logos/placement-and-containers.mdx +96 -0
  241. package/dist/docs/src/content-vi/foundations/styles/logos/product-logos.mdx +56 -0
  242. package/dist/docs/src/content-vi/foundations/styles/logos/using-the-logo.mdx +70 -0
  243. package/dist/docs/src/content-vi/foundations/styles/opacity.mdx +9 -0
  244. package/dist/docs/src/content-vi/foundations/styles/radius.mdx +98 -0
  245. package/dist/docs/src/content-vi/foundations/styles/size-and-density.mdx +41 -0
  246. package/dist/docs/src/content-vi/foundations/styles/spacing.mdx +70 -0
  247. package/dist/docs/src/content-vi/foundations/styles/typography/code.mdx +53 -0
  248. package/dist/docs/src/content-vi/foundations/styles/typography/index.mdx +58 -0
  249. package/dist/docs/src/content-vi/foundations/styles/typography/usage.mdx +144 -0
  250. package/dist/docs/src/content-vi/foundations/styles/typography/vietnamese.mdx +46 -0
  251. package/dist/docs/src/content-vi/foundations/styles/z-index.mdx +9 -0
  252. package/dist/docs/src/content.config.ts +68 -0
  253. package/dist/docs/src/lib/brand.ts +57 -0
  254. package/dist/docs/src/lib/contrast.ts +34 -0
  255. package/dist/docs/src/lib/i18n.ts +152 -0
  256. package/dist/docs/src/lib/icons.ts +46 -0
  257. package/dist/docs/src/lib/logo-geometry.ts +30 -0
  258. package/dist/docs/src/lib/lucide-categories.json +1 -0
  259. package/dist/docs/src/lib/lucide-data.ts +40 -0
  260. package/dist/docs/src/lib/navigation.ts +222 -0
  261. package/dist/docs/src/lib/release-phases.ts +10 -0
  262. package/dist/docs/src/lib/routes.ts +40 -0
  263. package/dist/docs/src/lib/token-descriptions-vi.ts +40 -0
  264. package/dist/docs/src/lib/tokens.ts +67 -0
  265. package/dist/docs/src/lib/tri-grid.ts +28 -0
  266. package/dist/docs/src/styles/chrome.css +122 -0
  267. package/dist/docs/src/styles/color.css +270 -0
  268. package/dist/docs/src/styles/docs.css +323 -0
  269. package/dist/docs/src/styles/global.css +66 -0
  270. package/dist/docs/src/styles/icons.css +135 -0
  271. package/dist/docs/src/styles/layout.css +165 -0
  272. package/dist/docs/src/styles/logos.css +236 -0
  273. package/dist/docs/src/styles/shapes.css +139 -0
  274. package/dist/docs/src/styles/tokens.css +461 -0
  275. package/dist/docs/src/styles/tokens.js +425 -0
  276. package/dist/docs/src/styles/typography.css +91 -0
  277. package/dist/docs/tokens/border.json +26 -0
  278. package/dist/docs/tokens/breakpoints.json +8 -0
  279. package/dist/docs/tokens/color.json +1350 -0
  280. package/dist/docs/tokens/elevation.json +26 -0
  281. package/dist/docs/tokens/layout.json +29 -0
  282. package/dist/docs/tokens/motion.json +12 -0
  283. package/dist/docs/tokens/radius.json +44 -0
  284. package/dist/docs/tokens/size.json +13 -0
  285. package/dist/docs/tokens/spacing.json +18 -0
  286. package/dist/docs/tokens/states.json +12 -0
  287. package/dist/docs/tokens/typography.json +220 -0
  288. package/dist/index.d.ts +19 -0
  289. package/dist/index.js +1823 -0
  290. package/package.json +31 -4
@@ -0,0 +1,84 @@
1
+ ---
2
+ // The 3-side rule for the icon inside a tile, and the files made with it.
3
+ // Icon units: the icon is 300 tall, one hexagon side is 150. Tile = 3 sides.
4
+ import { COLORS, ICON_PATH } from '../../lib/logo-geometry';
5
+ import { langOf } from '../../lib/i18n';
6
+ import Fig from './Fig.astro';
7
+ import '../../styles/logos.css';
8
+
9
+ const lang = langOf(Astro.url.pathname);
10
+ const L = {
11
+ en: {
12
+ alt: 'The 3-side rule: the tile is three hexagon sides wide, the icon two sides tall and centred, half a side from the top and bottom edges. The icon stays inside the 80 percent safe circle.',
13
+ sides: '3 sides',
14
+ caption: 'Units are hexagon sides. The dashed circle is the 80% safe zone of maskable icons; the icon, 67% of the tile, stays inside it.',
15
+ files: [
16
+ ['apple-touch-icon', '180 px, icon 120 px'],
17
+ ['Web app icon', '192 and 512 px'],
18
+ ['Maskable icon', '512 px, cropped by the device'],
19
+ ['Social avatar', '800 px, cropped to a circle'],
20
+ ],
21
+ },
22
+ vi: {
23
+ alt: 'Luật ô 3 cạnh: ô rộng ba cạnh lục giác, icon cao hai cạnh và nằm giữa, cách mép trên và dưới nửa cạnh. Icon nằm gọn trong vòng an toàn 80%.',
24
+ sides: '3 cạnh',
25
+ caption: 'Đơn vị là cạnh lục giác. Vòng tròn nét đứt là vùng an toàn 80% của icon maskable; icon chiếm 67% ô nên nằm gọn trong đó.',
26
+ files: [
27
+ ['apple-touch-icon', '180 px, icon 120 px'],
28
+ ['Icon web app', '192 và 512 px'],
29
+ ['Icon maskable', '512 px, thiết bị tự cắt'],
30
+ ['Avatar mạng xã hội', '800 px, cắt tròn'],
31
+ ],
32
+ },
33
+ }[lang];
34
+
35
+ const SIDE = 150;
36
+ const T = 3 * SIDE; // tile 450
37
+ const iconX = (T - 259.8) / 2;
38
+ const iconY = SIDE / 2;
39
+ const px = 240; // tile size on screen
40
+ const s = px / T;
41
+ const fs = 12 / s;
42
+ const sw = 1.25 / s;
43
+ const m = 46 / s;
44
+ const w = Math.round((T + 2 * m) * s);
45
+ const h = Math.round((T + 2 * m) * s);
46
+ const r80 = 0.4 * T;
47
+
48
+ const srcs = ['apple-touch-icon.png', 'icon-192.png', 'icon-maskable-512.png', 'avatar-800.png'];
49
+ const shapes = ['rounded', 'square', 'circle', 'circle'];
50
+ ---
51
+
52
+ <figure class="logo-figure">
53
+ <div class="logo-stage bg-white container-stage">
54
+ <Fig id={`container-${lang}`} class="diagram px-center" viewBox={`${-m} ${-m} ${w / s} ${h / s}`} w={w} h={h} label={L.alt}>
55
+ <rect x="0" y="0" width={T} height={T} rx={T * 0.08} fill={COLORS.graphite} />
56
+ <circle class="d-guide" cx={T / 2} cy={T / 2} r={r80} stroke-width={sw} stroke-dasharray={`${4 / s} ${4 / s}`} style="stroke:#ffffff;opacity:.5" />
57
+ <g transform={`translate(${iconX} ${iconY})`}><path fill={COLORS.yellow} fill-rule="evenodd" d={ICON_PATH} /></g>
58
+ <g class="d-guide" stroke-width={sw} stroke-dasharray={`${4 / s} ${4 / s}`} style="stroke:#ffffff;opacity:.5">
59
+ <line x1="0" x2={T} y1={iconY} y2={iconY} />
60
+ <line x1="0" x2={T} y1={T - iconY} y2={T - iconY} />
61
+ </g>
62
+ <g class="d-measure" stroke-width={sw}>
63
+ {[[0, iconY], [iconY, T - iconY], [T - iconY, T]].map(([a, b]) => (
64
+ <path d={`M${-14 / s} ${a}H${-6 / s}M${-10 / s} ${a}V${b}M${-14 / s} ${b}H${-6 / s}`} />
65
+ ))}
66
+ <path d={`M0 ${T + 6 / s}V${T + 14 / s}M0 ${T + 10 / s}H${T}M${T} ${T + 6 / s}V${T + 14 / s}`} />
67
+ </g>
68
+ <text class="d-label" font-size={fs} text-anchor="end" x={-18 / s} y={iconY / 2 + fs * 0.35}>½</text>
69
+ <text class="d-label" font-size={fs} text-anchor="end" x={-18 / s} y={T / 2 + fs * 0.35}>2</text>
70
+ <text class="d-label" font-size={fs} text-anchor="end" x={-18 / s} y={T - iconY / 2 + fs * 0.35}>½</text>
71
+ <text class="d-label" font-size={fs} text-anchor="middle" x={T / 2} y={T + 30 / s}>{L.sides}</text>
72
+ </Fig>
73
+ </div>
74
+ <figcaption>{L.caption}</figcaption>
75
+ </figure>
76
+
77
+ <div class="app-icons">
78
+ {L.files.map(([name, size], i) => (
79
+ <figure>
80
+ <img class:list={['app-icon', `shape-${shapes[i]}`]} src={`/brand/logos/app/${srcs[i]}`} width="96" height="96" alt="" />
81
+ <figcaption><b>{name}</b>{size}</figcaption>
82
+ </figure>
83
+ ))}
84
+ </div>
@@ -0,0 +1,42 @@
1
+ ---
2
+ // The main lockup on a light and a dark panel, centred on whole pixels, with the download.
3
+ import { statSync } from 'node:fs';
4
+ import LogoSvg from './LogoSvg.astro';
5
+ import { langOf } from '../../lib/i18n';
6
+ import '../../styles/logos.css';
7
+
8
+ const lang = langOf(Astro.url.pathname);
9
+ const zip = '/brand/logos/beehexa-logo.zip';
10
+ const size = `${Math.round(statSync(`public${zip}`).size / 1024)} KB`;
11
+ const L = {
12
+ en: {
13
+ light: 'beehexa logo, colour version for light backgrounds',
14
+ dark: 'beehexa logo, colour version for dark backgrounds',
15
+ text: 'Lockups in 4 colour versions, HexaSync lockup, icon, favicons, app icons, avatar and the Inter licence. SVG, PNG and ICO',
16
+ button: 'Download all (.zip)',
17
+ },
18
+ vi: {
19
+ light: 'Logo beehexa, bản màu cho nền sáng',
20
+ dark: 'Logo beehexa, bản màu cho nền tối',
21
+ text: 'Lockup 4 bản màu, lockup HexaSync, icon, favicon, icon ứng dụng, avatar và giấy phép Inter. SVG, PNG và ICO',
22
+ button: 'Tải tất cả (.zip)',
23
+ },
24
+ }[lang];
25
+ ---
26
+
27
+ <figure class="logo-hero">
28
+ <div class="logo-hero-panels">
29
+ <div class="logo-stage hero-stage bg-white">
30
+ <LogoSvg version="light" iconPx={56} class="px-center hero-lg" label={L.light} />
31
+ <LogoSvg version="light" iconPx={28} class="px-center hero-sm" label={L.light} />
32
+ </div>
33
+ <div class="logo-stage hero-stage bg-graphite">
34
+ <LogoSvg version="dark" iconPx={56} class="px-center hero-lg" label={L.dark} />
35
+ <LogoSvg version="dark" iconPx={28} class="px-center hero-sm" label={L.dark} />
36
+ </div>
37
+ </div>
38
+ <figcaption class="logo-hero-bar">
39
+ <span>{L.text} · {size}</span>
40
+ <a class="button-dark" href={zip} download>{L.button}</a>
41
+ </figcaption>
42
+ </figure>
@@ -0,0 +1,197 @@
1
+ ---
2
+ // The logo in context: mock-ups drawn with the real logo; grey bars stand in for content.
3
+ import LogoSvg from './LogoSvg.astro';
4
+ import { langOf } from '../../lib/i18n';
5
+ import '../../styles/logos.css';
6
+
7
+ type Key = 'header' | 'app' | 'tab' | 'avatar' | 'document' | 'partner' | 'slide' | 'email' | 'card' | 'photo' | 'yellow' | 'login' | 'marketplace';
8
+ interface Props {
9
+ only?: Key[];
10
+ }
11
+ const { only } = Astro.props;
12
+ const show = (k: Key) => !only || only.includes(k);
13
+ const single = only?.length === 1;
14
+ const lang = langOf(Astro.url.pathname);
15
+ const L = {
16
+ en: {
17
+ header: ['Website header', 'Lockup at the left of the bar, linking to the home page. Icon 24 px in a 56–64 px bar.'],
18
+ app: ['Product app bar', 'Inside HexaSync, the product lockup replaces the company logo. Dark version on a graphite bar.'],
19
+ tab: ['Browser tab', 'The favicon: the icon alone, in yellow, filling its 16 px square. No wordmark at this size.'],
20
+ avatar: ['Social avatar', 'Yellow icon on a graphite tile, made with the 3-side rule so a circle crop never cuts it.'],
21
+ document: ['Document', 'Top left of the first page, clear space kept. At least 25 mm wide in print.'],
22
+ partner: ['Next to a partner', 'Both logos the same visual weight, separated by a thin vertical line, each with its own clear space.'],
23
+ partnerLogo: 'Partner logo',
24
+ slide: ['Cover slide', 'Lockup at the top left, in the version for the slide colour. Inner slides repeat it small, in the same corner.'],
25
+ email: ['Email signature', 'Lockup under the name, as a PNG at 2× and at least 100 px wide: many email clients don’t show SVG.'],
26
+ card: ['Business card', 'One side graphite with the lockup centred, version 2. The other side white: the icon, then name and details on a clean left edge.'],
27
+ photo: ['On a photo', 'Version 3, white, on a calm area of the picture, with its clear space. No box behind it.'],
28
+ yellow: ['On brand yellow', 'Version 4, graphite. Banners, event backdrops, packaging.'],
29
+ login: ['Sign-in screen', 'The product lockup centred above the form, colour version on a light page.'],
30
+ marketplace: ['Marketplace listing', 'The app icon tile (3-side rule) with the product name as text next to it. Don’t squeeze the lockup into a square.'],
31
+ appName: 'HexaSync', by: 'by Beehexa', cardName: 'Your Name', cardRole: 'Job title',
32
+ },
33
+ vi: {
34
+ header: ['Header website', 'Lockup ở bên trái thanh header, link về trang chủ. Icon 24 px trong thanh cao 56–64 px.'],
35
+ app: ['Thanh ứng dụng sản phẩm', 'Trong HexaSync, lockup sản phẩm thay cho logo công ty. Bản nền tối trên thanh xám ghi.'],
36
+ tab: ['Tab trình duyệt', 'Favicon: icon đứng riêng, màu vàng, phủ kín ô 16 px. Ở cỡ này không có wordmark.'],
37
+ avatar: ['Avatar mạng xã hội', 'Icon vàng trên ô xám ghi, dựng theo luật ô 3 cạnh nên cắt tròn không bị lẹm.'],
38
+ document: ['Tài liệu', 'Góc trên bên trái trang đầu, giữ đủ vùng trống. In rộng tối thiểu 25 mm.'],
39
+ partner: ['Cạnh logo đối tác', 'Hai logo cùng trọng lượng thị giác, ngăn bằng một vạch dọc mảnh, mỗi logo giữ vùng trống riêng.'],
40
+ partnerLogo: 'Logo đối tác',
41
+ slide: ['Slide bìa', 'Lockup ở góc trên bên trái, dùng bản màu hợp với nền slide. Các slide bên trong lặp lại lockup cỡ nhỏ ở cùng góc.'],
42
+ email: ['Chữ ký email', 'Lockup dưới tên, dạng PNG 2×, rộng tối thiểu 100 px: nhiều ứng dụng email không hiển thị SVG.'],
43
+ card: ['Danh thiếp', 'Một mặt xám ghi, lockup ở giữa, bản 2. Mặt kia nền trắng: icon, rồi tên và thông tin căn thẳng mép trái.'],
44
+ photo: ['Trên ảnh', 'Bản 3, màu trắng, đặt ở vùng ảnh ít chi tiết, giữ vùng trống. Không đặt ô nền sau logo.'],
45
+ yellow: ['Trên nền vàng thương hiệu', 'Bản 4, xám ghi. Banner, phông sự kiện, bao bì.'],
46
+ login: ['Màn hình đăng nhập', 'Lockup sản phẩm ở giữa, phía trên form, bản màu trên trang sáng.'],
47
+ marketplace: ['Trang marketplace', 'Ô icon ứng dụng (luật ô 3 cạnh) và tên sản phẩm viết bằng chữ bên cạnh. Không ép lockup vào ô vuông.'],
48
+ appName: 'HexaSync', by: 'bởi Beehexa', cardName: 'Họ và tên', cardRole: 'Chức danh',
49
+ },
50
+ }[lang];
51
+ ---
52
+
53
+ <div class:list={['logo-cards inuse', { single }]} style={`--cols:${only?.length === 3 ? 3 : 2}`}>
54
+ {show('header') && (
55
+ <div class="logo-card">
56
+ <div class="mock mock-site">
57
+ <div class="mock-bar">
58
+ <LogoSvg iconPx={24} />
59
+ <span class="mock-links"><i /><i /><b /></span>
60
+ </div>
61
+ <div class="mock-hero"><i style="width:62%" /><i style="width:44%" /><b /></div>
62
+ </div>
63
+ <div class="logo-card-body"><p class="card-title">{L.header[0]}</p><p>{L.header[1]}</p></div>
64
+ </div>
65
+ )}
66
+ {show('app') && (
67
+ <div class="logo-card">
68
+ <div class="mock mock-app">
69
+ <div class="mock-bar mock-bar-dark">
70
+ <LogoSvg kind="hexasync" version="dark" iconPx={20} />
71
+ <span class="mock-links"><b class="dot" /></span>
72
+ </div>
73
+ <div class="mock-body"><span class="mock-nav"><i /><i /><i /><i /></span><span class="mock-cards"><i /><i /><i /><i /></span></div>
74
+ </div>
75
+ <div class="logo-card-body"><p class="card-title">{L.app[0]}</p><p>{L.app[1]}</p></div>
76
+ </div>
77
+ )}
78
+ {show('tab') && (
79
+ <div class="logo-card">
80
+ <div class="mock mock-browser">
81
+ <div class="mock-tabs">
82
+ <span class="mock-tab is-active"><LogoSvg kind="icon" iconPx={16} /><span>beehexa design</span></span>
83
+ <span class="mock-tab"><i /><span class="ghost" /></span>
84
+ </div>
85
+ <div class="mock-url"><i /></div>
86
+ </div>
87
+ <div class="logo-card-body"><p class="card-title">{L.tab[0]}</p><p>{L.tab[1]}</p></div>
88
+ </div>
89
+ )}
90
+ {show('avatar') && (
91
+ <div class="logo-card">
92
+ <div class="mock mock-social">
93
+ <img class="mock-avatar" src="/brand/logos/app/avatar-800.png" width="72" height="72" alt="" />
94
+ <span class="mock-lines"><b /><i /><i style="width:56%" /></span>
95
+ </div>
96
+ <div class="logo-card-body"><p class="card-title">{L.avatar[0]}</p><p>{L.avatar[1]}</p></div>
97
+ </div>
98
+ )}
99
+ {show('document') && (
100
+ <div class="logo-card">
101
+ <div class="mock mock-doc">
102
+ <div class="mock-page">
103
+ <LogoSvg iconPx={14} />
104
+ <span class="mock-lines"><b /><i /><i /><i style="width:70%" /><i /><i style="width:48%" /></span>
105
+ </div>
106
+ </div>
107
+ <div class="logo-card-body"><p class="card-title">{L.document[0]}</p><p>{L.document[1]}</p></div>
108
+ </div>
109
+ )}
110
+ {show('partner') && (
111
+ <div class="logo-card">
112
+ <div class="mock mock-partner">
113
+ <LogoSvg iconPx={24} />
114
+ <span class="mock-divider" aria-hidden="true" />
115
+ <span class="mock-partner-logo">{L.partnerLogo}</span>
116
+ </div>
117
+ <div class="logo-card-body"><p class="card-title">{L.partner[0]}</p><p>{L.partner[1]}</p></div>
118
+ </div>
119
+ )}
120
+ {show('slide') && (
121
+ <div class="logo-card">
122
+ <div class="mock mock-desk">
123
+ <div class="mock-slide">
124
+ <LogoSvg version="dark" iconPx={12} />
125
+ <span class="mock-lines"><b /><i /><i style="width:60%" /></span>
126
+ </div>
127
+ </div>
128
+ <div class="logo-card-body"><p class="card-title">{L.slide[0]}</p><p>{L.slide[1]}</p></div>
129
+ </div>
130
+ )}
131
+ {show('email') && (
132
+ <div class="logo-card">
133
+ <div class="mock mock-email">
134
+ <span class="mock-lines"><i style="width:30%" /><b style="width:40%" /><i style="width:28%" /></span>
135
+ <span class="mock-rule" />
136
+ <LogoSvg iconPx={22} />
137
+ <span class="mock-lines"><i style="width:46%" /><i style="width:38%" /></span>
138
+ </div>
139
+ <div class="logo-card-body"><p class="card-title">{L.email[0]}</p><p>{L.email[1]}</p></div>
140
+ </div>
141
+ )}
142
+ {show('card') && (
143
+ <div class="logo-card">
144
+ <div class="mock mock-desk mock-cards-pair">
145
+ <div class="mock-bizcard is-back">
146
+ <LogoSvg kind="icon" version="graphite" iconPx={14} />
147
+ <span class="bizcard-text"><strong>{L.cardName}</strong><span>{L.cardRole}</span></span>
148
+ <span class="bizcard-text bizcard-contact"><span>name@beehexa.com</span><span>beehexa.com</span></span>
149
+ </div>
150
+ <div class="mock-bizcard is-front"><LogoSvg version="dark" iconPx={14} /></div>
151
+ </div>
152
+ <div class="logo-card-body"><p class="card-title">{L.card[0]}</p><p>{L.card[1]}</p></div>
153
+ </div>
154
+ )}
155
+ {show('photo') && (
156
+ <div class="logo-card">
157
+ <div class="mock mock-photo">
158
+ <span class="mock-photo-hill" />
159
+ <div class="mock-photo-logo"><LogoSvg version="white" iconPx={20} /></div>
160
+ </div>
161
+ <div class="logo-card-body"><p class="card-title">{L.photo[0]}</p><p>{L.photo[1]}</p></div>
162
+ </div>
163
+ )}
164
+ {show('yellow') && (
165
+ <div class="logo-card">
166
+ <div class="mock mock-yellow">
167
+ <LogoSvg version="graphite" iconPx={28} />
168
+ <span class="mock-lines"><b /><b style="width:36%" /></span>
169
+ </div>
170
+ <div class="logo-card-body"><p class="card-title">{L.yellow[0]}</p><p>{L.yellow[1]}</p></div>
171
+ </div>
172
+ )}
173
+ {show('login') && (
174
+ <div class="logo-card">
175
+ <div class="mock mock-login">
176
+ <div class="mock-login-panel">
177
+ <LogoSvg kind="hexasync" iconPx={19} />
178
+ <span class="mock-input" /><span class="mock-input" /><span class="mock-button" />
179
+ </div>
180
+ </div>
181
+ <div class="logo-card-body"><p class="card-title">{L.login[0]}</p><p>{L.login[1]}</p></div>
182
+ </div>
183
+ )}
184
+ {show('marketplace') && (
185
+ <div class="logo-card">
186
+ <div class="mock mock-market">
187
+ <div class="mock-listing is-ours">
188
+ <img src="/brand/logos/app/icon-192.png" width="40" height="40" alt="" />
189
+ <span><strong>{L.appName}</strong><small>{L.by}</small></span>
190
+ </div>
191
+ <div class="mock-listing"><i class="mock-tile" /><span class="mock-lines"><b /><i style="width:60%" /></span></div>
192
+ <div class="mock-listing"><i class="mock-tile" /><span class="mock-lines"><b /><i style="width:50%" /></span></div>
193
+ </div>
194
+ <div class="logo-card-body"><p class="card-title">{L.marketplace[0]}</p><p>{L.marketplace[1]}</p></div>
195
+ </div>
196
+ )}
197
+ </div>
@@ -0,0 +1,75 @@
1
+ ---
2
+ // The three readings of the icon, outside in, each drawn on the icon itself.
3
+ // Icon units (259.8 × 300).
4
+ import { COLORS, ICON_PATH } from '../../lib/logo-geometry';
5
+ import Fig from './Fig.astro';
6
+ import { langOf } from '../../lib/i18n';
7
+ import '../../styles/logos.css';
8
+
9
+ const OUTLINE = 'M129.9 0L259.8 75L259.8 225L129.9 300L0 225L0 75Z';
10
+ const HOLES = 'M27.8 176.8L129.9 235.7L232 176.8L232 208.9L129.9 267.9L27.8 208.9ZM27.8 112.5L129.9 171.4L232 112.5L232 144.6L129.9 203.6L27.8 144.6ZM129.9 32.1L222.7 85.7L129.9 139.3L37.1 85.7Z';
11
+
12
+ const s = 0.42; // px per icon unit: icon 126 px tall
13
+ const fs = 12 / s;
14
+ const sw = 1.25 / s;
15
+ const vb = { x: -12, y: -14, w: 520, h: 328 };
16
+ const w = Math.round(vb.w * s);
17
+ const h = Math.round(vb.h * s);
18
+ const labelX = 300;
19
+
20
+ type Pin = { x: number; y: number; label: string };
21
+ type Layer = { n: string; name: string; text: string; mode: 'outline' | 'stack' | 'bee'; pins: Pin[] };
22
+ const lang = langOf(Astro.url.pathname);
23
+ const all: Record<'en' | 'vi', Layer[]> = {
24
+ en: [
25
+ { n: '1', name: 'Honeycomb', mode: 'outline', text: 'The outline is a honeycomb cell, the shape bees use because it holds the most with the least material: one strong, efficient foundation.', pins: [{ x: 259.8, y: 150, label: 'The cell' }] },
26
+ { n: '2', name: 'System stack', mode: 'stack', text: 'Look again and the cell becomes two blocks, one stacked on the other. The lower block is Connect: the foundation, where every system is joined. The block above is Automate: built on that foundation, work that now runs by itself. On top sits Orchestrate: the vantage point where the whole business is run as one.', pins: [{ x: 129.9, y: 85.7, label: 'Orchestrate' }, { x: 129.9, y: 187.5, label: 'Automate' }, { x: 129.9, y: 251.8, label: 'Connect' }] },
27
+ { n: '3', name: 'Rising bee', mode: 'bee', text: 'The three white shapes draw a bee flying up: the top face is the head, the second band the wings, the last band the body.', pins: [{ x: 129.9, y: 85.7, label: 'Head' }, { x: 200, y: 147, label: 'Wings' }, { x: 129.9, y: 251.8, label: 'Body' }] },
28
+ ],
29
+ vi: [
30
+ { n: '1', name: 'Tổ ong', mode: 'outline', text: 'Viền ngoài là một ô tổ ong, hình loài ong dùng vì chứa được nhiều nhất với ít vật liệu nhất: một nền tảng bền, gọn.', pins: [{ x: 259.8, y: 150, label: 'Ô tổ ong' }] },
31
+ { n: '2', name: 'Khối hệ thống', mode: 'stack', text: 'Nhìn kỹ, ô tổ ong là hai khối xếp chồng lên nhau. Khối dưới là Connect: nền móng, nơi mọi hệ thống được nối lại. Khối trên là Automate: dựng trên nền móng ấy, công việc giờ tự vận hành. Trên cùng là Orchestrate: điểm nhìn bao quát, nơi cả doanh nghiệp được điều hành như một.', pins: [{ x: 129.9, y: 85.7, label: 'Orchestrate' }, { x: 129.9, y: 187.5, label: 'Automate' }, { x: 129.9, y: 251.8, label: 'Connect' }] },
32
+ { n: '3', name: 'Con ong bay lên', mode: 'bee', text: 'Ba khoảng trắng vẽ nên một con ong đang bay lên: mặt trên là đầu, dải thứ hai là cánh, dải cuối là thân.', pins: [{ x: 129.9, y: 85.7, label: 'Đầu' }, { x: 200, y: 147, label: 'Cánh' }, { x: 129.9, y: 251.8, label: 'Thân' }] },
33
+ ],
34
+ };
35
+ const layers = all[lang];
36
+ const pinY = (i: number, n: number) => (n === 1 ? 150 : 70 + i * 80);
37
+ ---
38
+
39
+ <ol class="logo-meanings">
40
+ {layers.map((layer) => (
41
+ <li>
42
+ <div class="logo-stage bg-white meaning-stage">
43
+ <Fig id={`meaning-${layer.mode}-${lang}`} class="diagram px-center" viewBox={`${vb.x} ${vb.y} ${w / s} ${h / s}`} w={w} h={h}>
44
+ {layer.mode === 'bee' ? (
45
+ <>
46
+ <path fill={COLORS.yellow} fill-rule="evenodd" d={ICON_PATH} opacity=".3" />
47
+ <path fill={COLORS.graphite} d={HOLES} />
48
+ </>
49
+ ) : layer.mode === 'outline' ? (
50
+ <>
51
+ <path fill={COLORS.yellow} fill-rule="evenodd" d={ICON_PATH} opacity=".3" />
52
+ <path d={OUTLINE} fill="none" stroke={COLORS.graphite} stroke-width={3 / s} stroke-linejoin="round" />
53
+ </>
54
+ ) : (
55
+ <path fill={COLORS.yellow} fill-rule="evenodd" d={ICON_PATH} />
56
+ )}
57
+ {layer.pins.map((pin, i) => {
58
+ const y = layer.pins.length === 1 ? pinY(i, 1) : pin.y;
59
+ return (
60
+ <g>
61
+ <path class="d-measure" d={`M${pin.x} ${pin.y}L${labelX - 30} ${y}H${labelX - 8}`} stroke-width={sw} />
62
+ <circle cx={pin.x} cy={pin.y} r={3.5 / s} fill={COLORS.graphite} stroke="#fff" stroke-width={1.5 / s} />
63
+ <text class="d-label" x={labelX} y={y + fs * 0.35} font-size={fs}>{pin.label}</text>
64
+ </g>
65
+ );
66
+ })}
67
+ </Fig>
68
+ </div>
69
+ <div class="meaning-text">
70
+ <p class="meaning-title"><span class="meaning-n" aria-hidden="true">{layer.n}</span>{layer.name}</p>
71
+ <p>{layer.text}</p>
72
+ </div>
73
+ </li>
74
+ ))}
75
+ </ol>
@@ -0,0 +1,55 @@
1
+ ---
2
+ // Minimum sizes, shown at actual size on screen.
3
+ import LogoSvg from './LogoSvg.astro';
4
+ import { langOf } from '../../lib/i18n';
5
+ import '../../styles/logos.css';
6
+
7
+ const lang = langOf(Astro.url.pathname);
8
+ const L = {
9
+ en: {
10
+ lockAlt: 'beehexa lockup at its minimum width, 100 pixels',
11
+ lockTitle: 'Lockup: 100 px wide, 25 mm in print',
12
+ lockText: 'About 21 px tall on screen. The wordmark stroke is still 2.1–2.3 px at this size. Below it, use the icon alone.',
13
+ iconAlt: 'beehexa icon at its minimum height, 16 pixels',
14
+ iconCap: '16 px tall',
15
+ iconTitle: 'Icon: 16 px tall, 6 mm in print',
16
+ iconText: 'At 16 px each stroke and each gap is 1.5 px, so the three layers stay apart. Favicons start here.',
17
+ },
18
+ vi: {
19
+ lockAlt: 'Lockup beehexa ở bề rộng tối thiểu, 100 pixel',
20
+ lockTitle: 'Lockup: rộng 100 px, in 25 mm',
21
+ lockText: 'Cao khoảng 21 px trên màn hình. Nét chữ vẫn dày 2.1–2.3 px ở cỡ này. Nhỏ hơn nữa thì dùng icon riêng.',
22
+ iconAlt: 'Icon beehexa ở chiều cao tối thiểu, 16 pixel',
23
+ iconCap: 'cao 16 px',
24
+ iconTitle: 'Icon: cao 16 px, in 6 mm',
25
+ iconText: 'Ở 16 px, mỗi nét và mỗi khe dày 1.5 px, nên ba lớp vẫn tách nhau. Favicon bắt đầu từ cỡ này.',
26
+ },
27
+ }[lang];
28
+ ---
29
+
30
+ <div class="logo-cards" style="--cols:2">
31
+ <div class="logo-card">
32
+ <div class="logo-stage bg-white minsize-stage">
33
+ <div class="minsize-item px-center" style="--w:100px;--h:46px">
34
+ <span class="minsize-rule" aria-hidden="true">100 px</span>
35
+ <LogoSvg version="light" iconPx={21} label={L.lockAlt} />
36
+ </div>
37
+ </div>
38
+ <div class="logo-card-body">
39
+ <p class="card-title">{L.lockTitle}</p>
40
+ <p>{L.lockText}</p>
41
+ </div>
42
+ </div>
43
+ <div class="logo-card">
44
+ <div class="logo-stage bg-white minsize-stage">
45
+ <div class="minsize-item px-center" style="--w:54px;--h:38px">
46
+ <LogoSvg kind="icon" version="graphite" iconPx={16} label={L.iconAlt} />
47
+ <span class="minsize-caption" aria-hidden="true">{L.iconCap}</span>
48
+ </div>
49
+ </div>
50
+ <div class="logo-card-body">
51
+ <p class="card-title">{L.iconTitle}</p>
52
+ <p>{L.iconText}</p>
53
+ </div>
54
+ </div>
55
+ </div>
@@ -0,0 +1,109 @@
1
+ ---
2
+ // Common mistakes, each shown as it looks on screen, with the fix underneath.
3
+ import LogoSvg from './LogoSvg.astro';
4
+ import { ICON_PATH } from '../../lib/logo-geometry';
5
+ import { langOf, localize } from '../../lib/i18n';
6
+ import '../../styles/logos.css';
7
+
8
+ const lang = langOf(Astro.url.pathname);
9
+ const sharp = localize('/foundations/styles/logos/using-the-logo/', lang) + (lang === 'vi' ? '#hiển-thị-sắc-nét' : '#sharp-on-screen');
10
+ const tile = lang === 'vi' ? '#icon-trong-ô-luật-ô-3-cạnh' : '#the-icon-in-a-tile-the-3-side-rule';
11
+ const C = lang === 'vi'
12
+ ? {
13
+ jagged: ['Cạnh răng cưa trên màn hình 100%', `Chiều cao và vị trí bằng số nguyên pixel, dùng ảnh vẽ ở 3× hiển thị ở 1×. Xem <a href="${sharp}">hiển thị sắc nét</a>.`],
14
+ jaggedL: ['Cạnh cứng', 'Đã làm mịn'],
15
+ offset: ['Lệch tâm trong khung', 'Căn giữa rồi làm tròn khoảng lệch xuống một pixel nguyên, để logo vừa đúng tâm vừa sắc.'],
16
+ box: ['Ô trắng sau icon', 'Dùng file nền trong suốt trong gói tải về. Favicon không có nền.'],
17
+ dark: ['Sai bản màu trên nền tối', 'Đổi sang bản 2 hoặc 3. Không đảo màu, không đặt ô trắng sau logo.'],
18
+ alone: ['Icon vàng đứng riêng trên nền trắng', 'Dùng icon xám ghi, hoặc icon vàng trên ô xám ghi.'],
19
+ crop: ['Icon bị nền tảng cắt lẹm', `Dựng icon ứng dụng và avatar theo <a href="${tile}">luật ô 3 cạnh</a>.`],
20
+ fix: 'Cách sửa:',
21
+ }
22
+ : {
23
+ jagged: ['Stair steps on 100% screens', `Whole-pixel height and position, and a picture drawn at 3× shown at 1×. See <a href="${sharp}">sharp on screen</a>.`],
24
+ jaggedL: ['Hard edges', 'Smoothed'],
25
+ offset: ['Off-centre in its panel', 'Centre it, then round the offset down to a whole pixel, so the logo is both centred and sharp.'],
26
+ box: ['A white box behind the icon', 'Use the transparent files from the package. Favicons have no background.'],
27
+ dark: ['The wrong version on a dark background', 'Swap to version 2 or 3. Never invert the colours or put a white box behind the logo.'],
28
+ alone: ['The yellow icon alone on white', 'Use the graphite icon, or the yellow icon on a graphite tile.'],
29
+ crop: ['The icon cropped by the platform', `Build app icons and avatars with the <a href="${tile}">3-side rule</a>.`],
30
+ fix: 'Fix:',
31
+ };
32
+
33
+ // The icon rasterised at 24 px tall, half a pixel off the grid, drawn 4× larger: once with hard
34
+ // pixel edges, once smoothed by coverage, which is what a 3× picture shown at 1× gives.
35
+ const polys = ICON_PATH.split('Z').filter((p) => p.trim()).map((p) => p.replace('M', '').split('L').map((q) => q.trim().split(/\s+/).map(Number)));
36
+ const inside = (x: number, y: number) => {
37
+ let c = false;
38
+ for (const poly of polys) for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {
39
+ const [xi, yi] = poly[i], [xj, yj] = poly[j];
40
+ if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) c = !c;
41
+ }
42
+ return c;
43
+ };
44
+ const PX = 24 / 300; // pixels per icon unit
45
+ const cols = 22, rows = 25, cell = 4, N = 6;
46
+ const raster = (aa: boolean) => {
47
+ const out: { x: number; y: number; a: number }[] = [];
48
+ for (let r = 0; r < rows; r++) for (let c = 0; c < cols; c++) {
49
+ let hit = 0;
50
+ for (let i = 0; i < N; i++) for (let j = 0; j < N; j++) {
51
+ const x = (c - 0.5 + (i + 0.5) / N) / PX, y = (r - 0.5 + (j + 0.5) / N) / PX;
52
+ if (inside(x, y)) hit++;
53
+ }
54
+ const cov = hit / (N * N);
55
+ const a = aa ? cov : cov >= 0.5 ? 1 : 0;
56
+ if (a > 0.02) out.push({ x: c * cell, y: r * cell, a: +a.toFixed(2) });
57
+ }
58
+ return out;
59
+ };
60
+ const pixels = [raster(false), raster(true)];
61
+ ---
62
+
63
+ <div class="logo-cards mistakes" style="--cols:3">
64
+ <div class="logo-card is-dont">
65
+ <div class="logo-stage bg-white mistake-stage mistake-pixels">
66
+ {pixels.map((px, k) => (
67
+ <figure>
68
+ <svg width={cols * cell} height={rows * cell} viewBox={`0 0 ${cols * cell} ${rows * cell}`} shape-rendering="crispEdges" aria-hidden="true">
69
+ {px.map((p) => <rect x={p.x} y={p.y} width={cell} height={cell} fill="#FCB017" fill-opacity={p.a} />)}
70
+ </svg>
71
+ <figcaption>{C.jaggedL[k]}</figcaption>
72
+ </figure>
73
+ ))}
74
+ </div>
75
+ <div class="logo-card-body"><p class="card-title">{C.jagged[0]}</p><p><b>{C.fix}</b> <span set:html={C.jagged[1]} /></p></div>
76
+ </div>
77
+ <div class="logo-card is-dont">
78
+ <div class="logo-stage bg-white mistake-stage mistake-offset">
79
+ <span class="mistake-axis is-v" /><span class="mistake-axis is-h" />
80
+ <div class="mistake-offset-logo"><LogoSvg iconPx={24} label="" /></div>
81
+ </div>
82
+ <div class="logo-card-body"><p class="card-title">{C.offset[0]}</p><p><b>{C.fix}</b> {C.offset[1]}</p></div>
83
+ </div>
84
+ <div class="logo-card is-dont">
85
+ <div class="logo-stage mistake-stage mistake-browser">
86
+ {/* a dark browser, drawn at twice its real size so the white box reads */}
87
+ <span class="mistake-tabs">
88
+ <span class="mistake-tab"><span class="mistake-favicon"><LogoSvg kind="icon" iconPx={24} label="" /></span><i /></span>
89
+ <span class="mistake-tab is-idle"><i /></span>
90
+ </span>
91
+ <span class="mistake-toolbar"><i /></span>
92
+ </div>
93
+ <div class="logo-card-body"><p class="card-title">{C.box[0]}</p><p><b>{C.fix}</b> {C.box[1]}</p></div>
94
+ </div>
95
+ <div class="logo-card is-dont">
96
+ <div class="logo-stage bg-graphite mistake-stage"><LogoSvg iconPx={28} class="px-center" label="" /></div>
97
+ <div class="logo-card-body"><p class="card-title">{C.dark[0]}</p><p><b>{C.fix}</b> {C.dark[1]}</p></div>
98
+ </div>
99
+ <div class="logo-card is-dont">
100
+ <div class="logo-stage bg-white mistake-stage"><LogoSvg kind="icon" iconPx={48} class="px-center" label="" /></div>
101
+ <div class="logo-card-body"><p class="card-title">{C.alone[0]}</p><p><b>{C.fix}</b> {C.alone[1]}</p></div>
102
+ </div>
103
+ <div class="logo-card is-dont">
104
+ <div class="logo-stage bg-white mistake-stage mistake-crop">
105
+ <span class="mistake-circle"><LogoSvg kind="icon" iconPx={92} label="" /></span>
106
+ </div>
107
+ <div class="logo-card-body"><p class="card-title">{C.crop[0]}</p><p><b>{C.fix}</b> <span set:html={C.crop[1]} /></p></div>
108
+ </div>
109
+ </div>