Skip to content

Bun.color(input, outputFormat?) sfrutta il parser CSS di Bun per analizzare, normalizzare e convertire i colori dall'input dell'utente in una varietà di formati di output, inclusi:

FormatoEsempio
"css""red"
"ansi""\x1b[38;2;255;0;0m"
"ansi-16""\x1b[38;5;\tm"
"ansi-256""\x1b[38;5;196m"
"ansi-16m""\x1b[38;2;255;0;0m"
"number"0x1a2b3c
"rgb""rgb(255, 99, 71)"
"rgba""rgba(255, 99, 71, 0.5)"
"hsl""hsl(120, 50%, 50%)"
"hex""#1a2b3c"
"HEX""#1A2B3C"
"{rgb}"{ r: 255, g: 99, b: 71 }
"{rgba}"{ r: 255, g: 99, b: 71, a: 1 }
"[rgb]"[ 255, 99, 71 ]
"[rgba]"[ 255, 99, 71, 255]

Ci sono molti modi diversi per usare questa API:

  • Validare e normalizzare i colori da persistere in un database (number è il più adatto ai database)
  • Convertire i colori in diversi formati
  • Logging colorato oltre i 16 colori che molti usano oggi (usa ansi se non vuoi scoprire cosa supporta il terminale dell'utente, altrimenti usa ansi-16, ansi-256, o ansi-16m per quanti colori il terminale supporta)
  • Formattare i colori per l'uso in CSS iniettato in HTML
  • Ottenere le componenti di colore r, g, b, e a come oggetti JavaScript o numeri da una stringa di colore CSS

Puoi pensare a questo come un'alternativa ai popolari pacchetti npm color e tinycolor2 eccetto con supporto completo per l'analisi di stringhe di colore CSS e zero dipendenze costruito direttamente in Bun.

Input flessibile ​

Puoi passare uno dei seguenti:

  • Nomi di colori CSS standard come "red"
  • Numeri come 0xff0000
  • Stringhe hex come "#f00"
  • Stringhe RGB come "rgb(255, 0, 0)"
  • Stringhe RGBA come "rgba(255, 0, 0, 1)"
  • Stringhe HSL come "hsl(0, 100%, 50%)"
  • Stringhe HSLA come "hsla(0, 100%, 50%, 1)"
  • Oggetti RGB come { r: 255, g: 0, b: 0 }
  • Oggetti RGBA come { r: 255, g: 0, b: 0, a: 1 }
  • Array RGB come [255, 0, 0]
  • Array RGBA come [255, 0, 0, 255]
  • Stringhe LAB come "lab(50% 50% 50%)"
  • ... qualsiasi altra cosa che CSS può analizzare come valore di colore singolo

Formattare i colori come CSS ​

Il formato "css" produce CSS valido per l'uso in fogli di stile, stili inline, variabili CSS, css-in-js, ecc. Restituisce la rappresentazione più compatta del colore come stringa.

ts
Bun.color("red", "css"); // "red"
Bun.color(0xff0000, "css"); // "#f000"
Bun.color("#f00", "css"); // "red"
Bun.color("#ff0000", "css"); // "red"
Bun.color("rgb(255, 0, 0)", "css"); // "red"
Bun.color("rgba(255, 0, 0, 1)", "css"); // "red"
Bun.color("hsl(0, 100%, 50%)", "css"); // "red"
Bun.color("hsla(0, 100%, 50%, 1)", "css"); // "red"
Bun.color({ r: 255, g: 0, b: 0 }, "css"); // "red"
Bun.color({ r: 255, g: 0, b: 0, a: 1 }, "css"); // "red"
Bun.color([255, 0, 0], "css"); // "red"
Bun.color([255, 0, 0, 255], "css"); // "red"

Se l'input è sconosciuto o non riesce l'analisi, Bun.color restituisce null.

Formattare i colori come ANSI (per terminali) ​

Il formato "ansi" produce codici di escape ANSI per l'uso nei terminali per rendere il testo colorato.

ts
Bun.color("red", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color(0xff0000, "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("#f00", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("#ff0000", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("rgb(255, 0, 0)", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("rgba(255, 0, 0, 1)", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("hsl(0, 100%, 50%)", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("hsla(0, 100%, 50%, 1)", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color({ r: 255, g: 0, b: 0 }, "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color({ r: 255, g: 0, b: 0, a: 1 }, "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color([255, 0, 0], "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color([255, 0, 0, 255], "ansi"); // "\u001b[38;2;255;0;0m"

Questo ottiene la profondità di colore di stdout e sceglie automaticamente uno tra "ansi-16m", "ansi-256", "ansi-16" in base alle variabili d'ambiente. Se stdout non supporta alcuna forma di colore ANSI, restituisce una stringa vuota. Come con il resto dell'API color di Bun, se l'input è sconosciuto o non riesce l'analisi, restituisce null.

Colori ANSI a 24 bit (ansi-16m) ​

Il formato "ansi-16m" produce colori ANSI a 24 bit per l'uso nei terminali per rendere il testo colorato. Il colore a 24 bit significa che puoi visualizzare 16 milioni di colori sui terminali supportati e richiede un terminale moderno che lo supporti.

Questo converte il colore di input in RGBA, e poi lo produce come colore ANSI.

ts
Bun.color("red", "ansi-16m"); // "\x1b[38;2;255;0;0m"
Bun.color(0xff0000, "ansi-16m"); // "\x1b[38;2;255;0;0m"
Bun.color("#f00", "ansi-16m"); // "\x1b[38;2;255;0;0m"
Bun.color("#ff0000", "ansi-16m"); // "\x1b[38;2;255;0;0m"

256 colori ANSI (ansi-256) ​

Il formato "ansi-256" approssima il colore di input al più vicino dei 256 colori ANSI supportati da alcuni terminali.

ts
Bun.color("red", "ansi-256"); // "\u001b[38;5;196m"
Bun.color(0xff0000, "ansi-256"); // "\u001b[38;5;196m"
Bun.color("#f00", "ansi-256"); // "\u001b[38;5;196m"
Bun.color("#ff0000", "ansi-256"); // "\u001b[38;5;196m"

Per convertire da RGBA a uno dei 256 colori ANSI, abbiamo portato l'algoritmo che tmux usa.

16 colori ANSI (ansi-16) ​

Il formato "ansi-16" approssima il colore di input al più vicino dei 16 colori ANSI supportati dalla maggior parte dei terminali.

ts
Bun.color("red", "ansi-16"); // "\u001b[38;5;\tm"
Bun.color(0xff0000, "ansi-16"); // "\u001b[38;5;\tm"
Bun.color("#f00", "ansi-16"); // "\u001b[38;5;\tm"
Bun.color("#ff0000", "ansi-16"); // "\u001b[38;5;\tm"

Questo funziona convertendo prima l'input in uno spazio colore RGB a 24 bit, poi in ansi-256, e poi convertiamo quello al colore ANSI a 16 più vicino.

Formattare i colori come numeri ​

Il formato "number" produce un numero a 24 bit per l'uso in database, configurazione, o qualsiasi altro caso d'uso dove è desiderata una rappresentazione compatta del colore.

ts
Bun.color("red", "number"); // 16711680
Bun.color(0xff0000, "number"); // 16711680
Bun.color({ r: 255, g: 0, b: 0 }, "number"); // 16711680
Bun.color([255, 0, 0], "number"); // 16711680
Bun.color("rgb(255, 0, 0)", "number"); // 16711680
Bun.color("rgba(255, 0, 0, 1)", "number"); // 16711680
Bun.color("hsl(0, 100%, 50%)", "number"); // 16711680
Bun.color("hsla(0, 100%, 50%, 1)", "number"); // 16711680

Ottenere i canali rosso, verde, blu e alfa ​

Puoi usare i formati "{rgba}", "{rgb}", "[rgba]" e "[rgb]" per ottenere i canali rosso, verde, blu e alfa come oggetti o array.

Oggetto {rgba} ​

Il formato "{rgba}" produce un oggetto con i canali rosso, verde, blu e alfa.

ts
type RGBAObject = {
  // 0 - 255
  r: number;
  // 0 - 255
  g: number;
  // 0 - 255
  b: number;
  // 0 - 1
  a: number;
};

Esempio:

ts
Bun.color("hsl(0, 0%, 50%)", "{rgba}"); // { r: 128, g: 128, b: 128, a: 1 }
Bun.color("red", "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 }
Bun.color(0xff0000, "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 }
Bun.color({ r: 255, g: 0, b: 0 }, "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 }
Bun.color([255, 0, 0], "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 }

Per comportarsi in modo simile a CSS, il canale a è un numero decimale tra 0 e 1.

Il formato "{rgb}" è simile, ma non include il canale alfa.

ts
Bun.color("hsl(0, 0%, 50%)", "{rgb}"); // { r: 128, g: 128, b: 128 }
Bun.color("red", "{rgb}"); // { r: 255, g: 0, b: 0 }
Bun.color(0xff0000, "{rgb}"); // { r: 255, g: 0, b: 0 }
Bun.color({ r: 255, g: 0, b: 0 }, "{rgb}"); // { r: 255, g: 0, b: 0 }
Bun.color([255, 0, 0], "{rgb}"); // { r: 255, g: 0, b: 0 }

Array [rgba] ​

Il formato "[rgba]" produce un array con i canali rosso, verde, blu e alfa.

ts
// Tutti i valori sono 0 - 255
type RGBAArray = [number, number, number, number];

Esempio:

ts
Bun.color("hsl(0, 0%, 50%)", "[rgba]"); // [128, 128, 128, 255]
Bun.color("red", "[rgba]"); // [255, 0, 0, 255]
Bun.color(0xff0000, "[rgba]"); // [255, 0, 0, 255]
Bun.color({ r: 255, g: 0, b: 0 }, "[rgba]"); // [255, 0, 0, 255]
Bun.color([255, 0, 0], "[rgba]"); // [255, 0, 0, 255]

A differenza del formato "{rgba}", il canale alfa è un intero tra 0 e 255. Questo è utile per typed array dove ogni canale deve essere dello stesso tipo sottostante.

Il formato "[rgb]" è simile, ma non include il canale alfa.

ts
Bun.color("hsl(0, 0%, 50%)", "[rgb]"); // [128, 128, 128]
Bun.color("red", "[rgb]"); // [255, 0, 0]
Bun.color(0xff0000, "[rgb]"); // [255, 0, 0]
Bun.color({ r: 255, g: 0, b: 0 }, "[rgb]"); // [255, 0, 0]
Bun.color([255, 0, 0], "[rgb]"); // [255, 0, 0]

Formattare i colori come stringhe hex ​

Il formato "hex" produce una stringa hex minuscola per l'uso in CSS o altri contesti.

ts
Bun.color("hsl(0, 0%, 50%)", "hex"); // "#808080"
Bun.color("red", "hex"); // "#ff0000"
Bun.color(0xff0000, "hex"); // "#ff0000"
Bun.color({ r: 255, g: 0, b: 0 }, "hex"); // "#ff0000"
Bun.color([255, 0, 0], "hex"); // "#ff0000"

Il formato "HEX" è simile, ma produce una stringa hex con lettere maiuscole invece di lettere minuscole.

ts
Bun.color("hsl(0, 0%, 50%)", "HEX"); // "#808080"
Bun.color("red", "HEX"); // "#FF0000"
Bun.color(0xff0000, "HEX"); // "#FF0000"
Bun.color({ r: 255, g: 0, b: 0 }, "HEX"); // "#FF0000"
Bun.color([255, 0, 0], "HEX"); // "#FF0000"

Formattazione dei colori lato client al momento del bundle ​

Come molte delle API di Bun, puoi usare le macro per invocare Bun.color al momento del bundle per l'uso in build JavaScript lato client:

ts
import { color } from "bun" with { type: "macro" };

console.log(color("#f00", "css"));

Poi, builda il codice lato client:

sh
bun build ./client-side.ts

Questo produrrà quanto segue in client-side.js:

js
// client-side.ts
console.log("red");

Bun a cura di www.bunjs.com.cn