@kongyo2/cards-css 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.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -0
  3. package/dist/active-registry.js +10 -0
  4. package/dist/active-registry.js.map +1 -0
  5. package/dist/dom.js +66 -0
  6. package/dist/dom.js.map +1 -0
  7. package/dist/holo-card.js +450 -0
  8. package/dist/holo-card.js.map +1 -0
  9. package/dist/holo-cards.css +601 -0
  10. package/dist/index.js +15 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/math.js +4 -0
  13. package/dist/math.js.map +1 -0
  14. package/dist/orientation.js +64 -0
  15. package/dist/orientation.js.map +1 -0
  16. package/dist/spring.js +123 -0
  17. package/dist/spring.js.map +1 -0
  18. package/dist/subscribers.js +26 -0
  19. package/dist/subscribers.js.map +1 -0
  20. package/dist/textures.js +178 -0
  21. package/dist/textures.js.map +1 -0
  22. package/dist/ticker.js +32 -0
  23. package/dist/ticker.js.map +1 -0
  24. package/dist/types.js +2 -0
  25. package/dist/types.js.map +1 -0
  26. package/dist-types/active-registry.d.ts +6 -0
  27. package/dist-types/active-registry.d.ts.map +1 -0
  28. package/dist-types/dom.d.ts +18 -0
  29. package/dist-types/dom.d.ts.map +1 -0
  30. package/dist-types/holo-card.d.ts +58 -0
  31. package/dist-types/holo-card.d.ts.map +1 -0
  32. package/dist-types/index.d.ts +13 -0
  33. package/dist-types/index.d.ts.map +1 -0
  34. package/dist-types/math.d.ts +4 -0
  35. package/dist-types/math.d.ts.map +1 -0
  36. package/dist-types/orientation.d.ts +13 -0
  37. package/dist-types/orientation.d.ts.map +1 -0
  38. package/dist-types/spring.d.ts +32 -0
  39. package/dist-types/spring.d.ts.map +1 -0
  40. package/dist-types/subscribers.d.ts +10 -0
  41. package/dist-types/subscribers.d.ts.map +1 -0
  42. package/dist-types/textures.d.ts +23 -0
  43. package/dist-types/textures.d.ts.map +1 -0
  44. package/dist-types/ticker.d.ts +7 -0
  45. package/dist-types/ticker.d.ts.map +1 -0
  46. package/dist-types/types.d.ts +21 -0
  47. package/dist-types/types.d.ts.map +1 -0
  48. package/package.json +75 -0
  49. package/src/active-registry.ts +15 -0
  50. package/src/dom.ts +79 -0
  51. package/src/holo-card.ts +525 -0
  52. package/src/index.ts +35 -0
  53. package/src/math.ts +6 -0
  54. package/src/orientation.ts +83 -0
  55. package/src/spring.ts +158 -0
  56. package/src/styles/base.css +262 -0
  57. package/src/styles/effects/cosmos.css +143 -0
  58. package/src/styles/effects/glitter.css +103 -0
  59. package/src/styles/effects/holo.css +127 -0
  60. package/src/styles/effects/reverse.css +55 -0
  61. package/src/styles/index.css +5 -0
  62. package/src/subscribers.ts +30 -0
  63. package/src/textures.ts +310 -0
  64. package/src/ticker.ts +46 -0
  65. package/src/types.ts +22 -0
