← Zpět na zprávu

acb.cz — hloubkový technický audit

Měřeno na lokální kopii webu v web-sources/site (513 HTML stránek, 81,5 MB značkování) a na metadatech z crawlu v web-sources/meta. Každé číslo níže bylo spočítáno, ne odhadnuto. Datum měření: 2026-09-14.


1. Inventura stacku

Server a doručování

VrstvaDůkaz
Ruby on Railsmeta/headers-home.txt:19 x-runtime: 0.560492, :18 x-request-id, cookie _session_id ve stylu Rails
Asset pipeline Sprocketsjediný balík s otiskem assets/auctea_application-e7c46753…js, sha256 v názvu souboru, žádné části manifestu
Devise + OmniAuthformuláře v index.html odesílají na /users/sign_in, /users/invitation, /users/auth/google_oauth2, /users/auth/twitter2, /users/auth/apple
simple_formclass="simple_form" na každém formuláři
Cloudflare (jen HTML)server: cloudflare, cf-ray: …-PRG, cf-cache-status: DYNAMIC; cdn-cgi/scripts/.../email-decode.min.js na 199 stránkách, 325 zamaskovaných adres
Amazon S3, bez CDNs3.eu-central-1.amazonaws.com je v kopii webu zmíněn 17 818krát; starý bucket acb-cz.s3-eu-west-1.amazonaws.com stále obsluhuje 4 iframy

Klientský balík (auctea_application-*.js, 585 625 B nekomprimovaně / 149 373 B gzip, 17 řádků)

KnihovnaVýskytůPoznámky
Stimulus20299 registrovaných controllerů, 43 použitých v kopii webu
Turbolinks 534 (Turbolinks.controller, Turbolinks.visit, turbolinks:before-cache)zastaralé, nejde o Hotwire Turbo
message_bus (Discourse)82 odkazů na MessageBus.*přenos v reálném čase — viz §2
PhotoSwipe216 pswplightbox
Dropzone17 / 122 dz-nahrávání souborů
Tempus Dominus21výběr data a času
Popper53tooltipy, rozbalovací nabídky
jQuery15vyžaduje jej message_bus ("Either jQuery or the ajax adapter must be loaded")
Chart21controller a-ui-chart, 15 připojení
ActionCable / WebSocket0viz §2

Načítáno za běhu z cdnjs, verze připnuté, bez Subresource Integrity (window.Folio.RemoteScripts.Data): Bootstrap 5.3.1 (bootstrap.bundle.jsneminifikovaná verze), js-cookie 3.0.5, cleave.js 1.0.2, intl-tel-input 23.5.0, html5sortable 0.14.0. Zavaděč nastavuje crossorigin a referrerpolicy, ale balík obsahuje 0 výskytů integrity.

Služby

GTM GTM-WXXKTKZT · Facebook Pixel 345862143285023 · retargeting Seznam Sklik (c.seznam.cz/js/rc.js, rtg id 21435) · Cloudflare Turnstile (site key 0x4AAAAAAAiLyofYdEpczt0F, 460 připojení) · controller pole reCAPTCHA (5 odkazů) · Folio CookieConsent · YouTube (52 vložení) · Issuu (4) · Matterport (13 odkazů).

Používané Stimulus controllery (43 různých, 10 116 připojení)

f-modal-toggle 1420 · f-tooltip 1026 · f-modal-close 755 · a-sales-card 480 · f-captcha-turnstile 460 · f-modal 453 · f-devise-modal-form 302 · a-ui-menu 302 · f-lightbox 185 · f-newsletter-subscriptions-form 151 · a-ui-up-arrow 151 · a-ui-settings-island 151 · a-ui-pagehide-reload 151 · a-ui-notifications 151 · a-ui-mode-switch 151 · a-ui-menu-toolbar-header-search 151 · a-ui-menu-toolbar-dropdown 151 · a-ui-header 151 · a-ui-footer 151 · a-sklik-retargeting 151 · a-sensitive-content-modal 151 · a-sales-packs-livestream-embed-overlay 151 · a-sales-packs-live-overlay 151 · a-sales-packs-live-notification-popup 151 · a-ui-clipboard 150 · a-sales-cards 91 · a-ui-bidding-now-label 79 · a-atom-images-gallery 43 · a-item-categories-card 34 · a-ui-chart 15 · a-features-submissions-loader 8 · f-leads-form 7 · a-ui-scroll-list 7 · a-ui-input-select 4 · a-artists-prices 3 · a-ui-mini-select 2 · a-ui-list 2 · a-ui-index 2 · a-ui-header-search 2 · a-sales-cards-layout-switch 2 · a-molecule-cards-full-width 2 · a-artists-alphabet-list 2 · a-site-theme-acb-ui-hero-carousel 1.

