@ev-ry/fx 0.1.0-rc.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/LICENSE +21 -0
- package/NOTICE.md +13 -0
- package/QUICKSTART.fa.md +94 -0
- package/README.md +116 -0
- package/assets/fonts/Estedad-OFL.txt +93 -0
- package/assets/vendor/bidi-LICENSE.txt +22 -0
- package/assets/vendor/bidi.min.js +1 -0
- package/assets/vendor/three-LICENSE.txt +21 -0
- package/assets/vendor/three.min.js +7 -0
- package/build-report.json +328 -0
- package/docs/GUIDE.md +125 -0
- package/docs/RELEASE-NOTES.md +40 -0
- package/examples/AnimatedTitle.jsx +21 -0
- package/examples/navigation-away.html +1 -0
- package/examples/navigation.html +38 -0
- package/examples/script.html +2 -0
- package/package.json +57 -0
- package/src/dom-attachment.d.ts +78 -0
- package/src/dom-attachment.js +187 -0
- package/src/dom-auto-reveal.d.ts +17 -0
- package/src/dom-auto-reveal.js +53 -0
- package/src/dom-auto-route.js +25 -0
- package/src/dom-free-bootstrap.js +42 -0
- package/src/dom-free-loader.d.ts +13 -0
- package/src/dom-free-loader.js +12 -0
- package/src/dom-free-script.js +12 -0
- package/src/dom-free.d.ts +16 -0
- package/src/dom-free.js +42 -0
- package/src/dom-image-raster.js +22 -0
- package/src/dom-image-surface.js +109 -0
- package/src/dom-image-swap.js +27 -0
- package/src/dom-once.js +34 -0
- package/src/dom-raster-cache.js +33 -0
- package/src/dom-reveal-boot.js +11 -0
- package/src/dom-reveal.js +75 -0
- package/src/dom-rich-text.js +119 -0
- package/src/dom-surface-font.js +50 -0
- package/src/dom-svg-surface.js +43 -0
- package/src/dom-text-fingerprint.js +27 -0
- package/src/dom-text-runs.js +45 -0
- package/src/dom-text-surface.js +254 -0
- package/src/font-mesh-engine.js +368 -0
- package/src/font-rasterizer.js +65 -0
- package/src/hybrid-text-flow.js +45 -0
- package/src/image-preparation-queue.js +16 -0
- package/src/image-source.js +61 -0
- package/src/image-surface.js +162 -0
- package/src/insertion-range.js +29 -0
- package/src/mesh-generator-core.js +149 -0
- package/src/motion-envelope.js +22 -0
- package/src/motion.js +52 -0
- package/src/native-run-shaping.js +60 -0
- package/src/particle-centers.js +50 -0
- package/src/raster-texture-material.js +79 -0
- package/src/raster-texture-mesh.js +35 -0
- package/src/render-owner.js +63 -0
- package/src/runtime-font-engine.js +242 -0
- package/src/runtime-lifecycle.js +26 -0
- package/src/text-direction.js +25 -0
- package/src/text-edit-effect.js +101 -0
- package/src/text-edit-motions.js +15 -0
- package/src/text-effect-options.js +29 -0
- package/src/text-effect-path.js +61 -0
- package/src/text-mesh-density.js +36 -0
- package/src/text-motion-character-centers.js +74 -0
- package/src/text-motion-contour.js +22 -0
- package/src/text-motion-primitives.js +91 -0
- package/src/text-motion-programs.js +1 -0
- package/src/text-motion-recipes.js +71 -0
- package/src/text-scene.js +272 -0
- package/src/triangle-coverage.js +25 -0
- package/src/triangle-effect.js +194 -0
- package/src/triangle-motion-frame.js +38 -0
- package/src/viewport-clip.js +119 -0
- package/src/viewport-render-owner.js +318 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kamran Baghini
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/NOTICE.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# EV-RY FX Free — third-party notices
|
|
2
|
+
|
|
3
|
+
EV-RY FX Free is distributed under the [MIT license](LICENSE). The following third-party components retain their own copyright notices and license terms. Complete notices are included with the distribution.
|
|
4
|
+
|
|
5
|
+
| Component | Copyright notice | License text |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| Three.js, bundled r158 renderer | Copyright © 2010–2023 three.js authors | [MIT](assets/vendor/three-LICENSE.txt) |
|
|
8
|
+
| bidi-js | Copyright (c) 2021 Jason Johnston | [MIT](assets/vendor/bidi-LICENSE.txt) |
|
|
9
|
+
| Estedad project font notice | Copyright 2022 The Estedad Project Authors | [SIL Open Font License 1.1](assets/fonts/Estedad-OFL.txt) |
|
|
10
|
+
|
|
11
|
+
This Free distribution includes the Estedad license notice but does not bundle an Estedad font binary. Display-text attachment uses the host page's font stack; it does not automatically install Estedad. Sites must provide any fonts they choose to use under those fonts' applicable terms.
|
|
12
|
+
|
|
13
|
+
These notices are provided alongside, and do not replace, the complete license files linked above. The EV-RY FX Free license applies to this Free distribution; it does not assign a license to separate editions or unrelated EV-RY projects.
|
package/QUICKSTART.fa.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# EV-RY FX Free 0.1.0-rc.1 — نصب آزمایشی
|
|
2
|
+
|
|
3
|
+
این نسخهٔ آزمایشی عمومی با مجوز MIT ارائه میشود. نام بسته در npm برابر @ev-ry/fx است.
|
|
4
|
+
|
|
5
|
+
## روش script
|
|
6
|
+
|
|
7
|
+
آرشیو را استخراج کنید و پوشه package را کامل در مسیر عمومی `/thd/` سایت قرار دهید. این خط را اضافه کنید:
|
|
8
|
+
|
|
9
|
+
```html
|
|
10
|
+
<script src="/thd/src/dom-free-script.js" data-thd-auto defer></script>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
H1/H2 خودکار انتخاب میشوند. برای تصویر `data-thd-image` و برای متن دیگر `data-thd-text` بگذارید. برای استثناکردن یک بخش، `data-thd-ignore` روی آن یا والدش قرار دهید. فایل examples/script.html نمونهٔ آماده است؛ آن را از HTTP باز کنید، نه file://.
|
|
14
|
+
|
|
15
|
+
### جلوگیری از چشمک در اولین نمایش صفحه
|
|
16
|
+
|
|
17
|
+
این اسکریپت کوچک را در `head`، پیش از محتوای صفحه و **بدون defer یا async** قرار دهید:
|
|
18
|
+
|
|
19
|
+
```html
|
|
20
|
+
<script src="/thd/src/dom-reveal-boot.js"></script>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
روی آیتمی که منتظر افکت ورود است `data-thd-pending` بگذارید؛ این نشانگر جایگزین انتخابگر اتصال نیست:
|
|
24
|
+
|
|
25
|
+
```html
|
|
26
|
+
<img data-thd-image data-thd-pending src="photo.jpg" width="640" height="400" alt="Photo">
|
|
27
|
+
<h1 data-thd-pending>Hello</h1>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
فضا حفظ میشود و ماسک اولیه در همان لحظهٔ اتصال به ماسک افکت تحویل داده میشود. اگر موتور بارگیری نشود، ماسک اولیه حداکثر پس از ۸ ثانیه برداشته میشود؛ بدون JavaScript محتوا بومی و قابل مشاهده است. آمادهسازی افکت پس از اتصال، مراقبت خطای مستقل خود را دارد. برای تصویر ابعاد یا aspect-ratio تعیین کنید تا بارگیری آن چیدمان را جابهجا نکند.
|
|
31
|
+
|
|
32
|
+
نشانگر `data-thd-pending` فقط برای مخفیسازی اولیه است و روی آیتمهای خارج از انتخابگر یا مستثناشده نگذارید. ویژگی `data-thd-reveal` متعلق به موتور است؛ آن را دستی تغییر ندهید. مهلت ۸ ثانیه از اجرای اسکریپت اولیه محاسبه میشود و تأخیر افکت نیست. اگر موتور پس از این مهلت آماده شود، جلوگیری از چشمک تضمین نمیشود. در سایت دارای CSP محدود، اجرای اسکریپت و style تزریقشده باید مجاز باشد.
|
|
33
|
+
|
|
34
|
+
## نصب با npm
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
npm install @ev-ry/fx
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
برای import از `@ev-ry/fx`، namespace سازگار THREE را خودتان ارائه کنید؛ نسخهٔ همراه script همان r158 است. راهنمای کامل API در docs/GUIDE.md قرار دارد.
|
|
41
|
+
|
|
42
|
+
برای شروع صریح از داخل ماژول نیز میتوانید از loader استفاده کنید:
|
|
43
|
+
|
|
44
|
+
```js
|
|
45
|
+
import * as THREE from 'three';
|
|
46
|
+
import {loadFree} from '@ev-ry/fx/script';
|
|
47
|
+
const api = await loadFree({THREE, auto: true});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
خود import روی صفحه اثری ندارد و هنگام رندر سمت سرور هم قابل import است؛ `loadFree()` را فقط در مرورگر و پس از وجود صفحه اجرا کنید. نسخهٔ آزمایششدهٔ Three.js همان r158 است. در صورت ندادن THREE، loader از نسخهٔ موجود در window یا فایل همراه استفاده میکند؛ مسیر فایل همراه باید پس از بستهبندی قابل دسترس بماند. اولین فراخوانی حالت خودکار را تعیین میکند و فراخوانیهای بعدی همان آمادهسازی را به اشتراک میگذارند. برای مدیریت دستی از `auto:false` و سپس `api.create()` استفاده کنید.
|
|
51
|
+
|
|
52
|
+
آدرس قبلی `src/dom-free-script.js` برای تگ script معمولی حفظ شده است. روی آن `type="module"` نگذارید. مسیر `@ev-ry/fx/classic-script` فقط برای یافتن فایل script معمولی است؛ ورودی import همان `@ev-ry/fx/script` و تابع `loadFree` است.
|
|
53
|
+
|
|
54
|
+
## React
|
|
55
|
+
|
|
56
|
+
مثال `examples/AnimatedTitle.jsx` عمداً از همان script استفاده میکند تا نیازی به تنظیم بستهبندی فایلهای همراه موتور نباشد. script را بدون data-thd-auto پیش از اجرای React بارگیری کنید و سپس AnimatedTitle را در برنامه استفاده کنید. روی همان عنصر اتصال خودکار و دستی را همزمان فعال نکنید.
|
|
57
|
+
|
|
58
|
+
این مثال cleanup دارد و در StrictMode و تغییر متن باید اتصال قبلی را آزاد کند. children در این مثال یک رشته است؛ این یک پک کامپوننت React مستقل نیست.
|
|
59
|
+
|
|
60
|
+
## رفتار و محدودیتها
|
|
61
|
+
|
|
62
|
+
### ورود به دید و تکرار
|
|
63
|
+
|
|
64
|
+
پیشفرض `once:true` یعنی تنها اولین ورود. با `once:false`، خروج کامل آیتم آن را فوراً مخفی و برای ورود مجدد آماده میکند؛ این خروج افکت محو اجرا نمیکند. حرکت کوچک داخل محدوده نباید افکت را تکرار کند. ورود مجدد در حین افکت ناتمام، همان زمانبندی را ادامه میدهد؛ پس از پایان، ورود جدید افکت تازه میسازد. `play('enter')` درخواست بازپخش صریح و `play('exit')` درخواست محو متحرک است.
|
|
65
|
+
|
|
66
|
+
`threshold` نسبت مساحت قابل مشاهده است: صفر برای اولین تقاطع مثبت، `0.5` برای نصف و `1` برای تمام آیتم. آیتم بزرگتر از محدودهٔ دید ممکن است هرگز به مقدار یک نرسد.
|
|
67
|
+
|
|
68
|
+
### محل canvas و لایهها
|
|
69
|
+
|
|
70
|
+
پیشفرض `auto` با `documentCanvas:true` است؛ canvas مشترک همراه سند حرکت میکند. محدودههای خاص ممکن است به حالت محلی بروند. برای اجبار به حالت محلی از `presentation:'local'` استفاده کنید. canvas مشترک تمام ترکیبهای لایهبندی CSS را بازسازی نمیکند؛ برای تداخل با هدر، zIndex و حالت نمایش را بررسی کنید.
|
|
71
|
+
|
|
72
|
+
### اتصال و پاکسازی
|
|
73
|
+
|
|
74
|
+
عنصرِ خالی که دستی متصل شده، پس از دریافت متن میتواند افکت ورود را اجرا کند. اما عنصر خالیای که اسکن خودکار آن را انتخاب نکرده، برای کشفشدن به `free.refresh()` نیاز دارد. اگر سبک پشتیبانینشده را اصلاح کردید، refresh امکان اجرای اولین ورود را بازمیگرداند؛ ورودِ یکبارهای که قبلاً کامل شده تکرار نمیشود. فاصلههای معمولی HTML طبق CSS جمع میشوند؛ فاصلهٔ نشکن و فاصلههای پیشقالببندیشده حذف سراسری نمیشوند.
|
|
75
|
+
|
|
76
|
+
اتصال خودکار و دستی را روی یک آیتم همزمان انجام ندهید. اسکن تغییرات DOM خودکار و دائمی نیست؛ پس از افزودن یا حذف آیتمها `free.refresh()` را اجرا کنید. هنگام unmount، اتصال یا مالک آن را `destroy()` کنید. تصویر خارجی بدون مجوز CORS یا CSS/SVG پشتیبانینشده ممکن است بومی باقی بماند؛ نبود افکت همیشه خطای بارگذاری موتور نیست.
|
|
77
|
+
|
|
78
|
+
loader خودکار هنگام رفتن صفحه به حافظهٔ Back/Forward مرورگر، اتصال را نگه میدارد و هنگام بازگشت موقعیتش را تازه میکند؛ ورودهای یکباره دوباره ساخته نمیشوند. خروج واقعی صفحه منابع را آزاد میکند. اگر اتصال را خودتان با `api.create()` یا `createFree()` ساختهاید، مدیریت عمر آن هم با شماست: روی `pagehide` فقط در صورت `event.persisted === false` آن را آزاد کنید؛ در بازگشتِ persisted، `refresh()` کافی است. اتصال عمداً destroyشده خودکار زنده نمیشود. پاکسازی هنگام unmount واقعی همچنان لازم است.
|
|
79
|
+
|
|
80
|
+
### آمادهسازی و مصرف پردازش
|
|
81
|
+
|
|
82
|
+
برای تصویر خارج از دید یا با اندازهٔ صفر، `ready` ممکن است با وضعیت موقت بومی و دلیل `Image not visible` تمام شود؛ این به معنی آمادهبودن مش روی GPU نیست. آمادهسازی تصویر از نزدیکی صفحه، حدود نصف ارتفاع viewport جلوتر، آغاز میشود. بارگیری شبکهٔ خود `img` همچنان تابع مرورگر است. هنگام resize سریع، مش قبلی برای مدت کوتاه با کادر حرکت میکند و برش و گوشههای نهایی پس از تجمیع تغییرات بازسازی میشوند؛ ساعت افکت از ابتدا شروع نمیشود.
|
|
83
|
+
|
|
84
|
+
متن ثابت از چیدمان معتبر و پیکسلهای کششده استفاده میکند. سقف کش مشترک پیکسلها ۱۶MiB است؛ این سقف کل حافظهٔ صفحه یا GPU نیست. بارگیری فونت کش مرتبط را تازه میکند. متن پشتیبانینشده بومی نمایش داده میشود و موتور روی همان خطای معلوم مدام تلاش نمیکند؛ پس از اصلاح سبک، `refresh()` امکان تلاش مجدد را میدهد.
|
|
85
|
+
|
|
86
|
+
### مشخصات نسخه
|
|
87
|
+
|
|
88
|
+
- متن: ورود باد، خروج دود. تصویر/SVG: ورود برف، خروج ذوب.
|
|
89
|
+
- مدت۲ ثانیه، ذرات مثلثی، سکون بومی، شکلگیری دیرتر برای نمایشدهندهها.
|
|
90
|
+
- canvas متصل به سند پیشفرض است؛ حالت خودکار برای بعضی محدودهها محلی میشود.
|
|
91
|
+
- قبل از جداکردن بخش صفحه owner.destroy() را صدا بزنید. برای اسکن عناصر جدید owner.refresh().
|
|
92
|
+
- چهار افکت ثابت؛ ویرایشگر، افکت سفارشی و پشتیبانی تمام CSS/SVG در این بسته نیستند.
|
|
93
|
+
- یک script با فایلهای همراه است، نه یک فایل یکپارچه. ساختار پوشهها را حفظ کنید.
|
|
94
|
+
- تستهای واقعی آیفون و Android توسط کاربر موفق گزارش شدهاند؛ این تضمین تمام دستگاهها و سایتها نیست.
|
package/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<p align="center"><img src="https://raw.githubusercontent.com/kbaghini/evry-fx/main/docs/assets/cover.svg" alt="EV-RY FX — Motion for the text and images already on your page." width="100%"></p>
|
|
2
|
+
|
|
3
|
+
<h1 align="center">EV-RY FX</h1>
|
|
4
|
+
|
|
5
|
+
<p align="center"><strong>Your HTML. Four particle effects. Native when still.</strong></p>
|
|
6
|
+
|
|
7
|
+
<p align="center">Free edition · 0.1.0-rc.1 preview · <a href="https://github.com/kbaghini/evry-fx/blob/main/LICENSE">MIT licensed</a> · JavaScript + TypeScript declarations</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="#quick-start">Quick start</a> ·
|
|
11
|
+
<a href="https://kbaghini.github.io/evry-fx/docs/">Live demo</a> ·
|
|
12
|
+
<a href="https://github.com/kbaghini/evry-fx/blob/main/docs/GUIDE.md">Guide</a> ·
|
|
13
|
+
<a href="https://github.com/kbaghini/evry-fx/blob/main/QUICKSTART.fa.md">راهنمای فارسی</a>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
Add WebGL particle motion to existing headings, display text, images and supported SVG icons. EV-RY FX borrows their content and placement from the page, animates textured particles, then returns to native browser rendering.
|
|
17
|
+
|
|
18
|
+
Start with automatic scroll reveals, or attach selected elements through a small API. Keep your existing layout and components.
|
|
19
|
+
|
|
20
|
+
## See it move
|
|
21
|
+
|
|
22
|
+

