52 Commits

Author SHA1 Message Date
Sped0n
1acf24a519 ci: update bundled artifacts [skip ci] 2024-02-20 20:17:00 +00:00
dependabot[bot]
e2afe91131 build(deps): bump rollup from 4.9.6 to 4.12.0 (#281)
Bumps [rollup](https://github.com/rollup/rollup) from 4.9.6 to 4.12.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.9.6...v4.12.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-21 04:15:25 +08:00
Sped0n
3e51b96825 ci: update bundled artifacts [skip ci] 2024-02-11 06:23:22 +00:00
Spedon
c84b4cf234 refactor: better event listener cleanup (#279)
* refactor: change hires loader function name

* feat: add loading transition animation and improve performance

* refactor: refactor gallery creation and update functions

* feat: create createDivWithClass utility function

* feat: refactor abort signal handling in event listener and promise chain

- Add functionality to set up an abort controller for cleanup
- Add an event listener to abort the controller when necessary
- Modify event listener to include the abort signal
- Modify promise chain to include the abort signal
2024-02-11 14:22:48 +08:00
Spedon
997207fa90 feat: remove source image in public to prevent leakage (#278)
* refactor: change hires loader function name

* feat: add loading transition animation and improve performance

* feat: hide image source in exampleSite

* docs: update docs for publishResources
2024-02-06 23:40:46 +08:00
Sped0n
f7d2c7962c ci: update bundled artifacts [skip ci] 2024-02-06 15:13:23 +00:00
Spedon
0812a5a6b8 feat: loading transition (#277)
* refactor: change hires loader function name

* feat: add loading transition animation and improve performance

* refactor: refactor mutation handling in desktop codebase

- Modify the `initStage` function in `assets/ts/desktop/stage.ts`:
  - Change the `onMutation` callback to accept a single mutation instead of an array of mutations.
  - Update the conditions inside the callback to use `hold` instead of `skip`.
- Modify the `onMutation` function in `assets/ts/desktop/utils.ts`:
  - Change the `callback` parameter to `trigger`.
  - Update the implementation of the function to iterate over each mutation and check if it triggers the `trigger` function. If it does, disconnect the observer and break the loop.

* style: refactor state section and remove unnecessary code

- Remove the declaration of `lastIndex` on line 21
- Add a comment block for the state section
- Add a declaration of `lastIndex` for the state section

* refactor: refactor mobile collection and intersection functions

- Modify the `initCollection` function in `assets/ts/mobile/collection.ts`
- Remove the nested loop in the `initCollection` function
- Modify the `onIntersection` function in `assets/ts/mobile/utils.ts`
- Replace the callback parameter with a trigger parameter in the `onIntersection` function
- Remove the nested loop in the `onIntersection` function

* refactor: refactor Watchable class constructor to include lazy parameter

- Add a second parameter `lazy` in the constructor of the `Watchable` class in `globalUtils.ts`
- Set the default value of `lazy` to `true` in the constructor
- Add a condition to check if `e` is equal to `this.obj` and `this.lazy` is `true` to return in `watch`
- Delete the previous constructor definition in the `Watchable` class in `globalUtils.ts`

* fix: set state's lazy param to false

* refactor: refactor third party lib import
2024-02-06 23:12:44 +08:00
dependabot[bot]
7fd971eb13 build(deps-dev): bump @typescript-eslint/eslint-plugin (#275)
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 6.20.0 to 6.21.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.21.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-06 22:18:13 +08:00
Sped0n
881b0b6490 ci: update commit message for bundled artifacts 2024-02-06 22:17:41 +08:00
Sped0n
50d7b14133 ci: update bundled artifacts 2024-02-06 14:13:56 +00:00
dependabot[bot]
872d23ad13 build(deps-dev): bump @typescript-eslint/parser from 6.20.0 to 6.21.0 (#274)
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.20.0 to 6.21.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.21.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-06 22:13:14 +08:00
dependabot[bot]
eeca83a74b build(deps-dev): bump prettier from 3.2.4 to 3.2.5 (#273)
Bumps [prettier](https://github.com/prettier/prettier) from 3.2.4 to 3.2.5.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.2.4...3.2.5)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-06 22:12:58 +08:00
dependabot[bot]
3170f5b65a build(deps): bump swiper from 11.0.5 to 11.0.6 (#272)
Bumps [swiper](https://github.com/nolimits4web/Swiper) from 11.0.5 to 11.0.6.
- [Release notes](https://github.com/nolimits4web/Swiper/releases)
- [Changelog](https://github.com/nolimits4web/swiper/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nolimits4web/Swiper/compare/v11.0.5...v11.0.6)

---
updated-dependencies:
- dependency-name: swiper
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-06 22:12:31 +08:00
Spedon
bf1c5e21bc ci: prefine github action (#276)
* ci: migrate bundled artifacts update from pull request to direct commit

* ci: update lint workflow to include code formatting and auto-commit

* chore: update .prettierignore to include yaml files

- Remove the exclusion of `*.yaml` and `*.yml` files from being formatted by Prettier in the `.prettierignore` file.

* ci: update lint workflow conditions

* ci: format code

---------

Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-02-06 22:03:50 +08:00
Spedon
d08e2c92b8 ci: update bundled artifacts (#270)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-02-05 16:03:54 +08:00
Spedon
ba07636f8f refactor: prefine for version v1.0.2 (#269)
* refactor: refactor navigateVector logic and remove unused functions

* refactor: refactor HTML structure and styling in single.html

- Modify the `.info` class to `article` in `_article.scss`
- Remove the `nav.html` partial in `single.html`
- Change the class name from `info` to `article` in `single.html`
- Add the `nav.html` partial in `single.html`

* refactor: update handling of 404 page
- Now hugo will set unknown page title as "404"
- Add condition to return an empty image array if the document title starts with "404"

* docs: update documentation
2024-02-05 16:02:10 +08:00
Spedon
a98c6a4a60 ci: update bundled artifacts (#268)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-02-04 00:47:15 +08:00
Spedon
c1414bbfc5 fix: fix mobile loading issue (#267)
* fix: update navigateVector reset behavior

* fix: remove unnecessary function call

* fix: update loading text to include ellipsis
2024-02-04 00:45:09 +08:00
Spedon
22b81a8e1d ci: update bundled artifacts (#265)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-02-03 23:48:53 +08:00
Spedon
8432540bde fix: fix text content setting in close element to use dataset (#264) 2024-02-03 23:47:27 +08:00
dependabot[bot]
bb056d9c4f build(deps-dev): bump @typescript-eslint/eslint-plugin (#257)
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 6.19.0 to 6.20.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.20.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 23:35:15 +08:00
dependabot[bot]
6bf10c103f build(deps-dev): bump @typescript-eslint/parser from 6.19.0 to 6.20.0 (#258)
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.19.0 to 6.20.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.20.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Spedon <70063177+Sped0n@users.noreply.github.com>
2024-02-03 23:33:53 +08:00
Spedon
1b1aea5047 ci: update bundled artifacts (#263)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-02-03 23:31:59 +08:00
Spedon
5132e36e87 fix: fix navItems sequence (#262) 2024-02-03 23:30:42 +08:00
Spedon
964c1802d3 ci: update build.yml file (#261)
- Modify the title and commit message for updating bundled artifacts in the build.yml file
2024-02-03 23:26:28 +08:00
Spedon
0af4e20720 Update bundled artifacts (#260)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-02-03 23:19:24 +08:00
Spedon
1f65b08b56 refactor: refactor the pile of crap I wrote before 🤡 (#259)
* feat: refactor file structure and imports in mobile and desktop components

- Removed the import of `scrollable` from `assets/ts/mobile/scroll.ts`
- Renamed `assets/ts/mobile/mounted.ts` to `assets/ts/mobile/state.ts`
- Changed the import of `active` from `./stage` to `./state` in `assets/ts/desktop/customCursor.ts`
- Changed the import of `active` from `../state` to `../globalState` in `assets/ts/desktop/stage.ts`
- Changed the import of `active` from `./stage` to `./state` in `assets/ts/desktop/stageNav.ts`
- Renamed `assets/ts/state.ts` to `assets/ts/globalState.ts`
- Created a new file `assets/ts/desktop/state.ts`
- Added the interface `HistoryItem` to `assets/ts/desktop/state.ts`
- Added the variables `cordHist`, `isOpen`, `active`, and `isLoading` to `assets/ts/desktop/state.ts`
- Deleted the function `loader` from `assets/ts/desktop/stage.ts` and replaced it with `setLoaderForImage`
- Deleted the import of `./stage` from `assets/ts/desktop/stageNav.ts`
- Added the import of `minimizeImage` from `./stage` in `assets/ts/desktop/stageNav.ts`
- Deleted the import of `./mounted` from `assets/ts/mobile/collection.ts`
- Changed the import of `mounted` from `./mounted` to `./state` in `

* refactor: refactor the `onVisible` function to improve performance

- Modify the type of the `onVisible` function parameter `T` to extend `HTMLElement`
- Change the `entries.forEach` loop in the `onVisible` function to `entries.every`

* feat: add new function for detecting opacity changes in element

- Add a new function `onOpacityOne` in `assets/ts/utils.ts`
- The function uses a `MutationObserver` to check for opacity changes on an element
- When the element's opacity reaches `1`, the provided callback function is called
- The `MutationObserver` is disconnected after the callback is executed

* refactor: refactor function names and parameters in intersection and mutation observers

- Change the function name `onVisible` to `onIntersection`
- Modify the `callback` parameter in the `onIntersection` function to accept `IntersectionObserverEntry[]` and `IntersectionObserver` parameters
- Remove the code block that checks for intersection ratio and immediately calls the `callback` function in the `onIntersection` function
- Modify the function name `onOpacityOne` to `onMutation`
- Modify the `callback` parameter in the `onMutation` function to accept `MutationRecord[]` and `MutationObserver` parameters
- Add a default value for the `observeOptions` parameter in the `onMutation` function

* refactor: refine preload logic on both mobile and desktop

* refactor: refactor import statements and add new files

- The import statement for `Watchable` in `assets/ts/globalState.ts` has been changed from `../utils` to `../globalUtils`
- The import statement for `Watchable` in `assets/ts/desktop/state.ts` has been changed from `../utils` to `../globalUtils`
- The import statement for `decrement` and `increment` in `assets/ts/desktop/stageNav.ts` has been changed from `../utils` to `../globalUtils`
- A new file `utils.ts` has been added in the `assets/ts/desktop` directory
- The import statements for `getRandom`, `onIntersection`, and `type MobileImage` in `assets/ts/mobile/collection.ts` have been changed from `../utils` to `./utils`
- The `imgs` array in `assets/ts/mobile/collection.ts` has been changed from an array of `HTMLImageElement` to an array of `MobileImage`
- The import statements for `expand`, `loadGsap`, `loadSwiper`, and `removeDuplicates` in `assets/ts/mobile/gallery.ts` have been changed from `../utils` to `../globalUtils`
- The import statement for `type MobileImage` in `assets/ts/mobile/gallery.ts` has been changed from `./utils` to `../mobile/utils`
- The `galleryLoadImages` function in `assets/ts/mobile/gallery.ts` has been removed
- A new file `utils.ts`

* refactor: refactor swiper import and functions in mobile and global utils

* refactor: refactor navigation and image loading logic in desktop and mobile

* refactor: remove print function and optimize removeDuplicates return

* refactor: update text variable assignments and attributes

* refactor: update variable types in galleryImages and collectionImages in mobile/gallery.ts

* refactor: refactor variable types for consistency with naming conventions

* refactor: update animation durations and types in gallery functions

* refactor: refactor image loading logic and add console logs

* refactor: refactor sass hierarchy

* refactor: remove console logs in multiple files
2024-02-03 23:17:16 +08:00
Spedon
9bfaac25f5 Update bundled artifacts (#253)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-01-23 00:29:29 +08:00
Sped0n
794b5c0ea6 fix: fix indexing issue in loadImages function 2024-01-23 00:28:05 +08:00
Spedon
2fd34c2f7f refactor: replace svh with a more compatible approach (#252)
* first attempt

* second attempt

* blind commit
2024-01-23 00:06:42 +08:00
Spedon
44d7da48e3 Update bundled artifacts (#251)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-01-22 20:42:20 +08:00
Spedon
49e9f904e2 fix: fix article regresssion (#250)
* refactor: output article element when needed

* refactor: refactor container styles and media queries

- Add the `$tablet` variable to `_container.scss`
- Add a media query to `_container.scss`
- Import `_container.scss` in `critical.scss`
- Remove the import of `_container.scss` in `style.scss`
2024-01-22 20:35:15 +08:00
dependabot[bot]
1a3fade5fc build(deps-dev): bump eslint-plugin-n from 16.6.1 to 16.6.2 (#224)
Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 16.6.1 to 16.6.2.
- [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases)
- [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/16.6.1...16.6.2)

---
updated-dependencies:
- dependency-name: eslint-plugin-n
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 21:49:59 +08:00
dependabot[bot]
4e4c32384a build(deps-dev): bump eslint-plugin-prettier from 5.1.2 to 5.1.3 (#226)
Bumps [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) from 5.1.2 to 5.1.3.
- [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases)
- [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v5.1.2...v5.1.3)

---
updated-dependencies:
- dependency-name: eslint-plugin-prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 21:42:12 +08:00
dependabot[bot]
88b518b773 build(deps-dev): bump @typescript-eslint/parser from 6.17.0 to 6.19.0 (#233)
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.17.0 to 6.19.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.19.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 21:39:16 +08:00
dependabot[bot]
4eece4684a build(deps-dev): bump eslint-config-standard-with-typescript (#239)
Bumps [eslint-config-standard-with-typescript](https://github.com/mightyiam/eslint-config-standard-with-typescript) from 43.0.0 to 43.0.1.
- [Release notes](https://github.com/mightyiam/eslint-config-standard-with-typescript/releases)
- [Changelog](https://github.com/mightyiam/eslint-config-standard-with-typescript/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mightyiam/eslint-config-standard-with-typescript/compare/v43.0.0...v43.0.1)

---
updated-dependencies:
- dependency-name: eslint-config-standard-with-typescript
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 21:39:02 +08:00
dependabot[bot]
4f9b5ff311 build(deps-dev): bump prettier from 3.1.1 to 3.2.4 (#236)
Bumps [prettier](https://github.com/prettier/prettier) from 3.1.1 to 3.2.4.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.1.1...3.2.4)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 21:38:46 +08:00
dependabot[bot]
c123fd45be build(deps-dev): bump @typescript-eslint/eslint-plugin (#234)
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 6.17.0 to 6.19.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.19.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 21:36:04 +08:00
dependabot[bot]
09506d2d4e build(deps): bump @rollup/plugin-typescript from 11.1.5 to 11.1.6 (#225)
Bumps [@rollup/plugin-typescript](https://github.com/rollup/plugins/tree/HEAD/packages/typescript) from 11.1.5 to 11.1.6.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/typescript/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/typescript-v11.1.6/packages/typescript)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-typescript"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 21:35:45 +08:00
dependabot[bot]
08350cfb9f build(deps): bump rollup from 4.9.3 to 4.9.6 (#248)
Bumps [rollup](https://github.com/rollup/rollup) from 4.9.3 to 4.9.6.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.9.3...v4.9.6)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 21:33:57 +08:00
Spedon
cf2f36d232 blind commit (#249) 2024-01-21 21:33:20 +08:00
Spedon
480df04e55 Update bundled artifacts (#247)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-01-21 21:28:40 +08:00
dependabot[bot]
ae96a07793 build(deps): bump gsap from 3.12.4 to 3.12.5 (#237)
Bumps [gsap](https://github.com/greensock/GSAP) from 3.12.4 to 3.12.5.
- [Commits](https://github.com/greensock/GSAP/compare/3.12.4...3.12.5)

---
updated-dependencies:
- dependency-name: gsap
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Spedon <70063177+Sped0n@users.noreply.github.com>
2024-01-21 21:27:35 +08:00
Spedon
17ef30c18b docs: update documentation and warnings for customizations (#246) 2024-01-21 21:27:03 +08:00
Spedon
0717ce1051 Update bundled artifacts (#245)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-01-20 23:38:08 +08:00
Spedon
9fa1b718b8 feat: add loading indicator for desktop and mobile (#244)
* feat: add new CSS rule for hiding elements

- Add a new CSS rule for the class "hide" with a display property set to "none".

* feat: refactor image loading and navigation logic on desktop

- Add a line of code in `assets/ts/desktop/stage.ts` to reset the `src` of `elc` and add a class `hide` to it
- Add a line of code in `assets/ts/desktop/stage.ts` to call the `loader` function with `elc` as an argument
- Add a function `loader` in `assets/ts/desktop/stage.ts` to handle image loading and error events
- Modify the `initStageNav` function in `assets/ts/desktop/stageNav.ts` to watch the `isLoading` state and set custom cursor accordingly
- Modify the `initStageNav` function in `assets/ts/desktop/stageNav.ts` to handle close click events by calling the `handleClick` function and setting `isLoading` state to false
- Modify the `initStageNav` function in `assets/ts/desktop/stageNav.ts` to handle previous/next click events by calling the `handleClick` function only if `isLoading` is false
- Modify the `initStageNav` function in `assets/ts/desktop/stageNav.ts` to handle previous/next hover events by setting `loadedText` and updating custom cursor depending on `isLoading` state

* feat: refactor createGallery function and enhance loading functionality on mobile

- Add a loading text element to the gallery.scss file
- Add a loading indicator to the createGallery function in gallery.ts
- Modify the createGallery function in gallery.ts to hide the loading text element on image load
- Move the image element append logic to the parent container in the createGallery function in gallery.ts

* feat: update translations and add new loading translation in i18n files

* chore: remove css source map

* chore: modify build command to ignore css source map

* refactor: remove unnecessary style

* fix: fix desktop cursor text transition bug
2024-01-20 23:34:13 +08:00
Spedon
8c6b38bb49 fix: put article into container for style issue (#243) 2024-01-20 18:20:51 +08:00
Spedon
80c784262b Update bundled artifacts (#242)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-01-20 18:05:02 +08:00
Spedon
ae1a08eb82 feat: embed threshold and index val of navbar into html/inline js (#241)
* feat: refactor image retrieval logic and improve variable initialization

- Add a new file `layouts/partials/function/getImageSlice.html`
- Initialize variables `$context`, `$Path`, and `$params`
- Set `$Path` based on the result of the `partial/function/currentMenuItem.html` partial
- Retrieve the page `$gallery` based on `$Path`
- Return all resources of type `image` from `$gallery`

* refactor: adapt getImageSlice function to `single.json`

* feat: refactor navigation UI components to use static go template

* feat: update navigation functionality and threshold rendering
2024-01-20 18:03:26 +08:00
Spedon
ff1a76eef8 Update bundled artifacts (#240)
Co-authored-by: Sped0n <Sped0n@users.noreply.github.com>
2024-01-20 17:51:37 +08:00
Spedon
d9452ca8d2 fix: prevent page scrolling when in mobile modal (#238)
* fix: import `_partial/container.scss` in `style.scss`

- Add import for `_partial/container.scss` in `style.scss`

* chore: ignore CSS map files in .gitignore

- Added a new entry for `*.css.map` to the .gitignore file

* chore: update dependabot interval to weekly

- Update the interval of the dependabot from daily to weekly.

* fix: try to fix safari floating address bar issue

* fix: try again with svh
2024-01-20 16:46:10 +08:00
Spedon
3fef127666 fix: fix typo in index.md (#227) 2024-01-12 14:24:06 +08:00
65 changed files with 1156 additions and 661 deletions

View File

@@ -8,5 +8,5 @@ updates:
- package-ecosystem: 'npm' # See documentation for possible values - package-ecosystem: 'npm' # See documentation for possible values
directory: '/' # Location of package manifests directory: '/' # Location of package manifests
schedule: schedule:
interval: 'daily' interval: 'weekly'
open-pull-requests-limit: 1000 open-pull-requests-limit: 1000

View File

@@ -18,7 +18,7 @@ jobs:
outputs: outputs:
any_changed: ${{ steps.changed-files-specific.outputs.any_changed }} any_changed: ${{ steps.changed-files-specific.outputs.any_changed }}
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
@@ -45,7 +45,9 @@ jobs:
id: version id: version
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with:
token: ${{ secrets.PAT }}
- name: Setup Hugo - name: Setup Hugo
uses: peaceiris/actions-hugo@v2 uses: peaceiris/actions-hugo@v2
@@ -84,10 +86,6 @@ jobs:
- name: Push artifacts - name: Push artifacts
if: ${{ (github.event_name == 'push' || github.event.pull_request.merged == true) && needs.filter.outputs.any_changed == 'true' }} if: ${{ (github.event_name == 'push' || github.event.pull_request.merged == true) && needs.filter.outputs.any_changed == 'true' }}
uses: peter-evans/create-pull-request@v5 uses: stefanzweifel/git-auto-commit-action@v5
with: with:
token: ${{ secrets.PAT }} commit_message: 'ci: update bundled artifacts [skip ci]'
title: Update bundled artifacts
commit-message: Update bundled artifacts
branch: update-artifacts-${{ steps.version.outputs.builddate }}
base: main

View File

@@ -17,7 +17,9 @@ jobs:
name: Lint name: Lint
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with:
token: ${{ secrets.PAT }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v2 uses: pnpm/action-setup@v2
@@ -38,5 +40,18 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: pnpm install run: pnpm install
- name: Lint - name: Lint Check
continue-on-error: true
id: check
run: pnpm run lint:check run: pnpm run lint:check
- name: Format manually
id: format
if: ${{ steps.check.outcome == 'failure' }}
run: pnpm run lint
- name: Commit
if: ${{ steps.format.outcome == 'success' }}
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: 'ci: format code'

3
.gitignore vendored
View File

@@ -22,3 +22,6 @@ $RECYCLE.BIN/
# Hugo # Hugo
.hugo_build.lock .hugo_build.lock
jsconfig.json jsconfig.json
# css map
*.css.map

View File

@@ -1,6 +1,5 @@
node_modules node_modules
static static
exmapleSite exmapleSite
*.yaml
*.yml
single.json single.json
pnpm-lock.yaml

View File

@@ -17,3 +17,7 @@ a,
button { button {
cursor: pointer; cursor: pointer;
} }
.hide {
display: none;
}

View File

@@ -1,4 +1,4 @@
.info { article {
padding: var(--space-standard); padding: var(--space-standard);
max-width: 25em; max-width: 25em;
@@ -42,7 +42,7 @@
} }
@media (max-width: $tablet), (hover: none) { @media (max-width: $tablet), (hover: none) {
.info { article {
margin-top: var(--nav-height); margin-top: var(--nav-height);
} }
} }

View File

@@ -1,19 +1,23 @@
.container { $tablet: map-get($breakpoints, 'tablet') - 1;
position: fixed;
top: 0;
z-index: 0;
width: 100vw; @media (max-width: $tablet), (hover: none) {
height: var(--window-height); .container {
position: fixed;
top: 0;
z-index: 0;
overflow-y: scroll; width: 100vw;
overflow-x: hidden; height: var(--window-height);
background: white;
overscroll-behavior: none; overflow-y: scroll;
-webkit-overflow-scrolling: none; overflow-x: hidden;
} background: white;
.disableScroll { overscroll-behavior: none;
pointer-events: none; -webkit-overflow-scrolling: none;
}
.disableScroll {
pointer-events: none;
}
} }

View File

@@ -16,18 +16,30 @@
.galleryInner { .galleryInner {
flex: 1; flex: 1;
height: 0; height: 0;
}
.swiper-slide { .swiper-slide {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
}
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: contain; object-fit: contain;
} }
}
.loadingText {
position: absolute;
top: 50%;
left: 50%;
transform: translate3d(-50%, -50%, 0);
}
.slideContainer {
position: relative;
display: inline-block;
} }
.nav { .nav {

View File

@@ -9,3 +9,4 @@
@import '_partial/nav'; @import '_partial/nav';
@import '_partial/article'; @import '_partial/article';
@import '_partial/container';

View File

@@ -1,9 +1,24 @@
import { scrollable } from './mobile/scroll' import { Watchable } from './globalUtils'
export let container: HTMLDivElement export const scrollable = new Watchable<boolean>(true)
export let container: Container
/**
* interfaces
*/
export interface Container extends HTMLDivElement {
dataset: {
next: string
close: string
prev: string
loading: string
}
}
export function initContainer(): void { export function initContainer(): void {
container = document.getElementsByClassName('container').item(0) as HTMLDivElement container = document.getElementsByClassName('container').item(0) as Container
scrollable.addWatcher((o) => { scrollable.addWatcher((o) => {
if (o) { if (o) {
container.classList.remove('disableScroll') container.classList.remove('disableScroll')

View File

@@ -1,6 +1,6 @@
import { container } from '../container' import { container } from '../container'
import { active } from './stage' import { active } from './state'
/** /**
* variables * variables

View File

@@ -4,6 +4,10 @@ import { initCustomCursor } from './customCursor'
import { initStage } from './stage' import { initStage } from './stage'
import { initStageNav } from './stageNav' import { initStageNav } from './stageNav'
/**
* main functions
*/
export function initDesktop(ijs: ImageJSON[]): void { export function initDesktop(ijs: ImageJSON[]): void {
initCustomCursor() initCustomCursor()
initStage(ijs) initStage(ijs)

View File

@@ -1,33 +1,26 @@
import { type Power3, type gsap } from 'gsap' import { type gsap } from 'gsap'
import { container } from '../container' import { container } from '../container'
import { incIndex, isAnimating, navigateVector, state } from '../globalState'
import { decrement, increment, loadGsap } from '../globalUtils'
import { type ImageJSON } from '../resources' import { type ImageJSON } from '../resources'
import { incIndex, state } from '../state'
import { Watchable, decrement, increment, loadGsap } from '../utils'
/** import { active, cordHist, isLoading, isOpen } from './state'
* types // eslint-disable-next-line sort-imports
*/ import { onMutation, type DesktopImage } from './utils'
export interface HistoryItem {
i: number
x: number
y: number
}
/** /**
* variables * variables
*/ */
let imgs: HTMLImageElement[] = [] let imgs: DesktopImage[] = []
let last = { x: 0, y: 0 } let last = { x: 0, y: 0 }
export const cordHist = new Watchable<HistoryItem[]>([])
export const isOpen = new Watchable<boolean>(false)
export const isAnimating = new Watchable<boolean>(false)
export const active = new Watchable<boolean>(false)
let _gsap: typeof gsap let _gsap: typeof gsap
let _Power3: typeof Power3
/**
* state
*/
let gsapLoaded = false let gsapLoaded = false
@@ -35,45 +28,34 @@ let gsapLoaded = false
* getter * getter
*/ */
function getElTrail(): HTMLImageElement[] { function getTrailElsIndex(): number[] {
return cordHist.get().map((item) => imgs[item.i]) return cordHist.get().map((item) => item.i)
} }
function getElTrailCurrent(): HTMLImageElement[] { function getTrailCurrentElsIndex(): number[] {
return getElTrail().slice(-state.get().trailLength) return getTrailElsIndex().slice(-state.get().trailLength)
} }
function getElTrailInactive(): HTMLImageElement[] { function getTrailInactiveElsIndex(): number[] {
const elTrailCurrent = getElTrailCurrent() const trailCurrentElsIndex = getTrailCurrentElsIndex()
return elTrailCurrent.slice(0, elTrailCurrent.length - 1) return trailCurrentElsIndex.slice(0, trailCurrentElsIndex.length - 1)
} }
function getElCurrent(): HTMLImageElement { function getCurrentElIndex(): number {
const elTrail = getElTrail() const trailElsIndex = getTrailElsIndex()
return elTrail[elTrail.length - 1] return trailElsIndex[trailElsIndex.length - 1]
} }
function getElNextSeven(): HTMLImageElement[] { function getPrevElIndex(): number {
const c = cordHist.get() const c = cordHist.get()
const s = state.get() const s = state.get()
const c0 = c.length > 0 ? c[c.length - 1].i : s.index return decrement(c[c.length - 1].i, s.length)
const els = []
for (let i = 0; i < 7; i++) {
els.push(imgs[increment(c0 + i, s.length)])
}
return els
} }
function getElPrev(): HTMLImageElement { function getNextElIndex(): number {
const c = cordHist.get() const c = cordHist.get()
const s = state.get() const s = state.get()
return imgs[decrement(c[c.length - 1].i, s.length)] return increment(c[c.length - 1].i, s.length)
}
function getElNext(): HTMLImageElement {
const c = cordHist.get()
const s = state.get()
return imgs[increment(c[c.length - 1].i, s.length)]
} }
/** /**
@@ -82,7 +64,11 @@ function getElNext(): HTMLImageElement {
// on mouse // on mouse
function onMouse(e: MouseEvent): void { function onMouse(e: MouseEvent): void {
if (isOpen.get() || isAnimating.get() || !gsapLoaded) return if (isOpen.get() || isAnimating.get()) return
if (!gsapLoaded) {
loadLib()
return
}
const cord = { x: e.clientX, y: e.clientY } const cord = { x: e.clientX, y: e.clientY }
const travelDist = Math.hypot(cord.x - last.x, cord.y - last.y) const travelDist = Math.hypot(cord.x - last.x, cord.y - last.y)
@@ -95,63 +81,94 @@ function onMouse(e: MouseEvent): void {
} }
} }
// set image position with gsap // set image position with gsap (in both stage and navigation)
function setPositions(): void { function setPositions(): void {
const elTrail = getElTrail() const trailElsIndex = getTrailElsIndex()
if (elTrail.length === 0 || !gsapLoaded) return if (trailElsIndex.length === 0 || !gsapLoaded) return
// preload const elsTrail = getImagesWithIndexArray(trailElsIndex)
lores(getElNextSeven())
_gsap.set(elTrail, { // cached state
x: (i: number) => cordHist.get()[i].x - window.innerWidth / 2, const _isOpen = isOpen.get()
y: (i: number) => cordHist.get()[i].y - window.innerHeight / 2, const _cordHist = cordHist.get()
const _state = state.get()
_gsap.set(elsTrail, {
x: (i: number) => _cordHist[i].x - window.innerWidth / 2,
y: (i: number) => _cordHist[i].y - window.innerHeight / 2,
opacity: (i: number) => opacity: (i: number) =>
i + 1 + state.get().trailLength <= cordHist.get().length ? 0 : 1, Math.max(
(i + 1 + _state.trailLength <= _cordHist.length ? 0 : 1) - (_isOpen ? 1 : 0),
0
),
zIndex: (i: number) => i, zIndex: (i: number) => i,
scale: 0.6 scale: 0.6
}) })
if (isOpen.get()) { if (_isOpen) {
lores(getElTrail()) const elc = getImagesWithIndexArray([getCurrentElIndex()])[0]
hires([getElCurrent(), getElPrev(), getElNext()]) const indexArrayToHires: number[] = []
_gsap.set(imgs, { opacity: 0 }) const indexArrayToCleanup: number[] = []
_gsap.set(getElCurrent(), { opacity: 1, x: 0, y: 0, scale: 1 }) switch (navigateVector.get()) {
case 'prev':
indexArrayToHires.push(getPrevElIndex())
indexArrayToCleanup.push(getNextElIndex())
break
case 'next':
indexArrayToHires.push(getNextElIndex())
indexArrayToCleanup.push(getPrevElIndex())
break
default:
break
}
hires(getImagesWithIndexArray(indexArrayToHires)) // preload
_gsap.set(getImagesWithIndexArray(indexArrayToCleanup), { opacity: 0 })
_gsap.set(elc, { x: 0, y: 0, scale: 1 }) // set current to center
setLoaderForHiresImage(elc) // set loader, if loaded set current opacity to 1
} else {
lores(elsTrail)
} }
} }
// open image into navigation // open image into navigation
function expandImage(): void { function expandImage(): void {
if (isAnimating.get() || !gsapLoaded) return if (isAnimating.get()) return
isOpen.set(true) isOpen.set(true)
isAnimating.set(true) isAnimating.set(true)
hires([getElCurrent(), getElPrev(), getElNext()]) const elcIndex = getCurrentElIndex()
const elc = getImagesWithIndexArray([elcIndex])[0]
// don't hide here because we want a better transition
// elc.classList.add('hide')
hires(getImagesWithIndexArray([elcIndex, getPrevElIndex(), getNextElIndex()]))
setLoaderForHiresImage(elc)
const tl = _gsap.timeline() const tl = _gsap.timeline()
const trailInactiveEls = getImagesWithIndexArray(getTrailInactiveElsIndex())
// move down and hide trail inactive // move down and hide trail inactive
tl.to(getElTrailInactive(), { tl.to(trailInactiveEls, {
y: '+=20', y: '+=20',
ease: _Power3.easeIn, ease: 'power3.in',
stagger: 0.075, stagger: 0.075,
duration: 0.3, duration: 0.3,
delay: 0.1, delay: 0.1,
opacity: 0 opacity: 0
}) })
// current move to center // current move to center
tl.to(getElCurrent(), { tl.to(elc, {
x: 0, x: 0,
y: 0, y: 0,
ease: _Power3.easeInOut, ease: 'power3.inOut',
duration: 0.7, duration: 0.7,
delay: 0.3 delay: 0.3
}) })
// current expand // current expand
tl.to(getElCurrent(), { tl.to(elc, {
delay: 0.1, delay: 0.1,
scale: 1, scale: 1,
ease: _Power3.easeInOut ease: 'power3.inOut'
}) })
// finished // finished
tl.then(() => { tl.then(() => {
@@ -163,33 +180,37 @@ function expandImage(): void {
// close navigation and back to stage // close navigation and back to stage
export function minimizeImage(): void { export function minimizeImage(): void {
if (isAnimating.get() || !gsapLoaded) return if (isAnimating.get()) return
isOpen.set(false) isOpen.set(false)
isAnimating.set(true) isAnimating.set(true)
navigateVector.set('none') // cleanup
lores([getElCurrent()]) lores(
lores(getElTrailInactive()) getImagesWithIndexArray([...getTrailInactiveElsIndex(), ...[getCurrentElIndex()]])
)
const tl = _gsap.timeline() const tl = _gsap.timeline()
const elc = getImagesWithIndexArray([getCurrentElIndex()])[0]
const elsTrailInactive = getImagesWithIndexArray(getTrailInactiveElsIndex())
// shrink current // shrink current
tl.to(getElCurrent(), { tl.to(elc, {
scale: 0.6, scale: 0.6,
duration: 0.6, duration: 0.6,
ease: _Power3.easeInOut ease: 'power3.inOut'
}) })
// move current to original position // move current to original position
tl.to(getElCurrent(), { tl.to(elc, {
delay: 0.3, delay: 0.3,
duration: 0.7, duration: 0.7,
ease: _Power3.easeInOut, ease: 'power3.inOut',
x: cordHist.get()[cordHist.get().length - 1].x - window.innerWidth / 2, x: cordHist.get()[cordHist.get().length - 1].x - window.innerWidth / 2,
y: cordHist.get()[cordHist.get().length - 1].y - window.innerHeight / 2 y: cordHist.get()[cordHist.get().length - 1].y - window.innerHeight / 2
}) })
// show trail inactive // show trail inactive
tl.to(getElTrailInactive(), { tl.to(elsTrailInactive, {
y: '-=20', y: '-=20',
ease: _Power3.easeOut, ease: 'power3.out',
stagger: -0.1, stagger: -0.1,
duration: 0.3, duration: 0.3,
opacity: 1 opacity: 1
@@ -212,14 +233,44 @@ export function initStage(ijs: ImageJSON[]): void {
// get stage // get stage
const stage = document.getElementsByClassName('stage').item(0) as HTMLDivElement const stage = document.getElementsByClassName('stage').item(0) as HTMLDivElement
// get image elements // get image elements
imgs = Array.from(stage.getElementsByTagName('img')) imgs = Array.from(stage.getElementsByTagName('img')) as DesktopImage[]
imgs.forEach((img, i) => {
// preload first 5 images on page load
if (i < 5) {
img.src = img.dataset.loUrl
}
// lores preloader for rest of the images
onMutation(img, (mutation) => {
// if open or animating, hold
if (isOpen.get() || isAnimating.get()) return false
// if mutation is not about style attribute, hold
if (mutation.attributeName !== 'style') return false
const opacity = parseFloat(img.style.opacity)
// if opacity is not 1, hold
if (opacity !== 1) return false
// preload the i + 5th image, if it exists
if (i + 5 < imgs.length) {
imgs[i + 5].src = imgs[i + 5].dataset.loUrl
}
// triggered
return true
})
})
// event listeners // event listeners
stage.addEventListener('click', () => { stage.addEventListener(
expandImage() 'click',
}) () => {
stage.addEventListener('keydown', () => { expandImage()
expandImage() },
}) { passive: true }
)
stage.addEventListener(
'keydown',
() => {
expandImage()
},
{ passive: true }
)
window.addEventListener('mousemove', onMouse, { passive: true }) window.addEventListener('mousemove', onMouse, { passive: true })
// watchers // watchers
isOpen.addWatcher((o) => { isOpen.addWatcher((o) => {
@@ -231,21 +282,11 @@ export function initStage(ijs: ImageJSON[]): void {
cordHist.addWatcher((_) => { cordHist.addWatcher((_) => {
setPositions() setPositions()
}) })
// preload
lores(getElNextSeven())
// dynamic import // dynamic import
window.addEventListener( window.addEventListener(
'mousemove', 'mousemove',
() => { () => {
loadGsap() loadLib()
.then((g) => {
_gsap = g[0]
_Power3 = g[1]
gsapLoaded = true
})
.catch((e) => {
console.log(e)
})
}, },
{ once: true, passive: true } { once: true, passive: true }
) )
@@ -261,7 +302,7 @@ function createStage(ijs: ImageJSON[]): void {
stage.className = 'stage' stage.className = 'stage'
// append images to container // append images to container
for (const ij of ijs) { for (const ij of ijs) {
const e = document.createElement('img') const e = document.createElement('img') as DesktopImage
e.height = ij.loImgH e.height = ij.loImgH
e.width = ij.loImgW e.width = ij.loImgW
// set data attributes // set data attributes
@@ -272,23 +313,94 @@ function createStage(ijs: ImageJSON[]): void {
e.dataset.loImgH = ij.loImgH.toString() e.dataset.loImgH = ij.loImgH.toString()
e.dataset.loImgW = ij.loImgW.toString() e.dataset.loImgW = ij.loImgW.toString()
e.alt = ij.alt e.alt = ij.alt
// append
stage.append(e) stage.append(e)
} }
container.append(stage) container.append(stage)
} }
function hires(imgs: HTMLImageElement[]): void { function getImagesWithIndexArray(indexArray: number[]): DesktopImage[] {
return indexArray.map((i) => imgs[i])
}
function hires(imgs: DesktopImage[]): void {
imgs.forEach((img) => { imgs.forEach((img) => {
img.src = img.dataset.hiUrl as string if (img.src === img.dataset.hiUrl) return
img.height = parseInt(img.dataset.hiImgH as string) img.src = img.dataset.hiUrl
img.width = parseInt(img.dataset.hiImgW as string) img.height = parseInt(img.dataset.hiImgH)
img.width = parseInt(img.dataset.hiImgW)
}) })
} }
function lores(imgs: HTMLImageElement[]): void { function lores(imgs: DesktopImage[]): void {
imgs.forEach((img) => { imgs.forEach((img) => {
img.src = img.dataset.loUrl as string if (img.src === img.dataset.loUrl) return
img.height = parseInt(img.dataset.loImgH as string) img.src = img.dataset.loUrl
img.width = parseInt(img.dataset.loImgW as string) img.height = parseInt(img.dataset.loImgH)
img.width = parseInt(img.dataset.loImgW)
}) })
} }
function setLoaderForHiresImage(e: HTMLImageElement): void {
if (!e.complete) {
isLoading.set(true)
// abort controller for cleanup
const controller = new AbortController()
const abortSignal = controller.signal
// event listeners
e.addEventListener(
'load',
() => {
_gsap
.to(e, { opacity: 1, ease: 'power3.out', duration: 0.5 })
.then(() => {
isLoading.set(false)
})
.catch((e) => {
console.log(e)
})
.finally(() => {
controller.abort()
})
},
{ once: true, passive: true, signal: abortSignal }
)
e.addEventListener(
'error',
() => {
_gsap
.set(e, { opacity: 1 })
.then(() => {
isLoading.set(false)
})
.catch((e) => {
console.log(e)
})
.finally(() => {
controller.abort()
})
},
{ once: true, passive: true, signal: abortSignal }
)
} else {
_gsap
.set(e, { opacity: 1 })
.then(() => {
isLoading.set(false)
})
.catch((e) => {
console.log(e)
})
}
}
function loadLib(): void {
loadGsap()
.then((g) => {
_gsap = g
gsapLoaded = true
})
.catch((e) => {
console.log(e)
})
}

View File

@@ -1,9 +1,10 @@
import { container } from '../container' import { container } from '../container'
import { decIndex, incIndex, state } from '../state' import { decIndex, incIndex, isAnimating, navigateVector, state } from '../globalState'
import { decrement, increment } from '../utils' import { decrement, increment } from '../globalUtils'
import { setCustomCursor } from './customCursor' import { setCustomCursor } from './customCursor'
import { active, cordHist, isAnimating, isOpen, minimizeImage } from './stage' import { minimizeImage } from './stage'
import { active, cordHist, isLoading, isOpen } from './state'
/** /**
* types * types
@@ -15,12 +16,13 @@ type NavItem = (typeof navItems)[number]
* variables * variables
*/ */
const mainDiv = document.getElementById('main') as HTMLDivElement
const navItems = [ const navItems = [
mainDiv.getAttribute('prevText') as string, container.dataset.prev,
mainDiv.getAttribute('closeText') as string, container.dataset.close,
mainDiv.getAttribute('nextText') as string container.dataset.next
] as const ] as const
const loadingText = container.dataset.loading + '...'
let loadedText = ''
/** /**
* main functions * main functions
@@ -56,39 +58,80 @@ function handleKey(e: KeyboardEvent): void {
*/ */
export function initStageNav(): void { export function initStageNav(): void {
// isLoading
isLoading.addWatcher((o) => {
if (o) setCustomCursor(loadingText)
else setCustomCursor(loadedText)
})
// navOverlay
const navOverlay = document.createElement('div') const navOverlay = document.createElement('div')
navOverlay.className = 'navOverlay' navOverlay.className = 'navOverlay'
for (const navItem of navItems) { for (const [index, navItem] of navItems.entries()) {
const overlay = document.createElement('div') const overlay = document.createElement('div')
overlay.className = 'overlay' overlay.className = 'overlay'
overlay.addEventListener( const isClose = index === 1
'click', // close
() => { if (isClose) {
handleClick(navItem) overlay.addEventListener(
}, 'click',
{ passive: true } () => {
) handleCloseClick(navItem)
overlay.addEventListener( },
'keydown', { passive: true }
() => { )
handleClick(navItem) overlay.addEventListener(
}, 'keydown',
{ passive: true } () => {
) handleCloseClick(navItem)
overlay.addEventListener( },
'mouseover', { passive: true }
() => { )
setCustomCursor(navItem) overlay.addEventListener(
}, 'mouseover',
{ passive: true } () => {
) handleCloseHover(navItem)
overlay.addEventListener( },
'focus', { passive: true }
() => { )
setCustomCursor(navItem) overlay.addEventListener(
}, 'focus',
{ passive: true } () => {
) handleCloseHover(navItem)
},
{ passive: true }
)
}
// prev and next
else {
overlay.addEventListener(
'click',
() => {
handlePNClick(navItem)
},
{ passive: true }
)
overlay.addEventListener(
'keydown',
() => {
handlePNClick(navItem)
},
{ passive: true }
)
overlay.addEventListener(
'mouseover',
() => {
handlePNHover(navItem)
},
{ passive: true }
)
overlay.addEventListener(
'focus',
() => {
handlePNHover(navItem)
},
{ passive: true }
)
}
navOverlay.append(overlay) navOverlay.append(overlay)
} }
active.addWatcher(() => { active.addWatcher(() => {
@@ -108,6 +151,7 @@ export function initStageNav(): void {
function nextImage(): void { function nextImage(): void {
if (isAnimating.get()) return if (isAnimating.get()) return
navigateVector.set('next')
cordHist.set( cordHist.set(
cordHist.get().map((item) => { cordHist.get().map((item) => {
return { ...item, i: increment(item.i, state.get().length) } return { ...item, i: increment(item.i, state.get().length) }
@@ -119,6 +163,7 @@ function nextImage(): void {
function prevImage(): void { function prevImage(): void {
if (isAnimating.get()) return if (isAnimating.get()) return
navigateVector.set('prev')
cordHist.set( cordHist.set(
cordHist.get().map((item) => { cordHist.get().map((item) => {
return { ...item, i: decrement(item.i, state.get().length) } return { ...item, i: decrement(item.i, state.get().length) }
@@ -127,3 +172,23 @@ function prevImage(): void {
decIndex() decIndex()
} }
function handleCloseClick(navItem: NavItem): void {
handleClick(navItem)
isLoading.set(false)
}
function handleCloseHover(navItem: NavItem): void {
loadedText = navItem
setCustomCursor(navItem)
}
function handlePNClick(navItem: NavItem): void {
if (!isLoading.get()) handleClick(navItem)
}
function handlePNHover(navItem: NavItem): void {
loadedText = navItem
if (isLoading.get()) setCustomCursor(loadingText)
else setCustomCursor(navItem)
}

View File

@@ -0,0 +1,20 @@
import { Watchable } from '../globalUtils'
/**
* types
*/
export interface HistoryItem {
i: number
x: number
y: number
}
/**
* variables
*/
export const cordHist = new Watchable<HistoryItem[]>([])
export const isOpen = new Watchable<boolean>(false)
export const active = new Watchable<boolean>(false)
export const isLoading = new Watchable<boolean>(false)

View File

@@ -0,0 +1,33 @@
/**
* interfaces
*/
export interface DesktopImage extends HTMLImageElement {
dataset: {
hiUrl: string
hiImgH: string
hiImgW: string
loUrl: string
loImgH: string
loImgW: string
}
}
/**
* utils
*/
export function onMutation<T extends HTMLElement>(
element: T,
trigger: (arg0: MutationRecord) => boolean,
observeOptions: MutationObserverInit = { attributes: true }
): void {
new MutationObserver((mutations, observer) => {
for (const mutation of mutations) {
if (trigger(mutation)) {
observer.disconnect()
break
}
}
}).observe(element, observeOptions)
}

View File

@@ -1,10 +1,16 @@
import { Watchable, decrement, increment } from './utils' import {
Watchable,
decrement,
getThresholdSessionIndex,
increment
} from './globalUtils'
/** /**
* types * types
*/ */
export type State = typeof defaultState export type State = typeof defaultState
export type NavVec = 'next' | 'none' | 'prev'
/** /**
* variables * variables
@@ -25,7 +31,9 @@ const defaultState = {
trailLength: thresholds[getThresholdSessionIndex()].trailLength trailLength: thresholds[getThresholdSessionIndex()].trailLength
} }
export const state = new Watchable<State>(defaultState) export const state = new Watchable<State>(defaultState, false)
export const isAnimating = new Watchable<boolean>(false)
export const navigateVector = new Watchable<NavVec>('none')
/** /**
* main functions * main functions
@@ -81,9 +89,3 @@ function updateThreshold(state: State, inc: number): State {
const newItems = thresholds[i] const newItems = thresholds[i]
return { ...state, ...newItems } return { ...state, ...newItems }
} }
function getThresholdSessionIndex(): number {
const s = sessionStorage.getItem('thresholdsIndex')
if (s === null) return 2
return parseInt(s)
}

69
assets/ts/globalUtils.ts Normal file
View File

@@ -0,0 +1,69 @@
import { type gsap } from 'gsap'
/**
* utils
*/
export function increment(num: number, length: number): number {
return (num + 1) % length
}
export function decrement(num: number, length: number): number {
return (num + length - 1) % length
}
export function expand(num: number): string {
return ('0000' + num.toString()).slice(-4)
}
export async function loadGsap(): Promise<typeof gsap> {
const g = await import('gsap')
return g.gsap
}
export function getThresholdSessionIndex(): number {
const s = sessionStorage.getItem('thresholdsIndex')
if (s === null) return 2
return parseInt(s)
}
export function removeDuplicates<T>(arr: T[]): T[] {
if (arr.length < 2) return arr // optimization
return [...new Set(arr)]
}
export function createDivWithClass(className: string): HTMLDivElement {
const div = document.createElement('div')
if (className === '') return div // optimization
div.classList.add(className)
return div
}
/**
* custom "reactive" object
*/
export class Watchable<T> {
constructor(
private obj: T,
private readonly lazy: boolean = true
) {}
private readonly watchers: Array<(arg0: T) => void> = []
get(): T {
return this.obj
}
set(e: T): void {
if (e === this.obj && this.lazy) return
this.obj = e
this.watchers.forEach((watcher) => {
watcher(this.obj)
})
}
addWatcher(watcher: (arg0: T) => void): void {
this.watchers.push(watcher)
}
}

View File

@@ -1,19 +1,33 @@
import { initContainer } from './container' import { initContainer } from './container'
import { initState } from './globalState'
import { initNav } from './nav' import { initNav } from './nav'
import { initResources } from './resources' import { initResources } from './resources'
import { initState } from './state'
import { isMobile } from './utils'
initContainer() // this is the main entry point for the app
const ijs = await initResources() document.addEventListener('DOMContentLoaded', () => {
initState(ijs.length) main().catch((e) => {
initNav() console.log(e)
})
})
// NOTE: it seems firefox and chromnium don't like top layer await /**
// so we are using import then instead * main functions
if (ijs.length > 0) { */
async function main(): Promise<void> {
initContainer()
const ijs = await initResources()
initState(ijs.length)
initNav()
if (ijs.length === 0) {
return
}
// NOTE: it seems firefox and chromnium don't like top layer await
// so we are using import then instead
if (!isMobile()) { if (!isMobile()) {
import('./desktop/init') await import('./desktop/init')
.then((d) => { .then((d) => {
d.initDesktop(ijs) d.initDesktop(ijs)
}) })
@@ -21,7 +35,7 @@ if (ijs.length > 0) {
console.log(e) console.log(e)
}) })
} else { } else {
import('./mobile/init') await import('./mobile/init')
.then((m) => { .then((m) => {
m.initMobile(ijs) m.initMobile(ijs)
}) })
@@ -30,3 +44,11 @@ if (ijs.length > 0) {
}) })
} }
} }
/**
* hepler
*/
function isMobile(): boolean {
return window.matchMedia('(hover: none)').matches
}

View File

@@ -1,16 +1,17 @@
import { container } from '../container' import { container } from '../container'
import { setIndex } from '../globalState'
import { type ImageJSON } from '../resources' import { type ImageJSON } from '../resources'
import { setIndex } from '../state'
import { getRandom, onVisible } from '../utils'
import { slideUp } from './gallery' import { slideUp } from './gallery'
import { mounted } from './mounted' import { mounted } from './state'
// eslint-disable-next-line sort-imports
import { getRandom, onIntersection, type MobileImage } from './utils'
/** /**
* variables * variables
*/ */
export let imgs: HTMLImageElement[] = [] export let imgs: MobileImage[] = []
/** /**
* main functions * main functions
@@ -40,9 +41,14 @@ export function initCollection(ijs: ImageJSON[]): void {
} }
}) })
// get image elements // get image elements
imgs = Array.from(collection.getElementsByTagName('img')) imgs = Array.from(collection.getElementsByTagName('img')) as MobileImage[]
// add event listeners // add event listeners
imgs.forEach((img, i) => { imgs.forEach((img, i) => {
// preload first 5 images on page load
if (i < 5) {
img.src = img.dataset.src
}
// event listeners
img.addEventListener( img.addEventListener(
'click', 'click',
() => { () => {
@@ -58,12 +64,15 @@ export function initCollection(ijs: ImageJSON[]): void {
{ passive: true } { passive: true }
) )
// preload // preload
onVisible(img, () => { onIntersection(img, (entry) => {
for (let _i = 0; _i < 5; _i++) { // no intersection, hold
const n = i + _i if (entry.intersectionRatio <= 0) return false
if (n < 0 || n > imgs.length - 1) continue // preload the i + 5th image, if it exists
imgs[n].src = imgs[n].dataset.src as string if (i + 5 < imgs.length) {
imgs[i + 5].src = imgs[i + 5].dataset.src
} }
// triggered
return true
}) })
}) })
} }
@@ -82,7 +91,7 @@ function createCollection(ijs: ImageJSON[]): void {
const x = i !== 0 ? getRandom(-25, 25) : 0 const x = i !== 0 ? getRandom(-25, 25) : 0
const y = i !== 0 ? getRandom(-30, 30) : 0 const y = i !== 0 ? getRandom(-30, 30) : 0
// element // element
const e = document.createElement('img') const e = document.createElement('img') as MobileImage
e.dataset.src = ij.loUrl e.dataset.src = ij.loUrl
e.height = ij.loImgH e.height = ij.loImgH
e.width = ij.loImgW e.width = ij.loImgW

View File

@@ -1,38 +1,36 @@
import { type Power3, type gsap } from 'gsap' import { type gsap } from 'gsap'
import { type Swiper } from 'swiper' import { type Swiper } from 'swiper'
import { container } from '../container' import { container, scrollable } from '../container'
import { isAnimating, navigateVector, setIndex, state } from '../globalState'
import { createDivWithClass, expand, loadGsap, removeDuplicates } from '../globalUtils'
import { type ImageJSON } from '../resources' import { type ImageJSON } from '../resources'
import { setIndex, state } from '../state'
import {
Watchable,
capitalizeFirstLetter,
expand,
loadGsap,
loadSwiper
} from '../utils'
import { mounted } from './mounted' import { mounted } from './state'
import { scrollable } from './scroll' // eslint-disable-next-line sort-imports
import { capitalizeFirstLetter, loadSwiper, type MobileImage } from './utils'
/** /**
* variables * variables
*/ */
let swiperNode: HTMLDivElement let galleryInner: HTMLDivElement
let gallery: HTMLDivElement let gallery: HTMLDivElement
let curtain: HTMLDivElement let curtain: HTMLDivElement
let swiper: Swiper let indexDiv: HTMLDivElement
const isAnimating = new Watchable<boolean>(false) let navDiv: HTMLDivElement
let lastIndex = -1
let indexDispNums: HTMLSpanElement[] = [] let indexDispNums: HTMLSpanElement[] = []
let galleryImages: HTMLImageElement[] = [] let galleryImages: MobileImage[] = []
let collectionImages: HTMLImageElement[] = [] let collectionImages: MobileImage[] = []
let _Swiper: typeof Swiper
let _gsap: typeof gsap let _gsap: typeof gsap
let _Power3: typeof Power3 let _swiper: Swiper
/**
* state
*/
let lastIndex = -1
let libLoaded = false let libLoaded = false
/** /**
@@ -43,9 +41,6 @@ export function slideUp(): void {
if (isAnimating.get() || !libLoaded) return if (isAnimating.get() || !libLoaded) return
isAnimating.set(true) isAnimating.set(true)
// load active image
loadImages()
_gsap.to(curtain, { _gsap.to(curtain, {
opacity: 1, opacity: 1,
duration: 1 duration: 1
@@ -53,24 +48,26 @@ export function slideUp(): void {
_gsap.to(gallery, { _gsap.to(gallery, {
y: 0, y: 0,
ease: _Power3.easeInOut, ease: 'power3.inOut',
duration: 1, duration: 1,
delay: 0.4 delay: 0.4
}) })
setTimeout(() => { setTimeout(() => {
// cleanup
scrollable.set(false) scrollable.set(false)
isAnimating.set(false) isAnimating.set(false)
}, 1200) }, 1400)
} }
function slideDown(): void { function slideDown(): void {
scrollable.set(true) if (isAnimating.get()) return
isAnimating.set(true)
scrollToActive() scrollToActive()
_gsap.to(gallery, { _gsap.to(gallery, {
y: '100%', y: '100%',
ease: _Power3.easeInOut, ease: 'power3.inOut',
duration: 1 duration: 1
}) })
@@ -79,6 +76,13 @@ function slideDown(): void {
duration: 1.2, duration: 1.2,
delay: 0.4 delay: 0.4
}) })
setTimeout(() => {
// cleanup
scrollable.set(true)
isAnimating.set(false)
lastIndex = -1
}, 1600)
} }
/** /**
@@ -87,29 +91,32 @@ function slideDown(): void {
export function initGallery(ijs: ImageJSON[]): void { export function initGallery(ijs: ImageJSON[]): void {
// create gallery // create gallery
createGallery(ijs) constructGallery(ijs)
// get elements // get elements
indexDispNums = Array.from( indexDispNums = Array.from(
document.getElementsByClassName('nav').item(0)?.getElementsByClassName('num') ?? [] indexDiv.getElementsByClassName('num') ?? []
) as HTMLSpanElement[] ) as HTMLSpanElement[]
swiperNode = document.getElementsByClassName('galleryInner').item(0) as HTMLDivElement galleryImages = Array.from(gallery.getElementsByTagName('img')) as MobileImage[]
gallery = document.getElementsByClassName('gallery').item(0) as HTMLDivElement
curtain = document.getElementsByClassName('curtain').item(0) as HTMLDivElement
galleryImages = Array.from(gallery.getElementsByTagName('img'))
collectionImages = Array.from( collectionImages = Array.from(
document document
.getElementsByClassName('collection') .getElementsByClassName('collection')
.item(0) .item(0)
?.getElementsByTagName('img') ?? [] ?.getElementsByTagName('img') ?? []
) ) as MobileImage[]
// state watcher // state watcher
state.addWatcher(() => { state.addWatcher((o) => {
const s = state.get() if (o.index === lastIndex)
// change slide only when index is changed return // change slide only when index is changed
if (s.index === lastIndex) return else if (lastIndex === -1)
changeSlide(s.index) navigateVector.set('none') // lastIndex before set
updateIndexText() else if (o.index < lastIndex)
lastIndex = s.index navigateVector.set('prev') // set navigate vector for galleryLoadImages
else if (o.index > lastIndex)
navigateVector.set('next') // set navigate vector for galleryLoadImages
else navigateVector.set('none') // default
changeSlide(o.index) // change slide to new index
updateIndexText() // update index text
lastIndex = o.index // update last index
}) })
// mounted watcher // mounted watcher
mounted.addWatcher((o) => { mounted.addWatcher((o) => {
@@ -122,17 +129,15 @@ export function initGallery(ijs: ImageJSON[]): void {
() => { () => {
loadGsap() loadGsap()
.then((g) => { .then((g) => {
_gsap = g[0] _gsap = g
_Power3 = g[1]
}) })
.catch((e) => { .catch((e) => {
console.log(e) console.log(e)
}) })
loadSwiper() loadSwiper()
.then((s) => { .then((S) => {
_Swiper = s _swiper = new S(galleryInner, { spaceBetween: 20 })
swiper = new _Swiper(swiperNode, { spaceBetween: 20 }) _swiper.on('slideChange', ({ realIndex }) => {
swiper.on('slideChange', ({ realIndex }) => {
setIndex(realIndex) setIndex(realIndex)
}) })
}) })
@@ -152,8 +157,8 @@ export function initGallery(ijs: ImageJSON[]): void {
*/ */
function changeSlide(slide: number): void { function changeSlide(slide: number): void {
loadImages() galleryLoadImages()
swiper.slideTo(slide, 0) _swiper.slideTo(slide, 0)
} }
function scrollToActive(): void { function scrollToActive(): void {
@@ -175,7 +180,105 @@ function updateIndexText(): void {
}) })
} }
function createGallery(ijs: ImageJSON[]): void { function galleryLoadImages(): void {
let activeImagesIndex: number[] = []
const currentIndex = state.get().index
const nextIndex = Math.min(currentIndex + 1, state.get().length - 1)
const prevIndex = Math.max(currentIndex - 1, 0)
switch (navigateVector.get()) {
case 'next':
activeImagesIndex = [nextIndex]
break
case 'prev':
activeImagesIndex = [prevIndex]
break
case 'none':
activeImagesIndex = [currentIndex, nextIndex, prevIndex]
break
}
removeDuplicates(activeImagesIndex).forEach((i) => {
const e = galleryImages[i]
if (e.src === e.dataset.src) return // already loaded
e.src = e.dataset.src
})
}
function constructGalleryNav(): void {
// index
indexDiv = document.createElement('div')
indexDiv.insertAdjacentHTML(
'afterbegin',
`<span class="num"></span><span class="num"></span><span class="num"></span><span class="num"></span>
<span>/</span>
<span class="num"></span><span class="num"></span><span class="num"></span><span class="num"></span>`
)
// close
const closeDiv = document.createElement('div')
closeDiv.innerText = capitalizeFirstLetter(container.dataset.close)
closeDiv.addEventListener(
'click',
() => {
slideDown()
},
{ passive: true }
)
closeDiv.addEventListener(
'keydown',
() => {
slideDown()
},
{ passive: true }
)
// nav
navDiv = createDivWithClass('nav')
navDiv.append(indexDiv, closeDiv)
}
function constructGalleryInner(ijs: ImageJSON[]): void {
// swiper wrapper
const swiperWrapper = createDivWithClass('swiper-wrapper')
// loading text
const loadingText = container.dataset.loading + '...'
for (const ij of ijs) {
// swiper slide
const swiperSlide = createDivWithClass('swiper-slide')
// loading indicator
const l = createDivWithClass('loadingText')
l.innerText = loadingText
// img
const e = document.createElement('img') as MobileImage
e.dataset.src = ij.hiUrl
e.height = ij.hiImgH
e.width = ij.hiImgW
e.alt = ij.alt
e.style.opacity = '0'
// load event
e.addEventListener(
'load',
() => {
if (state.get().index !== ij.index) {
_gsap.set(e, { opacity: 1 })
_gsap.set(l, { opacity: 0 })
} else {
_gsap.to(e, { opacity: 1, delay: 0.5, duration: 0.5, ease: 'power3.out' })
_gsap.to(l, { opacity: 0, duration: 0.5, ease: 'power3.in' })
}
},
{ once: true, passive: true }
)
// parent container
const p = createDivWithClass('slideContainer')
// append
p.append(e, l)
swiperSlide.append(p)
swiperWrapper.append(swiperSlide)
}
// swiper node
galleryInner = createDivWithClass('galleryInner')
galleryInner.append(swiperWrapper)
}
function constructGallery(ijs: ImageJSON[]): void {
/** /**
* gallery * gallery
* |- galleryInner * |- galleryInner
@@ -189,88 +292,21 @@ function createGallery(ijs: ImageJSON[]): void {
* |- index * |- index
* |- close * |- close
*/ */
// swiper wrapper
const _swiperWrapper = document.createElement('div')
_swiperWrapper.className = 'swiper-wrapper'
// swiper slide
for (const ij of ijs) {
const _swiperSlide = document.createElement('div')
_swiperSlide.className = 'swiper-slide'
// img
const e = document.createElement('img')
e.dataset.src = ij.hiUrl
e.height = ij.hiImgH
e.width = ij.hiImgW
e.alt = ij.alt
// append
_swiperSlide.append(e)
_swiperWrapper.append(_swiperSlide)
}
// swiper node
const _swiperNode = document.createElement('div')
_swiperNode.className = 'galleryInner'
_swiperNode.append(_swiperWrapper)
// index
const _index = document.createElement('div')
_index.insertAdjacentHTML(
'afterbegin',
`<span class="num"></span><span class="num"></span><span class="num"></span><span class="num"></span>
<span>/</span>
<span class="num"></span><span class="num"></span><span class="num"></span><span class="num"></span>`
)
// close
const _close = document.createElement('div')
const str: string = document
.getElementById('main')
?.getAttribute('closeText') as string
_close.innerText = capitalizeFirstLetter(str)
_close.addEventListener(
'click',
() => {
slideDown()
},
{ passive: true }
)
_close.addEventListener(
'keydown',
() => {
slideDown()
},
{ passive: true }
)
// nav
const _navDiv = document.createElement('div')
_navDiv.className = 'nav'
_navDiv.append(_index, _close)
// gallery // gallery
const _gallery = document.createElement('div') gallery = createDivWithClass('gallery')
_gallery.className = 'gallery' constructGalleryInner(ijs)
_gallery.append(_swiperNode) constructGalleryNav()
_gallery.append(_navDiv) gallery.append(galleryInner, navDiv)
/** /**
* curtain * curtain
*/ */
const _curtain = document.createElement('div') curtain = createDivWithClass('curtain')
_curtain.className = 'curtain'
/** /**
* container * container
* |- gallery * |- gallery
* |- curtain * |- curtain
*/ */
container.append(_gallery, _curtain) container.append(gallery, curtain)
}
function loadImages(): void {
const activeImages: HTMLImageElement[] = []
// load current, next, prev image
activeImages.push(galleryImages[swiper.activeIndex])
activeImages.push(
galleryImages[Math.min(swiper.activeIndex + 1, swiper.slides.length)]
)
activeImages.push(galleryImages[Math.max(swiper.activeIndex - 1, 0)])
for (const e of activeImages) {
e.src = e.dataset.src as string
}
} }

View File

@@ -1,3 +0,0 @@
import { Watchable } from '../utils'
export const scrollable = new Watchable<boolean>(true)

View File

@@ -1,3 +1,3 @@
import { Watchable } from '../utils' import { Watchable } from '../globalUtils'
export const mounted = new Watchable<boolean>(false) export const mounted = new Watchable<boolean>(false)

42
assets/ts/mobile/utils.ts Normal file
View File

@@ -0,0 +1,42 @@
import { type Swiper } from 'swiper'
/**
* interfaces
*/
export interface MobileImage extends HTMLImageElement {
dataset: {
src: string
}
}
/**
* utils
*/
export function getRandom(min: number, max: number): number {
return Math.floor(Math.random() * (max - min + 1)) + min
}
export function onIntersection<T extends HTMLElement>(
element: T,
trigger: (arg0: IntersectionObserverEntry) => boolean
): void {
new IntersectionObserver((entries, observer) => {
for (const entry of entries) {
if (trigger(entry)) {
observer.disconnect()
break
}
}
}).observe(element)
}
export function capitalizeFirstLetter(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1)
}
export async function loadSwiper(): Promise<typeof Swiper> {
const s = await import('swiper')
return s.Swiper
}

View File

@@ -1,5 +1,5 @@
import { decThreshold, incThreshold, state } from './state' import { decThreshold, incThreshold, state } from './globalState'
import { expand } from './utils' import { expand } from './globalUtils'
/** /**
* variables * variables
@@ -36,11 +36,6 @@ const indexDispNums = Array.from(
*/ */
export function initNav(): void { export function initNav(): void {
const s = state.get()
// init threshold text
updateThresholdText(expand(s.threshold))
// init index text
updateIndexText(expand(s.index + 1), expand(s.length))
// add watcher for updating nav text // add watcher for updating nav text
state.addWatcher((o) => { state.addWatcher((o) => {
updateIndexText(expand(o.index + 1), expand(o.length)) updateIndexText(expand(o.index + 1), expand(o.length))

View File

@@ -11,6 +11,9 @@ export interface ImageJSON {
} }
export async function initResources(): Promise<ImageJSON[]> { export async function initResources(): Promise<ImageJSON[]> {
if (document.title.split(' | ')[0] === '404') {
return [] // no images on 404 page
}
try { try {
const response = await fetch(`${window.location.href}index.json`, { const response = await fetch(`${window.location.href}index.json`, {
headers: { headers: {

View File

@@ -1,78 +0,0 @@
import { type Power3, type gsap } from 'gsap'
import { type Swiper } from 'swiper'
/**
* custom helpers
*/
export function increment(num: number, length: number): number {
return (num + 1) % length
}
export function decrement(num: number, length: number): number {
return (num + length - 1) % length
}
export function expand(num: number): string {
return ('0000' + num.toString()).slice(-4)
}
export function isMobile(): boolean {
return window.matchMedia('(hover: none)').matches
}
export function getRandom(min: number, max: number): number {
return Math.floor(Math.random() * (max - min + 1)) + min
}
export function onVisible<T extends Element>(
element: T,
callback: (arg0: T) => void
): void {
new IntersectionObserver((entries, observer) => {
entries.forEach((entry) => {
if (entry.intersectionRatio > 0) {
callback(element)
observer.disconnect()
}
})
}).observe(element)
}
export function capitalizeFirstLetter(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1)
}
export async function loadGsap(): Promise<[typeof gsap, typeof Power3]> {
const g = await import('gsap')
return [g.gsap, g.Power3]
}
export async function loadSwiper(): Promise<typeof Swiper> {
const s = await import('swiper')
return s.Swiper
}
/**
* custom types
*/
export class Watchable<T> {
constructor(private obj: T) {}
private readonly watchers: Array<(arg0: T) => void> = []
get(): T {
return this.obj
}
set(e: T): void {
this.obj = e
this.watchers.forEach((watcher) => {
watcher(this.obj)
})
}
addWatcher(watcher: (arg0: T) => void): void {
this.watchers.push(watcher)
}
}

View File

@@ -22,7 +22,7 @@ The minimum required Hugo version can be seen in the [`theme.toml`](https://gith
## Installation ## Installation
### Git ### Git (for adavanced user)
On the main branch, you can find the theme's latest source code. To use the latest version, you can clone the repository to `themes/bridget` by running the following command in the root directory of your Hugo site: On the main branch, you can find the theme's latest source code. To use the latest version, you can clone the repository to `themes/bridget` by running the following command in the root directory of your Hugo site:
@@ -36,11 +36,13 @@ If you are already using Git for your site, you can add the theme as a submodule
git submodule add https://github.com/Sped0n/bridget themes/bridget git submodule add https://github.com/Sped0n/bridget themes/bridget
``` ```
After cloning/downloading theme files to the directory, if you want to customize the theme, please run `pnpm install` or `npm install` first. > ⚠️⚠️⚠️
>
> Please refer to the config section for the following content.
### Module (recommended) ### Module (recommended)
> If you want to modify the theme, use Git installation instead. > If you want to have some customizations, use Git installation instead.
This theme is also available as a [Hugo module](https://gohugo.io/hugo-modules/). Run the following command in the root directory of your Hugo site: This theme is also available as a [Hugo module](https://gohugo.io/hugo-modules/). Run the following command in the root directory of your Hugo site:
@@ -48,7 +50,7 @@ First turn your site into a Hugo module (in case you haven't done it yet):
```shell ```shell
hugo mod init github.com/me/my-new-site hugo mod init github.com/me/my-new-site
# or whatever you like, it doesnt necessarily have to be a GitHub link. # or whatever you like, it doesnt necessarily have to be a GitHub repo link.
hugo mod init blablabla hugo mod init blablabla
``` ```
@@ -67,6 +69,10 @@ If you want to upgrade the theme, just run:
hugo mod get -u hugo mod get -u
``` ```
> ⚠️⚠️⚠️
>
> Please refer to the config section for the following content.
## Content Management ## Content Management
The content is where the pictures/text is stored, while the static refers to the website icons. The content is where the pictures/text is stored, while the static refers to the website icons.
@@ -106,6 +112,8 @@ menu:
identifier: Erwitt identifier: Erwitt
title: Erwitt title: Erwitt
unifiedAlt: '© Elliott Erwitt' unifiedAlt: '© Elliott Erwitt'
_build:
publishResources: false
--- ---
``` ```
@@ -123,6 +131,8 @@ unifiedAlt: '© Elliott Erwitt'
- `unifiedAlt` is **optional**, If you left it empty, the alt attribute of the image will default to its file name; if it is set, the alt attributes of all images will be unified to the value you have set; - `unifiedAlt` is **optional**, If you left it empty, the alt attribute of the image will default to its file name; if it is set, the alt attributes of all images will be unified to the value you have set;
- `publishResources` is **optional but recommended**, setting it to false will hide unprocessed images in the `public` directory. By default, Hugos value for this option is true, which can potentially result in source image leakage.
- If this is a **showcase** page, simply place the images in the same directory as index.md. - If this is a **showcase** page, simply place the images in the same directory as index.md.
- If this is an **information** page, you can continue writing the information you want to display in index.md. - If this is an **information** page, you can continue writing the information you want to display in index.md.
@@ -157,8 +167,12 @@ replacements = "github.com/Sped0n/bridget -> ../.."
path = "github.com/Sped0n/bridget" path = "github.com/Sped0n/bridget"
``` ```
- If you want to <u>modify the theme</u> or you have <u>installation with Git</u>, please **keep the `replacements` configuration** and change the path after the arrow to the location of your local theme file (relative path only). - If you have _installation with Git_
- If you have <u>installation with Module</u>, **remove the `replacements` configuration**.
- `replacement`: replace the _path after the arrow_(`../..`) with the location of your local theme file (⚠️⚠️⚠️**relative path only**, example: `themes/bridget`)
- `path`: no change
- If you have _installation with Module_, **remove the `replacements` configuration**.
### `markup.toml` ### `markup.toml`
@@ -171,7 +185,35 @@ Detailed description in the comments.
> ⚠️⚠️⚠️ > ⚠️⚠️⚠️
> >
> Only thing that you need to pay **extra attention** is the [`bundled`](https://github.com/Sped0n/bridget/blob/1e2f1fadde9c16989eef1ab771f2ac8463dec5a4/exampleSite/config/_default/params.toml#L6) option, please read the corresponding doc and set it as your need. > Only thing that you need to pay **extra attention** is the [`bundled`](https://github.com/Sped0n/bridget/blob/1e2f1fadde9c16989eef1ab771f2ac8463dec5a4/exampleSite/config/_default/params.toml#L6) option, please read the corresponding doc and set it as your need.
>
> For users who have installation with module, please always set this option to `true`, unless you know what you are doing.
>
> Or you might get the error related to `node_modules/swiper/swiper.scss`.
### `sitemap.toml` ### `sitemap.toml`
https://gohugo.io/templates/sitemap-template/#configuration https://gohugo.io/templates/sitemap-template/#configuration
## Customization (AKA for developer)
> Before heading to this section, please make sure you have **installation with Git**.
### Option 1: _it just works_ way
> If you want to modify js/ts file, please use option 2.
1. Use hugo create a site and move the bridget theme into the theme directory.
2. Run `npm install` in the _bridget theme root dir_, not _your hugo site root dir_.
3. After the command is done, copy the `node_modules` dir from _bridget theme root dir_ to _your hugo site root dir_.
4. In _your hugo site root dir_, write/modify configuration files according to your needs, remember to set `bundled` option to `false`, so hugo will not use prebuilt css file.
5. Run `hugo server` in _your hugo site root dir_, and you are good to go.
### Option 2: recommended way
1. Use hugo create a site and move the bridget theme into the theme directory.
2. Run `npm install` in the _bridget theme root dir_, not _your hugo site root dir_.
3. Run `npm run dev` in the _bridget theme root dir_, we will use content in exampleSite to debug.
4. Make your customization.
5. After modification, run `npm run build` in the _bridget theme root dir_ to build artifacts.
6. In _your hugo site root dir_, write/modify configuration files according to your needs, remember to set `bundled` option to `true`, so hugo will use the artifacts you built in step 5.
7. Run `hugo server` in _your hugo site root dir_, and you are good to go.

View File

@@ -8,4 +8,6 @@ menu:
identifier: Erwitt identifier: Erwitt
title: Erwitt title: Erwitt
unifiedAlt: '© Elliott Erwitt' unifiedAlt: '© Elliott Erwitt'
_build:
publishResources: false
--- ---

View File

@@ -8,4 +8,6 @@ menu:
identifier: Gruyaert identifier: Gruyaert
title: Gruyaert title: Gruyaert
unifiedAlt: '© Harry Gruyaert' unifiedAlt: '© Harry Gruyaert'
_build:
publishResources: false
--- ---

View File

@@ -8,15 +8,17 @@ menu:
identifier: Info identifier: Info
title: Info title: Info
unifiedAlt: '' unifiedAlt: ''
_build:
publishResources: false
--- ---
Bridget is a _minimal_ Hugo theme designed for photographers/visual artists. Bridget is a _minimal_ Hugo theme designed for photographers/visual artists.
The inspiration for this theme came from a video by <u>[Hyperlexed](https://www.youtube.com/@Hyperplexed)</u>, which can be found <u>[here](https://www.youtube.com/watch?v=Jt3A2lNN2aE)</u>. Initially, it was developed using raw TypeScript and CSS. However, after website designer <u>[Tyler McRobert](https://tylermcrobert.com)</u> made the source code publicly available, I realized that I have invented many unnecessary components, and this project was modified to porting the original design to hugo while focussing on _performance_. The inspiration for this theme came from a video by <u>[Hyperlexed](https://www.youtube.com/@Hyperplexed)</u>, which can be found <u>[here](https://www.youtube.com/watch?v=Jt3A2lNN2aE)</u>. Initially, it was developed using no third-party dependencies. However, after website designer <u>[Tyler McRobert](https://tylermcrobert.com)</u> made the source code publicly available, I realized that I have invented many unnecessary wheels, and this project was modified to porting the original design to hugo while focusing on _performance_.
Once again, great shout out to <u>[Tyler McRobert](https://tylermcrobert.com)</u> for his inspiration to this project. Once again, great shout out to <u>[Tyler McRobert](https://tylermcrobert.com)</u> for his inspiration to this project.
[Repo ↗](https://github.com/Sped0n/bridget) [GitHub Repo ↗](https://github.com/Sped0n/bridget)
Original site design by <u>[Tyler McRobert](https://tylermcrobert.com)</u>. Original site design by <u>[Tyler McRobert](https://tylermcrobert.com)</u>.

View File

@@ -8,4 +8,6 @@ menu:
identifier: Webb identifier: Webb
title: Webb title: Webb
unifiedAlt: '© Alex Webb' unifiedAlt: '© Alex Webb'
_build:
publishResources: false
--- ---

View File

@@ -8,3 +8,5 @@ other = "schließen"
other = "schwelle" other = "schwelle"
[404] [404]
other = "seite nicht gefunden" other = "seite nicht gefunden"
[loading]
other = "lade"

View File

@@ -8,3 +8,5 @@ other = "close"
other = "threshold" other = "threshold"
[404] [404]
other = "page not found" other = "page not found"
[loading]
other = "loading"

View File

@@ -8,3 +8,5 @@ other = "cerrar"
other = "umbral" other = "umbral"
[404] [404]
other = "página no encontrada" other = "página no encontrada"
[loading]
other = "cargando"

View File

@@ -8,3 +8,5 @@ other = "fermer"
other = "seuil" other = "seuil"
[404] [404]
other = "page non trouvée" other = "page non trouvée"
[loading]
other = "chargement"

View File

@@ -8,3 +8,5 @@ other = "chiudi"
other = "soglia" other = "soglia"
[404] [404]
other = "pagina non trovata" other = "pagina non trovata"
[loading]
other = "caricamento"

View File

@@ -8,3 +8,5 @@ other = "閉じる"
other = "しきい値" other = "しきい値"
[404] [404]
other = "ページが見つかりません" other = "ページが見つかりません"
[loading]
other = "読み込み中"

View File

@@ -8,3 +8,5 @@ other = "닫기"
other = "임계값" other = "임계값"
[404] [404]
other = "페이지를 찾을 수 없습니다" other = "페이지를 찾을 수 없습니다"
[loading]
other = "로딩중"

View File

@@ -8,3 +8,5 @@ other = "关闭"
other = "阈值" other = "阈值"
[404] [404]
other = "页面不存在" other = "页面不存在"
[loading]
other = "加载中"

View File

@@ -8,3 +8,5 @@ other = "關閉"
other = "閾值" other = "閾值"
[404] [404]
other = "找不到頁面" other = "找不到頁面"
[loading]
other = "載入中"

View File

@@ -8,3 +8,5 @@ other = "關閉"
other = "閾值" other = "閾值"
[404] [404]
other = "找不到頁面" other = "找不到頁面"
[loading]
other = "載入中"

View File

@@ -8,3 +8,5 @@ other = "关闭"
other = "阈值" other = "阈值"
[404] [404]
other = "页面不存在" other = "页面不存在"
[loading]
other = "加载中"

View File

@@ -8,3 +8,5 @@ other = "關閉"
other = "閾值" other = "閾值"
[404] [404]
other = "找不到頁面" other = "找不到頁面"
[loading]
other = "載入中"

View File

@@ -1,10 +1,10 @@
{{- define "main" -}} {{- define "main" -}}
<div class="container"> <div class="container">
{{- partial "nav.html" . -}} {{- partial "nav.html" . -}}
<article>
<p class="error">&#9949; <u>404</u>&nbsp;{{- i18n 404 -}}&nbsp;&#9949;</p>
<p class="error">&#9949; <u>404</u>&nbsp;{{- i18n 404 -}}&nbsp;&#9949;</p>
<p class="error">&#9949; <u>404</u>&nbsp;{{- i18n 404 -}}&nbsp;&#9949;</p>
</article>
</div> </div>
<article class="info">
<p class="error">&#9949; <u>404</u>&nbsp;{{- i18n 404 -}}&nbsp;&#9949;</p>
<p class="error">&#9949; <u>404</u>&nbsp;{{- i18n 404 -}}&nbsp;&#9949;</p>
<p class="error">&#9949; <u>404</u>&nbsp;{{- i18n 404 -}}&nbsp;&#9949;</p>
</article>
{{- end -}} {{- end -}}

View File

@@ -1,13 +1,17 @@
{{- define "main" -}} {{- define "main" -}}
<script> <div
document.getElementById("main").setAttribute("nextText", "{{- i18n "next" -}}") class="container"
document.getElementById("main").setAttribute("prevText", "{{- i18n "prev" -}}") data-next="{{- i18n "next" -}}"
document.getElementById("main").setAttribute("closeText", "{{- i18n "close" -}}") data-prev="{{- i18n "prev" -}}"
</script> data-close="{{- i18n "close" -}}"
<div class="container"> data-loading="{{- i18n "loading" -}}"
>
{{- with .Content -}}
<article>
{{- . -}}
</article>
{{- end -}}
{{- partial "nav.html" . -}} {{- partial "nav.html" . -}}
</div> </div>
<article class="info">
{{ .Content }}
</article>
{{- end -}} {{- end -}}

View File

@@ -1,15 +1,9 @@
{{- $Page := . -}} {{- $context := . -}}
{{- $Path := "" -}}
{{- $params := .Page.Params | merge .Site.Params.Page -}} {{- $params := .Page.Params | merge .Site.Params.Page -}}
{{- with partial "function/currentMenuItem.html" . -}} {{- with partial "function/getImageSlice.html" . -}}
{{- $Path = .Identifier -}}
{{- end -}}
{{- $gallery := site.GetPage $Path -}}
{{- with $gallery.Resources.ByType "image" -}}
{{- $index := len . -}} {{- $index := len . -}}
{{- $Page.Scratch.Add "img" slice -}} {{- $context.Scratch.Add "img" slice -}}
{{- range sort . "Name" "desc" -}} {{- range sort . "Name" "desc" -}}
{{- $image := . -}} {{- $image := . -}}
{{- $index = sub $index 1 -}} {{- $index = sub $index 1 -}}
@@ -19,7 +13,7 @@
{{- end -}} {{- end -}}
{{- $lores := .Resize (site.Params.loResOpt | default "700x webp Lanczos q60") -}} {{- $lores := .Resize (site.Params.loResOpt | default "700x webp Lanczos q60") -}}
{{- $hires := .Resize (site.Params.hiResOpt | default "2000x webp Lanczos q75") -}} {{- $hires := .Resize (site.Params.hiResOpt | default "2000x webp Lanczos q75") -}}
{{- $Page.Scratch.Add "img" (dict {{- $context.Scratch.Add "img" (dict
"index" (int $index) "index" (int $index)
"alt" (string $alt) "alt" (string $alt)
"loUrl" (string $lores.RelPermalink) "loUrl" (string $lores.RelPermalink)
@@ -31,7 +25,7 @@
) )
-}} -}}
{{- end -}} {{- end -}}
{{ $Page.Scratch.Get "img" | jsonify }} {{ $context.Scratch.Get "img" | jsonify }}
{{- else -}} {{- else -}}
[] []
{{- end -}} {{- end -}}

View File

@@ -1,7 +1,7 @@
{{- $currentPage := . -}} {{- $currentPage := . -}}
{{- $identifier := "" -}} {{- $identifier := "" -}}
{{- $title := "" -}} {{- $title := "404" -}}
{{- $weight := -1 -}} {{- $weight := -1 -}}
{{- range site.Menus.main -}} {{- range site.Menus.main -}}

View File

@@ -0,0 +1,10 @@
{{- $context := . -}}
{{- $Path := "" -}}
{{- $params := .Page.Params | merge .Site.Params.Page -}}
{{- with partial "function/currentMenuItem.html" . -}}
{{- $Path = .Identifier -}}
{{- end -}}
{{- $gallery := site.GetPage $Path -}}
{{- return $gallery.Resources.ByType "image" -}}

View File

@@ -18,6 +18,16 @@
{{- partial "plugin/style.html" $style -}} {{- partial "plugin/style.html" $style -}}
{{- end -}} {{- end -}}
{{/* fuck safari */}}
<script>
function z() {
const r = document.querySelector(':root')
r.style.setProperty('--window-height', `${window.innerHeight}px`)
}
z()
window.addEventListener('resize', z, { passive: true })
</script>
{{/* main js */}} {{/* main js */}}
{{- $script := dict "Link" "/bundled/js/main.js" "Defer" true "Esm" true -}} {{- $script := dict "Link" "/bundled/js/main.js" "Defer" true "Esm" true -}}
{{- partial "plugin/script.html" $script -}} {{- partial "plugin/script.html" $script -}}

View File

@@ -33,6 +33,10 @@
{{- end -}} {{- end -}}
</div> </div>
<div class="threshold"> <div class="threshold">
{{- $length := 0 -}}
{{- with partial "function/getImageSlice.html" . -}}
{{- $length = len . -}}
{{- end -}}
<span>{{- i18n "threshold" | strings.FirstUpper -}}:</span> <span>{{- i18n "threshold" | strings.FirstUpper -}}:</span>
<span> <span>
<button class="dec">&#xFF0D;</button> <button class="dec">&#xFF0D;</button>
@@ -42,10 +46,43 @@
</span> </span>
</div> </div>
<div class="index"> <div class="index">
<span class="num"></span><span class="num"></span><span class="num"></span <span class="num">0</span><span class="num">0</span><span class="num">0</span
><span class="num"></span> ><span class="num">0</span>
<span>/</span> <span>/</span>
<span class="num"></span><span class="num"></span><span class="num"></span <span class="num">{{- math.Floor (div $length 1000) -}}</span
><span class="num"></span> ><span class="num">{{- mod (math.Floor (div $length 100)) 10 -}}</span
><span class="num">{{- mod (math.Floor (div $length 10)) 10 -}}</span
><span class="num">{{- mod $length 10 -}}</span>
</div> </div>
</nav> </nav>
{{- /* for threshold */ -}}
<script>
i = 2
const s = sessionStorage.getItem('thresholdsIndex')
if (s !== null) {
i = parseInt(s)
}
var t = ''
switch (i) {
case 0:
t = '0020'
break
case 1:
t = '0040'
break
case 2:
t = '0080'
break
case 3:
t = '0140'
break
case 4:
t = '0200'
break
}
Array.from(
document.getElementsByClassName('threshold').item(0).getElementsByClassName('num')
).forEach((e, i) => {
e.innerText = t[i]
})
</script>

View File

@@ -1,6 +1,6 @@
{ {
"name": "bridget", "name": "bridget",
"version": "v0.0.4", "version": "v1.0.0",
"description": "bridget theme source file", "description": "bridget theme source file",
"packageManager": "pnpm@8.10.2", "packageManager": "pnpm@8.10.2",
"private": true, "private": true,
@@ -9,7 +9,7 @@
"lint": "eslint . --fix && prettier --write .", "lint": "eslint . --fix && prettier --write .",
"lint:check": "eslint . && prettier . --check", "lint:check": "eslint . && prettier . --check",
"dev": "run-p rollup:dev hugo:dev", "dev": "run-p rollup:dev hugo:dev",
"build": "rm -f ./static/bundled/js/* && run-s rollup:build hugo:build && yes | cp -rf ./exampleSite/public/css/* ./static/bundled/css", "build": "rm -f ./static/bundled/js/* && run-s rollup:build hugo:build && yes | cp -rf ./exampleSite/public/css/*.css ./static/bundled/css",
"server": "run-p rollup:server hugo:server", "server": "run-p rollup:server hugo:server",
"rollup:build": "rollup -c --environment BUILD:production", "rollup:build": "rollup -c --environment BUILD:production",
"rollup:server": "rollup -c --watch --environment BUILD:production", "rollup:server": "rollup -c --watch --environment BUILD:production",
@@ -37,29 +37,29 @@
}, },
"homepage": "https://github.com/Sped0n/bridget#readme", "homepage": "https://github.com/Sped0n/bridget#readme",
"devDependencies": { "devDependencies": {
"@typescript-eslint/eslint-plugin": "^6.17.0", "@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.17.0", "@typescript-eslint/parser": "^6.21.0",
"eslint": "^8.56.0", "eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-config-standard": "^17.1.0", "eslint-config-standard": "^17.1.0",
"eslint-config-standard-with-typescript": "^43.0.0", "eslint-config-standard-with-typescript": "^43.0.1",
"eslint-import-resolver-typescript": "^3.6.1", "eslint-import-resolver-typescript": "^3.6.1",
"eslint-plugin-import": "^2.29.1", "eslint-plugin-import": "^2.29.1",
"eslint-plugin-n": "^16.6.1", "eslint-plugin-n": "^16.6.2",
"eslint-plugin-prettier": "^5.1.2", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-promise": "^6.1.1", "eslint-plugin-promise": "^6.1.1",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"prettier": "3.1.1", "prettier": "3.2.5",
"prettier-plugin-go-template": "^0.0.15", "prettier-plugin-go-template": "^0.0.15",
"prettier-plugin-organize-imports": "^3.2.4", "prettier-plugin-organize-imports": "^3.2.4",
"typescript": "^5.3.3" "typescript": "^5.3.3"
}, },
"dependencies": { "dependencies": {
"gsap": "^3.12.4", "gsap": "^3.12.5",
"swiper": "^11.0.5", "swiper": "^11.0.6",
"rollup": "^4.9.3", "rollup": "^4.12.0",
"@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^11.1.5" "@rollup/plugin-typescript": "^11.1.6"
} }
} }

317
pnpm-lock.yaml generated
View File

@@ -7,30 +7,30 @@ settings:
dependencies: dependencies:
'@rollup/plugin-node-resolve': '@rollup/plugin-node-resolve':
specifier: ^15.2.3 specifier: ^15.2.3
version: 15.2.3(rollup@4.9.3) version: 15.2.3(rollup@4.12.0)
'@rollup/plugin-terser': '@rollup/plugin-terser':
specifier: ^0.4.4 specifier: ^0.4.4
version: 0.4.4(rollup@4.9.3) version: 0.4.4(rollup@4.12.0)
'@rollup/plugin-typescript': '@rollup/plugin-typescript':
specifier: ^11.1.5 specifier: ^11.1.6
version: 11.1.5(rollup@4.9.3)(typescript@5.3.3) version: 11.1.6(rollup@4.12.0)(typescript@5.3.3)
gsap: gsap:
specifier: ^3.12.4 specifier: ^3.12.5
version: 3.12.4 version: 3.12.5
rollup: rollup:
specifier: ^4.9.3 specifier: ^4.12.0
version: 4.9.3 version: 4.12.0
swiper: swiper:
specifier: ^11.0.5 specifier: ^11.0.6
version: 11.0.5 version: 11.0.6
devDependencies: devDependencies:
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^6.17.0 specifier: ^6.21.0
version: 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^6.17.0 specifier: ^6.21.0
version: 6.17.0(eslint@8.56.0)(typescript@5.3.3) version: 6.21.0(eslint@8.56.0)(typescript@5.3.3)
eslint: eslint:
specifier: ^8.56.0 specifier: ^8.56.0
version: 8.56.0 version: 8.56.0
@@ -39,22 +39,22 @@ devDependencies:
version: 9.1.0(eslint@8.56.0) version: 9.1.0(eslint@8.56.0)
eslint-config-standard: eslint-config-standard:
specifier: ^17.1.0 specifier: ^17.1.0
version: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.1)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) version: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)
eslint-config-standard-with-typescript: eslint-config-standard-with-typescript:
specifier: ^43.0.0 specifier: ^43.0.1
version: 43.0.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.1)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.3.3) version: 43.0.1(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.3.3)
eslint-import-resolver-typescript: eslint-import-resolver-typescript:
specifier: ^3.6.1 specifier: ^3.6.1
version: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0)
eslint-plugin-import: eslint-plugin-import:
specifier: ^2.29.1 specifier: ^2.29.1
version: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) version: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
eslint-plugin-n: eslint-plugin-n:
specifier: ^16.6.1 specifier: ^16.6.2
version: 16.6.1(eslint@8.56.0) version: 16.6.2(eslint@8.56.0)
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.1.2 specifier: ^5.1.3
version: 5.1.2(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.1.1) version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5)
eslint-plugin-promise: eslint-plugin-promise:
specifier: ^6.1.1 specifier: ^6.1.1
version: 6.1.1(eslint@8.56.0) version: 6.1.1(eslint@8.56.0)
@@ -62,14 +62,14 @@ devDependencies:
specifier: ^4.1.5 specifier: ^4.1.5
version: 4.1.5 version: 4.1.5
prettier: prettier:
specifier: 3.1.1 specifier: 3.2.5
version: 3.1.1 version: 3.2.5
prettier-plugin-go-template: prettier-plugin-go-template:
specifier: ^0.0.15 specifier: ^0.0.15
version: 0.0.15(prettier@3.1.1) version: 0.0.15(prettier@3.2.5)
prettier-plugin-organize-imports: prettier-plugin-organize-imports:
specifier: ^3.2.4 specifier: ^3.2.4
version: 3.2.4(prettier@3.1.1)(typescript@5.3.3) version: 3.2.4(prettier@3.2.5)(typescript@5.3.3)
typescript: typescript:
specifier: ^5.3.3 specifier: ^5.3.3
version: 5.3.3 version: 5.3.3
@@ -201,7 +201,7 @@ packages:
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
dev: true dev: true
/@rollup/plugin-node-resolve@15.2.3(rollup@4.9.3): /@rollup/plugin-node-resolve@15.2.3(rollup@4.12.0):
resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
peerDependencies: peerDependencies:
@@ -210,16 +210,16 @@ packages:
rollup: rollup:
optional: true optional: true
dependencies: dependencies:
'@rollup/pluginutils': 5.0.5(rollup@4.9.3) '@rollup/pluginutils': 5.0.5(rollup@4.12.0)
'@types/resolve': 1.20.2 '@types/resolve': 1.20.2
deepmerge: 4.3.1 deepmerge: 4.3.1
is-builtin-module: 3.2.1 is-builtin-module: 3.2.1
is-module: 1.0.0 is-module: 1.0.0
resolve: 1.22.4 resolve: 1.22.4
rollup: 4.9.3 rollup: 4.12.0
dev: false dev: false
/@rollup/plugin-terser@0.4.4(rollup@4.9.3): /@rollup/plugin-terser@0.4.4(rollup@4.12.0):
resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
peerDependencies: peerDependencies:
@@ -228,14 +228,14 @@ packages:
rollup: rollup:
optional: true optional: true
dependencies: dependencies:
rollup: 4.9.3 rollup: 4.12.0
serialize-javascript: 6.0.1 serialize-javascript: 6.0.1
smob: 1.4.1 smob: 1.4.1
terser: 5.24.0 terser: 5.24.0
dev: false dev: false
/@rollup/plugin-typescript@11.1.5(rollup@4.9.3)(typescript@5.3.3): /@rollup/plugin-typescript@11.1.6(rollup@4.12.0)(typescript@5.3.3):
resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==} resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
peerDependencies: peerDependencies:
rollup: ^2.14.0||^3.0.0||^4.0.0 rollup: ^2.14.0||^3.0.0||^4.0.0
@@ -247,13 +247,13 @@ packages:
tslib: tslib:
optional: true optional: true
dependencies: dependencies:
'@rollup/pluginutils': 5.0.5(rollup@4.9.3) '@rollup/pluginutils': 5.1.0(rollup@4.12.0)
resolve: 1.22.4 resolve: 1.22.4
rollup: 4.9.3 rollup: 4.12.0
typescript: 5.3.3 typescript: 5.3.3
dev: false dev: false
/@rollup/pluginutils@5.0.5(rollup@4.9.3): /@rollup/pluginutils@5.0.5(rollup@4.12.0):
resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
peerDependencies: peerDependencies:
@@ -262,120 +262,131 @@ packages:
rollup: rollup:
optional: true optional: true
dependencies: dependencies:
'@types/estree': 1.0.4 '@types/estree': 1.0.5
estree-walker: 2.0.2 estree-walker: 2.0.2
picomatch: 2.3.1 picomatch: 2.3.1
rollup: 4.9.3 rollup: 4.12.0
dev: false dev: false
/@rollup/rollup-android-arm-eabi@4.9.3: /@rollup/pluginutils@5.1.0(rollup@4.12.0):
resolution: {integrity: sha512-nvh9bB41vXEoKKvlWCGptpGt8EhrEwPQFDCY0VAto+R+qpSbaErPS3OjMZuXR8i/2UVw952Dtlnl2JFxH31Qvg==} resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
'@types/estree': 1.0.5
estree-walker: 2.0.2
picomatch: 2.3.1
rollup: 4.12.0
dev: false
/@rollup/rollup-android-arm-eabi@4.12.0:
resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-android-arm64@4.9.3: /@rollup/rollup-android-arm64@4.12.0:
resolution: {integrity: sha512-kffYCJ2RhDL1DlshLzYPyJtVeusHlA8Q1j6k6s4AEVKLq/3HfGa2ADDycLsmPo3OW83r4XtOPqRMbcFzFsEIzQ==} resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-darwin-arm64@4.9.3: /@rollup/rollup-darwin-arm64@4.12.0:
resolution: {integrity: sha512-Fo7DR6Q9/+ztTyMBZ79+WJtb8RWZonyCgkBCjV51rW5K/dizBzImTW6HLC0pzmHaAevwM0jW1GtB5LCFE81mSw==} resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-darwin-x64@4.9.3: /@rollup/rollup-darwin-x64@4.12.0:
resolution: {integrity: sha512-5HcxDF9fqHucIlTiw/gmMb3Qv23L8bLCg904I74Q2lpl4j/20z9ogaD3tWkeguRuz+/17cuS321PT3PAuyjQdg==} resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-linux-arm-gnueabihf@4.9.3: /@rollup/rollup-linux-arm-gnueabihf@4.12.0:
resolution: {integrity: sha512-cO6hKV+99D1V7uNJQn1chWaF9EGp7qV2N8sGH99q9Y62bsbN6Il55EwJppEWT+JiqDRg396vWCgwdHwje8itBQ==} resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-linux-arm64-gnu@4.9.3: /@rollup/rollup-linux-arm64-gnu@4.12.0:
resolution: {integrity: sha512-xANyq6lVg6KMO8UUs0LjA4q7di3tPpDbzLPgVEU2/F1ngIZ54eli8Zdt3uUUTMXVbgTCafIO+JPeGMhu097i3w==} resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-linux-arm64-musl@4.9.3: /@rollup/rollup-linux-arm64-musl@4.12.0:
resolution: {integrity: sha512-TZJUfRTugVFATQToCMD8DNV6jv/KpSwhE1lLq5kXiQbBX3Pqw6dRKtzNkh5wcp0n09reBBq/7CGDERRw9KmE+g==} resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-linux-riscv64-gnu@4.9.3: /@rollup/rollup-linux-riscv64-gnu@4.12.0:
resolution: {integrity: sha512-4/QVaRyaB5tkEAGfjVvWrmWdPF6F2NoaoO5uEP7N0AyeBw7l8SeCWWKAGrbx/00PUdHrJVURJiYikazslSKttQ==} resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-linux-x64-gnu@4.9.3: /@rollup/rollup-linux-x64-gnu@4.12.0:
resolution: {integrity: sha512-koLC6D3pj1YLZSkTy/jsk3HOadp7q2h6VQl/lPX854twOmmLNekHB6yuS+MkWcKdGGdW1JPuPBv/ZYhr5Yhtdg==} resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-linux-x64-musl@4.9.3: /@rollup/rollup-linux-x64-musl@4.12.0:
resolution: {integrity: sha512-0OAkQ4HBp+JO2ip2Lgt/ShlrveOMzyhwt2D0KvqH28jFPqfZco28KSq76zymZwmU+F6GRojdxtQMJiNSXKNzeA==} resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-win32-arm64-msvc@4.9.3: /@rollup/rollup-win32-arm64-msvc@4.12.0:
resolution: {integrity: sha512-z5uvoMvdRWggigOnsb9OOCLERHV0ykRZoRB5O+URPZC9zM3pkoMg5fN4NKu2oHqgkzZtfx9u4njqqlYEzM1v9A==} resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-win32-ia32-msvc@4.9.3: /@rollup/rollup-win32-ia32-msvc@4.12.0:
resolution: {integrity: sha512-wxomCHjBVKws+O4N1WLnniKCXu7vkLtdq9Fl9CN/EbwEldojvUrkoHE/fBLZzC7IT/x12Ut6d6cRs4dFvqJkMg==} resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@rollup/rollup-win32-x64-msvc@4.9.3: /@rollup/rollup-win32-x64-msvc@4.12.0:
resolution: {integrity: sha512-1Qf/qk/iEtx0aOi+AQQt5PBoW0mFngsm7bPuxHClC/hWh2hHBktR6ktSfUg5b5rC9v8hTwNmHE7lBWXkgqluUQ==} resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true optional: true
/@types/estree@1.0.4:
resolution: {integrity: sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==}
dev: false
/@types/estree@1.0.5: /@types/estree@1.0.5:
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
dev: false dev: false
@@ -396,8 +407,8 @@ packages:
resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==}
dev: true dev: true
/@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3): /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3):
resolution: {integrity: sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==} resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
@@ -408,11 +419,11 @@ packages:
optional: true optional: true
dependencies: dependencies:
'@eslint-community/regexpp': 4.6.2 '@eslint-community/regexpp': 4.6.2
'@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/scope-manager': 6.17.0 '@typescript-eslint/scope-manager': 6.21.0
'@typescript-eslint/type-utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/visitor-keys': 6.17.0 '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4 debug: 4.3.4
eslint: 8.56.0 eslint: 8.56.0
graphemer: 1.4.0 graphemer: 1.4.0
@@ -425,8 +436,8 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3): /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3):
resolution: {integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==} resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0
@@ -435,10 +446,10 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/scope-manager': 6.17.0 '@typescript-eslint/scope-manager': 6.21.0
'@typescript-eslint/types': 6.17.0 '@typescript-eslint/types': 6.21.0
'@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3)
'@typescript-eslint/visitor-keys': 6.17.0 '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4 debug: 4.3.4
eslint: 8.56.0 eslint: 8.56.0
typescript: 5.3.3 typescript: 5.3.3
@@ -446,16 +457,16 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/scope-manager@6.17.0: /@typescript-eslint/scope-manager@6.21.0:
resolution: {integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==} resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
dependencies: dependencies:
'@typescript-eslint/types': 6.17.0 '@typescript-eslint/types': 6.21.0
'@typescript-eslint/visitor-keys': 6.17.0 '@typescript-eslint/visitor-keys': 6.21.0
dev: true dev: true
/@typescript-eslint/type-utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3):
resolution: {integrity: sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==} resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0
@@ -464,8 +475,8 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3)
'@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
debug: 4.3.4 debug: 4.3.4
eslint: 8.56.0 eslint: 8.56.0
ts-api-utils: 1.0.1(typescript@5.3.3) ts-api-utils: 1.0.1(typescript@5.3.3)
@@ -474,13 +485,13 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/types@6.17.0: /@typescript-eslint/types@6.21.0:
resolution: {integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==} resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
dev: true dev: true
/@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3):
resolution: {integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==} resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@@ -488,8 +499,8 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/types': 6.17.0 '@typescript-eslint/types': 6.21.0
'@typescript-eslint/visitor-keys': 6.17.0 '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4 debug: 4.3.4
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
@@ -501,8 +512,8 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3):
resolution: {integrity: sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==} resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0
@@ -510,9 +521,9 @@ packages:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
'@types/json-schema': 7.0.12 '@types/json-schema': 7.0.12
'@types/semver': 7.5.0 '@types/semver': 7.5.0
'@typescript-eslint/scope-manager': 6.17.0 '@typescript-eslint/scope-manager': 6.21.0
'@typescript-eslint/types': 6.17.0 '@typescript-eslint/types': 6.21.0
'@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3)
eslint: 8.56.0 eslint: 8.56.0
semver: 7.5.4 semver: 7.5.4
transitivePeerDependencies: transitivePeerDependencies:
@@ -520,11 +531,11 @@ packages:
- typescript - typescript
dev: true dev: true
/@typescript-eslint/visitor-keys@6.17.0: /@typescript-eslint/visitor-keys@6.21.0:
resolution: {integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==} resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
dependencies: dependencies:
'@typescript-eslint/types': 6.17.0 '@typescript-eslint/types': 6.21.0
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
dev: true dev: true
@@ -936,8 +947,8 @@ packages:
eslint: 8.56.0 eslint: 8.56.0
dev: true dev: true
/eslint-config-standard-with-typescript@43.0.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.1)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.3.3): /eslint-config-standard-with-typescript@43.0.1(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.3.3):
resolution: {integrity: sha512-AT0qK01M5bmsWiE3UZvaQO5da1y1n6uQckAKqGNe6zPW5IOzgMLXZxw77nnFm+C11nxAZXsCPrbsgJhSrGfX6Q==} resolution: {integrity: sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==}
peerDependencies: peerDependencies:
'@typescript-eslint/eslint-plugin': ^6.4.0 '@typescript-eslint/eslint-plugin': ^6.4.0
eslint: ^8.0.1 eslint: ^8.0.1
@@ -946,19 +957,19 @@ packages:
eslint-plugin-promise: ^6.0.0 eslint-plugin-promise: ^6.0.0
typescript: '*' typescript: '*'
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
eslint: 8.56.0 eslint: 8.56.0
eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.1)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
eslint-plugin-n: 16.6.1(eslint@8.56.0) eslint-plugin-n: 16.6.2(eslint@8.56.0)
eslint-plugin-promise: 6.1.1(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0)
typescript: 5.3.3 typescript: 5.3.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
/eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.1)(eslint-plugin-promise@6.1.1)(eslint@8.56.0): /eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0):
resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
peerDependencies: peerDependencies:
@@ -968,8 +979,8 @@ packages:
eslint-plugin-promise: ^6.0.0 eslint-plugin-promise: ^6.0.0
dependencies: dependencies:
eslint: 8.56.0 eslint: 8.56.0
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
eslint-plugin-n: 16.6.1(eslint@8.56.0) eslint-plugin-n: 16.6.2(eslint@8.56.0)
eslint-plugin-promise: 6.1.1(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0)
dev: true dev: true
@@ -983,7 +994,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0): /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0):
resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies: peerDependencies:
@@ -993,8 +1004,8 @@ packages:
debug: 4.3.4 debug: 4.3.4
enhanced-resolve: 5.15.0 enhanced-resolve: 5.15.0
eslint: 8.56.0 eslint: 8.56.0
eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
fast-glob: 3.3.1 fast-glob: 3.3.1
get-tsconfig: 4.7.2 get-tsconfig: 4.7.2
is-core-module: 2.13.1 is-core-module: 2.13.1
@@ -1006,7 +1017,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0):
resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
@@ -1027,11 +1038,11 @@ packages:
eslint-import-resolver-webpack: eslint-import-resolver-webpack:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
debug: 3.2.7 debug: 3.2.7
eslint: 8.56.0 eslint: 8.56.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
@@ -1048,7 +1059,7 @@ packages:
eslint-compat-utils: 0.1.2(eslint@8.56.0) eslint-compat-utils: 0.1.2(eslint@8.56.0)
dev: true dev: true
/eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0):
resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
@@ -1058,7 +1069,7 @@ packages:
'@typescript-eslint/parser': '@typescript-eslint/parser':
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
array-includes: 3.1.7 array-includes: 3.1.7
array.prototype.findlastindex: 1.2.3 array.prototype.findlastindex: 1.2.3
array.prototype.flat: 1.3.2 array.prototype.flat: 1.3.2
@@ -1067,7 +1078,7 @@ packages:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 8.56.0 eslint: 8.56.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
hasown: 2.0.0 hasown: 2.0.0
is-core-module: 2.13.1 is-core-module: 2.13.1
is-glob: 4.0.3 is-glob: 4.0.3
@@ -1083,8 +1094,8 @@ packages:
- supports-color - supports-color
dev: true dev: true
/eslint-plugin-n@16.6.1(eslint@8.56.0): /eslint-plugin-n@16.6.2(eslint@8.56.0):
resolution: {integrity: sha512-M1kE5bVQRLBMDYRZwDhWzlzbp370SRRRC1MHqq4I3L2Tatey+9/2csc5mwLDPlmhJaDvkojbrNUME5/llpRyDg==} resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
peerDependencies: peerDependencies:
eslint: '>=7.0.0' eslint: '>=7.0.0'
@@ -1103,8 +1114,8 @@ packages:
semver: 7.5.4 semver: 7.5.4
dev: true dev: true
/eslint-plugin-prettier@5.1.2(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.1.1): /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5):
resolution: {integrity: sha512-dhlpWc9vOwohcWmClFcA+HjlvUpuyynYs0Rf+L/P6/0iQE6vlHW9l5bkfzN62/Stm9fbq8ku46qzde76T1xlSg==} resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies: peerDependencies:
'@types/eslint': '>=8.0.0' '@types/eslint': '>=8.0.0'
@@ -1119,7 +1130,7 @@ packages:
dependencies: dependencies:
eslint: 8.56.0 eslint: 8.56.0
eslint-config-prettier: 9.1.0(eslint@8.56.0) eslint-config-prettier: 9.1.0(eslint@8.56.0)
prettier: 3.1.1 prettier: 3.2.5
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.8.8 synckit: 0.8.8
dev: true dev: true
@@ -1420,8 +1431,8 @@ packages:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
dev: true dev: true
/gsap@3.12.4: /gsap@3.12.5:
resolution: {integrity: sha512-1ByAq8dD0W4aBZ/JArgaQvc0gyUfkGkP8mgAQa0qZGdpOKlSOhOf+WNXjoLimKaKG3Z4Iu6DKZtnyszqQeyqWQ==} resolution: {integrity: sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==}
dev: false dev: false
/has-bigints@1.0.2: /has-bigints@1.0.2:
@@ -1945,17 +1956,17 @@ packages:
fast-diff: 1.3.0 fast-diff: 1.3.0
dev: true dev: true
/prettier-plugin-go-template@0.0.15(prettier@3.1.1): /prettier-plugin-go-template@0.0.15(prettier@3.2.5):
resolution: {integrity: sha512-WqU92E1NokWYNZ9mLE6ijoRg6LtIGdLMePt2C7UBDjXeDH9okcRI3zRqtnWR4s5AloiqyvZ66jNBAa9tmRY5EQ==} resolution: {integrity: sha512-WqU92E1NokWYNZ9mLE6ijoRg6LtIGdLMePt2C7UBDjXeDH9okcRI3zRqtnWR4s5AloiqyvZ66jNBAa9tmRY5EQ==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
peerDependencies: peerDependencies:
prettier: ^3.0.0 prettier: ^3.0.0
dependencies: dependencies:
prettier: 3.1.1 prettier: 3.2.5
ulid: 2.3.0 ulid: 2.3.0
dev: true dev: true
/prettier-plugin-organize-imports@3.2.4(prettier@3.1.1)(typescript@5.3.3): /prettier-plugin-organize-imports@3.2.4(prettier@3.2.5)(typescript@5.3.3):
resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==}
peerDependencies: peerDependencies:
'@volar/vue-language-plugin-pug': ^1.0.4 '@volar/vue-language-plugin-pug': ^1.0.4
@@ -1968,12 +1979,12 @@ packages:
'@volar/vue-typescript': '@volar/vue-typescript':
optional: true optional: true
dependencies: dependencies:
prettier: 3.1.1 prettier: 3.2.5
typescript: 5.3.3 typescript: 5.3.3
dev: true dev: true
/prettier@3.1.1: /prettier@3.2.5:
resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
dev: true dev: true
@@ -2040,26 +2051,26 @@ packages:
glob: 7.2.3 glob: 7.2.3
dev: true dev: true
/rollup@4.9.3: /rollup@4.12.0:
resolution: {integrity: sha512-JnchF0ZGFiqGpAPjg3e89j656Ne4tTtCY1VZc1AxtoQcRIxjTu9jyYHBAtkDXE+X681n4un/nX9SU52AroSRzg==} resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'} engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true hasBin: true
dependencies: dependencies:
'@types/estree': 1.0.5 '@types/estree': 1.0.5
optionalDependencies: optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.9.3 '@rollup/rollup-android-arm-eabi': 4.12.0
'@rollup/rollup-android-arm64': 4.9.3 '@rollup/rollup-android-arm64': 4.12.0
'@rollup/rollup-darwin-arm64': 4.9.3 '@rollup/rollup-darwin-arm64': 4.12.0
'@rollup/rollup-darwin-x64': 4.9.3 '@rollup/rollup-darwin-x64': 4.12.0
'@rollup/rollup-linux-arm-gnueabihf': 4.9.3 '@rollup/rollup-linux-arm-gnueabihf': 4.12.0
'@rollup/rollup-linux-arm64-gnu': 4.9.3 '@rollup/rollup-linux-arm64-gnu': 4.12.0
'@rollup/rollup-linux-arm64-musl': 4.9.3 '@rollup/rollup-linux-arm64-musl': 4.12.0
'@rollup/rollup-linux-riscv64-gnu': 4.9.3 '@rollup/rollup-linux-riscv64-gnu': 4.12.0
'@rollup/rollup-linux-x64-gnu': 4.9.3 '@rollup/rollup-linux-x64-gnu': 4.12.0
'@rollup/rollup-linux-x64-musl': 4.9.3 '@rollup/rollup-linux-x64-musl': 4.12.0
'@rollup/rollup-win32-arm64-msvc': 4.9.3 '@rollup/rollup-win32-arm64-msvc': 4.12.0
'@rollup/rollup-win32-ia32-msvc': 4.9.3 '@rollup/rollup-win32-ia32-msvc': 4.12.0
'@rollup/rollup-win32-x64-msvc': 4.9.3 '@rollup/rollup-win32-x64-msvc': 4.12.0
fsevents: 2.3.3 fsevents: 2.3.3
dev: false dev: false
@@ -2263,8 +2274,8 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
/swiper@11.0.5: /swiper@11.0.6:
resolution: {integrity: sha512-rhCwupqSyRnWrtNzWzemnBLMoyYuoDgGgspAm/8iBD3jCvAWycPLH4Z3TB0O5520DHLzMx94yUMH/B9Efpa48w==} resolution: {integrity: sha512-W/Me7MQl5rNgdM5x9i3Gll76WsyVpnHn91GhBOyL7RCFUeg62aVnflzlVfIpXzZ/87FtJOfAoDH79ZH2Yq76zA==}
engines: {node: '>= 4.7.0'} engines: {node: '>= 4.7.0'}
dev: false dev: false

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{W as e,s as t,n,f as a,l as s,g as o,h as i,r as c,j as r,c as d,i as l}from"./main.js";const p=new e(!1);function m(e,t){return Math.floor(Math.random()*(t-e+1))+e}let u,g,h,f,y,v,w,E=[],x=[],T=[],L=-1,b=!1;function k(){l.get()||(l.set(!0),T[t.get().index].scrollIntoView({block:"center",behavior:"auto"}),v.to(g,{y:"100%",ease:"power3.inOut",duration:1}),v.to(h,{opacity:0,duration:1.2,delay:.4}),setTimeout((()=>{a.set(!0),l.set(!1),L=-1}),1600))}let I=[];function B(e){o(e),!l.get()&&b&&(l.set(!0),v.to(h,{opacity:1,duration:1}),v.to(g,{y:0,ease:"power3.inOut",duration:1,delay:.4}),setTimeout((()=>{a.set(!1),l.set(!1)}),1400))}function N(e){(function(e){!function(e){const t=document.createElement("div");t.className="collection";for(const[n,a]of e.entries()){const e=0!==n?m(-25,25):0,s=0!==n?m(-30,30):0,o=document.createElement("img");o.dataset.src=a.loUrl,o.height=a.loImgH,o.width=a.loImgW,o.alt=a.alt,o.style.transform=`translate3d(${e}%, ${s-50}%, 0)`,t.append(o)}d.append(t)}(e);const t=document.getElementsByClassName("collection").item(0);p.addWatcher((e=>{e?t.classList.remove("hidden"):t.classList.add("hidden")})),I=Array.from(t.getElementsByTagName("img")),I.forEach(((e,t)=>{var n,a;t<5&&(e.src=e.dataset.src),e.addEventListener("click",(()=>{B(t)}),{passive:!0}),e.addEventListener("keydown",(()=>{B(t)}),{passive:!0}),n=e,a=e=>!(e.intersectionRatio<=0||(t+5<I.length&&(I[t+5].src=I[t+5].dataset.src),0)),new IntersectionObserver(((e,t)=>{for(const n of e)if(a(n)){t.disconnect();break}})).observe(n)}))})(e),function(e){!function(e){g=r("gallery"),function(e){const n=r("swiper-wrapper"),a=d.dataset.loading+"...";for(const s of e){const e=r("swiper-slide"),o=r("loadingText");o.innerText=a;const i=document.createElement("img");i.dataset.src=s.hiUrl,i.height=s.hiImgH,i.width=s.hiImgW,i.alt=s.alt,i.style.opacity="0",i.addEventListener("load",(()=>{t.get().index!==s.index?(v.set(i,{opacity:1}),v.set(o,{opacity:0})):(v.to(i,{opacity:1,delay:.5,duration:.5,ease:"power3.out"}),v.to(o,{opacity:0,duration:.5,ease:"power3.in"}))}),{once:!0,passive:!0});const c=r("slideContainer");c.append(i,o),e.append(c),n.append(e)}u=r("galleryInner"),u.append(n)}(e),function(){f=document.createElement("div"),f.insertAdjacentHTML("afterbegin",'<span class="num"></span><span class="num"></span><span class="num"></span><span class="num"></span>\n <span>/</span>\n <span class="num"></span><span class="num"></span><span class="num"></span><span class="num"></span>');const e=document.createElement("div");var t;e.innerText=(t=d.dataset.close).charAt(0).toUpperCase()+t.slice(1),e.addEventListener("click",(()=>{k()}),{passive:!0}),e.addEventListener("keydown",(()=>{k()}),{passive:!0}),y=r("nav"),y.append(f,e)}(),g.append(u,y),h=r("curtain"),d.append(g,h)}(e),E=Array.from(f.getElementsByClassName("num")??[]),x=Array.from(g.getElementsByTagName("img")),T=Array.from(document.getElementsByClassName("collection").item(0)?.getElementsByTagName("img")??[]),t.addWatcher((e=>{var a;e.index!==L&&(-1===L?n.set("none"):e.index<L?n.set("prev"):e.index>L?n.set("next"):n.set("none"),a=e.index,function(){let e=[];const a=t.get().index,s=Math.min(a+1,t.get().length-1),o=Math.max(a-1,0);switch(n.get()){case"next":e=[s];break;case"prev":e=[o];break;case"none":e=[a,s,o]}c(e).forEach((e=>{const t=x[e];t.src!==t.dataset.src&&(t.src=t.dataset.src)}))}(),w.slideTo(a,0),function(){const e=i(t.get().index+1),n=i(t.get().length);E.forEach(((t,a)=>{t.innerText=a<4?e[a]:n[a-4]}))}(),L=e.index)})),p.addWatcher((e=>{e&&a.set(!0)})),window.addEventListener("touchstart",(()=>{s().then((e=>{v=e})).catch((e=>{console.log(e)})),async function(){return(await import("./CUdXu0.js")).Swiper}().then((e=>{w=new e(u,{spaceBetween:20}),w.on("slideChange",(({realIndex:e})=>{o(e)}))})).catch((e=>{console.log(e)})),b=!0}),{once:!0,passive:!0}),p.set(!0)}(e)}export{N as initMobile};

View File

@@ -1 +0,0 @@
import{l as e,c as t,W as n,s as a,i as s,a as i,d as o,b as c}from"./main.js";let r=[],d={x:0,y:0};const g=new n([]),l=new n(!1),m=new n(!1),h=new n(!1);let u,p,f=!1;function v(){return g.get().map((e=>r[e.i]))}function y(){const e=v().slice(-a.get().trailLength);return e.slice(0,e.length-1)}function w(){const e=v();return e[e.length-1]}function I(){const e=g.get(),t=a.get(),n=e.length>0?e[e.length-1].i:t.index,i=[];for(let e=0;e<7;e++)i.push(r[s(n+e,t.length)]);return i}function E(){const e=g.get(),t=a.get();return r[o(e[e.length-1].i,t.length)]}function x(){const e=g.get(),t=a.get();return r[s(e[e.length-1].i,t.length)]}function L(e){if(l.get()||m.get()||!f)return;const t={x:e.clientX,y:e.clientY};if(Math.hypot(t.x-d.x,t.y-d.y)>a.get().threshold){d=t,i();const e={i:a.get().index,...t};g.set([...g.get(),e].slice(-a.get().length))}}function W(){if(m.get()||!f)return;l.set(!0),m.set(!0),k([w(),E(),x()]);const e=u.timeline();e.to(y(),{y:"+=20",ease:p.easeIn,stagger:.075,duration:.3,delay:.1,opacity:0}),e.to(w(),{x:0,y:0,ease:p.easeInOut,duration:.7,delay:.3}),e.to(w(),{delay:.1,scale:1,ease:p.easeInOut}),e.then((()=>{m.set(!1)})).catch((e=>{console.log(e)}))}function H(){if(m.get()||!f)return;l.set(!1),m.set(!0),N([w()]),N(y());const e=u.timeline();e.to(w(),{scale:.6,duration:.6,ease:p.easeInOut}),e.to(w(),{delay:.3,duration:.7,ease:p.easeInOut,x:g.get()[g.get().length-1].x-window.innerWidth/2,y:g.get()[g.get().length-1].y-window.innerHeight/2}),e.to(y(),{y:"-=20",ease:p.easeOut,stagger:-.1,duration:.3,opacity:1}),e.then((()=>{m.set(!1)})).catch((e=>{console.log(e)}))}function k(e){e.forEach((e=>{e.src=e.dataset.hiUrl,e.height=parseInt(e.dataset.hiImgH),e.width=parseInt(e.dataset.hiImgW)}))}function N(e){e.forEach((e=>{e.src=e.dataset.loUrl,e.height=parseInt(e.dataset.loImgH),e.width=parseInt(e.dataset.loImgW)}))}const b=document.createElement("div"),A=document.createElement("div");function O(e){const t=e.clientX,n=e.clientY;b.style.transform=`translate3d(${t}px, ${n}px, 0)`}function U(e){A.innerText=e}const T=document.getElementById("main"),S=[T.getAttribute("prevText"),T.getAttribute("closeText"),T.getAttribute("nextText")];function B(e){e===S[0]?$():e===S[1]?H():Y()}function X(e){if(!l.get()&&!m.get())switch(e.key){case"ArrowLeft":$();break;case"Escape":H();break;case"ArrowRight":Y()}}function Y(){m.get()||(g.set(g.get().map((e=>({...e,i:s(e.i,a.get().length)})))),i())}function $(){m.get()||(g.set(g.get().map((e=>({...e,i:o(e.i,a.get().length)})))),c())}function j(n){b.className="cursor",A.className="cursorInner",b.append(A),t.append(b),window.addEventListener("mousemove",O,{passive:!0}),h.addWatcher((e=>{e?b.classList.add("active"):b.classList.remove("active")})),function(n){!function(e){const n=document.createElement("div");n.className="stage";for(const t of e){const e=document.createElement("img");e.height=t.loImgH,e.width=t.loImgW,e.dataset.hiUrl=t.hiUrl,e.dataset.hiImgH=t.hiImgH.toString(),e.dataset.hiImgW=t.hiImgW.toString(),e.dataset.loUrl=t.loUrl,e.dataset.loImgH=t.loImgH.toString(),e.dataset.loImgW=t.loImgW.toString(),e.alt=t.alt,n.append(e)}t.append(n)}(n);const s=document.getElementsByClassName("stage").item(0);r=Array.from(s.getElementsByTagName("img")),s.addEventListener("click",(()=>{W()})),s.addEventListener("keydown",(()=>{W()})),window.addEventListener("mousemove",L,{passive:!0}),l.addWatcher((e=>{h.set(e&&!m.get())})),m.addWatcher((e=>{h.set(l.get()&&!e)})),g.addWatcher((e=>{!function(){const e=v();0!==e.length&&f&&(N(I()),u.set(e,{x:e=>g.get()[e].x-window.innerWidth/2,y:e=>g.get()[e].y-window.innerHeight/2,opacity:e=>e+1+a.get().trailLength<=g.get().length?0:1,zIndex:e=>e,scale:.6}),l.get()&&(N(v()),k([w(),E(),x()]),u.set(r,{opacity:0}),u.set(w(),{opacity:1,x:0,y:0,scale:1})))}()})),N(I()),window.addEventListener("mousemove",(()=>{e().then((e=>{u=e[0],p=e[1],f=!0})).catch((e=>{console.log(e)}))}),{once:!0,passive:!0})}(n),function(){const e=document.createElement("div");e.className="navOverlay";for(const t of S){const n=document.createElement("div");n.className="overlay",n.addEventListener("click",(()=>{B(t)}),{passive:!0}),n.addEventListener("keydown",(()=>{B(t)}),{passive:!0}),n.addEventListener("mouseover",(()=>{U(t)}),{passive:!0}),n.addEventListener("focus",(()=>{U(t)}),{passive:!0}),e.append(n)}h.addWatcher((()=>{h.get()?e.classList.add("active"):e.classList.remove("active")})),t.append(e),window.addEventListener("keydown",X,{passive:!0})}()}export{j as initDesktop};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{W as e,s as t,e as n,l as a,f as s,g as c,h as o,j as l,c as m,o as i,k as d}from"./main.js";const r=new e(!1);let p,u,g,h;const E=new e(!1);let y,v,f,N=-1,w=[],x=[],I=[],B=!1;function T(){n.set(!0),I[t.get().index].scrollIntoView({block:"center",behavior:"auto"}),v.to(u,{y:"100%",ease:f.easeInOut,duration:1}),v.to(g,{opacity:0,duration:1.2,delay:.4})}function C(){const e=[];e.push(x[h.activeIndex]),e.push(x[Math.min(h.activeIndex+1,h.slides.length)]),e.push(x[Math.max(h.activeIndex-1,0)]);for(const t of e)t.src=t.dataset.src}let L=[];function k(e){c(e),!E.get()&&B&&(E.set(!0),C(),v.to(g,{opacity:1,duration:1}),v.to(u,{y:0,ease:f.easeInOut,duration:1,delay:.4}),setTimeout((()=>{n.set(!1),E.set(!1)}),1200))}function A(e){(function(e){!function(e){const t=document.createElement("div");t.className="collection";for(const[n,a]of e.entries()){const e=0!==n?d(-25,25):0,s=0!==n?d(-30,30):0,c=document.createElement("img");c.dataset.src=a.loUrl,c.height=a.loImgH,c.width=a.loImgW,c.alt=a.alt,c.style.transform=`translate3d(${e}%, ${s-50}%, 0)`,t.append(c)}m.append(t)}(e);const t=document.getElementsByClassName("collection").item(0);r.addWatcher((e=>{e?t.classList.remove("hidden"):t.classList.add("hidden")})),L=Array.from(t.getElementsByTagName("img")),L.forEach(((e,t)=>{e.addEventListener("click",(()=>{k(t)}),{passive:!0}),e.addEventListener("keydown",(()=>{k(t)}),{passive:!0}),i(e,(()=>{for(let e=0;e<5;e++){const n=t+e;n<0||n>L.length-1||(L[n].src=L[n].dataset.src)}}))}))})(e),function(e){!function(e){const t=document.createElement("div");t.className="swiper-wrapper";for(const n of e){const e=document.createElement("div");e.className="swiper-slide";const a=document.createElement("img");a.dataset.src=n.hiUrl,a.height=n.hiImgH,a.width=n.hiImgW,a.alt=n.alt,e.append(a),t.append(e)}const n=document.createElement("div");n.className="galleryInner",n.append(t);const a=document.createElement("div");a.insertAdjacentHTML("afterbegin",'<span class="num"></span><span class="num"></span><span class="num"></span><span class="num"></span>\n <span>/</span>\n <span class="num"></span><span class="num"></span><span class="num"></span><span class="num"></span>');const s=document.createElement("div"),c=document.getElementById("main")?.getAttribute("closeText");s.innerText=l(c),s.addEventListener("click",(()=>{T()}),{passive:!0}),s.addEventListener("keydown",(()=>{T()}),{passive:!0});const o=document.createElement("div");o.className="nav",o.append(a,s);const i=document.createElement("div");i.className="gallery",i.append(n),i.append(o);const d=document.createElement("div");d.className="curtain",m.append(i,d)}(e),w=Array.from(document.getElementsByClassName("nav").item(0)?.getElementsByClassName("num")??[]),p=document.getElementsByClassName("galleryInner").item(0),u=document.getElementsByClassName("gallery").item(0),g=document.getElementsByClassName("curtain").item(0),x=Array.from(u.getElementsByTagName("img")),I=Array.from(document.getElementsByClassName("collection").item(0)?.getElementsByTagName("img")??[]),t.addWatcher((()=>{const e=t.get();var n;e.index!==N&&(n=e.index,C(),h.slideTo(n,0),function(){const e=o(t.get().index+1),n=o(t.get().length);w.forEach(((t,a)=>{t.innerText=a<4?e[a]:n[a-4]}))}(),N=e.index)})),r.addWatcher((e=>{e&&n.set(!0)})),window.addEventListener("touchstart",(()=>{a().then((e=>{v=e[0],f=e[1]})).catch((e=>{console.log(e)})),s().then((e=>{y=e,h=new y(p,{spaceBetween:20}),h.on("slideChange",(({realIndex:e})=>{c(e)}))})).catch((e=>{console.log(e)})),B=!0}),{once:!0,passive:!0}),r.set(!0)}(e)}export{A as initMobile};

View File

@@ -1 +1 @@
function t(t,e){return(t+1)%e}function e(t,e){return(t+e-1)%e}function n(t){return("0000"+t.toString()).slice(-4)}function s(t,e){return Math.floor(Math.random()*(e-t+1))+t}function o(t,e){new IntersectionObserver(((n,s)=>{n.forEach((n=>{n.intersectionRatio>0&&(e(t),s.disconnect())}))})).observe(t)}function i(t){return t.charAt(0).toUpperCase()+t.slice(1)}async function r(){const t=await import("./8mM4Ei.js");return[t.gsap,t.Power3]}async function a(){return(await import("./f6JTi3.js")).Swiper}class c{constructor(t){this.obj=t,this.watchers=[]}get(){return this.obj}set(t){this.obj=t,this.watchers.forEach((t=>{t(this.obj)}))}addWatcher(t){this.watchers.push(t)}}const h=new c(!0);let l;const d=[{threshold:20,trailLength:20},{threshold:40,trailLength:10},{threshold:80,trailLength:5},{threshold:140,trailLength:5},{threshold:200,trailLength:5}],u=new c({index:-1,length:0,threshold:d[p()].threshold,trailLength:d[p()].trailLength});function g(t){const e=u.get();e.index=t,u.set(e)}function m(){const e=u.get();e.index=t(e.index,e.length),u.set(e)}function f(){const t=u.get();t.index=e(t.index,t.length),u.set(t)}function x(t,e){const n=d.findIndex((e=>t.threshold===e.threshold))+e;if(n<0||n>=d.length)return t;sessionStorage.setItem("thresholdsIndex",n.toString());const s=d[n];return{...t,...s}}function p(){const t=sessionStorage.getItem("thresholdsIndex");return null===t?2:parseInt(t)}const w=document.getElementsByClassName("threshold").item(0),y=Array.from(w.getElementsByClassName("num")),E=w.getElementsByClassName("dec").item(0),j=w.getElementsByClassName("inc").item(0),L=document.getElementsByClassName("index").item(0),b=Array.from(L.getElementsByClassName("num"));function v(t){y.forEach(((e,n)=>{e.innerText=t[n]}))}function C(t,e){b.forEach(((n,s)=>{n.innerText=s<4?t[s]:e[s-4]}))}l=document.getElementsByClassName("container").item(0),h.addWatcher((t=>{t?l.classList.remove("disableScroll"):l.classList.add("disableScroll")}));const B=await async function(){try{const t=await fetch(`${window.location.href}index.json`,{headers:{Accept:"application/json"}});return(await t.json()).sort(((t,e)=>t.index<e.index?-1:1))}catch(t){return[]}}();!function(t){const e=u.get();e.length=t,x(e,0),u.set(e)}(B.length),function(){const t=u.get();v(n(t.threshold)),C(n(t.index+1),n(t.length)),u.addWatcher((t=>{C(n(t.index+1),n(t.length)),v(n(t.threshold))})),E.addEventListener("click",(()=>{!function(){let t=u.get();t=x(t,-1),u.set(t)}()}),{passive:!0}),j.addEventListener("click",(()=>{!function(){let t=u.get();t=x(t,1),u.set(t)}()}),{passive:!0})}(),B.length>0&&(window.matchMedia("(hover: none)").matches?import("./fRwBqI.js").then((t=>{t.initMobile(B)})).catch((t=>{console.log(t)})):import("./PR3rto.js").then((t=>{t.initDesktop(B)})).catch((t=>{console.log(t)})));export{c as W,m as a,f as b,l as c,e as d,h as e,a as f,g,n as h,t as i,i as j,s as k,r as l,o,u as s}; function t(t,e){return(t+1)%e}function e(t,e){return(t+e-1)%e}function n(t){return("0000"+t.toString()).slice(-4)}async function s(){return(await import("./DORuvs.js")).gsap}function a(){const t=sessionStorage.getItem("thresholdsIndex");return null===t?2:parseInt(t)}function o(t){return t.length<2?t:[...new Set(t)]}function i(t){const e=document.createElement("div");return""===t||e.classList.add(t),e}class r{constructor(t,e=!0){this.obj=t,this.lazy=e,this.watchers=[]}get(){return this.obj}set(t){t===this.obj&&this.lazy||(this.obj=t,this.watchers.forEach((t=>{t(this.obj)})))}addWatcher(t){this.watchers.push(t)}}const c=new r(!0);let l;const h=[{threshold:20,trailLength:20},{threshold:40,trailLength:10},{threshold:80,trailLength:5},{threshold:140,trailLength:5},{threshold:200,trailLength:5}],d=new r({index:-1,length:0,threshold:h[a()].threshold,trailLength:h[a()].trailLength},!1),g=new r(!1),u=new r("none");function m(t){const e=d.get();e.index=t,d.set(e)}function f(){const e=d.get();e.index=t(e.index,e.length),d.set(e)}function w(){const t=d.get();t.index=e(t.index,t.length),d.set(t)}function x(t,e){const n=h.findIndex((e=>t.threshold===e.threshold))+e;if(n<0||n>=h.length)return t;sessionStorage.setItem("thresholdsIndex",n.toString());const s=h[n];return{...t,...s}}const y=document.getElementsByClassName("threshold").item(0),p=Array.from(y.getElementsByClassName("num")),E=y.getElementsByClassName("dec").item(0),L=y.getElementsByClassName("inc").item(0),j=document.getElementsByClassName("index").item(0),b=Array.from(j.getElementsByClassName("num"));document.addEventListener("DOMContentLoaded",(()=>{(async function(){l=document.getElementsByClassName("container").item(0),c.addWatcher((t=>{t?l.classList.remove("disableScroll"):l.classList.add("disableScroll")}));const t=await async function(){if("404"===document.title.split(" | ")[0])return[];try{const t=await fetch(`${window.location.href}index.json`,{headers:{Accept:"application/json"}});return(await t.json()).sort(((t,e)=>t.index<e.index?-1:1))}catch(t){return[]}}();(function(t){const e=d.get();e.length=t,x(e,0),d.set(e)})(t.length),d.addWatcher((t=>{var e,s,a;e=n(t.index+1),s=n(t.length),b.forEach(((t,n)=>{t.innerText=n<4?e[n]:s[n-4]})),a=n(t.threshold),p.forEach(((t,e)=>{t.innerText=a[e]}))})),E.addEventListener("click",(()=>{!function(){let t=d.get();t=x(t,-1),d.set(t)}()}),{passive:!0}),L.addEventListener("click",(()=>{!function(){let t=d.get();t=x(t,1),d.set(t)}()}),{passive:!0}),0!==t.length&&(window.matchMedia("(hover: none)").matches?await import("./DrgyUb.js").then((e=>{e.initMobile(t)})).catch((t=>{console.log(t)})):await import("./CObFM1.js").then((e=>{e.initDesktop(t)})).catch((t=>{console.log(t)})))})().catch((t=>{console.log(t)}))}));export{r as W,f as a,t as b,l as c,e as d,w as e,c as f,m as g,n as h,g as i,i as j,s as l,u as n,o as r,d as s};