Registr obsahuje dalších 56 controllerů, které se ve veřejném HTML nikdy neobjeví — jde o backendovou část: a-operator-sales-show, a-operator-sales-show-keyboard-shortcuts, a-operator-sales-show-sound-notifier, a-auctioneer-sales-packs-show, a-presenter-sales-packs-show, a-checkout-*, a-bidder-registrations-show, a-user-verifications-show. Anonymní návštěvník si stahuje konzoli dražebníka.


2. Model vykreslování a doručování

Stránky jsou plně vykreslené na serveru pomocí Rails ERB. cache-control: max-age=0, private, must-revalidate znamená, že Cloudflare HTML nikdy neukládá do cache (cf-cache-status: DYNAMIC); každé zobrazení stránky je vykreslení na origin serveru trvající ~560 ms (x-runtime). Turbolinks 5 pak při vnitřní navigaci vymění <body> a znovu spustí 12,5 vložených bloků <script>, které každá stránka nese; <meta name="turbolinks-cache-control" content="no-cache"> na titulní stránce vypíná náhledovou cache, takže jediným viditelným přínosem je ušetřené opětovné parsování CSS/JS.

Cesta pro reálný čas není ActionCable. Balík neobsahuje jediný výskyt ActionCable, createConsumer, WebSocket ani /cable. <meta name="action-cable-url" content="/cable"> je pozůstatek. Živé přihazování běží na HTTP long-pollingu přes message_bus, nastaveném v balíku jako enableLongPolling:!0, enableChunkedEncoding:!0, callbackInterval:15e3, backgroundCallbackInterval:6e4, minPollInterval:100, maxPollInterval:18e4, firstChunkTimeout:3e3 — POST na baseUrl + "message-bus/" + clientId + "/poll" (jediná cesta, kterou robots.txt blokuje).

Sběrnice se spouští podmíněně: window.Auctify.ConditionalMessageBus ji zapne jen tehdy, když je přítomen [data-auctify-message-bus-required="true"]. Napříč kopií webu jde o 145 elementů proti 6 133 nastaveným na false. Cíle aktualizací jsou třídy sloužící jako háčky — a-js-message-bus-sale-update (5 458) a a-js-message-bus-live-sales-pack-update (1 018) — obnovované stažením JSON partialů z 11 endpointů window.Auctify.API_URLS a výměnou značkování.

Spodní hranice 100 ms udržuje živý dražební sál responzivní, ale jde o návrh postavený na HTTP pollingu, který nese zátěž typickou pro WebSocket: jeden otevřený požadavek na dražitele a aukci, plus opětovné stažení partialu při každém příhozu.


3. Analýza assetů a výkonu

AssetNekomprimovaněGzip
CSS (1 soubor)763 473 B96 716 B
JS (1 soubor)585 625 B149 373 B
Fonty (11 woff2)265 200 B
HTML titulní stránky221 535 B31 523 B

Žádné dělení kódu. 1 JS soubor, 1 CSS soubor, 0 __webpack, 0 source map. Návštěvník, který si čte článek na blogu, stahuje konzoli operátora, Dropzone, Tempus Dominus a PhotoSwipe.

Skutečnou zátěží je značkování. Napříč 513 stránkami: 81 459 682 bajtů HTML nesoucích 3 313 264 bajtů viditelného textu — poměr značkování k textu 24,6 : 1; obsah tvoří 4,1 % bajtů. Nejhorší jsou katalogové stránky, například cs/ceny-umeni/stanislav-vajce.html s 205 KB HTML na 3 875 znaků textu (54 : 1). Průměrná stránka: 155 KB.

