@mindstudio-ai/remy 0.1.131 → 0.1.133
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/dist/headless.js
CHANGED
|
@@ -4707,9 +4707,9 @@ Use <current_deck> as your starting point and replace or update the content as n
|
|
|
4707
4707
|
### Rules
|
|
4708
4708
|
- The deck must be a single HTML file \u2014 it will be rendered in an iframe.
|
|
4709
4709
|
- Must look beautiful on desktop and mobile.
|
|
4710
|
-
- Animation between slides must be seamless, no flicker or flashing. For reveal animations: hide elements with CSS \`opacity: 0\` only (no transform in CSS). Let GSAP handle transforms via inline styles and never use \`clearProps\`.
|
|
4710
|
+
- Animation between slides must be seamless, no flicker or flashing. For reveal animations: hide elements with CSS \`opacity: 0\` only (no transform in CSS). Let GSAP handle transforms via inline styles and never use \`clearProps\`. Use the existing scaffold, do not write your own transition logic or slide mechanics.
|
|
4711
4711
|
- Be bold and impactful.
|
|
4712
|
-
- Code must be clean, bug free, and easy to parse. Use GSAP for animations.
|
|
4712
|
+
- Code must be clean, bug free, and easy to parse. Use GSAP for animations. Pay close attention to layout and alignment to make sure everything is perfect.
|
|
4713
4713
|
- Keep the progress bar and edge chevrons from the shell \u2014 they are part of the navigation UX.
|
|
4714
4714
|
|
|
4715
4715
|
Respond only with the complete HTML file and absolutely no other text. Your response will be written directly to an html file.`;
|
package/dist/index.js
CHANGED
|
@@ -4664,9 +4664,9 @@ Use <current_deck> as your starting point and replace or update the content as n
|
|
|
4664
4664
|
### Rules
|
|
4665
4665
|
- The deck must be a single HTML file \u2014 it will be rendered in an iframe.
|
|
4666
4666
|
- Must look beautiful on desktop and mobile.
|
|
4667
|
-
- Animation between slides must be seamless, no flicker or flashing. For reveal animations: hide elements with CSS \`opacity: 0\` only (no transform in CSS). Let GSAP handle transforms via inline styles and never use \`clearProps\`.
|
|
4667
|
+
- Animation between slides must be seamless, no flicker or flashing. For reveal animations: hide elements with CSS \`opacity: 0\` only (no transform in CSS). Let GSAP handle transforms via inline styles and never use \`clearProps\`. Use the existing scaffold, do not write your own transition logic or slide mechanics.
|
|
4668
4668
|
- Be bold and impactful.
|
|
4669
|
-
- Code must be clean, bug free, and easy to parse. Use GSAP for animations.
|
|
4669
|
+
- Code must be clean, bug free, and easy to parse. Use GSAP for animations. Pay close attention to layout and alignment to make sure everything is perfect.
|
|
4670
4670
|
- Keep the progress bar and edge chevrons from the shell \u2014 they are part of the navigation UX.
|
|
4671
4671
|
|
|
4672
4672
|
Respond only with the complete HTML file and absolutely no other text. Your response will be written directly to an html file.`;
|
|
@@ -49,7 +49,10 @@ For multi-step tasks with branching logic (research, enrichment, content pipelin
|
|
|
49
49
|
- Runtime errors must render visibly on screen, not produce a blank white page. User and agent must be able to visibly debug and spot them.
|
|
50
50
|
|
|
51
51
|
### State Management
|
|
52
|
-
-
|
|
52
|
+
- Prefer to use a library like Zustand for global state. Load a big data bundle on app start into a Zustand store, then render everything from memory. Navigation between screens should feel instant — no loading spinners for data that's already in the store.
|
|
53
|
+
- Optimistic updates: mutate the store immediately, fire the API call in the background, roll back on error. The user should never wait for the server to confirm before seeing their change.
|
|
54
|
+
- Not everything needs global state. Form inputs, UI toggles, modal visibility — keep those in local component state. Global state is for data that multiple screens need access to.
|
|
55
|
+
- Do not use SWR for apps where you can load everything on startup. Those libraries are for server-cache patterns where data is too large or dynamic to hold in memory. For small apps with a handful of users, a Zustand store with a single initial fetch is simpler and faster.
|
|
53
56
|
|
|
54
57
|
### Secrets & Third-Party Integrations
|
|
55
58
|
When a method needs credentials for a third-party service, use `process.env` and use the CLI to set it on behalf of the user (chat logs are secure and scrubbed, so it's fine for them to paste) or they can set it manually in the Dashboard.
|
|
@@ -27,7 +27,7 @@ These are things we already know about and have decided to accept:
|
|
|
27
27
|
- `@mindstudio-ai/interface` — frontend SDK. `createClient<T>()` gives typed RPC to backend methods (no raw fetch). `auth` handles auth state (`auth.currentUser`, `auth.onAuthStateChanged(cb)`, verification flows, logout). `platform.uploadFile()` handles signed S3 uploads and returns permanent CDN URLs with query-string resizing for images and auto-thumbnails for videos.
|
|
28
28
|
- `@mindstudio-ai/agent` — backend SDK. `db.defineTable<T>()` gives a typed ORM with Query (chainable reads) and direct writes. `auth` gives `auth.userId`, `auth.roles`, `auth.requireRole()`, `auth.hasRole()`. Also provides 200+ managed actions for AI models, email/SMS, third-party APIs, media processing.
|
|
29
29
|
- Libraries we know are actively maintained, don't bother checking:
|
|
30
|
-
-
|
|
30
|
+
- zustand
|
|
31
31
|
- motion (formerly framer-motion — import from `motion/react`, not `framer-motion`)
|
|
32
32
|
- gsap (now fully free, including ScrollTrigger, FLIP, MorphSVG)
|
|
33
33
|
- styled-components
|
|
@@ -150,11 +150,14 @@ html, body {
|
|
|
150
150
|
|
|
151
151
|
@media (max-width: 768px) {
|
|
152
152
|
.slide { padding: 32px 24px; }
|
|
153
|
-
.nav { bottom: 24px; }
|
|
154
153
|
}
|
|
155
154
|
|
|
155
|
+
/* Reveal: elements with data-reveal start hidden, GSAP animates them in */
|
|
156
|
+
[data-reveal] { opacity: 0; }
|
|
157
|
+
|
|
156
158
|
@media (prefers-reduced-motion: reduce) {
|
|
157
159
|
*, *::before, *::after { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; }
|
|
160
|
+
[data-reveal] { opacity: 1 !important; }
|
|
158
161
|
}
|
|
159
162
|
</style>
|
|
160
163
|
</head>
|
|
@@ -165,18 +168,18 @@ html, body {
|
|
|
165
168
|
<div class="deck" id="deck">
|
|
166
169
|
|
|
167
170
|
<div class="slide slide-dark" data-index="0">
|
|
168
|
-
<h1>Slide One</h1>
|
|
169
|
-
<p>Placeholder subtitle text</p>
|
|
171
|
+
<h1 data-reveal>Slide One</h1>
|
|
172
|
+
<p data-reveal>Placeholder subtitle text</p>
|
|
170
173
|
</div>
|
|
171
174
|
|
|
172
175
|
<div class="slide slide-light" data-index="1">
|
|
173
|
-
<h1 style="color:var(--text-dark)">Slide Two</h1>
|
|
174
|
-
<p>Another placeholder</p>
|
|
176
|
+
<h1 data-reveal style="color:var(--text-dark)">Slide Two</h1>
|
|
177
|
+
<p data-reveal>Another placeholder</p>
|
|
175
178
|
</div>
|
|
176
179
|
|
|
177
180
|
<div class="slide slide-dark" data-index="2">
|
|
178
|
-
<h1>Slide Three</h1>
|
|
179
|
-
<p>Final placeholder</p>
|
|
181
|
+
<h1 data-reveal>Slide Three</h1>
|
|
182
|
+
<p data-reveal>Final placeholder</p>
|
|
180
183
|
</div>
|
|
181
184
|
|
|
182
185
|
</div>
|
|
@@ -204,6 +207,8 @@ html, body {
|
|
|
204
207
|
const tapPrev = document.getElementById('tapPrev');
|
|
205
208
|
const tapNext = document.getElementById('tapNext');
|
|
206
209
|
const progress = document.getElementById('progress');
|
|
210
|
+
const chevronPrev = document.getElementById('chevronPrev');
|
|
211
|
+
const chevronNext = document.getElementById('chevronNext');
|
|
207
212
|
|
|
208
213
|
// Build progress segments
|
|
209
214
|
for (let i = 0; i < totalSlides; i++) {
|
|
@@ -226,15 +231,30 @@ html, body {
|
|
|
226
231
|
chevronPrev.classList.toggle('hidden', current === 0);
|
|
227
232
|
chevronNext.classList.toggle('hidden', current === totalSlides - 1);
|
|
228
233
|
|
|
229
|
-
// Light/dark adjustment
|
|
230
|
-
const
|
|
234
|
+
// Light/dark adjustment — checks class or data-theme attribute
|
|
235
|
+
const s = slides[current];
|
|
236
|
+
const isLight = s.classList.contains('slide-light') || s.classList.contains('s-light') || s.dataset.theme === 'light';
|
|
231
237
|
progress.classList.toggle('light', isLight);
|
|
232
238
|
chevronPrev.classList.toggle('light', isLight);
|
|
233
239
|
chevronNext.classList.toggle('light', isLight);
|
|
234
240
|
}
|
|
235
241
|
|
|
236
|
-
|
|
237
|
-
|
|
242
|
+
// Slide content reveal — called once per slide on first visit.
|
|
243
|
+
// Elements with [data-reveal] start hidden (CSS opacity:0) and
|
|
244
|
+
// animate in. Override this function to customize per-slide animations.
|
|
245
|
+
const revealed = new Set();
|
|
246
|
+
function revealSlide(index) {
|
|
247
|
+
if (revealed.has(index)) return;
|
|
248
|
+
revealed.add(index);
|
|
249
|
+
const els = slides[index].querySelectorAll('[data-reveal]');
|
|
250
|
+
els.forEach((el, i) => {
|
|
251
|
+
const delay = (parseFloat(el.dataset.reveal) || 0) + i * 0.04;
|
|
252
|
+
gsap.fromTo(el,
|
|
253
|
+
{ opacity: 0, y: 16 },
|
|
254
|
+
{ opacity: 1, y: 0, duration: 0.5, delay, ease: 'power2.out' }
|
|
255
|
+
);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
238
258
|
|
|
239
259
|
function goTo(index) {
|
|
240
260
|
if (index === current || isAnimating || index < 0 || index >= totalSlides) return;
|
|
@@ -246,7 +266,10 @@ html, body {
|
|
|
246
266
|
x: -current * window.innerWidth,
|
|
247
267
|
duration: 0.4,
|
|
248
268
|
ease: 'power2.inOut',
|
|
249
|
-
onComplete: () => {
|
|
269
|
+
onComplete: () => {
|
|
270
|
+
revealSlide(current);
|
|
271
|
+
isAnimating = false;
|
|
272
|
+
}
|
|
250
273
|
});
|
|
251
274
|
}
|
|
252
275
|
|
|
@@ -287,9 +310,11 @@ html, body {
|
|
|
287
310
|
resizeTimer = setTimeout(() => gsap.set(deck, { x: -current * window.innerWidth }), 100);
|
|
288
311
|
});
|
|
289
312
|
|
|
290
|
-
// Init
|
|
313
|
+
// Init — first slide is visible immediately, no reveal animation
|
|
291
314
|
gsap.set(deck, { x: 0 });
|
|
292
315
|
updateNav();
|
|
316
|
+
revealed.add(0);
|
|
317
|
+
slides[0].querySelectorAll('[data-reveal]').forEach(el => { el.style.opacity = 1; });
|
|
293
318
|
})();
|
|
294
319
|
</script>
|
|
295
320
|
|