Installation
Installera
# .npmrc i projektet — biblioteket ligger på Whitespace egna registry
registry=https://npm.whitespace.house/
bun add @whitespace/malm-uiCSS
En import. Ordningen på kaskadlagren deklareras i den filen, före allt annat den drar in.
/* allt: tokens, bas, komponenter, utilities, och webbfonterna */
@import "@whitespace/malm-ui/css";
/* …eller utan @font-face, om appen redan serverar snitten själv */
@import "@whitespace/malm-ui/css/nofonts";
/* …eller bara variablerna, om komponenterna kan vänta */
@import "@whitespace/malm-ui/css/tokens";Bara tokens är en riktig startpunkt
Där börjar både Orbit och produce: deras@theme-block byts mot den här importen.
HTML
Två attribut på <html>, och ett skript i <head> som måste köra före första målningen.
<html lang="sv" data-font="suisse" data-accent="grey">
<!-- │ └ grey | blue | green
└ suisse | plex | system
data-theme sätts av skriptet nedan: light | dark | inget alls
(inget = följ operativsystemet) -->
<head>
<!-- Inline och synkront. En modul här kör efter att body målats,
vilket är precis buggen det finns för att undvika. -->
<script>
try{var h=document.documentElement;
var v=localStorage.getItem("malm-ui:theme");
if(v&&["system","light","dark"].indexOf(v)>-1&&v!=="system")h.setAttribute("data-theme",v);
var v=localStorage.getItem("malm-ui:font");
if(v&&["suisse","plex","system"].indexOf(v)>-1&&v!==null)h.setAttribute("data-font",v);
var v=localStorage.getItem("malm-ui:accent");
if(v&&["grey","blue","green"].indexOf(v)>-1&&v!==null)h.setAttribute("data-accent",v);
var v=localStorage.getItem("malm-ui:code-font");
if(v&&["jetbrains","plex","system"].indexOf(v)>-1&&v!==null)h.setAttribute("data-code-font",v);
var v=localStorage.getItem("malm-ui:contrast");
if(v&&["system","more"].indexOf(v)>-1&&v!=="system")h.setAttribute("data-contrast",v);}catch(e){}
</script>
</head>Skriptet är inlineAppearanceScript() ur @whitespace/malm-ui/js/appearance.
Beteenden
En rad, eller ett beteende i taget. Inga beroenden.
import { init } from "@whitespace/malm-ui";
init();
// eller bara det sidan behöver
import { initTabs } from "@whitespace/malm-ui/js/tabs";
import { toast } from "@whitespace/malm-ui/js/toast";
import { confirmDialog } from "@whitespace/malm-ui/js/dialog";init() är idempotent. Anropa den igen efter ett sidbyte — view transitions, ett htmx-fragment — det är det avsedda sättet.
Astro
Tunna wrappers över samma markup. CSS:en fungerar utan dem.
---
import Button from "@whitespace/malm-ui/astro/Button.astro";
import Panel from "@whitespace/malm-ui/astro/Panel.astro";
import Icon from "@whitespace/malm-ui/astro/Icon.astro";
---
<Panel title="Budget" caption="Projekt">
<Button slot="actions" size="sm" variant="ghost" icon="Export">Exportera</Button>
<p>412 av 600 timmar.</p>
</Panel>Skriva över
Appens egen CSS ligger utanför alla lager och vinner över bibliotekets — utan !important.
@import "@whitespace/malm-ui/css";
/* Byt accent för hela produkten — en rad, och varje knapp,
länk, fokusring och aktiv nav-pill följer med. */
:root {
--color-accent: var(--color-ws-green-700);
--color-accent-hover: var(--color-ws-green-800);
}
/* Eller skriv om en komponent rakt av. Ingen @layer behövs. */
.btn-primary {
border-radius: 0;
}Flytta hit
Klassnamnen är Orbits och produces. Därför är övergången en import och inte en omskrivning.
| Steg | Vad |
|---|---|
| 1 | Byt @theme-blocket mot @import "@whitespace/malm-ui/css/tokens". Ingenting ska förändras visuellt — det är testet. |
| 2 | Ta bort de komponentklasser appen definierar som biblioteket redan har. .panel, .btn-*, .ws-*. |
| 3 | Byt till @import "@whitespace/malm-ui/css". Behåll appens egna regler — de ligger utanför lagren och vinner. |
| 4 | Lägg till temaskriptet i <head> och init() i entrypointen. Nu finns mörkt läge. |
| 5 | Byt appens egna ikoner mot <Icon />, en vy i taget. |