Rozložení bajtů titulní stránky: atributy class= 59 063 B (27 %), atributy data-* 45 068 B (20 %), 73 vložených elementů <svg> 26 449 B (12 %), vložené skripty 18 775 B (8 %). Napříč webem: 58 355 připojení data-controller (114 na stránku), 35 530 vložených SVG, 37 771 atributů style=.

Požadavky. Zhruba 60 na titulní stránce, 64 na cs/ceny-umeni.html, 57 na výpisu aukce: 1 HTML + 1 CSS + 1 JS + 1 sprite s ikonami + 2 fonty + GTM + dekodér e-mailů od Cloudflare + 47–51 obrázků, každý obrázek z s3.eu-central-1.amazonaws.com.

Obrázky. 13 893 <img> v kopii webu, 12 354 uvnitř <picture> se <source> ve WebP a záložním JPEG. Ale:

Kritická cesta. CSS blokuje vykreslení a je přednačítáno přes hlavičku odpovědi link:; JS má defer. Fonty jsou v pořádku: woff2 na vlastním serveru, font-display: swap na všech 11 řezech, dva používané řezy přednačtené. Chybí ale preconnect i dns-prefetch na s3.eu-central-1.amazonaws.com, takže první obrázek po parsování HTML platí plné DNS + TLS handshake. Nasazeno je deset statických souborů Figtree tam, kde by stačil jeden variabilní font (DMSans už variabilní je: font-weight:100 1000).

Největší přínosy, seřazené podle výtěžnosti

  1. Zmenšit HTML. Obsahová hustota 4,1 % je největší jediná vada. Odstranění zátěže

controllerů v data-* u každého elementu a 35 530 vložených SVG (použít <use> proti jednomu sprite, který už je nasazený) by odstranilo zhruba polovinu bajtů na každé stránce.

  1. Doplnit popisovače w a sizes k 10 815 responzivním obrázkům. Objem přenesených dat na

mobilu okamžitě klesne několikanásobně.

  1. Předřadit S3 CDN a použít na ni preconnect. Každý obrázek na webu je dnes necachované

stažení z originu.

  1. Nastavit width/height u zbývajících 77,8 % obrázků a přestat odloženě načítat obrázek

pro LCP.

  1. Rozdělit balík. 56 z 99 controllerů patří do backendu; oddělte je za přihlašovací vstup.
  2. Pročistit CSS — viz §7: 91,5 % z něj se nikdy nepoužije.
  3. Cachovat HTML na edge. Anonymní katalogové stránky jsou statické; must-revalidate, private

vynucuje 76 000 vykreslení na originu.


4. Audit přístupnosti

Vzorkováno v plném rozsahu na všech 513 zrcadlených stránkách, s podrobným pročtením index.html, cs/aukce.html, cs/kontakty.html, cs/nabidka-dila.html, cs/blog.html, cs/zive-aukce.html, en/auctions.html, en/contacts.html.

Orientační body. <main> se objevuje na 143 z 513 stránek (28 %) — pouze v článcích blogu Folio. Titulní stránka, každá stránka aukce a každá stránka katalogu obalují obsah do <div class="a-layout-main">. role="main" není použit ani jednou. <header role="banner"> a <footer> jsou na každé stránce; <nav> je 569krát na 513 stránkách, ale hlavní nabídka v index.html je holý <ul> bez <nav> a bez aria-label.

Odkazy pro přeskočení obsahu: 0. Uživatel klávesnice musí na každé stránce projít sedmipoložkovou nabídkou s podnabídkami, vyhledávacím formulářem a nastavovacím ostrůvkem, než se dostane k obsahu.

Nadpisy. Titulní stránka nemá <h1> — osnova dokumentu začíná na <h4> (šest titulků slidů karuselu) a pak skáče na <h2>. Napříč kopií webu 159 z 513 stránek (31 %) přeskakuje úroveň nadpisu; pozorované skoky jsou h1→h3 (24), h1→h4 (12), h2→h4 (4) v prvním vzorku a každý článek blogu začíná h1→h3.

Alternativní text. 13 893 <img>, 100 % má atribut alt, 86,7 % neprázdný. Prázdné patří obsahovým obrázkům, ne dekoracím: cs/blog.html vykresluje náhledy článků jako <img alt="" class="a-ui-image__img"> — 19 obrázků, 6 se skutečným alternativním textem (32 %).

