Brand guidelines

Brand guidelines

Two shapes coming closer.

Kotsna is a dating app in Tbilisi: real people, each one verified by the team. This site holds what you need to draw it and to talk about it.

  • Ultraviolet palette
  • Dark by default
  • EN · FR · ES · RU · KA
  • Updated 17 October 2026

02 Colours

Ultraviolet

An electric violet to act, an acid green to signal, on a blue-tinted night. 41 tokens, each with a dark and a light value. Select a value to copy it.

Backgrounds and surfaces

  • bg

    App background, behind every screen.

    Dark
    Light
  • surface

    Surfaces on the background: fields, sheets, lists.

    Dark
    Light
  • surface2

    Cards and received bubbles, one step above surface.

    Dark
    Light
  • chipBg

    Background of inactive chips and filters.

    Dark
    Light
  • tabBg

    Pill tab bar, dark in both modes.

    Dark
    Light
  • backdrop

    Veil behind an open sheet or modal.

    Dark
    Light

Lines

  • line

    Dividers and decorative outlines of cards and chips.

    Dark
    Light
  • lineStrong

    Outline of fields and checkboxes, 3:1 at least on every surface.

    Dark
    Light

Text

  • ink

    Main text, titles and body copy.

    Dark
    Light
  • muted

    Secondary text: captions, hints, metadata.

    Dark
    Light
  • tabMuted

    Labels of inactive tabs, on tabBg.

    Dark
    Light

Action (violet)

  • primary

    Electric violet: main button, active switch, strong link.

    Dark
    Light
  • onPrimary

    Text and icons on primary.

    Dark
    Light
  • primaryInk

    Violet as text: links and highlighted words.

    Dark
    Light
  • primaryDeep

    Violet tint: selected item, sent bubble; ink text on it.

    Dark
    Light

Signal (acid green)

  • accent

    Acid green: tonight, verified, active tab. Always a chip fill, never text on light.

    Dark
    Light
  • onAccent

    Text on acid green.

    Dark
    Light
  • accentInk

    Signal as text: acid green on dark, replaced by violet on light.

    Dark
    Light
  • verify

    Verified badge, on a veiled photo or on dark.

    Dark
    Light
  • tabOn

    Pill of the active tab.

    Dark
    Light
  • tabOnInk

    Label of the active tab.

    Dark
    Light

Error

  • danger

    Solid red: danger button, field outline in error, icon.

    Dark
    Light
  • onDanger

    Text on danger.

    Dark
    Light
  • dangerInk

    Error message as text.

    Dark
    Light
  • dangerBg

    Background of an error banner.

    Dark
    Light

Success

  • success

    Mint green: confirmation icon and outline, distinct from acid green.

    Dark
    Light
  • successInk

    Confirmation text.

    Dark
    Light
  • successBg

    Background of a confirmation banner.

    Dark
    Light

Warning

  • warning

    Amber: warning icon and outline, never a large fill.

    Dark
    Light
  • warningInk

    Warning text.

    Dark
    Light
  • warningBg

    Background of a warning banner.

    Dark
    Light

Info

  • info

    Sky blue: information icon, distinct from the action violet.

    Dark
    Light
  • infoInk

    Information text.

    Dark
    Light
  • infoBg

    Background of an information banner.

    Dark
    Light

Veil on photos

  • scrim

    Solid 70 % veil under a label placed on a photo. Same in both modes.

    Dark
    Light
  • scrimGradient

    Gradient at the bottom of photo cards; text stays where the veil passes 70 %.

    Darkgradient
    Lightgradient
  • onScrim

    Main text on a veiled photo.

    Dark
    Light
  • onScrimMuted

    Secondary text on a veiled photo (distance, district).

    Dark
    Light

Disabled state

  • disabledBg

    Background of a disabled button or field.

    Dark
    Light
  • disabledInk

    Disabled text and icons (exempt from WCAG, 3:1 aimed for).

    Dark
    Light

Focus

  • focus

    Keyboard focus ring: 2 px, offset by 2 px, on every active element.

    Dark
    Light

Contrast (WCAG 2.2)

Body text 7:1 (AAA required), other text 4.5:1 (AA), graphic elements 3:1. Ratios computed at build time from the token values. Veiled photos are checked in the worst case: a white photo under the 70 % veil.

