@axiom-core/css-bridge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ import type { CssVariableMap } from './types.js';
2
+ export declare function generateCssText(variables: CssVariableMap, selector?: string): string;
@@ -0,0 +1,12 @@
1
+ export function generateCssText(variables, selector = ':root') {
2
+ const keys = Object.keys(variables).sort();
3
+ const parts = [];
4
+ parts.push(`${selector} {`);
5
+ for (const k of keys) {
6
+ const v = variables[k];
7
+ parts.push(` ${k}: ${v};`);
8
+ }
9
+ parts.push('}');
10
+ return parts.join('\n');
11
+ }
12
+ //# sourceMappingURL=css-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-text.js","sourceRoot":"","sources":["../src/css-text.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,SAAyB,EAAE,QAAQ,GAAG,OAAO;IAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ResolvedTheme, CssVariableMap, EmitOptions } from './types.js';
2
+ export declare function emitCssVariables(resolvedTheme: ResolvedTheme, options: EmitOptions): CssVariableMap;
@@ -0,0 +1,26 @@
1
+ import { flattenResolvedTheme } from './flatten.js';
2
+ import { devName, prodName } from './naming.js';
3
+ export function emitCssVariables(resolvedTheme, options) {
4
+ const mode = options.mode;
5
+ const prefix = options.prefix ?? 'ax';
6
+ const scopeId = options.scopeId;
7
+ const flat = flattenResolvedTheme(resolvedTheme);
8
+ const entries = [];
9
+ // iterate sorted paths to ensure deterministic order
10
+ const paths = Object.keys(flat).sort();
11
+ for (const path of paths) {
12
+ const value = flat[path];
13
+ const stringValue = String(value);
14
+ const varName = mode === 'dev'
15
+ ? devName(prefix, path)
16
+ : prodName(prefix, path, stringValue, scopeId);
17
+ entries.push([varName, stringValue]);
18
+ }
19
+ // sort final variable keys alphabetically as required
20
+ entries.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));
21
+ const out = Object.create(null);
22
+ for (const [k, v] of entries)
23
+ out[k] = v;
24
+ return out;
25
+ }
26
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,gBAAgB,CAAC,aAA4B,EAAE,OAAoB;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,MAAM,IAAI,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAEjD,MAAM,OAAO,GAA4B,EAAE,CAAC;IAE5C,qDAAqD;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,KAAK,KAAK;YAC5B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;YACvB,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,sDAAsD;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,MAAM,GAAG,GAAmB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEzC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ResolvedTheme } from './types.js';
2
+ export declare function flattenResolvedTheme(theme: ResolvedTheme): Record<string, string | number>;
@@ -0,0 +1,36 @@
1
+ // Flatten resolved theme to map of dot.path -> primitive (string|number)
2
+ export function flattenResolvedTheme(theme) {
3
+ const out = Object.create(null);
4
+ const root = theme;
5
+ const stack = [];
6
+ if (root && typeof root === 'object') {
7
+ stack.push({ node: root, keys: Object.keys(root).sort(), idx: 0, path: [] });
8
+ }
9
+ while (stack.length) {
10
+ const frame = stack[stack.length - 1];
11
+ if (frame.idx >= frame.keys.length) {
12
+ stack.pop();
13
+ continue;
14
+ }
15
+ const key = frame.keys[frame.idx++];
16
+ const val = frame.node[key];
17
+ const curPath = frame.path.concat(key);
18
+ if (val === null || val === undefined) {
19
+ // skip
20
+ continue;
21
+ }
22
+ if (typeof val === 'string' || typeof val === 'number') {
23
+ out[curPath.join('.')] = val;
24
+ continue;
25
+ }
26
+ if (typeof val === 'object' && !Array.isArray(val)) {
27
+ const child = val;
28
+ const keys = Object.keys(child).sort();
29
+ stack.push({ node: child, keys, idx: 0, path: curPath });
30
+ continue;
31
+ }
32
+ // other types are not expected by contract; ignore defensively
33
+ }
34
+ return out;
35
+ }
36
+ //# sourceMappingURL=flatten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.js","sourceRoot":"","sources":["../src/flatten.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,KAAoB;IACvD,MAAM,GAAG,GAAoC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAKjE,MAAM,IAAI,GAAG,KAA2C,CAAC;IACzD,MAAM,KAAK,GAAY,EAAE,CAAC;IAE1B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,GAAG,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO;YACP,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACvD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,GAA8B,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACzD,SAAS;QACX,CAAC;QAED,+DAA+D;IACjE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/hash.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * FNV-1a 64-bit hash function.
3
+ * Deterministic across platforms using BigInt.
4
+ * Returns 16-character lowercase hexadecimal string (zero-padded).
5
+ */
6
+ export declare function fnv1a(str: string): string;
package/dist/hash.js ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * FNV-1a 64-bit hash function.
3
+ * Deterministic across platforms using BigInt.
4
+ * Returns 16-character lowercase hexadecimal string (zero-padded).
5
+ */
6
+ export function fnv1a(str) {
7
+ let hash = 0xcbf29ce484222325n; // FNV-1a 64-bit offset basis
8
+ const prime = 0x100000001b3n; // FNV-1a 64-bit prime
9
+ for (let i = 0; i < str.length; i++) {
10
+ hash ^= BigInt(str.charCodeAt(i));
11
+ hash = (hash * prime) & 0xffffffffffffffffn; // Mask to 64-bit
12
+ }
13
+ return hash.toString(16).padStart(16, '0'); // Zero-pad to 16 hex digits
14
+ }
15
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,IAAI,IAAI,GAAG,mBAAmB,CAAC,CAAC,6BAA6B;IAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,CAAK,sBAAsB;IAExD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,mBAAmB,CAAC,CAAC,iBAAiB;IAChE,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,4BAA4B;AAC1E,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { type CssBridgeMode, type EmitOptions, type CssVariableMap, type ResolvedTheme } from './types.js';
2
+ export { emitCssVariables } from './emitter.js';
3
+ export { generateCssText } from './css-text.js';
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { emitCssVariables } from './emitter.js';
2
+ export { generateCssText } from './css-text.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function devName(prefix: string, path: string): string;
2
+ export declare function prodName(prefix: string, path: string, value?: string, scopeId?: string): string;
package/dist/naming.js ADDED
@@ -0,0 +1,41 @@
1
+ import { fnv1a } from './hash.js';
2
+ function collapseDashes(s) {
3
+ // Preserve leading -- for CSS variables, only collapse internal sequences
4
+ if (s.startsWith('--')) {
5
+ return '--' + s.slice(2).replace(/-{2,}/g, '-');
6
+ }
7
+ return s.replace(/-{2,}/g, '-');
8
+ }
9
+ function camelToKebab(part) {
10
+ // convert camelCase and PascalCase to kebab-case
11
+ return part
12
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
13
+ .replace(/([A-Z])([A-Z][a-z0-9])/g, '$1-$2')
14
+ .replace(/\./g, '-')
15
+ .replace(/_/g, '-')
16
+ .toLowerCase();
17
+ }
18
+ export function devName(prefix, path) {
19
+ // path: dot-separated (e.g., "typography.body.md.fontSize")
20
+ const parts = path.split('.');
21
+ const kebab = parts.map(camelToKebab).join('-');
22
+ const raw = `--${prefix}-${kebab}`;
23
+ return collapseDashes(raw.toLowerCase());
24
+ }
25
+ export function prodName(prefix, path, value, scopeId) {
26
+ // Canonical deterministic input:
27
+ // scopeId (if present) | tokenPath | value (if present)
28
+ // This ensures identical semantic content produces identical hashes
29
+ // regardless of provider creation order
30
+ const parts = [];
31
+ if (scopeId)
32
+ parts.push(scopeId);
33
+ parts.push(path);
34
+ if (value)
35
+ parts.push(value);
36
+ const canonicalInput = parts.join('|');
37
+ const hash = fnv1a(canonicalInput);
38
+ const raw = `--${prefix}-${hash}`;
39
+ return collapseDashes(raw.toLowerCase());
40
+ }
41
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,SAAS,cAAc,CAAC,CAAS;IAC/B,0EAA0E;IAC1E,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,iDAAiD;IACjD,OAAO,IAAI;SACR,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,yBAAyB,EAAE,OAAO,CAAC;SAC3C,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,IAAY;IAClD,4DAA4D;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC;IACnC,OAAO,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,KAAc,EAAE,OAAgB;IACrF,iCAAiC;IACjC,wDAAwD;IACxD,oEAAoE;IACpE,wCAAwC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE7B,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC;IAClC,OAAO,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ResolvedSemanticTokens } from '@axiom-core/core-engine';
2
+ export type ResolvedTheme = ResolvedSemanticTokens;
3
+ export type CssBridgeMode = 'dev' | 'prod';
4
+ export interface EmitOptions {
5
+ mode: CssBridgeMode;
6
+ prefix?: string;
7
+ scopeId?: string;
8
+ }
9
+ export type CssVariableMap = Record<string, string>;
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@axiom-core/css-bridge",
3
+ "version": "0.1.0",
4
+ "description": "Axiom Core — CSS variable emission bridge",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "sideEffects": false,
13
+ "exports": {
14
+ "./package.json": "./package.json",
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ }
19
+ },
20
+ "license": "MIT",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/Haneefe/Axiom-Core.git"
24
+ },
25
+ "homepage": "https://github.com/Haneefe/Axiom-Core",
26
+ "bugs": {
27
+ "url": "https://github.com/Haneefe/Axiom-Core/issues"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ }
32
+ }