cineview 1.0.0 → 1.0.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.
Files changed (52) hide show
  1. package/README.md +87 -251
  2. package/README.zh-CN.md +87 -251
  3. package/dist/animations/presets/index.d.ts +1 -1
  4. package/dist/artifacts.json +2 -2
  5. package/dist/cineview-dev.es.mjs +1 -1
  6. package/dist/cineview-drag.umd.js +1 -1
  7. package/dist/cineview-scroll.umd.js +1 -1
  8. package/dist/cineview.es.mjs +1 -1
  9. package/dist/cineview.umd.js +1 -1
  10. package/dist/components/Animate/animateSemantics.d.ts +0 -1
  11. package/dist/components/{CineView/CineView.d.ts → Cineview/Cineview.d.ts} +3 -5
  12. package/dist/components/Cineview/CineviewDispatch.d.ts +2 -0
  13. package/dist/components/Cineview/DirectScrollCineview.d.ts +8 -0
  14. package/dist/components/{CineView → Cineview}/directScrollHelpers.d.ts +4 -2
  15. package/dist/components/Cineview/index.d.ts +5 -0
  16. package/dist/components/{CineView → Cineview}/preloadTargets.d.ts +2 -2
  17. package/dist/components/{CineView → Cineview}/regroupCallbacks.d.ts +5 -5
  18. package/dist/components/{CineView/useCineViewImperativeApi.d.ts → Cineview/useCineviewImperativeApi.d.ts} +3 -3
  19. package/dist/components/{CineView → Cineview}/useScrollZoneRegistry.d.ts +3 -2
  20. package/dist/components/Scene/sceneScrollBudget.d.ts +2 -0
  21. package/dist/components/Scene/sceneScrollRuntime.d.ts +0 -1
  22. package/dist/components/Scene/useSceneAnimationRegistry.d.ts +2 -2
  23. package/dist/components/Scene/useSceneScrollTakeover.d.ts +0 -1
  24. package/dist/components/runtime/runtimeContext.d.ts +3 -3
  25. package/dist/components/runtime/scrollSceneFrameStore.d.ts +1 -1
  26. package/dist/context/{CineViewContext.d.ts → CineviewContext.d.ts} +8 -8
  27. package/dist/dev/PerfPanel.d.ts +1 -1
  28. package/dist/dev/usePerfMonitor.d.ts +4 -4
  29. package/dist/entry-drag.d.ts +5 -5
  30. package/dist/entry-scroll.d.ts +5 -5
  31. package/dist/hooks/useFirstSceneEnter.d.ts +3 -3
  32. package/dist/hooks/usePrefersReducedMotion.d.ts +1 -1
  33. package/dist/hooks/useSceneManager.d.ts +1 -0
  34. package/dist/index.d.ts +1 -1
  35. package/dist/public-api.d.ts +1 -1
  36. package/dist/types/index.d.ts +39 -42
  37. package/dist/utils/animationHelpers.d.ts +2 -2
  38. package/dist/utils/devLog.d.ts +1 -1
  39. package/dist/utils/performanceMonitor.d.ts +1 -1
  40. package/package.json +17 -13
  41. package/dist/components/CineView/CineViewDispatch.d.ts +0 -2
  42. package/dist/components/CineView/DirectScrollCineView.d.ts +0 -5
  43. package/dist/components/CineView/index.d.ts +0 -5
  44. /package/dist/components/{CineView → Cineview}/DragSceneStack.d.ts +0 -0
  45. /package/dist/components/{CineView → Cineview}/ScrollSceneSlot.d.ts +0 -0
  46. /package/dist/components/{CineView → Cineview}/ScrollSceneStack.d.ts +0 -0
  47. /package/dist/components/{CineView → Cineview}/ScrollbarOverlay.d.ts +0 -0
  48. /package/dist/components/{CineView → Cineview}/useNativeScrollController.d.ts +0 -0
  49. /package/dist/components/{CineView → Cineview}/useScrollInputBindings.d.ts +0 -0
  50. /package/dist/components/{CineView → Cineview}/useScrollSceneLayout.d.ts +0 -0
  51. /package/dist/components/{CineView → Cineview}/useScrollSceneSnapshots.d.ts +0 -0
  52. /package/dist/components/{CineView → Cineview}/useScrollViewport.d.ts +0 -0