|
|
23
|
+
|
|
24
|
+
The README shows an animated preview. Open the [live interactive demo](https://kbaghini.github.io/evry-fx/docs/) to try entry and exit effects on real text and images.
|
|
25
|
+
|
|
26
|
+
## What you get
|
|
27
|
+
|
|
28
|
+
| Content | Entry | Exit |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| Text | Dust wind | Smoke |
|
|
31
|
+
| Images and supported SVG | Drifting snow | Melt |
|
|
32
|
+
|
|
33
|
+
- **A small automatic setup.** Reveal `h1`, `h2`, `[data-thd-text]` and `img[data-thd-image]` on intersection. Mark exclusions with `data-thd-ignore`.
|
|
34
|
+
- **Manual control when needed.** Attach display text, images or supported static SVG; replay, cancel, refresh and destroy individual attachments. Simple image replacement is included.
|
|
35
|
+
- **Your page keeps ownership.** Native DOM elements retain their content and semantics. Native rendering resumes when entry motion settles.
|
|
36
|
+
- **One visual engine.** Text and media use textured triangular particles, four fixed presets and a 2000ms effect timeline. Individual particles can finish earlier within that timeline.
|
|
37
|
+
- **A practical integration boundary.** Framework-independent JavaScript, typed APIs, a classic script entry and an explicit ES-module loader. A React integration example is included.
|
|
38
|
+
|
|
39
|
+
## Quick start
|
|
40
|
+
|
|
41
|
+
**Public preview: 0.1.0-rc.1.** Validate the supported content and layouts in your project before production use.
|
|
42
|
+
|
|
43
|
+
Install from your project folder:
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
npm install @ev-ry/fx
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Add a script
|
|
50
|
+
|
|
51
|
+
Serve the complete installed `node_modules/@ev-ry/fx` directory at `/thd/`. Preserve its modules and asset folders; this is not a single-file bundle.
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<head>
|
|
55
|
+
<!-- Early mask: load before body content, without async or defer. -->
|
|
56
|
+
<script src="/thd/src/dom-reveal-boot.js"></script>
|
|
57
|
+
<script src="/thd/src/dom-free-script.js" data-thd-auto defer></script>
|
|
58
|
+
</head>
|
|
59
|
+
<body>
|
|
60
|
+
<h1 data-thd-pending>Small details. A better feeling.</h1>
|
|
61
|
+
<p data-thd-text data-thd-pending>Made for your existing page.</p>
|
|
62
|
+
<img data-thd-image data-thd-pending src="photo.jpg"
|
|
63
|
+
width="640" height="400" alt="Describe your photograph">
|
|
64
|
+
</body>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`data-thd-pending` prevents initial native paint before the entry effect; it does **not** select an element for attachment. Use it only on selected targets. The mask preserves space, is absent without JavaScript, and has a failure fallback. [First-paint setup, CSP and troubleshooting →](https://github.com/kbaghini/evry-fx/blob/main/docs/GUIDE.md#first-paint-setup-avoid-an-initial-flash)
|
|
68
|
+
|
|
69
|
+
The classic loader uses an existing `window.THREE` or loads the bundled Three.js r158 asset. Serve examples over HTTP, not `file://`. Existing `THDFree`, `data-thd-*` and `src/dom-*` API/file names are retained in this release.
|
|
70
|
+
|
|
71
|
+
### Use a module
|
|
72
|
+
|
|
73
|
+
Provide a compatible Three.js namespace; r158 is the tested version. Call the loader in the browser after the host elements exist:
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
import * as THREE from 'three';
|
|
77
|
+
import { loadFree } from '@ev-ry/fx/script';
|
|
78
|
+
|
|
79
|
+
const api = await loadFree({ THREE, auto: false });
|
|
80
|
+
const free = api.create(document, { auto: false });
|
|
81
|
+
|
|
82
|
+
const title = free.attachText(document.querySelector('.title'), {
|
|
83
|
+
revealOnView: { threshold: 0.5, once: false }
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Later, on an explicit user action:
|
|
87
|
+
// title.play('exit');
|
|
88
|
+
// title.cancel();
|
|
89
|
+
|
|
90
|
+
// On component unmount: free.destroy();
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Importing the loader does not initialize the page. Its first call chooses automatic initialization; repeated calls share that initialization. Use `auto:true` for automatic scanning, or `auto:false` with `api.create()` for manual ownership. Do not attach the same element both ways.
|
|
94
|
+
|
|
95
|
+
For direct ownership with injected Three.js, `createFree` is also exported from `@ev-ry/fx`. See the [API and lifecycle guide](https://github.com/kbaghini/evry-fx/blob/main/docs/GUIDE.md).
|
|
96
|
+
|
|
97
|
+
## Examples and guide
|
|
98
|
+
|
|
99
|
+
| Start here | What it demonstrates |
|
|
100
|
+
| --- | --- |
|
|
101
|
+
| [Script example](https://github.com/kbaghini/evry-fx/blob/main/examples/script.html) | Automatic heading entry, including the early mask |
|
|
102
|
+
| [Navigation example](https://github.com/kbaghini/evry-fx/blob/main/examples/navigation.html) | Back/forward navigation and page lifecycle |
|
|
103
|
+
| [React example](https://github.com/kbaghini/evry-fx/blob/main/examples/AnimatedTitle.jsx) | A string title with effect cleanup and StrictMode handling |
|
|
104
|
+
| [Detailed guide](https://github.com/kbaghini/evry-fx/blob/main/docs/GUIDE.md) | SVG, image swaps, selectors, thresholds, canvas routing and troubleshooting |
|
|
105
|
+
| [Persian quickstart](https://github.com/kbaghini/evry-fx/blob/main/QUICKSTART.fa.md) | Installation and integration notes in Persian |
|
|
106
|
+
| [Release notes](https://github.com/kbaghini/evry-fx/blob/main/docs/RELEASE-NOTES.md) | Changes, tested scope and remaining limits |
|
|
107
|
+
|
|
108
|
+
## A few useful boundaries
|
|
109
|
+
|
|
110
|
+
- Repeated scroll reveals hide and rearm after a **complete exit**. Scroll exit does not run the smoke/melt effect; use `play('exit')` for animated disappearance.
|
|
111
|
+
- After adding or removing automatic targets, call `refresh()`. Destroy owned attachments on component unmount; see the guide for back/forward-cache handling.
|
|
112
|
+
- Ordinary page content uses a shared document-connected canvas. Special layouts can route to a local canvas. Arbitrary CSS stacking, clipping and typography are not fully reproduced.
|
|
113
|
+
- SVG support is a static shape/path subset. Unsupported SVG/CSS and images blocked by canvas CORS restrictions can remain native.
|
|
114
|
+
- This Free build does not include editable inputs, arbitrary effect customization or a dedicated React/Vue component pack.
|
|
115
|
+
|
|
116
|
+
EV-RY FX Free is [MIT licensed](https://github.com/kbaghini/evry-fx/blob/main/LICENSE). Bundled dependencies retain their own licenses and [notices](https://github.com/kbaghini/evry-fx/blob/main/NOTICE.md). This license covers the Free distribution; other editions are separate.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Copyright 2022 The Estedad Project Authors (https://github.com/aminabedi68/Estedad)
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
This license is copied below, and is also available with a FAQ at:
|
|
5
|
+
https://openfontlicense.org
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------
|
|
9
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
+
-----------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
PREAMBLE
|
|
13
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
+
development of collaborative font projects, to support the font creation
|
|
15
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
+
open framework in which fonts may be shared and improved in partnership
|
|
17
|
+
with others.
|
|
18
|
+
|
|
19
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
+
redistributed and/or sold with any software provided that any reserved
|
|
23
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
+
however, cannot be released under any other type of license. The
|
|
25
|
+
requirement for fonts to remain under this license does not apply
|
|
26
|
+
to any document created using the fonts or their derivatives.
|
|
27
|
+
|
|
28
|
+
DEFINITIONS
|
|
29
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
+
include source files, build scripts and documentation.
|
|
32
|
+
|
|
33
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
+
copyright statement(s).
|
|
35
|
+
|
|
36
|
+
"Original Version" refers to the collection of Font Software components as
|
|
37
|
+
distributed by the Copyright Holder(s).
|
|
38
|
+
|
|
39
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
+
new environment.
|
|
43
|
+
|
|
44
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
+
writer or other person who contributed to the Font Software.
|
|
46
|
+
|
|
47
|
+
PERMISSION & CONDITIONS
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
+
Software, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
1) Neither the Font Software nor any of its individual components,
|
|
54
|
+
in Original or Modified Versions, may be sold by itself.
|
|
55
|
+
|
|
56
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
+
redistributed and/or sold with any software, provided that each copy
|
|
58
|
+
contains the above copyright notice and this license. These can be
|
|
59
|
+
included either as stand-alone text files, human-readable headers or
|
|
60
|
+
in the appropriate machine-readable metadata fields within text or
|
|
61
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
+
|
|
63
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
+
presented to the users.
|
|
67
|
+
|
|
68
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
+
Software shall not be used to promote, endorse or advertise any
|
|
70
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
+
permission.
|
|
73
|
+
|
|
74
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
+
must be distributed entirely under this license, and must not be
|
|
76
|
+
distributed under any other license. The requirement for fonts to
|
|
77
|
+
remain under this license does not apply to any document created
|
|
78
|
+
using the Font Software.
|
|
79
|
+
|
|
80
|
+
TERMINATION
|
|
81
|
+
This license becomes null and void if any of the above conditions are
|
|
82
|
+
not met.
|
|
83
|
+
|
|
84
|
+
DISCLAIMER
|
|
85
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2021 Jason Johnston
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function r(){return function(r){var e={R:"13k,1a,2,3,3,2+1j,ch+16,a+1,5+2,2+n,5,a,4,6+16,4+3,h+1b,4mo,179q,2+9,2+11,2i9+7y,2+68,4,3+4,5+13,4+3,2+4k,3+29,8+cf,1t+7z,w+17,3+3m,1t+3z,16o1+5r,8+30,8+mc,29+1r,29+4v,75+73",EN:"1c+9,3d+1,6,187+9,513,4+5,7+9,sf+j,175h+9,qw+q,161f+1d,4xt+a,25i+9",ES:"17,2,6dp+1,f+1,av,16vr,mx+1,4o,2",ET:"z+2,3h+3,b+1,ym,3e+1,2o,p4+1,8,6u,7c,g6,1wc,1n9+4,30+1b,2n,6d,qhx+1,h0m,a+1,49+2,63+1,4+1,6bb+3,12jj",AN:"16o+5,2j+9,2+1,35,ed,1ff2+9,87+u",CS:"18,2+1,b,2u,12k,55v,l,17v0,2,3,53,2+1,b",B:"a,3,f+2,2v,690",S:"9,2,k",WS:"c,k,4f4,1vk+a,u,1j,335",ON:"x+1,4+4,h+5,r+5,r+3,z,5+3,2+1,2+1,5,2+2,3+4,o,w,ci+1,8+d,3+d,6+8,2+g,39+1,9,6+1,2,33,b8,3+1,3c+1,7+1,5r,b,7h+3,sa+5,2,3i+6,jg+3,ur+9,2v,ij+1,9g+9,7+a,8m,4+1,49+x,14u,2+2,c+2,e+2,e+2,e+1,i+n,e+e,2+p,u+2,e+2,36+1,2+3,2+1,b,2+2,6+5,2,2,2,h+1,5+4,6+3,3+f,16+2,5+3l,3+81,1y+p,2+40,q+a,m+13,2r+ch,2+9e,75+hf,3+v,2+2w,6e+5,f+6,75+2a,1a+p,2+2g,d+5x,r+b,6+3,4+o,g,6+1,6+2,2k+1,4,2j,5h+z,1m+1,1e+f,t+2,1f+e,d+3,4o+3,2s+1,w,535+1r,h3l+1i,93+2,2s,b+1,3l+x,2v,4g+3,21+3,kz+1,g5v+1,5a,j+9,n+v,2,3,2+8,2+1,3+2,2,3,46+1,4+4,h+5,r+5,r+a,3h+2,4+6,b+4,78,1r+24,4+c,4,1hb,ey+6,103+j,16j+c,1ux+7,5+g,fsh,jdq+1t,4,57+2e,p1,1m,1m,1m,1m,4kt+1,7j+17,5+2r,d+e,3+e,2+e,2+10,m+4,w,1n+5,1q,4z+5,4b+rb,9+c,4+c,4+37,d+2g,8+b,l+b,5+1j,9+9,7+13,9+t,3+1,27+3c,2+29,2+3q,d+d,3+4,4+2,6+6,a+o,8+6,a+2,e+6,16+42,2+1i",BN:"0+8,6+d,2s+5,2+p,e,4m9,1kt+2,2b+5,5+5,17q9+v,7k,6p+8,6+1,119d+3,440+7,96s+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+75,6p+2rz,1ben+1,1ekf+1,1ekf+1",NSM:"lc+33,7o+6,7c+18,2,2+1,2+1,2,21+a,1d+k,h,2u+6,3+5,3+1,2+3,10,v+q,2k+a,1n+8,a,p+3,2+8,2+2,2+4,18+2,3c+e,2+v,1k,2,5+7,5,4+6,b+1,u,1n,5+3,9,l+1,r,3+1,1m,5+1,5+1,3+2,4,v+1,4,c+1,1m,5+4,2+1,5,l+1,n+5,2,1n,3,2+3,9,8+1,c+1,v,1q,d,1f,4,1m+2,6+2,2+3,8+1,c+1,u,1n,g+1,l+1,t+1,1m+1,5+3,9,l+1,u,21,8+2,2,2j,3+6,d+7,2r,3+8,c+5,23+1,s,2,2,1k+d,2+4,2+1,6+a,2+z,a,2v+3,2+5,2+1,3+1,q+1,5+2,h+3,e,3+1,7,g,jk+2,qb+2,u+2,u+1,v+1,1t+1,2+6,9,3+a,a,1a+2,3c+1,z,3b+2,5+1,a,7+2,64+1,3,1n,2+6,2,2,3+7,7+9,3,1d+g,1s+3,1d,2+4,2,6,15+8,d+1,x+3,3+1,2+2,1l,2+1,4,2+2,1n+7,3+1,49+2,2+c,2+6,5,7,4+1,5j+1l,2+4,k1+w,2db+2,3y,2p+v,ff+3,30+1,n9x+3,2+9,x+1,29+1,7l,4,5,q+1,6,48+1,r+h,e,13+7,q+a,1b+2,1d,3+3,3+1,14,1w+5,3+1,3+1,d,9,1c,1g,2+2,3+1,6+1,2,17+1,9,6n,3,5,fn5,ki+f,h+f,r2,6b,46+4,1af+2,2+1,6+3,15+2,5,4m+1,fy+3,as+1,4a+a,4x,1j+e,1l+2,1e+3,3+1,1y+2,11+4,2+7,1r,d+1,1h+8,b+3,3,2o+2,3,2+1,7,4h,4+7,m+1,1m+1,4,12+6,4+4,5g+7,3+2,2,o,2d+5,2,5+1,2+1,6n+3,7+1,2+1,s+1,2e+7,3,2+1,2z,2,3+5,2,2u+2,3+3,2+4,78+8,2+1,75+1,2,5,41+3,3+1,5,x+5,3+1,15+5,3+3,9,a+5,3+2,1b+c,2+1,bb+6,2+5,2d+l,3+6,2+1,2+1,3f+5,4,2+1,2+6,2,21+1,4,2,9o+1,f0c+4,1o+6,t5,1s+3,2a,f5l+1,43t+2,i+7,3+6,v+3,45+2,1j0+1i,5+1d,9,f,n+4,2+e,11t+6,2+g,3+6,2+1,2+4,7a+6,c6+3,15t+6,32+6,gzhy+6n",AL:"16w,3,2,e+1b,z+2,2+2s,g+1,8+1,b+m,2+t,s+2i,c+e,4h+f,1d+1e,1bwe+dp,3+3z,x+c,2+1,35+3y,2rm+z,5+7,b+5,dt+l,c+u,17nl+27,1t+27,4x+6n,3+d",LRO:"6ct",RLO:"6cu",LRE:"6cq",RLE:"6cr",PDF:"6cs",LRI:"6ee",RLI:"6ef",FSI:"6eg",PDI:"6eh"},f={},a={};f.L=1,a[1]="L",Object.keys(e).forEach((function(r,e){f[r]=1<<e+1,a[f[r]]=r})),Object.freeze(f);var n=f.LRI|f.RLI|f.FSI,v=f.L|f.R|f.AL,i=f.B|f.S|f.WS|f.ON|f.FSI|f.LRI|f.RLI|f.PDI,o=f.BN|f.RLE|f.LRE|f.RLO|f.LRO|f.PDF,t=f.S|f.WS|f.B|n|f.PDI|o,u=null;function l(r){return function(){if(!u){u=new Map;var r=function(r){if(e.hasOwnProperty(r)){var a=0;e[r].split(",").forEach((function(e){var n=e.split("+"),v=n[0],i=n[1];v=parseInt(v,36),i=i?parseInt(i,36):0,u.set(a+=v,f[r]);for(var o=0;o<i;o++)u.set(++a,f[r])}))}};for(var a in e)r(a)}}(),u.get(r.codePointAt(0))||f.L}var c,d,b,s="14>1,1e>2,u>2,2wt>1,1>1,1ge>1,1wp>1,1j>1,f>1,hm>1,1>1,u>1,u6>1,1>1,+5,28>1,w>1,1>1,+3,b8>1,1>1,+3,1>3,-1>-1,3>1,1>1,+2,1s>1,1>1,x>1,th>1,1>1,+2,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,4q>1,1e>2,u>2,2>1,+1",k="6f1>-6dx,6dy>-6dx,6ec>-6ed,6ee>-6ed,6ww>2jj,-2ji>2jj,14r4>-1e7l,1e7m>-1e7l,1e7m>-1e5c,1e5d>-1e5b,1e5c>-14qx,14qy>-14qx,14vn>-1ecg,1ech>-1ecg,1edu>-1ecg,1eci>-1ecg,1eda>-1ecg,1eci>-1ecg,1eci>-168q,168r>-168q,168s>-14ye,14yf>-14ye";function h(r,e){var f,a=0,n=new Map,v=e&&new Map;return r.split(",").forEach((function r(i){if(-1!==i.indexOf("+"))for(var o=+i;o--;)r(f);else{f=i;var t=i.split(">"),u=t[0],l=t[1];u=String.fromCodePoint(a+=parseInt(u,36)),l=String.fromCodePoint(a+=parseInt(l,36)),n.set(u,l),e&&v.set(l,u)}})),{map:n,reverseMap:v}}function m(){if(!c){var r=h(s,!0),e=r.map,f=r.reverseMap;c=e,d=f,b=h(k,!1).map}}function j(r){return m(),c.get(r)||null}function g(r){return m(),d.get(r)||null}function p(r){return m(),b.get(r)||null}var q=f.L,w=f.R,x=f.EN,_=f.ES,y=f.ET,M=f.AN,z=f.CS,I=f.B,L=f.S,S=f.ON,R=f.BN,O=f.NSM,E=f.AL,N=f.LRO,A=f.RLO,D=f.LRE,P=f.RLE,T=f.PDF,W=f.LRI,B=f.RLI,F=f.FSI,U=f.PDI;var C;function G(r){return function(){if(!C){var r=h("14>1,j>2,t>2,u>2,1a>g,2v3>1,1>1,1ge>1,1wd>1,b>1,1j>1,f>1,ai>3,-2>3,+1,8>1k0,-1jq>1y7,-1y6>1hf,-1he>1h6,-1h5>1ha,-1h8>1qi,-1pu>1,6>3u,-3s>7,6>1,1>1,f>1,1>1,+2,3>1,1>1,+13,4>1,1>1,6>1eo,-1ee>1,3>1mg,-1me>1mk,-1mj>1mi,-1mg>1mi,-1md>1,1>1,+2,1>10k,-103>1,1>1,4>1,5>1,1>1,+10,3>1,1>8,-7>8,+1,-6>7,+1,a>1,1>1,u>1,u6>1,1>1,+5,26>1,1>1,2>1,2>2,8>1,7>1,4>1,1>1,+5,b8>1,1>1,+3,1>3,-2>1,2>1,1>1,+2,c>1,3>1,1>1,+2,h>1,3>1,a>1,1>1,2>1,3>1,1>1,d>1,f>1,3>1,1a>1,1>1,6>1,7>1,13>1,k>1,1>1,+19,4>1,1>1,+2,2>1,1>1,+18,m>1,a>1,1>1,lk>1,1>1,4>1,2>1,f>1,3>1,1>1,+3,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,6>1,4j>1,j>2,t>2,u>2,2>1,+1",!0),e=r.map;r.reverseMap.forEach((function(r,f){e.set(f,r)})),C=e}}(),C.get(r)||null}function H(r,e,f,a){var n=r.length;f=Math.max(0,null==f?0:+f),a=Math.min(n-1,null==a?n-1:+a);var v=[];return e.paragraphs.forEach((function(n){var i=Math.max(f,n.start),o=Math.min(a,n.end);if(i<o){for(var u=e.levels.slice(i,o+1),c=o;c>=i&&l(r[c])&t;c--)u[c]=n.level;for(var d=n.level,b=1/0,s=0;s<u.length;s++){var k=u[s];k>d&&(d=k),k<b&&(b=1|k)}for(var h=d;h>=b;h--)for(var m=0;m<u.length;m++)if(u[m]>=h){for(var j=m;m+1<u.length&&u[m+1]>=h;)m++;m>j&&v.push([j+i,m+i])}}})),v}function J(r,e,f,a){for(var n=H(r,e,f,a),v=[],i=0;i<r.length;i++)v[i]=i;return n.forEach((function(r){for(var e=r[0],f=r[1],a=v.slice(e,f+1),n=a.length;n--;)v[f-n]=a[n]})),v}return r.closingToOpeningBracket=g,r.getBidiCharType=l,r.getBidiCharTypeName=function(r){return a[l(r)]},r.getCanonicalBracket=p,r.getEmbeddingLevels=function(r,e){for(var f=new Uint32Array(r.length),a=0;a<r.length;a++)f[a]=l(r[a]);var u=new Map;function c(r,e){var a=f[r];f[r]=e,u.set(a,u.get(a)-1),a&i&&u.set(i,u.get(i)-1),u.set(e,(u.get(e)||0)+1),e&i&&u.set(i,(u.get(i)||0)+1)}for(var d=new Uint8Array(r.length),b=new Map,s=[],k=null,h=0;h<r.length;h++)k||s.push(k={start:h,end:r.length-1,level:"rtl"===e?1:"ltr"===e?0:Fe(h,!1)}),f[h]&I&&(k.end=h,k=null);for(var m=P|D|A|N|n|U|T|I,C=function(r){return r+(1&r?1:2)},G=function(r){return r+(1&r?2:1)},H=0;H<s.length;H++){var J=[{v:(k=s[H]).level,i:0,o:0}],K=void 0,Q=0,V=0,X=0;u.clear();for(var Y=k.start;Y<=k.end;Y++){var Z=f[Y];if(K=J[J.length-1],u.set(Z,(u.get(Z)||0)+1),Z&i&&u.set(i,(u.get(i)||0)+1),Z&m)if(Z&(P|D)){d[Y]=K.v;var $=(Z===P?G:C)(K.v);$<=125&&!Q&&!V?J.push({v:$,i:0,o:0}):Q||V++}else if(Z&(A|N)){d[Y]=K.v;var rr=(Z===A?G:C)(K.v);rr<=125&&!Q&&!V?J.push({v:rr,i:Z&A?w:q,o:0}):Q||V++}else if(Z&n){Z&F&&(Z=1===Fe(Y+1,!0)?B:W),d[Y]=K.v,K.i&&c(Y,K.i);var er=(Z===B?G:C)(K.v);er<=125&&0===Q&&0===V?(X++,J.push({v:er,i:0,o:1,t:Y})):Q++}else if(Z&U){if(Q>0)Q--;else if(X>0){for(V=0;!J[J.length-1].o;)J.pop();var fr=J[J.length-1].t;null!=fr&&(b.set(fr,Y),b.set(Y,fr)),J.pop(),X--}K=J[J.length-1],d[Y]=K.v,K.i&&c(Y,K.i)}else Z&T?(0===Q&&(V>0?V--:!K.o&&J.length>1&&(J.pop(),K=J[J.length-1])),d[Y]=K.v):Z&I&&(d[Y]=k.level);else d[Y]=K.v,K.i&&Z!==R&&c(Y,K.i)}for(var ar=[],nr=null,vr=k.start;vr<=k.end;vr++){var ir=f[vr];if(!(ir&o)){var or=d[vr],tr=ir&n,ur=ir===U;nr&&or===nr.v?(nr.u=vr,nr.l=tr):ar.push(nr={k:vr,u:vr,v:or,h:ur,l:tr})}}for(var lr=[],cr=0;cr<ar.length;cr++){var dr=ar[cr];if(!dr.h||dr.h&&!b.has(dr.k)){for(var br=[nr=dr],sr=void 0;nr&&nr.l&&null!=(sr=b.get(nr.u));)for(var kr=cr+1;kr<ar.length;kr++)if(ar[kr].k===sr){br.push(nr=ar[kr]);break}for(var hr=[],mr=0;mr<br.length;mr++)for(var jr=br[mr],gr=jr.k;gr<=jr.u;gr++)hr.push(gr);for(var pr=d[hr[0]],qr=k.level,wr=hr[0]-1;wr>=0;wr--)if(!(f[wr]&o)){qr=d[wr];break}var xr=hr[hr.length-1],_r=d[xr],yr=k.level;if(!(f[xr]&n))for(var Mr=xr+1;Mr<=k.end;Mr++)if(!(f[Mr]&o)){yr=d[Mr];break}lr.push({m:hr,j:Math.max(qr,pr)%2?w:q,g:Math.max(yr,_r)%2?w:q})}}for(var zr=0;zr<lr.length;zr++){var Ir=lr[zr],Lr=Ir.m,Sr=Ir.j,Rr=Ir.g,Or=1&d[Lr[0]]?w:q;if(u.get(O))for(var Er=0;Er<Lr.length;Er++){var Nr=Lr[Er];if(f[Nr]&O){for(var Ar=Sr,Dr=Er-1;Dr>=0;Dr--)if(!(f[Lr[Dr]]&o)){Ar=f[Lr[Dr]];break}c(Nr,Ar&(n|U)?S:Ar)}}if(u.get(x))for(var Pr=0;Pr<Lr.length;Pr++){var Tr=Lr[Pr];if(f[Tr]&x)for(var Wr=Pr-1;Wr>=-1;Wr--){var Br=-1===Wr?Sr:f[Lr[Wr]];if(Br&v){Br===E&&c(Tr,M);break}}}if(u.get(E))for(var Fr=0;Fr<Lr.length;Fr++){var Ur=Lr[Fr];f[Ur]&E&&c(Ur,w)}if(u.get(_)||u.get(z))for(var Cr=1;Cr<Lr.length-1;Cr++){var Gr=Lr[Cr];if(f[Gr]&(_|z)){for(var Hr=0,Jr=0,Kr=Cr-1;Kr>=0&&(Hr=f[Lr[Kr]])&o;Kr--);for(var Qr=Cr+1;Qr<Lr.length&&(Jr=f[Lr[Qr]])&o;Qr++);Hr===Jr&&(f[Gr]===_?Hr===x:Hr&(x|M))&&c(Gr,Hr)}}if(u.get(x))for(var Vr=0;Vr<Lr.length;Vr++){var Xr=Lr[Vr];if(f[Xr]&x){for(var Yr=Vr-1;Yr>=0&&f[Lr[Yr]]&(y|o);Yr--)c(Lr[Yr],x);for(Vr++;Vr<Lr.length&&f[Lr[Vr]]&(y|o|x);Vr++)f[Lr[Vr]]!==x&&c(Lr[Vr],x)}}if(u.get(y)||u.get(_)||u.get(z))for(var Zr=0;Zr<Lr.length;Zr++){var $r=Lr[Zr];if(f[$r]&(y|_|z)){c($r,S);for(var re=Zr-1;re>=0&&f[Lr[re]]&o;re--)c(Lr[re],S);for(var ee=Zr+1;ee<Lr.length&&f[Lr[ee]]&o;ee++)c(Lr[ee],S)}}if(u.get(x))for(var fe=0,ae=Sr;fe<Lr.length;fe++){var ne=Lr[fe],ve=f[ne];ve&x?ae===q&&c(ne,q):ve&v&&(ae=ve)}if(u.get(i)){for(var ie=w|x|M,oe=ie|q,te=[],ue=[],le=0;le<Lr.length;le++)if(f[Lr[le]]&i){var ce=r[Lr[le]],de=void 0;if(null!==j(ce)){if(!(ue.length<63))break;ue.push({char:ce,seqIndex:le})}else if(null!==(de=g(ce)))for(var be=ue.length-1;be>=0;be--){var se=ue[be].char;if(se===de||se===g(p(ce))||j(p(se))===ce){te.push([ue[be].seqIndex,le]),ue.length=be;break}}}te.sort((function(r,e){return r[0]-e[0]}));for(var ke=0;ke<te.length;ke++){for(var he=te[ke],me=he[0],je=he[1],ge=!1,pe=0,qe=me+1;qe<je;qe++){var we=Lr[qe];if(f[we]&oe){ge=!0;var xe=f[we]&ie?w:q;if(xe===Or){pe=xe;break}}}if(ge&&!pe){pe=Sr;for(var _e=me-1;_e>=0;_e--){var ye=Lr[_e];if(f[ye]&oe){var Me=f[ye]&ie?w:q;pe=Me!==Or?Me:Or;break}}}if(pe){if(f[Lr[me]]=f[Lr[je]]=pe,pe!==Or)for(var ze=me+1;ze<Lr.length;ze++)if(!(f[Lr[ze]]&o)){l(r[Lr[ze]])&O&&(f[Lr[ze]]=pe);break}if(pe!==Or)for(var Ie=je+1;Ie<Lr.length;Ie++)if(!(f[Lr[Ie]]&o)){l(r[Lr[Ie]])&O&&(f[Lr[Ie]]=pe);break}}}for(var Le=0;Le<Lr.length;Le++)if(f[Lr[Le]]&i){for(var Se=Le,Re=Le,Oe=Sr,Ee=Le-1;Ee>=0;Ee--){if(!(f[Lr[Ee]]&o)){Oe=f[Lr[Ee]]&ie?w:q;break}Se=Ee}for(var Ne=Rr,Ae=Le+1;Ae<Lr.length;Ae++){if(!(f[Lr[Ae]]&(i|o))){Ne=f[Lr[Ae]]&ie?w:q;break}Re=Ae}for(var De=Se;De<=Re;De++)f[Lr[De]]=Oe===Ne?Oe:Or;Le=Re}}}for(var Pe=k.start;Pe<=k.end;Pe++){var Te=d[Pe],We=f[Pe];if(1&Te?We&(q|x|M)&&d[Pe]++:We&w?d[Pe]++:We&(M|x)&&(d[Pe]+=2),We&o&&(d[Pe]=0===Pe?k.level:d[Pe-1]),Pe===k.end||l(r[Pe])&(L|I))for(var Be=Pe;Be>=0&&l(r[Be])&t;Be--)d[Be]=k.level}}return{levels:d,paragraphs:s};function Fe(e,a){for(var v=e;v<r.length;v++){var i=f[v];if(i&(w|E))return 1;if(i&(I|q)||a&&i===U)return 0;if(i&n){var o=Ue(v);v=-1===o?r.length:o}}return 0}function Ue(e){for(var a=1,v=e+1;v<r.length;v++){var i=f[v];if(i&I)break;if(i&U){if(0==--a)return v}else i&n&&a++}return-1}},r.getMirroredCharacter=G,r.getMirroredCharactersMap=function(r,e,f,a){var n=r.length;f=Math.max(0,null==f?0:+f),a=Math.min(n-1,null==a?n-1:+a);for(var v=new Map,i=f;i<=a;i++)if(1&e[i]){var o=G(r[i]);null!==o&&v.set(i,o)}return v},r.getReorderSegments=H,r.getReorderedIndices=J,r.getReorderedString=function(r,e,f,a){var n=J(r,e,f,a),v=[].concat(r);return n.forEach((function(f,a){v[a]=(1&e.levels[f]?G(r[f]):null)||r[f]})),v.join("")},r.openingToClosingBracket=j,Object.defineProperty(r,"p",{value:!0}),r}({})}export default r;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License
|
|
2
|
+
|
|
3
|
+
Copyright © 2010-2023 three.js authors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|