TrendingDon't panic-bid on your own brand after the spam update.
Internal · design system

The Mediovsky design system.

Living documentation of every brand, type, color, spacing, and component decision in Mediovsky. Use this when adding new pages, integrations, or media types. Keep the look consistent.

01 / Foundations

Brand & logo.

The Mediovsky wordmark is non-negotiable. Indigo dot accent (#3C3FDE) is the only brand color. Never recolor, distort, or rebuild the mark.

Logo variants

Logo light logo.svg · light bg
Logo dark logo-dark.svg · dark bg

Sizes & clear space

Default · 48px
Nav · 32px
Min · 24px

Minimum height 24px. Always leave clear space equal to the height of the "M" on all sides.

02 / Foundations

Color.

Indigo accent #3C3FDE is the only brand color. Everything else is neutral. Dark mode uses lifted indigo #7A7DFF for contrast.

Brand accent

Accent#3C3FDE
Accent soft#EEEEFF
Accent (dark)#7A7DFF
Accent soft (dark)#181830

Light theme tokens

TokenValueUse
--bg#FBFAF7Page background, warm white
--fg#15141APrimary text, headings
--fg-2#3A3944Secondary text, body copy
--fg-3#76757FTertiary, meta, captions
--rule#E6E4DCBorders, dividers
--accent#3C3FDEBrand accent, links, kickers
--accent-soft#EEEEFFSubtle accent backgrounds, badges

Dark theme tokens

TokenValueUse
--bg#0E0D12Page background
--fg#EBEAF0Primary text
--fg-2#B8B7C2Secondary text
--rule#23222BBorders
--accent#7A7DFFAccent (lifted for contrast)

Semantic colors

Success#10B981
Warning#D97706
Error#E11D48

Use sparingly. Only for status feedback. Avoid in editorial content (indigo accent is enough).

03 / Foundations

Typography.

One typeface (Inter) used at varied weights and sizes. Editorial mark: light weight (300) for display, regular (400) for body, indigo italics for emphasis (set via <em> with font-style:normal).

Type scale

display300 · 64px
Display headline
h1300 · 56px
Page heading
h2400 · 32px
Article section heading
h3500 · 20px
Subsection heading
lede400 · 21px
Lead paragraph after the headline.
body400 · 19px
Long-form article body copy, comfortable reading at 19px.
ui body400 · 15px
UI body: descriptions, list items, card text.
small500 · 12px
Meta, captions, byline
micro500 · 11px
Eyebrow / kicker
mono500 · 12px
code · labels · placeholders
04 / Foundations

Spacing & grid.

8-point spacing system. 8-column grid with 32px gutter. 1240px max container width.

8-point spacing scale

4
8
12
16
24
32
40
48
56
72
96

Grid

1
2
3
4
5
6
7
8

Press G on any page to toggle live grid overlay.

05 / Foundations

Radius & shadow.

Sparse use of corners and shadow. Cards: 4-12px. Pills: 999px. Shadow only on sticky/floating elements.

0px
4px
6px
8px
12px
pill

Shadows

none · sticky-nav (1) · floating (2) · modal/menu (3)

06 / Foundations

Motion.

All transitions are calm. Hover: 150ms. State change: 200ms. Nothing slower than 300ms. Easings: ease, ease-out, ease-in-out.

DurationUseExample
150msColor, hoverLink hover
200msBox shadow, opacitySticky nav shadow
250msTransform, layoutDrawer open
noneFocus ringsAccessibility · instant
Live motion preview
07 / Components

Buttons.

Primary actions

Subscribe

Icon buttons

08 / Components

Forms.

We'll use this for the newsletter only.
This field is required.
09 / Components

Chips & tags.

10 / Components

Cards.

11 / Components

List items.

Text-forward article list used on homepage, category, author, latest. Date on left, content middle, thumbnail right (8-col).

12 / Components

Pagination.

13 / Components

Tabs.

Active tab content area.

14 / Components

Alerts & toasts.

Heads up

Your enhanced conversions upload rate is below 90%. Go fix that first.

Saved

Article scheduled for publication on May 28.

Cache stale

Edge cache hasn't refreshed in 48 hours. Consider manual purge.

Failed to publish

Connection to media server lost. Article saved as draft.

Toast

Article saved to reading list
15 / Components

Skeletons & empty states.

Empty state

No results found

Try a different keyword or browse the latest articles.

17 / Live

Badges & labels.

Status pills and disclosure labels. Use to flag content type (Featured, Sponsored), status (Live, Beta, Draft), or recency (New, Updated).

Editorial labels

★ Featured Sponsored Cover story Exclusive Part 3 of 6

Status pills

Live New Beta Soon Draft Scheduled Archived Updated May 27

In context: article card

Sponsored
MarTech

Card with sponsored disclosure label.

May 21 · 12 min
18 / Live

Marquee ticker.

Continuous horizontal scrolling band. Pure CSS animation, pausable on hover. Use sparingly. For breaking headlines or issue announcements.

Default: dark band

★ Issue №001 out now/ Cover: Your AI ad strategy is only as good as your data/ Fresh coverage every week/ New series: Performance Max audits/ Adobe Summit 2026 wrap available/ ★ Issue №001 out now/ Cover: Your AI ad strategy is only as good as your data/ Fresh coverage every week/ New series: Performance Max audits/ Adobe Summit 2026 wrap available/

Accent variant

● Live now· Fresh coverage weekly· 9 editorial channels· Reader-supported since 2026· ● Live now· Fresh coverage weekly· 9 editorial channels· Reader-supported since 2026·
19 / Live

Back to top.

Floating button bottom-right of viewport. Appears after scrolling past 600px. Site-wide. Already active on every page.

scroll the page to see the live one →
20 / Live

Theme toggle morph.

Sun and moon icons cross-fade with a 180° rotation when switching themes. Both icons in DOM, opacity flipped by html[data-theme] attribute.

click the toggle in the nav, or this one:

Note: this demo button shares the global toggle logic (any element with #theme).

21 / Live

Modals & popups.

Two patterns: simple CTA popup for one decision, and structured modal for forms with consent checkboxes.

CTA popup

Form modal with consents

Visual popup with image background

CTA over image (no bottom drawer)

Open: button click · close: Esc / overlay click / × button.

22 / More components

Avatars.

Five sizes, with optional status dot. Use initials as default; image when available. Stack overlapping for multi-author or reader lists.

Sizes

MS
MS
MS
MS
MS

With status

MS
AK
JR

Stack (multi-author)

MS
AK
JR
+5
23 / More components

Tooltips.

Hover bubble with arrow. Four positions. Use sparingly. Most labels should be visible without hover.

TopTooltip on top BottomTooltip on bottom LeftTooltip on left RightTooltip on right
25 / More components

Search input.

Standalone input with leading icon and trailing clear button. For pages without the ⌘K overlay.

26 / More components

Toast queue.

Stacked notifications, auto-dismiss after 5s. Use for transient feedback only. Not for errors that need action.

Article saved to reading list
Subscribed to newsletter
Cache stale. Refresh recommended
Network error. Retrying
27 / More components

Notification bell.

Bell icon with unread count badge. Dropdown shows latest notifications.

New issue №217 is now live.
2 hours ago
Your subscription was confirmed.
Yesterday
Reader survey just opened (5 min).
2 days ago
28 / More components

Count-up & sparkline.

Animated numerics for stats. Use on first view, not in re-renders.

Counter

2,048Sample metric
247Articles
9.7%CRM swap rate

Sparkline in stat card

2,048
▲ +6.4%
Readers
4:30
▲ +0:18
Avg. read
99.2%
±0.0%
Cache hit
29 / More components

Loading button.

Replaces text with spinner during async operation. Pointer events disabled.

30 / More components

Progress stepper.

Multi-step form indicator. Done state is solid, active is outlined, upcoming is muted.

Account
Preferences
3
Subscribe
4
Done
31 / More components

Confetti.

Celebration animation after positive actions (subscribed, completed survey). CSS only. No canvas needed for this scale.

Joined ✓

Welcome to Mediovsky. Issue №218 ships Thursday.

33 / Brand & unique

Newsletter sticky bar.

Bottom-of-viewport CTA that appears after the user scrolls 60% of an article. Dismissible.

One issue a week. No filler. Sharp coverage of media, tech, and AI business.
34 / Brand & unique

⌘K hint pill.

Subtle floating pill on first visit, hints at the keyboard shortcut. Dismiss after one use.

Try search. Press ⌘K
35 / Brand & unique

Reading rail.

Floating vertical column beside an article: share, save, TOC, font size. Hidden < 1300px.

article body
progress
circle →
36 / Brand & unique

Section dividers.

Five variants for article breaks. Use line for default, ornament for editorial pauses, stars for chapter-like breaks.

Line (default)

Ornament with label

continued

Stars

★ ★ ★

Numbered

02

Accent block

37 / Brand & unique

Quote variants.

Five quote styles for different editorial weight. Big for pull-out, small for inline, portrait for testimonials, cols for long.

Big (pull quote)

AI doesn't fail loudly. It optimizes toward your bad data.

Small (inline)

The better the algorithm gets, the worse bad data hurts.

With portrait

MS

"Most marketing frameworks read better than they perform."

Mikołaj Salecki, editor

Two columns

Performance Max and Meta Advantage+ optimize confidently toward whatever signal you send them. Messy CRM data and delayed conversions silently corrupt targeting models at scale, and the platforms have no incentive to tell you. The better the algorithm gets, the worse bad data hurts.
38 / Brand & unique

Footnote & sidenote.

Footnotes for citation, sidenotes for tangent. Both keep article body clean.

Footnote (bottom-of-article)

[1]
Gartner CMO Spend Survey 2025, n=412 B2B teams. See methodology.
[2]
Internal Mediovsky analysis across 14 audited accounts, Q1 2026.

Sidenote (margin)

Performance Max audits should run monthly, not quarterly. Cross-device match rates erode faster than most teams notice, typically 12-18 percentage points in a quarter.
SidenoteMatch rate erosion is invisible without baselining at campaign launch.
39 / Brand & unique

TLDR box.

Compact summary above long-form articles. 3-5 bullets max, single-screen-readable.

TL;DR
  • Performance Max optimizes against whatever signal you send, including bad signal.
  • Most teams have a 12-18pp gap in cross-device match rate they haven't audited.
  • The fix is pipeline, not strategy: refresh customer lists weekly, audit upload rates monthly.
  • Build a kill switch: smart bidding off if upload rate drops below threshold.
40 / Brand & unique

Reading progress circle.

Circular SVG progress, replaces linear progress bar in compact contexts (reading rail, mini player).

60%
5 min remaining
41 / Brand & unique

Highlight on hover.

Subtle hover effect on key phrases. The underline grows into a full highlight on hover. Use for callouts inline.

Performance Max optimizes confidently toward whatever signal you send. Messy CRM data and delayed conversions silently corrupt targeting models, and the platforms won't tell you it's happening.

42 / Brand & unique

Bookmark moment.

Reader selects a passage; a floating action lets them save the quote with the article reference.

"AI doesn't fail loudly. It optimizes toward your bad data, quietly, on schedule."

From your reading · Issue №001
43 / Brand & unique

Caption styles.

Four caption variants for images: default, italic editorial, source attribution, rich (with label).

A simple caption with no styling beyond muted text.
An italic editorial caption with slightly more weight.
SOURCE: MEDIOVSKY · MAY 2026
Figure 1Modeled signal loss across a 90-day conversion window in Google Performance Max with degraded CRM inputs.
44 / Brand & unique

Page transitions.

Four built-in transitions between pages. Use sparingly. Default is fade only.

Default
Fade
Compact
Slide-up
Detail
Cross-fade
None
Instant
45 / Brand & unique

Glitch on hover.

RGB-shift glitch effect. Use with extreme caution. Only for one-off emphasis, never on body text.

Sharp insights, smarter growth.

46 / Brand & unique

Accordion.

Native <details> elements styled as a card. Use for FAQ, methodology notes, advanced settings, anything secondary that shouldn't take vertical space by default.

Card variant

01 What is Mediovsky?

An independent weekly journal of media, tech, and AI business, started in 2026, still reader-supported. We publish one issue every Thursday with a cover essay and 3-4 supporting pieces.

Written for professionals who run digital. Read more about us.

02 How often do you publish?

Weekly, every Thursday, with occasional bonus pieces during major industry events.

03 Do you accept guest pitches?

Yes. From working operators only. See our editorial line for what we look for. Two-week turnaround.

04 Can I republish your articles?

Quote freely with attribution (up to ~150 words). Full republication requires permission. Email [email protected].

Plain variant (no card)

A Methodology for our data pieces

First-party data from accounts we audit, vendor-published primary sources, peer-reviewed research, and named industry surveys. See full methodology.

B How we handle corrections

Public corrections posted on the original article, with the previous wording struck through. View all corrections.

Built on native <details> for accessibility: works without JS, keyboard-navigable, screen-reader friendly.

47 / Admin actions

Dialog: basic.

Centered modal with title, body, action footer. Use in admin for short single-purpose flows: rename, change status, edit one field. ~520px wide.

48 / Admin actions

Dialog: form.

For "Add user", "+ New token", "+ Manual backup", "+ New redirect": multi-field form with submit / cancel.

49 / Admin actions

Dialog: danger.

Destructive irreversible actions: delete article, restore backup. Red icon header, typed confirmation for the worst.

50 / Admin actions

Confirm.

Smallest possible decision. One line, two buttons. Use for unsubscribe, archive, revoke session.

51 / Admin actions

Drawer.

Right slide-in, 480px. Subscriber details, audit log entry, revision view.

52 / Admin actions

Sheet (mobile).

Bottom slide-up. Mobile fallback for drawers and dialogs, or for filter / sort.

53 / Admin actions

Popover menu.

Anchored dropdown for row ⋯ menus, "Export ▾" buttons.


54 / Admin actions

Inline edit.

Edit in place. Click a value in a table row → input. Use for slug, tag name, single-field changes.

55 / Admin actions

Page banner.

Top-of-page status. Persistent until dismissed.

56 / Admin actions

Decision matrix.

Which UI for which action.

UseUIWidth
Single binary decisionConfirm380px
1-3 fields formDialog · form520px
4+ fieldsDialog · form520-640px
Detailed view-onlyDrawer480px
Destructive irreversibleDialog · danger520px
Row ⋯ menuPopover240px
Quick field changeInline editcell
Filter / sort on mobileSheetfull
Status / system messageBannerfull
Transient confirmationToastauto
16 / Components

Iconography.

Stroke icons, 1.6 stroke width, 14-20px. Source: Lucide-style custom. Always currentColor.

search
theme
bookmark
arrow
link
close
menu
check
info
alert
mail
play
58 / Editorial

Article elements.

Standard editorial building blocks for long-form. See article.html for live use.

Kicker · Data & Research

Article headline with accent.

Deck paragraph. Sits between headline and byline. Slightly larger than body.

By Mikołaj Salecki · May 15, 2026 · 11 min read
59 / Editorial

Quotes & pull quotes.

Inline blockquote

AI doesn't fail loudly. It optimizes toward your bad data, quietly, on schedule. Mikołaj Salecki

Pull quote (full-width)

The better the algorithm gets, the worse bad data hurts.
60 / Editorial

Callouts.

Heads up If your enhanced conversions upload rate is below 90%, stop reading this article and go fix that first.
61 / Editorial

Code blocks.

# Performance Max: data quality audit
CHECK enhanced_conversions.upload_rate
   --threshold=95
   --window=30d

CHECK offline_conversions.schema_drift
   --against="baseline_2026_q1.json"
62 / Media

Images & gallery.

Standard aspect ratios: 16:9 (cover, video), 16:10 (article thumbs), 1:1 (Editor's picks), 4:5 (portrait), 21:9 (cinematic hero), 3:4 (issue cover).

Aspect ratios

Gallery (mosaic)

63 / Media

Audio & podcast.

Reserved for when we ship audio editions and the podcast. Compact player for inline use, full card for episode pages.

Inline audio player

Issue №001: audio edition (read by author)

04:3215:14

Podcast episode card

Mediovsky podcast · Episode 14

What broke in performance marketing this quarter, and why nobody noticed.

45 min·Recorded May 20
64 / Media

Video.

11:42
65 / Media

Embeds.

Frames for YouTube, Vimeo, X/Twitter, Mastodon, GitHub gist, CodePen, Figma. Always 16:9 or auto.

YouTube embed · 16:9
X / Twitter embed
GitHub gist
Figma embed
66 / Data

Stats & KPIs.

2.0K
Sample metric
▲ +6.4% vs last month
247
Articles published
8 this month
4:30
Avg. read time
▲ +0:18 vs Q1
99.2%
Cache hit rate
edge · 24h window
67 / Data

Tables.

ChannelArticlesAvg. readReads (30d)Status
PPC3810:248,412healthy
SEO319:186,205healthy
AI & Data4211:0211,304healthy
MarTech299:454,118slow growth
E-Commerce248:093,002needs attention
68 / Reference

Voice & tone.

Editorial voice principles. Keep these in mind when writing UI copy, microcopy, and article body.

PrincipleDoDon't
Direct"AI optimizes toward your bad data.""AI may potentially optimize..."
Specific"55-80% of SERPs shifted in 12 days.""Lots of SERPs shifted."
Practical"Block 90 minutes on Monday...""Consider exploring options..."
Skeptical"Most frameworks read better than they perform.""This framework will transform your business."
American English"optimization, behavior""optimisation, behaviour"
69 / Reference

Naming conventions.

TypeConventionExample
CSS classesBEM-lite.card · .card__title · .card.is-active
State classesis-X / has-X.is-open · .is-active · .has-error
JS hooksdata-* attrsdata-pane="A" · data-r="insight"
localStorage keysmediovsky-Xmediovsky-saved · mediovsky-theme
Custom eventsmediovsky:X-Ymediovsky:saved-changed
IDs (unique)camelCase#savedBadge · #navDrawer
File nameskebab-case.htmlstyle-guide.html · hero-variants.html

Style guide last updated May 27, 2026. Source of truth for all design decisions in Mediovsky.