Dark mode

  • Body text on the backgroundink on bg17.76AAA
  • Body text on a cardink on surface214.29AAA
  • Secondary text on the backgroundmuted on bg8.04AAA
  • Secondary text on a cardmuted on surface26.47AA
  • Main button labelonPrimary on primary5.38AA
  • Violet as text on the backgroundprimaryInk on bg7.22AAA
  • Text on a selectionink on primaryDeep10.73AAA
  • Accent chip labelonAccent on accent16.43AAA
  • Signal as text on the backgroundaccentInk on bg16.43AAA
  • Error text on its bannerdangerInk on dangerBg6.77AA
  • Success text on its bannersuccessInk on successBg9.05AAA
  • Warning text on its bannerwarningInk on warningBg8.91AAA
  • Info text on its bannerinfoInk on infoBg7.75AAA
  • Field outline on a surfacelineStrong on surface3.763:1
  • Focus ring on the backgroundfocus on bg16.433:1

Light mode

  • Body text on the backgroundink on bg16.34AAA
  • Body text on a cardink on surface214.41AAA
  • Secondary text on the backgroundmuted on bg6.24AA
  • Secondary text on a cardmuted on surface25.50AA
  • Main button labelonPrimary on primary5.38AA
  • Violet as text on the backgroundprimaryInk on bg6.46AA
  • Text on a selectionink on primaryDeep14.07AAA
  • Accent chip labelonAccent on accent16.43AAA
  • Signal as text on the backgroundaccentInk on bg6.46AA
  • Error text on its bannerdangerInk on dangerBg6.29AA
  • Success text on its bannersuccessInk on successBg5.72AA
  • Warning text on its bannerwarningInk on warningBg6.83AA
  • Info text on its bannerinfoInk on infoBg6.49AA
  • Field outline on a surfacelineStrong on surface4.223:1
  • Focus ring on the backgroundfocus on bg6.463:1

03 Typography

Three scripts, one voice

Unbounded for titles, wide and round. Onest for reading. Noto Sans Georgian for Georgian, with more line height and one more weight step to stand up to Unbounded.

Scale

Eleven levels, in CSS px. Each sample is rendered with its own token settings, in English, Russian and Georgian (Georgian takes its own column: weight, line height).

  1. Screen title

    One per screen, at the top. Two lines at most.

    Unbounded 700, clamp(20px, 6vw, 24px) / 28, -0.02 em

    KA: Noto Sans Georgian 800, same size / 34, 0 em

    Notification settings

    Настройки уведомлений

    შეტყობინებების პარამეტრები

  2. Section title

    Settings groups, profile blocks, list headers.

    Unbounded 600, 18 px / 24, -0.01 em

    KA: Noto Sans Georgian 700, 18 px / 26, 0 em

    You are on the list

    Ты в списке ожидания

    მოლოდინის სიაში ხარ

  3. Card title

    Name and age on the photo card, sheet title.

    Unbounded 600, 22 px / 26, -0.01 em

    KA: Noto Sans Georgian 700, 22 px / 30, 0 em

    Nino, 27

    Нино, 27

    ნინო, 27

  4. Body

    Running text, bios, messages.

    Onest 400, 16 px / 24, 0 em

    KA: Noto Sans Georgian 400, 16 px / 26, 0 em

    Real people in Tbilisi, each one checked by our team. Go at your own pace.

    Настоящие люди в Тбилиси, каждого проверяет наша команда. Не торопись.

    ნამდვილი ადამიანები თბილისში, თითოეულს ჩვენი გუნდი ამოწმებს. ნუ იჩქარებ.

  5. Small body

    Hints under fields, notes, banner text.

    Onest 400, 14 px / 20, 0 em

    KA: Noto Sans Georgian 400, 14 px / 22, 0 em

    Our team reads every application by hand.

    Наша команда читает каждую заявку вручную.

    ჩვენი გუნდი ყველა განაცხადს ხელით განიხილავს.

  6. Caption

    Metadata: district, distance, time. 12 px is the minimum, Georgian too.

    Onest 500, 12 px / 16, 0.01 em

    KA: Noto Sans Georgian 500, 12 px / 18, 0 em

    Vake · 21:40

    Ваке · 21:40

    ვაკე · 21:40

  7. Button

    Button label, on one line.

    Onest 600, 16 px / 20, 0 em

    KA: Noto Sans Georgian 600, 16 px / 22, 0 em

    Send the verification code

    Отправить код подтверждения

    კოდის გაგზავნა

  8. Chip

    Filters, interests, "tonight".

    Onest 600, 13 px / 16, 0.01 em

    KA: Noto Sans Georgian 600, 13 px / 18, 0 em

    Free tonight

    Свободна сегодня

    ამაღამ თავისუფალია

  9. Label

    Short label in capitals. The only level in mtavruli.

    Onest 700, 12 px / 16, 0.08 em

    KA: Noto Sans Georgian 700, 12 px / 18, 0.06 em

    THIS OR THAT

    ЭТО ИЛИ ТО

    ᲔᲡ ᲗᲣ ᲘᲡ

  10. Figure

    Token balance, referral gauge. Tabular figures.

    Unbounded 700, 40 px / 44, -0.02 em

    KA: Unbounded in every language

    120

    120

    120

  11. Small figure

    Counters in a line (2 / 3, 120 tokens).

    Unbounded 600, 20 px / 24, -0.01 em

    KA: Unbounded in every language

    2 / 3

    2 / 3

    2 / 3

