Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
c201c4a
added plan for validator
hassankettany Jun 29, 2026
3102ac7
add implementation plan for validator
hassankettany Jun 29, 2026
1dd041f
feat(validator): scaffold + animation file enumeration
hassankettany Jun 29, 2026
b6a8fcb
feat(validator): static detection engine
hassankettany Jun 29, 2026
5e73892
refactor(validator): uniform regex cloning in findExtraJs
hassankettany Jun 29, 2026
d38c339
feat(validator): draft store with diff/apply/discard and path safety
hassankettany Jun 30, 2026
f31a0dc
feat(validator): fix-option prompt assembly
hassankettany Jun 30, 2026
29d3b97
feat(validator): Claude Agent SDK wrapper + html extraction
hassankettany Jun 30, 2026
1ac2fd6
feat(validator): fix orchestrator with bounded concurrency + self-check
hassankettany Jun 30, 2026
8d3216f
feat(validator): express server + REST API
hassankettany Jun 30, 2026
df66ba9
feat(validator): validator UI with scan, preview, diff, and apply
hassankettany Jun 30, 2026
e93c5b1
fix(validator): partial-batch apply results, per-file fix resilience,…
hassankettany Jun 30, 2026
3b9526e
feat(validator): drive fixes via local claude CLI subprocess
hassankettany Jun 30, 2026
dee3298
feat(validator): Apple-style UI redesign
hassankettany Jun 30, 2026
e3a432c
fix(validator): gitignore drafts at repo root
hassankettany Jun 30, 2026
e4de144
feat(validator): glass UI, live streaming progress, compare & tooltips
hassankettany Jun 30, 2026
9b75c13
feat(validator): split view into mode + version tab groups
hassankettany Jun 30, 2026
4df9a23
fix(validator): placeholder never hid; code hidden behind panel
hassankettany Jun 30, 2026
a51640b
feat(validator): force pinned @wix/interact@2.4.0 in fix prompts
hassankettany Jun 30, 2026
4043d33
feat(validator): per-file indicators — version dot + customEffect + J…
hassankettany Jun 30, 2026
c2727c6
feat(validator): hybrid codemod + agent fixing
hassankettany Jul 1, 2026
9f021c2
fix(validator): migrate data-wix-path when renaming the interact tag
hassankettany Jul 1, 2026
cb2f9b9
feat(validator): pin imports to @wix/interact@2.5.1/web
hassankettany Jul 1, 2026
85e25d7
feat(validator): stream agent reasoning over SSE
hassankettany Jul 1, 2026
26ffe38
feat(validator): file tree, collapsible panels, agent-activity modal
hassankettany Jul 1, 2026
278a9af
feat(validator): folder icons + honest activity-modal waiting state
hassankettany Jul 1, 2026
5520bb2
fix(validator): strip prose the model wraps around the HTML document
hassankettany Jul 1, 2026
82f606c
feat(validator): convert-to-prompt backend (skill → guideline)
hassankettany Jul 2, 2026
7a7a6dc
feat(validator): Examples/Prompts tabs + Convert-to-prompt UI
hassankettany Jul 2, 2026
1ff9446
feat(validator): free-scroll activity modal + arrow-key file nav
hassankettany Jul 2, 2026
9153a98
docs: spec for the prompt refinement loop
hassankettany Jul 6, 2026
7fbcdf4
docs: make interact-xp read-only a hard constraint in the loop spec
hassankettany Jul 6, 2026
1c06aef
docs: implementation plan for the prompt refinement loop
hassankettany Jul 6, 2026
c238cd0
feat(validator): vendor build — bundle interact-experience renderer +…
hassankettany Jul 6, 2026
aa1bbc6
feat(validator): playground client (sections, payload, generate, status)
hassankettany Jul 6, 2026
5b355a9
feat(validator): loop history store (rounds, rollback, finalize)
hassankettany Jul 6, 2026
d0299c7
feat(validator): guideline refiner (general, no-overfit)
hassankettany Jul 6, 2026
47cb0a5
feat(validator): loop endpoints (status, sections, run, refine, final…
hassankettany Jul 6, 2026
5666e33
fix(validator): loop SSE endpoints — Accept-gate + defensive 400 (mir…
hassankettany Jul 8, 2026
0bb0c47
feat(validator): prompt refinement loop UI (sections, previews, score…
hassankettany Jul 8, 2026
207913d
fix(validator): escape all </script> end-tag variants in render-frame…
hassankettany Jul 8, 2026
55850c7
fix(validator): serve /vendor with CORS header + loop UI robustness (…
hassankettany Jul 8, 2026
29b19c2
fix(validator): render real section content + full-width loop preview…
hassankettany Jul 8, 2026
0f198d0
feat(validator): expand-to-fullscreen previews + original-layout prev…
hassankettany Jul 8, 2026
80e6ede
feat(validator): live busy feedback for refine/generate + agent-think…
hassankettany Jul 8, 2026
19640a1
feat(validator): loop iteration clarity — round indicator, back-to-cu…
hassankettany Jul 8, 2026
5d8d81f
feat(validator): model picker + context meter in topbar; fix prompt-d…
hassankettany Jul 9, 2026
d234056
docs(spec): autonomous prompt refinement (Refinery) design
hassankettany Jul 9, 2026
421135c
docs(plan): autonomous prompt refinement (Refinery) implementation plan
hassankettany Jul 12, 2026
bed867f
feat(validator): refinery jobs store (persisted job records, boot rec…
hassankettany Jul 12, 2026
64d0117
feat(validator): refinery stop rule, history block, trigger extraction
hassankettany Jul 12, 2026
5a12499
feat(validator): playwright scroll-sweep capture (frames + gif)
hassankettany Jul 12, 2026
524badf
feat(validator): vision judge (pattern fidelity + integrity) with Rea…
hassankettany Jul 12, 2026
1ecfba4
feat(validator): refine with explicit iteration history + human notes
hassankettany Jul 12, 2026
026754e
feat(validator): refinery engine (queue of 2, resumable iteration loop)
hassankettany Jul 12, 2026
b545839
fix(validator): clear stale stop flag on refinery relaunch (protect r…
hassankettany Jul 12, 2026
54cbc1f
feat(validator): refinery endpoints, /runs + /repo statics, /render r…
hassankettany Jul 12, 2026
acb1552
feat(validator): refinery UI — status dots, launch sheet, queue widge…
hassankettany Jul 12, 2026
89a8fbc
fix(validator): guard refinery approve against running jobs + thread …
hassankettany Jul 12, 2026
fe6ce60
feat(validator): refinery UI — delete job, no-flash previews, prompt↔…
hassankettany Jul 13, 2026
6fe7ddd
feat(validator): per-iteration breakdown in the refinery prompt diff
hassankettany Jul 13, 2026
44919e2
.
hassankettany Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .DS_Store
Binary file not shown.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Validator sidecar drafts — written under the repo root (server runs with
# root = repo root), so ignore both the root and validator-local locations.
/.drafts/
validator/.drafts/
validator/node_modules/
232 changes: 232 additions & 0 deletions Ani-Mate Prompts/Gallery-and-Carousel/3DSmallCarousel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
# 3D Small Carousel

A scroll-driven 3D carousel: the track rotates while cards brighten near the front.

## Summary

- **ID:** `3d-small-carousel`
- **Name:** `3D Small Carousel`
- **Description:** Cards are arranged in a 3D ring and orbit on scroll while cards brighten as they face the viewer.
- **Best for:** `4-12` similarly sized image/card siblings that can be placed as absolute items around a `preserve-3d` carousel.

## Demo HTML

```html
<section class="scroll-section">
<div id="carousel-stage" class="sticky-stage">
<div data-testid="internal-container-content" id="carousel" class="carousel">
<div id="card-1" class="card">1</div>
<div id="card-2" class="card">2</div>
<div id="card-3" class="card">3</div>
<div id="card-4" class="card">4</div>
</div>
</div>
</section>
```

## Selector Contract

1. Role ownership is strict: `scrollSection` owns runway, `stickyStage` owns sticky/clipping/perspective, `carousel` owns the stable centered 3D stage, and `repeatedCard` owns orbit transform plus brightness.
2. In Wix, `stickyStage` is the internal-container-root and `carousel` is `#<stickyStageCompId> > [data-testid="internal-container-content"]`. Those selectors must stay distinct.
3. Do not animate `carousel` with `rotateY` in Wix. Orbit each card root with combined transform/filter keyframes instead of rotating the wrapper.
4. Keep 3D placement on repeated card roots, not raw `img` descendants. Cards must become absolute centered items in a `preserve-3d` stage.
5. Compute angle step from item count and radius from card size; four cards are the minimum useful ring.

## Role Guidance

| Role | Guidance |
| --- | --- |
| `scrollSource` | The tall section whose `viewProgress` drives carousel rotation and card brightness. |
| `stickyStage` | The non-rotating sticky viewport-height stage that centers, clips, and provides perspective for the 3D carousel. |
| `perspectiveFrame` | Same non-rotating stage when no extra wrapper exists; never the rotating carousel. |
| `carousel` | The internal content child / stable `preserve-3d` stage containing the orbiting cards. |
| `repeatedCard` | Absolute card roots arranged around the carousel with static `rotateY`/`translateZ` placement. |

## Adaptation Notes

1. The source layout does not need to already be a carousel; repeated siblings can be reorganized into an absolute 3D ring with CSS.
2. Preserve the section root outer layout and keep card size close to the source composition instead of introducing viewport-height cards.
3. Make the carousel a stable centered anchor inside the sticky viewport, then reset grid/flex placement on cards and center them on that anchor.
4. Initial per-card placement is formula-driven: repeated card `i` starts at `rotateY(i * 360 / N) translateZ(radius)`.
5. Generate sampled per-card orbit keyframes that combine transform and filter. Do not add a separate wrapper spin effect.
6. If the orbit looks off-center, move the carousel anchor, not the cards one by one.

## Required Elements

| Key | Role | Demo Selector | Purpose |
| --- | --- | --- | --- |
| `scrollSection` | `scrollSource` | `.scroll-section` | The `viewProgress` source for the full 3D carousel scene. |
| `stickyStage` | `stickyStage` | `#carousel-stage` | The shared sticky viewport stage that pins, clips, centers, and provides perspective. Wix: internal-container-root `#comp` id. |
| `perspectiveFrame` | `perspectiveFrame` | `#carousel-stage` | The non-rotating perspective owner. Usually the same selector as `stickyStage`; never `carousel`. |
| `carousel` | `carousel` | `#carousel-stage > [data-testid="internal-container-content"]` | The stable `preserve-3d` stage that directly contains card roots. Wix: MUST be `#<stickyStageCompId> > [data-testid="internal-container-content"]`, never the same selector as `stickyStage`. |
| `card1` | `repeatedCard` | `.scroll-section #card-1` | Minimum repeated ring card; extend for `card5..cardN`. |
| `card2` | `repeatedCard` | `.scroll-section #card-2` | Repeated ring card. |
| `card3` | `repeatedCard` | `.scroll-section #card-3` | Repeated ring card. |
| `card4` | `repeatedCard` | `.scroll-section #card-4` | Repeated ring card. |

## Required Styles

### `scrollSource`

Selector: `.scroll-section`

```css
.scroll-section {
position: relative;
min-height: 400vh;
}
```

Reason: creates enough scroll distance for the carousel to rotate smoothly.

### `stickyStage`

Selector: `#carousel-stage`

```css
#carousel-stage {
position: sticky;
top: 0;
height: 100vh;
width: 100%;
overflow: clip;
}
```

Reason: pins the scene and prevents horizontal overflow while the carousel rotates. This selector must never receive the carousel `rotateY` effect.

### `perspectiveFrame`

Selector: `#carousel-stage`

```css
#carousel-stage {
perspective: 1200px;
perspective-origin: 50% 45%;
display: flex;
justify-content: center;
align-items: center;
transform-style: preserve-3d;
}
```

Reason: provides depth and centering for the carousel without rotating with it.

### `carousel`

Selector: `#carousel-stage > [data-testid="internal-container-content"]`

```css
#carousel-stage > [data-testid="internal-container-content"] {
grid-area: auto;
justify-self: auto;
align-self: auto;
position: absolute;
top: 50%;
left: 50%;
display: block;
width: 0;
height: 0;
margin: 0;
padding: 0;
overflow: visible;
transform-style: preserve-3d;
transform-origin: center center;
}
```

Reason: creates a stable viewport-centered 3D anchor for the absolute cards; do not animate this selector in Wix.

### `repeatedCard`

Selector: `#carousel-stage > [data-testid="internal-container-content"] > .card`

```css
#carousel-stage > [data-testid="internal-container-content"] > .card {
grid-area: auto;
justify-self: auto;
align-self: auto;
position: absolute;
top: 0;
left: 0;
width: 280px;
height: 420px;
margin-left: -140px;
margin-top: -210px;
backface-visibility: hidden;
transform-origin: center center;
will-change: transform, filter;
}
```

Reason: centers repeated card roots in the carousel stage before per-card orbit transforms are applied. Preserve the source card proportions here with measured px or stage-relative percentages; do not convert cards to viewport-height blocks.

## Interact Template

### Range

```ts
const RANGE = {
rangeStart: { name: 'cover', offset: { unit: 'percentage', value: 0 } },
rangeEnd: { name: 'cover', offset: { unit: 'percentage', value: 100 } },
fill: 'both' as const,
easing: 'linear',
};
```

### Orbit Keyframes

Per-card keyframes are generated by sampling the ring rotation (`turns * samplesPerTurn + 1` steps) and combining a `rotateY(...) translateZ(radius)` transform with a proximity-based `brightness(...)` filter. Each card `i` is offset by its static angle `i * 360 / cardCount`.

```ts
const orbitKeyframes = (
cardIndex: number,
cardCount = 4,
turns = 2,
samplesPerTurn = 8,
radius = '380px',
) => {
const steps = turns * samplesPerTurn + 1;
const stepDeg = 360 / samplesPerTurn;
const cardAngle = cardIndex * (360 / cardCount);

return Array.from({ length: steps }, (_, step) => {
const rotation = step * stepDeg;
const worldAngle = (rotation + cardAngle) % 360;
const diff = Math.min(worldAngle, 360 - worldAngle);
const proximity = (Math.cos((diff * Math.PI) / 180) + 1) / 2;
const brightness = 0.3 + 0.8 * proximity;

return {
offset: step / (steps - 1),
transform: `rotateY(${rotation + cardAngle}deg) translateZ(${radius})`,
filter: `brightness(${brightness.toFixed(2)})`,
};
});
};
```

### Effect Pattern

```ts
const cardOrbitEffect = (key: string, cardIndex: number) => ({
key,
keyframeEffect: {
name: `${key}-orbit`,
keyframes: orbitKeyframes(cardIndex),
},
...RANGE,
});
```

### Interaction

```ts
{
key: 'scrollSection',
trigger: 'viewProgress',
effects: RING_CARD_NUMBERS.map((cardNumber, index) =>
cardOrbitEffect(`card${cardNumber}`, index),
),
}
```
Loading