06

Компоненти

Договор на всеки компонент: navbar, hero, карти, sidebar, бутони, dropzone и още.

navbar

container<nav id="navbar"> position: sticky; top: 0; z-index: 50
backgroundrgba(10, 10, 15, 0.95)
backdropblur(4px)
border-bottom1px solid #1a1a2e
height48px (var(--nav-height))
scrolledadds box-shadow: var(--shadow-md)

brand.json path: /component/navbar

hero

containersection.hero-brand with optional bg-brand-gradient-animated
min-heightcalc(100svh - 5rem)
shield-flanktwo decorative shield SVGs at 6% opacity, hidden below 768px

brand.json path: /component/hero

section-badge

recipeuppercase pill, cyan text on rgba(0,184,212,0.12), 1px border rgba(0,184,212,0.25), padding 4-8 vertical 10-14 horizontal, radius 4-20

brand.json path: /component/section-badge

breadcrumb

paddingvar(--space-md) 0
size14px
color#6E6E73
separator8px margin both sides, 0.5 opacity, user-select none

brand.json path: /component/breadcrumb

card-feature

backgroundrgba(255, 255, 255, 0.03)
backdropblur(16px)
border1px solid rgba(255, 255, 255, 0.08)
radius16px
padding40px
hovertranslateY(-4px), surface-hover bg, cyan-tint border, shadow card-hover
icon-tile48x48 with 12px radius and --icon-bg-* tint

brand.json path: /component/card-feature

card-pricing

grid.pr-plans-grid max-width 1120px, 3 columns at >=768px
card-basergba(255,255,255,0.04) bg, blur(40px) saturate(180%), 1px solid rgba(255,255,255,0.08), radius 28px, padding 40px 32px 36px
pro-elevatedscale(1.04), cyan-tinted bg, cyan border, outer cyan glow
hovertranslateY(-4px); Pro keeps scale and adds lift

brand.json path: /component/card-pricing

pricing-toggle

wrapperpill, padding 4px, bg rgba(255,255,255,0.05), 1px solid rgba(255,255,255,0.10)
activesolid teal #14b8a6, white text, shadow 0 4px 12px rgba(20,184,166,0.35)
inactivetransparent, text tertiary, hover white
save-chip#fbbf24 (or #fde68a on active background)

brand.json path: /component/pricing-toggle

faq

question-buttonaria-expanded, font-display 17px 600, hover cyan
glyph+ collapsed, - expanded; transitions on duration-fast
answermax-height transition with padding-bottom

brand.json path: /component/faq

dashboard-sidebar