Rules

Georgian
Mkhedruli has ascenders and descenders on many letters (ბ, ძ, ფ, ყ, ჯ). Georgian line height: 1.35 to 1.4 for titles (1.15 to 1.2 in Latin), 1.6 to 1.65 for body (1.4 to 1.5). Tracking always 0, except the mtavruli label (0.06 em).
Weight
Georgian titles take one weight step above Unbounded (800 for 700, 700 for 600) to keep the same presence.
Cyrillic
Same font and size as Latin. Unbounded is wide: Russian titles often wrap to two lines, and the layout plans for it.
Figures
Figures are in Unbounded in every language, with font-variant-numeric: tabular-nums. The word after them is in the text font.
Titles
Two lines at most. No automatic hyphenation, no break inside a word. A single word never overflows its box.
Buttons
One line aimed for. If a translation does not fit: two centred lines (line height 1.25), never truncated or shrunk, and the string is flagged for shortening.
Minimum size
12 px, in every script.

Georgian capitals (mtavruli)

Only at the label level: short labels in capitals (ᲔᲡ ᲗᲣ ᲘᲡ in the This or that game, group headers like ᲘᲜᲢᲔᲠᲔᲡᲔᲑᲘ), three words at most, tracking 0.06 em, Noto Sans Georgian 700.

Do not rely on text-transform: uppercase for Georgian (the result depends on the browser). Write the strings in mtavruli in the translation files, or convert with the table U+10D0 to U+10FA into U+1C90 to U+1CBA (+0xBC0). text-transform: capitalize never applies to Georgian.

Never

  • As an initial: Georgian has no capital at the start of a sentence or a name (ნინო, never Ნინო).
  • In screen, section and card titles, body text, buttons, fields or error messages.
  • In member content: names, bios, messages, answers.
  • Mixed with mkhedruli in one word, or to stress a word in a sentence.
  • In the კოცნა logotype.

04 Icons

Eight of our own, Lucide for the rest

The icons Lucide does not cover, drawn in its style so the two families mix. 24 grid, 1.5 stroke, round caps and joins, inherited colour (currentColor).

05 Stickers

Geometry at play

The two circles of the logo, combined in other ways: bubbles, flower, moon, heart. They bring warmth without a photo.

06 Motion

Motion follows the finger

Short, clear transitions, springs during gestures. One animated brand image only: the two shapes rolling towards each other, at the match.

1.1 s from the like to the open screen. A tap on the scene jumps to the end. With reduced motion, everything arrives in a single 120 ms fade, the shapes already in contact.

  1. 0 msLike. The card leaves to the right with the throw spring.
  2. 120 msVeil. Backdrop veil in 220 ms (enter curve). The violet disc enters bottom left, the green ring top right.
  3. 320 msRoll. Roll spring. Each shape turns on itself once, without sliding: rotation = distance / radius.
  4. 560 msApproach. The shapes slow down, the spring absorbs the speed.
  5. 700 msContact. Contact at the centre of the screen. Contact spring: 4 % squash, then back. A light 10 ms vibration if allowed.
  6. 820 msOpening. Both shapes grow and become the frames of the two photos; the title rises 16 px as it fades in (base, enter).
  7. 1100 msMatch screen. Buttons active. A tap anywhere during the animation jumps straight here.

