From a84a3c01e80801bc45000845283b6a4c4a1366a5 Mon Sep 17 00:00:00 2001 From: Daniel Baker Date: Fri, 21 Nov 2025 23:38:25 -0800 Subject: [PATCH 1/7] nixos-color-palette-tailwind: init Create a tailwind.js package for the color palette. --- .../nixos-color-palette-tailwind/package.nix | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 package-sets/top-level/nixos-branding/nixos-color-palette-tailwind/package.nix diff --git a/package-sets/top-level/nixos-branding/nixos-color-palette-tailwind/package.nix b/package-sets/top-level/nixos-branding/nixos-color-palette-tailwind/package.nix new file mode 100644 index 0000000..aec8453 --- /dev/null +++ b/package-sets/top-level/nixos-branding/nixos-color-palette-tailwind/package.nix @@ -0,0 +1,102 @@ +{ + lib, + nodePackages, + stdenvNoCC, +}: +let + + # inherits + + inherit (builtins) + baseNameOf + foldl' + toString + ; + + inherit (lib.attrsets) + attrValues + listToAttrs + mapAttrs + mapAttrs' + nameValuePair + ; + + inherit (lib.lists) + map + ; + + inherit (lib.strings) + concatMapStringsSep + replaceStrings + substring + toJSON + toLower + ; + + inherit (lib.trivial) + importTOML + ; + + # reshaping + + toKebapCase = x: toLower (replaceStrings [ " " ] [ "-" ] x); + + arrToOklch = arr: "oklch(${concatMapStringsSep " " toString arr})"; + + mapPalettes = mapAttrs ( + paletteGroupName: paletteGroupValue: + listToAttrs ( + map ( + member: + let + mappedTints = mapAttrs' ( + shadeName: shadeValue: nameValuePair (substring 1 2 shadeName) (arrToOklch shadeValue) + ) member.tints or { }; + in + nameValuePair (toKebapCase "${paletteGroupName} ${member.name}") ( + { + DEFAULT = arrToOklch member.value; + } + // mappedTints + ) + ) paletteGroupValue + ) + + ); + + colors = foldl' (acc: elem: acc // elem) { } ( + (attrValues (mapPalettes colorsData.logos)) ++ (attrValues (mapPalettes colorsData.palette)) + ); + + # sources + + colorsPath = ../nixos-color-palette; + colorsFile = colorsPath + "/colors.toml"; + colorsData = importTOML colorsFile; + +in + +stdenvNoCC.mkDerivation { + + pname = baseNameOf ./.; + version = colorsData.version; + + src = ""; + + runLocal = true; + dontUnpack = true; + dontPatch = true; + dontConfigure = true; + dontBuild = true; + dontFixup = true; + + installPhase = '' + mkdir $out + + cat > $out/tailwind.js < Date: Sun, 23 Nov 2025 20:21:10 -0800 Subject: [PATCH 2/7] nixos-color-palette-tailwind: rework data manipulation --- .../nixos-color-palette-tailwind/package.nix | 302 ++++++++++++++++-- 1 file changed, 274 insertions(+), 28 deletions(-) diff --git a/package-sets/top-level/nixos-branding/nixos-color-palette-tailwind/package.nix b/package-sets/top-level/nixos-branding/nixos-color-palette-tailwind/package.nix index aec8453..0bdfe4e 100644 --- a/package-sets/top-level/nixos-branding/nixos-color-palette-tailwind/package.nix +++ b/package-sets/top-level/nixos-branding/nixos-color-palette-tailwind/package.nix @@ -15,6 +15,7 @@ let inherit (lib.attrsets) attrValues + getAttr listToAttrs mapAttrs mapAttrs' @@ -22,58 +23,303 @@ let ; inherit (lib.lists) + concatMap + head map + toList ; inherit (lib.strings) - concatMapStringsSep + concatStringsSep + match replaceStrings - substring toJSON toLower ; inherit (lib.trivial) + flip importTOML + pipe ; # reshaping - toKebapCase = x: toLower (replaceStrings [ " " ] [ "-" ] x); - - arrToOklch = arr: "oklch(${concatMapStringsSep " " toString arr})"; - - mapPalettes = mapAttrs ( - paletteGroupName: paletteGroupValue: - listToAttrs ( - map ( - member: - let - mappedTints = mapAttrs' ( - shadeName: shadeValue: nameValuePair (substring 1 2 shadeName) (arrToOklch shadeValue) - ) member.tints or { }; - in - nameValuePair (toKebapCase "${paletteGroupName} ${member.name}") ( - { - DEFAULT = arrToOklch member.value; - } - // mappedTints - ) - ) paletteGroupValue - ) + /** + Converts oklch values to a Tailwind string. - ); + # Examples + :::{.example} + ## `oklchToTailwind` usage example + + ```nix + oklchToTailwind [0.55 0.11 264] + => "oklch(0.550000 0.110000 264)" + ``` + + ::: + */ + oklchToTailwind = value: "oklch(${toString value})"; + + /** + Gets the lightness value from a string. + + # Examples + :::{.example} + ## `getLightnessValue` usage example + + ```nix + getLightnessValue "L95" + => "95" + ``` + + ::: + */ + getLightnessValue = flip pipe [ + (match "[[:alpha:]]([[:digit:]]+)") + head + ]; + + /** + Convert a sequence of space-delimited words to kebab case. Will try to coerce + non-string types to string. + + # Type + + ``` + toKebab :: String | [String] -> String + ``` + + # Examples + :::{.example} + ## `toKebab` usage example + + ```nix + toKebab [ "1" "2" "3" ] + => "1-2-3" + toKebab [ 1 2 3 ] + => "1-2-3" + toKebab [ "1 2 3" ] + => "1-2-3" + ``` + + ::: + */ + toKebab = flip pipe [ + toList + (map toString) + (concatStringsSep " ") + (replaceStrings [ " " ] [ "-" ]) + toLower + ]; + + /** + Converts the tints of a color to a Tailwind CSS string. + + The color optionally has an attribute `tints`. Each tint attribute + contained should have a name of the form `XY+` where `X` is an alpha + character and `Y` is one or more digits. The alpha character will be + removed and the color values will be inserted into a string. + + # Type + + mapTintsToTailwind :: Attrset -> Attrset + + # Examples + :::{.example} + ## `mapTintsToTailwind` usage example + + ```nix + mapTintsToTailwind { + name = "Italian Violet"; + tints = { + L15 = [ 0.15 0.03 288 ]; + L55 = [ 0.55 0.11 288 ]; + L95 = [ 0.95 0.02 288 ]; + }; + value = [ 0.75 0.12 288 ]; + } + => { + "15" = "oklch(0.150000 0.030000 288)"; + "55" = "oklch(0.550000 0.110000 288)"; + "95" = "oklch(0.950000 0.020000 288)"; + } + + mapTintsToTailwind { + name = "NixOS Dark Blue"; + value = [ 0.55 0.12 264 ]; + } + => { } + ``` - colors = foldl' (acc: elem: acc // elem) { } ( - (attrValues (mapPalettes colorsData.logos)) ++ (attrValues (mapPalettes colorsData.palette)) + ::: + */ + mapTintsToTailwind = + member: + mapAttrs' ( + shadeName: shadeValue: nameValuePair (getLightnessValue shadeName) (oklchToTailwind shadeValue) + ) member.tints or { }; + + /** + Convert a color to a name value pair that is compatible with Tailwind CSS. + + # Inputs + + `groupName` + + : 1\. Name of the parent color group + + `member` + + : 2\. The color + + # Type + + mapColorToTailwind :: + String -> + { name :: String; tints :: Maybe Attrset; value :: [Number]; } -> + { name :: String; value :: { DEFAULT :: String; Maybe XX :: String}; } + + # Examples + :::{.example} + ## `mapColorToTailwind` usage example + + ```nix + mapColorToTailwind "accent" { + name = "Italian Violet"; + tints = { + L15 = [ 0.15 0.03 288 ]; + L55 = [ 0.55 0.11 288 ]; + L95 = [ 0.95 0.02 288 ]; + }; + value = [ 0.75 0.12 288 ]; + } + => { + "name": "accent-italian-violet", + "value": { + "15": "oklch(0.150000 0.030000 288)", + "55": "oklch(0.550000 0.110000 288)", + "95": "oklch(0.950000 0.020000 288)", + "DEFAULT": "oklch(0.750000 0.120000 288)" + } + } + + mapColorToTailwind "rainbow" { + "name": "red", + "value": [ 0.51, 0.208963, 29.2339 ] + } + => { + "name": "rainbow-red", + "value": { + "DEFAULT": "oklch(0.510000 0.208963 29.233900)" + } + } + ``` + + ::: + */ + mapColorToTailwind = + groupName: member: + nameValuePair + (toKebab [ + groupName + member.name + ]) + ( + { + DEFAULT = oklchToTailwind member.value; + } + // (mapTintsToTailwind member) + ); + + /** + Convert a palette group to a structure suitable for Tailwind. + + Examples + :::{.example} + ## `mapPaletteGroup` usage example + + ```nix + mapPaletteGroup { + "primary": [ + { + "name": "Black", + "tints": { + "L15": [ 0.15, 0, 0 ], + "L55": [ 0.55, 0, 0 ], + "L95": [ 0.95, 0, 0 ] + }, + "value": [ 0, 0, 0 ] + }, + { + "name": "White", + "tints": { + "L15": [ 0.15, 0, 0 ], + "L55": [ 0.55, 0, 0 ], + "L95": [ 0.95, 0, 0 ] + }, + "value": [ 1, 0, 0 ] + } + ] + } + => { + "primary": { + "primary-black": { + "15": "oklch(0.150000 0 0)", + "55": "oklch(0.550000 0 0)", + "95": "oklch(0.950000 0 0)", + "DEFAULT": "oklch(0 0 0)" + }, + "primary-white": { + "15": "oklch(0.150000 0 0)", + "55": "oklch(0.550000 0 0)", + "95": "oklch(0.950000 0 0)", + "DEFAULT": "oklch(1 0 0)" + } + } + } + ``` + + ::: + */ + mapPaletteGroup = mapAttrs ( + groupName: groupValue: listToAttrs (map (mapColorToTailwind groupName) groupValue) ); + /** + Convert multiple palette groups to structures suitable for Tailwind. + */ + mapPaletteGroups = + colors: + concatMap ( + flip pipe [ + (flip getAttr colors) + mapPaletteGroup + attrValues + ] + ); + + /** + Convert the palette to a structure suitable for Tailwind. + */ + mapPalette = + colors: groups: + let + data = foldl' (acc: elem: acc // elem) { } (mapPaletteGroups colors groups); + in + "export default ${toJSON data}"; + # sources colorsPath = ../nixos-color-palette; colorsFile = colorsPath + "/colors.toml"; colorsData = importTOML colorsFile; + tailwindContent = mapPalette colorsData [ + "logos" + "palette" + ]; + in stdenvNoCC.mkDerivation { @@ -94,7 +340,7 @@ stdenvNoCC.mkDerivation { mkdir $out cat > $out/tailwind.js < Date: Sun, 23 Nov 2025 20:23:15 -0800 Subject: [PATCH 3/7] nixos-branding.npm-package: update npm metadata for publishing --- .../top-level/nixos-branding/npm-package/package.nix | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package-sets/top-level/nixos-branding/npm-package/package.nix b/package-sets/top-level/nixos-branding/npm-package/package.nix index 95e3f4d..609c82b 100644 --- a/package-sets/top-level/nixos-branding/npm-package/package.nix +++ b/package-sets/top-level/nixos-branding/npm-package/package.nix @@ -40,22 +40,22 @@ let ; npmPackageMetadata = { - name = "@NixOS/branding"; + name = "@nixos/branding"; version = trim (readFile ./../nixos-branding-guide/data/version); - description = "Branding assets for the NixOS organization"; + description = "Branding assets for the NixOS project."; main = "index.js"; repository = { type = "git"; url = "https://github.com/NixOS/branding.git"; }; - author = "The NixOS Community"; - license = "ISC"; + author = "NixOS Marketing Team"; + license = "CC-BY-4.0"; bugs = { url = "https://github.com/NixOS/branding/issues"; }; homepage = "https://nixos.org"; publishConfig = { - registry = "https://npm.pkg.github.com/"; + registry = "https://registry.npmjs.org"; }; keywords = [ "nixos" From 9391ad508aebd289fb6a70eac8faf82dc6222236 Mon Sep 17 00:00:00 2001 From: Daniel Baker Date: Sun, 23 Nov 2025 20:24:14 -0800 Subject: [PATCH 4/7] nixos-branding.npm-package: improve derivation arguments --- .../top-level/nixos-branding/npm-package/package.nix | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package-sets/top-level/nixos-branding/npm-package/package.nix b/package-sets/top-level/nixos-branding/npm-package/package.nix index 609c82b..db05ca5 100644 --- a/package-sets/top-level/nixos-branding/npm-package/package.nix +++ b/package-sets/top-level/nixos-branding/npm-package/package.nix @@ -102,12 +102,14 @@ let in stdenvNoCC.mkDerivation { - pname = "npm-package"; + + pname = baseNameOf ./.; version = trim (readFile ./../nixos-branding-guide/data/version); - src = ./.; + src = ""; runLocal = true; + dontUnpack = true; dontPatch = true; dontConfigure = true; dontBuild = true; From 0ff7230254589567f195f632be28fff340e29341 Mon Sep 17 00:00:00 2001 From: Daniel Baker Date: Sun, 23 Nov 2025 20:33:13 -0800 Subject: [PATCH 5/7] nixos-branding.npm-package: use the color palette tailwind package --- .../nixos-branding/npm-package/package.nix | 67 ++----------------- 1 file changed, 4 insertions(+), 63 deletions(-) diff --git a/package-sets/top-level/nixos-branding/npm-package/package.nix b/package-sets/top-level/nixos-branding/npm-package/package.nix index db05ca5..8437612 100644 --- a/package-sets/top-level/nixos-branding/npm-package/package.nix +++ b/package-sets/top-level/nixos-branding/npm-package/package.nix @@ -1,44 +1,19 @@ { all-artifacts, lib, - nixos-color-palette, + nixos-color-palette-tailwind, nodePackages, stdenvNoCC, }: let - inherit (builtins) - foldl' - toString - ; - - inherit (lib.attrsets) - attrValues - listToAttrs - mapAttrs - mapAttrs' - nameValuePair - ; - - inherit (lib.lists) - map - ; - inherit (lib.strings) - concatMapStringsSep readFile - replaceStrings - substring toJSON - toLower trim ; - inherit (lib.trivial) - importTOML - ; - npmPackageMetadata = { name = "@nixos/branding"; version = trim (readFile ./../nixos-branding-guide/data/version); @@ -69,36 +44,6 @@ let ]; }; - toKebapCase = x: toLower (replaceStrings [ " " ] [ "-" ] x); - - arrToOklch = arr: "oklch(${concatMapStringsSep " " toString arr})"; - - colorsFile = importTOML ../nixos-color-palette/colors.toml; - - mapPalettes = mapAttrs ( - paletteGroupName: paletteGroupValue: - listToAttrs ( - map ( - member: - let - mappedTints = mapAttrs' ( - shadeName: shadeValue: nameValuePair (substring 1 2 shadeName) (arrToOklch shadeValue) - ) member.tints or { }; - in - nameValuePair (toKebapCase "${paletteGroupName} ${member.name}") ( - { - DEFAULT = arrToOklch member.value; - } - // mappedTints - ) - ) paletteGroupValue - ) - - ); - colors = foldl' (acc: elem: acc // elem) { } ( - (attrValues (mapPalettes colorsFile.logos)) ++ (attrValues (mapPalettes colorsFile.palette)) - ); - in stdenvNoCC.mkDerivation { @@ -116,19 +61,15 @@ stdenvNoCC.mkDerivation { dontFixup = true; installPhase = '' - mkdir -p $out/colors + mkdir -p $out/{colors,artifacts} + cat > $out/package.json < $out/colors/tailwind.js < $out/.npmrc < Date: Sun, 23 Nov 2025 20:33:49 -0800 Subject: [PATCH 6/7] nixos-branding.npm-package: remove .npmrc file This file is no longer needed for publishing to npm.js with OIDC. --- .../top-level/nixos-branding/npm-package/package.nix | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package-sets/top-level/nixos-branding/npm-package/package.nix b/package-sets/top-level/nixos-branding/npm-package/package.nix index 8437612..105494b 100644 --- a/package-sets/top-level/nixos-branding/npm-package/package.nix +++ b/package-sets/top-level/nixos-branding/npm-package/package.nix @@ -70,10 +70,5 @@ stdenvNoCC.mkDerivation { cp -RL -r ${all-artifacts}/* $out/artifacts/ cp ${nixos-color-palette-tailwind}/tailwind.js $out/colors/tailwind.js - - cat > $out/.npmrc < Date: Sun, 23 Nov 2025 20:48:20 -0800 Subject: [PATCH 7/7] .github/workflows/release-npm-package: update for npm.js via OIDC --- .github/workflows/release-npm-package.yaml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release-npm-package.yaml b/.github/workflows/release-npm-package.yaml index fedd753..b7d6d24 100644 --- a/.github/workflows/release-npm-package.yaml +++ b/.github/workflows/release-npm-package.yaml @@ -5,19 +5,19 @@ on: workflow_call: workflow_dispatch: +permissions: + id-token: write # Required for OIDC + contents: read + jobs: build-npm-package: runs-on: ubuntu-latest - permissions: - contents: read - packages: write steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v4 with: node-version: "latest" - registry-url: "https://npm.pkg.github.com" - scope: "@octocat" + registry-url: "https://registry.npmjs.org" - name: Install Nix uses: cachix/install-nix-action@v31 - name: Build npm package @@ -30,5 +30,3 @@ jobs: - name: Publish npm package run: npm publish working-directory: ./build - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}