lāska.aiv 1.1.2 · UI Kit

React

Komponentová knihovna

Pro frontend vývojáře. Každá komponenta má živou ukázku a zdrojový TSX kód k zkopírování.

Začni tady

Instalace v projektu

Komponenty žijí v src/components/laska/*. Importuj přes alias @/.

tsx
import { LButton } from "@/components/laska/Button";
import { TextField } from "@/components/laska/Inputs";
import { ConfirmationModal } from "@/components/laska/Feedback";

export function Example() {
  return <LButton variant="heart">Líbí</LButton>;
}

JSON HTTP API

Veřejné API komponent

Strojově čitelný inventář všech komponent — pro generátory dokumentace, AI nástroje a integrace. Endpoint je veřejný, podporuje CORS a cache 5 min.

GET /api/public/components— všechny komponenty
GET /api/public/components?category=inputs— filtrovat dle kategorie
GET /api/public/components?name=LButton— jedna komponenta
bash
# Všechny komponenty
curl https://laska-ui-uiinventory.lovable.app/api/public/components

# Jen kategorie inputs
curl "https://laska-ui-uiinventory.lovable.app/api/public/components?category=inputs"

# Konkrétní komponenta
curl "https://laska-ui-uiinventory.lovable.app/api/public/components?name=LButton"

Kategorie: buttons · inputs · navigation · profile · matching · chat · feedback · ai · subscription · support · layout

Tlačítka

LButton

@/components/laska/Button

Hlavní tlačítko. Varianty: heart · primary · outline · ghost · secondary · dark.

tsx
import { LButton } from "@/components/laska/Button";

<LButton variant="heart">Líbí</LButton>
<LButton variant="primary">Pokračovat</LButton>
<LButton variant="outline">Zrušit</LButton>
<LButton variant="ghost">Skip</LButton>
<LButton variant="dark">Premium</LButton>
<LButton size="block">Plná šířka</LButton>

SocialButton

@/components/laska/Primitives

Přihlášení přes Google / Facebook / Apple.

tsx
import { SocialButton } from "@/components/laska/Primitives";

<SocialButton provider="google">Pokračovat s Googlem</SocialButton>
<SocialButton provider="apple">Pokračovat s Apple</SocialButton>
<SocialButton provider="facebook">Pokračovat s Facebookem</SocialButton>

PaymentButton

@/components/laska/Primitives

Apple Pay / Google Pay tlačítko.

tsx
import { PaymentButton } from "@/components/laska/Primitives";

<PaymentButton provider="apple-pay" />
<PaymentButton provider="google-pay" />

Vstupy a formuláře

TextField

@/components/laska/Inputs

Textové pole s labelem, helper textem, chybou a počítadlem znaků.

Jak ti říkají blízcí.

0/40

tsx
import { TextField } from "@/components/laska/Inputs";

<TextField
  label="Jméno"
  placeholder="Eliška"
  helper="Jak ti říkají blízcí."
  maxLength={40}
  counter
/>

TextArea

@/components/laska/Inputs

0/240

tsx
import { TextArea } from "@/components/laska/Inputs";

<TextArea
  label="O mně"
  placeholder="Pár vět o tobě…"
  maxLength={240}
/>

PasswordField

@/components/laska/Primitives

Heslo s přepínáním viditelnosti.

tsx
import { PasswordField } from "@/components/laska/Primitives";

<PasswordField label="Heslo" placeholder="Min. 8 znaků" />

OTPField

@/components/laska/Inputs
tsx
import { OTPField } from "@/components/laska/Inputs";

<OTPField length={6} />

SelectField

@/components/laska/Primitives
tsx
import { SelectField } from "@/components/laska/Primitives";

<SelectField
  label="Město"
  options={[
    { value: "praha", label: "Praha" },
    { value: "brno", label: "Brno" },
  ]}
/>

RadioGroup

@/components/laska/Primitives
tsx
import { RadioGroup } from "@/components/laska/Primitives";
import { useState } from "react";

const [v, setV] = useState("ona");
<RadioGroup
  value={v}
  onChange={setV}
  options={[
    { value: "on", label: "On" },
    { value: "ona", label: "Ona" },
    { value: "jine", label: "Jiné" },
  ]}
/>

ToggleSwitch

@/components/laska/Inputs
tsx
import { ToggleSwitch } from "@/components/laska/Inputs";

<ToggleSwitch
  label="Anonymní režim"
  description="Skryje fotografii do první rezonance."
  checked
/>

SegmentedControl

@/components/laska/Inputs
tsx
import { SegmentedControl } from "@/components/laska/Inputs";
import { useState } from "react";

const [tone, setTone] = useState<"klid" | "vasen" | "humor">("klid");

<SegmentedControl
  value={tone}
  onChange={setTone}
  options={[
    { value: "klid", label: "Klid" },
    { value: "vasen", label: "Vášeň" },
    { value: "humor", label: "Humor" },
  ]}
/>

FileUpload

@/components/laska/Primitives
tsx
import { FileUpload } from "@/components/laska/Primitives";

<FileUpload hint="JPG nebo PNG, max 5 MB" />

Chip

@/components/laska/Inputs
tsx
import { Chip } from "@/components/laska/Inputs";

<Chip active>Hudba</Chip>
<Chip>Knihy</Chip>

Navigace

TopAppBar

@/components/laska/Navigation

Profil

tsx
import { TopAppBar } from "@/components/laska/Navigation";

<TopAppBar title="Profil" back variant="centered" />

BottomNav

@/components/laska/Navigation

Spodní navigace s aktivním stavem a červenými badges.

tsx
import { BottomNav } from "@/components/laska/Navigation";

<BottomNav
  active="chats"
  badges={{ matches: 3, chats: 12, profile: true }}
/>

BackButton

@/components/laska/Primitives
tsx
import { BackButton } from "@/components/laska/Primitives";

<BackButton label="Zpět" />

ProgressStepper

@/components/laska/Navigation
tsx
import { ProgressStepper } from "@/components/laska/Navigation";

<ProgressStepper step={3} total={5} />

Profil a shody

Avatar

@/components/laska/Primitives
EK
tsx
import { Avatar } from "@/components/laska/Primitives";

<Avatar initials="E" />
<Avatar initials="K" />
<Avatar state="placeholder" />

VerifiedBadge

@/components/laska/Primitives
E-mail ověřenFoto ověřenoDoklad ověřen
tsx
import { VerifiedBadge } from "@/components/laska/Primitives";

<VerifiedBadge level="email" />
<VerifiedBadge level="photo" />
<VerifiedBadge level="id" />

MatchListItem

@/components/laska/Extended

Stavy: default · highlighted · newLike · blurred · muted.

E

Eliška

92% rezonance · Praha

M

Markéta

98% · doporučená AI

TOP
K

Klára

Nový like

Nový like
tsx
import { MatchListItem } from "@/components/laska/Extended";

<MatchListItem name="Eliška" meta="92% rezonance" initial="E" />
<MatchListItem name="Markéta" meta="98% · doporučená AI" initial="M" state="highlighted" />
<MatchListItem name="Klára" meta="Nový like" initial="K" state="newLike" />

ProgressBar

@/components/laska/Extended
Odhalení profilu25 %
Síla rezonance87 %
tsx
import { ProgressBar } from "@/components/laska/Extended";

<ProgressBar value={87} label="Síla rezonance" tone="heart" />

MatchBoostCTA

@/components/laska/Extended

Zviditelnit profil

Boost na 24 h. Vaše karta se ukáže více lidem v rezonančním okruhu.

tsx
import { MatchBoostCTA } from "@/components/laska/Extended";

<MatchBoostCTA price="49 Kč" hint="Boost na 24 h" />

Chat

ChatBubble

@/components/laska/Chat
Ahoj, jak se máš?
10:24
Dobře, díky.
10:25
tsx
import { ChatBubble } from "@/components/laska/Chat";

<ChatBubble side="in" time="10:24">Ahoj, jak se máš?</ChatBubble>
<ChatBubble side="out" time="10:25">Dobře, díky.</ChatBubble>

ChatComposer

@/components/laska/Chat
tsx
import { ChatComposer } from "@/components/laska/Chat";

<ChatComposer />

AINudge

@/components/laska/Chat
AI

Zkus se zeptat na to, co dnes Klára zažila.

tsx
import { AINudge } from "@/components/laska/Chat";

<AINudge text="Zkus se zeptat na to, co dnes Klára zažila." />

Feedback a stavy

ConfirmationModal

@/components/laska/Feedback

Zrušit předplatné?

Funkce zůstanou aktivní do konce zúčtovacího období.

tsx
import { ConfirmationModal } from "@/components/laska/Feedback";

<ConfirmationModal
  title="Zrušit předplatné?"
  description="Funkce zůstanou aktivní do konce zúčtovacího období."
  cancel="Ne, ponechat"
  confirm="Ano, zrušit"
/>

Toast

@/components/laska/Feedback

Zpráva odeslána

Eliška vidí, že jste online.

tsx
import { Toast } from "@/components/laska/Feedback";

<Toast title="Zpráva odeslána" description="Eliška vidí, že jste online." />

InlineAlert

@/components/laska/Feedback

Postupné odhalování

Sdílíte podle svého tempa.

tsx
import { InlineAlert } from "@/components/laska/Feedback";

<InlineAlert tone="info" title="Postupné odhalování">
  Sdílíte podle svého tempa.
</InlineAlert>

EmptyState

@/components/laska/Feedback

Zatím žádné konverzace

Začni s první anonymní rezonancí.

tsx
import { EmptyState } from "@/components/laska/Feedback";
import { LButton } from "@/components/laska/Button";

<EmptyState
  title="Zatím žádné konverzace"
  description="Začni s první anonymní rezonancí."
  action={<LButton variant="heart">Najít rezonanci</LButton>}
/>

AI a předplatné

AIJourneyCard

@/components/laska/Extended
AI cesta2 / 5

Hodnoty a rytmus

AI hledá společné body ve vašem stylu vyjadřování.

tsx
import { AIJourneyCard } from "@/components/laska/Extended";

<AIJourneyCard
  step={2}
  total={5}
  title="Hodnoty a rytmus"
  description="AI hledá společné body ve vašem stylu vyjadřování."
/>

AIResultCard

@/components/laska/Extended
AI shrnutí

Vaše rezonance s Eliškou

Píšete podobně dlouhé věty a oba upřednostňujete otázky.

87% jistota
tsx
import { AIResultCard } from "@/components/laska/Extended";

<AIResultCard
  title="Vaše rezonance s Eliškou"
  insight="Píšete podobně dlouhé věty a oba upřednostňujete otázky."
  confidence={87}
/>

PlanCardSelectable

@/components/laska/Extended
tsx
import { PlanCardSelectable } from "@/components/laska/Extended";

<PlanCardSelectable
  name="Resonance"
  price="299 Kč / měsíc"
  features={["Neomezené rezonance", "AI insight", "Boost 1× týdně"]}
  selected
/>

CreditPackageCard

@/components/laska/Extended
+1 zdarma

10

kreditů

149 Kč

tsx
import { CreditPackageCard } from "@/components/laska/Extended";

<CreditPackageCard credits={10} price="149 Kč" bonus="+1 zdarma" highlighted />

PaymentHistoryRow

@/components/laska/Extended

Resonance · měsíční předplatné

12. 4. 2026

Zaplaceno299 Kč
tsx
import { PaymentHistoryRow } from "@/components/laska/Extended";

<PaymentHistoryRow
  date="12. 4. 2026"
  description="Resonance · měsíční předplatné"
  amount="299 Kč"
  status="paid"
/>

Podpora

FAQAccordion

@/components/laska/Support

Sdílíte podle svého tempa. Vždy máte kontrolu.

tsx
import { FAQAccordion } from "@/components/laska/Support";

<FAQAccordion items={[
  { q: "Jak funguje postupné odhalování?", a: "Sdílíte podle svého tempa." },
  { q: "Můžu být anonymní?", a: "Ano, fotky odemykáte ručně." },
]} />

Layout

AppSplash

@/components/laska/Primitives
lāska.ai

Pomalu, ale doopravdy.

v0.1
tsx
import { AppSplash } from "@/components/laska/Primitives";

<AppSplash tagline="Pomalu, ale doopravdy." />