@@ -0,0 +1,32 @@
1
+ export type SpringValue = number | Record<string, number>;
2
+ export interface SpringOpts {
3
+ stiffness?: number;
4
+ damping?: number;
5
+ precision?: number;
6
+ }
7
+ export interface SpringSetOpts {
8
+ hard?: boolean;
9
+ soft?: boolean | number;
10
+ }
11
+ export declare class Spring<T extends SpringValue> {
12
+ stiffness: number;
13
+ damping: number;
14
+ precision: number;
15
+ private value;
16
+ private lastValue;
17
+ private targetValue;
18
+ private invMass;
19
+ private invMassRecoveryRate;
20
+ private cancelTask;
21
+ private task;
22
+ private lastTime;
23
+ private currentToken;
24
+ private readonly subscribers;
25
+ constructor(value: T, opts?: SpringOpts);
26
+ get current(): T;
27
+ subscribe(fn: (value: T) => void): () => void;
28
+ private notify;
29
+ set(newValue: T, opts?: SpringSetOpts): Promise<void>;
30
+ destroy(): void;
31
+ }
32
+ //# sourceMappingURL=spring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring.d.ts","sourceRoot":"","sources":["../src/spring.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACzB;AAwCD,qBAAa,MAAM,CAAC,CAAC,SAAS,WAAW;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwC;gBAExD,KAAK,EAAE,CAAC,EAAE,IAAI,GAAE,UAAe;IAS3C,IAAI,OAAO,IAAI,CAAC,CAEf;IAED,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAI7C,OAAO,CAAC,MAAM;IAId,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4DzD,OAAO,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,10 @@
1
+ export declare class Subscribers<T> {
2
+ private readonly fns;
3
+ private readonly getCurrent;
4
+ constructor(getCurrent: () => T);
5
+ subscribe(fn: (value: T) => void): () => void;
6
+ emit(value: T): void;
7
+ get size(): number;
8
+ clear(): void;
9
+ }
10
+ //# sourceMappingURL=subscribers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../src/subscribers.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW,CAAC,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;gBAEzB,UAAU,EAAE,MAAM,CAAC;IAI/B,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAQ7C,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAMpB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,23 @@
1
+ export interface TextureOptions {
2
+ seed?: number;
3
+ }
4
+ export interface Textures {
5
+ grain: string;
6
+ glitter: string;
7
+ cosmosBottom: string;
8
+ cosmosMiddle: string;
9
+ cosmosTop: string;
10
+ }
11
+ export declare const DEFAULT_TEXTURE_SEED = 2654435769;
12
+ export declare const grainTexture: (seed: number) => string;
13
+ export declare const glitterTexture: (seed: number) => string;
14
+ export declare const generateTextures: (options?: TextureOptions) => Textures;
15
+ export declare const TEXTURE_VARIABLES: {
16
+ readonly grain: "--hc-grain";
17
+ readonly glitter: "--hc-glitter";
18
+ readonly cosmosBottom: "--hc-cosmos-bottom";
19
+ readonly cosmosMiddle: "--hc-cosmos-middle";
20
+ readonly cosmosTop: "--hc-cosmos-top";
21
+ };
22
+ export declare const texturesToCssVariables: (textures: Textures) => Record<string, string>;
23
+ //# sourceMappingURL=textures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textures.d.ts","sourceRoot":"","sources":["../src/textures.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAqK/C,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MAazC,CAAC;AAEJ,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,MAc7C,CAAC;AA8EF,eAAO,MAAM,gBAAgB,GAAI,UAAS,cAAmB,KAAG,QAS/D,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;CAMqB,CAAC;AAEpD,eAAO,MAAM,sBAAsB,GAAI,UAAU,QAAQ,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAMhF,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const now: () => number;
2
+ export interface TaskHandle {
3
+ promise: Promise<void>;
4
+ abort: () => void;
5
+ }
6
+ export declare const loop: (callback: (time: number) => boolean) => TaskHandle;
7
+ //# sourceMappingURL=ticker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticker.d.ts","sourceRoot":"","sources":["../src/ticker.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,GAAG,QAAO,MAA+E,CAAC;AAYvG,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAgBD,eAAO,MAAM,IAAI,GAAI,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,KAAG,UAc1D,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type HoloEffect = "none" | "holo" | "reverse" | "cosmos" | "glitter";
2
+ export interface HoloCardOptions {
3
+ effect?: HoloEffect;
4
+ interactive?: boolean;
5
+ activateOnClick?: boolean;
6
+ gyroscope?: boolean;
7
+ showcase?: boolean;
8
+ glow?: string;
9
+ aspectRatio?: number;
10
+ textureSeed?: number;
11
+ mask?: string;
12
+ foil?: string;
13
+ }
14
+ export interface CreateHoloCardOptions extends HoloCardOptions {
15
+ image: string;
16
+ imageAlt?: string;
17
+ back?: string;
18
+ backAlt?: string;
19
+ className?: string;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@kongyo2/cards-css",
3
+ "version": "0.1.0",
4
+ "description": "Framework-agnostic holographic trading-card effect (tilt, shine, glare, holo / reverse / cosmos / glitter) with procedurally code-generated textures.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "kongyo2",
8
+ "keywords": [
9
+ "holographic",
10
+ "holo",
11
+ "foil",
12
+ "trading-card",
13
+ "card",
14
+ "css",
15
+ "3d",
16
+ "tilt",
17
+ "shine",
18
+ "glare",
19
+ "effect"
20
+ ],
21
+ "homepage": "https://github.com/kongyo2/cards-css#readme",
22
+ "bugs": {
23
+ "url": "https://github.com/kongyo2/cards-css/issues"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/kongyo2/cards-css.git"
28
+ },
29
+ "sideEffects": [
30
+ "*.css"
31
+ ],
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist-types/index.d.ts",
35
+ "import": "./dist/index.js"
36
+ },
37
+ "./styles.css": "./dist/holo-cards.css",
38
+ "./holo-cards.css": "./dist/holo-cards.css"
39
+ },
40
+ "main": "./dist/index.js",
41
+ "module": "./dist/index.js",
42
+ "types": "./dist-types/index.d.ts",
43
+ "files": [
44
+ "dist",
45
+ "dist-types",
46
+ "src"
47
+ ],
48
+ "engines": {
49
+ "node": ">=18"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "scripts": {
55
+ "typecheck": "tsc --noEmit",
56
+ "typecheck:watch": "tsc --noEmit --watch",
57
+ "build:js": "tsc",
58
+ "build:css": "node scripts/build-css.mjs",
59
+ "build": "tsc && node scripts/build-css.mjs",
60
+ "demo": "node scripts/build-demo.mjs",
61
+ "clean": "node -e \"const fs=require('node:fs');for(const p of ['dist','dist-types','tsconfig.tsbuildinfo'])fs.rmSync(p,{recursive:true,force:true})\"",
62
+ "format": "prettier --write .",
63
+ "format:check": "prettier --check .",
64
+ "lint": "oxlint --format agent",
65
+ "lint:fix": "oxlint --fix",
66
+ "lint:strict": "oxlint --deny-warnings",
67
+ "prepare": "npm run build"
68
+ },
69
+ "devDependencies": {
70
+ "esbuild": "^0.25.0",
71
+ "oxlint": "^1.0.0",
72
+ "prettier": "^3.4.0",
73
+ "typescript": "^5.7.0"
74
+ }
75
+ }
@@ -0,0 +1,15 @@
1
+ import { Subscribers } from "./subscribers.js";
2
+
3
+ type ActiveToken = object | null;
4
+
5
+ let activeCard: ActiveToken = null;
6
+ const subscribers = new Subscribers<ActiveToken>(() => activeCard);
7
+
8
+ export const getActiveCard = (): ActiveToken => activeCard;
9
+
10
+ export const setActiveCard = (card: ActiveToken): void => {
11
+ activeCard = card;
12
+ subscribers.emit(activeCard);
13
+ };
14
+
15
+ export const subscribeActiveCard = (fn: (active: ActiveToken) => void): (() => void) => subscribers.subscribe(fn);
package/src/dom.ts ADDED
@@ -0,0 +1,79 @@
1
+ import type { CreateHoloCardOptions } from "./types.js";
2
+
3
+ export const CLASS = {
4
+ root: "holo-card",
5
+ translater: "holo-card__translater",
6
+ rotator: "holo-card__rotator",
7
+ front: "holo-card__front",
8
+ back: "holo-card__back",
9
+ image: "holo-card__image",
10
+ shine: "holo-card__shine",
11
+ glare: "holo-card__glare",
12
+ interactive: "holo-card--interactive",
13
+ active: "holo-card--active",
14
+ interacting: "holo-card--interacting",
15
+ loading: "holo-card--loading",
16
+ masked: "holo-card--masked",
17
+ } as const;
18
+
19
+ const requireDocument = (): Document => {
20
+ if (typeof document === "undefined") {
21
+ throw new Error("@kongyo2/cards-css: a DOM document is required to build a holo card element.");
22
+ }
23
+ return document;
24
+ };
25
+
26
+ export const buildHoloCardElement = (options: CreateHoloCardOptions): HTMLElement => {
27
+ const doc = requireDocument();
28
+
29
+ const root = doc.createElement("div");
30
+ root.className = CLASS.root;
31
+ if (options.className) {
32
+ for (const name of options.className.split(/\s+/).filter(Boolean)) {
33
+ root.classList.add(name);
34
+ }
35
+ }
36
+ root.dataset.effect = options.effect ?? "none";
37
+ if (options.mask) {
38
+ root.classList.add(CLASS.masked);
39
+ }
40
+
41
+ const translater = doc.createElement("div");
42
+ translater.className = CLASS.translater;
43
+
44
+ const rotator = doc.createElement("div");
45
+ rotator.className = CLASS.rotator;
46
+
47
+ if (options.back) {
48
+ const back = doc.createElement("img");
49
+ back.className = CLASS.back;
50
+ back.src = options.back;
51
+ back.alt = options.backAlt ?? "";
52
+ back.loading = "lazy";
53
+ rotator.appendChild(back);
54
+ }
55
+
56
+ const front = doc.createElement("div");
57
+ front.className = CLASS.front;
58
+
59
+ const image = doc.createElement("img");
60
+ image.className = CLASS.image;
61
+ image.src = options.image;
62
+ image.alt = options.imageAlt ?? "";
63
+ image.loading = "lazy";
64
+ front.appendChild(image);
65
+
66
+ const shine = doc.createElement("div");
67
+ shine.className = CLASS.shine;
68
+
69
+ const glare = doc.createElement("div");
70
+ glare.className = CLASS.glare;
71
+
72
+ front.appendChild(shine);
73
+ front.appendChild(glare);
74
+ rotator.appendChild(front);
75
+ translater.appendChild(rotator);
76
+ root.appendChild(translater);
77
+
78
+ return root;
79
+ };