Principles

Motion follows the finger
During a gesture nothing runs on a fixed duration: everything goes through a spring.
Two shapes coming closer
The only animated brand image, kept for the match and for loading.
Short and clear
Interface transitions stay under 320 ms; only the match takes its time (1.1 s).
No flashing
Never any flashing, never an endless loop on screen except loading.
Reduced motion
With prefers-reduced-motion: no movement and no rolling, only 120 ms fades and instant state changes. Content and controls stay the same.

Durations

Curves

  • --ease-standardcubic-bezier(0.2, 0, 0, 1) Everything that moves within the screen and stays there.
  • --ease-entreecubic-bezier(0, 0, 0, 1) What arrives: sheet, in-app notification, match screen.
  • --ease-sortiecubic-bezier(0.3, 0, 1, 1) What leaves: passed card, closed sheet. Shorter than the entrance.
  • --ease-contactcubic-bezier(0.34, 1.56, 0.64, 1) The slight bounce of the contact point, and nothing else.
  • --ease-lineairelinear Progress bars and the loading rotation only.

Springs

Stiffness, damping and mass, as in Motion or react-spring.

07 Photography

Night, warmth, real people

City lights in the evening, laughs caught in the moment, every orientation and every age. And nothing that locates anyone: no street, no number, no recognisable square.

Do

Avoid

In the app

Tonight
Nino, 27under 2 km
  • 4:5 crop. Chips at the top within 72 px, face in the upper third.
  • Text in the bottom 45 %, on the scrimGradient, with a 16 px margin.
  • File of 1080 × 1350 px at least, in sRGB.
  • No text on a photo without a veil. A lone label sits on the solid 70 % scrim. The veil stays dark in both modes.
  • Photos of people come only from the Tbilisi shoot, with models who signed a release for this exact use. Until then, people are drawn, never taken from a photo library.

Blurred likes

For members without Plus, received likes are blurred. Blur measured on the 160 px thumbnail; 16 px is the retained value.

08 Voice and tone

Like someone who knows the city

Direct, warm, discreet. Never crude, never judging. Informal, and we assume nothing.

Writing rules

Sample lines

Values in braces are inserted by the app. Russian and Georgian are to be reviewed by a native speaker; French and Spanish too.

Welcome

English

Welcome to Kotsna

Real people in Tbilisi, each one checked by our team. Go at your own pace.

Get started
Français

Bienvenue sur Kotsna

Des gens vrais à Tbilissi, chacun vérifié par notre équipe. Prends ton temps.

Commencer
Español

Te damos la bienvenida a Kotsna

Gente real en Tbilisi, cada perfil revisado por nuestro equipo. Ve a tu ritmo.

Empezar
Русский

Добро пожаловать в Kotsna

Настоящие люди в Тбилиси, каждого проверяет наша команда. Не торопись.

Начать
ქართული

კეთილი იყოს შენი მობრძანება Kotsna-ში

ნამდვილი ადამიანები თბილისში, თითოეულს ჩვენი გუნდი ამოწმებს. ნუ იჩქარებ.

დაწყება

Match

English

A kiss in the air

You and {name} like each other. Say hello, or start with This or that.

Say hello
Français

Un baiser dans l'air

{prénom} et toi, vous vous plaisez. Dis bonjour, ou commence par Ceci ou cela.

Dire bonjour
Español

Un beso en el aire

Hay interés mutuo entre {nombre} y tú. Saluda o empieza con Esto o aquello.

Saludar
Русский

Поцелуй в воздухе

Вы с {имя} понравились друг другу. Поздоровайся или начни с «Это или то».

Поздороваться
ქართული

კოცნა ჰაერში

შენ და {სახელი} ერთმანეთი მოგწონთ. მიესალმე ან დაიწყე „ეს თუ ის“-ით.

მიესალმე

Application refused

English

Not this time

We can't accept your application right now. Reason: {reason}. Your details have been deleted, and you can apply again in 6 months.

Close
Français

Pas cette fois

