Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions plugins/postcss-custom-functions/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changes to PostCSS Custom Functions

### Unreleased (patch)

- Drop `node:path` and `node:crypto` dependencies

### 1.0.0

_October 1, 2026_
Expand Down
28 changes: 14 additions & 14 deletions plugins/postcss-custom-functions/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,14 @@ html {

html {
--gap: 1em;
--_csstools-cf-1agle9gi-1-arg-0: var(--gap);
--_csstools-cf-1agle9gi-0-result: calc(-1 * var(--_csstools-cf-1agle9gi-1-arg-0));
padding: var(--_csstools-cf-1agle9gi-0-result);
--_csstools-cf-1agle9gi-3-arg-0: 4px;
--_csstools-cf-1agle9gi-2-result: calc(2 * var(--_csstools-cf-1agle9gi-3-arg-0));
margin: var(--_csstools-cf-1agle9gi-2-result);
--_csstools-cf-1gice1e-1-arg-0: var(--gap);
--_csstools-cf-1gice1e-0-result: calc(-1 * var(--_csstools-cf-1gice1e-1-arg-0));
padding: var(--_csstools-cf-1gice1e-0-result);
--_csstools-cf-1gice1e-3-arg-0: 4px;
--_csstools-cf-1gice1e-2-result: calc(2 * var(--_csstools-cf-1gice1e-3-arg-0));
margin: var(--_csstools-cf-1gice1e-2-result);
}
@property --_csstools-cf-1agle9gi-3-arg-0 {
@property --_csstools-cf-1gice1e-3-arg-0 {
syntax: "<length>";
inherits: false;
initial-value: 1px;
Expand Down Expand Up @@ -138,17 +138,17 @@ html {

html {
--gap: 1em;
--_csstools-cf-1agle9gi-1-arg-0: var(--gap);
--_csstools-cf-1agle9gi-0-result: calc(-1 * var(--_csstools-cf-1agle9gi-1-arg-0));
padding: var(--_csstools-cf-1agle9gi-0-result);
--_csstools-cf-1gice1e-1-arg-0: var(--gap);
--_csstools-cf-1gice1e-0-result: calc(-1 * var(--_csstools-cf-1gice1e-1-arg-0));
padding: var(--_csstools-cf-1gice1e-0-result);
padding: --negative(var(--gap));
--_csstools-cf-1agle9gi-3-arg-0: 4px;
--_csstools-cf-1agle9gi-2-result: calc(2 * var(--_csstools-cf-1agle9gi-3-arg-0));
margin: var(--_csstools-cf-1agle9gi-2-result);
--_csstools-cf-1gice1e-3-arg-0: 4px;
--_csstools-cf-1gice1e-2-result: calc(2 * var(--_csstools-cf-1gice1e-3-arg-0));
margin: var(--_csstools-cf-1gice1e-2-result);
margin: --double(4px);
}

@property --_csstools-cf-1agle9gi-3-arg-0 {
@property --_csstools-cf-1gice1e-3-arg-0 {
syntax: "<length>";
inherits: false;
initial-value: 1px;
Expand Down
2 changes: 1 addition & 1 deletion plugins/postcss-custom-functions/dist/index.mjs

Large diffs are not rendered by default.

38 changes: 32 additions & 6 deletions plugins/postcss-custom-functions/src/generated-names.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import crypto from 'node:crypto';
import path from 'node:path';

/**
* Prefix for every custom property this plugin generates.
*
Expand Down Expand Up @@ -40,14 +37,43 @@ export function sourceHashFor(from: string | undefined): string {
return existing;
}

const hash = crypto.createHash('md5');
hash.update(path.basename(path.dirname(from)) + '/' + path.basename(from), 'utf8');
const value = parseInt(hash.digest('hex'), 16).toString(36).slice(0, 8);
const value = hashSourcePath(from);
sourceHashes.set(from, value);

return value;
}

/**
* Hash only the last two path segments, so that names are stable regardless
* of the absolute location of a project, and avoid `node:crypto` / `node:path`
* so that this plugin can run in a browser bundle.
*/
function hashSourcePath(from: string): string {
let hash = 2166136261;
const source = sourceKey(from);

for (let i = 0; i < source.length; i++) {
hash ^= source.charCodeAt(i);
hash = Math.imul(hash, 16777619);
}

return (hash >>> 0).toString(36);
}

function sourceKey(from: string): string {
const segments = from.replaceAll('\\', '/').split('/').filter((segment) => segment.length > 0);

if (segments.length === 0) {
return '.';
}

if (segments.length === 1) {
return `./${segments[0]}`;
}

return segments.slice(-2).join('/');
}

/**
* Builds the custom property names emitted for a single source file.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
/* Every anonymous layer is its own layer and must not collapse into a single layer. */

.anon {
--_csstools-cf-3ynakb2p-0-result: 1px;
--_csstools-cf-1k7kax1-0-result: 1px;
}

.anon {
--_csstools-cf-3ynakb2p-0-result: 2px;
--_csstools-cf-1k7kax1-0-result: 2px;
}

.anon {
--_csstools-cf-3ynakb2p-0-result: 3px;
--_csstools-cf-1k7kax1-0-result: 3px;
}

.anon {
--_csstools-cf-3ynakb2p-0-result: 4px;
--_csstools-cf-1k7kax1-0-result: 4px;
}

.anon {
width: var(--_csstools-cf-3ynakb2p-0-result);
width: var(--_csstools-cf-1k7kax1-0-result);
}
20 changes: 10 additions & 10 deletions plugins/postcss-custom-functions/test/basic.expect.css
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
.negative-a {
--gap: 1em;
--_csstools-cf-86hq2t3p-1-arg-0: var(--gap);
--_csstools-cf-86hq2t3p-0-result: calc(-1 * var(--_csstools-cf-86hq2t3p-1-arg-0));
padding: var(--_csstools-cf-86hq2t3p-0-result);
--_csstools-cf-wv7kid-1-arg-0: var(--gap);
--_csstools-cf-wv7kid-0-result: calc(-1 * var(--_csstools-cf-wv7kid-1-arg-0));
padding: var(--_csstools-cf-wv7kid-0-result);
}

.negative-b {
--_csstools-cf-86hq2t3p-3-arg-0: 1em;
--_csstools-cf-86hq2t3p-2-result: calc(-1 * var(--_csstools-cf-86hq2t3p-3-arg-0));
padding: var(--_csstools-cf-86hq2t3p-2-result);
--_csstools-cf-wv7kid-3-arg-0: 1em;
--_csstools-cf-wv7kid-2-result: calc(-1 * var(--_csstools-cf-wv7kid-3-arg-0));
padding: var(--_csstools-cf-wv7kid-2-result);
}

.circle {
--_csstools-cf-86hq2t3p-5-arg-0: 2px;
--_csstools-cf-86hq2t3p-5-local-r2: calc(var(--_csstools-cf-86hq2t3p-5-arg-0) * var(--_csstools-cf-86hq2t3p-5-arg-0));
--_csstools-cf-86hq2t3p-4-result: calc(3.14159 * var(--_csstools-cf-86hq2t3p-5-local-r2));
width: var(--_csstools-cf-86hq2t3p-4-result);
--_csstools-cf-wv7kid-5-arg-0: 2px;
--_csstools-cf-wv7kid-5-local-r2: calc(var(--_csstools-cf-wv7kid-5-arg-0) * var(--_csstools-cf-wv7kid-5-arg-0));
--_csstools-cf-wv7kid-4-result: calc(3.14159 * var(--_csstools-cf-wv7kid-5-local-r2));
width: var(--_csstools-cf-wv7kid-4-result);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@

.negative-a {
--gap: 1em;
--_csstools-cf-86hq2t3p-1-arg-0: var(--gap);
--_csstools-cf-86hq2t3p-0-result: calc(-1 * var(--_csstools-cf-86hq2t3p-1-arg-0));
padding: var(--_csstools-cf-86hq2t3p-0-result);
--_csstools-cf-wv7kid-1-arg-0: var(--gap);
--_csstools-cf-wv7kid-0-result: calc(-1 * var(--_csstools-cf-wv7kid-1-arg-0));
padding: var(--_csstools-cf-wv7kid-0-result);
padding: --negative(var(--gap));
}

.negative-b {
--_csstools-cf-86hq2t3p-3-arg-0: 1em;
--_csstools-cf-86hq2t3p-2-result: calc(-1 * var(--_csstools-cf-86hq2t3p-3-arg-0));
padding: var(--_csstools-cf-86hq2t3p-2-result);
--_csstools-cf-wv7kid-3-arg-0: 1em;
--_csstools-cf-wv7kid-2-result: calc(-1 * var(--_csstools-cf-wv7kid-3-arg-0));
padding: var(--_csstools-cf-wv7kid-2-result);
padding: --negative(1em);
}

Expand All @@ -23,9 +23,9 @@
}

.circle {
--_csstools-cf-86hq2t3p-5-arg-0: 2px;
--_csstools-cf-86hq2t3p-5-local-r2: calc(var(--_csstools-cf-86hq2t3p-5-arg-0) * var(--_csstools-cf-86hq2t3p-5-arg-0));
--_csstools-cf-86hq2t3p-4-result: calc(3.14159 * var(--_csstools-cf-86hq2t3p-5-local-r2));
width: var(--_csstools-cf-86hq2t3p-4-result);
--_csstools-cf-wv7kid-5-arg-0: 2px;
--_csstools-cf-wv7kid-5-local-r2: calc(var(--_csstools-cf-wv7kid-5-arg-0) * var(--_csstools-cf-wv7kid-5-arg-0));
--_csstools-cf-wv7kid-4-result: calc(3.14159 * var(--_csstools-cf-wv7kid-5-local-r2));
width: var(--_csstools-cf-wv7kid-4-result);
width: --circle-area(2px);
}
10 changes: 5 additions & 5 deletions plugins/postcss-custom-functions/test/classification.expect.css
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
/* `type(*)` is the universal syntax and counts as untyped. */

.universal {
--_csstools-cf-eru3g4zo-1-arg-0: var(--_csstools-cf-eru3g4zo-1-raw-0, 1px);
--_csstools-cf-eru3g4zo-0-result: var(--_csstools-cf-eru3g4zo-1-arg-0);
width: var(--_csstools-cf-eru3g4zo-0-result);
--_csstools-cf-77lo8z-1-arg-0: var(--_csstools-cf-77lo8z-1-raw-0, 1px);
--_csstools-cf-77lo8z-0-result: var(--_csstools-cf-77lo8z-1-arg-0);
width: var(--_csstools-cf-77lo8z-0-result);
}

/* `returns type(*)` is the default return type and counts as no return type. */

.universal-return {
--_csstools-cf-eru3g4zo-2-result: 2px;
width: var(--_csstools-cf-eru3g4zo-2-result);
--_csstools-cf-77lo8z-2-result: 2px;
width: var(--_csstools-cf-77lo8z-2-result);
}

/* A typed parameter with a computationally independent default is supported. */
Expand Down
Original file line number Diff line number Diff line change
@@ -1,45 +1,45 @@
@supports (width: 100px) {.conditional {
--_csstools-cf-7hov6p4v-0-result: PASS;
--_csstools-cf-154dd4k-0-result: PASS;
}
}@supports (not (width: 100px)) {.conditional {
--_csstools-cf-7hov6p4v-0-result: FAIL;
--_csstools-cf-154dd4k-0-result: FAIL;
}
}

.conditional {
width: var(--_csstools-cf-7hov6p4v-0-result);
width: var(--_csstools-cf-154dd4k-0-result);
}

@media (width >= 50px) {

.media {
--_csstools-cf-7hov6p4v-3-result: 50px;
--_csstools-cf-154dd4k-3-result: 50px;
}
}

@media (width >= 100px) {

.media {
--_csstools-cf-7hov6p4v-3-result: 100px;
--_csstools-cf-154dd4k-3-result: 100px;
}
}

.media {
width: var(--_csstools-cf-7hov6p4v-3-result);
width: var(--_csstools-cf-154dd4k-3-result);
}
@media (width >= 50px) {

.layered-media {
--_csstools-cf-7hov6p4v-6-result: 1px;
--_csstools-cf-154dd4k-6-result: 1px;
}
}
@media (width >= 99999px) {

.layered-media {
--_csstools-cf-7hov6p4v-6-result: 2px;
--_csstools-cf-154dd4k-6-result: 2px;
}
}

.layered-media {
width: var(--_csstools-cf-7hov6p4v-6-result);
width: var(--_csstools-cf-154dd4k-6-result);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@
}@supports (width: 100px) {

.conditional {
--_csstools-cf-7hov6p4v-0-result: PASS;
--_csstools-cf-154dd4k-0-result: PASS;
}
}

@supports (not (width: 100px)) {

.conditional {
--_csstools-cf-7hov6p4v-0-result: FAIL;
--_csstools-cf-154dd4k-0-result: FAIL;
}
}

.conditional {
width: var(--_csstools-cf-7hov6p4v-0-result);
width: var(--_csstools-cf-154dd4k-0-result);
width: --f();
}

Expand All @@ -42,19 +42,19 @@
@media (width >= 50px) {

.media {
--_csstools-cf-7hov6p4v-3-result: 50px;
--_csstools-cf-154dd4k-3-result: 50px;
}
}

@media (width >= 100px) {

.media {
--_csstools-cf-7hov6p4v-3-result: 100px;
--_csstools-cf-154dd4k-3-result: 100px;
}
}

.media {
width: var(--_csstools-cf-7hov6p4v-3-result);
width: var(--_csstools-cf-154dd4k-3-result);
width: --g();
}

Expand All @@ -76,17 +76,17 @@
@media (width >= 50px) {

.layered-media {
--_csstools-cf-7hov6p4v-6-result: 1px;
--_csstools-cf-154dd4k-6-result: 1px;
}
}
@media (width >= 99999px) {

.layered-media {
--_csstools-cf-7hov6p4v-6-result: 2px;
--_csstools-cf-154dd4k-6-result: 2px;
}
}

.layered-media {
width: var(--_csstools-cf-7hov6p4v-6-result);
width: var(--_csstools-cf-154dd4k-6-result);
width: --h();
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@
}

.static-keyword {
--_csstools-cf-5a7fouo8-0-result: inherit;
--_csstools-cf-101b7vj-0-result: inherit;
width: inherit;
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,16 @@
@media (min-width: 0px) {

.layered-conditional {
--_csstools-cf-d6h7kjw3-0-result: 20px;
--_csstools-cf-1jusoma-0-result: 20px;
}
}
@media (min-width: 0px) {

.layered-conditional {
--_csstools-cf-d6h7kjw3-0-result: 10px;
--_csstools-cf-1jusoma-0-result: 10px;
}
}

.layered-conditional {
width: var(--_csstools-cf-d6h7kjw3-0-result);
width: var(--_csstools-cf-1jusoma-0-result);
}
Loading
Loading