@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 +37 -3
- package/dist/dom.js +105 -12
- package/dist/dom.js.map +1 -1
- package/dist/holo-card.js +265 -42
- package/dist/holo-card.js.map +1 -1
- package/dist/holo-cards.css +94 -17
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/spring.js +20 -6
- package/dist/spring.js.map +1 -1
- package/dist-types/dom.d.ts +17 -1
- package/dist-types/dom.d.ts.map +1 -1
- package/dist-types/holo-card.d.ts +33 -2
- package/dist-types/holo-card.d.ts.map +1 -1
- package/dist-types/index.d.ts +3 -3
- package/dist-types/index.d.ts.map +1 -1
- package/dist-types/spring.d.ts +10 -1
- package/dist-types/spring.d.ts.map +1 -1
- package/dist-types/types.d.ts +147 -4
- package/dist-types/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/dom.ts +127 -13
- package/src/holo-card.ts +326 -47
- package/src/index.ts +15 -3
- package/src/spring.ts +47 -10
- package/src/styles/base.css +93 -4
- package/src/styles/effects/cosmos.css +9 -6
- package/src/styles/effects/glitter.css +4 -2
- package/src/styles/effects/holo.css +3 -2
- package/src/styles/effects/reverse.css +4 -3
- package/src/types.ts +152 -4
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# cards-css
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@kongyo2/cards-css)
|
|
4
|
-
[](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`
|
|
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`
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,uBAAuB;IACnC,OAAO,EAAE,oBAAoB;IAC7B,KAAK,EAAE,kBAAkB;IACzB,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,kBAAkB;IACzB,KAAK,EAAE,kBAAkB;IACzB,KAAK,EAAE,kBAAkB;IACzB,WAAW,EAAE,wBAAwB;IACrC,MAAM,EAAE,mBAAmB;IAC3B,WAAW,EAAE,wBAAwB;IACrC,OAAO,EAAE,oBAAoB;IAC7B,MAAM,EAAE,mBAAmB;
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}
|