Nous ne pouvons pas accepter ta candidature pour le moment. Motif : {motif}. Tes données sont supprimées, et tu pourras candidater de nouveau dans 6 mois.

Fermer
Español

Esta vez no

Ahora mismo no podemos aceptar tu solicitud. Motivo: {motivo}. Hemos borrado tus datos y podrás volver a solicitar acceso dentro de 6 meses.

Cerrar
Русский

В этот раз нет

Сейчас мы не можем принять твою заявку. Причина: {причина}. Твои данные удалены, подать заявку снова можно через 6 месяцев.

Закрыть
ქართული

ამჯერად არა

ამ ეტაპზე შენს განაცხადს ვერ მივიღებთ. მიზეზი: {მიზეზი}. შენი მონაცემები წაშლილია, ხელახლა განაცხადის გაგზავნა 6 თვეში შეგიძლია.

დახურვა

Warning

English

A word about our rules

We were told about something that goes against our rules: {reason}. This is a warning, nothing more. If it happens again, your account may be suspended.

I understand
Français

Un mot sur nos règles

On nous a signalé quelque chose de contraire à nos règles : {motif}. C'est un avertissement, rien de plus. Si ça se reproduit, ton compte pourra être suspendu.

J'ai compris
Español

Una nota sobre nuestras normas

Nos han avisado de algo que va contra nuestras normas: {motivo}. Es solo un aviso. Si se repite, tu cuenta podría suspenderse.

Entendido
Русский

Пара слов о наших правилах

Нам сообщили о нарушении наших правил: {причина}. Это только предупреждение. Если это повторится, аккаунт может быть приостановлен.

Понятно
ქართული

ორიოდე სიტყვა ჩვენს წესებზე

გვაცნობეს ჩვენი წესების დარღვევის შესახებ: {მიზეზი}. ეს მხოლოდ გაფრთხილებაა. თუ განმეორდება, შენი ანგარიში შეიძლება შეჩერდეს.

გასაგებია

Outage

English

We'll be right back

Kotsna is having trouble right now. We keep trying on our own. Your chats and matches are safe.

Try again
Français

On revient très vite

Kotsna a un souci en ce moment. On réessaie tout seuls. Tes conversations et tes matches sont en sécurité.

Réessayer
Español

Volvemos enseguida

Kotsna tiene un problema ahora mismo. Seguimos intentándolo solos. Tus chats y tus matches están a salvo.

Reintentar
Русский

Скоро вернёмся

У Kotsna сейчас неполадки. Мы продолжаем попытки сами. Твои чаты и мэтчи в безопасности.

Повторить
ქართული

მალე დავბრუნდებით

Kotsna-ს ახლა პრობლემა აქვს. ცდას თავად ვაგრძელებთ. შენი ჩატები და მატჩები უსაფრთხოდაა.

ხელახლა ცდა

Payment receipt

English

Payment received

Kotsna Plus, 1 month: 13.99 ₾. Renews on {date}. Cancel anytime in Settings. The receipt is also in your email.

Done
Français

Paiement reçu

Kotsna Plus, 1 mois : 13,99 ₾. Renouvellement le {date}. Résiliable à tout moment dans les réglages. Le reçu est aussi dans ta boîte mail.

Terminé
Español

Pago recibido

Kotsna Plus, 1 mes: 13,99 ₾. Se renueva el {fecha}. Puedes cancelar cuando quieras en Ajustes. El recibo también está en tu correo.

Listo
Русский

Оплата получена

Kotsna Plus, 1 месяц: 13,99 ₾. Продление {дата}. Отменить можно в любой момент в настройках. Чек также отправлен на почту.

Готово
ქართული

გადახდა მიღებულია

Kotsna Plus, 1 თვე: 13,99 ₾. განახლდება {თარიღი}. გაუქმება ნებისმიერ დროს შეგიძლია პარამეტრებში. ქვითარი ელფოსტაზეც გამოგეგზავნა.

მზადაა

09 Downloads

The brand kit

Coming soon

Every file of this site, and more, will live in the brand-kit repository: logo in SVG and PNG, app icons, icons, stickers, fonts with their licences, and the tokens in CSS, TypeScript and JSON.

Repository: Kotsna/brand-kit, private for now; the link comes when it opens.

Until then, every SVG on this page opens on its own from its link. The fonts are free from Google Fonts under the SIL Open Font License.