package/README.md CHANGED
@@ -1,284 +1,120 @@
1
- # CineView
2
-
3
- [简体中文](./README.zh-CN.md)
4
-
5
- ![Version 1.0.0](https://img.shields.io/badge/version-1.0.0-8A5B43?style=flat-square)
6
- [![React 19](https://img.shields.io/badge/React-19-287EA3?style=flat-square&logo=react&logoColor=white)](https://react.dev/)
7
- ![TypeScript types included](https://img.shields.io/badge/TypeScript-types_included-3178C6?style=flat-square&logo=typescript&logoColor=white)
8
- [![Framework tests: 1582 passing](https://img.shields.io/badge/framework_tests-1582_passing-4F7562?style=flat-square)](#verification)
9
- [![Line coverage: 96.27 percent](https://img.shields.io/badge/line_coverage-96.27%25-4F7562?style=flat-square)](#verification)
10
- [![MIT license](https://img.shields.io/badge/license-MIT-625D54?style=flat-square)](./LICENSE)
11
-
12
- CineView is a React framework for pages made of animated scenes. It handles dragging between scenes, animations that follow scrolling, and animation sequences within a scene. It also provides positioning in design coordinates, image preloading, and video controlled by animation progress.
13
-
14
- The test and coverage badges refer to the local run recorded in [Verification](#verification).
15
-
16
- [Install](#install) · [Run an example](#run-an-example) · [How it works](#how-it-works) · [Website and documentation](#website-and-documentation) · [Contributing](#contributing)
17
-
18
- ## Install
19
-
20
- Install CineView 1.0.0 and its peer dependencies in a React application:
21
-
22
- ```bash
23
- npm install cineview@1.0.0 react@19 react-dom@19 framer-motion@13
24
- ```
25
-
26
- With pnpm:
27
-
28
- ```bash
29
- pnpm add cineview@1.0.0 react@19 react-dom@19 framer-motion@13
30
- ```
31
-
32
- Applications supply React `^19.0.0`, React DOM `^19.0.0`, and Framer Motion `^13.0.0`. TypeScript declarations are included.
33
-
34
- ## Run an example
35
-
36
- Use Node.js 22.22.1 or a newer 22.x release, or Node.js 24+, with pnpm 10.22.0. These are the repository's development requirements.
37
-
38
- From this checkout:
39
-
40
- ```bash
41
- pnpm install --frozen-lockfile
42
- pnpm build
43
- pnpm --dir examples/minimal install --frozen-lockfile
44
- pnpm --dir examples/minimal dev
45
- ```
46
-
47
- Open the address printed by Vite. The [minimal example](./examples/minimal) has three scenes and a button that restarts the page in the other navigation mode.
48
-
49
- To test local package changes in another application, build and pack the checkout:
50
-
51
- ```bash
52
- pnpm build
53
- pnpm pack
54
- ```
55
-
56
- For an application next to the `cineview` checkout, install the generated archive and its peer dependencies:
1
+ <p align="center">
2
+ <a href="https://cineview.pages.dev">
3
+ <img src="./site/public/favicon.svg" width="64" height="64" alt="Cineview" />
4
+ </a>
5
+ </p>
6
+
7
+ <h1 align="center">Cineview</h1>
8
+
9
+ <p align="center">A React animation framework built around timelines, with drag and scroll modes.</p>
10
+
11
+ <p align="center">
12
+ <a href="./README.md">English</a> · <a href="./README.zh-CN.md">简体中文</a>
13
+ </p>
14
+
15
+ <p align="center">
16
+ <a href="https://www.npmjs.com/package/cineview"><img src="https://img.shields.io/npm/v/cineview?style=flat-square&amp;color=8A5B43&amp;logo=npm" alt="npm version" /></a>
17
+ <a href="https://www.npmjs.com/package/cineview"><img src="https://img.shields.io/npm/dm/cineview?style=flat-square&amp;color=8A5B43" alt="npm monthly downloads" /></a>
18
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-555?style=flat-square" alt="MIT license" /></a>
19
+ <br />
20
+ <a href="https://react.dev/"><img src="https://img.shields.io/badge/React-19-287EA3?style=flat-square&amp;logo=react&amp;logoColor=white" alt="React 19" /></a>
21
+ <a href="https://www.typescriptlang.org/"><img src="https://img.shields.io/badge/TypeScript-3178C6?style=flat-square&amp;logo=typescript&amp;logoColor=white" alt="TypeScript" /></a>
22
+ <a href="https://cineview.pages.dev/coverage.json"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fcineview.pages.dev%2Fcoverage.json&amp;style=flat-square" alt="Framework line coverage" /></a>
23
+ </p>
24
+
25
+ <p align="center">
26
+ <a href="https://cineview.pages.dev">Try scrolling</a> ·
27
+ <a href="https://cineview.pages.dev/drag">Try dragging</a> ·
28
+ <a href="https://cineview.pages.dev/docs">Documentation</a> ·
29
+ <a href="#ai-read-this">AI, read this</a>
30
+ </p>
31
+
32
+ I want landing pages to be easier to maintain and AI assistants to spend less effort repeating the same work. Scene transitions, animation sequencing, and responsive layout can be reused across projects. Cineview organizes these features around scenes and timelines, so common page sections can become React components used on more than one page.
33
+
34
+ For a new page, combine existing scenes, assets, and animations. For an update, find the relevant component and adjust its content or timeline. The AI guides follow the same approach: read the index, then load the guides and code needed for the change. Reusing components and reading by task can reduce the tokens spent regenerating code and reconstructing how an entire page works, leaving more context for the actual request.
35
+
36
+ ## Features
37
+
38
+ | Capability | How to use it |
39
+ | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
40
+ | Reusable scenes and components | Divide content into Scenes and package common sections as React components for product pages, campaigns, or interactive presentations. |
41
+ | Timeline sequencing | Declare durations, delays, and dependencies. Dependent animations adjust when a predecessor's entrance duration changes. |
42
+ | Drag and scroll modes | Drag between full-screen scenes or scroll through a page. Connect animations to scroll progress where content needs to unfold gradually. |
43
+ | [Animation presets](https://cineview.pages.dev/docs/08-presets) | Start with fades, slides, zooms, rotations, flips, bounces, blurs, and other built-in effects. |
44
+ | [Composition and custom animations](https://cineview.pages.dev/docs/05-custom-animation) | Combine presets and custom properties on one element, define finer changes with keyframes, and use timelines to sequence separate elements. |
45
+ | Entrances, loops, and stagger | Configure entrance, loop, and exit effects where needed. Reveal children at intervals to sequence headings, cards, or lists. |
46
+ | [Video control](https://cineview.pages.dev/docs/11-video-timeline) | Use AnimateVideo to advance video frames through dragging or scrolling, select a video interval, and coordinate it with text animations. |
47
+ | [Custom drawing and extensions](https://cineview.pages.dev/docs/09-use-animate-timeline) | Read animation progress with useAnimateTimeline and connect Canvas, SVG, WebGL, or your own components to the existing progress controls. |
48
+ | [Responsive layout](https://cineview.pages.dev/docs/05-responsive) | Scale dimensions from a design width, position and size content with Position and Container, and adapt layouts with CSS. |
49
+ | [Resource preloading](https://cineview.pages.dev/docs/02-preload) | Prepare scene images in advance and handle initial loading, progress, and failures to reduce waiting for assets during scene changes. |
50
+
51
+ ## Try it
52
+
53
+ In a React 19 project, install Cineview and its peer dependencies:
57
54
 
58
55
  ```bash
59
- pnpm add ../cineview/cineview-1.0.0.tgz react@19 react-dom@19 framer-motion@13
56
+ npm install cineview@1.0.1 react@19 react-dom@19 framer-motion@13
60
57
  ```
61
58
 
62
- Adjust the archive path for your directories.
59
+ This example uses the `Cineview` API in 1.0.1. Version 1.0.0 uses the earlier `CineView` API; update imports and configuration when upgrading.
63
60
 
64
- ## A page with two scenes
61
+ Replace `App.tsx` with the component below and set `body { margin: 0; }` in your global stylesheet. No media files are needed.
65
62
 
66
63
  ```tsx
67
- import { Animate, CineView, Scene } from 'cineview';
64
+ import { Animate, Cineview, Scene } from 'cineview';
68
65
 
69
66
  export default function App() {
70
67
  return (
71
- <CineView mode="drag" designWidth={750} a11y={{ label: 'Product tour' }}>
72
- <Scene sceneId="opening">
73
- <div style={{ height: '100%', display: 'grid', placeItems: 'center' }}>
74
- <Animate enterAnimation="fade-in" duration={{ enter: 600 }}>
75
- <h1>Start here</h1>
76
- </Animate>
77
- </div>
78
- </Scene>
79
-
80
- <Scene sceneId="details">
81
- <div style={{ height: '100%', display: 'grid', placeItems: 'center' }}>
82
- <Animate enterAnimation="slide-up" duration={{ enter: 800 }}>
83
- <h2>Take a closer look</h2>
84
- </Animate>
85
- </div>
86
- </Scene>
87
- </CineView>
88
- );
89
- }
90
- ```
91
-
92
- Drag vertically to change scenes. With the CineView container focused, the arrow keys, PageUp/PageDown, Home, and End also navigate. Buttons and inputs inside a scene keep their own keyboard handling.
93
-
94
- ## How it works
95
-
96
- `CineView` selects the navigation mode. `Scene` groups content and defines its layout. `Animate` applies an animation to that content.
97
-
98
- | Configuration | What controls the animation |
99
- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
100
- | `mode="drag"` with `timeline.driver: 'scene'` | The scene's element timeline follows the gesture and continues after release. |
101
- | `mode="drag"` with `timeline.driver: 'clock'` | The animation plays by time after the scene arrives. |
102
- | `mode="scroll"`, inside a `Scene.scroll` region, with `driver: 'scene'` | The region's real scroll position controls progress. |
103
- | `mode="scroll"` outside a scroll region, or with `driver: 'clock'` | The animation plays by time when its element meets the visibility conditions. |
104
-
105
- The default mode is `drag` and the default driver is `scene`. Mode and driver answer different questions: how the page moves, and how an element's animation advances.
106
-
107
- A mode change starts a different engine. The [example](./examples/minimal/src/App.tsx) uses separate branches and a `key` to restart explicitly; it does not transfer progress between modes.
108
-
109
- ### Animation that follows scrolling
110
-
111
- In scroll mode, scenes stay in document flow. Adding `Scene.scroll` creates a region that holds the scene in view while scrolling advances its animation:
112
-
113
- ```tsx
114
- import { Animate, CineView, Scene } from 'cineview';
115
-
116
- export default function ScrollPage() {
117
- return (
118
- <CineView mode="scroll" designWidth={750}>
119
- <Scene sceneId="intro" layout={{ height: '100vh' }}>
120
- <h1>A page that scrolls</h1>
68
+ <Cineview mode="drag" unit="percent" scale={1}>
69
+ <Scene sceneId="intro" style={{ background: '#f5e8d8', padding: 40 }}>
70
+ <h1>Drag up to the next scene</h1>
121
71
  </Scene>
122
-
123
- <Scene
124
- sceneId="detail"
125
- layout={{ height: '100vh' }}
126
- scroll={{ zoneId: 'detail', trigger: 'center-lock' }}
127
- >
72
+ <Scene sceneId="details" style={{ background: '#e8edf0', padding: 40 }}>
73
+ <Animate animateId="title" enterAnimation="fade-in" duration={{ enter: 600 }}>
74
+ <h2>The title appears first</h2>
75
+ </Animate>
128
76
  <Animate
129
- enterAnimation={{
130
- initial: { opacity: 0, y: 60 },
131
- animate: { opacity: 1, y: 0 },
132
- }}
133
- duration={{ enter: 1600, exit: 0 }}
134
- timeline={{ driver: 'scene' }}
77
+ enterAnimation="slide-up"
78
+ duration={{ enter: 400 }}
79
+ timeline={{ after: 'title', delay: 100 }}
135
80
  >
136
- <h2>Scroll to reveal the detail</h2>
81
+ <p>The detail follows the title.</p>
137
82
  </Animate>
138
83
  </Scene>
139
- </CineView>
140
- );
141
- }
142
- ```
143
-
144
- One millisecond of authored region duration corresponds to one CSS pixel of scroll travel. In this example, the animation spans 1,600 pixels. Scroll back to reverse it. The scene's visible height is separate from that animation distance.
145
-
146
- A large input can stop at a region boundary; the next input continues. Wheel, touch, keyboard, and scrollbar input use the same scroll position. [Scroll behavior](./site/src/content/docs/en/scroll/01-centerlock.md) explains the bounds and zero-duration cases.
147
-
148
- ### Sequencing and repetition
149
-
150
- Use `timeline.after` to connect animations in the same Scene, and `timeline.delay` to add a pause. For example, `timeline={{ after: 'heading', delay: 120 }}` starts after the animation named `heading`, with another 120 ms of delay.
151
-
152
- `stagger={{ each: 110 }}` starts a container's direct children at timed intervals. Use separate Animate elements when each item needs its own progress controlled by scrolling.
153
-
154
- `loopAnimation` repeats an effect while that animation is active. `exitAnimation` defines an optional exit. The [timeline guide](./site/src/content/docs/en/concepts/02-timeline.md) covers driver differences: drag animations with `driver: 'clock'` do not participate in `after` sequencing and ignore `exitAnimation`.
155
-
156
- ### Responsive coordinates
157
-
158
- `designWidth` is the design's width in pixels; it defaults to `750`. Position coordinates and numeric Container lengths use:
159
-
160
- ```text
161
- scale = viewport width / designWidth
162
- ```
163
-
164
- Both axes use this scale. CSS strings retain their units, and unitless values such as opacity are not scaled. Viewport height does not introduce another conversion factor. Use CSS breakpoints for text and layout that need to reflow; design-coordinate scaling alone does not provide a mobile reading layout.
165
-
166
- ## Components and extension points
167
-
168
- | API | Purpose |
169
- | -------------------- | -------------------------------------------------------------------------------------------------- |
170
- | `CineView` | Navigation mode, shared configuration, callbacks, and navigation ref |
171
- | `Scene` | Scene content, layout, asset declarations, and optional scroll region |
172
- | `Animate` | Presets, custom property changes, parallel or sequential composition, and timing |
173
- | `Position` | Coordinates and centering relative to the containing block; `fixed` keeps content within its Scene |
174
- | `Container` | Convert layout lengths from design pixels |
175
- | `Image` | Load an image through the shared preload cache |
176
- | `AnimateVideo` | Seek video frames from animation progress or use normal playback |
177
- | `useAnimateTimeline` | Read the nearest Animate's progress as MotionValues for custom DOM, SVG, or Canvas work |
178
-
179
- A custom component can read progress without putting each frame into React state:
180
-
181
- ```tsx
182
- import { motion } from 'framer-motion';
183
- import { useAnimateTimeline } from 'cineview';
184
-
185
- export function ProgressLine() {
186
- const { progress } = useAnimateTimeline();
187
-
188
- return (
189
- <motion.div
190
- style={{
191
- height: 4,
192
- width: '100%',
193
- background: '#d59273',
194
- transformOrigin: 'left',
195
- scaleX: progress,
196
- }}
197
- />
84
+ </Cineview>
198
85
  );
199
86
  }
200
87
  ```
201
88
 
202
- Render `ProgressLine` inside an `Animate`. The hook reads that Animate's timeline. Render-prop children are also available, but their progress updates render React; use the MotionValue hook for continuous drawing.
203
-
204
- `ref.current.goToScene(index)` changes the scene. The ref also exposes `refreshLayout()`, `preload()`, `getCurrentIndex()`, and `getPerformanceMetrics()`. Scroll refs provide `goToZone()`. `onReady` supplies this API when it becomes available; use `preload()` to wait for declared asset loading.
205
-
206
- Scene fixed content is clipped to its Scene. Put persistent site navigation outside CineView. See the [component reference](./site/src/content/docs/en/components/01-cineview.md) for configuration and callbacks.
207
-
208
- ## Package entry points
209
-
210
- | Entry | Supported use |
211
- | ------------------------ | -------------------------------------------------------------------------- |
212
- | `cineview` | Main ESM and CommonJS entry, including both navigation engines |
213
- | `cineview/drag` | CommonJS `require` and types for drag mode |
214
- | `cineview/scroll` | CommonJS `require` and types for scroll mode |
215
- | `cineview/dev` | Optional ESM development tools, including `PerfPanel` and `usePerfMonitor` |
216
- | `cineview/dev/style.css` | Styles for the development panel |
217
-
218
- Use `import { CineView } from 'cineview'` in an ESM application. The mode-specific subpaths have no ESM import condition. Browser script distributions are `cineview.umd.js`, `cineview-drag.umd.js`, and `cineview-scroll.umd.js`.
219
-
220
- React, React DOM, and Framer Motion remain external peer dependencies. Development tools and their CSS are opt-in.
221
-
222
- ## Accessibility and motion preferences
223
-
224
- The drag container supports keyboard navigation, a configurable accessible label, and scene-position announcements. Inactive drag scenes use `inert` and `aria-hidden`. Native controls inside scenes retain their normal interaction.
89
+ Drag upward to reveal the second scene: the title appears, then the description follows. Try changing the text and animation durations to make it your own. For scroll mode, start with the [interactive quick start](https://cineview.pages.dev/docs/03-quickstart).
225
90
 
226
- With `prefers-reduced-motion`, `loopAnimation` effects stop. Entrances and exits triggered by visibility changes jump to their final state. Animations controlled by dragging or scrolling still follow the input. Authored content still needs readable text, labels, and a usable focus order; a site's accessibility requires checking its complete content and interactions.
91
+ ## AI, read this
227
92
 
228
- ## Verification
93
+ If you are an AI coding assistant working with Cineview, **read [llms.txt](./llms.txt) first**, then follow its links for the task at hand:
229
94
 
230
- Local framework run on **September 8, 2026**, using Node.js 22.22.1:
95
+ - [Quick start](./docs/ai/quickstart.md): install the package and build a complete page.
96
+ - [Timelines](./docs/ai/timeline.md): arrange animation order, durations, and delays.
97
+ - [Modes](./docs/ai/modes.md): choose drag or scroll and check their constraints.
98
+ - [Recipes](./docs/ai/recipes.md): add a scroll narrative or video.
231
99
 
232
- | Measure | Result |
233
- | --------------------- | ------------ |
234
- | Framework test suites | 118 passed |
235
- | Framework tests | 1,582 passed |
236
- | Statement coverage | 94.85% |
237
- | Branch coverage | 90.22% |
238
- | Function coverage | 95.15% |
239
- | Line coverage | 96.27% |
100
+ These guides target the Cineview 1.0.1 API. Check the version in the index before writing code, and use the linked types and detailed references when a property is unclear. Read only what the task needs: loading selected guides uses fewer input tokens than loading the entire documentation, leaving more context for the page being built.
240
101
 
241
- The figures come from `pnpm test:coverage:framework`, which excludes site tests. The configured coverage minimum is 90% for each metric. Regenerate the snapshot after framework changes and before a release.
102
+ ## Docs and examples
242
103
 
243
- The [verification record](./VERIFICATION.md) records the commands, scope, and browser results. To run the checks:
104
+ See the [documentation](https://cineview.pages.dev/docs) for component APIs and more examples:
244
105
 
245
- ```bash
246
- pnpm install --frozen-lockfile
247
- pnpm --dir site install --frozen-lockfile
248
- pnpm --dir examples/minimal install --frozen-lockfile
249
- pnpm --dir examples/performance-test install --frozen-lockfile
250
-
251
- pnpm verify:framework:static
252
- pnpm type-check
253
- pnpm type-check:site
254
- pnpm test:site-contracts
255
- pnpm docs:style:static
256
- pnpm --dir site build
257
- ```
106
+ - [Animation order](https://cineview.pages.dev/docs/04-orchestration)
107
+ - [Video control](https://cineview.pages.dev/docs/11-video-timeline)
108
+ - [Canvas, SVG, and WebGL](https://cineview.pages.dev/docs/09-use-animate-timeline)
109
+ - [Responsive layout](https://cineview.pages.dev/docs/05-responsive)
110
+ - [Resource preloading](https://cineview.pages.dev/docs/02-preload)
258
111
 
259
- With Chrome available, `pnpm test:browser` runs the framework's browser checks. Static checks and coverage do not establish drag or scroll behavior on their own. The [CI workflow](./.github/workflows/ci.yml) defines Node.js 22.22.1 and 24.x checks; the [release workflow](./.github/workflows/release.yml) requires browser acceptance before publishing.
260
-
261
- ## Website and documentation
262
-
263
- A public site URL has not been configured in this repository. Run the bilingual site locally:
264
-
265
- ```bash
266
- pnpm install --frozen-lockfile
267
- pnpm --dir site install --frozen-lockfile
268
- pnpm build
269
- pnpm --dir site dev
270
- ```
271
-
272
- The default address is [http://localhost:4000](http://localhost:4000); use the address printed by Vite if the port is occupied. The [documentation](http://localhost:4000/docs) and [drag demo](http://localhost:4000/drag) are routes on that site.
273
-
274
- Documentation source: [English](./site/src/content/docs/en) · [简体中文](./site/src/content/docs/zh). Both languages cover installation, concepts, drag and scroll behavior, components, and advanced use.
112
+ Prefer to run the source locally? The [minimal example](./examples/minimal/README.md) includes startup commands and both modes.
275
113
 
276
114
  ## Contributing
277
115
 
278
- Read [CONTRIBUTING.md](./CONTRIBUTING.md) for the development workflow and [AGENTS.md](./AGENTS.md) for repository rules. Runtime changes need browser evidence in addition to unit tests. Keep the English and Chinese documentation aligned.
279
-
280
- Report bugs through [GitHub issues](https://github.com/AlienMu/cineview/issues).
116
+ Bug reports, examples, and improvements are welcome. Start with [Contributing](./CONTRIBUTING.md) for local setup and checks. See the [Changelog](./CHANGELOG.md) for version changes and [Releases](./RELEASING.md) for publishing instructions.
281
117
 
282
118
  ## License
283
119
 
284
- [MIT](./LICENSE), copyright Alien.mu.
120
+ [MIT](./LICENSE) © Alien.mu.