Formuláře. 4 212 <label>, 3 355 s for= (79,7 %). Ve sdílené kostře webu je 6 id vstupních polí proti 6 hodnotám label for=, ale jen 4 odpovídající dvojice. Každý formulář nese novalidate="novalidate" (9 874 výskytů) — nativní validace je vypnutá a nahrazená JavaScriptem, přesto je v celé kopii webu 0 aria-invalid, 0 aria-describedby, 0 aria-required. Uživatel odečítače obrazovky nedostane žádné programové provázání s chybou.

ARIA. Celý použitý slovník je aria-label (2 480) a aria-hidden (30). Nula výskytů: aria-live, aria-expanded, aria-current, aria-controls, aria-modal, aria-labelledby, aria-describedby, aria-atomic, aria-selected, aria-pressed. Důsledky:

Iframy. 653 celkem, 56 s atributem title (8,6 %). 51 vložení YouTube má název; rámy Matterport, Issuu a GTM ne.

Fokus. Nikde žádný kladný tabindex (dobře). :focus-visible se objevuje 4krát proti 115 pravidlům :focus; 37 deklarací outline:0 pochází z vlastního resetu Bootstrapu, který místo toho dává prstenec přes box-shadow, takže fokus je vidět, ale jeho kontrast závisí na motivu.

Jazyk. <html lang> je na 100 % stránek, cs na 273 a en na 66 ve snímku. Správně. Ale české řetězce se objevují uvnitř stránek s lang="en" (en/topicuv-salon.html obsahuje 144 českých diakritických znaků) bez vnořeného přepnutí lang.

Barevný kontrast (vypočtený, relativní jas podle WCAG 2.1):

DvojicePoměrAA běžný text (4,5)AA velký text / UI (3,0)
Značková zlatá #B18839 na bílé3,26 : 1✗ NEPROŠLO✓ prošlo
Bílá na značkové zlaté #B188393,26 : 1✗ NEPROŠLO✓ prošlo
Značková zlatá #B18839 na #1919195,40 : 1✓ prošlo✓ prošlo
Tmavá zlatá #8F6B24 na bílé4,89 : 1✓ prošlo✓ prošlo
#191919 na bílé17,58 : 1
Odkaz #4c84fd na bílé3,48 : 1✗ NEPROŠLO✓ prošlo
Stav chyba #f0655d na bílé3,12 : 1✗ NEPROŠLO
Stav úspěch #219d70 na bílé3,43 : 1✗ NEPROŠLO
Stav upozornění #ff9a52 na bílé2,10 : 1✗ NEPROŠLO✗ NEPROŠLO

Tato chyba je navržená, ne náhodná: motiv deklaruje --auctify-color-over-brand-200: #ffffff a váže ji na --bs-btn-color, takže každé primární tlačítko je bílé na zlaté v poměru 3,26 : 1. A zlatá se používá jako text s natvrdo zapsaným hexem: .text-link-100{color:#B18839}, .a-brand-links a{color:#B18839}, .a-blog-articles-show-header__author{color:#B18839}. Přístupná varianta #8F6B24 v sadě tokenů existuje a k tomuto účelu se nepoužívá.

Tmavý režim převrací neutrální barvy, ale zlatou nechává beze změny — --auctify-brand-200: #B18839 je deklarována shodně v :root, [data-bs-theme="light"] i [data-bs-theme="dark"].

Hodnocení: 3 / 10. Kostra webu je dosažitelná klávesnicí a alt je vždy přítomen. Všechno ostatní selhává: žádný odkaz pro přeskočení obsahu, žádný <main> na 72 % stránek, žádný <h1> na titulní stránce, 31 % rozbité pořadí nadpisů, značková barva nesplňující AA jako text i jako text tlačítka a živé přihazování bez živých oblastí.


5. SEO a strukturovaná data

Strukturovaná data: nula. application/ld+json se objevuje 0krát napříč 513 stránkami. Aukční dům se 72 578 záznamy uměleckých děl a 3 772 umělci nepublikuje žádné značkování Product, Offer, Event, Organization, BreadcrumbList ani VisualArtwork.

Meta robots: nula. robots.txt uvádí, že indexace katalogu „se řídí přes rel=canonical / meta robots (ne Disallow)“. <meta name="robots"> se objevuje 0krát. Deklarovaná politika není implementována — nic neomezuje 152 702 katalogových URL. rel="next" / rel="prev" na stránkovaných stránkách umělců rovněž chybí.