width260px (--sidebar-width)
backgroundlinear-gradient(180deg, #121220 0%, #0f0f18 40%, #0c0c15 100%)
group-label11px 600 uppercase 0.05em tracking, color text-faint
nav-item-height40px
nav-item-radius8px
active-statergba(0,184,212,0.08) background AND a 3px LEFT BORDER in cyan #00B8D4. Hard BetterGuard rule: never bottom, never right.
hoverrgba(255,255,255,0.04)
Твърдо правило. Активният елемент на sidebar-а използва 3px ЛЯВА ГРАНИЦА в тюркоазено #00B8D4. Никога долу, никога вдясно. Това е твърдо правило на BetterGuard от BRAND_GUIDELINES.md C.10.
Obfuscate
History
Settings

brand.json path: /component/dashboard-sidebar

plan-badge

padding4px 10px
font10px 700 uppercase 0.5px tracking
backgroundlinear-gradient(135deg, rgba(124,77,255,0.3) 0%, rgba(0,184,212,0.2) 100%)
border1px solid rgba(124,77,255,0.5)
radius20px
color#c77dff with text-shadow 0 0 8px rgba(199,125,255,0.5)

brand.json path: /component/plan-badge

dropzone

default-border2px dashed #2a2a3e
background#0f0f1a
hoverborder #00B8D4, background rgba(0,184,212,0.05)
dragoverborder #00B8D4, background rgba(0,184,212,0.1)

brand.json path: /component/dropzone

btn-primary

padding12px 24px
backgroundlinear-gradient(135deg, #00B8D4, #9D7EFF)
color#FFFFFF
fontSora 17px 600
radius8px
transitiontransform, box-shadow on 200ms ease-out
hovertranslateY(-2px), glow-brand
focus-visible2px solid #00B8D4 outline, 2px offset, 8px radius

brand.json path: /component/btn-primary

btn-secondary

backgroundtransparent
color#00E5FF
border2px solid #00E5FF
radius8px
hoverrgba(255,255,255,0.1) background, white text

brand.json path: /component/btn-secondary

color#00B8D4
glyphU+203A right single angle bracket
transitioncolor, gap on hover (gap 4px to 8px)

brand.json path: /component/cta-link

ruletransient pre-launch strip; red border, dark bg, small white text. Remove on public launch. Red accent is only allowed here.

brand.json path: /component/footer-construction-banner

language-dropdown

triggermin-width 44px, min-height 44px touch target
panellists 43+ locales, alpine click-outside close, arrow-key nav

brand.json path: /component/language-dropdown

form-input

Text-like inputs (type="text|email|url|password|tel" and type="search") on a dark surface. Chrome / Edge / Brave force #e8f0fe on :-webkit-autofill; a plain background-color cannot beat it. The brand defeat is a 1000px inset shadow at the parent surface color plus -webkit-text-fill-color for the foreground.

surfacergba(17, 19, 26, 0.99) (matches .bg-picker-panel) OR rgba(15, 17, 23, 0.99) (matches .bg-lang-panel). Use the actual parent panel color, never #e8f0fe.
foreground#E6EAF2 via -webkit-text-fill-color (plain `color` is ignored on autofill)
caret#00B8D4 (brand cyan)
border1px solid rgba(255, 255, 255, 0.10); focus uses rgba(0, 184, 212, 0.5)
focus-ringoutline 2px solid #00B8D4, outline-offset 1px (matches .bg-picker-search__input:focus-visible)
min-height36px desktop; 44px touch target on coarse pointers
font-size14px desktop, 16px on <=480px (16px prevents iOS Safari auto-zoom on focus)
placeholder#6c7a8d (muted slate). Existing reference: .bg-picker-search__input::placeholder.
autofill-defeatbox-shadow: 0 0 0 1000px <surface> inset !important; -webkit-text-fill-color: <foreground> !important; caret-color: #00B8D4 !important; transition: background-color 5000s ease-in-out 0s.
autofill-statesapply to :-webkit-autofill AND :-webkit-autofill:hover, :focus, :active (all four). Anything less leaves a flash on interaction.
edge-ie-mute::-ms-reveal, ::-ms-clear { display: none } to hide the legacy Edge/IE password-reveal eye and clear-X.
reference-selectors.bg-picker-search__input (assets/css/picker.css), .bg-lang-search__input (assets/css/site.css). Copy that block when adding a new input class.

Focus the field, save the value to Chrome, then reload. The autofill defeat keeps the surface near-black, the text brand-foreground, and the caret cyan.

brand.json path: /component/form-input

select-dropdown

Custom listbox dropdown for dark-themed UI. Native <select> option lists are drawn by the OS and ignore CSS on Chrome / Windows: the popup paints with a white OS-themed background. Replacement: a button trigger plus a sibling listbox panel, driven by assets/js/select.js (vanilla ES module, no Alpine, no dependency).

trigger<button type="button"> min-height 44px, rgba(255,255,255,0.05) bg, 1px solid rgba(255,255,255,0.10), 10px radius, 7px 12px padding, Sora 14px, chevron rotates 180deg when open.
trigger-ariaaria-haspopup="listbox"; aria-expanded toggled by select.js.
panel<div data-select-panel> positioned absolute top calc(100% + 4px), z-index 70, bg rgba(17,19,26,0.99), 1px solid rgba(255,255,255,0.10), 10px radius, overflow hidden. Wraps the search input + the listbox.
panel-open.demo-select.is-open > .demo-select__trigger flips border-color to #00B8D4 (mirrors the Laravel admin language-switcher pattern).
searchOptional <input type=search data-select-search> at the top of the panel. Filters <li> rows live by label text and machine value (case-insensitive substring). Hides empty rows via the hidden attribute; .demo-select__empty shows when every row is filtered out.
listbox<ul data-select-list role=listbox> max-height 240px; overflow-y auto; 3px scrollbar.
optionrole="option"; min-height 36px; 7px 10px padding; Sora 13px; 3px transparent left border by default.
option-activearia-selected="true"; rgba(0,184,212,0.08) bg; cyan #00B8D4 text; 3px LEFT BORDER cyan. Matches the brand sidebar active-state rule (never bottom, never right).
option-hoverrgba(255,255,255,0.04) background.
option-focusoutline 2px solid #00B8D4, outline-offset -2px so the ring sits inside the row.
keyboardTrigger: Enter / Space / ArrowDown / ArrowUp open the panel. Search input takes focus on open if present, ArrowDown from search jumps to the first visible row. Panel rows: ArrowUp/Down navigate visible rows (wrap), Home / End jump, Enter commits, Escape closes and returns focus to the trigger.
dismissClick outside, Escape, or selecting an option closes the panel.
form-postSibling <input type="hidden" name="..." data-select-input> holds the canonical machine value (e.g. github) for traditional form posts. The visible label is the translated text; the posted value is the machine key.
i18nTranslate every visible option label through the consumer app's i18n layer. The data-value attribute on each <li> is the machine key and must never be translated.
markup-hooksdata-select (wrapper), data-select-trigger, data-select-label, data-select-panel (the dropdown surface), data-select-search (optional filter input), data-select-list (the <ul role=listbox>), data-select-option (per row), data-select-input (sibling hidden input). The controller auto-initialises every [data-select] on DOMContentLoaded.
reduced-motionChevron rotation and option hover transitions are disabled under prefers-reduced-motion: reduce.

brand.json path: /component/select-dropdown