@kongyo2/cards-css 0.1.0 → 0.2.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.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # cards-css
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/@kongyo2/cards-css.svg)](https://www.npmjs.com/package/@kongyo2/cards-css)
4
- [![license](https://img.shields.io/npm/l/@kongyo2/cards-css.svg)](./LICENSE)
4
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/kongyo2/cards-css)
5
5
 
6
6
  Framework-agnostic holographic trading-card effect — tilt, shine, glare and four
7
7
  foils (`holo` / `reverse` / `cosmos` / `glitter`) that react to pointer and
@@ -60,11 +60,42 @@ Set via the `effect` option (or `card.setEffect(...)` at runtime):
60
60
  | `interactive` | `boolean` | `true` | React to pointer move |
61
61
  | `activateOnClick` | `boolean` | `false` | Click to pop the card into a centered showcase |
62
62
  | `gyroscope` | `boolean` | `true` | Tilt to device orientation while active |
63
- | `showcase` | `boolean` | `false` | Auto-animate once on mount |
63
+ | `showcase` | `boolean \| ShowcaseOptions` | `false` | Auto-animate once on mount; pass an object to tune `delay` / `duration` / `loop` / `speed` / `intensity` / `spring` |
64
64
  | `glow` | `string` | — | CSS color for the card glow |
65
65
  | `aspectRatio` | `number` | — | Card aspect ratio (width / height) |
66
66
  | `textureSeed` | `number` | — | Seed for the generated `cosmos` / `glitter` textures; without it those two foils render without their procedural layers |
67
- | `mask` / `foil` | `string` | — | URLs for a mask / custom foil overlay |
67
+ | `mask` | `string \| MaskOptions` | — | Mask URL, or `{ image, size, position, repeat, mode }` — `mode: "card"` clips the whole card into the mask silhouette |
68
+ | `foil` | `string` | — | URL for a custom foil overlay |
69
+ | `physics` | `PhysicsOptions` | — | Interaction tuning: `maxTilt` / `maxTiltX` / `maxTiltY`, `parallax`, `glareRange`, `returnDelay`, and per-target spring tuning (`interactSpring` / `popoverSpring` / `snapSpring` / `springs`) |
70
+ | `visual` | `VisualOptions` | — | Foil multipliers (`brightness` / `contrast` / `saturate` / `glareOpacity` / `shineOpacity`) and `lineSpace` / `lineAngle` / `glitterSize` / `imageFit` |
71
+ | `layers` | `HoloLayerOptions[]` | — | Extra stacked layers between artwork and foil, each with `image` / `content`, `blend`, `opacity`, `parallax`, `mask` |
72
+ | `vars` | `Record<string, string \| number>` | — | Arbitrary CSS custom properties on the root, for content linkage |
73
+
74
+ `createHoloCard` additionally accepts `content` and `overlay` (a `Node` or
75
+ `(doc) => Node`) for free-form front and foreground content — name plates,
76
+ badges, live data — plus `overlayInteractive` to let the overlay receive
77
+ pointer events.
78
+
79
+ ### Asymmetric springs
80
+
81
+ Every spring tuning accepts an `axes` map for independent per-component physics,
82
+ so a card can snap horizontally while easing vertically:
83
+
84
+ ```js
85
+ createHoloCard({
86
+ image: "/cards/phoenix.png",
87
+ effect: "holo",
88
+ physics: { springs: { rotate: { axes: { x: { stiffness: 0.12 }, y: { stiffness: 0.04 } } } } },
89
+ });
90
+ ```
91
+
92
+ ### Content linkage
93
+
94
+ While interacting, the card publishes its state as CSS custom properties on the
95
+ root — `--pointer-x`, `--pointer-y`, `--pointer-dx` / `--pointer-dy` (signed,
96
+ −1…1), `--tilt-x` / `--tilt-y` (degrees), `--pointer-from-center` and
97
+ `--card-active` — so custom `content` / `overlay` / `layers` can parallax, glow
98
+ or react in lockstep with the foil.
68
99
 
69
100
  ## API
70
101
 
@@ -73,8 +104,11 @@ Set via the `effect` option (or `card.setEffect(...)` at runtime):
73
104
  - `HoloCard`
74
105
  - `element` — the root `HTMLElement` to mount.
75
106
  - `active` / `interacting` — state getters.
107
+ - `front` — the `.holo-card__front` element (or `null`), for appending content.
76
108
  - `activate()` / `deactivate()` — pop the card in / out of showcase.
77
109
  - `setEffect(effect)` — swap the foil at runtime.
110
+ - `setVisual(visual)` / `setVars(vars)` — update visual controls / CSS variables at runtime.
111
+ - `addLayer(options)` — insert an extra layer between artwork and foil, returns the element.
78
112
  - `destroy()` — remove listeners and reset the element.
79
113
 
80
114
  On iOS, gyroscope access needs a one-time permission prompt triggered by a user
package/dist/dom.js CHANGED
@@ -5,6 +5,10 @@ export const CLASS = {
5
5
  front: "holo-card__front",
6
6
  back: "holo-card__back",
7
7
  image: "holo-card__image",
8
+ content: "holo-card__content",
9
+ layers: "holo-card__layers",
10
+ layer: "holo-card__layer",
11
+ overlay: "holo-card__overlay",
8
12
  shine: "holo-card__shine",
9
13
  glare: "holo-card__glare",
10
14
  interactive: "holo-card--interactive",
@@ -12,6 +16,8 @@ export const CLASS = {
12
16
  interacting: "holo-card--interacting",
13
17
  loading: "holo-card--loading",
14
18
  masked: "holo-card--masked",
19
+ maskCard: "holo-card--mask-card",
20
+ overlayInteractive: "holo-card__overlay--interactive",
15
21
  };
16
22
  const requireDocument = () => {
17
23
  if (typeof document === "undefined") {
@@ -19,18 +25,80 @@ const requireDocument = () => {
19
25
  }
20
26
  return document;
21
27
  };
28
+ export const applyVars = (element, vars) => {
29
+ if (!vars) {
30
+ return;
31
+ }
32
+ for (const [name, value] of Object.entries(vars)) {
33
+ const property = name.startsWith("--") ? name : `--${name}`;
34
+ element.style.setProperty(property, typeof value === "number" ? String(value) : value);
35
+ }
36
+ };
37
+ export const normalizeMask = (mask) => {
38
+ if (!mask) {
39
+ return null;
40
+ }
41
+ const opts = typeof mask === "string" ? { image: mask } : mask;
42
+ if (!opts.image) {
43
+ return null;
44
+ }
45
+ return {
46
+ image: opts.image,
47
+ size: opts.size,
48
+ position: opts.position,
49
+ repeat: opts.repeat,
50
+ mode: opts.mode ?? "shine",
51
+ };
52
+ };
53
+ const addClasses = (element, className) => {
54
+ if (!className) {
55
+ return;
56
+ }
57
+ for (const name of className.split(/\s+/).filter(Boolean)) {
58
+ element.classList.add(name);
59
+ }
60
+ };
61
+ const resolveContent = (doc, content) => typeof content === "function" ? content(doc) : content;
62
+ export const buildLayerElement = (doc, layer) => {
63
+ const el = doc.createElement("div");
64
+ el.className = CLASS.layer;
65
+ addClasses(el, layer.className);
66
+ if (typeof layer.blend === "string") {
67
+ el.style.setProperty("--layer-blend", layer.blend);
68
+ }
69
+ if (typeof layer.opacity === "number") {
70
+ el.style.setProperty("--layer-opacity", String(layer.opacity));
71
+ }
72
+ if (typeof layer.parallax === "number") {
73
+ el.style.setProperty("--layer-parallax", String(layer.parallax));
74
+ }
75
+ if (layer.mask) {
76
+ el.style.setProperty("--layer-mask", `url(${layer.mask})`);
77
+ el.classList.add(`${CLASS.layer}--masked`);
78
+ }
79
+ if (layer.image) {
80
+ el.style.setProperty("--layer-image", `url(${layer.image})`);
81
+ el.style.setProperty("--layer-size", layer.size ?? "cover");
82
+ el.style.setProperty("--layer-position", layer.position ?? "center");
83
+ }
84
+ applyVars(el, layer.vars);
85
+ if (layer.content) {
86
+ el.appendChild(resolveContent(doc, layer.content));
87
+ }
88
+ return el;
89
+ };
22
90
  export const buildHoloCardElement = (options) => {
23
91
  const doc = requireDocument();
24
92
  const root = doc.createElement("div");
25
93
  root.className = CLASS.root;
26
- if (options.className) {
27
- for (const name of options.className.split(/\s+/).filter(Boolean)) {
28
- root.classList.add(name);
29
- }
30
- }
94
+ addClasses(root, options.className);
31
95
  root.dataset.effect = options.effect ?? "none";
32
- if (options.mask) {
96
+ const mask = normalizeMask(options.mask);
97
+ if (mask) {
33
98
  root.classList.add(CLASS.masked);
99
+ if (mask.mode === "card") {
100
+ root.classList.add(CLASS.maskCard);
101
+ }
34
102
  }
35
103
  const translater = doc.createElement("div");
36
104
  translater.className = CLASS.translater;
@@ -46,18 +114,43 @@ export const buildHoloCardElement = (options) => {
46
114
  }
47
115
  const front = doc.createElement("div");
48
116
  front.className = CLASS.front;
49
- const image = doc.createElement("img");
50
- image.className = CLASS.image;
51
- image.src = options.image;
52
- image.alt = options.imageAlt ?? "";
53
- image.loading = "lazy";
54
- front.appendChild(image);
117
+ if (options.image) {
118
+ const image = doc.createElement("img");
119
+ image.className = CLASS.image;
120
+ image.src = options.image;
121
+ image.alt = options.imageAlt ?? "";
122
+ image.loading = "lazy";
123
+ front.appendChild(image);
124
+ }
125
+ if (options.content) {
126
+ const content = doc.createElement("div");
127
+ content.className = CLASS.content;
128
+ content.appendChild(resolveContent(doc, options.content));
129
+ front.appendChild(content);
130
+ }
131
+ if (options.layers?.length) {
132
+ const layers = doc.createElement("div");
133
+ layers.className = CLASS.layers;
134
+ for (const layer of options.layers) {
135
+ layers.appendChild(buildLayerElement(doc, layer));
136
+ }
137
+ front.appendChild(layers);
138
+ }
55
139
  const shine = doc.createElement("div");
56
140
  shine.className = CLASS.shine;
57
141
  const glare = doc.createElement("div");
58
142
  glare.className = CLASS.glare;
59
143
  front.appendChild(shine);
60
144
  front.appendChild(glare);
145
+ if (options.overlay) {
146
+ const overlay = doc.createElement("div");
147
+ overlay.className = CLASS.overlay;
148
+ if (options.overlayInteractive) {
149
+ overlay.classList.add(CLASS.overlayInteractive);
150
+ }
151
+ overlay.appendChild(resolveContent(doc, options.overlay));
152
+ front.appendChild(overlay);
153
+ }
61
154
  rotator.appendChild(front);
62
155
  translater.appendChild(rotator);
63
156
  root.appendChild(translater);
package/dist/dom.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}