Canonical. Přesně jednou na každé stránce, odkazuje sám na sebe. V rámci svého rozsahu správně.

hreflang. Přítomen na 112 z 513 stránek — jen ve větvi /cs/ceny-umeni/ a v jejím rozcestníku. 30 českých a 30 anglických redakčních stránek, všech 143 článků blogu a všech 99 stránek aukcí jej nemají. hreflang="x-default" je použit 0krát.

Meta popisky. Chybí na 280 z 483 testovaných stránek (58 %), včetně 85 z 86 katalogových stránek a 79 z 99 stránek aukcí. Z 203 přítomných jich 77 přesahuje 160 znaků.

Tituly. 375 unikátních na 483 stránkách; 192 stránek nese duplicitní titul, přičemž 16 stránek aukcí sdílí „Aukce - Exkluzivní výběr klasického a moderního umění. | 1. Art Consulting“. 162 titulů přesahuje 60 znaků; nejdelší má 236.

Open Graph. Kompletní sada značek (title, description, url, site_name, image + rozměry, twitter:card summary). Ale og:image je na 158 stránkách stále stejný statický https://www.acb.cz/fb-share.png; skutečný katalogový obrázek používají jen detailní stránky aukcí.

Politika robots.txt. Blokuje OpenAI (GPTBot, OAI-SearchBot) a každého větší SEO robota — AhrefsBot, SemrushBot, MJ12bot, DotBot, DataForSeoBot, RankActive, SeokicksBot, BLEXBot, AspiegelBot, PetalBot. Blokovat SEO nástroje je obhajitelné rozhodnutí proti scrapingu, ale zároveň to oslepí vlastní agenturu majitele a blokace GPTBot/OAI-SearchBot odstraní web z výsledků AI vyhledávání. Pro User-agent: * je zakázán pouze /message-bus/.

Návrh URL. Čisté, malými písmeny, bez diakritiky, ve všech 153 245 URL v sitemapě žádné query stringy, hloubka omezená na 4. Dobré.

Katalog a riziko obsahově chudých stránek. Sitemapa uvádí 153 245 URL (148 007 unikátních — 5 238 duplicit). 152 702 z nich (99,6 %) je cenový katalog: 3 772 stránek umělců + 72 578 stránek děl, zdvojených mezi /cs/ceny-umeni/ a /en/art-prices/. České a anglické sady URL sdílejí 73 718 z 73 731 slugů (99,98 %) — anglická větev používá české slugy.

Tyto stránky jsou obsahově chudé už ze své podstaty. Zrcadlené stránky umělců mají 129–254 KB HTML na 3 000–15 500 znaků textu a tím textem je seznam názvů děl. Ceny jsou uzamčené — vlastní popis katalogu říká, že se zobrazí „po registraci zdarma“ — a stránka umělce se seznamem 30 a více děl vykreslí řetězec „Kč“ 3krát. Dosažené ceny, jediný důvod existence katalogu, v HTML, které dostane Google, chybí. 76 000 téměř shodných stránek bez popisu, bez strukturovaných dat a bez cen na jazyk je 99,6 % indexové stopy webu a přesně ten vzor, který systémy Google pro užitečný obsah znevýhodňují.

Anglický obsah. 12 z 30 anglických stránek má mimo sdílenou kostru méně než 600 znaků obsahu. en/current-exhibition.html28 znaků; en/exhibition-archive.html23 proti 44 775 na české obdobě; en/blog.html0 — a přitom sitemapa uvádí 143 anglických URL blogu. Prázdné stránky jsou odkazované z hlavní nabídky a jsou indexovatelné.

Hodnocení: 3 / 10.


6. Stav zabezpečení a ochrany soukromí

Přítomné (meta/headers-home.txt): x-frame-options: SAMEORIGIN, x-content-type-options: nosniff, referrer-policy: strict-origin-when-cross-origin, x-xss-protection: 0 (správná moderní hodnota), x-download-options, x-permitted-cross-domain-policies: none.

Chybějící: Content-Security-Policy, Strict-Transport-Security, Permissions-Policy, Cross-Origin-Opener-Policy, Cross-Origin-Resource-Policy.

