import { createRawSnippet } from "svelte"; import { describe, expect, it } from "vitest"; import { Link, LinkPreview, link as linkAppearance } from "@reddb-io/design-system/base"; import InlineTextContractFailures from "./fixtures/InlineTextContractFailures.svelte"; import { classes, classesOf, render, rendered } from "./mount"; const text = (value: string) => createRawSnippet(() => ({ render: () => `${value}` })); describe("the deliberately failing Link fixture", () => { it("demonstrates a link distinguishable from prose by colour alone", () => { const link = rendered( render(InlineTextContractFailures, { failure: "colour-only-link" }), ).querySelector("[data-broken-link]")!; expect(classes(link).has("text-primary")).toBe(true); expect([...classes(link)].some((name) => name.includes("underline"))).toBe(false); }); }); describe("the Base Link", () => { it("keeps native link semantics and a non-colour affordance", () => { const link = rendered( render(Link, { href: "/guide", children: text("Usage guide"), class: "font-medium", }), ) as HTMLAnchorElement; expect(link.tagName).toBe("A"); expect(link.getAttribute("href")).toBe("/guide"); expect(link.textContent).toBe("Usage guide"); expect(classes(link)).toEqual(classesOf(linkAppearance({ class: "font-medium" }))); expect(classes(link).has("underline")).toBe(true); link.focus(); expect(document.activeElement).toBe(link); expect(classes(link).has("focus-visible:outline-focus")).toBe(true); }); it("is the canonical native-link affordance composed by LinkPreview", () => { const root = render(LinkPreview, { href: "/guide", label: "Usage guide", previewLabel: "Usage guide preview", triggerClass: "font-medium", }); const trigger = root.querySelector("[data-link-preview-trigger]")!; expect(classes(trigger)).toEqual(classesOf(linkAppearance({ class: "font-medium" }))); }); it("is ink, not accent: foreground text with the underline, thickening on hover", () => { const link = rendered(render(Link, { href: "/guide", children: text("Usage guide") })); const names = classes(link); expect(names.has("text-foreground")).toBe(true); expect(names.has("underline")).toBe(true); expect(names.has("hover:decoration-2")).toBe(true); expect([...names].some((name) => /^(?:hover:)?text-primary/.test(name))).toBe(false); }); });