@creezio/interactive-demo 0.22.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 +138 -0
- package/dist/content.d.ts +49 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +329 -0
- package/dist/content.js.map +1 -0
- package/dist/contributions.d.ts +48 -0
- package/dist/contributions.d.ts.map +1 -0
- package/dist/contributions.js +87 -0
- package/dist/contributions.js.map +1 -0
- package/dist/generic.d.ts +32 -0
- package/dist/generic.d.ts.map +1 -0
- package/dist/generic.js +116 -0
- package/dist/generic.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +160 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +132 -0
- package/dist/types.js.map +1 -0
- package/dist-cjs/content.js +335 -0
- package/dist-cjs/content.js.map +1 -0
- package/dist-cjs/contributions.js +90 -0
- package/dist-cjs/contributions.js.map +1 -0
- package/dist-cjs/generic.js +120 -0
- package/dist-cjs/generic.js.map +1 -0
- package/dist-cjs/index.js +27 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/types.js +136 -0
- package/dist-cjs/types.js.map +1 -0
- package/package.json +67 -0
- package/ui/demo-player.tsx +563 -0
- package/ui/demo-root.tsx +312 -0
- package/ui/dom.ts +280 -0
- package/ui/fake-cursor.ts +157 -0
- package/ui/index.ts +25 -0
- package/ui/interactive-demo.css +423 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Faux curseur de la démo interactive — curseur visuel animé (Web Animations
|
|
3
|
+
* API) qui se déplace jusqu'à la cible puis « clique » (halo). Singleton DOM
|
|
4
|
+
* hors React pour survivre aux navigations App Router. Indépendant du
|
|
5
|
+
* curseur de l'assistant (`@creezio/assistant`) : la démo est un scénario
|
|
6
|
+
* scripté, pas une action LLM.
|
|
7
|
+
*
|
|
8
|
+
* Styles : classes `.creezio-demo-*` (feuille `interactive-demo.css`).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const CURSOR_ID = "creezio-demo-cursor";
|
|
12
|
+
const HIDE_DELAY_MS = 2600;
|
|
13
|
+
|
|
14
|
+
const CURSOR_SVG = `
|
|
15
|
+
<svg width="26" height="26" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
16
|
+
<path d="M4 2.5 L4 18.5 L8.2 14.8 L11 21 L13.6 19.8 L10.9 13.8 L16.5 13.3 Z"
|
|
17
|
+
fill="var(--creezio-demo-accent, #7c3aed)" stroke="white" stroke-width="1.4" stroke-linejoin="round"/>
|
|
18
|
+
</svg>`;
|
|
19
|
+
|
|
20
|
+
class DemoCursor {
|
|
21
|
+
private el: HTMLDivElement | null = null;
|
|
22
|
+
private badge: HTMLDivElement | null = null;
|
|
23
|
+
private x = 0;
|
|
24
|
+
private y = 0;
|
|
25
|
+
private hideTimer: ReturnType<typeof setTimeout> | null = null;
|
|
26
|
+
private currentAnim: Animation | null = null;
|
|
27
|
+
|
|
28
|
+
private ensure(): HTMLDivElement {
|
|
29
|
+
if (this.el && document.body.contains(this.el)) return this.el;
|
|
30
|
+
|
|
31
|
+
const wrap = document.createElement("div");
|
|
32
|
+
wrap.id = CURSOR_ID;
|
|
33
|
+
wrap.className = "creezio-demo-cursor";
|
|
34
|
+
wrap.setAttribute("data-creezio-demo-ui", "1");
|
|
35
|
+
wrap.innerHTML = CURSOR_SVG;
|
|
36
|
+
|
|
37
|
+
const badge = document.createElement("div");
|
|
38
|
+
badge.textContent = "Démo";
|
|
39
|
+
badge.className = "creezio-demo-cursor-badge";
|
|
40
|
+
wrap.appendChild(badge);
|
|
41
|
+
|
|
42
|
+
document.body.appendChild(wrap);
|
|
43
|
+
this.el = wrap;
|
|
44
|
+
this.badge = badge;
|
|
45
|
+
|
|
46
|
+
// Position de départ : centre de l'écran.
|
|
47
|
+
this.x = window.innerWidth / 2;
|
|
48
|
+
this.y = window.innerHeight / 2;
|
|
49
|
+
wrap.style.transform = `translate(${this.x}px, ${this.y}px)`;
|
|
50
|
+
return wrap;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
setLabel(text: string) {
|
|
54
|
+
this.ensure();
|
|
55
|
+
if (this.badge) this.badge.textContent = text;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
show() {
|
|
59
|
+
const el = this.ensure();
|
|
60
|
+
if (this.hideTimer) clearTimeout(this.hideTimer);
|
|
61
|
+
this.hideTimer = null;
|
|
62
|
+
el.style.opacity = "1";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
hide() {
|
|
66
|
+
if (this.hideTimer) clearTimeout(this.hideTimer);
|
|
67
|
+
this.hideTimer = null;
|
|
68
|
+
if (this.el) {
|
|
69
|
+
this.el.style.opacity = "0";
|
|
70
|
+
/* Terminer / Quitter : retirer le nœud. hide() historique laissait
|
|
71
|
+
#creezio-demo-cursor (data-creezio-demo-ui) → E2E « overlay reste ». */
|
|
72
|
+
this.el.remove();
|
|
73
|
+
this.el = null;
|
|
74
|
+
this.badge = null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
hideSoon(delayMs = HIDE_DELAY_MS) {
|
|
79
|
+
if (this.hideTimer) clearTimeout(this.hideTimer);
|
|
80
|
+
this.hideTimer = setTimeout(() => {
|
|
81
|
+
if (this.el) this.el.style.opacity = "0";
|
|
82
|
+
}, delayMs);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Déplacement fluide vers (x, y) viewport — durée proportionnelle à la distance. */
|
|
86
|
+
moveTo(x: number, y: number): Promise<void> {
|
|
87
|
+
const el = this.ensure();
|
|
88
|
+
this.show();
|
|
89
|
+
this.currentAnim?.cancel();
|
|
90
|
+
|
|
91
|
+
const dx = x - this.x;
|
|
92
|
+
const dy = y - this.y;
|
|
93
|
+
const dist = Math.hypot(dx, dy);
|
|
94
|
+
const duration = Math.max(360, Math.min(1200, dist * 1.4));
|
|
95
|
+
|
|
96
|
+
return new Promise((resolve) => {
|
|
97
|
+
const anim = el.animate(
|
|
98
|
+
[
|
|
99
|
+
{ transform: `translate(${this.x}px, ${this.y}px)` },
|
|
100
|
+
{ transform: `translate(${x}px, ${y}px)` },
|
|
101
|
+
],
|
|
102
|
+
{ duration, easing: "cubic-bezier(.3,.9,.35,1)", fill: "forwards" },
|
|
103
|
+
);
|
|
104
|
+
this.currentAnim = anim;
|
|
105
|
+
const finish = () => {
|
|
106
|
+
this.x = x;
|
|
107
|
+
this.y = y;
|
|
108
|
+
el.style.transform = `translate(${x}px, ${y}px)`;
|
|
109
|
+
try {
|
|
110
|
+
anim.cancel();
|
|
111
|
+
} catch {
|
|
112
|
+
/* ignore */
|
|
113
|
+
}
|
|
114
|
+
resolve();
|
|
115
|
+
};
|
|
116
|
+
anim.onfinish = finish;
|
|
117
|
+
anim.oncancel = () => resolve();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Halo de clic à la position courante. */
|
|
122
|
+
clickEffect(): Promise<void> {
|
|
123
|
+
this.ensure();
|
|
124
|
+
const ripple = document.createElement("div");
|
|
125
|
+
ripple.className = "creezio-demo-click-ripple";
|
|
126
|
+
ripple.setAttribute("data-creezio-demo-ui", "1");
|
|
127
|
+
ripple.style.left = `${this.x - 18}px`;
|
|
128
|
+
ripple.style.top = `${this.y - 18}px`;
|
|
129
|
+
document.body.appendChild(ripple);
|
|
130
|
+
return new Promise((resolve) => {
|
|
131
|
+
const anim = ripple.animate(
|
|
132
|
+
[
|
|
133
|
+
{ transform: "scale(.35)", opacity: 1 },
|
|
134
|
+
{ transform: "scale(1.8)", opacity: 0 },
|
|
135
|
+
],
|
|
136
|
+
{ duration: 460, easing: "ease-out" },
|
|
137
|
+
);
|
|
138
|
+
const done = () => {
|
|
139
|
+
ripple.remove();
|
|
140
|
+
resolve();
|
|
141
|
+
};
|
|
142
|
+
anim.onfinish = done;
|
|
143
|
+
anim.oncancel = done;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
get position() {
|
|
148
|
+
return { x: this.x, y: this.y };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
let singleton: DemoCursor | null = null;
|
|
153
|
+
|
|
154
|
+
export function getDemoCursor(): DemoCursor {
|
|
155
|
+
if (!singleton) singleton = new DemoCursor();
|
|
156
|
+
return singleton;
|
|
157
|
+
}
|
package/ui/index.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @creezio/interactive-demo/ui — surface publique React.
|
|
3
|
+
*
|
|
4
|
+
* `InteractiveDemoRoot` : à monter une fois dans le chrome de la marque
|
|
5
|
+
* (auto-lancement première visite + lanceur flottant). `DemoPlayer` : lecteur
|
|
6
|
+
* bas niveau pour un scénario donné. `startInteractiveDemo` : déclenchement
|
|
7
|
+
* programmatique. Importer aussi la feuille
|
|
8
|
+
* `@creezio/interactive-demo/ui/interactive-demo.css`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
InteractiveDemoRoot,
|
|
13
|
+
startInteractiveDemo,
|
|
14
|
+
INTERACTIVE_DEMO_EVENT,
|
|
15
|
+
} from "./demo-root";
|
|
16
|
+
export type { InteractiveDemoRootProps } from "./demo-root";
|
|
17
|
+
|
|
18
|
+
export { DemoPlayer } from "./demo-player";
|
|
19
|
+
export type { DemoPlayerProps } from "./demo-player";
|
|
20
|
+
|
|
21
|
+
export { getDemoCursor } from "./fake-cursor";
|
|
22
|
+
export {
|
|
23
|
+
resolveDemoTarget,
|
|
24
|
+
waitForDemoTarget,
|
|
25
|
+
} from "./dom";
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
/* @creezio/interactive-demo — styles du lecteur de démo (spotlight, cartes,
|
|
2
|
+
curseur, contrôles). Accent surchargable par marque :
|
|
3
|
+
`:root { --creezio-demo-accent: #0284c7; }` */
|
|
4
|
+
|
|
5
|
+
:root {
|
|
6
|
+
--creezio-demo-accent: #7c3aed;
|
|
7
|
+
--creezio-demo-accent-soft: rgba(124, 58, 237, 0.16);
|
|
8
|
+
--creezio-demo-overlay: rgba(9, 9, 20, 0.55);
|
|
9
|
+
--creezio-demo-card-bg: rgba(255, 255, 255, 0.92);
|
|
10
|
+
--creezio-demo-card-fg: #111122;
|
|
11
|
+
--creezio-demo-card-muted: #5b5b70;
|
|
12
|
+
--creezio-demo-z: 2147482000;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* ── Faux curseur ── */
|
|
16
|
+
|
|
17
|
+
.creezio-demo-cursor {
|
|
18
|
+
position: fixed;
|
|
19
|
+
left: 0;
|
|
20
|
+
top: 0;
|
|
21
|
+
z-index: calc(var(--creezio-demo-z) + 40);
|
|
22
|
+
pointer-events: none;
|
|
23
|
+
opacity: 0;
|
|
24
|
+
transition: opacity 220ms ease;
|
|
25
|
+
will-change: transform;
|
|
26
|
+
filter: drop-shadow(0 2px 6px var(--creezio-demo-accent-soft))
|
|
27
|
+
drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.creezio-demo-cursor-badge {
|
|
31
|
+
position: absolute;
|
|
32
|
+
left: 18px;
|
|
33
|
+
top: 20px;
|
|
34
|
+
background: var(--creezio-demo-accent);
|
|
35
|
+
color: white;
|
|
36
|
+
font: 600 9px/1 system-ui, sans-serif;
|
|
37
|
+
letter-spacing: 0.06em;
|
|
38
|
+
padding: 3px 7px;
|
|
39
|
+
border-radius: 9999px;
|
|
40
|
+
border: 1.5px solid white;
|
|
41
|
+
white-space: nowrap;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.creezio-demo-click-ripple {
|
|
45
|
+
position: fixed;
|
|
46
|
+
width: 36px;
|
|
47
|
+
height: 36px;
|
|
48
|
+
border-radius: 9999px;
|
|
49
|
+
border: 2.5px solid var(--creezio-demo-accent);
|
|
50
|
+
background: var(--creezio-demo-accent-soft);
|
|
51
|
+
z-index: calc(var(--creezio-demo-z) + 39);
|
|
52
|
+
pointer-events: none;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* ── Spotlight ── */
|
|
56
|
+
|
|
57
|
+
.creezio-demo-spotlight {
|
|
58
|
+
position: fixed;
|
|
59
|
+
z-index: var(--creezio-demo-z);
|
|
60
|
+
pointer-events: none;
|
|
61
|
+
border-radius: 12px;
|
|
62
|
+
box-shadow:
|
|
63
|
+
0 0 0 4px var(--creezio-demo-accent-soft),
|
|
64
|
+
0 0 0 200vmax var(--creezio-demo-overlay);
|
|
65
|
+
transition:
|
|
66
|
+
left 320ms cubic-bezier(0.3, 0.9, 0.35, 1),
|
|
67
|
+
top 320ms cubic-bezier(0.3, 0.9, 0.35, 1),
|
|
68
|
+
width 320ms cubic-bezier(0.3, 0.9, 0.35, 1),
|
|
69
|
+
height 320ms cubic-bezier(0.3, 0.9, 0.35, 1);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.creezio-demo-spotlight::after {
|
|
73
|
+
content: "";
|
|
74
|
+
position: absolute;
|
|
75
|
+
inset: -6px;
|
|
76
|
+
border-radius: 16px;
|
|
77
|
+
border: 2px solid var(--creezio-demo-accent);
|
|
78
|
+
opacity: 0.9;
|
|
79
|
+
animation: creezio-demo-pulse 1.8s ease-out infinite;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@keyframes creezio-demo-pulse {
|
|
83
|
+
0% {
|
|
84
|
+
transform: scale(0.99);
|
|
85
|
+
opacity: 0.9;
|
|
86
|
+
}
|
|
87
|
+
70% {
|
|
88
|
+
transform: scale(1.03);
|
|
89
|
+
opacity: 0.25;
|
|
90
|
+
}
|
|
91
|
+
100% {
|
|
92
|
+
transform: scale(0.99);
|
|
93
|
+
opacity: 0.9;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* Voile plein écran (étapes « say » sans cible). */
|
|
98
|
+
.creezio-demo-veil {
|
|
99
|
+
position: fixed;
|
|
100
|
+
inset: 0;
|
|
101
|
+
z-index: var(--creezio-demo-z);
|
|
102
|
+
background: var(--creezio-demo-overlay);
|
|
103
|
+
backdrop-filter: blur(2px);
|
|
104
|
+
animation: creezio-demo-fade-in 260ms ease;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* ── Cartes de narration ── */
|
|
108
|
+
|
|
109
|
+
.creezio-demo-card {
|
|
110
|
+
position: fixed;
|
|
111
|
+
z-index: calc(var(--creezio-demo-z) + 20);
|
|
112
|
+
width: min(380px, calc(100vw - 32px));
|
|
113
|
+
background: var(--creezio-demo-card-bg);
|
|
114
|
+
color: var(--creezio-demo-card-fg);
|
|
115
|
+
border-radius: 16px;
|
|
116
|
+
padding: 18px 20px 16px;
|
|
117
|
+
box-shadow:
|
|
118
|
+
0 24px 60px -12px rgba(10, 10, 30, 0.45),
|
|
119
|
+
0 0 0 1px rgba(255, 255, 255, 0.5) inset;
|
|
120
|
+
backdrop-filter: blur(14px);
|
|
121
|
+
border-top: 3px solid var(--creezio-demo-accent);
|
|
122
|
+
animation: creezio-demo-in-up 320ms cubic-bezier(0.3, 0.9, 0.35, 1);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.creezio-demo-card--centered {
|
|
126
|
+
left: 50%;
|
|
127
|
+
top: 22vh;
|
|
128
|
+
transform: translateX(-50%);
|
|
129
|
+
width: min(460px, calc(100vw - 32px));
|
|
130
|
+
text-align: center;
|
|
131
|
+
padding: 28px 28px 22px;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/*
|
|
135
|
+
* Garde-fou contre la règle globale « modales bornées au viewport »
|
|
136
|
+
* des apps (ex. `[role="dialog"]:not(.inset-y-0) { width: calc(100vw - 2rem);
|
|
137
|
+
* max-height: calc(100vh - 2rem) }`) : la carte démo porte role="dialog"
|
|
138
|
+
* mais ne doit JAMAIS être étirée au viewport — elle garde ses
|
|
139
|
+
* dimensions compactes (spécificité volontairement supérieure :
|
|
140
|
+
* élément + classe + attribut).
|
|
141
|
+
*/
|
|
142
|
+
div.creezio-demo-card[role="dialog"] {
|
|
143
|
+
width: min(380px, calc(100vw - 32px));
|
|
144
|
+
max-height: min(72vh, 560px);
|
|
145
|
+
max-height: min(72dvh, 560px);
|
|
146
|
+
overflow-y: auto;
|
|
147
|
+
overscroll-behavior: contain;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
div.creezio-demo-card--centered[role="dialog"] {
|
|
151
|
+
width: min(460px, calc(100vw - 32px));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.creezio-demo-card-kicker {
|
|
155
|
+
font: 700 10px/1 system-ui, sans-serif;
|
|
156
|
+
letter-spacing: 0.14em;
|
|
157
|
+
text-transform: uppercase;
|
|
158
|
+
color: var(--creezio-demo-accent);
|
|
159
|
+
margin: 0 0 8px;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.creezio-demo-card-title {
|
|
163
|
+
font: 700 17px/1.3 system-ui, sans-serif;
|
|
164
|
+
margin: 0 0 6px;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.creezio-demo-card-body {
|
|
168
|
+
font: 400 13.5px/1.55 system-ui, sans-serif;
|
|
169
|
+
color: var(--creezio-demo-card-muted);
|
|
170
|
+
margin: 0;
|
|
171
|
+
white-space: pre-line;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.creezio-demo-card-actions {
|
|
175
|
+
display: flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
justify-content: flex-end;
|
|
178
|
+
gap: 10px;
|
|
179
|
+
margin-top: 14px;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.creezio-demo-card--centered .creezio-demo-card-actions {
|
|
183
|
+
justify-content: center;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.creezio-demo-note {
|
|
187
|
+
position: fixed;
|
|
188
|
+
left: 50%;
|
|
189
|
+
bottom: 92px;
|
|
190
|
+
transform: translateX(-50%);
|
|
191
|
+
z-index: calc(var(--creezio-demo-z) + 30);
|
|
192
|
+
background: rgba(17, 17, 34, 0.92);
|
|
193
|
+
color: #e8e8f2;
|
|
194
|
+
font: 500 12.5px/1.4 system-ui, sans-serif;
|
|
195
|
+
padding: 8px 14px;
|
|
196
|
+
border-radius: 9999px;
|
|
197
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
|
|
198
|
+
animation: creezio-demo-in-up 240ms ease;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* ── Boutons ── */
|
|
202
|
+
|
|
203
|
+
.creezio-demo-btn {
|
|
204
|
+
appearance: none;
|
|
205
|
+
border: none;
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
font: 600 13px/1 system-ui, sans-serif;
|
|
208
|
+
border-radius: 10px;
|
|
209
|
+
padding: 9px 16px;
|
|
210
|
+
transition:
|
|
211
|
+
transform 120ms ease,
|
|
212
|
+
box-shadow 120ms ease,
|
|
213
|
+
background 120ms ease;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.creezio-demo-btn:active {
|
|
217
|
+
transform: scale(0.97);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.creezio-demo-btn--primary {
|
|
221
|
+
background: linear-gradient(
|
|
222
|
+
135deg,
|
|
223
|
+
var(--creezio-demo-accent),
|
|
224
|
+
color-mix(in srgb, var(--creezio-demo-accent) 70%, #2563eb)
|
|
225
|
+
);
|
|
226
|
+
color: white;
|
|
227
|
+
box-shadow: 0 6px 18px -4px var(--creezio-demo-accent-soft);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.creezio-demo-btn--primary:hover {
|
|
231
|
+
filter: brightness(1.08);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.creezio-demo-btn--ghost {
|
|
235
|
+
background: transparent;
|
|
236
|
+
color: var(--creezio-demo-card-muted);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.creezio-demo-btn--ghost:hover {
|
|
240
|
+
color: var(--creezio-demo-card-fg);
|
|
241
|
+
background: rgba(0, 0, 0, 0.05);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* ── Barre de contrôle ── */
|
|
245
|
+
|
|
246
|
+
.creezio-demo-controls {
|
|
247
|
+
position: fixed;
|
|
248
|
+
left: 50%;
|
|
249
|
+
bottom: 22px;
|
|
250
|
+
transform: translateX(-50%);
|
|
251
|
+
z-index: calc(var(--creezio-demo-z) + 30);
|
|
252
|
+
display: flex;
|
|
253
|
+
align-items: center;
|
|
254
|
+
gap: 14px;
|
|
255
|
+
background: rgba(17, 17, 34, 0.92);
|
|
256
|
+
color: #e8e8f2;
|
|
257
|
+
border-radius: 9999px;
|
|
258
|
+
padding: 10px 14px 10px 20px;
|
|
259
|
+
box-shadow:
|
|
260
|
+
0 16px 44px -8px rgba(0, 0, 0, 0.5),
|
|
261
|
+
0 0 0 1px rgba(255, 255, 255, 0.08) inset;
|
|
262
|
+
backdrop-filter: blur(12px);
|
|
263
|
+
animation: creezio-demo-in-up 320ms cubic-bezier(0.3, 0.9, 0.35, 1);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.creezio-demo-controls-label {
|
|
267
|
+
font: 600 12.5px/1 system-ui, sans-serif;
|
|
268
|
+
white-space: nowrap;
|
|
269
|
+
max-width: 320px;
|
|
270
|
+
overflow: hidden;
|
|
271
|
+
text-overflow: ellipsis;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.creezio-demo-progress {
|
|
275
|
+
position: relative;
|
|
276
|
+
width: 110px;
|
|
277
|
+
height: 4px;
|
|
278
|
+
border-radius: 9999px;
|
|
279
|
+
background: rgba(255, 255, 255, 0.16);
|
|
280
|
+
overflow: hidden;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.creezio-demo-progress-fill {
|
|
284
|
+
position: absolute;
|
|
285
|
+
inset: 0 auto 0 0;
|
|
286
|
+
border-radius: 9999px;
|
|
287
|
+
background: linear-gradient(90deg, var(--creezio-demo-accent), #38bdf8);
|
|
288
|
+
transition: width 320ms ease;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.creezio-demo-controls-count {
|
|
292
|
+
font: 600 11.5px/1 system-ui, sans-serif;
|
|
293
|
+
color: rgba(232, 232, 242, 0.7);
|
|
294
|
+
white-space: nowrap;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.creezio-demo-controls .creezio-demo-btn--ghost {
|
|
298
|
+
color: rgba(232, 232, 242, 0.75);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.creezio-demo-controls .creezio-demo-btn--ghost:hover {
|
|
302
|
+
color: white;
|
|
303
|
+
background: rgba(255, 255, 255, 0.1);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/* ── Lanceur flottant ── */
|
|
307
|
+
|
|
308
|
+
.creezio-demo-launcher {
|
|
309
|
+
position: fixed;
|
|
310
|
+
/* Haut-droite : extr?mit? libre de la barre d'onglets du workspace ?
|
|
311
|
+
* en bas-gauche le lanceur recouvrait la sidebar (retour winhub). */
|
|
312
|
+
right: 18px;
|
|
313
|
+
top: 10px;
|
|
314
|
+
z-index: calc(var(--creezio-demo-z) - 10);
|
|
315
|
+
display: inline-flex;
|
|
316
|
+
align-items: center;
|
|
317
|
+
gap: 8px;
|
|
318
|
+
border: none;
|
|
319
|
+
cursor: pointer;
|
|
320
|
+
background: linear-gradient(
|
|
321
|
+
135deg,
|
|
322
|
+
var(--creezio-demo-accent),
|
|
323
|
+
color-mix(in srgb, var(--creezio-demo-accent) 70%, #2563eb)
|
|
324
|
+
);
|
|
325
|
+
color: white;
|
|
326
|
+
font: 600 13px/1 system-ui, sans-serif;
|
|
327
|
+
border-radius: 9999px;
|
|
328
|
+
padding: 11px 18px;
|
|
329
|
+
box-shadow: 0 10px 26px -6px var(--creezio-demo-accent-soft);
|
|
330
|
+
transition:
|
|
331
|
+
transform 140ms ease,
|
|
332
|
+
box-shadow 140ms ease,
|
|
333
|
+
filter 140ms ease;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.creezio-demo-launcher:hover {
|
|
337
|
+
transform: translateY(-1px);
|
|
338
|
+
filter: brightness(1.07);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.creezio-demo-launcher-menu {
|
|
342
|
+
position: fixed;
|
|
343
|
+
right: 18px;
|
|
344
|
+
top: 52px;
|
|
345
|
+
z-index: calc(var(--creezio-demo-z) - 9);
|
|
346
|
+
background: var(--creezio-demo-card-bg);
|
|
347
|
+
border-radius: 14px;
|
|
348
|
+
box-shadow: 0 20px 50px -10px rgba(10, 10, 30, 0.4);
|
|
349
|
+
padding: 6px;
|
|
350
|
+
min-width: 240px;
|
|
351
|
+
backdrop-filter: blur(14px);
|
|
352
|
+
animation: creezio-demo-in-up 200ms ease;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
.creezio-demo-launcher-item {
|
|
356
|
+
display: block;
|
|
357
|
+
width: 100%;
|
|
358
|
+
text-align: left;
|
|
359
|
+
border: none;
|
|
360
|
+
background: transparent;
|
|
361
|
+
cursor: pointer;
|
|
362
|
+
border-radius: 10px;
|
|
363
|
+
padding: 10px 12px;
|
|
364
|
+
color: var(--creezio-demo-card-fg);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.creezio-demo-launcher-item:hover {
|
|
368
|
+
background: var(--creezio-demo-accent-soft);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.creezio-demo-launcher-item-title {
|
|
372
|
+
font: 600 13px/1.3 system-ui, sans-serif;
|
|
373
|
+
margin: 0;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.creezio-demo-launcher-item-desc {
|
|
377
|
+
font: 400 11.5px/1.4 system-ui, sans-serif;
|
|
378
|
+
color: var(--creezio-demo-card-muted);
|
|
379
|
+
margin: 2px 0 0;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/* ── Animations ── */
|
|
383
|
+
|
|
384
|
+
@keyframes creezio-demo-in-up {
|
|
385
|
+
from {
|
|
386
|
+
opacity: 0;
|
|
387
|
+
transform: translate(var(--creezio-demo-in-x, 0), 10px);
|
|
388
|
+
}
|
|
389
|
+
to {
|
|
390
|
+
opacity: 1;
|
|
391
|
+
transform: translate(var(--creezio-demo-in-x, 0), 0);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.creezio-demo-card--centered {
|
|
396
|
+
--creezio-demo-in-x: -50%;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.creezio-demo-controls,
|
|
400
|
+
.creezio-demo-note {
|
|
401
|
+
--creezio-demo-in-x: -50%;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
@keyframes creezio-demo-fade-in {
|
|
405
|
+
from {
|
|
406
|
+
opacity: 0;
|
|
407
|
+
}
|
|
408
|
+
to {
|
|
409
|
+
opacity: 1;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
@media (prefers-reduced-motion: reduce) {
|
|
414
|
+
.creezio-demo-spotlight,
|
|
415
|
+
.creezio-demo-spotlight::after,
|
|
416
|
+
.creezio-demo-card,
|
|
417
|
+
.creezio-demo-controls,
|
|
418
|
+
.creezio-demo-note,
|
|
419
|
+
.creezio-demo-progress-fill {
|
|
420
|
+
transition: none;
|
|
421
|
+
animation: none;
|
|
422
|
+
}
|
|
423
|
+
}
|