Chybějící HSTS je podstatné u webu, který drží registrace dražitelů s osobními údaji. Chybějící CSP je strukturální věc, ne opomenutí: stránky nesou 6 418 vložených bloků <script> (12,5 na stránku) a 37 771 vložených atributů style=, takže jakákoli CSP by potřebovala unsafe-inline a nic by nepřinesla. Skutečná CSP vyžaduje přestavbu šablon.

Cookies. _session_id je secure; HttpOnly; SameSite=Lax; path=/ s platností 12 hodin. Správně.

CSRF. Meta značky Rails csrf-param / csrf-token na každé stránce, 1 831 vstupů authenticity_token. Správně.

Řízení souhlasu. Výchozí hodnoty Consent Mode v2 jsou nastaveny na denied pro všech šest signálů ještě před načtením GTM a Facebook Pixel je zneškodněn pomocí type="text/plain" data-cookiecategory="analytics", dokud jej Folio CookieConsent neuvolní. Sklik retargeting se načte až po Folio.RemoteScripts.run. Samotný kontejner GTM se načítá bez podmínky, což je běžný vzor Consent Mode. Toto je nejsilnější část souladu webu s předpisy.

Veřejný S3 bucket. Každý obsahový obrázek je obsluhován z s3.eu-central-1.amazonaws.com/auctea/ s cestou, která prozrazuje čas nahrání na sekundu přesně a UUID: /auctea/production/files/2026/09/14/12/17/57/37b4b835-…/filla_uvod.webp. Žádné podepsané URL, žádná CDN, žádná kontrola originu. Kdokoli může scrapingem projít a hotlinkovat celou knihovnu obrázků na náklady klientova datového přenosu.

Uniklé interní informace.

Dodavatelský řetězec. Pět knihoven se za běhu stahuje z cdnjs.cloudflare.com bez SRI hashů a bez CSP, která by je omezila. Jedna z nich, bootstrap.bundle.js, je neminifikovaná verze. Kompromitace cdnjs spustí libovolný kód v relaci přihlášeného dražitele.

Hygiena odkazů. 5 034 odkazů target="_blank", 0 s rel="noopener" nebo noreferrer. Moderní prohlížeče noopener implicitně doplní, takže reverse tabnabbing zmírňuje prohlížeč, ale plný referrer stále uniká do každého odchozího cíle.

Hodnocení: 4 / 10. Rails dává základy zdarma a implementace souhlasu je skutečně dobrá. Chybějící CSP/HSTS, nepodepsaný veřejný bucket a závislosti z CDN bez hashů jsou reálné problémy.


7. Kvalita kódu a udržovatelnost

Pojmenování. Dva konzistentní jmenné prostory: a- = Auctify (aukční platforma) a f- = Folio (CMS). Oba používají důsledný BEM — 1 430 z 1 592 tříd a-* obsahuje __ nebo --. Komponenty dodržují atomické pojmenování (a-atom-text, a-atom-image-and-content, a-molecule-cards-large) a JavaScriptové háčky jsou oddělené od stylovacích tříd (a-js-message-bus-sale-update není definován v žádném CSS pravidle). Jde o ukázněný systém a je to nejsilnější signál v celé kódové základně.

Mrtvé CSS. 763 473 bajtů, 10 363 bloků pravidel, 11 370 selektorů, 8 225 různých tříd. Napříč všemi 513 zrcadlenými stránkami se používá 698 — 8,5 %. 91,5 % stylopisu je mrtvá váha při každém požadavku.

Specificita a !important. 6 503 deklarací !important proti 10 363 blokům pravidel — 0,63 na pravidlo. 1 832 selektorů řetězí 2 a více tříd; nejhlubší mají 5 (.tempus-dominus-widget.light .time-container-second div.active.today:not(.no-highlight):before). Kódová základna, která potřebuje !important téměř ve dvou třetinách pravidel, ztratila kontrolu nad kaskádou.

Designové tokeny, zapojené jen napůl. 298 vlastních vlastností (192 --bs-, 45 --auctify-, 11 --acb-, 3 --folio-), 1 546 odkazů var(). Ale var(--auctify-brand-200) není odkazován ani jednou — značková zlatá je místo toho natvrdo zapsaná jako #B18839 na 24 místech. Vrstva tokenů existuje a obchází se, což je horší, než kdyby neexistovala: rebranding musí sáhnout na obě místa.

