@kongyo2/cards-css 0.1.1 → 0.2.1

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
@@ -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,82 @@ 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
+ const CSS_STRING_UNSAFE = /[\\"\n\r\f]/g;
38
+ export const cssUrl = (value) => `url("${value.replace(CSS_STRING_UNSAFE, (char) => `\\${char}`)}")`;
39
+ export const normalizeMask = (mask) => {
40
+ if (!mask) {
41
+ return null;
42
+ }
43
+ const opts = typeof mask === "string" ? { image: mask } : mask;
44
+ if (!opts.image) {
45
+ return null;
46
+ }
47
+ return {
48
+ image: opts.image,
49
+ size: opts.size,
50
+ position: opts.position,
51
+ repeat: opts.repeat,
52
+ mode: opts.mode ?? "shine",
53
+ };
54
+ };
55
+ const addClasses = (element, className) => {
56
+ if (!className) {
57
+ return;
58
+ }
59
+ for (const name of className.split(/\s+/).filter(Boolean)) {
60
+ element.classList.add(name);
61
+ }
62
+ };
63
+ const resolveContent = (doc, content) => typeof content === "function" ? content(doc) : content;
64
+ export const buildLayerElement = (doc, layer) => {
65
+ const el = doc.createElement("div");
66
+ el.className = CLASS.layer;
67
+ addClasses(el, layer.className);
68
+ if (typeof layer.blend === "string") {
69
+ el.style.setProperty("--layer-blend", layer.blend);
70
+ }
71
+ if (typeof layer.opacity === "number") {
72
+ el.style.setProperty("--layer-opacity", String(layer.opacity));
73
+ }
74
+ if (typeof layer.parallax === "number") {
75
+ el.style.setProperty("--layer-parallax", String(layer.parallax));
76
+ }
77
+ if (layer.mask) {
78
+ el.style.setProperty("--layer-mask", cssUrl(layer.mask));
79
+ el.classList.add(`${CLASS.layer}--masked`);
80
+ }
81
+ if (layer.image) {
82
+ el.style.setProperty("--layer-image", cssUrl(layer.image));
83
+ el.style.setProperty("--layer-size", layer.size ?? "cover");
84
+ el.style.setProperty("--layer-position", layer.position ?? "center");
85
+ }
86
+ applyVars(el, layer.vars);
87
+ if (layer.content) {
88
+ el.appendChild(resolveContent(doc, layer.content));
89
+ }
90
+ return el;
91
+ };
22
92
  export const buildHoloCardElement = (options) => {
23
93
  const doc = requireDocument();
24
94
  const root = doc.createElement("div");
25
95
  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
- }
96
+ addClasses(root, options.className);
31
97
  root.dataset.effect = options.effect ?? "none";
32
- if (options.mask) {
98
+ const mask = normalizeMask(options.mask);
99
+ if (mask) {
33
100
  root.classList.add(CLASS.masked);
101
+ if (mask.mode === "card") {
102
+ root.classList.add(CLASS.maskCard);
103
+ }
34
104
  }
35
105
  const translater = doc.createElement("div");
36
106
  translater.className = CLASS.translater;
@@ -46,18 +116,43 @@ export const buildHoloCardElement = (options) => {
46
116
  }
47
117
  const front = doc.createElement("div");
48
118
  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);
119
+ if (options.image) {
120
+ const image = doc.createElement("img");
121
+ image.className = CLASS.image;
122
+ image.src = options.image;
123
+ image.alt = options.imageAlt ?? "";
124
+ image.loading = "lazy";
125
+ front.appendChild(image);
126
+ }
127
+ if (options.content) {
128
+ const content = doc.createElement("div");
129
+ content.className = CLASS.content;
130
+ content.appendChild(resolveContent(doc, options.content));
131
+ front.appendChild(content);
132
+ }
133
+ if (options.layers?.length) {
134
+ const layers = doc.createElement("div");
135
+ layers.className = CLASS.layers;
136
+ for (const layer of options.layers) {
137
+ layers.appendChild(buildLayerElement(doc, layer));
138
+ }
139
+ front.appendChild(layers);
140
+ }
55
141
  const shine = doc.createElement("div");
56
142
  shine.className = CLASS.shine;
57
143
  const glare = doc.createElement("div");
58
144
  glare.className = CLASS.glare;
59
145
  front.appendChild(shine);
60
146
  front.appendChild(glare);
147
+ if (options.overlay) {
148
+ const overlay = doc.createElement("div");
149
+ overlay.className = CLASS.overlay;
150
+ if (options.overlayInteractive) {
151
+ overlay.classList.add(CLASS.overlayInteractive);
152
+ }
153
+ overlay.appendChild(resolveContent(doc, options.overlay));
154
+ front.appendChild(overlay);
155
+ }
61
156
  rotator.appendChild(front);
62
157
  translater.appendChild(rotator);
63
158
  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;CACnB,CAAC;AAEX,MAAM,eAAe,GAAG,GAAa,EAAE;IACrC,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAA8B,EAAe,EAAE;IAClF,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAE9B,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;IAC5B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IAC/C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;IAExC,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC;IAElC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;IAE9B,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;IAC9B,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACnC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAEzB,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;IAE9B,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;IAE9B,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACzB,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3B,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE7B,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}