Hoppa till innehållet

Installation

@whitespace/malm-ui, npm.whitespace.house

Installera

# .npmrc i projektet — biblioteket ligger på Whitespace egna registry
registry=https://npm.whitespace.house/

bun add @whitespace/malm-ui

CSS

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.

StegVad
1Byt @theme-blocket mot @import "@whitespace/malm-ui/css/tokens". Ingenting ska förändras visuellt — det är testet.
2Ta bort de komponentklasser appen definierar som biblioteket redan har. .panel, .btn-*, .ws-*.
3Byt till @import "@whitespace/malm-ui/css". Behåll appens egna regler — de ligger utanför lagren och vinner.
4Lägg till temaskriptet i <head> och init() i entrypointen. Nu finns mörkt läge.
5Byt appens egna ikoner mot <Icon />, en vy i taget.