Responzivní systém. 490 bloků @media napříč 28 různými hodnotami breakpointů. Pět jich je od Bootstrapu; zbývajících 23 zahrnuje jednorázové hodnoty 518px, 642px, 688px, 766px, 890px, 1014px, 1138px, 1262px, 1386px. Neexistuje žádná dohoda o breakpointech.

Tmavý režim. prefers-color-scheme se objevuje 0krát. Tmavý režim je ruční přepínač ([data-bs-theme], 17 selektorů) a neřídí se operačním systémem.

Prosakování mezi tenanty. CSS s motivem ACB obsahuje **13 tříd a 2 642 bajtů pravidel a-site-theme-sypka-*** — motiv jiného tenanta Auctify, z nichž se zde nepoužívá ani jedna. Sdílený JS registruje a-site-theme-acb-ui-hero-carousel, controller specifický pro ACB, pro všechny tenanty. Izolace motivů není vynucena ani v jednom směru.

Stáří přístupu. Turbolinks 5 nahradilo Turbo v roce 2021. jQuery zůstává jen jako AJAX adaptér pro message_bus. Jediný balík Sprockets předchází rozdělení na importmap/jsbundling, které Rails 7 zavedlo v roce 2021. role="document" uvnitř dialogů je vzor z doby před rokem 2016. Nic není rozbité; všechno je o jednu generaci pozadu.

Klady, řečeno přímo: konzistentní BEM, atomický slovník komponent, skutečná vrstva tokenů (byť obcházená), JS háčky oddělené od stylů, 42 pravidel @media print, 10 bloků prefers-reduced-motion, 4 kontejnerové dotazy, žádný kladný tabindex, žádný debugger, žádné uniklé source mapy, správné příznaky CSRF a cookies.


8. Verdikt o vyspělosti

Auctify/Auctea jako platforma: 7 / 10. Skutečný multi-tenant aukční produkt, ne motiv: 99 Stimulus controllerů pokrývajících role dražitele, operátora, dražebníka, prezentujícího a pokladny; podmíněná sběrnice pro reálný čas s rozumným backoffem; 11 JSON API endpointů podle rolí; motivovatelná vrstva tokenů; serverově vykreslovaná lokalizace cs/en; Turnstile, Devise, OmniAuth a implementace Consent Mode v2 v souladu s předpisy. Její slabiny jsou stáří (Turbolinks, jQuery, Sprockets, polling) a hygiena (91,5 % mrtvého CSS, 6 503 !important, prosakování mezi tenanty), ne schopnosti.

Konkrétní instance tenanta acb.cz: 3 / 10. Škoda je v práci specifické pro tenanta. Nula strukturovaných dat. Nula meta robots navzdory psané politice. 58 % stránek bez popisu. 192 duplicitních titulů. hreflang na 22 % stránek, žádný x-default. Dvanáct indexovatelných anglických stránek, které jsou prázdné skořápky, včetně archivu výstav a celého anglického blogu. Značková barva nesplňující WCAG AA jako text i jako text tlačítka. Žádný <h1> na titulní stránce. Katalog o 76 000 stránkách, jehož ceny v HTML nejsou.

Tento rozdíl je důležitý pro rozhodnutí o přestavbě: nahradit Auctify by znamenalo znovu postavit funkční aukční engine. Nahradit prezentační vrstvu tenanta by opravilo většinu toho, co je změřeno výše. Zjištění, která na úrovni tenanta opravit nelze, jsou poměr značkování k textu 24,6 : 1, stylopis o velikosti 763 KB, pollingový přenos a chybějící CSP — to jsou rozhodnutí platformy.


9. Hodnoticí tabulka

OblastHodnoceníZdůvodnění
Aktuálnost technologií4Turbolinks 5 (nahrazeno 2021), jQuery ponechané kvůli message_bus, monolit Sprockets, žádné dělení kódu, polling přes message_bus místo WebSocketů (0 odkazů na WebSocket v 585 KB). Bootstrap 5.3.1 je aktuální.
Výkon2Poměr značkování k textu 24,6 : 1, obsahová hustota 4,1 %, průměrná stránka 155 KB, 763 KB CSS s využitím 8,5 %, 0 popisovačů w u 10 815 responzivních obrázků, 22,2 % s width/height, žádná CDN ani preconnect pro S3, ~60 požadavků na stránku.
Přístupnost30 odkazů pro přeskočení obsahu, <main> na 28 % stránek, žádný <h1> na titulní stránce, 31 % stránek přeskakuje úrovně nadpisů, 0 aria-live na webu s živým přihazováním, názvy iframů na 8,6 %, značková zlatá 3,26 : 1 na bílé.
SEO30 JSON-LD na 513 stránkách, 0 meta robots navzdory deklarované politice, hreflang na 22 % bez x-default, 58 % chybějících popisků, 192 duplicitních titulů, 152 702 obsahově chudých katalogových URL s cenami chybějícími v HTML.
Zabezpečení4Žádná CSP (6 418 vložených skriptů ji činí nepraktickou), žádné HSTS, žádná Permissions-Policy, 5 závislostí z cdnjs bez SRI, veřejný nepodepsaný S3 bucket, odhalená mapa API operátora a dražebníka. Cookies, CSRF a řízení souhlasu jsou správné.
Mobil a responzivita5Správný viewport, 490 media queries, mobilní nabídka i přepínání rozvržení fungují — ale 28 nahodilých breakpointů, srcset jen podle hustoty, takže telefony stahují obrázky pro desktop, 51 iframů s pevnou šířkou 1140 bez boxu s poměrem stran, 0 využití kontejnerových dotazů nad rámec 4 pravidel.
Vizuální design6Soudržná identita zlatá/téměř černá, Figtree + DMSans na vlastním serveru s font-display: swap, skutečný tmavý režim. Sráží to karusel v hlavičce titulní stránky, akcentní barva nesplňující kontrast a nikdy nepoužitý prefers-color-scheme.
UX a informační architektura5Čisté URL, smysluplná nabídka, funkční překryv živé aukce a štítky probíhajícího přihazování. Ale hodnota cenového katalogu je schovaná za registrací bez náhledu a položky nabídky vedou na prázdné anglické stránky.
Kvalita obsahu4143 obsažných českých článků na blogu a skutečný archiv se 76 000 záznamy. Proti tomu: 12 prázdných anglických stránek, 0 vykreslených anglických článků blogu proti 143 URL v sitemapě a katalogové stránky, které jsou seznamy názvů bez textu a bez cen.
Udržovatelnost kódu4Ukázněný BEM s jmennými prostory a-/f- a JS háčky oddělenými od stylů — a proti tomu 91,5 % mrtvého CSS, 6 503 !important (0,63 na pravidlo), vrstva tokenů obcházená 24 natvrdo zapsanými #B18839 a motiv jiného tenanta v balíku.
Internacionalizace2Dvě jazykové verze zapojené na serveru a lang správně na 100 % stránek, ale hreflang na 22 %, žádný x-default, anglické URL používající české slugy (73 718 z 73 731 shodných) a 12 anglických stránek s méně než 600 znaky obsahu.
Analytika a konverze6GTM, Consent Mode v2 se všemi šesti signály ve výchozím stavu odmítnutými, správně řízený Facebook Pixel, Sklik retargeting, formuláře newsletteru a poptávek s Turnstile. Žádné serverové tagování, žádné viditelné měření konverzí v samotné dražební cestě.

Celkové vážené hodnocení: 3,8 / 10.

Váhy: Výkon 15 %, SEO 15 %, Přístupnost 12 %, Udržovatelnost kódu 10 %, UX a IA 10 %, Kvalita obsahu 8 %, Zabezpečení 8 %, Aktuálnost technologií 8 %, Mobil a responzivita 6 %, Internacionalizace 4 %, Vizuální design 2 %, Analytika a konverze 2 %.

Hodnocení je nízké, protože čtyři nejsilněji vážené oblasti jsou zároveň čtyři nejslabší. Web, jehož HTML je z 95,9 % značkování, který publikuje 152 702 obsahově chudých URL bez strukturovaných dat a bez direktiv pro roboty a jehož značková barva nesplňuje kontrast jako text, nepotřebuje doladit. Platforma pod ním je v pořádku. Vrstva nad ní ne.